{"version":3,"file":"index.es.min.js","sources":["../../../packages/helpers/src/props.helpers.js","../../../packages/components/src/card-labels/cardLabels.js","../../../packages/components/src/constants.mjs","../../../packages/components/src/nespressoElement/nespressoElement.js","../../../packages/helpers/src/viewport.helpers.ts","../../../packages/helpers/src/utils.ts","../../../packages/components/src/sku/constants.mjs","../../../packages/components/src/sku/fragments/heading.js","../../../packages/components/src/sku/fragments/headline.js","../../../packages/components/src/sku/fragments/labelTechnology.js","../../../packages/components/src/sku/fragments/labelRange.js","../../../packages/helpers/src/catalog.js","../../../packages/helpers/src/getCurrency.js","../../../packages/components/src/sku/fragments/strikethroughPrice.js","../../../packages/components/src/sku/fragments/price.js","../../../packages/helpers/src/dataLayer.js","../../../packages/components/src/sku/fragments/addToCart.js","../../../packages/components/src/sku/fragments/additionalMessage.js","../../../packages/helpers/src/cremaDataHelper.js","../../../services/plp/services.js","../../../packages/components/src/sku-coffee/services/index.js","../../../packages/components/src/sku/services/index.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.dto.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.coffee.dto.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.machine.dto.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.accessory.dto.js","../../../packages/page-builder-sections/src/cross-sell-natural/dataTransform/product.giftCard.dto.js","../../../packages/components/src/sku-quick-view/shared-quick-view-types.ts","../../../packages/components/src/sku-quick-view/shared-quick-view.ts","../../../packages/helpers/src/assets/js/eventDispatch.js","../../../packages/helpers/src/events.helpers.ts","../../../packages/helpers/src/gtmEvents.js","../../../packages/components/src/sku/sku.js","../../../packages/components/src/sku/fragments/setCardTheme.js","../../../packages/components/src/sku/fragments/labels.js","../../../packages/helpers/src/logos.helpers.js","../../../packages/components/src/sku/fragments/image.js","../../../packages/components/src/sku/fragments/quickView.js","../../../packages/components/src/sku-coffee/fragments/bundle.js","../../../node_modules/classnames/index.js","../../../node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js","../../../packages/components/src/compatibility/CompatibilityButton/CompatibilityButton.tsx","../../../packages/components/src/compatibility/CompatibilityModal/modalUtils.ts","../../../packages/apps/src/components/ModalDrawer/ModalDrawer.tsx","../../../packages/apps/src/utils/isOldSafari.ts","../../../packages/components/src/compatibility/CompatibilityModal/CompatibilityModal.tsx","../../../node_modules/preact-custom-element/dist/preact-custom-element.esm.js","../../../packages/helpers/src/asWebComponent.ts","../../../packages/components/src/compatibility/compatibility-section/compatibility-section.tsx","../../../packages/components/src/sku-coffee/fragments/heading.js","../../../packages/components/src/sku-coffee/fragments/sleeve.js","../../../packages/components/src/sku-coffee/sku-coffee.js","../../../packages/components/src/sku-coffee/fragments/skuQuickViewLink.js","../../../packages/components/src/sku-coffee/fragments/intensity.js","../../../packages/components/src/sku-coffee/fragments/boxTube.js","../../../packages/helpers/src/productCompatibility.ts","../../../packages/components/src/sku-coffee/fragments/packFormat.js","../../../packages/components/src/sku-coffee/fragments/priceCapsule.js","../../../packages/components/src/intensity/intensity.js","../../../packages/helpers/src/assets/js/eventBus.js","../../../packages/components/src/cta/cta.js","../../../packages/components/src/img/js/constants.js","../../../packages/components/src/img/img.js","../../../packages/components/src/link/link.js","../../../packages/helpers/src/assets/js/viewportTracking.js","../../../packages/helpers/src/assets/js/zoneTracking.js","../../../packages/components/src/container/container.js","../../../packages/components/src/chip/chip.js","../../../packages/helpers/src/assets/js/scopedKeyboardNav.js","../../../packages/components/src/dropdown/dropdown.js","../../../packages/helpers/src/assets/js/productTracking.js","../../../packages/components/src/add-to-cart/addToCart.js","../../../packages/components/src/plp-sticky-bar/plp-sticky-bar.js","../../../packages/helpers/src/swipeEvents.ts","../../../packages/components/src/popin/components/overlay.js","../../../packages/components/src/popin/popin.js","../../../packages/components/src/card-logos/cardLogos.js","../../../packages/components/src/slider-menu/js/constants.js","../../../packages/components/src/slider-menu/js/SliderMenuLib.js","../../../packages/components/src/slider-menu/slider-menu.js","../../../packages/components/src/slider-natural/slider-natural.js","../../../packages/helpers/src/contrast.helpers.js","../../../packages/helpers/src/useragent.helpers.ts","../../../packages/helpers/src/refs.helpers.js","../../../packages/helpers/src/impolicy.js","../../../packages/components/src/navigation-bubbles/components/bubble/js/constants.js","../../../packages/components/src/navigation-bubbles/components/bubble/bubble.js","../../../packages/helpers/src/intersection-observer.service.js","../../../packages/helpers/src/deferred.js","../../../packages/helpers/src/scrollTo.ts","../../../packages/components/src/navigation-bubbles/data/constants.js","../../../packages/components/src/navigation-bubbles/navigation-bubbles.js","../../../packages/components/src/navigation-bubbles/services/events.manager.js","../../../services/plp-data/src/prod/index.js","../../../packages/apps/src/plp-core/config/experiments.ts","../../../packages/apps/src/plp-core/config/constants.js","../../../packages/apps/src/plp-core/store/plp.data.js","../../../packages/apps/src/plp-core/store/plp.actions.js","../../../services/crema-service/src/Store.ts","../../../services/crema-service/src/CremaService.ts","../../../packages/apps/src/plp-core/store/plp.events.js","../../../packages/apps/src/plp-core/helpers/tracking.js","../../../packages/apps/src/plp-core/store/index.js","../../../packages/apps/src/plp-core/components/filter/popin/plp.filter-popin.mobileDropDown.js","../../../packages/apps/src/plp-core/components/filter/popin/plp.filter-popin.content.js","../../../packages/apps/src/plp-core/components/filter/popin/plp.filter-popin.footer.js","../../../packages/apps/src/plp-core/components/filter/plp.filter-popin.js","../../../packages/apps/src/plp-core/components/filter/plp.filter-cta.js","../../../packages/apps/src/plp-core/components/filter/plp.filter-links.js","../../../packages/apps/src/plp-core/components/filter/plp.filter-sort.js","../../../packages/apps/src/plp-core/components/filter/_plp.filter.main.js","../../../packages/components/src/sticky/sticky.service.js","../../../packages/apps/src/plp-core/components/navigation/plp.bar.js","../../../packages/apps/src/plp-core/components/navigation/_plp.navigation.main.js","../../../packages/apps/src/plp-core/components/results/plp.results-chip.js","../../../packages/apps/src/plp-core/components/results/plp.results-header.js","../../../packages/apps/src/plp-core/components/plp.product.js","../../../packages/apps/src/plp-core/components/results/_plp.results.main.js","../../../packages/apps/src/plp-core/components/products/_plp.products.main.js","../../../packages/apps/src/plp-core/components/products/plp.category-products.js","../../../packages/apps/src/plp-core/plp.app.js","../../../packages/apps/src/plp-core/models/Category.js","../../../packages/apps/src/plp/models/coffee.category.js","../../../packages/apps/src/plp-core/models/Product.js","../../../packages/apps/src/plp/models/coffee.product.js","../../../packages/apps/src/plp-core/models/NavigationLinks.js","../../../packages/apps/src/plp-core/models/NavigationBubbles.js","../../../packages/apps/src/plp-core/models/MainDTO.js","../../../packages/apps/src/plp-core/helpers/getMinMaxIntensity.js","../../../packages/helpers/src/cupSizeIcons.js","../../../packages/apps/src/plp-core/helpers/getCupSizesDetails.js","../../../packages/apps/src/plp/dataTransform/plp-coffee.dto.js","../../../packages/helpers/src/notesIcons.js","../../../packages/apps/src/plp-core/filter/filter.js","../../../packages/apps/src/plp-core/filter/types/DefaultFilterChipType.js","../../../packages/apps/src/plp-core/filter/createFilter.js","../../../packages/apps/src/plp-core/filter/createCategoriesFilter.js","../../../packages/apps/src/plp/dataTransform/plp-coffee.filterIntensity.dto.js","../../../packages/apps/src/plp/dataTransform/plp-coffee.filters.dto.js","../../../packages/apps/src/plp/dataTransform/plp-coffee.sort.dto.js","../../../packages/apps/src/plp-core/store/plp.states.js","../../../packages/apps/src/plp/plp-coffee.component.js"],"sourcesContent":["const getData = attributes => attributes.find(attribute => attribute.nodeName === 'data')\n\nconst createProps = attributes => {\n    const data = getData([...attributes])\n    const props = [...attributes]\n        .filter(attribute => attribute.nodeName !== 'data')\n        .reduce((all, attr) => {\n            return { ...all, [attr.nodeName]: attr.nodeValue }\n        }, {})\n\n    if (isNil(data)) {\n        return props\n    }\n\n    try {\n        return { ...props, ...JSON.parse(data.nodeValue) }\n    } catch (error) {\n        console.log('ERROR: No data', error, data?.nodeValue)\n    }\n}\n\nconst isNil = obj => obj === undefined || obj === null\n\nexport const parseBool = value => (!value || value === 'false' ? false : true)\n\nexport default createProps\n","import createProps from '@kissui/helpers/src/props.helpers'\n\nclass CardLabels extends HTMLElement {\n    constructor() {\n        super()\n        this.props = {}\n        this.labels = []\n    }\n\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.render()\n    }\n\n    render() {\n        const { labels = [], direction = 'column' } = this.props\n        this.classList.add(`${direction === 'row' ? 'direction-row' : 'direction-' + direction}`)\n\n        if (labels.length === 0) {\n            return ''\n        }\n        this.labels = labels\n\n        this.innerHTML = `${this.renderLabels()}`\n    }\n\n    renderLabels() {\n        return this.labels\n            .map(label => {\n                const { name = '', bgColor = '', color = '' } = label\n                return `<mark class=\"t-3xs-500-caps-sl\"\n                            ${\n                                bgColor &&\n                                color &&\n                                `style=\"background: ${bgColor}; color: ${color}\"`\n                            }>\n                            <span>${name}</span>\n                        </mark>`\n            })\n            .join('')\n    }\n}\n\ncustomElements.get('nb-card-labels') || customElements.define('nb-card-labels', CardLabels)\n\nexport default CardLabels\n","export const MAX_WIDTH_CONTAINER = 1160\n\nexport const BREAKPOINT_XL = 1920\nexport const BREAKPOINT_TABLET = 1024\nexport const BREAKPOINT_L = 996\nexport const BREAKPOINT_M = 768\nexport const BREAKPOINT_S = 750\nexport const BREAKPOINT_XS = 375\n\nexport const CTA_PRIMARY = 'primary'\nexport const CTA_PRIMARY_TRANSPARENT = 'primary_transparent'\nexport const CTA_SUBTLE = 'subtle'\nexport const CTA_LINK = 'link'\nexport const CTA_LINK_UNDERLINE = 'link-underline'\nexport const CTA_LINK_GOLD = 'link-gold'\nexport const CTA_LINK_ADD_TO_CART_SMALL = 'AddToCart_small'\nexport const CTA_LINK_ADD_TO_CART_LARGE = 'AddToCart_large'\n\nexport const EVENT_TAB_CHANGE = 'EVENT_TAB_CHANGE'\n\nexport const EVENT_VIDEO = 'WEB_COMPONENT_VIDEO'\nexport const EVENT_POPIN_OPEN = 'WEB_COMPONENT_POPIN_OPEN'\nexport const EVENT_POPIN_OPENED = 'WEB_COMPONENT_POPIN_OPENED'\nexport const EVENT_POPIN_CLOSE = 'WEB_COMPONENT_POPIN_CLOSE'\nexport const EVENT_POPIN_CLOSED = 'WEB_COMPONENT_POPIN_CLOSED'\nexport const EVENT_POPIN_CLOSE_CLICK = 'WEB_COMPONENT_POPIN_CLOSE_CLICK'\nexport const EVENT_POPIN_KEY_DOWN = 'keydown'\nexport const EVENT_POPIN_FORM_TOGGLE_TITLE = 'WEB_COMPONENT_POPIN_FORM_TOGGLE_TITLE'\nexport const EVENT_CTA_CLICK = 'WEB_COMPONENT_CTA_CLICK'\nexport const EVENT_HERO_REORDER_OPEN = 'WEB_COMPONENT_HERO_REORDER_OPEN'\nexport const EVENT_HERO_REORDER_CLOSE = 'WEB_COMPONENT_HERO_REORDER_CLOSE'\nexport const EVENT_QUICKVIEW_OPEN = 'WEB_COMPONENT_QUICKVIEW_OPEN'\nexport const EVENT_QS_OPEN = 'WEB_COMPONENT_QS_OPEN'\nexport const EVENT_QS_OPENED = 'WEB_COMPONENT_QS_OPENED'\nexport const EVENT_QS_CLOSE = 'WEB_COMPONENT_QS_CLOSE'\nexport const EVENT_QS_CLOSED = 'WEB_COMPONENT_QS_CLOSED'\nexport const EVENT_QS_CLOSE_CLICK = 'WEB_COMPONENT_QS_CLOSE_CLICK'\nexport const EVENT_QS_KEY_DOWN = 'keydown'\nexport const EVENT_ADD_TO_CART = 'WEB_COMPONENT_ADD_TO_CART'\nexport const EVENT_CART_UPDATED = 'WEB_COMPONENT_CART_UPDATED'\nexport const EVENT_VIDEO_TOGGLE = 'WEB_COMPONENT_VIDEO_TOGGLE'\nexport const VIDEO_ON_HOVER = 'VIDEO_ON_HOVER'\nexport const VIDEO_ON_OUT = 'VIDEO_ON_OUT'\nexport const EVENT_DETAIL_OPEN = 'WEB_COMPONENT_DETAIL_OPEN'\nexport const EVENT_SLIDER_READY = 'WEB_COMPONENT_SLIDER_READY'\nexport const EVENT_SLIDE_CHANGE = 'WEB_COMPONENT_SLIDE_CHANGE'\nexport const EVENT_OVERLAY_OPEN = 'WEB_COMPONENT_OVERLAY_OPEN'\nexport const EVENT_OVERLAY_CLOSE = 'WEB_COMPONENT_OVERLAY_CLOSE'\nexport const EVENT_OVERLAY_CLICKED = 'WEB_COMPONENT_OVERLAY_CLICKED'\nexport const EVENT_OPEN_PRODUCT_AR_CLICKED = 'OPEN_PRODUCT_AR_CLICKED'\nexport const EVENT_SORT_BY_CHANGE = 'WEB_COMPONENT_SORT_BY_CHANGE'\n\nexport const EVENT_BUBBLE_SELECTED = 'EVENT_BUBBLE_SELECTED'\nexport const EVENT_RECO_TOOL_OPTION_CLICKED = 'EVENT_RECO_TOOL_OPTION_CLICKED'\nexport const WEB_COMPONENT_PROJECTS_LOADED = 'WEB_COMPONENT_PROJECTS_LOADED'\nexport const WEB_COMPONENT_ANCHOR_LOADED = 'WEB_COMPONENT_ANCHOR_LOADED'\n\nexport const EVENT_SWIPED_UP = 'swiped-up'\nexport const EVENT_SWIPED_DOWN = 'swiped-down'\nexport const EVENT_SWIPED_LEFT = 'swiped-left'\nexport const EVENT_SWIPED_RIGHT = 'swiped-right'\n\nexport const EVENT_HEADER_POSITION_CHANGED = 'EVENT_HEADER_POSITION_CHANGED'\n\nexport const keys = { ESC: 'Escape' }\n\nexport const ADD_TO_CART_MODIFIER_MINI = 'mini'\nexport const ADD_TO_CART_MODIFIER_DEFAULT = ADD_TO_CART_MODIFIER_MINI\n\nexport const COFFEE_ORIGINAL = 'original'\nexport const COFFEE_VERTUO = 'vertuo'\nexport const COFFEE_PRO = 'pro'\nexport const COFFEE_OL = 'OL'\nexport const COFFEE_VL = 'VL'\nexport const INTENSITY_MAX_OL = 14\nexport const INTENSITY_MAX_VL = 12\nexport const DEFAULT_BUBBLE_ICON = ''\n\nexport const NUMBER_PRODUCTS_SLIDER = 8\nexport const NUMBER_FEATURES_PDP = 8\n\nexport const ALIGNMENT = ['center', 'left', 'right']\nexport const POSITION = ['top', 'right', 'bottom', 'left']\nexport const TRANSLATION_ADD_TO_CART = 'Add to cart'\nexport const TRANSLATION_UPDATE_BASKET = 'Update basket'\n\nexport const TIME_INSTANT = 1\nexport const TIME_FAST = 300\nexport const TIME_MEDIUM = 600\nexport const TIME_SLOW = 1200\n\nexport const APP_APPLE_LINK = {\n    default: 'https://apps.apple.com/us/app/nespresso/id342879434',\n    us: 'https://apps.apple.com/us/app/nespresso-new/id1609639566',\n    uk: 'https://apps.apple.com/gb/app/nespresso-new/id1609639566'\n}\nexport const APP_ANDROID_LINK =\n    'https://play.google.com/store/apps/details?id=com.nespresso.activities'\nexport const APP_HUAWEI_LINK = 'https://appgallery.huawei.com/app/C102571517'\n\nexport const SRC_PAGE_PLP = 'plp'\nexport const SRC_PAGE_PDP = 'pdp'\n\nexport const PLP_TYPE_COFFEE = 'coffee'\nexport const PLP_TYPE_MACHINE = 'machine'\nexport const PLP_TYPE_ACCESSORY = 'accessory'\nexport const CALLEO_API_DOMAIN = 'https://www.contact.nespresso.com/'\n\n// SCSS RELATED\n// Todo : should be shared by JS and SCSS\nexport const BROWSER_CONTEXT = 16 // 1rem = 16px\nexport const COLOR_WHITE_1000 = '#FFFFFF' // Do not change for #FFF shortcut, it will break slider-natural gradients !\n\nexport const CONTRAST_DARK = 'dark'\nexport const CONTRAST_LIGHT = 'light'\n\nexport const B2B_CONTACT_FORM_POPIN_ID = 'b2b-contact-form-popin-id'\nexport const B2B_CONTACT_FORM_POPIN_SRC_SEARCH = 'coveo-search'\n\nexport const B2B_CONTACT_FORM_POPIN_SRC_SKU_MAIN_INFO = 'sku-main-info'\n\nexport const B2B_CONTACT_FORM_POPIN_SRC_SKU_MAIN_INFO_AUTO = 'sku-main-info-auto'\n\nexport const ASPECT_RATIO_16_9 = '16/9'\nexport const ASPECT_RATIO_1_1 = '1/1'\n\nexport const NESPRESSO_PRODUCTION_DOMAIN = 'https://www.nespresso.com'\nexport const NESPRESSO_ROLLOUT_DOMAIN = 'https://nc2-env-rollout.nespresso.com'\n\nexport const EVENT_QUIZ_ON_GO_BACK = 'WEB_COMPONENT_EVENT_QUIZ_ON_GO_BACK'\nexport const EVENT_QUIZ_SUBMIT = 'WEB_COMPONENT_EVENT_QUIZ_SUBMIT'\n","export class NespressoElement extends HTMLElement {\n    constructor() {\n        super()\n        this.template = ''\n    }\n\n    connectedCallback() {\n        this.props = this._createProps()\n        this.onStart?.()\n        this.loadTemplate()\n        this.onReady?.()\n    }\n\n    /**\n     * Load the attributes and create the props object\n     * @returns {any}\n     * @private\n     */\n    _createProps(forceAttributes = null) {\n        const attributes = forceAttributes || this.attributes\n\n        const getData = attr => attr.find(attribute => attribute.nodeName === 'data')\n\n        let props\n        try {\n            props = [...attributes].reduce((all, attr) => {\n                return { ...all, [attr.nodeName]: attr.nodeValue }\n            }, {})\n\n            const data = getData([...attributes])\n\n            if (data === undefined || data === null) {\n                return props\n            }\n\n            return { ...props, ...JSON.parse(data.nodeValue) }\n        } catch (error) {\n            console.log(this.nodeName, 'ERROR: No data', error)\n        }\n    }\n\n    /**\n     * Render by DOM diff\n     */\n    render(force = false) {\n        if (force) {\n            // todo review the performance of this\n            this.innerHTML = ''\n        }\n        /**\n         * Convert a template string into HTML DOM nodes\n         * @param  {String} str The template string\n         * @return {Node}       The template HTML\n         */\n        const _stringToHTML = str => {\n            const parser = new DOMParser()\n            const doc = parser.parseFromString(str, 'text/html')\n            return doc.body\n        }\n\n        /**\n         * Compare the template to the UI and make updates\n         * @param  {Node} template The template HTML\n         * @param  {Node} elem     The UI HTML\n         */\n        const _diff = (template, elem) => {\n            /**\n             * Get the type for a node\n             * @param  {Node}   node The node\n             * @return {String}      The type\n             */\n            const _getNodeType = node => {\n                if (node.nodeType === 3) {\n                    return 'text'\n                }\n                if (node.nodeType === 8) {\n                    return 'comment'\n                }\n                return node.tagName.toLowerCase()\n            }\n\n            /**\n             * Get the content from a node\n             * @param  {Node}   node The node\n             * @return {String}      The type\n             */\n            const _getNodeContent = node => {\n                if (node.childNodes && node.childNodes.length > 0) {\n                    return null\n                }\n                return node.textContent\n            }\n\n            // Get arrays of child nodes\n            const domNodes = Array.prototype.slice.call(elem.childNodes)\n            const templateNodes = Array.prototype.slice.call(template.childNodes)\n\n            // If extra elements in DOM, remove them\n            var count = domNodes.length - templateNodes.length\n            if (count > 0) {\n                for (; count > 0; count--) {\n                    domNodes[domNodes.length - count].parentNode.removeChild(\n                        domNodes[domNodes.length - count]\n                    )\n                }\n            }\n\n            // Diff each item in the templateNodes\n            templateNodes.forEach(function (node, index) {\n                // If element doesn't exist, create it\n                if (!domNodes[index]) {\n                    elem.appendChild(node.cloneNode(true))\n                    return\n                }\n\n                // If element is not the same type, replace it with new element\n                if (_getNodeType(node) !== _getNodeType(domNodes[index])) {\n                    domNodes[index].parentNode.replaceChild(node.cloneNode(true), domNodes[index])\n                    return\n                }\n\n                // If content is different, update it\n                const templateContent = _getNodeContent(node)\n                if (templateContent && templateContent !== _getNodeContent(domNodes[index])) {\n                    domNodes[index].textContent = templateContent\n                }\n\n                // If target element should be empty, wipe it\n                if (domNodes[index].childNodes.length > 0 && node.childNodes.length < 1) {\n                    domNodes[index].innerHTML = ''\n                    return\n                }\n\n                // If element is empty and shouldn't be, build it up\n                // This uses a document fragment to minimize reflows\n                if (domNodes[index].childNodes.length < 1 && node.childNodes.length > 0) {\n                    const fragment = document.createDocumentFragment()\n                    _diff(node, fragment)\n                    domNodes[index].appendChild(fragment)\n                    return\n                }\n\n                // If there are existing child elements that need to be modified, diff them\n                if (node.childNodes.length > 0) {\n                    _diff(node, domNodes[index])\n                }\n            })\n        }\n\n        // todo - add support to reactivity\n        // this.template(this.state)\n        const templateHTML = _stringToHTML(this.template)\n        _diff(templateHTML, this)\n    }\n\n    /**\n     * Set the HTML to be used in the template\n     * @param {String} html The HTML to use\n     *\n     * This function is overwritten by the extended class to set the HTML\n     *\n     */\n    loadTemplate(template = '', force = false) {\n        this.template = template === '' ? this.template : `${template}`\n        this.render(force)\n    }\n\n    disconnectedCallback() {\n        this.onDestroy?.()\n    }\n}\n\ncustomElements.get('nb-nespresso-element') ||\n    customElements.define('nb-nespresso-element', NespressoElement)\n","import { BREAKPOINT_M, BREAKPOINT_TABLET } from '@kissui/components'\n\nconst viewport = () => {\n    const lt = (ref: number) => {\n        return window.innerWidth < ref\n    }\n\n    return {\n        get is() {\n            const { innerWidth: vw, devicePixelRatio } = window\n            return {\n                mobile: vw < BREAKPOINT_M,\n                mobile_tablet: vw < BREAKPOINT_TABLET,\n                tablet: vw >= BREAKPOINT_M && vw < BREAKPOINT_TABLET,\n                desktop: vw >= BREAKPOINT_TABLET && devicePixelRatio <= 1,\n                retina: vw >= BREAKPOINT_TABLET && devicePixelRatio > 1\n            }\n        },\n        lt\n    }\n}\n\nconst helper = viewport()\n\nexport default helper\n","export { waitForSelector } from './waitForSelector'\n\nexport const constants = {\n    LEFT: 37,\n    UP: 38,\n    RIGHT: 39,\n    DOWN: 40,\n    ESC: 27,\n    SPACE: 32,\n    ENTER: 13,\n    TAB: 9\n}\n\nexport function capitalize(s = '') {\n    return s[0].toUpperCase() + s.slice(1)\n}\n\nexport const convertToCamelCase = (str: string): string => {\n    const arr = str.match(/[a-z]+|\\d+/gi)\n    if (!arr) { return str }\n    return arr.map((m, i) => {\n        let low = m.toLowerCase()\n        if (i !== 0) {\n            low = low.split('').map((s, k) => (k === 0 ? s.toUpperCase() : s)).join(\"\")\n        }\n        return low\n    }).join(\"\")\n}\n\nexport function slug(s = '') {\n    return s\n        .toLowerCase()\n        .trim()\n        .replace(/\\s+/g, '-') // Replace spaces with -\n        .replace(/[^\\w-]+/g, '') // Remove all non-word chars\n        .replace(/--+/g, '-') // Replace multiple - with single -\n}\n\nexport function pxToEm(target: number, stripedInnerFontSize = 1) {\n    return target / 14 / stripedInnerFontSize + 'em'\n}\n\nexport function percent(target: number) {\n    return target + '%'\n}\n\nexport function parseHTML(str: string) {\n    const tmp = document.implementation.createHTMLDocument('')\n    tmp.body.innerHTML = str\n    return tmp.body.childNodes\n}\n\nexport function stripHTML(str: string) {\n    const tmp = document.implementation.createHTMLDocument('')\n    tmp.body.innerHTML = str\n    return (tmp.body.textContent ?? \"\").replace(RegExp('[\\\\s|\\'|\"]', 'g'), '')\n}\n\nexport function makeId(length: number) {\n    var result = ''\n    var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n    var charactersLength = characters.length\n    for (var i = 0; i < length; i++) {\n        result += characters.charAt(Math.floor(Math.random() * charactersLength))\n    }\n    return result\n}\n\nexport function removeEmptyValues(obj: { [key: string]: any }): { [key: string]: any } {\n    const findText = [\n        'Default campaign ID (tracking missing in Page Builder export)',\n        'Default campaign name (tracking missing in Page Builder export)',\n        'promoname', \n        'promoid', \n        'promocreative', \n        'undefined'\n    ];\n    \n    for (let key in obj) {\n        const value = obj[key];\n        \n        if (value === null || value === undefined || value === '') {\n            delete obj[key];\n            continue;\n        }\n        \n        if (typeof value === 'string') {\n            for (const text of findText) {\n                if (value.includes(text)) {\n                    delete obj[key];\n                    break;\n                }\n            }\n        }\n    }\n    \n    return obj;\n}\n\nexport function makeHash(str: string) {\n    var hash = 0,\n        i,\n        chr\n    if (!str) {\n        return hash\n    }\n    for (i = 0; i < str.length; i++) {\n        chr = str.charCodeAt(i)\n        hash = (hash << 5) - hash + chr\n        hash |= 0 // Convert to 32bit integer\n    }\n    return 'id-' + hash\n}\n\nexport function getHashLink(link: string) {\n    let linkHash = link\n    let linkNoHash = link\n    if (link.indexOf('#') !== -1) {\n        linkNoHash = link.replace('#', '')\n    } else {\n        linkHash = '#' + link\n    }\n\n    return { linkNoHash, linkHash }\n}\n\nexport function lazyLoad(node: Element, attribute: string, value: any, url: string) {\n    const CLASSNAME_OUT_OF_SCREEN = 'lazy-load'\n    const CLASSNAME_IN_SCREEN = 'lazy-loaded'\n    const CLASSNAME_ON_ERROR = 'lazy-loaded-error'\n\n    const isOldIOS = () => {\n        var agent = window.navigator.userAgent,\n            start = agent.indexOf('OS ')\n        if ((agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1) {\n            return window.Number(agent.substr(start + 3, 3).replace('_', '.')) < 14\n        }\n        return false\n    }\n\n    const inViewPort = (attribute: string, value: any) => {\n        node.setAttribute(attribute, value)\n\n        const cb = () => node.classList.add(CLASSNAME_IN_SCREEN)\n\n        if (url) {\n            const img = new Image()\n            img.src = url\n            img.onload = cb\n            img.onerror = () => {\n                cb()\n                node.classList.add(CLASSNAME_ON_ERROR)\n                throw new Error(`Image ${url} cannot be loaded`)\n            }\n\n            return\n        }\n\n        cb()\n    }\n\n    if (/Trident\\/|MSIE/.test(window.navigator.userAgent) || isOldIOS()) {\n        inViewPort(attribute, value)\n    } else {\n        if ('IntersectionObserver' in window) {\n            node.classList.add(CLASSNAME_OUT_OF_SCREEN)\n            let lazyBackgroundObserver = new IntersectionObserver(function (entries) {\n                entries.forEach(function (entry) {\n                    if (entry.isIntersecting) {\n                        inViewPort(attribute, value)\n                        lazyBackgroundObserver.unobserve(entry.target)\n                    }\n                })\n            })\n            lazyBackgroundObserver.observe(node)\n        } else {\n            inViewPort(attribute, value)\n        }\n    }\n}\n\nexport function lazyLoadCallback(node: Element, cb: () => void) {\n    const isOldIOS = () => {\n        var agent = window.navigator.userAgent,\n            start = agent.indexOf('OS ')\n        if ((agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1) {\n            return window.Number(agent.substr(start + 3, 3).replace('_', '.')) < 14\n        }\n        return false\n    }\n\n    if (/Trident\\/|MSIE/.test(window.navigator.userAgent) || isOldIOS()) {\n        cb()\n    } else {\n        if ('IntersectionObserver' in window) {\n            let lazyBackgroundObserver = new IntersectionObserver(\n                function (entries) {\n                    entries.forEach(function (entry) {\n                        if (entry.isIntersecting) {\n                            cb()\n                            lazyBackgroundObserver.unobserve(entry.target)\n                        }\n                    })\n                },\n                { rootMargin: '150% 0px' }\n            )\n            lazyBackgroundObserver.observe(node)\n        }\n    }\n}\n\n// Debounce\nexport function debounce<T>(func: (v: T) => void, time = 100) {\n    let timer: number\n    return function (event: T) {\n        if (timer) {\n            window.clearTimeout(timer)\n        }\n        timer = window.setTimeout(func, time, event)\n    }\n}\n\n// isIE - to check for internet explorer\nexport function isIE() {\n    let ua = window.navigator.userAgent,\n        isIE = /MSIE|Trident/.test(ua)\n\n    return isIE\n}\n\n// Load external script\nexport const loadExternalScript = ({\n    src,\n    callback = null,\n    async = false,\n    defer = false,\n    module = false,\n    id = ''\n}: {\n    src: string;\n    callback: null | GlobalEventHandlers[\"onload\"]\n    module: boolean,\n    defer: boolean,\n    async: boolean,\n    id: string\n}) => {\n    const script = document.createElement('script')\n    script.type = module ? 'module' : 'text/javascript'\n    script.src = src\n    id ? (script.id = id) : false // add id attribute only if passed\n    if (typeof callback === 'function') {\n        script.onload = callback\n    }\n    script.async = async\n    script.defer = defer\n    document.body.appendChild(script)\n}\n\n// Load external css\nexport const loadExternalCss = ({ src }: { src: string }) => {\n    const script = document.createElement('link')\n    script.rel = 'stylesheet'\n    script.href = src\n    document.body.appendChild(script)\n}\n// Lazy load vendor script\nexport const lazyLoadVendorScript = (handler, el) => {\n    const observer = new IntersectionObserver(handler)\n    observer.observe(el)\n}\n\n/**\n * Replaces variable inside a given string\n * Each variable have to be enclosed between stChr and enChr\n * The values have to be contained in the vars object, they key must match\n * example :\n * txt : 'See {resultsLength} Results'\n * vars : {resultsLength:'30'}\n * stChr : '{'\n * enChr : '}'\n *\n * will return : 'See 30 Results'\n *\n * @param {string} txt\n * @param {object} vars\n * @param {string} stChr\n * @param {string} enChr\n */\nexport function interpolate(txt: string, vars: Record<string, null | undefined | string>, stChr: string, enChr: string) {\n    let curIdx = 0\n\n    while (txt) {\n        const stIdx = txt.indexOf(stChr, curIdx)\n        if (stIdx === -1) {\n            break\n        }\n        const enIdx = txt.indexOf(enChr, stIdx + 1)\n        if (enIdx === -1) {\n            break\n        }\n        const hashId = txt.substring(stIdx + stChr.length, enIdx)\n        if (vars[hashId] != null) {\n            txt = txt.substr(0, stIdx) + vars[hashId] + txt.substr(enIdx + enChr.length)\n            curIdx = stIdx\n        } else {\n            curIdx = enIdx\n        }\n    }\n    return txt\n}\n\n/**\n * Find in container element, add height to equal size of element\n * @param container css path where my element is contain e.g. `.c-container`\n * @param el css path of elements to equalized\n */\nexport const equalHeight = (containerSelector: string, el: string, elementScope: HTMLElement) => {\n    const container = elementScope.querySelector<HTMLElement>(containerSelector)\n    if (!container) {\n        return\n    }\n\n    const items = container.querySelectorAll<HTMLElement>(el)\n    let max = -1\n\n    for (let i = 0; i < [...items].length; i++) {\n        const item = [...items][i]\n        let h = item.offsetHeight\n        max = h > max ? h : max\n    }\n\n    if (max <= 0) {\n        return\n    }\n\n    for (let i = 0; i < [...items].length; i++) {\n        const item = [...items][i]\n        item.style.height = `${max}px`\n    }\n}\n\nexport const stringifyCurlyQuote = (data: {}) => JSON.stringify(data).replace(\"'\", '’')\n\nexport const stringifyForAttribute = (data = {}) => {\n    return escapeHtml(JSON.stringify(data))\n}\n\n/**\n * This function is included instead of sanitizeString because for\n * inserting HTML into innerHTML we need to make sure all HTML\n * entities are escaped.\n */\nexport const escapeHtml = (text: string) => {\n    const map = {\n        '&': '&amp;',\n        '<': '&lt;',\n        '>': '&gt;',\n        '\"': '&quot;',\n        \"'\": '&#039;'\n    } as { [s: string]: string }\n\n    return text.replace(/[&<>\"']/g, (m) => map[m])\n}\n\n/**\n * Because setting attributes escapes more than the characters above and then preact also\n * escapes text we need a more complete way of unescaping all html entities (not just the ones\n * above)\n */\nconst domParser = new DOMParser()\nexport const unescapeHtml = (text: string) => {\n    return domParser.parseFromString(text, \"text/html\").body.textContent\n}\n\nexport const sanitizeString = (data: {}) => {\n    if (!data) {\n        return ''\n    }\n\n    return data.toString().replace(/\"/g, '&quot;').replace(/'/g, '&apos;')\n}\n\nexport const stripTags = (s: string) => {\n    return (s || '').replace(/(<([^>]+)>)/gi, '')\n}\n\nexport const setAttributes = (element: Element, attrs: Record<string, any>) => {\n    for (let key in attrs) {\n        element.setAttribute(key, attrs[key])\n    }\n    return element\n}\n\nexport const getMetaContent = (metaName: string) => {\n    const metaTag = document.querySelector(`meta[name=${metaName}]`)\n    if (!metaTag) {\n        return ''\n    }\n    return metaTag.getAttribute('content')\n}\n\nexport const isObjectEmpty = (obj: {}) => {\n    return Object.keys(obj).length === 0\n}\n","export const VARIATION_PLP = 'plp'\nexport const VARIATION_PDP = 'pdp'\nexport const VARIATION_CROSS_SELL = 'cross-sell'\nexport const VARIATION_SMALL = 'small'\n","import { VARIATION_PDP } from '@kissui/components/src/sku/constants'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\n\nconst isPdp = variation => variation === VARIATION_PDP\n\nconst getHeadingLevel = ({ variation }) => (isPdp(variation) ? 'h1' : 'h3')\n\nconst renderLink = ({ url, a11y_product_card = '', name = '', name_custom = '' }) => {\n    const a11yProductName = a11y_product_card.replace('{productName}', name)\n    const productName = name_custom !== '' ? name_custom : name\n\n    return `<a href=\"${url}\" target=\"_self\" title=\"${a11yProductName}\" aria-label=\"${a11yProductName}\">${productName}</a>`\n}\n\nexport const renderHeading = props => {\n    const { url, name = '', name_custom = '' } = props\n\n    if (!name) {\n        return ''\n    }\n\n    const finalName = name_custom !== '' ? name_custom : name\n    const result = []\n    const headingLevel = getHeadingLevel(props)\n\n    result.push(\n        `<${headingLevel} class=\"cb-heading ${\n            viewportHelper.is.mobile ? 't-md-700-sl' : 'h-lg-700'\n        }\">`\n    )\n\n    if (url && !isPdp(props.variation)) {\n        result.push(renderLink(props))\n    } else {\n        result.push(`${finalName}`)\n    }\n\n    result.push(`</${headingLevel}>`)\n\n    return result.join('')\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nexport const renderHeadline = ({ headline = '', is_headline_hidden = false }) => {\n    if ((is_headline_hidden && viewportHelper.is.mobile) || !headline) {\n        return ''\n    }\n\n    return `<p class=\"cb-text t-sm-400-sl\">${headline}</p>`\n}\n","export const renderLabelTechnology = ({ label_technology }) => {\n    if (!label_technology) {\n        return ''\n    }\n\n    return `<p class=\"cb-technology t-xs-700-sl\">${label_technology}</p>`\n}\n","export const renderLabelRange = ({ label_range }) => {\n    if (!label_range) {\n        return ''\n    }\n\n    return `<p class=\"cb-range t-xs-500-sl\">${label_range}</p>`\n}\n","import { COFFEE_VERTUO } from '@kissui/components/src/constants.mjs'\nimport { getCurrency } from './getCurrency'\nexport { getCurrency } from './getCurrency'\n\nexport const ECAPI_TYPE_CAPSULE = 'capsule'\nexport const ECAPI_TYPE_MACHINE = 'machine'\nexport const ECAPI_TYPE_ACCESSORY = 'accessory'\nexport const ECAPI_TYPE_GIFT_CARD = 'giftcard'\n\nconst TECHNOLOGY_CATEGORY_IDENTIFIER = '/machineTechno/'\nconst SLEEVE_OF_10 = 10\nconst SLEEVE_OF_7 = 7\n\nconst trimSku = sku => sku.replace(/[^a-z0-9- +./]/gi, '')\n\nexport const getLegacySKU = productId => productId.split('prod/').pop()\n\nexport const getPriceFormatter = async () => await window.napi.priceFormat()\n\nexport const getProduct = sku => window.napi.catalog().getProduct(trimSku(sku))\n\nexport function getTechnologyName(productData) {\n    const techno = productData.technologies[0]\n    return techno.substring(\n        techno.indexOf(TECHNOLOGY_CATEGORY_IDENTIFIER) + TECHNOLOGY_CATEGORY_IDENTIFIER.length\n    )\n}\n\nfunction isMultipleOf(quantity, multiple) {\n    return quantity % multiple === 0\n}\n\nexport function getSleeveNumber(product, getTechnologyNameFn = getTechnologyName) {\n    if (product.sales_multiple !== 1 && isMultipleOf(product.sales_multiple, SLEEVE_OF_10)) {\n        // Sleeve of original or vertuo\n        return product.sales_multiple / SLEEVE_OF_10\n    }\n\n    if (\n        product.sales_multiple !== 1 &&\n        getTechnologyNameFn(product) === COFFEE_VERTUO &&\n        isMultipleOf(product.sales_multiple, SLEEVE_OF_7)\n    ) {\n        // Sleeve of vertuo\n        return product.sales_multiple / SLEEVE_OF_7\n    }\n\n    if (product.sales_multiple === 1 && isMultipleOf(product.unitQuantity, SLEEVE_OF_10)) {\n        // Bundle of original or vertuo\n        return product.unitQuantity / SLEEVE_OF_10\n    }\n\n    if (\n        product.sales_multiple === 1 &&\n        getTechnologyNameFn(product) === COFFEE_VERTUO &&\n        isMultipleOf(product.unitQuantity, SLEEVE_OF_7)\n    ) {\n        // Bundle of vertuo\n        return product.unitQuantity / SLEEVE_OF_7\n    }\n\n    return NaN\n}\n\n/**\n * Guess if the product is part of a bundle.\n * This is determined by checking the 'sales_multiple' and 'unitQuantity' properties.\n */\nexport function isBundled(productData) {\n    // TODO: this function should not change the productData, but some components still need it\n    productData.sales_multiple = productData.sales_multiple || productData.salesMultiple\n\n    const isSalesMultipleGreaterThanOne = productData.sales_multiple > 1\n    const isUnitQuantityEqualToOne = productData.unitQuantity === 1\n    const isSalesMultipleEqualToOne = productData.sales_multiple === 1\n    const isUnitQuantityGreaterThanOne = productData.unitQuantity > 1\n\n    // The product is not bundled if sales_multiple > 1 and unitQuantity = 1\n    if (isSalesMultipleGreaterThanOne && isUnitQuantityEqualToOne) {\n        return false\n    }\n\n    // The product is bundled if sales_multiple = 1 and unitQuantity > 1\n    return isSalesMultipleEqualToOne && isUnitQuantityGreaterThanOne\n}\n\n/**\n * Replace an array of SKU with product data\n * Remove the element inside the list if sku fail. It prevents to get an empty item.\n * @param {Array.<String>} skus\n * @param getProductFn\n * @returns {Promise<Awaited<unknown>[]>}\n */\nexport function getProductAndClean(skus, getProductFn = getProduct, napi = window.napi) {\n    const promises = []\n\n    if (!napi) {\n        return Promise.reject()\n    }\n\n    if (!Array.isArray(skus)) {\n        skus = [skus]\n    }\n\n    // Load manually the product to delete SKU fail\n    for (const sku of skus) {\n        promises.push(\n            getProductFn(sku)\n                .then(data => skus.splice(skus.indexOf(sku), 1, data))\n                .catch(() => {\n                    skus.splice(skus.indexOf(sku), 1)\n                    console.error(`getProduct fail on sku ${sku}`)\n                })\n        )\n    }\n\n    return Promise.all(promises)\n}\n\nexport const getFormattedPrice = async price => {\n    const priceFormatter = await getPriceFormatter()\n    const currency = getCurrency()\n\n    return priceFormatter.html\n        ? priceFormatter.html(currency, price)\n        : priceFormatter.short(currency, price) || ''\n}\n\nexport const getProductCategories = async sku => {\n    const productDetails = await getProduct(sku)\n    const productCategories = productDetails ? productDetails.supercategories : []\n    const productCategoriesNew = await Promise.all(\n        productCategories.map(async categoryEncoded => {\n            const productCategoryData = await window.napi.catalog().getCategory(categoryEncoded)\n            return productCategoryData\n        })\n    )\n    return productCategoriesNew\n}\n","export const getCurrency = () => window[window.config.padl.namespace].dataLayer.app.app.currency\n","import { getFormattedPrice } from '@kissui/helpers/src/catalog'\n\nconst getStrikethroughPriceElement = component => {\n    return component.querySelector('.cb-price-old')\n}\n\nconst fetchStrikethroughPrice = strikethroughPrice => {\n    return getFormattedPrice(strikethroughPrice)\n}\n\nexport const renderStrikethroughPrice = ({ strikethrough_price }, component) => {\n    if (!strikethrough_price) {\n        return ''\n    }\n\n    fetchStrikethroughPrice(strikethrough_price)\n        .then(payload => {\n            const element = getStrikethroughPriceElement(component)\n            if (!element) {\n                return\n            }\n\n            element.innerHTML = payload\n        })\n        .catch(e => {\n            console.error(`Error: Component SKU - Strike Through Price  - ${e}`)\n\n            const element = getStrikethroughPriceElement(component)\n            if (!element) {\n                return\n            }\n\n            element.style.display = 'none'\n        })\n\n    return `<p class=\"cb-price-old t-sm-400-sl\"></p>`\n}\n","import { ECAPI_TYPE_CAPSULE } from '@kissui/helpers/src/catalog'\nexport const renderPrice = ({\n    price,\n    hidePrice,\n    giftcard_price,\n    price_per_capsule,\n    show_sleeve_price,\n    type\n}) => {\n    if ((!price && !giftcard_price) || hidePrice) {\n        return ''\n    }\n    let finalPrice = null\n    if (!show_sleeve_price && price_per_capsule) {\n        finalPrice = price_per_capsule\n    } else {\n        finalPrice = price\n    }\n    if (type !== ECAPI_TYPE_CAPSULE) {\n        finalPrice = price\n    }\n\n    return `<p class=\"cb-price-current\"><span>${finalPrice || giftcard_price}</span></p>`\n}\n","export const getDataLayer = () => {\n    return window[window?.padlNamespace]?.dataLayer\n}\n\nexport const getMarketCode = () => {\n    const dataLayer = getDataLayer()\n    if (!dataLayer) {\n        return 'ch'\n    }\n\n    return dataLayer.app.app.market.toLocaleLowerCase()\n}\n\nexport const getLangCode = () => {\n    const dataLayer = getDataLayer()\n    if (!dataLayer) {\n        return 'en'\n    }\n\n    return getDataLayer().page.page.pageInfo.language.toLocaleLowerCase()\n}\n\nexport const getSegmentCode = () => {\n    const dataLayer = getDataLayer()\n    if (!dataLayer) {\n        return 'B2C'\n    }\n\n    return getDataLayer().page.page.pageInfo.segmentBusiness\n}\n\nexport const isLoggedIn = () => {\n    const dataLayer = getDataLayer()\n    if (!dataLayer || !dataLayer.user) {\n        return false\n    }\n\n    return dataLayer.user.isLoggedIn\n}\n\nexport const interpolateMarketLang = (string, market, lang) => {\n    return string.replace('{market}', market).replace('{lang}', lang)\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport {\n    VARIATION_PLP,\n    VARIATION_SMALL,\n    VARIATION_CROSS_SELL,\n    VARIATION_PDP\n} from '@kissui/components/src/sku/constants'\nimport { isLoggedIn } from '@kissui/helpers/src/dataLayer'\n\nconst getButtonSize = variation => {\n    switch (variation) {\n        case VARIATION_PLP:\n            return viewportHelper.is.mobile ? 'small' : 'large'\n        case VARIATION_SMALL:\n            return 'small'\n        default:\n            return 'large'\n    }\n}\n\nfunction getComputedProps(activeSku, activeLongSku, sku, longSku, disableTracking) {\n    const skuProp = activeSku || sku\n    const activeLongSkuProp = activeLongSku || longSku\n    const disableTrackingProp = disableTracking && `disableTracking=true`\n\n    return { skuProp, activeLongSkuProp, disableTrackingProp }\n}\n\nexport const renderAddToCart = props => {\n    const {\n        activeLongSku,\n        activeSku,\n        category_name = '',\n        contact_cta = {},\n        hidePrice,\n        longSku = '',\n        position,\n        rendererName = '',\n        show_view_details = false,\n        sku,\n        url,\n        variation = VARIATION_PLP,\n        view_details_label = 'View details',\n        technologies = [],\n        disableTracking = false\n    } = props\n\n    const buttonSize = getButtonSize(variation)\n    let cta_url = url,\n        cta_label = view_details_label,\n        contact_cta_text = contact_cta.contact_cta_text || '',\n        contact_url_anchor = contact_cta.contact_url_anchor || '',\n        is_b2b = checkForB2B(technologies)\n\n    // CONTACT US BUTTON\n    const { skuProp, activeLongSkuProp, disableTrackingProp } = getComputedProps(\n        activeSku,\n        activeLongSku,\n        sku,\n        longSku,\n        disableTracking\n    )\n\n    function b2bNotLoggedIn(contact_url_anchor, cta_url, cta_label) {\n        //CONTACT US BUTTON[ hidePrice = true]\n        const linkAttribute = contact_url_anchor ? `link=\"${cta_url}\"` : ''\n\n        return `<nb-cta ${linkAttribute} variation=\"primary\" data-disabletracking=\"true\">${cta_label}</nb-cta>`\n    }\n\n    function b2bLoggedIn({\n        skuProp,\n        activeLongSkuProp,\n        buttonSize,\n        category_name,\n        position,\n        rendererName,\n        variation,\n        disableTrackingProp\n    }) {\n        return `\n                    <nb-add-to-cart\n                        sku=\"${skuProp}\"\n                        longSku=\"${activeLongSkuProp}\"\n                        buttonSize=\"${buttonSize}\"\n                        showPrice\n                        range='${category_name}'\n                        position='${position}'\n                        rendererName='${rendererName}'\n                        tracking_no_impression=\"${variation === VARIATION_PDP}\"\n                        ${disableTrackingProp}\n                    >\n                    </nb-add-to-cart>\n                `\n    }\n\n    function remainingCases(cta_url, cta_label) {\n        //VIEW DETAILS BUTTON [ hidePrice = false]\n        return `<nb-cta link=\"${cta_url}\" variation=\"primary\">${cta_label}</nb-cta>`\n    }\n\n    if (hidePrice || show_view_details) {\n        if (\n            is_b2b &&\n            (variation === VARIATION_PDP || variation === VARIATION_CROSS_SELL) &&\n            !isLoggedIn()\n        ) {\n            cta_url = contact_url_anchor\n            cta_label = contact_cta_text\n\n            return b2bNotLoggedIn(contact_url_anchor, cta_url, cta_label)\n        } else if (is_b2b && variation === VARIATION_PDP && isLoggedIn()) {\n            return b2bLoggedIn({\n                skuProp,\n                activeLongSkuProp,\n                buttonSize,\n                category_name,\n                position,\n                rendererName,\n                variation,\n                disableTrackingProp\n            })\n        }\n\n        return remainingCases(cta_url, cta_label)\n    }\n\n    // ADD TO CART BUTTON\n    return `\n            <nb-add-to-cart\n                sku=\"${skuProp}\"\n                longSku=\"${activeLongSkuProp}\"\n                buttonSize=\"${buttonSize}\"\n                showPrice\n                range='${category_name}'\n                position='${position}'\n                rendererName='${rendererName}'\n                tracking_no_impression=\"${variation === VARIATION_PDP}\"\n                ${disableTrackingProp}\n            ></nb-add-to-cart>\n        `\n}\n\nfunction checkForB2B(technologies) {\n    return Array.isArray(technologies) && technologies.some(tech => tech.includes('pro'))\n}\n","export const renderAdditionalMessage = ({\n    additional_message_icon,\n    additional_message,\n    additional_message_link\n}) => {\n    if (!additional_message && !additional_message_link) {\n        return ''\n    }\n\n    let additionalMessageFinal = ''\n\n    if (additional_message) {\n        let renderIcon = ''\n        if (additional_message_icon) {\n            renderIcon = `<nb-icon icon=\"${additional_message_icon}\" class=\"additionalMsgIcon\"></nb-icon>`\n        }\n\n        additionalMessageFinal = `<p class=\"cb-warn t-sm-500-sl\">\n            ${renderIcon}\n            ${additional_message}</p>`\n    }\n\n    const hasAdditionalMessageLink =\n        additional_message_link && additional_message_link.link && additional_message_link.label\n\n    if (!hasAdditionalMessageLink) {\n        return additionalMessageFinal\n    }\n\n    return (\n        additionalMessageFinal +\n        `<nb-link\n            link='${additional_message_link.link}'\n            color=\"${additional_message_link.color}\"\n            size=\"${additional_message_link.size}\"\n            seo_label=\"${additional_message_link.seo_label}\">\n            ${additional_message_link.label}\n        </nb-link>`\n    )\n}\n","import { getMarketCode } from './dataLayer'\n\nconst LABEL_CATEGORY_NAME = 'cat/capsule-range-label'\nconst LABEL_CATEGORY_NAME_MACHINE = 'cat/machine-range-label'\nexport const RANGE_CATEGORY_NAME = 'cat/capsule-range'\nconst FAIR_TRADE_CATEGORY_NAME = 'cat/capsule-range-fair-trade'\nconst VERTUO_NEXT_CATEGORY_NAME = 'cat/capsule-attribute-only-vertuo-next'\nconst ORGANIC_EU_CATEGORY_NAME = 'capsule-attribute-organic-eu'\nconst RAINFOREST_CATEGORY_NAME = 'capsule-attribute-rainforest'\nconst SUSTAINABILITY_CATEGORY_NAME = 'capsule-attribute-sustainability'\nconst ARABICA_CATEGORY_NAME = 'capsule-attribute-arabica'\nconst PRODUCT_HIGHLIGHT_CATEGORY_NAME = 'cat/capsule-attribute-highlight'\nconst TECHNOLOGY_CATEGORY_IDENTIFIER = '/machineTechno/'\n\nconst COMMON_URL = 'https://www.nespresso.com/shared_res/agility/commons/img/icons/'\n\nexport const FAIR_TRADE_IMG = COMMON_URL + 'fairTrade.svg'\nexport const ORGANIC_LOGO_IMG_EU = COMMON_URL + 'logo-organic-eu.svg'\nexport const ORGANIC_LOGO_IMG_US = COMMON_URL + 'logo-organic-us.svg'\nexport const ORGANIC_LOGO_IMG_CA = COMMON_URL + 'logo-organic-ca.svg'\nexport const ORGANIC_LOGO_IMG_BR = COMMON_URL + 'logo-organic-br.svg'\nexport const ORGANIC_LOGO_IMG_JP = COMMON_URL + 'logo-organic-jp.svg'\nexport const ORGANIC_LOGO_IMG_BE = COMMON_URL + 'logo-organic-be.png'\n\nexport const VERTUONEXT_LOGO_IMG = COMMON_URL + 'logo-only-vertuo-next.svg'\nexport const RAINFOREST_LOGO_IMG = COMMON_URL + 'logo-rainforest.svg'\nexport const SUSTAINABILITY_LOGO_IMG = COMMON_URL + 'logo-sustainability.svg'\nexport const Q_CERTIFICATION_ARABICA_LOGO_IMG = COMMON_URL + 'q_grade_certification_arabica.svg'\nexport const DESIGN_AWARD_2021_IMG = COMMON_URL + 'design_award_2021.svg'\n\nexport const LOGO_IMG_MAP = {\n    fair_trade: FAIR_TRADE_IMG,\n    is_organic: getOrganicLogo(),\n    only_vertuo_next: VERTUONEXT_LOGO_IMG,\n    is_q_certified_arabica: Q_CERTIFICATION_ARABICA_LOGO_IMG,\n    is_rainforest: RAINFOREST_LOGO_IMG,\n    is_sustainable: SUSTAINABILITY_LOGO_IMG,\n    is_design_award_2021: DESIGN_AWARD_2021_IMG\n}\n\nexport function getOrganicLogo() {\n    let organicLogoImg = ORGANIC_LOGO_IMG_EU\n\n    switch (getMarketCode()) {\n        case 'us':\n            organicLogoImg = ORGANIC_LOGO_IMG_US\n            break\n        case 'ca':\n            organicLogoImg = ORGANIC_LOGO_IMG_CA\n            break\n        case 'br':\n            organicLogoImg = ORGANIC_LOGO_IMG_BR\n            break\n        case 'jp':\n            organicLogoImg = ORGANIC_LOGO_IMG_JP\n            break\n        case 'be':\n            organicLogoImg = ORGANIC_LOGO_IMG_BE\n            break\n    }\n\n    return organicLogoImg\n}\n\n/**\n * retrieves the list of categories of type Vertuo Next\n * @param {category[]} categories\n */\nexport function getVertuoNext(categories) {\n    return categories.find(category => isVertuoNext(category))\n}\n\n/**\n * returns true when the category is product vertuo next\n * @param {category} category\n */\nfunction isVertuoNext(category) {\n    return getCategoryRegEx(VERTUO_NEXT_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * retrieves the list of categories of type organic EU\n * @param {category[]} categories\n */\nexport function getOrganicEu(categories) {\n    return categories.find(category => isOrganicEu(category))\n}\n\n/**\n * returns true when the category is product organic EU\n * @param {category} category\n */\nfunction isOrganicEu(category) {\n    return getCategoryRegEx(ORGANIC_EU_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * retrieves the list of categories of type rainforest\n * @param {category[]} categories\n */\nexport function getRainforest(categories) {\n    return categories.find(category => isRainforest(category))\n}\n\n/**\n * returns true when the category is rainforest\n * @param {category} category\n */\nfunction isRainforest(category) {\n    return getCategoryRegEx(RAINFOREST_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * retrieves the list of categories of type sustainability\n * @param {category[]} categories\n */\nexport function getSustainability(categories) {\n    return categories.find(category => isSustainability(category))\n}\n\n/**\n * retrieves the list of categories of type arabica\n * @param {category[]} categories\n */\nexport function getArabica(categories) {\n    return categories.find(category => isArabica(category))\n}\n\n/**\n * returns true when the category is arabica\n * @param {category} category\n */\nfunction isArabica(category) {\n    return getCategoryRegEx(ARABICA_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * returns true when the category is sustainability\n * @param {category} category\n */\nfunction isSustainability(category) {\n    return getCategoryRegEx(SUSTAINABILITY_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * retrieves the list of categories of type label\n * @param {category[]} categories\n */\nexport function getLabels(categories) {\n    return categories.filter(category => isLabel(category))\n}\n\n/**\n * retrieves the list of categories of type label\n * @param {category[]} categories\n */\nexport function getProductHighlight(categories) {\n    return categories.find(category => isProductHighlight(category))\n}\n/**\n * retrieves the list of categories of type label\n * @param {category[]} categories\n */\nexport function getFairTrade(categories) {\n    return categories.find(category => isFairTrade(category))\n}\n\n/**\n * returns a regex to match the tail (global) of a given local category ID\n * @param {string} categoryIdTail : should contain the end of the category ID\n */\nexport function getCategoryRegEx(categoryIdTail) {\n    return new RegExp(categoryIdTail.replace(/\\//g, '\\\\/'))\n}\n\n/**\n * returns true when the category is child of the label category (is type label)\n * @param {category} category\n */\nfunction isLabel(category) {\n    return (\n        getCategoryRegEx(LABEL_CATEGORY_NAME).test(category.id) ||\n        getCategoryRegEx(LABEL_CATEGORY_NAME_MACHINE).test(category.id)\n    )\n}\n\n/**\n * returns true when the category is product highlight\n * @param {category} category\n */\nfunction isProductHighlight(category) {\n    return getCategoryRegEx(PRODUCT_HIGHLIGHT_CATEGORY_NAME).test(category.id)\n}\n/**\n * returns true when the category is fair trade\n * @param {category} category\n */\nfunction isFairTrade(category) {\n    return getCategoryRegEx(FAIR_TRADE_CATEGORY_NAME).test(category.id)\n}\n\n/**\n * returns true when the category is child of the range category (is type range)\n * @param {category} category\n */\nexport function isRange(category) {\n    return category.superCategories.some(superCategory =>\n        getCategoryRegEx(RANGE_CATEGORY_NAME).test(superCategory)\n    )\n}\n\nexport function getTechnologyName(productData, categories) {\n    if (!productData || !productData.technologies || !productData.technologies.length) {\n        return null\n    }\n\n    const techno = productData.technologies[0]\n    const categoryNameAsSubstring = techno.substring(\n        techno.indexOf(TECHNOLOGY_CATEGORY_IDENTIFIER) + TECHNOLOGY_CATEGORY_IDENTIFIER.length\n    )\n    const category = categories?.find(cat => cat.id === techno)\n\n    // Backward compatibility, return name as substring if the list of categories are not available\n    return category?.name || categoryNameAsSubstring\n}\n\nexport function isCategoryHidden(categoryId) {\n    let hideCategory = false\n    // To enable AB testing: exclude categories which are to be hidden\n    if (\n        window.PLP_HIDE_CATEGORIES?.length &&\n        window.PLP_HIDE_CATEGORIES.findIndex(c => categoryId.indexOf(c) >= 0) >= 0\n    ) {\n        hideCategory = true\n    }\n\n    // To enable AB testing: exclude categories except those which are to be shown\n    if (window.PLP_ONLY_SHOW_CATEGORIES?.length) {\n        // Default to hide\n        hideCategory = true\n        if (window.PLP_ONLY_SHOW_CATEGORIES.findIndex(c => categoryId.indexOf(c) >= 0) >= 0) {\n            hideCategory = false\n        }\n    }\n    return hideCategory\n}\n","import {\n    getVertuoNext,\n    getOrganicEu,\n    getRainforest,\n    getLabels,\n    getProductHighlight,\n    getFairTrade,\n    getSustainability,\n    isRange,\n    getCategoryRegEx,\n    RANGE_CATEGORY_NAME,\n    getArabica\n} from '@kissui/helpers/src/cremaDataHelper'\n\n/**\n * Modifies the structure to make it easier to use in components\n * Applies all the data customization mixing Page builder with HMC data\n * @param {object} plpData : original PLP data\n */\nexport async function getMergedPLPData(plpData) {\n    const { data } = plpData\n    if (!data) {\n        return []\n    }\n\n    const eCommerceData = data.configuration.eCommerceData\n\n    addLabels(eCommerceData)\n\n    addProductAttribute(\n        eCommerceData,\n        getFairTrade,\n        (prod, category) => (prod.fairTrade = category.name)\n    )\n    addProductAttribute(eCommerceData, getProductHighlight, prod => (prod.highlighted = true))\n    addProductAttribute(eCommerceData, getVertuoNext, prod => (prod.onlyVertuoNext = true))\n    addProductAttribute(eCommerceData, getOrganicEu, prod => (prod.organicEu = true))\n    addProductAttribute(eCommerceData, getRainforest, prod => (prod.rainforest = true))\n    addProductAttribute(eCommerceData, getSustainability, prod => (prod.sustainability = true))\n    addProductAttribute(eCommerceData, getArabica, prod => (prod.arabica = true))\n\n    addSubSegments(eCommerceData)\n\n    return eCommerceData.categories\n}\n\nfunction addSubSegments(eCommerceData) {\n    const { categories, productGroups, products } = eCommerceData\n    // should be forEach if nothing returned/assigned\n    categories.forEach(category => {\n        const hasSegment = category.subCategories.length > 0 && isRange(category)\n        if (hasSegment) {\n            category.segments = category.subCategories.map(categoryId => {\n                const segment = categories.find(subCategory => subCategory.id === categoryId)\n                if (segment && isSubsegment(categories, segment)) {\n                    segment.products = getProductsData(productGroups, segment.id, products)\n                    segment.isSegment = true\n                }\n                return segment\n            })\n        }\n\n        category.products = getProductsData(productGroups, category.id, products)\n    })\n}\n\nexport function getProductsData(productGroups, categoryId, products) {\n    let result = []\n    try {\n        const currentCategory = productGroups.find(category => category.categoryId === categoryId)\n\n        if (!currentCategory) {\n            return result\n        }\n\n        const { productIds } = currentCategory\n        return productIds.map(productId => {\n            const product = products.find(product => product.id === productId)\n            return product\n        })\n    } catch (e) {\n        //generally an anti pattern to only log the error, with no try catch the result would be the same\n        console.log(e)\n    }\n\n    return result\n}\n\n/**\n * adds labels property to products containing each label's category data (JSON parsed description property) assigned to it\n * labels are categories that have the label base category as parent\n * to apply a label on a given product, the label has to contain the product\n * this function has to clean the productGroups as well by removing the label ones\n * @param {category[]} categories\n * @param {productGroup[]} productGroups\n * @param {product[]} products\n */\nfunction addLabels(eCommerceData) {\n    const { categories, productGroups, products } = eCommerceData\n    const labels = getLabels(categories)\n    const labelGroups = getLabelGroups(productGroups, labels)\n    labelGroups.forEach(group => {\n        const label = labels.find(label => label.id === group.categoryId)\n        group.productIds.forEach(productId => {\n            const prod = products.find(product => product.id === productId)\n            prod.labels = prod.labels || []\n            prod.labels.push(label.description)\n        })\n    })\n    //removing label categories from productGroups\n    labelGroups.forEach(labelGroup => {\n        const indexToRemove = productGroups.findIndex(\n            productGroup => productGroup.categoryId === labelGroup.categoryId\n        )\n        productGroups.splice(indexToRemove, 1)\n    })\n}\n\n/**\n * adds a property to products containing the given category assigned to it\n * The category is recognized by ID\n * to apply a the category on a given product, the category's productGroup has to contain the product\n * this function has to clean the productGroups as well by removing the given's one to not let it display as a range in the PLP\n * @param {category[]} categories\n * @param {productGroup[]} productGroups\n * @param {product[]} products\n */\nfunction addProductAttribute(eCommerceData, categoryFetcher, assignHandler) {\n    const { categories, productGroups, products } = eCommerceData\n    const category = categoryFetcher(categories)\n    if (!category) {\n        return\n    }\n    const categoryGroup = getCategoryGroup(productGroups, category)\n    if (!categoryGroup) {\n        return\n    }\n    categoryGroup.productIds.forEach(productId => {\n        const prod = products.find(product => product.id === productId)\n        if (categoryFetcher === getArabica) {\n            console.log('addProductAttribute', prod)\n        }\n        assignHandler(prod, category)\n    })\n    const indexToRemove = productGroups.findIndex(\n        productGroup => productGroup.categoryId === categoryGroup.categoryId\n    )\n    productGroups.splice(indexToRemove, 1)\n}\n\n/**\n * retrieve all the productGroup that are labels\n * @param {productGroup[]} productGroups\n * @param {category[]} labels\n */\nfunction getLabelGroups(productGroups, labels) {\n    return productGroups.filter(group => labels.some(label => label.id === group.categoryId))\n}\n\n/**\n * retrieve the productGroup which correspond to a category\n * @param {productGroup[]} productGroups\n * @param {category} fairTrade\n */\nfunction getCategoryGroup(productGroups, category) {\n    return productGroups.find(group => category.id === group.categoryId)\n}\n\n/**\n * returns true when the category is child of the range category (is type range)\n * @param {category} category\n */\nexport function isSubsegment(categories, category) {\n    /*category.superCategories.some(superCategoryId => {\n        const superCategoryData = categories.find(categoryToFind => categoryToFind.id === superCategoryId)\n    })*/\n    const result = category.superCategories.some(superCategory =>\n        getCategoryRegEx(RANGE_CATEGORY_NAME).test(superCategory)\n    )\n    return result\n}\nexport function getFinalPrice(show_sleeve_price, product, isBundled) {\n    let showCapsulePrice = show_sleeve_price\n    let final_price\n    let price_per_capsule\n\n    const bundled = isBundled(product)\n\n    if (product.type === 'capsule' && !bundled) {\n        final_price = product.price * product.salesMultiple\n        // this isn't necessary in prod but the mock price formatter needs it\n        final_price = Math.round(final_price * 100) / 100\n        price_per_capsule = product.price\n    } else {\n        showCapsulePrice = false\n        final_price = product.price\n    }\n\n    return { showCapsulePrice, final_price, price_per_capsule }\n}\n","import { INTENSITY_MAX_OL, INTENSITY_MAX_VL } from '@kissui/components'\n\nexport const getMaxIntensity = ({ technologies }) =>\n    technologies.indexOf('original') !== -1 ? INTENSITY_MAX_OL : INTENSITY_MAX_VL\n","import {\n    ECAPI_TYPE_ACCESSORY,\n    ECAPI_TYPE_CAPSULE,\n    ECAPI_TYPE_GIFT_CARD,\n    ECAPI_TYPE_MACHINE\n} from '@kissui/helpers/src/catalog'\n\nexport const getSkuComponentByType = ({ type, is_machine_b2b }) => {\n    let result = 'nb-sku'\n\n    if (type === ECAPI_TYPE_CAPSULE) {\n        result = 'nb-sku-coffee'\n    } else if (type === ECAPI_TYPE_MACHINE && is_machine_b2b) {\n        result = 'nb-sku-machine-b2b'\n    } else if (type === ECAPI_TYPE_MACHINE) {\n        result = 'nb-sku-machine'\n    } else if (type === ECAPI_TYPE_ACCESSORY) {\n        result = 'nb-sku-accessory'\n    } else if (type === ECAPI_TYPE_GIFT_CARD) {\n        result = 'nb-sku-gift-card'\n    }\n\n    return result\n}\n\nexport const apiOverride = (productData, pageBuilderData) => {\n    if (!productData || !pageBuilderData) {\n        return {}\n    }\n\n    const { images, name, headline, description } = productData\n    const { api_override } = pageBuilderData\n\n    if (!api_override) {\n        return {}\n    }\n\n    return {\n        image: api_override.image || images?.icon || images?.url || images?.push || images?.main,\n        name: api_override.name || name,\n        headline: api_override.headline || headline,\n        description: api_override.description || description\n    }\n}\n","import { sanitizeString } from '@kissui/helpers/src/utils'\nimport { getMergedProductCoffeeData } from './product.coffee.dto'\nimport { getMergedProductMachineData } from './product.machine.dto'\nimport { VARIATION_PLP } from '@kissui/components/src/sku/constants'\nimport { getMergedProductGiftCardData } from './product.giftCard.dto'\nimport { getMergedProductAccessoryData } from './product.accessory.dto'\nimport { apiOverride } from '@kissui/components/src/sku/services'\nimport {\n    ECAPI_TYPE_ACCESSORY,\n    ECAPI_TYPE_CAPSULE,\n    ECAPI_TYPE_GIFT_CARD,\n    ECAPI_TYPE_MACHINE\n} from '@kissui/helpers/src/catalog'\n\nexport const getMergedProductData = (\n    product,\n    pageBuilderProductProps,\n    pageBuilderProps,\n    priceFormatter,\n    currency\n) => {\n    const { options } = pageBuilderProps\n    const {\n        variant = {},\n        labels = [],\n        strikethrough_price,\n        additional_message,\n        additional_message_icon,\n        additional_message_link,\n        contact_cta\n    } = pageBuilderProductProps || {}\n\n    // lists header props not coming from this.props\n    let data = {\n        sku: product.internationalId,\n        technologies: product.technologies,\n        longSku: product.id,\n        name: product.name,\n        headline: sanitizeString(product.headline),\n        sales_multiple: product.salesMultiple,\n        unit_quantity: product.unitQuantity,\n        type: product.type,\n        category_name: product.rangeData?.name || '',\n        label_range: product.rangeData?.name || '',\n        price: product.price ? priceFormatter.short(currency, product.price) : null,\n        rawPrice: product.price,\n        strikethrough_price: strikethrough_price || '',\n        variation: VARIATION_PLP,\n        image_alt_text: product.name,\n        image: product.images?.icon || product.images?.push || product.images?.main,\n        additional_message: additional_message || '',\n        additional_message_icon: additional_message_icon || '',\n        additional_message_link: additional_message_link || {},\n        contact_cta: contact_cta || {},\n        ...apiOverride(product, pageBuilderProductProps)\n    }\n\n    if (labels && labels.length) {\n        data.labels = labels\n    }\n\n    if (product.highlighted) {\n        data.highlighted = product.highlighted\n    }\n\n    let dataTransformObjectProductType = {}\n    if (product.type === ECAPI_TYPE_CAPSULE) {\n        dataTransformObjectProductType = getMergedProductCoffeeData(\n            product,\n            pageBuilderProductProps,\n            pageBuilderProps,\n            priceFormatter,\n            currency\n        )\n    } else if (product.type === ECAPI_TYPE_MACHINE) {\n        dataTransformObjectProductType = getMergedProductMachineData(\n            product,\n            pageBuilderProductProps,\n            pageBuilderProps\n        )\n    } else if (product.type === ECAPI_TYPE_ACCESSORY) {\n        dataTransformObjectProductType = getMergedProductAccessoryData(\n            product,\n            pageBuilderProductProps,\n            pageBuilderProps\n        )\n    } else if (product.type === ECAPI_TYPE_GIFT_CARD) {\n        dataTransformObjectProductType = getMergedProductGiftCardData(\n            product,\n            pageBuilderProductProps,\n            pageBuilderProps\n        )\n    }\n\n    return {\n        ...product,\n        ...options,\n        ...variant,\n        ...data,\n        ...dataTransformObjectProductType\n    }\n}\n","import { getFinalPrice } from '@kissui/plp/services'\nimport { isBundled } from '@kissui/helpers/src/catalog'\nimport { getMaxIntensity } from '@kissui/components/src/sku-coffee/services'\n\nexport const getMergedProductCoffeeData = (\n    product,\n    pageBuilderProductProps,\n    pageBuilderProps,\n    priceFormatter,\n    currency\n) => {\n    const { bundle_details } = pageBuilderProductProps\n    const { options } = pageBuilderProps\n    const { show_sleeve_price } = options\n\n    const isBundledResult = isBundled(product)\n\n    const { showCapsulePrice, price_per_capsule, final_price } = getFinalPrice(\n        show_sleeve_price,\n        product,\n        isBundled\n    )\n\n    const option = {\n        bundled: isBundledResult,\n        intensity: product.capsuleProperties?.intensity || product.intensity || null,\n        max_intensity: getMaxIntensity(product),\n        price_per_capsule: price_per_capsule\n            ? priceFormatter.short(currency, price_per_capsule)\n            : null,\n        show_capsule_price: showCapsulePrice\n    }\n\n    if (show_sleeve_price) {\n        option.price = priceFormatter.short(currency, final_price)\n    }\n\n    if (bundle_details) {\n        option.bundle_details = bundle_details\n    }\n\n    return option\n}\n","export const getMergedProductMachineData = (product, pageBuilderProductProps, pageBuilderProps) => {\n    const { strikethrough_price, variant = {} } = pageBuilderProductProps\n    const { ratingsAndReviews } = product\n\n    // lists header props not coming from this.props\n    const options = {\n        ratings: ratingsAndReviews\n    }\n\n    if (variant?.colors) {\n        options.colors = variant.colors\n        options.activeSku = product.internationalId\n        options.max_colors = 99\n    }\n\n    options.strikethrough_price = strikethrough_price || ''\n    options.show_ratings = (pageBuilderProps && pageBuilderProps.options.show_ratings) || false\n    options.minimum_rating = (pageBuilderProps && pageBuilderProps.options.minimum_rating) || 0\n\n    return options\n}\n","export const getMergedProductAccessoryData = () => ({})\n","export const getMergedProductGiftCardData = (_, pageBuilderProductProps) => {\n    const { variant = {} } = pageBuilderProductProps\n\n    return {\n        image: variant && variant.default_image\n    }\n}\n","export const VARIATION_CROSS_SELL = 'cross-sell'\nexport const VARIATION_PLP = 'plp'\n\nexport interface CapsuleFeaturesInputType {\n    acidity?: number | null\n    bitterness?: number | null\n    body?: number | null\n    intensity?: number | null\n    roastLevel?: number | null\n}\n\nexport interface CapsuleFeatureType {\n    value: number | null\n}\n\nexport interface CapsuleFeaturesOutputType {\n    acidity: CapsuleFeatureType\n    bitterness: CapsuleFeatureType\n    body: CapsuleFeatureType\n    intensity: CapsuleFeatureType\n    roast: CapsuleFeatureType\n}\n\nexport type QuickViewProductType = {\n    modelType: string\n    id: string\n    legacyId: string\n    internationalId: string\n    name: string\n    urlFriendlyName: string\n    internationalName: string\n    headline: string\n    rootCategory: string\n    category: string\n    supercategories: string[]\n    mobileImages: {\n        modelType: string\n        icon: string\n        main: string\n    }\n    responsiveImages: {\n        standard: string\n    }\n    pdpURLs: {\n        opr: string\n        desktop: string\n        mobile: string\n    }\n    unitQuantity: number\n    salesMultiple: number\n    maxOrderQuantity: number\n    technologies: string[]\n    comingSoon: boolean\n    unit_quantity: number\n    productSelections: string[]\n    type: string\n    priceDisplay: string\n    isOrderable: boolean\n    bundled: boolean\n    capsuleProperties: {\n        intensity: number\n        bitterness: number\n        acidity: number\n        roastLevel: number\n    }\n    capsuleProductAromatics: string[]\n    aromaticProfileDescription: string\n    roastingDescription: string\n    capsuleCupSizes: string[]\n    capsuleCupSizesDetails: {\n        id: string\n        name: string\n        capacityLabel: string\n    }[]\n    capsuleAromatics: {\n        id: string\n        name: string\n    }[]\n    decaffeinated: boolean\n}\n\n//Confirmed this props are not available in Product Type\nexport type ProductNewPropsType = {\n    currency: string\n    pdpURLs: {\n        desktop: string\n        mobile: string\n    }\n    responsiveImages: {\n        standard: string\n    }\n    supercategories: string[]\n    productSelections: string[]\n    capsuleProperties?: CapsuleFeaturesInputType\n    capsuleProductAromatics: string[]\n    unitPrice: number\n    cupSizesDetails?: {\n        icon: string\n        label: string\n        size: string\n        capacityLabel: string | null\n        category: {\n            id: string\n            name: string\n            description: string | null\n            icon: {\n                url: string\n                altText: string\n            }\n            detailsIcon: {\n                url: string\n                altText: string\n            }\n            url: string | null\n            capacityLabel: string | null\n            rangeLink: string | null\n            subCategories: []\n            superCategories: string[]\n        }\n    }[]\n    category_name: string\n    url: string\n}\n\n// This is the Product Type signature Combined\nexport type ProductPropsType = QuickViewProductType & ProductNewPropsType\n\nexport type AddToCartPropsType = {\n    sku?: string\n    longSku?: string\n    category_name?: string\n    price?: string\n    strikethrough_price?: number\n    hidePrice?: boolean\n    type?: string\n    price_per_capsule?: number | string\n    show_capsule_price?: boolean\n    label_capsules?: string\n    capsule_price_label?: string\n    capsule_price_syntax?: string\n    show_sleeve_price?: boolean\n    show_sleeve?: boolean\n    sleeve_syntax?: string\n    number_of_sleeves?: number\n    label_sleeves?: string\n    label_sleeve?: string\n    technologies: string[]\n    sales_multiple?: number\n    unitQuantity?: number\n    unit_quantity?: number\n    bundled?: boolean\n    url?: string\n}\n\nexport type PageBuilderProductPropsType = {\n    sku: string\n    highlighted: boolean\n    labels: {\n        bgColor: string\n        color: string\n        name: string\n    }[]\n    strikethrough_price: string\n    variant: {\n        is_capsule: boolean\n        number_of_sleeves: number\n        number_of_capsules: string\n        bundle_details: {\n            popin_link_text: string\n            popin_label_close: string\n            description: string\n            other_skus: string\n            other_skus_quantity: string\n        }\n        logos: {\n            fair_trade: boolean\n            alt_fair_trade: string\n            is_organic: boolean\n            alt_organic: string\n            only_vertuo_next: boolean\n            alt_vertuo_next: string\n            is_rainforest: boolean\n            alt_rainforest: string\n            is_sustainable: boolean\n            alt_sustainable: string\n            is_q_certified_arabica: boolean\n            alt_q_certification_arabica: string\n        }\n        sku_timer: {\n            launch_date: string\n            remaining_days: string\n            remaining_day: string\n            label: string\n            a11y_label: string\n        }\n        ingredients: {\n            heading: string\n            description: string\n        }\n    }\n}\n\nexport type PageBuilderPropsType = {\n    quick_view_plp?: {\n        popin?: {\n            close?: string\n        }\n        cup_sizes?: {\n            heading: string\n            unit_is_oz: boolean\n            items: string[]\n        }\n        aromatic_profile?: {\n            heading: string\n            items: string[]\n        }\n        link?: {\n            label: string\n            url: string\n        }\n        levels?: {\n            a11y_level_of: string\n            acidity_label: string\n            bitterness_label: string\n            roastiness_label: string\n            body_label: string\n        }\n    }\n    campaign?: {\n        id?: string\n        name?: string\n        creative?: string\n        position?: string\n    }\n    tracking_position: string\n    tracking_list: string\n    capsuleProperties?: CapsuleFeaturesInputType\n    price_per_capsule?: number | string\n    show_capsule_price?: boolean\n    label_capsules?: string\n    capsule_price_label?: string\n    capsule_price_syntax?: string\n    show_sleeve_price?: boolean\n    show_sleeve?: boolean\n    sleeve_syntax?: string\n    number_of_sleeves?: number\n    label_sleeves?: string\n    label_sleeve?: string\n    technologies: string[]\n    sales_multiple?: number\n    unit_quantity?: number\n    bundled?: boolean\n    pdpURLs: {\n        desktop: string\n        mobile: string\n    }\n    intensity_label: string\n    products: {\n        sku: string\n        longSku: string\n        price: number\n        strikethrough_price: number\n        hidePrice: boolean\n        url: string\n    }[]\n    priceFormatter: {\n        formatPrice: (price: number) => string\n    }\n    currency: string\n    options: {\n        intensity_label: string\n        show_sleeve: boolean\n        label_sleeve: string\n        label_sleeves: string\n        label_capsules: string\n        sleeve_syntax: string\n        show_sleeve_price: boolean\n        capsule_price_label: string\n        capsule_price_syntax: string\n        a11y_intensity_max: string\n        label_decaffeinato: string\n        is_headline_hidden: boolean\n        sizes_title: string\n        notes_title: string\n        enabledExperiments: string[]\n    }\n    copywriting: {\n        sku_quick_view: {\n            more_info: string\n            a11y_more_info: string\n            popin: {\n                close: string\n            }\n            cup_sizes: {\n                heading: string\n                unit_is_oz: boolean\n                items: string[]\n            }\n            aromatic_profile: {\n                heading: string\n                items: string[]\n            }\n            link: {\n                label: string\n            }\n        }\n        aromatic_profile: {\n            heading: string\n            items: string[]\n        }\n    }\n}\n\nexport type SkuType = {\n    tracking_list: string\n    tracking_position: string\n    id: string\n    sku: string\n    longSku: string\n    name: string\n    name_custom: string\n    available: boolean\n    description: string | null\n    hidePrice: boolean\n    image_alt_text: string\n    inStock: boolean\n    internationalId: string\n    internationalName: string\n    legacyId: string\n    maxOrderQuantity: number | null\n    packagingType: string | null\n    price: string\n    pushRatingEnabled: boolean\n    ranges: string[]\n    salesMultiple: number\n    technologies: string[]\n    type: string\n    unitQuantity: number\n    url: string\n    labels: []\n    category_name: string\n    category: {\n        id: string\n        name: string\n        description: string | null\n        icon: {\n            url: string\n            altText: string | null\n        }\n        detailsIcon: string | null\n        url: string | null\n        capacityLabel: string | null\n        rangeLink: string | null\n        subCategories: []\n        superCategories: string[]\n    }\n    highlighted: boolean\n    strikethrough_price: string\n    view_details_label: string\n    headline: string\n    cupSizes: string[]\n    cupSizesDetails: {\n        icon: string\n        label: string\n        size: string\n        capacityLabel: string | null\n        category: {\n            id: string\n            name: string\n            description: string | null\n            icon: {\n                url: string\n                altText: string | null\n            }\n            detailsIcon: string | null\n            url: string | null\n            capacityLabel: string | null\n            rangeLink: string | null\n            subCategories: []\n            superCategories: string[]\n        }\n    }[]\n    flavors: string[]\n    in_stock: boolean\n    sales_multiple: number\n    bundled: boolean\n    logos: []\n    is_headline_hidden: boolean\n    a11y_price: string\n    a11y_product_card: string\n    label_sleeve: string\n    label_sleeves: string\n    label_capsules: string\n    intensity: number\n    a11y_intensity_max: string\n    label_decaffeinato: string\n    show_sleeve_price: boolean\n    show_sleeve: boolean\n    price_per_capsule: number | string\n    final_price: string | null\n    capsule_price_label: string\n    capsule_price_syntax: string\n    sleeve_syntax: string\n    perSleeveLabel: string\n    number_of_sleeves: number\n    number_of_capsules: string\n    show_capsule_price: boolean\n    sort_price: number\n    bundle_details: any\n    quick_view_plp: {\n        show_view: boolean\n        quick_view_text: string\n        popin: {\n            close: string\n        }\n        cup_sizes: {\n            heading: string\n            unit_is_oz: boolean\n            items: string[]\n        }\n        aromatic_profile: {\n            heading: string\n            items: string[]\n        }\n        link: {\n            label: string\n        }\n        levels: {\n            a11y_level_of: string\n            acidity_label: string\n            bitterness_label: string\n            roastiness_label: string\n            body_label: string\n        }\n    }\n    hasPricePerSleeve: boolean\n    sleevePrice: string\n    rendererName: string\n    position: number\n    rawPrice: number\n    variation: string\n    intensity_label: string\n    campaign: {\n        id: string\n        name: string\n        creative: string\n        position: string\n    }\n    capsuleProductAromatics: string[]\n    copywriting: {\n        heading: string\n        sku_quick_view: {\n            more_info: string\n            a11y_more_info: string\n            popin: {\n                close: string\n            }\n            cup_sizes: {\n                heading: string\n                unit_is_oz: false\n                items: string[]\n            }\n            aromatic_profile: {\n                heading: string\n                items: string[]\n            }\n            link: {\n                label: string\n            }\n        }\n        aromatic_profile: {\n            heading: string\n            items: string[]\n        }\n    }\n    options: {\n        intensity_label: string\n        show_sleeve: boolean\n        label_sleeve: string\n        label_sleeves: string\n        label_capsules: string\n        sleeve_syntax: string\n        show_sleeve_price: boolean\n        capsule_price_label: string\n        capsule_price_syntax: string\n        a11y_intensity_max: string\n        label_decaffeinato: string\n        is_headline_hidden: boolean\n        sizes_title: string\n        notes_title: string\n        enabledExperiments: string[]\n    }\n    products: {\n        sku: string\n        longSku: string\n        price: number\n        strikethrough_price: number\n        hidePrice: boolean\n        url: string\n    }[]\n    priceFormatter: {\n        formatPrice: (price: number) => string\n    }\n    currency: string\n}\n\nexport type MergedProductType = {\n    intensity_label: string\n    capsuleProductAromatics?: string[]\n    pdpURLs?: {\n        desktop: string\n        mobile: string\n    }\n}\n\nexport type AddToCardPropertiesType = SkuType & MergedProductType\n\ntype CupSizeType = {\n    icon: string\n    label: string\n    size: string\n    capacityLabel: string | null\n    category: {\n        id: string\n        name: string\n        description: string | null\n        icon: {\n            url: string\n            altText: string\n        }\n        detailsIcon: {\n            url: string\n            altText: string\n        }\n        url: string | null\n        capacityLabel: string | null\n        rangeLink: string | null\n        subCategories: []\n        superCategories: string[]\n    }\n}[]\n\nexport type QuickViewPropsType = {\n    popin: {\n        popin_id: string\n        close?: string\n        footer: boolean\n    }\n    product: MergedProductType\n    intensity: {\n        intensity_label?: string\n        a11y_intensity_max: string\n    }\n    cup_sizes: {\n        heading: string\n        unit_is_oz: boolean\n        items?: [] | CupSizeType\n    }\n    aromatic_profile: {\n        heading: string\n        items: string[]\n    }\n    link: {\n        label: string\n        url?: string\n    }\n    levels: any\n    pricing: {\n        add_to_cart: AddToCartPropsType & {\n            position: string\n            variation: string\n            url: string\n            view_details_label: string\n            rendererName: string\n        }\n        showSleeve: any\n        showCapsulePrice: any\n    }\n    campaign: any\n}\n","import { getMergedProductData } from '@kissui/page-builder-sections/src/cross-sell-natural/dataTransform'\n\nimport {\n    CapsuleFeaturesInputType,\n    CapsuleFeaturesOutputType,\n    ProductPropsType,\n    AddToCartPropsType,\n    SkuType,\n    ProductNewPropsType,\n    MergedProductType,\n    AddToCardPropertiesType,\n    QuickViewPropsType,\n    VARIATION_PLP,\n    VARIATION_CROSS_SELL\n} from './shared-quick-view-types'\n\nexport const getCapsuleFeatures = ({\n    acidity = null,\n    bitterness = null,\n    body = null,\n    intensity = null,\n    roastLevel = null\n}: CapsuleFeaturesInputType = {}): CapsuleFeaturesOutputType => ({\n    acidity: { value: acidity },\n    bitterness: { value: bitterness },\n    body: { value: body },\n    intensity: { value: intensity },\n    roast: { value: roastLevel }\n})\n\nexport const getSkuQuickViewData = async (\n    product: ProductPropsType,\n    popinId: string,\n    skuData: SkuType,\n    componentType: string\n) => {\n    const { tracking_position, tracking_list } = skuData\n\n    const handlePLPVariation = () => {\n        if (!product) return\n        let quickViewElement = document.createElement('nb-sku-quick-view')\n        quickViewElement.setAttribute(\n            'data',\n            JSON.stringify(getSkuQuickViewProp(popinId, product, skuData, componentType))\n        )\n        quickViewElement.setAttribute('id', popinId)\n        quickViewElement.setAttribute('tracking_no_impression', 'true')\n        quickViewElement.setAttribute('tracking_position', tracking_position)\n        quickViewElement.setAttribute('tracking_list', tracking_list)\n        quickViewElement.setAttribute('campaign_position', skuData.campaign.position)\n        quickViewElement.setAttribute('listname_text', skuData.copywriting.heading)\n        document.body.appendChild(quickViewElement)\n    }\n\n    const handleCrossSellVariation = () => {\n        const { sku_quick_view } = skuData.copywriting\n        if (!sku_quick_view.more_info) return ''\n        const quickViewElement = document.querySelector('nb-sku-quick-view')\n        if (quickViewElement) quickViewElement.remove()\n\n        let newQuickViewElement = document.createElement('nb-sku-quick-view')\n        newQuickViewElement.setAttribute(\n            'data',\n            JSON.stringify(getSkuQuickViewProp(popinId, product, skuData, componentType))\n        )\n        newQuickViewElement.setAttribute('tracking_no_impression', 'true')\n        newQuickViewElement.setAttribute('tracking_position', tracking_position)\n        newQuickViewElement.setAttribute('tracking_list', tracking_list)\n        newQuickViewElement.setAttribute('campaign_position', skuData.campaign.position)\n        newQuickViewElement.setAttribute('listname_text', skuData.copywriting.heading)\n        document.body.appendChild(newQuickViewElement)\n    }\n\n    const variationHandlers: { [key: string]: () => void | string } = {\n        [VARIATION_PLP]: handlePLPVariation,\n        [VARIATION_CROSS_SELL]: handleCrossSellVariation\n    }\n\n    const handleVariation = variationHandlers[componentType]\n    if (handleVariation) {\n        handleVariation()\n    }\n}\n\nexport const getSkuQuickViewProp = (\n    popinId: string,\n    product: ProductPropsType,\n    skuData: SkuType,\n    componentType: string\n) => {\n    let mergedProductData = getMergedProductDataForComponentType(product, skuData, componentType)\n    let addToCartProps = getAddToCartProperties(componentType, skuData, mergedProductData)\n\n    return isVariationOnPLP(componentType)\n        ? getPlpQuickViewProps(popinId, skuData, mergedProductData, addToCartProps)\n        : getCrossSellQuickViewProps(popinId, product, skuData, mergedProductData, addToCartProps)\n}\n\nconst getMergedProductDataForComponentType = (\n    product: ProductPropsType,\n    skuData: SkuType,\n    componentType: string\n) => {\n    switch (componentType) {\n        case VARIATION_PLP:\n            return {\n                ...skuData,\n                ...product,\n                ...getCapsuleFeatures(product?.capsuleProperties)\n            }\n        case VARIATION_CROSS_SELL: {\n            const matchedProduct =\n                skuData.products?.find(\n                    productPageBuilder => productPageBuilder.sku === product?.legacyId\n                ) || {}\n            return getMergedProductData(\n                product,\n                matchedProduct,\n                skuData,\n                skuData?.priceFormatter,\n                skuData?.currency\n            )\n        }\n        default:\n            return {}\n    }\n}\n\nexport const getAddToCartProperties = (\n    componentType: string,\n    skuData: SkuType,\n    mergedProductData: MergedProductType\n): AddToCartPropsType => {\n    const data: AddToCardPropertiesType = isVariationOnPLP(componentType)\n        ? skuData\n        : (mergedProductData as AddToCardPropertiesType)\n    return getAddToCartProps(data, componentType)\n}\n\nexport const getAddToCartProps = (\n    data: AddToCardPropertiesType,\n    componentType: string\n): AddToCartPropsType => {\n    const commonProps: AddToCartPropsType = {\n        sku: data.sku,\n        longSku: data.longSku,\n        category_name: data.category_name,\n        price: data.price ?? 0,\n        strikethrough_price: Number(data.strikethrough_price),\n        hidePrice: data.hidePrice,\n        technologies: data.technologies || [],\n        url: data.url || ''\n    }\n\n    if (isVariationOnPLP(componentType)) {\n        return {\n            ...commonProps,\n            type: data.type,\n            price_per_capsule: data.price_per_capsule,\n            show_capsule_price: data.show_capsule_price,\n            label_capsules: data.label_capsules,\n            capsule_price_label: data.capsule_price_label,\n            capsule_price_syntax: data.capsule_price_syntax,\n            show_sleeve_price: data.show_sleeve_price,\n            show_sleeve: data.show_sleeve,\n            sleeve_syntax: data.sleeve_syntax,\n            number_of_sleeves: data.number_of_sleeves,\n            label_sleeves: data.label_sleeves,\n            label_sleeve: data.label_sleeve,\n            technologies: data.technologies || [],\n            sales_multiple: data.sales_multiple,\n            unit_quantity: data.unitQuantity,\n            bundled: data.bundled,\n            url: data.url || ''\n        }\n    }\n\n    return commonProps\n}\n\nexport const getPlpQuickViewProps = (\n    popinId: string,\n    skuData: SkuType,\n    mergedProductData: MergedProductType,\n    addToCartProps: AddToCartPropsType\n): QuickViewPropsType => {\n    return {\n        popin: {\n            popin_id: popinId,\n            close: skuData?.quick_view_plp?.popin?.close,\n            footer: true\n        },\n        product: {\n            ...mergedProductData\n        },\n        intensity: {\n            intensity_label: mergedProductData?.intensity_label,\n            a11y_intensity_max: 'max of {max_intensity}'\n        },\n        cup_sizes: {\n            ...skuData?.quick_view_plp?.cup_sizes,\n            items: skuData?.cupSizesDetails\n        },\n        aromatic_profile: {\n            ...skuData?.quick_view_plp?.aromatic_profile,\n            items: skuData?.capsuleProductAromatics || mergedProductData?.capsuleProductAromatics\n        },\n        link: {\n            ...skuData?.quick_view_plp?.link,\n            url: skuData?.url\n        },\n        levels: {\n            ...skuData?.quick_view_plp?.levels\n        },\n        pricing: {\n            add_to_cart: {\n                ...addToCartProps,\n                position: '',\n                variation: 'small',\n                url: '',\n                view_details_label: 'View details',\n                rendererName: ''\n            },\n            showSleeve: {},\n            showCapsulePrice: {}\n        },\n        campaign: skuData.campaign\n    }\n}\n\nexport const getCrossSellQuickViewProps = (\n    popinId: string,\n    product: ProductNewPropsType,\n    skuData: SkuType,\n    mergedProductData: MergedProductType,\n    addToCartProps: AddToCartPropsType\n): QuickViewPropsType => {\n    const props: QuickViewPropsType = {\n        popin: {\n            popin_id: popinId,\n            close: skuData?.copywriting?.sku_quick_view?.popin?.close,\n            footer: true\n        },\n        product: {\n            ...mergedProductData\n        },\n        intensity: {\n            intensity_label: skuData?.options?.intensity_label,\n            a11y_intensity_max: 'max of {max_intensity}'\n        },\n        cup_sizes: {\n            ...skuData?.copywriting?.sku_quick_view?.cup_sizes,\n            items: product?.cupSizesDetails\n        },\n        aromatic_profile: {\n            ...skuData?.copywriting?.sku_quick_view?.aromatic_profile,\n            items: product?.capsuleProductAromatics || mergedProductData?.capsuleProductAromatics\n        },\n        link: {\n            ...skuData?.copywriting?.sku_quick_view?.link,\n            url: mergedProductData?.pdpURLs?.desktop\n        },\n        levels: {\n            ...skuData?.quick_view_plp?.levels\n        },\n        pricing: {\n            add_to_cart: {\n                ...addToCartProps,\n                position: '',\n                variation: 'small',\n                url: '',\n                view_details_label: 'View details',\n                rendererName: ''\n            },\n            showSleeve: {},\n            showCapsulePrice: {}\n        },\n        campaign: {}\n    }\n    return props\n}\nconst isVariationOnPLP = (componentType: string) => componentType === VARIATION_PLP\n","export const dispatchEvent = ({ eventName, args, element }) => {\n    // Use the provided element or fallback to window if available\n    if (!element) {\n        if (typeof window !== 'undefined') {\n            element = window\n        } else {\n            throw new Error(\n                '`element` is not provided and `window` is unavailable. Provide a valid element to dispatch the event.'\n            )\n        }\n    }\n\n    let event\n    if (args) {\n        event = new CustomEvent(eventName, { detail: args, bubbles: true })\n    } else {\n        if (typeof Event === 'function') {\n            event = new Event(eventName)\n        } else {\n            event = document.createEvent('Event')\n            event.initEvent(eventName, true, true)\n        }\n    }\n    element.dispatchEvent(event)\n}\n\nexport const readEvent = e => {\n    if (!e.detail) {\n        return\n    }\n    return e.detail\n}\n","export type EventListener = {\n    element: HTMLElement\n    type: string\n    listener: (e: Event) => void\n    options?: boolean | AddEventListenerOptions\n}\n\nconst add = (eventListeners: EventListener[] = []) => {\n    eventListeners.forEach(eventListener => {\n        if (!eventListener || !eventListener.element) {\n            return\n        }\n        return eventListener.element.addEventListener(\n            eventListener.type,\n            eventListener.listener,\n            eventListener.options\n        )\n    })\n}\n\nconst remove = (eventListeners: EventListener[] = []) => {\n    eventListeners.forEach(eventListener => {\n        if (!eventListener || !eventListener.element) {\n            return\n        }\n        eventListener.element.removeEventListener(eventListener.type, eventListener.listener)\n    })\n}\n\nconst busNamespace = 'pageBuilder'\n\nexport const emitCustomEvent = (eventName: string, data: unknown) => {\n    const customEvent = new CustomEvent(`${busNamespace}.${eventName}`, {\n        detail: data,\n        bubbles: true,\n        cancelable: true,\n        composed: false\n    })\n\n    window.dispatchEvent(customEvent)\n}\n\nexport default { add, emitCustomEvent, remove }\n","import { getProduct } from '@kissui/helpers/src/catalog'\nimport { emitCustomEvent } from './events.helpers'\nimport { removeEmptyValues } from '@kissui/helpers/src/utils'\n\nconst raisedByPB = 'page builder'\nconst raisedByWC = 'Web component'\n\n/**\n * helper method for 'itemDisplay' GTM event\n * @param {*} event : 'itemDisplay' - Mandatory as is\n * @param {*} eventRaisedBy : 'Web component' - Mandatory as is\n * @param {*} eventAction : 'Click' - Action that led to the item display. For example, click\n * @param {*} itemTypes : ['products'] - Mandatory as is\n * @param {*} rootElement : ['nb-slider'] - Root DOM element for item detection. Closest common ancestor element of the inserted/displayed promotions and products. It will help the detection to reduce its performance consumption. Set to 0 (zero) in order to request detection through the entire document.\n */\nexport const itemDisplay = args => {\n    window.gtmDataObject = window.gtmDataObject || []\n    const eventData = {\n        event: 'itemDisplay',\n        eventRaisedBy: raisedByWC,\n        eventAction: 'Click',\n        itemTypes: ['products'],\n        ...args\n    }\n    window.gtmDataObject.push(eventData)\n    emitCustomEvent('itemDisplay', eventData)\n}\n\n/**\n *\n * helper method for 'customEvent' GTM event\n * @param {*} args (event, eventRaisedBy, eventCategory, eventAction, eventLabel, nonInteraction)\n */\n\nexport const customEvent = args => {\n    window.gtmDataObject = window.gtmDataObject || []\n    var eventData\n    if (args.event_GA4 === undefined || args.event_GA4 === false) {\n        eventData = {\n            event: 'customEvent',\n            eventRaisedBy: raisedByWC,\n            eventCategory: 'User Engagement',\n            eventAction: 'Click',\n            eventLabel: '',\n            nonInteraction: 0,\n            ...args\n        }\n    } else {\n        eventData = {\n            event_raised_by: raisedByPB,\n            ...args\n        }\n    }\n    window.gtmDataObject.push(eventData)\n    emitCustomEvent('customEvent', eventData)\n}\n\n/**\n * Helper method for tracking component interactions, compatible with GA4.\n *\n * @param {String} creative : component raising the event, e.g. 'before_coffees_list', 'before_machines_list', 'before_accessories_list'\n * @param {String} actionType : description of the interaction, e.g 'pdp quick view'\n * @param {String} internationalId : long SKU, e.g. 'erp.pt.b2c/prod/7243.30'\n * @param {String} internationalName : international name of the product, e.g. 'Vertuo Carafe Pour-Over Style Mild'\n * @param {String} productType : type of product, i.e. 'capsule', 'machine', 'accessory'\n * @param {String} range : product range, e.g. 'ispirazione italiana'\n * @param {String} technology : technology, i.e. 'original', 'vertuo'\n * @param {Number} price : price, e.g. .51\n * @param {String} eventAction : description of the action, e.g. 'PDP Quick View'\n *\n * Initally created for PDP Quick View tracking:\n * https://dsu-confluence.nestle.biz/display/DIANA/BEFORE+-+PDP+Quick+View\n * Will probably be rolled out across all components, update this comment accordingly.\n */\nexport const trackComponentInteraction = ({\n    creative = '',\n    actionType = '',\n    internationalId = '',\n    internationalName = '',\n    productType = '',\n    technology = '',\n    category = '',\n    rawPrice = '',\n    eventAction = ''\n}) => {\n    window.gtmDataObject = window.gtmDataObject || []\n    const eventData = {\n        event: 'page_builder_component_interaction',\n        event_raised_by: raisedByPB,\n        component_name: creative,\n        action_type: actionType,\n        item_id_event: internationalId,\n        item_name_event: internationalName,\n        item_category_event: productType,\n        item_technology_event: technology,\n        item_range_event: category,\n        item_price_event: rawPrice,\n        eventCategory: 'User Engagement',\n        eventAction: eventAction,\n        eventLabel: `${productType} - ${technology} - ${internationalName}`\n    }\n    window.gtmDataObject.push(eventData)\n    emitCustomEvent('page_builder_component_interaction', eventData)\n}\n\n/**\n *\n * Push 'view_promotion' event for GA 4\n * @param {*} args (event, event_raised_by, ecommerce: {promotion_id, promotion_name, creative_slot, creative_name})\n */\nexport const viewPromotion = args => {\n    const event = 'view_promotion'\n    const eventData = {\n        event,\n        event_raised_by: raisedByPB,\n        ecommerce: {}\n    }\n    if (Object.keys(args).length) {\n        const { id = '', creative = '', name = '', position = '' } = args\n        let ecommerceData = {\n            promotion_id: id,\n            promotion_name: name,\n            creative_slot: position,\n            creative_name: creative\n        }\n        ecommerceData = removeEmptyValues(ecommerceData)\n        eventData.ecommerce = ecommerceData\n    }\n    window.gtmDataObject ??= []\n    window.gtmDataObject.push(eventData)\n    emitCustomEvent(event, eventData)\n}\n\nexport const handlePromoClick = args => {\n    const { campaign, cta_name } = args\n\n    const cleanedData = removeEmptyValues(campaign)\n    selectPromotion({ cta_name, ...cleanedData })\n}\n\n/**\n *\n * Push 'select_promotion' event for GA 4\n * @param {*} args (event, event_raised_by, cta_name, ecommerce: {promotion_id, promotion_name, creative_slot, creative_name})\n */\nexport const selectPromotion = args => {\n    const event = 'select_promotion'\n    const eventData = {\n        event: 'select_promotion',\n        cta_name: args?.cta_name ?? '(not set)',\n        event_raised_by: raisedByPB,\n        ecommerce: {}\n    }\n    if (Object.keys(args).length) {\n        const { id = '', creative = '', name = '', position = '' } = args\n        let ecommerceData = {\n            promotion_id: id,\n            promotion_name: name,\n            creative_slot: position,\n            creative_name: creative\n        }\n        ecommerceData = removeEmptyValues(ecommerceData)\n        eventData.ecommerce = ecommerceData\n    }\n\n    window.gtmDataObject ??= []\n    window.gtmDataObject.push(eventData)\n    emitCustomEvent(event, eventData)\n}\n\nexport const interactionClick = (nameComponent, ctaName) => {\n    window.gtmDataObject = window.gtmDataObject || []\n    const eventData = {\n        event: 'page_builder_component_interaction',\n        event_raised_by: raisedByPB,\n        eventCategory: 'User Engagement',\n        eventAction: 'Click CTA',\n        eventLabel: `Page Builder - ${nameComponent} - ${ctaName}`,\n        component_name: nameComponent,\n        action_type: 'web component click',\n        cta_name: ctaName\n    }\n    window.gtmDataObject.push(eventData)\n    emitCustomEvent('page_builder_component_interaction', eventData)\n}\n\nexport const getProductInfo = async (sku, data) => {\n    let product = data\n    if (!product) {\n        product = await getProduct(sku)\n    }\n    return product\n}\n\nexport const getProductPayload = (data, actionField = {}) => {\n    const {\n        internationalName,\n        internationalId,\n        category,\n        unitPrice,\n        legacyId,\n        name,\n        technologies,\n        bundled,\n        inStock,\n        type\n    } = data\n\n    const technology = technologies.map(item => item.split('/').pop()).join('|')\n    const isDiscovery = category.toLowerCase().includes('discovery')\n\n    return [\n        // Array consists of one product details for PDP Product Detail View\n        {\n            ...actionField,\n            name: internationalName, // '[[International Product Name]]' NIE, Contract\n            id: internationalId, // '[[International Product ID]]'\n            price: unitPrice, // '[[Product Price]'\n            // dimension43: '[[true/false]]', // '[[true/false]]' // Signifies if this product is part of a standing order or not\n            dimension44: isDiscovery.toString(), // '[[true/false]]', // Signifies if this product is part of a discovery offer\n            dimension53: legacyId, // '[[Product Local market ID]]', // Local market id for product\n            dimension54: name, // '[[Product Local market Name]]', // Local market name for product\n            dimension55: category, // '[[Product Range]]', // Range of the product, eg: Barista Creations for Ice (Nessoft Category)\n            dimension56: technology, // '[[Product Technology]]', //Product technology according to Nespresso categorization (original, vertuo, pro)\n            dimension57: bundled ? 'bundle' : 'single', // '[[Product Type]]', //If the product is single or bundle\n            dimension192: inStock ? 'in stock' : 'out of stock', // '[in stock]', // \"in stock\" or \"out of stock\"\n            category: type, // '[[Product Category]]', //Product category according to Nespresso categorization (Nessoft type): capsule, accessory, machine\n            brand: 'Nespresso' // Static value set to Nespresso\n        }\n    ]\n}\n\nexport const trackDetailView = async (sku, data) => {\n    // https://dsu-confluence.nestle.biz/display/DIANA/HQ+PB+Tracking+-+Product+Detail+View\n    if (window.pbTrackDetailViewPDP || !sku || !window.napi) {\n        return\n    }\n\n    const productInfo = await getProductInfo(sku, data)\n    const productPayload = getProductPayload(productInfo)\n    const currency = productInfo.currency\n\n    window.gtmDataObject = window.gtmDataObject || []\n    const eventData = {\n        event: 'detailView',\n        currencyCode: currency,\n        eventRaisedBy: raisedByPB,\n        ecommerce: {\n            detail: {\n                actionField: {},\n                products: productPayload\n            }\n        }\n    }\n    window.gtmDataObject.push(eventData)\n    // Track only once per page\n    window.pbTrackDetailViewPDP = true\n    emitCustomEvent('detailView', eventData)\n}\n\nexport const trackAddToCartImpression = (product, isStickyBar) => {\n    // https://dsu-confluence.nestle.biz/pages/viewpage.action?spaceKey=DIANA&title=PDP+-+Sticky+Add+To+Cart+Custom+Event\n\n    window.gtmDataObject = window.gtmDataObject || []\n    const eventData = {\n        event: 'page_builder_component_interaction',\n        event_raised_by: raisedByPB,\n        component_name: 'before_sku_main_info',\n        action_type: isStickyBar\n            ? 'sticky add to cart impression'\n            : 'standard add to cart impression',\n        //product info\n        item_id_event: product.internationalId,\n        item_name_event: product.internationalName,\n        item_category_event: product.type,\n        item_price_event: product.price_per_capsule?.split(' ')[0],\n        item_market_id_event: product.legacyId,\n        item_market_name_event: product.name,\n        item_range_event: product.category_name,\n        item_technology_event: product.technology?.[0]?.split('/').slice(-1) ?? '',\n        item_type_event: product.bundled ? 'bundle' : 'single'\n    }\n    window.gtmDataObject.push(eventData)\n    emitCustomEvent('page_builder_component_interaction', eventData)\n}\n\nexport const productImpression = async (position, list, sku, data) => {\n    // https://dsu-confluence.nestle.biz/pages/viewpage.action?pageId=225612781\n    // don't track already tracked products\n    window.gtmDataObject = window.gtmDataObject || []\n    const hasDetailView = window.gtmDataObject.find(item => item.event === 'detailView')\n    const alreadyTracked = !!hasDetailView?.ecommerce?.detail?.products.find(p =>\n        sku.includes(p.id)\n    )\n    if (alreadyTracked) {\n        return\n    }\n\n    const productInfo = await getProductInfo(sku, data)\n    const productPayload = getProductPayload(productInfo, { list: list, position: position })\n    const currency = productInfo.currency\n    const eventData = {\n        event: 'impression',\n        eventAction: 'Product Impression',\n        currencyCode: currency,\n        eventRaisedBy: raisedByPB,\n        ecommerce: {\n            impressions: productPayload\n        }\n    }\n    window.gtmDataObject.push(eventData)\n    emitCustomEvent('impression', eventData)\n}\n\nexport const productClick = async (position, list, sku, data) => {\n    // https://dsu-confluence.nestle.biz/pages/viewpage.action?pageId=225612781\n\n    if (typeof list !== 'string') return\n\n    const productInfo = await getProductInfo(sku, data)\n    const productPayload = getProductPayload(productInfo, { position: position })\n    const currency = productInfo.currency\n\n    window.gtmDataObject = window.gtmDataObject || []\n    const eventData = {\n        event: 'productClick',\n        eventAction: 'Product Click',\n        currencyCode: currency,\n        eventRaisedBy: raisedByPB,\n        ecommerce: {\n            click: {\n                actionField: {\n                    list: list\n                },\n                products: productPayload\n            }\n        }\n    }\n    window.gtmDataObject.push(eventData)\n    emitCustomEvent('productClick', eventData)\n}\n\nexport function filterTrackingFromPlpFilters(filtersSelected) {\n    const grouped = groupSelectedFilters(filtersSelected)\n    const groupKeys = Object.keys(grouped)\n    const typesFiltersSelected = groupKeys.join('|').substring(0, 99)\n    const valuesFiltersSelected = groupKeys\n        .map(key => grouped[key].values.map(value => value.split('/').at(-1)).join(','))\n        .join('|')\n        .substring(0, 99)\n\n    return [typesFiltersSelected, valuesFiltersSelected]\n}\n\nexport const filterActionEvent = (\n    actionType,\n    filterType,\n    filterValues,\n    clickLocation,\n    dataType\n) => {\n    // https://dsu-confluence.nestle.biz/display/DIANA/PLP+-+Filter+Revamp\n    window.gtmDataObject = window.gtmDataObject || []\n    const eventData = getExplicitFilterEventData(\n        actionType,\n        filterType,\n        filterValues,\n        clickLocation\n    )\n\n    window.gtmDataObject.push(eventData)\n    if (window.NEXT_V1_PLP_EXPLICIT_FILTER_TRACKING && dataType) {\n        window.gtmDataObject.push({\n            ...window.NEXT_V1_PLP_EXPLICIT_FILTER_TRACKING,\n            experiment_action: `${actionType} - ${dataType}`,\n            cta_name: 'All filters'\n        })\n    }\n\n    emitCustomEvent('plp_filter', eventData)\n}\n\nconst getExplicitFilterEventData = (actionType, filterType, filterValues, clickLocation) => {\n    return {\n        event: 'plp_filter',\n        event_raised_by: raisedByPB,\n        action_type: actionType,\n        filter_type: filterType,\n        ...(filterValues ? { filter_values: filterValues } : {}),\n        ...(clickLocation ? { click_location: clickLocation } : {})\n    }\n}\n\nfunction groupSelectedFilters(filtersSelected = []) {\n    return filtersSelected.reduce((grouped, { key, value }) => {\n        if (!grouped[key]) grouped[key] = { key, values: [] }\n        grouped[key].values.push(value.replaceAll(',', '-'))\n        return grouped\n    }, {})\n}\n\nfunction arrTolastURLElementMapper(arr) {\n    if (typeof arr === 'undefined' || arr.length === 0) return undefined\n\n    return arr.map(item => item.split('/').pop()?.trim() || '')\n}\n\nfunction arrToJoinedString(arr, joiner = '|') {\n    if (typeof arr === 'undefined' || arr.length === 0) return undefined\n\n    return arr.map(item => item.trim()).join(joiner)\n}\n\nfunction findTechnogiesText(arr) {\n    if (typeof arr === 'undefined' || arr.length === 0) return undefined\n\n    if (arr.length === 1) return cleanText(arrTolastURLElementMapper(arr)?.[0])\n    else return 'multiple'\n}\n\nfunction cleanText(str) {\n    if (typeof str === 'undefined') return undefined\n\n    return str.toString().trim()\n}\n\nconst generateEcommerceObject = async (productIds, options) => {\n    const productRequests = productIds.map(SKU => getProduct(SKU))\n    const productData = await Promise.all(productRequests)\n\n    return {\n        ecommerce: {\n            currency: window[window.config.padl.namespace].dataLayer.app.app.currency,\n            value: productData.reduce((ac, product) => {\n                return ac + product.price\n            }, 0),\n            items: productData.map((product, index) => {\n                if (product.type === 'bundle' || product.type === 'giftcard') {\n                    return {\n                        item_id: cleanText(product.internationalId),\n                        item_name: cleanText(product.internationalName),\n                        item_brand: 'nespresso',\n                        item_category: cleanText(product.type),\n                        index: index + 1\n                    }\n                }\n\n                let output = {\n                    item_id: cleanText(product.internationalId),\n                    item_name: cleanText(product.internationalName),\n                    item_brand: 'nespresso',\n                    item_category: cleanText(product.type),\n                    item_category2: arrToJoinedString(\n                        arrTolastURLElementMapper(product.technologies)\n                    ),\n                    item_category3: cleanText(product.category),\n                    price: product.price,\n                    quantity: product.salesMultiple,\n                    affiliation: 'nespresso online store',\n                    coupon: undefined,\n                    discount: undefined,\n                    location_id: undefined,\n                    item_list_name: cleanText(options?.listName),\n                    item_list_id: cleanText(options?.listId),\n                    index: index + 1,\n                    item_market_id: cleanText(product.legacyId),\n                    item_market_name: cleanText(product.name),\n                    item_technology: findTechnogiesText(product.technologies),\n                    item_range: cleanText(product.category),\n                    item_discovery_offer: product.category.includes('discovery').toString(),\n                    item_added_by_user: undefined,\n                    item_ecotax_applicable: product?.displayEcoTax\n                        ? cleanText(product?.displayEcoTax.toString())\n                        : undefined,\n                    item_selection_list: cleanText(arrToJoinedString(product.productSelections)),\n                    item_in_stock: product?.inStock\n                        ? cleanText(product?.inStock.toString())\n                        : undefined,\n                    item_subscription_name: undefined,\n                    item_subscription_category: undefined,\n                    item_subscription_price: undefined,\n                    item_subscription_duration: undefined,\n                    item_subscription_fee: undefined\n                }\n\n                switch (product.type) {\n                    case 'capsule': {\n                        const capsuleProduct = product\n\n                        output.item_category4 = capsuleProduct.bundled ? 'bundle' : 'single'\n\n                        output.item_type = capsuleProduct.bundled ? 'bundle' : 'single'\n\n                        output.item_coffee_aromatic_profile = cleanText(\n                            arrToJoinedString(capsuleProduct.capsuleProductAromatics)?.toLowerCase()\n                        )\n\n                        output.item_coffee_intensity =\n                            cleanText(capsuleProduct.capsuleProperties.intensity) ?? undefined\n\n                        output.item_coffee_cup_size = cleanText(\n                            arrToJoinedString(capsuleProduct.capsuleCupSizes)\n                        )?.toLowerCase()\n\n                        break\n                    }\n                    case 'machine': {\n                        const machineProduct = product\n\n                        output.item_machine_shade = cleanText(machineProduct.colorShade?.name)\n\n                        break\n                    }\n                }\n\n                if (product.type === 'machine' || product.type === 'accessory') {\n                    output.item_avg_rating = product.ratingCode\n                    output.item_number_of_reviews = product.ratingCode\n                }\n\n                return output\n            })\n        }\n    }\n}\n\nexport const selectItems = async (productIds, options) => {\n    const ecommerceObject = await generateEcommerceObject(productIds, options)\n\n    const output = {\n        event: 'select_item',\n        event_raised_by: options?.eventRaisedBy ?? 'before_cross_sell_v3',\n        click_location: options?.clickLocation ?? 'page builder cross sell quick view',\n        item_list_id: options?.listId ?? 'before_cross_sell_v3',\n        subscription_product_included: 'false',\n        discovery_offer_included: 'false',\n        ...ecommerceObject\n    }\n\n    window.gtmDataObject.push({ ecommerce: null })\n    window.gtmDataObject.push(output)\n}\n\nexport const viewItemList = async (productIds, options) => {\n    const ecommerceObject = await generateEcommerceObject(productIds, options)\n\n    const output = {\n        event: 'view_item_list',\n        event_raised_by: options?.eventRaisedBy,\n        subscription_product_included: 'false',\n        discovery_offer_included: 'false',\n        ...ecommerceObject\n    }\n\n    if (options?.eventRaisedBy === undefined) delete output.event_raised_by\n\n    window.gtmDataObject.push({ ecommerce: null })\n    window.gtmDataObject.push(output)\n}\n\nexport const isGtmTrackingExists = trackingData => {\n    window.gtmDataObject = window.gtmDataObject || []\n\n    return window.gtmDataObject.some(\n        event =>\n            event.event === trackingData.event &&\n            event.ecommerce?.creative_slot === trackingData.campaign.position &&\n            event.ecommerce?.promotion_id === trackingData.campaign.id &&\n            event.ecommerce?.promotion_name === trackingData.campaign.name &&\n            event.ecommerce?.creative_name === trackingData.campaign.creative\n    )\n}\n","import { EVENT_POPIN_OPEN } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport { renderLabels } from './fragments/labels'\nimport { renderLogos } from '@kissui/helpers/src/logos.helpers'\nimport { renderImage } from './fragments/image'\nimport { renderHeading } from './fragments/heading'\nimport { renderHeadline } from './fragments/headline'\nimport { renderLabelTechnology } from './fragments/labelTechnology'\nimport { renderLabelRange } from './fragments/labelRange'\nimport { renderQuickView } from './fragments/quickView'\nimport { renderStrikethroughPrice } from './fragments/strikethroughPrice'\nimport { renderPrice } from './fragments/price'\nimport { renderAddToCart } from './fragments/addToCart'\nimport { renderAdditionalMessage } from './fragments/additionalMessage'\nimport { setCardTheme } from './fragments/setCardTheme'\nimport { getSkuQuickViewData } from '@kissui/components/src/sku-quick-view/shared-quick-view'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { getTechnologyName, getProduct } from '@kissui/helpers/src/catalog'\nimport { trackComponentInteraction, productClick } from '@kissui/helpers/src/gtmEvents'\nimport { isLoggedIn } from '@kissui/helpers/src/dataLayer'\nimport { VARIATION_PLP } from '@kissui/components/src/sku/constants'\n\nclass Sku extends NespressoElement {\n    constructor() {\n        super()\n        this.type = 'default'\n        this.popinId = ''\n        this.isQuickViewPlp = false\n        this.boundOnPDPLinkClick = this.onPDPLinkClick.bind(this)\n        this.boundOnQuickViewOpen = this.onQuickViewOpen.bind(this)\n        this.clickMethod = this.boundOnPDPLinkClick\n    }\n\n    loadTemplate() {\n        this.classList.add('nb-sku')\n        this.classList.add(`nb-sku__${this.type}`)\n        setCardTheme(this.props, this)\n\n        Object.assign(this.props, this.getSleevePrice(this.props))\n        Object.assign(this.props, this.checkHiddenPriceForLoggedInUser(this.props))\n\n        const { quick_view_plp = {} } = this.props\n        this.isQuickViewPlp = quick_view_plp?.show_view || false\n        this.clickMethod = this.isQuickViewPlp\n            ? this.boundOnQuickViewOpen\n            : this.boundOnPDPLinkClick\n\n        this.template = `${this.renderVisual()}\n                          ${this.renderHeader()}\n                          <div class=\"cb-content\">\n                              ${this.renderInformation()}\n                              ${this.isQuickViewPlp ? this.renderQuickView() : ''}\n                              <div class=\"cb-shop\">\n                                  <div class=\"cb-price\">\n                                      ${this.renderPricing()}\n                                  </div>\n                                  ${this.renderAction()}\n                              </div>\n                              ${this.renderFooter()}\n                          </div>`\n\n        this.render()\n    }\n\n    onReady() {\n        const { activeSku, sku } = this.props\n        this.setAttribute('data-product-short-sku', activeSku || sku)\n        this.bindEvent()\n    }\n\n    renderHeaderDefault() {\n        return `${renderLabels(this.props, this)}${renderLogos(this.props, this)}`\n    }\n\n    renderHeader() {\n        return this.renderHeaderDefault()\n    }\n\n    renderVisualDefault() {\n        const theme = this.hasAttribute('portrait') ? 'portrait' : 'landscape'\n        return renderImage(this.props, theme)\n    }\n\n    getSleevePrice({ number_of_sleeves, price }) {\n        let hasPricePerSleeve = true\n        let sleevePrice\n        if (number_of_sleeves === '1') {\n            sleevePrice = price\n        } else {\n            hasPricePerSleeve = false\n        }\n        return { hasPricePerSleeve, sleevePrice }\n    }\n\n    checkHiddenPriceForLoggedInUser({ hidePrice, show_view_details }) {\n        return {\n            hidePrice: isLoggedIn() ? false : hidePrice,\n            show_view_details: isLoggedIn() ? false : show_view_details\n        }\n    }\n\n    renderVisual() {\n        return this.renderVisualDefault()\n    }\n\n    renderInformationDefault() {\n        return `${renderLabelTechnology(this.props)}\n        ${renderLabelRange(this.props)}\n        ${renderHeading(this.props)}\n        ${renderHeadline(this.props)}`\n    }\n\n    renderInformation() {\n        return this.renderInformationDefault()\n    }\n\n    renderQuickView() {\n        return renderQuickView(this.props)\n    }\n\n    renderPricingDefault() {\n        const isPortrait = this.hasAttribute('portrait')\n\n        const pricingWithClass = `\n        ${renderStrikethroughPrice(this.props, this)}\n        <div class=\"${isPortrait ? 't-md-700-sl' : 't-sm-700-sl'}\">\n            ${renderPrice(this.props)}\n        </div>`\n\n        return pricingWithClass\n    }\n\n    renderPricing() {\n        return this.renderPricingDefault()\n    }\n\n    renderActionDefault() {\n        return renderAddToCart(this.props, false, this)\n    }\n\n    renderAction() {\n        const actionSlot = this.querySelector('[slot=\"action\"]')?.outerHTML\n        if (actionSlot) {\n            return actionSlot\n        }\n        return this.renderActionDefault()\n    }\n\n    renderFooterDefault() {\n        return renderAdditionalMessage(this.props)\n    }\n\n    renderFooter() {\n        return this.renderFooterDefault()\n    }\n\n    async onPDPLinkClick() {\n        const productIndex = this.getAttribute('tracking_position') || 0\n        const list = this.getAttribute('tracking_list') || ''\n\n        await productClick(productIndex, list, this.props.longSku)\n    }\n\n    renderSkuQuickView(product) {\n        this.popinId = `plp-quick-view`\n\n        let quickViewElement = document.querySelector(`#${this.popinId}`)\n        if (quickViewElement) {\n            quickViewElement.remove()\n        }\n\n        getSkuQuickViewData(product, this.popinId, this.props, VARIATION_PLP)\n    }\n\n    async onQuickViewOpen(e) {\n        e.preventDefault()\n\n        const { sku } = this.props\n        if (!sku) {\n            return\n        }\n\n        try {\n            const product = await getProduct(sku)\n\n            this.renderSkuQuickView(product)\n            trackComponentInteraction({\n                creative: this.props.campaign?.creative,\n                actionType: 'pdp quick view',\n                internationalId: product.internationalId,\n                internationalName: product.internationalName,\n                productType: product.type,\n                technology: getTechnologyName(product),\n                category: product.category,\n                rawPrice: product.price,\n                eventAction: 'PDP Quick View'\n            })\n            dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: this.popinId } })\n        } catch (e) {\n            console.error(`getProduct fail on sku ${sku}`)\n        }\n        return false\n    }\n\n    bindEvent() {\n        this.unbindEvent()\n        const showQuickView = this.props.quick_view_plp?.show_view\n        const quickViewTextExists = this.props.quick_view_plp?.quick_view_text\n\n        if (!quickViewTextExists) {\n            this.classList.add('sku-hover')\n        }\n\n        if (showQuickView && this.props.variation === VARIATION_PLP) {\n            const elements = quickViewTextExists ? this.querySelectorAll('nb-link button') : [this]\n\n            elements.forEach(element => {\n                element.addEventListener('click', this.clickMethod)\n            })\n\n            // to avoid adding click event to the button inside the sku card\n            this.addStopPropagationEvent('nb-add-to-cart')\n            this.addStopPropagationEvent('nb-cta')\n        }\n    }\n\n    unbindEvent() {\n        const showQuickView = this.props.quick_view_plp?.show_view\n        const quickViewTextExists = this.props.quick_view_plp?.quick_view_text\n\n        if (showQuickView && this.props.variation === VARIATION_PLP) {\n            const elements = quickViewTextExists ? this.querySelectorAll('nb-link button') : [this]\n\n            elements.forEach(element => {\n                element.removeEventListener('click', this.clickMethod)\n            })\n\n            this.removeStopPropagationEvent('nb-add-to-cart')\n            this.removeStopPropagationEvent('nb-cta')\n        }\n    }\n\n    addStopPropagationEvent(selector) {\n        const element = this.querySelector(selector)\n        if (element) {\n            element.addEventListener('click', this.stopPropagationHandler)\n        }\n    }\n\n    removeStopPropagationEvent(selector) {\n        const element = this.querySelector(selector)\n        if (element) {\n            element.removeEventListener('click', this.stopPropagationHandler)\n        }\n    }\n\n    stopPropagationHandler(event) {\n        event.stopPropagation()\n    }\n\n    disconnectedCallback() {\n        this.unbindEvent()\n    }\n}\n\ncustomElements.get('nb-sku') || customElements.define('nb-sku', Sku)\n\nexport default Sku\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { VARIATION_PDP, VARIATION_PLP } from '@kissui/components/src/sku/constants'\nimport { ECAPI_TYPE_CAPSULE } from '@kissui/helpers/src/catalog'\n\nexport const setCardTheme = ({ variation, type }, component) => {\n    // PDP\n    if (variation === VARIATION_PDP) {\n        component.setAttribute('pdp', 'true') // Used by CSS to increase font-size, etc.\n    }\n\n    // COFFEE on PLP on MOBILE\n    if (variation === VARIATION_PLP && type === ECAPI_TYPE_CAPSULE && viewportHelper.is.mobile) {\n        component.setAttribute('landscape', 'true')\n        return\n    }\n\n    component.setAttribute('portrait', 'true')\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\n/**\n * Display labels\n * @param {Object[]} labels - List of labels\n * @param {string} labels[].name - Text\n * @param {string} labels[].bgColor - Background\n * @param {string} labels[].color - Font color\n * @param {HTMLElement} component - Apply css on component\n * @returns {String} - Render of labels\n */\nexport const renderLabels = ({ labels = [] }, component = null) => {\n    if (!component || !labels || !labels.length) {\n        return ''\n    }\n\n    if (component && labels.length) {\n        component.classList.add('has-labels')\n    }\n\n    const direction = viewportHelper.is.mobile ? 'row' : 'column'\n    const data = stringifyForAttribute({ labels })\n\n    return `<nb-card-labels data=\"${data}\" direction=\"${direction}\"></nb-card-labels>`\n}\n","import { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\nexport const renderLogos = (props, component) => {\n    const {\n        fair_trade,\n        alt_fair_trade,\n        is_organic,\n        alt_organic,\n        only_vertuo_next,\n        alt_vertuo_next,\n        is_rainforest,\n        alt_rainforest,\n        is_sustainable,\n        alt_sustainable,\n        is_q_certified_arabica,\n        alt_q_certification_arabica,\n        logos\n    } = props\n\n    if (\n        !fair_trade &&\n        !is_organic &&\n        !only_vertuo_next &&\n        !is_rainforest &&\n        !is_sustainable &&\n        !is_q_certified_arabica &&\n        (logos == null || logos.length < 1)\n    ) {\n        return ''\n    }\n\n    component.classList.add('has-logos')\n\n    const data = {\n        fair_trade,\n        alt_fair_trade,\n        is_organic,\n        alt_organic,\n        only_vertuo_next,\n        alt_vertuo_next,\n        is_rainforest,\n        alt_rainforest,\n        is_sustainable,\n        alt_sustainable,\n        is_q_certified_arabica,\n        alt_q_certification_arabica,\n        logos\n    }\n    return `<nb-card-logos data='${stringifyForAttribute(data)}'></nb-card-logos>`\n}\n","import './image.scss'\n\nexport const renderImage = (\n    { url, image_alt_text, image, quick_view_plp = {} },\n    theme = 'portrait'\n) => {\n    if (!image) {\n        return ''\n    }\n\n    let img = `<nb-img file=\"${image}\"\n        description=\"${image_alt_text}\"\n        aspect_ratio=\"${theme === 'portrait' ? '16/9' : '1/1'}\"\n        object_fit=\"contain\"\n        force_height=\"${theme === 'portrait' ? '160' : '120'}\">\n    </nb-img>`\n\n    const renderClass = url ? '' : 'class=\"cursor-default\"'\n\n    if (url || quick_view_plp?.show_view) {\n        const linkHref = url || 'javascript:void(0)'\n        img = `<a ${renderClass.trim()} href=\"${linkHref}\" target=\"_self\" aria-hidden=\"true\" tabindex=\"-1\">${img}</a>`\n    }\n\n    return `<div class=\"cb-image\">\n                ${img}\n            </div>`\n}\n","import { getTechnologyName } from '@kissui/helpers/src/catalog'\n\nexport const renderQuickView = ({\n    sku,\n    quick_view,\n    tracking_list,\n    tracking_position,\n    campaign_creative,\n    internationalId,\n    internationalName,\n    type,\n    technologies,\n    category,\n    rawPrice,\n    colors\n}) => {\n    if (!quick_view || !quick_view.label || !quick_view.popin_id) {\n        return ''\n    }\n\n    const skuData = JSON.stringify({\n        internationalId: internationalId,\n        internationalName: internationalName,\n        type: type,\n        technology: getTechnologyName({ technologies }),\n        category: category,\n        rawPrice: rawPrice\n    })\n    let colorsSkusList = []\n    if (typeof colors !== 'undefined') {\n        colors.map(color => {\n            colorsSkusList.push(color.sku)\n        })\n    }\n\n    return `<nb-link\n        color=\"gold\"\n        size=\"large\"\n        sku_colors=\"${colorsSkusList}\"\n        popin_id=\"${quick_view.popin_id}\"\n        sku='${sku}'\n        sku_data='${skuData}'\n        campaign_creative='${campaign_creative}'\n        tracking_list='${tracking_list}'\n        tracking_position='${tracking_position}'>${quick_view.label}</nb-link>`\n}\n","import { EVENT_POPIN_OPEN } from '@kissui/components'\nimport { setAttributes } from '@kissui/helpers/src/utils'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\n\nconst bundlePopinIDPrefix = 'bundle-popin-id-'\nlet bundlePopinContent = ''\nlet label_close\n\nexport const renderBundlePopinLink = (\n    { type, bundle_details, bundled, sku, position, range },\n    component\n) => {\n    if (\n        type === 'capsule' &&\n        bundle_details &&\n        bundle_details.popin_link_text &&\n        bundled === true\n    ) {\n        bundlePopinContent = `<nb-bundle-details\n                main_sku='${sku}'\n                description='${bundle_details.description}'\n                other_skus='${bundle_details.other_skus}'\n                other_skus_quantity= '${bundle_details.other_skus_quantity}'\n                range='${range}'\n                position='${position}'>\n            </nb-bundle-details>`\n\n        component.variation = 'white'\n\n        label_close = bundle_details.popin_label_close\n        return `<nb-link class=\"cb-cta-bundle\" size=\"large\" color=\"gold\" label=\"${bundle_details.popin_link_text}\"></nb-link>`\n    }\n    return ''\n}\n\nexport const openBundlePopin = component => {\n    const sku = component.props.legacyId || ''\n    renderPopinBundleDetail(component)\n    let bundlePopinID = bundlePopinIDPrefix + sku\n    component.bundlePopIn = document.getElementById(bundlePopinID)\n    component.appendChild(component.bundlePopIn)\n\n    setAttributes(component.bundlePopIn, {\n        variation: 'before',\n        bgcolor: 'white',\n        size: 'L',\n        padding: 'false',\n        label_close,\n        content: bundlePopinContent\n    })\n\n    component.bundlePopIn.classList.add('nb-popin--bundle')\n\n    dispatchEvent({\n        eventName: EVENT_POPIN_OPEN,\n        args: { id: bundlePopinID }\n    })\n}\n\nconst renderPopinBundleDetail = component => {\n    const sku = component.props.legacyId || ''\n    let bundlePopinID = bundlePopinIDPrefix + sku\n    if (document.getElementById(bundlePopinID) != null) return\n\n    let popin = document.createElement('nb-popin')\n\n    popin = component.appendChild(popin)\n    popin.setAttribute('id', bundlePopinID)\n    popin.setAttribute('content', '')\n}\n","/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue(arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(null, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","import{options as r}from\"preact\";export{Fragment}from\"preact\";var _=0;function o(o,e,n,t,f,l){var s,u,a={};for(u in e)\"ref\"==u?s=e[u]:a[u]=e[u];var i={type:o,props:a,key:n,ref:s,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:--_,__source:f,__self:l};if(\"function\"==typeof o&&(s=o.defaultProps))for(u in s)void 0===a[u]&&(a[u]=s[u]);return r.vnode&&r.vnode(i),i}export{o as jsx,o as jsxDEV,o as jsxs};\n//# sourceMappingURL=jsxRuntime.module.js.map\n","import cn from 'classnames'\nimport styles from './CompatibilityButton.module.scss'\n\nexport type CompatibilityButtonProps = {\n    /** The button text */\n    text: string\n    /** If set, the text will be text aligned center */\n    textCentered?: boolean\n    /** Button click handler */\n    onClick: (event: MouseEvent) => void\n    /** If true, the focus styles will be persistently applied after clicking */\n    maintainElementFocus?: boolean\n    /** Additional class */\n    class?: string\n}\n\nexport default function CompatibilityButton({\n    class: className,\n    onClick,\n    text,\n    textCentered,\n    maintainElementFocus\n}: CompatibilityButtonProps) {\n    const classes = cn(\n        styles.button,\n        maintainElementFocus ? styles.buttonFocus : null,\n        className\n    )\n    return (\n        <button class={classes} type=\"button\" onClick={onClick}>\n            <span class={styles.inner}>\n                <span class={styles.contents}>\n                    <span class={styles.icon} />\n                    <span class={cn(\n                        styles.text,\n                        textCentered ? styles.textCentered : null\n                    )}>{text}</span>\n                    <span class={styles.chevron} />\n                </span>\n            </span>\n        </button>\n    )\n}\n","async function fetchHtml(url: string): Promise<string | null> {\n    try {\n        const response = await fetch(url)\n        if (response.ok) {\n            const html = await response.text()\n            return html\n        }\n        return null\n    } catch (error) {\n        return null\n    }\n}\n\nfunction parseHtml(html: string): Document | null {\n    const parser = new DOMParser()\n    try {\n        const result = parser.parseFromString(html, 'text/html')\n        return result\n    } catch (error) {\n        return null\n    }\n}\n\nexport async function fetchAndParse(url: string): Promise<string> {\n    const document = await fetchHtml(url)\n    if (!document) return ''\n    const parser = parseHtml(document)\n    if (!parser) return '' // error parsing\n    const { body } = parser\n    const mainTag = Array.from<HTMLElement>(body.querySelectorAll('main#main')) // there's 2 <main>s on the page!\n    if (mainTag.length === 0) return '' // no main tag!\n\n    // filter out span.visually-hidden!\n    if (mainTag[0].children.length > 0) {\n        Array.from(mainTag[0].children).forEach(child => {\n            if (child.classList.contains('visually-hidden')) {\n                child.remove()\n            }\n        })\n    }\n    return mainTag[0].innerHTML\n}\n","import { createContext, type ComponentChildren } from 'preact'\nimport {\n    useRef,\n    useEffect,\n    useState,\n    useMemo,\n    useContext,\n    type StateUpdater\n} from 'preact/hooks'\nimport cn from 'classnames'\nimport styles from './ModalDrawer.module.scss'\nimport isOldSafari from '@kissui/apps/src/utils/isOldSafari'\n\nexport type ModalDrawerParentContext = {\n    setFooter: StateUpdater<ComponentChildren>\n}\n\nconst Context = createContext<ModalDrawerParentContext>({ setFooter: () => { } })\n\nexport type ModalDrawerProps = {\n    children: ComponentChildren\n    title: ComponentChildren\n    closeIconAltText: string\n    isOpen?: boolean\n    maxHeightMobile?: 25 | 33 | 50 | 66 | 75 | 87 | 100\n    onClose?: () => void\n}\n\nexport default function ModalDrawer({\n    children,\n    title,\n    closeIconAltText,\n    isOpen = false,\n    maxHeightMobile = 75,\n    onClose = () => { }\n}: ModalDrawerProps) {\n    const dialogRef = useRef<HTMLDialogElement>(null)\n    const [isClosing, setIsClosing] = useState<boolean>(false)\n    const [footer, setFooter] = useState<ComponentChildren>(null)\n\n    function hideModal() {\n        setIsClosing(true)\n        // have to manually close after animation due to Safari\n        const close = () => {\n            setIsClosing(false)\n            dialogRef.current?.close()\n            dialogRef.current?.removeEventListener('animationend', close)\n        }\n        dialogRef.current?.addEventListener('animationend', close)\n    }\n\n    useEffect(() => {\n        if (!dialogRef || !dialogRef.current) return undefined\n\n        // handles old safari + <dialog> support with dynamic import polyfill\n        if (isOldSafari(navigator?.userAgent)) {\n            (async () => {\n                if (dialogRef.current) {\n                    try {\n                        const { default: dialogPolyfill } = await import('dialog-polyfill')\n                        dialogPolyfill.registerDialog(dialogRef.current)\n                    } catch (error) {\n\n                    }\n                }\n            })()\n        }\n\n        function onDialogClick(event: MouseEvent) {\n            if (event.target === dialogRef.current) {\n                onClose()\n            }\n        }\n\n        dialogRef.current?.addEventListener('click', onDialogClick)\n\n        return () => {\n            dialogRef.current?.removeEventListener('click', onDialogClick)\n        }\n    }, [dialogRef.current])\n\n    useEffect(() => {\n        if (!dialogRef || !dialogRef.current) return\n\n        if (isOpen) {\n            dialogRef.current.showModal()\n        } else if (dialogRef.current.open) {\n            hideModal()\n        }\n    }, [dialogRef?.current, isOpen])\n\n    const parentContext = useMemo<ModalDrawerParentContext>(\n        () => ({\n            setFooter\n        }),\n        [setFooter]\n    )\n\n    return (\n        <dialog\n            ref={dialogRef}\n            onClose={onClose}\n            class={cn(\n                styles.container,\n                { [styles.isClosing]: isClosing },\n                styles[`h${maxHeightMobile}`]\n            )}\n        >\n            {(isOpen || isClosing) && (\n                <article class={styles.article}>\n                    <Context.Provider value={parentContext}>\n                        <header class={styles.header}>\n                            <h2 class={styles.title}>{title}</h2>\n                            <button\n                                class={styles.closeButton}\n                                type=\"button\"\n                                onClick={onClose}\n                                // eslint-disable-next-line jsx-a11y/no-autofocus\n                                autoFocus\n                                aria-label={closeIconAltText}\n                            />\n                        </header>\n                        <div class={styles.content}>{children}</div>\n                        {footer && <footer class={styles.footer}>{footer}</footer>}\n                    </Context.Provider>\n                </article>\n            )}\n        </dialog>\n    )\n}\n\nexport type ModalDrawerFooterProps = {\n    children: ComponentChildren\n}\n\nModalDrawer.Footer = function Footer({ children }: ModalDrawerFooterProps) {\n    const { setFooter } = useContext(Context)\n    setFooter(children)\n    return null\n}\n","/** Returns true if user agent is Safari/iPhone and version is lower than 15.3 */\nexport default function isOldSafari(userAgent?: string) {\n  const agent = userAgent ?? navigator.userAgent;\n  const versionMatch = agent.match(/Version\\/(\\d+\\.\\d+)/);\n  const safariVersion = versionMatch ? parseFloat(versionMatch[1]) : 0;\n  const isOlderThan153 = safariVersion < 15.3;\n  const isSafari = agent.includes('Safari') && agent.includes('iPhone');\n\n  return isSafari && isOlderThan153;\n}\n","import {\n    useEffect,\n    useState\n} from 'preact/hooks'\nimport { Product } from '@kissui/apps/src/product.type'\nimport { fetchAndParse } from './modalUtils'\nimport useAppData from '@kissui/apps/src/hooks/useAppData'\nimport plpAppData from '@kissui/apps/src/plp-core/store/plp.data'\nimport ModalDrawer from '@kissui/apps/src/components/ModalDrawer/ModalDrawer'\nimport styles from './CompatibilityModal.module.scss'\n\nexport type CompatibilityModalProps = {\n    isOpen: boolean\n    product: Product | null\n    onClose: () => void\n    modalSettings: {\n        url: string\n        title: string\n        loadingLabel: string\n        loadingLabelError: string\n        closeButtonLabel: string\n    }\n}\nexport default function CompatibilityModal({\n    isOpen,\n    product,\n    onClose,\n    modalSettings: {\n        url: compatibilityUrl,\n        title: modalTitle,\n        loadingLabel,\n        loadingLabelError: errorLoadingLabel,\n        closeButtonLabel\n    }\n}: CompatibilityModalProps) {\n    const [data, setData] = useState<CompatibilityState>({\n        status: 'INITIAL',\n        html: ''\n    })\n\n    async function fetchData() {\n        if (!compatibilityUrl) {\n            return\n        }\n        if (data.status === 'LOADED' || data.status === 'PENDING') {\n            return\n        }\n        setData({ status: 'PENDING', html: '' })\n\n        const html = await fetchAndParse(compatibilityUrl)\n        if (!html) {\n            setData({ status: 'ERROR', html: '' })\n            return\n        }\n        setData({ status: 'LOADED', html })\n    }\n\n    useEffect(() => {\n        if (!isOpen) {\n            return\n        }\n        (async () => {\n            try {\n                await fetchData()\n            } catch (error: any) {\n                console.error(error)\n            }\n        })()\n    }, [isOpen])\n\n    if (!compatibilityUrl) {\n        return null\n    }\n\n    return (\n        <ModalDrawer\n            title={modalTitle}\n            isOpen={isOpen}\n            closeIconAltText={closeButtonLabel}\n            onClose={onClose}\n            maxHeightMobile={87}>\n            {data.status === 'LOADED' && <Loaded html={data.html} />}\n            {data.status === 'PENDING' && <Pending label={loadingLabel}></Pending>}\n            {data.status === 'ERROR' && <Error label={errorLoadingLabel}></Error>}\n        </ModalDrawer>\n    )\n}\n\nfunction Loaded({ html }: { html: string }) {\n    return (\n        <div class={styles.stateLoaded} dangerouslySetInnerHTML={{ __html: html }} />\n    )\n}\n\nfunction Pending({ label }: { label: string }) {\n    return (\n        <div class={styles.statePending}>{label}</div>\n    )\n}\n\nfunction Error({ label }: { label: string }) {\n    return (\n        <div class={styles.stateError}>{label}</div>\n    )\n}\n\ntype CompatibilityState = {\n    status: 'INITIAL' | 'PENDING' | 'LOADED' | 'ERROR'\n    html: string\n}\n","import{h as t,hydrate as e,render as n,cloneElement as o}from\"preact\";function r(){return(r=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(t[o]=n[o])}return t}).apply(this,arguments)}function i(t){this.getChildContext=function(){return t.context};var e=t.children,n=function(t,e){if(null==t)return{};var n,o,r={},i=Object.keys(t);for(o=0;o<i.length;o++)e.indexOf(n=i[o])>=0||(r[n]=t[n]);return r}(t,[\"context\",\"children\"]);return o(e,n)}function a(){var o=new CustomEvent(\"_preact\",{detail:{},bubbles:!0,cancelable:!0});this.dispatchEvent(o),this._vdom=t(i,r({},this._props,{context:o.detail.context}),function e(n,o){if(3===n.nodeType)return n.data;if(1!==n.nodeType)return null;var r=[],i={},a=0,c=n.attributes,l=n.childNodes;for(a=c.length;a--;)\"slot\"!==c[a].name&&(i[c[a].name]=c[a].value,i[s(c[a].name)]=c[a].value);for(a=l.length;a--;){var p=e(l[a],null),d=l[a].slot;d?i[d]=t(u,{name:d},p):r[a]=p}var h=o?t(u,null,r):r;return t(o||n.nodeName.toLowerCase(),i,h)}(this,this._vdomComponent)),(this.hasAttribute(\"hydrate\")?e:n)(this._vdom,this._root)}function s(t){return t.replace(/-(\\w)/g,function(t,e){return e?e.toUpperCase():\"\"})}function c(t,e,r){if(this._vdom){var i={};i[t]=r=null==r?void 0:r,i[s(t)]=r,this._vdom=o(this._vdom,i),n(this._vdom,this._root)}}function l(){n(this._vdom=null,this._root)}function u(e,n){var o=this;return t(\"slot\",r({},e,{ref:function(t){t?(o.ref=t,o._listener||(o._listener=function(t){t.stopPropagation(),t.detail.context=n},t.addEventListener(\"_preact\",o._listener))):o.ref.removeEventListener(\"_preact\",o._listener)}}))}export default function(t,e,n,o){function r(){var e=Reflect.construct(HTMLElement,[],r);return e._vdomComponent=t,e._root=o&&o.shadow?e.attachShadow({mode:\"open\"}):e,e}return(r.prototype=Object.create(HTMLElement.prototype)).constructor=r,r.prototype.connectedCallback=a,r.prototype.attributeChangedCallback=c,r.prototype.disconnectedCallback=l,n=n||t.observedAttributes||Object.keys(t.propTypes||{}),r.observedAttributes=n,n.forEach(function(t){Object.defineProperty(r.prototype,t,{get:function(){return this._vdom.props[t]},set:function(e){this._vdom?this.attributeChangedCallback(t,null,e):(this._props||(this._props={}),this._props[t]=e,this.connectedCallback());var n=typeof e;null!=e&&\"string\"!==n&&\"boolean\"!==n&&\"number\"!==n||this.setAttribute(t,e)}})}),customElements.define(e||t.tagName||t.displayName||t.name,r)}\n//# sourceMappingURL=preact-custom-element.esm.js.map\n","import register from 'preact-custom-element'\nimport { useRef, useEffect, useState } from 'preact/hooks'\nimport type { Ref } from 'preact/hooks'\nimport type { FunctionComponent } from 'preact'\n\n/**\n * Turns a Preact component into a Web Component,\n * allowing the component to be used in either context\n * @param func A (P)React function component\n * @param tagName The Web Component tag name, like 'my-component'\n * @param observedAttributes Array of element attributes to observe for changes\n * @param options Additional web component options\n * @returns The custom element\n */\nexport default function asWebComponent(\n    func: FunctionComponent<any>,\n    tagName: string,\n    observedAttributes?: string[],\n    options?: { shadow: boolean }\n): CustomElementConstructor {\n    if (customElements.get(tagName)) {\n        return customElements.get(tagName) as CustomElementConstructor\n    }\n    register(func, tagName, observedAttributes, options)\n    return customElements.get(tagName) as CustomElementConstructor\n}\n\ninterface useCustomElementReturn {\n    immediateChildRef: Ref<any>\n    customElement: HTMLElement | null | undefined\n}\n\n/**\n * Allows access to the Web Component wrapper, from within the Preact Component\n */\nexport function useCustomElement(): useCustomElementReturn {\n    const ref = useRef<any>(null)\n    const [customElement, setCustomElement] = useState(undefined)\n    useEffect(() => {\n        setCustomElement(ref.current?.parentElement)\n    }, [ref])\n\n    return { immediateChildRef: ref, customElement }\n}\n","import CompatibilityButton from \"@kissui/components/src/compatibility/CompatibilityButton/CompatibilityButton\"\nimport CompatibilityModal, { CompatibilityModalProps } from \"@kissui/components/src/compatibility/CompatibilityModal/CompatibilityModal\"\nimport { Product } from \"@kissui/apps/src/product.type\"\nimport asWebComponent from \"@kissui/helpers/src/asWebComponent\"\nimport { useState } from \"preact/hooks\"\nimport styles from './compatibility-section.module.scss'\n\n/** Should match the schema data structure */\ntype SkuMainInfoCompatibilitySchema = {\n    compatibility_modal_url: string\n    compatibility_modal_title: string\n    compatibility_modal_loading_text: string\n    compatibility_modal_loading_text_error: string\n    compatibility_modal_close_button_ally: string\n    compatibility_card_button_text: string\n}\n\ntype CompatibilityProps = {\n    /** A stringified version of the product */\n    product: string\n    compatibility: string\n}\nfunction Compatibility({ product: productStringified, compatibility: compatibilityStringified }: CompatibilityProps) {\n    const [modalState, setModalState] = useState<Product | null>(null)\n\n    let product: Product | null = null\n    let compatibilityDataParsed: SkuMainInfoCompatibilitySchema | null = null\n\n\n    try {\n        product = JSON.parse(productStringified) as Product\n        compatibilityDataParsed = JSON.parse(compatibilityStringified) as SkuMainInfoCompatibilitySchema\n    } catch (error) {\n        return null // do not render the compatibility button\n    }\n    if (!product || !compatibilityDataParsed) return null\n\n\n    const toggleCompatibilityModal = (product: Product) => {\n        setModalState(product)\n    }\n    const hideModal = () => {\n        setModalState(null)\n    }\n\n    function handleCompatibilityClick(event: MouseEvent, product: Product) {\n        event.stopPropagation()\n        event.preventDefault()\n        toggleCompatibilityModal(product)\n    }\n\n    const compatibilityButtonLabel = compatibilityDataParsed?.compatibility_card_button_text ?? ''\n    const modalSettings: CompatibilityModalProps['modalSettings'] = {\n        url: compatibilityDataParsed?.compatibility_modal_url ?? '',\n        title: compatibilityDataParsed?.compatibility_modal_title ?? '',\n        loadingLabel: compatibilityDataParsed?.compatibility_modal_loading_text ?? '',\n        loadingLabelError: compatibilityDataParsed?.compatibility_modal_loading_text_error ?? '',\n        closeButtonLabel: compatibilityDataParsed?.compatibility_modal_close_button_ally ?? ''\n    }\n\n    if (!compatibilityButtonLabel) return null\n\n    // we don't want to persist the compat button focus on the PDP\n    const isPDP = (product.variation ?? '') === 'pdp'\n\n    return (<>\n        <CompatibilityButton\n            text={compatibilityButtonLabel}\n            textCentered\n            onClick={(e) => handleCompatibilityClick(e, product)}\n            class={styles.button}\n            maintainElementFocus={!isPDP}\n        ></CompatibilityButton>\n        <CompatibilityModal\n            isOpen={!!modalState}\n            product={modalState}\n            onClose={hideModal}\n            modalSettings={modalSettings}\n        ></CompatibilityModal>\n    </>)\n}\n\nexport default asWebComponent(Compatibility, 'nb-compatibility-section')\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { renderHeading as renderHeadingSku } from '@kissui/components/src/sku/fragments/heading'\n\nconst getDecaffeinatoRegExp = props => {\n    const { label_decaffeinato } = props\n    return new RegExp(label_decaffeinato, 'ig')\n}\n\nconst hasDecaffeinato = (props, heading) => {\n    const { label_decaffeinato } = props\n\n    return (\n        label_decaffeinato &&\n        label_decaffeinato !== '' &&\n        getDecaffeinatoRegExp(props).test(heading)\n    )\n}\n\nexport const renderHeading = props => {\n    const { name } = props\n\n    if (hasDecaffeinato(props, name)) {\n        const { label_decaffeinato } = props\n        const className = viewportHelper.is.mobile ? 't-xs-700-sl' : 't-md-700-sl'\n\n        props.name_custom = name\n            .replace(\n                getDecaffeinatoRegExp(props),\n                `<span class='cb-heading__label ${className}'>${label_decaffeinato}</span>`\n            )\n            .trim()\n    }\n\n    return renderHeadingSku(props)\n}\n","import { interpolate } from '@kissui/helpers/src/utils'\nimport { getSleeveNumber } from '@kissui/helpers/src/catalog'\n\nconst getSleeveLabel = props => {\n    const { number_of_sleeves, label_sleeves, label_sleeve } = props\n    const sleeveNumber = number_of_sleeves || getSleeveNumber(props)\n    return sleeveNumber > 1 && label_sleeves ? label_sleeves : label_sleeve\n}\n\nconst getQuantity = ({ bundled, sales_multiple, unit_quantity, unitQuantity }) =>\n    bundled === false ? sales_multiple : unit_quantity || unitQuantity || 0\n\nexport const renderShowSleeve = props => {\n    const { show_sleeve = false } = props\n\n    if (!show_sleeve) {\n        return ''\n    }\n\n    const { label_capsules, sleeve_syntax } = props\n    const label = getSleeveLabel(props)\n    const quantity = props.number_of_capsules ? props.number_of_capsules : getQuantity(props)\n    const sleeveNumber = props.number_of_sleeves ? props.number_of_sleeves : getSleeveNumber(props)\n\n    if (!quantity || !sleeveNumber) {\n        return ''\n    }\n\n    const showSleeve = interpolate(\n        sleeve_syntax,\n        {\n            numberOfSleeves: sleeveNumber,\n            sleeveLabel: label,\n            quantity,\n            label_capsules,\n            sleevePrice: props.hasPricePerSleeve ? props.sleevePrice : '',\n            perSleeveLabel: props.hasPricePerSleeve ? props.perSleeveLabel : ''\n        },\n        '{',\n        '}'\n    )\n\n    if (!showSleeve) {\n        return ''\n    }\n\n    return `<p class=\"cb-price-items cb-show-sleeve t-xs-500-sl\">${showSleeve}</p>`\n}\n","import Sku from '@kissui/components/src/sku'\nimport { renderLabelTechnology } from '@kissui/components/src/sku/fragments/labelTechnology'\nimport { renderLabelRange } from '@kissui/components/src/sku/fragments/labelRange'\nimport { renderHeadline } from '@kissui/components/src/sku/fragments/headline'\nimport { renderStrikethroughPrice } from '@kissui/components/src/sku/fragments/strikethroughPrice'\nimport { renderPrice } from '@kissui/components/src/sku/fragments/price'\nimport { renderBundlePopinLink, openBundlePopin } from './fragments/bundle'\nimport { renderIntensity } from './fragments/intensity'\nimport '@kissui/components/src/compatibility/compatibility-section/compatibility-section' // registers the compatibility Preact Web Component!\nimport { renderHeading } from './fragments/heading'\nimport { renderShowSleeve } from './fragments/sleeve'\nimport { renderCapsulePrice } from './fragments/priceCapsule'\nimport { renderBoxTube } from './fragments/boxTube'\nimport { renderPackFormat } from './fragments/packFormat'\nimport { renderSkuQuickViewLink } from './fragments/skuQuickViewLink'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport { capsuleHasMachineCompatibilityIssue } from '@kissui/helpers/src/productCompatibility'\n\nclass SkuCoffee extends Sku {\n    constructor() {\n        super()\n        this.type = 'coffee'\n        this.boundHandleBundleOpen = this.handleBundleOpen.bind(this)\n    }\n\n    onReady() {\n        this.bundlePopinLink = this.querySelector('.cb-cta-bundle')\n        super.onReady()\n    }\n\n    renderInformation() {\n        return `${renderLabelTechnology(this.props)}\n                ${renderLabelRange(this.props)}\n                ${renderHeading(this.props)}\n                ${renderHeadline(this.props)}\n                ${renderSkuQuickViewLink(this.props)}\n                ${renderIntensity(this.props)}\n                ${this.renderCompatibility(this.props)}\n                ${renderBundlePopinLink(this.props, this)}\n                ${renderBoxTube(this.props)}`\n    }\n\n    renderCompatibility() {\n        // only show the feature on the PDP\n        if (this.props.variation !== 'pdp') {\n            return ''\n        }\n        // only show compatibility button if capsule exists in specific range\n        if (!capsuleHasMachineCompatibilityIssue(this.props?.ranges ?? [])) {\n            return ''\n        }\n        const compatibilityStringified = this.dataset?.compatibility ?? ''\n        if (!compatibilityStringified) {\n            return ''\n        }\n        const compatibilityDataParsed = JSON.parse(compatibilityStringified)\n        return `<nb-compatibility-section product=\"${stringifyForAttribute(\n            this.props\n        )}\" compatibility=\"${stringifyForAttribute(\n            compatibilityDataParsed\n        )}\"></nb-compatibility-section>`\n    }\n\n    renderPricingDefault() {\n        const isPortrait = this.hasAttribute('portrait')\n\n        const pricingWithClass = `\n        ${renderStrikethroughPrice(this.props, this)}\n        <div class=\"${isPortrait ? 't-md-700-sl' : 't-sm-700-sl'}\">\n            ${renderPrice(this.props)}\n        </div>`\n\n        return pricingWithClass\n    }\n\n    renderPricing() {\n        return `${this.renderPricingDefault()}\n                ${renderPackFormat(this.props)}\n                ${renderShowSleeve(this.props)}\n                ${renderCapsulePrice(this.props)}`\n    }\n\n    handleBundleOpen() {\n        openBundlePopin(this)\n    }\n\n    bindEvent() {\n        super.bindEvent()\n        if (this.bundlePopinLink) {\n            this.bundlePopinLink.addEventListener('click', this.boundHandleBundleOpen)\n        }\n    }\n\n    unbindEvent() {\n        super.unbindEvent()\n        if (this.bundlePopinLink) {\n            this.bundlePopinLink.removeEventListener('click', this.boundHandleBundleOpen)\n        }\n    }\n}\n\ncustomElements.get('nb-sku-coffee') || customElements.define('nb-sku-coffee', SkuCoffee)\n\nexport default SkuCoffee\n","import { escapeHtml, stringifyForAttribute } from '@kissui/helpers/src/utils'\n\nexport const renderSkuQuickViewLink = props => {\n    const { quick_view_plp, id, campaign, tracking_list, tracking_position } = props\n\n    let quickViewLabel = quick_view_plp?.quick_view_text\n\n    if (!quick_view_plp?.show_view || !quickViewLabel) {\n        return ''\n    }\n\n    return `<div class=\"cb-link sku-quick-view-link\">\n                <nb-link\n                    target=\"_self\"\n                    size=\"small\"\n                    campaign_id=\"${escapeHtml(campaign?.id || '')}\"\n                    campaign_name=\"${escapeHtml(campaign?.name || '')}\"\n                    campaign_position=\"${escapeHtml(campaign?.position || '')}\"\n                    campaign_creative=\"${escapeHtml(campaign?.creative || '')}\"\n                    data=\"${stringifyForAttribute({ product: { id: id } })}\"\n                    long_sku=\"${id}\"\n                    tracking_position=\"${tracking_position}\"\n                    tracking_list=\"${tracking_list}\"\n                    >\n                        ${quickViewLabel}\n                </nb-link>\n            </div>`\n}\n","import { getMaxIntensity } from '@kissui/components/src/sku-coffee/services'\n\nexport const renderIntensity = ({\n    technologies,\n    intensity,\n    a11y_intensity_max,\n    intensity_label = ''\n}) => {\n    const maxIntensity = getMaxIntensity({ technologies })\n\n    if (intensity === 0) {\n        return ''\n    }\n\n    return `<nb-intensity\n        intensity=\"${intensity}\"\n        max_intensity=\"${maxIntensity}\"\n        a11y_intensity_max=\"${a11y_intensity_max}\"\n        intensity_label=\"${intensity_label}\">\n    </nb-intensity>`\n}\n","export const renderBoxTube = ({ packaging }) => {\n    if (!packaging) {\n        return ''\n    }\n    const { show_packaging, packaging_list, a11y_packaging_label } = packaging\n    if (!show_packaging || !packaging_list || !packaging_list.length) {\n        return ''\n    }\n\n    const packagingItem = packaging_list\n        .map(({ label, url, selected }) => {\n            if (url && !selected) {\n                return `<a href=\"${url}\" target=\"_self\"><span class=\"t-sm-400-sl\">${label}</span></a>`\n            }\n\n            return `<div aria-current=\"page\"><span class=\"t-sm-700-sl\">${label}</span></div>`\n        })\n        .join('')\n\n    return `<div class=\"cb-sku-tab\">\n        <span class=\"sr-only\">${a11y_packaging_label}</span>\n        ${packagingItem}\n    </div>`\n}\n","import { Product } from '@kissui/apps/src/product.type'\n\nconst COMPATIBILITY_RANGE_IDENTIFIER = 'capsule-range-label-compatibility-vertuo' as const\n\n/** Capsules tagged to certain range categories will show the machine compatibility button/modal */\nexport function capsuleHasMachineCompatibilityIssue(ranges: Product['ranges']) {\n    const rangesSimple = simplifyRangeIds(ranges)\n    return rangesSimple.some(id => id === COMPATIBILITY_RANGE_IDENTIFIER)\n}\n\n/**\n * Full range strings are like: 'nesclub2.es.b2c/cat/capsule-range-label-compatibility-vertuo'\n * @returns The range string without the website/market info\n */\nfunction simplifyRangeIds(ranges: string[]) {\n    return ranges.map(range => range.split('/').pop())\n}\n","export const renderPackFormat = ({ packaging }) => {\n    if (!packaging) {\n        return ''\n    }\n    const { show_packaging, packaging_list } = packaging\n    if (!show_packaging || !packaging_list || !packaging_list.length) {\n        return ''\n    }\n\n    const selectedPack = packaging_list.find(obj => {\n        return obj.selected === true\n    })\n\n    return `<p class=\"cb-price-items cb-pack-format t-xs-500-sl\">${selectedPack.pack_format}</p>`\n}\n","import { interpolate } from '@kissui/helpers/src/utils'\n\nexport const renderCapsulePrice = props => {\n    const {\n        show_capsule_price = false,\n        capsule_price_label,\n        capsule_price_syntax = '{capsule_price_label}: {price_per_capsule}',\n        price_per_capsule,\n        show_sleeve_price\n    } = props\n    if (!show_capsule_price || !capsule_price_label || !show_sleeve_price) {\n        return ''\n    }\n\n    const pricePerCapsule = interpolate(\n        capsule_price_syntax,\n        {\n            capsule_price_label,\n            price_per_capsule\n        },\n        '{',\n        '}'\n    )\n\n    if (!pricePerCapsule || !price_per_capsule) {\n        return ''\n    }\n\n    return `<p class=\"cb-price-items cb-price-capsule t-xs-500-sl\">${pricePerCapsule}</p>`\n}\n","import createProps from '@kissui/helpers/src/props.helpers'\n\nclass Intensity extends HTMLElement {\n    constructor() {\n        super()\n        this.props = {}\n    }\n\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.render()\n    }\n\n    render() {\n        const { intensity_label = 'Intensity', a11y_intensity_max, max_intensity } = this.props\n        const intensity = parseInt(this.props.intensity)\n\n        if (!intensity || isNaN(intensity)) {\n            return ''\n        }\n\n        const a11yIntensityMax = a11y_intensity_max?.replace('{max_intensity}', max_intensity)\n\n        this.innerHTML = `\n            <p>\n                <span class=\"sr-only\">${intensity_label} ${intensity} ${a11yIntensityMax}</span>\n                <div class=\"t-xs-500-sl\" aria-hidden=\"true\">${intensity_label}</div>\n                ${this.renderIntensityMin(intensity)}\n                <div class=\"t-xs-700-sl\" aria-hidden=\"true\">${intensity}</div>\n                ${this.renderIntensityMax(intensity)}\n            </p>\n        `\n    }\n\n    renderIntensityMin(intensity) {\n        const min_intensity = 0\n\n        return new Array(Math.max(intensity, 0) - min_intensity)\n            .fill('<span class=\"bar filled\"></span>')\n            .join('')\n    }\n\n    renderIntensityMax(intensity) {\n        let { max_intensity } = this.props\n        if (!max_intensity || max_intensity === 'undefined') {\n            max_intensity = 14\n        }\n\n        return new Array(parseInt(max_intensity) - Math.min(intensity, parseInt(max_intensity)))\n            .fill('<span class=\"bar\"></span>')\n            .join('')\n    }\n}\n\ncustomElements.get('nb-intensity') || customElements.define('nb-intensity', Intensity)\n\nexport default Intensity\n","class EventBus {\n    constructor() {\n        this._bus = document.createElement('div')\n    }\n\n    register(event, callback) {\n        this._bus.addEventListener(event, callback)\n    }\n\n    remove(event, callback) {\n        this._bus.removeEventListener(event, callback)\n    }\n\n    fire(event, detail = {}) {\n        this._bus.dispatchEvent(new CustomEvent(event, { detail }))\n    }\n}\n\nif (!bus) {\n    var bus = new EventBus()\n}\n\nexport default bus\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport EventBus from '@kissui/helpers/src/assets/js/eventBus'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport {\n    handlePromoClick,\n    productImpression,\n    trackComponentInteraction\n} from '@kissui/helpers/src/gtmEvents'\nimport { EVENT_POPIN_OPEN, EVENT_QS_OPEN, TIME_SLOW } from '@kissui/components'\nimport { getLangCode, getMarketCode } from '@kissui/helpers/src/dataLayer'\n\nclass Cta extends HTMLElement {\n    constructor() {\n        super()\n        this.props = {}\n        this.market = getMarketCode()\n        this.language = getLangCode()\n    }\n\n    static get observedAttributes() {\n        return ['slot', 'quantity']\n    }\n\n    connectedCallback() {\n        this.props = {\n            ...createProps(this.attributes),\n            disableTracking: this.hasAttribute('data-disabletracking')\n        }\n\n        this.boundHandleClick = this.handleClick.bind(this)\n        this.slot = this.innerHTML.replace(/\\n*$/, '').trim()\n        this.render()\n    }\n\n    render() {\n        const {\n            add_to_cart = '',\n            aria_label,\n            aria_label_after,\n            aria_label_before,\n            contrast,\n            icon_left = '',\n            icon_right = '',\n            label_update,\n            label,\n            link_new_tab = false,\n            long_sku = '',\n            seo_label = '',\n            size = '48',\n            tracking_list = '',\n            tracking_position = '',\n            transparent = 'false',\n            variation\n        } = this.props\n        let { link } = this.props\n\n        const slot = this.slot ? this.slot : label\n\n        const element = document.createElement(link ? 'a' : 'button')\n\n        if (tracking_position && tracking_list && long_sku) {\n            productImpression(tracking_position, tracking_list, long_sku)\n        }\n\n        if (link) {\n            link = link.replace('{market}', this.market)\n            link = link.replace('{lang}', this.language)\n\n            element.setAttribute('href', link)\n        }\n\n        if (link && link_new_tab) {\n            element.setAttribute('target', '_blank')\n        }\n        // Todo : can we get rid of this title attr ? at least when it's a button, not a link ?\n        if (seo_label && link) {\n            element.setAttribute('title', seo_label)\n        }\n\n        if (aria_label) {\n            element.setAttribute('aria-label', aria_label)\n        } else if (aria_label_before || aria_label_after) {\n            const ariaLabel = [aria_label_before, slot, aria_label_after]\n                .filter(value => !!value)\n                .join(' ')\n            ariaLabel && element.setAttribute('aria-label', ariaLabel)\n        }\n\n        if (variation !== 'navigation') {\n            element.classList.add(`button--cta`)\n        }\n        element.classList.add(`button--${variation}`)\n        if (contrast) {\n            if (transparent === 'true') {\n                element.classList.add(`button--${contrast}--transparent`)\n            } else {\n                element.classList.add(`button--${contrast}`)\n            }\n        }\n        if (size) {\n            let textClass = 't-md-400-sl'\n            switch (size) {\n                case '32':\n                    textClass = 't-xs-500-sl'\n                    break\n                case '40':\n                    textClass = 't-sm-400-sl'\n                    break\n            }\n            element.classList.add(`size--${size}`, textClass)\n        }\n\n        if ((variation === 'primary' || variation === 'tertiary') && add_to_cart !== '') {\n            this.setAttribute('add_to_cart', add_to_cart)\n            this.setAttribute('quantity', '0')\n            add_to_cart === 'small'\n                ? element.classList.add('addToCart--small')\n                : element.classList.add('addToCart--large')\n        }\n\n        icon_left && this.setAttribute('icon_left', icon_left)\n        icon_right && this.setAttribute('icon_right', icon_right)\n\n        element.innerHTML = `\n                ${icon_left && `<nb-icon icon='${icon_left}'></nb-icon>`}\n                <span>${slot}</span>\n                ${\n                    variation === 'primary' && add_to_cart !== '' && label_update !== ''\n                        ? `<span class=\"update\">${label_update}</span>`\n                        : ''\n                }\n                ${icon_right && `<nb-icon icon='${icon_right}'></nb-icon>`}\n        `\n        this.innerHTML = element.outerHTML\n\n        this.removeListeners()\n        this.addListeners()\n    }\n\n    handleClick() {\n        if (this.props.disableTracking === false) {\n            this.track()\n        }\n\n        const { event_id = '', popin_id = '', qs_id = '' } = this.props\n\n        if (event_id) {\n            EventBus.fire(event_id, {})\n        }\n        if (popin_id) {\n            this.popin(popin_id)\n        }\n        if (qs_id) {\n            this.openQuantitySelector(qs_id)\n        }\n    }\n\n    popin(popin_id) {\n        dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: popin_id } })\n    }\n\n    openQuantitySelector(qs_id) {\n        dispatchEvent({ eventName: EVENT_QS_OPEN, args: { id: qs_id } })\n    }\n\n    track() {\n        const {\n            campaign_id = '',\n            campaign_name = '',\n            campaign_position = '',\n            campaign_creative = '',\n            campaign_instance_index = '',\n            tracking_list,\n            label,\n            popin_id = '',\n            tracking_slot_prefix = '',\n            sku_data = ''\n        } = this.props\n\n        const campaign = {\n            id: campaign_id,\n            name: campaign_name,\n            position: campaign_position,\n            creative: campaign_creative\n        }\n\n        const ctaOrPopin = popin_id ? 'POPIN' : 'CTA'\n        const slot = this.slot ? this.slot : label\n        const slotContent = `${tracking_slot_prefix}${slot}`\n        const instanceIndex = campaign_instance_index ? ` - ${campaign_instance_index}` : ''\n        const tabbedComponentStatus = JSON.parse(this.props?.tabbed_component ?? 'false')\n\n        let cta_name_value = tabbedComponentStatus\n            ? `${ctaOrPopin + instanceIndex} - ${\n                  this.props.long_sku.split('/')[2]\n              } - ${slotContent}`\n            : `${ctaOrPopin + instanceIndex} - ${slotContent}`\n\n        handlePromoClick({\n            campaign,\n            cta_name: cta_name_value\n        })\n\n        if (popin_id && sku_data) {\n            const product = JSON.parse(sku_data)\n            const componentName =\n                tracking_list.indexOf(' - ') > -1 ? tracking_list.split(' - ')[0] : tracking_list\n            trackComponentInteraction({\n                creative: this.props.campaign_creative ?? '',\n                actionType: componentName.toLowerCase() + ' quick view',\n                internationalId: product.internationalId,\n                internationalName: product.internationalName,\n                productType: product.type,\n                technology: product.technology,\n                category: product.category,\n                rawPrice: product.rawPrice,\n                eventAction: componentName + ' Quick View'\n            })\n        }\n    }\n\n    attributeChangedCallback(name) {\n        if (name === 'slot') {\n            this.render()\n        }\n        if (name === 'quantity') {\n            this.classList.add('updated')\n            setTimeout(() => {\n                this.classList.remove('updated')\n            }, TIME_SLOW)\n        }\n    }\n\n    addListeners() {\n        this.addEventListener('click', this.boundHandleClick)\n    }\n\n    removeListeners() {\n        this.removeEventListener('click', this.boundHandleClick)\n    }\n\n    disconnectedCallback() {\n        this.removeListeners()\n    }\n}\n\ncustomElements.get('nb-cta') || customElements.define('nb-cta', Cta)\n\nexport default Cta\n","/**\n * We removed duplicated values to improve the performances\n * Here are original values :\n * small: 16, 24, 32, 36, 48, 64, 72, 96, 108, 120, 128, 144, 150, 180, 192, 216, 225, 240, 288, 300, 360, 384, 450, 480, 600\n * medium: 180, 240, 270, 360, 450, 480, 512, 540, 600, 675, 720, 768, 800, 900, 960, 1000, 1024, 1080, 1200, 1350, 1440, 1500, 1536, 1600, 1800, 2000, 2048, 2400, 3000, 3200, 4000\n * large: 640, 720, 800, 960, 1024, 1080, 1200, 1280, 1440, 1536, 1600, 1920, 2048, 2160, 2400, 2560, 2880, 3072, 3200, 3840, 4096\n * product: 45, 50, 58, 60, 65, 90, 100, 120, 130, 135, 150, 174, 180, 195, 200, 230, 232, 240, 260, 300, 360, 400, 450, 460, 480, 600, 690, 720, 800, 900, 960, 1200\n *\n * Useful documentation:\n * IT documentation on IM Policy (Image Manager Policy) profiles and resolutions: https://dsu-confluence.nestle.biz/x/XAYoC\n * Our IM Policy documentation: https://dsu-confluence.nestle.biz/x/zQjrCg\n * Our IM Policy study on page builder sections: https://dsu-confluence.nestle.biz/x/1tb3Cg\n */\n\nexport const LAZYLOAD_CUSTOM = 'custom'\nexport const LAZYLOAD_NATIVE = 'native'\n\nexport const PROFILES = [\n    {\n        name: 'small',\n        sizes: [\n            16, 24, 32, 36, 48, 64, 72, 96, 108, 120, 128, 144, 150, 180, 192, 216, 225, 240, 288,\n            300, 360, 384, 450, 480, 600\n        ]\n    },\n    {\n        name: 'medium',\n        sizes: [\n            270, 512, 540, 675, 720, 768, 800, 900, 960, 1000, 1024, 1080, 1200, 1350, 1440, 1500,\n            1536, 1600, 1800, 2000, 2048, 2400, 3000, 3200, 4000\n        ]\n    },\n    {\n        name: 'large',\n        sizes: [640, 1280, 1920, 2160, 2560, 2880, 3072, 3840, 4096]\n    },\n    {\n        name: 'product',\n        sizes: [\n            45, 50, 58, 60, 65, 90, 100, 130, 135, 174, 195, 200, 230, 232, 260, 300, 400, 460, 690\n        ]\n    }\n]\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport { lazyLoad } from '@kissui/helpers/src/utils'\nimport { PROFILES, LAZYLOAD_CUSTOM, LAZYLOAD_NATIVE } from './js/constants'\n\n/** IMAGE COMPONENT\n * Important prerequisite!\n * For the ImPolicy and CLS we need to assume that the width of the component is set by the parent component\n *\n * IM Policy annoying behaviour:\n * Also IM Policy is returning in some cases more than 2x images (based in device pixel density auto detection e.g. Iphone 11 pro returns x3)\n * We don't want this behaviour so we need to force x1 by adding an extra param &imdensity=1\n *\n * @Params\n * - file: path of your image\n * - description: img alt description. If empty, set alt='image' to avoid A11y errors + aria-hidden=\"true\" because we assume it's a decorative image\n *   (we don't use alt='' because if void it does not allow the error message to be displayed, not creating :before and :after pseudo element on img)\n * - aspect_ratio: (default 1:1) is managing the CLS including a blinking animation\n * - force_width: use this if for any reason you need to force the image width to ask to akamai (e.g. image cropped on both sides like in card-lifestyle tablet)\n * - force_height: use this if in the layout you cannot rely on width but in height\n * - lazyload: (default custom / native / no) is managing fadein animation + error message\n * - impolicy: (default true) is checking automatically the right profile and 'real' end resolution\n * - placeholder_color_light: (default black_100) is the lighter color for CLS animation\n * - placeholder_color_dark: (default black_250) is the darker color for CLS animation\n * - object-fit: (default: cover) use 'contain' instead (applys object-fit: contain on img) if you want to image to be displayed always fully\n *   like in sku component, where the product image have different original aspect_ratio, we want to display always the full product\n */\n\nclass Img extends HTMLElement {\n    constructor() {\n        super()\n    }\n\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.render()\n        this.#initLazyLoad()\n    }\n\n    #initLazyLoad() {\n        if (this.lazyload !== LAZYLOAD_CUSTOM) {\n            return\n        }\n        const callbackSuccess = () => {\n            this.classList.remove('loading')\n        }\n\n        lazyLoad(this.firstElementChild, 'src', `${this.file}`, this.file, { callbackSuccess })\n    }\n\n    render() {\n        const {\n            file = '',\n            description = '',\n            lazyload = LAZYLOAD_CUSTOM,\n            fetchpriority = ''\n        } = this.props\n\n        if (file === '') {\n            return\n        }\n\n        // Set properties used elsewhere in component\n        this.lazyload = lazyload\n        this.file = file + this.#setImPolicyQuery()\n\n        this.#setCssProperties()\n        this.classList.add('nb-img')\n        this.innerHTML = `\n            <img\n                ${this.lazyload === LAZYLOAD_CUSTOM ? 'src=\"\"' : `src=\"${this.file}\"`}\n                ${description !== '' ? `alt=\"${description}\"` : 'alt=\"image\" aria-hidden=\"true\"'}\n                ${this.lazyload === LAZYLOAD_NATIVE ? 'loading=\"lazy\"' : ''}\n                ${fetchpriority !== '' ? `fetchpriority=${fetchpriority}` : ''}\n                class=\"loading\"\n             />`\n        // Get this element's first class\n        this.parentClass = this.getAttribute('class').split(' ')[0]\n\n        // Add that previous class + a suffix to its first child\n        if (this.parentClass !== '') {\n            this.firstElementChild.classList.add(this.parentClass + '-content')\n        }\n    }\n\n    #setImPolicyQuery() {\n        const { aspect_ratio, force_width, force_height, impolicy = true } = this.props\n\n        if (impolicy === 'false') {\n            return ''\n        }\n\n        let width = this.offsetWidth\n\n        if (force_width && force_width !== '') {\n            width = Number(force_width)\n        }\n\n        if (force_height && force_height !== '') {\n            const [w, h] = aspect_ratio.split('/')\n            width = Math.round((Number(force_height) * w) / h)\n        }\n\n        let finalWidth = this.#getRetinaWidth(width)\n\n        const impolicy_profil = this.#getImpolicyProfile(finalWidth)\n\n        return `?impolicy=${impolicy_profil}&imwidth=${finalWidth}&imdensity=1`\n    }\n\n    #getRetinaWidth(width) {\n        const { devicePixelRatio } = window\n        return devicePixelRatio > 1 ? width * 2 : width\n    }\n\n    #getImpolicyProfile(width) {\n        const { exactFound, closests } = this.#getClosests(width)\n\n        if (exactFound) {\n            return exactFound.name\n        } else {\n            let tempDiff = closests[0].diff\n            let closest = null\n            closests.forEach(item => {\n                if (item.diff <= tempDiff) {\n                    tempDiff = item.diff\n                    closest = item\n                }\n            })\n            return closest.name\n        }\n    }\n\n    #getClosests(width) {\n        let exactFound = null\n        let closests = []\n        PROFILES.every(profile => {\n            const found = profile.sizes.find(el => el >= width)\n\n            if (found) {\n                if (found === width) {\n                    exactFound = profile\n                    return false\n                }\n\n                closests.push({ name: profile.name, diff: found - width })\n            }\n\n            return true\n        })\n        return { exactFound, closests }\n    }\n\n    #setCssProperties() {\n        const {\n            aspect_ratio,\n            object_fit,\n            placeholder_color_light,\n            placeholder_color_dark,\n            error_message\n        } = this.props\n\n        this.#setCssProperty('--image-aspect-ratio', aspect_ratio)\n        this.#setCssProperty('--image-object-fit', object_fit)\n        this.#setCssProperty('--image-placeholder-color-light', placeholder_color_light)\n        this.#setCssProperty('--image-placeholder-color-dark', placeholder_color_dark)\n        this.#setCssProperty('--image-placeholder-error-text', '\"' + error_message + '\"')\n    }\n\n    #setCssProperty(name, value) {\n        if (!value || value === '\"undefined\"') {\n            return\n        }\n\n        this.style.setProperty(name, value)\n    }\n}\n\ncustomElements.get('nb-img') || customElements.define('nb-img', Img)\n\nexport default Img\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport {\n    handlePromoClick,\n    productClick,\n    trackComponentInteraction\n} from '@kissui/helpers/src/gtmEvents'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { EVENT_POPIN_OPEN, EVENT_QUICKVIEW_OPEN } from '../constants.mjs'\nimport { getLangCode, getMarketCode } from '@kissui/helpers/src/dataLayer'\n\nclass Link extends HTMLElement {\n    constructor() {\n        super()\n        this.slot = this.innerHTML\n        this.boundHandleClick = this.handleClick.bind(this)\n        this.market = getMarketCode()\n        this.language = getLangCode()\n    }\n\n    connectedCallback() {\n        this.props = {\n            ...createProps(this.attributes),\n            disableTracking: this.hasAttribute('data-disabletracking')\n        }\n        this.render()\n        this.setClassHelper()\n        this.bindEvents()\n    }\n\n    render() {\n        const {\n            size = 'large',\n            color = 'gold',\n            link = '',\n            icon_right = '',\n            icon_left = '',\n            image = '',\n            image_alt = ''\n        } = this.props\n\n        // Todo : can we get rid of this setAttributes, it's only needed because stories are using data\n        size && this.setAttribute('size', size)\n        color && this.setAttribute('color', color)\n        image && this.setAttribute('image', image)\n        image_alt && this.setAttribute('image_alt', image_alt)\n        icon_left && this.setAttribute('icon_left', icon_left)\n        icon_right && this.setAttribute('icon_right', icon_right)\n\n        if (link === '') {\n            this.renderButton()\n        } else {\n            this.renderLink()\n        }\n\n        this.link = this.firstElementChild\n    }\n\n    renderLink() {\n        const {\n            label,\n            seo_label = '',\n            tracking_label = '',\n            link_new_tab = 'false',\n            a11y_label_new_tab = '',\n            icon_right = '',\n            image = '',\n            image_alt = '',\n            icon_left = '',\n            selected = '',\n            phantom = ''\n        } = this.props\n        let { link } = this.props\n\n        const slot = this.slot ? this.slot : label\n\n        if (link) {\n            link = link.replace('{market}', this.market)\n            link = link.replace('{lang}', this.language)\n        }\n\n        this.innerHTML = `\n        <a\n            href=\"${link}\"\n            ${link_new_tab === 'true' ? 'target=\"_blank\"' : ''}\n            ${\n                link_new_tab === 'true' && a11y_label_new_tab !== ''\n                    ? `aria-description='${a11y_label_new_tab}'`\n                    : ''\n            }\n            ${tracking_label && `tracking_label='${tracking_label}'`}\n            ${seo_label ? `title=\"${seo_label}\"` : ''}\n            ${slot ? `aria-label=\"${slot}\"` : ''}\n            ${selected === 'true' ? 'aria-current=\"true\"' : ''}\n            ${phantom === 'true' ? `phantom=\"${slot}\"` : ''}\n        >\n            ${icon_left && `<nb-icon icon='${icon_left}'></nb-icon>`}\n            ${image && `<img src='${image}' alt='${image_alt}'/>`}\n            <span>${slot}</span>\n            ${icon_right && `<nb-icon icon='${icon_right}'></nb-icon>`}\n        </a>`\n    }\n\n    renderButton() {\n        const {\n            label,\n            tracking_label = '',\n            icon_right = '',\n            icon_left = '',\n            selected = '',\n            image = '',\n            image_alt = '',\n            phantom = ''\n        } = this.props\n\n        const slot = this.slot ? this.slot : label\n\n        this.innerHTML = `\n        <button\n            ${tracking_label && `tracking_label='${tracking_label}'`}\n            ${selected === 'true' ? 'aria-selected=\"true\"' : ''}\n            ${phantom === 'true' ? `phantom=\"${slot}\"` : ''}\n        >\n            ${image && `<img src='${image}' alt='${image_alt}'/>`}\n            ${icon_left && `<nb-icon icon='${icon_left}'></nb-icon>`}\n            <span>${slot}</span>\n            ${icon_right && `<nb-icon icon='${icon_right}'></nb-icon>`}\n        </button>`\n    }\n\n    setClassHelper() {\n        const { size = 'large', cta_link_type = 'false' } = this.props\n        let sizeClass = ''\n\n        switch (size) {\n            case 'xsmall':\n                sizeClass = 't-2xs-500-sl'\n                break\n            case 'small':\n                sizeClass = 't-xs-500-sl'\n                break\n            case 'medium':\n                sizeClass = 't-sm-400-sl'\n                break\n            case 'large':\n                sizeClass = 't-sm-700-sl'\n                break\n            default:\n                sizeClass = 't-sm-700-sl'\n                break\n        }\n\n        if (cta_link_type === 'true') {\n            sizeClass = 't-sm-700-sl'\n            this.setAttribute('underline', 'false')\n        }\n\n        this.querySelector('a, button').classList.add(sizeClass)\n    }\n\n    handleClick() {\n        if (this.props.disableTracking === false) {\n            this.track()\n        }\n\n        const {\n            popin_id = '',\n            sku = '',\n            tracking_position = '',\n            tracking_list = '',\n            sku_colors\n        } = this.props\n\n        if (popin_id && sku) {\n            this.quickView(popin_id, sku, tracking_position, tracking_list, sku_colors)\n            return\n        }\n\n        if (popin_id) {\n            this.popin(popin_id)\n        }\n    }\n\n    popin(popin_id) {\n        dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: popin_id } })\n    }\n\n    quickView(popin_id, sku, tracking_position, tracking_list, colors) {\n        const { sku_data } = this.props\n\n        dispatchEvent({\n            eventName: EVENT_QUICKVIEW_OPEN,\n            args: {\n                sku_colors: colors,\n                id: popin_id,\n                sku: sku,\n                tracking_position: tracking_position,\n                tracking_list: tracking_list\n            }\n        })\n\n        if (sku_data) {\n            const product = JSON.parse(sku_data)\n            const componentName =\n                tracking_list.indexOf(' - ') > -1 ? tracking_list.split(' - ')[0] : tracking_list\n            trackComponentInteraction({\n                creative: this.props.campaign_creative ?? '',\n                actionType: componentName.toLowerCase() + ' quick view',\n                internationalId: product.internationalId,\n                internationalName: product.internationalName,\n                productType: product.type,\n                technology: product.technology,\n                category: product.category,\n                rawPrice: product.rawPrice,\n                eventAction: componentName + ' Quick View'\n            })\n        }\n    }\n\n    track() {\n        const {\n            campaign_id = '',\n            campaign_name = '',\n            campaign_position = '',\n            campaign_creative = '',\n            campaign_instance_index = '',\n            label,\n            popin_id = '',\n            long_sku = '',\n            tracking_list = '',\n            tracking_position = ''\n        } = this.props\n\n        const campaign = {\n            id: campaign_id,\n            name: campaign_name,\n            position: campaign_position,\n            creative: campaign_creative\n        }\n\n        const linkOrPopin = popin_id ? 'POPIN' : 'LINK'\n        const slot = this.slot ? this.slot : label\n        // value 0 is accepted as we need to pass the index\n        const instanceIndex =\n            campaign_instance_index || campaign_instance_index === 0\n                ? ` - ${campaign_instance_index}`\n                : ''\n\n        if (tracking_list && tracking_position) {\n            productClick(tracking_position, tracking_list, long_sku)\n        } else {\n            handlePromoClick({\n                campaign,\n                cta_name: `${linkOrPopin + instanceIndex} - ${slot.trim()}`\n            })\n        }\n    }\n\n    bindEvents() {\n        this.unbindEvents()\n        this.link.addEventListener('click', this.boundHandleClick)\n    }\n\n    unbindEvents() {\n        this.link.removeEventListener('click', this.boundHandleClick)\n    }\n\n    disconnectedCallback() {\n        this.unbindEvents()\n    }\n}\n\ncustomElements.get('nb-link') || customElements.define('nb-link', Link)\n\nexport default Link\n","import { viewPromotion } from '@kissui/helpers/src/gtmEvents'\n\nexport default class {\n    constructor(node, data) {\n        this.observer = new IntersectionObserver(\n            IntersectionObserverEntry => this.onChange(IntersectionObserverEntry),\n            { threshold: [0], rootMargin: '0% 0%' }\n        )\n\n        this.el = node\n        this.data = data\n\n        if (!(this.el instanceof Element)) {\n            return\n        }\n\n        this.observer.observe(this.el)\n    }\n\n    /**\n     * Check if element are in the viewport\n     * @param {Array} observables\n     * @param {HTMLElement} observables.target\n     * @param {Boolean} observables.isIntersecting\n     */\n    onChange(observables) {\n        observables.forEach(observable => {\n            if (!observable.isIntersecting) {\n                return\n            }\n\n            this.track(observable)\n            this.observer.unobserve(observable.target)\n        })\n    }\n\n    track() {\n        // This line is needed to make the code compatible with Safari <=13\n        if ('requestIdleCallback' in window) {\n            window.requestIdleCallback(() => this.runTrack())\n        } else {\n            window.setTimeout(() => this.runTrack(), 1)\n        }\n    }\n\n    runTrack() {\n        if (!this.data['id'] || this.data['id'] === null || this.data['id'] === '') {\n            return\n        }\n        viewPromotion({ ...this.data })\n    }\n}\n","import Viewport from './viewportTracking'\nimport { viewPromotion } from '@kissui/helpers/src/gtmEvents'\nimport { isObjectEmpty, removeEmptyValues } from '@kissui/helpers/src/utils'\n\nexport default function (node, campaign) {\n    const tracking = new ZoneTracking(node, campaign)\n\n    return {\n        destroy: () => {\n            if (!tracking.getIom().hasIntersectionObserver()) {\n                tracking.destroy()\n            }\n        }\n    }\n}\n\nclass ZoneTracking extends Viewport {\n    constructor(node, data) {\n        super(node)\n        this.data = data\n    }\n\n    runTrack() {\n        const cleanedData = removeEmptyValues(this.data)\n        if (cleanedData && !isObjectEmpty(cleanedData)) {\n            viewPromotion({ ...cleanedData })\n        }\n    }\n}\n","import zoneTracking from '@kissui/helpers/src/assets/js/zoneTracking'\nimport { lazyLoad } from '@kissui/helpers/src/utils'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\n\nclass Container extends HTMLElement {\n    constructor() {\n        super()\n        this.slot = this.innerHTML\n    }\n\n    connectedCallback() {\n        this.props = [...this.attributes].reduce((all, attr) => {\n            return { ...all, [attr.nodeName]: attr.nodeValue }\n        }, {})\n        this.render()\n        this.initTracking()\n        this.initLazyLoad()\n    }\n\n    initTracking() {\n        const {\n            campaign_id = null,\n            campaign_name = null,\n            campaign_position = null,\n            campaign_creative = null\n        } = this.props\n        zoneTracking(this, {\n            id: campaign_id,\n            name: campaign_name,\n            position: campaign_position,\n            creative: campaign_creative\n        })\n    }\n\n    initLazyLoad() {\n        const el = this.querySelector('.cb-bg-img')\n        if (!el) {\n            return\n        }\n\n        const url = this.getBgImgUrl()\n        if (!url) {\n            return\n        }\n\n        const { lazy_load } = this.props\n        if (lazy_load === 'false') {\n            el.setAttribute('style', `background-image: url(${url})`)\n            return\n        }\n\n        lazyLoad(\n            el,\n            'style',\n            `background-image: url(${url}); ${el.getAttribute('style') || ''}`,\n            url\n        )\n    }\n\n    getBgImgUrl() {\n        const {\n            background_mobile = '',\n            background_tablet = '',\n            background_desktop = '',\n            background_retina = ''\n        } = this.props\n\n        let url = ''\n        if (viewportHelper.is.mobile && background_mobile) {\n            url = background_mobile\n        } else if (viewportHelper.is.tablet && background_tablet) {\n            url = background_tablet\n        } else if ((viewportHelper.is.retina || viewportHelper.is.tablet) && background_retina) {\n            url = background_retina\n        } else if (\n            (viewportHelper.is.desktop || viewportHelper.is.retina || viewportHelper.is.tablet) &&\n            background_desktop\n        ) {\n            url = background_desktop\n        }\n\n        return url\n    }\n\n    render() {\n        const {\n            styles = '',\n            contrast,\n            background_color = '',\n            classname = '',\n            element_class = '',\n            slot\n        } = this.props\n\n        // Fix for undefined contrast (contrast is needed for background-color to work)\n        let contrastDefault = 'light'\n        if (contrast === 'undefined') {\n            this.setAttribute('contrast', contrastDefault)\n        } else {\n            contrastDefault = contrast\n        }\n\n        this.innerHTML = `\n            <section\n                class=\"${classname}\"\n                contrast=\"${contrastDefault}\"\n                style=\"${styles}\"\n            >\n                ${background_color || this.hasBgImage() ? this.renderBg() : ''}\n                <div class=\"cb-inner ${element_class}\">\n                    ${slot}\n                </div>\n            </section>`\n    }\n\n    hasBgImage() {\n        const { background_mobile: m, background_desktop: d, background_retina: r } = this.props\n        return !!m || !!d || !!r\n    }\n\n    renderBg() {\n        const { background_color = '' } = this.props\n\n        return `<div class=\"cb-bg-color ${background_color ? background_color : ''}\">\n        </div>${this.hasBgImage() ? '<div class=\"cb-bg-img\"></div>' : ''}`\n    }\n}\n\ncustomElements.get('nb-container') || customElements.define('nb-container', Container)\n\nexport default Container\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport { makeHash } from '@kissui/helpers/src/utils'\nimport { selectPromotion } from '@kissui/helpers/src/gtmEvents'\n\nclass Chip extends HTMLElement {\n    constructor() {\n        super()\n        this.slot = this.innerHTML\n        this.checkbox = null\n    }\n\n    static get observedAttributes() {\n        return ['disabled', 'checked']\n    }\n\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.computedSlot = this.computeSlot()\n        this.render()\n        this.initTracking()\n    }\n\n    initTracking() {\n        const { campaign_id, campaign_name, campaign_creative, campaign_position } = this.props\n\n        const link = this.querySelector('label')\n\n        if (link) {\n            link.onclick = () => {\n                selectPromotion({\n                    cta_name: this.computedSlot,\n                    id: campaign_id,\n                    name: campaign_name,\n                    creative: campaign_creative,\n                    position: campaign_position\n                })\n            }\n        }\n    }\n\n    computeSlot() {\n        const { content } = this.props\n        return (this.slot ? this.slot : content).trim()\n    }\n\n    render() {\n        const {\n            icon = '',\n            color = '',\n            background_image = '',\n            filter_label_AA = 'filter',\n            rounded = 'true',\n            checked = 'false',\n            disabled = 'false',\n            id,\n            type = 'checkbox'\n        } = this.props\n\n        const slot = this.computedSlot\n        let style = ''\n\n        const checkedAttr = checked === 'true' ? 'checked' : ''\n        const disabledAttr = disabled === 'true' ? 'disabled' : ''\n        const inputId = 'chip-checkbox-' + (id || makeHash(slot))\n\n        this.innerHTML = `\n            <input type='${type}' name='options' id='${inputId}' aria-label='${slot} ${filter_label_AA}' ${checkedAttr} ${disabledAttr}>\n            <label style='${style}' for='${inputId}'>\n                ${\n                    icon &&\n                    `<nb-icon icon='${icon}'></nb-icon>\n                `\n                }\n                ${\n                    color &&\n                    `<div class='chip-color' style='background:${color}'></div>\n                `\n                }\n                ${\n                    background_image &&\n                    `<div class='chip-image ${\n                        rounded === 'true' ? 'rounded' : ''\n                    }' style='background-image:url(\"${background_image}\")'></div>\n                `\n                }\n                <span class=\"t-2xs-700-sl\" aria-hidden=\"true\" phantom=\"${slot}\">${slot}</span>\n            </label>\n        `\n\n        this.checkbox = this.getElementsByTagName('input')[0]\n    }\n\n    attributeChangedCallback(name, _, newValue) {\n        if (!this.checkbox) {\n            return\n        }\n\n        if (name === 'disabled') {\n            this.checkbox.disabled = newValue === 'true'\n        } else if (name === 'checked') {\n            this.checkbox.checked = newValue === 'true'\n        }\n    }\n}\n\ncustomElements.get('nb-chip') || customElements.define('nb-chip', Chip)\n\nexport default Chip\n","export function recursiveSwitchAriaHidden(elem, componentOpenState) {\n    const parent = elem.parentNode\n    const body = document.getElementsByTagName('body')[0]\n\n    if (parent === body) {\n        return\n    }\n\n    const brothers = parent.children\n    for (const brother of brothers) {\n        if (brother !== elem) {\n            componentOpenState\n                ? brother.setAttribute('aria-hidden', componentOpenState)\n                : brother.removeAttribute('aria-hidden')\n        }\n    }\n    recursiveSwitchAriaHidden(parent, componentOpenState)\n}\n\nexport function focusin(e, el, loop) {\n    if (!el.contains(e.target)) {\n        if (el.lastFocused === el.firstFocusable) {\n            loop ? el.lastFocusable.focus() : el.firstFocusable.focus()\n        } else {\n            loop ? el.firstFocusable.focus() : el.lastFocusable.focus()\n        }\n    } else {\n        el.lastFocused = e.target\n    }\n}\n\nexport function setFirstAndLastFocusable(el) {\n    const focusable = el.querySelectorAll('button, [href], input, select, textarea, [tabindex=\"0\"]')\n    el.firstFocusable = focusable[0]\n    el.lastFocusable = focusable[focusable.length - 1]\n    el.lastFocused = el.firstFocusable\n}\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport {\n    recursiveSwitchAriaHidden,\n    setFirstAndLastFocusable,\n    focusin\n} from '@kissui/helpers/src/assets/js/scopedKeyboardNav'\nimport { EVENT_SORT_BY_CHANGE, EVENT_POPIN_KEY_DOWN } from '@kissui/components'\n\nclass Dropdown extends HTMLElement {\n    constructor() {\n        super()\n        this.isOpen = false\n        this.selected = null\n        this.buttonElement = null\n        this.onClickOutside = this.onClickOutside.bind(this)\n    }\n\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.classList.add('nb-dropdown')\n        this.render()\n    }\n\n    render() {\n        this.buttonElement = null\n        const { label = '', aa_description } = this.props\n        let { options = [], element_id, element_name } = this.props\n\n        // Accept Selected and Checked as option setter\n        options = options.map(option => {\n            const payload = { ...option }\n            payload.checked = payload.checked || payload.selected\n\n            return payload\n        })\n\n        this.unbindEvent()\n\n        this.innerHTML = `\n            <button\n                class='nb-dropdown__button'\n                aria-haspopup=\"listbox\"\n                aria-expanded=\"${this.isOpen}\"\n                aria-label=\"${label} ${options && this.renderSelected()}\"\n                ${aa_description !== '' ? `aria-description=\"${aa_description}\"` : ''}>\n                    <span class=\"nb-dropdown__button__label t-sm-700-sl\">${label}</span>\n                    <span class=\"nb-dropdown__button__value t-xs-500-sl\"\n                    ${element_id ? `name=\"${element_id}\"` : ''}\n                    value=\"${options && this.renderSelected()}\">\n                    </span>\n                </button>\n            <div class=\"nb-dropdown__menu\" ${element_name ? `id=\"${element_name}\"` : ''}>\n                <div role=\"listbox\">\n                    <ul>\n                        ${options && options.length > 0 && this.renderOptions()}\n                    </ul>\n                </div>\n            </div>\n        `\n        this.buttonElement = this.querySelector('.nb-dropdown__button')\n        this.buttonElementValue = this.querySelector('.nb-dropdown__button__value')\n        this.dropdownMenu = this.querySelector('.nb-dropdown__menu > div')\n        this.selectedOption = this.querySelector('button[aria-selected=true]')\n        if (!this.selected) {\n            this.selected = options[0]\n        }\n        setFirstAndLastFocusable(this.dropdownMenu)\n        this.bindEvent()\n    }\n\n    // Render <BUTTON> tags for the custom select, <BUTTON> is better than <RADIOBUTTONS> for keyboard navigation users in this case\n    renderOptions() {\n        const {\n            label,\n            aa_listbox_description,\n            aa_select_description,\n            icon_option,\n            options = []\n        } = this.props\n        return options\n            .map(option => {\n                return `<li>\n                    <button\n                        class=\"${viewportHelper.is.mobile ? 't-sm-400-sl' : 't-xs-500-sl'}\"\n                        role=\"option\"\n                        aria-label='${label + ' ' + option.label}'\n                        value='${option.id ?? option.label}'\n                        aria-selected='${option.checked}'\n                        ${option.link ? `data-link='${option.link}'` : ''}\n                        ${\n                            option.checked\n                                ? aa_listbox_description !== undefined &&\n                                  `aria-description=\"${aa_listbox_description}\"`\n                                : aa_select_description !== undefined &&\n                                  `aria-description=\"${aa_select_description}\"`\n                        }>\n                    ${icon_option && `<nb-icon icon='${icon_option}'></nb-icon>`} ${option.label}\n                    </button>\n                </li>`\n            })\n            .join('')\n    }\n\n    // Render the selected option to display in the main button of the PLP Filter Bar\n    renderSelected() {\n        const { options = [] } = this.props\n        const currentOption = options.find(\n            option => option.checked === true || option.selected === true\n        )\n        return `${currentOption?.label || options[0]?.label}`\n    }\n\n    bindEvent() {\n        this.boundHandleClick = this.handleClick.bind(this)\n        this.boundHandleLabelClick = this.handleLabelClick.bind(this)\n        this.boundHandleMobileClose = this.handleMobileClose.bind(this)\n        this.boundFocus = this.focus.bind(this)\n        this.boundFocusin = this.focusin.bind(this)\n        this.boundKeyNav = this.keyNav.bind(this)\n\n        this.buttonElement.addEventListener('click', this.boundHandleClick)\n        this.querySelectorAll('.nb-dropdown__menu button').forEach(item => {\n            item.addEventListener('click', this.boundHandleLabelClick)\n        })\n        this.dropdownMenu.addEventListener('click', this.boundHandleMobileClose)\n        window.addEventListener('click', this.onClickOutside)\n    }\n\n    unbindEvent() {\n        if (!this.buttonElement) {\n            return\n        }\n        this.buttonElement.removeEventListener('click', this.boundHandleClick)\n        this.querySelectorAll('.nb-dropdown__menu button').forEach(item => {\n            item.removeEventListener('click', this.boundHandleLabelClick)\n        })\n        this.dropdownMenu.removeEventListener('click', this.boundHandleMobileClose)\n        window.removeEventListener('click', this.onClickOutside)\n        document.removeEventListener(EVENT_POPIN_KEY_DOWN, this.boundKeyNav)\n    }\n\n    handleClick() {\n        this.toogleDropdown(!this.isOpen)\n    }\n\n    handleMobileClose() {\n        this.toogleDropdown(false)\n    }\n\n    onClickOutside(e) {\n        if (this.isOpen && !this.contains(e.target)) {\n            this.toogleDropdown(false)\n        }\n    }\n\n    handleLabelClick(e) {\n        this.isOpen = false\n\n        // Unpress active button\n        if (this.selectedOption) {\n            this.selectedOption.setAttribute('aria-selected', 'false')\n        }\n\n        /*\n        * TODO CHECK WITH THOMAS\n        const activeButton = this.querySelector('button[aria-pressed=true]')\n        const activeLink = activeButton.getAttribute('data-link')\n        if (activeLink) {\n            window.location.href = activeLink\n            return null\n        }\n        activeButton.setAttribute('aria-pressed', 'false')\n        * */\n\n        // Activate pressed option\n        this.selectedOption = e.target\n        this.selectedOption.setAttribute('aria-selected', 'true')\n\n        // Reset all checked attributes to false / Destroy the object and build it again\n        this.props.options = this.props.options.map(option => ({ ...option, checked: false }))\n\n        // Search the option to be updated and assign the new value\n        this.selected = this.props.options.find(\n            option => option.label === this.selectedOption.value\n        )\n        this.selected.checked = true\n        e.target.closest('.nb-dropdown').classList.add('nb-dropdown--is-filled')\n\n        this.reRender()\n\n        this.toogleDropdown(false)\n\n        dispatchEvent({\n            eventName: EVENT_SORT_BY_CHANGE,\n            args: { options: this.props.options, selected: this.selected },\n            element: this\n        })\n    }\n\n    reRender() {\n        const { label, aa_listbox_description, aa_select_description } = this.props\n        this.buttonElementValue.setAttribute('value', this.selectedOption.value)\n        this.buttonElement.setAttribute('aria-label', label + ' ' + this.renderSelected())\n        this.dropdownMenu.querySelectorAll('button').forEach(item => {\n            item.setAttribute('aria-description', aa_select_description)\n        })\n        this.selectedOption.setAttribute('aria-description', aa_listbox_description)\n    }\n\n    setSelected(value, dispatchChange = false) {\n        const { options = [] } = this.props\n        const tmpSelected = options.find(option => option.value === value)\n        if (tmpSelected) {\n            this.selected.checked = false\n            this.selected = tmpSelected\n            this.selected.checked = true\n        }\n\n        if (this.selectedOption) {\n            this.selectedOption.setAttribute('aria-selected', 'false')\n        }\n\n        this.dropdownMenu.querySelectorAll('button').forEach(item => {\n            if (item.value === this.selected.label) {\n                this.selectedOption = item\n                this.selectedOption.setAttribute('aria-selected', 'true')\n            }\n        })\n\n        this.classList.add('nb-dropdown--is-filled')\n\n        if (this.selectedOption) {\n            this.reRender()\n        }\n\n        if (dispatchChange) {\n            dispatchEvent({\n                eventName: EVENT_SORT_BY_CHANGE,\n                args: { options, selected: this.selected },\n                element: this\n            })\n        }\n    }\n\n    toogleDropdown(value) {\n        value ? this.open() : this.close()\n        this.isOpen = !this.isOpen\n\n        // Open and Close shared actions\n        this.switchAriaModal()\n        this.buttonElement.setAttribute('aria-expanded', this.isOpen)\n    }\n\n    switchAriaModal() {\n        // This is the future way to scope the SR focus to a modal, but it's not supported yet by all SR\n        this.dropdownMenu.setAttribute('aria-modal', this.isOpen)\n        // So we need to set aria-hidden=false to all brothers and brothers of parent until body\n        recursiveSwitchAriaHidden(this.dropdownMenu, this.isOpen)\n    }\n\n    open() {\n        // Transitionend listener is fired multiple times (fore each css property)\n        // so we need to instanciate it only when we open or close and then we remove it on focusin\n        this.dropdownMenu.addEventListener('transitionend', this.boundFocus)\n        document.addEventListener('focusin', this.boundFocusin)\n        document.addEventListener(EVENT_POPIN_KEY_DOWN, this.boundKeyNav)\n        this.buttonElement.classList.add('isOpen')\n        this.openingSource = document.activeElement\n    }\n\n    close() {\n        // Transitionend listener is fired multiple times (fore each css property)\n        // so we need to instantiate it only when we open or close and then we remove it on focusin\n        this.dropdownMenu.addEventListener('transitionend', this.boundFocus)\n        document.removeEventListener('focusin', this.boundFocusin)\n        document.removeEventListener(EVENT_POPIN_KEY_DOWN, this.boundKeyNav)\n        this.buttonElement.classList.remove('isOpen')\n        this.buttonElement.setAttribute('aria-expanded', false)\n    }\n\n    focus() {\n        this.dropdownMenu.removeEventListener('transitionend', this.boundFocus)\n        if (this.isOpen && this.selectedOption) {\n            this.selectedOption.focus()\n            this.dropdownMenu.lastFocused = this.selectedOption\n        } else {\n            this.buttonElement.focus()\n        }\n    }\n\n    focusin(e) {\n        const loop = false\n        focusin(e, this.dropdownMenu, loop)\n    }\n\n    keyNav(e) {\n        switch (e.key) {\n            case 'Escape':\n                this.toogleDropdown(false)\n                break\n            case 'ArrowUp':\n                e.preventDefault()\n                this.prevOption()\n                break\n            case 'ArrowDown':\n                e.preventDefault()\n                this.nextOption()\n                break\n            case 'Home':\n            case 'PageUp':\n                e.preventDefault()\n                this.firstOption()\n                break\n            case 'End':\n            case 'PageDown':\n                e.preventDefault()\n                this.lastOption()\n                break\n            default:\n                break\n        }\n    }\n\n    prevOption() {\n        if (this.dropdownMenu.lastFocused !== this.dropdownMenu.firstFocusable) {\n            const prevSibling = this.dropdownMenu.lastFocused.previousElementSibling\n            prevSibling.focus()\n            this.dropdownMenu.lastFocused = prevSibling\n        }\n    }\n\n    nextOption() {\n        if (this.dropdownMenu.lastFocused !== this.dropdownMenu.lastFocusable) {\n            const nextSibling = this.dropdownMenu.lastFocused.nextElementSibling\n            nextSibling.focus()\n            this.dropdownMenu.lastFocused = nextSibling\n        }\n    }\n\n    firstOption() {\n        if (this.dropdownMenu.lastFocused !== this.dropdownMenu.firstFocusable) {\n            this.dropdownMenu.firstFocusable.focus()\n            this.dropdownMenu.lastFocused = this.dropdownMenu.firstFocusable\n        }\n    }\n\n    lastOption() {\n        if (this.dropdownMenu.lastFocused !== this.dropdownMenu.lastFocusable) {\n            this.dropdownMenu.lastFocusable.focus()\n            this.dropdownMenu.lastFocused = this.dropdownMenu.lastFocusable\n        }\n    }\n\n    disconnectedCallback() {\n        this.unbindEvent()\n    }\n}\n\ncustomElements.get('nb-dropdown') || customElements.define('nb-dropdown', Dropdown)\n\nexport default Dropdown\n","import Viewport from './viewportTracking'\nimport { parseHTML, capitalize } from '../../utils'\nimport { productImpression } from '@kissui/helpers/src/gtmEvents'\n\nexport default function (node, productData, currency, range, position) {\n    const tracking = new ProductTracking(node, productData, currency, range, position)\n\n    return {\n        destroy: () => {\n            if (!tracking.getIom().hasIntersectionObserver()) {\n                tracking.destroy()\n            }\n        }\n    }\n}\n\nclass ProductTracking extends Viewport {\n    constructor(node, data, currency, range, position) {\n        super(node)\n        this.node = node\n        this.data = data\n        this.currency = currency\n        this.range = range\n        this.position = position\n    }\n\n    async runTrack() {\n        // Remove impressionOnScoll event - from Analytics team (Luigi, Yahor)\n        const noImpression =\n            this.node.closest('[tracking_no_impression]')?.getAttribute('tracking_no_impression') ||\n            false\n        const productIndex =\n            this.node.closest('[tracking_position]')?.getAttribute('tracking_position') || 0\n        const list = this.node.closest('[tracking_list]')?.getAttribute('tracking_list') || ''\n\n        if (noImpression !== 'true') {\n            await productImpression(productIndex, list, this.data.id)\n        }\n    }\n\n    async getPLPCategory(categoryId) {\n        return (await window.getPLPData()).data.configuration.eCommerceData.categories.find(\n            category => category.id === categoryId\n        )\n    }\n\n    async getCategoriesWithPlpData(productData) {\n        const TECHNOLOGY_CATEGORY_IDENTIFIER = '/machineTechno/'\n        const isTechnologyCategory = categoryId =>\n            categoryId.indexOf(TECHNOLOGY_CATEGORY_IDENTIFIER) !== -1\n\n        const getTechnologyName = categoryId =>\n            categoryId.substr(\n                categoryId.indexOf(TECHNOLOGY_CATEGORY_IDENTIFIER) +\n                    TECHNOLOGY_CATEGORY_IDENTIFIER.length\n            )\n\n        const categories = [\n            ...(productData.cupSizes || []),\n            ...(productData.flavors || []),\n            ...(productData.ranges || []),\n            ...(productData.technologies || [])\n        ]\n\n        const categoryNames = await Promise.all(\n            categories.map(async categoryId => {\n                const categoryData = await this.getPLPCategory(categoryId)\n\n                if (!categoryData && isTechnologyCategory(categoryId)) {\n                    return getTechnologyName(categoryId)\n                }\n\n                return categoryData.name\n            })\n        )\n\n        return categoryNames.join('|')\n    }\n\n    async getCategories(productData) {\n        if (!productData) {\n            return ''\n        }\n\n        if (window.getPLPData) {\n            return this.getCategoriesWithPlpData(productData)\n        }\n\n        return Promise.all(\n            productData.supercategories.map(superCategory =>\n                window.napi.catalog().getCategory(superCategory)\n            )\n        ).then(categories => {\n            const dimension55 = []\n            for (const category of categories) {\n                const code = category.code\n                if (!code) {\n                    return\n                }\n                if (\n                    ~code.indexOf('-cupSize-') ||\n                    ~code.indexOf('-range-') ||\n                    ~code.indexOf('capsule-aromatic-') ||\n                    ~code.indexOf('machine-keyFeature-') ||\n                    ~code.indexOf('machine-color-') ||\n                    ~code.indexOf('accessory-collection-') ||\n                    ~code.indexOf('accessory-hero-month')\n                ) {\n                    dimension55.push(category.name.toLowerCase())\n                }\n            }\n            return dimension55.join('|')\n        })\n    }\n\n    buildGTMProductObject(productData, dimension55) {\n        let category\n        if (productData.type === 'capsule') {\n            category = 'capsules'\n        } else if (productData.type === 'accessory') {\n            category = 'accessories'\n        } else if (productData.type === 'machine') {\n            category = 'machines'\n        }\n\n        let dimension56 = null\n        if (productData.technologies) {\n            dimension56 = productData.technologies\n                .map(technology => capitalize(technology.split('/')[2]))\n                .join('|||')\n        }\n\n        let dimension130 = ''\n        if (productData.productSelections != null) {\n            dimension130 = productData.productSelections.join('|')\n        }\n\n        const impressionsOnScrollData = {\n            brand: 'Nespresso',\n            category,\n            dimension43: 'false',\n            dimension44: 'false',\n            dimension53: productData.legacyId,\n            dimension54: parseHTML(productData.name)[0].textContent,\n            dimension55,\n            dimension56,\n            dimension57: this.isBundled(productData) ? 'bundled' : 'single',\n            dimension130,\n            id: productData.internationalId,\n            name: parseHTML(productData.internationalName)[0].textContent,\n            price: productData.price\n        }\n        if (this.range) {\n            impressionsOnScrollData.list = this.range\n        }\n        if (this.position) {\n            impressionsOnScrollData.position = parseInt(this.position)\n        }\n        return impressionsOnScrollData\n    }\n\n    /**\n     * Guess if it's bundled even if the 'bundled' property is missing (ecapi VS PLP Data)\n     */\n    isBundled(productData) {\n        let result = productData.salesMultiple === 1 && productData.unitQuantity > 1\n\n        if (productData.bundled) {\n            result = productData.bundled\n        } else if (productData.salesMultiple > 1 && productData.unitQuantity === 1) {\n            result = false\n        }\n\n        return result\n    }\n}\n","import productTracking from '@kissui/helpers/src/assets/js/productTracking'\nimport { getProduct } from '@kissui/helpers/src/catalog'\n\nclass AddToCart extends HTMLElement {\n    static addToCartCounter = 0\n\n    connectedCallback() {\n        this.sku = (this.getAttribute('sku') || '').trim()\n        this.range = this.getAttribute('range')\n        this.position = this.getAttribute('position')\n        this.longSku = (this.getAttribute('longSku') || '').trim()\n        this.buttonSize = this.getAttribute('buttonSize') || 'small' // large or small\n        this.rendererName = this.getAttribute('rendererName') || 'default'\n        this.elementID = `addToCart${AddToCart.addToCartCounter++}`\n        this.disableTracking = this.getAttribute('disableTracking') || false\n\n        this.render()\n\n        if (!this.isWindowNapiActive()) {\n            return\n        }\n\n        window.napi\n            .getConfig()\n            .then(() => {\n                this.pushButton()\n            })\n            .catch(e => console.error(e))\n\n        if (!this.disableTracking) {\n            this.tracking()\n                .then(() => {})\n                .catch(e => console.error(e))\n        }\n    }\n\n    render() {\n        this.innerHTML = `<div class=\"cb-AddToCart\" id=\"${this.elementID}\">\n                <button class='AddToBagButtonLarge'>\n                    <span class='AddToBagButtonLarge__label'>+</span>\n                </button>\n            </div>`\n    }\n\n    isWindowNapiActive() {\n        return !!window.napi\n    }\n\n    pushButton() {\n        if (!document.getElementById(this.elementID)) {\n            return\n        }\n\n        const buttonSize = this.buttonSize\n\n        window.ui = window.ui || []\n        window.ui.push({\n            id: this.elementID,\n            module: 'AddToBagButton',\n            configuration: { props: { productId: this.longSku, buttonSize } },\n            ecommerceData: { activated: true }\n        })\n    }\n\n    async tracking() {\n        if (!this.isWindowNapiActive()) {\n            return Promise.resolve()\n        }\n\n        const data = await this.getProductData()\n        const currency = window[window.config.padl.namespace].dataLayer.app.app.currency\n        productTracking(this, data, currency, this.range, this.position)\n    }\n\n    getSkuKey(sku) {\n        return sku.indexOf('prod/') !== -1 ? 'id' : 'legacyId'\n    }\n\n    async getProductData() {\n        let plpData = null\n        if (window.getPLPData != null) {\n            plpData = await window.getPLPData()\n        }\n        if (plpData) {\n            const skuKey = this.getSkuKey(this.sku)\n            const allKeys = [skuKey, 'internationalId', 'id', 'legacyId']\n            let currentKeyIndex = 0\n            let data = null\n\n            while (!data && currentKeyIndex < allKeys.length - 1) {\n                const key = allKeys[currentKeyIndex]\n\n                data = plpData.data.configuration.eCommerceData.products.find(\n                    product => product[key] === this.sku\n                )\n\n                currentKeyIndex++\n            }\n\n            return data\n        } else if (this.isWindowNapiActive()) {\n            return await getProduct(this.longSku)\n        }\n\n        console.error('Error: napi is not found.')\n    }\n}\n\ncustomElements.get('nb-add-to-cart') || customElements.define('nb-add-to-cart', AddToCart)\n\nexport default AddToCart\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { EVENT_SLIDER_READY } from '@kissui/components'\nimport { readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { stringifyForAttribute, escapeHtml } from '@kissui/helpers/src/utils'\nimport { BROWSER_CONTEXT } from '../constants.mjs'\nimport { customEvent } from '@kissui/helpers/src/gtmEvents'\n\nconst SLIDER_CHIPS_ID = 'slider_natural_chips'\n\nclass PlpStickyBar extends HTMLElement {\n    constructor() {\n        super()\n        this.boundReinitSlider = this.reinitSlider.bind(this)\n        this.boundLinkClick = this.linkClick.bind(this)\n    }\n\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n\n        this.addEventListener(EVENT_SLIDER_READY, this.boundReinitSlider)\n        this.render()\n\n        this.dropdownButtons = this.querySelectorAll(`.nb-dropdown__menu button`)\n        if (this.dropdownButtons) {\n            this.dropdownButtons.forEach(item => {\n                item.addEventListener('click', this.boundLinkClick)\n            })\n        }\n    }\n\n    render() {\n        const { navigation = [], navigation_bubbles = '' } = this.props\n        this.classList.add('nb-plp-sticky-bar')\n\n        this.innerHTML = `<div class='cb-restrict'>\n            ${this.renderLinksSelect(navigation)}\n            ${this.renderChipsSlider(navigation_bubbles)}\n        </div>`\n\n        this.dropdown = this.querySelector('nb-dropdown')\n        this.navigationBubble = this.querySelector('nb-navigation-bubbles')\n\n        // We set aria-hidden on this whole component because it has no sense to manage twice the features for SR and keyboard navigations\n        // Those features (bubble anchor + dropdown page switch) are already managed by the non sticky components\n        this.setAttribute('aria-hidden', 'true')\n    }\n\n    renderLinksSelect(links) {\n        if (viewportHelper.is.mobile || !links || links.length <= 1) {\n            return ''\n        }\n\n        const data = links.map(e => {\n            e.checked = e.selected\n            return e\n        })\n\n        return `\n            <nb-dropdown\n                data='${stringifyForAttribute({ icon_option: '16/symbol/check', options: data })}'\n            ></nb-dropdown>\n        `\n    }\n\n    renderChipsSlider(bubbles) {\n        const { a11y_slider_previous_button = '', a11y_slider_next_button = '' } = this.props\n\n        return `<nb-navigation-bubbles\n                slider_id='${SLIDER_CHIPS_ID}'\n                a11y_slider_previous_button=\"${a11y_slider_previous_button}\"\n                a11y_slider_next_button=\"${a11y_slider_next_button}\"\n                sticky='true' data='${escapeHtml(bubbles)}'\n                selected_nav_link_label=\"${\n                    this.props.selected_nav_link_label || ''\n                }\"></nb-navigation-bubbles>`\n    }\n\n    forceSliderWidth() {\n        // This is needed for Chip Slider, I don't understand why the width is too much\n        // So we set it hardly in JS (only when dropdown is in the layout)\n        if (this.dropdown) {\n            const dropdownWidth = this.dropdown.offsetWidth\n            const stickyBarWidth = this.querySelector('.cb-restrict').offsetWidth\n            const navigationBubbleWidth = stickyBarWidth - dropdownWidth\n\n            this.navigationBubble.style.setProperty(\n                'width',\n                `${navigationBubbleWidth / BROWSER_CONTEXT}rem`\n            )\n        }\n    }\n\n    reinitSlider(e) {\n        const { id } = readEvent(e)\n        if (id !== SLIDER_CHIPS_ID) {\n            return\n        }\n        this.forceSliderWidth()\n        e.target.initSlider()\n    }\n\n    linkClick(event) {\n        event.preventDefault()\n        // We need to redefine click on dropdown links because these are buttons\n        const link = event.currentTarget.getAttribute('data-link')\n        if (link) {\n            window.location.href = link\n        }\n\n        const textContent = event.currentTarget.getAttribute('value')\n        customEvent({\n            eventAction: 'PLP Content Tab',\n            eventLabel: textContent\n        })\n    }\n\n    disconnectedCallback() {\n        this.removeEventListener(EVENT_SLIDER_READY, this.boundReinitSlider)\n\n        if (this.dropdownButtons) {\n            this.dropdownButtons.forEach(item => {\n                item.removeEventListener('click', this.boundLinkClick)\n            })\n        }\n    }\n}\n\ncustomElements.get('nb-plp-sticky-bar') || customElements.define('nb-plp-sticky-bar', PlpStickyBar)\n\nexport default PlpStickyBar\n","/*!\n * swiped-events.js - v@version@\n * Pure JavaScript swipe events\n * https://github.com/john-doherty/swiped-events\n * @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element\n * @author John Doherty <www.johndoherty.info>\n * @license MIT\n */\n\n// scrollElement has been added as an optional parameter in order to avoid scrolling to fire a swipe\nconst swipeEvents = (window: Window & typeof globalThis, document: Document, stopEl?: HTMLElement) => {\n    if (window.nwcSwipeEvents) {\n        return\n    }\n    window.nwcSwipeEvents = true\n\n    // patch CustomEvent to allow constructor creation (IE/Chrome)\n    // if (typeof window.CustomEvent !== 'function') {\n    //     window.CustomEvent = function(event, params) {\n    //         params = params || {bubbles: false, cancelable: false, detail: undefined}\n    //\n    //         let evt = document.createEvent('CustomEvent')\n    //         evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail)\n    //         return evt\n    //     }\n    //\n    //     window.CustomEvent.prototype = window.Event.prototype\n    // }\n\n    document.addEventListener('touchstart', handleTouchStart, false)\n    document.addEventListener('touchmove', handleTouchMove, false)\n    document.addEventListener('touchend', handleTouchEnd, false)\n\n    let xDown: null | number = null\n    let yDown: null | number = null\n    let xDiff: null | number = null\n    let yDiff: null | number = null\n    let timeDown: null | number = null\n    let startEl: HTMLElement | null = null\n\n    // Variables added for checkScrollConditions\n    let scrollTopArray: number[] = []\n    let scrollLeftArray: number[] = []\n\n    /**\n     * Avoid swipe up or down events to fire by checking the scrollTop position of the optional param scrollEl (scrollable zone)\n     * @param {string} direction - 'up' ,'down', 'left', 'right'\n     * @returns {boolean}\n     */\n    function checkScrollCondition(direction: \"up\" |\"down\" | \"left\" | \"right\", e: TouchEvent) {\n        if (stopEl === undefined) {\n            return true\n        }\n\n        let el = e.target as HTMLElement\n        let result = true\n        let i = 0\n        while (el !== stopEl && result) {\n            if (isScrollable(el)) {\n                switch (direction) {\n                    case 'up':\n                        result = scrollTopArray[i] === el.scrollHeight - el.clientHeight\n                        break\n                    case 'down':\n                        result = scrollTopArray[i] === 0\n                        break\n                    case 'left':\n                        result = scrollLeftArray[i] === el.scrollWidth - el.clientWidth\n                        break\n                    case 'right':\n                        result = scrollLeftArray[i] === 0\n                        break\n                    default:\n                        result = true\n                }\n            }\n            el = el.parentNode as HTMLElement\n            i++\n        }\n        return result\n    }\n\n    function memorizeStartElScrollPositions(el: HTMLElement) {\n        if (stopEl === undefined || !stopEl.contains(el)) {\n            return\n        }\n        scrollTopArray = []\n        scrollLeftArray = []\n        while (el !== stopEl) {\n            scrollTopArray.push(el.scrollTop)\n            scrollLeftArray.push(el.scrollLeft)\n            el = el.parentNode as HTMLElement\n        }\n    }\n\n    function isScrollable(el: HTMLElement) {\n        return el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth\n    }\n\n    /**\n     * Fires swiped event if swipe detected on touchend\n     * @param {object} e - browser event object\n     * @returns {void}\n     */\n    function handleTouchEnd(e: TouchEvent) {\n        // if the user released on a different target, cancel!\n        if (startEl !== e.target) {\n            return\n        }\n\n        // Calculate the data-swipe-threshold to be a percentage of the viewport\n        const defaultVertical = window.innerHeight * 0.25 // 25% of the viewport\n        const defaultHorizontal = window.innerWidth * 0.5 // 50% of the viewport\n\n        let swipeThresholdVertical =\n            getNearestAttribute(startEl!, 'data-swipe-threshold', defaultVertical)\n\n        let swipeThresholdHorizontal =\n            getNearestAttribute(startEl!, 'data-swipe-threshold', defaultHorizontal)\n\n        let swipeTimeout = getNearestAttribute(startEl!, 'data-swipe-timeout', 500) // default 500ms\n        let timeDiff = Date.now() - timeDown!\n        let eventType = ''\n        let changedTouches = e.changedTouches || e.touches || []\n\n        if (Math.abs(xDiff!) > Math.abs(yDiff!)) {\n            // most significant\n            if (Math.abs(xDiff!) > swipeThresholdHorizontal && timeDiff < swipeTimeout) {\n                if (xDiff! > 0) {\n                    if (checkScrollCondition('left', e)) {\n                        eventType = 'swiped-left'\n                    }\n                } else {\n                    if (checkScrollCondition('right', e)) {\n                        eventType = 'swiped-right'\n                    }\n                }\n            }\n        } else if (Math.abs(yDiff!) > swipeThresholdVertical && timeDiff < swipeTimeout) {\n            if (yDiff! > 0) {\n                if (checkScrollCondition('up', e)) {\n                    eventType = 'swiped-up'\n                }\n            } else {\n                if (checkScrollCondition('down', e)) {\n                    eventType = 'swiped-down'\n                }\n            }\n        }\n\n        if (eventType !== '') {\n            let eventData = {\n                dir: eventType.replace(/swiped-/, ''),\n                touchType: (changedTouches[0] as Touch & { touchType: string })?.touchType ?? 'direct', // This is a non standard feature used only by safari\n                xStart: xDown!,\n                xEnd: (changedTouches[0] || {}).clientX || -1,\n                yStart: yDown!,\n                yEnd: (changedTouches[0] || {}).clientY || -1\n            }\n\n            // fire `swiped` event event on the element that started the swipe\n            startEl!.dispatchEvent(\n                new CustomEvent('swiped', { bubbles: true, cancelable: true, detail: eventData })\n            )\n\n            // fire `swiped-dir` event on the element that started the swipe\n            startEl!.dispatchEvent(\n                new CustomEvent(eventType, { bubbles: true, cancelable: true, detail: eventData })\n            )\n        }\n\n        // reset values\n        xDown = null\n        yDown = null\n        timeDown = null\n    }\n\n    /**\n     * Records current location on touchstart event\n     * @param {object} e - browser event object\n     * @returns {void}\n     */\n    function handleTouchStart(e: TouchEvent) {\n        const target = e.target as HTMLElement\n        // if the element has data-swipe-ignore=\"true\" we stop listening for swipe events\n        if (target.getAttribute('data-swipe-ignore') === 'true') {\n            return\n        }\n\n        startEl = target\n        memorizeStartElScrollPositions(startEl)\n\n        timeDown = Date.now()\n        xDown = e.touches[0].clientX\n        yDown = e.touches[0].clientY\n        xDiff = 0\n        yDiff = 0\n    }\n\n    /**\n     * Records location diff in px on touchmove event\n     * @param {object} e - browser event object\n     * @returns {void}\n     */\n    function handleTouchMove(e: TouchEvent) {\n        if (!xDown || !yDown) {\n            return\n        }\n\n        let xUp = e.touches[0].clientX\n        let yUp = e.touches[0].clientY\n\n        xDiff = xDown - xUp\n        yDiff = yDown - yUp\n    }\n\n    /**\n     * Gets attribute off HTML element or nearest parent\n     * @param {object} el - HTML element to retrieve attribute from\n     * @param {string} attributeName - name of the attribute\n     * @param {any} defaultValue - default value to return if no match found\n     * @returns {any} attribute value or defaultValue\n     */\n    function getNearestAttribute(el: HTMLElement, attributeName: string | number, defaultValue: number) {\n        // walk up the dom tree looking for attributeName\n        while (el && el !== document.documentElement) {\n            let attributeValue = el.getAttribute(String(attributeName))\n\n            if (attributeValue) {\n                return parseInt(attributeValue, 10)\n            }\n\n            el = el.parentNode as HTMLElement\n        }\n\n        return defaultValue\n    }\n}\n\nexport default swipeEvents\n","import './overlay.scss'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { EVENT_POPIN_CLOSE, TIME_INSTANT, TIME_SLOW } from '@kissui/components'\n\nconst open = popin_id => {\n    const overlay = document.createElement('DIV')\n    overlay.classList.add('nb-overlay')\n    overlay.addEventListener('click', () => {\n        dispatchEvent({ eventName: EVENT_POPIN_CLOSE, args: { id: popin_id } })\n    })\n    document.body.appendChild(overlay)\n    setTimeout(() => {\n        overlay.classList.add('fadein')\n    }, TIME_INSTANT)\n}\n\nconst close = () => {\n    if (!document.getElementsByClassName('nb-overlay').length) {\n        return\n    }\n    const overlay = document.getElementsByClassName('nb-overlay')[0]\n    overlay.classList.remove('fadein')\n    setTimeout(() => {\n        overlay.remove()\n    }, TIME_SLOW)\n}\n\nexport default { open, close }\n","import swipeEvents from '@kissui/helpers/src/swipeEvents'\nimport createProps, { parseBool } from '@kissui/helpers/src/props.helpers'\nimport {\n    recursiveSwitchAriaHidden,\n    setFirstAndLastFocusable,\n    focusin\n} from '@kissui/helpers/src/assets/js/scopedKeyboardNav'\nimport {\n    TIME_FAST,\n    EVENT_POPIN_OPENED,\n    EVENT_POPIN_CLOSED,\n    EVENT_VIDEO_TOGGLE,\n    EVENT_POPIN_OPEN,\n    EVENT_POPIN_CLOSE,\n    EVENT_POPIN_KEY_DOWN,\n    EVENT_SWIPED_DOWN\n} from '@kissui/components'\nimport Overlay from './components/overlay'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { dispatchEvent, readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\n\nconst STATE_OPEN = 'isOpen'\nconst SCROLL_LOCK = 'scroll-lock'\n\nclass Popin extends HTMLElement {\n    constructor() {\n        super()\n        this.props = {}\n        this.ariaModal = null\n        this.isVideo = null\n\n        this.boundOpen = this.open.bind(this)\n        this.boundClose = this.close.bind(this)\n        this.boundEscapeClose = this.escapeClose.bind(this)\n        this.boundFocus = this.focus.bind(this)\n        this.boundFocusin = this.focusin.bind(this)\n    }\n\n    connectedCallback() {\n        this.style.display = 'none'\n        this.props = createProps(this.attributes)\n\n        if (!this.id) {\n            this.id = this.props.id\n        }\n\n        if (!this.content && !this.slot) {\n            this.slot = this.innerHTML\n        }\n\n        this.ariaModal = false\n        this.isVideo = false\n        this.render()\n    }\n\n    attributeChangedCallback(name, oldValue, newValue) {\n        this.props = createProps(this.attributes)\n\n        if (name === 'content') {\n            this.props.content = newValue\n        }\n    }\n\n    static get observedAttributes() {\n        return ['content']\n    }\n\n    disconnectedCallback() {\n        if (!this.hasEvent) {\n            return\n        }\n        this.unbindEvent()\n    }\n\n    render() {\n        if (this.hasEvent) {\n            this.unbindEvent()\n        }\n        const {\n            heading = '',\n            subheading = '',\n            bgcolor = 'highlight',\n            size = 'M',\n            label_close = 'Close',\n            image = '',\n            image_alt = '',\n            variation = 'before',\n            content = '',\n            heading_class = viewportHelper.is.mobile ? 't-sm-700-sl' : 'h-lg-700'\n        } = this.props\n        const slot = content || this.slot\n\n        if (slot === '') {\n            this.bindEvent()\n            this.classList.remove(STATE_OPEN)\n            this.isOpen = false\n            return false\n        }\n        this.checkIsVideo(slot)\n        this.setAttribute('size', this.isVideo ? 'L' : size)\n\n        // FYI : The role is dialog, not alertdialog (only used for alerts / warnings ...)\n        this.setAttribute('role', 'dialog')\n        this.setAttribute('aria-hidden', 'true')\n        this.setAttribute('bgcolor', bgcolor)\n        this.setAttribute('variation', variation)\n\n        // Be careful to not remove the title div, even if empty, because it holds on purpose the top gradient for scroll effect\n        this.innerHTML = `\n            <nb-cta\n                variation=\"navigation\"\n                ${bgcolor === 'white' ? `contrast=\"highlight\"` : `contrast=\"light\"`}\n                icon_right=\"24/symbol/close\"\n                label=\"${label_close}\"></nb-cta>\n            <div class=\"wrapper\">\n                ${\n                    heading &&\n                    `<div class=\"title\" >\n                        ${heading && `<h2 class=\"${heading_class}\">${heading}</h2>`}\n                    </div>`\n                }\n                ${\n                    subheading &&\n                    `<div class=\"subtitle\">\n                            ${subheading && `<p class=\"t-sm-500\">${subheading}</p>`}\n                    </div>`\n                }\n\n                <div class=\"content t-sm-400\" tabindex=\"-1\">\n                    ${\n                        image &&\n                        `<div class=\"popin-header-img\"><img loading=\"lazy\" src=\"${image}\" alt=\"${image_alt}\" title=\"${image_alt}\" width=\"300\" height=\"225\" /></div>`\n                    }\n                    ${slot}\n                </div>\n                ${this.renderFooter()}\n            </div>\n            ${this.isVideo && viewportHelper.is.mobile ? '<div class=\"swipeOverlay\"></div>' : ''}\n        `\n\n        // Expected css to be downloaded\n        setTimeout(() => {\n            this.style.display = 'inherit'\n        }, 100)\n\n        // Set the first and last focusable elements\n        setFirstAndLastFocusable(this)\n\n        this.buttonElement = this.querySelector('button')\n        this.bindEvent()\n    }\n\n    renderFooter() {\n        const { footer } = this.props\n        return parseBool(footer) ? '<footer></footer>' : ''\n    }\n\n    checkIsVideo(slot) {\n        const tempEl = document.createElement('div')\n        tempEl.innerHTML = slot\n        if (tempEl.children.length === 1 && tempEl.children[0].tagName === 'NB-VIDEO') {\n            this.isVideo = true\n            this.setAttribute('video', 'true')\n        }\n    }\n\n    addLock() {\n        document.getElementsByTagName('html')[0].classList.add(SCROLL_LOCK)\n        Overlay.open(this.id)\n    }\n\n    removeLock() {\n        // In case we have popin inside a popin we shouldn't remove the scroll_lock\n        const parentPopin = this.parentNode.closest('nb-popin')\n        if (!parentPopin) {\n            document.getElementsByTagName('html')[0].classList.remove(SCROLL_LOCK)\n        }\n        Overlay.close()\n    }\n\n    switchAriaModal() {\n        this.ariaModal = !this.ariaModal\n        // This is the future way to scope the SR focus to a modal, but it's not supported yet by all SR\n        this.setAttribute('aria-modal', this.ariaModal)\n        // So we need to set aria-hidden=false to all ancestors of parent until body\n        recursiveSwitchAriaHidden(this, this.ariaModal)\n    }\n\n    async open(e) {\n        const event = readEvent(e)\n        if (event.id !== this.id) {\n            return\n        }\n        // Transitionend listener is fired multiple times (fore each css property)\n        // so we need to instantiate it only when we open or close and then we remove it on focusin\n        this.addEventListener('transitionend', this.boundFocus)\n        document.addEventListener('focusin', this.boundFocusin)\n        this.openingSource = document.activeElement\n\n        this.addLock()\n        this.switchAriaModal()\n        this.setAttribute('aria-hidden', 'false')\n        this.isOpen = !this.isOpen\n\n        // event variable already contains ID and other args sent along with dispatch event\n        dispatchEvent({\n            eventName: EVENT_POPIN_OPENED,\n            args: event\n        })\n\n        await new Promise(resolve => {\n            setTimeout(() => {\n                this.classList.add(STATE_OPEN)\n                resolve()\n            }, TIME_FAST)\n        })\n    }\n\n    close(event) {\n        event.cancelBubble = true\n        if (event.stopPropagation) {\n            event.stopPropagation()\n        }\n        // Transitionend listener is fired multiple times (fore each css property)\n        // so we need to instantiate it only when we open or close, and then we remove it on focusin\n        this.addEventListener('transitionend', this.boundFocus)\n        document.removeEventListener('focusin', this.boundFocusin)\n        this.removeLock()\n        if (this.isVideo) {\n            const openVideoPopin = this.closest('.has-open-video')\n            if (openVideoPopin) {\n                openVideoPopin.classList.remove('has-open-video')\n            }\n        }\n        this.switchAriaModal()\n        this.setAttribute('aria-hidden', 'true')\n        this.isOpen = !this.isOpen\n        this.classList.remove(STATE_OPEN)\n\n        dispatchEvent({\n            eventName: EVENT_POPIN_CLOSED,\n            args: { id: this.id }\n        })\n    }\n\n    focus() {\n        this.removeEventListener('transitionend', this.boundFocus)\n        if (this.isOpen) {\n            this.buttonElement.focus()\n        } else {\n            this.openingSource.focus()\n        }\n    }\n\n    focusin(e) {\n        focusin(e, this, true)\n    }\n\n    escapeClose(e) {\n        if (e.key === 'Escape' && this.isOpen) {\n            this.close(e)\n        }\n    }\n\n    swipeDown(e) {\n        if (this.isOpen) {\n            this.close(e)\n        }\n    }\n\n    swipeOverlayTogglePlayPause() {\n        dispatchEvent({\n            eventName: EVENT_VIDEO_TOGGLE,\n            args: { id: this.id }\n        })\n    }\n\n    bindEvent() {\n        this.hasEvent = true\n        this.buttonElement != null && this.buttonElement.addEventListener('click', this.boundClose)\n        window.addEventListener(EVENT_POPIN_OPEN, this.boundOpen)\n        window.addEventListener(EVENT_POPIN_CLOSE, this.boundClose)\n        document.addEventListener(EVENT_POPIN_KEY_DOWN, this.boundEscapeClose)\n\n        if (viewportHelper.is.mobile) {\n            swipeEvents(window, document, this)\n            this.boundSwipeDown = this.swipeDown.bind(this)\n            document.addEventListener(EVENT_SWIPED_DOWN, this.boundSwipeDown)\n            if (this.isVideo) {\n                this.swipeOverlay = this.querySelector('.swipeOverlay')\n                this.boundSwipeOverlayTogglePlayPause = this.swipeOverlayTogglePlayPause.bind(this)\n                this.swipeOverlay.addEventListener('click', this.boundSwipeOverlayTogglePlayPause)\n            }\n        }\n    }\n\n    unbindEvent() {\n        this.hasEvent = false\n        this.buttonElement != null &&\n            this.buttonElement.removeEventListener('click', this.boundClose)\n        window.removeEventListener(EVENT_POPIN_OPEN, this.boundOpen)\n        window.removeEventListener(EVENT_POPIN_CLOSE, this.boundClose)\n        document.removeEventListener(EVENT_POPIN_KEY_DOWN, this.boundEscapeClose)\n        if (this.boundSwipeDown) {\n            document.removeEventListener(EVENT_SWIPED_DOWN, this.boundSwipeDown)\n            this.boundSwipeDown = null\n        }\n        if (this.boundSwipeOverlayTogglePlayPause) {\n            this.swipeOverlay.removeEventListener('click', this.boundSwipeOverlayTogglePlayPause)\n            this.boundSwipeOverlayTogglePlayPause = null\n        }\n    }\n}\n\ncustomElements.get('nb-popin') || customElements.define('nb-popin', Popin)\n\nexport default Popin\n","import { LOGO_IMG_MAP } from '@kissui/helpers/src/cremaDataHelper'\nimport createProps from '@kissui/helpers/src/props.helpers'\n\nclass CardLogos extends HTMLElement {\n    constructor() {\n        super()\n        this.props = {}\n    }\n\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.render()\n    }\n\n    render() {\n        // individual props for each logo is there for retro compatibility\n        // logos is the prop that we should use going forward to add any logo\n        let { direction = 'row', logos } = this.props\n        let fair_trade\n        let alt_fair_trade\n        let is_organic\n        let alt_organic\n        let only_vertuo_next\n        let alt_vertuo_next\n        let is_rainforest\n        let alt_rainforest\n        let is_sustainable\n        let alt_sustainable\n        let is_q_certified_arabica\n        let alt_q_certification_arabica\n\n        this.classList.add(\n            `${direction === 'column' ? 'direction-column' : 'direction-' + direction}`\n        )\n\n        let logos_list = []\n        if (logos == null) {\n            fair_trade = this.props?.fair_trade\n            alt_fair_trade = this.props?.alt_fair_trade\n            is_organic = this.props?.is_organic\n            alt_organic = this.props?.alt_organic\n            only_vertuo_next = this.props?.only_vertuo_next\n            alt_vertuo_next = this.props?.alt_vertuo_next\n            is_rainforest = this.props?.is_rainforest\n            alt_rainforest = this.props?.alt_rainforest\n            is_sustainable = this.props?.is_sustainable\n            alt_sustainable = this.props?.alt_sustainable\n            is_q_certified_arabica = this.props?.is_q_certified_arabica\n            alt_q_certification_arabica = this.props?.alt_q_certification_arabica\n        } else if (logos.length === undefined) {\n            // Logos exists but is not an array, this is the old format\n            fair_trade = logos?.fair_trade\n            alt_fair_trade = logos?.alt_fair_trade\n            is_organic = logos?.is_organic\n            alt_organic = logos?.alt_organic\n            only_vertuo_next = logos?.only_vertuo_next\n            alt_vertuo_next = logos?.alt_vertuo_next\n            is_rainforest = logos?.is_rainforest\n            alt_rainforest = logos?.alt_rainforest\n            is_sustainable = logos?.is_sustainable\n            alt_sustainable = logos?.alt_sustainable\n            is_q_certified_arabica = logos?.is_q_certified_arabica\n            alt_q_certification_arabica = logos?.alt_q_certification_arabica\n        } else if (logos.length) {\n            logos_list = [...logos]\n        }\n\n        // here we fill logos with logos taken from individual props\n        ;[\n            [fair_trade, 'fair_trade', alt_fair_trade, logos_list],\n            [is_organic, 'is_organic', alt_organic, logos_list],\n            [only_vertuo_next, 'only_vertuo_next', alt_vertuo_next, logos_list],\n            [is_rainforest, 'is_rainforest', alt_rainforest, logos_list],\n            [is_sustainable, 'is_sustainable', alt_sustainable, logos_list],\n            [\n                is_q_certified_arabica,\n                'is_q_certified_arabica',\n                alt_q_certification_arabica,\n                logos_list\n            ]\n        ].forEach(param => this.appendLogo.apply(this, param))\n\n        this.innerHTML = logos_list\n            .map(logo => `<img src=\"${LOGO_IMG_MAP[logo.name]}\" alt=\"${logo.alt}\" loading=\"lazy\">`)\n            .join('')\n    }\n\n    appendLogo(param, name, alt, list) {\n        if (!!param && !this.hasLogo(list, name)) {\n            list.push({ name, alt })\n        }\n    }\n\n    hasLogo(logosList, logoName) {\n        return logosList.some(logo => logo.name === logoName)\n    }\n}\n\ncustomElements.get('nb-card-logos') || customElements.define('nb-card-logos', CardLogos)\n\nexport default CardLogos\n","export const root = 'pn-ProductNav'\nexport const container = 'pn-ProductNavContents'\nexport const slidesContainer = 'pn-ProductContainer'\nexport const item = 'pn-ProductNavLinkWrapper'\nexport const next = 'pnAdvancerRight'\nexport const prev = 'pnAdvancerLeft'\nexport const pnIndicator = 'pn-ProductNavIndicator'\nexport const link_plp_category_padding_x = 10\nexport const TRANSITION_FAST = 300\n\nexport const colours = {\n    0: '#000000',\n    1: '#000000',\n    2: '#99813D',\n    3: '#40FEFF',\n    4: '#14CC99',\n    5: '#00BAFF',\n    6: '#0082B2',\n    7: '#B25D7A',\n    8: '#00FF17',\n    9: '#006B49',\n    10: '#00B27A',\n    11: '#996B3D',\n    12: '#CC7014',\n    13: '#40FF8C',\n    14: '#FF3400',\n    15: '#ECBB5E',\n    16: '#ECBB0C',\n    17: '#B9D912',\n    18: '#253A93',\n    19: '#125FB9'\n}\n","import * as constants from './constants'\nimport { colours, link_plp_category_padding_x, TRANSITION_FAST } from './constants'\nimport { makeId } from '@kissui/helpers/src/utils'\n\nclass SliderMenu {\n    /**\n     * @param {HTMLElement} element\n     * @param {Object} options\n     * @param {Number} [options.slidesToScroll=1] options.slidesToScroll of element do slide\n     * @param {Number} [options.slidesVisible=1] options.slidesVisible of element to display\n     * @param {Boolean} [options.navigationButton=true] options.navigationButton show navigation button\n     */\n\n    constructor(element, options = {}) {\n        this.boundNextClick = this.onNextClick.bind(this)\n        this.boundPrevClick = this.onPrevClick.bind(this)\n        this.boundLinkClick = this.onLinkClick.bind(this)\n        this.boundTouchEnd = this.onTouchEnd.bind(this)\n        this.disableAutoScroll = options.disableAutoScroll === 'true' || false\n        this._entriesBounds = null\n\n        return new Promise(resolve => {\n            this._element = element\n            this._slides = [].slice.call(element.children)\n            this._options = Object.assign(\n                {},\n                {\n                    id: 'uuid',\n                    last_known_scroll_position: 0,\n                    ticking: false,\n                    navBarTravelDirection: '',\n                    navBarTravelling: false,\n                    navBarTravelDistance: 150,\n                    scrollAmount: 220\n                },\n                options\n            )\n\n            this.buildIHM()\n            resolve(this)\n\n            // Wait for CSS animation before setting the indicator\n            setTimeout(() => {\n                this.setOverflowAttribute()\n                this.initializeIndicatorPosition()\n            }, 0)\n        })\n    }\n\n    /**\n     * @returns {HTMLElement}\n     */\n    get element() {\n        return this._element\n    }\n\n    // MAIN BUILDER\n    buildIHM() {\n        this._root = this.createElement('nav', constants.root)\n        this._container = this.createElement('ul', constants.container)\n        this._pnIndicator = null\n        this._containerSlidesContent = null\n\n        if (this.hasContainer()) {\n            this._containerSlidesContent = this.createElement('div', constants.slidesContainer)\n        }\n\n        this.wrapItems()\n        this._root.appendChild(this._container)\n\n        if (this._containerSlidesContent) {\n            this._element.appendChild(this._containerSlidesContent)\n        }\n\n        // Insert the slider between Arrows for accessibility keyboard navigation\n        this._element.insertBefore(this._root, this._element.childNodes[2])\n\n        this.createIndicator()\n    }\n\n    hasContainer() {\n        if (document.querySelector('.slider-container')) return true\n\n        return false\n    }\n\n    wrapItems() {\n        const keys = []\n        this._slides.map(child => {\n            const randId = makeId(5)\n\n            if (this.hasContainer()) {\n                if (child.classList.contains('slider-container')) {\n                    if (child.children) {\n                        if (child.children.length) {\n                            ;[...child.children].forEach((el, i) => {\n                                if (i !== 0) {\n                                    el.style.display = 'none'\n                                }\n\n                                el.id = keys[i]\n\n                                this._containerSlidesContent.appendChild(el)\n                            })\n                        }\n                    }\n                    child.remove()\n                }\n            }\n\n            if (!child.classList.contains('pn-Advancer')) {\n                const item = this.createElement('div', constants.item)\n                item.appendChild(child)\n                item.setAttribute('data-inner-content-id', randId)\n                keys.push(randId)\n\n                this._container.appendChild(item)\n            }\n        })\n    }\n\n    createElement(tag, className) {\n        let div = document.createElement(tag)\n        div.setAttribute('class', className)\n        return div\n    }\n\n    // COMPONENT ROOT \"ELEMENT\" COMPOSER\n    createIndicator() {\n        this.elements = []\n        this._pnIndicator = this.createElement('div', constants.pnIndicator)\n        this._container.appendChild(this._pnIndicator)\n\n        this.elements = Array.from(this._container.querySelectorAll('nb-link a'))\n        // Handle setting the currently active link\n        this.elements.forEach(element => {\n            element.addEventListener('click', this.boundLinkClick)\n        })\n\n        const pnAdvancerLeft = document.getElementById(`${constants.prev}-${this._options.id}`)\n        if (pnAdvancerLeft) {\n            pnAdvancerLeft.addEventListener('click', this.boundPrevClick)\n        }\n\n        const pnAdvancerRight = document.getElementById(`${constants.next}-${this._options.id}`)\n        if (pnAdvancerRight) {\n            pnAdvancerRight.addEventListener('click', this.boundNextClick)\n        }\n\n        if (this._root) {\n            this._container.addEventListener('touchend', this.boundTouchEnd)\n        }\n    }\n\n    onLinkClick(e) {\n        this.goToElement(e.currentTarget)\n    }\n\n    goToSlide(index) {\n        this.goToElement(this._slides[index])\n    }\n\n    showContent(id) {\n        const slidesContainer = document.querySelector(`.${constants.slidesContainer}`)\n\n        if (slidesContainer.children) {\n            ;[...slidesContainer.children].forEach(el => (el.style.display = 'none'))\n        }\n\n        document.getElementById(id).style.display = 'block'\n    }\n\n    goToElement(element) {\n        if (this.hasContainer()) {\n            const contentId = element\n                .closest('[data-inner-content-id]')\n                .getAttribute('data-inner-content-id')\n\n            this.showContent(contentId)\n        }\n\n        this.deselectAllLinkBut(element)\n        element.setAttribute('aria-current', 'true')\n\n        if (!element || !this._entriesBounds) {\n            return\n        }\n\n        let distance = 0\n\n        for (const entry of this._entriesBounds) {\n            if (entry.target.getAttribute('data-href') === element.getAttribute('data-href')) {\n                break\n            } else {\n                distance = distance + entry.boundingClientRect.width + link_plp_category_padding_x\n            }\n        }\n\n        if (!this.disableAutoScroll) {\n            this._root.scroll({ left: distance, behavior: 'smooth' })\n        }\n    }\n\n    deselectAllLinkBut(element) {\n        this.elements.forEach(el => {\n            if (el !== element) {\n                el.setAttribute('aria-current', 'false')\n            }\n        })\n    }\n\n    sideScroll(element, direction, speed, distance, step) {\n        this.setOverflowAttribute()\n\n        let scrollAmount = 0\n        let slideTimer = setInterval(function () {\n            if (direction === 'left') {\n                element.scrollLeft -= step\n            } else {\n                element.scrollLeft += step\n            }\n            scrollAmount += step\n            if (scrollAmount >= distance) {\n                window.clearInterval(slideTimer)\n            }\n        }, speed)\n        return { slideTimer }\n    }\n\n    onPrevClick() {\n        this.sideScroll(this._root, 'left', 25, this._options.scrollAmount, 10)\n        setTimeout(() => {\n            this.setOverflowAttribute()\n        }, TRANSITION_FAST)\n    }\n\n    onNextClick() {\n        this.sideScroll(this._root, 'right', 25, this._options.scrollAmount, 10)\n        setTimeout(() => {\n            this.setOverflowAttribute()\n        }, TRANSITION_FAST)\n    }\n\n    onTouchEnd() {\n        this.setOverflowAttribute()\n    }\n\n    initializeIndicatorPosition() {\n        const selected = this._root.querySelector('[aria-current=\"true\"]')\n\n        // Set the indicator\n        if (selected) {\n            this.moveIndicator(selected, colours[0])\n        }\n    }\n\n    determineOverflow(content, container) {\n        let containerMetrics = container.getBoundingClientRect()\n        let containerMetricsRight = Math.floor(containerMetrics.right)\n        let containerMetricsLeft = Math.floor(containerMetrics.left)\n\n        let contentMetrics = content.getBoundingClientRect()\n        let contentMetricsRight = Math.floor(contentMetrics.right)\n        let contentMetricsLeft = Math.floor(contentMetrics.left)\n\n        if (\n            containerMetricsLeft > contentMetricsLeft &&\n            containerMetricsRight < contentMetricsRight\n        ) {\n            return 'both'\n        } else if (contentMetricsLeft < containerMetricsLeft) {\n            return 'left'\n        } else if (contentMetricsRight > containerMetricsRight) {\n            return 'right'\n        } else {\n            return 'none'\n        }\n    }\n\n    moveIndicator(item, color) {\n        if (!this._pnIndicator) {\n            return\n        }\n\n        let textPosition = item.getBoundingClientRect()\n        let container = this._container.getBoundingClientRect().left\n        let distance = textPosition.left - container\n\n        this._pnIndicator.style.transform =\n            'translateX(' +\n            (distance + this._container.scrollLeft + link_plp_category_padding_x) +\n            'px) scaleX(' +\n            (textPosition.width - link_plp_category_padding_x * 2) * 0.01 +\n            ')'\n\n        this._root.scrollLeft = Math.floor(\n            distance + this._container.getBoundingClientRect().left / 2\n        )\n\n        if (color) {\n            this._pnIndicator.style.backgroundColor = color\n        }\n    }\n\n    onResize() {\n        this.setOverflowAttribute()\n        this.initializeIndicatorPosition()\n    }\n\n    clearListeners() {\n        this.elements.forEach(element => {\n            element.removeEventListener('click', this.boundLinkClick)\n        })\n\n        const pnAdvancerLeft = document.getElementById(`${constants.prev}-${this._options.id}`)\n        if (pnAdvancerLeft) {\n            pnAdvancerLeft.removeEventListener('click', this.boundPrevClick)\n        }\n\n        const pnAdvancerRight = document.getElementById(`${constants.next}-${this._options.id}`)\n        if (pnAdvancerRight) {\n            pnAdvancerRight.removeEventListener('click', this.boundNextClick)\n        }\n    }\n\n    kill() {\n        this.clearListeners()\n    }\n\n    setOverflowAttribute() {\n        this._element.setAttribute(\n            'data-overflowing',\n            this.determineOverflow(this._container, this._root)\n        )\n\n        this.observe()\n    }\n\n    observe() {\n        if (!('IntersectionObserver' in window)) {\n            return false\n        }\n\n        this._entriesBounds = []\n\n        // Using IntersectionObserver to prevent reflow while getting boundingClientRect\n        const observer = new IntersectionObserver(\n            entries => {\n                for (const entry of entries) {\n                    this._entriesBounds.push({\n                        target: entry.target,\n                        intersection:\n                            entry.boundingClientRect.right <=\n                                window.innerWidth - link_plp_category_padding_x &&\n                            entry.boundingClientRect.left >= link_plp_category_padding_x,\n                        boundingClientRect: entry.boundingClientRect\n                    })\n                }\n\n                observer.disconnect()\n            },\n            { root: this._container }\n        )\n\n        this._slides.map(element => observer.observe(element))\n    }\n\n    isInViewport(element) {\n        if (!this._entriesBounds) {\n            return false\n        }\n\n        const entry = this._entriesBounds.find(entryBound => element === entryBound.target)\n\n        return entry.intersection\n    }\n}\n\nexport default SliderMenu\n","import SliderMenuLib from './js/SliderMenuLib'\nimport { debounce, makeId } from '@kissui/helpers/src/utils'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { customEvent, itemDisplay } from '@kissui/helpers/src/gtmEvents'\nimport { EVENT_SLIDE_CHANGE, EVENT_SLIDER_READY } from '@kissui/components'\n\nclass SliderMenu extends HTMLElement {\n    constructor() {\n        super()\n        this.slot = this.innerHTML\n        this.navBarTravelling = true\n        this.disableAutoScroll = false\n        this.navBarTravelDirection = ''\n        this.navBarTravelDistance = 200\n        this.randomId = null\n        this.sliderMenu = null\n        this.boundOnResize = this.onResize.bind(this)\n        this.onLoad = this.onLoad.bind(this)\n        this.debouncedOnResize = debounce(this.boundOnResize, 250)\n    }\n\n    static get observedAttributes() {\n        return ['navBarTravelling', 'navBarTravelDirection', 'navBarTravelDistance']\n    }\n\n    render() {\n        const navigation = this.getAttribute('navigation') === 'true' ? true : ''\n        const a11y_slider_previous_button = this.getAttribute('a11y_slider_previous_button') || ''\n        const a11y_slider_next_button = this.getAttribute('a11y_slider_next_button') || ''\n\n        this.innerHTML = `\n            <div id=\"pnProductNav-${this.randomId}\" class=\"pn-ProductNavWrapper ${this.randomId}\">\n                ${\n                    navigation &&\n                    `<nb-cta id=\"pnAdvancerLeft-${this.randomId}\"\n                        class=\"pn-Advancer pn-AdvancerLeft\"\n                        variation=\"navigation\"\n                        contrast=\"highlight\"\n                        size=\"32\"\n                        icon_right=\"24/symbol/chevron-left\"\n                        label=\"${a11y_slider_previous_button}\"></nb-cta>`\n                }\n                ${this.slot}\n                ${\n                    navigation &&\n                    `<nb-cta id=\"pnAdvancerRight-${this.randomId}\"\n                        class=\"pn-Advancer pn-AdvancerRight\"\n                        variation=\"navigation\"\n                        contrast=\"highlight\"\n                        size=\"32\"\n                        icon_right=\"24/symbol/chevron-right\"\n                        label=\"${a11y_slider_next_button}\"></nb-cta>`\n                }\n                <span id=\"pnIndicator-${this.randomId}\"\n                    class=\"pn-ProductNavIndicator\">\n                </span>\n            </div>\n\n            `\n        this.loadSwiper()\n    }\n\n    connectedCallback() {\n        this.randomId = this.getAttribute('testId')\n            ? this.getAttribute('testId')\n            : `swiperMenu_${makeId(5)}`\n        this.navBarTravelling = this.getAttribute('navBarTravelling') || this.navBarTravelling\n        this.navBarTravelDirection =\n            this.getAttribute('navBarTravelDirection') || this.navBarTravelDirection\n        this.navBarTravelDistance =\n            this.getAttribute('navBarTravelDistance') || this.navBarTravelDistance\n        this.disableAutoScroll = this.getAttribute('disable_auto_scroll') || ''\n\n        this.render()\n        window.addEventListener('resize', this.debouncedOnResize)\n    }\n\n    loadSwiper() {\n        let navBarTravelDirection = this.navBarTravelDirection\n        let navBarTravelDistance = this.navBarTravelDistance\n\n        this.sliderMenu = new SliderMenuLib(this.querySelector('.' + this.randomId), {\n            id: this.randomId,\n            index: this.index,\n            navBarTravelDirection: navBarTravelDirection,\n            navBarTravelDistance: navBarTravelDistance,\n            disableAutoScroll: this.disableAutoScroll\n        })\n\n        this.sliderMenu.then(() => {\n            this.classList.add('is-show')\n\n            dispatchEvent({\n                eventName: EVENT_SLIDER_READY,\n                args: { className: this.randomId },\n                element: this\n            })\n        })\n\n        // Updates slider menu to follow semantics, accessibility\n        const productNavLinkWrappers = document.querySelectorAll('.pn-ProductNavLinkWrapper')\n        productNavLinkWrappers.forEach(div => {\n            const li = document.createElement('li')\n            li.classList.add('pn-ProductNavLinkWrapper')\n            while (div.firstChild) {\n                li.appendChild(div.firstChild)\n            }\n            div.parentNode.replaceChild(li, div)\n        })\n    }\n\n    handleClick() {\n        dispatchEvent({ eventName: EVENT_SLIDE_CHANGE })\n\n        // GTM 'itemDisplay' event\n        itemDisplay({ rootElement: ['nb-slider-menu'] })\n    }\n\n    onLoad() {\n        this.sliderMenu.then(slider => slider.onLoad())\n    }\n\n    onResize() {\n        this.sliderMenu.then(slider => slider.onResize())\n    }\n\n    onNavigationClick(e) {\n        let name = ''\n\n        if (\n            e.target &&\n            e.target.closest('.link') &&\n            e.target.closest('.link').getAttribute('tracking_label')\n        ) {\n            name = e.target.closest('.link').getAttribute('tracking_label')\n        }\n\n        customEvent({ eventAction: 'PLP Content Tab', eventLabel: name })\n    }\n\n    disconnectedCallback() {\n        window.removeEventListener('resize', this.debouncedOnResize)\n        this.sliderMenu.then(slider => slider.kill())\n    }\n}\n\ncustomElements.get('nb-slider-menu') || customElements.define('nb-slider-menu', SliderMenu)\n\nexport default SliderMenu\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport viewportHelper from '@kissui/helpers/src/viewport.helpers'\nimport { makeId, setAttributes, convertToCamelCase } from '@kissui/helpers/src/utils'\nimport { isSafari } from '@kissui/helpers/src/useragent.helpers'\nimport { CONTRAST_LIGHT } from '@kissui/components'\nimport { getOppositeContrast } from '@kissui/helpers/src/contrast.helpers'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { BROWSER_CONTEXT, EVENT_SLIDER_READY } from '../constants.mjs'\n\nconst MAX_LOOP_TO_INIT = 50 // max 5 seconds\n\nclass SliderNatural extends HTMLElement {\n    constructor() {\n        super()\n        // Default options\n        this.contrast = CONTRAST_LIGHT\n        this.defaultPosition = 0\n        this.displayButtons = true\n        this.displayNav = true\n        this.displayCounter = false\n        this.displayGradients = false\n        this.itemsPerSlide = 1\n        this.overflow = true\n        this.overflowOpacity = 0.25\n        this.flexAuto = false\n        // Events\n        this.boundPrevClick = this.#onPrevClick.bind(this)\n        this.boundNextClick = this.#onNextClick.bind(this)\n        this.boundNavClick = this.#onNavClick.bind(this)\n        this.boundScroll = this.#onScroll.bind(this)\n    }\n\n    connectedCallback() {\n        this.slot = this.innerHTML\n        this.props = createProps(this.attributes)\n        this.#render()\n\n        // We need an id for event dispatcher\n        if (!this.id || this.id === 'undefined') {\n            this.id = this.props.testId ? this.props.testId : `slider_natural_${makeId(5)}`\n        }\n\n        this.#setProperties()\n\n        this.loops = 0\n        this.#waitForSliderToBeSized()\n            .then(() => {\n                this.initSlider()\n                this.#dispatchReady()\n            })\n            .catch(e => {\n                console.error(e)\n            })\n            .finally(() => {\n                if (this.wait) {\n                    clearInterval(this.wait)\n                    this.wait = null\n                }\n            })\n    }\n\n    #waitForSliderToBeSized() {\n        return new Promise((resolve, reject) => {\n            this.wait = setInterval(() => {\n                if (this.carousel.offsetWidth > 0) {\n                    return resolve()\n                }\n\n                this.loops += 1\n                if (this.loops === MAX_LOOP_TO_INIT) {\n                    return reject(\n                        'Error: slider width is ZERO even after 5s, cannot finish slider init'\n                    )\n                }\n            }, 100)\n        })\n    }\n\n    #set(key, value) {\n        const normalisedValue = this.#getOption(value)\n        if (normalisedValue !== undefined) {\n            this[convertToCamelCase(key)] = normalisedValue\n        }\n    }\n\n    #getOption(value) {\n        if (!isNaN(value)) {\n            return parseFloat(value)\n        } else if (value === 'true') {\n            return true\n        } else if (value === 'false') {\n            return false\n        } else {\n            return value\n        }\n    }\n\n    #setProperties() {\n        const { options, a11y_labels } = this.props\n\n        // Create refs to html elements\n        this.container = this.querySelector('.container')\n        this.wrapper = this.querySelector('.wrapper')\n        this.carousel = this.querySelector('ul')\n\n        // Set slider properties\n        this.currentIndex = 0\n        this.a11y_labels = a11y_labels\n        if (viewportHelper.is.mobile) {\n            this.options = options.mobile\n        } else if (viewportHelper.is.tablet) {\n            this.options = options.tablet\n        } else {\n            this.options = options.desktop\n        }\n\n        // Set options\n        for (const property in this.options) {\n            this.#set(property, this.options[property])\n        }\n\n        // If counter is displayed we force buttons and pagination to false\n        if (this.displayCounter) {\n            this.displayNav = this.displayButtons = false\n        }\n\n        // Overflow needs a class\n        if (this.overflow) {\n            this.container.classList.add('overflow')\n        }\n\n        // Contrast needs an attribute\n        this.buttonsContrast = getOppositeContrast(this.contrast)\n        this.setAttribute('contrast', this.contrast)\n\n        // Set CSS properties for non dynamic options\n        this.#setCssSlideMinHeight()\n        this.#setCssSliderGap()\n        this.#setCssPlaceholder()\n    }\n\n    /** Public Method **/\n    initSlider() {\n        // Get an updated number of items (if async we run again)\n        this.slidesElements = this.querySelectorAll('.nn-carousel > li:not(.safari-fix)')\n        this.itemNumber = this.slidesElements.length\n\n        // For asynchronous initSlider() we need to reset first itemWidth and itemPerSlide to get the original values before other calculations\n        this.#set('item_width', this.options['item_width'])\n        this.#set('items_per_slide', this.options['items_per_slide'])\n\n        // If itemsPerSlide is 'auto' we need to calculate it's real value based on itemWidth or scrollWidth / itemNumber\n        // We also need to set the CSS --item-width variable to handle the calculation correctly\n        if (this.itemsPerSlide === 'auto') {\n            this.#calculateItemsPerSlide()\n        }\n        this.#setCssSlideWidth()\n        this.#setCssItemsPerSlide()\n        this.#setCssFlexAuto()\n\n        // Other properties that can be set only after the rest\n        this.maxSlides = this.itemNumber - this.itemsPerSlide\n\n        // Finish rendering\n        this.#renderButtons()\n        this.#renderNav()\n        this.#renderCounter()\n        this.#renderGradients()\n\n        // Init methods in this order !\n        this.#applyCenteredLayout()\n        this.#getSliderPositions()\n        this.#getOpacityParams()\n        this.#setOpacity()\n        this.#updateStates()\n        this.#bindEvent()\n        this.#gotoDefaultPosition()\n\n        // Render this safariFix at the end because we don't want the extra li to be considered in sliderElements\n        this.#renderSafariFix()\n    }\n\n    #render() {\n        this.innerHTML = `<div class=\"container\"><div class=\"wrapper\"><ul class=\"nn-carousel\">${this.slot}</ul></div></div>`\n    }\n\n    #renderButtons() {\n        // Important: if maxSlides <= 0 it means we don't have scroll, so we don't need buttons\n        const hasNoButton = !this.displayButtons || this.maxSlides <= 0\n        if (hasNoButton) {\n            // Needed if we reinit\n            if (this.prevButton && this.nextButton) {\n                this.prevButton.remove()\n                this.nextButton.remove()\n            }\n            return\n        }\n\n        // Check if button exists already (for async content in order to avoid creating two occurrences)\n        if (!this.prevButton) {\n            this.prevButton = this.#renderButton('prev')\n        }\n        if (!this.nextButton) {\n            this.nextButton = this.#renderButton('next')\n        }\n    }\n\n    #renderButton(pos, renderInCounter = false) {\n        const { creative = '', id = '', name = '', position = '' } = this.props.campaign ?? {}\n        const buttonContrast = renderInCounter ? this.contrast : this.buttonsContrast\n        const isPrev = pos === 'prev'\n\n        const buttonEl = document.createElement('nb-cta')\n        buttonEl.classList.add(pos)\n        setAttributes(buttonEl, {\n            variation: 'navigation',\n            contrast: buttonContrast,\n            size: '48',\n            icon_right: isPrev ? '24/symbol/chevron-left' : '24/symbol/chevron-right',\n            label: this.a11y_labels[pos],\n            campaign_creative: creative,\n            campaign_id: id,\n            campaign_name: name,\n            campaign_position: position\n        })\n        if (!renderInCounter) {\n            isPrev ? this.container.prepend(buttonEl) : this.container.append(buttonEl)\n        } else {\n            isPrev ? this.counter.prepend(buttonEl) : this.counter.append(buttonEl)\n        }\n        return buttonEl\n    }\n\n    #renderNav() {\n        if (!this.displayNav || this.maxSlides === 0) {\n            // Needed if we reinit\n            if (this.nav) {\n                this.nav.remove()\n            }\n            return\n        }\n\n        // Check if nav exists already (for async content in order to avoid creating two occurrences)\n        if (this.nav) {\n            this.nav.remove()\n        }\n\n        const nav = document.createElement('nav')\n\n        let bullets = ''\n        for (let i = 0; i <= this.maxSlides; i++) {\n            bullets += this.#renderBullet(i)\n        }\n\n        nav.innerHTML = `${bullets}`\n\n        this.appendChild(nav)\n        this.nav = this.querySelector('nav')\n        this.navElements = this.querySelectorAll('nav button')\n    }\n\n    #renderBullet(index) {\n        return `<button data-item='${index}' aria-label='${this.a11y_labels.nav} ${index}'><span></span></button>`\n    }\n\n    #renderCounter() {\n        if (!this.displayCounter || this.maxSlides === 0) {\n            // Needed if we reinit\n            if (this.counter) {\n                this.counter.remove()\n            }\n            return\n        }\n\n        // Check if counter exists already (for async content in order to avoid creating two occurrences)\n        if (this.counter) {\n            this.counter.remove()\n        }\n\n        this.counter = document.createElement('div')\n        this.counter.classList.add('counter')\n        this.counter.classList.add('t-sm-500')\n        this.counter.setAttribute('aria-hidden', 'true')\n\n        this.counter.innerHTML = `<span class='current'>${this.currentIndex + 1}</span>\n        <span>/</span>\n        <span>${this.maxSlides + 1}</span>`\n\n        this.prevButton = this.#renderButton('prev', true)\n        this.nextButton = this.#renderButton('next', true)\n\n        this.appendChild(this.counter)\n    }\n\n    #renderGradients() {\n        if (!this.displayGradients || this.overflow) {\n            return\n        }\n\n        if (this.gradientsWidth) {\n            this.#setCss('--gradients-width', this.gradientsWidth, true)\n        }\n\n        if (this.gradientsColor) {\n            this.#setCss('--gradients-color', this.gradientsColor)\n            this.#setCss('--gradients-color-transparent', this.gradientsColor + '00')\n        }\n\n        this.container.classList.add('hasGradients')\n    }\n\n    #renderSafariFix() {\n        // In safari, both Desktop and iOS, the scroll doesn't reach the end, because the scroll-padding on the right side seems to not been taken into account\n        // Same bug is happening in Chrome on iOS (seems to use Safari webkit rendering)\n        // The fix is to render an extra <li> with the size equal to the scroll-padding\n        if (!this.overflow || !isSafari()) {\n            return\n        }\n\n        // Check if safariFix exists already (for async content in order to avoid creating two occurences)\n        if (!this.safariFix) {\n            this.safariFix = document.createElement('li')\n            this.safariFix.classList.add('safari-fix')\n            this.safariFix.setAttribute('aria-hidden', true)\n            this.carousel.appendChild(this.safariFix)\n        }\n\n        const safariFixWidth = (this.paddingCorrection - this.sliderGap) / BROWSER_CONTEXT\n        this.safariFix.style.setProperty('width', safariFixWidth + 'rem')\n    }\n\n    #calculateItemsPerSlide() {\n        // For asynchronous slider content, if initSlider() is called twice, we need to remove first this class\n        this.carousel.classList.remove('no-slides')\n\n        let itemWidth = this.itemWidth\n\n        // If itemWidth is not provided or 'auto', we need to calculate an average width for items that doesn't have fixed width\n        if (this.itemWidth === undefined || this.itemWidth === 'auto') {\n            itemWidth =\n                (this.carousel.scrollWidth - this.sliderGap * (this.itemNumber - 1)) /\n                this.itemNumber\n        }\n\n        this.itemsPerSlide = Math.floor(this.carousel.offsetWidth / itemWidth)\n        // TODO: the fix below doesn't work, needs to be resolved.\n        // const isLastElementSingle =\n        //     this.slidesElements[this.slidesElements.length - 2].offsetWidth +\n        //         this.slidesElements[this.slidesElements.length - 1].offsetWidth >\n        //     this.carousel.offsetWidth\n\n        // this.itemsPerSlide = isLastElementSingle\n        //     ? 0\n        //     : Math.floor(this.carousel.offsetWidth / itemWidth)\n    }\n\n    #getSliderPositions() {\n        this.sliderPositions = []\n        this.maxScroll = this.carousel.scrollWidth - this.carousel.offsetWidth\n\n        if (this.slidesElements.length === 0) {\n            return\n        }\n\n        // We need to manage the first item initial position in case the slides are\n        // visible on each side (equivalent to scroll-padding CSS of ul.nn-carousel)\n        const firstItemOffsetLeft = this.slidesElements[0].offsetLeft\n\n        this.querySelectorAll('.nn-carousel > li:not(.safari-fix)').forEach(element => {\n            this.sliderPositions.push(element.offsetLeft - firstItemOffsetLeft)\n        })\n    }\n\n    #setCss(name, value, isRem = false) {\n        this.style.setProperty(name, isRem ? value / BROWSER_CONTEXT + 'rem' : value)\n    }\n\n    #setCssSlideWidth() {\n        if (this.itemWidth === 'auto') {\n            const itemWidthAuto =\n                (this.container.clientWidth - (this.itemsPerSlide - 1) * this.sliderGap) /\n                (this.itemsPerSlide || 1)\n            this.#setCss('--item-width', itemWidthAuto, true)\n        } else if (this.itemWidth) {\n            this.#setCss('--item-width', this.itemWidth, true)\n        }\n    }\n\n    #setCssSlideMinHeight() {\n        if (this.slideMinHeight === 'auto') {\n            this.#setCss('--slide-min-height', 'auto')\n        } else if (this.slideMinHeight !== undefined) {\n            this.#setCss('--slide-min-height', this.slideMinHeight, true)\n        }\n    }\n\n    #setCssSliderGap() {\n        if (this.sliderGap || this.sliderGap === 0) {\n            this.#setCss('--slider-gap', this.sliderGap, true)\n        }\n    }\n\n    #setCssFlexAuto() {\n        if (this.flexAuto) {\n            this.carousel.classList.add('flex-auto')\n        }\n    }\n\n    #setCssPlaceholder() {\n        if (this.placeholderBackground) {\n            this.#setCss('--placeholder-background', this.placeholderBackground)\n        }\n    }\n\n    #setCssItemsPerSlide() {\n        this.#setCss('--items-per-slide', this.itemsPerSlide)\n    }\n\n    #applyCenteredLayout() {\n        if (this.maxSlides > 0) {\n            return\n        }\n        // If maxSlides is 0 or negative, it means that we have less items than needed to fulfill the carousel width\n        // So to center the items (for example the bubbles when only 3) we need to apply a justify-content: center fix\n        this.carousel.classList.add('no-slides')\n    }\n\n    /** Public Method **/\n    updateSlider(index, instantly = false) {\n        this.#getSliderPositions()\n        this.goToSlide(parseInt(index), instantly)\n    }\n\n    #updateStates() {\n        this.#setActiveButtons()\n        this.#setActiveBullet()\n        this.#setCounter()\n        this.#setActiveSlides()\n    }\n\n    #updateStatesScroll(index) {\n        this.#setActiveButtons(index)\n        this.#setCounter()\n    }\n\n    #setActiveButtons(currentIndex) {\n        if ((!this.displayButtons || this.maxSlides <= 0) && !this.displayCounter) {\n            return\n        }\n\n        // First we remove all hide classes (because with pagination we can move from more than 2 slides)\n        this.prevButton.classList.remove('hide')\n        this.nextButton.classList.remove('hide')\n\n        // Then we reset hide class on the right button\n        if (this.currentIndex === 0) {\n            this.prevButton.classList.add('hide')\n        } else if (this.currentIndex === this.maxSlides || currentIndex === this.maxSlides) {\n            this.nextButton.classList.add('hide')\n        }\n    }\n\n    #setActiveBullet() {\n        if (!this.displayNav || this.maxSlides <= 0) {\n            return\n        }\n\n        this.navElements.forEach(item => {\n            item.classList.remove('active')\n        })\n\n        this.navElements[this.currentIndex].classList.add('active')\n    }\n\n    #setCounter() {\n        if (!this.displayCounter || this.maxSlides === 0) {\n            return\n        }\n\n        if (!this.displayCounter) {\n            return\n        }\n\n        this.counter.querySelector('.current').textContent = parseInt(this.currentIndex + 1)\n    }\n\n    #setActiveSlides() {\n        // If we have no items overflowing on each side, we don't need to manage disabled slides\n        if (!this.overflow) {\n            return\n        }\n\n        this.slidesElements.forEach(element => {\n            element.setAttribute('aria-disabled', 'true')\n        })\n\n        let tempIndex = parseInt(this.currentIndex)\n        for (let i = 0; i < this.itemsPerSlide; i++) {\n            if (this.slidesElements[tempIndex + i]) {\n                this.slidesElements[tempIndex + i].removeAttribute('aria-disabled')\n            }\n        }\n    }\n\n    /** Public Method **/\n    goToSlide(index, instantly = false) {\n        if (index !== undefined) {\n            this.currentIndex = index\n        }\n\n        // If index is over maxSlides, it means we reached out the end of scroll, so we don't need to update states anymore\n        if (index < this.maxSlides) {\n            this.#updateStates()\n        }\n\n        // We scroll to the right position (scrollTo duration is approx 750ms)\n        this.carousel.scrollTo({\n            left: this.sliderPositions[parseInt(this.currentIndex, 10)],\n            behavior: instantly ? 'auto' : 'smooth'\n        })\n    }\n\n    #gotoDefaultPosition() {\n        if (this.defaultPosition === 0 || this.defaultPosition > this.maxSlides + 1) {\n            return\n        }\n        this.goToSlide(this.defaultPosition, true)\n    }\n\n    #onScroll() {\n        // Clear our timeout throughout the scroll\n        if (this.isScrolling) {\n            clearTimeout(this.isScrolling)\n        }\n\n        this.#setOpacity()\n\n        // Set a timeout to run after scrolling ends\n        this.isScrolling = setTimeout(() => {\n            // Update the expected scroll positions again as sometimes they are initially incorrect\n            this.#getSliderPositions()\n\n            const carouselScrollLeft = Math.round(this.carousel.scrollLeft)\n\n            // Ideal use case (exact pixel value)\n            let index = this.sliderPositions.indexOf(carouselScrollLeft)\n\n            // Sometimes the scrollLeft value can be +1 or -1 pixels. If the position is not found\n            // then the index will be -1. In this case, try searching the list of positions to see\n            // if the scroll position is one pixel left or right of the expected position (hence\n            // using -1 and +1 in the indexOf() call below)\n            if (index === -1) {\n                index = this.sliderPositions.indexOf(carouselScrollLeft - 1)\n            }\n            if (index === -1) {\n                index = this.sliderPositions.indexOf(carouselScrollLeft + 1)\n            }\n\n            // For items with flexible width (flex_auto) the last position of the scroll can not match an exact SliderPositions\n            if (carouselScrollLeft === this.maxScroll) {\n                index = this.maxSlides\n            }\n\n            if (index >= 0) {\n                this.#switchBullets(index, true)\n            }\n\n            this.#updateStatesScroll(index)\n        }, 100)\n    }\n\n    #getOpacityParams() {\n        if (!this.overflow || !this.slidesElements.length) {\n            return\n        }\n        // Set properties used for slide opacity calculation in #setOpacity()\n        this.paddingCorrection = parseInt(\n            getComputedStyle(this.carousel).getPropertyValue('padding-left')\n        )\n\n        this.itemWidthAdjusted = this.slidesElements[0].offsetWidth + this.sliderGap\n    }\n\n    #setOpacity() {\n        if (!this.overflow) {\n            return\n        }\n        const scrollX = this.carousel.scrollLeft\n\n        this.slidesElements.forEach((item, index) => {\n            // Adjust item offsetLeft because of slider padding on each side\n            const itemOffsetLeft = item.offsetLeft - this.paddingCorrection\n            // Adjust item offsetLeft to add itemWidth + sliderGap\n            let itemX = itemOffsetLeft + this.itemWidthAdjusted\n\n            // Determine if we need to calculate left or right items\n            let percentage = 100\n\n            if (scrollX > itemX) {\n                // Avoid calculation if item is outside on left\n                percentage = 0\n            } else if (scrollX >= this.itemWidthAdjusted * index) {\n                // Do left calculations\n                percentage = Math.round(((itemX - scrollX) / this.itemWidthAdjusted) * 100)\n            } else if (scrollX < itemX - (1 + this.itemsPerSlide) * this.itemWidthAdjusted) {\n                // Avoid calculation if item is outside on right\n                percentage = 0\n            } else if (scrollX <= itemX - this.itemsPerSlide * this.itemWidthAdjusted) {\n                // Do right calculations\n                percentage = Math.round(\n                    (this.itemsPerSlide + 1) * 100 -\n                        ((itemX - scrollX) / this.itemWidthAdjusted) * 100\n                )\n            }\n\n            const opacityPercentage = percentage / 100\n            let finalOpacity =\n                Math.round(\n                    (opacityPercentage * (1 - this.overflowOpacity) + this.overflowOpacity) * 100\n                ) / 100\n\n            item.firstElementChild.style.setProperty('opacity', finalOpacity)\n        })\n    }\n\n    #switchBullets(index, alreadyScrolled = false) {\n        if (!this.slidesElements[index]) {\n            return\n        }\n\n        this.currentIndex = index\n\n        // only fires goToSlide if user clicks on pagination buttons\n        if (!alreadyScrolled) {\n            this.goToSlide()\n        } else {\n            this.#updateStates()\n        }\n    }\n\n    #onPrevClick() {\n        if (this.currentIndex > 0) {\n            this.currentIndex = this.currentIndex - 1\n            this.#updateStates()\n        }\n        this.goToSlide()\n    }\n\n    #onNextClick() {\n        if (this.currentIndex < this.maxSlides) {\n            this.currentIndex = this.currentIndex + 1\n            this.#updateStates()\n        }\n        this.goToSlide()\n    }\n\n    #onNavClick(e) {\n        this.currentIndex = parseInt(e.target.dataset.item)\n        this.#setActiveBullet()\n        this.#switchBullets(this.currentIndex)\n    }\n\n    #dispatchReady() {\n        dispatchEvent({\n            eventName: EVENT_SLIDER_READY,\n            args: { id: this.id },\n            element: this\n        })\n    }\n\n    #bindEvent() {\n        this.#unbindEvent()\n\n        this.carousel.addEventListener('scroll', this.boundScroll)\n        if (this.prevButton) {\n            this.prevButton.addEventListener('click', this.boundPrevClick)\n        }\n        if (this.nextButton) {\n            this.nextButton.addEventListener('click', this.boundNextClick)\n        }\n        if (this.navElements) {\n            this.navElements.forEach(element => {\n                element.addEventListener('click', this.boundNavClick)\n            })\n        }\n    }\n\n    #unbindEvent() {\n        this.carousel.removeEventListener('scroll', this.boundScroll)\n        if (this.prevButton) {\n            this.prevButton.removeEventListener('click', this.boundPrevClick)\n        }\n        if (this.nextButton) {\n            this.nextButton.removeEventListener('click', this.boundNextClick)\n        }\n        if (this.navElements) {\n            this.navElements.forEach(element => {\n                element.removeEventListener('click', this.boundNavClick)\n            })\n        }\n    }\n\n    disconnectedCallback() {\n        this.#unbindEvent()\n    }\n}\n\ncustomElements.get('nb-slider-natural') || customElements.define('nb-slider-natural', SliderNatural)\n\nexport default SliderNatural\n","import { CONTRAST_DARK, CONTRAST_LIGHT } from '@kissui/components'\n\nexport const getOppositeContrast = contrast => {\n    return contrast === CONTRAST_LIGHT ? CONTRAST_DARK : CONTRAST_LIGHT\n}\n","export const isIOS = () => {\n    const agent = window.navigator.userAgent,\n        start = agent.indexOf('OS ')\n    return (agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1\n}\n\nexport const isMacOS = () => {\n    const agent = window.navigator.userAgent,\n        start = agent.indexOf('OS ')\n    return agent.indexOf('Mac') > -1 && start > -1\n}\n\nexport const isApple = () => {\n    const agent = window.navigator.userAgent,\n        start = agent.indexOf('OS ')\n    return (\n        (agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1 || agent.indexOf('Mac') > -1) &&\n        start > -1\n    )\n}\n\nexport const isAndroid = () => {\n    const agent = window.navigator.userAgent,\n        start = agent.indexOf('Android ')\n    return start > -1\n}\n\nexport const isHuawei = () => {\n    const agent = window.navigator.userAgent,\n        start = agent.indexOf('HUAWEI'),\n        devices = navigator.userAgent.match(\n            /ALP-|AMN-|ANA-|ANE-|ANG-|AQM-|ARS-|ART-|ATU-|BAC-|BLA-|BRQ-|CAG-|CAM-|CAN-|CAZ-|CDL-|CDY-|CLT-|CRO-|CUN-|DIG-|DRA-|DUA-|DUB-|DVC-|ELE-|ELS-|EML-|EVA-|EVR-|FIG-|FLA-|FRL-|GLK-|HMA-|HW-|HWI-|INE-|JAT-|JEF-|JER-|JKM-|JNY-|JSC-|LDN-|LIO-|LON-|LUA-|LYA-|LYO-|MAR-|MED-|MHA-|MLA-|MRD-|MYA-|NCE-|NEO-|NOH-|NOP-|OCE-|PAR-|PIC-|POT-|PPA-|PRA-|RNE-|SEA-|SLA-|SNE-|SPN-|STK-|TAH-|TAS-|TET-|TRT-|VCE-|VIE-|VKY-|VNS-|VOG-|VTR-|WAS-|WKG-|WLZ-|YAL/i\n        )\n    return start > -1 || devices !== null\n}\n\nexport const isSafari = () => {\n    // https://stackoverflow.com/questions/7944460/detect-safari-browser\n    // This includes Chrome on IOS which seems to be Safari, So it's fully OK !\n    const agent = window.navigator.userAgent\n    return /^((?!chrome|android).)*safari/i.test(agent)\n}\n\nexport const isWebInspector = () => {\n    // https://stackoverflow.com/questions/19877924/what-is-the-list-of-possible-values-for-navigator-platform-as-of-today\n    // If we are in a web inspector, in our Nespresso context platform can be MacIntel or eventually Win32 for windows users\n    const platform = window.navigator.platform\n    return platform.indexOf('MacIntel') > -1 || platform.indexOf('Win32') > -1\n}\n","const createRefs = component => [...component.querySelectorAll('[data-ref]')].reduce(extract, {})\n\nconst extract = (refs, $ref) => {\n    const { ref } = $ref.dataset\n\n    // Check if ref is of type array\n    const refArray = ref.match(/(\\w+)\\[(.+)\\]/)\n\n    if (refArray !== null) {\n        return getRefArray(refs, $ref, refArray)\n    } else {\n        return { ...refs, [$ref.dataset.ref]: $ref }\n    }\n}\n\nconst getRefArray = (refs, $ref, [, name, index]) => {\n    if (refs[name] === undefined) {\n        refs[name] = []\n    }\n    refs[name][index] = $ref\n    return refs\n}\n\nexport default createRefs\n","import viewportHelper from './viewport.helpers'\n\n/**\n * Resize image on the fly by Akamai\n * https://dsu-confluence.nestle.biz/x/06kaCQ\n * https://dsu-confluence.nestle.biz/display/EUXUI/Performance?preview=/152742355/152761429/IMPoliciesExtract-31072020.docx\n * @param {''|'carouselBannerNarrowMedium'|'carouselBannerWide'|'horizontalBannerNarrow'|'landscapeRecipeDetails'|'large'|'medium'|'portraitRecipeDetails'|'productPdpMainDefault'|'productPdpMain'|'productPdpSafeZone'|'product'|'recipeCard'|'registrationTechChoiceMediumLarge'|'resize_crop'|'small'} policy - IM Policy coming from Akamaï\n * @param {24|150|320|640|1024|2048|5000} width - IM Width size of the image\n * @returns {string} - Rules apply in a query string parameter\n */\nexport const getImpolicy = (policy = 'product', width = 160) => {\n    const rules = []\n\n    if (policy) {\n        rules.push(`impolicy=${policy}`)\n    }\n\n    if (width) {\n        rules.push(`imwidth=${width}`)\n    }\n\n    return `?${rules.join('&')}`\n}\n\n/**\n * Ask the right resolution depending on breakpoint, returns the closest one\n * No need to give a retina resolution, Akamai will return Retina automatically (you need to give the normal resolution)\n * @param {''|'medium'} policy - IM Policy coming from Akamaï, default is medium because it have the largest batch of resolutions\n * @param {''|'375'} mobileWidth - Mobile image width to be served  | 375 default is full mobile screen width\n * @param {''|'1024'} tabletWidth - Tablet image width to be served | 1024 default is full tablet landscape screen width\n * @param {''|'1920'} desktopWidth - Desktop image width to be served | 1024 default is full tablet landscape screen width\n * @returns {string} - Rules to concatenate to your image url\n */\nexport const getResponsiveImpolicy = (\n    policy = 'medium',\n    mobileWidth = '375',\n    tabletWidth = '1024',\n    desktopWidth = '1920',\n    retinaWidth = '3840'\n) => {\n    if (viewportHelper.is.mobile) {\n        return getImpolicy(policy, mobileWidth)\n    } else if (viewportHelper.is.tablet) {\n        return getImpolicy(policy, tabletWidth)\n    } else if (viewportHelper.is.desktop) {\n        return getImpolicy(policy, desktopWidth)\n    } else {\n        return getImpolicy(policy, retinaWidth)\n    }\n}\n","export const STATE_DEFAULT = 'default'\nexport const STATE_SELECTED = 'selected'\nexport const STATE_DISABLED = 'disabled'\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport createRefs from '@kissui/helpers/src/refs.helpers'\nimport { lazyLoad, getHashLink } from '@kissui/helpers/src/utils'\nimport { getResponsiveImpolicy } from '@kissui/helpers/src/impolicy'\nimport { selectPromotion } from '@kissui/helpers/src/gtmEvents'\n\nimport { STATE_SELECTED, STATE_DISABLED } from './js/constants'\n\nclass Bubble extends HTMLElement {\n    constructor() {\n        super()\n        this.classList.add('nb-bubble')\n    }\n\n    static get observedAttributes() {\n        return ['state']\n    }\n\n    attributeChangedCallback(name) {\n        if (name === 'state') {\n            this.setState()\n        }\n    }\n\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.render()\n        this.refs = createRefs(this)\n        this.initLazyLoad()\n        this.initTracking()\n    }\n\n    initTracking() {\n        const { label, campaign } = this.props\n\n        const link = this.querySelector('a')\n\n        if (link) {\n            link.onclick = () => {\n                selectPromotion({\n                    cta_name: label,\n                    ...campaign\n                })\n            }\n        }\n    }\n\n    initLazyLoad() {\n        let { src = '', src_retina = '' } = this.props.visual\n        const { visual } = this.refs\n\n        // If src_retina is not provided by markets, then takes the src as default\n        if (src_retina === '') {\n            src_retina = src\n        }\n\n        src_retina += getResponsiveImpolicy('small', '144', '160', '80', '160')\n        src_retina += '&imdensity=1'\n\n        if (visual && src_retina) {\n            lazyLoad(visual, 'src', `${src_retina}`, src_retina)\n        }\n    }\n\n    render() {\n        const { label, link, state, a11y_scrollto = 'Scroll to' } = this.props\n        const { linkNoHash, linkHash } = getHashLink(link)\n\n        this.innerHTML = `\n            ${\n                state === STATE_DISABLED\n                    ? this.renderVisual()\n                    : `<a href=\"${linkHash}\" data-href=\"${linkNoHash}\" aria-label='${a11y_scrollto} ${label}'>\n                ${this.renderVisual()}\n            </a>`\n            }\n\n            ${this.renderLabel()}\n        `\n\n        this.link = this.querySelector('a')\n        this.label = this.querySelector('span')\n        state && this.setAttribute('state', state)\n        this.setTheme()\n    }\n\n    setState() {\n        const state = this.getAttribute('state')\n\n        if (state === STATE_SELECTED) {\n            this.link.setAttribute('aria-current', 'true')\n            this.label.classList.add('t-xs-700-sl')\n            this.label.classList.remove('t-xs-500-sl')\n        } else {\n            if (state !== STATE_DISABLED) {\n                this.link.removeAttribute('aria-current')\n            }\n\n            this.label.classList.remove('t-xs-700-sl')\n            this.label.classList.add('t-xs-500-sl')\n        }\n    }\n\n    setTheme() {\n        const { theme } = this.props\n\n        if (theme && theme !== '') {\n            this.style.setProperty('--placeholder-background', theme)\n        }\n    }\n\n    renderVisual() {\n        let { src = '', src_retina = '' } = this.props.visual\n        const { state } = this.props\n\n        if (src === '' && src_retina === '') {\n            return ''\n        }\n\n        // Image is decorative, we can have alt=\"\" and aria-hidden should be true\n        return `<img src=\"\" alt=\"\" aria-hidden=\"true\" data-ref=\"visual\" ${\n            state === STATE_DISABLED ? 'class=\"is-disabled\"' : ''\n        }/>`\n    }\n\n    renderLabel() {\n        const { label, state } = this.props\n\n        if (!label) {\n            return\n        }\n\n        return `<span class=\"t-xs-500-sl ${\n            state === STATE_DISABLED ? 'is-disabled' : ''\n        }\">${label}</span>`\n    }\n}\n\ncustomElements.get('nb-bubble') || customElements.define('nb-bubble', Bubble)\n\nexport default Bubble\n","/**\n * @typedef {Object} ObserverItem\n * @property {String} selector - target element selector\n * @property {Object} options - IntersectionObserver options\n * @property {Function} callback - function to call on threshold crossed\n */\n\nclass IntersectionObserverService {\n    constructor() {\n        this.observers = new Map()\n    }\n\n    /**\n     * Creates a Map of ObserverItem objects, unique for each selector provided.\n     * Each selector has its own configurable observer, target elements and callback.\n     * Observers can be individually unobserved / destroyed.\n     * @param {ObserverItem[]} observables\n     */\n    create(observables) {\n        observables.forEach(({ selector, callback, options }) => {\n            if (this.observers.has(selector)) {\n                console.warn(`Observer for selector \"${selector}\" already exists`)\n                return\n            }\n\n            const targets = document.querySelectorAll(selector)\n\n            if (targets.length === 0) {\n                console.warn(`No elements found for selector \"${selector}\"`)\n                return\n            }\n\n            const observer = new IntersectionObserver(callback, options)\n            targets.forEach(element => observer.observe(element))\n            this.observers.set(selector, { observer, targets })\n        })\n    }\n\n    /**\n     * Unobserve for specified selector\n     * @param {String} selector\n     */\n    unobserve(selector) {\n        const entry = this.observers.get(selector)\n\n        if (entry) {\n            const { observer, targets } = entry\n            targets.forEach(element => observer.unobserve(element))\n        } else {\n            console.warn(`No observer found for selector \"${selector}\"`)\n        }\n    }\n\n    /**\n     * Disconnect observer for specified selector\n     * @param {String} selector\n     */\n    destroy(selector) {\n        const entry = this.observers.get(selector)\n\n        if (entry) {\n            const { observer } = entry\n            observer.disconnect()\n            this.observers.delete(selector)\n        } else {\n            console.warn(`No observer found for selector \"${selector}\"`)\n        }\n    }\n\n    /**\n     * Disconnect all observers\n     */\n    destroyAll() {\n        this.observers.forEach(entry => {\n            entry.observer.disconnect()\n        })\n\n        this.observers.clear()\n    }\n}\n\nexport default IntersectionObserverService\n","export default class Deferred {\n    constructor() {\n        this.promise = new Promise((resolve, reject) => {\n            this.reject = reject\n            this.resolve = resolve\n        })\n    }\n}\n","import Deferred from './deferred'\n\nconst resolveScrollPosition = (scrollTo: HTMLElement | string | number, scrollPaddingTop = 140) => {\n    if (typeof scrollTo === \"number\") {\n        return scrollTo\n    }\n\n    const scrollToElement = typeof scrollTo === \"object\" ? scrollTo : document.querySelector(scrollTo)\n\n    if (scrollToElement === null && typeof scrollTo === \"string\") {\n        throw new Error(`error: No element found with the selector \"${scrollTo}\"`)\n    }\n\n    return window.scrollY + scrollToElement!.getBoundingClientRect().top - scrollPaddingTop\n}\n\nconst resolveScrollDuration = (scrollDuration: number, deltaScroll: number) => {\n    const viewportHeight = window.innerHeight\n    const bodyHeight = document.body.clientHeight\n\n    if (deltaScroll > viewportHeight && bodyHeight - viewportHeight > 0) {\n        return Math.abs(\n            scrollDuration +\n            scrollDuration * (Math.abs(deltaScroll) / (bodyHeight - viewportHeight))\n        )\n    }\n    return scrollDuration\n}\n/**\n * Smooth scroll-to inspired by:\n * http://stackoverflow.com/a/24559613/728480\n */\nconst scrollTo = (scrollTo: HTMLElement | string | number = 0, options: { scrollPaddingTop?: number, scrollDuration?: number } = {}) => {\n    const { scrollDuration: baseScrollDuration = 300 } = options\n    const deferred = new Deferred()\n\n    let scrollPosition: number = 0;\n\n    try {\n        scrollPosition = resolveScrollPosition(scrollTo, options.scrollPaddingTop)\n    }\n    catch (error) {\n        console.error(error)\n        return\n    }\n\n    let currentTime = 0\n    const initialTimestamp = window.performance.now()\n    const initialScroll = window.scrollY\n    const deltaScroll = initialScroll - scrollPosition\n\n    const scrollDuration = resolveScrollDuration(baseScrollDuration, deltaScroll)\n\n    const finalTimestamp = initialTimestamp + scrollDuration\n\n    function step() {\n        const currentTimestamp = window.performance.now()\n        if (currentTimestamp < finalTimestamp) {\n            currentTime = (currentTimestamp - initialTimestamp) / scrollDuration\n            currentTime = --currentTime * currentTime * currentTime + 1\n            const moveStep = deltaScroll * currentTime\n            window.scrollTo(0, scrollPosition + (deltaScroll - moveStep))\n            window.requestAnimationFrame(step)\n        } else {\n            window.scrollTo(0, scrollPosition)\n            setTimeout(() => deferred.resolve(undefined), 125)\n        }\n        return deferred.promise\n    }\n\n    window.requestAnimationFrame(step)\n    return deferred.promise\n}\n\nexport default scrollTo\n","export const EVENT_NAVIGATION_SECTION_CHANGE = 'EVENT_NAVIGATION_SECTION_CHANGE'\n\n// In mobile / tablet / sticky  we need a dynamic number of slides as it's a variable width\n// This 'auto' value is valid with new slider-natural, it calculates the available space and set automatically the good itemsPerSlide\nexport const NB_SLIDES_MOBILE = 'auto'\nexport const NB_SLIDES_TABLET = 'auto'\nexport const NB_SLIDES_DESKTOP = 9\nexport const NB_SLIDES_STICKY = 'auto'\n\nexport const INTERSECTION_RATIOS_SECTION = [0.2, 0.8]\n\nexport const BUBBLE_MOBILE_WIDTH = '104'\nexport const BUBBLE_TABLET_DESKTOP_WIDTH = '112'\nexport const GRADIENT_WIDTH = '8'\n\nexport const SLIDER_CONFIG_DEFAULT = {\n    display_gradients: 'true',\n    display_nav: 'false',\n    overflow: 'false',\n    placeholder_background: 'transparent',\n    slide_min_height: 'auto',\n    slider_gap: '0'\n}\n","import { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport eventsHelper from '@kissui/helpers/src/events.helpers'\nimport IntersectionObserverService from '@kissui/helpers/src/intersection-observer.service'\nimport createProps from '@kissui/helpers/src/props.helpers.js'\nimport createRefs from '@kissui/helpers/src/refs.helpers'\nimport scrollTo from '@kissui/helpers/src/scrollTo'\nimport { getHashLink, stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport { COLOR_WHITE_1000 } from '../constants.mjs'\nimport eventsManager from './services/events.manager'\n\nimport { BREAKPOINT_M } from '@kissui/components'\nimport {\n    BUBBLE_MOBILE_WIDTH,\n    BUBBLE_TABLET_DESKTOP_WIDTH,\n    EVENT_NAVIGATION_SECTION_CHANGE,\n    GRADIENT_WIDTH,\n    INTERSECTION_RATIOS_SECTION,\n    NB_SLIDES_DESKTOP,\n    NB_SLIDES_MOBILE,\n    NB_SLIDES_STICKY,\n    NB_SLIDES_TABLET,\n    SLIDER_CONFIG_DEFAULT\n} from './data/constants'\n\nclass NavigationBubbles extends HTMLElement {\n    constructor() {\n        super()\n        this.isMobile = window.innerWidth < BREAKPOINT_M\n        // Used to prevent observer to fire a section change event\n        // if navigation click already did it\n        this.isScrolling = false\n        this.scrollObserver = new IntersectionObserverService()\n    }\n\n    connectedCallback() {\n        this.props = createProps(this.attributes)\n        this.classList.add('nb-navigation-bubbles')\n        this.sticky = this.isSticky()\n        this.type = this.sticky ? 'Chip' : 'Bubble'\n        this.isCenteredItems = this.props.is_centered_items ? 'true' : 'false'\n        this.setAttribute('type', this.type.toLowerCase())\n        this.setAttribute('is-centered-items', this.isCenteredItems)\n        this.init()\n    }\n\n    isSticky() {\n        if (!this.props) {\n            return false\n        }\n        const { sticky = 'false' } = this.props\n        return sticky === 'true'\n    }\n\n    init() {\n        this.render()\n        this.refs = createRefs(this)\n        this.slider = this.querySelector('nb-slider-natural')\n        this.eventsListeners = eventsManager(this).createListeners(this.slider)\n        this.scrollObserver.create([\n            {\n                selector: '[data-id]',\n                callback: this.onSectionChange,\n                options: {\n                    threshold: INTERSECTION_RATIOS_SECTION,\n                    rootMargin: '-160px 0px 0px 0px'\n                }\n            }\n        ])\n    }\n\n    render() {\n        this.innerHTML = `${this.renderNavigation()}`\n    }\n\n    getSliderOptions() {\n        return {\n            flex_auto: this.sticky ? 'true' : 'false',\n            gradients_color: this.sticky ? COLOR_WHITE_1000 : undefined,\n            gradients_width: this.sticky ? GRADIENT_WIDTH : undefined,\n            ...SLIDER_CONFIG_DEFAULT\n        }\n    }\n\n    renderNavigation() {\n        const {\n            slider_id,\n            a11y_slider_previous_button,\n            a11y_slider_next_button,\n            a11y_goto_slide = 'Goto slide',\n            campaign\n        } = this.props\n\n        // Pass render function name by element type (Chip/Bubble)\n        const list = this.renderList(`render${this.type}`)\n\n        const sliderOptions = this.getSliderOptions()\n        const sliderData = {\n            options: {\n                mobile: {\n                    items_per_slide: this.sticky ? NB_SLIDES_STICKY : NB_SLIDES_MOBILE,\n                    item_width: this.sticky ? 'auto' : BUBBLE_MOBILE_WIDTH,\n                    display_buttons: 'false',\n                    ...sliderOptions\n                },\n                tablet: {\n                    items_per_slide: this.sticky ? NB_SLIDES_STICKY : NB_SLIDES_TABLET,\n                    item_width: this.sticky ? 'auto' : BUBBLE_TABLET_DESKTOP_WIDTH,\n                    display_buttons: 'true',\n                    ...sliderOptions\n                },\n                desktop: {\n                    items_per_slide: this.sticky ? NB_SLIDES_STICKY : NB_SLIDES_DESKTOP,\n                    item_width: this.sticky ? 'auto' : BUBBLE_TABLET_DESKTOP_WIDTH,\n                    ...sliderOptions\n                }\n            },\n            a11y_labels: {\n                prev: a11y_slider_previous_button,\n                next: a11y_slider_next_button,\n                nav: a11y_goto_slide\n            },\n            campaign\n        }\n\n        const slider = `<nb-slider-natural\n            id='${slider_id}'\n            data=\"${stringifyForAttribute(sliderData)}\"\n            data-ref=\"slider${this.type}\">\n            ${list}\n        </nb-slider-natural>`\n\n        if (this.sticky) {\n            return slider\n        }\n\n        return `<nb-container contrast=\"light\">${slider}</nb-container>`\n    }\n\n    renderList(renderFunction) {\n        const { bubbles = [] } = this.props\n\n        const output = bubbles\n            .map(bubble => ({ ...bubble, campaign: this.props.campaign || undefined }))\n            .map(bubble => this[renderFunction](bubble))\n            .join('')\n\n        return output\n    }\n\n    renderBubble(bubble) {\n        let { link, campaign } = bubble\n        if (!link) {\n            return null\n        }\n        const { linkNoHash } = getHashLink(link)\n\n        const bubbleWithCampaign = { ...bubble, campaign }\n\n        return `\n            <li>\n                <nb-bubble data=\"${stringifyForAttribute(\n                    bubbleWithCampaign\n                )}\" data-ref=\"bubbles[${linkNoHash}]\"></nb-bubble>\n            </li>\n        `\n    }\n\n    renderChip(chip) {\n        const { link } = chip\n        if (!link) {\n            return null\n        }\n        const { linkNoHash, linkHash } = getHashLink(link)\n\n        return `\n            <li>\n                <a href=\"${linkHash}\" data-href='${linkNoHash}' class=\"is-link\" tabindex=\"-1\" >\n                    <nb-chip\n                        background_image=\"${chip.visual.src}\"\n                        data-ref=\"chips[${linkNoHash}]\"\n                        rounded=\"false\"\n                        campaign_id=\"${chip.campaign?.id}\"\n                        campaign_name=\"${chip.campaign?.name}\"\n                        campaign_creative=\"${chip.campaign?.creative}\"\n                        campaign_position=\"${chip.campaign?.position}\"\n                    >\n                        ${chip.label}\n                    </nb-chip>\n                </a>\n            </li>\n        `\n    }\n\n    // Called from events-manager.js, coupled code\n    updateLayout() {\n        this.geometry = this.getGeometry()\n    }\n\n    updateBubbles(sectionId) {\n        const { bubbles = {} } = this.refs\n        for (const bubbleId in bubbles) {\n            const bubble = bubbles[bubbleId]\n            const state = bubbleId === sectionId ? 'selected' : 'default'\n            if (typeof bubble.setAttribute === 'function') {\n                bubble.setAttribute('state', state)\n            }\n        }\n    }\n\n    updateChips(sectionId) {\n        const { chips = {} } = this.refs\n        for (const chipId in chips) {\n            const chip = chips[chipId]\n            const isChecked = chipId === sectionId ? 'true' : 'false'\n            chip.setAttribute && chip.setAttribute('checked', isChecked)\n        }\n    }\n\n    async updateSlider(sectionId, _index) {\n        let index = _index\n        const slider = await this.refs.sliderChip\n        if (slider) {\n            if (typeof _index === 'undefined') {\n                const links = slider.querySelectorAll('a[data-href]')\n                links.forEach((link, i) => {\n                    if (link.getAttribute('data-href') === sectionId) {\n                        index = i\n                    }\n                })\n            }\n            if (index && slider && slider.goToSlide) {\n                slider.goToSlide(index)\n            }\n        }\n    }\n\n    emit(event) {\n        dispatchEvent({ element: this, ...event })\n    }\n\n    async scroll(link, index) {\n        this.isScrolling = true\n        const linkHref = link.getAttribute('data-href')\n        const target = linkHref\n        const { header, chips } = this.geometry\n\n        // When clicking on first anchor we force height to 0 because sticky bar is usually not displayed yet\n        const stickyBarHeight = index === 0 ? 0 : chips.height\n\n        const scrollPaddingTop = header.top + header.height + stickyBarHeight\n        const scrollOptions = { scrollPaddingTop }\n\n        await scrollTo(`[data-id=\"${target}\"]`, scrollOptions)\n        this.isScrolling = false\n\n        // After scrolling visually, we need to give focus to the section for keyboard navigation\n        const targetEl = document.querySelector(`[data-id=\"${target}\"]`)\n        targetEl.focus({ preventScroll: true })\n    }\n\n    track() {\n        //no-op as per https://nestle.atlassian.net/browse/DIGEX-12371?focusedCommentId=2903998\n    }\n\n    getGeometry() {\n        const $header = document.querySelector('.Header__top')\n        const $stickyBar = document.querySelector('nb-plp-sticky-bar')\n\n        const headerRect = $header?.getBoundingClientRect() || { height: 0, y: 0 }\n        const stickyBarRect = $stickyBar?.getBoundingClientRect() || { height: 0, y: 0 }\n\n        return {\n            header: { height: headerRect.height, top: headerRect.y },\n            chips: { height: stickyBarRect.height, top: stickyBarRect.y }\n        }\n    }\n\n    onSectionChange(entries) {\n        const entry = entries[0]\n\n        if (entry.isIntersecting && !this.isScrolling) {\n            const { id = '' } = entry.target.dataset\n\n            dispatchEvent({\n                eventName: EVENT_NAVIGATION_SECTION_CHANGE,\n                args: { sectionId: id || entry.target.getAttribute('data-id') }\n            })\n        }\n    }\n\n    disconnectedCallback() {\n        eventsHelper.remove(this.eventsListeners)\n        this.scrollObserver.destroy('[data-id]')\n    }\n}\n\ncustomElements.get('nb-navigation-bubbles') ||\n    customElements.define('nb-navigation-bubbles', NavigationBubbles)\n\nexport default NavigationBubbles\n","// TODO move the responsabiliy of the links to the correct component\nimport eventsHelper from '@kissui/helpers/src/events.helpers'\nimport { readEvent, dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\n\nimport { EVENT_HEADER_POSITION_CHANGED, EVENT_SLIDER_READY } from '@kissui/components'\n\nimport { EVENT_NAVIGATION_SECTION_CHANGE } from '../data/constants'\n\nconst eventsManager = rootElement => {\n    const bindSliderLinksEvents = slider => {\n        // We need to wait for EVENT_SLIDER_READY before getting geometry for chips slider to have height\n        rootElement.geometry = rootElement.getGeometry()\n\n        const links = slider.querySelectorAll('a')\n\n        for (const [index, link] of links.entries()) {\n            link.addEventListener('click', onSliderLinkClick.bind(this, index))\n        }\n    }\n\n    const onSliderLinkClick = (index, $event) => {\n        $event.preventDefault()\n\n        const link = $event.target.closest('a')\n\n        if (link) {\n            dispatchEvent({\n                eventName: EVENT_NAVIGATION_SECTION_CHANGE,\n                args: { sectionId: link.getAttribute('data-href'), index }\n            })\n\n            rootElement.scroll && rootElement.scroll(link, index)\n            window.location.hash = link.getAttribute('data-href')\n\n            let finalLabel = '',\n                plpListLabel = '',\n                bubbleLabel = ''\n            if (rootElement.closest('nb-plp-sticky-bar')) {\n                bubbleLabel = link.querySelector('nb-chip label span').textContent\n                plpListLabel = rootElement.props.selected_nav_link_label || ''\n            } else {\n                plpListLabel = rootElement.props.selected_nav_link_label || ''\n                if (link.nextElementSibling.textContent) {\n                    bubbleLabel = link.nextElementSibling.textContent\n                } else {\n                    bubbleLabel = link.getAttribute('aria-label')\n                }\n            }\n            finalLabel = plpListLabel ? `${plpListLabel} : ${bubbleLabel}` : `${bubbleLabel}`\n            rootElement.track(finalLabel)\n        }\n    }\n\n    const onSectionChange = $event => {\n        const { sectionId, index } = readEvent($event)\n\n        rootElement.updateBubbles && rootElement.updateBubbles(sectionId)\n        rootElement.updateChips && rootElement.updateChips(sectionId)\n        rootElement.updateSlider && rootElement.updateSlider(sectionId, index)\n    }\n\n    const createListeners = slider => {\n        const eventListeners = []\n\n        if (slider) {\n            eventListeners.push({\n                element: rootElement,\n                type: EVENT_SLIDER_READY,\n                listener: bindSliderLinksEvents.bind(this, slider),\n                options: { once: true }\n            })\n        }\n        eventListeners.push({\n            element: window,\n            type: EVENT_NAVIGATION_SECTION_CHANGE,\n            listener: onSectionChange\n        })\n        eventListeners.push({\n            element: window,\n            type: EVENT_HEADER_POSITION_CHANGED,\n            listener: rootElement.updateLayout.bind(rootElement)\n        })\n\n        eventsHelper.add(eventListeners)\n\n        return eventListeners\n    }\n\n    return { createListeners }\n}\n\nexport default eventsManager\n","import { getDataLayer } from '@kissui/helpers/src/dataLayer'\n\nexport async function setPLPDataProvider() {\n    window.getPLPData = window.getPLPData || getPLPData\n}\n\nexport async function getPLPData() {\n    return await window.plpData\n}\n\nexport async function market() {\n    return napi.market().read() // eslint-disable-line\n}\n\nexport function getCurrency() {\n    return getDataLayer().currency\n}\n\nexport async function getPriceFormatter() {\n    return napi.priceFormat() // eslint-disable-line\n}\n","const runningExperiments = new Set<string>()\n\nexport function runningExperiment(experiment: string): Boolean {\n    return runningExperiments.has(experiment)\n}\n\nexport function enableExperiment(experiment: string): void {\n    runningExperiments.add(experiment)\n    console.info('Running experiments:', ...runningExperiments.values())\n}\n\nexport function disableExperiment(experiment: string): void {\n    runningExperiments.delete(experiment)\n    console.info('Running experiments:', ...runningExperiments.values())\n}\n\n// List Current experiments\nexport const EXPLICIT_FILTERS = 'EXPLICIT_FILTERS'\n","// MAIN ID BLOCKS\nexport const FILTER_MAIN_BLOCK_ID = 'filtersPLP'\nexport const SORT_MENU_ID = 'plp-sort-menu'\nexport const SORT_MENU_MOBILE_ID = 'plp-sort-menu-mobile'\nexport const POPIN_ID = 'plp-filter-popin'\nexport const NAVIGATION_MAIN_BLOCK_ID = 'navigationPLP'\nexport const PRODUCTS_LIST_MAIN_BLOCK_ID = 'productsListPLP'\nexport const PRODUCTS_RESULTS_MAIN_BLOCK_ID = 'productsResultsPLP'\nexport const PRODUCTS_RESULTS_HEADER_ID = 'productsResultsHeaderPLP'\nexport const FILTER_BUTTON = 'plp-filter-cta'\nexport const CB_RESULTS_TOTAL_ID = 'cb-results-total-id'\nexport const MY_RECOMMENDATIONS_ID = 'my-recommendations'\n\n// URL variable\nexport const QUERY_URL_PARAMETER_FILTERS = 'filters'\nexport const QUERY_URL_PARAMETER_SORT = 'sort'\n","/**\n filtersPLP:\n navigationPLP\n productsListPLP\n productsResultsPLP\n\n data-request: not mutable // not to be changed\n data-response: mutable // changed by the component\n\n\n Don't:\n const dict = {\n  'foo': 1,\n  'bar': 2\n}\n\n Better:\n const dict = new Map([\n ['foo', 1],\n ['bar', 2]\n ])\n\n dict.get('foo');\n dict.set('foo', 2);\n dict.has('baz');\n dict.keys()\n\n */\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport { getPLPData, getPriceFormatter, market } from '@kissui/plp-data'\nimport { EXPLICIT_FILTERS, runningExperiment } from '../config/experiments'\nimport { MY_RECOMMENDATIONS_ID } from '../config/constants'\n\n// todo cache data if not changes\nconst appData = {\n    _productsFlat: undefined,\n    sessionId: '',\n\n    init: async function (plpType) {\n        window.plpDataType = plpType\n        window.getPLPData = window.getPLPData || getPLPData\n        this.set('sessionId', (Math.random() + 1).toString(36).substring(7))\n        this.set('filtersSelected', [])\n        this.set('sortCurrent', {})\n        this.set('sortOptions', [])\n        this.set('options', {})\n\n        return window.getPLPData()\n    },\n\n    async reload() {\n        this.set('sessionId', (Math.random() + 1).toString(36).substring(7))\n        this.set('products', [])\n        this.set('filters', [])\n        this.set('filtersSelected', [])\n        this.set('options', {})\n\n        this._productsFlat = undefined\n\n        return window.getPLPData()\n    },\n\n    // review if this pattern about set & get it's ok (I don't think so, because should be unmutable)\n    set: function (key, value) {\n        this[key] = value\n    },\n    get: function (key) {\n        return this[key] || null\n    },\n    initPriceFormatter: function () {\n        return getPriceFormatter()\n    },\n    initCurrency: function () {\n        return market()\n    },\n    filters: [],\n    products: [],\n    productsList: function () {\n        return this.products\n    },\n\n    getProducts() {\n        if (this._productsFlat && this._productsFlat.length) {\n            return this._productsFlat\n        }\n\n        this._productsFlat = this.products.reduce((acc, product) => {\n            return acc.concat(product.products)\n        }, [])\n\n        return this._productsFlat\n    },\n\n    productsListFiltered: function ({ withSort = true } = {}) {\n        const selectedFilters = this.get('filtersSelected')\n        const filterPredicate = runningExperiment(EXPLICIT_FILTERS)\n            ? filterProductsByFilterType(selectedFilters)\n            : filterProductsByAllFilters(selectedFilters)\n        const filteredList = this.getProducts().filter(filterPredicate)\n        const sortCurrent = this.get('sortCurrent') ?? {}\n\n        return withSort ? sortProducts(filteredList, sortCurrent) : filteredList\n    },\n    productsFilteredCount: function () {\n        return this.productsListFiltered({ withSort: false }).length\n    },\n    /*\n     * todo: refactor this function\n     * fireAll should be true always, it's only true to performance improvement\n     * the solution should be in the subscription site, right now we are subscribe to all changes,\n     * but this is wrong should be subscribed only to some changes of the store using a seed/key\n     * */\n    filtersUpdate: function (filterSelection, fireAll = true) {\n        const filter = this.get('filters').find(f => f.key === filterSelection.key)\n\n        if (!filter) {\n            return\n        }\n\n        setFilterValue(\n            this.get('filtersSelected'),\n            filter,\n            filterSelection.value,\n            filterSelection.selected\n        )\n\n        if (runningExperiment(EXPLICIT_FILTERS)) {\n            this.filterChipsUpdate()\n        }\n\n        fireAll && this.fire()\n    },\n    filtersUpdateMultiple(key, valueSelections = Map()) {\n        const filter = this.get('filters').find(f => f.key === key)\n        const filtersSelected = this.get('filtersSelected')\n\n        valueSelections.forEach((selected, value) => {\n            const selectedCurrently = filtersSelected.find(\n                f => f.key === filter.key && filterValueIsEqual(f, value)\n            )\n\n            if (selectedCurrently && selected) return\n            setFilterValue(filtersSelected, filter, value, selected)\n        })\n\n        this.filterChipsUpdate()\n        this.fire()\n    },\n    filtersSelectedWithLabel: function () {\n        return this.get('filtersSelected').map(filter => {\n            const { key: filterKey, value: filterValue } = filter\n            const foundFilter = this.get('filters').find(f => f.key === filterKey)\n            const filterLabel = foundFilter?.values.find(v => v.value === filterValue)?.label\n            return {\n                categoryTitle: foundFilter?.title,\n                label: filterLabel,\n                key: filterKey,\n                value: filterValue\n            }\n        })\n    },\n    filtersSelectedCount: function () {\n        return this.get('filtersSelected')?.length ?? 0\n    },\n    // todo modify this flow because the serilized attributes shouldn't be necessary\n    filtersSelectedSerialized: function () {\n        const filters = [this.get('sortCurrent'), ...this.get('filtersSelected')]\n        return stringifyForAttribute(filters)\n    },\n    filtersReset: function () {\n        this.set('filtersSelected', [])\n        this.get('filters').forEach(filter => {\n            filter.values.forEach(value => {\n                value.selected = false\n                value.disabled = false\n            })\n        })\n        const sortCurrent = this.get('sortOptions')\n        sortCurrent?.length && this.set('sortCurrent', sortCurrent[0])\n\n        if (runningExperiment(EXPLICIT_FILTERS)) {\n            this.filterChipsUpdate()\n        }\n\n        this.fire()\n    },\n    filterChipsUpdate() {\n        const selectedFilters = this.get('filtersSelected')\n        const productsList = this.getProducts()\n        this.get('filters').forEach(filter => {\n            filter.values.forEach(filterChip => {\n                // hide product counts\n                filterChip.productCount = null\n\n                // maintain filter's presence when other filters in same group are selected\n                const withoutGroup = selectedFilters.filter(\n                    selected => selected.key !== filterChip.filterKey\n                )\n                const onlyFilterInGroup = [...withoutGroup, filterChip]\n                const predicate = filterProductsByFilterType(onlyFilterInGroup)\n                filterChip.disabled = !productsList.find(predicate)\n            })\n        })\n    },\n\n    observers: [],\n    subscribe: function (fn) {\n        this.observers.push(fn)\n    },\n    unsubscribe: function (fnToRemove) {\n        this.observers = this.observers.filter(fn => {\n            if (fn !== fnToRemove) {\n                return fn\n            }\n        })\n    },\n    fire: function () {\n        this.observers.forEach(fn => {\n            fn.call()\n        })\n    }\n}\n\nexport default appData\n\nfunction doesProductMatchFilter(product, filter) {\n    const filterValue = filter.value\n    const productPropValue = product[filter.filterKey || filter.key]\n    switch (typeof productPropValue) {\n        case 'string':\n            return productPropValue === filterValue\n        case 'number':\n            return JSON.parse(`[${filterValue}]`).includes(productPropValue)\n        default: {\n            if (filterValue === MY_RECOMMENDATIONS_ID) {\n                const recommendationProducts = appData.get('recommendation')?.products ?? []\n                return recommendationProducts.some(p => p.id === product.id)\n            }\n\n            // check array values or\n            // default to false for nullish values\n            return productPropValue?.includes(filterValue) || false\n        }\n    }\n}\n\nfunction groupFiltersByType(filters = []) {\n    /*\n        group selected filters by key, e.g.\n        {\n            intensity: [1, 2, 3],\n            collection: [a, b, c],\n        }\n    */\n    return filters.reduce((all, filter) => {\n        const filterKey = filter.key\n        const current = all[filterKey] || []\n        return {\n            ...all,\n            [filterKey]: [...current, filter]\n        }\n    }, {})\n}\n\nfunction filterProductsByFilterType(filters) {\n    const groups = groupFiltersByType(filters)\n    const types = Object.keys(groups)\n    return (product, index, products) => {\n        /*\n            does product match at least one filter in each group, e.g.\n            {\n                intensity: [1, 2, 3],\n                collection: [a, b, c],\n            }\n            matches\n            {\n                product: { intensity: 1 },\n                product: { collection: a },\n            }\n        */\n        return types.every(type => {\n            return !!groups[type].find(filter => {\n                return (\n                    doesProductMatchFilter(product, filter) &&\n                    products.findIndex(p => p.id === product.id) === index // Deduplicates\n                )\n            })\n        })\n    }\n}\n\nfunction filterProductsByAllFilters(filters = []) {\n    return (product, index, products) => {\n        return (\n            // check that the product matches every filter selected\n            filters.every(filter => {\n                return doesProductMatchFilter(product, filter)\n            }) && products.findIndex(p => p.id === product.id) === index // Deduplicates\n        )\n    }\n}\n\nfunction filterValueIsEqual(filterValue, value) {\n    return Array.isArray(filterValue.value)\n        ? filterValue.value.join(',') === value\n        : filterValue.value === value\n}\n\nfunction setFilterValue(filtersSelected, filter, value, selected) {\n    filter.values.forEach(filterValue => {\n        // todo refactor this function\n        let valueIsEqual = filterValueIsEqual(filterValue, value)\n        if (!valueIsEqual) {\n            return\n        }\n\n        filterValue.selected = selected\n        if (selected) {\n            filtersSelected.push({\n                key: filter.key,\n                value: value,\n                color: filterValue.color || null\n            })\n        } else {\n            filtersSelected.splice(\n                0,\n                filtersSelected.length,\n                ...filtersSelected.filter(\n                    fSelected => !(fSelected.key === filter.key && fSelected.value === value)\n                )\n            )\n        }\n    })\n}\n\nfunction createSorter({ key, order }) {\n    const isAscending = order === 'asc'\n\n    return (a, b) => {\n        if (a[key] < b[key]) {\n            return isAscending ? -1 : 1\n        }\n        if (a[key] > b[key]) {\n            return isAscending ? 1 : -1\n        }\n        return 0\n    }\n}\n\nfunction sortProducts(products, { key, order }) {\n    const sorter = createSorter({ key, order })\n    return [\n        ...products.filter(p => p.inStock).sort(sorter),\n        ...products.filter(p => !p.inStock).sort(sorter)\n    ]\n}\n","import { customEvent } from '@kissui/helpers/src/gtmEvents'\nimport zoneTracking from '@kissui/helpers/src/assets/js/zoneTracking'\nimport { FILTER_MAIN_BLOCK_ID } from '../config/constants'\nimport appData from './plp.data'\n\nconst updateQueryStringParameter = (uri, key, value) => {\n    const re = new RegExp('([?&])' + key + '=.*?(&|$)', 'i')\n    const separator = uri.indexOf('?') !== -1 ? '&' : '?'\n    return uri.match(re)\n        ? uri.replace(re, '$1' + key + '=' + value + '$2')\n        : uri + separator + key + '=' + value\n}\n\nexport const updateUrlVariable = (variable, queryArray) => {\n    // we are removing the hash from the url\n    const [path] = window.location.href.split('#')\n    const value = encodeURIComponent(JSON.stringify(queryArray))\n    const url = updateQueryStringParameter(path, variable, value)\n    history.pushState(null, null, url)\n}\n\nexport const getUrlVariable = key => {\n    const queryString = window.location.search\n    const param = new URLSearchParams(queryString).get(key)\n\n    if (!param) {\n        return null\n    }\n\n    try {\n        return JSON.parse(decodeURIComponent(param))\n    } catch (err) {\n        console.error('plp.actions-getUrlVariable: url parsing failed')\n        return null\n    }\n}\n\nconst defaultTracking = 'none selected'\n\nconst getSortTracking = data => {\n    const { isSorted, sortKey, sortOrder } = data\n    return `sort:${isSorted ? `${sortOrder}|${sortKey}` : defaultTracking}`\n}\n\nconst getFilterTracking = data => {\n    const { isFiltered, filtersSelected } = data\n    return `characteristics:${\n        isFiltered\n            ? // unique array of filter keys\n              [...new Set(filtersSelected.map(filter => filter.key))].join(',')\n            : defaultTracking\n    }`\n}\n\nexport const trackInteraction = (data = {}) => {\n    const { isSorted, isFiltered } = data\n    const eventAction = 'PLP Filter click'\n\n    if (!isSorted && !isFiltered) {\n        customEvent({\n            eventAction,\n            eventLabel: defaultTracking\n        })\n        return\n    }\n\n    customEvent({\n        eventAction,\n        eventLabel: [getSortTracking(data), getFilterTracking(data)].join('|')\n    })\n}\n\nexport const trackLoad = () => {\n    const campaign = appData.get('campaign')\n    const node = window.document.getElementById(FILTER_MAIN_BLOCK_ID)\n    if (campaign) {\n        zoneTracking(node, campaign)\n    }\n}\n\nexport const cleanFilterDataXSS = (source, data) => {\n    const cleanData = []\n    data.forEach(item => {\n        source.forEach(sourceItem => {\n            if (sourceItem.key === item.key) {\n                sourceItem.values.forEach(value => {\n                    if (item.value === value.value) {\n                        cleanData.push({\n                            key: sourceItem.key,\n                            value: value.value,\n                            selected: true\n                        })\n                    }\n                })\n            }\n        })\n    })\n\n    return cleanData\n}\nexport const cleanSortDataXSS = (source, data) => {\n    return [...source].filter(item => item.key === data.key && item.order === data.order)\n}\n","import { signal } from '@preact/signals'\nimport type { ModuleData } from './CremaService'\n\ntype ModuleName = 'ProductsList' | 'ProductDetails' | 'HeaderNavigation'\n\ntype PageStore = {\n    [key: string]: string | undefined\n    pageHtml?: string\n}\n\ntype SignalStore = {\n    ProductsList: ModuleData\n    ProductDetails: ModuleData\n    HeaderNavigation: ModuleData\n}\n\ntype WindowCreamService = {\n    pageStores: Map<string, PageStore>\n    signalStore: SignalStore\n}\n\ndeclare global {\n    interface Window {\n        __crema_service__: WindowCreamService\n    }\n}\n\n// Stored on window to allow sharing between page builder sections\n// Ideally this would be replaced by loading this service as a shared bundle in future\nwindow.__crema_service__ = window.__crema_service__ || {\n    pageStores: new Map<string, PageStore>(),\n    signalStore: {\n        ProductsList: signal(undefined),\n        ProductDetails: signal(undefined),\n        HeaderNavigation: signal(undefined)\n    }\n}\n\nconst pageStores = window.__crema_service__.pageStores\nconst signalStore = window.__crema_service__.signalStore\n\nexport function clear() {\n    pageStores.clear()\n    signalStore.ProductsList.value = undefined\n    signalStore.ProductDetails.value = undefined\n    signalStore.HeaderNavigation.value = undefined\n}\n\nexport function getPageHtml(url: string): string | undefined {\n    const store = getStore(url)\n    return store.pageHtml\n}\n\nexport function setPageHtml(url: string, html: string): void {\n    const store = getStore(url)\n    store.pageHtml = html\n}\n\nexport function getModuleData(moduleName: ModuleName): ModuleData {\n    return signalStore[moduleName]\n}\n\nexport function setModuleData(moduleName: ModuleName, data: object | undefined): void {\n    signalStore[moduleName].value = data\n}\n\nfunction getStore(url: string): PageStore {\n    if (!pageStores.has(url)) {\n        pageStores.set(url, {})\n    }\n\n    return pageStores.get(url) as PageStore\n}\n","import { Signal, batch } from '@preact/signals'\n\nimport * as store from './Store'\n\nconst parser = new DOMParser()\n\nexport type ModuleData<T = any> = Signal<Record<PropertyKey, T> | undefined>\n\nexport type HeaderNavigationMenuItem = {\n    title: string,\n    link: {\n        url: string\n    }\n}\n\nexport async function loadFromUrl(url: string, cacheOnly: boolean = false): Promise<void> {\n    return batch(async () => {\n        let html = store.getPageHtml(url)\n\n        if (!html) {\n            try {\n                html = await fetchHtml(url)\n                store.setPageHtml(url, html)\n            } catch (error) {\n                console.debug('Failed to load HTML', error)\n                return\n            }\n        }\n\n        if (!cacheOnly) {\n            store.setModuleData('HeaderNavigation', parseModuleData(html, 'HeaderNavigationBar'))\n            store.setModuleData('ProductsList', parseModuleData(html, 'ProductList'))\n            store.setModuleData('ProductDetails', parseModuleData(html, 'ProductDetails'))\n        }\n    })\n}\n\nexport function loadFromPage(window: Window): void {\n    batch(() => {\n        const html = window.document.documentElement.innerHTML\n\n        store.setModuleData('HeaderNavigation', parseModuleData(html, 'HeaderNavigationBar'))\n        store.setModuleData('ProductsList', parseModuleData(html, 'ProductList'))\n        store.setModuleData('ProductDetails', parseModuleData(html, 'ProductDetails'))\n\n        // Only cache if we found either the PLP data or the PDP data\n        if (\n            store.getModuleData('HeaderNavigation').value &&\n            (store.getModuleData('ProductsList').value ||\n                store.getModuleData('ProductDetails').value)\n        ) {\n            store.setPageHtml(window.location.href, html)\n        }\n    })\n}\n\nexport function getProductsList(): ModuleData {\n    return store.getModuleData('ProductsList')\n}\n\nexport function getProductDetails(): ModuleData {\n    return store.getModuleData('ProductDetails')\n}\n\nexport function getHeaderNavigation(): ModuleData {\n    return store.getModuleData('HeaderNavigation')\n}\n\nfunction parseModuleData(html: string, moduleName: string): ModuleData | undefined {\n    try {\n        const moduleScript = parseHtml(html, moduleName)\n        return parseProductScript(moduleScript) as ModuleData\n    } catch (error) {\n        // Failed to parse module, but this could be expected if the module is not present\n        return undefined\n    }\n}\n\nasync function fetchHtml(url: string): Promise<string> {\n    console.debug('Fetching HTML from', url)\n    const response = await fetch(url)\n\n    if (!response.ok) {\n        throw new Error(`Failed to fetch from \"${url}\" - ${response.status}:${response.statusText}`)\n    }\n\n    const html = await response.text()\n\n    return html\n}\n\nfunction parseHtml(html: string, moduleName: string): string {\n    const document = parser.parseFromString(html, 'text/html')\n\n    const scripts = document.querySelectorAll('script')\n    for (const script of scripts) {\n        const content = script.textContent ?? ''\n        if (content.includes(`\"module\":\"${moduleName}\"`)) return content\n    }\n\n    throw new Error(`Failed to find module \"${moduleName}\"`)\n}\n\nfunction parseProductScript(script: string): object {\n    const lines = script.split('\\n')\n    for (const line of lines) {\n        const trimmed = line.trim()\n        if (trimmed.startsWith('window.ui.push(')) {\n            const jsonString = trimmed.replace('window.ui.push(', '').slice(0, -2)\n            return JSON.parse(jsonString)\n        }\n    }\n\n    throw new Error('Failed to find UI data in script')\n}\n","import appData from './plp.data'\nimport {\n    updateUrlVariable,\n    getUrlVariable,\n    trackInteraction,\n    cleanFilterDataXSS,\n    cleanSortDataXSS,\n    trackLoad\n} from './plp.actions'\nimport { QUERY_URL_PARAMETER_FILTERS, QUERY_URL_PARAMETER_SORT } from '../config/constants'\nimport { getTrackingData } from '../helpers/tracking'\nimport { EXPLICIT_FILTERS, runningExperiment } from '../config/experiments'\nimport { loadFromUrl, getProductsList, loadFromPage } from '@kissui/crema-service'\nimport { filterActionEvent, filterTrackingFromPlpFilters } from '@kissui/helpers/src/gtmEvents'\n\n// todo find a better way to do this\nlet plpData = {}\nlet appStates = {}\n// one solution is make promise inside of promise\nconst isSorted = data => {\n    return (\n        data.get('sortCurrent').key !== data.get('sortOptions')[0].key ||\n        data.get('sortCurrent').order !== data.get('sortOptions')[0].order\n    )\n}\n\nconst isFiltered = data => data.filtersSelectedCount() !== 0\n\nexport default {\n    onload: {\n        process: function (e, handlePostEvent) {\n            const { plpType, appStatesHandler } = e.detail.value\n\n            appStates = appStatesHandler\n\n            // initialize the store\n            const init = appData.init(plpType)\n            appData.set('plpType', plpType || null)\n            appData.set('innerWidth', window.innerWidth)\n            appData.set('innerHeight', window.innerHeight)\n\n            // get market data\n            const currency = appData.initCurrency()\n            const priceFormatter = appData.initPriceFormatter()\n\n            Promise.all([init, currency, priceFormatter])\n                .then(values => {\n                    plpData = values[0]\n                    appData.set('currency', values[1].currency)\n                    appData.set('priceFormatter', values[2])\n                    handlePostEvent(new CustomEvent('onloadSuccess'))\n                })\n                .catch(err => {\n                    console.error(err)\n                    handlePostEvent(new CustomEvent('onloadError', { detail: { err } }))\n                })\n\n            if (runningExperiment(EXPLICIT_FILTERS)) {\n                loadFromPage(window)\n            }\n        }\n    },\n    onReload: {\n        async process(e, handlePostEvent) {\n            const { plpType, url } = e.detail.value\n\n            let data\n            try {\n                await loadFromUrl(url)\n                data = getProductsList().value\n            } catch (err) {\n                console.error(err)\n                return handlePostEvent(new CustomEvent('onloadError', { detail: { err } }))\n            }\n\n            window.plpData = Promise.resolve({\n                techno: 'unknown', // Only used by mocks?\n                data\n            })\n\n            simulatePageChange(url)\n\n            try {\n                // Reinitialize the store\n                const [_data, currency, priceFormatter] = await Promise.all([\n                    appData.reload(plpType),\n                    appData.initCurrency(),\n                    appData.initPriceFormatter()\n                ])\n                plpData = _data // NOTE: Getting this from the appData is rather redundant\n                appData.set('plpType', plpType || null)\n                appData.set('innerWidth', window.innerWidth)\n                appData.set('innerHeight', window.innerHeight)\n                appData.set('currency', currency.currency)\n                appData.set('priceFormatter', priceFormatter)\n                handlePostEvent(new CustomEvent('onloadSuccess'))\n                appData.fire()\n            } catch (error) {\n                console.error(error)\n                handlePostEvent(new CustomEvent('onloadError', { detail: { error } }))\n            }\n        }\n    },\n    onloadSuccess: {\n        nextState: function (e) {\n            return appStates.onloadSuccess(e)\n        }\n    },\n    onloadError: {\n        nextState: function (e) {\n            return appStates.showError(e)\n        }\n    },\n    onMergeData: {\n        // triggered from plp.app.js\n        async process(e, handlePostEvent) {\n            const {\n                filtersService,\n                productService,\n                dataSortService,\n                pageBuilderProps,\n                recommendationService\n            } = e.detail.value\n\n            const recommendationInstance = recommendationService(pageBuilderProps)\n            const dataToMerge = productService(\n                plpData,\n                pageBuilderProps,\n                recommendationInstance?.recommendation\n            )\n\n            mergeData(dataToMerge)\n\n            // Here we merge the data in a lazy way, the first interation is the\n            // half-recommended data, missing the loading of products, which, since\n            // it comes from Martech, may take longer than the rest. Then, in order\n            // not to block the rest, while the spinner is displayed, the mergeData\n            // is loaded and processed again.\n            if (recommendationInstance?.readyToLoadProducts?.()) {\n                await recommendationInstance.loadProducts()\n                const newData = productService(\n                    plpData,\n                    pageBuilderProps,\n                    recommendationInstance?.recommendation\n                )\n                appData.set('recommendation', recommendationInstance.recommendation)\n                mergeData(newData)\n                appData.fire()\n            }\n\n            function mergeData(data = {}) {\n                mergeProductData(data, pageBuilderProps)\n                mergeFilters(data, { pageBuilderProps, dataSortService, filtersService })\n                setUrlOverrides()\n                handleExperiments()\n                trackLoad(pageBuilderProps)\n                handlePostEvent(new CustomEvent('switchProductsPage'))\n            }\n        }\n    },\n    switchProductsPage: {\n        nextState: function (e) {\n            if (isSorted(appData) || isFiltered(appData)) {\n                return appStates.readyForShowResults(e)\n            } else {\n                return appStates.readyForPlay(e)\n            }\n        }\n    },\n    onMergeDataError: {\n        nextState: function (e) {\n            return appStates.showError(e)\n        }\n    },\n    onFilter: {\n        process: (e, handlePostEvent) => {\n            const filtersSelected = appData.get('filtersSelected')\n\n            updateUrlVariable(QUERY_URL_PARAMETER_FILTERS, appData.get('filtersSelected'))\n            updateUrlVariable(QUERY_URL_PARAMETER_SORT, {\n                key: appData.get('sortCurrent').key,\n                order: appData.get('sortCurrent').order\n            })\n\n            handlePostEvent(new CustomEvent('switchProductsPage'))\n\n            // condition check to not send empty filter list, clear event is handled in different place\n            if (runningExperiment(EXPLICIT_FILTERS) && filtersSelected.length) {\n                filterActionEvent(\n                    'filter apply',\n                    ...filterTrackingFromPlpFilters(filtersSelected),\n                    null,\n                    e.detail.value\n                )\n            }\n        }\n    },\n    onSort: {\n        process: (e, handlePostEvent) => {\n            updateUrlVariable(QUERY_URL_PARAMETER_FILTERS, appData.get('filtersSelected'))\n            updateUrlVariable(QUERY_URL_PARAMETER_SORT, {\n                key: appData.get('sortCurrent').key,\n                order: appData.get('sortCurrent').order\n            })\n\n            handlePostEvent(new CustomEvent('switchProductsPage'))\n\n            trackInteraction({\n                isSorted: isSorted(appData),\n                isFiltered: isFiltered(appData),\n                sortKey: appData.get('sortCurrent').key,\n                sortOrder: appData.get('sortCurrent').order,\n                filtersSelected: appData.get('filtersSelected')\n            })\n        }\n    },\n    onloadFilter: {\n        process: function (e, handlePostEvent) {\n            handlePostEvent(new CustomEvent('onloadFilterSuccess', { detail: { e } }))\n            // handlePostEvent(new CustomEvent('onloadFilterError'))\n        }\n    },\n    onloadFilterSuccess: {\n        nextState: function (e) {\n            return appStates.readyForFilter(e)\n        }\n    },\n    onloadFilterError: {\n        nextState: function (e) {\n            return appStates.showError(e)\n        }\n    }\n}\n\nfunction simulatePageChange(url) {\n    try {\n        const urlObj = new URL(window.location)\n        urlObj.pathname = url\n        window.history.pushState({}, '', urlObj)\n        // TODO: Most likely need to trigger the matching tracking call for a page load\n    } catch (error) {\n        console.error('Failed to simulate page change', error)\n    }\n}\n\nfunction mergeProductData(data, pageBuilderProps) {\n    appData.set('enabledTechnologies', data.enabledTechnologies)\n    appData.set(\n        'currentTechnology',\n        data.enabledTechnologies\n            ?.filter(tech => tech.isSelected)[0]\n            ?.id?.split('/')\n            .at(-1) ?? null\n    )\n\n    appData.set('products', data.categories)\n    appData.set('translations', data.translations)\n    appData.set('nav_links', data.nav_links)\n    appData.set('bubbles', data.bubbles)\n    appData.set('hide_sort_and_filter', pageBuilderProps.options?.hide_sort_and_filter)\n    appData.set('options', pageBuilderProps.options)\n    appData.set('maxIntensity', data.maxIntensity)\n    appData.set('campaign', getTrackingData(pageBuilderProps))\n}\n\nfunction mergeFilters(data, { pageBuilderProps, dataSortService, filtersService }) {\n    const sort = dataSortService(pageBuilderProps)\n    const filters = filtersService(\n        appData.get('products'),\n        pageBuilderProps,\n        data.categoriesExtraData,\n        data.translations,\n        {\n            priceFormatter: appData.get('priceFormatter'),\n            currency: appData.get('currency')\n        }\n    )\n\n    appData.set('filters', filters)\n    appData.set('sortOptions', sort)\n    appData.set('sortCurrent', sort[0])\n}\n\nfunction setUrlOverrides() {\n    const urlFilters = getUrlVariable(QUERY_URL_PARAMETER_FILTERS)\n    if (urlFilters && urlFilters.length > 0) {\n        const filterData = cleanFilterDataXSS(appData.get('filters'), urlFilters)\n        if (filterData.length > 0) {\n            filterData.forEach((filter, index) => {\n                const isLast = index === filterData.length - 1\n                appData.filtersUpdate(filter, isLast)\n            })\n        }\n    }\n\n    const urlSort = getUrlVariable(QUERY_URL_PARAMETER_SORT)\n    if (urlSort) {\n        const sortData = cleanSortDataXSS(appData.get('sortOptions'), urlSort)\n        if (sortData.length > 0) {\n            appData.set('sortCurrent', sortData[0])\n        }\n    }\n}\n\nfunction handleExperiments() {\n    if (runningExperiment(EXPLICIT_FILTERS)) {\n        appData.filterChipsUpdate()\n\n        const notCurrentTech = appData\n            .get('enabledTechnologies')\n            .find(tech => tech.url !== window.location.pathname)\n        if (notCurrentTech) {\n            loadFromUrl(notCurrentTech.url, true)\n        }\n    }\n}\n","export function getTrackingData(pageBuilderProps) {\n    // Backward compatibility for when data was at root of object\n    const {\n        campaign_id,\n        campaign_name,\n        campaign_creative = null,\n        campaign_position\n    } = pageBuilderProps\n\n    if (!campaign_creative) {\n        const { campaign = null } = pageBuilderProps\n        return campaign\n    }\n\n    return {\n        id: campaign_id,\n        name: campaign_name,\n        position: campaign_position,\n        creative: campaign_creative\n    }\n}\n","import appEvents from './plp.events'\n\nexport default (customEventName, eventData, eventFn = null) => {\n    stateTransitionsManager(\n        new CustomEvent(customEventName, {\n            detail: {\n                value: eventData,\n                fn: eventFn\n            }\n        })\n    )\n}\n\nconst stateTransitionsManager = event => {\n    appEvents[event.type]?.process(event, handlePostEvent)\n}\n\nconst handlePostEvent = e => {\n    appEvents[e.type]?.nextState(e)\n}\n","import { EVENT_SORT_BY_CHANGE } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport './plp.filter-popin.mobileDropDown.scss'\nimport appData from '../../../store/plp.data'\nimport { SORT_MENU_MOBILE_ID, SORT_MENU_ID } from '../../../config/constants'\nimport { escapeHtml } from '@kissui/helpers/src/utils'\n\nclass PlpFilterPopinMobileDropdown extends NespressoElement {\n    #SORT_MENU_ID = SORT_MENU_MOBILE_ID\n\n    constructor() {\n        super()\n        this.formatSortSeparator = '::'\n        appData.subscribe(this.componentUpdated.bind(this))\n        this.boundOnSortChange = this.onSortChange.bind(this)\n    }\n\n    onStart() {\n        const data = document.getElementById(SORT_MENU_ID)?.getAttribute('data')\n        if (data) {\n            this.template = `\n                <nb-dropdown\n                    id=\"${this.#SORT_MENU_ID}\"\n                    data-testId=\"plp-sort-menu-mobile\"\n                    data=\"${escapeHtml(data)}\"></nb-dropdown>`\n        }\n    }\n\n    onReady() {\n        this.sortButton = document.getElementById(this.#SORT_MENU_ID)\n        this.sortButton?.addEventListener(EVENT_SORT_BY_CHANGE, this.boundOnSortChange)\n    }\n\n    componentUpdated() {\n        const { key, order } = appData.get('sortCurrent')\n        this.sortButton?.setSelected(`${key}${this.formatSortSeparator}${order}`)\n    }\n\n    onSortChange(e) {\n        const [key, order] = e.detail.selected.value.split(this.formatSortSeparator)\n        appData.set('sortCurrent', { key, order })\n    }\n\n    onDestroy() {\n        this.sortButton?.removeEventListener(EVENT_SORT_BY_CHANGE, this.boundOnSortChange)\n        appData.unsubscribe(this.componentUpdated)\n    }\n}\n\ncustomElements.get('plp-filter-sort-mobile') ||\n    customElements.define('plp-filter-sort-mobile', PlpFilterPopinMobileDropdown)\n\nexport default PlpFilterPopinMobileDropdown\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport './plp.filter-popin.content.scss'\nimport '../plp.filterImports'\nimport appData from '../../../store/plp.data'\nimport { EXPLICIT_FILTERS, runningExperiment } from '../../../config/experiments'\n\nclass PlpFilterPopinContent extends NespressoElement {\n    #filters = []\n\n    constructor() {\n        super()\n        appData.subscribe(this.onStoreChanges.bind(this))\n    }\n\n    onStoreChanges() {\n        if (runningExperiment(EXPLICIT_FILTERS)) {\n            // Force re-init if the filters have changed\n            if (this.#filters !== appData.get('filters')) {\n                this.onStart()\n                this.render(true)\n                this.onReady()\n            }\n        }\n\n        this.querySelectorAll('nb-chip').forEach(chip => {\n            chip.setAttribute(\n                'disabled',\n                '' + this.isDisabled(chip.dataset.filterKey, chip.dataset.filterValue)\n            )\n            chip.setAttribute(\n                'checked',\n                '' + this.isChecked(chip.dataset.filterKey, chip.dataset.filterValue)\n            )\n\n            if (runningExperiment(EXPLICIT_FILTERS)) {\n                const labelEl = chip.querySelector('label span')\n                const label = this.getLabel(chip.dataset.filterKey, chip.dataset.filterValue)\n                labelEl.textContent = label\n                labelEl.setAttribute('phantom', label)\n            }\n        })\n    }\n\n    onStart() {\n        this.#filters = appData.get('filters')\n\n        this.template =\n            this.#filters\n                ?.map(filter => {\n                    return `${filter.renderBefore()}\n                ${filter.values\n                    .map(value => {\n                        value.disabled = this.isDisabled(filter.key, value.value)\n                        return value.render()\n                    })\n                    .join('')}\n            ${filter.renderAfter()}`\n                })\n                .join('') ?? ''\n    }\n\n    onReady() {\n        this.querySelectorAll('nb-chip').forEach(chip => {\n            chip.addEventListener('change', this.handleChipEvent)\n        })\n    }\n\n    isDisabled = (type, value) =>\n        appData.productsListFiltered({ withSort: false }).filter(product => {\n            if (!product[type]) {\n                return false\n            }\n            if (typeof product[type] === 'string') {\n                return product[type] === value\n            } else if (typeof product[type] === 'number' && typeof value === 'number') {\n                return value === product[type]\n            } else if (typeof product[type] === 'number') {\n                return JSON.parse('[' + value + ']').includes(product[type])\n            } else {\n                return !!product[type].includes(value)\n            }\n        }).length === 0\n\n    isChecked = (key, value) =>\n        appData\n            .get('filtersSelected')\n            .filter(fSelected => fSelected.key === key && fSelected.value === value).length > 0\n\n    getLabel(key, value) {\n        let filterValue\n        appData.get('filters').some(item => {\n            if (item.key !== key) {\n                return false\n            }\n            filterValue = item.values.find(itemValue => {\n                if (typeof itemValue.value === 'string') {\n                    return itemValue.value === value\n                } else if (typeof itemValue.value === 'number' && typeof value === 'number') {\n                    return value === itemValue.value\n                } else if (typeof itemValue.value === 'number') {\n                    return JSON.parse('[' + value + ']').includes(itemValue.value)\n                } else {\n                    return !!itemValue.value.includes(value)\n                }\n            })\n            if (filterValue) {\n                return true\n            }\n        })\n\n        const count = filterValue?.productCount ? ` (${filterValue.productCount})` : ''\n        return `${filterValue.label}${count}`\n    }\n\n    onDestroy() {\n        appData.unsubscribe(this.onStoreChanges)\n\n        this.querySelectorAll('nb-chip').forEach(chip => {\n            chip.removeEventListener('change', this.handleChipEvent)\n        })\n    }\n\n    handleChipEvent(e) {\n        e.stopPropagation()\n\n        const filter = {\n            key: e.target.parentNode.dataset.filterKey,\n            value: e.target.parentNode.dataset.filterValue,\n            selected: e.target.checked, // todo only works for checkbox\n            label: e.target.parentNode.dataset.filterLabel\n        }\n\n        appData.filtersUpdate(filter)\n    }\n}\n\ncustomElements.get('plp-filter-popin-content') ||\n    customElements.define('plp-filter-popin-content', PlpFilterPopinContent)\n\nexport default PlpFilterPopinContent\n","import { EVENT_POPIN_CLOSE } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport './plp.filter-popin.footer.scss'\nimport appData from '../../../store/plp.data'\nimport { customEvent } from '@kissui/helpers/src/gtmEvents'\n\nconst CATEGORY_IDENTIFIER = '/cat/'\n\nclass PlpFilterPopinFooter extends NespressoElement {\n    constructor() {\n        super()\n        appData.subscribe(this.componentUpdated.bind(this))\n    }\n\n    onStart() {\n        const translations = appData.translations\n        const { a11y_see_result_number_label } = this.props\n        this.template = `\n            <nb-link\n                class=\"nb-filter-popin-reset-all\"\n                size=\"large\"\n                color=\"black\"\n                style=\"visibility: hidden\"\n            >\n                ${translations['productlistrespblock.resetfilters.label']}\n            </nb-link>\n            <nb-cta\n                class=\"nb-filter-popin-see-results\"\n                variation=\"secondary\"\n                style=\"visibility: hidden\"\n                aria_label_after=\"${a11y_see_result_number_label}\"\n            >\n            </nb-cta>\n        `\n    }\n\n    getA11ySeeResultsText() {\n        const { see_result_number_label, see_result_number_label_one } = this.props\n        const productsFilteredCount = appData.productsFilteredCount()\n        const label =\n            productsFilteredCount === 1 ? see_result_number_label_one : see_result_number_label\n        return label?.replace('{resultsLength}', '' + productsFilteredCount)\n    }\n\n    onReady() {\n        this.componentUpdated()\n        this.querySelector('.nb-filter-popin-reset-all')?.addEventListener('click', () => {\n            const filtersTracking = this.filtersTracking()\n            customEvent({\n                event_GA4: true,\n                event: 'plp_filter',\n                action_type: 'filter clear',\n                filter_type: filtersTracking.types,\n                filter_values: filtersTracking.values\n            })\n            appData.filtersReset()\n            this.setAttribute('data-refresh', 'true')\n        })\n        this.querySelector('.nb-filter-popin-see-results')?.addEventListener('click', () => {\n            window.dispatchEvent(new CustomEvent(EVENT_POPIN_CLOSE))\n            const filtersTracking = this.filtersTracking()\n            customEvent({\n                event_GA4: true,\n                event: 'plp_filter',\n                action_type: 'filter apply',\n                filter_type: filtersTracking.types,\n                filter_values: filtersTracking.values\n            })\n        })\n    }\n\n    filtersTracking() {\n        let types = []\n        let values = []\n        const filtersSelected = appData.get('filtersSelected')\n        if (filtersSelected && filtersSelected.length) {\n            for (let i = 0; i < filtersSelected.length; i++) {\n                const filter = filtersSelected[i]\n                const value =\n                    filter.value.indexOf(CATEGORY_IDENTIFIER) > -1\n                        ? filter.value.substring(\n                              filter.value.indexOf(CATEGORY_IDENTIFIER) + CATEGORY_IDENTIFIER.length\n                          )\n                        : filter.value\n                if (types.indexOf(filter.key) > -1) {\n                    values[types.indexOf(filter.key)] += ',' + value\n                } else {\n                    types.push(filter.key)\n                    values.push(value)\n                }\n            }\n        }\n\n        return {\n            types: types.join('|'),\n            values: values.join('|')\n        }\n    }\n\n    componentUpdated() {\n        const productsFilteredCount = appData.productsFilteredCount()\n        const filtersSelectedCount = appData.filtersSelectedCount()\n\n        const btnReset = this.querySelector('.nb-filter-popin-reset-all')\n        const btnResult = this.querySelector('.nb-filter-popin-see-results')\n\n        btnReset.style.visibility =\n            filtersSelectedCount && filtersSelectedCount > 0 ? 'visible' : 'hidden'\n        btnResult.style.visibility =\n            productsFilteredCount && productsFilteredCount > 0 ? 'visible' : 'hidden'\n\n        btnResult.querySelector('span').textContent = this.getA11ySeeResultsText()\n        btnResult.querySelector('button').setAttribute('aria-label', this.getA11ySeeResultsText())\n    }\n\n    onDestroy() {\n        appData.unsubscribe(this.onStoreChanges)\n    }\n}\n\ncustomElements.get('plp-filter-popin-footer') ||\n    customElements.define('plp-filter-popin-footer', PlpFilterPopinFooter)\n\nexport default PlpFilterPopinFooter\n","import { BREAKPOINT_M, EVENT_POPIN_CLOSED } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport handleAppEvent from '../../store'\nimport { FILTER_MAIN_BLOCK_ID, POPIN_ID } from '../../config/constants'\nimport appData from '../../store/plp.data'\nimport './plp.filter-popin.scss'\nimport './popin/plp.filter-popin.mobileDropDown'\nimport './popin/plp.filter-popin.content'\nimport './popin/plp.filter-popin.footer'\n\nclass PlpFilterPopin extends NespressoElement {\n    onStart() {\n        this.props = this._createProps(\n            document.getElementById(FILTER_MAIN_BLOCK_ID).parentElement.attributes\n        )\n\n        const {\n            see_result_number_label = 'See {resultsLength} Results',\n            see_result_number_label_zero = 'No Result',\n            see_result_number_label_one = 'See One Result',\n            a11y_see_result_number_label = 'Close and validate filters'\n        } = this.props.copywriting || this.props\n        // todo: line above is backward compatibility fallback for coffee PLP projects without \"copywriting\"\n        //       Consider moving the backward compatibility into Coffee PLP DTO to avoid this in the code\n\n        const isMobile =\n            appData.innerWidth < BREAKPOINT_M\n                ? '<plp-filter-sort-mobile></plp-filter-sort-mobile>'\n                : ''\n\n        this.template = `\n                ${isMobile}\n                <div class=\"mobileShadow\">\n                    <header>\n                        <h2 class=\"t-sm-700-sl\">${appData.translations['productlistrespblock.filter.label']}</h2>\n                    </header>\n                    <section>\n                        <plp-filter-popin-content\n                        ></plp-filter-popin-content>\n                    </section>\n                    <footer>\n                        <plp-filter-popin-footer\n                            see_result_number_label=\"${see_result_number_label}\"\n                            see_result_number_label_zero=\"${see_result_number_label_zero}\"\n                            see_result_number_label_one=\"${see_result_number_label_one}\"\n                            a11y_see_result_number_label=\"${a11y_see_result_number_label}\"\n                        ></plp-filter-popin-footer>\n                    </footer>\n                </div>`\n    }\n\n    onReady() {\n        window.addEventListener(EVENT_POPIN_CLOSED, this.eventPopinClsed)\n    }\n\n    onDestroy() {\n        window.removeEventListener(EVENT_POPIN_CLOSED, this.eventPopinClsed)\n    }\n\n    eventPopinClsed(e) {\n        e.stopPropagation()\n        if (e.detail.id === POPIN_ID) {\n            handleAppEvent('onFilter')\n        }\n    }\n}\n\ncustomElements.get('plp-filter-popin') || customElements.define('plp-filter-popin', PlpFilterPopin)\n\nexport default PlpFilterPopin\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport handleAppEvent from '../../store'\nimport './plp.filter-cta.scss'\nimport { customEvent } from '@kissui/helpers/src/gtmEvents'\n\nclass PlpFilterCta extends NespressoElement {\n    bubbleElement = null\n\n    static get observedAttributes() {\n        return ['data-filter-counter']\n    }\n\n    attributeChangedCallback(name, oldVal, newVal) {\n        if (newVal != null && newVal.length > 0 && newVal !== oldVal) {\n            if (name === 'data-filter-counter') {\n                this.updateBubbleCounter(newVal)\n            }\n        }\n    }\n\n    onStart() {\n        this.template = `<nb-cta id='plp-filter' size='40' variation='plpFilter' icon_right='24/symbol/filter'>${this.props.cta_filter_label}</nb-cta>`\n    }\n\n    onReady() {\n        document.getElementById('plp-filter').addEventListener('click', () => {\n            handleAppEvent('onloadFilter', {})\n            customEvent({\n                event_GA4: true,\n                event: 'plp_filter',\n                action_type: 'filter open'\n            })\n        })\n\n        this.buttonElement = this.querySelector('nb-cta button')\n        this.bubbleElement = document.createElement('div')\n        this.bubbleElement.classList.add('t-2xs-700-sl')\n        this.bubbleElement.classList.add('bubbleCounter')\n        this.bubbleElement.innerHTML = '0'\n        this.firstChild.firstChild.appendChild(this.bubbleElement)\n    }\n\n    updateBubbleCounter(counter) {\n        if (!this.bubbleElement) {\n            return null\n        }\n\n        this.bubbleElement.innerHTML = counter\n        counter === '0'\n            ? this.buttonElement.classList.remove('bubbleActive')\n            : this.buttonElement.classList.add('bubbleActive')\n    }\n}\n\ncustomElements.get('plp-filter-cta') || customElements.define('plp-filter-cta', PlpFilterCta)\n\nexport default PlpFilterCta\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport './plp.filter-links.scss'\nimport './plp.filter-links-slider.scss'\nimport { readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { EVENT_SLIDER_READY } from '@kissui/components'\n\nconst SLIDER_NAV_LINKS_ID = 'slider_natural_nav_links'\n\nclass PlpFilterLinks extends NespressoElement {\n    constructor() {\n        super()\n        this.boundReinitSlider = this.reinitSlider.bind(this)\n    }\n\n    onStart() {\n        this.addEventListener(EVENT_SLIDER_READY, this.boundReinitSlider)\n\n        const sliderData = {\n            options: {\n                mobile: {\n                    items_per_slide: 'auto',\n                    item_width: 'auto',\n                    slide_min_height: '40',\n                    slider_gap: '0',\n                    display_buttons: 'false',\n                    display_nav: 'false',\n                    overflow: 'false',\n                    flex_auto: 'true',\n                    display_gradients: 'true',\n                    gradients_color: '#FFFFFF',\n                    gradients_width: '8',\n                    placeholder_background: 'transparent'\n                },\n                tablet: {\n                    items_per_slide: 'auto',\n                    item_width: 'auto',\n                    slide_min_height: '80',\n                    slider_gap: '0',\n                    display_buttons: 'true',\n                    display_nav: 'false',\n                    overflow: 'false',\n                    flex_auto: 'true',\n                    display_gradients: 'true',\n                    gradients_color: '#FFFFFF',\n                    placeholder_background: 'transparent'\n                },\n                desktop: {\n                    items_per_slide: 'auto',\n                    item_width: 'auto',\n                    slide_min_height: '80',\n                    slider_gap: '0',\n                    display_buttons: 'true',\n                    display_nav: 'false',\n                    overflow: 'false',\n                    flex_auto: 'true',\n                    display_gradients: 'true',\n                    gradients_color: '#FFFFFF',\n                    placeholder_background: 'transparent'\n                }\n            },\n            a11y_labels: {\n                prev: this.props.a11y_slider_previous_button,\n                next: this.props.a11y_slider_next_button,\n                nav: 'Go to slide'\n            }\n        }\n\n        this.template = `<nb-slider-natural\n                            id='${SLIDER_NAV_LINKS_ID}'\n                            data=\"${stringifyForAttribute(sliderData)}\">\n                            ${this.renderLinksList()}\n                        </nb-slider-menu>`\n    }\n\n    renderLinksList() {\n        const { navigation = [] } = this.props\n\n        return navigation\n            .map(\n                ({\n                    link = '',\n                    icon_left = '',\n                    seo_label = '',\n                    tracking_label = '',\n                    label = '',\n                    selected = false\n                }) =>\n                    `<li><nb-link\n                            link='${link}'\n                            size='large'\n                            phantom='true'\n                            color='black'\n                            selected=${selected}\n                            ${seo_label && `seo_label='${seo_label}'`}\n                            ${tracking_label && `tracking_label='${tracking_label}'`}\n                            ${icon_left && `icon_left='${icon_left}'`}\n                    >${label}</nb-link></li>`\n            )\n            .join('')\n    }\n\n    reinitSlider(e) {\n        const { id } = readEvent(e)\n        if (id !== SLIDER_NAV_LINKS_ID) {\n            return\n        }\n        e.target.initSlider()\n    }\n\n    /*bindEvents() {\n        this.unbindEvents()\n        this.link.addEventListener('click', this.boundHandleClick)\n    }\n\n    unbindEvents() {\n        this.link.removeEventListener('click', this.boundHandleClick)\n    }*/\n\n    disconnectedCallback() {\n        this.removeEventListener(EVENT_SLIDER_READY, this.boundReinitSlider)\n    }\n}\n\ncustomElements.get('plp-filter-links') || customElements.define('plp-filter-links', PlpFilterLinks)\n\nexport default PlpFilterLinks\n","import { EVENT_SORT_BY_CHANGE } from '@kissui/components'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\n\nimport handleAppEvent from '../../store'\nimport appData from '../../store/plp.data'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport { SORT_MENU_ID } from '../../config/constants'\nimport { FILTER_MAIN_BLOCK_ID } from '../../config/constants'\n\nclass PlpFilterSort extends NespressoElement {\n    #SORT_MENU_ID = SORT_MENU_ID\n\n    constructor() {\n        super()\n        this.formatSortSeparator = '::'\n        appData.subscribe(this.componentUpdated.bind(this))\n        this.boundOnSortChange = this.onSortChange.bind(this)\n    }\n\n    onStart() {\n        this.props = this._createProps(\n            document.getElementById(FILTER_MAIN_BLOCK_ID).parentElement.attributes\n        )\n\n        const {\n            label_sort_by = 'Sort by',\n            aa_description_sort_by = 'You can select different sorting values from this listbox. To interact with this listbox press SPACE or ENTER key.',\n            aa_listbox_description_sort_by = 'You can navigate through the options using UP or DOWN arrows keys. To exit this listbox press ESCAPE key.',\n            aa_select_description_sort_by = 'To select this option press SPACE or ENTER key.',\n            label_close_sort_by = 'Close'\n        } = this.props\n\n        const options = appData.get('sortOptions').map(option => ({\n            label: option.label,\n            value: this._formatSortValue(option.key, option.order),\n            checked: option.checked\n        }))\n\n        if (appData.get('sortCurrent').key !== appData.get('sortOptions')[0].key) {\n            options.forEach(option => {\n                option.checked =\n                    option.value ===\n                    this._formatSortValue(\n                        appData.get('sortCurrent').key,\n                        appData.get('sortCurrent').order\n                    )\n            })\n        }\n\n        const data = {\n            label: label_sort_by,\n            aa_description: aa_description_sort_by,\n            aa_listbox_description: aa_listbox_description_sort_by,\n            aa_select_description: aa_select_description_sort_by,\n            icon_option: '16/symbol/check',\n            label_close: label_close_sort_by,\n            options: options\n        }\n\n        this.template = `<nb-dropdown id=\"${this.#SORT_MENU_ID}\" data='${stringifyForAttribute(\n            data\n        )}'/>`\n    }\n\n    onReady() {\n        this.sortButton = document.getElementById(this.#SORT_MENU_ID)\n        this.sortButton?.addEventListener(EVENT_SORT_BY_CHANGE, this.boundOnSortChange)\n    }\n\n    componentUpdated() {\n        const { key, order } = appData.get('sortCurrent')\n        this.sortButton?.setSelected(this._formatSortValue(key, order))\n    }\n\n    onSortChange(e) {\n        const [key, order] = e.detail.selected.value.split(this.formatSortSeparator)\n        appData.set('sortCurrent', { key, order })\n        handleAppEvent('onSort')\n    }\n\n    onDestroy() {\n        this.sortButton?.removeEventListener(EVENT_SORT_BY_CHANGE, this.boundOnSortChange)\n        appData.unsubscribe(this.componentUpdated)\n    }\n\n    _formatSortValue(key, order) {\n        return `${key}${this.formatSortSeparator}${order}`\n    }\n}\n\ncustomElements.get('plp-filter-sort') || customElements.define('plp-filter-sort', PlpFilterSort)\n\nexport default PlpFilterSort\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\nimport './_plp.filter.main.scss'\nimport './plp.filter-cta'\nimport './plp.filter-links'\nimport './plp.filter-sort'\nimport appData from '../../store/plp.data'\nimport { customEvent } from '@kissui/helpers/src/gtmEvents'\n\nclass PlpFilter extends NespressoElement {\n    static get observedAttributes() {\n        return ['data-request', 'data-filter-counter']\n    }\n\n    attributeChangedCallback(name, oldVal, newVal) {\n        if (newVal != null && newVal !== oldVal && newVal.length > 0) {\n            if (name === 'data-request') {\n                this.updateComponent()\n            } else if (name === 'data-filter-counter') {\n                document\n                    .getElementById('plp-filter-cta')\n                    .setAttribute('data-filter-counter', newVal)\n            }\n        }\n    }\n\n    onStart() {\n        this.props = this._createProps(this.parentElement.attributes)\n        this.classList.add('plp-filter')\n    }\n\n    updateComponent() {\n        const nav_links = appData.get('nav_links')\n        /* Some markets still using PB old PB export which has 4 campaign param instead of one campaign object.\n       This change adds a fallback to work with both the cases. */\n        const campaign = {\n            id: this.props.campaign_id,\n            creative: this.props.campaign_creative,\n            name: this.props.campaign_name,\n            position: this.props.campaign_position\n        }\n\n        const HTML = `\n            <div class='plp-filter-restrict'>\n                <plp-filter-cta\n                    id=\"plp-filter-cta\"\n                    cta_filter_label=\"${\n                        this.props.copywriting?.cta_filter_label || this.props.cta_filter_label\n                    }\"\n                    data-filter-counter=\"0\"\n                ></plp-filter-cta>\n                <plp-filter-links\n                    data = '${stringifyForAttribute({\n                        navigation: nav_links,\n                        a11y_slider_previous_button: this.props.a11y_slider_previous_button,\n                        a11y_slider_next_button: this.props.a11y_slider_next_button,\n                        campaign: this.props.campaign || campaign\n                    })}'\n                ></plp-filter-links>\n                <plp-filter-sort></plp-filter-sort>\n            </div>`\n        this.loadTemplate(HTML)\n        this.filterLinks = this.querySelectorAll('nb-slider-natural nb-link a')\n        this.bindEvents()\n    }\n\n    linkClick({ textContent }) {\n        customEvent({\n            eventAction: 'PLP Content Tab',\n            eventLabel: textContent\n        })\n    }\n\n    bindEvents() {\n        this.unbindEvents()\n        if (this.filterLinks?.length) {\n            this.filterLinks.forEach(element => {\n                const textContent = element.querySelector('span').textContent\n                element.boundLinkClick = this.linkClick.bind(this, { textContent })\n                element.addEventListener('click', element.boundLinkClick)\n            })\n        }\n    }\n\n    unbindEvents() {\n        if (this.filterLinks?.length) {\n            this.filterLinks.forEach(element => {\n                element.removeEventListener('click', element.boundLinkClick)\n            })\n        }\n    }\n}\n\ncustomElements.get('plp-filter') || customElements.define('plp-filter', PlpFilter)\n\nexport default PlpFilter\n","/* eslint-disable */\n\nconst stickyService = () => {\n    let element = null\n    let elementHeight = 0\n    let stickyElementSelector = ''\n    let magicIndex = 2 // FFS\n\n    const initialize = (\n        $element,\n        $elementHeight = elementHeight,\n        $stickyElementSelector = stickyElementSelector,\n        $magicIndex = magicIndex\n    ) => {\n        element = $element\n        elementHeight = $elementHeight\n        stickyElementSelector = $stickyElementSelector\n        magicIndex = $magicIndex\n        element.setAttribute('sticky', 'false')\n        element.classList.add('nb-sticky-container')\n        updateSticky()\n        bindEvent()\n    }\n\n    const updateSticky = () => {\n        const sticky = element.getAttribute('sticky') || 'false'\n        let offsetElement = 0\n        let isReady = false\n        let parent = {}\n        for (var i = 0; i < element.parentElement.childNodes.length; i++) {\n            if (\n                element.parentElement.childNodes[i].tagName &&\n                element.parentElement.childNodes[i].tagName === element.tagName\n            ) {\n                parent = element.parentElement.childNodes[i + magicIndex]\n                if (parent) {\n                    // todo : why 80px here ? if it's header height it should take other banners in consideration ?\n                    offsetElement = parent.offsetTop - 80\n                    isReady = true\n                }\n            }\n            if (isReady) {\n                break\n            }\n        }\n        // todo review this flow, it's when the sticky element is the first of the list of childrens\n        if (isReady && offsetElement === 0) {\n            offsetElement = element.parentElement.offsetTop + element.parentElement.offsetHeight\n        }\n        const boundary = window.scrollY - offsetElement\n        const isSticky = boundary > 0\n\n        if ((sticky === 'true') !== isSticky) {\n            element.setAttribute('sticky', isSticky)\n            if (elementHeight > 0) {\n                document.body.style.paddingTop = isSticky ? elementHeight + 'px' : '0px'\n            }\n        }\n    }\n\n    const destroy = () => {\n        unbindEvent()\n    }\n\n    const bindEvent = () => {\n        window.addEventListener('scroll', updateSticky)\n    }\n\n    const unbindEvent = () => {\n        window.removeEventListener('scroll', updateSticky)\n    }\n\n    const updatePosition = (offset = 0) => {\n        let el = element\n        if (stickyElementSelector !== '') {\n            el = element.querySelector(stickyElementSelector)\n        }\n        if (!el) {\n            return\n        }\n\n        const $header = document.querySelector('.Header__top')\n        const headerRect = $header?.getBoundingClientRect() || { height: 0, y: 0 }\n        const header = { height: headerRect.height, top: headerRect.y }\n\n        const top = `${header.top + header.height + offset}px`\n        el.style.top = top\n\n        return 0\n    }\n\n    return { initialize, destroy, updatePosition }\n}\n\nconst service = stickyService()\n\nexport default service\n","import { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport appData from '../../store/plp.data'\n\nconst dataTransformNavLinks = navLinks => {\n    return navLinks ? stringifyForAttribute({ navigation: navLinks }) : ''\n}\n\nconst dataTransformNavigationBubbles = ({\n    bubbles,\n    // todo remove ity\n    // navigation_bubbles,\n    a11y_slider_previous_button,\n    a11y_slider_next_button,\n    campaign,\n    selected_nav_link_label\n}) => {\n    return bubbles\n        ? stringifyForAttribute({\n              a11y_slider_previous_button,\n              a11y_slider_next_button,\n              bubbles: bubbles,\n              customEventAction: 'PLP Content Tab',\n              campaign,\n              selected_nav_link_label\n          })\n        : ''\n}\n\nexport const render = (props, campaign) => {\n    const { a11y_slider_previous_button, a11y_slider_next_button } = props\n    const nav_links = appData.get('nav_links') || []\n    const bubbles = appData.get('bubbles') || []\n    const selected_nav_link = nav_links.find(nav_link => nav_link.selected)\n    const selected_nav_link_label = selected_nav_link?.label\n\n    const data_navigation_bubbles = dataTransformNavigationBubbles({\n        bubbles,\n        ...props,\n        campaign,\n        selected_nav_link_label\n    })\n\n    return `\n        <nb-navigation-bubbles data='${data_navigation_bubbles}'></nb-navigation-bubbles>\n        <nb-plp-sticky-bar\n            data=\"${dataTransformNavLinks(nav_links)}\"\n            a11y_slider_previous_button=\"${a11y_slider_previous_button}\"\n            a11y_slider_next_button=\"${a11y_slider_next_button}\"\n            navigation_bubbles=\"${data_navigation_bubbles}\"\n            selected_nav_link_label=\"${selected_nav_link_label}\"\n        ></nb-plp-sticky-bar>\n    `\n}\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport stickyService from '@kissui/components/src/sticky/sticky.service'\nimport * as navigationBar from './plp.bar'\nimport './_plp.navigation.main.scss'\n\n/*\nSpecs:\n- [✓] Add sticky bar height 180\n- [✓] Add sticky bar on mobile, height 132px\n- [✓] If there is products filtered, remove the sticky bar\n */\n\nclass PlpNavigation extends NespressoElement {\n    #isSticky = true\n\n    onStart() {\n        this.props = this._createProps(this.parentElement.attributes)\n\n        // attribute magic-index is used in the sticky service to override the element picked as the \"below the fold\" point :-(\n        const magicIndex = this.attributes.getNamedItem('magic-index')\n            ? Number(this.attributes.getNamedItem('magic-index').value)\n            : undefined\n\n        this.#isSticky && stickyService.initialize(this, 0, 'nb-plp-sticky-bar', magicIndex)\n    }\n\n    static get observedAttributes() {\n        return ['sticky', 'data-request']\n    }\n\n    attributeChangedCallback(name, oldVal, newVal) {\n        if (newVal !== null && newVal !== oldVal && newVal.length) {\n            if (name === 'sticky') {\n                this.#isSticky && stickyService.updatePosition()\n            }\n            if (name === 'data-request') {\n                this.updateComponent()\n            }\n        }\n    }\n\n    updateComponent() {\n        /* Some markets still using PB old PB export which has 4 campaign param instead of one campaign object.\n        This change adds a fallback to work with both the cases. */\n        const campaign = {\n            id: this.props.campaign_id,\n            creative: this.props.campaign_creative,\n            name: this.props.campaign_name,\n            position: this.props.campaign_position\n        }\n        const HTML = navigationBar.render(\n            this.props.copywriting ? this.props.copywriting : this.props,\n            this.props.campaign || campaign,\n            true\n        )\n        this.loadTemplate(HTML)\n    }\n\n    onDestroy() {\n        this.#isSticky && stickyService.destroy()\n    }\n}\n\ncustomElements.get('plp-navigation') || customElements.define('plp-navigation', PlpNavigation)\n\nexport default PlpNavigation\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport appData from '../../store/plp.data'\nimport handleAppEvent from '../../store'\n\nclass PlpResultsChip extends NespressoElement {\n    onStart() {\n        const { a11y_label, color, icon_right, label, variation } = this.props\n\n        const colorHtml = color ? `<div class=\"chip-color\" style=\"background:${color}\"></div>` : ''\n\n        this.template = `\n            <nb-cta\n                icon_right=\"${icon_right}\"\n                variation=\"${variation}\"\n                size=\"32\"\n                aria_label=\"${a11y_label} ${label}\"\n             >\n                ${colorHtml}${label}\n             </nb-cta>\n        `\n    }\n    onReady() {\n        const { value, type, label } = this.props\n        this.addEventListener('click', () => {\n            appData.filtersUpdate({\n                key: type,\n                label: label,\n                selected: false,\n                value: value\n            })\n            this.remove()\n            handleAppEvent('onFilter')\n        })\n    }\n}\n\ncustomElements.get('plp-results-chip') || customElements.define('plp-results-chip', PlpResultsChip)\n\nexport default PlpResultsChip\n","import appData from '../../store/plp.data'\nimport './plp.results-chip'\nimport './plp.results-header.scss'\nimport { CB_RESULTS_TOTAL_ID } from '@kissui/apps/src/plp-core/config/constants'\n\nexport default (copywritingProps = {}) => {\n    const {\n        a11y_header_result_label_button = 'Reset filter',\n        a11y_header_result_label_reset = 'Filters',\n        a11y_header_result_label_results = 'With your filters activated, you have currently',\n        header_result_label = 'Currently shopping by',\n        header_result_label_reset = 'Reset all',\n        header_result_label_results = 'Results',\n        header_result_label_results_one = 'Result',\n        header_result_label_results_zero = 'Results'\n    } = copywritingProps\n\n    const total = appData.productsFilteredCount()\n    const filterLabels = appData.filtersSelectedCount() && appData.filtersSelectedWithLabel()\n    const getResultLabel = () => {\n        switch (total) {\n            case 0:\n                return header_result_label_results_zero\n            case 1:\n                return header_result_label_results_one\n            default:\n                return header_result_label_results\n        }\n    }\n\n    return `\n        <nb-container\n            element_class=\"plp-results-header\"\n            contrast=\"light\">\n            ${\n                filterLabels\n                    ? `<p class=\"t-sm-400-sl cb-title\">${header_result_label}\n                        <span class='sr-only'>&nbsp;${filterLabels\n                            .map(filter => `${filter.categoryTitle}, ${filter.label}, `)\n                            .join(' / ')}</span>\n                    </p>${filterLabels\n                        .map(\n                            filter =>\n                                `<plp-results-chip\n                            icon_right=\"24/symbol/close\"\n                            variation=\"secondary\"\n                            value=\"${filter.value}\"\n                            type=\"${filter.key}\"\n                            label=\"${filter.label}\"\n                            color=\"${filter.color || ''}\"\n                            a11y_label=\"${a11y_header_result_label_button}\"\n                        >${filter.label}</plp-results-chip>`\n                        )\n                        .join('')}`\n                    : ''\n            }\n            <nb-link\n                id=\"nb-plp-filter-results-reset-all\"\n                size=\"small\"\n                color=\"black\"\n                aria-label=\"${a11y_header_result_label_reset}\"\n            >\n                ${header_result_label_reset}\n            </nb-link>\n            <p class=\"t-xs-700-caps-sl cb-results\">\n                <span class=\"sr-only\">${a11y_header_result_label_results}</span>&nbsp;\n                <span id=\"${CB_RESULTS_TOTAL_ID}\">${total}</span> ${getResultLabel()}:\n            </p>\n        </nb-container>\n    `\n}\n","import { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport { getSkuComponentByType } from '@kissui/components/src/sku/services'\nimport appData from '../store/plp.data'\nimport { VARIATION_PLP } from '@kissui/components/src/sku/constants'\n\nexport default (product, rendererName = '', list = '', index = 0) => {\n    const data = { ...product, ...{ rendererName } }\n    const position = index + 1\n\n    // tracking\n    data.position = position\n\n    // price\n    data.price = appData.priceFormatter.short(appData.currency, product.price)\n    data.rawPrice = product.price // need the raw price for tracking\n    if (data.sleevePrice) {\n        data.sleevePrice = appData.priceFormatter.short(appData.currency, product.sleevePrice)\n    }\n\n    // price per capsule\n    if (data.price_per_capsule) {\n        data.price_per_capsule = appData.priceFormatter.short(\n            appData.currency,\n            product.price_per_capsule\n        )\n    }\n\n    // Make the variation available to the SKU component to know where it is being displayed\n    data.variation = VARIATION_PLP\n    data.intensity_label =\n        appData.get('options')?.intensity_label ||\n        appData.translations['productlistrespblock.capsule.a11y.intensity']\n    data.campaign = appData.get('campaign')\n\n    const tag = getSkuComponentByType(data) // sku-coffee\n\n    return `<${tag}\n                tracking_list=\"${list}\"\n                tracking_position=\"${position}\"\n                id=\"${data.sku}\"\n                data=\"${stringifyForAttribute(data)}\"\n                ${data.highlighted ? `highlighted=\"${data.highlighted}\"` : ''}\n           ></${tag}>`\n}\n","import { filterActionEvent } from '@kissui/helpers/src/gtmEvents'\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport appData from '../../store/plp.data'\nimport handleAppEvent from '../../store'\nimport renderHeader from './plp.results-header'\nimport renderProduct from '../plp.product'\n\nclass PlpResults extends NespressoElement {\n    #headerSelector = 'nb-container[element_class=\"plp-results-header\"]'\n    #resetSelector = '#nb-plp-filter-results-reset-all'\n\n    onStart() {\n        this.props = this._createProps(this.parentElement.attributes)\n        this.shouldHideHeader = this.getAttribute('hide-header') === 'true'\n        this.productListBkp = []\n        this.classList.add('plp-results')\n    }\n\n    static get observedAttributes() {\n        return ['data-request']\n    }\n\n    attributeChangedCallback(name, oldVal, newVal) {\n        if (newVal !== null && newVal !== oldVal && !!newVal.length) {\n            if (name === 'data-request') {\n                this.updateComponent()\n            }\n        }\n    }\n\n    updateComponent() {\n        const headerMarkup = this.shouldHideHeader ? '' : renderHeader(this.props)\n        if (this.arraysAreEqual(this.productListBkp, appData.productsListFiltered())) {\n            // The header needs to update, even when the results do not change\n            document.querySelector(this.#headerSelector).outerhtml = headerMarkup\n            this.bindEvents()\n            return\n        }\n\n        this.productListBkp = appData.productsListFiltered()\n        const hasFilters = appData.filtersSelectedCount() > 0\n        const isSorted = appData.get('sortCurrent')?.key !== appData.get('sortOptions')?.[0].key\n        const listName = `${hasFilters ? 'filtered plp' : ''}${isSorted && hasFilters ? ': ' : ''}${\n            isSorted ? 'manually ordered' : ''\n        }`\n\n        this.loadTemplate(\n            `\n            ${headerMarkup}\n            <nb-container element_class=\"plp-grid\" className=\"plp-grid--results-list\">\n                ${appData\n                    .productsListFiltered()\n                    .map((product, index) => {\n                        return renderProduct(product, 'results', listName || index)\n                    })\n                    .join('')}\n            </nb-container>\n        `,\n            true\n        )\n\n        this.bindEvents()\n    }\n\n    arraysAreEqual(a = [], b = []) {\n        return a.length !== b.length ? false : a.every((value, index) => value === b[index])\n    }\n\n    onDestroy() {\n        document.querySelector(this.#resetSelector)?.removeEventListener('click', this.resetClick)\n    }\n\n    bindEvents() {\n        document.querySelector(this.#resetSelector)?.addEventListener('click', this.resetClick)\n    }\n\n    resetClick() {\n        filterActionEvent('filter clear', '', '', 'clear all ext')\n        appData.filtersReset()\n        handleAppEvent('onFilter')\n    }\n}\n\ncustomElements.get('plp-results') || customElements.define('plp-results', PlpResults)\n\nexport default PlpResults\n","import { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport appData from '../../store/plp.data'\nimport categoryProducts from './plp.category-products'\nimport { EXPLICIT_FILTERS, runningExperiment } from '../../config/experiments'\n\nclass PlpProducts extends NespressoElement {\n    static get observedAttributes() {\n        return ['data-request']\n    }\n\n    attributeChangedCallback(name, oldVal, newVal) {\n        if (newVal !== null && newVal !== oldVal && newVal.length) {\n            if (name === 'data-request') {\n                this.updateComponent()\n            }\n        }\n    }\n\n    updateComponent() {\n        const categories = appData.get('products') ?? []\n        const HTML = categories.reduce((acc, category) => {\n            acc += categoryProducts(category)\n            return acc\n        }, '')\n        if (runningExperiment(EXPLICIT_FILTERS)) {\n            this.loadTemplate(HTML, true) // the DOM Diff, simply does not work\n        } else {\n            this.loadTemplate(HTML)\n        }\n    }\n}\n\ncustomElements.get('plp-products') || customElements.define('plp-products', PlpProducts)\n\nexport default PlpProducts\n","import './plp.category-products.scss'\nimport './plp.category-products-more-items-per-row.scss'\n\nimport renderProduct from '../plp.product'\n\nexport default props => {\n    const {\n        id = null,\n        background_retina,\n        background_desktop,\n        background_mobile,\n        background_tablet,\n        contrast = 'dark',\n        name = null,\n        description,\n        products = []\n    } = props\n\n    const renderHeading = () => {\n        return name ? `<h2 class=\"h-2xl-700 plp-category--title\">${name}</h2>` : ''\n    }\n\n    const renderDescription = () => {\n        return description ? `<p class=\"description t-md-400\">${description}</p>` : ''\n    }\n\n    // Tabindex=\"0\" is needed to make the anchors bubbles works for keyboard navigation\n    return `<div class=\"plp-category\" data-id=\"${id}\" tabindex=\"0\">\n                <nb-container\n                    classname=\"plp-category--header\"\n                    contrast=\"${contrast}\"\n                    background_retina=\"${background_retina}\"\n                    background_desktop=\"${background_desktop}\"\n                    background_mobile=\"${background_mobile}\"\n                    background_tablet=\"${background_tablet}\"\n                >\n                    <header>\n                        ${renderHeading()}\n                        <div class=\"plp-category--description\">\n                            ${renderDescription()}\n                        </div>\n                    </header>\n                </nb-container>\n                <nb-container classname=\"plp-category--products\" contrast=\"light\">\n                    <div class=\"plp-category--segment\">\n                        <div class=\"plp-category--side\"></div>\n                        <div class=\"plp-category--center\">\n                          <div class=\"plp-grid\">\n                            ${products\n                                .map((product, index) =>\n                                    renderProduct(product, undefined, name, index)\n                                )\n                                .join('')}\n                          </div>\n                        </div>\n                    </div>\n                </nb-container>\n            </div>`\n}\n","// import * as Turbo from \"@hotwired/turbo\"\nimport { NespressoElement } from '@kissui/components/src/nespressoElement'\nimport handleAppEvent from './store'\n\nimport {\n    FILTER_MAIN_BLOCK_ID,\n    NAVIGATION_MAIN_BLOCK_ID,\n    PRODUCTS_LIST_MAIN_BLOCK_ID,\n    PRODUCTS_RESULTS_MAIN_BLOCK_ID\n} from './config/constants'\nimport { enableExperiment } from './config/experiments'\n\nimport './styles/plp.app.scss'\n\nclass PLPApp extends NespressoElement {\n    constructor() {\n        super()\n        this.dataTransformService = () => []\n        this.dataFiltersService = () => []\n        this.dataSortService = () => []\n        this.recommendationService = () => {}\n        this.appStates = {}\n        this.plpType = 'app'\n    }\n\n    static get observedAttributes() {\n        return ['data-loaded', 'data']\n    }\n\n    attributeChangedCallback(name, oldVal, newVal) {\n        if (\n            name === 'data' &&\n            oldVal !== null && // avoid during the first render\n            newVal !== null &&\n            newVal !== oldVal &&\n            !!newVal.length\n        ) {\n            this.connectedCallback()\n            return\n        }\n        const propChanged = name === 'data-loaded'\n        const valueChanged = newVal !== null && newVal !== oldVal && !!newVal.length\n\n        if (propChanged && valueChanged) {\n            handleAppEvent('onMergeData', {\n                dataSortService: this.dataSortService,\n                filtersService: this.dataFiltersService,\n                productService: this.dataTransformService,\n                recommendationService: this.recommendationService,\n                pageBuilderProps: this.props\n            })\n        }\n    }\n\n    defineTemplate() {\n        this.template = `\n            <plp-filter id=\"${FILTER_MAIN_BLOCK_ID}\" style=\"display: none;\"></plp-filter>\n            <plp-navigation id=\"${NAVIGATION_MAIN_BLOCK_ID}\" style=\"display: none;\"></plp-navigation>\n            <plp-products id=\"${PRODUCTS_LIST_MAIN_BLOCK_ID}\" style=\"display: none;\"></plp-products>\n            <plp-results id=\"${PRODUCTS_RESULTS_MAIN_BLOCK_ID}\" style=\"display: none;\"></plp-results>\n        `\n    }\n\n    onStart() {\n        const enabledExperiments = this.props.options?.enabledExperiments ?? []\n        enabledExperiments.forEach(experiment => enableExperiment(experiment))\n\n        handleAppEvent('onload', {\n            plpType: this.plpType,\n            appStatesHandler: this.appStates\n        })\n\n        this.classList.add('plp-app', `plp-app-${this.plpType}`)\n        const itemsPerRow = this.props.options?.items_per_row\n        if (itemsPerRow > '3') {\n            this.classList.add(`plp-row-${itemsPerRow}`)\n        }\n\n        this.defineTemplate()\n    }\n}\n\nexport default PLPApp\n","/* eslint-disable */\nexport default class Category {\n    _id = ''\n    _name = ''\n    _description = ''\n    _products = []\n    _capacityLabel = null\n    _detailsIcon = null\n    _icon = null\n    _isLoadingProducts = false\n    _rangeLink = null\n    _subCategories = []\n    _superCategories = []\n    _url = ''\n    _background_retina =\n        '/shared_res/agility/next-components/assets/backgrounds/barista_creation_range_XL.jpg'\n    _background_desktop =\n        '/shared_res/agility/next-components/assets/backgrounds/barista_creation_range_L.jpg'\n    _background_mobile =\n        '/shared_res/agility/next-components/assets/backgrounds/barista_creation_range_S.jpg'\n    _background_tablet = ''\n    _contrast = 'dark'\n    _isSegment = false\n\n    constructor(category, PageBuilderData) {\n        this._id = category.id || this._id\n        this._name = category.name || this._name\n        this._capacityLabel = category.capacityLabel || this._capacityLabel\n        this._description = category.description || this._description\n        this._detailsIcon = category.detailsIcon || this._detailsIcon\n        this._icon = category.icon || this._icon\n        this._rangeLink = category.rangeLink || this._rangeLink\n        this._subCategories = category.subCategories || this._subCategories\n        this._superCategories = category.superCategories || this._superCategories\n        this._url = category.url || this._url\n        this._background_desktop = PageBuilderData?.background_desktop || this._background_desktop\n        this._background_mobile = PageBuilderData?.background_mobile || this._background_mobile\n        this._background_retina = PageBuilderData?.background_retina || this._background_retina\n        this._background_tablet = PageBuilderData?.background_tablet || this._background_tablet\n        this._contrast = PageBuilderData?.contrast || this._contrast\n    }\n\n    get id() {\n        return this._id\n    }\n    get products() {\n        return this._products\n    }\n    set products(products) {\n        this._products = products\n    }\n    get isLoadingProducts() {\n        return this._isLoadingProducts\n    }\n    set isLoadingProducts(isLoadingProducts) {\n        this._isLoadingProducts = isLoadingProducts\n    }\n    get name() {\n        return this._name\n    }\n    get description() {\n        return this._description\n    }\n    get contrast() {\n        return this._contrast\n    }\n    get background_desktop() {\n        return this._background_desktop\n    }\n    get background_mobile() {\n        return this._background_mobile\n    }\n    get background_retina() {\n        return this._background_retina\n    }\n    get background_tablet() {\n        return this._background_tablet\n    }\n\n    isProductCategory() {\n        return !this._isSegment && this._products && this._products.length > 0\n    }\n}\n","import Category from '../../plp-core/models/Category.js'\n\nexport default class CoffeeCategory extends Category {\n    constructor(category, PageBuilderData) {\n        super(category, PageBuilderData)\n    }\n}\n","import { isLoggedIn } from '@kissui/helpers/src/dataLayer'\n\nexport default class Product {\n    id = ''\n    sku = ''\n    longSku = ''\n    name = ''\n    name_custom = ''\n    available = true\n    description = null\n    hidePrice = false\n    image_alt_text = ''\n    image = ''\n    inStock = true\n    internationalId = ''\n    internationalName = ''\n    legacyId = ''\n    maxOrderQuantity = null\n    packagingType = null\n    price = null\n    pushRatingEnabled = false\n    ranges = []\n    salesMultiple = null\n    technologies = []\n    type = ''\n    unitQuantity = 50\n    url = ''\n    labels = []\n    category_name = ''\n    category = null\n    highlighted = false\n    strikethrough_price = ''\n    additional_message = ''\n    additional_message_icon = ''\n    additional_message_link = {}\n    api_override = null\n    view_details_label = ''\n    headline = ''\n\n    constructor(product) {\n        /* SKU */\n        this.sku = product.internationalId || this.sku\n        this.longSku = product.id || this.longSku\n        this.id = product.id || this.id\n        this.name = product.name || this.name\n        this.name_custom = product.name_custom || this.name_custom\n        this.available = product.available || this.available\n        this.description = product.description || this.description\n        this.hidePrice = isLoggedIn() ? false : product.hidePrice || this.hidePrice\n        this.image_alt_text = product?.image?.altText || this.image_alt_text\n        this.image = product?.image?.url || this.image\n        this.inStock = product.inStock\n        this.internationalId = product.internationalId || this.internationalId\n        this.internationalName = product.internationalName || this.internationalName\n        this.legacyId = product.legacyId || this.legacyId\n        this.maxOrderQuantity = product.maxOrderQuantity || this.maxOrderQuantity\n        this.packagingType = product.packagingType || this.packagingType\n        this.price = product.price ?? this.price\n        this.pushRatingEnabled = product.pushRatingEnabled || this.pushRatingEnabled\n        this.ranges = product.ranges || this.ranges\n        this.salesMultiple = product.salesMultiple || this.salesMultiple\n        this.technologies = product.technologies || this.technologies\n        this.type = product.type || this.type\n        this.unitQuantity = product.unitQuantity || this.unitQuantity\n        this.url = product.url || this.url\n        this.highlighted = product.highlighted || this.highlighted\n        this.strikethrough_price = product.strikethrough_price || this.strikethrough_price\n        this.additional_message = product.additional_message || this.additional_message\n        this.additional_message_icon =\n            product.additional_message_icon || this.additional_message_icon\n        this.additional_message_link =\n            product.additional_message_link || this.additional_message_link\n        this.api_override = product.api_override || this.api_override\n        this.view_details_label = product.view_details_label || this.view_details_label\n        this.headline = product.headline || this.headline\n        this.labels = product.labels || this.labels\n\n        // category_name\n        const categoryId = product.categoryId ? product.categoryId.split('/') : ['']\n        this.category_name = categoryId[categoryId.length - 1]\n        this.category = product.category || this.category\n    }\n}\n","import Product from '../../plp-core/models/Product.js'\nimport { getSleeveNumber } from '@kissui/helpers/src/catalog'\n\nexport default class CoffeeProduct extends Product {\n    cupSizes = []\n    cupSizesDetails = []\n    flavors = []\n    in_stock = true\n    sales_multiple = 0\n    bundled = false\n    logos = []\n    is_headline_hidden = ''\n    a11y_price = ''\n    a11y_product_card = ''\n    shop_similar = ''\n    label_sleeve = ''\n    label_sleeves = ''\n    label_capsules = ''\n    intensity = null\n    a11y_intensity_max = ''\n    label_decaffeinato = ''\n    show_sleeve_price = false\n    show_sleeve = false\n    price_per_capsule = null\n    final_price = null\n    capsule_price_label = ''\n    capsule_price_syntax = '{capsule_price_label}: {price_per_capsule}'\n    sleeve_syntax = '{numberOfSleeves} {sleeveLabel} ({quantity} {label_capsules})'\n    perSleeveLabel = ''\n    number_of_sleeves = ''\n    number_of_capsules = ''\n    show_capsule_price = false\n    sort_price = null\n    bundle_details = {}\n\n    constructor(product, PageBuilderData) {\n        super(product)\n        this.initializeCopywritingData(PageBuilderData)\n        this.initializeOptionsData(PageBuilderData)\n        this.initializeProductData(product)\n        this.finalizeInitialization(product)\n    }\n\n    initializeCopywritingData(PageBuilderData) {\n        const {\n            a11y_price = '',\n            a11y_product_card = '',\n            shop_similar,\n            quick_view_plp = {},\n            alt_fair_trade = '',\n            alt_vertuo_next = '',\n            alt_organic = '',\n            alt_rainforest = '',\n            alt_sustainability = '',\n            alt_q_certification_arabica = ''\n        } = PageBuilderData.copywriting || PageBuilderData\n\n        this.a11y_price = a11y_price\n        this.a11y_product_card = a11y_product_card\n        this.shop_similar = shop_similar\n        this.quick_view_plp = quick_view_plp\n\n        this.altTexts = {\n            fair_trade: alt_fair_trade,\n            vertuo_next: alt_vertuo_next,\n            organic: alt_organic,\n            rainforest: alt_rainforest,\n            sustainability: alt_sustainability,\n            q_certification_arabica: alt_q_certification_arabica\n        }\n    }\n\n    initializeOptionsData(PageBuilderData) {\n        const {\n            show_sleeve = false,\n            label_sleeve = '',\n            label_sleeves = '',\n            label_capsules = '',\n            show_sleeve_price = false,\n            capsule_price_label,\n            capsule_price_syntax,\n            is_headline_hidden = false,\n            sleeve_syntax = '{numberOfSleeves} {sleeveLabel} ({quantity} {label_capsules})',\n            label_decaffeinato = '',\n            a11y_intensity_max = '',\n            perSleeveLabel = ''\n        } = PageBuilderData.options || PageBuilderData\n\n        this.show_sleeve = show_sleeve\n        this.label_sleeve = label_sleeve\n        this.label_sleeves = label_sleeves\n        this.label_capsules = label_capsules\n        this.show_sleeve_price = show_sleeve_price\n        this.capsule_price_label = capsule_price_label || this.capsule_price_label\n        this.capsule_price_syntax = capsule_price_syntax || this.capsule_price_syntax\n        this.is_headline_hidden = is_headline_hidden\n        this.sleeve_syntax = sleeve_syntax\n        this.label_decaffeinato = label_decaffeinato\n        this.a11y_intensity_max = a11y_intensity_max\n        this.perSleeveLabel = perSleeveLabel || this.perSleeveLabel\n    }\n\n    initializeProductData(product) {\n        this.cupSizes = product.cupSizes || this.cupSizes\n        this.cupSizesDetails = product.cupSizesDetails || this.cupSizesDetails\n        this.flavors = product.flavors || this.flavors\n        this.in_stock = product.inStock !== undefined ? product.inStock : this.in_stock\n        this.intensity = product.intensity || this.intensity\n        this.min_intensity = product.min_intensity\n        this.max_intensity = product.max_intensity\n        this.sales_multiple = product.salesMultiple\n        this.price_per_capsule = product.price_per_capsule || this.price_per_capsule\n        this.price = this.getPrice(product)\n        this.number_of_sleeves = product.number_of_sleeves || this.number_of_sleeves\n        this.number_of_capsules = product.number_of_capsules || this.number_of_capsules\n        this.show_capsule_price = product.show_capsule_price || this.show_capsule_price\n        this.sort_price = this.getSortPrice(product)\n        this.bundle_details = product.bundle_details || this.bundle_details\n        this.images = product.images || {}\n        this.initializeLogos(product)\n    }\n\n    initializeLogos(product) {\n        const logosConfig = [\n            { condition: product.onlyVertuoNext, name: 'only_vertuo_next', altKey: 'vertuo_next' },\n            { condition: product.fairTrade, name: 'fair_trade', altKey: 'fair_trade' },\n            { condition: product.organicEu, name: 'is_organic', altKey: 'organic' },\n            { condition: product.rainforest, name: 'is_rainforest', altKey: 'rainforest' },\n            { condition: product.sustainability, name: 'is_sustainable', altKey: 'sustainability' },\n            {\n                condition: product.arabica,\n                name: 'is_q_certified_arabica',\n                altKey: 'q_certification_arabica'\n            }\n        ]\n        this.logos = logosConfig\n            .filter(logo => logo.condition != null)\n            .map(({ name, altKey }) => ({\n                name,\n                alt: this.altTexts[altKey]\n            }))\n    }\n\n    finalizeInitialization(product) {\n        const sleeveNumber = this.number_of_sleeves || getSleeveNumber(product)\n        const { hasPricePerSleeve, sleevePrice } = this.getSleevePrice({\n            show_sleeve_price: this.show_sleeve_price,\n            number_of_sleeves: sleeveNumber,\n            salesMultiple: this.sales_multiple,\n            price: this.price,\n            bundled: this.bundled\n        })\n        this.hasPricePerSleeve = hasPricePerSleeve\n        this.sleevePrice = sleevePrice\n        this.bundled = this.isBundled()\n    }\n\n    getPrice(product) {\n        return product.final_price ?? product.price ?? this.final_price\n    }\n\n    getSortPrice(product) {\n        return this.show_sleeve_price || product.price_per_capsule == null\n            ? this.getPrice(product)\n            : product.price_per_capsule\n    }\n\n    getSleevePrice({ show_sleeve_price, number_of_sleeves, salesMultiple, price, bundled }) {\n        let hasPricePerSleeve = true\n        let sleevePrice = null\n        if (!bundled && number_of_sleeves === 1) {\n            sleevePrice = price * (show_sleeve_price ? 1 : salesMultiple)\n        } else {\n            hasPricePerSleeve = false\n        }\n        return { hasPricePerSleeve, sleevePrice }\n    }\n\n    isBundled() {\n        return this.sales_multiple > 1 && this.unitQuantity === 1\n            ? false\n            : this.sales_multiple === 1 && this.unitQuantity > 1\n    }\n}\n","import { COFFEE_ORIGINAL, COFFEE_VERTUO, COFFEE_PRO } from '@kissui/components/src/constants.mjs'\n\nexport default (nav_links, enabledCremaTechnologies, PageBuilderData) => {\n    // Do not change icon name. This is NC2 merger of menus from PB export and crema data\n    const ORIGINAL_ICON = 'coffee'\n    const VERTUO_ICON = 'gran-lungo-vertuo-capsule'\n    const PRO_ICON = 'brand_coffee_capsule_pro'\n\n    const { copywriting = {}, options = {} } = PageBuilderData\n\n    const transformCremaTechnologiesToLink = technologies => {\n        return technologies.map(({ id, url, name, isSelected }) => ({\n            link: url,\n            label: name,\n            seo_label: name,\n            icon_left: id ? getIconByTechnology(id.split('/').pop()) : '',\n            selected: isSelected\n        }))\n    }\n    const getIconByTechnology = technology => {\n        switch (technology) {\n            case COFFEE_VERTUO:\n                return VERTUO_ICON\n            case COFFEE_PRO:\n                return PRO_ICON\n            default:\n                return COFFEE_ORIGINAL\n        }\n    }\n    const filterDefaultTechnology = link => {\n        if (\n            link.icon_left !== ORIGINAL_ICON &&\n            link.icon_left !== VERTUO_ICON &&\n            link.icon_left !== PRO_ICON\n        ) {\n            return link\n        }\n    }\n\n    const replaceCremaTechnologies = () => {\n        if (!copywriting.all_products_navigation_label) {\n            return []\n        }\n        const selectedTechnology = enabledCremaTechnologies.find(t => t.isSelected)\n        if (!selectedTechnology) {\n            return []\n        }\n        return [\n            {\n                url: selectedTechnology.url,\n                name: copywriting.all_products_navigation_label,\n                isSelected: true\n            }\n        ]\n    }\n\n    let enabledTechnologies\n    if (options.hide_technologies_in_navigation) {\n        enabledTechnologies = replaceCremaTechnologies()\n    } else {\n        enabledTechnologies = enabledCremaTechnologies\n    }\n\n    if (!nav_links.length && enabledTechnologies.length) {\n        return transformCremaTechnologiesToLink(enabledTechnologies)\n    }\n\n    if (!enabledTechnologies.length) {\n        return nav_links\n    }\n\n    // Remove Page Builder data about technology links to use the one activated in Crema UI data\n    const navLinksWithoutTechnology = [...nav_links].filter(filterDefaultTechnology)\n\n    return [...transformCremaTechnologiesToLink(enabledTechnologies), ...navLinksWithoutTechnology]\n}\n","import { DEFAULT_BUBBLE_ICON } from '@kissui/components/src/constants.mjs'\nimport { isCategoryHidden } from '@kissui/helpers/src/cremaDataHelper'\n\nexport default (bubbles, productGroups, categories, recommendation) => {\n    const productsGroup = productGroups\n        .filter(el => !isCategoryHidden(el.categoryId)) // For AB testing\n        .map(el => el.categoryId)\n    const bubblesFilteredAndSorted = []\n\n    const bubblesMathProductsGroup = bubbles\n        .map(bubble => {\n            const normalizedBubble = {\n                ...bubble,\n                link: bubble.link.replace('#', '')\n            }\n\n            if (productsGroup.includes(normalizedBubble.link)) {\n                return normalizedBubble\n            }\n        })\n        .filter(ele => typeof ele !== 'undefined')\n\n    productsGroup.forEach(categoryId => {\n        const bubble = bubblesMathProductsGroup.find(({ link }) => link === categoryId)\n        if (bubble) {\n            bubblesFilteredAndSorted.push(bubble)\n        } else {\n            const cremaCategory = categories.find(category => category.id === categoryId)\n            if (cremaCategory) {\n                const { name, id, icon } = cremaCategory\n                const cremaBubble = {\n                    link: id,\n                    tracking_label: name,\n                    label: name,\n                    visual: {\n                        src: icon?.url || DEFAULT_BUBBLE_ICON,\n                        alt: icon?.altText || name\n                    }\n                }\n                bubblesFilteredAndSorted.push(cremaBubble)\n            }\n        }\n    })\n\n    if (recommendation) {\n        bubblesFilteredAndSorted.unshift({\n            link: recommendation.id,\n            tracking_label: recommendation.name,\n            label: recommendation.name,\n            visual: {\n                src: recommendation.background_desktop,\n                alt: recommendation.name\n            }\n        })\n    }\n\n    return bubblesFilteredAndSorted\n}\n","/**\n * Modifies the structure to make it easier to use in components\n * Applies all the data customization mixing Page builder with HMC data\n * @param {object} plpData : original PLP data\n */\nimport navigationLinks from './NavigationLinks'\nimport navigationBubbles from './NavigationBubbles'\nimport { getLabels, isCategoryHidden } from '@kissui/helpers/src/cremaDataHelper'\nimport { isLoggedIn } from '@kissui/helpers/src/dataLayer'\n\nconst MAX_INTENSITY_FALLBACK = 15\n\n/**\n * Prior to HMC supporting labels natively the hack was to use a category with the data\n * about the label held as JSON data in the description. This function will parse the\n * descriptions for each label once and store them as an object.\n */\nconst parseLabels = labels => {\n    labels.forEach(label => {\n        try {\n            label.parsedData = JSON.parse(label.description)\n        } catch (e) {\n            console.error(\n                'Wrong JSON format in HMC label categories',\n                label.id,\n                label.description,\n                e\n            )\n            return\n        }\n    })\n}\n\n/**\n * Labels data is now available natively in the HMC data. If any labels are specified in the\n * HMC data then this should overwrite the existing functionality. To allow support for both\n * the \"labels from categories\" should continue to be used if HMC data is not specified.\n *\n * Adds labels property to products containing each label's category data (JSON\n * parsed description property) assigned to it.\n * Labels are categories that have the label base category as parent.\n * To apply a label on a given product, the label has to contain the product.\n * This function has to clean the productGroups as well by removing the label ones\n *\n * @param eCommerceData\n */\nconst addLabels = ({ categories, productGroups, products }) => {\n    // Labels are already present in the products, skip.\n    // This can happen after merging lazy data like recommendations\n    if (products.some(product => product.labels?.length)) {\n        return\n    }\n\n    // Use HMC data, if available, create labels with data from highlightLabels\n    products.forEach(product => {\n        if (product.highlightLabels?.length) {\n            product.labels = product.highlightLabels.map(label => ({\n                name: label.text,\n                color: label.textColor,\n                bgColor: label.backgroundColor\n            }))\n        }\n    })\n\n    // Backward compatibility, fall back to using HMC categories if no native HMC labels are specified\n    const labels = getLabels(categories)\n    parseLabels(labels)\n\n    const labelGroups = productGroups.filter(group =>\n        labels.some(label => label.id === group.categoryId)\n    )\n\n    labelGroups.forEach(group => {\n        const label = labels.find(__label => __label.id === group.categoryId)\n        if (!label.parsedData) {\n            // Data could not be parsed so skip this label\n            return\n        }\n        group.productIds.forEach(productId => {\n            const prod = products.find(product => product.id === productId)\n            if (!prod || prod.highlightLabels?.length > 0) {\n                // Product not found or has native HMC labels\n                return\n            }\n            prod.labels = prod.labels || []\n            prod.labels.push(label.parsedData)\n        })\n    })\n\n    //remove label categories from productGroups\n    labelGroups.forEach(labelGroup => {\n        const indexToRemove = productGroups.findIndex(\n            productGroup => productGroup.categoryId === labelGroup.categoryId\n        )\n        productGroups.splice(indexToRemove, 1)\n    })\n}\n\nexport default (\n    plpData,\n    PageBuilderData,\n    Category,\n    Product,\n    colorFilterFunction,\n    recommendation\n) => {\n    if (!plpData.data) {\n        return\n    }\n\n    let { categories, productGroups, enabledTechnologies, products } =\n        plpData.data.configuration.eCommerceData\n\n    productGroups = getOverridenProductGroups(recommendation, productGroups)\n    applyRecommendationOverrides(recommendation, { Product, PageBuilderData })\n    applyProductsOverrides(products, PageBuilderData)\n    addLabels({ categories, productGroups, products })\n\n    // Don't filter the products until after the labels have been applied\n    if (colorFilterFunction) {\n        products = colorFilterFunction(products)\n    }\n\n    const overriddenCategories = applyCategoryOverrides(categories, productGroups, products, {\n        PageBuilderData,\n        Category,\n        Product\n    })\n\n    return {\n        categories: recommendation\n            ? [recommendation, ...overriddenCategories]\n            : overriddenCategories,\n        translations: plpData.data.configuration.translations,\n        enabledTechnologies,\n        nav_links: navigationLinks(\n            getPBProperty(PageBuilderData, 'nav_links'),\n            enabledTechnologies,\n            PageBuilderData\n        ),\n        bubbles: navigationBubbles(\n            getPBProperty(PageBuilderData, 'navigation_bubbles.bubbles'),\n            productGroups,\n            categories,\n            recommendation\n        ),\n        maxIntensity: {\n            original: MAX_INTENSITY_FALLBACK,\n            vertuo: MAX_INTENSITY_FALLBACK,\n            ...(plpData.data.configuration?.props?.maxIntensity ?? {})\n        },\n        categoriesExtraData: recommendation ? [recommendation, ...categories] : categories\n    }\n}\n\n/**\n * Get a property from the Page Builder data taking into\n * account the old/new schema\n */\nfunction getPBProperty(PageBuilderData, key) {\n    return key.split('.').reduce(\n        (acc, current) => acc?.[current],\n        // Backward compatibility to old schema\n        PageBuilderData?.copywriting ? PageBuilderData.copywriting : PageBuilderData\n    )\n}\n\nfunction applyProductsOverrides(products, PageBuilderData) {\n    products.forEach(product => {\n        product.view_details_label = getPBProperty(PageBuilderData, 'view_details_label')\n\n        if (isLoggedIn()) {\n            // The hide price attribute from Crema UI actually means \"hide price for anonymous users\"\n            product.hidePrice = false\n        }\n\n        const pbProduct = PageBuilderData?.products?.find?.(\n            pbProductData => pbProductData.sku && pbProductData.sku === product.legacyId\n        )\n\n        if (!pbProduct) {\n            return\n        }\n\n        const apiOverride = pbProduct.api_override || product.api_override\n\n        // Apply page builder overrides\n        Object.assign(product, {\n            highlighted: pbProduct.highlighted,\n            strikethrough_price: pbProduct.strikethrough_price,\n            additional_message: pbProduct.additional_message,\n            additional_message_icon: pbProduct.additional_message_icon,\n            additional_message_link: pbProduct.additional_message_link || {},\n            display_machine_range_name: pbProduct.display_machine_range_name || false,\n            name_custom: pbProduct.name_custom || '',\n            ...(apiOverride\n                ? {\n                      image: {\n                          url: apiOverride?.image || product.image?.url\n                      },\n                      name: apiOverride?.name || product.name,\n                      headline: apiOverride?.headline || product.headline,\n                      description: apiOverride?.description || product.description,\n                      api_override: apiOverride\n                  }\n                : {})\n        })\n    })\n}\n\nfunction applyCategoryOverrides(\n    categories,\n    productGroups,\n    products,\n    { PageBuilderData, Category, Product }\n) {\n    return categories\n        .map(category => {\n            const extraData = getPBProperty(PageBuilderData, 'categories').find(\n                catData => catData.category_id === category.id\n            )\n\n            const categoryObj = new Category(category, extraData)\n\n            productGroups.forEach(productGroup => {\n                if (\n                    isCategoryHidden(productGroup.categoryId) ||\n                    productGroup.categoryId !== category.id\n                )\n                    return\n\n                productGroup.productIds.forEach(productID => {\n                    const product = products.find(p => p.id === productID)\n                    if (product) {\n                        product.categoryId = category.id\n                        product.category =\n                            categories.find(c => c.id === product.ranges?.[0]) || null\n                        const productObj = new Product(product, PageBuilderData)\n                        categoryObj.products.push(productObj)\n                    }\n                })\n            })\n\n            return categoryObj.isProductCategory() ? categoryObj : null\n        })\n        .filter(Boolean)\n}\n\nfunction getOverridenProductGroups(recommendation, productGroups) {\n    return recommendation\n        ? [\n              {\n                  categoryId: recommendation.id,\n                  productIds: recommendation.products.map(product => product.legacyId)\n              },\n              ...productGroups\n          ]\n        : productGroups\n}\n\nfunction applyRecommendationOverrides(recommendation, { Product, PageBuilderData }) {\n    if (!recommendation) {\n        return\n    }\n\n    recommendation.products = recommendation.products.map(p => new Product(p, PageBuilderData))\n}\n","export default (categories = []) => {\n    const intensities = categories\n        .flatMap(category => category.products)\n        .map(p => p?.intensity)\n        .filter(p => p !== undefined)\n    return !intensities.length\n        ? { min: 100, max: null }\n        : {\n              min: Math.min(...intensities),\n              max: Math.max(...intensities)\n          }\n}\n","export const CUPSIZE_ICON_DEFAULT = '24/cupsize/cupsize-espresso-ol'\n\nconst cupSizeLookup = {\n    ristretto: '24/cupsize/cupsize-ristretto-ol',\n    espresso: '24/cupsize/cupsize-espresso-ol',\n    lungo: '24/cupsize/cupsize-lungo-ol',\n    'lungo-plus': '24/cupsize/cupsize-lungo-plus-ol',\n    'ristretto-vertuo': '24/cupsize/cupsize-ristretto-vl',\n    'espresso-vertuo': '24/cupsize/cupsize-espresso-vl',\n    'double-espresso-vertuo': '24/cupsize/cupsize-lungo-vl',\n    'lungo-vertuo': '24/cupsize/cupsize-lungo-vl',\n    'gran-lungo': '24/cupsize/cupsize-gran-lungo-vl',\n    coffee: '24/cupsize/cupsize-mug-small-vl',\n    'mug-medium': '24/cupsize/cupsize-mug-medium-vl',\n    'mug-large': '24/cupsize/cupsize-mug-large-vl',\n    'paper-cup-extra-small-alt': '24/cupsize/paper-cup-extra-small-alt',\n    'paper-cup-extra-small': '24/cupsize/paper-cup-extra-small',\n    'paper-cup-large-alt': '24/cupsize/paper-cup-large-alt',\n    'paper-cup-large': '24/cupsize/paper-cup-large',\n    'paper-cup-medium-alt': '24/cupsize/paper-cup-medium-alt',\n    'paper-cup-medium': '24/cupsize/paper-cup-medium',\n    'paper-cup-small-alt': '24/cupsize/paper-cup-small-alt',\n    'paper-cup-small': '24/cupsize/paper-cup-small',\n    xl: '24/accessory/travel-mug-vl',\n    'cold-brew': '24/coffee/cold-brew',\n    'carafe-vertuo': '24/cupsize/cupsize-carafe-vl',\n    alto: '24/cupsize/cupsize-alto-vl',\n    americano: '24/cupsize/cupsize-americano-ol',\n    icedrecipe: '24/recipe/iced-coffee',\n    'icedrecipe-vertuo': '24/recipe/iced-vl',\n    milk: '24/coffeenote/milky',\n    'cappuccino-and-latte-macchiato': '24/recipe/cappuccino-ol',\n    'double-cappuccino': '24/recipe/double-cappuccino-vl',\n    reverso: '24/recipe/reverso-vl',\n    'cortado-cappuccino': '24/recipe/cortado-ol',\n    'ristretto-b2b': '',\n    'espresso-b2b': '',\n    'lungo-b2b': '',\n    'icedRecipe-b2b': ''\n}\n\n/**\n * @function\n * @description Returns the icon for a given cup size, or a default icon.\n * @param {string} cupSize\n * @param {boolean} returnDefaultIcon If true, an icon will always be returned, else `''`\n * @returns {string}\n */\nexport const getCupSizeIcon = (cupSize, returnDefaultIcon = true) => {\n    const cupSizeStr = cupSize ? cupSize.split('/')?.pop() : ''\n\n    const cupSizeKey = cupSizeStr\n        .toLowerCase()\n        .replace('capsule-cupsize-', '')\n        .replace('machine-cupsize.', '') // This seems incorrect, but is the information we currenrtly have about this cup size\n\n    return cupSizeLookup[cupSizeKey] || (returnDefaultIcon ? CUPSIZE_ICON_DEFAULT : '')\n}\n\n/**\n * @function\n * @description Returns the type of icon for a given cupsize, so to distinguish between\n * coffees for recipes or normal coffees\n * @param {string} cupSize\n * @returns {'recipe' | 'coffee'}\n */\nexport const getCupType = cupSize => {\n    const cupSizeIcon = getCupSizeIcon(cupSize)\n    if (cupSizeIcon.includes('recipe')) return 'recipe'\n    if (cupSizeIcon.includes('cupsize')) return 'coffee'\n}\n","import { getCupSizeIcon } from '@kissui/helpers/src/cupSizeIcons'\n\nconst format = category => ({\n    icon: getCupSizeIcon(category.id),\n    label: category.name,\n    size: category.name.toLowerCase(),\n    capacityLabel: category.capacityLabel,\n    category\n})\n\nexport default (cupSizes, categories) => {\n    return cupSizes.reduce((all, current) => {\n        const category = categories.find(c => c.id === current)\n        return category ? [...all, format(category)] : all\n    }, [])\n}\n","import { getFinalPrice } from '@kissui/plp/services'\nimport { isBundled } from '@kissui/helpers/src/catalog'\nimport CoffeeCategory from '../models/coffee.category'\nimport CoffeeProduct from '../models/coffee.product'\nimport MainDTO from '../../plp-core/models/MainDTO'\nimport {\n    getArabica,\n    getFairTrade,\n    getOrganicEu,\n    getProductHighlight,\n    getRainforest,\n    getSustainability,\n    getVertuoNext\n} from '@kissui/helpers/src/cremaDataHelper'\nimport getMinMaxIntensity from '../../plp-core/helpers/getMinMaxIntensity'\nimport getCupSizesDetails from '../../plp-core/helpers/getCupSizesDetails'\n\nconst getPageBuilderData = (PageBuilderData, field) =>\n    PageBuilderData.options ? PageBuilderData.options[field] : PageBuilderData[field]\n\n// AKA productService\nexport default (plpData, PageBuilderData, recommendation) => {\n    /**\n     * WIP Improve this loops\n     * adds a property to products containing the given category assigned to it\n     * The category is recognized by ID\n     * to apply a category on a given product, the category's productGroup has to contain the product\n     * this function has to clean the productGroups as well by removing the given's one to not let it display as a range in the PLP\n     */\n    const addProductAttribute = (\n        { categories, productGroups, products },\n        categoryFetcher,\n        assignHandler\n    ) => {\n        const category = categoryFetcher(categories)\n        if (!category) {\n            return\n        }\n        const categoryGroup = productGroups.find(group => category.id === group.categoryId)\n        if (!categoryGroup) {\n            return\n        }\n        categoryGroup.productIds.forEach(productId => {\n            const prod = products.find(product => product.id === productId)\n            assignHandler(prod, category)\n        })\n        const indexToRemove = productGroups.findIndex(\n            productGroup => productGroup.categoryId === categoryGroup.categoryId\n        )\n        productGroups.splice(indexToRemove, 1)\n    }\n\n    addProductAttribute(\n        plpData.data.configuration.eCommerceData,\n        getFairTrade,\n        (prod, category) => (prod.fairTrade = category.name)\n    )\n    addProductAttribute(\n        plpData.data.configuration.eCommerceData,\n        getProductHighlight,\n        prod => (prod.highlighted = true)\n    )\n    addProductAttribute(\n        plpData.data.configuration.eCommerceData,\n        getVertuoNext,\n        prod => (prod.onlyVertuoNext = true)\n    )\n    addProductAttribute(\n        plpData.data.configuration.eCommerceData,\n        getOrganicEu,\n        prod => (prod.organicEu = true)\n    )\n    addProductAttribute(\n        plpData.data.configuration.eCommerceData,\n        getRainforest,\n        prod => (prod.rainforest = true)\n    )\n    addProductAttribute(\n        plpData.data.configuration.eCommerceData,\n        getSustainability,\n        prod => (prod.sustainability = true)\n    )\n    addProductAttribute(\n        plpData.data.configuration.eCommerceData,\n        getArabica,\n        prod => (prod.arabica = true)\n    )\n\n    const { min, max } = getMinMaxIntensity(plpData.data.configuration.eCommerceData.categories)\n\n    PageBuilderData.min_intensity = min\n    PageBuilderData.max_intensity = max\n\n    plpData.data.configuration.eCommerceData.products.forEach(plpProduct => {\n        const show_sleeve_price = PageBuilderData.options\n            ? PageBuilderData.options.show_sleeve_price\n            : PageBuilderData.show_sleeve_price\n\n        const { showCapsulePrice, price_per_capsule, final_price } = getFinalPrice(\n            show_sleeve_price,\n            plpProduct,\n            isBundled\n        )\n\n        plpProduct.sort_price = show_sleeve_price ? plpProduct.price : plpProduct.price_per_capsule\n        plpProduct.show_sleeve_price = show_sleeve_price\n        plpProduct.label_sleeve = getPageBuilderData(PageBuilderData, 'label_sleeve')\n        plpProduct.label_sleeves = getPageBuilderData(PageBuilderData, 'label_sleeves')\n        plpProduct.label_capsules = getPageBuilderData(PageBuilderData, 'label_capsules')\n        plpProduct.show_sleeve = getPageBuilderData(PageBuilderData, 'show_sleeve')\n        plpProduct.capsule_price_label = getPageBuilderData(PageBuilderData, 'capsule_price_label')\n        plpProduct.capsule_price_syntax = getPageBuilderData(\n            PageBuilderData,\n            'capsule_price_syntax'\n        )\n        plpProduct.price_per_capsule = price_per_capsule\n        plpProduct.final_price = final_price\n\n        plpProduct.show_capsule_price = showCapsulePrice\n\n        if (plpProduct.cupSizes) {\n            plpProduct.cupSizesDetails = getCupSizesDetails(\n                plpProduct.cupSizes,\n                plpData.data.configuration.eCommerceData.categories\n            )\n        }\n\n        if (PageBuilderData.products && PageBuilderData.products.length) {\n            PageBuilderData.products.forEach(pbProduct => {\n                if (pbProduct.sku && pbProduct.sku === plpProduct.legacyId) {\n                    plpProduct.number_of_sleeves = pbProduct.number_of_sleeves\n                    plpProduct.number_of_capsules = pbProduct.number_of_capsules\n\n                    if (pbProduct.bundle_details) {\n                        plpProduct.bundle_details = pbProduct.bundle_details || {}\n                    }\n                }\n            })\n        }\n    })\n\n    return MainDTO(\n        plpData,\n        PageBuilderData,\n        CoffeeCategory,\n        CoffeeProduct,\n        undefined,\n        recommendation\n    )\n}\n","export const NOTES_ICON_DEFAULT = '24/coffee/coffee-aroma'\n\n/**\n * Normalize aromatic note\n * E.g. veryRoasted become roasted\n * For notes with hyphen, it's not necessary\n * E.g. nutty-and-balanced will be considered has nutty\n * @param {string} note\n * @returns {string}\n */\nconst harmonizeNoteName = _note => {\n    const sanityNote = _note.split('/')\n    let note = sanityNote.pop()\n    note = note.replace('capsule-aromatic-', '').replace('recipe-', '')\n\n    if (['peppery', 'spicy', 'peppery-note'].includes(note)) {\n        return '24/coffeenote/spicy'\n    } else if (['woody', 'wood', 'oak-wood', 'smoky-wood'].includes(note)) {\n        return '24/coffeenote/oak-wood'\n    } else if (\n        [\n            'sugar',\n            'brown-sugar-and-roasted-notes',\n            'candy-sweet',\n            'delicate-toasted-biscuit-notes'\n        ].includes(note)\n    ) {\n        return '24/coffeenote/sugar'\n    } else if (['sweet'].includes(note)) {\n        return '24/coffeenote/sweet'\n    } else if (['berry'].includes(note)) {\n        return '24/coffeenote/berry'\n    } else if (['baked-apple', 'apple', 'baked-apple-flavors'].includes(note)) {\n        return '24/coffeenote/baked-apple'\n    } else if (['bergamot'].includes(note)) {\n        return '24/coffeenote/bergamot'\n    } else if (['bitterness', 'bitter'].includes(note)) {\n        return '24/coffeenote/bitterness'\n    } else if (['blueberry'].includes(note)) {\n        return '24/coffeenote/blueberry'\n    } else if (['bread-aroma', 'bread'].includes(note)) {\n        return '24/coffeenote/bread-aroma'\n    } else if (['candied-fruit'].includes(note)) {\n        return '24/coffeenote/candied-fruit'\n    } else if (['caramel'].includes(note)) {\n        return '24/coffeenote/caramel'\n    } else if (['cereal', 'cerealFruity', 'mild-cereal', 'sweetCereal'].includes(note)) {\n        return '24/coffeenote/cereal'\n    } else if (\n        [\n            'maltedCereal',\n            'malted',\n            'toasted-cereal',\n            'malty-faintly-green-notes',\n            'maltyToasted'\n        ].includes(note)\n    ) {\n        return '24/coffeenote/malted'\n    } else if (\n        ['roastedCereal', 'veryRoasted', 'roasted', 'longRoasted', 'roastedCocoa'].includes(note)\n    ) {\n        return '24/coffeenote/roasted'\n    } else if (\n        [\n            'hintOfFruity',\n            'fruityWiney',\n            'fruity',\n            'fruity-exotic',\n            'juicy-fruity',\n            'ripe-fruits'\n        ].includes(note)\n    ) {\n        return '24/coffeenote/fruity'\n    } else if (['citric', 'lemon', 'citrus'].includes(note)) {\n        return '24/coffeenote/citrus'\n    } else if (['cocoa', 'hintsOfBitterCocoaPowderAndCereals'].includes(note)) {\n        return '24/coffeenote/cocoa'\n    } else if (['chocolate', 'dark-chocolate', 'white-chocolate'].includes(note)) {\n        return '24/coffeenote/chocolate'\n    } else if (['cardamom'].includes(note)) {\n        return '24/coffeenote/cardamom'\n    } else if (['ginger', 'cocoaGinger'].includes(note)) {\n        return '24/coffeenote/ginger'\n    } else if (['ginseng'].includes(note)) {\n        return '24/coffeenote/ginseng'\n    } else if (['nutty', 'nut', 'hazelnut', 'hazelnut-aromas'].includes(note)) {\n        return '24/coffeenote/hazelnut'\n    } else if (['refreshing-mint', 'peppermint'].includes(note)) {\n        return '24/coffeenote/peppermint'\n    } else if (['almond', 'almonds'].includes(note)) {\n        return '24/coffeenote/almonds'\n    } else if (['balance', 'balanced', 'smooth'].includes(note)) {\n        return '24/coffeenote/balance'\n    } else if (['tropical', 'exotic'].includes(note)) {\n        return '24/coffeenote/tropical'\n    } else if (['coconut'].includes(note)) {\n        return '24/coffeenote/coconut'\n    } else if (['cocktail'].includes(note)) {\n        return '24/coffeenote/cocktail'\n    } else if (['biscuity', 'biscuit', 'reminiscent-shortbread-cookies'].includes(note)) {\n        return '24/coffeenote/biscuit'\n    } else if (\n        ['whiskey', 'Whisky', 'whisky', 'alcohol', 'whiskey-flavor', 'whisky-flavour'].includes(\n            note\n        )\n    ) {\n        return '24/coffeenote/alcohol'\n    } else if (['watermelon'].includes(note)) {\n        return '24/coffeenote/watermelon'\n    } else if (['RedFruit', 'redfruit', 'red-fruit', 'strawberry'].includes(note)) {\n        return '24/coffeenote/red-fruit'\n    } else if (\n        [\n            'flowery',\n            'flower',\n            'Floral',\n            'floral',\n            'floralJasmine',\n            'floralandWild',\n            'orange-blossom'\n        ].includes(note)\n    ) {\n        return '24/coffeenote/flowery'\n    } else if (['herbal', 'dry-vegetal'].includes(note)) {\n        return '24/coffeenote/herbal'\n    } else if (['honey'].includes(note)) {\n        return '24/coffeenote/honey'\n    } else if (['smooth-b2b'].includes(note)) {\n        return '24/coffeenote/roasted'\n    } else if (\n        ['sweetnotes-b2b', 'toffeenotes-b2b', 'caramellynotes-b2b', 'caramelized'].includes(note)\n    ) {\n        return '24/coffeenote/caramel'\n    } else if (\n        [\n            'rich-b2b',\n            'veryRoasted',\n            'intense',\n            'intense-selection',\n            'rich',\n            'intense-roasted',\n            'bold-roasted-notes'\n        ].includes(note)\n    ) {\n        return '24/coffeenote/intense-roasted'\n    } else if (['leather'].includes(note)) {\n        return '24/coffeenote/leather'\n    } else if (['powerful-intense', 'powerful'].includes(note)) {\n        return '24/coffeenote/powerful-intense'\n    } else if (['milky', 'milk', 'milk-selection'].includes(note)) {\n        return '24/coffeenote/milky'\n    } else if (['pumpkin', 'sweet-pumpkin'].includes(note)) {\n        return '24/coffeenote/pumpkin'\n    } else if (['vanilla', 'vanillaAlmonds', 'vanillaCardamom'].includes(note)) {\n        return '24/coffeenote/vanilla'\n    } else if (['vegetal'].includes(note)) {\n        return '24/coffeenote/vegetal'\n    } else if (['winey', 'wine'].includes(note)) {\n        return '24/coffeenote/winey'\n    } else if (['pecan-nut', 'pecan', 'praline-notes'].includes(note)) {\n        return '24/coffeenote/nut'\n    } else if (['maple-syrup', 'syrup'].includes(note)) {\n        return '24/coffeenote/syrup'\n    } else if (['amaretti'].includes(note)) {\n        return '24/coffeenote/amaretti'\n    } else if (['dry-fruits'].includes(note)) {\n        return '24/coffeenote/dry-fruits'\n    } else if (['peanut'].includes(note)) {\n        return '24/coffeenote/peanut'\n    } else if (['popcorn'].includes(note)) {\n        return '24/coffeenote/popcorn'\n    } else if (['sesame'].includes(note)) {\n        return '24/coffeenote/toasted-sesame'\n    }\n    return NOTES_ICON_DEFAULT\n}\n\nexport const getNoteIcon = note => {\n    return harmonizeNoteName(note)\n}\n","import viewportHelper from '@kissui/helpers/src/viewport.helpers'\n\n/**\n * @param {{}} [_filter]\n */\nexport default class Filter {\n    #type = ''\n    #key = ''\n    #iconFn = {}\n    #filterFn = {}\n    #title = ''\n    #values = []\n    #after = '</fieldset>'\n    #before = `<fieldset aria-labelledby=\"{key}\"><legend id=\"{key}\" aria-hidden=\"true\" class='${\n        viewportHelper.is.mobile ? 't-sm-700-sl' : 't-md-700-sl'\n    }'>{title}</legend>`\n    showalllabel = ''\n\n    constructor(_filter = {}) {\n        this.#type = _filter.type\n        this.#key = _filter.key\n        this.#iconFn = _filter.iconFn ? _filter.iconFn : null\n        this.#filterFn = _filter.filterFn ? _filter.filterFn : null\n        const title = _filter.title ? _filter.title.toLowerCase() : 'Filter'\n        this.#title = title.charAt(0).toUpperCase() + title.slice(1)\n        this.#before = _filter.before ? _filter.before : this.#before\n        this.#after = _filter.after ? _filter.after : this.#after\n        this.showalllabel = _filter.showalllabel ?? ''\n    }\n\n    set values(values) {\n        this.#values = values\n    }\n\n    set after(after) {\n        this.#after = after\n    }\n\n    get after() {\n        return this.#after\n    }\n\n    get values() {\n        return this.#values\n    }\n\n    get type() {\n        return this.#type\n    }\n\n    get filterFn() {\n        return this.#filterFn\n    }\n\n    get iconFn() {\n        return this.#iconFn\n    }\n\n    get key() {\n        return this.#key\n    }\n\n    get title() {\n        return this.#title\n    }\n\n    renderBefore() {\n        return this.#before.replace('{title}', this.#title).replaceAll('{key}', this.#key)\n    }\n\n    renderAfter() {\n        return this.#after\n    }\n\n    pushValues(value) {\n        this.#values.findIndex(x => x.value === value.value) === -1 && this.#values.push(value)\n    }\n}\n","/**\n * Filter chip type\n */\nexport default class DefaultFilterChipType {\n    #value = null\n    #label = null\n    #filterType = null\n    #filterKey = null\n    #icon = ''\n    #color = ''\n    #selected = false\n    #disabled = false\n\n    constructor({\n        value,\n        label,\n        filterType,\n        filterKey,\n        icon = '',\n        color = '',\n        selected = false,\n        disabled = false\n    }) {\n        if (!value) {\n            console.error('DefaultFilterChipType: value is required')\n            return\n        }\n        if (!label) {\n            console.error('DefaultFilterChipType: label is required')\n            return\n        }\n        if (!filterType) {\n            console.error('DefaultFilterChipType: filterType is required')\n            return\n        }\n        if (!filterKey) {\n            console.error('DefaultFilterChipType: filterKey is required')\n            return\n        }\n\n        this.#value = value\n        this.#label = label\n        this.#filterType = filterType\n        this.#filterKey = filterKey\n        this.#icon = icon\n        this.#color = color\n        this.#selected = selected\n        this.#disabled = disabled\n\n        this.productCount = null\n    }\n\n    set disabled(value) {\n        this.#disabled = !!value\n    }\n\n    get disabled() {\n        return this.productCount !== null ? this.productCount === 0 : this.#disabled\n    }\n\n    set selected(value) {\n        this.#selected = !!value\n    }\n\n    get selected() {\n        return this.#selected\n    }\n\n    get filterKey() {\n        return this.#filterKey\n    }\n\n    get filterType() {\n        return this.#filterType\n    }\n\n    get value() {\n        return Array.isArray(this.#value) ? this.#value.join(',') : this.#value\n    }\n\n    get label() {\n        return this.#label\n    }\n\n    get color() {\n        return this.#color\n    }\n\n    get icon() {\n        return this.#icon\n    }\n\n    // disabled=\"${isDisabled(e.type, v)}\"\n    render() {\n        const productCountLabel = this.productCount !== null ? ` (${this.productCount})` : ''\n\n        return `<nb-chip\n                    id=\"${this.#filterKey}-${this.#value}\"\n                    data-filter-value=\"${this.#value}\"\n                    data-filter-key=\"${this.#filterKey}\"\n                    data-filter-label=\"${this.#label}\"\n                    checked=\"${this.#selected}\"\n                    disabled=\"${this.#disabled}\"\n                    ${this.#icon ? `icon=\"${this.#icon}\"` : ''}\n                    ${this.#color ? `color=\"${this.#color}\"` : ''}\n                >${this.#label}${productCountLabel}</nb-chip>`\n    }\n}\n","import Filter from './filter'\nimport DefaultFilterChipType from './types/DefaultFilterChipType'\n\nconst getCategoryData = (categories, id) => {\n    // Restrict filter to NOT use categories containing the word \"label\"\n    const findCategory = categories?.find(\n        category => category.id === id && !category.id.includes('label')\n    )\n    return findCategory\n        ? {\n              // todo this icon should be fixed into the DTO product for all attributes\n              icon: findCategory.icon?.icon,\n              color: findCategory.cssColorCode ? findCategory.cssColorCode : null,\n              label: findCategory.name\n          }\n        : null\n}\n\nexport default (filterDefinition, categories, categoriesData) => {\n    if (!filterDefinition || !categories) {\n        console.error('CREATE_FILTER_DEFINITION_CATEGORY_NOT_FOUND')\n        return []\n    }\n\n    const filters = filterDefinition.map(filter => new Filter(filter))\n    categories\n        .reduce((acc, category) => acc.concat(category.products), [])\n        .forEach(product => {\n            filters.forEach(filter => {\n                const filterKey = filter.key\n                const filterType = filter.type\n                const fieldValue = product[filterKey]\n                typeof fieldValue === 'object'\n                    ? fieldValue.map(attribute => {\n                          const data = getCategoryData(categoriesData, attribute)\n                          if (data) {\n                              filter.pushValues(\n                                  new DefaultFilterChipType({\n                                      filterKey,\n                                      filterType,\n                                      value: attribute,\n                                      icon: filter.iconFn?.(attribute),\n                                      label: data.label,\n                                      color: data.color ?? null\n                                  })\n                              )\n                          }\n                      })\n                    : filter.pushValues(\n                          new DefaultFilterChipType({\n                              filterKey,\n                              filterType,\n                              value: fieldValue,\n                              icon: filter.iconFn?.(filterKey),\n                              label:\n                                  typeof filter.filterFn === 'function'\n                                      ? filter.filterFn(fieldValue)\n                                      : fieldValue\n                          })\n                      )\n            })\n        })\n\n    return filters\n}\n","import Filter from './filter'\nimport DefaultFilterChipType from './types/DefaultFilterChipType'\nimport navigationBubbles from '../models/NavigationBubbles'\n\n// AKA Bubbles, AKA Collections\nexport default function createCategoriesFilter(\n    categories,\n    PBprops,\n    categoriesExtraData,\n    translations\n) {\n    const PBBubbles = PBprops.copywriting\n        ? PBprops.copywriting.navigation_bubbles.bubbles\n        : PBprops.navigation_bubbles.bubbles\n\n    const productGroups = categories.map(category => ({\n        categoryId: category.id\n    }))\n    const bubbles = navigationBubbles(PBBubbles, productGroups, categoriesExtraData)\n\n    const categoriesFilter = new Filter({\n        type: 'default',\n        key: 'ranges',\n        title: translations['productlistrespblock.filterlabels.collection'],\n        showalllabel: PBprops.copywriting?.filter_label_showall_collections ?? ''\n    })\n\n    bubbles.forEach(bubble => {\n        categoriesFilter.pushValues(\n            new DefaultFilterChipType({\n                value: bubble.link,\n                label: bubble.label,\n                filterType: categoriesFilter.type,\n                filterKey: categoriesFilter.key\n            })\n        )\n    })\n\n    return categoriesFilter\n}\n","/**\n * WIP - Intensity filter\n */\nimport Filter from '../../plp-core/filter/filter'\nimport DefaultFilterChipType from '../../plp-core/filter/types/DefaultFilterChipType'\nimport getMinMaxIntensity from '../../plp-core/helpers/getMinMaxIntensity'\n\n// eslint-disable-next-line no-unused-vars\nexport const getIntenistyFilter = (categories, PBprops, translations) => {\n    if (!categories) {\n        console.error('plp-coffe.filterIntensity.dto.js categories is not defined')\n        return null\n    }\n    /**\n     * @description\n     * define the filter object data\n     */\n    const intensityFilter = new Filter({\n        type: 'default',\n        key: 'intensity',\n        title: translations['productlistrespblock.filterlabels.intensity'],\n        showalllabel: PBprops.copywriting?.filter_label_showall_intensity ?? ''\n    })\n\n    const { min: intensityMin, max: intensityMax } = getMinMaxIntensity(categories)\n\n    const INTENSITY_RANGES = [\n        {\n            min: intensityMin,\n            max: 5,\n            label: PBprops.copywriting\n                ? PBprops.copywriting.filter_group_intensity_light\n                : PBprops.filter_group_intensity_light,\n            value: [1, 2, 3, 4, 5]\n        },\n        {\n            min: 6,\n            max: 8,\n            label: PBprops.copywriting\n                ? PBprops.copywriting.filter_group_intensity_medium\n                : PBprops.filter_group_intensity_medium,\n            value: [6, 7, 8]\n        },\n        {\n            min: 9,\n            max: intensityMax,\n            label: PBprops.copywriting\n                ? PBprops.copywriting.filter_group_intensity_intense\n                : PBprops.filter_group_intensity_intense,\n            value: [9, 10, 11, 12, 13, 14, 15]\n        }\n    ]\n\n    INTENSITY_RANGES.forEach(intensity => {\n        intensityFilter.pushValues(\n            new DefaultFilterChipType({\n                value: intensity.value,\n                label: intensity.label.replace('{range}', ` ${intensity.min} - ${intensity.max}`),\n                filterType: intensityFilter.type,\n                filterKey: intensityFilter.key\n            })\n        )\n    })\n\n    return intensityFilter\n}\n","import { getNoteIcon } from '@kissui/helpers/src/notesIcons'\nimport { getCupSizeIcon } from '@kissui/helpers/src/cupSizeIcons'\n\nimport createFilter from '../../plp-core/filter/createFilter'\nimport createCategoriesFilter from '../../plp-core/filter/createCategoriesFilter'\nimport { getIntenistyFilter } from './plp-coffee.filterIntensity.dto'\nimport { runningExperiment, EXPLICIT_FILTERS } from '../../plp-core/config/experiments'\n\n// AKA filtersService\nexport const getMergedFilterData = (categories, PBprops, categoriesExtraData, translations) => {\n    if (runningExperiment(EXPLICIT_FILTERS)) {\n        return [\n            ...(runningExperiment(EXPLICIT_FILTERS)\n                ? [createCategoriesFilter(categories, PBprops, categoriesExtraData, translations)]\n                : []),\n            ...createFilter(\n                [\n                    {\n                        type: 'default',\n                        key: 'cupSizes',\n                        title: translations['productlistrespblock.filterlabels.cupsize'],\n                        showalllabel: PBprops.copywriting?.filter_label_showall_cupsize ?? '',\n                        /*iconFn: value => value.match(/([^/]*)\\/*$/)[0]*/\n                        iconFn: getCupSizeIcon\n                    }\n                ],\n                categories,\n                categoriesExtraData,\n                PBprops\n            ),\n            getIntenistyFilter(categories, PBprops, translations),\n            ...createFilter(\n                [\n                    {\n                        type: 'default',\n                        key: 'flavors',\n                        title: translations['productlistrespblock.filterlabels.aromatic'],\n                        showalllabel: PBprops.copywriting?.filter_label_showall_aromatic ?? '',\n                        iconFn: getNoteIcon\n                    }\n                ],\n                categories,\n                categoriesExtraData,\n                PBprops\n            )\n        ]\n    }\n\n    return [\n        getIntenistyFilter(categories, PBprops, translations),\n        ...createFilter(\n            [\n                {\n                    type: 'default',\n                    key: 'cupSizes',\n                    title: translations['productlistrespblock.filterlabels.cupsize'],\n                    /*iconFn: value => value.match(/([^/]*)\\/*$/)[0]*/\n                    iconFn: getCupSizeIcon\n                },\n                {\n                    type: 'default',\n                    key: 'flavors',\n                    title: translations['productlistrespblock.filterlabels.aromatic'],\n                    iconFn: getNoteIcon\n                }\n            ],\n            categories,\n            categoriesExtraData,\n            PBprops\n        )\n    ]\n}\n","/**\n *\n * @param PBprops\n * @returns {[\n *              {\n *                  id: string,\n *                  checked: boolean,\n *                  label: (string|*),\n *                  key: string,\n *                  order: asc|desc\n *              }\n *          ]}\n * Note: The first element is the default sort order\n * Note: The order of the sort array is important\n *\n */\nexport const getMergedSortData = PBprops => [\n    {\n        id: 'default',\n        label:\n            PBprops.copywriting?.dropdown_recommended_option_label ||\n            PBprops.dropdown_recommended_option_label,\n        key: 'recommended',\n        order: 'asc',\n        checked: true\n    },\n    {\n        id: 'sortPriceAscending',\n        label:\n            PBprops.copywriting?.dropdown_price_ascending_option_label ||\n            PBprops.dropdown_price_ascending_option_label,\n        key: 'sort_price',\n        order: 'asc',\n        checked: false\n    },\n    {\n        id: 'sortPriceDescending',\n        label:\n            PBprops.copywriting?.dropdown_price_descending_option_label ||\n            PBprops.dropdown_price_descending_option_label,\n        key: 'sort_price',\n        order: 'desc',\n        checked: false\n    },\n    {\n        id: 'sortIntensityAscending',\n        label:\n            PBprops.copywriting?.dropdown_intensity_ascending_option_label ||\n            PBprops.dropdown_intensity_ascending_option_label,\n        key: 'intensity',\n        order: 'asc',\n        checked: false\n    },\n    {\n        id: 'sortIntensityDescending',\n        label:\n            PBprops.copywriting?.dropdown_intensity_descending_option_label ||\n            PBprops.dropdown_intensity_descending_option_label,\n        key: 'intensity',\n        order: 'desc',\n        checked: false\n    }\n]\n","import appData from './plp.data'\nimport {\n    POPIN_ID,\n    FILTER_MAIN_BLOCK_ID,\n    NAVIGATION_MAIN_BLOCK_ID,\n    PRODUCTS_LIST_MAIN_BLOCK_ID,\n    PRODUCTS_RESULTS_MAIN_BLOCK_ID,\n    CB_RESULTS_TOTAL_ID\n} from '../config/constants'\nimport { dispatchEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { EVENT_POPIN_OPEN } from '@kissui/components'\nimport { setAttributes } from '@kissui/helpers/src/utils'\n\nexport default {\n    onloadSuccess: function () {\n        const plpApp = document.getElementById(PRODUCTS_LIST_MAIN_BLOCK_ID).parentElement\n        plpApp.setAttribute('data-loaded', appData.sessionId)\n    },\n    /**\n     * State: list of products\n     */\n    readyForPlay: function () {\n        const filter = document.getElementById(FILTER_MAIN_BLOCK_ID)\n        const navigation = document.getElementById(NAVIGATION_MAIN_BLOCK_ID)\n        const productList = document.getElementById(PRODUCTS_LIST_MAIN_BLOCK_ID)\n        const productsResults = document.getElementById(PRODUCTS_RESULTS_MAIN_BLOCK_ID)\n\n        filter.setAttribute('data-request', appData.sessionId)\n        filter.setAttribute('data-filter-counter', appData.filtersSelectedCount())\n        navigation.setAttribute('data-request', appData.sessionId)\n        productList.setAttribute('data-request', appData.sessionId)\n\n        filter.style.display = 'block'\n\n        navigation.style.display = 'block'\n\n        productList.style.display = 'block'\n\n        productsResults.style.display = 'none'\n\n        if (appData.get('hide_sort_and_filter')) {\n            filter.classList.add('hide-sort-and-filter')\n        }\n\n        document.getElementById(PRODUCTS_RESULTS_MAIN_BLOCK_ID).style.display = 'none'\n    },\n    /**\n     * State: list of products filtered\n     */\n    readyForShowResults: function () {\n        const filter = document.getElementById(FILTER_MAIN_BLOCK_ID)\n        const navigation = document.getElementById(NAVIGATION_MAIN_BLOCK_ID)\n        const productList = document.getElementById(PRODUCTS_LIST_MAIN_BLOCK_ID)\n        const productsResults = document.getElementById(PRODUCTS_RESULTS_MAIN_BLOCK_ID)\n        const cbResultsTotalText = document.getElementById(CB_RESULTS_TOTAL_ID)\n\n        filter.style.display = 'block'\n        filter.setAttribute('data-request', appData.sessionId)\n        filter.setAttribute('data-filter-counter', appData.filtersSelectedCount())\n\n        if (navigation) navigation.style.display = 'none'\n\n        if (productList) productList.style.display = 'none'\n\n        if (productsResults) {\n            productsResults.setAttribute('data-request', appData.filtersSelectedSerialized())\n            productsResults.style.display = 'block'\n        }\n        if (cbResultsTotalText) {\n            cbResultsTotalText.textContent = appData.productsFilteredCount()\n        }\n    },\n    /**\n     * State: filter popin opened\n     */\n    readyForFilter: function () {\n        // check if the popin is in the page\n        let plpFilterPopin = document\n            .getElementsByClassName('plp-app')[0]\n            ?.querySelector(`#${POPIN_ID}`)\n\n        if (!plpFilterPopin) {\n            // todo test performance of this & new Popin()\n            plpFilterPopin = setAttributes(\n                document.createElement('nb-popin', {\n                    is: customElements.get('Popin')\n                }),\n                {\n                    'data-request': appData.sessionId,\n                    id: POPIN_ID,\n                    popin_id: POPIN_ID,\n                    variation: 'before',\n                    bgcolor: 'white',\n                    heading: appData.translations['productlistrespblock.filter.label'],\n                    label_close: 'close',\n                    content:\n                        '<plp-filter-popin class=\"plp-filter-popin-content\"></plp-filter-popin>'\n                }\n            )\n            document.getElementsByClassName('plp-app')[0]?.appendChild(plpFilterPopin)\n            // todo wrong way to open the popin\n            dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: POPIN_ID } })\n        } else {\n            // todo wrong way to open the popin\n            plpFilterPopin.querySelector('plp-filter-popin').setAttribute('data-refresh', 'true')\n            dispatchEvent({ eventName: EVENT_POPIN_OPEN, args: { id: POPIN_ID } })\n        }\n    },\n    /**\n     * State: shows the error\n     */\n    showError: function (e) {\n        const errorMessage = e.detail.err || 'Error'\n        console.error(errorMessage)\n    }\n}\n","import PLPApp from '../plp-core/plp.app'\nimport { getMergedPLPData, getMergedFilterData, getMergedSortData } from './dataTransform'\nimport appStates from '../plp-core/store/plp.states'\n\nclass PLPCoffee extends PLPApp {\n    constructor() {\n        super()\n        // change for coffee-B2B to see b2b plp\n        this.plpType = 'coffee'\n\n        this.dataTransformService = getMergedPLPData\n        this.dataFiltersService = getMergedFilterData\n        this.dataSortService = getMergedSortData\n        this.appStates = appStates\n    }\n}\n\ncustomElements.get('nb-plp') || customElements.define('nb-plp', PLPCoffee)\n\nexport default PLPCoffee\n"],"names":["createProps","attributes","data","find","attribute","nodeName","getData","props","filter","reduce","all","attr","nodeValue","isNil","JSON","parse","error","console","log","obj","CardLabels","HTMLElement","constructor","super","this","labels","connectedCallback","render","direction","classList","add","length","innerHTML","renderLabels","map","label","name","bgColor","color","join","customElements","get","define","BREAKPOINT_TABLET","BREAKPOINT_M","EVENT_POPIN_OPEN","EVENT_POPIN_CLOSE","EVENT_POPIN_CLOSED","EVENT_POPIN_KEY_DOWN","EVENT_SLIDER_READY","EVENT_SORT_BY_CHANGE","EVENT_SWIPED_DOWN","COFFEE_VERTUO","CONTRAST_LIGHT","NespressoElement","template","_createProps","onStart","loadTemplate","onReady","forceAttributes","force","_diff","elem","_getNodeType","node","nodeType","tagName","toLowerCase","_getNodeContent","childNodes","textContent","domNodes","Array","prototype","slice","call","templateNodes","count","parentNode","removeChild","forEach","index","appendChild","cloneNode","replaceChild","templateContent","fragment","document","createDocumentFragment","templateHTML","str","DOMParser","parseFromString","body","disconnectedCallback","onDestroy","helper","is","innerWidth","vw","devicePixelRatio","window","mobile","mobile_tablet","tablet","desktop","retina","lt","ref","parseHTML","tmp","implementation","createHTMLDocument","makeId","result","characters","i","charAt","Math","floor","random","removeEmptyValues","findText","key","value","text","includes","getHashLink","link","linkHash","linkNoHash","indexOf","replace","lazyLoad","url","inViewPort","setAttribute","cb","img","Image","src","onload","onerror","Error","test","navigator","userAgent","agent","start","Number","substr","lazyBackgroundObserver","IntersectionObserver","entries","entry","isIntersecting","unobserve","target","observe","isOldIOS","interpolate","txt","vars","stChr","enChr","curIdx","stIdx","enIdx","hashId","substring","stringifyForAttribute","escapeHtml","stringify","m","sanitizeString","toString","setAttributes","element","attrs","VARIATION_PLP","VARIATION_PDP","isPdp","variation","renderHeading","name_custom","finalName","headingLevel","getHeadingLevel","push","viewportHelper","renderLink","a11y_product_card","a11yProductName","renderHeadline","headline","is_headline_hidden","renderLabelTechnology","label_technology","renderLabelRange","label_range","ECAPI_TYPE_CAPSULE","ECAPI_TYPE_MACHINE","ECAPI_TYPE_ACCESSORY","ECAPI_TYPE_GIFT_CARD","TECHNOLOGY_CATEGORY_IDENTIFIER","getProduct","sku","napi","catalog","trimSku","getTechnologyName","productData","techno","technologies","isMultipleOf","quantity","multiple","getSleeveNumber","product","getTechnologyNameFn","sales_multiple","unitQuantity","NaN","isBundled","salesMultiple","isSalesMultipleGreaterThanOne","isUnitQuantityEqualToOne","isSalesMultipleEqualToOne","isUnitQuantityGreaterThanOne","getFormattedPrice","async","price","priceFormatter","priceFormat","getPriceFormatter","currency","config","padl","namespace","dataLayer","app","html","short","getStrikethroughPriceElement","component","querySelector","renderStrikethroughPrice","strikethrough_price","strikethroughPrice","fetchStrikethroughPrice","then","payload","catch","e","style","display","renderPrice","hidePrice","giftcard_price","price_per_capsule","show_sleeve_price","type","finalPrice","getDataLayer","padlNamespace","getMarketCode","market","toLocaleLowerCase","getLangCode","page","pageInfo","language","isLoggedIn","user","renderAddToCart","activeLongSku","activeSku","category_name","contact_cta","longSku","position","rendererName","show_view_details","view_details_label","disableTracking","buttonSize","getButtonSize","cta_url","cta_label","contact_cta_text","contact_url_anchor","is_b2b","isArray","some","tech","checkForB2B","skuProp","activeLongSkuProp","disableTrackingProp","getComputedProps","b2bLoggedIn","remainingCases","b2bNotLoggedIn","LABEL_CATEGORY_NAME","LABEL_CATEGORY_NAME_MACHINE","FAIR_TRADE_CATEGORY_NAME","VERTUO_NEXT_CATEGORY_NAME","ORGANIC_EU_CATEGORY_NAME","RAINFOREST_CATEGORY_NAME","SUSTAINABILITY_CATEGORY_NAME","ARABICA_CATEGORY_NAME","PRODUCT_HIGHLIGHT_CATEGORY_NAME","COMMON_URL","ORGANIC_LOGO_IMG_EU","ORGANIC_LOGO_IMG_US","ORGANIC_LOGO_IMG_CA","ORGANIC_LOGO_IMG_BR","ORGANIC_LOGO_IMG_JP","ORGANIC_LOGO_IMG_BE","VERTUONEXT_LOGO_IMG","RAINFOREST_LOGO_IMG","SUSTAINABILITY_LOGO_IMG","Q_CERTIFICATION_ARABICA_LOGO_IMG","DESIGN_AWARD_2021_IMG","LOGO_IMG_MAP","fair_trade","is_organic","organicLogoImg","getOrganicLogo","only_vertuo_next","is_q_certified_arabica","is_rainforest","is_sustainable","is_design_award_2021","getVertuoNext","categories","category","getCategoryRegEx","id","isVertuoNext","getOrganicEu","isOrganicEu","getRainforest","isRainforest","getSustainability","isSustainability","getArabica","isArabica","getLabels","isLabel","getProductHighlight","isProductHighlight","getFairTrade","isFairTrade","categoryIdTail","RegExp","isCategoryHidden","categoryId","hideCategory","PLP_HIDE_CATEGORIES","findIndex","c","PLP_ONLY_SHOW_CATEGORIES","getFinalPrice","showCapsulePrice","final_price","bundled","round","getMaxIntensity","INTENSITY_MAX_OL","apiOverride","pageBuilderData","images","description","api_override","image","icon","main","getMergedProductData","pageBuilderProductProps","pageBuilderProps","options","variant","additional_message","additional_message_icon","additional_message_link","internationalId","unit_quantity","rangeData","rawPrice","image_alt_text","highlighted","dataTransformObjectProductType","getMergedProductCoffeeData","bundle_details","isBundledResult","option","intensity","capsuleProperties","max_intensity","show_capsule_price","getMergedProductMachineData","ratingsAndReviews","ratings","colors","max_colors","show_ratings","minimum_rating","getMergedProductAccessoryData","getMergedProductGiftCardData","_","default_image","VARIATION_CROSS_SELL","getCapsuleFeatures","acidity","bitterness","roastLevel","roast","getSkuQuickViewProp","popinId","skuData","componentType","mergedProductData","getMergedProductDataForComponentType","addToCartProps","getAddToCartProperties","isVariationOnPLP","getPlpQuickViewProps","getCrossSellQuickViewProps","matchedProduct","products","productPageBuilder","legacyId","getAddToCartProps","commonProps","label_capsules","capsule_price_label","capsule_price_syntax","show_sleeve","sleeve_syntax","number_of_sleeves","label_sleeves","label_sleeve","popin","popin_id","close","quick_view_plp","footer","intensity_label","a11y_intensity_max","cup_sizes","items","cupSizesDetails","aromatic_profile","capsuleProductAromatics","levels","pricing","add_to_cart","showSleeve","campaign","copywriting","sku_quick_view","pdpURLs","dispatchEvent","eventName","args","event","CustomEvent","detail","bubbles","Event","createEvent","initEvent","readEvent","emitCustomEvent","customEvent","cancelable","composed","eventsHelper","eventListeners","eventListener","addEventListener","listener","remove","removeEventListener","raisedByPB","raisedByWC","eventData","gtmDataObject","undefined","event_GA4","eventRaisedBy","eventCategory","eventAction","eventLabel","nonInteraction","event_raised_by","trackComponentInteraction","creative","actionType","internationalName","productType","technology","component_name","action_type","item_id_event","item_name_event","item_category_event","item_technology_event","item_range_event","item_price_event","viewPromotion","ecommerce","Object","keys","ecommerceData","promotion_id","promotion_name","creative_slot","creative_name","handlePromoClick","cta_name","cleanedData","selectPromotion","getProductInfo","getProductPayload","actionField","unitPrice","inStock","item","split","pop","dimension44","dimension53","dimension54","dimension55","dimension56","dimension57","dimension192","brand","productImpression","list","p","productInfo","productPayload","currencyCode","impressions","productClick","click","filterActionEvent","filterType","filterValues","clickLocation","dataType","getExplicitFilterEventData","NEXT_V1_PLP_EXPLICIT_FILTER_TRACKING","experiment_action","filter_type","filter_values","click_location","Sku","isQuickViewPlp","boundOnPDPLinkClick","onPDPLinkClick","bind","boundOnQuickViewOpen","onQuickViewOpen","clickMethod","setCardTheme","assign","getSleevePrice","checkHiddenPriceForLoggedInUser","show_view","renderVisual","renderHeader","renderInformation","renderQuickView","renderPricing","renderAction","renderFooter","bindEvent","renderHeaderDefault","renderLogos","alt_fair_trade","alt_organic","alt_vertuo_next","alt_rainforest","alt_sustainable","alt_q_certification_arabica","logos","renderVisualDefault","theme","hasAttribute","renderImage","renderClass","linkHref","trim","sleevePrice","hasPricePerSleeve","renderInformationDefault","quick_view","tracking_list","tracking_position","campaign_creative","colorsSkusList","renderPricingDefault","isPortrait","renderActionDefault","actionSlot","outerHTML","renderFooterDefault","renderAdditionalMessage","additionalMessageFinal","renderIcon","size","seo_label","productIndex","getAttribute","renderSkuQuickView","quickViewElement","handleVariation","zi","handlePLPVariation","createElement","heading","Ds","handleCrossSellVariation","more_info","newQuickViewElement","getSkuQuickViewData","preventDefault","unbindEvent","showQuickView","quickViewTextExists","quick_view_text","querySelectorAll","addStopPropagationEvent","removeStopPropagationEvent","selector","stopPropagationHandler","stopPropagation","bundlePopinIDPrefix","label_close","bundlePopinContent","renderPopinBundleDetail","bundlePopinID","getElementById","hasOwn","hasOwnProperty","classNames","classes","arguments","arg","appendClass","parseValue","apply","newClass","module","exports","default","o","n","t","f","l","s","u","a","__k","__","__b","__e","__d","__c","__h","__v","__source","__self","defaultProps","r","vnode","CompatibilityButton","class","className","onClick","textCentered","maintainElementFocus","_jsx","cn","styles","button","buttonFocus","children","inner","_jsxs","contents","chevron","fetchAndParse","response","fetch","ok","fetchHtml","parser","parseHtml","mainTag","from","child","contains","Context","createContext","setFooter","ModalDrawer","title","closeIconAltText","isOpen","maxHeightMobile","onClose","dialogRef","useRef","isClosing","setIsClosing","useState","useEffect","current","versionMatch","match","isOlderThan153","parseFloat","isOldSafari","dialogPolyfill","import","registerDialog","onDialogClick","showModal","open","hideModal","parentContext","useMemo","container","article","Provider","header","closeButton","autoFocus","content","Footer","useContext","CompatibilityModal","modalSettings","compatibilityUrl","modalTitle","loadingLabel","loadingLabelError","errorLoadingLabel","closeButtonLabel","setData","status","fetchData","Loaded","Pending","stateLoaded","dangerouslySetInnerHTML","__html","statePending","stateError","getChildContext","context","_vdom","_props","d","slot","h","_vdomComponent","_root","toUpperCase","_listener","func","observedAttributes","Reflect","construct","shadow","attachShadow","mode","create","attributeChangedCallback","propTypes","defineProperty","set","displayName","asWebComponent","productStringified","compatibility","compatibilityStringified","modalState","setModalState","compatibilityDataParsed","handleCompatibilityClick","toggleCompatibilityModal","compatibilityButtonLabel","compatibility_card_button_text","compatibility_modal_url","compatibility_modal_title","compatibility_modal_loading_text","compatibility_modal_loading_text_error","compatibility_modal_close_button_ally","isPDP","_Fragment","getDecaffeinatoRegExp","label_decaffeinato","hasDecaffeinato","renderHeadingSku","renderShowSleeve","getSleeveLabel","number_of_capsules","getQuantity","sleeveNumber","numberOfSleeves","sleeveLabel","perSleeveLabel","boundHandleBundleOpen","handleBundleOpen","bundlePopinLink","quickViewLabel","renderSkuQuickViewLink","renderIntensity","maxIntensity","renderCompatibility","renderBundlePopinLink","range","popin_link_text","other_skus","other_skus_quantity","popin_label_close","renderBoxTube","packaging","show_packaging","packaging_list","a11y_packaging_label","selected","ranges","simplifyRangeIds","capsuleHasMachineCompatibilityIssue","dataset","renderPackFormat","pack_format","pricePerCapsule","renderCapsulePrice","bundlePopIn","bgcolor","padding","openBundlePopin","Intensity","parseInt","isNaN","a11yIntensityMax","renderIntensityMin","renderIntensityMax","max","min_intensity","fill","min","bus","_bus","register","callback","fire","EventBus$1","Cta","boundHandleClick","handleClick","aria_label","aria_label_after","aria_label_before","contrast","icon_left","icon_right","label_update","link_new_tab","long_sku","transparent","ariaLabel","textClass","removeListeners","addListeners","track","event_id","qs_id","EventBus","openQuantitySelector","campaign_id","campaign_name","campaign_position","campaign_instance_index","tracking_slot_prefix","sku_data","ctaOrPopin","slotContent","instanceIndex","cta_name_value","tabbed_component","componentName","setTimeout","LAZYLOAD_CUSTOM","PROFILES","sizes","Img","__privateAdd","_initLazyLoad","_setImPolicyQuery","_getRetinaWidth","_getImpolicyProfile","_getClosests","_setCssProperties","_setCssProperty","__privateMethod","initLazyLoad_fn","file","lazyload","fetchpriority","setImPolicyQuery_fn","setCssProperties_fn","parentClass","firstElementChild","WeakSet","#initLazyLoad","#setImPolicyQuery","aspect_ratio","force_width","force_height","impolicy","width","offsetWidth","w","finalWidth","getRetinaWidth_fn","getImpolicyProfile_fn","#getRetinaWidth","#getImpolicyProfile","exactFound","closests","getClosests_fn","tempDiff","diff","closest","#getClosests","every","profile","found","el","#setCssProperties","object_fit","placeholder_color_light","placeholder_color_dark","error_message","setCssProperty_fn","#setCssProperty","setProperty","Link","setClassHelper","bindEvents","image_alt","renderButton","tracking_label","a11y_label_new_tab","phantom","cta_link_type","sizeClass","sku_colors","quickView","linkOrPopin","unbindEvents","Viewport","observer","IntersectionObserverEntry","onChange","threshold","rootMargin","Element","observables","observable","requestIdleCallback","runTrack","zoneTracking","tracking","ZoneTracking","destroy","getIom","hasIntersectionObserver","isObjectEmpty","Container","initTracking","initLazyLoad","getBgImgUrl","lazy_load","background_mobile","background_tablet","background_desktop","background_retina","background_color","classname","element_class","contrastDefault","hasBgImage","renderBg","Chip","checkbox","computedSlot","computeSlot","onclick","background_image","filter_label_AA","rounded","checked","disabled","checkedAttr","disabledAttr","inputId","hash","charCodeAt","makeHash","getElementsByTagName","newValue","recursiveSwitchAriaHidden","componentOpenState","parent","brothers","brother","removeAttribute","focusin","loop","lastFocused","firstFocusable","lastFocusable","focus","setFirstAndLastFocusable","focusable","Dropdown","buttonElement","onClickOutside","aa_description","element_id","element_name","renderSelected","renderOptions","buttonElementValue","dropdownMenu","selectedOption","aa_listbox_description","aa_select_description","icon_option","boundHandleLabelClick","handleLabelClick","boundHandleMobileClose","handleMobileClose","boundFocus","boundFocusin","boundKeyNav","keyNav","toogleDropdown","reRender","setSelected","dispatchChange","tmpSelected","switchAriaModal","openingSource","activeElement","prevOption","nextOption","firstOption","lastOption","prevSibling","previousElementSibling","nextSibling","nextElementSibling","ProductTracking","noImpression","getPLPCategory","getPLPData","configuration","eCommerceData","getCategoriesWithPlpData","cupSizes","flavors","Promise","categoryData","isTechnologyCategory","getCategories","supercategories","superCategory","getCategory","code","buildGTMProductObject","capitalize","dimension130","productSelections","impressionsOnScrollData","dimension43","AddToCart","elementID","addToCartCounter","isWindowNapiActive","getConfig","pushButton","ui","productId","activated","resolve","productTracking","getProductData","getSkuKey","plpData","allKeys","currentKeyIndex","__publicField","_AddToCart","SLIDER_CHIPS_ID","PlpStickyBar","boundReinitSlider","reinitSlider","boundLinkClick","linkClick","dropdownButtons","navigation","navigation_bubbles","renderLinksSelect","renderChipsSlider","dropdown","navigationBubble","links","a11y_slider_previous_button","a11y_slider_next_button","selected_nav_link_label","forceSliderWidth","dropdownWidth","navigationBubbleWidth","initSlider","currentTarget","location","href","swipeEvents","stopEl","nwcSwipeEvents","scrollTopArray","scrollLeftArray","scrollTop","scrollLeft","memorizeStartElScrollPositions","startEl","timeDown","Date","now","touches","clientX","clientY","xDiff","yDiff","xDown","yDown","xUp","yUp","defaultVertical","innerHeight","defaultHorizontal","swipeThresholdVertical","getNearestAttribute","swipeThresholdHorizontal","swipeTimeout","timeDiff","eventType","changedTouches","abs","checkScrollCondition","dir","touchType","xStart","xEnd","yStart","yEnd","isScrollable","scrollHeight","clientHeight","scrollWidth","clientWidth","attributeName","defaultValue","documentElement","attributeValue","String","Overlay","overlay","getElementsByClassName","STATE_OPEN","SCROLL_LOCK","Popin","ariaModal","isVideo","boundOpen","boundClose","boundEscapeClose","escapeClose","oldValue","hasEvent","subheading","heading_class","checkIsVideo","parseBool","tempEl","addLock","removeLock","cancelBubble","openVideoPopin","swipeDown","swipeOverlayTogglePlayPause","boundSwipeDown","swipeOverlay","boundSwipeOverlayTogglePlayPause","CardLogos","logos_list","param","appendLogo","logo","alt","hasLogo","logosList","logoName","slidesContainer","next","prev","colours","SliderMenu$1","boundNextClick","onNextClick","boundPrevClick","onPrevClick","onLinkClick","boundTouchEnd","onTouchEnd","disableAutoScroll","_entriesBounds","_element","_slides","_options","last_known_scroll_position","ticking","navBarTravelDirection","navBarTravelling","navBarTravelDistance","scrollAmount","buildIHM","setOverflowAttribute","initializeIndicatorPosition","_container","_pnIndicator","_containerSlidesContent","hasContainer","constants","wrapItems","insertBefore","createIndicator","randId","tag","div","elements","pnAdvancerLeft","pnAdvancerRight","goToElement","goToSlide","showContent","contentId","deselectAllLinkBut","distance","boundingClientRect","scroll","left","behavior","sideScroll","speed","step","slideTimer","setInterval","clearInterval","moveIndicator","determineOverflow","containerMetrics","getBoundingClientRect","containerMetricsRight","right","containerMetricsLeft","contentMetrics","contentMetricsRight","contentMetricsLeft","textPosition","transform","link_plp_category_padding_x","backgroundColor","onResize","clearListeners","kill","intersection","disconnect","root","isInViewport","entryBound","SliderMenu","randomId","sliderMenu","boundOnResize","onLoad","debouncedOnResize","debounce","time","timer","clearTimeout","loadSwiper","SliderMenuLib","li","firstChild","itemTypes","itemDisplay","rootElement","slider","onNavigationClick","SliderNatural","_waitForSliderToBeSized","_set","_getOption","_setProperties","_render","_renderButtons","_renderButton","_renderNav","_renderBullet","_renderCounter","_renderGradients","_renderSafariFix","_calculateItemsPerSlide","_getSliderPositions","_setCss","_setCssSlideWidth","_setCssSlideMinHeight","_setCssSliderGap","_setCssFlexAuto","_setCssPlaceholder","_setCssItemsPerSlide","_applyCenteredLayout","_updateStates","_updateStatesScroll","_setActiveButtons","_setActiveBullet","_setCounter","_setActiveSlides","_gotoDefaultPosition","_onScroll","_getOpacityParams","_setOpacity","_switchBullets","_onPrevClick","_onNextClick","_onNavClick","_dispatchReady","_bindEvent","_unbindEvent","defaultPosition","displayButtons","displayNav","displayCounter","displayGradients","itemsPerSlide","overflow","overflowOpacity","flexAuto","onPrevClick_fn","onNextClick_fn","boundNavClick","onNavClick_fn","boundScroll","onScroll_fn","render_fn","testId","setProperties_fn","loops","waitForSliderToBeSized_fn","dispatchReady_fn","finally","wait","slidesElements","itemNumber","set_fn","item_width","items_per_slide","calculateItemsPerSlide_fn","setCssSlideWidth_fn","setCssItemsPerSlide_fn","setCssFlexAuto_fn","maxSlides","renderButtons_fn","renderNav_fn","renderCounter_fn","renderGradients_fn","applyCenteredLayout_fn","getSliderPositions_fn","getOpacityParams_fn","setOpacity_fn","updateStates_fn","bindEvent_fn","gotoDefaultPosition_fn","renderSafariFix_fn","updateSlider","instantly","currentIndex","carousel","scrollTo","sliderPositions","unbindEvent_fn","#waitForSliderToBeSized","reject","#set","normalisedValue","getOption_fn","convertToCamelCase","arr","low","k","#getOption","#setProperties","a11y_labels","wrapper","property","buttonsContrast","getOppositeContrast","setCssSlideMinHeight_fn","setCssSliderGap_fn","setCssPlaceholder_fn","#render","#renderButtons","prevButton","nextButton","renderButton_fn","#renderButton","pos","renderInCounter","buttonContrast","isPrev","buttonEl","counter","prepend","append","#renderNav","nav","bullets","renderBullet_fn","navElements","#renderBullet","#renderCounter","#renderGradients","gradientsWidth","setCss_fn","gradientsColor","#renderSafariFix","isSafari","safariFix","safariFixWidth","paddingCorrection","sliderGap","#calculateItemsPerSlide","itemWidth","#getSliderPositions","maxScroll","firstItemOffsetLeft","offsetLeft","#setCss","isRem","#setCssSlideWidth","itemWidthAuto","#setCssSlideMinHeight","slideMinHeight","#setCssSliderGap","#setCssFlexAuto","#setCssPlaceholder","placeholderBackground","#setCssItemsPerSlide","#applyCenteredLayout","#updateStates","setActiveButtons_fn","setActiveBullet_fn","setCounter_fn","setActiveSlides_fn","updateStatesScroll_fn","#updateStatesScroll","#setActiveButtons","#setActiveBullet","#setCounter","#setActiveSlides","tempIndex","#gotoDefaultPosition","#onScroll","isScrolling","carouselScrollLeft","switchBullets_fn","#getOpacityParams","getComputedStyle","getPropertyValue","itemWidthAdjusted","#setOpacity","scrollX","itemX","percentage","opacityPercentage","finalOpacity","#switchBullets","alreadyScrolled","#onPrevClick","#onNextClick","#onNavClick","#dispatchReady","#bindEvent","#unbindEvent","createRefs","extract","refs","$ref","refArray","getRefArray","getImpolicy","policy","rules","STATE_DISABLED","Bubble","setState","src_retina","visual","getResponsiveImpolicy","mobileWidth","tabletWidth","desktopWidth","retinaWidth","state","a11y_scrollto","renderLabel","setTheme","IntersectionObserverService","observers","Map","has","warn","targets","delete","destroyAll","clear","Deferred","promise","scrollDuration","baseScrollDuration","deferred","scrollPosition","resolveScrollPosition","scrollPaddingTop","scrollToElement","scrollY","top","currentTime","initialTimestamp","performance","deltaScroll","resolveScrollDuration","viewportHeight","bodyHeight","finalTimestamp","requestAnimationFrame","currentTimestamp","moveStep","EVENT_NAVIGATION_SECTION_CHANGE","NB_SLIDES_STICKY","INTERSECTION_RATIOS_SECTION","SLIDER_CONFIG_DEFAULT","display_gradients","display_nav","placeholder_background","slide_min_height","slider_gap","NavigationBubbles","isMobile","scrollObserver","sticky","isSticky","isCenteredItems","is_centered_items","init","eventsListeners","bindSliderLinksEvents","geometry","getGeometry","onSliderLinkClick","$event","sectionId","finalLabel","plpListLabel","bubbleLabel","onSectionChange","updateBubbles","updateChips","createListeners","once","updateLayout","eventsManager","renderNavigation","getSliderOptions","flex_auto","gradients_color","gradients_width","slider_id","a11y_goto_slide","renderList","sliderOptions","sliderData","display_buttons","renderFunction","bubble","renderBubble","bubbleWithCampaign","renderChip","chip","bubbleId","chips","chipId","isChecked","_index","sliderChip","emit","stickyBarHeight","height","scrollOptions","preventScroll","$header","$stickyBar","headerRect","y","stickyBarRect","runningExperiments","Set","runningExperiment","experiment","EXPLICIT_FILTERS","FILTER_MAIN_BLOCK_ID","SORT_MENU_ID","POPIN_ID","NAVIGATION_MAIN_BLOCK_ID","PRODUCTS_LIST_MAIN_BLOCK_ID","PRODUCTS_RESULTS_MAIN_BLOCK_ID","CB_RESULTS_TOTAL_ID","MY_RECOMMENDATIONS_ID","QUERY_URL_PARAMETER_FILTERS","QUERY_URL_PARAMETER_SORT","appData","_productsFlat","sessionId","plpType","plpDataType","reload","initPriceFormatter","initCurrency","read","filters","productsList","getProducts","acc","concat","productsListFiltered","withSort","selectedFilters","filterPredicate","filterProductsByFilterType","doesProductMatchFilter","filterProductsByAllFilters","filteredList","sortCurrent","order","sorter","isAscending","b","createSorter","sort","sortProducts","productsFilteredCount","filtersUpdate","filterSelection","fireAll","setFilterValue","filterChipsUpdate","filtersUpdateMultiple","valueSelections","filtersSelected","filterValueIsEqual","filtersSelectedWithLabel","filterKey","filterValue","foundFilter","filterLabel","values","v","categoryTitle","filtersSelectedCount","filtersSelectedSerialized","filtersReset","filterChip","productCount","predicate","subscribe","fn","unsubscribe","fnToRemove","productPropValue","groups","groupFiltersByType","types","splice","fSelected","updateUrlVariable","variable","queryArray","path","updateQueryStringParameter","uri","re","separator","encodeURIComponent","pushState","getUrlVariable","queryString","search","URLSearchParams","decodeURIComponent","defaultTracking","getSortTracking","isSorted","sortKey","sortOrder","getFilterTracking","isFiltered","__crema_service__","pageStores","signalStore","ProductsList","signal","ProductDetails","HeaderNavigation","setPageHtml","getStore","pageHtml","getModuleData","moduleName","setModuleData","loadFromUrl","cacheOnly","batch","store","debug","statusText","parseModuleData","moduleScript","scripts","script","lines","line","trimmed","startsWith","jsonString","parseProductScript","appStates","appEvents","process","handlePostEvent","appStatesHandler","err","loadFromPage","onReload","urlObj","URL","pathname","history","simulatePageChange","_data","onloadSuccess","nextState","onloadError","showError","onMergeData","filtersService","productService","dataSortService","recommendationService","recommendationInstance","mergeData","recommendation","readyToLoadProducts","loadProducts","newData","enabledTechnologies","isSelected","at","translations","nav_links","hide_sort_and_filter","getTrackingData","mergeProductData","categoriesExtraData","mergeFilters","urlFilters","filterData","cleanFilterDataXSS","source","cleanData","sourceItem","isLast","urlSort","sortData","cleanSortDataXSS","setUrlOverrides","notCurrentTech","handleExperiments","trackLoad","switchProductsPage","readyForShowResults","readyForPlay","onMergeDataError","onFilter","grouped","replaceAll","groupSelectedFilters","groupKeys","filterTrackingFromPlpFilters","onSort","trackInteraction","onloadFilter","onloadFilterSuccess","readyForFilter","onloadFilterError","handleAppEvent","customEventName","eventFn","stateTransitionsManager","_SORT_MENU_ID","WeakMap","formatSortSeparator","componentUpdated","boundOnSortChange","onSortChange","__privateGet","sortButton","_filters","isDisabled","onStoreChanges","labelEl","getLabel","__privateSet","renderBefore","renderAfter","handleChipEvent","itemValue","CATEGORY_IDENTIFIER","a11y_see_result_number_label","getA11ySeeResultsText","see_result_number_label","see_result_number_label_one","filtersTracking","btnReset","btnResult","visibility","parentElement","see_result_number_label_zero","eventPopinClsed","bubbleElement","oldVal","newVal","updateBubbleCounter","cta_filter_label","SLIDER_NAV_LINKS_ID","renderLinksList","label_sort_by","aa_description_sort_by","aa_listbox_description_sort_by","aa_select_description_sort_by","label_close_sort_by","_formatSortValue","updateComponent","HTML","filterLinks","service","stickyService","elementHeight","stickyElementSelector","magicIndex","initialize","updateSticky","offsetElement","isReady","offsetTop","offsetHeight","paddingTop","$element","$elementHeight","$stickyElementSelector","$magicIndex","updatePosition","offset","nav_link","data_navigation_bubbles","dataTransformNavigationBubbles","customEventAction","navLinks","dataTransformNavLinks","_isSticky","getNamedItem","navigationBar","a11y_label","colorHtml","renderProduct","getSkuComponentByType","is_machine_b2b","_headerSelector","_resetSelector","shouldHideHeader","productListBkp","headerMarkup","copywritingProps","a11y_header_result_label_button","a11y_header_result_label_reset","a11y_header_result_label_results","header_result_label","header_result_label_reset","header_result_label_results","header_result_label_results_one","header_result_label_results_zero","total","filterLabels","getResultLabel","arraysAreEqual","outerhtml","hasFilters","listName","resetClick","categoryProducts","PLPApp","dataTransformService","dataFiltersService","propChanged","valueChanged","defineTemplate","enabledExperiments","info","enableExperiment","itemsPerRow","items_per_row","Category","PageBuilderData","_id","_name","_description","_products","_capacityLabel","_detailsIcon","_icon","_isLoadingProducts","_rangeLink","_subCategories","_superCategories","_url","_background_retina","_background_desktop","_background_mobile","_background_tablet","_contrast","_isSegment","capacityLabel","detailsIcon","rangeLink","subCategories","superCategories","isLoadingProducts","isProductCategory","CoffeeCategory","Product","available","maxOrderQuantity","packagingType","pushRatingEnabled","altText","CoffeeProduct","in_stock","a11y_price","shop_similar","sort_price","initializeCopywritingData","initializeOptionsData","initializeProductData","finalizeInitialization","alt_sustainability","altTexts","vertuo_next","organic","rainforest","sustainability","q_certification_arabica","getPrice","getSortPrice","initializeLogos","logosConfig","condition","onlyVertuoNext","altKey","fairTrade","organicEu","arabica","navigationLinks","enabledCremaTechnologies","VERTUO_ICON","PRO_ICON","transformCremaTechnologiesToLink","getIconByTechnology","COFFEE_ORIGINAL","hide_technologies_in_navigation","replaceCremaTechnologies","all_products_navigation_label","selectedTechnology","navLinksWithoutTechnology","navigationBubbles","productGroups","productsGroup","bubblesFilteredAndSorted","bubblesMathProductsGroup","normalizedBubble","ele","cremaCategory","cremaBubble","unshift","addLabels","highlightLabels","textColor","parsedData","parseLabels","labelGroups","group","__label","productIds","prod","labelGroup","indexToRemove","productGroup","MainDTO","colorFilterFunction","getOverridenProductGroups","applyRecommendationOverrides","getPBProperty","pbProduct","pbProductData","display_machine_range_name","applyProductsOverrides","overriddenCategories","extraData","catData","category_id","categoryObj","productID","productObj","Boolean","applyCategoryOverrides","original","vertuo","getMinMaxIntensity","intensities","flatMap","cupSizeLookup","ristretto","espresso","lungo","coffee","xl","alto","americano","icedrecipe","milk","reverso","getCupSizeIcon","cupSize","returnDefaultIcon","cupSizeKey","format","getPageBuilderData","field","getMergedPLPData","addProductAttribute","categoryFetcher","assignHandler","categoryGroup","plpProduct","getCupSizesDetails","getNoteIcon","note","_note","NOTES_ICON_DEFAULT","harmonizeNoteName","Filter","_filter","_type","_key","_iconFn","_filterFn","_title","_values","_after","_before","showalllabel","iconFn","filterFn","before","after","pushValues","x","DefaultFilterChipType","_value","_label","_filterType","_filterKey","_color","_selected","_disabled","productCountLabel","createFilter","filterDefinition","categoriesData","fieldValue","getCategoryData","findCategory","cssColorCode","createCategoriesFilter","PBprops","PBBubbles","categoriesFilter","filter_label_showall_collections","getIntenistyFilter","intensityFilter","filter_label_showall_intensity","intensityMin","intensityMax","INTENSITY_RANGES","filter_group_intensity_light","filter_group_intensity_medium","filter_group_intensity_intense","getMergedFilterData","filter_label_showall_cupsize","filter_label_showall_aromatic","getMergedSortData","dropdown_recommended_option_label","dropdown_price_ascending_option_label","dropdown_price_descending_option_label","dropdown_intensity_ascending_option_label","dropdown_intensity_descending_option_label","productList","productsResults","cbResultsTotalText","plpFilterPopin","errorMessage","PLPCoffee"],"mappings":"k8BAAA,MAEMA,EAAcC,IACVC,MAAAA,EAHMD,CAAAA,GAAcA,EAAWE,MAAKC,GAAoC,SAAvBA,EAAUC,WAGpDC,CAAQ,IAAIL,IACnBM,EAAQ,IAAIN,GACbO,QAAOJ,GAAoC,SAAvBA,EAAUC,WAC9BI,QAAO,CAACC,EAAKC,KACH,IAAKD,EAAK,CAACC,EAAKN,UAAWM,EAAKC,aACxC,CAAE,GAET,GAAIC,EAAMX,GACCK,OAAAA,EAGP,IACO,MAAA,IAAKA,KAAUO,KAAKC,MAAMb,EAAKU,WACzC,OAAQI,GACLC,QAAQC,IAAI,iBAAkBF,EAAOd,GAAMU,UAC/C,GAGEC,EAAQM,GAAoC,MAARA,ECnB1C,MAAMC,UAAmBC,YACrBC,WAAAA,GACIC,QACAC,KAAKjB,MAAQ,GACbiB,KAAKC,OAAS,EAClB,CAEAC,iBAAAA,GACIF,KAAKjB,MAAQP,EAAYwB,KAAKvB,YAC9BuB,KAAKG,QACT,CAEAA,MAAAA,GACU,MAAEF,OAAAA,EAAS,GAAIG,UAAAA,EAAY,UAAaJ,KAAKjB,MAGnD,GAFAiB,KAAKK,UAAUC,IAAI,IAAiB,QAAdF,EAAsB,gBAAkB,aAAeA,IAEvD,IAAlBH,EAAOM,OACA,MAAA,GAEXP,KAAKC,OAASA,EAEdD,KAAKQ,UAAY,GAAGR,KAAKS,gBAC7B,CAEAA,YAAAA,GACI,OAAOT,KAAKC,OACPS,KAAIC,IACK,MAAEC,KAAAA,EAAO,GAAIC,QAAAA,EAAU,GAAIC,MAAAA,EAAQ,IAAOH,EACzC,MAAA,gEAESE,GACAC,GACA,sBAAsBD,aAAmBC,4CAErCF,2CAAI,IAG3BG,KAAK,GACd,EAGJC,eAAeC,IAAI,mBAAqBD,eAAeE,OAAO,iBAAkBtB,GCxCzE,MAAMuB,EAAoB,KAEpBC,EAAe,IAgBfC,EAAmB,2BAEnBC,EAAoB,4BACpBC,EAAqB,6BAErBC,EAAuB,UAkBvBC,EAAqB,6BAMrBC,EAAuB,+BAQvBC,EAAoB,cAYpBC,EAAgB,SA4ChBC,EAAiB,QClHvB,MAAMC,UAAyBjC,YAClCC,WAAAA,WAEIE,KAAK+B,SAAW,EACpB,CAEA7B,iBAAAA,GACSnB,KAAAA,MAAQiB,KAAKgC,eAClBhC,KAAKiC,YACLjC,KAAKkC,eACLlC,KAAKmC,WACT,CAOAH,YAAAA,CAAaI,EAAkB,MAC3B,MAAM3D,EAAa2D,GAAmBpC,KAAKvB,WAIvCM,IAAAA,EACA,IACAA,EAAQ,IAAIN,GAAYQ,QAAO,CAACC,EAAKC,KAC1B,IAAKD,EAAK,CAACC,EAAKN,UAAWM,EAAKC,aACxC,CAAE,GAEL,MAAMV,EARMS,CAAAA,GAAQA,EAAKR,MAAKC,GAAoC,SAAvBA,EAAUC,WAQxCC,CAAQ,IAAIL,IAECC,OAAS,MAATA,EACfK,EAGJ,IAAKA,KAAUO,KAAKC,MAAMb,EAAKU,WACzC,OAAQI,GACLC,QAAQC,IAAIM,KAAKnB,SAAU,iBAAkBW,EACjD,CACJ,CAKAW,MAAAA,CAAOkC,GAAQ,GACPA,IAEArC,KAAKQ,UAAY,IAOrB,MAWM8B,EAAQA,CAACP,EAAUQ,KAMrB,MAAMC,EAAeC,GACK,IAAlBA,EAAKC,SACE,OAEW,IAAlBD,EAAKC,SACE,UAEJD,EAAKE,QAAQC,cAQlBC,EAAkBJ,GAChBA,EAAKK,YAAcL,EAAKK,WAAWvC,OAAS,EACrC,KAEJkC,EAAKM,YAIVC,EAAWC,MAAMC,UAAUC,MAAMC,KAAKb,EAAKO,YAC3CO,EAAgBJ,MAAMC,UAAUC,MAAMC,KAAKrB,EAASe,YAGtDQ,IAAAA,EAAQN,EAASzC,OAAS8C,EAAc9C,OAC5C,GAAI+C,EAAQ,EACR,KAAOA,EAAQ,EAAGA,IACdN,EAASA,EAASzC,OAAS+C,GAAOC,WAAWC,YACzCR,EAASA,EAASzC,OAAS+C,IAMvCD,EAAcI,SAAQ,SAAUhB,EAAMiB,GAE9B,IAACV,EAASU,GAEV,YADAnB,EAAKoB,YAAYlB,EAAKmB,WAAU,IAKpC,GAAIpB,EAAaC,KAAUD,EAAaQ,EAASU,IAE7C,YADAV,EAASU,GAAOH,WAAWM,aAAapB,EAAKmB,WAAU,GAAOZ,EAASU,IAKrEI,MAAAA,EAAkBjB,EAAgBJ,GACpCqB,GAAAA,GAAmBA,IAAoBjB,EAAgBG,EAASU,MAChEV,EAASU,GAAOX,YAAce,GAI9Bd,EAASU,GAAOZ,WAAWvC,OAAS,GAAKkC,EAAKK,WAAWvC,OAAS,EAClEyC,EAASU,GAAOlD,UAAY,OAN5BsD,CAYAd,GAAAA,EAASU,GAAOZ,WAAWvC,OAAS,GAAKkC,EAAKK,WAAWvC,OAAS,EAAG,CAC/DwD,MAAAA,EAAWC,SAASC,yBAG1B,OAFA3B,EAAMG,EAAMsB,QACZf,EAASU,GAAOC,YAAYI,EAEhC,CAGItB,EAAKK,WAAWvC,OAAS,GACzB+B,EAAMG,EAAMO,EAASU,GAbzB,CAeJ,GAAC,EAKCQ,GAjGgBC,EAiGanE,KAAK+B,UAhGrB,IAAIqC,WACAC,gBAAgBF,EAAK,aAC7BG,MAHOH,IAAAA,EAkGtB7B,EAAM4B,EAAclE,KACxB,CASAkC,YAAAA,CAAaH,EAAW,GAAIM,GAAQ,GAC3BN,KAAAA,SAAwB,KAAbA,EAAkB/B,KAAK+B,SAAW,GAAGA,IACrD/B,KAAKG,OAAOkC,EAChB,CAEAkC,oBAAAA,GACIvE,KAAKwE,aACT,EAGJxD,eAAeC,IAAI,yBACfD,eAAeE,OAAO,uBAAwBY,GC3KlD,MAoBM2C,EAfK,CACH,MAAIC,GACM,MAAEC,WAAYC,EAAIC,iBAAAA,GAAqBC,OACtC,MAAA,CACHC,OAAQH,EAAKxD,EACb4D,cAAeJ,EAAKzD,EACpB8D,OAAQL,GAAMxD,GAAgBwD,EAAKzD,EACnC+D,QAASN,GAAMzD,GAAqB0D,GAAoB,EACxDM,OAAQP,GAAMzD,GAAqB0D,EAAmB,EAE9D,EACAO,GAfQC,GACDP,OAAOH,WAAaU,GC0C5B,SAASC,EAAUnB,GACtB,MAAMoB,EAAMvB,SAASwB,eAAeC,mBAAmB,IACvDF,OAAAA,EAAIjB,KAAK9D,UAAY2D,EACdoB,EAAIjB,KAAKxB,UACpB,CAQO,SAAS4C,EAAOnF,GACfoF,IAAAA,IAAAA,EAAS,GACTC,EAAa,iEAERC,EAAI,EAAGA,EAAItF,EAAQsF,IACdD,GAAAA,EAAWE,OAAOC,KAAKC,MAFdJ,GAEoBG,KAAKE,WAEzCN,OAAAA,CACX,CAEO,SAASO,EAAkBvG,GAC9B,MAAMwG,EAAW,CACb,gEACA,kEACA,YACA,UACA,gBACA,aAGJ,IAAA,IAASC,KAAOzG,EAAK,CACX0G,MAAAA,EAAQ1G,EAAIyG,GAEdC,GAAU,MAAVA,GAAmD,KAAVA,GAKzC,GAAiB,iBAAVA,EACP,IAAA,MAAWC,KAAQH,EACXE,GAAAA,EAAME,SAASD,GAAO,QACf3G,EAAIyG,GACX,KACJ,cATGzG,EAAIyG,EAYnB,CAEOzG,OAAAA,CACX,CAiBO,SAAS6G,EAAYC,GACpBC,IAAAA,EAAWD,EACXE,EAAaF,EACjB,OACiBA,IADbA,EAAKG,QAAQ,KACAH,EAAAA,EAAKI,QAAQ,IAAK,IAE/BH,EAAW,IAAMD,EAGd,CAAEE,WAAAA,EAAYD,SAAAA,EACzB,CAEO,SAASI,EAASrE,EAAe7D,EAAmByH,EAAYU,GACnE,MAaMC,EAAaA,CAACpI,EAAmByH,KAC9BY,EAAAA,aAAarI,EAAWyH,GAE7B,MAAMa,EAAKA,IAAMzE,EAAKpC,UAAUC,IAfR,eAiBxB,GAAIyG,EAAK,CACCI,MAAAA,EAAM,IAAIC,MAShB,OARAD,EAAIE,IAAMN,EACVI,EAAIG,OAASJ,OACbC,EAAII,QAAU,KACPL,MAAAA,IACE7G,EAAAA,UAAUC,IAtBA,qBAuBT,IAAIkH,MAAM,SAAST,qBAAsB,EAIvD,CAEGG,KAGP,GAAI,iBAAiBO,KAAK3C,OAAO4C,UAAUC,aA7BnCC,EAAQ9C,OAAO4C,UAAUC,UACzBE,EAAQD,EAAMhB,QAAQ,QACrBgB,EAAMhB,QAAQ,WAAY,GAAMgB,EAAMhB,QAAQ,SAAU,IAAOiB,GAAQ,GACjE/C,OAAOgD,OAAOF,EAAMG,OAAOF,EAAQ,EAAG,GAAGhB,QAAQ,IAAK,MAAQ,IA2BzEG,EAAWpI,EAAWyH,QAAK,GAEvB,yBAA0BvB,OAAQ,CAC7BzE,EAAAA,UAAUC,IAtCS,aAuCxB,IAAI0H,EAAyB,IAAIC,sBAAqB,SAAUC,GACpDzE,EAAAA,SAAQ,SAAU0E,GAClBA,EAAMC,iBACNpB,EAAWpI,EAAWyH,GACCgC,EAAAA,UAAUF,EAAMG,QAC3C,GACH,IAELN,EAAuBO,QAAQ9F,EAAI,MAEnCuE,EAAWpI,EAAWyH,GA7CbmC,IACTZ,EACAC,CA8CZ,CA6GO,SAASY,EAAYC,EAAaC,EAAiDC,EAAeC,GACrG,IAAIC,EAAS,EAEb,KAAOJ,GAAK,CACR,MAAMK,EAAQL,EAAI9B,QAAQgC,EAAOE,GACjC,IAAc,IAAVC,EACA,MAEJ,MAAMC,EAAQN,EAAI9B,QAAQiC,EAAOE,EAAQ,GACzC,IAAc,IAAVC,EACA,MAEJ,MAAMC,EAASP,EAAIQ,UAAUH,EAAQH,EAAMrI,OAAQyI,GAC/B,MAAhBL,EAAKM,IACLP,EAAMA,EAAIX,OAAO,EAAGgB,GAASJ,EAAKM,GAAUP,EAAIX,OAAOiB,EAAQH,EAAMtI,QAC5DwI,EAAAA,GAEAC,EAAAA,CAEjB,CACON,OAAAA,CACX,CAkCO,MAAMS,EAAwBA,CAACzK,EAAO,KAClC0K,EAAW9J,KAAK+J,UAAU3K,IAQxB0K,EAAc9C,IACvB,MAAM5F,EAAM,CACR,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,UAGT,OAAO4F,EAAKO,QAAQ,YAAmBnG,GAAAA,EAAI4I,IAAE,EAQ/B,IAAIlF,UAKTmF,MAAAA,EAAkB7K,GACtBA,EAIEA,EAAK8K,WAAW3C,QAAQ,KAAM,UAAUA,QAAQ,KAAM,UAHlD,GAUF4C,EAAgBA,CAACC,EAAkBC,KAC5C,IAAA,IAASvD,KAAOuD,EACZD,EAAQzC,aAAab,EAAKuD,EAAMvD,IAE7BsD,OAAAA,CAAAA,ECtYEE,EAAgB,MAChBC,EAAgB,MCEvBC,EAAQC,GAAaA,IAAcF,EAW5BG,EAAgBjL,IACnB,MAAEgI,IAAAA,EAAKnG,KAAAA,EAAO,GAAIqJ,YAAAA,EAAc,IAAOlL,EAE7C,IAAK6B,EACM,MAAA,GAGLsJ,MAAAA,EAA4B,KAAhBD,EAAqBA,EAAcrJ,EAC/C+E,EAAS,GACTwE,EAlBcC,GAAGL,UAAAA,KAAiBD,EAAMC,GAAa,KAAO,KAkB7CK,CAAgBrL,GAErC4G,OAAAA,EAAO0E,KACH,IAAIF,uBACAG,EAAe5F,GAAGK,OAAS,cAAgB,gBAI/CgC,IAAQ+C,EAAM/K,EAAMgL,WACpBpE,EAAO0E,KAzBIE,GAAGxD,IAAAA,EAAKyD,kBAAAA,EAAoB,GAAI5J,KAAAA,EAAO,GAAIqJ,YAAAA,EAAc,OACxE,MAAMQ,EAAkBD,EAAkB3D,QAAQ,gBAAiBjG,GAG5D,MAAA,YAAYmG,4BAA8B0D,kBAAgCA,MAF7C,KAAhBR,EAAqBA,EAAcrJ,OAEyD,EAqBhG2J,CAAWxL,IAEvB4G,EAAO0E,KAAK,GAAGH,KAGnBvE,EAAO0E,KAAK,KAAKF,MAEVxE,EAAO5E,KAAK,GAAE,ECtCZ2J,EAAiBA,EAAGC,SAAAA,EAAW,GAAIC,mBAAAA,GAAqB,KAC5DA,GAAsBN,EAAe5F,GAAGK,SAAY4F,EAC9C,GAGJ,kCAAkCA,QCNhCE,EAAwBA,EAAGC,iBAAAA,KAC/BA,EAIE,wCAAwCA,QAHpC,GCFFC,EAAmBA,EAAGC,YAAAA,KAC1BA,EAIE,mCAAmCA,QAH/B,GCEFC,GAAqB,UACrBC,GAAqB,UACrBC,GAAuB,YACvBC,GAAuB,WAE9BC,GAAiC,kBAU1BC,GAAaC,GAAOzG,OAAO0G,KAAKC,UAAUH,WANvCC,CAAAA,GAAOA,EAAI1E,QAAQ,mBAAoB,IAMW6E,CAAQH,IAEnE,SAASI,GAAkBC,GACxBC,MAAAA,EAASD,EAAYE,aAAa,GACxC,OAAOD,EAAO3C,UACV2C,EAAOjF,QAAQyE,IAAkCA,GAA+B9K,OAExF,CAEA,SAASwL,GAAaC,EAAUC,GAC5B,OAAOD,EAAWC,GAAa,CACnC,CAEO,SAASC,GAAgBC,EAASC,EAAsBT,IACvDQ,OAA2B,IAA3BA,EAAQE,gBAAwBN,GAAaI,EAAQE,eAvBxC,IAyBNF,EAAQE,eAzBF,GA6Bc,IAA3BF,EAAQE,gBACRD,EAAoBD,KAAavK,GACjCmK,GAAaI,EAAQE,eA9BT,GAiCLF,EAAQE,eAjCH,EAoCe,IAA3BF,EAAQE,gBAAwBN,GAAaI,EAAQG,aArCxC,IAuCNH,EAAQG,aAvCF,GA2Cc,IAA3BH,EAAQE,gBACRD,EAAoBD,KAAavK,GACjCmK,GAAaI,EAAQG,aA5CT,GA+CLH,EAAQG,aA/CH,EAkDTC,GACX,CAMO,SAASC,GAAUZ,GAEtBA,EAAYS,eAAiBT,EAAYS,gBAAkBT,EAAYa,cAEvE,MAAMC,EAAgCd,EAAYS,eAAiB,EAC7DM,EAAwD,IAA7Bf,EAAYU,aACvCM,EAA2D,IAA/BhB,EAAYS,eACxCQ,EAA+BjB,EAAYU,aAAe,EAG5DI,QAAAA,IAAiCC,KAK9BC,GAA6BC,EACxC,CAmCO,MAAMC,GAAoBC,MAAMC,IACnC,MAAMC,OAvGuBF,gBAAkBjI,OAAO0G,KAAK0B,cAuG9BC,GACvBC,ECzHuBtI,OAAOA,OAAOuI,OAAOC,KAAKC,WAAWC,UAAUC,IAAIA,IAAIL,SD2H7EH,OAAAA,EAAeS,KAChBT,EAAeS,KAAKN,EAAUJ,GAC9BC,EAAeU,MAAMP,EAAUJ,IAAU,EAAA,EE3H7CY,GAA+BC,GAC1BA,EAAUC,cAAc,iBAOtBC,GAA2BA,EAAGC,oBAAAA,GAAuBH,IACzDG,GALuBC,CAAAA,GACrBnB,GAAkBmB,GAQzBC,CAAwBF,GACnBG,MAAKC,IACI1E,MAAAA,EAAUkE,GAA6BC,GACxCnE,IAILA,EAAQlJ,UAAY4N,EAAAA,IAEvBC,OAAMC,IACK9O,QAAAA,MAAM,kDAAkD8O,KAE1D5E,MAAAA,EAAUkE,GAA6BC,GACxCnE,IAILA,EAAQ6E,MAAMC,QAAU,OAAA,IAGzB,4CAvBI,GCXFC,GAAcA,EACvBzB,MAAAA,EACA0B,UAAAA,EACAC,eAAAA,EACAC,kBAAAA,EACAC,kBAAAA,EACAC,KAAAA,MAEK,IAAC9B,IAAU2B,GAAmBD,EACxB,MAAA,GAEX,IAAIK,EAAa,KACjB,OACIA,GADCF,GAAqBD,EACTA,EAEA5B,EAEb8B,IAAS7D,KACT8D,EAAa/B,GAGV,qCAAqC+B,GAAcJ,cAAc,ECtB/DK,GAAeA,IACjBlK,OAAOA,QAAQmK,gBAAgBzB,UAG7B0B,GAAgBA,KACzB,MAAM1B,EAAYwB,KAClB,OAAKxB,EAIEA,EAAUC,IAAIA,IAAI0B,OAAOC,oBAHrB,IAAA,EAMFC,GAAcA,IACLL,KAKXA,KAAeM,KAAKA,KAAKC,SAASC,SAASJ,oBAHvC,KAeFK,GAAaA,KACtB,MAAMjC,EAAYwB,KAClB,SAAKxB,IAAcA,EAAUkC,OAItBlC,EAAUkC,KAAKD,UAAAA,ECTnB,MAAME,GAAkB5Q,IACrB,MACF6Q,cAAAA,EACAC,UAAAA,EACAC,cAAAA,EAAgB,GAChBC,YAAAA,EAAc,CAAE,EAChBrB,UAAAA,EACAsB,QAAAA,EAAU,GACVC,SAAAA,EACAC,aAAAA,EAAe,GACfC,kBAAAA,GAAoB,EACpB5E,IAAAA,EACAxE,IAAAA,EACAgD,UAAAA,EAAYH,EACZwG,mBAAAA,EAAqB,eACrBtE,aAAAA,EAAe,GACfuE,gBAAAA,GAAkB,GAClBtR,EAEEuR,EAtCYvG,CAAAA,IAClB,OAAQA,GACJ,KAAKH,EACMU,OAAAA,EAAe5F,GAAGK,OAAS,QAAU,QAChD,IVVuB,QUWZ,MAAA,QACX,QACW,MAAA,QACf,EA8BmBwL,CAAcxG,GACjC,IAAIyG,EAAUzJ,EACV0J,EAAYL,EACZM,EAAmBX,EAAYW,kBAAoB,GACnDC,EAAqBZ,EAAYY,oBAAsB,GACvDC,EA2FR,SAAqB9E,GACV7I,OAAAA,MAAM4N,QAAQ/E,IAAiBA,EAAagF,MAAKC,GAAQA,EAAKxK,SAAS,QAClF,CA7FiByK,CAAYlF,GAGnB,MAAEmF,QAAAA,EAASC,kBAAAA,EAAmBC,oBAAAA,GAnCxC,SAA0BtB,EAAWD,EAAerE,EAAKyE,EAASK,GAKvD,MAAA,CAAEY,QAJOpB,GAAatE,EAIX2F,kBAHQtB,GAAiBI,EAGNmB,oBAFTd,GAAmB,uBAGnD,CA6BgEe,CACxDvB,EACAD,EACArE,EACAyE,EACAK,GAyCA3B,OAAAA,GAAayB,GAETS,GACC7G,IAAcF,GVtGS,eUsGQE,GAC/B0F,KAMMmB,GAAU7G,IAAcF,GAAiB4F,KAzCxD,UACIwB,QAAAA,EACAC,kBAAAA,EACAZ,WAAAA,EACAR,cAAAA,EACAG,SAAAA,EACAC,aAAAA,EACAnG,UAAAA,EACAoH,oBAAAA,IAEO,MAAA,uEAEgBF,wCACIC,2CACGZ,yEAELR,yCACGG,6CACIC,uDACUnG,IAAcF,+BACtCsH,mFAItB,CAkBeE,CAAY,CACfJ,QAAAA,EACAC,kBAAAA,EACAZ,WAAAA,EACAR,cAAAA,EACAG,SAAAA,EACAC,aAAAA,EACAnG,UAAAA,EACAoH,oBAAAA,IAxBHG,SAAed,EAASC,GAEtB,MAAA,iBAAiBD,0BAAgCC,YAC5D,CAyBWa,CAAed,EAASC,IAjB3BD,EAAUG,EACVF,EAAYC,EA7CwBF,EA+CMA,EA3CvC,WA2CmBG,EA7CiB,SAASH,KAAa,sDA6CVC,cAkBpD,uDAEYQ,gCACIC,mCACGZ,yDAELR,iCACGG,qCACIC,+CACUnG,IAAcF,uBACtCsH,8CA3ELI,IAAmCf,CA2EX,EC1I9B,MCEDgB,GAAsB,0BACtBC,GAA8B,0BAE9BC,GAA2B,+BAC3BC,GAA4B,yCAC5BC,GAA2B,+BAC3BC,GAA2B,+BAC3BC,GAA+B,mCAC/BC,GAAwB,4BACxBC,GAAkC,kCAGlCC,GAAa,kEAGNC,GAAsBD,GAAa,sBACnCE,GAAsBF,GAAa,sBACnCG,GAAsBH,GAAa,sBACnCI,GAAsBJ,GAAa,sBACnCK,GAAsBL,GAAa,sBACnCM,GAAsBN,GAAa,sBAEnCO,GAAsBP,GAAa,4BACnCQ,GAAsBR,GAAa,sBACnCS,GAA0BT,GAAa,0BACvCU,GAAmCV,GAAa,oCAChDW,GAAwBX,GAAa,wBAErCY,GAAe,CACxBC,WAf0Bb,GAAa,gBAgBvCc,WAQG,WACH,IAAIC,EAAiBd,GAErB,OAAQhD,MACJ,IAAK,KACD8D,EAAiBb,GACjB,MACJ,IAAK,KACDa,EAAiBZ,GACjB,MACJ,IAAK,KACDY,EAAiBX,GACjB,MACJ,IAAK,KACDW,EAAiBV,GACjB,MACJ,IAAK,KACDU,EAAiBT,GAIlBS,OAAAA,CACX,CA9BgBC,GACZC,iBAAkBV,GAClBW,uBAAwBR,GACxBS,cAAeX,GACfY,eAAgBX,GAChBY,qBAAsBV,IA+BnB,SAASW,GAAcC,GAC1B,OAAOA,EAAW7U,MAAK8U,GAO3B,SAAsBA,GAClB,OAAOC,GAAiB/B,IAA2BlK,KAAKgM,EAASE,GACrE,CATuCC,CAAaH,IACpD,CAcO,SAASI,GAAaL,GACzB,OAAOA,EAAW7U,MAAK8U,GAO3B,SAAqBA,GACjB,OAAOC,GAAiB9B,IAA0BnK,KAAKgM,EAASE,GACpE,CATuCG,CAAYL,IACnD,CAcO,SAASM,GAAcP,GAC1B,OAAOA,EAAW7U,MAAK8U,GAO3B,SAAsBA,GAClB,OAAOC,GAAiB7B,IAA0BpK,KAAKgM,EAASE,GACpE,CATuCK,CAAaP,IACpD,CAcO,SAASQ,GAAkBT,GAC9B,OAAOA,EAAW7U,MAAK8U,GAuB3B,SAA0BA,GACtB,OAAOC,GAAiB5B,IAA8BrK,KAAKgM,EAASE,GACxE,CAzBuCO,CAAiBT,IACxD,CAMO,SAASU,GAAWX,GACvB,OAAOA,EAAW7U,MAAK8U,GAO3B,SAAmBA,GACf,OAAOC,GAAiB3B,IAAuBtK,KAAKgM,EAASE,GACjE,CATuCS,CAAUX,IACjD,CAsBO,SAASY,GAAUb,GACtB,OAAOA,EAAWxU,QAAOyU,GA8B7B,SAAiBA,GACb,OACIC,GAAiBlC,IAAqB/J,KAAKgM,EAASE,KACpDD,GAAiBjC,IAA6BhK,KAAKgM,EAASE,GAEpE,CAnCyCW,CAAQb,IACjD,CAMO,SAASc,GAAoBf,GAChC,OAAOA,EAAW7U,MAAK8U,GAiC3B,SAA4BA,GACxB,OAAOC,GAAiB1B,IAAiCvK,KAAKgM,EAASE,GAC3E,CAnCuCa,CAAmBf,IAC1D,CAKO,SAASgB,GAAajB,GACzB,OAAOA,EAAW7U,MAAK8U,GAiC3B,SAAqBA,GACjB,OAAOC,GAAiBhC,IAA0BjK,KAAKgM,EAASE,GACpE,CAnCuCe,CAAYjB,IACnD,CAMO,SAASC,GAAiBiB,GAC7B,OAAO,IAAIC,OAAOD,EAAe9N,QAAQ,MAAO,OACpD,CAqDO,SAASgO,GAAiBC,GAC7B,IAAIC,GAAe,EAEnB,OACIjQ,OAAOkQ,qBAAqBzU,QAC5BuE,OAAOkQ,oBAAoBC,WAAUC,GAAKJ,EAAWlO,QAAQsO,IAAM,KAAM,IAEzEH,GAAe,GAIfjQ,OAAOqQ,0BAA0B5U,SAEjCwU,GAAe,EACXjQ,OAAOqQ,yBAAyBF,WAAUC,GAAKJ,EAAWlO,QAAQsO,IAAM,KAAM,IAC9EH,GAAe,IAGhBA,CACX,CChEO,SAASK,GAAcvG,EAAmB1C,EAASK,GAClD6I,IACAC,EACA1G,EAFAyG,EAAmBxG,EAIjB0G,MAAAA,EAAU/I,EAAUL,GAEtBA,MAAiB,YAAjBA,EAAQ2C,MAAuByG,GAM/BF,GAAmB,EACnBC,EAAcnJ,EAAQa,QANtBsI,EAAcnJ,EAAQa,MAAQb,EAAQM,cAEtC6I,EAAcvP,KAAKyP,MAAoB,IAAdF,GAAqB,IAC9C1G,EAAoBzC,EAAQa,OAMzB,CAAEqI,iBAAAA,EAAkBC,YAAAA,EAAa1G,kBAAAA,EAC5C,CCrMO,MAAM6G,GAAkBA,EAAG3J,aAAAA,MACY4J,IAA1C5J,EAAalF,QAAQ,YlBuEO,GACA,GmBlDnB+O,GAAcA,CAAC/J,EAAagK,KACjC,IAAChK,IAAgBgK,EACjB,MAAO,GAGL,MAAEC,OAAAA,EAAQjV,KAAAA,EAAM+J,SAAAA,EAAUmL,YAAAA,GAAgBlK,GACxCmK,aAAAA,GAAiBH,EAEzB,OAAKG,EAIE,CACHC,MAAOD,EAAaC,OAASH,GAAQI,MAAQJ,GAAQ9O,KAAO8O,GAAQxL,MAAQwL,GAAQK,KACpFtV,KAAMmV,EAAanV,MAAQA,EAC3B+J,SAAUoL,EAAapL,UAAYA,EACnCmL,YAAaC,EAAaD,aAAeA,GAPlC,ICpBFK,GAAuBA,CAChChK,EACAiK,EACAC,EACApJ,EACAG,KAEM,MAAEkJ,QAAAA,GAAYD,GAEhBE,QAAAA,EAAU,CAAE,EACZtW,OAAAA,EAAS,GACT+N,oBAAAA,EACAwI,mBAAAA,EACAC,wBAAAA,EACAC,wBAAAA,EACA3G,YAAAA,GACAqG,GAA2B,CAAA,EAG/B,IAAI1X,EAAO,CACP6M,IAAKY,EAAQwK,gBACb7K,aAAcK,EAAQL,aACtBkE,QAAS7D,EAAQwH,GACjB/S,KAAMuL,EAAQvL,KACd+J,SAAUpB,EAAe4C,EAAQxB,UACjC0B,eAAgBF,EAAQM,cACxBmK,cAAezK,EAAQG,aACvBwC,KAAM3C,EAAQ2C,KACdgB,cAAe3D,EAAQ0K,WAAWjW,MAAQ,GAC1CoK,YAAamB,EAAQ0K,WAAWjW,MAAQ,GACxCoM,MAAOb,EAAQa,MAAQC,EAAeU,MAAMP,EAAUjB,EAAQa,OAAS,KACvE8J,SAAU3K,EAAQa,MAClBgB,oBAAqBA,GAAuB,GAC5CjE,UAAWH,EACXmN,eAAgB5K,EAAQvL,KACxBoV,MAAO7J,EAAQ0J,QAAQI,MAAQ9J,EAAQ0J,QAAQxL,MAAQ8B,EAAQ0J,QAAQK,KACvEM,mBAAoBA,GAAsB,GAC1CC,wBAAyBA,GAA2B,GACpDC,wBAAyBA,GAA2B,CAAE,EACtD3G,YAAaA,GAAe,CAAE,KAC3B4F,GAAYxJ,EAASiK,IAGxBnW,GAAUA,EAAOM,SACjB7B,EAAKuB,OAASA,GAGdkM,EAAQ6K,cACRtY,EAAKsY,YAAc7K,EAAQ6K,aAG/B,IAAIC,EAAiC,CAAA,EACrC,OAAI9K,EAAQ2C,OAAS7D,GACjBgM,EC/DkCC,EACtC/K,EACAiK,EACAC,EACApJ,EACAG,KAEM,MAAE+J,eAAAA,GAAmBf,GACnBE,QAAAA,GAAYD,GACZxH,kBAAAA,GAAsByH,EAExBc,EAAkB5K,GAAUL,IAE1BkJ,iBAAAA,EAAkBzG,kBAAAA,EAAmB0G,YAAAA,GAAgBF,GACzDvG,EACA1C,EACAK,IAGE6K,EAAS,CACX9B,QAAS6B,EACTE,UAAWnL,EAAQoL,mBAAmBD,WAAanL,EAAQmL,WAAa,KACxEE,cAAe/B,GAAgBtJ,GAC/ByC,kBAAmBA,EACb3B,EAAeU,MAAMP,EAAUwB,GAC/B,KACN6I,mBAAoBpC,GAGpBxG,OAAAA,IACAwI,EAAOrK,MAAQC,EAAeU,MAAMP,EAAUkI,IAG9C6B,IACAE,EAAOF,eAAiBA,GAGrBE,CAAAA,ED0B8BH,CAC7B/K,EACAiK,EACAC,EACApJ,EACAG,GAEGjB,EAAQ2C,OAAS5D,GACxB+L,EE3EmCS,EAACvL,EAASiK,EAAyBC,KACpE,MAAErI,oBAAAA,EAAqBuI,QAAAA,EAAU,CAAC,GAAMH,GACtCuB,kBAAAA,GAAsBxL,EAGxBmK,EAAU,CACZsB,QAASD,GAGb,OAAIpB,GAASsB,SACTvB,EAAQuB,OAAStB,EAAQsB,OACzBvB,EAAQzG,UAAY1D,EAAQwK,gBAC5BL,EAAQwB,WAAa,IAGzBxB,EAAQtI,oBAAsBA,GAAuB,GACrDsI,EAAQyB,aAAgB1B,GAAoBA,EAAiBC,QAAQyB,eAAiB,EACtFzB,EAAQ0B,eAAkB3B,GAAoBA,EAAiBC,QAAQ0B,gBAAmB,EAEnF1B,CAAAA,EFwD8BoB,CAC7BvL,EACAiK,EACAC,GAEGlK,EAAQ2C,OAAS3D,GACxB8L,EGjFqCgB,CAAO,EHsFrC9L,EAAQ2C,OAAS1D,KACxB6L,EIvFoCiB,EAACC,EAAG/B,KACtC,MAAEG,QAAAA,EAAU,CAAC,GAAMH,EAElB,MAAA,CACHJ,MAAOO,GAAWA,EAAQ6B,gBJmFOF,CAC7B/L,EACAiK,IAKD,IACAjK,KACAmK,KACAC,KACA7X,KACAuY,IKnGEoB,GAAuB,aACvBzO,GAAgB,MCehB0O,GAAqBA,EAC9BC,QAAAA,EAAU,KACVC,WAAAA,EAAa,KACblU,KAAAA,EAAO,KACPgT,UAAAA,EAAY,KACZmB,WAAAA,EAAa,MACa,MAAmC,CAC7DF,QAAS,CAAElS,MAAOkS,GAClBC,WAAY,CAAEnS,MAAOmS,GACrBlU,KAAM,CAAE+B,MAAO/B,GACfgT,UAAW,CAAEjR,MAAOiR,GACpBoB,MAAO,CAAErS,MAAOoS,KAyDPE,GAAsBA,CAC/BC,EACAzM,EACA0M,EACAC,KAEIC,IAAAA,EAAoBC,GAAqC7M,EAAS0M,EAASC,GAC3EG,EAAiBC,GAAuBJ,EAAeD,EAASE,GAEpE,OAAOI,GAAiBL,GAClBM,GAAqBR,EAASC,EAASE,EAAmBE,GAC1DI,GAA2BT,EAASzM,EAAS0M,EAASE,EAAmBE,EAAc,EAG3FD,GAAuCA,CACzC7M,EACA0M,EACAC,KAEA,OAAQA,GACJ,KAAKlP,GACM,MAAA,IACAiP,KACA1M,KACAmM,GAAmBnM,GAASoL,oBAEvC,KAAKc,GAAsB,CACjBiB,MAAAA,EACFT,EAAQU,UAAU5a,MACd6a,GAAsBA,EAAmBjO,MAAQY,GAASsN,YACzD,CAAA,EACT,OAAOtD,GACHhK,EACAmN,EACAT,EACAA,GAAS5L,eACT4L,GAASzL,SAEjB,CACA,QACI,MAAO,GACf,EAGS8L,GAAyBA,CAClCJ,EACAD,EACAE,KAEA,MAAMra,EAAgCya,GAAiBL,GACjDD,EACCE,EACAW,OAAAA,GAAkBhb,EAAMoa,EAAa,EAGnCY,GAAoBA,CAC7Bhb,EACAoa,KAEA,MAAMa,EAAkC,CACpCpO,IAAK7M,EAAK6M,IACVyE,QAAStR,EAAKsR,QACdF,cAAepR,EAAKoR,cACpB9C,MAAOtO,EAAKsO,OAAS,EACrBgB,oBAAqBlG,OAAOpJ,EAAKsP,qBACjCU,UAAWhQ,EAAKgQ,UAChB5C,aAAcpN,EAAKoN,cAAgB,GACnC/E,IAAKrI,EAAKqI,KAAO,IAGjBoS,OAAAA,GAAiBL,GACV,IACAa,EACH7K,KAAMpQ,EAAKoQ,KACXF,kBAAmBlQ,EAAKkQ,kBACxB6I,mBAAoB/Y,EAAK+Y,mBACzBmC,eAAgBlb,EAAKkb,eACrBC,oBAAqBnb,EAAKmb,oBAC1BC,qBAAsBpb,EAAKob,qBAC3BjL,kBAAmBnQ,EAAKmQ,kBACxBkL,YAAarb,EAAKqb,YAClBC,cAAetb,EAAKsb,cACpBC,kBAAmBvb,EAAKub,kBACxBC,cAAexb,EAAKwb,cACpBC,aAAczb,EAAKyb,aACnBrO,aAAcpN,EAAKoN,cAAgB,GACnCO,eAAgB3N,EAAK2N,eACrBuK,cAAelY,EAAK4N,aACpBiJ,QAAS7W,EAAK6W,QACdxO,IAAKrI,EAAKqI,KAAO,IAIlB4S,CAAAA,EAGEP,GAAuBA,CAChCR,EACAC,EACAE,EACAE,KAEO,CACHmB,MAAO,CACHC,SAAUzB,EACV0B,MAAOzB,GAAS0B,gBAAgBH,OAAOE,MACvCE,QAAQ,GAEZrO,QAAS,IACF4M,GAEPzB,UAAW,CACPmD,gBAAiB1B,GAAmB0B,gBACpCC,mBAAoB,0BAExBC,UAAW,IACJ9B,GAAS0B,gBAAgBI,UAC5BC,MAAO/B,GAASgC,iBAEpBC,iBAAkB,IACXjC,GAAS0B,gBAAgBO,iBAC5BF,MAAO/B,GAASkC,yBAA2BhC,GAAmBgC,yBAElEtU,KAAM,IACCoS,GAAS0B,gBAAgB9T,KAC5BM,IAAK8R,GAAS9R,KAElBiU,OAAQ,IACDnC,GAAS0B,gBAAgBS,QAEhCC,QAAS,CACLC,YAAa,IACNjC,EACHhJ,SAAU,GACVlG,UAAW,QACXhD,IAAK,GACLqJ,mBAAoB,eACpBF,aAAc,IAElBiL,WAAY,CAAC,EACb9F,iBAAkB,CAAC,GAEvB+F,SAAUvC,EAAQuC,WAIb/B,GAA6BA,CACtCT,EACAzM,EACA0M,EACAE,EACAE,KAEkC,CAC9BmB,MAAO,CACHC,SAAUzB,EACV0B,MAAOzB,GAASwC,aAAaC,gBAAgBlB,OAAOE,MACpDE,QAAQ,GAEZrO,QAAS,IACF4M,GAEPzB,UAAW,CACPmD,gBAAiB5B,GAASvC,SAASmE,gBACnCC,mBAAoB,0BAExBC,UAAW,IACJ9B,GAASwC,aAAaC,gBAAgBX,UACzCC,MAAOzO,GAAS0O,iBAEpBC,iBAAkB,IACXjC,GAASwC,aAAaC,gBAAgBR,iBACzCF,MAAOzO,GAAS4O,yBAA2BhC,GAAmBgC,yBAElEtU,KAAM,IACCoS,GAASwC,aAAaC,gBAAgB7U,KACzCM,IAAKgS,GAAmBwC,SAASrW,SAErC8V,OAAQ,IACDnC,GAAS0B,gBAAgBS,QAEhCC,QAAS,CACLC,YAAa,IACNjC,EACHhJ,SAAU,GACVlG,UAAW,QACXhD,IAAK,GACLqJ,mBAAoB,eACpBF,aAAc,IAElBiL,WAAY,CAAC,EACb9F,iBAAkB,CAAC,GAEvB+F,SAAU,CAAC,IAIbjC,GAAoBL,GAA0BA,IAAkBlP,GCzRzD4R,GAAgBA,EAAGC,UAAAA,EAAWC,KAAAA,EAAMhS,QAAAA,MAE7C,IAAKA,EACD,aAAW5E,OAAW,KAGZ,MAAA,IAAI0C,MACN,yGAHJkC,EAAU5E,MAIV,CAIJ6W,IAAAA,EACAD,EACAC,EAAQ,IAAIC,YAAYH,EAAW,CAAEI,OAAQH,EAAMI,SAAS,IAEvC,mBAAVC,MACPJ,EAAQ,IAAII,MAAMN,IAElBE,EAAQ3X,SAASgY,YAAY,SAC7BL,EAAMM,UAAUR,GAAW,GAAM,IAGzC/R,EAAQ8R,cAAcG,EAAK,EAGlBO,GAAY5N,IACrB,GAAKA,EAAEuN,OAGP,OAAOvN,EAAEuN,MAAAA,ECCAM,GAAkBA,CAACV,EAAmB/c,KAC/C,MAAM0d,EAAc,IAAIR,YAAY,eAAmBH,IAAa,CAChEI,OAAQnd,EACRod,SAAS,EACTO,YAAY,EACZC,UAAU,IAGdxX,OAAO0W,cAAcY,EAAW,EAGrBG,GAnCHjc,CAACkc,EAAkC,MAC3CA,EAAe/Y,SAAyBgZ,IAChC,GAACA,GAAkBA,EAAc/S,QAG9B+S,OAAAA,EAAc/S,QAAQgT,iBACzBD,EAAc3N,KACd2N,EAAcE,SACdF,EAAcnG,QAClB,GACH,EAyBUiG,GAtBAK,CAACJ,EAAkC,MAC9CA,EAAe/Y,SAAyBgZ,KAC/BA,IAAkBA,EAAc/S,SAGrC+S,EAAc/S,QAAQmT,oBAAoBJ,EAAc3N,KAAM2N,EAAcE,SAAQ,GACvF,ECtBCG,GAAa,eACbC,GAAa,gBA6BNX,GAAcV,IAEnBsB,IAAAA,EADGC,OAAAA,cAAgBnY,OAAOmY,eAAiB,GAG3CD,OADmBE,IAAnBxB,EAAKyB,YAA8C,IAAnBzB,EAAKyB,UACzB,CACRxB,MAAO,cACPyB,cAAeL,GACfM,cAAe,kBACfC,YAAa,QACbC,WAAY,GACZC,eAAgB,KACb9B,GAGK,CACR+B,gBAAiBX,MACdpB,GAGX5W,OAAOmY,cAAc5S,KAAK2S,GAC1Bb,GAAgB,cAAea,EAAS,EAoB/BU,GAA4BA,EACrCC,SAAAA,EAAW,GACXC,WAAAA,EAAa,GACbjH,gBAAAA,EAAkB,GAClBkH,kBAAAA,EAAoB,GACpBC,YAAAA,EAAc,GACdC,WAAAA,EAAa,GACbtK,SAAAA,EAAW,GACXqD,SAAAA,EAAW,GACXwG,YAAAA,EAAc,OAEPL,OAAAA,cAAgBnY,OAAOmY,eAAiB,GAC/C,MAAMD,EAAY,CACdrB,MAAO,qCACP8B,gBAAiBX,GACjBkB,eAAgBL,EAChBM,YAAaL,EACbM,cAAevH,EACfwH,gBAAiBN,EACjBO,oBAAqBN,EACrBO,sBAAuBN,EACvBO,iBAAkB7K,EAClB8K,iBAAkBzH,EAClBuG,cAAe,kBACfC,YAAaA,EACbC,WAAY,GAAGO,OAAiBC,OAAgBF,KAEpD/Y,OAAOmY,cAAc5S,KAAK2S,GAC1Bb,GAAgB,qCAAsCa,EAAS,EAQtDwB,GAAgB9C,IACnBC,MAAAA,EAAQ,iBACRqB,EAAY,CACdrB,MAAAA,EACA8B,gBAAiBX,GACjB2B,UAAW,CAAC,GAEhB,GAAIC,OAAOC,KAAKjD,GAAMnb,OAAQ,CACpB,MAAEoT,GAAAA,EAAK,GAAIgK,SAAAA,EAAW,GAAI/c,KAAAA,EAAO,GAAIqP,SAAAA,EAAW,IAAOyL,EAC7D,IAAIkD,EAAgB,CAChBC,aAAclL,EACdmL,eAAgBle,EAChBme,cAAe9O,EACf+O,cAAerB,GAEnBiB,EAAgB1Y,EAAkB0Y,GAClC5B,EAAUyB,UAAYG,CAC1B,CACA9Z,OAAOmY,gBAAPnY,OAAOmY,cAAkB,IACzBnY,OAAOmY,cAAc5S,KAAK2S,GAC1Bb,GAAgBR,EAAOqB,EAAS,EAGvBiC,GAAmBvD,IACtB,MAAEN,SAAAA,EAAU8D,SAAAA,GAAaxD,EAEzByD,EAAcjZ,EAAkBkV,GACtCgE,GAAgB,CAAEF,SAAAA,KAAaC,GAAa,EAQnCC,GAAkB1D,IACrBC,MACAqB,EAAY,CACdrB,MAAO,mBACPuD,SAAUxD,GAAMwD,UAAY,YAC5BzB,gBAAiBX,GACjB2B,UAAW,CAAC,GAEhB,GAAIC,OAAOC,KAAKjD,GAAMnb,OAAQ,CACpB,MAAEoT,GAAAA,EAAK,GAAIgK,SAAAA,EAAW,GAAI/c,KAAAA,EAAO,GAAIqP,SAAAA,EAAW,IAAOyL,EAC7D,IAAIkD,EAAgB,CAChBC,aAAclL,EACdmL,eAAgBle,EAChBme,cAAe9O,EACf+O,cAAerB,GAEnBiB,EAAgB1Y,EAAkB0Y,GAClC5B,EAAUyB,UAAYG,CAC1B,CAEA9Z,OAAOmY,gBAAPnY,OAAOmY,cAAkB,IACzBnY,OAAOmY,cAAc5S,KAAK2S,GAC1Bb,GArBc,mBAqBSa,EAAS,EAmBvBqC,GAAiBtS,MAAOxB,EAAK7M,KACtC,IAAIyN,EAAUzN,EACd,OAAKyN,IACDA,QAAgBb,GAAWC,IAExBY,CAAAA,EAGEmT,GAAoBA,CAAC5gB,EAAM6gB,EAAc,MAC5C,MACF1B,kBAAAA,EACAlH,gBAAAA,EACAlD,SAAAA,EACA+L,UAAAA,EACA/F,SAAAA,EACA7Y,KAAAA,EACAkL,aAAAA,EACAyJ,QAAAA,EACAkK,QAAAA,EACA3Q,KAAAA,GACApQ,EAEEqf,EAAajS,EAAapL,KAAIgf,GAAQA,EAAKC,MAAM,KAAKC,QAAO7e,KAAK,KAGjE,MAAA,CAEH,IACOwe,EACH3e,KAAMid,EACNlK,GAAIgD,EACJ3J,MAAOwS,EAEPK,YAVYpM,EAAS7Q,cAAc2D,SAAS,aAUnBiD,WACzBsW,YAAarG,EACbsG,YAAanf,EACbof,YAAavM,EACbwM,YAAalC,EACbmC,YAAa3K,EAAU,SAAW,SAClC4K,aAAcV,EAAU,WAAa,eACrChM,SAAU3E,EACVsR,MAAO,aACV,EA0DIC,GAAoBtT,MAAOkD,EAAUqQ,EAAM/U,EAAK7M,KAGzDoG,GAAAA,OAAOmY,cAAgBnY,OAAOmY,eAAiB,GACzBnY,OAAOmY,cAActe,MAAK+gB,GAAuB,eAAfA,EAAK/D,SACrB8C,WAAW5C,QAAQtC,SAAS5a,MAAK4hB,GACrEhV,EAAIhF,SAASga,EAAE5M,MAGf,OAGE6M,MAAAA,QAAoBnB,GAAe9T,EAAK7M,GACxC+hB,EAAiBnB,GAAkBkB,EAAa,CAAEF,KAAMA,EAAMrQ,SAAUA,IAExE+M,EAAY,CACdrB,MAAO,aACP2B,YAAa,qBACboD,aAJaF,EAAYpT,SAKzBgQ,cAAeN,GACf2B,UAAW,CACPkC,YAAaF,IAGrB3b,OAAOmY,cAAc5S,KAAK2S,GAC1Bb,GAAgB,aAAca,EAAS,EAG9B4D,GAAe7T,MAAOkD,EAAUqQ,EAAM/U,EAAK7M,KAGpD,GAAoB,iBAAT4hB,EAAmB,OAExBE,MAAAA,QAAoBnB,GAAe9T,EAAK7M,GACxC+hB,EAAiBnB,GAAkBkB,EAAa,CAAEvQ,SAAUA,IAC5D7C,EAAWoT,EAAYpT,SAEtB6P,OAAAA,cAAgBnY,OAAOmY,eAAiB,GAC/C,MAAMD,EAAY,CACdrB,MAAO,eACP2B,YAAa,gBACboD,aAActT,EACdgQ,cAAeN,GACf2B,UAAW,CACPoC,MAAO,CACHtB,YAAa,CACTe,KAAMA,GAEV/G,SAAUkH,KAItB3b,OAAOmY,cAAc5S,KAAK2S,GAC1Bb,GAAgB,eAAgBa,EAAS,EAetC,MAAM8D,GAAoBA,CAC7BlD,EACAmD,EACAC,EACAC,EACAC,KAGOjE,OAAAA,cAAgBnY,OAAOmY,eAAiB,GAC/C,MAAMD,EAAYmE,GACdvD,EACAmD,EACAC,EACAC,GAGGhE,OAAAA,cAAc5S,KAAK2S,GACtBlY,OAAOsc,sCAAwCF,GAC/Cpc,OAAOmY,cAAc5S,KAAK,IACnBvF,OAAOsc,qCACVC,kBAAmB,GAAGzD,OAAgBsD,IACtChC,SAAU,gBAIlB/C,GAAgB,aAAca,EAAS,EAGrCmE,GAA6BA,CAACvD,EAAYmD,EAAYC,EAAcC,KAC/D,CACHtF,MAAO,aACP8B,gBAAiBX,GACjBmB,YAAaL,EACb0D,YAAaP,KACTC,EAAe,CAAEO,cAAeP,GAAiB,MACjDC,EAAgB,CAAEO,eAAgBP,GAAkB,KC/WhE,MAAMQ,WAAY3f,EACdhC,WAAAA,WAEIE,KAAK8O,KAAO,UACZ9O,KAAK4Y,QAAU,GACf5Y,KAAK0hB,gBAAiB,EACtB1hB,KAAK2hB,oBAAsB3hB,KAAK4hB,eAAeC,KAAK7hB,MACpDA,KAAK8hB,qBAAuB9hB,KAAK+hB,gBAAgBF,KAAK7hB,MACtDA,KAAKgiB,YAAchiB,KAAK2hB,mBAC5B,CAEAzf,YAAAA,GACIlC,KAAKK,UAAUC,IAAI,UACnBN,KAAKK,UAAUC,IAAI,WAAWN,KAAK8O,QC/BfmT,GAAGlY,UAAAA,EAAW+E,KAAAA,GAAQjB,KAE1C9D,IAAcF,GACdgE,EAAU5G,aAAa,MAAO,QAI9B8C,IAAcH,GAAiBkF,IAAS7D,IAAsBX,EAAe5F,GAAGK,OAChF8I,EAAU5G,aAAa,YAAa,QAIxC4G,EAAU5G,aAAa,WAAY,OAAM,EDoBrCgb,CAAajiB,KAAKjB,MAAOiB,MAEzB0e,OAAOwD,OAAOliB,KAAKjB,MAAOiB,KAAKmiB,eAAeniB,KAAKjB,QACnD2f,OAAOwD,OAAOliB,KAAKjB,MAAOiB,KAAKoiB,gCAAgCpiB,KAAKjB,QAE9D,MAAEwb,eAAAA,EAAiB,CAAC,GAAMva,KAAKjB,MACrCiB,KAAK0hB,eAAiBnH,GAAgB8H,YAAa,EACnDriB,KAAKgiB,YAAchiB,KAAK0hB,eAClB1hB,KAAK8hB,qBACL9hB,KAAK2hB,oBAEX3hB,KAAK+B,SAAW,GAAG/B,KAAKsiB,6CACJtiB,KAAKuiB,qGAEDviB,KAAKwiB,sDACLxiB,KAAK0hB,eAAiB1hB,KAAKyiB,kBAAoB,4JAGvCziB,KAAK0iB,gGAET1iB,KAAK2iB,uFAET3iB,KAAK4iB,mDAG7B5iB,KAAKG,QACT,CAEAgC,OAAAA,GACU,MAAE0N,UAAAA,EAAWtE,IAAAA,GAAQvL,KAAKjB,MAChCiB,KAAKiH,aAAa,yBAA0B4I,GAAatE,GACzDvL,KAAK6iB,WACT,CAEAC,mBAAAA,GACW,MAAA,GE3DariB,GAAGR,OAAAA,EAAS,IAAM4N,EAAY,QACtD,IAAKA,IAAc5N,IAAWA,EAAOM,OAC1B,MAAA,GAGPsN,GAAa5N,EAAOM,QACpBsN,EAAUxN,UAAUC,IAAI,cAG5B,MAAMF,EAAYkK,EAAe5F,GAAGK,OAAS,MAAQ,SAGrD,MAAO,yBAFMoE,EAAsB,CAAElJ,OAAAA,mBAEeG,sBAAS,EF+C/CK,CAAaT,KAAKjB,MAAOiB,QGrEhB+iB,EAAChkB,EAAO8O,KACzB,MACFiF,WAAAA,EACAkQ,eAAAA,EACAjQ,WAAAA,EACAkQ,YAAAA,EACA/P,iBAAAA,EACAgQ,gBAAAA,EACA9P,cAAAA,EACA+P,eAAAA,EACA9P,eAAAA,EACA+P,gBAAAA,EACAjQ,uBAAAA,EACAkQ,4BAAAA,EACAC,MAAAA,GACAvkB,EAGA,OAAC+T,GACAC,GACAG,GACAE,GACAC,GACAF,KACS,MAATmQ,GAAiBA,EAAM/iB,OAAS,IAKrCsN,EAAUxN,UAAUC,IAAI,aAiBjB,wBAAwB6I,EAflB,CACT2J,WAAAA,EACAkQ,eAAAA,EACAjQ,WAAAA,EACAkQ,YAAAA,EACA/P,iBAAAA,EACAgQ,gBAAAA,EACA9P,cAAAA,EACA+P,eAAAA,EACA9P,eAAAA,EACA+P,gBAAAA,EACAjQ,uBAAAA,EACAkQ,4BAAAA,EACAC,MAAAA,yBAlBO,EAoB+C,EHuBXP,CAAY/iB,KAAKjB,MAAOiB,OACvE,CAEAuiB,YAAAA,GACI,OAAOviB,KAAK8iB,qBAChB,CAEAS,mBAAAA,GACI,MAAMC,EAAQxjB,KAAKyjB,aAAa,YAAc,WAAa,YACpDC,MI9EYA,GACrB3c,IAAAA,EAAKgQ,eAAAA,EAAgBf,MAAAA,EAAOuE,eAAAA,EAAiB,CAAC,GAChDiJ,EAAQ,cAER,IAAKxN,EACM,MAAA,GAGP7O,IAAAA,EAAM,iBAAiB6O,4BACRe,6BACW,aAAVyM,EAAuB,OAAS,+DAEtB,aAAVA,EAAuB,MAAQ,yBAG7CG,MAAAA,EAAc5c,EAAM,GAAK,yBAE3BA,GAAAA,GAAOwT,GAAgB8H,UAAW,CAClC,MAAMuB,EAAW7c,GAAO,qBACxBI,EAAM,MAAMwc,EAAYE,gBAAgBD,sDAA6Dzc,OACzG,CAEO,MAAA,2CACOA,uBAAG,EJuDNuc,CAAY1jB,KAAKjB,MAAOykB,EACnC,CAEArB,cAAAA,EAAiBlI,kBAAAA,EAAmBjN,MAAAA,IAChC,IACI8W,EADAC,GAAoB,EAExB,MAA0B,MAAtB9J,EACA6J,EAAc9W,EAEd+W,GAAoB,EAEjB,CAAEA,kBAAAA,EAAmBD,YAAAA,EAChC,CAEA1B,+BAAAA,EAAkC1T,UAAAA,EAAWyB,kBAAAA,IAClC,MAAA,CACHzB,WAAWe,MAAuBf,EAClCyB,mBAAmBV,MAAuBU,EAElD,CAEAmS,YAAAA,GACI,OAAOtiB,KAAKujB,qBAChB,CAEAS,wBAAAA,GACI,MAAO,GAAGnZ,EAAsB7K,KAAKjB,mBACnCgM,EAAiB/K,KAAKjB,mBACtBiL,EAAchK,KAAKjB,mBACnB2L,EAAe1K,KAAKjB,QAC1B,CAEAyjB,iBAAAA,GACI,OAAOxiB,KAAKgkB,0BAChB,CAEAvB,eAAAA,GACWA,MKnHgBA,GAC3BlX,IAAAA,EACA0Y,WAAAA,EACAC,cAAAA,EACAC,kBAAAA,EACAC,kBAAAA,EACAzN,gBAAAA,EACAkH,kBAAAA,EACA/O,KAAAA,EACAhD,aAAAA,EACA2H,SAAAA,EACAqD,SAAAA,EACAe,OAAAA,MAEA,IAAKoM,IAAeA,EAAWtjB,QAAUsjB,EAAW5J,SACzC,MAAA,GAGLxB,MAAAA,EAAUvZ,KAAK+J,UAAU,CAC3BsN,gBAAiBA,EACjBkH,kBAAmBA,EACnB/O,KAAMA,EACNiP,WAAYpS,GAAkB,CAAEG,aAAAA,IAChC2H,SAAUA,EACVqD,SAAUA,IAEd,IAAIuN,EAAiB,GACrB,cAAWxM,EAAW,KAClBA,EAAOnX,KAAII,IACPujB,EAAeha,KAAKvJ,EAAMyK,IAAG,IAI9B,6EAGW8Y,yBACFJ,EAAW5J,2BAChB9O,yBACKsN,kCACSuL,8BACJF,kCACIC,MAAsBF,EAAWtjB,iBAAK,ELyEpD8hB,CAAgBziB,KAAKjB,MAChC,CAEAulB,oBAAAA,GACUC,MAAAA,EAAavkB,KAAKyjB,aAAa,YAEZ,MAAA,aACvB1V,GAAyB/N,KAAKjB,MAAOiB,8BACzBukB,EAAa,cAAgB,gCACrC9V,GAAYzO,KAAKjB,wBAI3B,CAEA2jB,aAAAA,GACI,OAAO1iB,KAAKskB,sBAChB,CAEAE,mBAAAA,GACW7U,OAAAA,GAAgB3P,KAAKjB,MAChC,CAEA4jB,YAAAA,GACI,MAAM8B,EAAazkB,KAAK8N,cAAc,oBAAoB4W,UACtDD,OAAAA,GAGGzkB,KAAKwkB,qBAChB,CAEAG,mBAAAA,GACWC,MfrJwBA,GACnCnO,wBAAAA,EACAD,mBAAAA,EACAE,wBAAAA,MAEI,IAACF,IAAuBE,EACjB,MAAA,GAGX,IAAImO,EAAyB,GAE7B,GAAIrO,EAAoB,CACpB,IAAIsO,EAAa,GACbrO,IACAqO,EAAa,kBAAkBrO,2CAGnCoO,EAAyB,gDACnBC,kBACAtO,OACV,CAKA,OAFIE,GAA2BA,EAAwBjQ,MAAQiQ,EAAwB/V,MAOnFkkB,EACA,+BACYnO,EAAwBjQ,6BACvBiQ,EAAwB5V,6BACzB4V,EAAwBqO,iCACnBrO,EAAwBsO,4BACnCtO,EAAwB/V,4BAVvBkkB,CAAAA,Ee2HAD,CAAwB5kB,KAAKjB,MACxC,CAEA6jB,YAAAA,GACI,OAAO5iB,KAAK2kB,qBAChB,CAEA,oBAAM/C,GACIqD,MAAAA,EAAejlB,KAAKklB,aAAa,sBAAwB,EACzD5E,EAAOtgB,KAAKklB,aAAa,kBAAoB,SAE7CtE,GAAaqE,EAAc3E,EAAMtgB,KAAKjB,MAAMiR,QACtD,CAEAmV,kBAAAA,CAAmBhZ,GACfnM,KAAK4Y,QAAU,iBAEf,IAAIwM,EAAmBphB,SAAS8J,cAAc,IAAI9N,KAAK4Y,WACnDwM,GACAA,EAAiBxI,SJ1IM7P,OAC/BZ,EACAyM,EACAC,EACAC,KAEM,MAAEqL,kBAAAA,EAAmBD,cAAAA,GAAkBrL,EA0CvCwM,EAL4D,CAC9DC,CAAC1b,IApCsB2b,KACvB,IAAKpZ,EAAS,OACViZ,IAAAA,EAAmBphB,SAASwhB,cAAc,qBAC7Bve,EAAAA,aACb,OACA3H,KAAK+J,UAAUsP,GAAoBC,EAASzM,EAAS0M,EAASC,KAEjD7R,EAAAA,aAAa,KAAM2R,GACnB3R,EAAAA,aAAa,yBAA0B,QACvCA,EAAAA,aAAa,oBAAqBkd,GAClCld,EAAAA,aAAa,gBAAiBid,GAC/CkB,EAAiBne,aAAa,oBAAqB4R,EAAQuC,SAASnL,UACpEmV,EAAiBne,aAAa,gBAAiB4R,EAAQwC,YAAYoK,SAC1DnhB,SAAAA,KAAKX,YAAYyhB,EAAgB,EAwB1CM,CAACrN,IArB4BsN,KACvB,MAAErK,eAAAA,GAAmBzC,EAAQwC,YACnC,IAAKC,EAAesK,UAAkB,MAAA,GAChCR,MAAAA,EAAmBphB,SAAS8J,cAAc,qBAC5CsX,GAAkBA,EAAiBxI,SAEnCiJ,IAAAA,EAAsB7hB,SAASwhB,cAAc,qBAC7Bve,EAAAA,aAChB,OACA3H,KAAK+J,UAAUsP,GAAoBC,EAASzM,EAAS0M,EAASC,KAE9C7R,EAAAA,aAAa,yBAA0B,QACvCA,EAAAA,aAAa,oBAAqBkd,GAClCld,EAAAA,aAAa,gBAAiBid,GAClD2B,EAAoB5e,aAAa,oBAAqB4R,EAAQuC,SAASnL,UACvE4V,EAAoB5e,aAAa,gBAAiB4R,EAAQwC,YAAYoK,SAC7DnhB,SAAAA,KAAKX,YAAYkiB,EAAmB,GAQP/M,GACtCuM,GACgBA,KI2FhBS,CAAoB3Z,EAASnM,KAAK4Y,QAAS5Y,KAAKjB,MAAO6K,EAC3D,CAEA,qBAAMmY,CAAgBzT,GAClBA,EAAEyX,iBAEI,MAAExa,IAAAA,GAAQvL,KAAKjB,MACrB,GAAKwM,EAIL,CAAI,IACMY,MAAAA,QAAgBb,GAAWC,GAE5B4Z,KAAAA,mBAAmBhZ,GACxBuR,GAA0B,CACtBC,SAAU3d,KAAKjB,MAAMqc,UAAUuC,SAC/BC,WAAY,iBACZjH,gBAAiBxK,EAAQwK,gBACzBkH,kBAAmB1R,EAAQ0R,kBAC3BC,YAAa3R,EAAQ2C,KACrBiP,WAAYpS,GAAkBQ,GAC9BsH,SAAUtH,EAAQsH,SAClBqD,SAAU3K,EAAQa,MAClBsQ,YAAa,mBAEjB9B,GAAc,CAAEC,UAAWpa,EAAkBqa,KAAM,CAAE/H,GAAI3T,KAAK4Y,UACjE,CAAW,MACApZ,QAAAA,MAAM,0BAA0B+L,IAC5C,CACO,OAAA,CAAA,CACX,CAEAsX,SAAAA,GACI7iB,KAAKgmB,cACCC,MAAAA,EAAgBjmB,KAAKjB,MAAMwb,gBAAgB8H,UAC3C6D,EAAsBlmB,KAAKjB,MAAMwb,gBAAgB4L,gBAElDD,GACDlmB,KAAKK,UAAUC,IAAI,aAGnB2lB,GAAiBjmB,KAAKjB,MAAMgL,YAAcH,KACzBsc,EAAsBlmB,KAAKomB,iBAAiB,kBAAoB,CAACpmB,OAEzEyD,SAAQiG,IACbA,EAAQgT,iBAAiB,QAAS1c,KAAKgiB,YAAW,IAItDhiB,KAAKqmB,wBAAwB,kBAC7BrmB,KAAKqmB,wBAAwB,UAErC,CAEAL,WAAAA,GACUC,MAAAA,EAAgBjmB,KAAKjB,MAAMwb,gBAAgB8H,UAC3C6D,EAAsBlmB,KAAKjB,MAAMwb,gBAAgB4L,gBAEnDF,GAAiBjmB,KAAKjB,MAAMgL,YAAcH,KACzBsc,EAAsBlmB,KAAKomB,iBAAiB,kBAAoB,CAACpmB,OAEzEyD,SAAQiG,IACbA,EAAQmT,oBAAoB,QAAS7c,KAAKgiB,YAAW,IAGzDhiB,KAAKsmB,2BAA2B,kBAChCtmB,KAAKsmB,2BAA2B,UAExC,CAEAD,uBAAAA,CAAwBE,GACd7c,MAAAA,EAAU1J,KAAK8N,cAAcyY,GAC/B7c,GACAA,EAAQgT,iBAAiB,QAAS1c,KAAKwmB,uBAE/C,CAEAF,0BAAAA,CAA2BC,GACjB7c,MAAAA,EAAU1J,KAAK8N,cAAcyY,GAC/B7c,GACAA,EAAQmT,oBAAoB,QAAS7c,KAAKwmB,uBAElD,CAEAA,sBAAAA,CAAuB7K,GACnBA,EAAM8K,iBACV,CAEAliB,oBAAAA,GACIvE,KAAKgmB,aACT,EAGJhlB,eAAeC,IAAI,WAAaD,eAAeE,OAAO,SAAUugB,IMrQhE,MAAMiF,GAAsB,mBAC5B,IACIC,GADAC,GAAqB,GAGlB,MAmDDC,GAA0BhZ,IACtBtC,MAAAA,EAAMsC,EAAU9O,MAAM0a,UAAY,GACxC,IAAIqN,EAAgBJ,GAAsBnb,EACtCvH,GAA0C,MAA1CA,SAAS+iB,eAAeD,GAAwB,OAEhD1M,IAAAA,EAAQpW,SAASwhB,cAAc,YAEnCpL,EAAQvM,EAAUlK,YAAYyW,GAC9BA,EAAMnT,aAAa,KAAM6f,GACzB1M,EAAMnT,aAAa,UAAW,GAAE;;;;;QC7DpC,WAGK+f,IAAAA,EAAS,CAAE,EAACC,eAEhB,SAASC,IAGR,IAAA,IAFIC,EAAU,GAELthB,EAAI,EAAGA,EAAIuhB,UAAU7mB,OAAQsF,IAAK,CACtCwhB,IAAAA,EAAMD,UAAUvhB,GAChBwhB,IACHF,EAAUG,EAAYH,EAASI,EAAWF,IAE3C,CAEMF,OAAAA,CACP,CAED,SAASI,EAAYF,GACpB,GAAmB,iBAARA,GAAmC,iBAARA,EAC9BA,OAAAA,EAGR,GAAmB,iBAARA,EACH,MAAA,GAGJ,GAAApkB,MAAM4N,QAAQwW,GACVH,OAAAA,EAAWM,MAAM,KAAMH,GAG3BA,GAAAA,EAAI7d,WAAakV,OAAOxb,UAAUsG,WAAa6d,EAAI7d,SAASA,WAAWjD,SAAS,iBACnF,OAAO8gB,EAAI7d,WAGZ,IAAI2d,EAAU,GAEd,IAAA,IAAS/gB,KAAOihB,EACXL,EAAO5jB,KAAKikB,EAAKjhB,IAAQihB,EAAIjhB,KAChC+gB,EAAUG,EAAYH,EAAS/gB,IAI1B+gB,OAAAA,CACP,CAEQG,SAAAA,EAAajhB,EAAOohB,GAC5B,OAAKA,EAIDphB,EACIA,EAAQ,IAAMohB,EAGfphB,EAAQohB,EAPPphB,CAQR,CAEoCqhB,GAAOC,SAC3CT,EAAWU,QAAUV,EACrBQ,GAAAC,QAAiBT,GAOjBpiB,OAAOoiB,WAAaA,EAnEtB,oQCP8D,IAAI/O,GAAE,EAAE,SAAS0P,GAAEA,EAAEvZ,EAAEwZ,EAAEC,EAAEC,EAAEC,GAAOC,IAAAA,EAAEC,EAAEC,EAAE,CAAA,EAAG,IAAID,KAAK7Z,EAAE,OAAO6Z,EAAED,EAAE5Z,EAAE6Z,GAAGC,EAAED,GAAG7Z,EAAE6Z,GAAG,IAAItiB,EAAE,CAACiJ,KAAK+Y,EAAE9oB,MAAMqpB,EAAEhiB,IAAI0hB,EAAEziB,IAAI6iB,EAAEG,IAAI,KAAKC,GAAG,KAAKC,IAAI,EAAEC,IAAI,KAAKC,SAAI,EAAOC,IAAI,KAAKC,IAAI,KAAK7oB,iBAAY,EAAO8oB,MAAMzQ,GAAE0Q,SAASb,EAAEc,OAAOb,GAAG,GAAG,mBAAmBJ,IAAIK,EAAEL,EAAEkB,cAAc,IAAIZ,KAAKD,OAAE,IAASE,EAAED,KAAKC,EAAED,GAAGD,EAAEC,IAAI,OAAOa,EAAEC,OAAOD,EAAEC,MAAMpjB,GAAGA,CAAC,CCgB7Y,SAAwBqjB,IACpBC,MAAOC,EACPC,QAAAA,EACA/iB,KAAAA,EACAgjB,aAAAA,EACAC,qBAAAA,IAOA,OACIC,GAAA,SAAA,CAAQL,MANIM,GACZC,GAAOC,OACPJ,EAAuBG,GAAOE,YAAc,KAC5CR,GAGwBta,KAAK,SAASua,QAAAA,EAAiBQ,SACnDL,GAAA,OAAA,CAAML,MAAOO,GAAOI,MAAMD,SACtBE,GAAA,OAAA,CAAMZ,MAAOO,GAAOM,SAASH,UACzBL,GAAA,OAAA,CAAML,MAAOO,GAAOzT,OACpBuT,GAAA,OAAA,CAAML,MAAOM,GACTC,GAAOpjB,KACPgjB,EAAeI,GAAOJ,aAAe,MACvCO,SAAEvjB,IACJkjB,GAAA,OAAA,CAAML,MAAOO,GAAOO,gBAKxC,CCnBAld,eAAsBmd,GAAcnjB,GAC1B/C,MAAAA,QAxBV+I,eAAyBhG,GACjB,IACMojB,MAAAA,QAAiBC,MAAMrjB,GAC7B,OAAIojB,EAASE,SACUF,EAAS7jB,OAGzB,KACK,MACL,OAAA,IACX,CACJ,CAa2BgkB,CAAUvjB,GACjC,IAAK/C,EAAiB,MAAA,GAChBumB,MAAAA,EAbV,SAAmB7c,GACT6c,MAAAA,EAAS,IAAInmB,UACf,IACemmB,OAAAA,EAAOlmB,gBAAgBqJ,EAAM,aAEhC,MACL,OAAA,IACX,CACJ,CAKmB8c,CAAUxmB,GACzB,IAAKumB,EAAe,MAAA,GACd,MAAEjmB,KAAAA,GAASimB,EACXE,EAAUxnB,MAAMynB,KAAkBpmB,EAAK8hB,iBAAiB,cAC9D,OAAuB,IAAnBqE,EAAQlqB,OAAqB,IAG7BkqB,EAAQ,GAAGZ,SAAStpB,OAAS,GAC7B0C,MAAMynB,KAAKD,EAAQ,GAAGZ,UAAUpmB,SAAiBknB,IACzCA,EAAMtqB,UAAUuqB,SAAS,oBACzBD,EAAM/N,QAAO,IAIlB6N,EAAQ,GAAGjqB,UACtB,2fCxBA,MAAMqqB,GAAUC,EAAwC,CAAEC,UAAWA,SAWrE,SAAwBC,IACpBnB,SAAAA,EACAoB,MAAAA,EACAC,iBAAAA,EACAC,OAAAA,GAAS,EACTC,gBAAAA,EAAkB,GAClBC,QAAAA,EAAUA,SAEJC,MAAAA,EAAYC,EAA0B,OACrCC,EAAWC,GAAgBC,GAAkB,IAC7ClR,EAAQuQ,GAAaW,EAA4B,MAaxDC,GAAU,KACF,GAACL,GAAcA,EAAUM,QAsBnBA,OCzElB,SAAoCjkB,GAC5BC,MAAAA,EAAQD,GAAaD,UAAUC,UAC/BkkB,EAAejkB,EAAMkkB,MAAM,uBAE3BC,GADgBF,EAAeG,WAAWH,EAAa,IAAM,GAC5B,KAGvC,OAFiBjkB,EAAMrB,SAAS,WAAaqB,EAAMrB,SAAS,WAEzCwlB,CACrB,CD8CYE,CAAYvkB,WAAWC,YAAS,WAE5B,GAAI2jB,EAAUM,QACN,IACM,MAAEhE,QAASsE,SAAyBC,OAAO,sCAClCC,EAAAA,eAAed,EAAUM,SAC5B,MAEhB,GARwB,GAmB1BA,EAAAA,SAASlP,iBAAiB,QAAS2P,GAEtC,KACOT,EAAAA,SAAS/O,oBAAoB,QAASwP,EAAa,EATjE,SAASA,EAAc1Q,GACfA,EAAMrT,SAAWgjB,EAAUM,SACnBP,GAEhB,CAKiE,GAElE,CAACC,EAAUM,UAEdD,GAAU,MACDL,IAAcA,EAAUM,UAEzBT,EACAG,EAAUM,QAAQU,YACXhB,EAAUM,QAAQW,MA9CjC,WACId,GAAa,GAEb,MAAMnR,EAAQA,KACVmR,GAAa,GACbH,EAAUM,SAAStR,QACTsR,EAAAA,SAAS/O,oBAAoB,eAAgBvC,EAAK,EAEtDsR,EAAAA,SAASlP,iBAAiB,eAAgBpC,EACxD,CAsCkBkS,MAEf,CAAClB,GAAWM,QAAST,IAElBsB,MAAAA,EAAgBC,GAClB,KAAO,CACH3B,UAAAA,KAEJ,CAACA,IAGL,OACIvB,GAAA,SAAA,CACInkB,IAAKimB,EACLD,QAAAA,EACAlC,MAAOM,GACHC,GAAOiD,UACP,CAAE,CAACjD,GAAO8B,WAAYA,GACtB9B,GAAO,IAAI0B,MACbvB,UAEAsB,GAAUK,IACRhC,GAAA,UAAA,CAASL,MAAOO,GAAOkD,QAAQ/C,SAC3BE,GAACc,GAAQgC,SAAQ,CAACxmB,MAAOomB,EAAc5C,UACnCE,GAAA,SAAA,CAAQZ,MAAOO,GAAOoD,OAAOjD,UACzBL,GAAA,KAAA,CAAIL,MAAOO,GAAOuB,MAAMpB,SAAEoB,IAC1BzB,GAAA,SAAA,CACIL,MAAOO,GAAOqD,YACdje,KAAK,SACLua,QAASgC,EAET2B,WAAS,EACT,aAAY9B,OAGpB1B,GAAA,MAAA,CAAKL,MAAOO,GAAOuD,QAAQpD,SAAAA,IAC1BrP,GAAUgP,GAAA,SAAA,CAAQL,MAAOO,GAAOlP,OAAOqP,SAAErP,UAMlE,CAMAwQ,GAAYkC,OAAS,UAAkBrD,SAAAA,IAC7B,MAAEkB,UAAAA,GAAcoC,EAAWtC,IACjCE,OAAAA,EAAUlB,GACH,IACX,uHEpHA,SAAwBuD,IACpBjC,OAAAA,EACAhf,QAAAA,EACAkf,QAAAA,EACAgC,eACItmB,IAAKumB,EACLrC,MAAOsC,EACPC,aAAAA,EACAC,kBAAmBC,EACnBC,iBAAAA,KAGJ,MAAOjvB,EAAMkvB,GAAWlC,EAA6B,CACjDmC,OAAQ,UACRngB,KAAM,KAiCV,OAbAie,GAAU,KACDR,cAIG,UAtBZpe,iBAII,IAHKugB,GAGe,WAAhB5uB,EAAKmvB,QAAuC,YAAhBnvB,EAAKmvB,OACjC,OAEID,EAAA,CAAEC,OAAQ,UAAWngB,KAAM,KAE7BA,MAAAA,QAAawc,GAAcoD,GAKzBM,EAJHlgB,EAIG,CAAEmgB,OAAQ,SAAUngB,KAAAA,GAHhB,CAAEmgB,OAAQ,QAASngB,KAAM,IAIzC,CAQkBogB,SACDtuB,GACLC,QAAQD,MAAMA,EAClB,QAEL,CAAC2rB,IAECmC,EAKDvD,GAACiB,GAAW,CACRC,MAAOsC,EACPpC,OAAAA,EACAD,iBAAkByC,EAClBtC,QAAAA,EACAD,gBAAiB,GAAGvB,SAAA,CACH,WAAhBnrB,EAAKmvB,QAAuBrE,GAACuE,GAAM,CAACrgB,KAAMhP,EAAKgP,OAC/B,YAAhBhP,EAAKmvB,QAAwBrE,GAACwE,GAAO,CAACrtB,MAAO6sB,IAC7B,UAAhB9uB,EAAKmvB,QAAsBrE,GAAChiB,GAAK,CAAC7G,MAAO+sB,OAZvC,IAef,CAEA,SAASK,IAASrgB,KAAAA,IACd,OACI8b,GAAA,MAAA,CAAKL,MAAOO,GAAOuE,YAAaC,wBAAyB,CAAEC,OAAQzgB,IAE3E,CAEA,SAASsgB,IAAUrtB,MAAAA,IACf,OACI6oB,GAAA,MAAA,CAAKL,MAAOO,GAAO0E,aAAavE,SAAElpB,GAE1C,CAEA,SAAS6G,IAAQ7G,MAAAA,IACb,OACI6oB,GAAA,MAAA,CAAKL,MAAOO,GAAO2E,WAAWxE,SAAElpB,GAExC,CCxGsE,SAASqoB,KAAI,OAAOA,GAAEtK,OAAOwD,QAAQ,SAAS6F,GAAG,IAAA,IAAQzZ,EAAE,EAAEA,EAAE8Y,UAAU7mB,OAAO+N,IAAI,CAAKwZ,IAAAA,EAAEV,UAAU9Y,GAAG,IAAA,IAAQuZ,KAAKC,EAASpJ,OAAAxb,UAAU+jB,eAAe7jB,KAAK0kB,EAAED,KAAKE,EAAEF,GAAGC,EAAED,GAAG,CAAQE,OAAAA,CAAC,GAAGP,MAAMxnB,KAAKonB,UAAU,CAAC,SAASvhB,GAAEkiB,GAAG/nB,KAAKsuB,gBAAgB,WAAW,OAAOvG,EAAEwG,OAAO,EAAE,IAAIjgB,EAAEyZ,EAAE8B,SAAS/B,EAAE,SAASC,EAAEzZ,GAAG,GAAG,MAAMyZ,EAAE,MAAM,CAAA,EAAOD,IAAAA,EAAED,EAAEmB,EAAE,CAAA,EAAGnjB,EAAE6Y,OAAOC,KAAKoJ,GAAG,IAAIF,EAAE,EAAEA,EAAEhiB,EAAEtF,OAAOsnB,IAAIvZ,EAAE1H,QAAQkhB,EAAEjiB,EAAEgiB,KAAK,IAAImB,EAAElB,GAAGC,EAAED,IAAWkB,OAAAA,CAAC,CAAjI,CAAmIjB,EAAE,CAAC,UAAU,aAAoBF,OAAAA,EAAEvZ,EAAEwZ,EAAE,CAAC,SAASM,KAAI,IAAIP,EAAE,IAAIjM,YAAY,UAAU,CAACC,OAAO,CAAA,EAAGC,SAAQ,EAAGO,YAAW,IAAUrc,KAAAwb,cAAcqM,GAAG7nB,KAAKwuB,MAAMzG,EAAEliB,GAAEmjB,GAAE,CAAA,EAAGhpB,KAAKyuB,OAAO,CAACF,QAAQ1G,EAAEhM,OAAO0S,UAAU,SAASjgB,EAAEwZ,EAAED,GAAG,GAAG,IAAIC,EAAEplB,SAAS,OAAOolB,EAAEppB,KAAK,GAAG,IAAIopB,EAAEplB,SAAgB,OAAA,KAAK,IAAIsmB,EAAE,GAAGnjB,EAAE,CAAA,EAAGuiB,EAAE,EAAElT,EAAE4S,EAAErpB,WAAWwpB,EAAEH,EAAEhlB,WAAeslB,IAAAA,EAAElT,EAAE3U,OAAO6nB,KAAK,SAASlT,EAAEkT,GAAGxnB,OAAOiF,EAAEqP,EAAEkT,GAAGxnB,MAAMsU,EAAEkT,GAAG/hB,MAAMR,EAAEqiB,GAAEhT,EAAEkT,GAAGxnB,OAAOsU,EAAEkT,GAAG/hB,OAAW+hB,IAAAA,EAAEH,EAAE1nB,OAAO6nB,KAAK,CAAK7H,IAAAA,EAAEjS,EAAE2Z,EAAEG,GAAG,MAAMsG,EAAEzG,EAAEG,GAAGuG,KAAKD,EAAE7oB,EAAE6oB,GAAG3G,EAAEI,GAAE,CAACvnB,KAAK8tB,GAAGnO,GAAGyI,EAAEZ,GAAG7H,CAAC,CAAC,IAAIqO,EAAE/G,EAAEE,EAAEI,GAAE,KAAKa,GAAGA,EAAE,OAAOjB,EAAEF,GAAGC,EAAEjpB,SAAS+D,cAAciD,EAAE+oB,EAAE,CAA5W,CAA8W5uB,KAAKA,KAAK6uB,kBAAkB7uB,KAAKyjB,aAAa,WAAWnV,EAAEwZ,GAAG9nB,KAAKwuB,MAAMxuB,KAAK8uB,MAAM,CAAC,SAAS5G,GAAEH,GAAG,OAAOA,EAAElhB,QAAQ,UAAS,SAASkhB,EAAEzZ,GAAUA,OAAAA,EAAEA,EAAEygB,cAAc,EAAE,GAAE,CAAC,SAAS7Z,GAAE6S,EAAEzZ,EAAE0a,GAAG,GAAGhpB,KAAKwuB,MAAM,CAAC,IAAI3oB,EAAE,CAAE,EAACA,EAAEkiB,GAAGiB,EAAQA,QAAE,EAASnjB,EAAEqiB,GAAEH,IAAIiB,EAAEhpB,KAAKwuB,MAAM3G,EAAE7nB,KAAKwuB,MAAM3oB,GAAGiiB,EAAE9nB,KAAKwuB,MAAMxuB,KAAK8uB,MAAM,CAAC,CAAC,SAAS7G,KAAIH,EAAE9nB,KAAKwuB,MAAM,KAAKxuB,KAAK8uB,MAAM,CAAC,SAAS3G,GAAE7Z,EAAEwZ,GAAG,IAAID,EAAE7nB,KAAY+nB,OAAAA,EAAE,OAAOiB,GAAE,CAAA,EAAG1a,EAAE,CAACjJ,IAAI,SAAS0iB,GAAGA,GAAGF,EAAExiB,IAAI0iB,EAAEF,EAAEmH,YAAYnH,EAAEmH,UAAU,SAASjH,GAAGA,EAAEtB,kBAAkBsB,EAAElM,OAAO0S,QAAQzG,CAAC,EAAEC,EAAErL,iBAAiB,UAAUmL,EAAEmH,aAAanH,EAAExiB,IAAIwX,oBAAoB,UAAUgL,EAAEmH,UAAU,IAAI,6BCcvnD,SACIC,EACAtsB,EACAusB,EACA5Y,GAEItV,eAAeC,IAAI0B,IDpB4mD,SAASolB,EAAEzZ,EAAEwZ,EAAED,GAAG,SAASmB,IAAI,IAAI1a,EAAE6gB,QAAQC,UAAUvvB,YAAY,GAAGmpB,GAAG,OAAO1a,EAAEugB,eAAe9G,EAAEzZ,EAAEwgB,MAAMjH,GAAGA,EAAEwH,OAAO/gB,EAAEghB,aAAa,CAACC,KAAK,SAASjhB,EAAEA,CAAC,EAAQ0a,EAAE9lB,UAAUwb,OAAO8Q,OAAO3vB,YAAYqD,YAAYpD,YAAYkpB,EAAEA,EAAE9lB,UAAUhD,kBAAkBkoB,GAAEY,EAAE9lB,UAAUusB,yBAAyBva,GAAE8T,EAAE9lB,UAAUqB,qBAAqB0jB,GAAEH,EAAEA,GAAGC,EAAEmH,oBAAoBxQ,OAAOC,KAAKoJ,EAAE2H,WAAW,CAAE,GAAE1G,EAAEkG,mBAAmBpH,EAAEA,EAAErkB,SAAQ,SAASskB,GAAGrJ,OAAOiR,eAAe3G,EAAE9lB,UAAU6kB,EAAE,CAAC9mB,IAAI,WAAkB,OAAAjB,KAAKwuB,MAAMzvB,MAAMgpB,EAAE,EAAE6H,IAAI,SAASthB,GAAGtO,KAAKwuB,MAAMxuB,KAAKyvB,yBAAyB1H,EAAE,KAAKzZ,IAAItO,KAAKyuB,SAASzuB,KAAKyuB,OAAO,CAAA,GAAIzuB,KAAKyuB,OAAO1G,GAAGzZ,EAAEtO,KAAKE,qBAAqB,IAAI4nB,SAASxZ,EAAE,MAAMA,GAAG,WAAWwZ,GAAG,YAAYA,GAAG,WAAWA,GAAG9nB,KAAKiH,aAAa8gB,EAAEzZ,EAAE,GAAG,IAAGtN,eAAeE,OAAOoN,GAAGyZ,EAAEplB,SAASolB,EAAE8H,aAAa9H,EAAEnnB,KAAKooB,EAAE,CCuBj6EiG,CAAAA,EAAMtsB,EAASusB,EAAoB5Y,GACrCtV,eAAeC,IAAI0B,EAC9B,CCyDemtB,EA5Df,UAAyB3jB,QAAS4jB,EAAoBC,cAAeC,IACjE,MAAOC,EAAYC,GAAiBzE,EAAyB,MAEzDvf,IAAAA,EAA0B,KAC1BikB,EAAiE,KAGjE,IACU9wB,EAAAA,KAAKC,MAAMwwB,GACKzwB,EAAAA,KAAKC,MAAM0wB,GACzB,MACL,OAAA,IACX,CACI,IAAC9jB,IAAYikB,EAAgC,OAAA,KAUxCC,SAAAA,EAAyB1U,EAAmBxP,GACjDwP,EAAM8K,kBACN9K,EAAMoK,iBATuBuK,CAACnkB,IAC9BgkB,EAAchkB,EAAO,EASrBmkB,CAAyBnkB,EAC7B,CAEMokB,MAAAA,EAA2BH,GAAyBI,gCAAkC,GACtFnD,EAA0D,CAC5DtmB,IAAKqpB,GAAyBK,yBAA2B,GACzDxF,MAAOmF,GAAyBM,2BAA6B,GAC7DlD,aAAc4C,GAAyBO,kCAAoC,GAC3ElD,kBAAmB2C,GAAyBQ,wCAA0C,GACtFjD,iBAAkByC,GAAyBS,uCAAyC,IAGxF,IAAKN,EAAiC,OAAA,KAGhCO,MAAAA,EAAsC,SAA7B3kB,EAAQpC,WAAa,IAEpC,OAAQggB,GAAAgH,EAAA,CAAAlH,SAAA,CACJL,GAACN,GAAmB,CAChB5iB,KAAMiqB,EACNjH,cAAY,EACZD,QAAU/a,GAAM+hB,EAAyB/hB,EAAGnC,GAC5Cgd,MAAOO,GACPH,sBAAuBuH,IAE3BtH,GAAC4D,GAAkB,CACfjC,SAAU+E,EACV/jB,QAAS+jB,EACT7E,QAnCUmB,KACd2D,EAAc,KAAI,EAmCd9C,cAAAA,MAGZ,GAE6C,4BC/E7C,MAAM2D,GAAwBjyB,IACpB,MAAEkyB,mBAAAA,GAAuBlyB,EACxB,OAAA,IAAI6V,OAAOqc,EAAoB,KAAI,EAajCjnB,GAAgBjL,IACnB,MAAE6B,KAAAA,GAAS7B,EAEbmyB,GAbgBA,EAACnyB,EAAO0mB,KACtB,MAAEwL,mBAAAA,GAAuBlyB,EAE/B,OACIkyB,GACuB,KAAvBA,GACAD,GAAsBjyB,GAAO0I,KAAKge,EAAO,EAOzCyL,CAAgBnyB,EAAO6B,GAAO,CACxB,MAAEqwB,mBAAAA,GAAuBlyB,EACzBqqB,EAAY9e,EAAe5F,GAAGK,OAAS,cAAgB,cAE7DhG,EAAMkL,YAAcrJ,EACfiG,QACGmqB,GAAsBjyB,GACtB,kCAAkCqqB,MAAc6H,YAEnDpN,MACT,CAEA,OAAOsN,EAAiBpyB,EAAK,ECrBpBqyB,GAAmBryB,IACtB,MAAEgb,YAAAA,GAAc,GAAUhb,EAEhC,IAAKgb,EACM,MAAA,GAGL,MAAEH,eAAAA,EAAgBI,cAAAA,GAAkBjb,EACpC4B,EAjBa5B,CAAAA,IACb,MAAEkb,kBAAAA,EAAmBC,cAAAA,EAAeC,aAAAA,GAAiBpb,EAE3D,OADqBkb,GAAqB/N,GAAgBnN,IACpC,GAAKmb,EAAgBA,EAAgBC,CAAAA,EAc7CkX,CAAetyB,GACvBiN,EAAWjN,EAAMuyB,mBAAqBvyB,EAAMuyB,mBAZlCC,GAAGhc,QAAAA,EAASlJ,eAAAA,EAAgBuK,cAAAA,EAAetK,aAAAA,MAC/C,IAAZiJ,EAAoBlJ,EAAiBuK,GAAiBtK,GAAgB,EAWCilB,CAAYxyB,GAC7EyyB,EAAezyB,EAAMkb,kBAAoBlb,EAAMkb,kBAAoB/N,GAAgBnN,GAErF,IAACiN,IAAawlB,EACP,MAAA,GAGLrW,MAAAA,EAAa1S,EACfuR,EACA,CACIyX,gBAAiBD,EACjBE,YAAa/wB,EACbqL,SAAAA,EACA4N,eAAAA,EACAkK,YAAa/kB,EAAMglB,kBAAoBhlB,EAAM+kB,YAAc,GAC3D6N,eAAgB5yB,EAAMglB,kBAAoBhlB,EAAM4yB,eAAiB,IAErE,IACA,KAGCxW,OAAAA,EAIE,wDAAwDA,QAHpD,EAAA,EC0Dfna,eAAeC,IAAI,kBAAoBD,eAAeE,OAAO,gBAnF7D,cAAwBugB,GACpB3hB,WAAAA,WAEIE,KAAK8O,KAAO,SACZ9O,KAAK4xB,sBAAwB5xB,KAAK6xB,iBAAiBhQ,KAAK7hB,KAC5D,CAEAmC,OAAAA,GACInC,KAAK8xB,gBAAkB9xB,KAAK8N,cAAc,kBAC1C/N,MAAMoC,SACV,CAEAqgB,iBAAAA,GACI,MAAO,GAAG3X,EAAsB7K,KAAKjB,2BAC3BgM,EAAiB/K,KAAKjB,2BACtBiL,GAAchK,KAAKjB,2BACnB2L,EAAe1K,KAAKjB,2BChCAA,CAAAA,IAC5B,MAAEwb,eAAAA,EAAgB5G,GAAAA,EAAIyH,SAAAA,EAAU8I,cAAAA,EAAeC,kBAAAA,GAAsBplB,EAE3E,IAAIgzB,EAAiBxX,GAAgB4L,gBAErC,OAAK5L,GAAgB8H,WAAc0P,EAI5B,+KAIwB3oB,EAAWgS,GAAUzH,IAAM,4CACzBvK,EAAWgS,GAAUxa,MAAQ,gDACzBwI,EAAWgS,GAAUnL,UAAY,gDACjC7G,EAAWgS,GAAUuC,UAAY,mCAC9CxU,EAAsB,CAAEgD,QAAS,CAAEwH,GAAIA,wCACnCA,8CACSwQ,0CACJD,sDAEX6N,oDAhBX,EAgByB,EDWtBC,CAAuBhyB,KAAKjB,2BEjCfkzB,GAC3BnmB,aAAAA,EACAwL,UAAAA,EACAoD,mBAAAA,EACAD,gBAAAA,EAAkB,OAElB,MAAMyX,EAAezc,GAAgB,CAAE3J,aAAAA,IAEnCwL,OAAc,IAAdA,EACO,GAGJ,qCACUA,8BACI4a,mCACKxX,gCACHD,0BAAe,EFkBxBwX,CAAgBjyB,KAAKjB,2BACrBiB,KAAKmyB,oBAAoBnyB,KAAKjB,2Bb7BXqzB,GAC/BtjB,KAAAA,EAAMqI,eAAAA,EAAgB5B,QAAAA,EAAShK,IAAAA,EAAK0E,SAAAA,EAAUoiB,MAAAA,GAChDxkB,IAGa,YAATiB,GACAqI,GACAA,EAAemb,kBACH,IAAZ/c,GAEAqR,GAAqB,iDACDrb,oCACG4L,EAAerB,6CAChBqB,EAAeob,sDACLpb,EAAeqb,gDAC9BH,iCACGpiB,wCAGpBpC,EAAU9D,UAAY,QAEtB4c,GAAcxP,EAAesb,kBACtB,mEAAmEtb,EAAemb,+BAEtF,GaMOF,CAAsBpyB,KAAKjB,MAAOiB,0BGtCvB0yB,GAAGC,UAAAA,MAC5B,IAAKA,EACM,MAAA,GAEL,MAAEC,eAAAA,EAAgBC,eAAAA,EAAgBC,qBAAAA,GAAyBH,EACjE,OAAKC,GAAmBC,GAAmBA,EAAetyB,OAcnD,2DACqBuyB,qBAXND,EACjBnyB,KAAI,EAAGC,MAAAA,EAAOoG,IAAAA,EAAKgsB,SAAAA,KACZhsB,IAAQgsB,EACD,YAAYhsB,+CAAiDpG,eAGjE,sDAAsDA,mBAEhEI,KAAK,kBAXC,EAeQ,EHkBL2xB,CAAc1yB,KAAKjB,QACjC,CAEAozB,mBAAAA,GAEQ,GAAyB,QAAzBnyB,KAAKjB,MAAMgL,YIvChB,SAA6CipB,GAEhD,OAOJ,SAA0BA,GACfA,OAAAA,EAAOtyB,KAAa2xB,GAAAA,EAAM1S,MAAM,KAAKC,OAChD,CAVyBqT,CAAiBD,GAClBliB,MAAW6C,GALI,6CAKJA,GACnC,CJwCauf,CAAoClzB,KAAKjB,OAAOi0B,QAAU,IACpD,MAAA,GAEL/C,MAAAA,EAA2BjwB,KAAKmzB,SAASnD,eAAiB,GAChE,IAAKC,EACM,MAAA,GAELG,MAAAA,EAA0B9wB,KAAKC,MAAM0wB,GACpC,MAAA,sCAAsC9mB,EACzCnJ,KAAKjB,0BACYoK,EACjBinB,iCAER,CAEA9L,oBAAAA,GACUC,MAAAA,EAAavkB,KAAKyjB,aAAa,YAEZ,MAAA,aACvB1V,GAAyB/N,KAAKjB,MAAOiB,8BACzBukB,EAAa,cAAgB,gCACrC9V,GAAYzO,KAAKjB,wBAI3B,CAEA2jB,aAAAA,GACW,MAAA,GAAG1iB,KAAKskB,2CK5ES8O,GAAGT,UAAAA,MAC/B,IAAKA,EACM,MAAA,GAEL,MAAEC,eAAAA,EAAgBC,eAAAA,GAAmBF,EAC3C,OAAKC,GAAmBC,GAAmBA,EAAetyB,OAQnD,wDAJcsyB,EAAel0B,MAAKgB,IACb,IAAjBA,EAAIozB,WAG6DM,kBAPjE,EAO4E,ELgEzED,CAAiBpzB,KAAKjB,2BACtBqyB,GAAiBpxB,KAAKjB,2BM5ENA,CAAAA,IACxB,MACF0Y,mBAAAA,GAAqB,EACrBoC,oBAAAA,EACAC,qBAAAA,EAAuB,6CACvBlL,kBAAAA,EACAC,kBAAAA,GACA9P,EACJ,IAAK0Y,IAAuBoC,IAAwBhL,EACzC,MAAA,GAGLykB,MAAAA,EAAkB7qB,EACpBqR,EACA,CACID,oBAAAA,EACAjL,kBAAAA,GAEJ,IACA,KAGJ,OAAK0kB,GAAoB1kB,EAIlB,0DAA0D0kB,QAHtD,EAGqE,ENmDlEC,CAAmBvzB,KAAKjB,QACtC,CAEA8yB,gBAAAA,Gb/C2BhkB,CAAAA,IACrBtC,MAAAA,EAAMsC,EAAU9O,MAAM0a,UAAY,GACxCoN,GAAwBhZ,GACxB,IAAIiZ,EAAgBJ,GAAsBnb,EAC1CsC,EAAU2lB,YAAcxvB,SAAS+iB,eAAeD,GAChDjZ,EAAUlK,YAAYkK,EAAU2lB,aAEhC/pB,EAAcoE,EAAU2lB,YAAa,CACjCzpB,UAAW,SACX0pB,QAAS,QACT1O,KAAM,IACN2O,QAAS,QACT/M,YAAAA,GACAsG,QAASrG,KAGb/Y,EAAU2lB,YAAYnzB,UAAUC,IAAI,oBAEpCkb,GAAc,CACVC,UAAWpa,EACXqa,KAAM,CAAE/H,GAAImT,IACf,Ea2BG6M,CAAgB3zB,KACpB,CAEA6iB,SAAAA,GACUA,MAAAA,YACF7iB,KAAK8xB,iBACL9xB,KAAK8xB,gBAAgBpV,iBAAiB,QAAS1c,KAAK4xB,sBAE5D,CAEA5L,WAAAA,GACUA,MAAAA,cACFhmB,KAAK8xB,iBACL9xB,KAAK8xB,gBAAgBjV,oBAAoB,QAAS7c,KAAK4xB,sBAE/D,IOhGJ,MAAMgC,WAAkB/zB,YACpBC,WAAAA,WAEIE,KAAKjB,MAAQ,EACjB,CAEAmB,iBAAAA,GACIF,KAAKjB,MAAQP,EAAYwB,KAAKvB,YAC9BuB,KAAKG,QACT,CAEAA,MAAAA,GACU,MAAEsa,gBAAAA,EAAkB,YAAaC,mBAAAA,EAAoBlD,cAAAA,GAAkBxX,KAAKjB,MAC5EuY,EAAYuc,SAAS7zB,KAAKjB,MAAMuY,WAElC,IAACA,GAAawc,MAAMxc,GACb,MAAA,GAGX,MAAMyc,EAAmBrZ,GAAoB7T,QAAQ,kBAAmB2Q,GAExExX,KAAKQ,UAAY,4DAEeia,KAAmBnD,KAAayc,yEACVtZ,4BAC5Cza,KAAKg0B,mBAAmB1c,mEACoBA,4BAC5CtX,KAAKi0B,mBAAmB3c,gCAGtC,CAEA0c,kBAAAA,CAAmB1c,GAGf,OAAO,IAAIrU,MAAM8C,KAAKmuB,IAAI5c,EAAW,GAAK6c,GACrCC,KAAK,oCACLrzB,KAAK,GACd,CAEAkzB,kBAAAA,CAAmB3c,GACX,IAAEE,cAAAA,GAAkBxX,KAAKjB,MACzB,QAACyY,GAAmC,cAAlBA,KAClBA,EAAgB,IAGb,IAAIvU,MAAM4wB,SAASrc,GAAiBzR,KAAKsuB,IAAI/c,EAAWuc,SAASrc,KACnE4c,KAAK,6BACLrzB,KAAK,GACd,EAGJC,eAAeC,IAAI,iBAAmBD,eAAeE,OAAO,eAAgB0yB,ICpC5E,IAAKU,GACGA,IAAAA,GAAM,IAnBd,MACIx0B,WAAAA,GACSy0B,KAAAA,KAAOvwB,SAASwhB,cAAc,MACvC,CAEAgP,QAAAA,CAAS7Y,EAAO8Y,GACPF,KAAAA,KAAK7X,iBAAiBf,EAAO8Y,EACtC,CAEA7X,MAAAA,CAAOjB,EAAO8Y,GACLF,KAAAA,KAAK1X,oBAAoBlB,EAAO8Y,EACzC,CAEAC,IAAAA,CAAK/Y,EAAOE,EAAS,IACjB7b,KAAKu0B,KAAK/Y,cAAc,IAAII,YAAYD,EAAO,CAAEE,OAAAA,IACrD,GAOJ,MAAA8Y,GAAeL,GCXf,MAAMM,WAAY/0B,YACdC,WAAAA,WAEIE,KAAKjB,MAAQ,GACbiB,KAAKmP,OAASD,KACdlP,KAAKwP,SAAWH,IACpB,CAEA,6BAAW6f,GACA,MAAA,CAAC,OAAQ,WACpB,CAEAhvB,iBAAAA,GACIF,KAAKjB,MAAQ,IACNP,EAAYwB,KAAKvB,YACpB4R,gBAAiBrQ,KAAKyjB,aAAa,yBAGvCzjB,KAAK60B,iBAAmB70B,KAAK80B,YAAYjT,KAAK7hB,MAC9CA,KAAK2uB,KAAO3uB,KAAKQ,UAAUqG,QAAQ,OAAQ,IAAIgd,OAC/C7jB,KAAKG,QACT,CAEAA,MAAAA,GACU,MACF+a,YAAAA,EAAc,GACd6Z,WAAAA,EACAC,iBAAAA,EACAC,kBAAAA,EACAC,SAAAA,EACAC,UAAAA,EAAY,GACZC,WAAAA,EAAa,GACbC,aAAAA,EACA10B,MAAAA,EACA20B,aAAAA,GAAe,EACfC,SAAAA,EAAW,GACXvQ,UAAAA,EAAY,GACZD,KAAAA,EAAO,KACPb,cAAAA,EAAgB,GAChBC,kBAAAA,EAAoB,GACpBqR,YAAAA,EAAc,QACdzrB,UAAAA,GACA/J,KAAKjB,MACL,IAAE0H,KAAAA,GAASzG,KAAKjB,MAEd4vB,MAAAA,EAAO3uB,KAAK2uB,KAAO3uB,KAAK2uB,KAAOhuB,EAE/B+I,EAAU1F,SAASwhB,cAAc/e,EAAO,IAAM,UAqBpD,GAnBI0d,GAAqBD,GAAiBqR,GACtClV,GAAkB8D,EAAmBD,EAAeqR,GAGpD9uB,IACAA,EAAOA,EAAKI,QAAQ,WAAY7G,KAAKmP,QACrC1I,EAAOA,EAAKI,QAAQ,SAAU7G,KAAKwP,UAEnC9F,EAAQzC,aAAa,OAAQR,IAG7BA,GAAQ6uB,GACR5rB,EAAQzC,aAAa,SAAU,UAG/B+d,GAAave,GACbiD,EAAQzC,aAAa,QAAS+d,GAG9B+P,EACArrB,EAAQzC,aAAa,aAAc8tB,QAAU,GACtCE,GAAqBD,EAAkB,CAC9C,MAAMS,EAAY,CAACR,EAAmBtG,EAAMqG,GACvCh2B,QAAOqH,KAAWA,IAClBtF,KAAK,KACV00B,GAAa/rB,EAAQzC,aAAa,aAAcwuB,EACpD,CAaA,GAXkB,eAAd1rB,GACAL,EAAQrJ,UAAUC,IAAI,eAE1BoJ,EAAQrJ,UAAUC,IAAI,WAAWyJ,KAC7BmrB,IACoB,SAAhBM,EACA9rB,EAAQrJ,UAAUC,IAAI,WAAW40B,kBAEjCxrB,EAAQrJ,UAAUC,IAAI,WAAW40B,MAGrCnQ,EAAM,CACN,IAAI2Q,EAAY,cAChB,OAAQ3Q,GACJ,IAAK,KACD2Q,EAAY,cACZ,MACJ,IAAK,KACDA,EAAY,cAGpBhsB,EAAQrJ,UAAUC,IAAI,SAASykB,IAAQ2Q,EAC3C,EAEmB,YAAd3rB,GAAyC,aAAdA,IAA6C,KAAhBmR,IACzDlb,KAAKiH,aAAa,cAAeiU,GACjClb,KAAKiH,aAAa,WAAY,KACd,UAAhBiU,EACMxR,EAAQrJ,UAAUC,IAAI,oBACtBoJ,EAAQrJ,UAAUC,IAAI,qBAGhC60B,GAAan1B,KAAKiH,aAAa,YAAakuB,GAC5CC,GAAcp1B,KAAKiH,aAAa,aAAcmuB,GAE9C1rB,EAAQlJ,UAAY,qBACV20B,GAAa,kBAAkBA,0CACzBxG,6BAEU,YAAd5kB,GAA2C,KAAhBmR,GAAuC,KAAjBma,EAC3C,wBAAwBA,WACxB,uBAERD,GAAc,kBAAkBA,4BAE1Cp1B,KAAKQ,UAAYkJ,EAAQgb,UAEzB1kB,KAAK21B,kBACL31B,KAAK41B,cACT,CAEAd,WAAAA,IACuC,IAA/B90B,KAAKjB,MAAMsR,iBACXrQ,KAAK61B,QAGH,MAAEC,SAAAA,EAAW,GAAIzb,SAAAA,EAAW,GAAI0b,MAAAA,EAAQ,IAAO/1B,KAAKjB,MAEtD+2B,GACAE,GAAStB,KAAKoB,EAAU,CAAA,GAExBzb,GACAra,KAAKoa,MAAMC,GAEX0b,GACA/1B,KAAKi2B,qBAAqBF,EAElC,CAEA3b,KAAAA,CAAMC,GACFmB,GAAc,CAAEC,UAAWpa,EAAkBqa,KAAM,CAAE/H,GAAI0G,IAC7D,CAEA4b,oBAAAA,CAAqBF,GACjBva,GAAc,CAAEC,U1DlIK,wB0DkIqBC,KAAM,CAAE/H,GAAIoiB,IAC1D,CAEAF,KAAAA,GACU,MACFK,YAAAA,EAAc,GACdC,cAAAA,EAAgB,GAChBC,kBAAAA,EAAoB,GACpBhS,kBAAAA,EAAoB,GACpBiS,wBAAAA,EAA0B,GAC1BnS,cAAAA,EACAvjB,MAAAA,EACA0Z,SAAAA,EAAW,GACXic,qBAAAA,EAAuB,GACvBC,SAAAA,EAAW,IACXv2B,KAAKjB,MAEHqc,EAAW,CACbzH,GAAIuiB,EACJt1B,KAAMu1B,EACNlmB,SAAUmmB,EACVzY,SAAUyG,GAGRoS,EAAanc,EAAW,QAAU,MAElCoc,EAAc,GAAGH,IADVt2B,KAAK2uB,KAAO3uB,KAAK2uB,KAAOhuB,IAE/B+1B,EAAgBL,EAA0B,MAAMA,IAA4B,GAG9EM,IAAAA,EAF0Br3B,KAAKC,MAAMS,KAAKjB,OAAO63B,kBAAoB,SAGnE,GAAGJ,EAAaE,OACZ12B,KAAKjB,MAAMw2B,SAAS5V,MAAM,KAAK,QAC7B8W,IACN,GAAGD,EAAaE,OAAmBD,IAOzC,GALAxX,GAAiB,CACb7D,SAAAA,EACA8D,SAAUyX,IAGVtc,GAAYkc,EAAU,CACtB,MAAMpqB,EAAU7M,KAAKC,MAAMg3B,GACrBM,EACF3S,EAActd,QAAQ,UAAcsd,EAAcvE,MAAM,OAAO,GAAKuE,EACxExG,GAA0B,CACtBC,SAAU3d,KAAKjB,MAAMqlB,mBAAqB,GAC1CxG,WAAYiZ,EAAcj0B,cAAgB,cAC1C+T,gBAAiBxK,EAAQwK,gBACzBkH,kBAAmB1R,EAAQ0R,kBAC3BC,YAAa3R,EAAQ2C,KACrBiP,WAAY5R,EAAQ4R,WACpBtK,SAAUtH,EAAQsH,SAClBqD,SAAU3K,EAAQ2K,SAClBwG,YAAauZ,EAAgB,eAErC,CACJ,CAEApH,wBAAAA,CAAyB7uB,GACR,SAATA,GACAZ,KAAKG,SAEI,aAATS,IACAZ,KAAKK,UAAUC,IAAI,WACnBw2B,YAAW,KACFz2B,KAAAA,UAAUuc,OAAO,UAAS,G1D3ItB,M0D8IrB,CAEAgZ,YAAAA,GACSlZ,KAAAA,iBAAiB,QAAS1c,KAAK60B,iBACxC,CAEAc,eAAAA,GACS9Y,KAAAA,oBAAoB,QAAS7c,KAAK60B,iBAC3C,CAEAtwB,oBAAAA,GACIvE,KAAK21B,iBACT,EAGJ30B,eAAeC,IAAI,WAAaD,eAAeE,OAAO,SAAU0zB,ICxOzD,MAAMmC,GAAkB,SAGlBC,GAAW,CACpB,CACIp2B,KAAM,QACNq2B,MAAO,CACH,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClF,IAAK,IAAK,IAAK,IAAK,IAAK,MAGjC,CACIr2B,KAAM,SACNq2B,MAAO,CACH,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACjF,KAAM,KAAM,KAAM,IAAM,KAAM,KAAM,IAAM,KAAM,MAGxD,CACIr2B,KAAM,QACNq2B,MAAO,CAAC,IAAK,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,OAE3D,CACIr2B,KAAM,UACNq2B,MAAO,CACH,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,qDCZhG,MAAMC,WAAYr3B,YACdC,WAAAA,WAUAq3B,EAAAn3B,KAAAo3B,IA8CAD,EAAAn3B,KAAAq3B,IAyBAF,EAAAn3B,KAAAs3B,IAKAH,EAAAn3B,KAAAu3B,IAkBAJ,EAAAn3B,KAAAw3B,IAoBAL,EAAAn3B,KAAAy3B,IAgBAN,EAAAn3B,KAAA03B,GA1IA,CAEAx3B,iBAAAA,GACSnB,KAAAA,MAAQP,EAAYwB,KAAKvB,YAC9BuB,KAAKG,SACLw3B,EAAA33B,KAAKo3B,GAAAQ,IAALx0B,KAAApD,KACJ,CAaAG,MAAAA,GACU,MACF03B,KAAAA,EAAO,GACP/hB,YAAAA,EAAc,GACdgiB,SAAAA,EAAWf,GACXgB,cAAAA,EAAgB,IAChB/3B,KAAKjB,MAEI,KAAT84B,IAKJ73B,KAAK83B,SAAWA,EAChB93B,KAAK63B,KAAOA,EAAOF,EAAA33B,KAAKq3B,GAAAW,IAAL50B,WAEnBu0B,EAAA33B,KAAKy3B,GAAAQ,IAAL70B,KACApD,MAAAA,KAAKK,UAAUC,IAAI,UACnBN,KAAKQ,UAAY,uCAEPR,KAAK83B,WAAaf,GAAkB,SAAW,QAAQ/2B,KAAK63B,4BAC5C,KAAhB/hB,EAAqB,QAAQA,KAAiB,qDDvDjC,WCwDb9V,KAAK83B,SAA+B,iBAAmB,uBACrC,KAAlBC,EAAuB,iBAAiBA,IAAkB,uDAIpE/3B,KAAKk4B,YAAcl4B,KAAKklB,aAAa,SAASvF,MAAM,KAAK,GAGhC,KAArB3f,KAAKk4B,aACLl4B,KAAKm4B,kBAAkB93B,UAAUC,IAAIN,KAAKk4B,YAAc,YAEhE,EA5CAd,GAAA,IAAAgB,QAAAR,GAAaS,WACLr4B,KAAK83B,WAAaf,IAOtBjwB,EAAS9G,KAAKm4B,kBAAmB,MAAO,GAAGn4B,KAAK63B,OAAQ73B,KAAK63B,KACjE,EAqCAR,GAAA,IAAAW,QAAAA,GAAiBM,WACP,MAAEC,aAAAA,EAAcC,YAAAA,EAAaC,aAAAA,EAAcC,SAAAA,GAAW,GAAS14B,KAAKjB,MAE1E,GAAiB,UAAb25B,EACO,MAAA,GAGX,IAAIC,EAAQ34B,KAAK44B,YAEbJ,GAAAA,GAA+B,KAAhBA,IACfG,EAAQ7wB,OAAO0wB,IAGfC,GAAiC,KAAjBA,EAAqB,CACrC,MAAOI,EAAGjK,GAAK2J,EAAa5Y,MAAM,KAClCgZ,EAAQ5yB,KAAKyP,MAAO1N,OAAO2wB,GAAgBI,EAAKjK,EACpD,CAEA,IAAIkK,EAAanB,EAAA33B,KAAKs3B,GAAAyB,IAAL31B,KAAqBu1B,KAAAA,GAI/B,MAAA,aAFiBhB,EAAA33B,KAAKu3B,GAAAyB,IAAL51B,KAAyB01B,KAAAA,cAEFA,eACnD,EAEAxB,GAAA,IAAAc,QAAAW,GAAeE,SAACN,GACN,MAAE9zB,iBAAAA,GAAqBC,OACtBD,OAAAA,EAAmB,EAAY,EAAR8zB,EAAYA,CAC9C,EAEApB,GAAA,IAAAa,QAAAY,GAAmBE,SAACP,GACV,MAAEQ,WAAAA,EAAYC,SAAAA,GAAazB,EAAA33B,KAAKw3B,GAAA6B,IAALj2B,KAAkBu1B,KAAAA,GAE/CQ,GAAAA,EACA,OAAOA,EAAWv4B,KACf,CACH,IAAI04B,EAAWF,EAAS,GAAGG,KACvBC,EAAU,KACdJ,OAAAA,EAAS31B,SAAQic,IACTA,EAAK6Z,MAAQD,IACbA,EAAW5Z,EAAK6Z,KAChBC,EAAU9Z,EAAAA,IAGX8Z,EAAQ54B,IACnB,CACJ,EAEA42B,GAAA,IAAAY,QAAAiB,GAAYI,SAACd,GACLQ,IAAAA,EAAa,KACbC,EAAW,GACfpC,OAAAA,GAAS0C,OAAMC,IACX,MAAMC,EAAQD,EAAQ1C,MAAMt4B,MAAKk7B,GAAMA,GAAMlB,IAE7C,GAAIiB,EAAO,CACP,GAAIA,IAAUjB,EACVQ,OAAAA,EAAaQ,GACN,EAGXP,EAAS/uB,KAAK,CAAEzJ,KAAM+4B,EAAQ/4B,KAAM24B,KAAMK,EAAQjB,GACtD,CAEO,OAAA,CAAA,IAEJ,CAAEQ,WAAAA,EAAYC,SAAAA,EACzB,EAEA3B,GAAA,IAAAQ,QAAAA,GAAiB6B,WACP,MACFvB,aAAAA,EACAwB,WAAAA,EACAC,wBAAAA,EACAC,uBAAAA,EACAC,cAAAA,GACAl6B,KAAKjB,MAET44B,EAAA33B,KAAK03B,GAAAyC,IAAL/2B,UAAqB,uBAAwBm1B,GAC7CZ,EAAA33B,KAAK03B,GAAAyC,IAAL/2B,KAAApD,KAAqB,qBAAsB+5B,GAC3CpC,EAAA33B,KAAK03B,GAAAyC,IAAL/2B,KAAApD,KAAqB,kCAAmCg6B,GACxDrC,EAAA33B,KAAK03B,GAAAyC,IAAL/2B,KAAqBpD,KAAA,iCAAkCi6B,GACvDtC,EAAA33B,KAAK03B,GAAAyC,IAAL/2B,KAAqBpD,KAAA,iCAAkC,IAAMk6B,EAAgB,IACjF,EAEAxC,GAAA,IAAAU,QAAA+B,GAAeC,SAACx5B,EAAMyF,IACbA,GAAmB,gBAAVA,GAIdrG,KAAKuO,MAAM8rB,YAAYz5B,EAAMyF,EACjC,EAGJrF,eAAeC,IAAI,WAAaD,eAAeE,OAAO,SAAUg2B,ICvKhE,MAAMoD,WAAaz6B,YACfC,WAAAA,GACIC,QACAC,KAAK2uB,KAAO3uB,KAAKQ,UACjBR,KAAK60B,iBAAmB70B,KAAK80B,YAAYjT,KAAK7hB,MAC9CA,KAAKmP,OAASD,KACdlP,KAAKwP,SAAWH,IACpB,CAEAnP,iBAAAA,GACIF,KAAKjB,MAAQ,IACNP,EAAYwB,KAAKvB,YACpB4R,gBAAiBrQ,KAAKyjB,aAAa,yBAEvCzjB,KAAKG,SACLH,KAAKu6B,iBACLv6B,KAAKw6B,YACT,CAEAr6B,MAAAA,GACU,MACF4kB,KAAAA,EAAO,QACPjkB,MAAAA,EAAQ,OACR2F,KAAAA,EAAO,GACP2uB,WAAAA,EAAa,GACbD,UAAAA,EAAY,GACZnf,MAAAA,EAAQ,GACRykB,UAAAA,EAAY,IACZz6B,KAAKjB,MAGTgmB,GAAQ/kB,KAAKiH,aAAa,OAAQ8d,GAClCjkB,GAASd,KAAKiH,aAAa,QAASnG,GACpCkV,GAAShW,KAAKiH,aAAa,QAAS+O,GACpCykB,GAAaz6B,KAAKiH,aAAa,YAAawzB,GAC5CtF,GAAan1B,KAAKiH,aAAa,YAAakuB,GAC5CC,GAAcp1B,KAAKiH,aAAa,aAAcmuB,GAEjC,KAAT3uB,EACAzG,KAAK06B,eAEL16B,KAAKuK,aAGTvK,KAAKyG,KAAOzG,KAAKm4B,iBACrB,CAEA5tB,UAAAA,GACU,MACF5J,MAAAA,EACAqkB,UAAAA,EAAY,GACZ2V,eAAAA,EAAiB,GACjBrF,aAAAA,EAAe,QACfsF,mBAAAA,EAAqB,GACrBxF,WAAAA,EAAa,GACbpf,MAAAA,EAAQ,GACRykB,UAAAA,EAAY,GACZtF,UAAAA,EAAY,GACZpC,SAAAA,EAAW,GACX8H,QAAAA,EAAU,IACV76B,KAAKjB,MACL,IAAE0H,KAAAA,GAASzG,KAAKjB,MAEpB,MAAM4vB,EAAO3uB,KAAK2uB,KAAO3uB,KAAK2uB,KAAOhuB,EAEjC8F,IACAA,EAAOA,EAAKI,QAAQ,WAAY7G,KAAKmP,QACrC1I,EAAOA,EAAKI,QAAQ,SAAU7G,KAAKwP,WAGvCxP,KAAKQ,UAAY,mCAELiG,mBACW,SAAjB6uB,EAA0B,kBAAoB,mBAE3B,SAAjBA,GAAkD,KAAvBsF,EACrB,qBAAqBA,KACrB,mBAERD,GAAkB,mBAAmBA,qBACrC3V,EAAY,UAAUA,KAAe,mBACrC2J,EAAO,eAAeA,KAAU,mBACnB,SAAboE,EAAsB,sBAAwB,mBAClC,SAAZ8H,EAAqB,YAAYlM,KAAU,8BAE3CwG,GAAa,kBAAkBA,gCAC/Bnf,GAAS,aAAaA,WAAeykB,6BAC/B9L,yBACNyG,GAAc,kBAAkBA,+BAE1C,CAEAsF,YAAAA,GACU,MACF/5B,MAAAA,EACAg6B,eAAAA,EAAiB,GACjBvF,WAAAA,EAAa,GACbD,UAAAA,EAAY,GACZpC,SAAAA,EAAW,GACX/c,MAAAA,EAAQ,GACRykB,UAAAA,EAAY,GACZI,QAAAA,EAAU,IACV76B,KAAKjB,MAEH4vB,EAAO3uB,KAAK2uB,KAAO3uB,KAAK2uB,KAAOhuB,EAErCX,KAAKQ,UAAY,kCAEXm6B,GAAkB,mBAAmBA,qBACxB,SAAb5H,EAAsB,uBAAyB,mBACnC,SAAZ8H,EAAqB,YAAYlM,KAAU,8BAE3C3Y,GAAS,aAAaA,WAAeykB,uBACrCtF,GAAa,kBAAkBA,sCACzBxG,yBACNyG,GAAc,kBAAkBA,oCAE1C,CAEAmF,cAAAA,GACU,MAAExV,KAAAA,EAAO,QAAS+V,cAAAA,EAAgB,SAAY96B,KAAKjB,MACzD,IAAIg8B,EAAY,GAEhB,OAAQhW,GACJ,IAAK,SACDgW,EAAY,eACZ,MACJ,IAAK,QACDA,EAAY,cACZ,MACJ,IAAK,SACDA,EAAY,cACZ,MAIJ,QACIA,EAAY,cAIE,SAAlBD,IACAC,EAAY,cACZ/6B,KAAKiH,aAAa,YAAa,UAGnCjH,KAAK8N,cAAc,aAAazN,UAAUC,IAAIy6B,EAClD,CAEAjG,WAAAA,IACuC,IAA/B90B,KAAKjB,MAAMsR,iBACXrQ,KAAK61B,QAGH,MACFxb,SAAAA,EAAW,GACX9O,IAAAA,EAAM,GACN4Y,kBAAAA,EAAoB,GACpBD,cAAAA,EAAgB,GAChB8W,WAAAA,GACAh7B,KAAKjB,MAELsb,GAAY9O,EACZvL,KAAKi7B,UAAU5gB,EAAU9O,EAAK4Y,EAAmBD,EAAe8W,GAIhE3gB,GACAra,KAAKoa,MAAMC,EAEnB,CAEAD,KAAAA,CAAMC,GACFmB,GAAc,CAAEC,UAAWpa,EAAkBqa,KAAM,CAAE/H,GAAI0G,IAC7D,CAEA4gB,SAAAA,CAAU5gB,EAAU9O,EAAK4Y,EAAmBD,EAAerM,GACjD,MAAE0e,SAAAA,GAAav2B,KAAKjB,MAa1B,GAXAyc,GAAc,CACVC,U7D/JwB,+B6DgKxBC,KAAM,CACFsf,WAAYnjB,EACZlE,GAAI0G,EACJ9O,IAAKA,EACL4Y,kBAAmBA,EACnBD,cAAeA,KAInBqS,EAAU,CACV,MAAMpqB,EAAU7M,KAAKC,MAAMg3B,GACrBM,EACF3S,EAActd,QAAQ,UAAcsd,EAAcvE,MAAM,OAAO,GAAKuE,EACxExG,GAA0B,CACtBC,SAAU3d,KAAKjB,MAAMqlB,mBAAqB,GAC1CxG,WAAYiZ,EAAcj0B,cAAgB,cAC1C+T,gBAAiBxK,EAAQwK,gBACzBkH,kBAAmB1R,EAAQ0R,kBAC3BC,YAAa3R,EAAQ2C,KACrBiP,WAAY5R,EAAQ4R,WACpBtK,SAAUtH,EAAQsH,SAClBqD,SAAU3K,EAAQ2K,SAClBwG,YAAauZ,EAAgB,eAErC,CACJ,CAEAhB,KAAAA,GACU,MACFK,YAAAA,EAAc,GACdC,cAAAA,EAAgB,GAChBC,kBAAAA,EAAoB,GACpBhS,kBAAAA,EAAoB,GACpBiS,wBAAAA,EAA0B,GAC1B11B,MAAAA,EACA0Z,SAAAA,EAAW,GACXkb,SAAAA,EAAW,GACXrR,cAAAA,EAAgB,GAChBC,kBAAAA,EAAoB,IACpBnkB,KAAKjB,MAEHqc,EAAW,CACbzH,GAAIuiB,EACJt1B,KAAMu1B,EACNlmB,SAAUmmB,EACVzY,SAAUyG,GAGR8W,EAAc7gB,EAAW,QAAU,OACnCsU,EAAO3uB,KAAK2uB,KAAO3uB,KAAK2uB,KAAOhuB,EAE/B+1B,EACFL,GAAuD,IAA5BA,EACrB,MAAMA,IACN,GAENnS,GAAiBC,EACjBvD,GAAauD,EAAmBD,EAAeqR,GAE/CtW,GAAiB,CACb7D,SAAAA,EACA8D,SAAU,GAAGgc,EAAcxE,OAAmB/H,EAAK9K,UAG/D,CAEA2W,UAAAA,GACIx6B,KAAKm7B,eACLn7B,KAAKyG,KAAKiW,iBAAiB,QAAS1c,KAAK60B,iBAC7C,CAEAsG,YAAAA,GACIn7B,KAAKyG,KAAKoW,oBAAoB,QAAS7c,KAAK60B,iBAChD,CAEAtwB,oBAAAA,GACIvE,KAAKm7B,cACT,EAGJn6B,eAAeC,IAAI,YAAcD,eAAeE,OAAO,UAAWo5B,IC7QnD,MAAAc,GACXt7B,WAAAA,CAAY2C,EAAM/D,GACdsB,KAAKq7B,SAAW,IAAIpzB,sBAChBqzB,GAA6Bt7B,KAAKu7B,SAASD,IAC3C,CAAEE,UAAW,CAAC,GAAIC,WAAY,UAGlCz7B,KAAK65B,GAAKp3B,EACVzC,KAAKtB,KAAOA,EAENsB,KAAK65B,cAAc6B,SAIzB17B,KAAKq7B,SAAS9yB,QAAQvI,KAAK65B,GAC/B,CAQA0B,QAAAA,CAASI,GACLA,EAAYl4B,SAAQm4B,IACXA,EAAWxzB,iBAIhBpI,KAAK61B,MAAM+F,GACX57B,KAAKq7B,SAAShzB,UAAUuzB,EAAWtzB,QAAM,GAEjD,CAEAutB,KAAAA,GAEQ,wBAAyB/wB,OACzBA,OAAO+2B,qBAAoB,IAAM77B,KAAK87B,aAEtCh3B,OAAOgyB,YAAW,IAAM92B,KAAK87B,YAAY,EAEjD,CAEAA,QAAAA,IACS97B,KAAKtB,KAAKiV,IAA6B,OAApB3T,KAAKtB,KAAKiV,IAAsC,KAApB3T,KAAKtB,KAAKiV,IAG9D6K,GAAc,IAAKxe,KAAKtB,MAC5B,EC9CW,SAAAq9B,GAAUt5B,EAAM2Y,GAC3B,MAAM4gB,EAAW,IAAIC,GAAax5B,EAAM2Y,GAEjC,MAAA,CACH8gB,QAASA,KACAF,EAASG,SAASC,2BACnBJ,EAASE,SAAO,EAIhC,CAEA,MAAMD,WAAqBb,GACvBt7B,WAAAA,CAAY2C,EAAM/D,GACR+D,MAAAA,GACNzC,KAAKtB,KAAOA,CAChB,CAEAo9B,QAAAA,GACU3c,MAAAA,EAAcjZ,EAAkBlG,KAAKtB,MACvCygB,I5DyXiBkd,CAAC18B,GACS,IAA5B+e,OAAOC,KAAKhf,GAAKY,O4D1XA87B,CAAcld,IAC9BX,GAAc,IAAKW,GAE3B,ECvBJ,MAAMmd,WAAkBz8B,YACpBC,WAAAA,WAEIE,KAAK2uB,KAAO3uB,KAAKQ,SACrB,CAEAN,iBAAAA,GACSnB,KAAAA,MAAQ,IAAIiB,KAAKvB,YAAYQ,QAAO,CAACC,EAAKC,KACpC,IAAKD,EAAK,CAACC,EAAKN,UAAWM,EAAKC,aACxC,CAAE,GACLY,KAAKG,SACLH,KAAKu8B,eACLv8B,KAAKw8B,cACT,CAEAD,YAAAA,GACU,MACFrG,YAAAA,EAAc,KACdC,cAAAA,EAAgB,KAChBC,kBAAAA,EAAoB,KACpBhS,kBAAAA,EAAoB,MACpBpkB,KAAKjB,MACTg9B,GAAa/7B,KAAM,CACf2T,GAAIuiB,EACJt1B,KAAMu1B,EACNlmB,SAAUmmB,EACVzY,SAAUyG,GAElB,CAEAoY,YAAAA,GACU3C,MAAAA,EAAK75B,KAAK8N,cAAc,cAC9B,IAAK+rB,EACD,OAGE9yB,MAAAA,EAAM/G,KAAKy8B,cACjB,IAAK11B,EACD,OAGE,MAAE21B,UAAAA,GAAc18B,KAAKjB,MACT,UAAd29B,EAKJ51B,EACI+yB,EACA,QACA,yBAAyB9yB,OAAS8yB,EAAG3U,aAAa,UAAY,KAC9Dne,GARA8yB,EAAG5yB,aAAa,QAAS,yBAAyBF,KAU1D,CAEA01B,WAAAA,GACU,MACFE,kBAAAA,EAAoB,GACpBC,kBAAAA,EAAoB,GACpBC,mBAAAA,EAAqB,GACrBC,kBAAAA,EAAoB,IACpB98B,KAAKjB,MAET,IAAIgI,EAAM,GACV,OAAIuD,EAAe5F,GAAGK,QAAU43B,EAC5B51B,EAAM41B,EACCryB,EAAe5F,GAAGO,QAAU23B,EACnC71B,EAAM61B,GACEtyB,EAAe5F,GAAGS,QAAUmF,EAAe5F,GAAGO,SAAW63B,EACjE/1B,EAAM+1B,GAELxyB,EAAe5F,GAAGQ,SAAWoF,EAAe5F,GAAGS,QAAUmF,EAAe5F,GAAGO,SAC5E43B,IAEA91B,EAAM81B,GAGH91B,CACX,CAEA5G,MAAAA,GACU,MACFupB,OAAAA,EAAS,GACTwL,SAAAA,EACA6H,iBAAAA,EAAmB,GACnBC,UAAAA,EAAY,GACZC,cAAAA,EAAgB,GAChBtO,KAAAA,GACA3uB,KAAKjB,MAGT,IAAIm+B,EAAkB,QACL,cAAbhI,EACAl1B,KAAKiH,aAAa,WAAYi2B,GAE9BA,EAAkBhI,EAGtBl1B,KAAKQ,UAAY,kDAEAw8B,iCACGE,8BACHxT,sCAEPqT,GAAoB/8B,KAAKm9B,aAAen9B,KAAKo9B,WAAa,4CACrCH,4BACjBtO,mDAGlB,CAEAwO,UAAAA,GACU,MAAER,kBAAmBrzB,EAAGuzB,mBAAoBnO,EAAGoO,kBAAmB9T,GAAMhpB,KAAKjB,MACnF,QAASuK,KAAOolB,KAAO1F,CAC3B,CAEAoU,QAAAA,GACU,MAAEL,iBAAAA,EAAmB,IAAO/8B,KAAKjB,MAEhC,MAAA,2BAA2Bg+B,GAAsC,uBAChE/8B,KAAKm9B,aAAe,gCAAkC,IAClE,EAGJn8B,eAAeC,IAAI,iBAAmBD,eAAeE,OAAO,eAAgBo7B,IC5H5E,MAAMe,WAAax9B,YACfC,WAAAA,GACIC,QACAC,KAAK2uB,KAAO3uB,KAAKQ,UACjBR,KAAKs9B,SAAW,IACpB,CAEA,6BAAWpO,GACA,MAAA,CAAC,WAAY,UACxB,CAEAhvB,iBAAAA,GACIF,KAAKjB,MAAQP,EAAYwB,KAAKvB,YAC9BuB,KAAKu9B,aAAev9B,KAAKw9B,cACzBx9B,KAAKG,SACLH,KAAKu8B,cACT,CAEAA,YAAAA,GACU,MAAErG,YAAAA,EAAaC,cAAAA,EAAe/R,kBAAAA,EAAmBgS,kBAAAA,GAAsBp2B,KAAKjB,MAE5E0H,EAAOzG,KAAK8N,cAAc,SAE5BrH,IACAA,EAAKg3B,QAAU,KACXre,GAAgB,CACZF,SAAUlf,KAAKu9B,aACf5pB,GAAIuiB,EACJt1B,KAAMu1B,EACNxY,SAAUyG,EACVnU,SAAUmmB,GACb,EAGb,CAEAoH,WAAAA,GACU,MAAEvQ,QAAAA,GAAYjtB,KAAKjB,MACzB,OAAQiB,KAAK2uB,KAAO3uB,KAAK2uB,KAAO1B,GAASpJ,MAC7C,CAEA1jB,MAAAA,GACU,MACF8V,KAAAA,EAAO,GACPnV,MAAAA,EAAQ,GACR48B,iBAAAA,EAAmB,GACnBC,gBAAAA,EAAkB,SAClBC,QAAAA,EAAU,OACVC,QAAAA,EAAU,QACVC,SAAAA,EAAW,QACXnqB,GAAAA,EACA7E,KAAAA,EAAO,YACP9O,KAAKjB,MAEH4vB,EAAO3uB,KAAKu9B,aAGlB,MAAMQ,EAA0B,SAAZF,EAAqB,UAAY,GAC/CG,EAA4B,SAAbF,EAAsB,WAAa,GAClDG,EAAU,kBAAoBtqB,G9DoCrC,SAAkBxP,GACjB+5B,IACAr4B,EADAq4B,EAAO,EAGX,IAAK/5B,EACM+5B,OAAAA,EAEX,IAAKr4B,EAAI,EAAGA,EAAI1B,EAAI5D,OAAQsF,IAEhBq4B,GAAAA,GAAQ,GAAKA,EADf/5B,EAAIg6B,WAAWt4B,GAEbq4B,GAAA,EAEZ,MAAO,MAAQA,CACnB,C8DjDkDE,CAASzP,IAEnD3uB,KAAKQ,UAAY,8BACEsO,yBAA4BmvB,kBAAwBtP,KAAQgP,MAAoBI,KAAeC,wCAC/EC,wBAEvBhoB,GACA,kBAAkBA,sDAIlBnV,GACA,6CAA6CA,kDAI7C48B,GACA,0BACgB,SAAZE,EAAqB,UAAY,oCACHF,2GAGmB/O,MAASA,2CAI1E3uB,KAAKs9B,SAAWt9B,KAAKq+B,qBAAqB,SAAS,EACvD,CAEA5O,wBAAAA,CAAyB7uB,EAAMuX,EAAGmmB,GACzBt+B,KAAKs9B,WAIG,aAAT18B,EACAZ,KAAKs9B,SAASQ,SAAwB,SAAbQ,EACT,YAAT19B,IACPZ,KAAKs9B,SAASO,QAAuB,SAAbS,GAEhC,ECtGG,SAASC,GAA0Bh8B,EAAMi8B,GACtCC,MAAAA,EAASl8B,EAAKgB,WAGpB,GAAIk7B,IAFSz6B,SAASq6B,qBAAqB,QAAQ,GAG/C,OAGJ,MAAMK,EAAWD,EAAO5U,SACxB,IAAA,MAAW8U,KAAWD,EACdC,IAAYp8B,IACZi8B,EACMG,EAAQ13B,aAAa,cAAeu3B,GACpCG,EAAQC,gBAAgB,gBAGtCL,GAA0BE,EAAQD,EACtC,CAEO,SAASK,GAAQvwB,EAAGurB,EAAIiF,GACtBjF,EAAGjP,SAAStc,EAAEhG,QAOfuxB,EAAGkF,YAAczwB,EAAEhG,OANfuxB,EAAGkF,cAAgBlF,EAAGmF,eACtBF,EAAOjF,EAAGoF,cAAcC,QAAUrF,EAAGmF,eAAeE,QAEpDJ,EAAOjF,EAAGmF,eAAeE,QAAUrF,EAAGoF,cAAcC,OAKhE,CAEO,SAASC,GAAyBtF,GAC/BuF,MAAAA,EAAYvF,EAAGzT,iBAAiB,2DACtCyT,EAAGmF,eAAiBI,EAAU,GAC9BvF,EAAGoF,cAAgBG,EAAUA,EAAU7+B,OAAS,GAChDs5B,EAAGkF,YAAclF,EAAGmF,cACxB,CDqEAh+B,eAAeC,IAAI,YAAcD,eAAeE,OAAO,UAAWm8B,IE/FlE,MAAMgC,WAAiBx/B,YACnBC,WAAAA,GACIC,QACAC,KAAKmrB,QAAS,EACdnrB,KAAK+yB,SAAW,KAChB/yB,KAAKs/B,cAAgB,KACrBt/B,KAAKu/B,eAAiBv/B,KAAKu/B,eAAe1d,KAAK7hB,KACnD,CAEAE,iBAAAA,GACSnB,KAAAA,MAAQP,EAAYwB,KAAKvB,YAC9BuB,KAAKK,UAAUC,IAAI,eACnBN,KAAKG,QACT,CAEAA,MAAAA,GACIH,KAAKs/B,cAAgB,KACf,MAAE3+B,MAAAA,EAAQ,GAAI6+B,eAAAA,GAAmBx/B,KAAKjB,MACxC,IAAEuX,QAAAA,EAAU,GAAImpB,WAAAA,EAAYC,aAAAA,GAAiB1/B,KAAKjB,MAGtDuX,EAAUA,EAAQ5V,KAAI2W,IAClB,MAAMjJ,EAAU,IAAKiJ,GACrBjJ,OAAAA,EAAQyvB,QAAUzvB,EAAQyvB,SAAWzvB,EAAQ2kB,SAEtC3kB,CAAAA,IAGXpO,KAAKgmB,cAELhmB,KAAKQ,UAAY,+IAIQR,KAAKmrB,wCACRxqB,KAAS2V,GAAWtW,KAAK2/B,sCAClB,KAAnBH,EAAwB,qBAAqBA,KAAoB,iFACR7+B,2GAErD8+B,EAAa,SAASA,KAAgB,kCAC/BnpB,GAAWtW,KAAK2/B,0HAGAD,EAAe,OAAOA,KAAkB,gGAG3DppB,GAAWA,EAAQ/V,OAAS,GAAKP,KAAK4/B,mGAKxD5/B,KAAKs/B,cAAgBt/B,KAAK8N,cAAc,wBACxC9N,KAAK6/B,mBAAqB7/B,KAAK8N,cAAc,+BAC7C9N,KAAK8/B,aAAe9/B,KAAK8N,cAAc,4BACvC9N,KAAK+/B,eAAiB//B,KAAK8N,cAAc,8BACpC9N,KAAK+yB,WACN/yB,KAAK+yB,SAAWzc,EAAQ,IAE5B6oB,GAAyBn/B,KAAK8/B,cAC9B9/B,KAAK6iB,WACT,CAGA+c,aAAAA,GACU,MACFj/B,MAAAA,EACAq/B,uBAAAA,EACAC,sBAAAA,EACAC,YAAAA,EACA5pB,QAAAA,EAAU,IACVtW,KAAKjB,MACFuX,OAAAA,EACF5V,KAAI2W,GACM,qEAEU/M,EAAe5F,GAAGK,OAAS,cAAgB,8FAEtCpE,EAAQ,IAAM0W,EAAO1W,0CAC1B0W,EAAO1D,IAAM0D,EAAO1W,kDACZ0W,EAAOwmB,qCACtBxmB,EAAO5Q,KAAO,cAAc4Q,EAAO5Q,QAAU,+BAE3C4Q,EAAOwmB,aAC0B3gB,IAA3B8iB,GACA,qBAAqBA,UACK9iB,IAA1B+iB,GACA,qBAAqBA,8BAEjCC,GAAe,kBAAkBA,mBAA6B7oB,EAAO1W,gEAI9EI,KAAK,GACd,CAGA4+B,cAAAA,GACU,MAAErpB,QAAAA,EAAU,IAAOtW,KAAKjB,MAI9B,MAAO,GAHeuX,EAAQ3X,MAC1B0Y,IAA6B,IAAnBA,EAAOwmB,UAAwC,IAApBxmB,EAAO0b,YAEvBpyB,OAAS2V,EAAQ,IAAI3V,OAClD,CAEAkiB,SAAAA,GACSgS,KAAAA,iBAAmB70B,KAAK80B,YAAYjT,KAAK7hB,MAC9CA,KAAKmgC,sBAAwBngC,KAAKogC,iBAAiBve,KAAK7hB,MACxDA,KAAKqgC,uBAAyBrgC,KAAKsgC,kBAAkBze,KAAK7hB,MAC1DA,KAAKugC,WAAavgC,KAAKk/B,MAAMrd,KAAK7hB,MAClCA,KAAKwgC,aAAexgC,KAAK6+B,QAAQhd,KAAK7hB,MACtCA,KAAKygC,YAAczgC,KAAK0gC,OAAO7e,KAAK7hB,MAEpCA,KAAKs/B,cAAc5iB,iBAAiB,QAAS1c,KAAK60B,kBAClD70B,KAAKomB,iBAAiB,6BAA6B3iB,SAAQic,IACvDA,EAAKhD,iBAAiB,QAAS1c,KAAKmgC,sBAAqB,IAE7DngC,KAAK8/B,aAAapjB,iBAAiB,QAAS1c,KAAKqgC,wBACjDv7B,OAAO4X,iBAAiB,QAAS1c,KAAKu/B,eAC1C,CAEAvZ,WAAAA,GACShmB,KAAKs/B,gBAGVt/B,KAAKs/B,cAAcziB,oBAAoB,QAAS7c,KAAK60B,kBACrD70B,KAAKomB,iBAAiB,6BAA6B3iB,SAAQic,IACvDA,EAAK7C,oBAAoB,QAAS7c,KAAKmgC,sBAAqB,IAEhEngC,KAAK8/B,aAAajjB,oBAAoB,QAAS7c,KAAKqgC,wBACpDv7B,OAAO+X,oBAAoB,QAAS7c,KAAKu/B,gBACzCv7B,SAAS6Y,oBAAoBrb,EAAsBxB,KAAKygC,aAC5D,CAEA3L,WAAAA,GACS6L,KAAAA,gBAAgB3gC,KAAKmrB,OAC9B,CAEAmV,iBAAAA,GACItgC,KAAK2gC,gBAAe,EACxB,CAEApB,cAAAA,CAAejxB,GACPtO,KAAKmrB,SAAWnrB,KAAK4qB,SAAStc,EAAEhG,SAChCtI,KAAK2gC,gBAAe,EAE5B,CAEAP,gBAAAA,CAAiB9xB,GACbtO,KAAKmrB,QAAS,EAGVnrB,KAAK+/B,gBACL//B,KAAK+/B,eAAe94B,aAAa,gBAAiB,SAetDjH,KAAK+/B,eAAiBzxB,EAAEhG,OACxBtI,KAAK+/B,eAAe94B,aAAa,gBAAiB,QAGlDjH,KAAKjB,MAAMuX,QAAUtW,KAAKjB,MAAMuX,QAAQ5V,KAAI2W,IAAW,IAAKA,EAAQwmB,SAAS,MAG7E79B,KAAK+yB,SAAW/yB,KAAKjB,MAAMuX,QAAQ3X,MAC/B0Y,GAAUA,EAAO1W,QAAUX,KAAK+/B,eAAe15B,QAEnDrG,KAAK+yB,SAAS8K,SAAU,EACxBvvB,EAAEhG,OAAOkxB,QAAQ,gBAAgBn5B,UAAUC,IAAI,0BAE/CN,KAAK4gC,WAEL5gC,KAAK2gC,gBAAe,GAEpBnlB,GAAc,CACVC,UAAW/Z,EACXga,KAAM,CAAEpF,QAAStW,KAAKjB,MAAMuX,QAASyc,SAAU/yB,KAAK+yB,UACpDrpB,QAAS1J,MAEjB,CAEA4gC,QAAAA,GACU,MAAEjgC,MAAAA,EAAOq/B,uBAAAA,EAAwBC,sBAAAA,GAA0BjgC,KAAKjB,MACjE8gC,KAAAA,mBAAmB54B,aAAa,QAASjH,KAAK+/B,eAAe15B,OAClErG,KAAKs/B,cAAcr4B,aAAa,aAActG,EAAQ,IAAMX,KAAK2/B,kBACjE3/B,KAAK8/B,aAAa1Z,iBAAiB,UAAU3iB,SAAQic,IACjDA,EAAKzY,aAAa,mBAAoBg5B,EAAqB,IAE/DjgC,KAAK+/B,eAAe94B,aAAa,mBAAoB+4B,EACzD,CAEAa,WAAAA,CAAYx6B,EAAOy6B,GAAiB,GAC1B,MAAExqB,QAAAA,EAAU,IAAOtW,KAAKjB,MACxBgiC,EAAczqB,EAAQ3X,MAAK0Y,GAAUA,EAAOhR,QAAUA,IACxD06B,IACA/gC,KAAK+yB,SAAS8K,SAAU,EACxB79B,KAAK+yB,SAAWgO,EAChB/gC,KAAK+yB,SAAS8K,SAAU,GAGxB79B,KAAK+/B,gBACL//B,KAAK+/B,eAAe94B,aAAa,gBAAiB,SAGtDjH,KAAK8/B,aAAa1Z,iBAAiB,UAAU3iB,SAAQic,IAC7CA,EAAKrZ,QAAUrG,KAAK+yB,SAASpyB,QAC7BX,KAAK+/B,eAAiBrgB,EACtB1f,KAAK+/B,eAAe94B,aAAa,gBAAiB,QAAM,IAIhEjH,KAAKK,UAAUC,IAAI,0BAEfN,KAAK+/B,gBACL//B,KAAK4gC,WAGLE,GACAtlB,GAAc,CACVC,UAAW/Z,EACXga,KAAM,CAAEpF,QAAAA,EAASyc,SAAU/yB,KAAK+yB,UAChCrpB,QAAS1J,MAGrB,CAEA2gC,cAAAA,CAAet6B,GACXA,EAAQrG,KAAKusB,OAASvsB,KAAKsa,QAC3Bta,KAAKmrB,QAAUnrB,KAAKmrB,OAGpBnrB,KAAKghC,kBACLhhC,KAAKs/B,cAAcr4B,aAAa,gBAAiBjH,KAAKmrB,OAC1D,CAEA6V,eAAAA,GAESlB,KAAAA,aAAa74B,aAAa,aAAcjH,KAAKmrB,QAElDoT,GAA0Bv+B,KAAK8/B,aAAc9/B,KAAKmrB,OACtD,CAEAoB,IAAAA,GAGSuT,KAAAA,aAAapjB,iBAAiB,gBAAiB1c,KAAKugC,YACzDv8B,SAAS0Y,iBAAiB,UAAW1c,KAAKwgC,cAC1Cx8B,SAAS0Y,iBAAiBlb,EAAsBxB,KAAKygC,aACrDzgC,KAAKs/B,cAAcj/B,UAAUC,IAAI,UACjCN,KAAKihC,cAAgBj9B,SAASk9B,aAClC,CAEA5mB,KAAAA,GAGIta,KAAK8/B,aAAapjB,iBAAiB,gBAAiB1c,KAAKugC,YACzDv8B,SAAS6Y,oBAAoB,UAAW7c,KAAKwgC,cAC7Cx8B,SAAS6Y,oBAAoBrb,EAAsBxB,KAAKygC,aACxDzgC,KAAKs/B,cAAcj/B,UAAUuc,OAAO,UACpC5c,KAAKs/B,cAAcr4B,aAAa,iBAAiB,EACrD,CAEAi4B,KAAAA,GACSY,KAAAA,aAAajjB,oBAAoB,gBAAiB7c,KAAKugC,YACxDvgC,KAAKmrB,QAAUnrB,KAAK+/B,gBACpB//B,KAAK+/B,eAAeb,QACpBl/B,KAAK8/B,aAAaf,YAAc/+B,KAAK+/B,gBAErC//B,KAAKs/B,cAAcJ,OAE3B,CAEAL,OAAAA,CAAQvwB,GAEJuwB,GAAQvwB,EAAGtO,KAAK8/B,cAAchB,EAClC,CAEA4B,MAAAA,CAAOpyB,GACH,OAAQA,EAAElI,KACN,IAAK,SACDpG,KAAK2gC,gBAAe,GACpB,MACJ,IAAK,UACC5a,EAAAA,iBACF/lB,KAAKmhC,aACL,MACJ,IAAK,YACCpb,EAAAA,iBACF/lB,KAAKohC,aACL,MACJ,IAAK,OACL,IAAK,SACCrb,EAAAA,iBACF/lB,KAAKqhC,cACL,MACJ,IAAK,MACL,IAAK,WACCtb,EAAAA,iBACF/lB,KAAKshC,aAKjB,CAEAH,UAAAA,GACI,GAAInhC,KAAK8/B,aAAaf,cAAgB/+B,KAAK8/B,aAAad,eAAgB,CAC9DuC,MAAAA,EAAcvhC,KAAK8/B,aAAaf,YAAYyC,uBAClDD,EAAYrC,QACZl/B,KAAK8/B,aAAaf,YAAcwC,CACpC,CACJ,CAEAH,UAAAA,GACI,GAAIphC,KAAK8/B,aAAaf,cAAgB/+B,KAAK8/B,aAAab,cAAe,CAC7DwC,MAAAA,EAAczhC,KAAK8/B,aAAaf,YAAY2C,mBAClDD,EAAYvC,QACZl/B,KAAK8/B,aAAaf,YAAc0C,CACpC,CACJ,CAEAJ,WAAAA,GACQrhC,KAAK8/B,aAAaf,cAAgB/+B,KAAK8/B,aAAad,iBACpDh/B,KAAK8/B,aAAad,eAAeE,QACjCl/B,KAAK8/B,aAAaf,YAAc/+B,KAAK8/B,aAAad,eAE1D,CAEAsC,UAAAA,GACQthC,KAAK8/B,aAAaf,cAAgB/+B,KAAK8/B,aAAab,gBACpDj/B,KAAK8/B,aAAab,cAAcC,QAChCl/B,KAAK8/B,aAAaf,YAAc/+B,KAAK8/B,aAAab,cAE1D,CAEA16B,oBAAAA,GACIvE,KAAKgmB,aACT,EAGJhlB,eAAeC,IAAI,gBAAkBD,eAAeE,OAAO,cAAem+B,ICxV1E,MAAMsC,WAAwBvG,GAC1Bt7B,WAAAA,CAAY2C,EAAM/D,EAAM0O,EAAUilB,EAAOpiB,GACrClQ,MAAM0C,GACNzC,KAAKyC,KAAOA,EACZzC,KAAKtB,KAAOA,EACZsB,KAAKoN,SAAWA,EAChBpN,KAAKqyB,MAAQA,EACbryB,KAAKiQ,SAAWA,CACpB,CAEA,cAAM6rB,GAEF,MAAM8F,EACF5hC,KAAKyC,KAAK+2B,QAAQ,6BAA6BtU,aAAa,4BAC5D,EACED,EACFjlB,KAAKyC,KAAK+2B,QAAQ,wBAAwBtU,aAAa,sBAAwB,EAC7E5E,EAAOtgB,KAAKyC,KAAK+2B,QAAQ,oBAAoBtU,aAAa,kBAAoB,GAE/D,SAAjB0c,SACMvhB,GAAkB4E,EAAc3E,EAAMtgB,KAAKtB,KAAKiV,GAE9D,CAEA,oBAAMkuB,CAAe/sB,GACjB,aAAchQ,OAAOg9B,cAAcpjC,KAAKqjC,cAAcC,cAAcxuB,WAAW7U,MAC3E8U,GAAYA,EAASE,KAAOmB,GAEpC,CAEA,8BAAMmtB,CAAyBr2B,GAC3B,MAAMP,EAAiC,kBAUjCmI,EAAa,IACX5H,EAAYs2B,UAAY,MACxBt2B,EAAYu2B,SAAW,MACvBv2B,EAAYonB,QAAU,MACtBpnB,EAAYE,cAAgB,IAepC,aAZ4Bs2B,QAAQljC,IAChCsU,EAAW9S,KAAIqM,MAAM+H,IACjB,MAAMutB,QAAqBriC,KAAK6hC,eAAe/sB,GAE3C,OAACutB,GApBgBvtB,CAAAA,QACzBA,EAAWlO,QAAQyE,GAmBMi3B,CAAqBxtB,GAjBxBA,CAAAA,GACtBA,EAAW/M,OACP+M,EAAWlO,QAAQyE,GACfA,IAeOM,CAAkBmJ,GAGtButB,EAAazhC,IAAAA,MAIPG,KAAK,IAC9B,CAEA,mBAAMwhC,CAAc32B,GACXA,OAAAA,EAID9G,OAAOg9B,WACA9hC,KAAKiiC,yBAAyBr2B,GAGlCw2B,QAAQljC,IACX0M,EAAY42B,gBAAgB9hC,KAAI+hC,GAC5B39B,OAAO0G,KAAKC,UAAUi3B,YAAYD,MAExCt0B,MAAKqF,IACH,MAAMwM,EAAc,GACpB,IAAA,MAAWvM,KAAYD,EAAY,CAC/B,MAAMmvB,EAAOlvB,EAASkvB,KACtB,IAAKA,EACD,SAGCA,EAAK/7B,QAAQ,eACb+7B,EAAK/7B,QAAQ,aACb+7B,EAAK/7B,QAAQ,uBACb+7B,EAAK/7B,QAAQ,yBACb+7B,EAAK/7B,QAAQ,oBACb+7B,EAAK/7B,QAAQ,2BACb+7B,EAAK/7B,QAAQ,0BAEdoZ,EAAY3V,KAAKoJ,EAAS7S,KAAKgC,cAEvC,CACOod,OAAAA,EAAYjf,KAAK,IAAG,IA9BpB,EAgCf,CAEA6hC,qBAAAA,CAAsBh3B,EAAaoU,GAC3BvM,IAAAA,EACqB,YAArB7H,EAAYkD,KACZ2E,EAAW,WACiB,cAArB7H,EAAYkD,KACnB2E,EAAW,cACiB,YAArB7H,EAAYkD,OACnB2E,EAAW,YAGf,IAAIwM,EAAc,KACdrU,EAAYE,eACZmU,EAAcrU,EAAYE,aACrBpL,KAAIqd,GjEnHL8kB,SAAW3a,EAAI,IAC3B,OAAOA,EAAE,GAAG6G,cAAgB7G,EAAE/kB,MAAM,EACxC,CiEiHmC0/B,CAAW9kB,EAAW4B,MAAM,KAAK,MACnD5e,KAAK,QAGd,IAAI+hC,EAAe,GACkB,MAAjCl3B,EAAYm3B,oBACZD,EAAel3B,EAAYm3B,kBAAkBhiC,KAAK,MAGtD,MAAMiiC,EAA0B,CAC5B5iB,MAAO,YACP3M,SAAAA,EACAwvB,YAAa,QACbpjB,YAAa,QACbC,YAAalU,EAAY6N,SACzBsG,YAAaza,EAAUsG,EAAYhL,MAAM,GAAGmC,YAC5Cid,YAAAA,EACAC,YAAAA,EACAC,YAAalgB,KAAKwM,UAAUZ,GAAe,UAAY,SACvDk3B,aAAAA,EACAnvB,GAAI/H,EAAY+K,gBAChB/V,KAAM0E,EAAUsG,EAAYiS,mBAAmB,GAAG9a,YAClDiK,MAAOpB,EAAYoB,OAEvB,OAAIhN,KAAKqyB,QACL2Q,EAAwB1iB,KAAOtgB,KAAKqyB,OAEpCryB,KAAKiQ,WACL+yB,EAAwB/yB,SAAW4jB,SAAS7zB,KAAKiQ,WAE9C+yB,CACX,CAKAx2B,SAAAA,CAAUZ,GACN,IAAIjG,EAAuC,IAA9BiG,EAAYa,eAAuBb,EAAYU,aAAe,EAE3E,OAAIV,EAAY2J,QACZ5P,EAASiG,EAAY2J,QACd3J,EAAYa,cAAgB,GAAkC,IAA7Bb,EAAYU,eACpD3G,GAAS,GAGNA,CACX,EC3KJ,MAAMu9B,GAAN,MAAMA,UAAkBrjC,YAGpBK,iBAAAA,GACIF,KAAKuL,KAAOvL,KAAKklB,aAAa,QAAU,IAAIrB,OAC5C7jB,KAAKqyB,MAAQryB,KAAKklB,aAAa,SAC/BllB,KAAKiQ,SAAWjQ,KAAKklB,aAAa,YAClCllB,KAAKgQ,SAAWhQ,KAAKklB,aAAa,YAAc,IAAIrB,OACpD7jB,KAAKsQ,WAAatQ,KAAKklB,aAAa,eAAiB,QACrDllB,KAAKkQ,aAAelQ,KAAKklB,aAAa,iBAAmB,UACzDllB,KAAKmjC,UAAY,YAAYD,EAAUE,mBACvCpjC,KAAKqQ,gBAAkBrQ,KAAKklB,aAAa,qBAAsB,EAE/DllB,KAAKG,SAEAH,KAAKqjC,uBAIVv+B,OAAO0G,KACF83B,YACAn1B,MAAK,KACFnO,KAAKujC,YAAU,IAElBl1B,OAAMC,GAAK7O,QAAQD,MAAM8O,KAEzBtO,KAAKqQ,iBACNrQ,KAAKg8B,WACA7tB,MAAK,SACLE,UAAW5O,QAAQD,MAAM8O,KAEtC,CAEAnO,MAAAA,GACSK,KAAAA,UAAY,iCAAiCR,KAAKmjC,yLAK3D,CAEAE,kBAAAA,GACW,QAAEv+B,OAAO0G,IACpB,CAEA+3B,UAAAA,GACI,IAAKv/B,SAAS+iB,eAAe/mB,KAAKmjC,WAC9B,OAGJ,MAAM7yB,EAAatQ,KAAKsQ,WAExBxL,OAAO0+B,GAAK1+B,OAAO0+B,IAAM,GACzB1+B,OAAO0+B,GAAGn5B,KAAK,CACXsJ,GAAI3T,KAAKmjC,UACTzb,OAAQ,iBACRqa,cAAe,CAAEhjC,MAAO,CAAE0kC,UAAWzjC,KAAKgQ,QAASM,WAAAA,IACnDsO,cAAe,CAAE8kB,WAAW,IAEpC,CAEA,cAAM1H,GACE,IAACh8B,KAAKqjC,qBACN,OAAOjB,QAAQuB,WD9DZ,SAAUlhC,EAAMmJ,EAAawB,EAAUilB,EAAOpiB,GACzD,MAAM+rB,EAAW,IAAI2F,GAAgBl/B,EAAMmJ,EAAawB,EAAUilB,EAAOpiB,EAS7E,CCyDQ2zB,CAAgB5jC,WAFGA,KAAK6jC,iBACP/+B,OAAOA,OAAOuI,OAAOC,KAAKC,WAAWC,UAAUC,IAAIA,IAAIL,SAClCpN,KAAKqyB,MAAOryB,KAAKiQ,SAC3D,CAEA6zB,SAAAA,CAAUv4B,GACN,WAAOA,EAAI3E,QAAQ,SAAkB,KAAO,UAChD,CAEA,oBAAMi9B,GACF,IAAIE,EAAU,KACVj/B,GAAqB,MAArBA,OAAOg9B,aACPiC,QAAgBj/B,OAAOg9B,cAEvBiC,EAAS,CAEHC,MAAAA,EAAU,CADDhkC,KAAK8jC,UAAU9jC,KAAKuL,KACV,kBAAmB,KAAM,YAC9C04B,IAAAA,EAAkB,EAClBvlC,EAAO,KAEX,MAAQA,GAAQulC,EAAkBD,EAAQzjC,OAAS,GAAG,CAC5C6F,MAAAA,EAAM49B,EAAQC,GAEpBvlC,EAAOqlC,EAAQrlC,KAAKqjC,cAAcC,cAAczoB,SAAS5a,MACrDwN,GAAWA,EAAQ/F,KAASpG,KAAKuL,MAGrC04B,GACJ,CAEOvlC,OAAAA,CACX,CAAA,GAAWsB,KAAKqjC,qBACL,aAAM/3B,GAAWtL,KAAKgQ,SAGjCvQ,QAAQD,MAAM,4BAClB,GArGA0kC,EADEhB,GACKE,mBAAmB,GAD9B,IAAMF,GAANiB,GAyGAnjC,eAAeC,IAAI,mBAAqBD,eAAeE,OAAO,iBAAkBgiC,ICpGhF,MAAMkB,GAAkB,uBAExB,MAAMC,WAAqBxkC,YACvBC,WAAAA,GACIC,QACAC,KAAKskC,kBAAoBtkC,KAAKukC,aAAa1iB,KAAK7hB,MAChDA,KAAKwkC,eAAiBxkC,KAAKykC,UAAU5iB,KAAK7hB,KAC9C,CAEAE,iBAAAA,GACSnB,KAAAA,MAAQP,EAAYwB,KAAKvB,YAE9BuB,KAAK0c,iBAAiBjb,EAAoBzB,KAAKskC,mBAC/CtkC,KAAKG,SAELH,KAAK0kC,gBAAkB1kC,KAAKomB,iBAAiB,6BACzCpmB,KAAK0kC,iBACL1kC,KAAK0kC,gBAAgBjhC,SAAQic,IACzBA,EAAKhD,iBAAiB,QAAS1c,KAAKwkC,eAAc,GAG9D,CAEArkC,MAAAA,GACU,MAAEwkC,WAAAA,EAAa,GAAIC,mBAAAA,EAAqB,IAAO5kC,KAAKjB,MAC1DiB,KAAKK,UAAUC,IAAI,qBAEnBN,KAAKQ,UAAY,0CACXR,KAAK6kC,kBAAkBF,mBACvB3kC,KAAK8kC,kBAAkBF,qBAG7B5kC,KAAK+kC,SAAW/kC,KAAK8N,cAAc,eACnC9N,KAAKglC,iBAAmBhlC,KAAK8N,cAAc,yBAI3C9N,KAAKiH,aAAa,cAAe,OACrC,CAEA49B,iBAAAA,CAAkBI,GACd,GAAI36B,EAAe5F,GAAGK,SAAWkgC,GAASA,EAAM1kC,QAAU,EAC/C,MAAA,GAGL7B,MAAAA,EAAOumC,EAAMvkC,KAAI4N,IACnBA,EAAEuvB,QAAUvvB,EAAEykB,SACPzkB,KAGJ,MAAA,qDAESnF,EAAsB,CAAE+2B,YAAa,kBAAmB5pB,QAAS5X,6CAGrF,CAEAomC,iBAAAA,CAAkBhpB,GACR,MAAEopB,4BAAAA,EAA8B,GAAIC,wBAAAA,EAA0B,IAAOnlC,KAAKjB,MAEzE,MAAA,sDACcqlC,qDACkBc,gDACJC,2CACL/7B,EAAW0S,iDAE7B9b,KAAKjB,MAAMqmC,yBAA2B,8BAEtD,CAEAC,gBAAAA,GAGI,GAAIrlC,KAAK+kC,SAAU,CACTO,MAAAA,EAAgBtlC,KAAK+kC,SAASnM,YAE9B2M,EADiBvlC,KAAK8N,cAAc,gBAAgB8qB,YACX0M,EAE/CtlC,KAAKglC,iBAAiBz2B,MAAM8rB,YACxB,QACGkL,EtEsBY,GsEtBf,MAER,CACJ,CAEAhB,YAAAA,CAAaj2B,GACH,MAAEqF,GAAAA,GAAOuI,GAAU5N,GACrBqF,IAAOywB,KAGXpkC,KAAKqlC,mBACL/2B,EAAEhG,OAAOk9B,aACb,CAEAf,SAAAA,CAAU9oB,GACNA,EAAMoK,iBAEN,MAAMtf,EAAOkV,EAAM8pB,cAAcvgB,aAAa,aAC1Cze,IACA3B,OAAO4gC,SAASC,KAAOl/B,GAG3B,MAAM1D,EAAc4Y,EAAM8pB,cAAcvgB,aAAa,SACrD9I,GAAY,CACRkB,YAAa,kBACbC,WAAYxa,GAEpB,CAEAwB,oBAAAA,GACSsY,KAAAA,oBAAoBpb,EAAoBzB,KAAKskC,mBAE9CtkC,KAAK0kC,iBACL1kC,KAAK0kC,gBAAgBjhC,SAAQic,IACzBA,EAAK7C,oBAAoB,QAAS7c,KAAKwkC,eAAc,GAGjE,EAGJxjC,eAAeC,IAAI,sBAAwBD,eAAeE,OAAO,oBAAqBmjC;;;;;;;;;ACtHtF,MAAMuB,GAAcA,CAAC9gC,EAAoCd,EAAoB6hC,KACzE,GAAI/gC,EAAOghC,eACP,OAEJhhC,EAAOghC,gBAAiB,EAefppB,EAAAA,iBAAiB,cAyJ1B,SAA0BpO,GACtB,MAAMhG,EAASgG,EAAEhG,OAEgC,SAA7CA,EAAO4c,aAAa,uBAId5c,EAAAA,EA3Gd,SAAwCuxB,GACpC,QAAe3c,IAAX2oB,GAAyBA,EAAOjb,SAASiP,GAK7C,IAFAkM,EAAiB,GACjBC,EAAkB,GACXnM,IAAOgM,GACKx7B,EAAAA,KAAKwvB,EAAGoM,WACP57B,EAAAA,KAAKwvB,EAAGqM,YACxBrM,EAAKA,EAAGt2B,UAEhB,CAiGI4iC,CAA+BC,GAE/BC,EAAWC,KAAKC,MACRj4B,EAAAA,EAAEk4B,QAAQ,GAAGC,QACbn4B,EAAAA,EAAEk4B,QAAQ,GAAGE,QACbC,EAAA,EACAC,EAAA,EACZ,IAxK0D,GACjDlqB,EAAAA,iBAAiB,aA8K1B,SAAyBpO,GACjB,IAACu4B,IAAUC,EACX,OAGAC,IAAAA,EAAMz4B,EAAEk4B,QAAQ,GAAGC,QACnBO,EAAM14B,EAAEk4B,QAAQ,GAAGE,QAEvBC,EAAQE,EAAQE,EAChBH,EAAQE,EAAQE,CACpB,IAxLwD,GAC/CtqB,EAAAA,iBAAiB,YAyE1B,SAAwBpO,GAEhB83B,GAAAA,IAAY93B,EAAEhG,OACd,OAIE2+B,MAAAA,EAAuC,IAArBniC,EAAOoiC,YACzBC,EAAwC,GAApBriC,EAAOH,WAEjC,IAAIyiC,EACAC,EAAoBjB,EAAU,uBAAwBa,GAEtDK,EACAD,EAAoBjB,EAAU,uBAAwBe,GAEtDI,EAAeF,EAAoBjB,EAAU,qBAAsB,KACnEoB,EAAWlB,KAAKC,MAAQF,EACxBoB,EAAY,GACZC,EAAiBp5B,EAAEo5B,gBAAkBp5B,EAAEk4B,SAAW,GAElDzgC,GAAAA,KAAK4hC,IAAIhB,GAAU5gC,KAAK4hC,IAAIf,GAExB7gC,KAAK4hC,IAAIhB,GAAUW,GAA4BE,EAAWD,IACtDZ,EAAS,EACLiB,EAAqB,OAAQt5B,KACjBm5B,EAAA,eAGZG,EAAqB,QAASt5B,KAClBm5B,EAAA,iBAIjB1hC,KAAK4hC,IAAIf,GAAUQ,GAA0BI,EAAWD,IAC3DX,EAAS,EACLgB,EAAqB,KAAMt5B,KACfm5B,EAAA,aAGZG,EAAqB,OAAQt5B,KACjBm5B,EAAA,gBAKN,KAAdA,EAAkB,CAClB,IAAIzqB,EAAY,CACZ6qB,IAAKJ,EAAU5gC,QAAQ,UAAW,IAClCihC,UAAYJ,EAAe,IAAsCI,WAAa,SAC9EC,OAAQlB,EACRmB,MAAON,EAAe,IAAM,IAAIjB,UAAW,EAC3CwB,OAAQnB,EACRoB,MAAOR,EAAe,IAAM,IAAIhB,UAAW,GAItClrB,EAAAA,cACL,IAAII,YAAY,SAAU,CAAEE,SAAS,EAAMO,YAAY,EAAMR,OAAQmB,KAIhExB,EAAAA,cACL,IAAII,YAAY6rB,EAAW,CAAE3rB,SAAS,EAAMO,YAAY,EAAMR,OAAQmB,IAE9E,CAGQ6pB,EAAA,KACAC,EAAA,KACGT,EAAA,IACf,IAhJsD,GAEtD,IAAIQ,EAAuB,KACvBC,EAAuB,KACvBH,EAAuB,KACvBC,EAAuB,KACvBP,EAA0B,KAC1BD,EAA8B,KAG9BL,EAA2B,GAC3BC,EAA4B,GAOvB4B,SAAAA,EAAqBxnC,EAA4CkO,GACtE,QAAe4O,IAAX2oB,EACO,OAAA,EAGX,IAAIhM,EAAKvrB,EAAEhG,OACP3C,GAAS,EACTE,EAAI,EACDg0B,KAAAA,IAAOgM,GAAUlgC,GAAQ,CACxBwiC,GAAAA,EAAatO,GACb,OAAQz5B,GACJ,IAAK,KACDuF,EAASogC,EAAelgC,KAAOg0B,EAAGuO,aAAevO,EAAGwO,aACpD,MACJ,IAAK,OACQtC,EAAsB,IAAtBA,EAAelgC,GACxB,MACJ,IAAK,OACDF,EAASqgC,EAAgBngC,KAAOg0B,EAAGyO,YAAczO,EAAG0O,YACpD,MACJ,IAAK,QACQvC,EAAuB,IAAvBA,EAAgBngC,GACzB,MACJ,QACaF,GAAA,EAGrBk0B,EAAKA,EAAGt2B,WACRsC,GACJ,CACOF,OAAAA,CACX,CAeA,SAASwiC,EAAatO,GAClB,OAAOA,EAAGuO,aAAevO,EAAGwO,cAAgBxO,EAAGyO,YAAczO,EAAG0O,WACpE,CA8HSlB,SAAAA,EAAoBxN,EAAiB2O,EAAgCC,GAEnE5O,KAAAA,GAAMA,IAAO71B,EAAS0kC,iBAAiB,CAC1C,IAAIC,EAAiB9O,EAAG3U,aAAa0jB,OAAOJ,IAExCG,GAAAA,EACO9U,OAAAA,SAAS8U,EAAgB,IAGpC9O,EAAKA,EAAGt2B,UACZ,CAEOklC,OAAAA,CACX,GCjNWI,GAvBFxuB,IACHyuB,MAAAA,EAAU9kC,SAASwhB,cAAc,OACvCsjB,EAAQzoC,UAAUC,IAAI,cACtBwoC,EAAQpsB,iBAAiB,SAAS,KAC9BlB,GAAc,CAAEC,UAAWna,EAAmBoa,KAAM,CAAE/H,GAAI0G,IAAY,IAE1ErW,SAASM,KAAKX,YAAYmlC,GAC1BhS,YAAW,KACPgS,EAAQzoC,UAAUC,IAAI,SAAQ,GxE0EV,EwEzET,EAcJuoC,GAXDvuB,KACV,IAAKtW,SAAS+kC,uBAAuB,cAAcxoC,OAC/C,OAEJ,MAAMuoC,EAAU9kC,SAAS+kC,uBAAuB,cAAc,GAC9DD,EAAQzoC,UAAUuc,OAAO,UACzBka,YAAW,KACPgS,EAAQlsB,QAAM,GxEkEG,KwEjET,ECHVosB,GAAa,SACbC,GAAc,cAEpB,MAAMC,WAAcrpC,YAChBC,WAAAA,WAEIE,KAAKjB,MAAQ,GACbiB,KAAKmpC,UAAY,KACjBnpC,KAAKopC,QAAU,KAEfppC,KAAKqpC,UAAYrpC,KAAKusB,KAAK1K,KAAK7hB,MAChCA,KAAKspC,WAAatpC,KAAKsa,MAAMuH,KAAK7hB,MAClCA,KAAKupC,iBAAmBvpC,KAAKwpC,YAAY3nB,KAAK7hB,MAC9CA,KAAKugC,WAAavgC,KAAKk/B,MAAMrd,KAAK7hB,MAClCA,KAAKwgC,aAAexgC,KAAK6+B,QAAQhd,KAAK7hB,KAC1C,CAEAE,iBAAAA,GACIF,KAAKuO,MAAMC,QAAU,OACrBxO,KAAKjB,MAAQP,EAAYwB,KAAKvB,YAEzBuB,KAAK2T,KACN3T,KAAK2T,GAAK3T,KAAKjB,MAAM4U,KAGpB3T,KAAKitB,UAAYjtB,KAAK2uB,OACvB3uB,KAAK2uB,KAAO3uB,KAAKQ,WAGrBR,KAAKmpC,WAAY,EACjBnpC,KAAKopC,SAAU,EACfppC,KAAKG,QACT,CAEAsvB,wBAAAA,CAAyB7uB,EAAM6oC,EAAUnL,GAChCv/B,KAAAA,MAAQP,EAAYwB,KAAKvB,YAEjB,YAATmC,IACAZ,KAAKjB,MAAMkuB,QAAUqR,EAE7B,CAEA,6BAAWpP,GACP,MAAO,CAAC,UACZ,CAEA3qB,oBAAAA,GACSvE,KAAK0pC,UAGV1pC,KAAKgmB,aACT,CAEA7lB,MAAAA,GACQH,KAAK0pC,UACL1pC,KAAKgmB,cAEH,MACFP,QAAAA,EAAU,GACVkkB,WAAAA,EAAa,GACblW,QAAAA,EAAU,YACV1O,KAAAA,EAAO,IACP4B,YAAAA,EAAc,QACd3Q,MAAAA,EAAQ,GACRykB,UAAAA,EAAY,GACZ1wB,UAAAA,EAAY,SACZkjB,QAAAA,EAAU,GACV2c,cAAAA,GAAgBt/B,EAAe5F,GAAGK,OAAS,cAAgB,aAC3D/E,KAAKjB,MACH4vB,EAAO1B,GAAWjtB,KAAK2uB,KAE7B,GAAa,KAATA,EACK9L,OAAAA,KAAAA,YACL7iB,KAAKK,UAAUuc,OAAOosB,IACtBhpC,KAAKmrB,QAAS,GACP,EAEXnrB,KAAK6pC,aAAalb,GAClB3uB,KAAKiH,aAAa,OAAQjH,KAAKopC,QAAU,IAAMrkB,GAG/C/kB,KAAKiH,aAAa,OAAQ,UAC1BjH,KAAKiH,aAAa,cAAe,QACjCjH,KAAKiH,aAAa,UAAWwsB,GAC7BzzB,KAAKiH,aAAa,YAAa8C,GAG/B/J,KAAKQ,UAAY,kFAGK,UAAZizB,EAAsB,uBAAyB,4FAExC9M,oEAGLlB,GACA,iDACMA,GAAW,cAAcmkB,MAAkBnkB,2DAIjDkkB,GACA,uDACUA,GAAc,uBAAuBA,8HAM3C3zB,GACA,0DAA0DA,WAAeykB,aAAqBA,+DAEhG9L,8CAEJ3uB,KAAK4iB,mDAET5iB,KAAKopC,SAAW9+B,EAAe5F,GAAGK,OAAS,mCAAqC,eAItF+xB,YAAW,KACP92B,KAAKuO,MAAMC,QAAU,SAAA,GACtB,KAGH2wB,GAAyBn/B,MAEzBA,KAAKs/B,cAAgBt/B,KAAK8N,cAAc,UACxC9N,KAAK6iB,WACT,CAEAD,YAAAA,GACU,MAAEpI,OAAAA,GAAWxa,KAAKjB,MACjB+qC,M3EnIUzjC,CAAAA,MAAWA,GAAmB,UAAVA,G2EmI9ByjC,CAAUtvB,GAAU,oBAAsB,EACrD,CAEAqvB,YAAAA,CAAalb,GACHob,MAAAA,EAAS/lC,SAASwhB,cAAc,OACtCukB,EAAOvpC,UAAYmuB,EACY,IAA3Bob,EAAOlgB,SAAStpB,QAA+C,aAA/BwpC,EAAOlgB,SAAS,GAAGlnB,UACnD3C,KAAKopC,SAAU,EACfppC,KAAKiH,aAAa,QAAS,QAEnC,CAEA+iC,OAAAA,GACIhmC,SAASq6B,qBAAqB,QAAQ,GAAGh+B,UAAUC,IAAI2oC,IACvDJ,GAAa7oC,KAAK2T,GACtB,CAEAs2B,UAAAA,GAEwBjqC,KAAKuD,WAAWi2B,QAAQ,aAExCx1B,SAASq6B,qBAAqB,QAAQ,GAAGh+B,UAAUuc,OAAOqsB,IAE9DJ,IACJ,CAEA7H,eAAAA,GACIhhC,KAAKmpC,WAAanpC,KAAKmpC,UAEvBnpC,KAAKiH,aAAa,aAAcjH,KAAKmpC,WAErC5K,GAA0Bv+B,KAAMA,KAAKmpC,UACzC,CAEA,UAAM5c,CAAKje,GACDqN,MAAAA,EAAQO,GAAU5N,GACpBqN,EAAMhI,KAAO3T,KAAK2T,KAKtB3T,KAAK0c,iBAAiB,gBAAiB1c,KAAKugC,YAC5Cv8B,SAAS0Y,iBAAiB,UAAW1c,KAAKwgC,cAC1CxgC,KAAKihC,cAAgBj9B,SAASk9B,cAE9BlhC,KAAKgqC,UACLhqC,KAAKghC,kBACLhhC,KAAKiH,aAAa,cAAe,SACjCjH,KAAKmrB,QAAUnrB,KAAKmrB,OAGpB3P,GAAc,CACVC,UzExLsB,6ByEyLtBC,KAAMC,UAGJ,IAAIymB,SAAQuB,IACd7M,YAAW,KACP92B,KAAKK,UAAUC,IAAI0oC,IACnBrF,MzE9HS,IyE+HD,IAEpB,CAEArpB,KAAAA,CAAMqB,GACFA,GAAAA,EAAMuuB,cAAe,EACjBvuB,EAAM8K,iBACN9K,EAAM8K,kBAIVzmB,KAAK0c,iBAAiB,gBAAiB1c,KAAKugC,YAC5Cv8B,SAAS6Y,oBAAoB,UAAW7c,KAAKwgC,cAC7CxgC,KAAKiqC,aACDjqC,KAAKopC,QAAS,CACRe,MAAAA,EAAiBnqC,KAAKw5B,QAAQ,mBAChC2Q,GACAA,EAAe9pC,UAAUuc,OAAO,iBAExC,CACA5c,KAAKghC,kBACLhhC,KAAKiH,aAAa,cAAe,QACjCjH,KAAKmrB,QAAUnrB,KAAKmrB,OACpBnrB,KAAKK,UAAUuc,OAAOosB,IAEtBxtB,GAAc,CACVC,UAAWla,EACXma,KAAM,CAAE/H,GAAI3T,KAAK2T,KAEzB,CAEAurB,KAAAA,GACIl/B,KAAK6c,oBAAoB,gBAAiB7c,KAAKugC,YAC3CvgC,KAAKmrB,OACLnrB,KAAKs/B,cAAcJ,QAEnBl/B,KAAKihC,cAAc/B,OAE3B,CAEAL,OAAAA,CAAQvwB,GACJuwB,GAAQvwB,EAAGtO,MAAM,EACrB,CAEAwpC,WAAAA,CAAYl7B,GACM,WAAVA,EAAElI,KAAoBpG,KAAKmrB,QAC3BnrB,KAAKsa,MAAMhM,EAEnB,CAEA87B,SAAAA,CAAU97B,GACFtO,KAAKmrB,QACLnrB,KAAKsa,MAAMhM,EAEnB,CAEA+7B,2BAAAA,GACI7uB,GAAc,CACVC,UzExOsB,6ByEyOtBC,KAAM,CAAE/H,GAAI3T,KAAK2T,KAEzB,CAEAkP,SAAAA,GACI7iB,KAAK0pC,UAAW,EACM,MAAtB1pC,KAAKs/B,eAAyBt/B,KAAKs/B,cAAc5iB,iBAAiB,QAAS1c,KAAKspC,YAChFxkC,OAAO4X,iBAAiBrb,EAAkBrB,KAAKqpC,WAC/CvkC,OAAO4X,iBAAiBpb,EAAmBtB,KAAKspC,YAChDtlC,SAAS0Y,iBAAiBlb,EAAsBxB,KAAKupC,kBAEjDj/B,EAAe5F,GAAGK,SAClB6gC,GAAY9gC,OAAQd,SAAUhE,MAC9BA,KAAKsqC,eAAiBtqC,KAAKoqC,UAAUvoB,KAAK7hB,MAC1CgE,SAAS0Y,iBAAiB/a,EAAmB3B,KAAKsqC,gBAC9CtqC,KAAKopC,UACLppC,KAAKuqC,aAAevqC,KAAK8N,cAAc,iBACvC9N,KAAKwqC,iCAAmCxqC,KAAKqqC,4BAA4BxoB,KAAK7hB,MAC9EA,KAAKuqC,aAAa7tB,iBAAiB,QAAS1c,KAAKwqC,mCAG7D,CAEAxkB,WAAAA,GACS0jB,KAAAA,UAAW,EACM,MAAtB1pC,KAAKs/B,eACDt/B,KAAKs/B,cAAcziB,oBAAoB,QAAS7c,KAAKspC,YACzDxkC,OAAO+X,oBAAoBxb,EAAkBrB,KAAKqpC,WAClDvkC,OAAO+X,oBAAoBvb,EAAmBtB,KAAKspC,YACnDtlC,SAAS6Y,oBAAoBrb,EAAsBxB,KAAKupC,kBACpDvpC,KAAKsqC,iBACLtmC,SAAS6Y,oBAAoBlb,EAAmB3B,KAAKsqC,gBACrDtqC,KAAKsqC,eAAiB,MAEtBtqC,KAAKwqC,mCACLxqC,KAAKuqC,aAAa1tB,oBAAoB,QAAS7c,KAAKwqC,kCACpDxqC,KAAKwqC,iCAAmC,KAEhD,EAGJxpC,eAAeC,IAAI,aAAeD,eAAeE,OAAO,WAAYgoC,ICvTpE,MAAMuB,WAAkB5qC,YACpBC,WAAAA,WAEIE,KAAKjB,MAAQ,EACjB,CAEAmB,iBAAAA,GACIF,KAAKjB,MAAQP,EAAYwB,KAAKvB,YAC9BuB,KAAKG,QACT,CAEAA,MAAAA,GAGQ,IACA2S,EACAkQ,EACAjQ,EACAkQ,EACA/P,EACAgQ,EACA9P,EACA+P,EACA9P,EACA+P,EACAjQ,EACAkQ,GAZEjjB,UAAAA,EAAY,MAAOkjB,MAAAA,GAAUtjB,KAAKjB,MAcnCsB,KAAAA,UAAUC,IACX,IAAiB,WAAdF,EAAyB,mBAAqB,aAAeA,IAGpE,IAAIsqC,EAAa,GACJ,MAATpnB,GACAxQ,EAAa9S,KAAKjB,OAAO+T,WACzBkQ,EAAiBhjB,KAAKjB,OAAOikB,eAC7BjQ,EAAa/S,KAAKjB,OAAOgU,WACzBkQ,EAAcjjB,KAAKjB,OAAOkkB,YAC1B/P,EAAmBlT,KAAKjB,OAAOmU,iBAC/BgQ,EAAkBljB,KAAKjB,OAAOmkB,gBAC9B9P,EAAgBpT,KAAKjB,OAAOqU,cAC5B+P,EAAiBnjB,KAAKjB,OAAOokB,eAC7B9P,EAAiBrT,KAAKjB,OAAOsU,eAC7B+P,EAAkBpjB,KAAKjB,OAAOqkB,gBAC9BjQ,EAAyBnT,KAAKjB,OAAOoU,uBACrCkQ,EAA8BrjB,KAAKjB,OAAOskB,kCAClBnG,IAAjBoG,EAAM/iB,QAEbuS,EAAawQ,GAAOxQ,WACpBkQ,EAAiBM,GAAON,eACxBjQ,EAAauQ,GAAOvQ,WACpBkQ,EAAcK,GAAOL,YACrB/P,EAAmBoQ,GAAOpQ,iBAC1BgQ,EAAkBI,GAAOJ,gBACzB9P,EAAgBkQ,GAAOlQ,cACvB+P,EAAiBG,GAAOH,eACxB9P,EAAiBiQ,GAAOjQ,eACxB+P,EAAkBE,GAAOF,gBACzBjQ,EAAyBmQ,GAAOnQ,uBAChCkQ,EAA8BC,GAAOD,6BAC9BC,EAAM/iB,SACbmqC,EAAa,IAAIpnB,IAIpB,CACG,CAACxQ,EAAY,aAAckQ,EAAgB0nB,GAC3C,CAAC33B,EAAY,aAAckQ,EAAaynB,GACxC,CAACx3B,EAAkB,mBAAoBgQ,EAAiBwnB,GACxD,CAACt3B,EAAe,gBAAiB+P,EAAgBunB,GACjD,CAACr3B,EAAgB,iBAAkB+P,EAAiBsnB,GACpD,CACIv3B,EACA,yBACAkQ,EACAqnB,IAENjnC,SAAQknC,GAAS3qC,KAAK4qC,WAAWpjB,MAAMxnB,KAAM2qC,KAE/C3qC,KAAKQ,UAAYkqC,EACZhqC,KAAImqC,GAAQ,aAAah4B,GAAag4B,EAAKjqC,eAAeiqC,EAAKC,yBAC/D/pC,KAAK,GACd,CAEA6pC,UAAAA,CAAWD,EAAO/pC,EAAMkqC,EAAKxqB,GACnBqqB,IAAU3qC,KAAK+qC,QAAQzqB,EAAM1f,IAC/B0f,EAAKjW,KAAK,CAAEzJ,KAAAA,EAAMkqC,IAAAA,GAE1B,CAEAC,OAAAA,CAAQC,EAAWC,GACf,OAAOD,EAAUl6B,MAAK+5B,GAAQA,EAAKjqC,OAASqqC,GAChD,EAGJjqC,eAAeC,IAAI,kBAAoBD,eAAeE,OAAO,gBAAiBupC,IClGvE,MAEMS,GAAkB,sBAElBC,GAAO,kBACPC,GAAO,iBAKPC,GACN,UCPP,IAAAC,GAAA,MASIxrC,WAAAA,CAAY4J,EAAS4M,EAAU,IAC3B,OAAAtW,KAAKurC,eAAiBvrC,KAAKwrC,YAAY3pB,KAAK7hB,MAC5CA,KAAKyrC,eAAiBzrC,KAAK0rC,YAAY7pB,KAAK7hB,MAC5CA,KAAKwkC,eAAiBxkC,KAAK2rC,YAAY9pB,KAAK7hB,MAC5CA,KAAK4rC,cAAgB5rC,KAAK6rC,WAAWhqB,KAAK7hB,MAC1CA,KAAK8rC,kBAAkD,SAA9Bx1B,EAAQw1B,oBAAgC,EACjE9rC,KAAK+rC,eAAiB,KAEf,IAAI3J,SAAQuB,IACf3jC,KAAKgsC,SAAWtiC,EAChB1J,KAAKisC,QAAU,GAAG9oC,MAAMC,KAAKsG,EAAQmgB,UACrC7pB,KAAKksC,SAAWxtB,OAAOwD,OACnB,CAAA,EACA,CACIvO,GAAI,OACJw4B,2BAA4B,EAC5BC,SAAS,EACTC,sBAAuB,GACvBC,kBAAkB,EAClBC,qBAAsB,IACtBC,aAAc,KAElBl2B,GAGJtW,KAAKysC,WACL9I,EAAQ3jC,MAGR82B,YAAW,KACF4V,KAAAA,uBACL1sC,KAAK2sC,6BAA2B,GACjC,EAAC,GAEZ,CAKA,WAAIjjC,GACA,OAAO1J,KAAKgsC,QAChB,CAGAS,QAAAA,GACS3d,KAAAA,MAAQ9uB,KAAKwlB,cAAc,MD1DpB,iBC2DZxlB,KAAK4sC,WAAa5sC,KAAKwlB,cAAc,KD1DpB,yBC2DjBxlB,KAAK6sC,aAAe,KACpB7sC,KAAK8sC,wBAA0B,KAE3B9sC,KAAK+sC,iBACL/sC,KAAK8sC,wBAA0B9sC,KAAKwlB,cAAc,MAAOwnB,KAG7DhtC,KAAKitC,YACLjtC,KAAK8uB,MAAMnrB,YAAY3D,KAAK4sC,YAExB5sC,KAAK8sC,yBACL9sC,KAAKgsC,SAASroC,YAAY3D,KAAK8sC,yBAInC9sC,KAAKgsC,SAASkB,aAAaltC,KAAK8uB,MAAO9uB,KAAKgsC,SAASlpC,WAAW,IAEhE9C,KAAKmtC,iBACT,CAEAJ,YAAAA,GACQ/oC,QAAAA,SAAS8J,cAAc,oBAG/B,CAEAm/B,SAAAA,GACI,MAAMtuB,EAAO,GACRstB,KAAAA,QAAQvrC,KAAIiqB,IACPyiB,MAAAA,EAAS1nC,EAAO,GAElB,GAAA1F,KAAK+sC,gBACDpiB,EAAMtqB,UAAUuqB,SAAS,sBACrBD,EAAMd,UACFc,EAAMd,SAAStpB,QACd,IAAIoqB,EAAMd,UAAUpmB,SAAQ,CAACo2B,EAAIh0B,KACpB,IAANA,IACAg0B,EAAGtrB,MAAMC,QAAU,QAGvBqrB,EAAGlmB,GAAKgL,EAAK9Y,GAEb7F,KAAK8sC,wBAAwBnpC,YAAYk2B,EAAE,IAIvDlP,EAAM/N,WAIT+N,EAAMtqB,UAAUuqB,SAAS,eAAgB,CAC1C,MAAMlL,EAAO1f,KAAKwlB,cAAc,MD5G5B,4BC6GJ9F,EAAK/b,YAAYgnB,GACjBjL,EAAKzY,aAAa,wBAAyBmmC,GAC3CzuB,EAAKtU,KAAK+iC,GAEVptC,KAAK4sC,WAAWjpC,YAAY+b,EAChC,IAER,CAEA8F,aAAAA,CAAc6nB,EAAKjkB,GACXkkB,IAAAA,EAAMtpC,SAASwhB,cAAc6nB,GACjCC,OAAAA,EAAIrmC,aAAa,QAASmiB,GACnBkkB,CACX,CAGAH,eAAAA,GACIntC,KAAKutC,SAAW,GAChBvtC,KAAK6sC,aAAe7sC,KAAKwlB,cAAc,MD5HpB,0BC6HnBxlB,KAAK4sC,WAAWjpC,YAAY3D,KAAK6sC,cAEjC7sC,KAAKutC,SAAWtqC,MAAMynB,KAAK1qB,KAAK4sC,WAAWxmB,iBAAiB,cAE5DpmB,KAAKutC,SAAS9pC,SAAQiG,IAClBA,EAAQgT,iBAAiB,QAAS1c,KAAKwkC,eAAc,IAGnDgJ,MAAAA,EAAiBxpC,SAAS+iB,eAAe,GAAGimB,MAAkBhtC,KAAKksC,SAASv4B,MAC9E65B,GACAA,EAAe9wB,iBAAiB,QAAS1c,KAAKyrC,gBAG5CgC,MAAAA,EAAkBzpC,SAAS+iB,eAAe,GAAGimB,MAAkBhtC,KAAKksC,SAASv4B,MAC/E85B,GACAA,EAAgB/wB,iBAAiB,QAAS1c,KAAKurC,gBAG/CvrC,KAAK8uB,OACL9uB,KAAK4sC,WAAWlwB,iBAAiB,WAAY1c,KAAK4rC,cAE1D,CAEAD,WAAAA,CAAYr9B,GACHo/B,KAAAA,YAAYp/B,EAAEm3B,cACvB,CAEAkI,SAAAA,CAAUjqC,GACN1D,KAAK0tC,YAAY1tC,KAAKisC,QAAQvoC,GAClC,CAEAkqC,WAAAA,CAAYj6B,GACR,MAAMu3B,EAAkBlnC,SAAS8J,cAAc,IAAIk/B,MAE/C9B,EAAgBrhB,UACf,IAAIqhB,EAAgBrhB,UAAUpmB,SAAQo2B,GAAOA,EAAGtrB,MAAMC,QAAU,SAGrExK,SAAS+iB,eAAepT,GAAIpF,MAAMC,QAAU,OAChD,CAEAk/B,WAAAA,CAAYhkC,GACJ,GAAA1J,KAAK+sC,eAAgB,CACrB,MAAMc,EAAYnkC,EACb8vB,QAAQ,2BACRtU,aAAa,yBAElBllB,KAAK4tC,YAAYC,EACrB,CAKA,GAHA7tC,KAAK8tC,mBAAmBpkC,GACxBA,EAAQzC,aAAa,eAAgB,SAEhCyC,IAAY1J,KAAK+rC,eAClB,OAGJ,IAAIgC,EAAW,EAEJ5lC,IAAAA,MAAAA,KAASnI,KAAK+rC,eAAgB,CACrC,GAAI5jC,EAAMG,OAAO4c,aAAa,eAAiBxb,EAAQwb,aAAa,aAChE,MAEA6oB,EAAWA,EAAW5lC,EAAM6lC,mBAAmBrV,MD3LpB,EC6LnC,CAEK34B,KAAK8rC,mBACN9rC,KAAK8uB,MAAMmf,OAAO,CAAEC,KAAMH,EAAUI,SAAU,UAEtD,CAEAL,kBAAAA,CAAmBpkC,GACV6jC,KAAAA,SAAS9pC,SAAQo2B,IACdA,IAAOnwB,GACPmwB,EAAG5yB,aAAa,eAAgB,QAAO,GAGnD,CAEAmnC,UAAAA,CAAW1kC,EAAStJ,EAAWiuC,EAAON,EAAUO,GAC5CtuC,KAAK0sC,uBAEL,IAAIF,EAAe,EACf+B,EAAaC,aAAY,WACP,SAAdpuC,EACAsJ,EAAQw8B,YAAcoI,EAEtB5kC,EAAQw8B,YAAcoI,EAE1B9B,GAAgB8B,EACZ9B,GAAgBuB,GAChBjpC,OAAO2pC,cAAcF,EAE5B,GAAEF,GACI,MAAA,CAAEE,WAAAA,EACb,CAEA7C,WAAAA,GACS0C,KAAAA,WAAWpuC,KAAK8uB,MAAO,OAAQ,GAAI9uB,KAAKksC,SAASM,aAAc,IACpE1V,YAAW,KACP92B,KAAK0sC,sBAAoB,GDhON,ICkO3B,CAEAlB,WAAAA,GACS4C,KAAAA,WAAWpuC,KAAK8uB,MAAO,QAAS,GAAI9uB,KAAKksC,SAASM,aAAc,IACrE1V,YAAW,KACP92B,KAAK0sC,sBAAoB,GDvON,ICyO3B,CAEAb,UAAAA,GACI7rC,KAAK0sC,sBACT,CAEAC,2BAAAA,GACI,MAAM5Z,EAAW/yB,KAAK8uB,MAAMhhB,cAAc,yBAGtCilB,GACA/yB,KAAK0uC,cAAc3b,EAAUsY,GAErC,CAEAsD,iBAAAA,CAAkB1hB,EAASN,GACvB,IAAIiiB,EAAmBjiB,EAAUkiB,wBAC7BC,EAAwB/oC,KAAKC,MAAM4oC,EAAiBG,OACpDC,EAAuBjpC,KAAKC,MAAM4oC,EAAiBV,MAEnDe,EAAiBhiB,EAAQ4hB,wBACzBK,EAAsBnpC,KAAKC,MAAMipC,EAAeF,OAChDI,EAAqBppC,KAAKC,MAAMipC,EAAef,MAG/Cc,OAAAA,EAAuBG,GACvBL,EAAwBI,EAEjB,OACAC,EAAqBH,EACrB,OACAE,EAAsBJ,EACtB,QAEA,MAEf,CAEAJ,aAAAA,CAAchvB,EAAM5e,GAChB,IAAKd,KAAK6sC,aACN,OAGJ,IAAIuC,EAAe1vB,EAAKmvB,wBACpBliB,EAAY3sB,KAAK4sC,WAAWiC,wBAAwBX,KACpDH,EAAWqB,EAAalB,KAAOvhB,EAEnC3sB,KAAK6sC,aAAat+B,MAAM8gC,UACpB,eACCtB,EAAW/tC,KAAK4sC,WAAW1G,WD3RG,IC4R/B,cACyD,KAAxDkJ,EAAazW,MAAQ2W,IACtB,IAEJtvC,KAAK8uB,MAAMoX,WAAangC,KAAKC,MACzB+nC,EAAW/tC,KAAK4sC,WAAWiC,wBAAwBX,KAAO,GAG1DptC,IACAd,KAAK6sC,aAAat+B,MAAMghC,gBAAkBzuC,EAElD,CAEA0uC,QAAAA,GACS9C,KAAAA,uBACL1sC,KAAK2sC,6BACT,CAEA8C,cAAAA,GACSlC,KAAAA,SAAS9pC,SAAQiG,IAClBA,EAAQmT,oBAAoB,QAAS7c,KAAKwkC,eAAc,IAGtDgJ,MAAAA,EAAiBxpC,SAAS+iB,eAAe,GAAGimB,MAAkBhtC,KAAKksC,SAASv4B,MAC9E65B,GACAA,EAAe3wB,oBAAoB,QAAS7c,KAAKyrC,gBAG/CgC,MAAAA,EAAkBzpC,SAAS+iB,eAAe,GAAGimB,MAAkBhtC,KAAKksC,SAASv4B,MAC/E85B,GACAA,EAAgB5wB,oBAAoB,QAAS7c,KAAKurC,eAE1D,CAEAmE,IAAAA,GACI1vC,KAAKyvC,gBACT,CAEA/C,oBAAAA,GACI1sC,KAAKgsC,SAAS/kC,aACV,mBACAjH,KAAK2uC,kBAAkB3uC,KAAK4sC,WAAY5sC,KAAK8uB,QAGjD9uB,KAAKuI,SACT,CAEAA,OAAAA,GACI,KAAM,yBAA0BzD,QACrB,OAAA,EAGX9E,KAAK+rC,eAAiB,GAGtB,MAAM1Q,EAAW,IAAIpzB,sBACjBC,IACI,IAAA,MAAWC,KAASD,EAChBlI,KAAK+rC,eAAe1hC,KAAK,CACrB/B,OAAQH,EAAMG,OACdqnC,aACIxnC,EAAM6lC,mBAAmBe,OACrBjqC,OAAOH,WD1VI,IC2VfwD,EAAM6lC,mBAAmBE,MD3VV,GC4VnBF,mBAAoB7lC,EAAM6lC,qBAIlC3S,EAASuU,YAAU,GAEvB,CAAEC,KAAM7vC,KAAK4sC,aAGjB5sC,KAAKisC,QAAQvrC,KAAIgJ,GAAW2xB,EAAS9yB,QAAQmB,IACjD,CAEAomC,YAAAA,CAAapmC,GACJ,QAAA1J,KAAK+rC,gBAII/rC,KAAK+rC,eAAeptC,MAAKoxC,GAAcrmC,IAAYqmC,EAAWznC,SAE/DqnC,YACjB,GCjXJ,MAAMK,WAAmBnwC,YACrBC,WAAAA,GACIC,QACAC,KAAK2uB,KAAO3uB,KAAKQ,UACjBR,KAAKssC,kBAAmB,EACxBtsC,KAAK8rC,mBAAoB,EACzB9rC,KAAKqsC,sBAAwB,GAC7BrsC,KAAKusC,qBAAuB,IAC5BvsC,KAAKiwC,SAAW,KAChBjwC,KAAKkwC,WAAa,KAClBlwC,KAAKmwC,cAAgBnwC,KAAKwvC,SAAS3tB,KAAK7hB,MACxCA,KAAKowC,OAASpwC,KAAKowC,OAAOvuB,KAAK7hB,MAC/BA,KAAKqwC,kB1EkMGC,SAAYrhB,EAAsBshB,EAAO,KACjDC,IAAAA,EACJ,OAAO,SAAU70B,GACT60B,GACA1rC,OAAO2rC,aAAaD,GAExBA,EAAQ1rC,OAAOgyB,WAAW7H,EAAMshB,EAAM50B,EAAK,CAEnD,C0E1MiC20B,CAAStwC,KAAKmwC,cAAe,IAC1D,CAEA,6BAAWjhB,GACA,MAAA,CAAC,mBAAoB,wBAAyB,uBACzD,CAEA/uB,MAAAA,GACI,MAAMwkC,EAAiD,SAApC3kC,KAAKklB,aAAa,eAAkC,GACjEggB,EAA8BllC,KAAKklB,aAAa,gCAAkC,GAClFigB,EAA0BnlC,KAAKklB,aAAa,4BAA8B,GAEhFllB,KAAKQ,UAAY,uCACWR,KAAKiwC,yCAAyCjwC,KAAKiwC,+BAEnEtL,GACA,8BAA8B3kC,KAAKiwC,wSAMtB/K,mCAEfllC,KAAK2uB,yBAEHgW,GACA,+BAA+B3kC,KAAKiwC,0SAMvB9K,yDAEOnlC,KAAKiwC,8HAMrCjwC,KAAK0wC,YACT,CAEAxwC,iBAAAA,GACS+vC,KAAAA,SAAWjwC,KAAKklB,aAAa,UAC5BllB,KAAKklB,aAAa,UAClB,cAAcxf,EAAO,KAC3B1F,KAAKssC,iBAAmBtsC,KAAKklB,aAAa,qBAAuBllB,KAAKssC,iBACtEtsC,KAAKqsC,sBACDrsC,KAAKklB,aAAa,0BAA4BllB,KAAKqsC,sBACvDrsC,KAAKusC,qBACDvsC,KAAKklB,aAAa,yBAA2BllB,KAAKusC,qBACtDvsC,KAAK8rC,kBAAoB9rC,KAAKklB,aAAa,wBAA0B,GAErEllB,KAAKG,SACL2E,OAAO4X,iBAAiB,SAAU1c,KAAKqwC,kBAC3C,CAEAK,UAAAA,GACI,IAAIrE,EAAwBrsC,KAAKqsC,sBAC7BE,EAAuBvsC,KAAKusC,qBAE3B2D,KAAAA,WAAa,IAAIS,GAAc3wC,KAAK8N,cAAc,IAAM9N,KAAKiwC,UAAW,CACzEt8B,GAAI3T,KAAKiwC,SACTvsC,MAAO1D,KAAK0D,MACZ2oC,sBAAuBA,EACvBE,qBAAsBA,EACtBT,kBAAmB9rC,KAAK8rC,oBAG5B9rC,KAAKkwC,WAAW/hC,MAAK,KACjBnO,KAAKK,UAAUC,IAAI,WAEnBkb,GAAc,CACVC,UAAWha,EACXia,KAAM,CAAE0N,UAAWppB,KAAKiwC,UACxBvmC,QAAS1J,MACZ,IAI0BgE,SAASoiB,iBAAiB,6BAClC3iB,SAAQ6pC,IACrBsD,MAAAA,EAAK5sC,SAASwhB,cAAc,MAElC,IADAorB,EAAGvwC,UAAUC,IAAI,4BACVgtC,EAAIuD,YACPD,EAAGjtC,YAAY2pC,EAAIuD,YAEvBvD,EAAI/pC,WAAWM,aAAa+sC,EAAItD,EAAG,GAE3C,CAEAxY,WAAAA,GACItZ,GAAc,CAAEC,U7EnEU,+B6B9BPC,CAAAA,IAChBuB,OAAAA,cAAgBnY,OAAOmY,eAAiB,GAC/C,MAAMD,EAAY,CACdrB,MAAO,cACPyB,cAAeL,GACfO,YAAa,QACbwzB,UAAW,CAAC,eACTp1B,GAEP5W,OAAOmY,cAAc5S,KAAK2S,GAC1Bb,GAAgB,cAAea,EAAS,EgD0FpC+zB,CAAY,CAAEC,YAAa,CAAC,mBAChC,CAEAZ,MAAAA,GACIpwC,KAAKkwC,WAAW/hC,MAAK8iC,GAAUA,EAAOb,UAC1C,CAEAZ,QAAAA,GACIxvC,KAAKkwC,WAAW/hC,MAAK8iC,GAAUA,EAAOzB,YAC1C,CAEA0B,iBAAAA,CAAkB5iC,GACd,IAAI1N,EAAO,GAGP0N,EAAEhG,QACFgG,EAAEhG,OAAOkxB,QAAQ,UACjBlrB,EAAEhG,OAAOkxB,QAAQ,SAAStU,aAAa,oBAEvCtkB,EAAO0N,EAAEhG,OAAOkxB,QAAQ,SAAStU,aAAa,mBAGlD9I,GAAY,CAAEkB,YAAa,kBAAmBC,WAAY3c,GAC9D,CAEA2D,oBAAAA,GACIO,OAAO+X,oBAAoB,SAAU7c,KAAKqwC,mBAC1CrwC,KAAKkwC,WAAW/hC,MAAK8iC,GAAUA,EAAOvB,QAC1C,EAGJ1uC,eAAeC,IAAI,mBAAqBD,eAAeE,OAAO,iBAAkB8uC,kPCvIhF,MAAMmB,WAAsBtxC,YACxBC,WAAAA,WAiDAq3B,EAAAn3B,KAAAoxC,IAiBAja,EAAAn3B,KAAAqxC,IAOAla,EAAAn3B,KAAAsxC,IAYAna,EAAAn3B,KAAAuxC,IAqFApa,EAAAn3B,KAAAwxC,IAIAra,EAAAn3B,KAAAyxC,IAqBAta,EAAAn3B,KAAA0xC,IA0BAva,EAAAn3B,KAAA2xC,IA4BAxa,EAAAn3B,KAAA4xC,IAIAza,EAAAn3B,KAAA6xC,IA6BA1a,EAAAn3B,KAAA8xC,IAiBA3a,EAAAn3B,KAAA+xC,IAoBA5a,EAAAn3B,KAAAgyC,IAyBA7a,EAAAn3B,KAAAiyC,IAiBA9a,EAAAn3B,KAAAkyC,IAIA/a,EAAAn3B,KAAAmyC,IAWAhb,EAAAn3B,KAAAoyC,IAQAjb,EAAAn3B,KAAAqyC,IAMAlb,EAAAn3B,KAAAsyC,IAMAnb,EAAAn3B,KAAAuyC,IAMApb,EAAAn3B,KAAAwyC,IAIArb,EAAAn3B,KAAAyyC,IAeAtb,EAAAn3B,KAAA0yC,IAOAvb,EAAAn3B,KAAA2yC,IAKAxb,EAAAn3B,KAAA4yC,IAiBAzb,EAAAn3B,KAAA6yC,IAYA1b,EAAAn3B,KAAA8yC,IAYA3b,EAAAn3B,KAAA+yC,IAoCA5b,EAAAn3B,KAAAgzC,IAOA7b,EAAAn3B,KAAAizC,IA0CA9b,EAAAn3B,KAAAkzC,IAYA/b,EAAAn3B,KAAAmzC,IA0CAhc,EAAAn3B,KAAAozC,IAeAjc,EAAAn3B,KAAAqzC,IAQAlc,EAAAn3B,KAAAszC,IAQAnc,EAAAn3B,KAAAuzC,IAMApc,EAAAn3B,KAAAwzC,IAQArc,EAAAn3B,KAAAyzC,IAiBAtc,EAAAn3B,KAAA0zC,IAhqBI1zC,KAAKk1B,SAAWrzB,EAChB7B,KAAK2zC,gBAAkB,EACvB3zC,KAAK4zC,gBAAiB,EACtB5zC,KAAK6zC,YAAa,EAClB7zC,KAAK8zC,gBAAiB,EACtB9zC,KAAK+zC,kBAAmB,EACxB/zC,KAAKg0C,cAAgB,EACrBh0C,KAAKi0C,UAAW,EAChBj0C,KAAKk0C,gBAAkB,IACvBl0C,KAAKm0C,UAAW,EAEhBn0C,KAAKyrC,eAAiB9T,EAAA33B,KAAKqzC,GAAAe,IAAavyB,KAAK7hB,MAC7CA,KAAKurC,eAAiB5T,EAAA33B,KAAKszC,GAAAe,IAAaxyB,KAAK7hB,MAC7CA,KAAKs0C,cAAgB3c,EAAA33B,KAAKuzC,GAAAgB,IAAY1yB,KAAK7hB,MAC3CA,KAAKw0C,YAAc7c,EAAA33B,KAAKizC,GAAAwB,IAAU5yB,KAAK7hB,KAC3C,CAEAE,iBAAAA,GACSyuB,KAAAA,KAAO3uB,KAAKQ,UACjBR,KAAKjB,MAAQP,EAAYwB,KAAKvB,YAC9Bk5B,EAAA33B,KAAKwxC,GAAAkD,IAALtxC,aAGKpD,KAAK2T,IAAkB,cAAZ3T,KAAK2T,MACjB3T,KAAK2T,GAAK3T,KAAKjB,MAAM41C,OAAS30C,KAAKjB,MAAM41C,OAAS,kBAAkBjvC,EAAO,MAG/EiyB,EAAA33B,KAAKuxC,GAAAqD,IAALxxC,KAEApD,MAAAA,KAAK60C,MAAQ,EACbld,EAAA33B,KAAKoxC,GAAA0D,IAAL1xC,KACK+K,MAAAA,MAAK,KACFnO,KAAKwlC,aACL7N,EAAA33B,KAAKwzC,GAAAuB,IAAL3xC,KAAApD,KAAA,IAEHqO,OAAMC,IACH7O,QAAQD,MAAM8O,EAAC,IAElB0mC,SAAQ,KACDh1C,KAAKi1C,OACLxG,cAAczuC,KAAKi1C,MACnBj1C,KAAKi1C,KAAO,KAAA,GAG5B,CAmFAzP,UAAAA,GAES0P,KAAAA,eAAiBl1C,KAAKomB,iBAAiB,sCAC5CpmB,KAAKm1C,WAAan1C,KAAKk1C,eAAe30C,OAGtCo3B,EAAA33B,KAAKqxC,GAAA+D,IAALhyC,KAAApD,KAAU,aAAcA,KAAKsW,QAAQ++B,YACrC1d,EAAA33B,KAAKqxC,GAAA+D,IAALhyC,KAAUpD,KAAA,kBAAmBA,KAAKsW,QAAQg/B,iBAIf,SAAvBt1C,KAAKg0C,eACLrc,EAAA33B,KAAKgyC,GAAAuD,IAALnyC,KAAApD,MAEJ23B,EAAA33B,KAAKmyC,GAAAqD,IAALpyC,KACAu0B,MAAAA,EAAA33B,KAAKwyC,GAAAiD,IAALryC,KACAu0B,MAAAA,EAAA33B,KAAKsyC,GAAAoD,IAALtyC,KAAApD,MAGAA,KAAK21C,UAAY31C,KAAKm1C,WAAan1C,KAAKg0C,cAGxCrc,EAAA33B,KAAKyxC,GAAAmE,IAALxyC,KAAApD,MACA23B,EAAA33B,KAAK2xC,GAAAkE,IAALzyC,KACAu0B,MAAAA,EAAA33B,KAAK6xC,GAAAiE,IAAL1yC,KAAApD,MACA23B,EAAA33B,KAAK8xC,GAAAiE,IAAL3yC,KAAApD,MAGA23B,EAAA33B,KAAKyyC,GAAAuD,IAAL5yC,KACAu0B,MAAAA,EAAA33B,KAAKiyC,GAAAgE,IAAL7yC,KAAApD,MACA23B,EAAA33B,KAAKkzC,GAAAgD,IAAL9yC,KAAApD,MACA23B,EAAA33B,KAAKmzC,GAAAgD,IAAL/yC,KACAu0B,MAAAA,EAAA33B,KAAK0yC,GAAA0D,IAALhzC,KAAApD,MACA23B,EAAA33B,KAAKyzC,GAAA4C,IAALjzC,KAAApD,MACA23B,EAAA33B,KAAKgzC,GAAAsD,IAALlzC,KAGAu0B,MAAAA,EAAA33B,KAAK+xC,GAAAwE,IAALnzC,KAAApD,KACJ,CAwPAw2C,YAAAA,CAAa9yC,EAAO+yC,GAAY,GAC5B9e,EAAA33B,KAAKiyC,GAAAgE,IAAL7yC,KAAApD,MACAA,KAAK2tC,UAAU9Z,SAASnwB,GAAQ+yC,EACpC,CA0EA9I,SAAAA,CAAUjqC,EAAO+yC,GAAY,QACXv5B,IAAVxZ,IACA1D,KAAK02C,aAAehzC,GAIpBA,EAAQ1D,KAAK21C,WACbhe,EAAA33B,KAAK0yC,GAAA0D,IAALhzC,KAIJpD,MAAAA,KAAK22C,SAASC,SAAS,CACnB1I,KAAMluC,KAAK62C,gBAAgBhjB,SAAS7zB,KAAK02C,aAAc,KACvDvI,SAAUsI,EAAY,OAAS,UAEvC,CAsLAlyC,oBAAAA,GACIozB,EAAA33B,KAAK0zC,GAAAoD,IAAL1zC,KAAApD,KACJ,EAnoBAoxC,GAAA,IAAAhZ,QAAA0c,GAAuBiC,WACnB,OAAO,IAAI3U,SAAQ,CAACuB,EAASqT,KACpB/B,KAAAA,KAAOzG,aAAY,IAChBxuC,KAAK22C,SAAS/d,YAAc,EACrB+K,KAGX3jC,KAAK60C,OAAS,EA3DL,KA4DL70C,KAAK60C,MACEmC,EACH,6EAFR,IAKD,IAAG,GAEd,EAEA3F,GAAA,IAAAjZ,QAAAgd,GAAI6B,SAAC7wC,EAAKC,GACN,MAAM6wC,EAAkBvf,EAAA33B,KAAKsxC,GAAA6F,IAAL/zC,KAAgBiD,KAAAA,QAChB6W,IAApBg6B,IACAl3C,K3EhEsBo3C,CAACjzC,IACzBkzC,MAAAA,EAAMlzC,EAAI2nB,MAAM,gBACtB,OAAKurB,EACEA,EAAI32C,KAAI,CAAC4I,EAAGzD,KACXyxC,IAAAA,EAAMhuC,EAAE1G,cACRiD,OAAM,IAANA,IACAyxC,EAAMA,EAAI33B,MAAM,IAAIjf,KAAI,CAACwnB,EAAGqvB,IAAa,IAANA,EAAUrvB,EAAE6G,cAAgB7G,IAAInnB,KAAK,KAErEu2C,CAAAA,IACRv2C,KAAK,IAPWoD,CAAAA,E2E8DNizC,CAAmBhxC,IAAQ8wC,EAExC,EAEA5F,GAAA,IAAAlZ,QAAA+e,GAAUK,SAACnxC,GACFytB,OAAAA,MAAMztB,GAEU,SAAVA,GAEU,UAAVA,GAGAA,EANA2lB,WAAW3lB,EAQ1B,EAEAkrC,GAAA,IAAAqD,QAAAA,GAAc6C,WACJ,MAAEnhC,QAAAA,EAASohC,YAAAA,GAAgB13C,KAAKjB,MAGtCiB,KAAK2sB,UAAY3sB,KAAK8N,cAAc,cACpC9N,KAAK23C,QAAU33C,KAAK8N,cAAc,YAClC9N,KAAK22C,SAAW32C,KAAK8N,cAAc,MAGnC9N,KAAK02C,aAAe,EACpB12C,KAAK03C,YAAcA,EACfptC,EAAe5F,GAAGK,OAClB/E,KAAKsW,QAAUA,EAAQvR,OAChBuF,EAAe5F,GAAGO,OACzBjF,KAAKsW,QAAUA,EAAQrR,OAEvBjF,KAAKsW,QAAUA,EAAQpR,QAI3B,IAAA,MAAW0yC,KAAY53C,KAAKsW,QACxBqhB,EAAA33B,KAAKqxC,GAAA+D,IAALhyC,UAAUw0C,EAAU53C,KAAKsW,QAAQshC,IAIjC53C,KAAK8zC,iBACL9zC,KAAK6zC,WAAa7zC,KAAK4zC,gBAAiB,GAIxC5zC,KAAKi0C,UACLj0C,KAAK2sB,UAAUtsB,UAAUC,IAAI,YAIjCN,KAAK63C,gBClIsB3iB,CAAAA,GACxBA,IAAarzB,E/E8GK,O+E9G4BA,EDiI1Bi2C,CAAoB93C,KAAKk1B,UAChDl1B,KAAKiH,aAAa,WAAYjH,KAAKk1B,UAGnCyC,EAAA33B,KAAKoyC,GAAA2F,IAAL30C,KACAu0B,MAAAA,EAAA33B,KAAKqyC,GAAA2F,IAAL50C,WACAu0B,EAAA33B,KAAKuyC,GAAA0F,IAAL70C,KAAApD,KACJ,EA2CAwxC,GAAA,IAAAkD,QAAAA,GAAOwD,WACE13C,KAAAA,UAAY,uEAAuER,KAAK2uB,uBACjG,EAEA8iB,GAAA,IAAAmE,QAAAA,GAAcuC,YAEWn4C,KAAK4zC,gBAAkB5zC,KAAK21C,WAAa,EAGtD31C,KAAKo4C,YAAcp4C,KAAKq4C,aACxBr4C,KAAKo4C,WAAWx7B,SAChB5c,KAAKq4C,WAAWz7B,WAMnB5c,KAAKo4C,aACNp4C,KAAKo4C,WAAazgB,EAAA33B,KAAK0xC,GAAA4G,IAALl1C,KAAApD,KAAmB,SAEpCA,KAAKq4C,aACNr4C,KAAKq4C,WAAa1gB,EAAA33B,KAAK0xC,GAAA4G,IAALl1C,KAAmBpD,KAAA,SAE7C,EAEA0xC,GAAA,IAAA4G,QAAAA,GAAaC,SAACC,EAAKC,GAAkB,GAC3B,MAAE96B,SAAAA,EAAW,GAAIhK,GAAAA,EAAK,GAAI/S,KAAAA,EAAO,GAAIqP,SAAAA,EAAW,IAAOjQ,KAAKjB,MAAMqc,UAAY,GAC9Es9B,EAAiBD,EAAkBz4C,KAAKk1B,SAAWl1B,KAAK63C,gBACxDc,EAAiB,SAARH,EAETI,EAAW50C,SAASwhB,cAAc,UACxCozB,OAAAA,EAASv4C,UAAUC,IAAIk4C,GACvB/uC,EAAcmvC,EAAU,CACpB7uC,UAAW,aACXmrB,SAAUwjB,EACV3zB,KAAM,KACNqQ,WAAYujB,EAAS,yBAA2B,0BAChDh4C,MAAOX,KAAK03C,YAAYc,GACxBp0B,kBAAmBzG,EACnBuY,YAAaviB,EACbwiB,cAAev1B,EACfw1B,kBAAmBnmB,IAElBwoC,EAGDE,EAAS34C,KAAK64C,QAAQC,QAAQF,GAAY54C,KAAK64C,QAAQE,OAAOH,GAF9DD,EAAS34C,KAAK2sB,UAAUmsB,QAAQF,GAAY54C,KAAK2sB,UAAUosB,OAAOH,GAI/DA,CACX,EAEAjH,GAAA,IAAAkE,QAAAA,GAAUmD,WACN,IAAKh5C,KAAK6zC,YAAiC,IAAnB7zC,KAAK21C,UAKzB,YAHI31C,KAAKi5C,KACLj5C,KAAKi5C,IAAIr8B,UAMb5c,KAAKi5C,KACLj5C,KAAKi5C,IAAIr8B,SAGPq8B,MAAAA,EAAMj1C,SAASwhB,cAAc,OAEnC,IAAI0zB,EAAU,GACd,IAAA,IAASrzC,EAAI,EAAGA,GAAK7F,KAAK21C,UAAW9vC,IACjCqzC,GAAWvhB,EAAA33B,KAAK4xC,GAAAuH,IAAL/1C,KAAmByC,KAAAA,GAGlCozC,EAAIz4C,UAAY,GAAG04C,IAEnBl5C,KAAK2D,YAAYs1C,GACjBj5C,KAAKi5C,IAAMj5C,KAAK8N,cAAc,OAC9B9N,KAAKo5C,YAAcp5C,KAAKomB,iBAAiB,aAC7C,EAEAwrB,GAAA,IAAAxZ,QAAA+gB,GAAaE,SAAC31C,GACV,MAAO,sBAAsBA,kBAAsB1D,KAAK03C,YAAYuB,OAAOv1C,2BAC/E,EAEAmuC,GAAA,IAAAiE,QAAAA,GAAcwD,WACLt5C,KAAK8zC,gBAAqC,IAAnB9zC,KAAK21C,WAS7B31C,KAAK64C,SACL74C,KAAK64C,QAAQj8B,SAGjB5c,KAAK64C,QAAU70C,SAASwhB,cAAc,OACtCxlB,KAAK64C,QAAQx4C,UAAUC,IAAI,WAC3BN,KAAK64C,QAAQx4C,UAAUC,IAAI,YAC3BN,KAAK64C,QAAQ5xC,aAAa,cAAe,QAEzCjH,KAAK64C,QAAQr4C,UAAY,yBAAyBR,KAAK02C,aAAe,mDAE9D12C,KAAK21C,UAAY,WAEzB31C,KAAKo4C,WAAazgB,EAAA33B,KAAK0xC,GAAA4G,IAALl1C,KAAmBpD,KAAA,QAAQ,GAC7CA,KAAKq4C,WAAa1gB,EAAA33B,KAAK0xC,GAAA4G,IAALl1C,KAAmBpD,KAAA,QAAQ,GAE7CA,KAAK2D,YAAY3D,KAAK64C,UAvBd74C,KAAK64C,SACL74C,KAAK64C,QAAQj8B,QAuBzB,EAEAk1B,GAAA,IAAAiE,QAAAA,GAAgBwD,YACPv5C,KAAK+zC,kBAAoB/zC,KAAKi0C,WAI/Bj0C,KAAKw5C,gBACL7hB,EAAA33B,KAAKkyC,GAAAuH,IAALr2C,KAAapD,KAAA,oBAAqBA,KAAKw5C,gBAAgB,GAGvDx5C,KAAK05C,iBACL/hB,EAAA33B,KAAKkyC,GAAAuH,IAALr2C,KAAapD,KAAA,oBAAqBA,KAAK05C,gBACvC/hB,EAAA33B,KAAKkyC,GAAAuH,IAALr2C,KAAapD,KAAA,gCAAiCA,KAAK05C,eAAiB,OAGxE15C,KAAK2sB,UAAUtsB,UAAUC,IAAI,gBACjC,EAEAyxC,GAAA,IAAAwE,QAAAA,GAAgBoD,WAIZ,IAAK35C,KAAKi0C,WEvRM2F,MAGdhyC,MAAAA,EAAQ9C,OAAO4C,UAAUC,UACxB,MAAA,iCAAiCF,KAAKG,EAAK,EFmRvBgyC,GACnB,OAIC55C,KAAK65C,YACN75C,KAAK65C,UAAY71C,SAASwhB,cAAc,MACxCxlB,KAAK65C,UAAUx5C,UAAUC,IAAI,cAC7BN,KAAK65C,UAAU5yC,aAAa,eAAe,GAC3CjH,KAAK22C,SAAShzC,YAAY3D,KAAK65C,YAGnC,MAAMC,GAAkB95C,KAAK+5C,kBAAoB/5C,KAAKg6C,W9EzN/B,G8E0NvBh6C,KAAK65C,UAAUtrC,MAAM8rB,YAAY,QAASyf,EAAiB,MAC/D,EAEA9H,GAAA,IAAAuD,QAAAA,GAAuB0E,WAEdtD,KAAAA,SAASt2C,UAAUuc,OAAO,aAE/B,IAAIs9B,EAAYl6C,KAAKk6C,gBAGEh9B,IAAnBld,KAAKk6C,WAA8C,SAAnBl6C,KAAKk6C,aACrCA,GACKl6C,KAAK22C,SAASrO,YAActoC,KAAKg6C,WAAah6C,KAAKm1C,WAAa,IACjEn1C,KAAKm1C,YAGbn1C,KAAKg0C,cAAgBjuC,KAAKC,MAAMhG,KAAK22C,SAAS/d,YAAcshB,EAUhE,EAEAjI,GAAA,IAAAgE,QAAAA,GAAmBkE,WAIf,GAHAn6C,KAAK62C,gBAAkB,GACvB72C,KAAKo6C,UAAYp6C,KAAK22C,SAASrO,YAActoC,KAAK22C,SAAS/d,YAExB,IAA/B54B,KAAKk1C,eAAe30C,OACpB,OAKJ,MAAM85C,EAAsBr6C,KAAKk1C,eAAe,GAAGoF,WAEnDt6C,KAAKomB,iBAAiB,sCAAsC3iB,SAAQiG,IAChE1J,KAAK62C,gBAAgBxsC,KAAKX,EAAQ4wC,WAAaD,EAAmB,GAE1E,EAEAnI,GAAA,IAAAuH,QAAAA,GAAOc,SAAC35C,EAAMyF,EAAOm0C,GAAQ,GACzBx6C,KAAKuO,MAAM8rB,YAAYz5B,EAAM45C,EAAQn0C,E9ExQd,G8EwQwC,MAAQA,EAC3E,EAEA8rC,GAAA,IAAAqD,QAAAA,GAAiBiF,WACT,GAAmB,SAAnBz6C,KAAKk6C,UAAsB,CACrBQ,MAAAA,GACD16C,KAAK2sB,UAAU4b,aAAevoC,KAAKg0C,cAAgB,GAAKh0C,KAAKg6C,YAC7Dh6C,KAAKg0C,eAAiB,GAC3Brc,EAAA33B,KAAKkyC,GAAAuH,IAALr2C,KAAApD,KAAa,eAAgB06C,GAAe,EAChD,MAAW16C,KAAKk6C,WACZviB,EAAA33B,KAAKkyC,GAAAuH,IAALr2C,KAAApD,KAAa,eAAgBA,KAAKk6C,WAAW,EAErD,EAEA9H,GAAA,IAAA2F,QAAAA,GAAqB4C,WACW,SAAxB36C,KAAK46C,eACLjjB,EAAA33B,KAAKkyC,GAAAuH,IAALr2C,UAAa,qBAAsB,aACJ8Z,IAAxBld,KAAK46C,gBACZjjB,EAAA33B,KAAKkyC,GAAAuH,IAALr2C,KAAapD,KAAA,qBAAsBA,KAAK46C,gBAAgB,EAEhE,EAEAvI,GAAA,IAAA2F,QAAAA,GAAgB6C,YACR76C,KAAKg6C,WAAgC,IAAnBh6C,KAAKg6C,YACvBriB,EAAA33B,KAAKkyC,GAAAuH,IAALr2C,KAAApD,KAAa,eAAgBA,KAAKg6C,WAAW,EAErD,EAEA1H,GAAA,IAAAoD,QAAAA,GAAeoF,WACP96C,KAAKm0C,UACLn0C,KAAK22C,SAASt2C,UAAUC,IAAI,YAEpC,EAEAiyC,GAAA,IAAA0F,QAAAA,GAAkB8C,WACV/6C,KAAKg7C,uBACLrjB,EAAA33B,KAAKkyC,GAAAuH,IAALr2C,KAAApD,KAAa,2BAA4BA,KAAKg7C,sBAEtD,EAEAxI,GAAA,IAAAiD,QAAAA,GAAoBwF,WAChBtjB,EAAA33B,KAAKkyC,GAAAuH,IAALr2C,KAAApD,KAAa,oBAAqBA,KAAKg0C,cAC3C,EAEAvB,GAAA,IAAAuD,QAAAA,GAAoBkF,WACZl7C,KAAK21C,UAAY,GAKrB31C,KAAK22C,SAASt2C,UAAUC,IAAI,YAChC,EAQAoyC,GAAA,IAAA0D,QAAAA,GAAa+E,WACTxjB,EAAA33B,KAAK4yC,GAAAwI,IAALh4C,KACAu0B,MAAAA,EAAA33B,KAAK6yC,GAAAwI,IAALj4C,KACAu0B,MAAAA,EAAA33B,KAAK8yC,GAAAwI,IAALl4C,WACAu0B,EAAA33B,KAAK+yC,GAAAwI,IAALn4C,KAAApD,KACJ,EAEA2yC,GAAA,IAAAva,QAAAojB,GAAmBC,SAAC/3C,GAChBi0B,EAAA33B,KAAK4yC,GAAAwI,IAALh4C,UAAuBM,GACvBi0B,EAAA33B,KAAK8yC,GAAAwI,IAALl4C,KAAApD,KACJ,EAEA4yC,GAAA,IAAAxa,QAAAgjB,GAAiBM,SAAChF,KACR12C,KAAK4zC,gBAAkB5zC,KAAK21C,WAAa,KAAO31C,KAAK8zC,iBAK3D9zC,KAAKo4C,WAAW/3C,UAAUuc,OAAO,QACjC5c,KAAKq4C,WAAWh4C,UAAUuc,OAAO,QAGP,IAAtB5c,KAAK02C,aACL12C,KAAKo4C,WAAW/3C,UAAUC,IAAI,SACvBN,KAAK02C,eAAiB12C,KAAK21C,WAAae,IAAiB12C,KAAK21C,YACrE31C,KAAKq4C,WAAWh4C,UAAUC,IAAI,QAEtC,EAEAuyC,GAAA,IAAAwI,QAAAA,GAAgBM,YACP37C,KAAK6zC,YAAc7zC,KAAK21C,WAAa,IAI1C31C,KAAKo5C,YAAY31C,SAAQic,IACrBA,EAAKrf,UAAUuc,OAAO,SAAQ,IAGlC5c,KAAKo5C,YAAYp5C,KAAK02C,cAAcr2C,UAAUC,IAAI,UACtD,EAEAwyC,GAAA,IAAAwI,QAAAA,GAAWM,YACF57C,KAAK8zC,gBAAqC,IAAnB9zC,KAAK21C,WAI5B31C,KAAK8zC,iBAIV9zC,KAAK64C,QAAQ/qC,cAAc,YAAY/K,YAAc8wB,SAAS7zB,KAAK02C,aAAe,GACtF,EAEA3D,GAAA,IAAAwI,QAAAA,GAAgBM,WAEZ,IAAK77C,KAAKi0C,SACN,OAGCiB,KAAAA,eAAezxC,SAAQiG,IACxBA,EAAQzC,aAAa,gBAAiB,OAAM,IAG5C60C,IAAAA,EAAYjoB,SAAS7zB,KAAK02C,cAC9B,IAAA,IAAS7wC,EAAI,EAAGA,EAAI7F,KAAKg0C,cAAenuC,IAChC7F,KAAKk1C,eAAe4G,EAAYj2C,IAChC7F,KAAKk1C,eAAe4G,EAAYj2C,GAAG+4B,gBAAgB,gBAG/D,EAoBAoU,GAAA,IAAAsD,QAAAA,GAAoByF,WACa,IAAzB/7C,KAAK2zC,iBAAyB3zC,KAAK2zC,gBAAkB3zC,KAAK21C,UAAY,GAG1E31C,KAAK2tC,UAAU3tC,KAAK2zC,iBAAiB,EACzC,EAEAV,GAAA,IAAAwB,QAAAA,GAASuH,WAEDh8C,KAAKi8C,aACLxL,aAAazwC,KAAKi8C,aAGtBtkB,EAAA33B,KAAKmzC,GAAAgD,IAAL/yC,KAAApD,MAGAA,KAAKi8C,YAAcnlB,YAAW,KAE1Ba,EAAA33B,KAAKiyC,GAAAgE,IAAL7yC,KAAApD,MAEA,MAAMk8C,EAAqBn2C,KAAKyP,MAAMxV,KAAK22C,SAASzQ,YAGpD,IAAIxiC,EAAQ1D,KAAK62C,gBAAgBjwC,QAAQs1C,IAOrCx4C,IADAA,IACAA,EAAQ1D,KAAK62C,gBAAgBjwC,QAAQs1C,EAAqB,SAE1Dx4C,IACAA,EAAQ1D,KAAK62C,gBAAgBjwC,QAAQs1C,EAAqB,IAI1DA,IAAuBl8C,KAAKo6C,YAC5B12C,EAAQ1D,KAAK21C,WAGbjyC,GAAS,GACTi0B,EAAA33B,KAAKozC,GAAA+I,IAAL/4C,UAAoBM,GAAO,GAG/Bi0B,EAAA33B,KAAK2yC,GAAA6I,IAALp4C,KAAyBM,KAAAA,EAAAA,GAC1B,IACP,EAEAwvC,GAAA,IAAAgD,QAAAA,GAAiBkG,YACRp8C,KAAKi0C,WAAaj0C,KAAKk1C,eAAe30C,SAI3CP,KAAK+5C,kBAAoBlmB,SACrBwoB,iBAAiBr8C,KAAK22C,UAAU2F,iBAAiB,iBAGrDt8C,KAAKu8C,kBAAoBv8C,KAAKk1C,eAAe,GAAGtc,YAAc54B,KAAKg6C,UACvE,EAEA7G,GAAA,IAAAgD,QAAAA,GAAWqG,WACP,IAAKx8C,KAAKi0C,SACN,OAEEwI,MAAAA,EAAUz8C,KAAK22C,SAASzQ,WAE9BlmC,KAAKk1C,eAAezxC,SAAQ,CAACic,EAAMhc,KAI/B,IAAIg5C,EAFmBh9B,EAAK46B,WAAat6C,KAAK+5C,kBAEjB/5C,KAAKu8C,kBAG9BI,EAAa,IAEbF,EAAUC,EAEVC,EAAa,EACNF,GAAWz8C,KAAKu8C,kBAAoB74C,EAE3Ci5C,EAAa52C,KAAKyP,OAAQknC,EAAQD,GAAWz8C,KAAKu8C,kBAAqB,KAChEE,EAAUC,GAAS,EAAI18C,KAAKg0C,eAAiBh0C,KAAKu8C,kBAEzDI,EAAa,EACNF,GAAWC,EAAQ18C,KAAKg0C,cAAgBh0C,KAAKu8C,oBAEpDI,EAAa52C,KAAKyP,MACa,KAA1BxV,KAAKg0C,cAAgB,IAChB0I,EAAQD,GAAWz8C,KAAKu8C,kBAAqB,MAI3D,MAAMK,EAAoBD,EAAa,IACnCE,IAAAA,EACA92C,KAAKyP,MACyE,KAAzEonC,GAAqB,EAAI58C,KAAKk0C,iBAAmBl0C,KAAKk0C,kBACvD,IAERx0B,EAAKyY,kBAAkB5pB,MAAM8rB,YAAY,UAAWwiB,EAAY,GAExE,EAEAzJ,GAAA,IAAA+I,QAAAA,GAAcW,SAACp5C,EAAOq5C,GAAkB,GAC/B/8C,KAAKk1C,eAAexxC,KAIzB1D,KAAK02C,aAAehzC,EAGfq5C,EAGDplB,EAAA33B,KAAK0yC,GAAA0D,IAALhzC,KAAApD,MAFAA,KAAK2tC,YAIb,EAEA0F,GAAA,IAAAe,QAAAA,GAAY4I,WACJh9C,KAAK02C,aAAe,IACpB12C,KAAK02C,aAAe12C,KAAK02C,aAAe,EACxC/e,EAAA33B,KAAK0yC,GAAA0D,IAALhzC,KAAApD,OAEJA,KAAK2tC,WACT,EAEA2F,GAAA,IAAAe,QAAAA,GAAY4I,WACJj9C,KAAK02C,aAAe12C,KAAK21C,YACzB31C,KAAK02C,aAAe12C,KAAK02C,aAAe,EACxC/e,EAAA33B,KAAK0yC,GAAA0D,IAALhzC,KAAApD,OAEJA,KAAK2tC,WACT,EAEA4F,GAAA,IAAAnb,QAAAmc,GAAW2I,SAAC5uC,GACRtO,KAAK02C,aAAe7iB,SAASvlB,EAAEhG,OAAO6qB,QAAQzT,MAC9CiY,EAAA33B,KAAK6yC,GAAAwI,IAALj4C,KACAu0B,MAAAA,EAAA33B,KAAKozC,GAAA+I,IAAL/4C,UAAoBpD,KAAK02C,aAC7B,EAEAlD,GAAA,IAAAuB,QAAAA,GAAcoI,WACV3hC,GAAc,CACVC,UAAWha,EACXia,KAAM,CAAE/H,GAAI3T,KAAK2T,IACjBjK,QAAS1J,MAEjB,EAEAyzC,GAAA,IAAA4C,QAAAA,GAAU+G,WACNzlB,EAAA33B,KAAK0zC,GAAAoD,IAAL1zC,KAAApD,MAEAA,KAAK22C,SAASj6B,iBAAiB,SAAU1c,KAAKw0C,aAC1Cx0C,KAAKo4C,YACLp4C,KAAKo4C,WAAW17B,iBAAiB,QAAS1c,KAAKyrC,gBAE/CzrC,KAAKq4C,YACLr4C,KAAKq4C,WAAW37B,iBAAiB,QAAS1c,KAAKurC,gBAE/CvrC,KAAKo5C,aACLp5C,KAAKo5C,YAAY31C,SAAQiG,IACrBA,EAAQgT,iBAAiB,QAAS1c,KAAKs0C,cAAa,GAGhE,EAEAZ,GAAA,IAAAoD,QAAAA,GAAYuG,WACRr9C,KAAK22C,SAAS95B,oBAAoB,SAAU7c,KAAKw0C,aAC7Cx0C,KAAKo4C,YACLp4C,KAAKo4C,WAAWv7B,oBAAoB,QAAS7c,KAAKyrC,gBAElDzrC,KAAKq4C,YACLr4C,KAAKq4C,WAAWx7B,oBAAoB,QAAS7c,KAAKurC,gBAElDvrC,KAAKo5C,aACLp5C,KAAKo5C,YAAY31C,SAAQiG,IACrBA,EAAQmT,oBAAoB,QAAS7c,KAAKs0C,cAAa,GAGnE,EAOJtzC,eAAeC,IAAI,sBAAwBD,eAAeE,OAAO,oBAAqBiwC,IGnsBtF,MAAMmM,GAAazvC,GAAa,IAAIA,EAAUuY,iBAAiB,eAAennB,OAAOs+C,GAAS,CAAA,GAExFA,GAAUA,CAACC,EAAMC,KACb,MAAEp4C,IAAAA,GAAQo4C,EAAKtqB,QAGfuqB,EAAWr4C,EAAIymB,MAAM,iBAE3B,OAAiB,OAAb4xB,EACOC,GAAYH,EAAMC,EAAMC,GAExB,IAAKF,EAAM,CAACC,EAAKtqB,QAAQ9tB,KAAMo4C,IAIxCE,GAAcA,CAACH,EAAMC,GAAM,CAAG78C,EAAM8C,WACnBwZ,IAAfsgC,EAAK58C,KACL48C,EAAK58C,GAAQ,IAEjB48C,EAAK58C,GAAM8C,GAAS+5C,EACbD,GCVEI,GAAcA,CAACC,EAAS,UAAWllB,EAAQ,OACpD,MAAMmlB,EAAQ,GAEd,OAAID,GACAC,EAAMzzC,KAAK,YAAYwzC,KAGvBllB,GACAmlB,EAAMzzC,KAAK,WAAWsuB,KAGnB,IAAImlB,EAAM/8C,KAAK,MAAI,ECnBjBg9C,GAAiB,WCM9B,MAAMC,WAAen+C,YACjBC,WAAAA,GACIC,QACAC,KAAKK,UAAUC,IAAI,YACvB,CAEA,6BAAW4uB,GACP,MAAO,CAAC,QACZ,CAEAO,wBAAAA,CAAyB7uB,GACR,UAATA,GACAZ,KAAKi+C,UAEb,CAEA/9C,iBAAAA,GACIF,KAAKjB,MAAQP,EAAYwB,KAAKvB,YAC9BuB,KAAKG,SACLH,KAAKw9C,KAAOF,GAAWt9C,MACvBA,KAAKw8B,eACLx8B,KAAKu8B,cACT,CAEAA,YAAAA,GACU,MAAE57B,MAAAA,EAAOya,SAAAA,GAAapb,KAAKjB,MAE3B0H,EAAOzG,KAAK8N,cAAc,KAE5BrH,IACAA,EAAKg3B,QAAU,KACXre,GAAgB,CACZF,SAAUve,KACPya,GACN,EAGb,CAEAohB,YAAAA,GACQ,IAAEn1B,IAAAA,EAAM,GAAI62C,WAAAA,EAAa,IAAOl+C,KAAKjB,MAAMo/C,OACzC,MAAEA,OAAAA,GAAWn+C,KAAKw9C,KAGL,KAAfU,IACAA,EAAa72C,GAGjB62C,GFvB6BE,EACjCP,EAAS,SACTQ,EAAc,MACdC,EAAc,OACdC,EAAe,OACfC,EAAc,SAEVl0C,EAAe5F,GAAGK,OACX64C,GAAYC,EAAQQ,GACpB/zC,EAAe5F,GAAGO,OAClB24C,GAAYC,EAAQS,GACpBh0C,EAAe5F,GAAGQ,QAClB04C,GAAYC,EAAQU,GAEpBX,GAAYC,EAAQW,GESbJ,CAAsB,QAAS,MAAO,MAAO,KAAM,OACjEF,GAAc,eAEVC,GAAUD,GACVp3C,EAASq3C,EAAQ,MAAO,GAAGD,IAAcA,EAEjD,CAEA/9C,MAAAA,GACU,MAAEQ,MAAAA,EAAO8F,KAAAA,EAAMg4C,MAAAA,EAAOC,cAAAA,EAAgB,aAAgB1+C,KAAKjB,OACzD4H,WAAAA,EAAYD,SAAAA,GAAaF,EAAYC,GAE7CzG,KAAKQ,UAAY,iBAETi+C,IAAUV,GACJ/9C,KAAKsiB,eACL,YAAY5b,iBAAwBC,kBAA2B+3C,KAAiB/9C,wBACpFX,KAAKsiB,qDAITtiB,KAAK2+C,0BAGX3+C,KAAKyG,KAAOzG,KAAK8N,cAAc,KAC/B9N,KAAKW,MAAQX,KAAK8N,cAAc,QAChC2wC,GAASz+C,KAAKiH,aAAa,QAASw3C,GACpCz+C,KAAK4+C,UACT,CAEAX,QAAAA,GACUQ,MAAAA,EAAQz+C,KAAKklB,aAAa,SDtFV,aCwFlBu5B,GACAz+C,KAAKyG,KAAKQ,aAAa,eAAgB,QACvCjH,KAAKW,MAAMN,UAAUC,IAAI,eACzBN,KAAKW,MAAMN,UAAUuc,OAAO,iBAExB6hC,IAAUV,IACV/9C,KAAKyG,KAAKm4B,gBAAgB,gBAG9B5+B,KAAKW,MAAMN,UAAUuc,OAAO,eAC5B5c,KAAKW,MAAMN,UAAUC,IAAI,eAEjC,CAEAs+C,QAAAA,GACU,MAAEp7B,MAAAA,GAAUxjB,KAAKjB,MAEnBykB,GAAmB,KAAVA,GACTxjB,KAAKuO,MAAM8rB,YAAY,2BAA4B7W,EAE3D,CAEAlB,YAAAA,GACQ,IAAEjb,IAAAA,EAAM,GAAI62C,WAAAA,EAAa,IAAOl+C,KAAKjB,MAAMo/C,OACzC,MAAEM,MAAAA,GAAUz+C,KAAKjB,MAEnBsI,MAAQ,KAARA,GAA6B,KAAf62C,EACP,GAIJ,2DACHO,IAAUV,GAAiB,sBAAwB,MAE3D,CAEAY,WAAAA,GACU,MAAEh+C,MAAAA,EAAO89C,MAAAA,GAAUz+C,KAAKjB,MAEzB4B,GAAAA,EAIL,MAAO,4BACH89C,IAAUV,GAAiB,cAAgB,OAC1Cp9C,UACT,EAGJK,eAAeC,IAAI,cAAgBD,eAAeE,OAAO,YAAa88C,ICnItE,MAAMa,GACF/+C,WAAAA,GACSg/C,KAAAA,cAAgBC,GACzB,CAQAvvB,MAAAA,CAAOmM,GACHA,EAAYl4B,SAAQ,EAAG8iB,SAAAA,EAAUkO,SAAAA,EAAUne,QAAAA,MACvC,GAAItW,KAAK8+C,UAAUE,IAAIz4B,GAEnB,YADQ04B,QAAAA,KAAK,0BAA0B14B,qBAIrC24B,MAAAA,EAAUl7C,SAASoiB,iBAAiBG,GAEtC24B,GAAmB,IAAnBA,EAAQ3+C,OAER,YADQ0+C,QAAAA,KAAK,mCAAmC14B,MAIpD,MAAM8U,EAAW,IAAIpzB,qBAAqBwsB,EAAUne,GACpD4oC,EAAQz7C,SAAQiG,GAAW2xB,EAAS9yB,QAAQmB,KAC5C1J,KAAK8+C,UAAUlvB,IAAIrJ,EAAU,CAAE8U,SAAAA,EAAU6jB,QAAAA,GAAS,GAE1D,CAMA72C,SAAAA,CAAUke,GACN,MAAMpe,EAAQnI,KAAK8+C,UAAU79C,IAAIslB,GAEjC,GAAIpe,EAAO,CACD,MAAEkzB,SAAAA,EAAU6jB,QAAAA,GAAY/2C,EAC9B+2C,EAAQz7C,SAAQiG,GAAW2xB,EAAShzB,UAAUqB,IAClD,MACYu1C,QAAAA,KAAK,mCAAmC14B,KAExD,CAMA2V,OAAAA,CAAQ3V,GACJ,MAAMpe,EAAQnI,KAAK8+C,UAAU79C,IAAIslB,GAEjC,GAAIpe,EAAO,CACD,MAAEkzB,SAAAA,GAAalzB,EACrBkzB,EAASuU,aACT5vC,KAAK8+C,UAAUK,OAAO54B,EAC1B,MACY04B,QAAAA,KAAK,mCAAmC14B,KAExD,CAKA64B,UAAAA,GACSN,KAAAA,UAAUr7C,SAAQ0E,IACnBA,EAAMkzB,SAASuU,gBAGnB5vC,KAAK8+C,UAAUO,OACnB,EC9EW,MAAMC,GACjBx/C,WAAAA,GACIE,KAAKu/C,QAAU,IAAInd,SAAQ,CAACuB,EAASqT,KAC5BA,KAAAA,OAASA,EACdh3C,KAAK2jC,QAAUA,CAAAA,GAEvB,ECJJ,MA8BMiT,GAAWA,CAACA,EAA0C,EAAGtgC,EAAkE,CAAA,KACvH,MAAEkpC,eAAgBC,EAAqB,KAAQnpC,EAC/CopC,EAAW,IAAIJ,GAErB,IAAIK,EAAyB,EAEzB,IACiBC,EArCKA,EAAChJ,EAAyCiJ,EAAmB,OACnF,GAAoB,iBAAbjJ,EACAA,OAAAA,EAGX,MAAMkJ,EAAsC,iBAAblJ,EAAwBA,EAAW5yC,SAAS8J,cAAc8oC,GAErFkJ,GAAoB,OAApBA,GAAgD,iBAAblJ,EACnC,MAAM,IAAIpvC,MAAM,8CAA8CovC,MAGlE,OAAO9xC,OAAOi7C,QAAUD,EAAiBjR,wBAAwBmR,IAAMH,CAAAA,EA0BlDD,CAAsBhJ,EAAUtgC,EAAQupC,wBAEtDrgD,GAEH,YADAC,QAAQD,MAAMA,EAElB,CAEA,IAAIygD,EAAc,EACZC,MAAAA,EAAmBp7C,OAAOq7C,YAAY5Z,MAEtC6Z,EADgBt7C,OAAOi7C,QACOJ,EAE9BH,EAnCoBa,EAACb,EAAwBY,KACnD,MAAME,EAAiBx7C,OAAOoiC,YACxBqZ,EAAav8C,SAASM,KAAK+jC,aAEjC,OAAI+X,EAAcE,GAAkBC,EAAaD,EAAiB,EACvDv6C,KAAK4hC,IACR6X,EACAA,GAAkBz5C,KAAK4hC,IAAIyY,IAAgBG,EAAaD,KAGzDd,CAAAA,EAyBgBa,CAAsBZ,EAAoBW,GAE3DI,EAAiBN,EAAmBV,EAiBnCiB,OAAAA,OAAAA,uBAfP,SAASnS,IACCoS,MAAAA,EAAmB57C,OAAOq7C,YAAY5Z,MAC5C,GAAIma,EAAmBF,EAAgB,CACnCP,GAAeS,EAAmBR,GAAoBV,EACxCS,IAAEA,EAAcA,EAAcA,EAAc,EAC1D,MAAMU,EAAWP,EAAcH,EACxBrJ,OAAAA,SAAS,EAAG+I,GAAkBS,EAAcO,IACnD77C,OAAO27C,sBAAsBnS,EAAI,MAE1BsI,OAAAA,SAAS,EAAG+I,GACnB7oB,YAAW,IAAM4oB,EAAS/b,aAAQzmB,IAAY,KAElD,OAAOwiC,EAASH,OACpB,IAGOG,EAASH,OAAAA,ECvEPqB,GAAkC,kCAOlCC,GAAmB,OAEnBC,GAA8B,CAAC,GAAK,IAMpCC,GAAwB,CACjCC,kBAAmB,OACnBC,YAAa,QACbhN,SAAU,QACViN,uBAAwB,cACxBC,iBAAkB,OAClBC,WAAY,KCGhB,MAAMC,WAA0BxhD,YAC5BC,WAAAA,GACIC,QACAC,KAAKshD,SAAWx8C,OAAOH,WAAavD,EAGpCpB,KAAKi8C,aAAc,EACnBj8C,KAAKuhD,eAAiB,IAAI1C,EAC9B,CAEA3+C,iBAAAA,GACIF,KAAKjB,MAAQP,EAAYwB,KAAKvB,YAC9BuB,KAAKK,UAAUC,IAAI,yBACnBN,KAAKwhD,OAASxhD,KAAKyhD,WACnBzhD,KAAK8O,KAAO9O,KAAKwhD,OAAS,OAAS,SACnCxhD,KAAK0hD,gBAAkB1hD,KAAKjB,MAAM4iD,kBAAoB,OAAS,QAC/D3hD,KAAKiH,aAAa,OAAQjH,KAAK8O,KAAKlM,eACpC5C,KAAKiH,aAAa,oBAAqBjH,KAAK0hD,iBAC5C1hD,KAAK4hD,MACT,CAEAH,QAAAA,GACI,IAAKzhD,KAAKjB,MACC,OAAA,EAEL,MAAEyiD,OAAAA,EAAS,SAAYxhD,KAAKjB,MAClC,MAAkB,SAAXyiD,CACX,CAEAI,IAAAA,GACSzhD,KAAAA,SACLH,KAAKw9C,KAAOF,GAAWt9C,MACvBA,KAAKixC,OAASjxC,KAAK8N,cAAc,qBACjC9N,KAAK6hD,gBCjDS7Q,CAAAA,IACZ8Q,MAAAA,EAAwB7Q,IAE1BD,EAAY+Q,SAAW/Q,EAAYgR,cAE7B/c,MAAAA,EAAQgM,EAAO7qB,iBAAiB,KAEtC,IAAA,MAAY1iB,EAAO+C,KAASw+B,EAAM/8B,UAC9BzB,EAAKiW,iBAAiB,QAASulC,EAAkBpgC,KAAK7hB,WAAM0D,GAAM,EAIpEu+C,EAAoBA,CAACv+C,EAAOw+C,KAC9BA,EAAOn8B,iBAEP,MAAMtf,EAAOy7C,EAAO55C,OAAOkxB,QAAQ,KAEnC,GAAI/yB,EAAM,CACN+U,GAAc,CACVC,UAAWmlC,GACXllC,KAAM,CAAEymC,UAAW17C,EAAKye,aAAa,aAAcxhB,MAAAA,KAGvDstC,EAAY/C,QAAU+C,EAAY/C,OAAOxnC,EAAM/C,GAC/CoB,OAAO4gC,SAASxH,KAAOz3B,EAAKye,aAAa,aAEzC,IAAIk9B,EAAa,GACbC,EAAe,GACfC,EAAc,GACdtR,EAAYxX,QAAQ,sBACpB8oB,EAAc77C,EAAKqH,cAAc,sBAAsB/K,YACvDs/C,EAAerR,EAAYjyC,MAAMqmC,yBAA2B,KAE5Did,EAAerR,EAAYjyC,MAAMqmC,yBAA2B,GAExDkd,EADA77C,EAAKi7B,mBAAmB3+B,YACV0D,EAAKi7B,mBAAmB3+B,YAExB0D,EAAKye,aAAa,eAGxCk9B,EAAaC,EAAe,GAAGA,OAAkBC,IAAgB,GAAGA,IACpEtR,EAAYnb,MAAMusB,EACtB,GAGEG,EAAkBL,IACd,MAAEC,UAAAA,EAAWz+C,MAAAA,GAAUwY,GAAUgmC,GAEvClR,EAAYwR,eAAiBxR,EAAYwR,cAAcL,GACvDnR,EAAYyR,aAAezR,EAAYyR,YAAYN,GACnDnR,EAAYwF,cAAgBxF,EAAYwF,aAAa2L,EAAWz+C,EAAK,EA8BlE,MAAA,CAAEg/C,gBA3BezR,IACpB,MAAMz0B,EAAiB,GAEnBy0B,OAAAA,GACAz0B,EAAenS,KAAK,CAChBX,QAASsnC,EACTliC,KAAMrN,EACNkb,SAAUmlC,EAAsBjgC,KAAK7hB,WAAMixC,GAC3C36B,QAAS,CAAEqsC,MAAM,KAGzBnmC,EAAenS,KAAK,CAChBX,QAAS5E,OACTgK,KAAM8xC,GACNjkC,SAAU4lC,IAEd/lC,EAAenS,KAAK,CAChBX,QAAS5E,OACTgK,K1FjBiC,gC0FkBjC6N,SAAUq0B,EAAY4R,aAAa/gC,KAAKmvB,KAG5Cz0B,GAAiBC,GAEVA,CAAAA,ID5BgBqmC,CAAc7iD,MAAM0iD,gBAAgB1iD,KAAKixC,QAChEjxC,KAAKuhD,eAAe/xB,OAAO,CACvB,CACIjJ,SAAU,YACVkO,SAAUz0B,KAAKuiD,gBACfjsC,QAAS,CACLklB,UAAWslB,GACXrlB,WAAY,wBAI5B,CAEAt7B,MAAAA,GACIH,KAAKQ,UAAY,GAAGR,KAAK8iD,oBAC7B,CAEAC,gBAAAA,GACW,MAAA,CACHC,UAAWhjD,KAAKwhD,OAAS,OAAS,QAClCyB,gBAAiBjjD,KAAKwhD,OzFkCF,eyFlC8BtkC,EAClDgmC,gBAAiBljD,KAAKwhD,ODjEJ,SCiE8BtkC,KAC7C6jC,GAEX,CAEA+B,gBAAAA,GACU,MACFK,UAAAA,EACAje,4BAAAA,EACAC,wBAAAA,EACAie,gBAAAA,EAAkB,aAClBhoC,SAAAA,GACApb,KAAKjB,MAGHuhB,EAAOtgB,KAAKqjD,WAAW,SAASrjD,KAAK8O,QAErCw0C,EAAgBtjD,KAAK+iD,mBACrBQ,EAAa,CACfjtC,QAAS,CACLvR,OAAQ,CACJuwC,gBAAiBt1C,KAAKwhD,OAASX,GD/FnB,OCgGZxL,WAAYr1C,KAAKwhD,OAAS,ODzFX,MC0FfgC,gBAAiB,WACdF,GAEPr+C,OAAQ,CACJqwC,gBAAiBt1C,KAAKwhD,OAASX,GDpGnB,OCqGZxL,WAAYr1C,KAAKwhD,OAAS,OD9FH,MC+FvBgC,gBAAiB,UACdF,GAEPp+C,QAAS,CACLowC,gBAAiBt1C,KAAKwhD,OAASX,GDzGlB,EC0GbxL,WAAYr1C,KAAKwhD,OAAS,ODpGH,SCqGpB8B,IAGX5L,YAAa,CACTtM,KAAMlG,EACNiG,KAAMhG,EACN8T,IAAKmK,GAEThoC,SAAAA,GAGE61B,EAAS,uCACLkS,yBACEh6C,EAAsBo6C,oCACZvjD,KAAK8O,uBACrBwR,kCAGN,OAAItgB,KAAKwhD,OACEvQ,EAGJ,kCAAkCA,kBAC7C,CAEAoS,UAAAA,CAAWI,GACD,MAAE3nC,QAAAA,EAAU,IAAO9b,KAAKjB,MAEf+c,OAAAA,EACVpb,KAAIgjD,IAAW,IAAKA,EAAQtoC,SAAUpb,KAAKjB,MAAMqc,eAAY8B,MAC7Dxc,KAAIgjD,GAAU1jD,KAAKyjD,GAAgBC,KACnC3iD,KAAK,GAGd,CAEA4iD,YAAAA,CAAaD,GACL,IAAEj9C,KAAAA,EAAM2U,SAAAA,GAAasoC,EACzB,IAAKj9C,EACM,OAAA,KAEL,MAAEE,WAAAA,GAAeH,EAAYC,GAE7Bm9C,EAAqB,IAAKF,EAAQtoC,SAAAA,GAEjC,MAAA,wDAEoBjS,EACfy6C,yBACoBj9C,+CAGpC,CAEAk9C,UAAAA,CAAWC,GACD,MAAEr9C,KAAAA,GAASq9C,EACjB,IAAKr9C,EACM,OAAA,KAEL,MAAEE,WAAAA,EAAYD,SAAAA,GAAaF,EAAYC,GAEtC,MAAA,gDAEYC,iBAAwBC,+GAEPm9C,EAAK3F,OAAO92C,iDACdV,sFAEHm9C,EAAK1oC,UAAUzH,+CACbmwC,EAAK1oC,UAAUxa,qDACXkjD,EAAK1oC,UAAUuC,yDACfmmC,EAAK1oC,UAAUnL,6DAElC6zC,EAAKnjD,0FAK3B,CAGAiiD,YAAAA,GACSb,KAAAA,SAAW/hD,KAAKgiD,aACzB,CAEAQ,aAAAA,CAAcL,GACJ,MAAErmC,QAAAA,EAAU,CAAC,GAAM9b,KAAKw9C,KAC9B,IAAA,MAAWuG,KAAYjoC,EAAS,CAC5B,MAAM4nC,EAAS5nC,EAAQioC,GACjBtF,EAAQsF,IAAa5B,EAAY,WAAa,UACjB,mBAAxBuB,EAAOz8C,cACdy8C,EAAOz8C,aAAa,QAASw3C,EAErC,CACJ,CAEAgE,WAAAA,CAAYN,GACF,MAAE6B,MAAAA,EAAQ,CAAC,GAAMhkD,KAAKw9C,KAC5B,IAAA,MAAWyG,KAAUD,EAAO,CACxB,MAAMF,EAAOE,EAAMC,GACbC,EAAYD,IAAW9B,EAAY,OAAS,QAClD2B,EAAK78C,cAAgB68C,EAAK78C,aAAa,UAAWi9C,EACtD,CACJ,CAEA,kBAAM1N,CAAa2L,EAAWgC,GAC1B,IAAIzgD,EAAQygD,EACNlT,MAAAA,QAAejxC,KAAKw9C,KAAK4G,WAC3BnT,WACWkT,EAAW,KACJlT,EAAO7qB,iBAAiB,gBAChC3iB,SAAQ,CAACgD,EAAMZ,KACbY,EAAKye,aAAa,eAAiBi9B,IACnCz+C,EAAQmC,EAAAA,IAIhBnC,GAASutC,GAAUA,EAAOtD,WAC1BsD,EAAOtD,UAAUjqC,GAG7B,CAEA2gD,IAAAA,CAAK1oC,GACDH,GAAc,CAAE9R,QAAS1J,QAAS2b,GACtC,CAEA,YAAMsyB,CAAOxnC,EAAM/C,GACf1D,KAAKi8C,aAAc,EAEnB,MAAM3zC,EADW7B,EAAKye,aAAa,cAE3B4H,OAAAA,EAAQk3B,MAAAA,GAAUhkD,KAAK+hD,SAGzBuC,EAA4B,IAAV5gD,EAAc,EAAIsgD,EAAMO,OAG1CC,EAAgB,CAAE3E,iBADC/yB,EAAOkzB,IAAMlzB,EAAOy3B,OAASD,SAGhD1N,GAAS,aAAatuC,MAAYk8C,GACxCxkD,KAAKi8C,aAAc,EAGFj4C,SAAS8J,cAAc,aAAaxF,OAC5C42B,MAAM,CAAEulB,eAAe,GACpC,CAEA5uB,KAAAA,GACI,CAGJmsB,WAAAA,GACI,MAAM0C,EAAU1gD,SAAS8J,cAAc,gBACjC62C,EAAa3gD,SAAS8J,cAAc,qBAEpC82C,EAAaF,GAAS7V,yBAA2B,CAAE0V,OAAQ,EAAGM,EAAG,GACjEC,EAAgBH,GAAY9V,yBAA2B,CAAE0V,OAAQ,EAAGM,EAAG,GAEtE,MAAA,CACH/3B,OAAQ,CAAEy3B,OAAQK,EAAWL,OAAQvE,IAAK4E,EAAWC,GACrDb,MAAO,CAAEO,OAAQO,EAAcP,OAAQvE,IAAK8E,EAAcD,GAElE,CAEAtC,eAAAA,CAAgBr6C,GACNC,MAAAA,EAAQD,EAAQ,GAEtB,GAAIC,EAAMC,iBAAmBpI,KAAKi8C,YAAa,CACrC,MAAEtoC,GAAAA,EAAK,IAAOxL,EAAMG,OAAO6qB,QAEjC3X,GAAc,CACVC,UAAWmlC,GACXllC,KAAM,CAAEymC,UAAWxuC,GAAMxL,EAAMG,OAAO4c,aAAa,aAE3D,CACJ,CAEA3gB,oBAAAA,GACIgY,GAAoBvc,KAAK6hD,iBACzB7hD,KAAKuhD,eAAerlB,QAAQ,YAChC,EE/RGnvB,eAAe+0B,KAClB,aAAah9B,OAAOi/B,OACxB,CFgSA/iC,eAAeC,IAAI,0BACfD,eAAeE,OAAO,wBAAyBmgD,IGzSnD,MAAM0D,OAAyBC,IAExB,SAASC,GAAkBC,GACvBH,OAAAA,GAAmB/F,IAAIkG,EAClC,CAaO,MAAMC,GAAmB,mBChBnBC,GAAuB,aACvBC,GAAe,gBAEfC,GAAW,mBACXC,GAA2B,gBAC3BC,GAA8B,kBAC9BC,GAAiC,qBAGjCC,GAAsB,sBACtBC,GAAwB,qBAGxBC,GAA8B,UAC9BC,GAA2B,OCmBlCC,GAAU,CACZC,mBAAe7oC,EACf8oC,UAAW,GAEXpE,KAAM70C,eAAgBk5C,GACXC,OAAAA,OAAAA,YAAcD,EACrBnhD,OAAOg9B,WAAah9B,OAAOg9B,YAAcA,GACzC9hC,KAAK4vB,IAAI,aAAc7pB,KAAKE,SAAW,GAAGuD,SAAS,IAAIN,UAAU,IACjElJ,KAAK4vB,IAAI,kBAAmB,IAC5B5vB,KAAK4vB,IAAI,cAAe,CAAA,GACxB5vB,KAAK4vB,IAAI,cAAe,IACxB5vB,KAAK4vB,IAAI,UAAW,CAAA,GAEb9qB,OAAOg9B,YACjB,EAED,YAAMqkB,GACF,OAAAnmD,KAAK4vB,IAAI,aAAc7pB,KAAKE,SAAW,GAAGuD,SAAS,IAAIN,UAAU,IACjElJ,KAAK4vB,IAAI,WAAY,IACrB5vB,KAAK4vB,IAAI,UAAW,IACpB5vB,KAAK4vB,IAAI,kBAAmB,IAC5B5vB,KAAK4vB,IAAI,UAAW,CAAA,GAEpB5vB,KAAK+lD,mBAAgB7oC,EAEdpY,OAAOg9B,YACjB,EAGDlS,IAAK,SAAUxpB,EAAKC,GAChBrG,KAAKoG,GAAOC,CACf,EACDpF,IAAK,SAAUmF,GACJ,OAAApG,KAAKoG,IAAQ,IACvB,EACDggD,mBAAoB,WAChB,OHpDDr5C,iBACH,OAAOvB,KAAK0B,aAChB,CGkDeC,EACV,EACDk5C,aAAc,WACV,OH/DDt5C,iBACIvB,OAAAA,KAAK2D,SAASm3C,MACzB,CG6Den3C,EACV,EACDo3C,QAAS,GACThtC,SAAU,GACVitC,aAAc,WACV,OAAOxmD,KAAKuZ,QACf,EAEDktC,WAAAA,GACQ,OAAAzmD,KAAK+lD,eAAiB/lD,KAAK+lD,cAAcxlD,SAI7CP,KAAK+lD,cAAgB/lD,KAAKuZ,SAASta,QAAO,CAACynD,EAAKv6C,IACrCu6C,EAAIC,OAAOx6C,EAAQoN,WAC3B,KALQvZ,KAAK+lD,aAQnB,EAEDa,qBAAsB,UAAYC,SAAAA,GAAW,GAAS,IAC5CC,MAAAA,EAAkB9mD,KAAKiB,IAAI,mBAC3B8lD,EAAkB9B,GAAkBE,IACpC6B,GAA2BF,GAmMzC,SAAoCP,EAAU,IACnC,MAAA,CAACp6C,EAASzI,EAAO6V,IAGhBgtC,EAAQ7sB,OAAM16B,GACHioD,GAAuB96C,EAASnN,MACrCua,EAAStE,WAAUsL,GAAKA,EAAE5M,KAAOxH,EAAQwH,OAAQjQ,CAGnE,CA3McwjD,CAA2BJ,GAC3BK,EAAennD,KAAKymD,cAAcznD,OAAO+nD,GACzCK,EAAcpnD,KAAKiB,IAAI,gBAAkB,CAAA,EAE/C,OAAO4lD,EAwPf,SAAsBttC,GAAYnT,IAAAA,EAAKihD,MAAAA,IACnC,MAAMC,EAfV,UAAwBlhD,IAAAA,EAAKihD,MAAAA,IACzB,MAAME,EAAwB,QAAVF,EAEb,MAAA,CAACj/B,EAAGo/B,IACHp/B,EAAEhiB,GAAOohD,EAAEphD,GACJmhD,KAAmB,EAE1Bn/B,EAAEhiB,GAAOohD,EAAEphD,GACJmhD,EAAc,GAElB,EAAA,CAEf,CAGmBE,CAAa,CAAErhD,IAAAA,EAAKihD,MAAAA,IAC5B,MAAA,IACA9tC,EAASva,QAAOuhB,GAAKA,EAAEd,UAASioC,KAAKJ,MACrC/tC,EAASva,QAAOuhB,IAAMA,EAAEd,UAASioC,KAAKJ,GAEjD,CA9P0BK,CAAaR,EAAcC,GAAeD,CAC/D,EACDS,sBAAuB,WACnB,OAAO5nD,KAAK4mD,qBAAqB,CAAEC,UAAU,IAAStmD,MACzD,EAODsnD,cAAe,SAAUC,EAAiBC,GAAU,GAC1C/oD,MAAAA,EAASgB,KAAKiB,IAAI,WAAWtC,MAAKqpB,GAAKA,EAAE5hB,MAAQ0hD,EAAgB1hD,MAElEpH,IAILgpD,GACIhoD,KAAKiB,IAAI,mBACTjC,EACA8oD,EAAgBzhD,MAChByhD,EAAgB/0B,UAGhBkyB,GAAkBE,KAClBnlD,KAAKioD,oBAGTF,GAAW/nD,KAAK00B,OACnB,EACDwzB,qBAAAA,CAAsB9hD,EAAK+hD,EAAkBpJ,OACzC,MAAM//C,EAASgB,KAAKiB,IAAI,WAAWtC,MAAKqpB,GAAKA,EAAE5hB,MAAQA,IACjDgiD,EAAkBpoD,KAAKiB,IAAI,mBAEjCknD,EAAgB1kD,SAAQ,CAACsvB,EAAU1sB,KACL+hD,EAAgBzpD,MACtCqpB,GAAKA,EAAE5hB,MAAQpH,EAAOoH,KAAOiiD,GAAmBrgC,EAAG3hB,MAG9B0sB,GACzBi1B,GAAeI,EAAiBppD,EAAQqH,EAAO0sB,EAAQ,IAG3D/yB,KAAKioD,oBACLjoD,KAAK00B,MACR,EACD4zB,yBAA0B,WACtB,OAAOtoD,KAAKiB,IAAI,mBAAmBP,KAAI1B,IAC7B,MAAEoH,IAAKmiD,EAAWliD,MAAOmiD,GAAgBxpD,EACzCypD,EAAczoD,KAAKiB,IAAI,WAAWtC,MAAKqpB,GAAKA,EAAE5hB,MAAQmiD,IACtDG,EAAcD,GAAaE,OAAOhqD,MAAKiqD,GAAKA,EAAEviD,QAAUmiD,KAAc7nD,MACrE,MAAA,CACHkoD,cAAeJ,GAAax9B,MAC5BtqB,MAAO+nD,EACPtiD,IAAKmiD,EACLliD,MAAOmiD,KAGlB,EACDM,qBAAsB,WAClB,OAAO9oD,KAAKiB,IAAI,oBAAoBV,QAAU,CACjD,EAEDwoD,0BAA2B,WACjBxC,MAAAA,EAAU,CAACvmD,KAAKiB,IAAI,kBAAmBjB,KAAKiB,IAAI,oBACtD,OAAOkI,EAAsBo9C,EAChC,EACDyC,aAAc,WACLp5B,KAAAA,IAAI,kBAAmB,IAC5B5vB,KAAKiB,IAAI,WAAWwC,SAAQzE,IACxBA,EAAO2pD,OAAOllD,SAAQ4C,IAClBA,EAAM0sB,UAAW,EACjB1sB,EAAMy3B,UAAW,CAAA,GACpB,IAECspB,MAAAA,EAAcpnD,KAAKiB,IAAI,eAC7BmmD,GAAa7mD,QAAUP,KAAK4vB,IAAI,cAAew3B,EAAY,IAEvDnC,GAAkBE,KAClBnlD,KAAKioD,oBAGTjoD,KAAK00B,MACR,EACDuzB,iBAAAA,GACI,MAAMnB,EAAkB9mD,KAAKiB,IAAI,mBAC3BulD,EAAexmD,KAAKymD,cAC1BzmD,KAAKiB,IAAI,WAAWwC,SAAQzE,IACxBA,EAAO2pD,OAAOllD,SAAQwlD,IAElBA,EAAWC,aAAe,KAM1B,MACMC,EAAYnC,GADQ,IAHLF,EAAgB9nD,QACjC+zB,GAAYA,EAAS3sB,MAAQ6iD,EAAWV,YAEAU,IAE5CA,EAAWnrB,UAAY0oB,EAAa7nD,KAAKwqD,EAAS,GACrD,GAER,EAEDrK,UAAW,GACXsK,UAAW,SAAUC,GACZvK,KAAAA,UAAUz0C,KAAKg/C,EACvB,EACDC,YAAa,SAAUC,GACnBvpD,KAAK8+C,UAAY9+C,KAAK8+C,UAAU9/C,QAAOqqD,IACnC,GAAIA,IAAOE,EACAF,OAAAA,CAAAA,GAGlB,EACD30B,KAAM,WACGoqB,KAAAA,UAAUr7C,SAAQ4lD,IACnBA,EAAGjmD,MAAI,GAEf,GAKJ,SAAS6jD,GAAuB96C,EAASnN,GAC/BwpD,MAAAA,EAAcxpD,EAAOqH,MACrBmjD,EAAmBr9C,EAAQnN,EAAOupD,WAAavpD,EAAOoH,KAC5D,cAAeojD,GACX,IAAK,SACD,OAAOA,IAAqBhB,EAChC,IAAK,SACD,OAAOlpD,KAAKC,MAAM,IAAIipD,MAAgBjiD,SAASijD,GACnD,QACQhB,OAAAA,IAAgB7C,IACeG,GAAQ7kD,IAAI,mBAAmBsY,UAAY,IAC5CzI,MAAKyP,GAAKA,EAAE5M,KAAOxH,EAAQwH,KAKtD61C,GAAkBjjD,SAASiiD,KAAgB,EAG9D,CAoBA,SAASxB,GAA2BT,GAChC,MAAMkD,EAnBV,SAA4BlD,EAAU,IAQlC,OAAOA,EAAQtnD,QAAO,CAACC,EAAKF,KACxB,MAAMupD,EAAYvpD,EAAOoH,IACnBwlB,EAAU1sB,EAAIqpD,IAAc,GAC3B,MAAA,IACArpD,EACHgpB,CAACqgC,GAAY,IAAI38B,EAAS5sB,MAE/B,CAAE,EACT,CAGmB0qD,CAAmBnD,GAC5BoD,EAAQjrC,OAAOC,KAAK8qC,GAC1B,MAAO,CAACt9C,EAASzI,EAAO6V,IAabowC,EAAMjwB,OAAM5qB,KACN26C,EAAO36C,GAAMnQ,MAAKK,GAEnBioD,GAAuB96C,EAASnN,IAChCua,EAAStE,WAAUsL,GAAKA,EAAE5M,KAAOxH,EAAQwH,OAAQjQ,KAKrE,CAaA,SAAS2kD,GAAmBG,EAAaniD,GACrC,OAAOpD,MAAM4N,QAAQ23C,EAAYniD,OAC3BmiD,EAAYniD,MAAMtF,KAAK,OAASsF,EAChCmiD,EAAYniD,QAAUA,CAChC,CAEA,SAAS2hD,GAAeI,EAAiBppD,EAAQqH,EAAO0sB,GACpD/zB,EAAO2pD,OAAOllD,SAAQ+kD,IAECH,GAAmBG,EAAaniD,KAKnDmiD,EAAYz1B,SAAWA,EACnBA,EACAq1B,EAAgB/9C,KAAK,CACjBjE,IAAKpH,EAAOoH,IACZC,MAAOA,EACPvF,MAAO0nD,EAAY1nD,OAAS,OAGhCsnD,EAAgBwB,OACZ,EACAxB,EAAgB7nD,UACb6nD,EAAgBppD,QACf6qD,KAAeA,EAAUzjD,MAAQpH,EAAOoH,KAAOyjD,EAAUxjD,QAAUA,MAE3E,GAGZ,CCxUA,MAQayjD,GAAoBA,CAACC,EAAUC,KAElC,MAACC,GAAQnlD,OAAO4gC,SAASC,KAAKhmB,MAAM,KAEpC5Y,EAZyBmjD,EAACC,EAAK/jD,EAAKC,KAC1C,MAAM+jD,EAAK,IAAIx1C,OAAO,SAAWxO,EAAM,YAAa,KAC9CikD,OAAYF,EAAIvjD,QAAQ,KAAc,IAAM,IAClD,OAAOujD,EAAIr+B,MAAMs+B,GACXD,EAAItjD,QAAQujD,EAAI,KAAOhkD,EAAM,IAAMC,EAAQ,MAC3C8jD,EAAME,EAAYjkD,EAAM,IAAMC,CAAAA,EAOxB6jD,CAA2BD,EAAMF,EAD/BO,mBAAmBhrD,KAAK+J,UAAU2gD,KAExCO,QAAAA,UAAU,KAAM,KAAMxjD,EAAG,EAGxByjD,GAAiBpkD,IACpBqkD,MAAAA,EAAc3lD,OAAO4gC,SAASglB,OAC9B/f,EAAQ,IAAIggB,gBAAgBF,GAAaxpD,IAAImF,GAEnD,IAAKukC,EACM,OAAA,KAGP,IACA,OAAOrrC,KAAKC,MAAMqrD,mBAAmBjgB,GACxC,CAAa,MACFnrC,OAAAA,QAAAA,MAAM,kDACP,IACX,GAGEqrD,GAAkB,gBAElBC,GAAkBpsD,IACd,MAAEqsD,SAAAA,EAAUC,QAAAA,EAASC,UAAAA,GAAcvsD,EACzC,MAAO,QAAQqsD,EAAW,GAAGE,KAAaD,IAAYH,IAAe,EAGnEK,GAAoBxsD,IAChB,MAAEysD,WAAAA,EAAY/C,gBAAAA,GAAoB1pD,EACxC,MAAO,mBACHysD,EAEM,IAAI,IAAInG,IAAIoD,EAAgB1nD,KAAI1B,GAAUA,EAAOoH,QAAOrF,KAAK,KAC7D8pD,IAAe,ECrB7B/lD,OAAOsmD,kBAAoBtmD,OAAOsmD,mBAAqB,CACnDC,eAAgBtM,IAChBuM,YAAa,CACTC,aAAcC,OAAOtuC,GACrBuuC,eAAgBD,OAAOtuC,GACvBwuC,iBAAkBF,OAAOtuC,KAIjC,MAAMmuC,GAAavmD,OAAOsmD,kBAAkBC,WACtCC,GAAcxmD,OAAOsmD,kBAAkBE,YAc7BK,SAAAA,GAAY5kD,EAAa2G,GACvBk+C,GAAS7kD,GACjB8kD,SAAWn+C,CACrB,CAEO,SAASo+C,GAAcC,GAC1B,OAAOT,GAAYS,EACvB,CAEgBC,SAAAA,GAAcD,EAAwBrtD,GACtCqtD,GAAAA,GAAY1lD,MAAQ3H,CACpC,CAEA,SAASktD,GAAS7kD,GACd,OAAKskD,GAAWrM,IAAIj4C,IACL6oB,GAAAA,IAAI7oB,EAAK,CAAA,GAGjBskD,GAAWpqD,IAAI8F,EAC1B,CCpEA,MAAMwjB,GAAS,IAAInmB,UAWG6nD,eAAAA,GAAYllD,EAAamlD,GAAqB,GAChE,OAAOC,GAAMp/C,UACLW,IAAAA,ED+BL,SAAqB3G,GACV6kD,OAAAA,GAAS7kD,GACV8kD,QACjB,CClCmBO,CAAkBrlD,GAE7B,IAAK2G,EACG,IACOA,QAyDvBX,eAAyBhG,GACbslD,QAAAA,MAAM,qBAAsBtlD,GAC9BojB,MAAAA,QAAiBC,MAAMrjB,GAEzB,IAACojB,EAASE,GACJ,MAAA,IAAI7iB,MAAM,yBAAyBT,QAAUojB,EAAS0D,UAAU1D,EAASmiC,cAGtE,aAAMniC,EAAS7jB,MAGhC,CApE6BgkB,CAAUvjB,GACjB4kD,GAAY5kD,EAAK2G,SAClBlO,GAEL,YADQ6sD,QAAAA,MAAM,sBAAuB7sD,EAEzC,CAGC0sD,IACDE,GAAoB,mBAAoBG,GAAgB7+C,EAAM,wBAC9D0+C,GAAoB,eAAgBG,GAAgB7+C,EAAM,gBAC1D0+C,GAAoB,iBAAkBG,GAAgB7+C,EAAM,mBAAiB,GAGzF,CAiCA,SAAS6+C,GAAgB7+C,EAAcq+C,GAC/B,IACMS,MAAAA,EAqBd,SAAmB9+C,EAAcq+C,GAGvBU,MAAAA,EAFWliC,GAAOlmB,gBAAgBqJ,EAAM,aAErB0Y,iBAAiB,UAC1C,IAAA,MAAWsmC,KAAUD,EAAS,CACpBx/B,MAAAA,EAAUy/B,EAAO3pD,aAAe,GACtC,GAAIkqB,EAAQ1mB,SAAS,aAAawlD,MAAuB9+B,OAAAA,CAC7D,CAEA,MAAM,IAAIzlB,MAAM,0BAA0BukD,KAC9C,CA/B6BvhC,CAAU9c,EAAMq+C,GACrC,OAgCR,SAA4BW,GAClBC,MAAAA,EAAQD,EAAO/sC,MAAM,MAC3B,IAAA,MAAWitC,KAAQD,EAAO,CAChBE,MAAAA,EAAUD,EAAK/oC,OACjBgpC,GAAAA,EAAQC,WAAW,mBAAoB,CACjCC,MAAAA,EAAaF,EAAQhmD,QAAQ,kBAAmB,IAAI1D,MAAM,GAAK,GAC9D7D,OAAAA,KAAKC,MAAMwtD,EACtB,CACJ,CAEM,MAAA,IAAIvlD,MAAM,mCACpB,CA3CewlD,CAAmBR,GACd,MAELtvC,MACX,CACJ,CC5DA,IAAI6mB,GAAU,CAAA,EACVkpB,GAAY,CAAA,EAEhB,MAAMlC,GAAWrsD,GAETA,EAAKuC,IAAI,eAAemF,MAAQ1H,EAAKuC,IAAI,eAAe,GAAGmF,KAC3D1H,EAAKuC,IAAI,eAAeomD,QAAU3oD,EAAKuC,IAAI,eAAe,GAAGomD,MAI/D8D,GAAazsD,GAAwC,IAAhCA,EAAKoqD,uBAEjBoE,GAAA,CACX5lD,OAAQ,CACJ6lD,QAAS,SAAU7+C,EAAG8+C,GACZ,MAAEnH,QAAAA,EAASoH,iBAAAA,GAAqB/+C,EAAEuN,OAAOxV,MAE/C4mD,GAAYI,EAGNzL,MAAAA,EAAOkE,GAAQlE,KAAKqE,GAC1BH,GAAQl2B,IAAI,UAAWq2B,GAAW,MAClCH,GAAQl2B,IAAI,aAAc9qB,OAAOH,YACjCmhD,GAAQl2B,IAAI,cAAe9qB,OAAOoiC,aAGlC,MAAM95B,EAAW04C,GAAQO,eACnBp5C,EAAiB64C,GAAQM,qBAEvBlnD,QAAAA,IAAI,CAAC0iD,EAAMx0C,EAAUH,IACxBkB,MAAKw6C,IACF5kB,GAAU4kB,EAAO,GACjB7C,GAAQl2B,IAAI,WAAY+4B,EAAO,GAAGv7C,UAClC04C,GAAQl2B,IAAI,iBAAkB+4B,EAAO,IACrCyE,EAAgB,IAAIxxC,YAAY,iBAAgB,IAEnDvN,OAAMi/C,IACH7tD,QAAQD,MAAM8tD,GACdF,EAAgB,IAAIxxC,YAAY,cAAe,CAAEC,OAAQ,CAAEyxC,IAAAA,KAAQ,IAGvErI,GAAkBE,KDpB3B,SAAsBrgD,GACzBqnD,GAAM,KACIz+C,MAAAA,EAAO5I,EAAOd,SAAS0kC,gBAAgBloC,UAE7C4rD,GAAoB,mBAAoBG,GAAgB7+C,EAAM,wBAC9D0+C,GAAoB,eAAgBG,GAAgB7+C,EAAM,gBAC1D0+C,GAAoB,iBAAkBG,GAAgB7+C,EAAM,mBAIxD0+C,GAAoB,oBAAoB/lD,QACvC+lD,GAAoB,gBAAgB/lD,OACjC+lD,GAAoB,kBAAkB/lD,QAE1C+lD,GAAkBtnD,EAAO4gC,SAASC,KAAMj4B,EAAI,GAGxD,CCIgB6/C,CAAazoD,OAErB,GAEJ0oD,SAAU,CACN,aAAML,CAAQ7+C,EAAG8+C,GACP,MAAEnH,QAAAA,EAASl/C,IAAAA,GAAQuH,EAAEuN,OAAOxV,MAE9B3H,IAAAA,EACA,UACMutD,GAAYllD,GAClBrI,EDZL0tD,GAAoB,gBCYU/lD,KAC5B,OAAQinD,GACL7tD,OAAAA,QAAQD,MAAM8tD,GACPF,EAAgB,IAAIxxC,YAAY,cAAe,CAAEC,OAAQ,CAAEyxC,IAAAA,KACtE,CAEOvpB,OAAAA,QAAU3B,QAAQuB,QAAQ,CAC7B93B,OAAQ,UACRnN,KAAAA,IA6JhB,SAA4BqI,GACpB,IACA,MAAM0mD,EAAS,IAAIC,IAAI5oD,OAAO4gC,UAC9B+nB,EAAOE,SAAW5mD,EAClBjC,OAAO8oD,QAAQrD,UAAU,CAAE,EAAE,GAAIkD,EAEpC,OAAQjuD,GACGA,QAAAA,MAAM,iCAAkCA,EACpD,CACJ,CAnKYquD,CAAmB9mD,GAEf,IAEA,MAAO+mD,EAAO1gD,EAAUH,SAAwBm1B,QAAQljC,IAAI,CACxD4mD,GAAQK,OAAOF,GACfH,GAAQO,eACRP,GAAQM,uBAEZriB,GAAU+pB,EACVhI,GAAQl2B,IAAI,UAAWq2B,GAAW,MAClCH,GAAQl2B,IAAI,aAAc9qB,OAAOH,YACjCmhD,GAAQl2B,IAAI,cAAe9qB,OAAOoiC,aAClC4e,GAAQl2B,IAAI,WAAYxiB,EAASA,UACjC04C,GAAQl2B,IAAI,iBAAkB3iB,GAC9BmgD,EAAgB,IAAIxxC,YAAY,kBAChCkqC,GAAQpxB,MACX,OAAQl1B,GACLC,QAAQD,MAAMA,GACd4tD,EAAgB,IAAIxxC,YAAY,cAAe,CAAEC,OAAQ,CAAErc,MAAAA,KAC/D,CACJ,GAEJuuD,cAAe,CACXC,UAAW,SAAU1/C,GACV2+C,OAAAA,GAAUc,cAAcz/C,EACnC,GAEJ2/C,YAAa,CACTD,UAAW,SAAU1/C,GACV2+C,OAAAA,GAAUiB,UAAU5/C,EAC/B,GAEJ6/C,YAAa,CAET,aAAMhB,CAAQ7+C,EAAG8+C,GACP,MACFgB,eAAAA,EACAC,eAAAA,EACAC,gBAAAA,EACAj4C,iBAAAA,EACAk4C,sBAAAA,GACAjgD,EAAEuN,OAAOxV,MAEPmoD,EAAyBD,EAAsBl4C,GAcrD,GAPAo4C,EANoBJ,EAChBtqB,GACA1tB,EACAm4C,GAAwBE,iBAUxBF,GAAwBG,wBAAyB,OAC3CH,EAAuBI,eAC7B,MAAMC,EAAUR,EACZtqB,GACA1tB,EACAm4C,GAAwBE,gBAE5B5I,GAAQl2B,IAAI,iBAAkB4+B,EAAuBE,gBACrDD,EAAUI,GACV/I,GAAQpxB,MACZ,CAES+5B,SAAAA,EAAU/vD,EAAO,KA+FtC,SAA0BA,EAAM2X,GAC5ByvC,GAAQl2B,IAAI,sBAAuBlxB,EAAKowD,qBACxChJ,GAAQl2B,IACJ,oBACAlxB,EAAKowD,qBACC9vD,QAAO+R,GAAQA,EAAKg+C,aAAY,IAChCp7C,IAAIgM,MAAM,KACXqvC,IAAG,IAAO,MAGnBlJ,GAAQl2B,IAAI,WAAYlxB,EAAK8U,YAC7BsyC,GAAQl2B,IAAI,eAAgBlxB,EAAKuwD,cACjCnJ,GAAQl2B,IAAI,YAAalxB,EAAKwwD,WAC9BpJ,GAAQl2B,IAAI,UAAWlxB,EAAKod,SAC5BgqC,GAAQl2B,IAAI,uBAAwBvZ,EAAiBC,SAAS64C,sBAC9DrJ,GAAQl2B,IAAI,UAAWvZ,EAAiBC,SACxCwvC,GAAQl2B,IAAI,eAAgBlxB,EAAKwzB,cACjC4zB,GAAQl2B,IAAI,WCtQT,SAAyBvZ,GAEtB,MACF6f,YAAAA,EACAC,cAAAA,EACA/R,kBAAAA,EAAoB,KACpBgS,kBAAAA,GACA/f,EAEJ,IAAK+N,EAAmB,CACd,MAAEhJ,SAAAA,EAAW,MAAS/E,EACrB+E,OAAAA,CACX,CAEO,MAAA,CACHzH,GAAIuiB,EACJt1B,KAAMu1B,EACNlmB,SAAUmmB,EACVzY,SAAUyG,EAElB,CDkP4BgrC,CAAgB/4C,GAC5C,EAhHgBg5C,CAAiB3wD,EAAM2X,GAkHvC,SAAsB3X,GAAQ2X,iBAAAA,EAAkBi4C,gBAAAA,EAAiBF,eAAAA,IAC7D,MAAM1G,EAAO4G,EAAgBj4C,GACvBkwC,EAAU6H,EACZtI,GAAQ7kD,IAAI,YACZoV,EACA3X,EAAK4wD,oBACL5wD,EAAKuwD,aACL,CACIhiD,eAAgB64C,GAAQ7kD,IAAI,kBAC5BmM,SAAU04C,GAAQ7kD,IAAI,cAI9B6kD,GAAQl2B,IAAI,UAAW22B,GACvBT,GAAQl2B,IAAI,cAAe83B,GAC3B5B,GAAQl2B,IAAI,cAAe83B,EAAK,GACpC,CAjIgB6H,CAAa7wD,EAAM,CAAE2X,iBAAAA,EAAkBi4C,gBAAAA,EAAiBF,eAAAA,IAmIxE,WACUoB,MAAAA,EAAahF,GAAe5E,IAC9B4J,GAAAA,GAAcA,EAAWjvD,OAAS,EAAG,CACrC,MAAMkvD,EH9MoBC,EAACC,EAAQjxD,KACvC,MAAMkxD,EAAY,GAClBlxD,OAAAA,EAAK+E,SAAQic,IACTiwC,EAAOlsD,SAAQosD,IACPA,EAAWzpD,MAAQsZ,EAAKtZ,KACxBypD,EAAWlH,OAAOllD,SAAQ4C,IAClBqZ,EAAKrZ,QAAUA,EAAMA,OACrBupD,EAAUvlD,KAAK,CACXjE,IAAKypD,EAAWzpD,IAChBC,MAAOA,EAAMA,MACb0sB,UAAU,GACb,GAER,GAER,IAGE68B,CAAAA,EG4LgBF,CAAmB5J,GAAQ7kD,IAAI,WAAYuuD,GAC1DC,EAAWlvD,OAAS,GACpBkvD,EAAWhsD,SAAQ,CAACzE,EAAQ0E,KAClBosD,MAAAA,EAASpsD,IAAU+rD,EAAWlvD,OAAS,EAC7CulD,GAAQ+B,cAAc7oD,EAAQ8wD,EAAM,GAGhD,CAEMC,MAAAA,EAAUvF,GAAe3E,IAC/B,GAAIkK,EAAS,CACT,MAAMC,EHrMkBC,EAACN,EAAQjxD,IAC9B,IAAIixD,GAAQ3wD,QAAO0gB,GAAQA,EAAKtZ,MAAQ1H,EAAK0H,KAAOsZ,EAAK2nC,QAAU3oD,EAAK2oD,QGoM1D4I,CAAiBnK,GAAQ7kD,IAAI,eAAgB8uD,GAC1DC,EAASzvD,OAAS,GAClBulD,GAAQl2B,IAAI,cAAeogC,EAAS,GAE5C,CACJ,CArJgBE,GAuJhB,WACQjL,GAAAA,GAAkBE,IAAmB,CACrCW,GAAQmC,oBAER,MAAMkI,EAAiBrK,GAClB7kD,IAAI,uBACJtC,MAAKoS,GAAQA,EAAKhK,MAAQjC,OAAO4gC,SAASioB,WAC3CwC,GACAlE,GAAYkE,EAAeppD,KAAK,EAExC,CACJ,CAjKgBqpD,GHlFSC,MACfj1C,MAAAA,EAAW0qC,GAAQ7kD,IAAI,YACvBwB,EAAOqC,OAAOd,SAAS+iB,eAAeq+B,IACxChqC,GACA2gB,GAAat5B,EAAM2Y,EAAQ,EG+EnBi1C,GACAjD,EAAgB,IAAIxxC,YAAY,sBACpC,CACJ,GAEJ00C,mBAAoB,CAChBtC,UAAW,SAAU1/C,GACjB,OAAIy8C,GAASjF,KAAYqF,GAAWrF,IACzBmH,GAAUsD,oBAAoBjiD,GAE9B2+C,GAAUuD,aAAaliD,EAEtC,GAEJmiD,iBAAkB,CACdzC,UAAW,SAAU1/C,GACV2+C,OAAAA,GAAUiB,UAAU5/C,EAC/B,GAEJoiD,SAAU,CACNvD,QAASA,CAAC7+C,EAAG8+C,KACHhF,MAAAA,EAAkBtC,GAAQ7kD,IAAI,mBAEpC6oD,GAAkBlE,GAA6BE,GAAQ7kD,IAAI,oBAC3D6oD,GAAkBjE,GAA0B,CACxCz/C,IAAK0/C,GAAQ7kD,IAAI,eAAemF,IAChCihD,MAAOvB,GAAQ7kD,IAAI,eAAeomD,QAGtC+F,EAAgB,IAAIxxC,YAAY,uBAG5BqpC,GAAkBE,KAAqBiD,EAAgB7nD,QACvDugB,GACI,kBrEyJb,SAAsCsnC,GACnCuI,MAAAA,EAkDV,SAA8BvI,EAAkB,IACrCA,OAAAA,EAAgBnpD,QAAO,CAAC0xD,GAAWvqD,IAAAA,EAAKC,MAAAA,MACtCsqD,EAAQvqD,KAAMuqD,EAAQvqD,GAAO,CAAEA,IAAAA,EAAKuiD,OAAQ,KACjDgI,EAAQvqD,GAAKuiD,OAAOt+C,KAAKhE,EAAMuqD,WAAW,IAAK,MACxCD,IACR,CAAE,EACT,CAxDoBE,CAAqBzI,GAC/B0I,EAAYpyC,OAAOC,KAAKgyC,GAOvB,MAAA,CANsBG,EAAU/vD,KAAK,KAAKmI,UAAU,EAAG,IAChC4nD,EACzBpwD,KAAI0F,GAAOuqD,EAAQvqD,GAAKuiD,OAAOjoD,KAAI2F,GAASA,EAAMsZ,MAAM,KAAKqvC,IAAG,KAAKjuD,KAAK,OAC1EA,KAAK,KACLmI,UAAU,EAAG,IAGtB,CqElKuB6nD,CAA6B3I,GAChC,KACA95C,EAAEuN,OAAOxV,MACb,GAIZ2qD,OAAQ,CACJ7D,QAASA,CAAC7+C,EAAG8+C,KACTtD,GAAkBlE,GAA6BE,GAAQ7kD,IAAI,oBAC3D6oD,GAAkBjE,GAA0B,CACxCz/C,IAAK0/C,GAAQ7kD,IAAI,eAAemF,IAChCihD,MAAOvB,GAAQ7kD,IAAI,eAAeomD,QAGtC+F,EAAgB,IAAIxxC,YAAY,uBHvJZq1C,EAACvyD,EAAO,MAC9B,MAAEqsD,SAAAA,EAAUI,WAAAA,GAAezsD,EAC3B4e,EAAc,mBAUpBlB,GARK2uC,GAAaI,EAQN,CACR7tC,YAAAA,EACAC,WAAY,CAACutC,GAAgBpsD,GAAOwsD,GAAkBxsD,IAAOqC,KAAK,MATtD,CACRuc,YAAAA,EACAC,WAAYstC,IAQnB,EG0IOoG,CAAiB,CACblG,SAAUA,GAASjF,IACnBqF,WAAYA,GAAWrF,IACvBkF,QAASlF,GAAQ7kD,IAAI,eAAemF,IACpC6kD,UAAWnF,GAAQ7kD,IAAI,eAAeomD,MACtCe,gBAAiBtC,GAAQ7kD,IAAI,oBAChC,GAGTiwD,aAAc,CACV/D,QAAS,SAAU7+C,EAAG8+C,GAClBA,EAAgB,IAAIxxC,YAAY,sBAAuB,CAAEC,OAAQ,CAAEvN,EAAAA,KAEvE,GAEJ6iD,oBAAqB,CACjBnD,UAAW,SAAU1/C,GACV2+C,OAAAA,GAAUmE,eAAe9iD,EACpC,GAEJ+iD,kBAAmB,CACfrD,UAAW,SAAU1/C,GACV2+C,OAAAA,GAAUiB,UAAU5/C,EAC/B,IEpOR,MAAegjD,GAAA,CAACC,EAAiBv0C,EAAWw0C,EAAU,QAClDC,GACI,IAAI71C,YAAY21C,EAAiB,CAC7B11C,OAAQ,CACJxV,MAAO2W,EACPqsC,GAAImI,KAGhB,EAGEC,GAA0B91C,IAC5BuxC,GAAUvxC,EAAM7M,OAAOq+C,QAAQxxC,EAAOyxC,GAAe,EAGnDA,GAAkB9+C,IACpB4+C,GAAU5+C,EAAEQ,OAAOk/C,UAAU1/C,EAAC,YCV9BojD,GAAA,IAAAC,QAyCJ3wD,eAAeC,IAAI,2BACfD,eAAeE,OAAO,yBA3C1B,cAA2CY,EAGvChC,WAAAA,WAFAq3B,EAAAn3B,KAAA0xD,GRL+B,wBQS3B1xD,KAAK4xD,oBAAsB,KAC3B9L,GAAQsD,UAAUppD,KAAK6xD,iBAAiBhwC,KAAK7hB,OAC7CA,KAAK8xD,kBAAoB9xD,KAAK+xD,aAAalwC,KAAK7hB,KACpD,CAEAiC,OAAAA,GACI,MAAMvD,EAAOsF,SAAS+iB,eAAes+B,KAAengC,aAAa,QAC7DxmB,IACAsB,KAAK+B,SAAW,2DAEFiwD,EAAAhyD,KAAK0xD,2FAEHtoD,EAAW1K,qBAEnC,CAEAyD,OAAAA,GACInC,KAAKiyD,WAAajuD,SAAS+iB,eAAeirC,EAAAhyD,KAAK0xD,KAC/C1xD,KAAKiyD,YAAYv1C,iBAAiBhb,EAAsB1B,KAAK8xD,kBACjE,CAEAD,gBAAAA,GACU,MAAEzrD,IAAAA,EAAKihD,MAAAA,GAAUvB,GAAQ7kD,IAAI,eAC9BgxD,KAAAA,YAAYpxB,YAAY,GAAGz6B,IAAMpG,KAAK4xD,sBAAsBvK,IACrE,CAEA0K,YAAAA,CAAazjD,GACH,MAAClI,EAAKihD,GAAS/4C,EAAEuN,OAAOkX,SAAS1sB,MAAMsZ,MAAM3f,KAAK4xD,qBACxD9L,GAAQl2B,IAAI,cAAe,CAAExpB,IAAAA,EAAKihD,MAAAA,GACtC,CAEA7iD,SAAAA,GACSytD,KAAAA,YAAYp1C,oBAAoBnb,EAAsB1B,KAAK8xD,mBAChEhM,GAAQwD,YAAYtpD,KAAK6xD,iBAC7B,ICvCAK,GAAA,IAAAP,QAiIJ3wD,eAAeC,IAAI,6BACfD,eAAeE,OAAO,2BAnI1B,cAAoCY,EAGhChC,WAAAA,WAFAq3B,EAAAn3B,KAAAkyD,GAAW,IA4DXC,EAAAA,KAAaA,cAAAA,CAACrjD,EAAMzI,IAcF,IAbdy/C,GAAQc,qBAAqB,CAAEC,UAAU,IAAS7nD,QAAOmN,KAChDA,EAAQ2C,KAGgB,iBAAlB3C,EAAQ2C,GACR3C,EAAQ2C,KAAUzI,EACO,iBAAlB8F,EAAQ2C,IAAuC,iBAAVzI,EAC5CA,IAAU8F,EAAQ2C,GACO,iBAAlB3C,EAAQ2C,GACfxP,KAAKC,MAAM,IAAM8G,EAAQ,KAAKE,SAAS4F,EAAQ2C,MAE7C3C,EAAQ2C,GAAMvI,SAASF,MAErC9F,SAEP2jD,EAAAA,KAAYA,aAAAA,CAAC99C,EAAKC,IACdy/C,GACK7kD,IAAI,mBACJjC,QAAO6qD,GAAaA,EAAUzjD,MAAQA,GAAOyjD,EAAUxjD,QAAUA,IAAO9F,OAAS,IA3EtFulD,GAAQsD,UAAUppD,KAAKoyD,eAAevwC,KAAK7hB,MAC/C,CAEAoyD,cAAAA,GACQnN,GAAkBE,KAEd6M,EAAAhyD,KAAKkyD,MAAapM,GAAQ7kD,IAAI,aAC9BjB,KAAKiC,UACLjC,KAAKG,QAAO,GACZH,KAAKmC,WAIbnC,KAAKomB,iBAAiB,WAAW3iB,SAAQqgD,IAUrC,GATAA,EAAK78C,aACD,WACA,GAAKjH,KAAKmyD,WAAWrO,EAAK3wB,QAAQo1B,UAAWzE,EAAK3wB,QAAQq1B,cAE9D1E,EAAK78C,aACD,UACA,GAAKjH,KAAKkkD,UAAUJ,EAAK3wB,QAAQo1B,UAAWzE,EAAK3wB,QAAQq1B,cAGzDvD,GAAkBE,IAAmB,CACrC,MAAMkN,EAAUvO,EAAKh2C,cAAc,cAC7BnN,EAAQX,KAAKsyD,SAASxO,EAAK3wB,QAAQo1B,UAAWzE,EAAK3wB,QAAQq1B,aACjE6J,EAAQtvD,YAAcpC,EACtB0xD,EAAQprD,aAAa,UAAWtG,EACpC,IAER,CAEAsB,OAAAA,GACIswD,EAAAvyD,KAAKkyD,GAAWpM,GAAQ7kD,IAAI,YAE5BjB,KAAK+B,SACDiwD,EAAAhyD,KAAKkyD,KACCxxD,KAAI1B,GACK,GAAGA,EAAOwzD,mCACnBxzD,EAAO2pD,OACJjoD,KAAI2F,IACDA,EAAMy3B,SAAW99B,KAAKmyD,WAAWnzD,EAAOoH,IAAKC,EAAMA,OAC5CA,EAAMlG,YAEhBY,KAAK,oBACZ/B,EAAOyzD,kBAEJ1xD,KAAK,KAAO,EACzB,CAEAoB,OAAAA,GACInC,KAAKomB,iBAAiB,WAAW3iB,SAAQqgD,IACrCA,EAAKpnC,iBAAiB,SAAU1c,KAAK0yD,gBAAe,GAE5D,CAuBAJ,QAAAA,CAASlsD,EAAKC,GACNmiD,IAAAA,EACJ1C,GAAQ7kD,IAAI,WAAW6P,MAAK4O,GACpBA,EAAKtZ,MAAQA,IAGjBoiD,EAAc9oC,EAAKipC,OAAOhqD,MAAKg0D,GACI,iBAApBA,EAAUtsD,MACVssD,EAAUtsD,QAAUA,EACO,iBAApBssD,EAAUtsD,OAAuC,iBAAVA,EAC9CA,IAAUssD,EAAUtsD,MACO,iBAApBssD,EAAUtsD,MACjB/G,KAAKC,MAAM,IAAM8G,EAAQ,KAAKE,SAASosD,EAAUtsD,SAE/CssD,EAAUtsD,MAAME,SAASF,OAGtCmiD,QAXJA,KAgBJ,MAAMllD,EAAQklD,GAAaU,aAAe,KAAKV,EAAYU,gBAAkB,GAC7E,MAAO,GAAGV,EAAY7nD,QAAQ2C,GAClC,CAEAkB,SAAAA,GACIshD,GAAQwD,YAAYtpD,KAAKoyD,gBAEzBpyD,KAAKomB,iBAAiB,WAAW3iB,SAAQqgD,IACrCA,EAAKjnC,oBAAoB,SAAU7c,KAAK0yD,gBAAe,GAE/D,CAEAA,eAAAA,CAAgBpkD,GACZA,EAAEmY,kBAEF,MAAMznB,EAAS,CACXoH,IAAKkI,EAAEhG,OAAO/E,WAAW4vB,QAAQo1B,UACjCliD,MAAOiI,EAAEhG,OAAO/E,WAAW4vB,QAAQq1B,YACnCz1B,SAAUzkB,EAAEhG,OAAOu1B,QACnBl9B,MAAO2N,EAAEhG,OAAO/E,WAAW4vB,QAAQu1B,aAGvC5C,GAAQ+B,cAAc7oD,EAC1B,IC/HJ,MAAM4zD,GAAsB,QAkH5B5xD,eAAeC,IAAI,4BACfD,eAAeE,OAAO,0BAjH1B,cAAmCY,EAC/BhC,WAAAA,GACIC,QACA+lD,GAAQsD,UAAUppD,KAAK6xD,iBAAiBhwC,KAAK7hB,MACjD,CAEAiC,OAAAA,GACUgtD,MAAAA,EAAenJ,GAAQmJ,cACrB4D,6BAAAA,GAAiC7yD,KAAKjB,MAC9CiB,KAAK+B,SAAW,sNAONktD,EAAa,sQAMK4D,oDAIhC,CAEAC,qBAAAA,GACU,MAAEC,wBAAAA,EAAyBC,4BAAAA,GAAgChzD,KAAKjB,MAChE6oD,EAAwB9B,GAAQ8B,wBAGtC,OAD8B,IAA1BA,EAA8BoL,EAA8BD,IAClDlsD,QAAQ,kBAAmB,GAAK+gD,EAClD,CAEAzlD,OAAAA,GACS0vD,KAAAA,mBACL7xD,KAAK8N,cAAc,+BAA+B4O,iBAAiB,SAAS,KAClEu2C,MAAAA,EAAkBjzD,KAAKizD,kBAC7B72C,GAAY,CACRe,WAAW,EACXxB,MAAO,aACPsC,YAAa,eACbqD,YAAa2xC,EAAgBtJ,MAC7BpoC,cAAe0xC,EAAgBtK,SAEnC7C,GAAQkD,eACRhpD,KAAKiH,aAAa,eAAgB,OAAM,IAE5CjH,KAAK8N,cAAc,iCAAiC4O,iBAAiB,SAAS,KAC1E5X,OAAO0W,cAAc,IAAII,YAAYta,IAC/B2xD,MAAAA,EAAkBjzD,KAAKizD,kBAC7B72C,GAAY,CACRe,WAAW,EACXxB,MAAO,aACPsC,YAAa,eACbqD,YAAa2xC,EAAgBtJ,MAC7BpoC,cAAe0xC,EAAgBtK,QAClC,GAET,CAEAsK,eAAAA,GACI,IAAItJ,EAAQ,GACRhB,EAAS,GACPP,MAAAA,EAAkBtC,GAAQ7kD,IAAI,mBACpC,GAAImnD,GAAmBA,EAAgB7nD,OACnC,IAAA,IAASsF,EAAI,EAAGA,EAAIuiD,EAAgB7nD,OAAQsF,IAAK,CACvC7G,MAAAA,EAASopD,EAAgBviD,GACzBQ,EACFrH,EAAOqH,MAAMO,QAAQgsD,KAAuB,EACtC5zD,EAAOqH,MAAM6C,UACTlK,EAAOqH,MAAMO,QAAQgsD,IAAuBA,GAEhD5zD,EAAOqH,MACbsjD,EAAM/iD,QAAQ5H,EAAOoH,MACrBuiD,EAAAA,EAAOgB,EAAM/iD,QAAQ5H,EAAOoH,OAAS,IAAMC,GAE3CsjD,EAAMt/C,KAAKrL,EAAOoH,KAClBuiD,EAAOt+C,KAAKhE,GAEpB,CAGG,MAAA,CACHsjD,MAAOA,EAAM5oD,KAAK,KAClB4nD,OAAQA,EAAO5nD,KAAK,KAE5B,CAEA8wD,gBAAAA,GACI,MAAMjK,EAAwB9B,GAAQ8B,wBAChCkB,EAAuBhD,GAAQgD,uBAE/BoK,EAAWlzD,KAAK8N,cAAc,8BAC9BqlD,EAAYnzD,KAAK8N,cAAc,gCAErColD,EAAS3kD,MAAM6kD,WACXtK,GAAwBA,EAAuB,EAAI,UAAY,SACnEqK,EAAU5kD,MAAM6kD,WACZxL,GAAyBA,EAAwB,EAAI,UAAY,SAErEuL,EAAUrlD,cAAc,QAAQ/K,YAAc/C,KAAK8yD,wBACnDK,EAAUrlD,cAAc,UAAU7G,aAAa,aAAcjH,KAAK8yD,wBACtE,CAEAtuD,SAAAA,GACIshD,GAAQwD,YAAYtpD,KAAKoyD,eAC7B,IClDJpxD,eAAeC,IAAI,qBAAuBD,eAAeE,OAAO,mBAzDhE,cAA6BY,EACzBG,OAAAA,GACSlD,KAAAA,MAAQiB,KAAKgC,aACdgC,SAAS+iB,eAAeq+B,IAAsBiO,cAAc50D,YAG1D,MACFs0D,wBAAAA,EAA0B,8BAC1BO,6BAAAA,EAA+B,YAC/BN,4BAAAA,EAA8B,iBAC9BH,6BAAAA,EAA+B,8BAC/B7yD,KAAKjB,MAAMsc,aAAerb,KAAKjB,MAI7BuiD,EACFwE,GAAQnhD,WAAavD,EACf,oDACA,GAEVpB,KAAK+B,SAAW,qBACNu/C,gIAGgCwE,GAAQmJ,aAAa,0XAQhB8D,iEACKO,gEACDN,iEACCH,gHAIxD,CAEA1wD,OAAAA,GACWua,OAAAA,iBAAiBnb,EAAoBvB,KAAKuzD,gBACrD,CAEA/uD,SAAAA,GACWqY,OAAAA,oBAAoBtb,EAAoBvB,KAAKuzD,gBACxD,CAEAA,eAAAA,CAAgBjlD,GACZA,EAAEmY,kBACEnY,EAAEuN,OAAOlI,KAAO2xC,IAChBgM,GAAe,WAEvB,ICVJtwD,eAAeC,IAAI,mBAAqBD,eAAeE,OAAO,iBAjD9D,cAA2BY,EAA3B,WAAAhC,GAAAC,SAAAqnB,WACIosC,EAAAA,KAAgB,gBAAA,KAAA,CAEhB,6BAAWtkC,GACP,MAAO,CAAC,sBACZ,CAEAO,wBAAAA,CAAyB7uB,EAAM6yD,EAAQC,GACrB,MAAVA,GAAkBA,EAAOnzD,OAAS,GAAKmzD,IAAWD,GACrC,wBAAT7yD,GACAZ,KAAK2zD,oBAAoBD,EAGrC,CAEAzxD,OAAAA,GACIjC,KAAK+B,SAAW,yFAAyF/B,KAAKjB,MAAM60D,2BACxH,CAEAzxD,OAAAA,GACI6B,SAAS+iB,eAAe,cAAcrK,iBAAiB,SAAS,KAC5D40C,GAAe,eAAgB,CAAA,GAC/Bl1C,GAAY,CACRe,WAAW,EACXxB,MAAO,aACPsC,YAAa,eAChB,IAGLje,KAAKs/B,cAAgBt/B,KAAK8N,cAAc,iBACxC9N,KAAKwzD,cAAgBxvD,SAASwhB,cAAc,OAC5CxlB,KAAKwzD,cAAcnzD,UAAUC,IAAI,gBACjCN,KAAKwzD,cAAcnzD,UAAUC,IAAI,iBACjCN,KAAKwzD,cAAchzD,UAAY,IAC/BR,KAAK6wC,WAAWA,WAAWltC,YAAY3D,KAAKwzD,cAChD,CAEAG,mBAAAA,CAAoB9a,GAChB,IAAK74C,KAAKwzD,cACC,OAAA,KAGXxzD,KAAKwzD,cAAchzD,UAAYq4C,EACnB,MAAZA,EACM74C,KAAKs/B,cAAcj/B,UAAUuc,OAAO,gBACpC5c,KAAKs/B,cAAcj/B,UAAUC,IAAI,eAC3C,IC5CJ,MAAMuzD,GAAsB,kCAqH5B7yD,eAAeC,IAAI,qBAAuBD,eAAeE,OAAO,mBAnHhE,cAA6BY,EACzBhC,WAAAA,GACIC,QACAC,KAAKskC,kBAAoBtkC,KAAKukC,aAAa1iB,KAAK7hB,KACpD,CAEAiC,OAAAA,GACSya,KAAAA,iBAAiBjb,EAAoBzB,KAAKskC,mBAE/C,MAAMif,EAAa,CACfjtC,QAAS,CACLvR,OAAQ,CACJuwC,gBAAiB,OACjBD,WAAY,OACZ8L,iBAAkB,KAClBC,WAAY,IACZoC,gBAAiB,QACjBvC,YAAa,QACbhN,SAAU,QACV+O,UAAW,OACXhC,kBAAmB,OACnBiC,gBAAiB,UACjBC,gBAAiB,IACjBhC,uBAAwB,eAE5Bj8C,OAAQ,CACJqwC,gBAAiB,OACjBD,WAAY,OACZ8L,iBAAkB,KAClBC,WAAY,IACZoC,gBAAiB,OACjBvC,YAAa,QACbhN,SAAU,QACV+O,UAAW,OACXhC,kBAAmB,OACnBiC,gBAAiB,UACjB/B,uBAAwB,eAE5Bh8C,QAAS,CACLowC,gBAAiB,OACjBD,WAAY,OACZ8L,iBAAkB,KAClBC,WAAY,IACZoC,gBAAiB,OACjBvC,YAAa,QACbhN,SAAU,QACV+O,UAAW,OACXhC,kBAAmB,OACnBiC,gBAAiB,UACjB/B,uBAAwB,gBAGhCxJ,YAAa,CACTtM,KAAMprC,KAAKjB,MAAMmmC,4BACjBiG,KAAMnrC,KAAKjB,MAAMomC,wBACjB8T,IAAK,gBAIbj5C,KAAK+B,SAAW,uDACU8xD,0CACE1qD,EAAsBo6C,qCAC5BvjD,KAAK8zD,8DAE/B,CAEAA,eAAAA,GACU,MAAEnvB,WAAAA,EAAa,IAAO3kC,KAAKjB,MAE1B4lC,OAAAA,EACFjkC,KACG,EACI+F,KAAAA,EAAO,GACP0uB,UAAAA,EAAY,GACZnQ,UAAAA,EAAY,GACZ2V,eAAAA,EAAiB,GACjBh6B,MAAAA,EAAQ,GACRoyB,SAAAA,GAAW,KAEX,mDACgBtsB,6KAIGssB,kCACT/N,GAAa,cAAcA,qCAC3B2V,GAAkB,mBAAmBA,qCACrCxF,GAAa,cAAcA,8BAClCx0B,qBAEVI,KAAK,GACd,CAEAwjC,YAAAA,CAAaj2B,GACH,MAAEqF,GAAAA,GAAOuI,GAAU5N,GACrBqF,IAAOkgD,IAGXvlD,EAAEhG,OAAOk9B,YACb,CAWAjhC,oBAAAA,GACSsY,KAAAA,oBAAoBpb,EAAoBzB,KAAKskC,kBACtD,IC/GAotB,GAAA,IAAAC,QAgFJ3wD,eAAeC,IAAI,oBAAsBD,eAAeE,OAAO,kBAjF/D,cAA4BY,EAGxBhC,WAAAA,WAFAq3B,EAAAn3B,KAAA0xD,GAAgBrM,IAIZrlD,KAAK4xD,oBAAsB,KAC3B9L,GAAQsD,UAAUppD,KAAK6xD,iBAAiBhwC,KAAK7hB,OAC7CA,KAAK8xD,kBAAoB9xD,KAAK+xD,aAAalwC,KAAK7hB,KACpD,CAEAiC,OAAAA,GACSlD,KAAAA,MAAQiB,KAAKgC,aACdgC,SAAS+iB,eAAeq+B,IAAsBiO,cAAc50D,YAG1D,MACFs1D,cAAAA,EAAgB,UAChBC,uBAAAA,EAAyB,qHACzBC,+BAAAA,EAAiC,4GACjCC,8BAAAA,EAAgC,kDAChCC,oBAAAA,EAAsB,SACtBn0D,KAAKjB,MAEHuX,EAAUwvC,GAAQ7kD,IAAI,eAAeP,KAAI2W,IAAW,CACtD1W,MAAO0W,EAAO1W,MACd0F,MAAOrG,KAAKo0D,iBAAiB/8C,EAAOjR,IAAKiR,EAAOgwC,OAChDxpB,QAASxmB,EAAOwmB,YAGhBioB,GAAQ7kD,IAAI,eAAemF,MAAQ0/C,GAAQ7kD,IAAI,eAAe,GAAGmF,KACjEkQ,EAAQ7S,SAAQ4T,IACZA,EAAOwmB,QACHxmB,EAAOhR,QACPrG,KAAKo0D,iBACDtO,GAAQ7kD,IAAI,eAAemF,IAC3B0/C,GAAQ7kD,IAAI,eAAeomD,MAC/B,IAIZ,MAAM3oD,EAAO,CACTiC,MAAOozD,EACPv0B,eAAgBw0B,EAChBh0B,uBAAwBi0B,EACxBh0B,sBAAuBi0B,EACvBh0B,YAAa,kBACbvZ,YAAawtC,EACb79C,QAASA,GAGRvU,KAAAA,SAAW,oBAAoBiwD,EAAAhyD,KAAK0xD,cAAwBvoD,EAC7DzK,OAER,CAEAyD,OAAAA,GACInC,KAAKiyD,WAAajuD,SAAS+iB,eAAeirC,EAAAhyD,KAAK0xD,KAC/C1xD,KAAKiyD,YAAYv1C,iBAAiBhb,EAAsB1B,KAAK8xD,kBACjE,CAEAD,gBAAAA,GACU,MAAEzrD,IAAAA,EAAKihD,MAAAA,GAAUvB,GAAQ7kD,IAAI,eACnCjB,KAAKiyD,YAAYpxB,YAAY7gC,KAAKo0D,iBAAiBhuD,EAAKihD,GAC5D,CAEA0K,YAAAA,CAAazjD,GACH,MAAClI,EAAKihD,GAAS/4C,EAAEuN,OAAOkX,SAAS1sB,MAAMsZ,MAAM3f,KAAK4xD,qBACxD9L,GAAQl2B,IAAI,cAAe,CAAExpB,IAAAA,EAAKihD,MAAAA,IAClCiK,GAAe,SACnB,CAEA9sD,SAAAA,GACSytD,KAAAA,YAAYp1C,oBAAoBnb,EAAsB1B,KAAK8xD,mBAChEhM,GAAQwD,YAAYtpD,KAAK6xD,iBAC7B,CAEAuC,gBAAAA,CAAiBhuD,EAAKihD,GAClB,MAAO,GAAGjhD,IAAMpG,KAAK4xD,sBAAsBvK,GAC/C,ICOJrmD,eAAeC,IAAI,eAAiBD,eAAeE,OAAO,aApF1D,cAAwBY,EACpB,6BAAWotB,GACA,MAAA,CAAC,eAAgB,sBAC5B,CAEAO,wBAAAA,CAAyB7uB,EAAM6yD,EAAQC,GACrB,MAAVA,GAAkBA,IAAWD,GAAUC,EAAOnzD,OAAS,IAC1C,iBAATK,EACAZ,KAAKq0D,kBACW,wBAATzzD,GACPoD,SACK+iB,eAAe,kBACf9f,aAAa,sBAAuBysD,GAGrD,CAEAzxD,OAAAA,GACSlD,KAAAA,MAAQiB,KAAKgC,aAAahC,KAAKqzD,cAAc50D,YAClDuB,KAAKK,UAAUC,IAAI,aACvB,CAEA+zD,eAAAA,GACI,MAAMnF,EAAYpJ,GAAQ7kD,IAAI,aAGxBma,EAAW,CACbzH,GAAI3T,KAAKjB,MAAMm3B,YACfvY,SAAU3d,KAAKjB,MAAMqlB,kBACrBxjB,KAAMZ,KAAKjB,MAAMo3B,cACjBlmB,SAAUjQ,KAAKjB,MAAMq3B,mBAGnBk+B,EAAO,oKAKGt0D,KAAKjB,MAAMsc,aAAau4C,kBAAoB5zD,KAAKjB,MAAM60D,sKAKjDzqD,EAAsB,CAC5Bw7B,WAAYuqB,EACZhqB,4BAA6BllC,KAAKjB,MAAMmmC,4BACxCC,wBAAyBnlC,KAAKjB,MAAMomC,wBACpC/pB,SAAUpb,KAAKjB,MAAMqc,UAAYA,sHAK5ClZ,KAAAA,aAAaoyD,GAClBt0D,KAAKu0D,YAAcv0D,KAAKomB,iBAAiB,+BACzCpmB,KAAKw6B,YACT,CAEAiK,SAAAA,EAAY1hC,YAAAA,IACRqZ,GAAY,CACRkB,YAAa,kBACbC,WAAYxa,GAEpB,CAEAy3B,UAAAA,GACSW,KAAAA,eACDn7B,KAAKu0D,aAAah0D,QAClBP,KAAKu0D,YAAY9wD,SAAQiG,IACrB,MAAM3G,EAAc2G,EAAQoE,cAAc,QAAQ/K,YAClD2G,EAAQ86B,eAAiBxkC,KAAKykC,UAAU5iB,KAAK7hB,KAAM,CAAE+C,YAAAA,IACrD2G,EAAQgT,iBAAiB,QAAShT,EAAQ86B,eAAc,GAGpE,CAEArJ,YAAAA,GACQn7B,KAAKu0D,aAAah0D,QAClBP,KAAKu0D,YAAY9wD,SAAQiG,IACrBA,EAAQmT,oBAAoB,QAASnT,EAAQ86B,eAAc,GAGvE,ICzFJ,MA4FMgwB,GA5FgBC,MAClB,IAAI/qD,EAAU,KACVgrD,EAAgB,EAChBC,EAAwB,GACxBC,EAAa,EAEXC,MAgBAC,EAAeA,KACjB,MAAMtT,EAAS93C,EAAQwb,aAAa,WAAa,QACjD,IAAI6vC,EAAgB,EAChBC,GAAU,EACVv2B,EAAS,CAAA,EACb,IAAA,IAAS54B,EAAI,EAAGA,EAAI6D,EAAQ2pD,cAAcvwD,WAAWvC,SAE7CmJ,EAAQ2pD,cAAcvwD,WAAW+C,GAAGlD,SACpC+G,EAAQ2pD,cAAcvwD,WAAW+C,GAAGlD,UAAY+G,EAAQ/G,UAExD87B,EAAS/0B,EAAQ2pD,cAAcvwD,WAAW+C,EAAI+uD,GAC1Cn2B,IAEAs2B,EAAgBt2B,EAAOw2B,UAAY,GACnCD,GAAU,KAGdA,GAZqDnvD,KAiBzDmvD,GAA6B,IAAlBD,IACXA,EAAgBrrD,EAAQ2pD,cAAc4B,UAAYvrD,EAAQ2pD,cAAc6B,cAGtEzT,MAAAA,EADW38C,OAAOi7C,QAAUgV,EACN,EAEZ,SAAXvT,IAAuBC,IACxB/3C,EAAQzC,aAAa,SAAUw6C,GAC3BiT,EAAgB,IAChB1wD,SAASM,KAAKiK,MAAM4mD,WAAa1T,EAAWiT,EAAgB,KAAO,OAAA,EASzE7xC,EAAYA,KACPnG,OAAAA,iBAAiB,SAAUo4C,EAAY,EAG5C9uC,EAAcA,KACTnJ,OAAAA,oBAAoB,SAAUi4C,EAAY,EAsB9C,MAAA,CAAED,WAnFUA,CACfO,EACAC,EAAiBX,EACjBY,EAAyBX,EACzBY,EAAcX,KAEdlrD,EAAU0rD,EACVV,EAAgBW,EAChBV,EAAwBW,EACxBV,EAAaW,EACb7rD,EAAQzC,aAAa,SAAU,SAC/ByC,EAAQrJ,UAAUC,IAAI,uBACtBw0D,IACAjyC,KAsEiBqZ,QA/BLA,KACZlW,KA8B0BwvC,eAnBPA,CAACC,EAAS,KAC7B,IAAI57B,EAAKnwB,EAIT,GAH8B,KAA1BirD,IACA96B,EAAKnwB,EAAQoE,cAAc6mD,KAE1B96B,EACD,OAIJ,MAAM+qB,EADU5gD,SAAS8J,cAAc,iBACX+gC,yBAA2B,CAAE0V,OAAQ,EAAGM,EAAG,GACjE/3B,EAAmB83B,EAAWL,OAE9BvE,EAAM,GAFqC4E,EAAWC,EAEhC/3B,EAAgB2oC,MAC5C57B,OAAAA,EAAGtrB,MAAMyxC,IAAMA,EAER,CAAA,IAMCyU,GClEHt0D,GAASA,CAACpB,EAAOqc,KACpB,MAAE8pB,4BAAAA,EAA6BC,wBAAAA,GAA4BpmC,EAC3DmwD,EAAYpJ,GAAQ7kD,IAAI,cAAgB,GACxC6a,EAAUgqC,GAAQ7kD,IAAI,YAAc,GAEpCmkC,EADoB8pB,EAAUvwD,MAAK+2D,GAAYA,EAAS3iC,YACXpyB,MAE7Cg1D,EA5B6BC,GACnC95C,QAAAA,EAGAopB,4BAAAA,EACAC,wBAAAA,EACA/pB,SAAAA,EACAgqB,wBAAAA,KAEOtpB,EACD3S,EAAsB,CAClB+7B,4BAAAA,EACAC,wBAAAA,EACArpB,QAASA,EACT+5C,kBAAmB,kBACnBz6C,SAAAA,EACAgqB,wBAAAA,IAEJ,GAU0BwwB,CAA+B,CAC3D95C,QAAAA,KACG/c,EACHqc,SAAAA,EACAgqB,wBAAAA,IAGG,MAAA,0CAC4BuwB,8EAxCTG,CAAAA,GACnBA,EAAW3sD,EAAsB,CAAEw7B,WAAYmxB,IAAc,GAyCpDC,CAAsB7G,iDACChqB,4CACJC,uCACLwwB,4CACKvwB,yCAAuB,SCpC1D4wB,GAAA,IAAArE,QAkDJ3wD,eAAeC,IAAI,mBAAqBD,eAAeE,OAAO,iBAnD9D,cAA4BY,EAA5B,WAAAhC,GAAAC,SAAAqnB,WACI+P,EAAAn3B,KAAAg2D,IAAY,EAAA,CAEZ/zD,OAAAA,GACIjC,KAAKjB,MAAQiB,KAAKgC,aAAahC,KAAKqzD,cAAc50D,YAGlD,MAAMm2D,EAAa50D,KAAKvB,WAAWw3D,aAAa,eAC1CnuD,OAAO9H,KAAKvB,WAAWw3D,aAAa,eAAe5vD,YACnD6W,EAEN80C,EAAAhyD,KAAKg2D,KAAavB,GAAcI,WAAW70D,KAAM,EAAG,oBAAqB40D,EAC7E,CAEA,6BAAW1lC,GACA,MAAA,CAAC,SAAU,eACtB,CAEAO,wBAAAA,CAAyB7uB,EAAM6yD,EAAQC,GACpB,OAAXA,GAAmBA,IAAWD,GAAUC,EAAOnzD,SAClC,WAATK,GACAoxD,EAAAhyD,KAAKg2D,KAAavB,GAAce,iBAEvB,iBAAT50D,GACAZ,KAAKq0D,kBAGjB,CAEAA,eAAAA,GAGI,MAAMj5C,EAAW,CACbzH,GAAI3T,KAAKjB,MAAMm3B,YACfvY,SAAU3d,KAAKjB,MAAMqlB,kBACrBxjB,KAAMZ,KAAKjB,MAAMo3B,cACjBlmB,SAAUjQ,KAAKjB,MAAMq3B,mBAEnBk+B,EAAO4B,GACTl2D,KAAKjB,MAAMsc,YAAcrb,KAAKjB,MAAMsc,YAAcrb,KAAKjB,MACvDiB,KAAKjB,MAAMqc,UAAYA,GAG3Bpb,KAAKkC,aAAaoyD,EACtB,CAEA9vD,SAAAA,GACIwtD,EAAAhyD,KAAKg2D,KAAavB,GAAcv4B,SACpC,ICxBJl7B,eAAeC,IAAI,qBAAuBD,eAAeE,OAAO,mBAhChE,cAA6BY,EACzBG,OAAAA,GACU,MAAEk0D,WAAAA,EAAYr1D,MAAAA,EAAOs0B,WAAAA,EAAYz0B,MAAAA,EAAOoJ,UAAAA,GAAc/J,KAAKjB,MAE3Dq3D,EAAYt1D,EAAQ,6CAA6CA,YAAkB,GAEzFd,KAAK+B,SAAW,sDAEMqzB,kCACDrrB,8DAECosD,KAAcx1D,uCAE1By1D,IAAYz1D,qCAG1B,CACAwB,OAAAA,GACU,MAAEkE,MAAAA,EAAOyI,KAAAA,EAAMnO,MAAAA,GAAUX,KAAKjB,MAC/B2d,KAAAA,iBAAiB,SAAS,KAC3BopC,GAAQ+B,cAAc,CAClBzhD,IAAK0I,EACLnO,MAAOA,EACPoyB,UAAU,EACV1sB,MAAOA,IAEXrG,KAAK4c,SACL00C,GAAe,WAAU,GAEjC,IC5BJ,MCAA+E,GAAe,CAAClqD,EAAS+D,EAAe,GAAIoQ,EAAO,GAAI5c,EAAQ,KAC3D,MAAMhF,EAAO,IAAKyN,EAAc+D,aAAAA,GAC1BD,EAAWvM,EAAQ,EAGzBhF,EAAKuR,SAAWA,EAGhBvR,EAAKsO,MAAQ84C,GAAQ74C,eAAeU,MAAMm4C,GAAQ14C,SAAUjB,EAAQa,OACpEtO,EAAKoY,SAAW3K,EAAQa,MACpBtO,EAAKolB,cACLplB,EAAKolB,YAAcgiC,GAAQ74C,eAAeU,MAAMm4C,GAAQ14C,SAAUjB,EAAQ2X,cAI1EplB,EAAKkQ,oBACLlQ,EAAKkQ,kBAAoBk3C,GAAQ74C,eAAeU,MAC5Cm4C,GAAQ14C,SACRjB,EAAQyC,oBAKhBlQ,EAAKqL,UAAYH,EACjBlL,EAAK+b,gBACDqrC,GAAQ7kD,IAAI,YAAYwZ,iBACxBqrC,GAAQmJ,aAAa,+CACzBvwD,EAAK0c,SAAW0qC,GAAQ7kD,IAAI,YAEtBosC,MAAAA,E/F3B2BipB,GAAGxnD,KAAAA,EAAMynD,eAAAA,MAC1C,IAAI5wD,EAAS,SAETmJ,OAAAA,IAAS7D,GACTtF,EAAS,gBACFmJ,IAAS5D,IAAsBqrD,EACtC5wD,EAAS,qBACFmJ,IAAS5D,GAChBvF,EAAS,iBACFmJ,IAAS3D,GAChBxF,EAAS,mBACFmJ,IAAS1D,KAChBzF,EAAS,oBAGNA,CAAAA,E+FYK2wD,CAAsB53D,GAElC,MAAO,IAAI2uC,qCACkB/sB,0CACIrQ,2BACfvR,EAAK6M,+BACHpC,EAAsBzK,wBAC5BA,EAAKsY,YAAc,gBAAgBtY,EAAKsY,eAAiB,qBAC3Dq2B,IAAG,YClCfmpB,GAAA,YACAC,GAAA,IAAA9E,QA0EJ3wD,eAAeC,IAAI,gBAAkBD,eAAeE,OAAO,cA5E3D,cAAyBY,EAAzB,WAAAhC,GAAAC,SAAAqnB,WACI+P,EAAAn3B,KAAAw2D,GAAkB,oDAClBr/B,EAAAn3B,KAAAy2D,GAAiB,mCAAA,CAEjBx0D,OAAAA,GACSlD,KAAAA,MAAQiB,KAAKgC,aAAahC,KAAKqzD,cAAc50D,YAClDuB,KAAK02D,iBAAwD,SAArC12D,KAAKklB,aAAa,eAC1CllB,KAAK22D,eAAiB,GACtB32D,KAAKK,UAAUC,IAAI,cACvB,CAEA,6BAAW4uB,GACP,MAAO,CAAC,eACZ,CAEAO,wBAAAA,CAAyB7uB,EAAM6yD,EAAQC,GACpB,OAAXA,GAAmBA,IAAWD,GAAYC,EAAOnzD,QACpC,iBAATK,GACAZ,KAAKq0D,iBAGjB,CAEAA,eAAAA,GACI,MAAMuC,EAAe52D,KAAK02D,iBAAmB,GF1BtC,EAACG,EAAmB,MACzB,MACFC,gCAAAA,EAAkC,eAClCC,+BAAAA,EAAiC,UACjCC,iCAAAA,EAAmC,kDACnCC,oBAAAA,EAAsB,wBACtBC,0BAAAA,EAA4B,YAC5BC,4BAAAA,EAA8B,UAC9BC,gCAAAA,EAAkC,SAClCC,iCAAAA,EAAmC,WACnCR,EAEES,EAAQxR,GAAQ8B,wBAChB2P,EAAezR,GAAQgD,wBAA0BhD,GAAQwC,2BAYxD,MAAA,uHAKKiP,EACM,mCAAmCN,0DACHM,EACzB72D,KAAI1B,GAAU,GAAGA,EAAO6pD,kBAAkB7pD,EAAO2B,YACjDI,KAAK,0CACRw2D,EACD72D,KACG1B,GACI,sKAGKA,EAAOqH,6CACRrH,EAAOoH,4CACNpH,EAAO2B,8CACP3B,EAAO8B,OAAS,gDACXg2D,gCACf93D,EAAO2B,6BAETI,KAAK,MACR,4KAMQg2D,sCAEZG,yHAGsBF,6CACZtR,OAAwB4R,YA/CzBE,MACnB,OAAQF,GACJ,KAAK,EACMD,OAAAA,EACX,KAAK,EACMD,OAAAA,EACX,QACWD,OAAAA,EACf,EAuC4DK,sDAAgB,EEnC1Bj1C,CAAaviB,KAAKjB,OACpE,GAAIiB,KAAKy3D,eAAez3D,KAAK22D,eAAgB7Q,GAAQc,wBAIjD,OAFS94C,SAAAA,cAAckkD,EAAAhyD,KAAKw2D,KAAiBkB,UAAYd,OACzD52D,KAAKw6B,aAIJm8B,KAAAA,eAAiB7Q,GAAQc,uBAC9B,MAAM+Q,EAAa7R,GAAQgD,uBAAyB,EAC9CiC,EAAWjF,GAAQ7kD,IAAI,gBAAgBmF,MAAQ0/C,GAAQ7kD,IAAI,iBAAiB,GAAGmF,IAC/EwxD,EAAW,GAAGD,EAAa,eAAiB,KAAK5M,GAAY4M,EAAa,KAAO,KACnF5M,EAAW,mBAAqB,KAGpC/qD,KAAKkC,aACD,iBACE00D,8GAEI9Q,GACGc,uBACAlmD,KAAI,CAACyL,EAASzI,IACJ2yD,GAAclqD,EAAS,UAAWyrD,GAAYl0D,KAExD3C,KAAK,8CAGd,GAGJf,KAAKw6B,YACT,CAEAi9B,cAAAA,CAAervC,EAAI,GAAIo/B,EAAI,IACvB,OAAOp/B,EAAE7nB,SAAWinD,EAAEjnD,QAAiB6nB,EAAEsR,OAAM,CAACrzB,EAAO3C,IAAU2C,IAAUmhD,EAAE9jD,IACjF,CAEAc,SAAAA,GACasJ,SAAAA,cAAckkD,EAAAhyD,KAAKy2D,MAAiB55C,oBAAoB,QAAS7c,KAAK63D,WACnF,CAEAr9B,UAAAA,GACa1sB,SAAAA,cAAckkD,EAAAhyD,KAAKy2D,MAAiB/5C,iBAAiB,QAAS1c,KAAK63D,WAChF,CAEAA,UAAAA,GACI/2C,GAAkB,eAAgB,GAAI,GAAI,iBAC1CglC,GAAQkD,eACRsI,GAAe,WACnB,IChDJtwD,eAAeC,IAAI,iBAAmBD,eAAeE,OAAO,eA3B5D,cAA0BY,EACtB,6BAAWotB,GACP,MAAO,CAAC,eACZ,CAEAO,wBAAAA,CAAyB7uB,EAAM6yD,EAAQC,GACpB,OAAXA,GAAmBA,IAAWD,GAAUC,EAAOnzD,QAClC,iBAATK,GACAZ,KAAKq0D,iBAGjB,CAEAA,eAAAA,GAEI,MAAMC,GADaxO,GAAQ7kD,IAAI,aAAe,IACtBhC,QAAO,CAACynD,EAAKjzC,KACjCizC,GChBG3nD,CAAAA,IACL,MACF4U,GAAAA,EAAK,KACLmpB,kBAAAA,EACAD,mBAAAA,EACAF,kBAAAA,EACAC,kBAAAA,EACA1H,SAAAA,EAAW,OACXt0B,KAAAA,EAAO,KACPkV,YAAAA,EACAyD,SAAAA,EAAW,IACXxa,EAWJ,MAAO,sCAAsC4U,wIAGjBuhB,8CACS4H,+CACCD,8CACDF,8CACAC,gFAf1Bh8B,EAAO,6CAA6CA,SAAc,oGAIlEkV,EAAc,mCAAmCA,QAAoB,8bAyBtDyD,EACG7Y,KAAI,CAACyL,EAASzI,IACX2yD,GAAclqD,OAAS+Q,EAAWtc,EAAM8C,KAE3C3C,KAAK,wJAAG,ED/BtB+2D,CAAiBrkD,GACjBizC,IACR,IACCzB,GAAkBE,IAClBnlD,KAAKkC,aAAaoyD,GAAM,GAExBt0D,KAAKkC,aAAaoyD,EAE1B,IEfJ,MAAMyD,WAAej2D,EACjBhC,WAAAA,GACIC,QACAC,KAAKg4D,qBAAuB,IAAM,GAClCh4D,KAAKi4D,mBAAqB,IAAM,GAChCj4D,KAAKsuD,gBAAkB,IAAM,GAC7BtuD,KAAKuuD,sBAAwB,OAC7BvuD,KAAKitD,UAAY,GACjBjtD,KAAKimD,QAAU,KACnB,CAEA,6BAAW/2B,GACA,MAAA,CAAC,cAAe,OAC3B,CAEAO,wBAAAA,CAAyB7uB,EAAM6yD,EAAQC,GAE/B9yD,GAAS,SAATA,GACW,OAAX6yD,GACW,OAAXC,GACAA,IAAWD,GACTC,EAAOnzD,OAGT,YADAP,KAAKE,oBAGHg4D,MAAAA,EAAuB,gBAATt3D,EACdu3D,EAA0B,OAAXzE,GAAmBA,IAAWD,KAAYC,EAAOnzD,OAElE23D,GAAeC,GACf7G,GAAe,cAAe,CAC1BhD,gBAAiBtuD,KAAKsuD,gBACtBF,eAAgBpuD,KAAKi4D,mBACrB5J,eAAgBruD,KAAKg4D,qBACrBzJ,sBAAuBvuD,KAAKuuD,sBAC5Bl4C,iBAAkBrW,KAAKjB,OAGnC,CAEAq5D,cAAAA,GACIp4D,KAAK+B,SAAW,iCACMqjD,6EACIG,+EACFC,4EACDC,qDAE3B,CAEAxjD,OAAAA,IAC+BjC,KAAKjB,MAAMuX,SAAS+hD,oBAAsB,IAClD50D,SAAQyhD,G1B3D5B,SAA0BA,GAC7BH,GAAmBzkD,IAAI4kD,GACvBzlD,QAAQ64D,KAAK,0BAA2BvT,GAAmB4D,SAC/D,C0BwDiD4P,CAAiBrT,KAE1DoM,GAAe,SAAU,CACrBrL,QAASjmD,KAAKimD,QACdoH,iBAAkBrtD,KAAKitD,YAG3BjtD,KAAKK,UAAUC,IAAI,UAAW,WAAWN,KAAKimD,WACxCuS,MAAAA,EAAcx4D,KAAKjB,MAAMuX,SAASmiD,cACpCD,EAAc,KACdx4D,KAAKK,UAAUC,IAAI,WAAWk4D,KAGlCx4D,KAAKo4D,gBACT,EC9EW,MAAMM,GAuBjB54D,WAAAA,CAAY2T,EAAUklD,GAtBtBC,EAAAA,KAAM,MAAA,IACNC,EAAAA,KAAQ,QAAA,IACRC,EAAAA,KAAe,eAAA,IACfC,EAAAA,iBAAY,IACZC,EAAAA,KAAiB,iBAAA,MACjBC,EAAAA,KAAe,eAAA,MACfC,EAAAA,KAAQ,QAAA,MACRC,EAAAA,KAAqB,sBAAA,GACrBC,EAAAA,KAAa,aAAA,MACbC,EAAAA,sBAAiB,IACjBC,EAAAA,wBAAmB,IACnBC,EAAAA,KAAO,OAAA,IACPC,EAAAA,KACI,qBAAA,wFACJC,EAAAA,KACI,sBAAA,uFACJC,EAAAA,KACI,qBAAA,uFACJC,EAAAA,KAAqB,qBAAA,IACrBC,EAAAA,KAAY,YAAA,QACZC,EAAAA,KAAa,cAAA,GAGT75D,KAAK44D,IAAMnlD,EAASE,IAAM3T,KAAK44D,IAC/B54D,KAAK64D,MAAQplD,EAAS7S,MAAQZ,KAAK64D,MACnC74D,KAAKg5D,eAAiBvlD,EAASqmD,eAAiB95D,KAAKg5D,eACrDh5D,KAAK84D,aAAerlD,EAASqC,aAAe9V,KAAK84D,aACjD94D,KAAKi5D,aAAexlD,EAASsmD,aAAe/5D,KAAKi5D,aACjDj5D,KAAKk5D,MAAQzlD,EAASwC,MAAQjW,KAAKk5D,MACnCl5D,KAAKo5D,WAAa3lD,EAASumD,WAAah6D,KAAKo5D,WAC7Cp5D,KAAKq5D,eAAiB5lD,EAASwmD,eAAiBj6D,KAAKq5D,eACrDr5D,KAAKs5D,iBAAmB7lD,EAASymD,iBAAmBl6D,KAAKs5D,iBACzDt5D,KAAKu5D,KAAO9lD,EAAS1M,KAAO/G,KAAKu5D,KACjCv5D,KAAKy5D,oBAAsBd,GAAiB97B,oBAAsB78B,KAAKy5D,oBACvEz5D,KAAK05D,mBAAqBf,GAAiBh8B,mBAAqB38B,KAAK05D,mBACrE15D,KAAKw5D,mBAAqBb,GAAiB77B,mBAAqB98B,KAAKw5D,mBACrEx5D,KAAK25D,mBAAqBhB,GAAiB/7B,mBAAqB58B,KAAK25D,mBACrE35D,KAAK45D,UAAYjB,GAAiBzjC,UAAYl1B,KAAK45D,SACvD,CAEA,MAAIjmD,GACA,OAAO3T,KAAK44D,GAChB,CACA,YAAIr/C,GACA,OAAOvZ,KAAK+4D,SAChB,CACA,YAAIx/C,CAASA,GACTvZ,KAAK+4D,UAAYx/C,CACrB,CACA,qBAAI4gD,GACA,OAAOn6D,KAAKm5D,kBAChB,CACA,qBAAIgB,CAAkBA,GAClBn6D,KAAKm5D,mBAAqBgB,CAC9B,CACA,QAAIv5D,GACA,OAAOZ,KAAK64D,KAChB,CACA,eAAI/iD,GACA,OAAO9V,KAAK84D,YAChB,CACA,YAAI5jC,GACA,OAAOl1B,KAAK45D,SAChB,CACA,sBAAI/8B,GACA,OAAO78B,KAAKy5D,mBAChB,CACA,qBAAI98B,GACA,OAAO38B,KAAK05D,kBAChB,CACA,qBAAI58B,GACA,OAAO98B,KAAKw5D,kBAChB,CACA,qBAAI58B,GACA,OAAO58B,KAAK25D,kBAChB,CAEAS,iBAAAA,GACI,OAAQp6D,KAAK65D,YAAc75D,KAAK+4D,WAAa/4D,KAAK+4D,UAAUx4D,OAAS,CACzE,EC/EW,MAAM85D,WAAuB3B,GACxC54D,WAAAA,CAAY2T,EAAUklD,GAClB54D,MAAM0T,EAAUklD,EACpB,ECHW,MAAM2B,GAqCjBx6D,WAAAA,CAAYqM,GApCZwH,EAAAA,KAAK,KAAA,IACLpI,EAAAA,KAAM,MAAA,IACNyE,EAAAA,KAAU,UAAA,IACVpP,EAAAA,KAAO,OAAA,IACPqJ,EAAAA,KAAc,cAAA,IACdswD,EAAAA,KAAY,aAAA,GACZzkD,EAAAA,KAAc,cAAA,MACdpH,EAAAA,KAAY,aAAA,GACZqI,EAAAA,KAAiB,iBAAA,IACjBf,EAAAA,KAAQ,QAAA,IACRyJ,EAAAA,KAAU,WAAA,GACV9I,EAAAA,KAAkB,kBAAA,IAClBkH,EAAAA,KAAoB,oBAAA,IACpBpE,EAAAA,KAAW,WAAA,IACX+gD,EAAAA,KAAmB,mBAAA,MACnBC,EAAAA,KAAgB,gBAAA,MAChBztD,EAAAA,KAAQ,QAAA,MACR0tD,EAAAA,KAAoB,qBAAA,GACpB1nC,EAAAA,cAAS,IACTvmB,EAAAA,KAAgB,gBAAA,MAChBX,EAAAA,oBAAe,IACfgD,EAAAA,KAAO,OAAA,IACPxC,EAAAA,KAAe,eAAA,IACfvF,EAAAA,KAAM,MAAA,IACN9G,EAAAA,cAAS,IACT6P,EAAAA,KAAgB,gBAAA,IAChB2D,EAAAA,KAAW,WAAA,MACXuD,EAAAA,KAAc,eAAA,GACdhJ,EAAAA,KAAsB,sBAAA,IACtBwI,EAAAA,KAAqB,qBAAA,IACrBC,EAAAA,KAA0B,0BAAA,IAC1BC,EAAAA,+BAA0B,CAAA,GAC1BX,EAAAA,KAAe,eAAA,MACf3F,EAAAA,KAAqB,qBAAA,IACrBzF,EAAAA,KAAW,WAAA,IAIFY,KAAAA,IAAMY,EAAQwK,iBAAmB3W,KAAKuL,IAC3CvL,KAAKgQ,QAAU7D,EAAQwH,IAAM3T,KAAKgQ,QAClChQ,KAAK2T,GAAKxH,EAAQwH,IAAM3T,KAAK2T,GAC7B3T,KAAKY,KAAOuL,EAAQvL,MAAQZ,KAAKY,KACjCZ,KAAKiK,YAAckC,EAAQlC,aAAejK,KAAKiK,YAC/CjK,KAAKu6D,UAAYpuD,EAAQouD,WAAav6D,KAAKu6D,UAC3Cv6D,KAAK8V,YAAc3J,EAAQ2J,aAAe9V,KAAK8V,YAC/C9V,KAAK0O,WAAYe,OAAuBtD,EAAQuC,WAAa1O,KAAK0O,WAClE1O,KAAK+W,eAAiB5K,GAAS6J,OAAO2kD,SAAW36D,KAAK+W,eACtD/W,KAAKgW,MAAQ7J,GAAS6J,OAAOjP,KAAO/G,KAAKgW,MACzChW,KAAKyf,QAAUtT,EAAQsT,QACvBzf,KAAK2W,gBAAkBxK,EAAQwK,iBAAmB3W,KAAK2W,gBACvD3W,KAAK6d,kBAAoB1R,EAAQ0R,mBAAqB7d,KAAK6d,kBAC3D7d,KAAKyZ,SAAWtN,EAAQsN,UAAYzZ,KAAKyZ,SACzCzZ,KAAKw6D,iBAAmBruD,EAAQquD,kBAAoBx6D,KAAKw6D,iBACzDx6D,KAAKy6D,cAAgBtuD,EAAQsuD,eAAiBz6D,KAAKy6D,cACnDz6D,KAAKgN,MAAQb,EAAQa,OAAShN,KAAKgN,MACnChN,KAAK06D,kBAAoBvuD,EAAQuuD,mBAAqB16D,KAAK06D,kBAC3D16D,KAAKgzB,OAAS7mB,EAAQ6mB,QAAUhzB,KAAKgzB,OACrChzB,KAAKyM,cAAgBN,EAAQM,eAAiBzM,KAAKyM,cACnDzM,KAAK8L,aAAeK,EAAQL,cAAgB9L,KAAK8L,aACjD9L,KAAK8O,KAAO3C,EAAQ2C,MAAQ9O,KAAK8O,KACjC9O,KAAKsM,aAAeH,EAAQG,cAAgBtM,KAAKsM,aACjDtM,KAAK+G,IAAMoF,EAAQpF,KAAO/G,KAAK+G,IAC/B/G,KAAKgX,YAAc7K,EAAQ6K,aAAehX,KAAKgX,YAC/ChX,KAAKgO,oBAAsB7B,EAAQ6B,qBAAuBhO,KAAKgO,oBAC/DhO,KAAKwW,mBAAqBrK,EAAQqK,oBAAsBxW,KAAKwW,mBAC7DxW,KAAKyW,wBACDtK,EAAQsK,yBAA2BzW,KAAKyW,wBAC5CzW,KAAK0W,wBACDvK,EAAQuK,yBAA2B1W,KAAK0W,wBAC5C1W,KAAK+V,aAAe5J,EAAQ4J,cAAgB/V,KAAK+V,aACjD/V,KAAKoQ,mBAAqBjE,EAAQiE,oBAAsBpQ,KAAKoQ,mBAC7DpQ,KAAK2K,SAAWwB,EAAQxB,UAAY3K,KAAK2K,SACzC3K,KAAKC,OAASkM,EAAQlM,QAAUD,KAAKC,OAG/B6U,MAAAA,EAAa3I,EAAQ2I,WAAa3I,EAAQ2I,WAAW6K,MAAM,KAAO,CAAC,IACpE7P,KAAAA,cAAgBgF,EAAWA,EAAWvU,OAAS,GACpDP,KAAKyT,SAAWtH,EAAQsH,UAAYzT,KAAKyT,QAC7C,EC9EW,MAAMmnD,WAAsBN,GAgCvCx6D,WAAAA,CAAYqM,EAASwsD,GACjB54D,MAAMoM,GAhCV+1B,EAAAA,gBAAW,IACXrnB,EAAAA,uBAAkB,IAClBsnB,EAAAA,eAAU,IACV04B,EAAAA,KAAW,YAAA,GACXxuD,EAAAA,KAAiB,iBAAA,GACjBkJ,EAAAA,KAAU,WAAA,GACV+N,EAAAA,aAAQ,IACR1Y,EAAAA,KAAqB,qBAAA,IACrBkwD,EAAAA,KAAa,aAAA,IACbtwD,EAAAA,KAAoB,oBAAA,IACpBuwD,EAAAA,KAAe,eAAA,IACf5gD,EAAAA,KAAe,eAAA,IACfD,EAAAA,KAAgB,gBAAA,IAChBN,EAAAA,KAAiB,iBAAA,IACjBtC,EAAAA,KAAY,YAAA,MACZoD,EAAAA,KAAqB,qBAAA,IACrBuW,EAAAA,KAAqB,qBAAA,IACrBpiB,EAAAA,KAAoB,qBAAA,GACpBkL,EAAAA,KAAc,eAAA,GACdnL,EAAAA,KAAoB,oBAAA,MACpB0G,EAAAA,KAAc,cAAA,MACduE,EAAAA,KAAsB,sBAAA,IACtBC,EAAAA,KAAuB,uBAAA,8CACvBE,EAAAA,KAAgB,gBAAA,iEAChB2X,EAAAA,KAAiB,iBAAA,IACjB1X,EAAAA,KAAoB,oBAAA,IACpBqX,EAAAA,KAAqB,qBAAA,IACrB7Z,EAAAA,KAAqB,sBAAA,GACrBujD,EAAAA,KAAa,aAAA,MACb7jD,EAAAA,sBAAiB,CAAA,GAIbnX,KAAKi7D,0BAA0BtC,GAC/B34D,KAAKk7D,sBAAsBvC,GAC3B34D,KAAKm7D,sBAAsBhvD,GAC3BnM,KAAKo7D,uBAAuBjvD,EAChC,CAEA8uD,yBAAAA,CAA0BtC,GAChB,MACFmC,WAAAA,EAAa,GACbtwD,kBAAAA,EAAoB,GACpBuwD,aAAAA,EACAxgD,eAAAA,EAAiB,CAAE,EACnByI,eAAAA,EAAiB,GACjBE,gBAAAA,EAAkB,GAClBD,YAAAA,EAAc,GACdE,eAAAA,EAAiB,GACjBk4C,mBAAAA,EAAqB,GACrBh4C,4BAAAA,EAA8B,IAC9Bs1C,EAAgBt9C,aAAes9C,EAEnC34D,KAAK86D,WAAaA,EAClB96D,KAAKwK,kBAAoBA,EACzBxK,KAAK+6D,aAAeA,EACpB/6D,KAAKua,eAAiBA,EAEtBva,KAAKs7D,SAAW,CACZxoD,WAAYkQ,EACZu4C,YAAar4C,EACbs4C,QAASv4C,EACTw4C,WAAYt4C,EACZu4C,eAAgBL,EAChBM,wBAAyBt4C,EAEjC,CAEA63C,qBAAAA,CAAsBvC,GACZ,MACF5+C,YAAAA,GAAc,EACdI,aAAAA,EAAe,GACfD,cAAAA,EAAgB,GAChBN,eAAAA,EAAiB,GACjB/K,kBAAAA,GAAoB,EACpBgL,oBAAAA,EACAC,qBAAAA,EACAlP,mBAAAA,GAAqB,EACrBoP,cAAAA,EAAgB,gEAChBiX,mBAAAA,EAAqB,GACrBvW,mBAAAA,EAAqB,GACrBiX,eAAAA,EAAiB,IACjBgnC,EAAgBriD,SAAWqiD,EAE/B34D,KAAK+Z,YAAcA,EACnB/Z,KAAKma,aAAeA,EACpBna,KAAKka,cAAgBA,EACrBla,KAAK4Z,eAAiBA,EACtB5Z,KAAK6O,kBAAoBA,EACzB7O,KAAK6Z,oBAAsBA,GAAuB7Z,KAAK6Z,oBACvD7Z,KAAK8Z,qBAAuBA,GAAwB9Z,KAAK8Z,qBACzD9Z,KAAK4K,mBAAqBA,EAC1B5K,KAAKga,cAAgBA,EACrBha,KAAKixB,mBAAqBA,EAC1BjxB,KAAK0a,mBAAqBA,EAC1B1a,KAAK2xB,eAAiBA,GAAkB3xB,KAAK2xB,cACjD,CAEAwpC,qBAAAA,CAAsBhvD,GACb+1B,KAAAA,SAAW/1B,EAAQ+1B,UAAYliC,KAAKkiC,SACzCliC,KAAK6a,gBAAkB1O,EAAQ0O,iBAAmB7a,KAAK6a,gBACvD7a,KAAKmiC,QAAUh2B,EAAQg2B,SAAWniC,KAAKmiC,QACvCniC,KAAK66D,cAA+B39C,IAApB/Q,EAAQsT,QAAwBtT,EAAQsT,QAAUzf,KAAK66D,SACvE76D,KAAKsX,UAAYnL,EAAQmL,WAAatX,KAAKsX,UAC3CtX,KAAKm0B,cAAgBhoB,EAAQgoB,cAC7Bn0B,KAAKwX,cAAgBrL,EAAQqL,cAC7BxX,KAAKqM,eAAiBF,EAAQM,cAC9BzM,KAAK4O,kBAAoBzC,EAAQyC,mBAAqB5O,KAAK4O,kBAC3D5O,KAAKgN,MAAQhN,KAAK47D,SAASzvD,GAC3BnM,KAAKia,kBAAoB9N,EAAQ8N,mBAAqBja,KAAKia,kBAC3Dja,KAAKsxB,mBAAqBnlB,EAAQmlB,oBAAsBtxB,KAAKsxB,mBAC7DtxB,KAAKyX,mBAAqBtL,EAAQsL,oBAAsBzX,KAAKyX,mBAC7DzX,KAAKg7D,WAAah7D,KAAK67D,aAAa1vD,GACpCnM,KAAKmX,eAAiBhL,EAAQgL,gBAAkBnX,KAAKmX,eACrDnX,KAAK6V,OAAS1J,EAAQ0J,QAAU,CAAA,EAChC7V,KAAK87D,gBAAgB3vD,EACzB,CAEA2vD,eAAAA,CAAgB3vD,GACZ,MAAM4vD,EAAc,CAChB,CAAEC,UAAW7vD,EAAQ8vD,eAAgBr7D,KAAM,mBAAoBs7D,OAAQ,eACvE,CAAEF,UAAW7vD,EAAQgwD,UAAWv7D,KAAM,aAAcs7D,OAAQ,cAC5D,CAAEF,UAAW7vD,EAAQiwD,UAAWx7D,KAAM,aAAcs7D,OAAQ,WAC5D,CAAEF,UAAW7vD,EAAQsvD,WAAY76D,KAAM,gBAAiBs7D,OAAQ,cAChE,CAAEF,UAAW7vD,EAAQuvD,eAAgB96D,KAAM,iBAAkBs7D,OAAQ,kBACrE,CACIF,UAAW7vD,EAAQkwD,QACnBz7D,KAAM,yBACNs7D,OAAQ,4BAGX54C,KAAAA,MAAQy4C,EACR/8D,QAAO6rC,GAA0B,MAAlBA,EAAKmxB,YACpBt7D,KAAI,EAAGE,KAAAA,EAAMs7D,OAAAA,MAAc,CACxBt7D,KAAAA,EACAkqC,IAAK9qC,KAAKs7D,SAASY,MAE/B,CAEAd,sBAAAA,CAAuBjvD,GACnB,MAAMqlB,EAAexxB,KAAKia,mBAAqB/N,GAAgBC,IACvD4X,kBAAAA,EAAmBD,YAAAA,GAAgB9jB,KAAKmiB,eAAe,CAC3DtT,kBAAmB7O,KAAK6O,kBACxBoL,kBAAmBuX,EACnB/kB,cAAezM,KAAKqM,eACpBW,MAAOhN,KAAKgN,MACZuI,QAASvV,KAAKuV,UAEbwO,KAAAA,kBAAoBA,EACzB/jB,KAAK8jB,YAAcA,EACnB9jB,KAAKuV,QAAUvV,KAAKwM,WACxB,CAEAovD,QAAAA,CAASzvD,GACL,OAAOA,EAAQmJ,aAAenJ,EAAQa,OAAShN,KAAKsV,WACxD,CAEAumD,YAAAA,CAAa1vD,GACF,OAAAnM,KAAK6O,mBAAkD,MAA7B1C,EAAQyC,kBACnC5O,KAAK47D,SAASzvD,GACdA,EAAQyC,iBAClB,CAEAuT,cAAAA,EAAiBtT,kBAAAA,EAAmBoL,kBAAAA,EAAmBxN,cAAAA,EAAeO,MAAAA,EAAOuI,QAAAA,IACrEwO,IAAAA,GAAoB,EACpBD,EAAc,KACd,OAACvO,GAAiC,IAAtB0E,EAGZ8J,GAAoB,EAFpBD,EAAc9W,GAAS6B,EAAoB,EAAIpC,GAI5C,CAAEsX,kBAAAA,EAAmBD,YAAAA,EAChC,CAEAtX,SAAAA,GACW,QAAAxM,KAAKqM,eAAiB,GAA2B,IAAtBrM,KAAKsM,gBAET,IAAxBtM,KAAKqM,gBAAwBrM,KAAKsM,aAAe,EAC3D,ECpLJ,MAAAgwD,GAAe,CAACpN,EAAWqN,EAA0B5D,KAEjD,MACM6D,EAAc,4BACdC,EAAW,4BAETphD,YAAAA,EAAc,CAAE,EAAE/E,QAAAA,EAAU,CAAC,GAAMqiD,EAErC+D,EAAmC5wD,GAC9BA,EAAapL,KAAI,EAAGiT,GAAAA,EAAI5M,IAAAA,EAAKnG,KAAAA,EAAMmuD,WAAAA,MAAkB,CACxDtoD,KAAMM,EACNpG,MAAOC,EACPokB,UAAWpkB,EACXu0B,UAAWxhB,EAAKgpD,EAAoBhpD,EAAGgM,MAAM,KAAKC,OAAS,GAC3DmT,SAAUg8B,MAGZ4N,EAAsB5+C,IACxB,OAAQA,GACJ,KAAKnc,EACM46D,OAAAA,EACX,I3HgDc,M2H/CHC,OAAAA,EACX,QACWG,M3H2CQ,W2H1CvB,EA6BA9N,IAAAA,EACAx4C,GACAw4C,EADAx4C,EAAQumD,gCAlBqBC,MAC7B,IAAKzhD,EAAY0hD,8BACb,MAAO,GAEX,MAAMC,EAAqBT,EAAyB59D,MAAKopB,GAAKA,EAAEgnC,aAChE,OAAKiO,EAGE,CACH,CACIj2D,IAAKi2D,EAAmBj2D,IACxBnG,KAAMya,EAAY0hD,8BAClBhO,YAAY,IANT,IAaW+N,GAEAP,GAGrBrN,EAAU3uD,QAAUuuD,EAAoBvuD,OACzC,OAAOm8D,EAAiC5N,GAG5C,IAAKA,EAAoBvuD,OACd2uD,OAAAA,EAIX,MAAM+N,EAA4B,IAAI/N,GAAWlwD,QA3CjByH,IAC5B,GA1BkB,WA2BdA,EAAK0uB,WACL1uB,EAAK0uB,YAAcqnC,GACnB/1D,EAAK0uB,YAAcsnC,EAEZh2D,OAAAA,CAAAA,IAuCf,MAAO,IAAIi2D,EAAiC5N,MAAyBmO,EAAyB,ECvEnFC,GAAA,CAACphD,EAASqhD,EAAe3pD,EAAYk7C,KAC1C0O,MAAAA,EAAgBD,EACjBn+D,QAAO66B,IAAOhlB,GAAiBglB,EAAG/kB,cAClCpU,KAAIm5B,GAAMA,EAAG/kB,aACZuoD,EAA2B,GAE3BC,EAA2BxhD,EAC5Bpb,KAAIgjD,IACD,MAAM6Z,EAAmB,IAClB7Z,EACHj9C,KAAMi9C,EAAOj9C,KAAKI,QAAQ,IAAK,KAG/Bu2D,GAAAA,EAAc72D,SAASg3D,EAAiB92D,MACjC82D,OAAAA,CAAAA,IAGdv+D,QAAOw+D,UAAcA,EAAQ,MAElCJ,OAAAA,EAAc35D,SAAQqR,IACZ4uC,MAAAA,EAAS4Z,EAAyB3+D,MAAK,EAAG8H,KAAAA,KAAWA,IAASqO,IAChE4uC,GAAAA,EACA2Z,EAAyBhzD,KAAKq5C,OAC3B,CACH,MAAM+Z,EAAgBjqD,EAAW7U,MAAK8U,GAAYA,EAASE,KAAOmB,IAClE,GAAI2oD,EAAe,CACT,MAAE78D,KAAAA,EAAM+S,GAAAA,EAAIsC,KAAAA,GAASwnD,EACrBC,EAAc,CAChBj3D,KAAMkN,EACNgnB,eAAgB/5B,EAChBD,MAAOC,EACPu9C,OAAQ,CACJ92C,IAAK4O,GAAMlP,K5HyCA,G4HxCX+jC,IAAK70B,GAAM0kD,SAAW/5D,IAG9By8D,EAAyBhzD,KAAKqzD,EAClC,CACJ,KAGAhP,GACA2O,EAAyBM,QAAQ,CAC7Bl3D,KAAMioD,EAAe/6C,GACrBgnB,eAAgB+zB,EAAe9tD,KAC/BD,MAAO+tD,EAAe9tD,KACtBu9C,OAAQ,CACJ92C,IAAKqnD,EAAe7xB,mBACpBiO,IAAK4jB,EAAe9tD,QAKzBy8D,CAAAA,ECVLO,GAAYA,EAAGpqD,WAAAA,EAAY2pD,cAAAA,EAAe5jD,SAAAA,MAG5C,GAAIA,EAASzI,MAAK3E,GAAWA,EAAQlM,QAAQM,SACzC,OAIJgZ,EAAS9V,SAAQ0I,IACTA,EAAQ0xD,iBAAiBt9D,SACzB4L,EAAQlM,OAASkM,EAAQ0xD,gBAAgBn9D,KAAIC,IAAU,CACnDC,KAAMD,EAAM2F,KACZxF,MAAOH,EAAMm9D,UACbj9D,QAASF,EAAM4uC,oBACjB,IAKJtvC,MAAAA,EAASoU,GAAUb,GAhDTvT,CAAAA,IAChBA,EAAOwD,SAAQ9C,IACP,IACAA,EAAMo9D,WAAaz+D,KAAKC,MAAMoB,EAAMmV,YACvC,OAAQxH,GAOL,YANA7O,QAAQD,MACJ,4CACAmB,EAAMgT,GACNhT,EAAMmV,YACNxH,EAGR,IACH,EAoCD0vD,CAAY/9D,GAEZ,MAAMg+D,EAAcd,EAAcn+D,QAAOk/D,GACrCj+D,EAAO6Q,MAAKnQ,GAASA,EAAMgT,KAAOuqD,EAAMppD,eAG5CmpD,EAAYx6D,SAAQy6D,IACVv9D,MAAAA,EAAQV,EAAOtB,MAAKw/D,GAAWA,EAAQxqD,KAAOuqD,EAAMppD,aACrDnU,EAAMo9D,YAIXG,EAAME,WAAW36D,SAAQggC,IACrB,MAAM46B,EAAO9kD,EAAS5a,MAAKwN,GAAWA,EAAQwH,KAAO8vB,KAChD46B,GAAQA,EAAKR,iBAAiBt9D,OAAS,IAI5C89D,EAAKp+D,OAASo+D,EAAKp+D,QAAU,GAC7Bo+D,EAAKp+D,OAAOoK,KAAK1J,EAAMo9D,YAAU,GACpC,IAILE,EAAYx6D,SAAQ66D,IACVC,MAAAA,EAAgBpB,EAAcloD,WAChCupD,GAAgBA,EAAa1pD,aAAewpD,EAAWxpD,aAE3DqoD,EAAcvT,OAAO2U,EAAe,EAAC,GACxC,EAGLE,GAAe,CACX16B,EACA40B,EACAD,EACA4B,EACAoE,EACAhQ,KAEA,IAAK3qB,EAAQrlC,KACT,OAGA,IAAE8U,WAAAA,EAAY2pD,cAAAA,EAAerO,oBAAAA,EAAqBv1C,SAAAA,GAClDwqB,EAAQrlC,KAAKqjC,cAAcC,cAE/Bm7B,EAuIJ,SAAmCzO,EAAgByO,GAC/C,OAAOzO,EACD,CACI,CACI55C,WAAY45C,EAAe/6C,GAC3ByqD,WAAY1P,EAAen1C,SAAS7Y,KAAIyL,GAAWA,EAAQsN,eAE5D0jD,GAEPA,CACV,CAjJoBwB,CAA0BjQ,EAAgByO,GAmJ9D,SAAsCzO,GAAkB4L,QAAAA,EAAS3B,gBAAAA,IACxDjK,IAILA,EAAen1C,SAAWm1C,EAAen1C,SAAS7Y,KAAI6f,GAAK,IAAI+5C,EAAQ/5C,EAAGo4C,KAC9E,CAxJIiG,CAA6BlQ,EAAgB,CAAE4L,QAAAA,EAAS3B,gBAAAA,IAqD5D,SAAgCp/C,EAAUo/C,GACtCp/C,EAAS9V,SAAQ0I,IACbA,EAAQiE,mBAAqByuD,GAAclG,EAAiB,sBAExDlpD,OAEAtD,EAAQuC,WAAY,GAGlBowD,MAAAA,EAAYnG,GAAiBp/C,UAAU5a,QACzCogE,GAAiBA,EAAcxzD,KAAOwzD,EAAcxzD,MAAQY,EAAQsN,WAGxE,IAAKqlD,EACD,OAGEnpD,MAAAA,EAAcmpD,EAAU/oD,cAAgB5J,EAAQ4J,aAGtD2I,OAAOwD,OAAO/V,EAAS,CACnB6K,YAAa8nD,EAAU9nD,YACvBhJ,oBAAqB8wD,EAAU9wD,oBAC/BwI,mBAAoBsoD,EAAUtoD,mBAC9BC,wBAAyBqoD,EAAUroD,wBACnCC,wBAAyBooD,EAAUpoD,yBAA2B,CAAE,EAChEsoD,2BAA4BF,EAAUE,6BAA8B,EACpE/0D,YAAa60D,EAAU70D,aAAe,MAClC0L,EACE,CACIK,MAAO,CACHjP,IAAK4O,GAAaK,OAAS7J,EAAQ6J,OAAOjP,KAE9CnG,KAAM+U,GAAa/U,MAAQuL,EAAQvL,KACnC+J,SAAUgL,GAAahL,UAAYwB,EAAQxB,SAC3CmL,YAAaH,GAAaG,aAAe3J,EAAQ2J,YACjDC,aAAcJ,GAElB,IACT,GAET,CA7FIspD,CAAuB1lD,EAAUo/C,GACjCiF,GAAU,CAAEpqD,WAAAA,EAAY2pD,cAAAA,EAAe5jD,SAAAA,IAGnCmlD,IACAnlD,EAAWmlD,EAAoBnlD,IAGnC,MAAM2lD,EAuFV,SACI1rD,EACA2pD,EACA5jD,GACEo/C,gBAAAA,EAAiBD,SAAAA,EAAU4B,QAAAA,IAEtB9mD,OAAAA,EACF9S,KAAI+S,IACD,MAAM0rD,EAAYN,GAAclG,EAAiB,cAAch6D,MAC3DygE,GAAWA,EAAQC,cAAgB5rD,EAASE,KAG1C2rD,EAAc,IAAI5G,EAASjlD,EAAU0rD,GAE3ChC,OAAAA,EAAc15D,SAAQ+6D,IAEd3pD,GAAiB2pD,EAAa1pD,aAC9B0pD,EAAa1pD,aAAerB,EAASE,IAIzC6qD,EAAaJ,WAAW36D,SAAQ87D,IAC5B,MAAMpzD,EAAUoN,EAAS5a,MAAK4hB,GAAKA,EAAE5M,KAAO4rD,IAC5C,GAAIpzD,EAAS,CACTA,EAAQ2I,WAAarB,EAASE,GAC9BxH,EAAQsH,SACJD,EAAW7U,MAAKuW,GAAKA,EAAEvB,KAAOxH,EAAQ6mB,SAAS,MAAO,KAC1D,MAAMwsC,EAAa,IAAIlF,EAAQnuD,EAASwsD,GACxC2G,EAAY/lD,SAASlP,KAAKm1D,EAC9B,IACH,IAGEF,EAAYlF,oBAAsBkF,EAAc,IAAA,IAE1DtgE,OAAOygE,QAChB,CA3HiCC,CAAuBlsD,EAAY2pD,EAAe5jD,EAAU,CACrFo/C,gBAAAA,EACAD,SAAAA,EACA4B,QAAAA,IAGG,MAAA,CACH9mD,WAAYk7C,EACN,CAACA,KAAmBwQ,GACpBA,EACNjQ,aAAclrB,EAAQrlC,KAAKqjC,cAAcktB,aACzCH,oBAAAA,EACAI,UAAWoN,GACPuC,GAAclG,EAAiB,aAC/B7J,EACA6J,GAEJ78C,QAASohD,GACL2B,GAAclG,EAAiB,8BAC/BwE,EACA3pD,EACAk7C,GAEJx8B,aAAc,CACVytC,SAzImB,GA0InBC,OA1ImB,MA2If77B,EAAQrlC,KAAKqjC,eAAehjC,OAAOmzB,cAAgB,CAAA,GAE3Do9B,oBAAqBZ,EAAiB,CAACA,KAAmBl7C,GAAcA,IAQhF,SAASqrD,GAAclG,EAAiBvyD,GAC7BA,OAAAA,EAAIuZ,MAAM,KAAK1gB,QAClB,CAACynD,EAAK96B,IAAY86B,IAAM96B,IAExB+sC,GAAiBt9C,YAAcs9C,EAAgBt9C,YAAcs9C,EAErE,CCrKA,MAAAkH,GAAe,CAACrsD,EAAa,MACzB,MAAMssD,EAActsD,EACfusD,SAAQtsD,GAAYA,EAAS8F,WAC7B7Y,KAAI6f,GAAKA,GAAGjJ,YACZtY,QAAOuhB,QAAWrD,IAANqD,IACjB,OAAQu/C,EAAYv/D,OAEd,CACI8zB,IAAKtuB,KAAKsuB,OAAOyrC,GACjB5rC,IAAKnuB,KAAKmuB,OAAO4rC,IAHrB,CAAEzrC,IAAK,IAAKH,IAAK,KAAK,ECJ1B8rC,GAAgB,CAClBC,UAAW,kCACXC,SAAU,iCACVC,MAAO,8BACP,aAAc,mCACd,mBAAoB,kCACpB,kBAAmB,iCACnB,yBAA0B,8BAC1B,eAAgB,8BAChB,aAAc,mCACdC,OAAQ,kCACR,aAAc,mCACd,YAAa,kCACb,4BAA6B,uCAC7B,wBAAyB,mCACzB,sBAAuB,iCACvB,kBAAmB,6BACnB,uBAAwB,kCACxB,mBAAoB,8BACpB,sBAAuB,iCACvB,kBAAmB,6BACnBC,GAAI,6BACJ,YAAa,sBACb,gBAAiB,+BACjBC,KAAM,6BACNC,UAAW,kCACXC,WAAY,wBACZ,oBAAqB,oBACrBC,KAAM,sBACN,iCAAkC,0BAClC,oBAAqB,iCACrBC,QAAS,uBACT,qBAAsB,uBACtB,gBAAiB,GACjB,eAAgB,GAChB,YAAa,GACb,iBAAkB,IAUTC,GAAiBA,CAACC,EAASC,GAAoB,KAGxD,MAAMC,GAFaF,EAAUA,EAAQjhD,MAAM,MAAMC,MAAQ,IAGpDhd,cACAiE,QAAQ,mBAAoB,IAC5BA,QAAQ,mBAAoB,IAEjC,OAAOm5D,GAAcc,KAAgBD,EAxDL,iCAwDgD,GAAA,ECtD9EE,GAASttD,IAAa,CACxBwC,KAAM0qD,GAAeltD,EAASE,IAC9BhT,MAAO8S,EAAS7S,KAChBmkB,KAAMtR,EAAS7S,KAAKgC,cACpBk3D,cAAermD,EAASqmD,cACxBrmD,SAAAA,ICUEutD,GAAqBA,CAACrI,EAAiBsI,IACzCtI,EAAgBriD,QAAUqiD,EAAgBriD,QAAQ2qD,GAAStI,EAAgBsI,GAG/EC,GAAe,CAACn9B,EAAS40B,EAAiBjK,KAQtC,MAAMyS,EAAsBA,EACtB3tD,WAAAA,EAAY2pD,cAAAA,EAAe5jD,SAAAA,GAC7B6nD,EACAC,KAEM5tD,MAAAA,EAAW2tD,EAAgB5tD,GACjC,IAAKC,EACD,OAEE6tD,MAAAA,EAAgBnE,EAAcx+D,MAAKu/D,GAASzqD,EAASE,KAAOuqD,EAAMppD,aACxE,IAAKwsD,EACD,OAEJA,EAAclD,WAAW36D,SAAQggC,IAC7B,MAAM46B,EAAO9kD,EAAS5a,MAAKwN,GAAWA,EAAQwH,KAAO8vB,IACrD49B,EAAchD,EAAM5qD,EAAQ,IAE1B8qD,MAAAA,EAAgBpB,EAAcloD,WAChCupD,GAAgBA,EAAa1pD,aAAewsD,EAAcxsD,aAE9DqoD,EAAcvT,OAAO2U,EAAe,EAAC,EAGzC4C,EACIp9B,EAAQrlC,KAAKqjC,cAAcC,cAC3BvtB,IACA,CAAC4pD,EAAM5qD,IAAc4qD,EAAKlC,UAAY1oD,EAAS7S,OAEnDugE,EACIp9B,EAAQrlC,KAAKqjC,cAAcC,cAC3BztB,IACA8pD,GAASA,EAAKrnD,aAAc,IAEhCmqD,EACIp9B,EAAQrlC,KAAKqjC,cAAcC,cAC3BzuB,IACA8qD,GAASA,EAAKpC,gBAAiB,IAEnCkF,EACIp9B,EAAQrlC,KAAKqjC,cAAcC,cAC3BnuB,IACAwqD,GAASA,EAAKjC,WAAY,IAE9B+E,EACIp9B,EAAQrlC,KAAKqjC,cAAcC,cAC3BjuB,IACAsqD,GAASA,EAAK5C,YAAa,IAE/B0F,EACIp9B,EAAQrlC,KAAKqjC,cAAcC,cAC3B/tB,IACAoqD,GAASA,EAAK3C,gBAAiB,IAEnCyF,EACIp9B,EAAQrlC,KAAKqjC,cAAcC,cAC3B7tB,IACAkqD,GAASA,EAAKhC,SAAU,IAGtB,MAAEhoC,IAAAA,EAAKH,IAAAA,GAAQ2rC,GAAmB97B,EAAQrlC,KAAKqjC,cAAcC,cAAcxuB,YAEjFmlD,OAAAA,EAAgBxkC,cAAgBE,EAChCskC,EAAgBnhD,cAAgB0c,EAEhC6P,EAAQrlC,KAAKqjC,cAAcC,cAAczoB,SAAS9V,SAAQ89D,IACtD,MAAM1yD,EAAoB8pD,EAAgBriD,QACpCqiD,EAAgBriD,QAAQzH,kBACxB8pD,EAAgB9pD,mBAEdwG,iBAAAA,EAAkBzG,kBAAAA,EAAmB0G,YAAAA,GAAgBF,GACzDvG,EACA0yD,EACA/0D,IAGJ+0D,EAAWvG,WAAansD,EAAoB0yD,EAAWv0D,MAAQu0D,EAAW3yD,kBAC1E2yD,EAAW1yD,kBAAoBA,EAC/B0yD,EAAWpnD,aAAe6mD,GAAmBrI,EAAiB,gBAC9D4I,EAAWrnD,cAAgB8mD,GAAmBrI,EAAiB,iBAC/D4I,EAAW3nD,eAAiBonD,GAAmBrI,EAAiB,kBAChE4I,EAAWxnD,YAAcinD,GAAmBrI,EAAiB,eAC7D4I,EAAW1nD,oBAAsBmnD,GAAmBrI,EAAiB,uBACrE4I,EAAWznD,qBAAuBknD,GAC9BrI,EACA,wBAEJ4I,EAAW3yD,kBAAoBA,EAC/B2yD,EAAWjsD,YAAcA,EAEzBisD,EAAW9pD,mBAAqBpC,EAE5BksD,EAAWr/B,WACXq/B,EAAW1mD,gBD/GR,EAACqnB,EAAU1uB,IACf0uB,EAASjjC,QAAO,CAACC,EAAK0sB,KACzB,MAAMnY,EAAWD,EAAW7U,MAAKuW,GAAKA,EAAEvB,KAAOiY,IAC/C,OAAOnY,EAAW,IAAIvU,EAAK6hE,GAAOttD,IAAavU,CAAAA,GAChD,IC2GkCsiE,CACzBD,EAAWr/B,SACX6B,EAAQrlC,KAAKqjC,cAAcC,cAAcxuB,aAI7CmlD,EAAgBp/C,UAAYo/C,EAAgBp/C,SAAShZ,QACrDo4D,EAAgBp/C,SAAS9V,SAAQq7D,IACzBA,EAAUvzD,KAAOuzD,EAAUvzD,MAAQg2D,EAAW9nD,WAC9C8nD,EAAWtnD,kBAAoB6kD,EAAU7kD,kBACzCsnD,EAAWjwC,mBAAqBwtC,EAAUxtC,mBAEtCwtC,EAAU3nD,iBACVoqD,EAAWpqD,eAAiB2nD,EAAU3nD,gBAAkB,CAAA,GAAA,GAGnE,IAIFsnD,GACH16B,EACA40B,EACA0B,GACAO,QACA19C,EACAwxC,EACJ,EC6BS+S,GAAcC,GAvKDC,CAAAA,IAEtB,IAAID,EADeC,EAAMhiD,MAAM,KACTC,MACtB8hD,OAAAA,EAAOA,EAAK76D,QAAQ,oBAAqB,IAAIA,QAAQ,UAAW,IAE5D,CAAC,UAAW,QAAS,gBAAgBN,SAASm7D,GACvC,sBACA,CAAC,QAAS,OAAQ,WAAY,cAAcn7D,SAASm7D,GACrD,yBAEP,CACI,QACA,gCACA,cACA,kCACFn7D,SAASm7D,GAEJ,sBACA,CAAC,SAASn7D,SAASm7D,GACnB,sBACA,CAAC,SAASn7D,SAASm7D,GACnB,sBACA,CAAC,cAAe,QAAS,uBAAuBn7D,SAASm7D,GACzD,4BACA,CAAC,YAAYn7D,SAASm7D,GACtB,yBACA,CAAC,aAAc,UAAUn7D,SAASm7D,GAClC,2BACA,CAAC,aAAan7D,SAASm7D,GACvB,0BACA,CAAC,cAAe,SAASn7D,SAASm7D,GAClC,4BACA,CAAC,iBAAiBn7D,SAASm7D,GAC3B,8BACA,CAAC,WAAWn7D,SAASm7D,GACrB,wBACA,CAAC,SAAU,eAAgB,cAAe,eAAen7D,SAASm7D,GAClE,uBAEP,CACI,eACA,SACA,iBACA,4BACA,gBACFn7D,SAASm7D,GAEJ,uBAEP,CAAC,gBAAiB,cAAe,UAAW,cAAe,gBAAgBn7D,SAASm7D,GAE7E,wBAEP,CACI,eACA,cACA,SACA,gBACA,eACA,eACFn7D,SAASm7D,GAEJ,uBACA,CAAC,SAAU,QAAS,UAAUn7D,SAASm7D,GACvC,uBACA,CAAC,QAAS,sCAAsCn7D,SAASm7D,GACzD,sBACA,CAAC,YAAa,iBAAkB,mBAAmBn7D,SAASm7D,GAC5D,0BACA,CAAC,YAAYn7D,SAASm7D,GACtB,yBACA,CAAC,SAAU,eAAen7D,SAASm7D,GACnC,uBACA,CAAC,WAAWn7D,SAASm7D,GACrB,wBACA,CAAC,QAAS,MAAO,WAAY,mBAAmBn7D,SAASm7D,GACzD,yBACA,CAAC,kBAAmB,cAAcn7D,SAASm7D,GAC3C,2BACA,CAAC,SAAU,WAAWn7D,SAASm7D,GAC/B,wBACA,CAAC,UAAW,WAAY,UAAUn7D,SAASm7D,GAC3C,wBACA,CAAC,WAAY,UAAUn7D,SAASm7D,GAChC,yBACA,CAAC,WAAWn7D,SAASm7D,GACrB,wBACA,CAAC,YAAYn7D,SAASm7D,GACtB,yBACA,CAAC,WAAY,UAAW,kCAAkCn7D,SAASm7D,GACnE,wBAEP,CAAC,UAAW,SAAU,SAAU,UAAW,iBAAkB,kBAAkBn7D,SAC3Em7D,GAGG,wBACA,CAAC,cAAcn7D,SAASm7D,GACxB,2BACA,CAAC,WAAY,WAAY,YAAa,cAAcn7D,SAASm7D,GAC7D,0BAEP,CACI,UACA,SACA,SACA,SACA,gBACA,gBACA,kBACFn7D,SAASm7D,GAEJ,wBACA,CAAC,SAAU,eAAen7D,SAASm7D,GACnC,uBACA,CAAC,SAASn7D,SAASm7D,GACnB,sBACA,CAAC,cAAcn7D,SAASm7D,GACxB,wBAEP,CAAC,iBAAkB,kBAAmB,qBAAsB,eAAen7D,SAASm7D,GAE7E,wBAEP,CACI,WACA,cACA,UACA,oBACA,OACA,kBACA,sBACFn7D,SAASm7D,GAEJ,gCACA,CAAC,WAAWn7D,SAASm7D,GACrB,wBACA,CAAC,mBAAoB,YAAYn7D,SAASm7D,GAC1C,iCACA,CAAC,QAAS,OAAQ,kBAAkBn7D,SAASm7D,GAC7C,sBACA,CAAC,UAAW,iBAAiBn7D,SAASm7D,GACtC,wBACA,CAAC,UAAW,iBAAkB,mBAAmBn7D,SAASm7D,GAC1D,wBACA,CAAC,WAAWn7D,SAASm7D,GACrB,wBACA,CAAC,QAAS,QAAQn7D,SAASm7D,GAC3B,sBACA,CAAC,YAAa,QAAS,iBAAiBn7D,SAASm7D,GACjD,oBACA,CAAC,cAAe,SAASn7D,SAASm7D,GAClC,sBACA,CAAC,YAAYn7D,SAASm7D,GACtB,yBACA,CAAC,cAAcn7D,SAASm7D,GACxB,2BACA,CAAC,UAAUn7D,SAASm7D,GACpB,uBACA,CAAC,WAAWn7D,SAASm7D,GACrB,wBACA,CAAC,UAAUn7D,SAASm7D,GACpB,+BA5KmB,wBA8KvBE,EAIAC,CAAkBH,uDC7Kd,MAAMI,GAajBhiE,WAAAA,CAAYiiE,EAAU,IAZtB5qC,EAAAn3B,KAAAgiE,GAAQ,IACR7qC,EAAAn3B,KAAAiiE,GAAO,IACP9qC,EAAAn3B,KAAAkiE,GAAU,CAAA,GACV/qC,EAAAn3B,KAAAmiE,GAAY,CAAA,GACZhrC,EAAAn3B,KAAAoiE,GAAS,IACTjrC,EAAAn3B,KAAAqiE,GAAU,IACVlrC,EAAAn3B,KAAAsiE,GAAS,eACTnrC,EAAAn3B,KAAAuiE,GAAU,kFACNj4D,EAAe5F,GAAGK,OAAS,cAAgB,mCAE/Cy9D,EAAAA,KAAe,eAAA,IAGXjQ,EAAAvyD,KAAKgiE,GAAQD,EAAQjzD,MACrByjD,EAAAvyD,KAAKiiE,GAAOF,EAAQ37D,KACpBmsD,EAAAvyD,KAAKkiE,GAAUH,EAAQU,OAASV,EAAQU,OAAS,MACjDlQ,EAAAvyD,KAAKmiE,GAAYJ,EAAQW,SAAWX,EAAQW,SAAW,MACvD,MAAMz3C,EAAQ82C,EAAQ92C,MAAQ82C,EAAQ92C,MAAMroB,cAAgB,SAC5D2vD,EAAAvyD,KAAKoiE,GAASn3C,EAAMnlB,OAAO,GAAGipB,cAAgB9D,EAAM9nB,MAAM,IAC1DovD,EAAAvyD,KAAKuiE,GAAUR,EAAQY,OAASZ,EAAQY,OAAS3Q,EAAAhyD,KAAKuiE,KACtDhQ,EAAAvyD,KAAKsiE,GAASP,EAAQa,MAAQb,EAAQa,MAAQ5Q,EAAAhyD,KAAKsiE,KACnDtiE,KAAKwiE,aAAeT,EAAQS,cAAgB,EAChD,CAEA,UAAI7Z,CAAOA,GACP4J,EAAAvyD,KAAKqiE,GAAU1Z,EACnB,CAEA,SAAIia,CAAMA,GACNrQ,EAAAvyD,KAAKsiE,GAASM,EAClB,CAEA,SAAIA,GACA,OAAO5Q,EAAAhyD,KAAKsiE,GAChB,CAEA,UAAI3Z,GACA,OAAOqJ,EAAAhyD,KAAKqiE,GAChB,CAEA,QAAIvzD,GACA,OAAOkjD,EAAAhyD,KAAKgiE,GAChB,CAEA,YAAIU,GACA,OAAO1Q,EAAAhyD,KAAKmiE,GAChB,CAEA,UAAIM,GACA,OAAOzQ,EAAAhyD,KAAKkiE,GAChB,CAEA,OAAI97D,GACA,OAAO4rD,EAAAhyD,KAAKiiE,GAChB,CAEA,SAAIh3C,GACA,OAAO+mC,EAAAhyD,KAAKoiE,GAChB,CAEA5P,YAAAA,GACI,OAAOR,EAAAhyD,KAAKuiE,IAAQ17D,QAAQ,UAAWmrD,EAAAhyD,KAAKoiE,KAAQxR,WAAW,QAASoB,EAAAhyD,KAAKiiE,IACjF,CAEAxP,WAAAA,GACI,OAAOT,EAAAhyD,KAAKsiE,GAChB,CAEAO,UAAAA,CAAWx8D,IACwD2rD,IAA/DA,EAAAhyD,KAAKqiE,IAAQptD,WAAU6tD,GAAKA,EAAEz8D,QAAUA,EAAMA,SAAiB2rD,EAAAhyD,KAAKqiE,IAAQh4D,KAAKhE,EACrF,EAtEA27D,GAAA,IACAC,QAAAA,GAAA,IACAC,QAAAA,GAAA,IACAC,QAAAA,GAAA,IACAC,QAAAA,GAAA,IACAC,QAAAA,GAAA,IACAC,QAAAA,GAAA,YACAC,GAAA,IAAA5Q,QCVW,MAAMoR,GAUjBjjE,WAAAA,EACIuG,MAAAA,EACA1F,MAAAA,EACAogB,WAAAA,EACAwnC,UAAAA,EACAtyC,KAAAA,EAAO,GACPnV,MAAAA,EAAQ,GACRiyB,SAAAA,GAAW,EACX+K,SAAAA,GAAW,IAjBf3G,EAAAn3B,KAAAgjE,GAAS,MACT7rC,EAAAn3B,KAAAijE,GAAS,MACT9rC,EAAAn3B,KAAAkjE,GAAc,MACd/rC,EAAAn3B,KAAAmjE,GAAa,MACbhsC,EAAAn3B,KAAAk5D,GAAQ,IACR/hC,EAAAn3B,KAAAojE,GAAS,IACTjsC,EAAAn3B,KAAAqjE,IAAY,GACZlsC,EAAAn3B,KAAAsjE,IAAY,GAYHj9D,EAIA1F,EAIAogB,EAIAwnC,GAKLgK,EAAAvyD,KAAKgjE,GAAS38D,GACdksD,EAAAvyD,KAAKijE,GAAStiE,GACd4xD,EAAAvyD,KAAKkjE,GAAcniD,GACnBwxC,EAAAvyD,KAAKmjE,GAAa5a,GAClBgK,EAAAvyD,KAAKk5D,GAAQjjD,GACbs8C,EAAAvyD,KAAKojE,GAAStiE,GACdyxD,EAAAvyD,KAAKqjE,GAAYtwC,GACjBw/B,EAAAvyD,KAAKsjE,GAAYxlC,GAEjB99B,KAAKkpD,aAAe,MAbhBzpD,QAAQD,MAAM,gDAJdC,QAAQD,MAAM,iDAJdC,QAAQD,MAAM,4CAJdC,QAAQD,MAAM,2CA0BtB,CAEA,YAAIs+B,CAASz3B,GACTksD,EAAAvyD,KAAKsjE,KAAcj9D,EACvB,CAEA,YAAIy3B,GACA,OAA6B,OAAtB99B,KAAKkpD,aAA8C,IAAtBlpD,KAAKkpD,aAAqB8I,EAAAhyD,KAAKsjE,GACvE,CAEA,YAAIvwC,CAAS1sB,GACTksD,EAAAvyD,KAAKqjE,KAAch9D,EACvB,CAEA,YAAI0sB,GACA,OAAOi/B,EAAAhyD,KAAKqjE,GAChB,CAEA,aAAI9a,GACA,OAAOyJ,EAAAhyD,KAAKmjE,GAChB,CAEA,cAAIpiD,GACA,OAAOixC,EAAAhyD,KAAKkjE,GAChB,CAEA,SAAI78D,GACA,OAAOpD,MAAM4N,QAAQmhD,EAAAhyD,KAAKgjE,KAAUhR,EAAAhyD,KAAKgjE,IAAOjiE,KAAK,KAAOixD,EAAAhyD,KAAKgjE,GACrE,CAEA,SAAIriE,GACA,OAAOqxD,EAAAhyD,KAAKijE,GAChB,CAEA,SAAIniE,GACA,OAAOkxD,EAAAhyD,KAAKojE,GAChB,CAEA,QAAIntD,GACA,OAAO+7C,EAAAhyD,KAAKk5D,GAChB,CAGA/4D,MAAAA,GACI,MAAMojE,EAA0C,OAAtBvjE,KAAKkpD,aAAwB,KAAKlpD,KAAKkpD,gBAAkB,GAE5E,MAAA,qCACW8I,EAAAhyD,KAAKmjE,OAAcnR,EAAAhyD,KAAKgjE,gDACThR,EAAAhyD,KAAKgjE,8CACPhR,EAAAhyD,KAAKmjE,gDACHnR,EAAAhyD,KAAKijE,sCACfjR,EAAAhyD,KAAKqjE,uCACJrR,EAAAhyD,KAAKsjE,6BACftR,EAAAhyD,KAAKk5D,IAAQ,SAASlH,EAAAhyD,KAAKk5D,OAAW,2BACtClH,EAAAhyD,KAAKojE,IAAS,UAAUpR,EAAAhyD,KAAKojE,OAAY,wBAC5CpR,EAAAhyD,KAAKijE,MAASM,aAC7B,EAtGAP,GAAA,IACAC,QAAAA,GAAA,IACAC,QAAAA,GAAA,IACAC,QAAAA,GAAA,IACAjK,QAAAA,GAAA,IACAkK,QAAAA,GAAA,IACAC,QAAAA,GAAA,YACAC,GAAA,IAAA3R,QCRJ,MAeA6R,GAAe,CAACC,EAAkBjwD,EAAYkwD,KACtC,IAACD,IAAqBjwD,EACdhU,OAAAA,QAAAA,MAAM,+CACP,GAGL+mD,MAAAA,EAAUkd,EAAiB/iE,KAAI1B,GAAU,IAAI8iE,GAAO9iE,KAC1DwU,OAAAA,EACKvU,QAAO,CAACynD,EAAKjzC,IAAaizC,EAAIC,OAAOlzC,EAAS8F,WAAW,IACzD9V,SAAQ0I,IACLo6C,EAAQ9iD,SAAQzE,IACNupD,MAAAA,EAAYvpD,EAAOoH,IACnB2a,EAAa/hB,EAAO8P,KACpB60D,EAAax3D,EAAQo8C,GACL,iBAAfob,EACDA,EAAWjjE,KAAI9B,IACLF,MAAAA,EA/BRklE,EAACpwD,EAAYG,KAEjC,MAAMkwD,EAAerwD,GAAY7U,MAC7B8U,GAAYA,EAASE,KAAOA,IAAOF,EAASE,GAAGpN,SAAS,WAE5D,OAAOs9D,EACD,CAEI5tD,KAAM4tD,EAAa5tD,MAAMA,KACzBnV,MAAO+iE,EAAaC,aAAeD,EAAaC,aAAe,KAC/DnjE,MAAOkjE,EAAajjE,MAExB,IAAA,EAmB6BgjE,CAAgBF,EAAgB9kE,GACzCF,GACAM,EAAO6jE,WACH,IAAIE,GAAsB,CACtBxa,UAAAA,EACAxnC,WAAAA,EACA1a,MAAOzH,EACPqX,KAAMjX,EAAOyjE,SAAS7jE,GACtB+B,MAAOjC,EAAKiC,MACZG,MAAOpC,EAAKoC,OAAS,OAE7B,IAGR9B,EAAO6jE,WACH,IAAIE,GAAsB,CACtBxa,UAAAA,EACAxnC,WAAAA,EACA1a,MAAOs9D,EACP1tD,KAAMjX,EAAOyjE,SAASla,GACtB5nD,MAC+B,mBAApB3B,EAAO0jE,SACR1jE,EAAO0jE,SAASiB,GAChBA,IAElB,GACT,IAGFpd,CAAAA,EC1DI,SAASwd,GACpBvwD,EACAwwD,EACA1U,EACAL,GAEA,MAAMgV,EAAYD,EAAQ3oD,YACpB2oD,EAAQ3oD,YAAYupB,mBAAmB9oB,QACvCkoD,EAAQp/B,mBAAmB9oB,QAE3BqhD,EAAgB3pD,EAAW9S,KAAI+S,IAAa,CAC9CqB,WAAYrB,EAASE,OAEnBmI,EAAUohD,GAAkB+G,EAAW9G,EAAe7N,GAEtD4U,EAAmB,IAAIpC,GAAO,CAChChzD,KAAM,UACN1I,IAAK,SACL6kB,MAAOgkC,EAAa,gDACpBuT,aAAcwB,EAAQ3oD,aAAa8oD,kCAAoC,KAG3EroD,OAAAA,EAAQrY,SAAQigD,IACZwgB,EAAiBrB,WACb,IAAIE,GAAsB,CACtB18D,MAAOq9C,EAAOj9C,KACd9F,MAAO+iD,EAAO/iD,MACdogB,WAAYmjD,EAAiBp1D,KAC7By5C,UAAW2b,EAAiB99D,MAEpC,IAGG89D,CACX,CC/BO,MAAME,GAAqBA,CAAC5wD,EAAYwwD,EAAS/U,KACpD,IAAKz7C,EACOhU,OAAAA,QAAAA,MAAM,8DACP,KAML6kE,MAAAA,EAAkB,IAAIvC,GAAO,CAC/BhzD,KAAM,UACN1I,IAAK,YACL6kB,MAAOgkC,EAAa,+CACpBuT,aAAcwB,EAAQ3oD,aAAaipD,gCAAkC,MAGjEjwC,IAAKkwC,EAAcrwC,IAAKswC,GAAiB3E,GAAmBrsD,GA6BpEixD,MA3ByB,CACrB,CACIpwC,IAAKkwC,EACLrwC,IAAK,EACLvzB,MAAOqjE,EAAQ3oD,YACT2oD,EAAQ3oD,YAAYqpD,6BACpBV,EAAQU,6BACdr+D,MAAO,CAAC,EAAG,EAAG,EAAG,EAAG,IAExB,CACIguB,IAAK,EACLH,IAAK,EACLvzB,MAAOqjE,EAAQ3oD,YACT2oD,EAAQ3oD,YAAYspD,8BACpBX,EAAQW,8BACdt+D,MAAO,CAAC,EAAG,EAAG,IAElB,CACIguB,IAAK,EACLH,IAAKswC,EACL7jE,MAAOqjE,EAAQ3oD,YACT2oD,EAAQ3oD,YAAYupD,+BACpBZ,EAAQY,+BACdv+D,MAAO,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,MAItB5C,SAAQ6T,IACrB+sD,EAAgBxB,WACZ,IAAIE,GAAsB,CACtB18D,MAAOiR,EAAUjR,MACjB1F,MAAO2W,EAAU3W,MAAMkG,QAAQ,UAAW,IAAIyQ,EAAU+c,SAAS/c,EAAU4c,OAC3EnT,WAAYsjD,EAAgBv1D,KAC5By5C,UAAW8b,EAAgBj+D,MAEnC,IAGGi+D,CAAAA,ECvDEQ,GAAsBA,CAACrxD,EAAYwwD,EAAS1U,EAAqBL,IACtEhK,GAAkBE,IACX,IACCF,GAAkBE,IAChB,CAAC4e,GAAuBvwD,EAAYwwD,EAAS1U,EAAqBL,IAClE,MACHuU,GACC,CACI,CACI10D,KAAM,UACN1I,IAAK,WACL6kB,MAAOgkC,EAAa,6CACpBuT,aAAcwB,EAAQ3oD,aAAaypD,8BAAgC,GAEnErC,OAAQ9B,KAGhBntD,EACA87C,GAGJ8U,GAAmB5wD,EAAYwwD,EAAS/U,MACrCuU,GACC,CACI,CACI10D,KAAM,UACN1I,IAAK,UACL6kB,MAAOgkC,EAAa,8CACpBuT,aAAcwB,EAAQ3oD,aAAa0pD,+BAAiC,GACpEtC,OAAQhB,KAGhBjuD,EACA87C,IAML,CACH8U,GAAmB5wD,EAAYwwD,EAAS/U,MACrCuU,GACC,CACI,CACI10D,KAAM,UACN1I,IAAK,WACL6kB,MAAOgkC,EAAa,6CAEpBwT,OAAQ9B,IAEZ,CACI7xD,KAAM,UACN1I,IAAK,UACL6kB,MAAOgkC,EAAa,8CACpBwT,OAAQhB,KAGhBjuD,EACA87C,ICnDC0V,GAAoBhB,GAAW,CACxC,CACIrwD,GAAI,UACJhT,MACIqjE,EAAQ3oD,aAAa4pD,mCACrBjB,EAAQiB,kCACZ7+D,IAAK,cACLihD,MAAO,MACPxpB,SAAS,GAEb,CACIlqB,GAAI,qBACJhT,MACIqjE,EAAQ3oD,aAAa6pD,uCACrBlB,EAAQkB,sCACZ9+D,IAAK,aACLihD,MAAO,MACPxpB,SAAS,GAEb,CACIlqB,GAAI,sBACJhT,MACIqjE,EAAQ3oD,aAAa8pD,wCACrBnB,EAAQmB,uCACZ/+D,IAAK,aACLihD,MAAO,OACPxpB,SAAS,GAEb,CACIlqB,GAAI,yBACJhT,MACIqjE,EAAQ3oD,aAAa+pD,2CACrBpB,EAAQoB,0CACZh/D,IAAK,YACLihD,MAAO,MACPxpB,SAAS,GAEb,CACIlqB,GAAI,0BACJhT,MACIqjE,EAAQ3oD,aAAagqD,4CACrBrB,EAAQqB,2CACZj/D,IAAK,YACLihD,MAAO,OACPxpB,SAAS,IC/CFovB,GAAA,CACXc,cAAe,WACI/pD,SAAS+iB,eAAey+B,IAA6B6N,cAC7DpsD,aAAa,cAAe6+C,GAAQE,UAC9C,EAIDwK,aAAc,WACV,MAAMxxD,EAASgF,SAAS+iB,eAAeq+B,IACjCzgB,EAAa3gC,SAAS+iB,eAAew+B,IACrC+f,EAActhE,SAAS+iB,eAAey+B,IACtC+f,EAAkBvhE,SAAS+iB,eAAe0+B,IAEhDzmD,EAAOiI,aAAa,eAAgB6+C,GAAQE,WAC5ChnD,EAAOiI,aAAa,sBAAuB6+C,GAAQgD,wBACnDnkB,EAAW19B,aAAa,eAAgB6+C,GAAQE,WAChDsf,EAAYr+D,aAAa,eAAgB6+C,GAAQE,WAEjDhnD,EAAOuP,MAAMC,QAAU,QAEvBm2B,EAAWp2B,MAAMC,QAAU,QAE3B82D,EAAY/2D,MAAMC,QAAU,QAE5B+2D,EAAgBh3D,MAAMC,QAAU,OAE5Bs3C,GAAQ7kD,IAAI,yBACZjC,EAAOqB,UAAUC,IAAI,wBAGzB0D,SAAS+iB,eAAe0+B,IAAgCl3C,MAAMC,QAAU,MAC3E,EAID+hD,oBAAqB,WACXvxD,MAAAA,EAASgF,SAAS+iB,eAAeq+B,IACjCzgB,EAAa3gC,SAAS+iB,eAAew+B,IACrC+f,EAActhE,SAAS+iB,eAAey+B,IACtC+f,EAAkBvhE,SAAS+iB,eAAe0+B,IAC1C+f,EAAqBxhE,SAAS+iB,eAAe2+B,IAEnD1mD,EAAOuP,MAAMC,QAAU,QACvBxP,EAAOiI,aAAa,eAAgB6+C,GAAQE,WAC5ChnD,EAAOiI,aAAa,sBAAuB6+C,GAAQgD,wBAE/CnkB,IAAYA,EAAWp2B,MAAMC,QAAU,QAEvC82D,IAAaA,EAAY/2D,MAAMC,QAAU,QAEzC+2D,IACAA,EAAgBt+D,aAAa,eAAgB6+C,GAAQiD,6BACrDwc,EAAgBh3D,MAAMC,QAAU,SAEhCg3D,IACAA,EAAmBziE,YAAc+iD,GAAQ8B,wBAEhD,EAIDwJ,eAAgB,WAERqU,IAAAA,EAAiBzhE,SAChB+kC,uBAAuB,WAAW,IACjCj7B,cAAc,IAAIw3C,MAEnBmgB,GAuBDA,EAAe33D,cAAc,oBAAoB7G,aAAa,eAAgB,QAC9EuU,GAAc,CAAEC,UAAWpa,EAAkBqa,KAAM,CAAE/H,GAAI2xC,QAtBzDmgB,EAAiBh8D,EACbzF,SAASwhB,cAAc,WAAY,CAC/B9gB,GAAI1D,eAAeC,IAAI,WAE3B,CACI,eAAgB6kD,GAAQE,UACxBryC,GAAI2xC,GACJjrC,SAAUirC,GACVv7C,UAAW,SACX0pB,QAAS,QACThO,QAASqgC,GAAQmJ,aAAa,qCAC9BtoC,YAAa,QACbsG,QACI,2EAGZjpB,SAAS+kC,uBAAuB,WAAW,IAAIplC,YAAY8hE,GAE3DjqD,GAAc,CAAEC,UAAWpa,EAAkBqa,KAAM,CAAE/H,GAAI2xC,MAMhE,EAID4I,UAAW,SAAU5/C,GACXo3D,MAAAA,EAAep3D,EAAEuN,OAAOyxC,KAAO,QACrC7tD,QAAQD,MAAMkmE,EAClB,GC9GJ,MAAMC,WAAkB5N,GACpBj4D,WAAAA,GACIC,QAEAC,KAAKimD,QAAU,SAEfjmD,KAAKg4D,qBAAuBkJ,GAC5BlhE,KAAKi4D,mBAAqB4M,GAC1B7kE,KAAKsuD,gBAAkB0W,GACvBhlE,KAAKitD,UAAYA,EACrB,EAGJjsD,eAAeC,IAAI,WAAaD,eAAeE,OAAO,SAAUykE","x_google_ignoreList":[39,40,46]}