{"version":3,"file":"cart.js","names":["initProductRecommendations","controllers","releaseCartRecommendations","controller","scope","initCartRecommendations","slot","load","result","requestRecommendations","cartPageVersion","cartPageRefreshController","cartPageRefreshPending","cartPageChangeVersion","cartPageRefreshFinished","beginCartPageUpdate","cartStatus","status","notifyCartChanged","synchronizeCurrentCart","response","replaceCartPage","version","responseBody","nextDocument","current","next","error","isCurrent","focused","focusedId","focusedAction","step","stepInputId","imported","initializeCartPage","refreshCartPage","afterMutation","changeVersion","request","finishRefresh","resolve","updated","withSettledCartPage","page","action","initRemoveButton","button","event","cartId","offerId","clearCart","isOffer","endpoint","body","mutationControls","previouslyDisabled","control","removed","index","initSharedCart","initCartQuantities","updateButton","form","checkouts","removals","checkoutLabels","checkout","revision","dirty","saving","checkoutRequested","useFullNavigationOnRetry","timer","setStatus","message","busy","markChanged","save","sentRevision","timeout","isCurrentWrite","confirmUpdatedCart","quantities","currentPage","accepted","name","value","input","updatedStatus","nextCheckout","minimum","refreshChangedCartPage"],"sources":["../../template/components/cart/cart-recommendations/cart-recommendations.js","../../src/cart.js"],"sourcesContent":["import { initProductRecommendations } from '../../product/product-recommendations/product-recommendations.js';\nimport { requestRecommendations } from '../../common/recommendation-request/recommendation-request.js';\n\nconst controllers = new WeakMap();\n\nexport function releaseCartRecommendations(scope) {\n    const controller = controllers.get(scope);\n    if (!controller) return;\n    controller.request?.abort();\n    controllers.delete(scope);\n}\n\nexport function initCartRecommendations(scope = document) {\n    const slot = scope.querySelector('[data-cart-page-recommendations-slot]');\n    if (!slot || controllers.has(scope)) return;\n    initProductRecommendations();\n    const controller = { request: new AbortController() };\n    controllers.set(scope, controller);\n    slot.hidden = true;\n    slot.replaceChildren();\n\n    async function load() {\n        try {\n            const result = await requestRecommendations(\n                '/index.php?route=checkout/cart/pageRecommendations',\n                {\n                    method: 'POST',\n                    credentials: 'same-origin',\n                    headers: { Accept: 'application/json' },\n                    signal: controller.request.signal,\n                },\n            );\n            if (controllers.get(scope) !== controller || !slot.isConnected) return;\n            if (!result.success || !result.html || !(Number(result.count) > 0)) return;\n            slot.innerHTML = result.html;\n            slot.hidden = false;\n            document.dispatchEvent(\n                new CustomEvent('zirbelino:content-updated', { detail: { root: slot } }),\n            );\n        } catch {\n            // Recommendations are optional; an empty or failed response leaves the section hidden.\n        }\n    }\n\n    void load();\n}\n","import './styles/pages/cart.css';\nimport {\n    initCartRecommendations,\n    releaseCartRecommendations,\n} from '../template/components/cart/cart-recommendations/cart-recommendations.js';\n\nlet cartPageVersion = 0;\nlet cartPageRefreshController;\nlet cartPageRefreshPending = false;\nlet cartPageChangeVersion = 0;\nlet cartPageRefreshFinished;\n\nfunction beginCartPageUpdate() {\n    cartPageRefreshController?.abort();\n    cartPageRefreshController = undefined;\n    cartPageVersion += 1;\n    return cartPageVersion;\n}\n\nfunction cartStatus() {\n    let status = document.querySelector('[data-cart-ajax-status]');\n    if (status) return status;\n    status = document.createElement('p');\n    status.className = 'u-visually-hidden';\n    status.dataset.cartAjaxStatus = '';\n    status.setAttribute('role', 'status');\n    status.setAttribute('aria-live', 'polite');\n    document.body.append(status);\n    return status;\n}\n\nfunction notifyCartChanged(result) {\n    document.dispatchEvent(new CustomEvent('zirbelino:cart:change', { detail: result }));\n}\n\nasync function synchronizeCurrentCart() {\n    try {\n        const response = await fetch('/index.php?route=checkout/cart/current', {\n            credentials: 'same-origin',\n            headers: { Accept: 'application/json' },\n        });\n        if (!response.ok) return;\n        const result = await response.json();\n        if (result.success) notifyCartChanged(result);\n    } catch {\n        // The cart page is already current; analytics/count synchronization is fail-open.\n    }\n}\n\nasync function replaceCartPage(response, version, isCurrent = () => true) {\n    if (version !== cartPageVersion) return false;\n    if (!response.ok) throw new Error(`Cart page request failed with HTTP ${response.status}`);\n    const responseBody = await response.text();\n    const nextDocument = new DOMParser().parseFromString(responseBody, 'text/html');\n    if (version !== cartPageVersion) return false;\n    const current = document.querySelector('.z-cart-page');\n    const next = nextDocument.querySelector('.z-cart-page');\n    if (!current || !next) {\n        const error = new Error('Cart response did not contain the cart page.');\n        error.cartPageUnavailable = true;\n        try {\n            error.orderDiagnostics = {\n                route: 'checkout/cart/render',\n                status: response.status,\n                response: responseBody,\n            };\n            window.clientRuntime?.captureException(error);\n        } catch {\n            // Diagnostic failures must preserve the existing cart recovery.\n        }\n        throw error;\n    }\n    // An earlier response must not overwrite quantities edited while it was loading.\n    if (!isCurrent()) return null;\n    const focused = document.activeElement;\n    const focusedId = current.contains(focused) ? focused.id : '';\n    const focusedAction =\n        current.contains(focused) && focused.matches('[data-cart-update], [data-cart-checkout]');\n    const step = current.contains(focused) ? focused.closest('[data-cart-step]') : null;\n    const stepInputId = step?.parentElement.querySelector('[data-cart-quantity]')?.id;\n    const imported = document.importNode(next, true);\n    releaseCartRecommendations(current);\n    current.replaceWith(imported);\n    document.title = nextDocument.title || document.title;\n    initializeCartPage(imported);\n    document.dispatchEvent(\n        new CustomEvent('zirbelino:content-updated', {\n            detail: { root: imported, source: 'cart' },\n        }),\n    );\n    if (focusedId) document.getElementById(focusedId)?.focus({ preventScroll: true });\n    else if (stepInputId) {\n        const input = document.getElementById(stepInputId);\n        input?.parentElement\n            .querySelector(`[data-cart-step=\"${step.dataset.cartStep}\"]`)\n            ?.focus({ preventScroll: true });\n    } else if (focusedAction)\n        imported.querySelector('[data-cart-checkout]')?.focus({ preventScroll: true });\n    return imported;\n}\n\nasync function refreshCartPage({ afterMutation = false, isCurrent = () => true } = {}) {\n    // Keep external cart changes queued while a local mutation owns the page.\n    // Its response can have been rendered before the external change completed.\n    if (\n        !afterMutation &&\n        document.querySelector(\n            '.z-cart-page[data-cart-quantity-pending], .z-cart-page[data-cart-removing]',\n        )\n    )\n        return false;\n    const version = beginCartPageUpdate();\n    const changeVersion = cartPageChangeVersion;\n    const request = new AbortController();\n    let finishRefresh;\n    cartPageRefreshFinished = new Promise((resolve) => {\n        finishRefresh = resolve;\n    });\n    cartPageRefreshController = request;\n    try {\n        const response = await fetch(window.location.href, {\n            credentials: 'same-origin',\n            headers: { Accept: 'text/html' },\n            signal: request.signal,\n        });\n        const updated = await replaceCartPage(response, version, () => {\n            if (!isCurrent() || changeVersion !== cartPageChangeVersion) return false;\n            cartPageRefreshPending = false;\n            return true;\n        });\n        if (!updated && afterMutation && isCurrent() && version === cartPageVersion)\n            return await refreshCartPage({ afterMutation, isCurrent });\n        return updated;\n    } catch (error) {\n        if (error.name === 'AbortError') return false;\n        throw error;\n    } finally {\n        finishRefresh();\n        if (cartPageRefreshController === request) cartPageRefreshController = undefined;\n    }\n}\n\nasync function withSettledCartPage(action) {\n    while (cartPageRefreshPending) {\n        const page = document.querySelector('.z-cart-page');\n        if (\n            !page ||\n            page.hasAttribute('data-cart-quantity-pending') ||\n            page.hasAttribute('data-cart-removing')\n        )\n            return null;\n        if (cartPageRefreshController) await cartPageRefreshFinished;\n        else if (!(await refreshCartPage())) return null;\n    }\n    const page = document.querySelector('.z-cart-page');\n    if (\n        page &&\n        !page.hasAttribute('data-cart-quantity-pending') &&\n        !page.hasAttribute('data-cart-removing')\n    )\n        action(page);\n}\n\nfunction initRemoveButton(button) {\n    button.addEventListener('click', async (event) => {\n        event.preventDefault();\n        const page = button.closest('.z-cart-page');\n        if (page?.hasAttribute('data-cart-removing')) return;\n        const cartId = button.dataset.cartId;\n        const offerId = button.dataset.cartOfferId;\n        const clearCart = button.hasAttribute('data-cart-clear');\n        if (!cartId && !offerId && !clearCart) return;\n        if (clearCart && !window.confirm('Möchten Sie den gesamten Warenkorb leeren?')) return;\n\n        const isOffer = Boolean(offerId);\n        const endpoint = clearCart\n            ? 'index.php?route=checkout/cart/clear'\n            : isOffer\n              ? 'index.php?route=checkout/cart/offerRemove'\n              : 'index.php?route=checkout/cart/remove';\n        const body = new URLSearchParams(\n            clearCart\n                ? { cart_clear_csrf: page.querySelector('[name=\"cart_clear_csrf\"]').value }\n                : isOffer\n                  ? { offer_id: offerId }\n                  : { key: cartId },\n        );\n\n        beginCartPageUpdate();\n        const mutationControls = [\n            ...page.querySelectorAll(\n                '[data-cart-quantity], [data-cart-step], [data-cart-remove], [data-cart-offer-remove], [data-cart-clear]',\n            ),\n        ];\n        const previouslyDisabled = mutationControls.map((control) => control.disabled);\n        mutationControls.forEach((control) => {\n            control.disabled = true;\n        });\n        page.setAttribute('data-cart-removing', '');\n        let removed = false;\n        page?.setAttribute('aria-busy', 'true');\n        cartStatus().textContent = clearCart\n            ? 'Warenkorb wird geleert.'\n            : isOffer\n              ? 'Angebot wird entfernt.'\n              : 'Artikel wird entfernt.';\n        try {\n            const response = await fetch(endpoint, {\n                method: 'POST',\n                credentials: 'same-origin',\n                headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' },\n                body,\n            });\n            const result = await response.json();\n            if (!result.success)\n                throw new Error(\n                    result.error ||\n                        (clearCart\n                            ? 'Der Warenkorb konnte nicht geleert werden.'\n                            : isOffer\n                              ? 'Das Angebot konnte nicht entfernt werden.'\n                              : 'Der Artikel konnte nicht entfernt werden.'),\n                );\n            removed = true;\n            notifyCartChanged(result);\n            await refreshCartPage({ afterMutation: true });\n            cartStatus().textContent = clearCart\n                ? 'Der Warenkorb wurde geleert.'\n                : isOffer\n                  ? 'Das Angebot wurde entfernt. Der Warenkorb ist aktualisiert.'\n                  : 'Der Artikel wurde entfernt. Der Warenkorb ist aktualisiert.';\n            if (clearCart)\n                document.querySelector('.z-cart-page h1')?.focus({ preventScroll: true });\n        } catch (error) {\n            if (removed) {\n                window.location.reload();\n                return;\n            }\n            window.alert(error.message);\n            button.disabled = false;\n            mutationControls.forEach((control, index) => {\n                control.disabled = previouslyDisabled[index];\n            });\n            if (cartPageRefreshPending) {\n                try {\n                    await refreshCartPage({ afterMutation: true });\n                } catch {\n                    window.location.reload();\n                }\n                return;\n            }\n            page.removeAttribute('data-cart-removing');\n            page?.removeAttribute('aria-busy');\n        }\n    });\n}\n\nfunction initSharedCart(button) {\n    button.addEventListener('click', async () => {\n        button.disabled = true;\n        try {\n            const body = new URLSearchParams({\n                share_code: button.dataset.shareCode,\n                share_replace: 'true',\n                share_checkout: 'false',\n            });\n            const response = await fetch('index.php?route=checkout/cart/shareAdd', {\n                method: 'POST',\n                headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' },\n                body,\n            });\n            const result = await response.json();\n            if (!result.success)\n                throw new Error(result.error || 'Der Warenkorb konnte nicht übernommen werden.');\n            window.location.assign(result.redirect || 'index.php?route=checkout/cart');\n        } catch (error) {\n            window.alert(error.message);\n            button.disabled = false;\n        }\n    });\n}\n\nfunction initCartQuantities(form) {\n    const updateButton = form.querySelector('[data-cart-update]');\n    const status = form.querySelector('[data-cart-update-status]');\n    if (!updateButton) return;\n    const page = form.closest('.z-cart-page');\n    const checkouts = [...page.querySelectorAll('[data-cart-checkout]')];\n    const removals = form.querySelectorAll(\n        '[data-cart-remove], [data-cart-offer-remove], [data-cart-clear]',\n    );\n    const checkoutLabels = checkouts.map((checkout) => checkout.textContent);\n    let revision = 0;\n    let dirty = false;\n    let saving = false;\n    let checkoutRequested = false;\n    let useFullNavigationOnRetry = false;\n    let timer;\n    // Keep the ordinary submit button as the no-JavaScript and retry fallback.\n    updateButton.hidden = true;\n\n    function setStatus(message, busy = false) {\n        if (status) status.textContent = message;\n        cartStatus().textContent = message;\n        page?.setAttribute('aria-busy', String(busy));\n        page?.toggleAttribute('data-cart-quantity-pending', dirty);\n        checkouts.forEach((checkout, index) => {\n            checkout.setAttribute('aria-busy', String(busy));\n            checkout.setAttribute('aria-disabled', String(dirty));\n            checkout.textContent =\n                busy && form.contains(checkout)\n                    ? 'Warenkorb wird aktualisiert …'\n                    : checkoutLabels[index];\n        });\n        removals.forEach((button) => {\n            button.disabled = dirty;\n        });\n    }\n\n    function markChanged() {\n        beginCartPageUpdate();\n        revision++;\n        dirty = true;\n        updateButton.hidden = true;\n        setStatus('Anzahl und Gesamtbetrag werden aktualisiert.', true);\n        clearTimeout(timer);\n        timer = setTimeout(save, 400);\n    }\n\n    async function save() {\n        clearTimeout(timer);\n        if (saving || !dirty || !form.isConnected) return;\n        saving = true;\n        try {\n            while (dirty && form.isConnected) {\n                if (!form.checkValidity()) {\n                    checkoutRequested = false;\n                    setStatus(\n                        'Bitte geben Sie eine gültige Anzahl ein. Danach wird der Warenkorb automatisch aktualisiert.',\n                    );\n                    return;\n                }\n                const sentRevision = revision;\n                const version = beginCartPageUpdate();\n                const body = new FormData(form);\n                updateButton.disabled = true;\n                setStatus('Anzahl und Gesamtbetrag werden aktualisiert.', true);\n                // A slow write may still finish on the server. Keep it in the\n                // queue instead of aborting and racing a newer quantity against it.\n                const timeout = setTimeout(() => {\n                    setStatus(\n                        'Die Aktualisierung dauert etwas länger. Bitte warten Sie auf die Bestätigung. Ihre eingegebene Anzahl bleibt erhalten.',\n                        true,\n                    );\n                }, 20000);\n                let updated;\n                try {\n                    const response = await fetch(form.action, {\n                        method: 'POST',\n                        credentials: 'same-origin',\n                        body,\n                        headers: { Accept: 'text/html' },\n                    });\n                    const isCurrentWrite = () => sentRevision === revision && form.isConnected;\n                    updated = await replaceCartPage(\n                        response,\n                        version,\n                        () => isCurrentWrite() && !cartPageRefreshPending,\n                    );\n                    if (!updated && cartPageRefreshPending && isCurrentWrite())\n                        updated = await refreshCartPage({\n                            afterMutation: true,\n                            isCurrent: isCurrentWrite,\n                        });\n                } finally {\n                    clearTimeout(timeout);\n                }\n                if (!updated) continue;\n                dirty = false;\n                const confirmUpdatedCart = (currentPage) => {\n                    const quantities = [...currentPage.querySelectorAll('[data-cart-quantity]')];\n                    const accepted = [...body.entries()]\n                        .filter(([name]) => name.startsWith('quantity['))\n                        .every(([name, value]) =>\n                            quantities.some(\n                                (input) =>\n                                    input.name === name && Number(input.value) === Number(value),\n                            ),\n                        );\n                    const message = accepted\n                        ? 'Der Warenkorb wurde aktualisiert.'\n                        : 'Die gewünschte Anzahl konnte nicht vollständig übernommen werden. Bitte prüfen Sie den aktualisierten Warenkorb.';\n                    const updatedStatus = currentPage.querySelector('[data-cart-update-status]');\n                    if (updatedStatus) updatedStatus.textContent = message;\n                    cartStatus().textContent = message;\n                    if (checkoutRequested && accepted) {\n                        const nextCheckout = currentPage.querySelector('[data-cart-checkout]');\n                        if (nextCheckout) window.location.assign(nextCheckout.href);\n                    }\n                    void synchronizeCurrentCart();\n                };\n                if (checkoutRequested) await withSettledCartPage(confirmUpdatedCart);\n                else confirmUpdatedCart(updated);\n            }\n        } catch (error) {\n            // Keep the latest inputs and let the customer explicitly retry.\n            checkoutRequested = false;\n            clearTimeout(timer);\n            useFullNavigationOnRetry = Boolean(error.cartPageUnavailable);\n            setStatus(\n                'Der Warenkorb konnte nicht aktualisiert werden. Ihre eingegebene Anzahl bleibt erhalten. Bitte versuchen Sie es erneut, bevor Sie zur Kasse gehen.',\n            );\n            updateButton.hidden = false;\n            updateButton.textContent = 'Erneut versuchen';\n        } finally {\n            saving = false;\n            updateButton.disabled = false;\n        }\n    }\n\n    form.addEventListener('submit', (event) => {\n        event.preventDefault();\n        if (!form.reportValidity()) return;\n        if (useFullNavigationOnRetry) HTMLFormElement.prototype.submit.call(form);\n        else void save();\n    });\n\n    checkouts.forEach((checkout) => {\n        checkout.addEventListener('click', async (event) => {\n            if (page?.hasAttribute('data-cart-removing')) {\n                event.preventDefault();\n                cartStatus().textContent =\n                    'Der Artikel wird entfernt. Bitte warten Sie kurz, bis der Warenkorb aktualisiert ist.';\n                return;\n            }\n            if (!dirty && !cartPageRefreshPending) return;\n            event.preventDefault();\n            if (!form.reportValidity()) return;\n            if (!dirty) {\n                try {\n                    await withSettledCartPage((updated) => {\n                        const nextCheckout = updated.querySelector('[data-cart-checkout]');\n                        if (nextCheckout) window.location.assign(nextCheckout.href);\n                    });\n                } catch {\n                    window.location.reload();\n                }\n                return;\n            }\n            checkoutRequested = true;\n            void save();\n        });\n    });\n\n    form.querySelectorAll('[data-cart-quantity]').forEach((input) => {\n        input.addEventListener('input', markChanged);\n        input.addEventListener('change', markChanged);\n        input\n            .closest('.z-cart-item__quantity')\n            ?.querySelectorAll('[data-cart-step]')\n            .forEach((button) => {\n                button.addEventListener('click', () => {\n                    const minimum = Number(input.min) || 1;\n                    input.value = String(\n                        Math.max(minimum, Number(input.value) + Number(button.dataset.cartStep)),\n                    );\n                    input.dispatchEvent(new Event('change', { bubbles: true }));\n                });\n            });\n    });\n}\n\nfunction initializeCartPage(scope = document) {\n    scope\n        .querySelectorAll('[data-cart-remove], [data-cart-offer-remove], [data-cart-clear]')\n        .forEach(initRemoveButton);\n    scope.querySelectorAll('.z-cart-page form').forEach(initCartQuantities);\n    const page = scope.matches?.('.z-cart-page') ? scope : scope.querySelector('.z-cart-page');\n    if (page) initCartRecommendations(page);\n}\n\ninitializeCartPage();\ndocument.querySelectorAll('[data-shared-cart-add]').forEach(initSharedCart);\n\nasync function refreshChangedCartPage() {\n    cartPageChangeVersion += 1;\n    cartPageRefreshPending = true;\n    try {\n        await refreshCartPage();\n    } catch {\n        window.location.reload();\n    }\n}\n\ndocument.addEventListener('zirbelino:cart:add', refreshChangedCartPage);\nwindow.addEventListener('shop:restored', refreshChangedCartPage);\n"],"mappings":"8GAGA,IAAMC,EAAc,IAAI,QAExB,SAAgBC,EAA2B,EAAO,CAC9C,IAAMC,EAAaF,EAAY,IAAIG,CAAK,EACnCD,IACLA,EAAW,SAAS,MAAM,EAC1BF,EAAY,OAAOG,CAAK,EAC5B,CAEA,SAAgBC,EAAwB,EAAQ,SAAU,CACtD,IAAMC,EAAOF,EAAM,cAAc,uCAAuC,EACxE,GAAI,CAACE,GAAQL,EAAY,IAAIG,CAAK,EAAG,OACrCJ,EAA2B,EAC3B,IAAMG,EAAa,CAAE,QAAS,IAAI,eAAkB,EACpDF,EAAY,IAAIG,EAAOD,CAAU,EACjC,EAAK,OAAS,GACdG,EAAK,gBAAgB,EAErB,eAAeC,GAAO,CAClB,GAAI,CACA,IAAMC,EAAS,MAAMC,EACjB,qDACA,CACI,OAAQ,OACR,YAAa,cACb,QAAS,CAAE,OAAQ,kBAAmB,EACtC,OAAQN,EAAW,QAAQ,MAC/B,CACJ,EAEA,GADIF,EAAY,IAAIG,CAAK,IAAMD,GAAc,CAACG,EAAK,aAC/C,CAACE,EAAO,SAAW,CAACA,EAAO,MAAQ,EAAE,OAAOA,EAAO,KAAK,EAAI,GAAI,OACpE,EAAK,UAAYA,EAAO,KACxB,EAAK,OAAS,GACd,SAAS,cACL,IAAI,YAAY,4BAA6B,CAAE,OAAQ,CAAE,KAAMF,CAAK,CAAE,CAAC,CAC3E,CACJ,MAAQ,CAER,CACJ,CAEAC,EAAU,CACd,CCvCA,IAAIG,EAAkB,EAClBC,EACAC,EAAyB,GACzBC,EAAwB,EACxBC,EAEJ,SAASC,GAAsB,CAI3B,OAHAJ,GAA2B,MAAM,EACjC,EAA4B,IAAA,GAC5B,GAAmB,EACZD,CACX,CAEA,SAASM,GAAa,CAClB,IAAIC,EAAS,SAAS,cAAc,yBAAyB,EAQ7D,OAPIA,IACJ,EAAS,SAAS,cAAc,GAAG,EACnC,EAAO,UAAY,oBACnB,EAAO,QAAQ,eAAiB,GAChCA,EAAO,aAAa,OAAQ,QAAQ,EACpCA,EAAO,aAAa,YAAa,QAAQ,EACzC,SAAS,KAAK,OAAOA,CAAM,EACpBA,EACX,CAEA,SAASC,EAAkB,EAAQ,CAC/B,SAAS,cAAc,IAAI,YAAY,wBAAyB,CAAE,OAAQV,CAAO,CAAC,CAAC,CACvF,CAEA,eAAeW,GAAyB,CACpC,GAAI,CACA,IAAMC,EAAW,MAAM,MAAM,yCAA0C,CACnE,YAAa,cACb,QAAS,CAAE,OAAQ,kBAAmB,CAC1C,CAAC,EACD,GAAI,CAACA,EAAS,GAAI,OAClB,IAAMZ,EAAS,MAAMY,EAAS,KAAK,EAC/BZ,EAAO,SAASU,EAAkBV,CAAM,CAChD,MAAQ,CAER,CACJ,CAEA,eAAea,EAAgB,EAAU,EAAS,MAAkB,GAAM,CACtE,GAAIC,IAAYZ,EAAiB,MAAO,GACxC,GAAI,CAACU,EAAS,GAAI,MAAU,MAAM,sCAAsCA,EAAS,QAAQ,EACzF,IAAMG,EAAe,MAAMH,EAAS,KAAK,EACnCI,EAAe,IAAI,UAAU,CAAC,CAAC,gBAAgBD,EAAc,WAAW,EAC9E,GAAID,IAAYZ,EAAiB,MAAO,GACxC,IAAMe,EAAU,SAAS,cAAc,cAAc,EAC/CC,EAAOF,EAAa,cAAc,cAAc,EACtD,GAAI,CAACC,GAAW,CAACC,EAAM,CACnB,IAAMC,EAAY,MAAM,8CAA8C,EACtE,EAAM,oBAAsB,GAC5B,GAAI,CACA,EAAM,iBAAmB,CACrB,MAAO,uBACP,OAAQP,EAAS,OACjB,SAAUG,CACd,EACA,OAAO,eAAe,iBAAiBI,CAAK,CAChD,MAAQ,CAER,CACA,MAAMA,CACV,CAEA,GAAI,CAACC,EAAU,EAAG,OAAO,KACzB,IAAMC,EAAU,SAAS,cACnBC,EAAYL,EAAQ,SAASI,CAAO,EAAIA,EAAQ,GAAK,GACrDE,EACFN,EAAQ,SAASI,CAAO,GAAKA,EAAQ,QAAQ,0CAA0C,EACrFG,EAAOP,EAAQ,SAASI,CAAO,EAAIA,EAAQ,QAAQ,kBAAkB,EAAI,KACzEI,EAAcD,GAAM,cAAc,cAAc,sBAAsB,CAAC,EAAE,GACzEE,EAAW,SAAS,WAAWR,EAAM,EAAI,EAkB/C,OAjBAxB,EAA2BuB,CAAO,EAClCA,EAAQ,YAAYS,CAAQ,EAC5B,SAAS,MAAQV,EAAa,OAAS,SAAS,MAChDW,EAAmBD,CAAQ,EAC3B,SAAS,cACL,IAAI,YAAY,4BAA6B,CACzC,OAAQ,CAAE,KAAMA,EAAU,OAAQ,MAAO,CAC7C,CAAC,CACL,EACIJ,EAAW,SAAS,eAAeA,CAAS,CAAC,EAAE,MAAM,CAAE,cAAe,EAAK,CAAC,EACvEG,EAEL,SADuB,eAAeA,CAClC,CAAC,EAAE,cACF,cAAc,oBAAoBD,EAAK,QAAQ,SAAS,GAAG,CAAC,EAC3D,MAAM,CAAE,cAAe,EAAK,CAAC,EAC5BD,GACPG,EAAS,cAAc,sBAAsB,CAAC,EAAE,MAAM,CAAE,cAAe,EAAK,CAAC,EAC1EA,CACX,CAEA,eAAeE,EAAgB,CAAE,gBAAgB,GAAO,gBAAkB,IAAS,CAAC,EAAG,CAGnF,GACI,CAACC,GACD,SAAS,cACL,4EACJ,EAEA,MAAO,GACX,IAAMf,EAAUP,EAAoB,EAC9BuB,EAAgBzB,EAChB0B,EAAU,IAAI,gBAChBC,EACJ,EAA0B,IAAI,QAAS,GAAY,CAC/C,EAAgBC,CACpB,CAAC,EACD,EAA4BF,EAC5B,GAAI,CAMA,IAAMG,EAAU,MAAMrB,EAAgB,MALf,MAAM,OAAO,SAAS,KAAM,CAC/C,YAAa,cACb,QAAS,CAAE,OAAQ,WAAY,EAC/B,OAAQkB,EAAQ,MACpB,CAAC,EAC+CjB,MACxC,CAACM,EAAU,GAAKU,IAAkBzB,EAA8B,IACpE,EAAyB,GAClB,GACV,EAGD,MAFI,CAAC6B,GAAWL,GAAiBT,EAAU,GAAKN,IAAYZ,EACjD,MAAM0B,EAAgB,CAAE,gBAAe,WAAU,CAAC,EACtDM,CACX,OAASf,EAAO,CACZ,GAAIA,EAAM,OAAS,aAAc,MAAO,GACxC,MAAMA,CACV,QAAU,CACNa,EAAc,EACV7B,IAA8B4B,IAAS,EAA4B,IAAA,GAC3E,CACJ,CAEA,eAAeI,EAAoB,EAAQ,CACvC,KAAO/B,GAAwB,CAC3B,IAAMgC,EAAO,SAAS,cAAc,cAAc,EAClD,GACI,CAACA,GACDA,EAAK,aAAa,4BAA4B,GAC9CA,EAAK,aAAa,oBAAoB,EAEtC,OAAO,KACX,GAAIjC,EAA2B,MAAMG,OAChC,GAAI,CAAE,MAAMsB,EAAgB,EAAI,OAAO,IAChD,CACA,IAAMQ,EAAO,SAAS,cAAc,cAAc,EAE9CA,GACA,CAACA,EAAK,aAAa,4BAA4B,GAC/C,CAACA,EAAK,aAAa,oBAAoB,GAEvCC,EAAOD,CAAI,CACnB,CAEA,SAASE,EAAiB,EAAQ,CAC9BC,EAAO,iBAAiB,QAAS,KAAO,IAAU,CAC9CC,EAAM,eAAe,EACrB,IAAMJ,EAAOG,EAAO,QAAQ,cAAc,EAC1C,GAAIH,GAAM,aAAa,oBAAoB,EAAG,OAC9C,IAAMK,EAASF,EAAO,QAAQ,OACxBG,EAAUH,EAAO,QAAQ,YACzBI,EAAYJ,EAAO,aAAa,iBAAiB,EAEvD,GADI,CAACE,GAAU,CAACC,GAAW,CAACC,GACxBA,GAAa,CAAC,OAAO,QAAQ,4CAA4C,EAAG,OAEhF,IAAMC,EAAU,EAAQF,EAClBG,EAAWF,EACX,sCACAC,EACE,4CACA,uCACFE,EAAO,IAAI,gBACbH,EACM,CAAE,gBAAiBP,EAAK,cAAc,0BAA0B,CAAC,CAAC,KAAM,EACxEQ,EACE,CAAE,SAAUF,CAAQ,EACpB,CAAE,IAAKD,CAAO,CAC1B,EAEAlC,EAAoB,EACpB,IAAMwC,EAAmB,CACrB,GAAGX,EAAK,iBACJ,yGACJ,CACJ,EACMY,EAAqBD,EAAiB,IAAK,GAAYE,EAAQ,QAAQ,EAC7EF,EAAiB,QAAS,GAAY,CAClC,EAAQ,SAAW,EACvB,CAAC,EACDX,EAAK,aAAa,qBAAsB,EAAE,EAC1C,IAAIc,EAAU,GACdd,GAAM,aAAa,YAAa,MAAM,EACtC,EAAW,CAAC,CAAC,YAAcO,EACrB,0BACAC,EACE,yBACA,yBACR,GAAI,CAOA,IAAM5C,EAAS,MAAM,MANE,MAAM6C,EAAU,CACnC,OAAQ,OACR,YAAa,cACb,QAAS,CAAE,eAAgB,kDAAmD,EAC9E,MACJ,CAAC,EAAA,CAC6B,KAAK,EACnC,GAAI,CAAC7C,EAAO,QACR,MAAU,MACNA,EAAO,QACF2C,EACK,6CACAC,EACE,4CACA,4CAChB,EACJ,EAAU,GACVlC,EAAkBV,CAAM,EACxB,MAAM4B,EAAgB,CAAE,cAAe,EAAK,CAAC,EAC7C,EAAW,CAAC,CAAC,YAAce,EACrB,+BACAC,EACE,8DACA,8DACJD,GACA,SAAS,cAAc,iBAAiB,CAAC,EAAE,MAAM,CAAE,cAAe,EAAK,CAAC,CAChF,OAASxB,EAAO,CACZ,GAAI+B,EAAS,CACT,OAAO,SAAS,OAAO,EACvB,MACJ,CAMA,GALA,OAAO,MAAM/B,EAAM,OAAO,EAC1B,EAAO,SAAW,GAClB4B,EAAiB,SAAS,EAAS,IAAU,CACzC,EAAQ,SAAWC,EAAmBG,EAC1C,CAAC,EACG/C,EAAwB,CACxB,GAAI,CACA,MAAMwB,EAAgB,CAAE,cAAe,EAAK,CAAC,CACjD,MAAQ,CACJ,OAAO,SAAS,OAAO,CAC3B,CACA,MACJ,CACAQ,EAAK,gBAAgB,oBAAoB,EACzCA,GAAM,gBAAgB,WAAW,CACrC,CACJ,CAAC,CACL,CAEA,SAASgB,EAAe,EAAQ,CAC5Bb,EAAO,iBAAiB,QAAS,SAAY,CACzC,EAAO,SAAW,GAClB,GAAI,CACA,IAAMO,EAAO,IAAI,gBAAgB,CAC7B,WAAYP,EAAO,QAAQ,UAC3B,cAAe,OACf,eAAgB,OACpB,CAAC,EAMKvC,EAAS,MAAM,MALE,MAAM,yCAA0C,CACnE,OAAQ,OACR,QAAS,CAAE,eAAgB,kDAAmD,EAC9E,MACJ,CAAC,EAAA,CAC6B,KAAK,EACnC,GAAI,CAACA,EAAO,QACR,MAAU,MAAMA,EAAO,OAAS,+CAA+C,EACnF,OAAO,SAAS,OAAOA,EAAO,UAAY,+BAA+B,CAC7E,OAASmB,EAAO,CACZ,OAAO,MAAMA,EAAM,OAAO,EAC1B,EAAO,SAAW,EACtB,CACJ,CAAC,CACL,CAEA,SAASkC,EAAmB,EAAM,CAC9B,IAAMC,EAAeC,EAAK,cAAc,oBAAoB,EACtD9C,EAAS8C,EAAK,cAAc,2BAA2B,EAC7D,GAAI,CAACD,EAAc,OACnB,IAAMlB,EAAOmB,EAAK,QAAQ,cAAc,EAClCC,EAAY,CAAC,GAAGpB,EAAK,iBAAiB,sBAAsB,CAAC,EAC7DqB,EAAWF,EAAK,iBAClB,iEACJ,EACMG,EAAiBF,EAAU,IAAK,GAAaG,EAAS,WAAW,EACnEC,EAAW,EACXC,EAAQ,GACRC,EAAS,GACTC,EAAoB,GACpBC,EAA2B,GAC3BC,EAEJ,EAAa,OAAS,GAEtB,SAASC,EAAU,EAAS,EAAO,GAAO,CAClCzD,IAAQ,EAAO,YAAc0D,GACjC,EAAW,CAAC,CAAC,YAAcA,EAC3B/B,GAAM,aAAa,YAAa,OAAOgC,CAAI,CAAC,EAC5ChC,GAAM,gBAAgB,6BAA8ByB,CAAK,EACzDL,EAAU,SAAS,EAAU,IAAU,CACnCG,EAAS,aAAa,YAAa,OAAOS,CAAI,CAAC,EAC/CT,EAAS,aAAa,gBAAiB,OAAOE,CAAK,CAAC,EACpD,EAAS,YACLO,GAAQb,EAAK,SAASI,CAAQ,EACxB,gCACAD,EAAeP,EAC7B,CAAC,EACDM,EAAS,QAAS,GAAW,CACzB,EAAO,SAAWI,CACtB,CAAC,CACL,CAEA,SAASQ,GAAc,CACnB9D,EAAoB,EACpB,IACA,EAAQ,GACR,EAAa,OAAS,GACtB2D,EAAU,+CAAgD,EAAI,EAC9D,aAAaD,CAAK,EAClB,EAAQ,WAAWK,EAAM,GAAG,CAChC,CAEA,eAAeA,GAAO,CAElB,GADA,aAAaL,CAAK,EACd,IAAWJ,GAAUN,EAAK,YAC9B,GAAS,GACT,GAAI,CACA,KAAOM,GAASN,EAAK,aAAa,CAC9B,GAAI,CAACA,EAAK,cAAc,EAAG,CACvB,EAAoB,GACpBW,EACI,8FACJ,EACA,MACJ,CACA,IAAMK,EAAeX,EACf9C,EAAUP,EAAoB,EAC9BuC,EAAO,IAAI,SAASS,CAAI,EAC9B,EAAa,SAAW,GACxBW,EAAU,+CAAgD,EAAI,EAG9D,IAAMM,EAAU,eAAiB,CAC7BN,EACI,yHACA,EACJ,CACJ,EAAG,GAAK,EACJhC,EACJ,GAAI,CACA,IAAMtB,EAAW,MAAM,MAAM2C,EAAK,OAAQ,CACtC,OAAQ,OACR,YAAa,cACb,OACA,QAAS,CAAE,OAAQ,WAAY,CACnC,CAAC,EACKkB,MAAuBF,IAAiBX,GAAYL,EAAK,YAC/D,EAAU,MAAM1C,EACZD,EACAE,MACM2D,EAAe,GAAK,CAACrE,CAC/B,EACI,CAAC8B,GAAW9B,GAA0BqE,EAAe,IACrD,EAAU,MAAM7C,EAAgB,CAC5B,cAAe,GACf,UAAW6C,CACf,CAAC,EACT,QAAU,CACN,aAAaD,CAAO,CACxB,CACA,GAAI,CAACtC,EAAS,SACd,EAAQ,GACR,IAAMwC,EAAsB,GAAgB,CACxC,IAAMC,EAAa,CAAC,GAAGC,EAAY,iBAAiB,sBAAsB,CAAC,EACrEC,EAAW,CAAC,GAAG/B,EAAK,QAAQ,CAAC,CAAC,CAC/B,QAAQ,CAACgC,KAAUA,EAAK,WAAW,WAAW,CAAC,CAAC,CAChD,OAAO,CAACA,EAAMC,KACXJ,EAAW,KACN,GACGK,EAAM,OAASF,GAAQ,OAAOE,EAAM,KAAK,IAAM,OAAOD,CAAK,CACnE,CACJ,EACEZ,EAAUU,EACV,oCACA,mHACAI,EAAgBL,EAAY,cAAc,2BAA2B,EAG3E,GAFIK,IAAe,EAAc,YAAcd,GAC/C,EAAW,CAAC,CAAC,YAAcA,EACvBJ,GAAqBc,EAAU,CAC/B,IAAMK,EAAeN,EAAY,cAAc,sBAAsB,EACjEM,GAAc,OAAO,SAAS,OAAOA,EAAa,IAAI,CAC9D,CACAvE,EAA4B,CAChC,EACIoD,EAAmB,MAAM5B,EAAoBuC,CAAkB,EAC9DA,EAAmBxC,CAAO,CACnC,CACJ,OAASf,EAAO,CAEZ,EAAoB,GACpB,aAAa8C,CAAK,EAClB,EAA2B,EAAQ9C,EAAM,oBACzC+C,EACI,oJACJ,EACA,EAAa,OAAS,GACtB,EAAa,YAAc,kBAC/B,QAAU,CACN,EAAS,GACT,EAAa,SAAW,EAC5B,CArFS,CAsFb,CAEAX,EAAK,iBAAiB,SAAW,GAAU,CACvCf,EAAM,eAAe,EAChBe,EAAK,eAAe,IACrBS,EAA0B,gBAAgB,UAAU,OAAO,KAAKT,CAAI,EACnEe,EAAU,EACnB,CAAC,EAEDd,EAAU,QAAS,GAAa,CAC5BG,EAAS,iBAAiB,QAAS,KAAO,IAAU,CAChD,GAAIvB,GAAM,aAAa,oBAAoB,EAAG,CAC1CI,EAAM,eAAe,EACrB,EAAW,CAAC,CAAC,YACT,wFACJ,MACJ,CACA,IAAKqB,GAAUzD,KACfoC,EAAM,eAAe,EAChBe,EAAK,eAAe,GACzB,IAAI,CAACM,EAAO,CACR,GAAI,CACA,MAAM1B,EAAqB,GAAY,CACnC,IAAM+C,EAAehD,EAAQ,cAAc,sBAAsB,EAC7DgD,GAAc,OAAO,SAAS,OAAOA,EAAa,IAAI,CAC9D,CAAC,CACL,MAAQ,CACJ,OAAO,SAAS,OAAO,CAC3B,CACA,MACJ,CACA,EAAoB,GACpBZ,EAAU,CAFV,CAGJ,CAAC,CACL,CAAC,EAEDf,EAAK,iBAAiB,sBAAsB,CAAC,CAAC,QAAS,GAAU,CAC7DyB,EAAM,iBAAiB,QAASX,CAAW,EAC3CW,EAAM,iBAAiB,SAAUX,CAAW,EAC5CW,EACK,QAAQ,wBAAwB,CAAC,EAChC,iBAAiB,kBAAkB,CAAC,CACrC,QAAS,GAAW,CACjBzC,EAAO,iBAAiB,YAAe,CACnC,IAAM4C,EAAU,OAAOH,EAAM,GAAG,GAAK,EACrC,EAAM,MAAQ,OACV,KAAK,IAAIG,EAAS,OAAOH,EAAM,KAAK,EAAI,OAAOzC,EAAO,QAAQ,QAAQ,CAAC,CAC3E,EACAyC,EAAM,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAK,CAAC,CAAC,CAC9D,CAAC,CACL,CAAC,CACT,CAAC,CACL,CAEA,SAASrD,EAAmB,EAAQ,SAAU,CAC1C/B,EACK,iBAAiB,iEAAiE,CAAC,CACnF,QAAQ0C,CAAgB,EAC7B1C,EAAM,iBAAiB,mBAAmB,CAAC,CAAC,QAAQyD,CAAkB,EACtE,IAAMjB,EAAOxC,EAAM,UAAU,cAAc,EAAIA,EAAQA,EAAM,cAAc,cAAc,EACrFwC,GAAMvC,EAAwBuC,CAAI,CAC1C,CAEAT,EAAmB,EACnB,SAAS,iBAAiB,wBAAwB,CAAC,CAAC,QAAQyB,CAAc,EAE1E,eAAegC,GAAyB,CACpC,GAAyB,EACzB,EAAyB,GACzB,GAAI,CACA,MAAMxD,EAAgB,CAC1B,MAAQ,CACJ,OAAO,SAAS,OAAO,CAC3B,CACJ,CAEA,SAAS,iBAAiB,qBAAsBwD,CAAsB,EACtE,OAAO,iBAAiB,gBAAiBA,CAAsB"}