@best-bundles/bundle-ui 0.0.20 → 0.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/constants.ts","../src/api/fetchBundleConfig.ts","../src/utils/analytics.ts","../src/context/BundleProvider.tsx","../src/hooks/useBundleBuilder.ts","../src/hooks/useBundleBuilderDrawer.ts","../src/components/BundleButton.tsx","../../../node_modules/tween-functions/index.js","../../../node_modules/react-confetti/dist/react-confetti.mjs","../../../node_modules/lucide-react/dist/esm/shared/src/utils.js","../../../node_modules/lucide-react/dist/esm/defaultAttributes.js","../../../node_modules/lucide-react/dist/esm/Icon.js","../../../node_modules/lucide-react/dist/esm/createLucideIcon.js","../../../node_modules/lucide-react/dist/esm/icons/search.js","../src/components/BundleBuilderDrawer.tsx","../src/adapters/LiquidAdapter.ts"],"sourcesContent":["export const BundleLineAttributeKeys = {\n bundleId: \"_bundle_id\",\n bundleConfig: \"_bundle_config\",\n bundleSource: \"_bundle_source\",\n bundleTitle: \"_bundle_title\",\n} as const;\n\n","import type { PublicBundleConfigResponse } from \"../types\";\n\nexport async function fetchBundleConfig(params: {\n apiBaseUrl: string;\n shop: string;\n signal?: AbortSignal;\n}): Promise<PublicBundleConfigResponse> {\n const url = new URL(\"/api/public/bundle-config\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n // The endpoint uses 4xx/5xx for some errors; normalize to {ok:false}.\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicBundleConfigResponse;\n}\n\n","const ANONYMOUS_USER_ID_KEY = \"bb_anonymous_user_id\";\n\n/**\n * Gets or creates an anonymous user ID stored in localStorage.\n * This ID persists across sessions to attribute events to the same user.\n */\nexport function getOrCreateAnonymousUserId(): string {\n if (typeof window === \"undefined\" || typeof localStorage === \"undefined\") {\n // Fallback for SSR or environments without localStorage\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n try {\n const existing = localStorage.getItem(ANONYMOUS_USER_ID_KEY);\n if (existing && typeof existing === \"string\" && existing.length > 0) {\n return existing;\n }\n\n // Generate new ID\n let newId: string;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoAny = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoAny?.randomUUID) {\n newId = cryptoAny.randomUUID();\n } else {\n throw new Error(\"crypto.randomUUID not available\");\n }\n } catch {\n // Fallback UUID generation\n newId = `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n localStorage.setItem(ANONYMOUS_USER_ID_KEY, newId);\n return newId;\n } catch {\n // If localStorage fails, generate a temporary ID\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n}\n\nexport type AnalyticsEventType = \"DRAWER_OPENED\" | \"VARIANT_SELECTION_CHANGED\" | \"BUNDLE_ADDED_TO_BASKET\";\n\nexport type DrawerOpenedEvent = {\n eventType: \"DRAWER_OPENED\";\n shop: string;\n anonymousUserId: string;\n timestamp: string;\n};\n\nexport type VariantSelectionChangedEvent = {\n eventType: \"VARIANT_SELECTION_CHANGED\";\n shop: string;\n anonymousUserId: string;\n before: Record<string, number>; // variantId -> quantity\n after: Record<string, number>;\n timestamp: string;\n};\n\nexport type BundleAddedToBasketEvent = {\n eventType: \"BUNDLE_ADDED_TO_BASKET\";\n shop: string;\n anonymousUserId: string;\n bundleId: string;\n productVariantIds: string[];\n grossPrice: number;\n discountedPrice: number;\n currency?: string;\n discountThresholdIdentifier: string; // rule handle\n discountLabel: string;\n discountPercentage: number | null;\n discountedAmount: number;\n timestamp: string;\n};\n\nexport type AnalyticsEvent = DrawerOpenedEvent | VariantSelectionChangedEvent | BundleAddedToBasketEvent;\n\n/**\n * Sends an analytics event to the backend API endpoint.\n * Failures are silently caught to prevent breaking bundle functionality.\n */\nexport async function trackEvent(\n analyticsEndpoint: string,\n shop: string,\n event: AnalyticsEvent,\n): Promise<void> {\n if (typeof window === \"undefined\") {\n return; // Skip in SSR\n }\n\n try {\n const url = new URL(analyticsEndpoint, window.location.origin);\n url.searchParams.set(\"shop\", shop);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(event),\n // Don't wait for response - fire and forget\n keepalive: true,\n });\n\n if (!response.ok) {\n console.warn(\n `[Bundle Analytics] Event tracking failed with status ${response.status}:`,\n await response.text().catch(() => \"Unable to read response\"),\n );\n }\n } catch (error) {\n // Log error for debugging but don't break bundle functionality\n console.warn(\"[Bundle Analytics] Failed to track event:\", error);\n }\n}\n","import React, { createContext, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { BundleLineAttributeKeys } from \"../constants\";\nimport { fetchBundleConfig as defaultFetchBundleConfig } from \"../api/fetchBundleConfig\";\nimport type { BundleCartAdapter, BundleConfig, BundleEligibleVariant, PublicBundleConfigResponse } from \"../types\";\nimport { getOrCreateAnonymousUserId, trackEvent } from \"../utils/analytics\";\n\ntype BundleProviderData = {\n currencyCode: string | null;\n config: BundleConfig;\n eligibleVariants: BundleEligibleVariant[];\n};\n\ntype BundleSelectionState = Record<string, number>; // merchandiseId -> qty\ntype BundleSelectionOrder = string[]; // merchandiseId (variant GID) per-item, in first-added -> last-added order\n\nexport type BundleProviderProps = {\n apiBaseUrl: string;\n shop: string;\n cartAdapter: BundleCartAdapter;\n\n /**\n * v1 default is \"default\" to mirror the app's current single-config endpoint.\n * Kept as a prop to avoid an API break when the public endpoint supports multiple handles.\n */\n configHandle?: string;\n\n /**\n * Optional override for Storybook/tests so we can avoid network calls.\n */\n initialData?: BundleProviderData;\n\n /**\n * Optional fetcher override for Storybook/tests.\n */\n configFetcher?: (params: { apiBaseUrl: string; shop: string; signal?: AbortSignal }) => Promise<PublicBundleConfigResponse>;\n\n /**\n * Optional analytics endpoint override. Defaults to \"/api/public/bundle-analytics\".\n */\n analyticsEndpoint?: string;\n\n children: React.ReactNode;\n};\n\nexport type BundleBuilderContextValue = {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n\n loading: boolean;\n submitting: boolean;\n error: string | null;\n\n currencyCode: string | null;\n config: BundleConfig | null;\n eligibleVariants: BundleEligibleVariant[];\n\n selections: BundleSelectionState;\n selectionOrder: BundleSelectionOrder;\n setQuantity: (merchandiseId: string, quantity: number) => void;\n clearSelections: () => void;\n\n bundleSize: number;\n minRequired: number;\n canSubmit: boolean;\n submit: () => Promise<void>;\n submitAndCheckout: () => Promise<void>;\n};\n\nexport const BundleBuilderContext = createContext<BundleBuilderContextValue | null>(null);\n\nfunction safeRandomUUID() {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoAny = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoAny?.randomUUID) return cryptoAny.randomUUID();\n } catch {\n // ignore\n }\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction clampQty(n: number) {\n if (!Number.isFinite(n)) return 0;\n return Math.max(0, Math.floor(n));\n}\n\nexport function BundleProvider(props: BundleProviderProps) {\n const {\n apiBaseUrl,\n shop,\n cartAdapter,\n configHandle = \"default\",\n initialData,\n configFetcher,\n analyticsEndpoint: providedAnalyticsEndpoint,\n children,\n } = props;\n\n const analyticsEndpoint = providedAnalyticsEndpoint ?? `${apiBaseUrl}/api/public/bundle-analytics`;\n\n const [isOpen, setIsOpen] = useState(false);\n const [loading, setLoading] = useState(!initialData);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const [currencyCode, setCurrencyCode] = useState<string | null>(initialData?.currencyCode ?? null);\n const [config, setConfig] = useState<BundleConfig | null>(initialData?.config ?? null);\n const [eligibleVariants, setEligibleVariants] = useState<BundleEligibleVariant[]>(\n initialData?.eligibleVariants ?? [],\n );\n\n const [selectionsState, setSelectionsState] = useState<{ selections: BundleSelectionState; order: BundleSelectionOrder }>(\n () => ({ selections: {}, order: [] }),\n );\n\n const abortRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n if (initialData) return;\n\n abortRef.current?.abort();\n const ac = new AbortController();\n abortRef.current = ac;\n\n const fetcher = configFetcher ?? defaultFetchBundleConfig;\n\n setLoading(true);\n setError(null);\n fetcher({ apiBaseUrl, shop, signal: ac.signal })\n .then((json) => {\n if (!json.ok) {\n setError(json.error || \"Failed to load bundle config.\");\n setConfig(null);\n setEligibleVariants([]);\n setCurrencyCode(null);\n return;\n }\n setCurrencyCode(json.currencyCode ?? null);\n setConfig(json.config);\n setEligibleVariants(json.eligibleVariants ?? []);\n })\n .catch((e: unknown) => {\n const msg = e instanceof Error ? e.message : \"Failed to load bundle config.\";\n setError(msg);\n setConfig(null);\n setEligibleVariants([]);\n setCurrencyCode(null);\n })\n .finally(() => setLoading(false));\n\n return () => ac.abort();\n }, [apiBaseUrl, shop, initialData, configFetcher]);\n\n const open = useCallback(() => {\n setIsOpen(true);\n // Track drawer opened event\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_OPENED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n }).catch((error) => {\n // Log error for debugging but don't break functionality\n console.warn(\"[Bundle Analytics] Failed to track drawer opened:\", error);\n });\n } catch (error) {\n // Log error for debugging but don't break functionality\n console.warn(\"[Bundle Analytics] Error in open() callback:\", error);\n }\n }\n }, [analyticsEndpoint, shop]);\n const close = useCallback(() => setIsOpen(false), []);\n const toggle = useCallback(() => {\n // Check current state and call appropriate function\n setIsOpen((current) => {\n if (!current) {\n // Opening - track the event\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_OPENED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n }).catch((error) => {\n console.warn(\"[Bundle Analytics] Failed to track drawer opened:\", error);\n });\n } catch (error) {\n console.warn(\"[Bundle Analytics] Error in toggle() callback:\", error);\n }\n }\n }\n return !current;\n });\n }, [analyticsEndpoint, shop]);\n\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n\n const eligibleVariantIdsSet = useMemo(() => {\n return new Set(eligibleVariants.map((v) => v.id));\n }, [eligibleVariants]);\n\n const setQuantity = useCallback((merchandiseId: string, quantity: number) => {\n // Validate that the merchandiseId is in the eligible variants set\n if (!eligibleVariantIdsSet.has(merchandiseId)) {\n return; // Silently ignore ineligible variants\n }\n\n const q = clampQty(quantity);\n setSelectionsState((prev) => {\n const prevQty = prev.selections[merchandiseId] ?? 0;\n const requestedDelta = q - prevQty;\n const currentBundleSize = Object.values(prev.selections).reduce((sum, v) => sum + (v || 0), 0);\n const delta =\n requestedDelta > 0\n ? Math.min(requestedDelta, Math.max(0, maxBundleSize - currentBundleSize))\n : requestedDelta;\n\n const nextQty = prevQty + delta;\n\n // selections\n let nextSelections: BundleSelectionState;\n if (nextQty <= 0) {\n const { [merchandiseId]: _, ...rest } = prev.selections;\n nextSelections = rest;\n } else if (prevQty === nextQty) {\n nextSelections = prev.selections;\n } else {\n nextSelections = { ...prev.selections, [merchandiseId]: nextQty };\n }\n\n // order\n let nextOrder = prev.order;\n if (delta > 0) {\n // Add N items to the end.\n nextOrder = [...prev.order, ...Array.from({ length: delta }, () => merchandiseId)];\n } else if (delta < 0) {\n // Remove N most-recent occurrences of this variant.\n let remainingToRemove = -delta;\n const keptReversed: string[] = [];\n for (let i = prev.order.length - 1; i >= 0; i--) {\n const id = prev.order[i];\n if (id === merchandiseId && remainingToRemove > 0) {\n remainingToRemove--;\n continue;\n }\n keptReversed.push(id);\n }\n keptReversed.reverse();\n nextOrder = keptReversed;\n }\n\n if (nextSelections === prev.selections && nextOrder === prev.order) return prev;\n\n // Track variant selection changed event\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"VARIANT_SELECTION_CHANGED\",\n shop,\n anonymousUserId,\n before: { ...prev.selections },\n after: { ...nextSelections },\n timestamp: new Date().toISOString(),\n });\n } catch {\n // Silently fail - analytics should not break functionality\n }\n }\n\n return { selections: nextSelections, order: nextOrder };\n });\n }, [maxBundleSize, eligibleVariantIdsSet, analyticsEndpoint, shop]);\n\n const clearSelections = useCallback(() => setSelectionsState({ selections: {}, order: [] }), []);\n\n const selections = selectionsState.selections;\n const selectionOrder = selectionsState.order;\n\n const bundleSize = useMemo(() => Object.values(selections).reduce((sum, q) => sum + (q || 0), 0), [selections]);\n\n const minRequired = useMemo(() => {\n const rules = config?.rules ?? [];\n const min = rules.length ? Math.min(...rules.map((r) => r.minBundleSize)) : 2;\n return Number.isFinite(min) && min > 0 ? min : 2;\n }, [config]);\n\n const canSubmit = useMemo(() => {\n if (loading || submitting) return false;\n if (error) return false;\n if (!config?.isActive) return false;\n if (bundleSize < minRequired) return false;\n return true;\n }, [bundleSize, config?.isActive, error, loading, minRequired, submitting]);\n\n // Shared logic for adding bundle to cart\n const performCartAddition = useCallback(async (options?: { onComplete?: () => void; checkout?: boolean }) => {\n if (!canSubmit || !config) return;\n\n const bundleId = safeRandomUUID();\n const bundleTitle = (config.title ?? \"\").trim().slice(0, 255);\n const lines = Object.entries(selections)\n .map(([merchandiseId, quantity]) => ({ merchandiseId, quantity: clampQty(quantity) }))\n .filter((l) => l.quantity > 0)\n .filter((l) => eligibleVariantIdsSet.has(l.merchandiseId)) // Filter out ineligible variants\n .map((l) => ({\n merchandiseId: l.merchandiseId,\n quantity: l.quantity,\n attributes: [\n { key: BundleLineAttributeKeys.bundleId, value: bundleId },\n { key: BundleLineAttributeKeys.bundleConfig, value: configHandle },\n { key: BundleLineAttributeKeys.bundleSource, value: \"bundle_builder\" },\n ...(bundleTitle ? [{ key: BundleLineAttributeKeys.bundleTitle, value: bundleTitle }] : []),\n ],\n }));\n\n if (!lines.length) return;\n\n // Calculate pricing and discount info for analytics\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let grossPrice = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n grossPrice += price * q;\n }\n grossPrice = Math.round(grossPrice * 100) / 100;\n\n // Find applied discount rule\n const rulesSorted = [...(config.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n let appliedRule: (typeof rulesSorted)[number] | null = null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) appliedRule = r;\n }\n\n const appliedDiscountPercent = appliedRule\n ? (() => {\n const pct = Number.parseFloat(appliedRule!.discountPercent);\n return Number.isFinite(pct) && pct > 0 ? pct : null;\n })()\n : null;\n\n const discountedPrice = appliedDiscountPercent\n ? Math.round(grossPrice * (1 - appliedDiscountPercent / 100) * 100) / 100\n : grossPrice;\n const discountedAmount = grossPrice - discountedPrice;\n\n const productVariantIds = lines.map((l) => l.merchandiseId);\n const discountThresholdIdentifier = appliedRule?.handle ?? \"\";\n const discountLabel = appliedRule?.label?.trim() || \"\";\n\n setSubmitting(true);\n try {\n if (options?.checkout) {\n await cartAdapter.linesAddForCheckout(lines);\n } else {\n await cartAdapter.linesAdd(lines);\n }\n\n // Track bundle added to basket event\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"BUNDLE_ADDED_TO_BASKET\",\n shop,\n anonymousUserId,\n bundleId,\n productVariantIds,\n grossPrice,\n discountedPrice,\n currency: currencyCode ?? undefined,\n discountThresholdIdentifier,\n discountLabel,\n discountPercentage: appliedDiscountPercent,\n discountedAmount,\n timestamp: new Date().toISOString(),\n });\n } catch {\n // Silently fail - analytics should not break functionality\n }\n }\n\n clearSelections();\n close();\n // Call the completion callback\n options?.onComplete?.();\n } finally {\n setSubmitting(false);\n }\n }, [\n canSubmit,\n cartAdapter,\n clearSelections,\n close,\n config,\n configHandle,\n currencyCode,\n selections,\n eligibleVariantIdsSet,\n eligibleVariants,\n bundleSize,\n analyticsEndpoint,\n shop,\n ]);\n\n const submit = useCallback(async () => {\n await performCartAddition(\n {\n onComplete: () => {\n cartAdapter.openCartUI?.();\n }\n }\n );\n }, [performCartAddition, cartAdapter]);\n\n const submitAndCheckout = useCallback(async () => {\n await performCartAddition(\n {\n checkout: true,\n onComplete: () => {\n cartAdapter.navigateToCheckout?.();\n }\n }\n );\n }, [performCartAddition, cartAdapter]);\n\n const value: BundleBuilderContextValue = useMemo(\n () => ({\n isOpen,\n open,\n close,\n toggle,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n setQuantity,\n clearSelections,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n }),\n [\n isOpen,\n open,\n close,\n toggle,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n setQuantity,\n clearSelections,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n ],\n );\n\n return <BundleBuilderContext.Provider value={value}>{children}</BundleBuilderContext.Provider>;\n}\n\n","import { useContext } from \"react\";\nimport { BundleBuilderContext } from \"../context/BundleProvider\";\n\nexport function useBundleBuilder() {\n const ctx = useContext(BundleBuilderContext);\n if (!ctx) {\n throw new Error(\"useBundleBuilder must be used within <BundleProvider />\");\n }\n return ctx;\n}\n\n","import { useBundleBuilder } from \"./useBundleBuilder\";\n\nexport type BundleBuilderDrawerControls = {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n};\n\n/**\n * Convenience hook for controlling the drawer (alternative to using <BundleButton />).\n * Must be used within <BundleProvider />.\n */\nexport function useBundleBuilderDrawer(): BundleBuilderDrawerControls {\n const { isOpen, open, close, toggle } = useBundleBuilder();\n return { isOpen, open, close, toggle };\n}\n\n","import React from \"react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport styles from \"./BundleButton.module.css\";\n\nexport type BundleButtonProps = {\n children?: React.ReactNode;\n className?: string;\n};\n\nexport function BundleButton(props: BundleButtonProps) {\n const { toggle } = useBundleBuilder();\n return (\n <button\n type=\"button\"\n onClick={toggle}\n className={[styles.button, props.className].filter(Boolean).join(\" \")}\n >\n {props.children ?? \"Build a bundle\"}\n </button>\n );\n}\n\n","'use strict';\n\n// t: current time, b: beginning value, _c: final value, d: total duration\nvar tweenFunctions = {\n linear: function(t, b, _c, d) {\n var c = _c - b;\n return c * t / d + b;\n },\n easeInQuad: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t + b;\n },\n easeOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (t /= d) * (t - 2) + b;\n },\n easeInOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t + b;\n } else {\n return -c / 2 * ((--t) * (t - 2) - 1) + b;\n }\n },\n easeInCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t + b;\n },\n easeOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t + 1) + b;\n },\n easeInOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t + 2) + b;\n }\n },\n easeInQuart: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t + b;\n },\n easeOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n },\n easeInOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t + b;\n } else {\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n }\n },\n easeInQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t * t + b;\n },\n easeOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n },\n easeInOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n }\n },\n easeInSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n },\n easeOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\n },\n easeInOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n },\n easeInExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;\n },\n easeOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;\n },\n easeInOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n } else {\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n }\n },\n easeInCirc: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n },\n easeOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n },\n easeInOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n } else {\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n }\n },\n easeInElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n },\n easeOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;\n },\n easeInOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d / 2) === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n if (t < 1) {\n return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n } else {\n return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * 0.5 + c + b;\n }\n },\n easeInBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n },\n easeOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n },\n easeInOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n } else {\n return c / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n }\n },\n easeInBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n v = tweenFunctions.easeOutBounce(d - t, 0, c, d);\n return c - v + b;\n },\n easeOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n }\n },\n easeInOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n if (t < d / 2) {\n v = tweenFunctions.easeInBounce(t * 2, 0, c, d);\n return v * 0.5 + b;\n } else {\n v = tweenFunctions.easeOutBounce(t * 2 - d, 0, c, d);\n return v * 0.5 + c * 0.5 + b;\n }\n }\n};\n\nmodule.exports = tweenFunctions;\n","import { jsx } from 'react/jsx-runtime';\nimport React from 'react';\nimport * as tweens from 'tween-functions';\n\nfunction degreesToRads(degrees) {\n return (degrees * Math.PI) / 180;\n}\nfunction randomRange(min, max) {\n return min + Math.random() * (max - min);\n}\nfunction randomInt(min, max) {\n return Math.floor(min + Math.random() * (max - min + 1));\n}\n\nvar ParticleShape;\n(function (ParticleShape) {\n ParticleShape[ParticleShape[\"Circle\"] = 0] = \"Circle\";\n ParticleShape[ParticleShape[\"Square\"] = 1] = \"Square\";\n ParticleShape[ParticleShape[\"Strip\"] = 2] = \"Strip\";\n})(ParticleShape || (ParticleShape = {}));\nvar RotationDirection;\n(function (RotationDirection) {\n RotationDirection[RotationDirection[\"Positive\"] = 1] = \"Positive\";\n RotationDirection[RotationDirection[\"Negative\"] = -1] = \"Negative\";\n})(RotationDirection || (RotationDirection = {}));\nconst DEFAULT_FRAME_TIME = 1000 / 60;\nclass Particle {\n constructor(context, getOptions, x, y) {\n this.getOptions = getOptions;\n const { colors, initialVelocityX, initialVelocityY } = this.getOptions();\n this.context = context;\n this.x = x;\n this.y = y;\n this.w = randomRange(5, 20);\n this.h = randomRange(5, 20);\n this.radius = randomRange(5, 10);\n this.vx =\n typeof initialVelocityX === 'number'\n ? randomRange(-initialVelocityX, initialVelocityX)\n : randomRange(initialVelocityX.min, initialVelocityX.max);\n this.vy =\n typeof initialVelocityY === 'number'\n ? randomRange(-initialVelocityY, 0)\n : randomRange(initialVelocityY.min, initialVelocityY.max);\n this.shape = randomInt(0, 2);\n this.angle = degreesToRads(randomRange(0, 360));\n this.angularSpin = randomRange(-0.2, 0.2);\n this.color = colors[Math.floor(Math.random() * colors.length)];\n this.rotateY = randomRange(0, 1);\n this.rotationDirection = randomRange(0, 1)\n ? RotationDirection.Positive\n : RotationDirection.Negative;\n }\n update(elapsed) {\n const { gravity, wind, friction, opacity, drawShape } = this.getOptions();\n const frameTimeMultiplier = elapsed / DEFAULT_FRAME_TIME;\n this.x += this.vx * frameTimeMultiplier;\n this.y += this.vy * frameTimeMultiplier;\n this.vy += gravity * frameTimeMultiplier;\n this.vx += wind * frameTimeMultiplier;\n this.vx *= friction ** frameTimeMultiplier;\n this.vy *= friction ** frameTimeMultiplier;\n if (this.rotateY >= 1 &&\n this.rotationDirection === RotationDirection.Positive) {\n this.rotationDirection = RotationDirection.Negative;\n }\n else if (this.rotateY <= -1 &&\n this.rotationDirection === RotationDirection.Negative) {\n this.rotationDirection = RotationDirection.Positive;\n }\n const rotateDelta = 0.1 * this.rotationDirection * frameTimeMultiplier;\n this.rotateY += rotateDelta;\n this.angle += this.angularSpin;\n this.context.save();\n this.context.translate(this.x, this.y);\n this.context.rotate(this.angle);\n this.context.scale(1, this.rotateY);\n this.context.rotate(this.angle);\n this.context.beginPath();\n this.context.fillStyle = this.color;\n this.context.strokeStyle = this.color;\n this.context.globalAlpha = opacity;\n this.context.lineCap = 'round';\n this.context.lineWidth = 2;\n if (drawShape && typeof drawShape === 'function') {\n drawShape.call(this, this.context);\n }\n else {\n switch (this.shape) {\n case ParticleShape.Circle: {\n this.context.beginPath();\n this.context.arc(0, 0, this.radius, 0, 2 * Math.PI);\n this.context.fill();\n break;\n }\n case ParticleShape.Square: {\n this.context.fillRect(-this.w / 2, -this.h / 2, this.w, this.h);\n break;\n }\n case ParticleShape.Strip: {\n this.context.fillRect(-this.w / 6, -this.h / 2, this.w / 3, this.h);\n break;\n }\n }\n }\n this.context.closePath();\n this.context.restore();\n }\n}\n\nclass ParticleGenerator {\n constructor(canvas, getOptions) {\n this.x = 0;\n this.y = 0;\n this.w = 0;\n this.h = 0;\n this.lastNumberOfPieces = 0;\n this.tweenProgress = 0;\n this.tweenFrom = 0;\n this.particles = [];\n this.particlesGenerated = 0;\n this.removeParticleAt = (i) => {\n this.particles.splice(i, 1);\n };\n this.getParticle = () => {\n const newParticleX = randomRange(this.x, this.w + this.x);\n const newParticleY = randomRange(this.y, this.h + this.y);\n return new Particle(this.context, this.getOptions, newParticleX, newParticleY);\n };\n this.animate = (elapsed) => {\n const { canvas, context, particlesGenerated, lastNumberOfPieces } = this;\n const { run, recycle, numberOfPieces, debug, tweenFunction, tweenDuration, } = this.getOptions();\n if (!run) {\n return false;\n }\n const nP = this.particles.length;\n const activeCount = recycle ? nP : particlesGenerated;\n // Initial population\n if (activeCount < numberOfPieces) {\n // Use the numberOfPieces prop as a key to reset the easing timing\n if (lastNumberOfPieces !== numberOfPieces) {\n this.tweenProgress = 0;\n this.tweenFrom = activeCount;\n this.lastNumberOfPieces = numberOfPieces;\n }\n // Clamp tweenProgress between 0 and tweenDuration\n this.tweenProgress = Math.min(tweenDuration, Math.max(0, this.tweenProgress + elapsed));\n const tweenedVal = tweenFunction(this.tweenProgress, this.tweenFrom, numberOfPieces, tweenDuration);\n const numToAdd = Math.round(tweenedVal - activeCount);\n for (let i = 0; i < numToAdd; i++) {\n this.particles.push(this.getParticle());\n }\n this.particlesGenerated += numToAdd;\n }\n if (debug) {\n // Draw debug text\n context.font = '12px sans-serif';\n context.fillStyle = '#333';\n context.textAlign = 'right';\n context.fillText(`Particles: ${nP}`, canvas.width - 10, canvas.height - 20);\n }\n // Maintain the population, iterating backwards to prevent issues when removing particles\n for (let i = this.particles.length - 1; i >= 0; i--) {\n const p = this.particles[i];\n // Update each particle's position\n p.update(elapsed);\n // Prune the off-canvas particles\n if (p.y > canvas.height ||\n p.y < -100 ||\n p.x > canvas.width + 100 ||\n p.x < -100) {\n if (recycle && activeCount <= numberOfPieces) {\n // Replace the particle with a brand new one\n this.particles[i] = this.getParticle();\n }\n else {\n this.removeParticleAt(i);\n }\n }\n }\n return nP > 0 || activeCount < numberOfPieces;\n };\n this.canvas = canvas;\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.context = ctx;\n this.getOptions = getOptions;\n }\n}\n\nconst confettiDefaults = {\n width: typeof window !== 'undefined' ? window.innerWidth : 300,\n height: typeof window !== 'undefined' ? window.innerHeight : 200,\n numberOfPieces: 200,\n friction: 0.99,\n wind: 0,\n gravity: 0.1,\n initialVelocityX: 4,\n initialVelocityY: 10,\n colors: [\n '#f44336',\n '#e91e63',\n '#9c27b0',\n '#673ab7',\n '#3f51b5',\n '#2196f3',\n '#03a9f4',\n '#00bcd4',\n '#009688',\n '#4CAF50',\n '#8BC34A',\n '#CDDC39',\n '#FFEB3B',\n '#FFC107',\n '#FF9800',\n '#FF5722',\n '#795548',\n ],\n opacity: 1.0,\n debug: false,\n tweenFunction: tweens.easeInOutQuad,\n tweenDuration: 5000,\n recycle: true,\n run: true,\n};\nclass Confetti {\n constructor(canvas, opts) {\n this.lastFrameTime = 0;\n this.setOptionsWithDefaults = (opts) => {\n const computedConfettiDefaults = {\n confettiSource: {\n x: 0,\n y: 0,\n w: this.canvas.width,\n h: 0,\n },\n };\n this._options = {\n ...computedConfettiDefaults,\n ...confettiDefaults,\n ...opts,\n };\n Object.assign(this, opts.confettiSource);\n };\n this.update = (timestamp = 0) => {\n const { options: { run, onConfettiComplete, frameRate }, canvas, context, } = this;\n // Cap elapsed time to 50ms to prevent large time steps\n const elapsed = Math.min(timestamp - this.lastFrameTime, 50);\n // Throttle the frame rate if set\n if (frameRate && elapsed < 1000 / frameRate) {\n this.rafId = requestAnimationFrame(this.update);\n return;\n }\n this.lastFrameTime = timestamp - (frameRate ? elapsed % frameRate : 0);\n if (run) {\n context.fillStyle = 'white';\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n if (this.generator.animate(elapsed)) {\n this.rafId = requestAnimationFrame(this.update);\n }\n else {\n if (onConfettiComplete &&\n typeof onConfettiComplete === 'function' &&\n this.generator.particlesGenerated > 0) {\n onConfettiComplete.call(this, this);\n }\n this._options.run = false;\n }\n };\n this.reset = () => {\n if (this.generator && this.generator.particlesGenerated > 0) {\n this.generator.particlesGenerated = 0;\n this.generator.particles = [];\n this.generator.lastNumberOfPieces = 0;\n }\n };\n this.stop = () => {\n this.options = { run: false };\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = undefined;\n }\n };\n this.canvas = canvas;\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.context = ctx;\n this.generator = new ParticleGenerator(this.canvas, () => this.options);\n this.options = opts;\n this.update();\n }\n get options() {\n return this._options;\n }\n set options(opts) {\n const lastRunState = this._options?.run;\n const lastRecycleState = this._options?.recycle;\n this.setOptionsWithDefaults(opts);\n if (this.generator) {\n Object.assign(this.generator, this.options.confettiSource);\n if (typeof opts.recycle === 'boolean' &&\n opts.recycle &&\n lastRecycleState === false) {\n this.generator.lastNumberOfPieces = this.generator.particles.length;\n }\n }\n if (typeof opts.run === 'boolean' && opts.run && lastRunState === false) {\n this.update();\n }\n }\n}\n\nconst ref = React.createRef();\nclass ReactConfettiInternal extends React.Component {\n constructor(props) {\n super(props);\n this.canvas = React.createRef();\n this.canvas = props.canvasRef || ref;\n }\n componentDidMount() {\n if (this.canvas.current) {\n const opts = extractCanvasProps(this.props)[0];\n this.confetti = new Confetti(this.canvas.current, opts);\n }\n }\n componentDidUpdate() {\n const confettiOptions = extractCanvasProps(this.props)[0];\n if (this.confetti) {\n this.confetti.options = confettiOptions;\n }\n }\n componentWillUnmount() {\n if (this.confetti) {\n this.confetti.stop();\n }\n this.confetti = undefined;\n }\n render() {\n const [confettiOptions, passedProps] = extractCanvasProps(this.props);\n const canvasStyles = {\n zIndex: 2,\n position: 'absolute',\n pointerEvents: 'none',\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n ...passedProps.style,\n };\n return (jsx(\"canvas\", { width: confettiOptions.width, height: confettiOptions.height, ref: this.canvas, ...passedProps, style: canvasStyles }));\n }\n}\nReactConfettiInternal.defaultProps = {\n ...confettiDefaults,\n};\nReactConfettiInternal.displayName = 'ReactConfetti';\nfunction extractCanvasProps(props) {\n const confettiOptions = {};\n const refs = {};\n const rest = {};\n const confettiOptionKeys = [\n ...Object.keys(confettiDefaults),\n 'confettiSource',\n 'drawShape',\n 'onConfettiComplete',\n 'frameRate',\n ];\n const refProps = ['canvasRef'];\n for (const prop in props) {\n const val = props[prop];\n if (confettiOptionKeys.includes(prop)) {\n confettiOptions[prop] = val;\n }\n else if (refProps.includes(prop)) {\n refProps[prop] = val;\n }\n else {\n rest[prop] = val;\n }\n }\n return [confettiOptions, rest, refs];\n}\nconst ReactConfetti = React.forwardRef((props, ref) => jsx(ReactConfettiInternal, { canvasRef: ref, ...props }));\n\nexport { ReactConfetti as default };\n//# sourceMappingURL=react-confetti.mjs.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n};\n\nexport { hasA11yProp, mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses, hasA11yProp } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.js.map\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport Confetti from \"react-confetti\";\nimport { Link, Search } from \"lucide-react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport styles from \"./BundleBuilderDrawer.module.css\";\n\nexport type BundleBuilderDrawerProps = {\n className?: string;\n};\n\nexport function BundleBuilderDrawer(props: BundleBuilderDrawerProps) {\n const {\n isOpen,\n close,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n setQuantity,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n } = useBundleBuilder();\n\n const [isSearchOpen, setIsSearchOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const searchInputRef = useRef<HTMLInputElement | null>(null);\n const footerRef = useRef<HTMLElement | null>(null);\n const celebrationChipRef = useRef<HTMLDivElement | null>(null);\n\n const [windowSize, setWindowSize] = useState<{ width: number; height: number }>(() => {\n if (typeof window === \"undefined\") return { width: 0, height: 0 };\n return { width: window.innerWidth, height: window.innerHeight };\n });\n\n const [confettiKey, setConfettiKey] = useState(0);\n const [confettiSource, setConfettiSource] = useState<{ x: number; y: number; w: number; h: number } | null>(null);\n const [isConfettiActive, setIsConfettiActive] = useState(false);\n const confettiTimerRef = useRef<number | null>(null);\n const prevBundleSizeForConfettiRef = useRef<number>(bundleSize);\n const confettiSettleMs = 7000;\n\n const [celebrationKey, setCelebrationKey] = useState(0);\n const [celebrationText, setCelebrationText] = useState<string | null>(null);\n const [isCelebrationActive, setIsCelebrationActive] = useState(false);\n const celebrationTimerRef = useRef<number | null>(null);\n const celebrationDurationMs = 2800;\n\n const formatPercent0dp = (value: string) => {\n const n = Number.parseFloat(value);\n if (!Number.isFinite(n)) return value;\n return String(Math.round(n));\n };\n\n const formatVariantOptions = (selectedOptions: Array<{ name: string; value: string }> | null | undefined) => {\n const opts = (selectedOptions ?? []).filter((o) => {\n const name = o?.name?.trim();\n const value = o?.value?.trim();\n if (!name || !value) return false;\n if (name.toLowerCase() === \"title\") return false;\n return true;\n });\n if (!opts.length) return null;\n return opts.map((o) => `${o.name}: ${o.value}`).join(\" · \");\n };\n\n const getVariantPrimaryName = (v: (typeof eligibleVariants)[number]) => {\n return v.product?.title ?? v.displayName ?? v.title;\n };\n\n const getVariantA11yLabel = (v: (typeof eligibleVariants)[number]) => {\n const name = getVariantPrimaryName(v);\n const opts = formatVariantOptions(v.selectedOptions);\n return [name, opts].filter(Boolean).join(\" — \");\n };\n\n const [isMounted, setIsMounted] = useState(isOpen);\n const closeTimerRef = useRef<number | null>(null);\n\n const formatMoney = (amount: string) => {\n const n = Number(amount);\n if (!Number.isFinite(n)) return amount;\n\n if (currencyCode) {\n try {\n return new Intl.NumberFormat(undefined, { style: \"currency\", currency: currencyCode }).format(n);\n } catch {\n // ignore and fall through\n }\n }\n\n return `$${n.toFixed(2)}`;\n };\n\n const title = config?.title?.trim() || \"Build your bundle\";\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n const isAtMaxBundleSize = bundleSize >= maxBundleSize;\n\n const sorted = useMemo(() => {\n return [...eligibleVariants].sort((a, b) => a.displayName.localeCompare(b.displayName));\n }, [eligibleVariants]);\n\n const filteredVariants = useMemo(() => {\n const q = searchQuery.trim().toLowerCase();\n if (!q) return sorted;\n\n const tokens = q.split(/\\s+/).filter(Boolean);\n const matches = (v: (typeof sorted)[number]) => {\n const parts: string[] = [];\n parts.push(v.displayName);\n if (v.product?.title) parts.push(v.product.title);\n for (const o of v.selectedOptions ?? []) {\n parts.push(o.name);\n parts.push(o.value);\n }\n const haystack = parts.join(\" \").toLowerCase();\n return tokens.every((t) => haystack.includes(t));\n };\n\n return sorted.filter(matches);\n }, [searchQuery, sorted]);\n\n const rulesSorted = useMemo(() => {\n return [...(config?.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n }, [config?.rules]);\n\n const itemsRemaining = useMemo(() => Math.max(0, minRequired - bundleSize), [bundleSize, minRequired]);\n\n const appliedRule = useMemo(() => {\n let best = null as (typeof rulesSorted)[number] | null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) best = r;\n }\n return best;\n }, [bundleSize, rulesSorted]);\n\n const appliedDiscountPercent = useMemo(() => {\n if (!appliedRule) return null;\n const pct = Number.parseFloat(appliedRule.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [appliedRule]);\n\n const minRuleDiscountPercent = useMemo(() => {\n const r = rulesSorted[0];\n if (!r) return null;\n const pct = Number.parseFloat(r.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [rulesSorted]);\n\n const badgeDiscountPercent = appliedDiscountPercent ?? minRuleDiscountPercent;\n\n const subtotal = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let total = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n total += price * q;\n }\n // Keep cents stable for display.\n return Math.round(total * 100) / 100;\n }, [eligibleVariants, selections]);\n\n const discountedTotal = useMemo(() => {\n if (!appliedDiscountPercent) return subtotal;\n const total = subtotal * (1 - appliedDiscountPercent / 100);\n return Math.round(total * 100) / 100;\n }, [appliedDiscountPercent, subtotal]);\n\n const maxRuleSize = useMemo(() => {\n if (!rulesSorted.length) return 0;\n return Math.max(...rulesSorted.map((r) => r.minBundleSize));\n }, [rulesSorted]);\n\n const filledVariants = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n return selectionOrder\n .map((variantId) => byId.get(variantId))\n .filter((v): v is (typeof eligibleVariants)[number] => Boolean(v));\n }, [eligibleVariants, selectionOrder]);\n\n const thresholdByIndex = useMemo(() => {\n // Slot index (0-based) => rule that becomes active at that slot.\n const map = new Map<number, { discountPercent: string; minBundleSize: number; label: string }>();\n for (const r of rulesSorted) {\n const idx = Math.max(0, r.minBundleSize - 1);\n map.set(idx, {\n discountPercent: r.discountPercent,\n minBundleSize: r.minBundleSize,\n label: r.label?.trim() || `Buy ${r.minBundleSize}+`,\n });\n }\n return map;\n }, [rulesSorted]);\n\n const slotCount = useMemo(() => {\n // Placeholders show until highest tier; if user adds more, extend (scroll).\n return Math.max(maxRuleSize || minRequired, filledVariants.length);\n }, [filledVariants.length, maxRuleSize, minRequired]);\n\n // Track animation state for dual button split animation\n const [isDualButtonAnimationLoaded, setIsDualButtonAnimationLoaded] = useState(true);\n const prevItemsRemainingRef = useRef(itemsRemaining);\n\n // Trigger animation when itemsRemaining changes from > 0 to 0 in add_to_cart_checkout mode\n useEffect(() => {\n //const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n const buttonMode = \"add_to_cart_checkout\";\n if (buttonMode === \"add_to_cart_checkout\") {\n const wasPositive = prevItemsRemainingRef.current > 0;\n const isNowZero = itemsRemaining === 0;\n\n if (wasPositive && isNowZero) {\n // Trigger animation\n setIsDualButtonAnimationLoaded(false);\n } else {\n // Reset animation\n setIsDualButtonAnimationLoaded(true);\n }\n }\n prevItemsRemainingRef.current = itemsRemaining;\n }, [itemsRemaining, config?.ctaButtonMode]);\n\n const panelRef = useRef<HTMLDivElement | null>(null);\n const bodyRef = useRef<HTMLDivElement | null>(null);\n const boxSummaryWindowRef = useRef<HTMLDivElement | null>(null);\n const prevBundleSizeRef = useRef<number>(bundleSize);\n\n const scrollVariantRowIntoView = (variantId: string) => {\n const container = bodyRef.current;\n if (!container) return;\n const row = container.querySelector<HTMLElement>(`[data-variant-row=\"${variantId}\"]`);\n if (!row) return;\n\n const c = container.getBoundingClientRect();\n const r = row.getBoundingClientRect();\n const padding = 8;\n const isFullyVisible = r.top >= c.top + padding && r.bottom <= c.bottom - padding;\n if (isFullyVisible) return;\n\n const maxTop = Math.max(0, container.scrollHeight - container.clientHeight);\n const rowCenterOffset = (r.top - c.top) + r.height / 2;\n const targetTop = container.scrollTop + rowCenterOffset - container.clientHeight / 2;\n const nextTop = Math.min(maxTop, Math.max(0, targetTop));\n container.scrollTo({ top: nextTop, behavior: \"smooth\" });\n };\n\n useEffect(() => {\n if (!isOpen) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") close();\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [close, isOpen]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = () => setWindowSize({ width: window.innerWidth, height: window.innerHeight });\n onResize();\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n useEffect(() => {\n if (closeTimerRef.current != null) {\n window.clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n\n if (isOpen) {\n setIsMounted(true);\n return;\n }\n\n // Keep mounted long enough to play exit animation.\n closeTimerRef.current = window.setTimeout(() => {\n setIsMounted(false);\n closeTimerRef.current = null;\n }, 220);\n }, [isOpen]);\n\n useEffect(() => {\n return () => {\n if (closeTimerRef.current != null) window.clearTimeout(closeTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n return () => {\n if (confettiTimerRef.current != null) window.clearTimeout(confettiTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n return () => {\n if (celebrationTimerRef.current != null) window.clearTimeout(celebrationTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n if (!isOpen) return;\n if (!isSearchOpen) return;\n const raf = requestAnimationFrame(() => searchInputRef.current?.focus());\n return () => cancelAnimationFrame(raf);\n }, [isOpen, isSearchOpen]);\n\n useEffect(() => {\n const prev = prevBundleSizeRef.current;\n prevBundleSizeRef.current = bundleSize;\n\n // Only respond to adds (qty increases).\n if (bundleSize <= prev) return;\n\n const container = boxSummaryWindowRef.current;\n if (!container) return;\n\n const hitThreshold = rulesSorted.some((r) => r.minBundleSize === bundleSize);\n const nextThreshold = rulesSorted.find((r) => r.minBundleSize > bundleSize);\n\n // When hitting a threshold, try to reveal the NEXT threshold (aligned right) if it's off-screen to the right.\n // If no remaining thresholds, scroll the newest added item into view.\n const targetIdx = nextThreshold && hitThreshold ? nextThreshold.minBundleSize - 1 : !nextThreshold ? bundleSize - 1 : null;\n if (targetIdx == null || targetIdx < 0) return;\n\n const raf = requestAnimationFrame(() => {\n const el = container.querySelector<HTMLElement>(`[data-box-slot=\"${targetIdx}\"]`);\n if (!el) return;\n\n const containerRect = container.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n const deltaRight = elRect.right - containerRect.right;\n\n // Only scroll rightward when the target is off-screen to the right.\n if (deltaRight <= 1) return;\n\n const maxLeft = Math.max(0, container.scrollWidth - container.clientWidth);\n const nextLeft = Math.min(maxLeft, Math.max(0, container.scrollLeft + deltaRight));\n container.scrollTo({ left: nextLeft, behavior: \"smooth\" });\n });\n\n return () => cancelAnimationFrame(raf);\n }, [bundleSize, rulesSorted]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const prev = prevBundleSizeForConfettiRef.current;\n prevBundleSizeForConfettiRef.current = bundleSize;\n\n // Only respond to adds (qty increases).\n if (bundleSize <= prev) return;\n\n // Trigger when crossing an exact configured threshold (e.g. 2 items, 3 items, etc.).\n const hitRule = rulesSorted.find((r) => r.minBundleSize === bundleSize);\n if (!hitRule) return;\n\n // Celebration chip (centered)\n setCelebrationText(`You received a ${formatPercent0dp(hitRule.discountPercent)}% discount!`);\n setCelebrationKey((k) => k + 1);\n setIsCelebrationActive(true);\n if (celebrationTimerRef.current != null) window.clearTimeout(celebrationTimerRef.current);\n celebrationTimerRef.current = window.setTimeout(() => {\n setIsCelebrationActive(false);\n celebrationTimerRef.current = null;\n }, celebrationDurationMs);\n }, [bundleSize, isOpen, rulesSorted]);\n\n useEffect(() => {\n if (!isOpen) return;\n if (!isCelebrationActive) return;\n if (!celebrationText) return;\n\n // After the chip renders, measure its rect and shoot confetti from it.\n const raf = requestAnimationFrame(() => {\n const chipEl = celebrationChipRef.current;\n const rect = chipEl?.getBoundingClientRect();\n\n // Fallback: use the drawer panel center if chip rect isn't available yet.\n const panelRect = panelRef.current?.getBoundingClientRect();\n const originX = rect ? rect.left + rect.width / 2 : panelRect ? panelRect.left + panelRect.width / 2 : window.innerWidth / 2;\n const originY = rect ? rect.top + rect.height / 2 : panelRect ? panelRect.top + panelRect.height / 2 : window.innerHeight / 2;\n\n const source = {\n x: originX - 2,\n y: originY - 2,\n w: 4,\n h: 4,\n };\n\n setConfettiSource(source);\n setConfettiKey((k) => k + 1);\n setIsConfettiActive(true);\n\n if (confettiTimerRef.current != null) window.clearTimeout(confettiTimerRef.current);\n confettiTimerRef.current = window.setTimeout(() => {\n setIsConfettiActive(false);\n confettiTimerRef.current = null;\n }, confettiSettleMs);\n });\n\n return () => cancelAnimationFrame(raf);\n }, [celebrationKey, celebrationText, confettiSettleMs, isCelebrationActive, isOpen]);\n\n useEffect(() => {\n if (!isOpen) return;\n panelRef.current?.focus();\n }, [isOpen]);\n\n if (!isMounted) return null;\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Bundle builder\"\n className={[styles.backdrop, isOpen ? styles.backdropOpen : styles.backdropClosed, props.className].filter(Boolean).join(\" \")}\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) close();\n }}\n >\n {isConfettiActive && confettiSource && windowSize.width > 0 && windowSize.height > 0 ? (\n <Confetti\n key={confettiKey}\n width={windowSize.width}\n height={windowSize.height}\n confettiSource={confettiSource}\n colors={[\n \"#2563eb\", // blue-600\n \"#3b82f6\", // blue-500\n \"#60a5fa\", // blue-400\n \"#93c5fd\", // blue-300\n \"#bae6fd\", // blue-200\n \"#e0f2fe\" // blue-100\n ]}\n recycle={false}\n numberOfPieces={70}\n tweenDuration={100}\n gravity={0.45}\n initialVelocityY={{ min: -10, max: -30 }}\n initialVelocityX={{ min: -6, max: 6 }}\n style={{ position: \"fixed\", inset: 0, pointerEvents: \"none\", zIndex: 2147483646 }}\n />\n ) : null}\n <aside ref={panelRef} className={[styles.panel, isOpen ? styles.panelOpen : styles.panelClosed].filter(Boolean).join(\" \")} tabIndex={-1}>\n {isCelebrationActive && celebrationText ? (\n <div className={styles.celebrationOverlay} aria-hidden=\"true\">\n <div key={celebrationKey} ref={celebrationChipRef} className={styles.celebrationChip}>\n {celebrationText}\n </div>\n </div>\n ) : null}\n <header className={[styles.header, isSearchOpen ? styles.headerSearchOpen : null].filter(Boolean).join(\" \")}>\n <button\n type=\"button\"\n className={styles.searchIconButton}\n aria-label={isSearchOpen ? \"Search (expanded)\" : \"Search\"}\n aria-expanded={isSearchOpen}\n onClick={() => {\n setIsSearchOpen(true);\n }}\n >\n <Search size={18} aria-hidden=\"true\" />\n </button>\n\n <div className={styles.headerCenter}>\n <div className={styles.headerTitleWrap} aria-hidden={isSearchOpen}>\n <h2 className={styles.title}>{title}</h2>\n </div>\n\n <div className={styles.headerSearchWrap} aria-hidden={!isSearchOpen}>\n <div className={styles.searchBar}>\n <input\n ref={searchInputRef}\n className={styles.searchInput}\n type=\"search\"\n value={searchQuery}\n placeholder=\"Search\"\n onChange={(e) => setSearchQuery(e.target.value)}\n onBlur={() => {\n if (searchQuery.trim() === \"\") setIsSearchOpen(false);\n }}\n />\n {searchQuery.trim() ? (\n <button\n type=\"button\"\n className={styles.searchClearButton}\n onMouseDown={(e) => {\n // Prevent input blur so the bar stays open and focused.\n e.preventDefault();\n }}\n onClick={() => {\n setSearchQuery(\"\");\n searchInputRef.current?.focus();\n }}\n aria-label=\"Clear search\"\n >\n Clear\n </button>\n ) : null}\n </div>\n </div>\n </div>\n\n <button type=\"button\" onClick={close} disabled={submitting} className={styles.closeButton} aria-label=\"Close\">\n ×\n </button>\n </header>\n\n <div className={styles.body} ref={bodyRef}>\n {loading ? <p className={styles.muted}>Loading…</p> : null}\n {error ? <p className={styles.error}>{error}</p> : null}\n {!loading && config && !config.isActive ? <p className={styles.error}>Bundles are not active.</p> : null}\n\n <div className={styles.variants}>\n <ul className={styles.variantList}>\n {filteredVariants.map((v) => {\n const qty = selections[v.id] ?? 0;\n const variantPrimaryName = getVariantPrimaryName(v);\n const variantOptionText = formatVariantOptions(v.selectedOptions);\n const variantA11y = getVariantA11yLabel(v);\n\n // Price display:\n // - Always show a \"discounted\" price based on the unlocked discount, falling back to the minimum rule discount.\n // - Show the original price with a strikethrough when a discount applies.\n const discountPercentToUse = badgeDiscountPercent;\n const originalPriceNumber = Number(v.price);\n const hasDiscount =\n discountPercentToUse != null &&\n Number.isFinite(discountPercentToUse) &&\n discountPercentToUse > 0 &&\n Number.isFinite(originalPriceNumber);\n const discountedPriceNumber = hasDiscount\n ? Math.round(originalPriceNumber * (1 - discountPercentToUse / 100) * 100) / 100\n : null;\n\n return (\n <li key={v.id} className={styles.variantRow} data-variant-row={v.id}>\n <div className={styles.variantLeft}>\n <div className={styles.variantThumb} aria-hidden=\"true\">\n {v.image?.url ? (\n <img\n className={styles.variantThumbImg}\n src={v.image.url}\n alt={v.image.altText ?? variantA11y}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.variantThumbFallback}>{v.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}</div>\n )}\n </div>\n\n <div className={styles.variantInfo}>\n <div className={styles.variantName}>{variantPrimaryName}</div>\n {variantOptionText ? <div className={styles.variantMeta}>{variantOptionText}</div> : null}\n <div className={styles.variantPriceRow}>\n {hasDiscount ? (\n <span className={styles.variantCompareAt}>\n {formatMoney(Number.isFinite(originalPriceNumber) ? originalPriceNumber.toFixed(2) : v.price)}\n </span>\n ) : null}\n <span className={styles.variantPrice}>\n {formatMoney(\n discountedPriceNumber != null\n ? discountedPriceNumber.toFixed(2)\n : Number.isFinite(originalPriceNumber)\n ? originalPriceNumber.toFixed(2)\n : v.price,\n )}\n </span>\n </div>\n </div>\n </div>\n {qty <= 0 ? (\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, 1)}\n disabled={submitting || isAtMaxBundleSize}\n className={styles.addToBundleButton}\n aria-label={`Add ${variantA11y} to bundle`}\n >\n Add\n </button>\n ) : (\n <div className={styles.qtyControls}>\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, qty - 1)}\n disabled={submitting || qty <= 0}\n className={styles.qtyButton}\n aria-label={`Decrease ${variantA11y}`}\n >\n −\n </button>\n <span className={styles.qtyValue} aria-label={`Quantity ${qty}`}>\n {qty}\n </span>\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, qty + 1)}\n disabled={submitting || isAtMaxBundleSize}\n className={styles.qtyButton}\n aria-label={`Increase ${variantA11y}`}\n >\n +\n </button>\n </div>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n </div>\n\n <footer className={styles.footer} ref={footerRef}>\n <div className={styles.boxSummaryWindow} ref={boxSummaryWindowRef}>\n <div className={styles.boxSummaryRow} aria-label=\"Bundle box summary\">\n {Array.from({ length: slotCount }).map((_, idx) => {\n const variant = filledVariants[idx];\n const threshold = thresholdByIndex.get(idx);\n const isFilled = Boolean(variant);\n\n // Per your preference: show discount text only while it's still a placeholder (unlocked display comes later elsewhere).\n const isThreshold = Boolean(threshold);\n const showThreshold = isThreshold && !isFilled;\n const discountText = threshold ? `${threshold.discountPercent}% off` : null;\n\n const titleText = isFilled ? variant!.displayName : `Slot ${idx + 1}`;\n\n return (\n <div key={idx} data-box-slot={idx} className={styles.boxSlot}>\n <div\n className={[\n styles.boxItem,\n isFilled ? styles.boxItemFilled : styles.boxItemPlaceholder,\n isThreshold ? styles.boxItemThreshold : null,\n isFilled ? styles.boxItemClickable : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n role={isFilled ? \"button\" : undefined}\n tabIndex={isFilled ? 0 : undefined}\n onClick={isFilled ? () => scrollVariantRowIntoView(variant!.id) : undefined}\n onKeyDown={\n isFilled\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n scrollVariantRowIntoView(variant!.id);\n }\n }\n : undefined\n }\n aria-label={showThreshold && discountText ? `${titleText}. Unlocks ${discountText}.` : titleText}\n title={showThreshold && discountText ? `${titleText} • Unlocks ${discountText}` : titleText}\n >\n {isFilled ? (\n variant!.image?.url ? (\n <img\n className={styles.boxItemImage}\n src={variant!.image!.url}\n alt={variant!.image!.altText ?? variant!.displayName}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.boxItemFallback} aria-hidden=\"true\">\n {variant!.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}\n </div>\n )\n ) : showThreshold && discountText ? (\n <div className={styles.boxItemDiscountText}>{discountText}</div>\n ) : (\n <div className={styles.boxItemPlus} aria-hidden=\"true\">\n +\n </div>\n )}\n </div>\n\n {isThreshold ? <div className={styles.boxThresholdLabel}>{threshold!.label}</div> : null}\n </div>\n );\n })}\n </div>\n </div>\n <div\n className={[styles.ctaTotalsWrap, itemsRemaining <= 0 ? styles.ctaTotalsWrapVisible : null].filter(Boolean).join(\" \")}\n aria-hidden={itemsRemaining > 0}\n >\n <div className={styles.ctaTotals} aria-label=\"Totals\">\n {badgeDiscountPercent ? (\n <span className={styles.ctaDiscountBadge}>\n {badgeDiscountPercent}% Discount\n </span>\n ) : (\n <span />\n )}\n\n <span>\n {appliedDiscountPercent ? (\n <>\n <span className={styles.ctaTotalsStrike}>{formatMoney(subtotal.toFixed(2))}</span>{\" \"}\n <span className={styles.ctaTotalsPrice}>{formatMoney(discountedTotal.toFixed(2))}</span>\n </>\n ) : (\n <span className={styles.ctaTotalsPrice}>{formatMoney(subtotal.toFixed(2))}</span>\n )}\n </span>\n </div>\n </div>\n\n {(() => {\n // const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n const buttonMode = \"add_to_cart_checkout\";\n if (buttonMode === \"add_to_cart_checkout\") {\n // Show single button with \"Add X more\" when items remaining\n // Show both buttons side-by-side when minimum is met\n if (itemsRemaining > 0) {\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting ? \"Adding…\" : `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}`}\n </button>\n );\n }\n\n return (\n <div className={`${styles.ctaButtonGroup} ${isDualButtonAnimationLoaded ? styles.ctaButtonGroupAnimating : \"\"}`}>\n <button\n type=\"button\"\n onClick={submit}\n disabled={!canSubmit}\n className={`${styles.ctaDualLeft} ${isDualButtonAnimationLoaded ? styles.ctaDualLeftAnimating : \"\"}`}\n >\n <span>{submitting ? \"Adding…\" : \"Add to Basket\"}</span>\n </button>\n <button\n type=\"button\"\n onClick={submitAndCheckout}\n disabled={!canSubmit}\n className={`${styles.ctaDualRight} ${isDualButtonAnimationLoaded ? styles.ctaDualRightAnimating : \"\"}`}\n >\n <span>{submitting ? \"Processing…\" : \"Checkout\"}</span>\n </button>\n </div>\n );\n }\n\n if (buttonMode === \"checkout\") {\n return (\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.cta}>\n {submitting ? \"Processing…\" : itemsRemaining > 0 ? `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}` : \"Checkout\"}\n </button>\n );\n }\n\n // Default: add_to_cart\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting ? \"Adding…\" : itemsRemaining > 0 ? `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}` : \"Add to Basket\"}\n </button>\n );\n })()}\n\n <div className={styles.poweredBy}>\n powered by <a href=\"https://apps.shopify.com/best-bundles\" target=\"_blank\" rel=\"noopener noreferrer\"> BestBundles</a>\n </div>\n </footer>\n </aside>\n </div>\n );\n}\n\n","import type { BundleCartAdapter, BundleCartLineAttribute } from \"../types\";\n\nfunction toProperties(attributes?: BundleCartLineAttribute[]) {\n if (!attributes?.length) return undefined;\n return attributes.reduce<Record<string, string>>((acc, attr) => {\n if (attr?.key) acc[attr.key] = attr.value ?? \"\";\n return acc;\n }, {});\n}\n\nfunction normalizeVariantId(merchandiseId: string) {\n const match = /\\/(\\d+)$/.exec(merchandiseId);\n return match ? match[1] : merchandiseId;\n}\n\nfunction getCartUrl() {\n // Dawn / Theme 2.0 exposes `routes.cart_url`; fall back to the default.\n return (window as any)?.routes?.cart_url || \"/cart\";\n}\n\nasync function refreshAndOpenTheme2CartDrawer() {\n try {\n const cartUrl = getCartUrl();\n const sectionsParam = encodeURIComponent(\"cart-drawer,cart-icon-bubble,cart-live-region-text\");\n const res = await fetch(`${cartUrl}?sections=${sectionsParam}`, { method: \"GET\" });\n if (!res.ok) return;\n\n const sections = (await res.json().catch(() => null)) as Record<string, string> | null;\n if (!sections) return;\n\n const sectionIds = [\"cart-drawer\", \"cart-icon-bubble\", \"cart-live-region-text\"];\n for (const sectionId of sectionIds) {\n const htmlString = sections[sectionId];\n if (!htmlString) continue;\n\n const html = new DOMParser().parseFromString(htmlString, \"text/html\");\n const sourceElement = html.getElementById(sectionId) || html.querySelector(sectionId);\n const targetElement = document.getElementById(sectionId) || document.querySelector(sectionId);\n if (targetElement && sourceElement) {\n targetElement.replaceWith(sourceElement);\n }\n }\n\n const drawer = document.querySelector(\"cart-drawer\") as any;\n if (drawer && typeof drawer.open === \"function\") {\n drawer.open();\n return;\n }\n\n // Fallback: mimic older theme behavior (best-effort).\n document.body.classList.add(\"overflow-hidden\");\n const themeCart = document.querySelector(\"cart-drawer\") || document.querySelector(\"cart-notification\");\n if (themeCart) {\n if (themeCart.classList.contains(\"is-empty\")) themeCart.classList.remove(\"is-empty\");\n themeCart.classList.add(\"active\");\n }\n } catch {\n // no-op: cart UI refresh is best-effort and theme-dependent\n }\n}\n\nasync function postCartJson(endpoint: string, payload: Record<string, unknown>) {\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(text || `Cart request failed: ${res.status}`);\n }\n return res.json().catch(() => null);\n}\n\nexport function createLiquidCartAdapter(): BundleCartAdapter {\n return {\n async linesAdd(lines) {\n const items = lines.map((line) => ({\n id: normalizeVariantId(line.merchandiseId),\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n }));\n await postCartJson(\"/cart/add.js\", { items });\n },\n async linesAddForCheckout(lines) {\n const items = lines.map((line) => ({\n id: normalizeVariantId(line.merchandiseId),\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n }));\n await postCartJson(\"/cart/add.js\", { items });\n },\n async linesUpdate(lines) {\n for (const line of lines) {\n await postCartJson(\"/cart/change.js\", {\n id: line.id,\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n });\n }\n },\n async linesRemove(lineIds) {\n for (const id of lineIds) {\n await postCartJson(\"/cart/change.js\", { id, quantity: 0 });\n }\n },\n openCartUI() {\n // Let the Bundle Builder drawer close first, then open the theme cart.\n window.setTimeout(() => {\n void refreshAndOpenTheme2CartDrawer();\n }, 0);\n },\n navigateToCheckout() {\n // Navigate to Shopify checkout page\n window.location.href = \"/checkout\";\n },\n };\n}\n"],"names":["BundleLineAttributeKeys","fetchBundleConfig","params","url","json","ANONYMOUS_USER_ID_KEY","getOrCreateAnonymousUserId","existing","newId","cryptoAny","trackEvent","analyticsEndpoint","shop","event","response","error","BundleBuilderContext","createContext","safeRandomUUID","clampQty","n","BundleProvider","props","apiBaseUrl","cartAdapter","configHandle","initialData","configFetcher","providedAnalyticsEndpoint","children","isOpen","setIsOpen","useState","loading","setLoading","submitting","setSubmitting","setError","currencyCode","setCurrencyCode","config","setConfig","eligibleVariants","setEligibleVariants","selectionsState","setSelectionsState","abortRef","useRef","useEffect","_a","ac","fetcher","defaultFetchBundleConfig","e","msg","open","useCallback","anonymousUserId","close","toggle","current","maxBundleSize","useMemo","raw","eligibleVariantIdsSet","v","setQuantity","merchandiseId","quantity","q","prev","prevQty","requestedDelta","currentBundleSize","sum","delta","nextQty","nextSelections","_","rest","nextOrder","remainingToRemove","keptReversed","i","id","clearSelections","selections","selectionOrder","bundleSize","minRequired","rules","min","r","canSubmit","performCartAddition","options","bundleId","bundleTitle","lines","l","byId","grossPrice","variantId","qty","price","rulesSorted","a","b","appliedRule","appliedDiscountPercent","pct","discountedPrice","discountedAmount","productVariantIds","discountThresholdIdentifier","discountLabel","_b","submit","submitAndCheckout","value","jsx","useBundleBuilder","ctx","useContext","useBundleBuilderDrawer","BundleButton","styles","tweenFunctions","t","_c","d","c","p","s","tweenFunctions_1","degreesToRads","degrees","randomRange","max","randomInt","ParticleShape","RotationDirection","DEFAULT_FRAME_TIME","Particle","context","getOptions","x","y","colors","initialVelocityX","initialVelocityY","elapsed","gravity","wind","friction","opacity","drawShape","frameTimeMultiplier","rotateDelta","ParticleGenerator","canvas","newParticleX","newParticleY","particlesGenerated","lastNumberOfPieces","run","recycle","numberOfPieces","debug","tweenFunction","tweenDuration","nP","activeCount","tweenedVal","numToAdd","confettiDefaults","tweens.easeInOutQuad","Confetti","opts","computedConfettiDefaults","timestamp","onConfettiComplete","frameRate","lastRunState","lastRecycleState","ref","React","ReactConfettiInternal","extractCanvasProps","confettiOptions","passedProps","canvasStyles","refs","confettiOptionKeys","refProps","prop","val","ReactConfetti","toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","mergeClasses","classes","className","index","array","hasA11yProp","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","iconNode","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","Search","BundleBuilderDrawer","isSearchOpen","setIsSearchOpen","searchQuery","setSearchQuery","searchInputRef","footerRef","celebrationChipRef","windowSize","setWindowSize","confettiKey","setConfettiKey","confettiSource","setConfettiSource","isConfettiActive","setIsConfettiActive","confettiTimerRef","prevBundleSizeForConfettiRef","confettiSettleMs","celebrationKey","setCelebrationKey","celebrationText","setCelebrationText","isCelebrationActive","setIsCelebrationActive","celebrationTimerRef","celebrationDurationMs","formatPercent0dp","formatVariantOptions","selectedOptions","o","name","getVariantPrimaryName","getVariantA11yLabel","isMounted","setIsMounted","closeTimerRef","formatMoney","amount","title","isAtMaxBundleSize","sorted","filteredVariants","tokens","matches","parts","haystack","itemsRemaining","best","minRuleDiscountPercent","badgeDiscountPercent","subtotal","total","discountedTotal","maxRuleSize","filledVariants","thresholdByIndex","map","idx","slotCount","isDualButtonAnimationLoaded","setIsDualButtonAnimationLoaded","prevItemsRemainingRef","wasPositive","panelRef","bodyRef","boxSummaryWindowRef","prevBundleSizeRef","scrollVariantRowIntoView","container","row","padding","maxTop","rowCenterOffset","targetTop","nextTop","onKeyDown","onResize","raf","hitThreshold","nextThreshold","targetIdx","el","containerRect","deltaRight","maxLeft","nextLeft","hitRule","k","chipEl","rect","panelRect","originX","originY","source","jsxs","variantPrimaryName","variantOptionText","variantA11y","discountPercentToUse","originalPriceNumber","hasDiscount","discountedPriceNumber","_d","variant","threshold","isFilled","isThreshold","showThreshold","discountText","titleText","Fragment","toProperties","attributes","acc","attr","normalizeVariantId","getCartUrl","refreshAndOpenTheme2CartDrawer","cartUrl","sectionsParam","res","sections","sectionIds","sectionId","htmlString","html","sourceElement","targetElement","drawer","themeCart","postCartJson","endpoint","payload","text","createLiquidCartAdapter","items","line","lineIds"],"mappings":"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","x_google_ignoreList":[7,8,9,10,11,12,13]}
1
+ {"version":3,"file":"index.js","sources":["../src/constants.ts","../src/api/fetchBundleConfig.ts","../src/utils/analytics.ts","../src/context/BundleProvider.tsx","../src/hooks/useBundleBuilder.ts","../src/hooks/useBundleBuilderDrawer.ts","../src/components/BundleButton.tsx","../../../node_modules/tween-functions/index.js","../../../node_modules/react-confetti/dist/react-confetti.mjs","../../../node_modules/lucide-react/dist/esm/shared/src/utils.js","../../../node_modules/lucide-react/dist/esm/defaultAttributes.js","../../../node_modules/lucide-react/dist/esm/Icon.js","../../../node_modules/lucide-react/dist/esm/createLucideIcon.js","../../../node_modules/lucide-react/dist/esm/icons/search.js","../src/components/BundleBuilderDrawer.tsx","../src/adapters/LiquidAdapter.ts"],"sourcesContent":["export const BundleLineAttributeKeys = {\n bundleId: \"_bundle_id\",\n bundleConfig: \"_bundle_config\",\n bundleSource: \"_bundle_source\",\n bundleTitle: \"_bundle_title\",\n} as const;\n\n","import type { PublicBundleConfigResponse } from \"../types\";\n\nexport async function fetchBundleConfig(params: {\n apiBaseUrl: string;\n shop: string;\n signal?: AbortSignal;\n}): Promise<PublicBundleConfigResponse> {\n const url = new URL(\"/api/public/bundle-config\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n // The endpoint uses 4xx/5xx for some errors; normalize to {ok:false}.\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicBundleConfigResponse;\n}\n\n","const ANONYMOUS_USER_ID_KEY = \"bb_anonymous_user_id\";\n\n/**\n * Gets or creates an anonymous user ID stored in localStorage.\n * This ID persists across sessions to attribute events to the same user.\n */\nexport function getOrCreateAnonymousUserId(): string {\n if (typeof window === \"undefined\" || typeof localStorage === \"undefined\") {\n // Fallback for SSR or environments without localStorage\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n try {\n const existing = localStorage.getItem(ANONYMOUS_USER_ID_KEY);\n if (existing && typeof existing === \"string\" && existing.length > 0) {\n return existing;\n }\n\n // Generate new ID\n let newId: string;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoAny = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoAny?.randomUUID) {\n newId = cryptoAny.randomUUID();\n } else {\n throw new Error(\"crypto.randomUUID not available\");\n }\n } catch {\n // Fallback UUID generation\n newId = `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n localStorage.setItem(ANONYMOUS_USER_ID_KEY, newId);\n return newId;\n } catch {\n // If localStorage fails, generate a temporary ID\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n}\n\nexport type AnalyticsEventType = \"DRAWER_OPENED\" | \"VARIANT_SELECTION_CHANGED\" | \"BUNDLE_ADDED_TO_BASKET\";\n\nexport type DrawerOpenedEvent = {\n eventType: \"DRAWER_OPENED\";\n shop: string;\n anonymousUserId: string;\n timestamp: string;\n};\n\nexport type VariantSelectionChangedEvent = {\n eventType: \"VARIANT_SELECTION_CHANGED\";\n shop: string;\n anonymousUserId: string;\n before: Record<string, number>; // variantId -> quantity\n after: Record<string, number>;\n timestamp: string;\n};\n\nexport type BundleAddedToBasketEvent = {\n eventType: \"BUNDLE_ADDED_TO_BASKET\";\n shop: string;\n anonymousUserId: string;\n bundleId: string;\n productVariantIds: string[];\n grossPrice: number;\n discountedPrice: number;\n currency?: string;\n discountThresholdIdentifier: string; // rule handle\n discountLabel: string;\n discountPercentage: number | null;\n discountedAmount: number;\n timestamp: string;\n};\n\nexport type AnalyticsEvent = DrawerOpenedEvent | VariantSelectionChangedEvent | BundleAddedToBasketEvent;\n\n/**\n * Sends an analytics event to the backend API endpoint.\n * Failures are silently caught to prevent breaking bundle functionality.\n */\nexport async function trackEvent(\n analyticsEndpoint: string,\n shop: string,\n event: AnalyticsEvent,\n): Promise<void> {\n if (typeof window === \"undefined\") {\n return; // Skip in SSR\n }\n\n try {\n const url = new URL(analyticsEndpoint, window.location.origin);\n url.searchParams.set(\"shop\", shop);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(event),\n // Don't wait for response - fire and forget\n keepalive: true,\n });\n\n if (!response.ok) {\n console.warn(\n `[Bundle Analytics] Event tracking failed with status ${response.status}:`,\n await response.text().catch(() => \"Unable to read response\"),\n );\n }\n } catch (error) {\n // Log error for debugging but don't break bundle functionality\n console.warn(\"[Bundle Analytics] Failed to track event:\", error);\n }\n}\n","import React, { createContext, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { BundleLineAttributeKeys } from \"../constants\";\nimport { fetchBundleConfig as defaultFetchBundleConfig } from \"../api/fetchBundleConfig\";\nimport type { BundleCartAdapter, BundleConfig, BundleEligibleVariant, PublicBundleConfigResponse } from \"../types\";\nimport { getOrCreateAnonymousUserId, trackEvent } from \"../utils/analytics\";\n\ntype BundleProviderData = {\n currencyCode: string | null;\n config: BundleConfig;\n eligibleVariants: BundleEligibleVariant[];\n};\n\ntype BundleSelectionState = Record<string, number>; // merchandiseId -> qty\ntype BundleSelectionOrder = string[]; // merchandiseId (variant GID) per-item, in first-added -> last-added order\n\nexport type BundleProviderProps = {\n apiBaseUrl: string;\n shop: string;\n cartAdapter: BundleCartAdapter;\n\n /**\n * v1 default is \"default\" to mirror the app's current single-config endpoint.\n * Kept as a prop to avoid an API break when the public endpoint supports multiple handles.\n */\n configHandle?: string;\n\n /**\n * Optional override for Storybook/tests so we can avoid network calls.\n */\n initialData?: BundleProviderData;\n\n /**\n * Optional fetcher override for Storybook/tests.\n */\n configFetcher?: (params: { apiBaseUrl: string; shop: string; signal?: AbortSignal }) => Promise<PublicBundleConfigResponse>;\n\n /**\n * Optional analytics endpoint override. Defaults to \"/api/public/bundle-analytics\".\n */\n analyticsEndpoint?: string;\n\n children: React.ReactNode;\n};\n\nexport type BundleBuilderContextValue = {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n\n loading: boolean;\n submitting: boolean;\n error: string | null;\n\n currencyCode: string | null;\n config: BundleConfig | null;\n eligibleVariants: BundleEligibleVariant[];\n\n selections: BundleSelectionState;\n selectionOrder: BundleSelectionOrder;\n setQuantity: (merchandiseId: string, quantity: number) => void;\n clearSelections: () => void;\n\n bundleSize: number;\n minRequired: number;\n canSubmit: boolean;\n submit: () => Promise<void>;\n submitAndCheckout: () => Promise<void>;\n};\n\nexport const BundleBuilderContext = createContext<BundleBuilderContextValue | null>(null);\n\nfunction safeRandomUUID() {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoAny = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoAny?.randomUUID) return cryptoAny.randomUUID();\n } catch {\n // ignore\n }\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction clampQty(n: number) {\n if (!Number.isFinite(n)) return 0;\n return Math.max(0, Math.floor(n));\n}\n\nexport function BundleProvider(props: BundleProviderProps) {\n const {\n apiBaseUrl,\n shop,\n cartAdapter,\n configHandle = \"default\",\n initialData,\n configFetcher,\n analyticsEndpoint: providedAnalyticsEndpoint,\n children,\n } = props;\n\n const analyticsEndpoint = providedAnalyticsEndpoint ?? `${apiBaseUrl}/api/public/bundle-analytics`;\n\n const [isOpen, setIsOpen] = useState(false);\n const [loading, setLoading] = useState(!initialData);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const [currencyCode, setCurrencyCode] = useState<string | null>(initialData?.currencyCode ?? null);\n const [config, setConfig] = useState<BundleConfig | null>(initialData?.config ?? null);\n const [eligibleVariants, setEligibleVariants] = useState<BundleEligibleVariant[]>(\n initialData?.eligibleVariants ?? [],\n );\n\n const [selectionsState, setSelectionsState] = useState<{ selections: BundleSelectionState; order: BundleSelectionOrder }>(\n () => ({ selections: {}, order: [] }),\n );\n\n const abortRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n if (initialData) return;\n\n abortRef.current?.abort();\n const ac = new AbortController();\n abortRef.current = ac;\n\n const fetcher = configFetcher ?? defaultFetchBundleConfig;\n\n setLoading(true);\n setError(null);\n fetcher({ apiBaseUrl, shop, signal: ac.signal })\n .then((json) => {\n if (!json.ok) {\n setError(json.error || \"Failed to load bundle config.\");\n setConfig(null);\n setEligibleVariants([]);\n setCurrencyCode(null);\n return;\n }\n setCurrencyCode(json.currencyCode ?? null);\n setConfig(json.config);\n setEligibleVariants(json.eligibleVariants ?? []);\n })\n .catch((e: unknown) => {\n const msg = e instanceof Error ? e.message : \"Failed to load bundle config.\";\n setError(msg);\n setConfig(null);\n setEligibleVariants([]);\n setCurrencyCode(null);\n })\n .finally(() => setLoading(false));\n\n return () => ac.abort();\n }, [apiBaseUrl, shop, initialData, configFetcher]);\n\n const open = useCallback(() => {\n setIsOpen(true);\n // Track drawer opened event\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_OPENED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n }).catch((error) => {\n // Log error for debugging but don't break functionality\n console.warn(\"[Bundle Analytics] Failed to track drawer opened:\", error);\n });\n } catch (error) {\n // Log error for debugging but don't break functionality\n console.warn(\"[Bundle Analytics] Error in open() callback:\", error);\n }\n }\n }, [analyticsEndpoint, shop]);\n const close = useCallback(() => setIsOpen(false), []);\n const toggle = useCallback(() => {\n // Check current state and call appropriate function\n setIsOpen((current) => {\n if (!current) {\n // Opening - track the event\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_OPENED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n }).catch((error) => {\n console.warn(\"[Bundle Analytics] Failed to track drawer opened:\", error);\n });\n } catch (error) {\n console.warn(\"[Bundle Analytics] Error in toggle() callback:\", error);\n }\n }\n }\n return !current;\n });\n }, [analyticsEndpoint, shop]);\n\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n\n const eligibleVariantIdsSet = useMemo(() => {\n return new Set(eligibleVariants.map((v) => v.id));\n }, [eligibleVariants]);\n\n const setQuantity = useCallback((merchandiseId: string, quantity: number) => {\n // Validate that the merchandiseId is in the eligible variants set\n if (!eligibleVariantIdsSet.has(merchandiseId)) {\n return; // Silently ignore ineligible variants\n }\n\n const q = clampQty(quantity);\n setSelectionsState((prev) => {\n const prevQty = prev.selections[merchandiseId] ?? 0;\n const requestedDelta = q - prevQty;\n const currentBundleSize = Object.values(prev.selections).reduce((sum, v) => sum + (v || 0), 0);\n const delta =\n requestedDelta > 0\n ? Math.min(requestedDelta, Math.max(0, maxBundleSize - currentBundleSize))\n : requestedDelta;\n\n const nextQty = prevQty + delta;\n\n // selections\n let nextSelections: BundleSelectionState;\n if (nextQty <= 0) {\n const { [merchandiseId]: _, ...rest } = prev.selections;\n nextSelections = rest;\n } else if (prevQty === nextQty) {\n nextSelections = prev.selections;\n } else {\n nextSelections = { ...prev.selections, [merchandiseId]: nextQty };\n }\n\n // order\n let nextOrder = prev.order;\n if (delta > 0) {\n // Add N items to the end.\n nextOrder = [...prev.order, ...Array.from({ length: delta }, () => merchandiseId)];\n } else if (delta < 0) {\n // Remove N most-recent occurrences of this variant.\n let remainingToRemove = -delta;\n const keptReversed: string[] = [];\n for (let i = prev.order.length - 1; i >= 0; i--) {\n const id = prev.order[i];\n if (id === merchandiseId && remainingToRemove > 0) {\n remainingToRemove--;\n continue;\n }\n keptReversed.push(id);\n }\n keptReversed.reverse();\n nextOrder = keptReversed;\n }\n\n if (nextSelections === prev.selections && nextOrder === prev.order) return prev;\n\n // Track variant selection changed event\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"VARIANT_SELECTION_CHANGED\",\n shop,\n anonymousUserId,\n before: { ...prev.selections },\n after: { ...nextSelections },\n timestamp: new Date().toISOString(),\n });\n } catch {\n // Silently fail - analytics should not break functionality\n }\n }\n\n return { selections: nextSelections, order: nextOrder };\n });\n }, [maxBundleSize, eligibleVariantIdsSet, analyticsEndpoint, shop]);\n\n const clearSelections = useCallback(() => setSelectionsState({ selections: {}, order: [] }), []);\n\n const selections = selectionsState.selections;\n const selectionOrder = selectionsState.order;\n\n const bundleSize = useMemo(() => Object.values(selections).reduce((sum, q) => sum + (q || 0), 0), [selections]);\n\n const minRequired = useMemo(() => {\n const rules = config?.rules ?? [];\n const min = rules.length ? Math.min(...rules.map((r) => r.minBundleSize)) : 2;\n return Number.isFinite(min) && min > 0 ? min : 2;\n }, [config]);\n\n const canSubmit = useMemo(() => {\n if (loading || submitting) return false;\n if (error) return false;\n if (!config?.isActive) return false;\n if (bundleSize < minRequired) return false;\n return true;\n }, [bundleSize, config?.isActive, error, loading, minRequired, submitting]);\n\n // Shared logic for adding bundle to cart\n const performCartAddition = useCallback(async (options?: { onComplete?: () => void; checkout?: boolean }) => {\n if (!canSubmit || !config) return;\n\n const bundleId = safeRandomUUID();\n const bundleTitle = (config.title ?? \"\").trim().slice(0, 255);\n const lines = Object.entries(selections)\n .map(([merchandiseId, quantity]) => ({ merchandiseId, quantity: clampQty(quantity) }))\n .filter((l) => l.quantity > 0)\n .filter((l) => eligibleVariantIdsSet.has(l.merchandiseId)) // Filter out ineligible variants\n .map((l) => ({\n merchandiseId: l.merchandiseId,\n quantity: l.quantity,\n attributes: [\n { key: BundleLineAttributeKeys.bundleId, value: bundleId },\n { key: BundleLineAttributeKeys.bundleConfig, value: configHandle },\n { key: BundleLineAttributeKeys.bundleSource, value: \"bundle_builder\" },\n ...(bundleTitle ? [{ key: BundleLineAttributeKeys.bundleTitle, value: bundleTitle }] : []),\n ],\n }));\n\n if (!lines.length) return;\n\n // Calculate pricing and discount info for analytics\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let grossPrice = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n grossPrice += price * q;\n }\n grossPrice = Math.round(grossPrice * 100) / 100;\n\n // Find applied discount rule\n const rulesSorted = [...(config.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n let appliedRule: (typeof rulesSorted)[number] | null = null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) appliedRule = r;\n }\n\n const appliedDiscountPercent = appliedRule\n ? (() => {\n const pct = Number.parseFloat(appliedRule!.discountPercent);\n return Number.isFinite(pct) && pct > 0 ? pct : null;\n })()\n : null;\n\n const discountedPrice = appliedDiscountPercent\n ? Math.round(grossPrice * (1 - appliedDiscountPercent / 100) * 100) / 100\n : grossPrice;\n const discountedAmount = grossPrice - discountedPrice;\n\n const productVariantIds = lines.map((l) => l.merchandiseId);\n const discountThresholdIdentifier = appliedRule?.handle ?? \"\";\n const discountLabel = appliedRule?.label?.trim() || \"\";\n\n setSubmitting(true);\n try {\n if (options?.checkout) {\n await cartAdapter.linesAddForCheckout(lines);\n } else {\n await cartAdapter.linesAdd(lines);\n }\n\n // Track bundle added to basket event\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"BUNDLE_ADDED_TO_BASKET\",\n shop,\n anonymousUserId,\n bundleId,\n productVariantIds,\n grossPrice,\n discountedPrice,\n currency: currencyCode ?? undefined,\n discountThresholdIdentifier,\n discountLabel,\n discountPercentage: appliedDiscountPercent,\n discountedAmount,\n timestamp: new Date().toISOString(),\n });\n } catch {\n // Silently fail - analytics should not break functionality\n }\n }\n\n clearSelections();\n close();\n // Call the completion callback\n options?.onComplete?.();\n } finally {\n setSubmitting(false);\n }\n }, [\n canSubmit,\n cartAdapter,\n clearSelections,\n close,\n config,\n configHandle,\n currencyCode,\n selections,\n eligibleVariantIdsSet,\n eligibleVariants,\n bundleSize,\n analyticsEndpoint,\n shop,\n ]);\n\n const submit = useCallback(async () => {\n await performCartAddition(\n {\n onComplete: () => {\n cartAdapter.openCartUI?.();\n }\n }\n );\n }, [performCartAddition, cartAdapter]);\n\n const submitAndCheckout = useCallback(async () => {\n await performCartAddition(\n {\n checkout: true,\n onComplete: () => {\n cartAdapter.navigateToCheckout?.();\n }\n }\n );\n }, [performCartAddition, cartAdapter]);\n\n const value: BundleBuilderContextValue = useMemo(\n () => ({\n isOpen,\n open,\n close,\n toggle,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n setQuantity,\n clearSelections,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n }),\n [\n isOpen,\n open,\n close,\n toggle,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n setQuantity,\n clearSelections,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n ],\n );\n\n return <BundleBuilderContext.Provider value={value}>{children}</BundleBuilderContext.Provider>;\n}\n\n","import { useContext } from \"react\";\nimport { BundleBuilderContext } from \"../context/BundleProvider\";\n\nexport function useBundleBuilder() {\n const ctx = useContext(BundleBuilderContext);\n if (!ctx) {\n throw new Error(\"useBundleBuilder must be used within <BundleProvider />\");\n }\n return ctx;\n}\n\n","import { useBundleBuilder } from \"./useBundleBuilder\";\n\nexport type BundleBuilderDrawerControls = {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n};\n\n/**\n * Convenience hook for controlling the drawer (alternative to using <BundleButton />).\n * Must be used within <BundleProvider />.\n */\nexport function useBundleBuilderDrawer(): BundleBuilderDrawerControls {\n const { isOpen, open, close, toggle } = useBundleBuilder();\n return { isOpen, open, close, toggle };\n}\n\n","import React from \"react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport styles from \"./BundleButton.module.css\";\n\nexport type BundleButtonProps = {\n children?: React.ReactNode;\n className?: string;\n};\n\nexport function BundleButton(props: BundleButtonProps) {\n const { toggle } = useBundleBuilder();\n return (\n <button\n type=\"button\"\n onClick={toggle}\n className={[styles.button, props.className].filter(Boolean).join(\" \")}\n >\n {props.children ?? \"Build a bundle\"}\n </button>\n );\n}\n\n","'use strict';\n\n// t: current time, b: beginning value, _c: final value, d: total duration\nvar tweenFunctions = {\n linear: function(t, b, _c, d) {\n var c = _c - b;\n return c * t / d + b;\n },\n easeInQuad: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t + b;\n },\n easeOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (t /= d) * (t - 2) + b;\n },\n easeInOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t + b;\n } else {\n return -c / 2 * ((--t) * (t - 2) - 1) + b;\n }\n },\n easeInCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t + b;\n },\n easeOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t + 1) + b;\n },\n easeInOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t + 2) + b;\n }\n },\n easeInQuart: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t + b;\n },\n easeOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n },\n easeInOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t + b;\n } else {\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n }\n },\n easeInQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t * t + b;\n },\n easeOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n },\n easeInOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n }\n },\n easeInSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n },\n easeOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\n },\n easeInOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n },\n easeInExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;\n },\n easeOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;\n },\n easeInOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n } else {\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n }\n },\n easeInCirc: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n },\n easeOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n },\n easeInOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n } else {\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n }\n },\n easeInElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n },\n easeOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;\n },\n easeInOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d / 2) === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n if (t < 1) {\n return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n } else {\n return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * 0.5 + c + b;\n }\n },\n easeInBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n },\n easeOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n },\n easeInOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n } else {\n return c / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n }\n },\n easeInBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n v = tweenFunctions.easeOutBounce(d - t, 0, c, d);\n return c - v + b;\n },\n easeOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n }\n },\n easeInOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n if (t < d / 2) {\n v = tweenFunctions.easeInBounce(t * 2, 0, c, d);\n return v * 0.5 + b;\n } else {\n v = tweenFunctions.easeOutBounce(t * 2 - d, 0, c, d);\n return v * 0.5 + c * 0.5 + b;\n }\n }\n};\n\nmodule.exports = tweenFunctions;\n","import { jsx } from 'react/jsx-runtime';\nimport React from 'react';\nimport * as tweens from 'tween-functions';\n\nfunction degreesToRads(degrees) {\n return (degrees * Math.PI) / 180;\n}\nfunction randomRange(min, max) {\n return min + Math.random() * (max - min);\n}\nfunction randomInt(min, max) {\n return Math.floor(min + Math.random() * (max - min + 1));\n}\n\nvar ParticleShape;\n(function (ParticleShape) {\n ParticleShape[ParticleShape[\"Circle\"] = 0] = \"Circle\";\n ParticleShape[ParticleShape[\"Square\"] = 1] = \"Square\";\n ParticleShape[ParticleShape[\"Strip\"] = 2] = \"Strip\";\n})(ParticleShape || (ParticleShape = {}));\nvar RotationDirection;\n(function (RotationDirection) {\n RotationDirection[RotationDirection[\"Positive\"] = 1] = \"Positive\";\n RotationDirection[RotationDirection[\"Negative\"] = -1] = \"Negative\";\n})(RotationDirection || (RotationDirection = {}));\nconst DEFAULT_FRAME_TIME = 1000 / 60;\nclass Particle {\n constructor(context, getOptions, x, y) {\n this.getOptions = getOptions;\n const { colors, initialVelocityX, initialVelocityY } = this.getOptions();\n this.context = context;\n this.x = x;\n this.y = y;\n this.w = randomRange(5, 20);\n this.h = randomRange(5, 20);\n this.radius = randomRange(5, 10);\n this.vx =\n typeof initialVelocityX === 'number'\n ? randomRange(-initialVelocityX, initialVelocityX)\n : randomRange(initialVelocityX.min, initialVelocityX.max);\n this.vy =\n typeof initialVelocityY === 'number'\n ? randomRange(-initialVelocityY, 0)\n : randomRange(initialVelocityY.min, initialVelocityY.max);\n this.shape = randomInt(0, 2);\n this.angle = degreesToRads(randomRange(0, 360));\n this.angularSpin = randomRange(-0.2, 0.2);\n this.color = colors[Math.floor(Math.random() * colors.length)];\n this.rotateY = randomRange(0, 1);\n this.rotationDirection = randomRange(0, 1)\n ? RotationDirection.Positive\n : RotationDirection.Negative;\n }\n update(elapsed) {\n const { gravity, wind, friction, opacity, drawShape } = this.getOptions();\n const frameTimeMultiplier = elapsed / DEFAULT_FRAME_TIME;\n this.x += this.vx * frameTimeMultiplier;\n this.y += this.vy * frameTimeMultiplier;\n this.vy += gravity * frameTimeMultiplier;\n this.vx += wind * frameTimeMultiplier;\n this.vx *= friction ** frameTimeMultiplier;\n this.vy *= friction ** frameTimeMultiplier;\n if (this.rotateY >= 1 &&\n this.rotationDirection === RotationDirection.Positive) {\n this.rotationDirection = RotationDirection.Negative;\n }\n else if (this.rotateY <= -1 &&\n this.rotationDirection === RotationDirection.Negative) {\n this.rotationDirection = RotationDirection.Positive;\n }\n const rotateDelta = 0.1 * this.rotationDirection * frameTimeMultiplier;\n this.rotateY += rotateDelta;\n this.angle += this.angularSpin;\n this.context.save();\n this.context.translate(this.x, this.y);\n this.context.rotate(this.angle);\n this.context.scale(1, this.rotateY);\n this.context.rotate(this.angle);\n this.context.beginPath();\n this.context.fillStyle = this.color;\n this.context.strokeStyle = this.color;\n this.context.globalAlpha = opacity;\n this.context.lineCap = 'round';\n this.context.lineWidth = 2;\n if (drawShape && typeof drawShape === 'function') {\n drawShape.call(this, this.context);\n }\n else {\n switch (this.shape) {\n case ParticleShape.Circle: {\n this.context.beginPath();\n this.context.arc(0, 0, this.radius, 0, 2 * Math.PI);\n this.context.fill();\n break;\n }\n case ParticleShape.Square: {\n this.context.fillRect(-this.w / 2, -this.h / 2, this.w, this.h);\n break;\n }\n case ParticleShape.Strip: {\n this.context.fillRect(-this.w / 6, -this.h / 2, this.w / 3, this.h);\n break;\n }\n }\n }\n this.context.closePath();\n this.context.restore();\n }\n}\n\nclass ParticleGenerator {\n constructor(canvas, getOptions) {\n this.x = 0;\n this.y = 0;\n this.w = 0;\n this.h = 0;\n this.lastNumberOfPieces = 0;\n this.tweenProgress = 0;\n this.tweenFrom = 0;\n this.particles = [];\n this.particlesGenerated = 0;\n this.removeParticleAt = (i) => {\n this.particles.splice(i, 1);\n };\n this.getParticle = () => {\n const newParticleX = randomRange(this.x, this.w + this.x);\n const newParticleY = randomRange(this.y, this.h + this.y);\n return new Particle(this.context, this.getOptions, newParticleX, newParticleY);\n };\n this.animate = (elapsed) => {\n const { canvas, context, particlesGenerated, lastNumberOfPieces } = this;\n const { run, recycle, numberOfPieces, debug, tweenFunction, tweenDuration, } = this.getOptions();\n if (!run) {\n return false;\n }\n const nP = this.particles.length;\n const activeCount = recycle ? nP : particlesGenerated;\n // Initial population\n if (activeCount < numberOfPieces) {\n // Use the numberOfPieces prop as a key to reset the easing timing\n if (lastNumberOfPieces !== numberOfPieces) {\n this.tweenProgress = 0;\n this.tweenFrom = activeCount;\n this.lastNumberOfPieces = numberOfPieces;\n }\n // Clamp tweenProgress between 0 and tweenDuration\n this.tweenProgress = Math.min(tweenDuration, Math.max(0, this.tweenProgress + elapsed));\n const tweenedVal = tweenFunction(this.tweenProgress, this.tweenFrom, numberOfPieces, tweenDuration);\n const numToAdd = Math.round(tweenedVal - activeCount);\n for (let i = 0; i < numToAdd; i++) {\n this.particles.push(this.getParticle());\n }\n this.particlesGenerated += numToAdd;\n }\n if (debug) {\n // Draw debug text\n context.font = '12px sans-serif';\n context.fillStyle = '#333';\n context.textAlign = 'right';\n context.fillText(`Particles: ${nP}`, canvas.width - 10, canvas.height - 20);\n }\n // Maintain the population, iterating backwards to prevent issues when removing particles\n for (let i = this.particles.length - 1; i >= 0; i--) {\n const p = this.particles[i];\n // Update each particle's position\n p.update(elapsed);\n // Prune the off-canvas particles\n if (p.y > canvas.height ||\n p.y < -100 ||\n p.x > canvas.width + 100 ||\n p.x < -100) {\n if (recycle && activeCount <= numberOfPieces) {\n // Replace the particle with a brand new one\n this.particles[i] = this.getParticle();\n }\n else {\n this.removeParticleAt(i);\n }\n }\n }\n return nP > 0 || activeCount < numberOfPieces;\n };\n this.canvas = canvas;\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.context = ctx;\n this.getOptions = getOptions;\n }\n}\n\nconst confettiDefaults = {\n width: typeof window !== 'undefined' ? window.innerWidth : 300,\n height: typeof window !== 'undefined' ? window.innerHeight : 200,\n numberOfPieces: 200,\n friction: 0.99,\n wind: 0,\n gravity: 0.1,\n initialVelocityX: 4,\n initialVelocityY: 10,\n colors: [\n '#f44336',\n '#e91e63',\n '#9c27b0',\n '#673ab7',\n '#3f51b5',\n '#2196f3',\n '#03a9f4',\n '#00bcd4',\n '#009688',\n '#4CAF50',\n '#8BC34A',\n '#CDDC39',\n '#FFEB3B',\n '#FFC107',\n '#FF9800',\n '#FF5722',\n '#795548',\n ],\n opacity: 1.0,\n debug: false,\n tweenFunction: tweens.easeInOutQuad,\n tweenDuration: 5000,\n recycle: true,\n run: true,\n};\nclass Confetti {\n constructor(canvas, opts) {\n this.lastFrameTime = 0;\n this.setOptionsWithDefaults = (opts) => {\n const computedConfettiDefaults = {\n confettiSource: {\n x: 0,\n y: 0,\n w: this.canvas.width,\n h: 0,\n },\n };\n this._options = {\n ...computedConfettiDefaults,\n ...confettiDefaults,\n ...opts,\n };\n Object.assign(this, opts.confettiSource);\n };\n this.update = (timestamp = 0) => {\n const { options: { run, onConfettiComplete, frameRate }, canvas, context, } = this;\n // Cap elapsed time to 50ms to prevent large time steps\n const elapsed = Math.min(timestamp - this.lastFrameTime, 50);\n // Throttle the frame rate if set\n if (frameRate && elapsed < 1000 / frameRate) {\n this.rafId = requestAnimationFrame(this.update);\n return;\n }\n this.lastFrameTime = timestamp - (frameRate ? elapsed % frameRate : 0);\n if (run) {\n context.fillStyle = 'white';\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n if (this.generator.animate(elapsed)) {\n this.rafId = requestAnimationFrame(this.update);\n }\n else {\n if (onConfettiComplete &&\n typeof onConfettiComplete === 'function' &&\n this.generator.particlesGenerated > 0) {\n onConfettiComplete.call(this, this);\n }\n this._options.run = false;\n }\n };\n this.reset = () => {\n if (this.generator && this.generator.particlesGenerated > 0) {\n this.generator.particlesGenerated = 0;\n this.generator.particles = [];\n this.generator.lastNumberOfPieces = 0;\n }\n };\n this.stop = () => {\n this.options = { run: false };\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = undefined;\n }\n };\n this.canvas = canvas;\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.context = ctx;\n this.generator = new ParticleGenerator(this.canvas, () => this.options);\n this.options = opts;\n this.update();\n }\n get options() {\n return this._options;\n }\n set options(opts) {\n const lastRunState = this._options?.run;\n const lastRecycleState = this._options?.recycle;\n this.setOptionsWithDefaults(opts);\n if (this.generator) {\n Object.assign(this.generator, this.options.confettiSource);\n if (typeof opts.recycle === 'boolean' &&\n opts.recycle &&\n lastRecycleState === false) {\n this.generator.lastNumberOfPieces = this.generator.particles.length;\n }\n }\n if (typeof opts.run === 'boolean' && opts.run && lastRunState === false) {\n this.update();\n }\n }\n}\n\nconst ref = React.createRef();\nclass ReactConfettiInternal extends React.Component {\n constructor(props) {\n super(props);\n this.canvas = React.createRef();\n this.canvas = props.canvasRef || ref;\n }\n componentDidMount() {\n if (this.canvas.current) {\n const opts = extractCanvasProps(this.props)[0];\n this.confetti = new Confetti(this.canvas.current, opts);\n }\n }\n componentDidUpdate() {\n const confettiOptions = extractCanvasProps(this.props)[0];\n if (this.confetti) {\n this.confetti.options = confettiOptions;\n }\n }\n componentWillUnmount() {\n if (this.confetti) {\n this.confetti.stop();\n }\n this.confetti = undefined;\n }\n render() {\n const [confettiOptions, passedProps] = extractCanvasProps(this.props);\n const canvasStyles = {\n zIndex: 2,\n position: 'absolute',\n pointerEvents: 'none',\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n ...passedProps.style,\n };\n return (jsx(\"canvas\", { width: confettiOptions.width, height: confettiOptions.height, ref: this.canvas, ...passedProps, style: canvasStyles }));\n }\n}\nReactConfettiInternal.defaultProps = {\n ...confettiDefaults,\n};\nReactConfettiInternal.displayName = 'ReactConfetti';\nfunction extractCanvasProps(props) {\n const confettiOptions = {};\n const refs = {};\n const rest = {};\n const confettiOptionKeys = [\n ...Object.keys(confettiDefaults),\n 'confettiSource',\n 'drawShape',\n 'onConfettiComplete',\n 'frameRate',\n ];\n const refProps = ['canvasRef'];\n for (const prop in props) {\n const val = props[prop];\n if (confettiOptionKeys.includes(prop)) {\n confettiOptions[prop] = val;\n }\n else if (refProps.includes(prop)) {\n refProps[prop] = val;\n }\n else {\n rest[prop] = val;\n }\n }\n return [confettiOptions, rest, refs];\n}\nconst ReactConfetti = React.forwardRef((props, ref) => jsx(ReactConfettiInternal, { canvasRef: ref, ...props }));\n\nexport { ReactConfetti as default };\n//# sourceMappingURL=react-confetti.mjs.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n};\n\nexport { hasA11yProp, mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses, hasA11yProp } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.js.map\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport Confetti from \"react-confetti\";\nimport { Link, Search } from \"lucide-react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport styles from \"./BundleBuilderDrawer.module.css\";\n\nexport type BundleBuilderDrawerProps = {\n className?: string;\n};\n\nexport function BundleBuilderDrawer(props: BundleBuilderDrawerProps) {\n const {\n isOpen,\n close,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n setQuantity,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n } = useBundleBuilder();\n\n const [isSearchOpen, setIsSearchOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const searchInputRef = useRef<HTMLInputElement | null>(null);\n const footerRef = useRef<HTMLElement | null>(null);\n const celebrationChipRef = useRef<HTMLDivElement | null>(null);\n\n const [windowSize, setWindowSize] = useState<{ width: number; height: number }>(() => {\n if (typeof window === \"undefined\") return { width: 0, height: 0 };\n return { width: window.innerWidth, height: window.innerHeight };\n });\n\n const [confettiKey, setConfettiKey] = useState(0);\n const [confettiSource, setConfettiSource] = useState<{ x: number; y: number; w: number; h: number } | null>(null);\n const [isConfettiActive, setIsConfettiActive] = useState(false);\n const confettiTimerRef = useRef<number | null>(null);\n const prevBundleSizeForConfettiRef = useRef<number>(bundleSize);\n const confettiSettleMs = 7000;\n\n const [celebrationKey, setCelebrationKey] = useState(0);\n const [celebrationText, setCelebrationText] = useState<string | null>(null);\n const [isCelebrationActive, setIsCelebrationActive] = useState(false);\n const celebrationTimerRef = useRef<number | null>(null);\n const celebrationDurationMs = 2800;\n\n const formatPercent0dp = (value: string) => {\n const n = Number.parseFloat(value);\n if (!Number.isFinite(n)) return value;\n return String(Math.round(n));\n };\n\n const formatVariantOptions = (selectedOptions: Array<{ name: string; value: string }> | null | undefined) => {\n const opts = (selectedOptions ?? []).filter((o) => {\n const name = o?.name?.trim();\n const value = o?.value?.trim();\n if (!name || !value) return false;\n if (name.toLowerCase() === \"title\") return false;\n return true;\n });\n if (!opts.length) return null;\n return opts.map((o) => `${o.name}: ${o.value}`).join(\" · \");\n };\n\n const getVariantPrimaryName = (v: (typeof eligibleVariants)[number]) => {\n return v.product?.title ?? v.displayName ?? v.title;\n };\n\n const getVariantA11yLabel = (v: (typeof eligibleVariants)[number]) => {\n const name = getVariantPrimaryName(v);\n const opts = formatVariantOptions(v.selectedOptions);\n return [name, opts].filter(Boolean).join(\" — \");\n };\n\n const [isMounted, setIsMounted] = useState(isOpen);\n const closeTimerRef = useRef<number | null>(null);\n\n const formatMoney = (amount: string) => {\n const n = Number(amount);\n if (!Number.isFinite(n)) return amount;\n\n if (currencyCode) {\n try {\n return new Intl.NumberFormat(undefined, { style: \"currency\", currency: currencyCode }).format(n);\n } catch {\n // ignore and fall through\n }\n }\n\n return `$${n.toFixed(2)}`;\n };\n\n const title = config?.title?.trim() || \"Build your bundle\";\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n const isAtMaxBundleSize = bundleSize >= maxBundleSize;\n\n const sorted = useMemo(() => {\n return [...eligibleVariants].sort((a, b) => a.displayName.localeCompare(b.displayName));\n }, [eligibleVariants]);\n\n const filteredVariants = useMemo(() => {\n const q = searchQuery.trim().toLowerCase();\n if (!q) return sorted;\n\n const tokens = q.split(/\\s+/).filter(Boolean);\n const matches = (v: (typeof sorted)[number]) => {\n const parts: string[] = [];\n parts.push(v.displayName);\n if (v.product?.title) parts.push(v.product.title);\n for (const o of v.selectedOptions ?? []) {\n parts.push(o.name);\n parts.push(o.value);\n }\n const haystack = parts.join(\" \").toLowerCase();\n return tokens.every((t) => haystack.includes(t));\n };\n\n return sorted.filter(matches);\n }, [searchQuery, sorted]);\n\n const rulesSorted = useMemo(() => {\n return [...(config?.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n }, [config?.rules]);\n\n const itemsRemaining = useMemo(() => Math.max(0, minRequired - bundleSize), [bundleSize, minRequired]);\n\n const appliedRule = useMemo(() => {\n let best = null as (typeof rulesSorted)[number] | null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) best = r;\n }\n return best;\n }, [bundleSize, rulesSorted]);\n\n const appliedDiscountPercent = useMemo(() => {\n if (!appliedRule) return null;\n const pct = Number.parseFloat(appliedRule.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [appliedRule]);\n\n const minRuleDiscountPercent = useMemo(() => {\n const r = rulesSorted[0];\n if (!r) return null;\n const pct = Number.parseFloat(r.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [rulesSorted]);\n\n const badgeDiscountPercent = appliedDiscountPercent ?? minRuleDiscountPercent;\n\n const subtotal = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let total = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n total += price * q;\n }\n // Keep cents stable for display.\n return Math.round(total * 100) / 100;\n }, [eligibleVariants, selections]);\n\n const discountedTotal = useMemo(() => {\n if (!appliedDiscountPercent) return subtotal;\n const total = subtotal * (1 - appliedDiscountPercent / 100);\n return Math.round(total * 100) / 100;\n }, [appliedDiscountPercent, subtotal]);\n\n const maxRuleSize = useMemo(() => {\n if (!rulesSorted.length) return 0;\n return Math.max(...rulesSorted.map((r) => r.minBundleSize));\n }, [rulesSorted]);\n\n const filledVariants = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n return selectionOrder\n .map((variantId) => byId.get(variantId))\n .filter((v): v is (typeof eligibleVariants)[number] => Boolean(v));\n }, [eligibleVariants, selectionOrder]);\n\n const thresholdByIndex = useMemo(() => {\n // Slot index (0-based) => rule that becomes active at that slot.\n const map = new Map<number, { discountPercent: string; minBundleSize: number; label: string }>();\n for (const r of rulesSorted) {\n const idx = Math.max(0, r.minBundleSize - 1);\n map.set(idx, {\n discountPercent: r.discountPercent,\n minBundleSize: r.minBundleSize,\n label: r.label?.trim() || `Buy ${r.minBundleSize}+`,\n });\n }\n return map;\n }, [rulesSorted]);\n\n const slotCount = useMemo(() => {\n // Placeholders show until highest tier; if user adds more, extend (scroll).\n return Math.max(maxRuleSize || minRequired, filledVariants.length);\n }, [filledVariants.length, maxRuleSize, minRequired]);\n\n // Track animation state for dual button split animation\n const [isDualButtonAnimationLoaded, setIsDualButtonAnimationLoaded] = useState(true);\n const prevItemsRemainingRef = useRef(itemsRemaining);\n\n // Trigger animation when itemsRemaining changes from > 0 to 0 in add_to_cart_checkout mode\n useEffect(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n const wasPositive = prevItemsRemainingRef.current > 0;\n const isNowZero = itemsRemaining === 0;\n\n if (wasPositive && isNowZero) {\n // Trigger animation\n setIsDualButtonAnimationLoaded(false);\n } else {\n // Reset animation\n setIsDualButtonAnimationLoaded(true);\n }\n }\n prevItemsRemainingRef.current = itemsRemaining;\n }, [itemsRemaining, config?.ctaButtonMode]);\n\n const panelRef = useRef<HTMLDivElement | null>(null);\n const bodyRef = useRef<HTMLDivElement | null>(null);\n const boxSummaryWindowRef = useRef<HTMLDivElement | null>(null);\n const prevBundleSizeRef = useRef<number>(bundleSize);\n\n const scrollVariantRowIntoView = (variantId: string) => {\n const container = bodyRef.current;\n if (!container) return;\n const row = container.querySelector<HTMLElement>(`[data-variant-row=\"${variantId}\"]`);\n if (!row) return;\n\n const c = container.getBoundingClientRect();\n const r = row.getBoundingClientRect();\n const padding = 8;\n const isFullyVisible = r.top >= c.top + padding && r.bottom <= c.bottom - padding;\n if (isFullyVisible) return;\n\n const maxTop = Math.max(0, container.scrollHeight - container.clientHeight);\n const rowCenterOffset = (r.top - c.top) + r.height / 2;\n const targetTop = container.scrollTop + rowCenterOffset - container.clientHeight / 2;\n const nextTop = Math.min(maxTop, Math.max(0, targetTop));\n container.scrollTo({ top: nextTop, behavior: \"smooth\" });\n };\n\n useEffect(() => {\n if (!isOpen) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") close();\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [close, isOpen]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = () => setWindowSize({ width: window.innerWidth, height: window.innerHeight });\n onResize();\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n useEffect(() => {\n if (closeTimerRef.current != null) {\n window.clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n\n if (isOpen) {\n setIsMounted(true);\n return;\n }\n\n // Keep mounted long enough to play exit animation.\n closeTimerRef.current = window.setTimeout(() => {\n setIsMounted(false);\n closeTimerRef.current = null;\n }, 220);\n }, [isOpen]);\n\n useEffect(() => {\n return () => {\n if (closeTimerRef.current != null) window.clearTimeout(closeTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n return () => {\n if (confettiTimerRef.current != null) window.clearTimeout(confettiTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n return () => {\n if (celebrationTimerRef.current != null) window.clearTimeout(celebrationTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n if (!isOpen) return;\n if (!isSearchOpen) return;\n const raf = requestAnimationFrame(() => searchInputRef.current?.focus());\n return () => cancelAnimationFrame(raf);\n }, [isOpen, isSearchOpen]);\n\n useEffect(() => {\n const prev = prevBundleSizeRef.current;\n prevBundleSizeRef.current = bundleSize;\n\n // Only respond to adds (qty increases).\n if (bundleSize <= prev) return;\n\n const container = boxSummaryWindowRef.current;\n if (!container) return;\n\n const hitThreshold = rulesSorted.some((r) => r.minBundleSize === bundleSize);\n const nextThreshold = rulesSorted.find((r) => r.minBundleSize > bundleSize);\n\n // When hitting a threshold, try to reveal the NEXT threshold (aligned right) if it's off-screen to the right.\n // If no remaining thresholds, scroll the newest added item into view.\n const targetIdx = nextThreshold && hitThreshold ? nextThreshold.minBundleSize - 1 : !nextThreshold ? bundleSize - 1 : null;\n if (targetIdx == null || targetIdx < 0) return;\n\n const raf = requestAnimationFrame(() => {\n const el = container.querySelector<HTMLElement>(`[data-box-slot=\"${targetIdx}\"]`);\n if (!el) return;\n\n const containerRect = container.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n const deltaRight = elRect.right - containerRect.right;\n\n // Only scroll rightward when the target is off-screen to the right.\n if (deltaRight <= 1) return;\n\n const maxLeft = Math.max(0, container.scrollWidth - container.clientWidth);\n const nextLeft = Math.min(maxLeft, Math.max(0, container.scrollLeft + deltaRight));\n container.scrollTo({ left: nextLeft, behavior: \"smooth\" });\n });\n\n return () => cancelAnimationFrame(raf);\n }, [bundleSize, rulesSorted]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const prev = prevBundleSizeForConfettiRef.current;\n prevBundleSizeForConfettiRef.current = bundleSize;\n\n // Only respond to adds (qty increases).\n if (bundleSize <= prev) return;\n\n // Trigger when crossing an exact configured threshold (e.g. 2 items, 3 items, etc.).\n const hitRule = rulesSorted.find((r) => r.minBundleSize === bundleSize);\n if (!hitRule) return;\n\n // Celebration chip (centered)\n setCelebrationText(`You received a ${formatPercent0dp(hitRule.discountPercent)}% discount!`);\n setCelebrationKey((k) => k + 1);\n setIsCelebrationActive(true);\n if (celebrationTimerRef.current != null) window.clearTimeout(celebrationTimerRef.current);\n celebrationTimerRef.current = window.setTimeout(() => {\n setIsCelebrationActive(false);\n celebrationTimerRef.current = null;\n }, celebrationDurationMs);\n }, [bundleSize, isOpen, rulesSorted]);\n\n useEffect(() => {\n if (!isOpen) return;\n if (!isCelebrationActive) return;\n if (!celebrationText) return;\n\n // After the chip renders, measure its rect and shoot confetti from it.\n const raf = requestAnimationFrame(() => {\n const chipEl = celebrationChipRef.current;\n const rect = chipEl?.getBoundingClientRect();\n\n // Fallback: use the drawer panel center if chip rect isn't available yet.\n const panelRect = panelRef.current?.getBoundingClientRect();\n const originX = rect ? rect.left + rect.width / 2 : panelRect ? panelRect.left + panelRect.width / 2 : window.innerWidth / 2;\n const originY = rect ? rect.top + rect.height / 2 : panelRect ? panelRect.top + panelRect.height / 2 : window.innerHeight / 2;\n\n const source = {\n x: originX - 2,\n y: originY - 2,\n w: 4,\n h: 4,\n };\n\n setConfettiSource(source);\n setConfettiKey((k) => k + 1);\n setIsConfettiActive(true);\n\n if (confettiTimerRef.current != null) window.clearTimeout(confettiTimerRef.current);\n confettiTimerRef.current = window.setTimeout(() => {\n setIsConfettiActive(false);\n confettiTimerRef.current = null;\n }, confettiSettleMs);\n });\n\n return () => cancelAnimationFrame(raf);\n }, [celebrationKey, celebrationText, confettiSettleMs, isCelebrationActive, isOpen]);\n\n useEffect(() => {\n if (!isOpen) return;\n panelRef.current?.focus();\n }, [isOpen]);\n\n if (!isMounted) return null;\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Bundle builder\"\n className={[styles.backdrop, isOpen ? styles.backdropOpen : styles.backdropClosed, props.className].filter(Boolean).join(\" \")}\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) close();\n }}\n >\n {isConfettiActive && confettiSource && windowSize.width > 0 && windowSize.height > 0 ? (\n <Confetti\n key={confettiKey}\n width={windowSize.width}\n height={windowSize.height}\n confettiSource={confettiSource}\n colors={[\n \"#2563eb\", // blue-600\n \"#3b82f6\", // blue-500\n \"#60a5fa\", // blue-400\n \"#93c5fd\", // blue-300\n \"#bae6fd\", // blue-200\n \"#e0f2fe\" // blue-100\n ]}\n recycle={false}\n numberOfPieces={70}\n tweenDuration={100}\n gravity={0.45}\n initialVelocityY={{ min: -10, max: -30 }}\n initialVelocityX={{ min: -6, max: 6 }}\n style={{ position: \"fixed\", inset: 0, pointerEvents: \"none\", zIndex: 2147483646 }}\n />\n ) : null}\n <aside ref={panelRef} className={[styles.panel, isOpen ? styles.panelOpen : styles.panelClosed].filter(Boolean).join(\" \")} tabIndex={-1}>\n {isCelebrationActive && celebrationText ? (\n <div className={styles.celebrationOverlay} aria-hidden=\"true\">\n <div key={celebrationKey} ref={celebrationChipRef} className={styles.celebrationChip}>\n {celebrationText}\n </div>\n </div>\n ) : null}\n <header className={[styles.header, isSearchOpen ? styles.headerSearchOpen : null].filter(Boolean).join(\" \")}>\n <button\n type=\"button\"\n className={styles.searchIconButton}\n aria-label={isSearchOpen ? \"Search (expanded)\" : \"Search\"}\n aria-expanded={isSearchOpen}\n onClick={() => {\n setIsSearchOpen(true);\n }}\n >\n <Search size={18} aria-hidden=\"true\" />\n </button>\n\n <div className={styles.headerCenter}>\n <div className={styles.headerTitleWrap} aria-hidden={isSearchOpen}>\n <h2 className={styles.title}>{title}</h2>\n </div>\n\n <div className={styles.headerSearchWrap} aria-hidden={!isSearchOpen}>\n <div className={styles.searchBar}>\n <input\n ref={searchInputRef}\n className={styles.searchInput}\n type=\"search\"\n value={searchQuery}\n placeholder=\"Search\"\n onChange={(e) => setSearchQuery(e.target.value)}\n onBlur={() => {\n if (searchQuery.trim() === \"\") setIsSearchOpen(false);\n }}\n />\n {searchQuery.trim() ? (\n <button\n type=\"button\"\n className={styles.searchClearButton}\n onMouseDown={(e) => {\n // Prevent input blur so the bar stays open and focused.\n e.preventDefault();\n }}\n onClick={() => {\n setSearchQuery(\"\");\n searchInputRef.current?.focus();\n }}\n aria-label=\"Clear search\"\n >\n Clear\n </button>\n ) : null}\n </div>\n </div>\n </div>\n\n <button type=\"button\" onClick={close} disabled={submitting} className={styles.closeButton} aria-label=\"Close\">\n ×\n </button>\n </header>\n\n <div className={styles.body} ref={bodyRef}>\n {loading ? <p className={styles.muted}>Loading…</p> : null}\n {error ? <p className={styles.error}>{error}</p> : null}\n {!loading && config && !config.isActive ? <p className={styles.error}>Bundles are not active.</p> : null}\n\n <div className={styles.variants}>\n <ul className={styles.variantList}>\n {filteredVariants.map((v) => {\n const qty = selections[v.id] ?? 0;\n const variantPrimaryName = getVariantPrimaryName(v);\n const variantOptionText = formatVariantOptions(v.selectedOptions);\n const variantA11y = getVariantA11yLabel(v);\n\n // Price display:\n // - Always show a \"discounted\" price based on the unlocked discount, falling back to the minimum rule discount.\n // - Show the original price with a strikethrough when a discount applies.\n const discountPercentToUse = badgeDiscountPercent;\n const originalPriceNumber = Number(v.price);\n const hasDiscount =\n discountPercentToUse != null &&\n Number.isFinite(discountPercentToUse) &&\n discountPercentToUse > 0 &&\n Number.isFinite(originalPriceNumber);\n const discountedPriceNumber = hasDiscount\n ? Math.round(originalPriceNumber * (1 - discountPercentToUse / 100) * 100) / 100\n : null;\n\n return (\n <li key={v.id} className={styles.variantRow} data-variant-row={v.id}>\n <div className={styles.variantLeft}>\n <div className={styles.variantThumb} aria-hidden=\"true\">\n {v.image?.url ? (\n <img\n className={styles.variantThumbImg}\n src={v.image.url}\n alt={v.image.altText ?? variantA11y}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.variantThumbFallback}>{v.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}</div>\n )}\n </div>\n\n <div className={styles.variantInfo}>\n <div className={styles.variantName}>{variantPrimaryName}</div>\n {variantOptionText ? <div className={styles.variantMeta}>{variantOptionText}</div> : null}\n <div className={styles.variantPriceRow}>\n {hasDiscount ? (\n <span className={styles.variantCompareAt}>\n {formatMoney(Number.isFinite(originalPriceNumber) ? originalPriceNumber.toFixed(2) : v.price)}\n </span>\n ) : null}\n <span className={styles.variantPrice}>\n {formatMoney(\n discountedPriceNumber != null\n ? discountedPriceNumber.toFixed(2)\n : Number.isFinite(originalPriceNumber)\n ? originalPriceNumber.toFixed(2)\n : v.price,\n )}\n </span>\n </div>\n </div>\n </div>\n {qty <= 0 ? (\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, 1)}\n disabled={submitting || isAtMaxBundleSize}\n className={styles.addToBundleButton}\n aria-label={`Add ${variantA11y} to bundle`}\n >\n Add\n </button>\n ) : (\n <div className={styles.qtyControls}>\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, qty - 1)}\n disabled={submitting || qty <= 0}\n className={styles.qtyButton}\n aria-label={`Decrease ${variantA11y}`}\n >\n −\n </button>\n <span className={styles.qtyValue} aria-label={`Quantity ${qty}`}>\n {qty}\n </span>\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, qty + 1)}\n disabled={submitting || isAtMaxBundleSize}\n className={styles.qtyButton}\n aria-label={`Increase ${variantA11y}`}\n >\n +\n </button>\n </div>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n </div>\n\n <footer className={styles.footer} ref={footerRef}>\n <div className={styles.boxSummaryWindow} ref={boxSummaryWindowRef}>\n <div className={styles.boxSummaryRow} aria-label=\"Bundle box summary\">\n {Array.from({ length: slotCount }).map((_, idx) => {\n const variant = filledVariants[idx];\n const threshold = thresholdByIndex.get(idx);\n const isFilled = Boolean(variant);\n\n // Per your preference: show discount text only while it's still a placeholder (unlocked display comes later elsewhere).\n const isThreshold = Boolean(threshold);\n const showThreshold = isThreshold && !isFilled;\n const discountText = threshold ? `${threshold.discountPercent}% off` : null;\n\n const titleText = isFilled ? variant!.displayName : `Slot ${idx + 1}`;\n\n return (\n <div key={idx} data-box-slot={idx} className={styles.boxSlot}>\n <div\n className={[\n styles.boxItem,\n isFilled ? styles.boxItemFilled : styles.boxItemPlaceholder,\n isThreshold ? styles.boxItemThreshold : null,\n isFilled ? styles.boxItemClickable : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n role={isFilled ? \"button\" : undefined}\n tabIndex={isFilled ? 0 : undefined}\n onClick={isFilled ? () => scrollVariantRowIntoView(variant!.id) : undefined}\n onKeyDown={\n isFilled\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n scrollVariantRowIntoView(variant!.id);\n }\n }\n : undefined\n }\n aria-label={showThreshold && discountText ? `${titleText}. Unlocks ${discountText}.` : titleText}\n title={showThreshold && discountText ? `${titleText} • Unlocks ${discountText}` : titleText}\n >\n {isFilled ? (\n variant!.image?.url ? (\n <img\n className={styles.boxItemImage}\n src={variant!.image!.url}\n alt={variant!.image!.altText ?? variant!.displayName}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.boxItemFallback} aria-hidden=\"true\">\n {variant!.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}\n </div>\n )\n ) : showThreshold && discountText ? (\n <div className={styles.boxItemDiscountText}>{discountText}</div>\n ) : (\n <div className={styles.boxItemPlus} aria-hidden=\"true\">\n +\n </div>\n )}\n </div>\n\n {isThreshold ? <div className={styles.boxThresholdLabel}>{threshold!.label}</div> : null}\n </div>\n );\n })}\n </div>\n </div>\n <div\n className={[styles.ctaTotalsWrap, itemsRemaining <= 0 ? styles.ctaTotalsWrapVisible : null].filter(Boolean).join(\" \")}\n aria-hidden={itemsRemaining > 0}\n >\n <div className={styles.ctaTotals} aria-label=\"Totals\">\n {badgeDiscountPercent ? (\n <span className={styles.ctaDiscountBadge}>\n {badgeDiscountPercent}% Discount\n </span>\n ) : (\n <span />\n )}\n\n <span>\n {appliedDiscountPercent ? (\n <>\n <span className={styles.ctaTotalsStrike}>{formatMoney(subtotal.toFixed(2))}</span>{\" \"}\n <span className={styles.ctaTotalsPrice}>{formatMoney(discountedTotal.toFixed(2))}</span>\n </>\n ) : (\n <span className={styles.ctaTotalsPrice}>{formatMoney(subtotal.toFixed(2))}</span>\n )}\n </span>\n </div>\n </div>\n\n {(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n // Show single button with \"Add X more\" when items remaining\n // Show both buttons side-by-side when minimum is met\n if (itemsRemaining > 0) {\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting ? \"Adding…\" : `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}`}\n </button>\n );\n }\n\n return (\n <div className={`${styles.ctaButtonGroup} ${isDualButtonAnimationLoaded ? styles.ctaButtonGroupAnimating : \"\"}`}>\n <button\n type=\"button\"\n onClick={submit}\n disabled={!canSubmit}\n className={`${styles.ctaDualLeft} ${isDualButtonAnimationLoaded ? styles.ctaDualLeftAnimating : \"\"}`}\n >\n <span>{submitting ? \"Adding…\" : \"Add to Basket\"}</span>\n </button>\n <button\n type=\"button\"\n onClick={submitAndCheckout}\n disabled={!canSubmit}\n className={`${styles.ctaDualRight} ${isDualButtonAnimationLoaded ? styles.ctaDualRightAnimating : \"\"}`}\n >\n <span>{submitting ? \"Processing…\" : \"Checkout\"}</span>\n </button>\n </div>\n );\n }\n\n if (buttonMode === \"checkout\") {\n return (\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.cta}>\n {submitting ? \"Processing…\" : itemsRemaining > 0 ? `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}` : \"Checkout\"}\n </button>\n );\n }\n\n // Default: add_to_cart\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting ? \"Adding…\" : itemsRemaining > 0 ? `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}` : \"Add to Basket\"}\n </button>\n );\n })()}\n\n <div className={styles.poweredBy}>\n powered by <a href=\"https://apps.shopify.com/best-bundles\" target=\"_blank\" rel=\"noopener noreferrer\"> BestBundles</a>\n </div>\n </footer>\n </aside>\n </div>\n );\n}\n\n","import type { BundleCartAdapter, BundleCartLineAttribute } from \"../types\";\n\nfunction toProperties(attributes?: BundleCartLineAttribute[]) {\n if (!attributes?.length) return undefined;\n return attributes.reduce<Record<string, string>>((acc, attr) => {\n if (attr?.key) acc[attr.key] = attr.value ?? \"\";\n return acc;\n }, {});\n}\n\nfunction normalizeVariantId(merchandiseId: string) {\n const match = /\\/(\\d+)$/.exec(merchandiseId);\n return match ? match[1] : merchandiseId;\n}\n\nfunction getCartUrl() {\n // Dawn / Theme 2.0 exposes `routes.cart_url`; fall back to the default.\n return (window as any)?.routes?.cart_url || \"/cart\";\n}\n\nasync function refreshAndOpenTheme2CartDrawer() {\n try {\n const cartUrl = getCartUrl();\n const sectionsParam = encodeURIComponent(\"cart-drawer,cart-icon-bubble,cart-live-region-text\");\n const res = await fetch(`${cartUrl}?sections=${sectionsParam}`, { method: \"GET\" });\n if (!res.ok) return;\n\n const sections = (await res.json().catch(() => null)) as Record<string, string> | null;\n if (!sections) return;\n\n const sectionIds = [\"cart-drawer\", \"cart-icon-bubble\", \"cart-live-region-text\"];\n for (const sectionId of sectionIds) {\n const htmlString = sections[sectionId];\n if (!htmlString) continue;\n\n const html = new DOMParser().parseFromString(htmlString, \"text/html\");\n const sourceElement = html.getElementById(sectionId) || html.querySelector(sectionId);\n const targetElement = document.getElementById(sectionId) || document.querySelector(sectionId);\n if (targetElement && sourceElement) {\n targetElement.replaceWith(sourceElement);\n }\n }\n\n const drawer = document.querySelector(\"cart-drawer\") as any;\n if (drawer && typeof drawer.open === \"function\") {\n drawer.open();\n return;\n }\n\n // Fallback: mimic older theme behavior (best-effort).\n document.body.classList.add(\"overflow-hidden\");\n const themeCart = document.querySelector(\"cart-drawer\") || document.querySelector(\"cart-notification\");\n if (themeCart) {\n if (themeCart.classList.contains(\"is-empty\")) themeCart.classList.remove(\"is-empty\");\n themeCart.classList.add(\"active\");\n }\n } catch {\n // no-op: cart UI refresh is best-effort and theme-dependent\n }\n}\n\nasync function postCartJson(endpoint: string, payload: Record<string, unknown>) {\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(text || `Cart request failed: ${res.status}`);\n }\n return res.json().catch(() => null);\n}\n\nexport function createLiquidCartAdapter(): BundleCartAdapter {\n return {\n async linesAdd(lines) {\n const items = lines.map((line) => ({\n id: normalizeVariantId(line.merchandiseId),\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n }));\n await postCartJson(\"/cart/add.js\", { items });\n },\n async linesAddForCheckout(lines) {\n const items = lines.map((line) => ({\n id: normalizeVariantId(line.merchandiseId),\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n }));\n await postCartJson(\"/cart/add.js\", { items });\n },\n async linesUpdate(lines) {\n for (const line of lines) {\n await postCartJson(\"/cart/change.js\", {\n id: line.id,\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n });\n }\n },\n async linesRemove(lineIds) {\n for (const id of lineIds) {\n await postCartJson(\"/cart/change.js\", { id, quantity: 0 });\n }\n },\n openCartUI() {\n // Let the Bundle Builder drawer close first, then open the theme cart.\n window.setTimeout(() => {\n void refreshAndOpenTheme2CartDrawer();\n }, 0);\n },\n navigateToCheckout() {\n // Navigate to Shopify checkout page\n window.location.href = \"/checkout\";\n },\n };\n}\n"],"names":["BundleLineAttributeKeys","fetchBundleConfig","params","url","json","ANONYMOUS_USER_ID_KEY","getOrCreateAnonymousUserId","existing","newId","cryptoAny","trackEvent","analyticsEndpoint","shop","event","response","error","BundleBuilderContext","createContext","safeRandomUUID","clampQty","n","BundleProvider","props","apiBaseUrl","cartAdapter","configHandle","initialData","configFetcher","providedAnalyticsEndpoint","children","isOpen","setIsOpen","useState","loading","setLoading","submitting","setSubmitting","setError","currencyCode","setCurrencyCode","config","setConfig","eligibleVariants","setEligibleVariants","selectionsState","setSelectionsState","abortRef","useRef","useEffect","_a","ac","fetcher","defaultFetchBundleConfig","e","msg","open","useCallback","anonymousUserId","close","toggle","current","maxBundleSize","useMemo","raw","eligibleVariantIdsSet","v","setQuantity","merchandiseId","quantity","q","prev","prevQty","requestedDelta","currentBundleSize","sum","delta","nextQty","nextSelections","_","rest","nextOrder","remainingToRemove","keptReversed","i","id","clearSelections","selections","selectionOrder","bundleSize","minRequired","rules","min","r","canSubmit","performCartAddition","options","bundleId","bundleTitle","lines","l","byId","grossPrice","variantId","qty","price","rulesSorted","a","b","appliedRule","appliedDiscountPercent","pct","discountedPrice","discountedAmount","productVariantIds","discountThresholdIdentifier","discountLabel","_b","submit","submitAndCheckout","value","jsx","useBundleBuilder","ctx","useContext","useBundleBuilderDrawer","BundleButton","styles","tweenFunctions","_c","d","c","p","s","tweenFunctions_1","degreesToRads","degrees","randomRange","max","randomInt","ParticleShape","RotationDirection","DEFAULT_FRAME_TIME","Particle","context","getOptions","x","y","colors","initialVelocityX","initialVelocityY","elapsed","gravity","wind","friction","opacity","drawShape","frameTimeMultiplier","rotateDelta","ParticleGenerator","canvas","newParticleX","newParticleY","particlesGenerated","lastNumberOfPieces","run","recycle","numberOfPieces","debug","tweenFunction","tweenDuration","nP","activeCount","tweenedVal","numToAdd","confettiDefaults","tweens.easeInOutQuad","Confetti","opts","computedConfettiDefaults","timestamp","onConfettiComplete","frameRate","lastRunState","lastRecycleState","ref","React","ReactConfettiInternal","extractCanvasProps","confettiOptions","passedProps","canvasStyles","refs","confettiOptionKeys","refProps","prop","val","ReactConfetti","toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","mergeClasses","classes","className","index","array","hasA11yProp","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","iconNode","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","Search","BundleBuilderDrawer","isSearchOpen","setIsSearchOpen","searchQuery","setSearchQuery","searchInputRef","footerRef","celebrationChipRef","windowSize","setWindowSize","confettiKey","setConfettiKey","confettiSource","setConfettiSource","isConfettiActive","setIsConfettiActive","confettiTimerRef","prevBundleSizeForConfettiRef","confettiSettleMs","celebrationKey","setCelebrationKey","celebrationText","setCelebrationText","isCelebrationActive","setIsCelebrationActive","celebrationTimerRef","celebrationDurationMs","formatPercent0dp","formatVariantOptions","selectedOptions","o","name","getVariantPrimaryName","getVariantA11yLabel","isMounted","setIsMounted","closeTimerRef","formatMoney","amount","title","isAtMaxBundleSize","sorted","filteredVariants","tokens","matches","parts","haystack","t","itemsRemaining","best","minRuleDiscountPercent","badgeDiscountPercent","subtotal","total","discountedTotal","maxRuleSize","filledVariants","thresholdByIndex","map","idx","slotCount","isDualButtonAnimationLoaded","setIsDualButtonAnimationLoaded","prevItemsRemainingRef","wasPositive","panelRef","bodyRef","boxSummaryWindowRef","prevBundleSizeRef","scrollVariantRowIntoView","container","row","padding","maxTop","rowCenterOffset","targetTop","nextTop","onKeyDown","onResize","raf","hitThreshold","nextThreshold","targetIdx","el","containerRect","deltaRight","maxLeft","nextLeft","hitRule","k","chipEl","rect","panelRect","originX","originY","source","jsxs","variantPrimaryName","variantOptionText","variantA11y","discountPercentToUse","originalPriceNumber","hasDiscount","discountedPriceNumber","_d","variant","threshold","isFilled","isThreshold","showThreshold","discountText","titleText","Fragment","buttonMode","toProperties","attributes","acc","attr","normalizeVariantId","getCartUrl","refreshAndOpenTheme2CartDrawer","cartUrl","sectionsParam","res","sections","sectionIds","sectionId","htmlString","html","sourceElement","targetElement","drawer","themeCart","postCartJson","endpoint","payload","text","createLiquidCartAdapter","items","line","lineIds"],"mappings":";;AAAO,MAAMA,KAA0B;AAAA,EACrC,UAAU;AAAA,EACV,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AACf;ACHA,eAAsBC,GAAkBC,GAIA;AACtC,QAAMC,IAAM,IAAI,IAAI,6BAA6BD,EAAO,UAAU;AAClE,EAAAC,EAAI,aAAa,IAAI,QAAQD,EAAO,IAAI;AASxC,QAAME,IAAQ,OAPD,MAAM,MAAMD,GAAK;AAAA,IAC5B,QAAQ;AAAA,IACR,QAAQD,EAAO;AAAA,IACf,SAAS,EAAE,gBAAgB,mBAAA;AAAA,EAAmB,CAC/C,GAGwB,OAAO,MAAM,MAAM,IAAI;AAChD,SAAI,CAACE,KAAQ,OAAOA,KAAS,WACpB,EAAE,IAAI,IAAO,OAAO,oBAAA,IAGtBA;AACT;ACvBA,MAAMC,KAAwB;AAMvB,SAASC,KAAqC;AACnD,MAAI,OAAO,SAAW,OAAe,OAAO,eAAiB;AAE3D,WAAO,MAAM,KAAK,IAAA,EAAM,SAAS,EAAE,CAAC,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAGjF,MAAI;AACF,UAAMC,IAAW,aAAa,QAAQF,EAAqB;AAC3D,QAAIE,KAAY,OAAOA,KAAa,YAAYA,EAAS,SAAS;AAChE,aAAOA;AAIT,QAAIC;AACJ,QAAI;AAEF,YAAMC,IAAa,WAAmB;AACtC,UAAIA,KAAA,QAAAA,EAAW;AACb,QAAAD,IAAQC,EAAU,WAAA;AAAA;AAElB,cAAM,IAAI,MAAM,iCAAiC;AAAA,IAErD,QAAQ;AAEN,MAAAD,IAAQ,MAAM,KAAK,IAAA,EAAM,SAAS,EAAE,CAAC,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,IAClF;AAEA,wBAAa,QAAQH,IAAuBG,CAAK,GAC1CA;AAAA,EACT,QAAQ;AAEN,WAAO,MAAM,KAAK,IAAA,EAAM,SAAS,EAAE,CAAC,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,EACjF;AACF;AA0CA,eAAsBE,GACpBC,GACAC,GACAC,GACe;AACf,MAAI,SAAO,SAAW;AAItB,QAAI;AACF,YAAMV,IAAM,IAAI,IAAIQ,GAAmB,OAAO,SAAS,MAAM;AAC7D,MAAAR,EAAI,aAAa,IAAI,QAAQS,CAAI;AAEjC,YAAME,IAAW,MAAM,MAAMX,GAAK;AAAA,QAChC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAAA;AAAA,QAElB,MAAM,KAAK,UAAUU,CAAK;AAAA;AAAA,QAE1B,WAAW;AAAA,MAAA,CACZ;AAED,MAAKC,EAAS,MACZ,QAAQ;AAAA,QACN,wDAAwDA,EAAS,MAAM;AAAA,QACvE,MAAMA,EAAS,OAAO,MAAM,MAAM,yBAAyB;AAAA,MAAA;AAAA,IAGjE,SAASC,GAAO;AAEd,cAAQ,KAAK,6CAA6CA,CAAK;AAAA,IACjE;AACF;AC5CO,MAAMC,KAAuBC,GAAgD,IAAI;AAExF,SAASC,KAAiB;AACxB,MAAI;AAEF,UAAMT,IAAa,WAAmB;AACtC,QAAIA,KAAA,QAAAA,EAAW,WAAY,QAAOA,EAAU,WAAA;AAAA,EAC9C,QAAQ;AAAA,EAER;AACA,SAAO,MAAM,KAAK,IAAA,EAAM,SAAS,EAAE,CAAC,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AACjF;AAEA,SAASU,GAASC,GAAW;AAC3B,SAAK,OAAO,SAASA,CAAC,IACf,KAAK,IAAI,GAAG,KAAK,MAAMA,CAAC,CAAC,IADA;AAElC;AAEO,SAASC,GAAeC,GAA4B;AACzD,QAAM;AAAA,IACJ,YAAAC;AAAA,IACA,MAAAX;AAAA,IACA,aAAAY;AAAA,IACA,cAAAC,IAAe;AAAA,IACf,aAAAC;AAAA,IACA,eAAAC;AAAA,IACA,mBAAmBC;AAAA,IACnB,UAAAC;AAAA,EAAA,IACEP,GAEEX,IAAoBiB,KAA6B,GAAGL,CAAU,gCAE9D,CAACO,GAAQC,CAAS,IAAIC,EAAS,EAAK,GACpC,CAACC,GAASC,CAAU,IAAIF,EAAS,CAACN,CAAW,GAC7C,CAACS,GAAYC,CAAa,IAAIJ,EAAS,EAAK,GAC5C,CAACjB,GAAOsB,CAAQ,IAAIL,EAAwB,IAAI,GAEhD,CAACM,GAAcC,CAAe,IAAIP,GAAwBN,KAAA,gBAAAA,EAAa,iBAAgB,IAAI,GAC3F,CAACc,GAAQC,EAAS,IAAIT,GAA8BN,KAAA,gBAAAA,EAAa,WAAU,IAAI,GAC/E,CAACgB,IAAkBC,EAAmB,IAAIX;AAAA,KAC9CN,KAAA,gBAAAA,EAAa,qBAAoB,CAAA;AAAA,EAAC,GAG9B,CAACkB,IAAiBC,EAAkB,IAAIb;AAAA,IAC5C,OAAO,EAAE,YAAY,IAAI,OAAO,CAAA,EAAC;AAAA,EAAE,GAG/Bc,KAAWC,EAA+B,IAAI;AAEpD,EAAAC,EAAU,MAAM;;AACd,QAAItB,EAAa;AAEjB,KAAAuB,IAAAH,GAAS,YAAT,QAAAG,EAAkB;AAClB,UAAMC,IAAK,IAAI,gBAAA;AACf,IAAAJ,GAAS,UAAUI;AAEnB,UAAMC,IAAUxB,KAAiByB;AAEjC,WAAAlB,EAAW,EAAI,GACfG,EAAS,IAAI,GACbc,EAAQ,EAAE,YAAA5B,GAAY,MAAAX,GAAM,QAAQsC,EAAG,QAAQ,EAC5C,KAAK,CAAC9C,MAAS;AACd,UAAI,CAACA,EAAK,IAAI;AACZ,QAAAiC,EAASjC,EAAK,SAAS,+BAA+B,GACtDqC,GAAU,IAAI,GACdE,GAAoB,CAAA,CAAE,GACtBJ,EAAgB,IAAI;AACpB;AAAA,MACF;AACA,MAAAA,EAAgBnC,EAAK,gBAAgB,IAAI,GACzCqC,GAAUrC,EAAK,MAAM,GACrBuC,GAAoBvC,EAAK,oBAAoB,EAAE;AAAA,IACjD,CAAC,EACA,MAAM,CAACiD,MAAe;AACrB,YAAMC,KAAMD,aAAa,QAAQA,EAAE,UAAU;AAC7C,MAAAhB,EAASiB,EAAG,GACZb,GAAU,IAAI,GACdE,GAAoB,CAAA,CAAE,GACtBJ,EAAgB,IAAI;AAAA,IACtB,CAAC,EACA,QAAQ,MAAML,EAAW,EAAK,CAAC,GAE3B,MAAMgB,EAAG,MAAA;AAAA,EAClB,GAAG,CAAC3B,GAAYX,GAAMc,GAAaC,CAAa,CAAC;AAEjD,QAAM4B,KAAOC,GAAY,MAAM;AAG7B,QAFAzB,EAAU,EAAI,GAEVpB;AACF,UAAI;AACF,cAAM8C,IAAkBnD,GAAA;AACxB,QAAAI,GAAWC,GAAmBC,GAAM;AAAA,UAClC,WAAW;AAAA,UACX,MAAAA;AAAA,UACA,iBAAA6C;AAAA,UACA,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,QAAY,CACnC,EAAE,MAAM,CAAC1C,MAAU;AAElB,kBAAQ,KAAK,qDAAqDA,CAAK;AAAA,QACzE,CAAC;AAAA,MACH,SAASA,GAAO;AAEd,gBAAQ,KAAK,gDAAgDA,CAAK;AAAA,MACpE;AAAA,EAEJ,GAAG,CAACJ,GAAmBC,CAAI,CAAC,GACtB8C,KAAQF,GAAY,MAAMzB,EAAU,EAAK,GAAG,CAAA,CAAE,GAC9C4B,KAASH,GAAY,MAAM;AAE/B,IAAAzB,EAAU,CAAC6B,MAAY;AACrB,UAAI,CAACA,KAECjD;AACF,YAAI;AACF,gBAAM8C,IAAkBnD,GAAA;AACxB,UAAAI,GAAWC,GAAmBC,GAAM;AAAA,YAClC,WAAW;AAAA,YACX,MAAAA;AAAA,YACA,iBAAA6C;AAAA,YACA,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,UAAY,CACnC,EAAE,MAAM,CAAC1C,MAAU;AAClB,oBAAQ,KAAK,qDAAqDA,CAAK;AAAA,UACzE,CAAC;AAAA,QACH,SAASA,GAAO;AACd,kBAAQ,KAAK,kDAAkDA,CAAK;AAAA,QACtE;AAGJ,aAAO,CAAC6C;AAAA,IACV,CAAC;AAAA,EACH,GAAG,CAACjD,GAAmBC,CAAI,CAAC,GAEtBiD,KAAgBC,EAAQ,MAAM;AAClC,UAAMC,IAAM,QAAOvB,KAAA,gBAAAA,EAAQ,kBAAiB,GAAG,GACzCpB,IAAI,OAAO,SAAS2C,CAAG,IAAI,KAAK,MAAMA,CAAG,IAAI;AACnD,WAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK3C,CAAC,CAAC;AAAA,EACrC,GAAG,CAACoB,KAAA,gBAAAA,EAAQ,aAAa,CAAC,GAEpBwB,KAAwBF,EAAQ,MAC7B,IAAI,IAAIpB,GAAiB,IAAI,CAACuB,MAAMA,EAAE,EAAE,CAAC,GAC/C,CAACvB,EAAgB,CAAC,GAEfwB,IAAcV,GAAY,CAACW,GAAuBC,MAAqB;AAE3E,QAAI,CAACJ,GAAsB,IAAIG,CAAa;AAC1C;AAGF,UAAME,IAAIlD,GAASiD,CAAQ;AAC3B,IAAAvB,GAAmB,CAACyB,MAAS;AAC3B,YAAMC,KAAUD,EAAK,WAAWH,CAAa,KAAK,GAC5CK,IAAiBH,IAAIE,IACrBE,IAAoB,OAAO,OAAOH,EAAK,UAAU,EAAE,OAAO,CAACI,GAAKT,MAAMS,KAAOT,KAAK,IAAI,CAAC,GACvFU,IACJH,IAAiB,IACb,KAAK,IAAIA,GAAgB,KAAK,IAAI,GAAGX,KAAgBY,CAAiB,CAAC,IACvED,GAEAI,KAAUL,KAAUI;AAG1B,UAAIE;AACJ,UAAID,MAAW,GAAG;AAChB,cAAM,EAAE,CAACT,CAAa,GAAGW,GAAG,GAAGC,EAAA,IAAST,EAAK;AAC7C,QAAAO,IAAiBE;AAAA,MACnB,MAAA,CAAWR,OAAYK,KACrBC,IAAiBP,EAAK,aAEtBO,IAAiB,EAAE,GAAGP,EAAK,YAAY,CAACH,CAAa,GAAGS,GAAA;AAI1D,UAAII,KAAYV,EAAK;AACrB,UAAIK,IAAQ;AAEV,QAAAK,KAAY,CAAC,GAAGV,EAAK,OAAO,GAAG,MAAM,KAAK,EAAE,QAAQK,KAAS,MAAMR,CAAa,CAAC;AAAA,eACxEQ,IAAQ,GAAG;AAEpB,YAAIM,IAAoB,CAACN;AACzB,cAAMO,IAAyB,CAAA;AAC/B,iBAASC,IAAIb,EAAK,MAAM,SAAS,GAAGa,KAAK,GAAGA,KAAK;AAC/C,gBAAMC,IAAKd,EAAK,MAAMa,CAAC;AACvB,cAAIC,MAAOjB,KAAiBc,IAAoB,GAAG;AACjD,YAAAA;AACA;AAAA,UACF;AACA,UAAAC,EAAa,KAAKE,CAAE;AAAA,QACtB;AACA,QAAAF,EAAa,QAAA,GACbF,KAAYE;AAAA,MACd;AAEA,UAAIL,MAAmBP,EAAK,cAAcU,OAAcV,EAAK,MAAO,QAAOA;AAG3E,UAAI3D;AACF,YAAI;AACF,gBAAM8C,IAAkBnD,GAAA;AACxB,UAAAI,GAAWC,GAAmBC,GAAM;AAAA,YAClC,WAAW;AAAA,YACX,MAAAA;AAAA,YACA,iBAAA6C;AAAA,YACA,QAAQ,EAAE,GAAGa,EAAK,WAAA;AAAA,YAClB,OAAO,EAAE,GAAGO,EAAA;AAAA,YACZ,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,UAAY,CACnC;AAAA,QACH,QAAQ;AAAA,QAER;AAGF,aAAO,EAAE,YAAYA,GAAgB,OAAOG,GAAA;AAAA,IAC9C,CAAC;AAAA,EACH,GAAG,CAACnB,IAAeG,IAAuBrD,GAAmBC,CAAI,CAAC,GAE5DyE,KAAkB7B,GAAY,MAAMX,GAAmB,EAAE,YAAY,CAAA,GAAI,OAAO,CAAA,GAAI,GAAG,EAAE,GAEzFyC,IAAa1C,GAAgB,YAC7B2C,KAAiB3C,GAAgB,OAEjC4C,KAAa1B,EAAQ,MAAM,OAAO,OAAOwB,CAAU,EAAE,OAAO,CAACZ,GAAKL,MAAMK,KAAOL,KAAK,IAAI,CAAC,GAAG,CAACiB,CAAU,CAAC,GAExGG,KAAc3B,EAAQ,MAAM;AAChC,UAAM4B,KAAQlD,KAAA,gBAAAA,EAAQ,UAAS,CAAA,GACzBmD,IAAMD,EAAM,SAAS,KAAK,IAAI,GAAGA,EAAM,IAAI,CAACE,MAAMA,EAAE,aAAa,CAAC,IAAI;AAC5E,WAAO,OAAO,SAASD,CAAG,KAAKA,IAAM,IAAIA,IAAM;AAAA,EACjD,GAAG,CAACnD,CAAM,CAAC,GAELqD,KAAY/B,EAAQ,MACpB,EAAA7B,KAAWE,KACXpB,KACA,EAACyB,KAAA,QAAAA,EAAQ,aACTgD,KAAaC,KAEhB,CAACD,IAAYhD,KAAA,gBAAAA,EAAQ,UAAUzB,GAAOkB,GAASwD,IAAatD,CAAU,CAAC,GAGpE2D,KAAsBtC,GAAY,OAAOuC,MAA8D;;AAC3G,QAAI,CAACF,MAAa,CAACrD,EAAQ;AAE3B,UAAMwD,IAAW9E,GAAA,GACX+E,KAAezD,EAAO,SAAS,IAAI,OAAO,MAAM,GAAG,GAAG,GACtD0D,IAAQ,OAAO,QAAQZ,CAAU,EACpC,IAAI,CAAC,CAACnB,GAAeC,EAAQ,OAAO,EAAE,eAAAD,GAAe,UAAUhD,GAASiD,EAAQ,IAAI,EACpF,OAAO,CAAC+B,MAAMA,EAAE,WAAW,CAAC,EAC5B,OAAO,CAACA,MAAMnC,GAAsB,IAAImC,EAAE,aAAa,CAAC,EACxD,IAAI,CAACA,OAAO;AAAA,MACX,eAAeA,EAAE;AAAA,MACjB,UAAUA,EAAE;AAAA,MACZ,YAAY;AAAA,QACV,EAAE,KAAKnG,GAAwB,UAAU,OAAOgG,EAAA;AAAA,QAChD,EAAE,KAAKhG,GAAwB,cAAc,OAAOyB,EAAA;AAAA,QACpD,EAAE,KAAKzB,GAAwB,cAAc,OAAO,iBAAA;AAAA,QACpD,GAAIiG,IAAc,CAAC,EAAE,KAAKjG,GAAwB,aAAa,OAAOiG,EAAA,CAAa,IAAI,CAAA;AAAA,MAAC;AAAA,IAC1F,EACA;AAEJ,QAAI,CAACC,EAAM,OAAQ;AAGnB,UAAME,KAAO,IAAI,IAAI1D,GAAiB,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAU,CAAC;AACpE,QAAI2D,IAAa;AACjB,eAAW,CAACC,GAAWC,EAAG,KAAK,OAAO,QAAQjB,CAAU,GAAG;AACzD,YAAMjB,KAAIkC,MAAO;AACjB,UAAIlC,MAAK,EAAG;AACZ,YAAMJ,KAAImC,GAAK,IAAIE,CAAS,GACtBE,KAAQ,OAAOvC,MAAA,gBAAAA,GAAG,KAAK;AAC7B,MAAK,OAAO,SAASuC,EAAK,MAC1BH,KAAcG,KAAQnC;AAAA,IACxB;AACA,IAAAgC,IAAa,KAAK,MAAMA,IAAa,GAAG,IAAI;AAG5C,UAAMI,IAAc,CAAC,GAAIjE,EAAO,SAAS,CAAA,CAAG,EAAE,KAAK,CAACkE,GAAGC,OAAMD,EAAE,gBAAgBC,GAAE,aAAa;AAC9F,QAAIC,IAAmD;AACvD,eAAWhB,KAAKa;AACd,MAAIjB,MAAcI,EAAE,kBAAegB,IAAchB;AAGnD,UAAMiB,KAAyBD,KAC1B,MAAM;AACP,YAAME,IAAM,OAAO,WAAWF,EAAa,eAAe;AAC1D,aAAO,OAAO,SAASE,CAAG,KAAKA,IAAM,IAAIA,IAAM;AAAA,IACjD,OACE,MAEEC,IAAkBF,KACpB,KAAK,MAAMR,KAAc,IAAIQ,KAAyB,OAAO,GAAG,IAAI,MACpER,GACEW,KAAmBX,IAAaU,GAEhCE,IAAoBf,EAAM,IAAI,CAACC,MAAMA,EAAE,aAAa,GACpDe,KAA8BN,KAAA,gBAAAA,EAAa,WAAU,IACrDO,MAAgBlE,IAAA2D,KAAA,gBAAAA,EAAa,UAAb,gBAAA3D,EAAoB,WAAU;AAEpD,IAAAb,EAAc,EAAI;AAClB,QAAI;AAQF,UAPI2D,KAAA,QAAAA,EAAS,WACX,MAAMvE,EAAY,oBAAoB0E,CAAK,IAE3C,MAAM1E,EAAY,SAAS0E,CAAK,GAI9BvF;AACF,YAAI;AACF,gBAAM8C,IAAkBnD,GAAA;AACxB,UAAAI,GAAWC,GAAmBC,GAAM;AAAA,YAClC,WAAW;AAAA,YACX,MAAAA;AAAA,YACA,iBAAA6C;AAAA,YACA,UAAAuC;AAAA,YACA,mBAAAiB;AAAA,YACA,YAAAZ;AAAA,YACA,iBAAAU;AAAA,YACA,UAAUzE,KAAgB;AAAA,YAC1B,6BAAA4E;AAAA,YACA,eAAAC;AAAA,YACA,oBAAoBN;AAAA,YACpB,kBAAAG;AAAA,YACA,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,UAAY,CACnC;AAAA,QACH,QAAQ;AAAA,QAER;AAGF,MAAA3B,GAAA,GACA3B,GAAA,IAEA0D,KAAArB,KAAA,gBAAAA,EAAS,eAAT,QAAAqB,GAAA,KAAArB;AAAA,IACF,UAAA;AACE,MAAA3D,EAAc,EAAK;AAAA,IACrB;AAAA,EACF,GAAG;AAAA,IACDyD;AAAA,IACArE;AAAA,IACA6D;AAAA,IACA3B;AAAA,IACAlB;AAAA,IACAf;AAAA,IACAa;AAAA,IACAgD;AAAA,IACAtB;AAAA,IACAtB;AAAA,IACA8C;AAAA,IACA7E;AAAA,IACAC;AAAA,EAAA,CACD,GAEKyG,KAAS7D,GAAY,YAAY;AACrC,UAAMsC;AAAA,MACJ;AAAA,QACE,YAAY,MAAM;;AAChB,WAAA7C,IAAAzB,EAAY,eAAZ,QAAAyB,EAAA,KAAAzB;AAAA,QACF;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ,GAAG,CAACsE,IAAqBtE,CAAW,CAAC,GAE/B8F,KAAoB9D,GAAY,YAAY;AAChD,UAAMsC;AAAA,MACJ;AAAA,QACE,UAAU;AAAA,QACV,YAAY,MAAM;;AAChB,WAAA7C,IAAAzB,EAAY,uBAAZ,QAAAyB,EAAA,KAAAzB;AAAA,QACF;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ,GAAG,CAACsE,IAAqBtE,CAAW,CAAC,GAE/B+F,KAAmCzD;AAAA,IACvC,OAAO;AAAA,MACL,QAAAhC;AAAA,MACA,MAAAyB;AAAA,MACA,OAAAG;AAAA,MACA,QAAAC;AAAA,MACA,SAAA1B;AAAA,MACA,YAAAE;AAAA,MACA,OAAApB;AAAA,MACA,cAAAuB;AAAA,MACA,QAAAE;AAAA,MACA,kBAAAE;AAAA,MACA,YAAA4C;AAAA,MACA,gBAAAC;AAAA,MACA,aAAArB;AAAA,MACA,iBAAAmB;AAAA,MACA,YAAAG;AAAA,MACA,aAAAC;AAAA,MACA,WAAAI;AAAA,MACA,QAAAwB;AAAA,MACA,mBAAAC;AAAA,IAAA;AAAA,IAEF;AAAA,MACExF;AAAA,MACAyB;AAAA,MACAG;AAAA,MACAC;AAAA,MACA1B;AAAA,MACAE;AAAA,MACApB;AAAA,MACAuB;AAAA,MACAE;AAAA,MACAE;AAAA,MACA4C;AAAA,MACAC;AAAA,MACArB;AAAA,MACAmB;AAAA,MACAG;AAAA,MACAC;AAAA,MACAI;AAAA,MACAwB;AAAA,MACAC;AAAA,IAAA;AAAA,EACF;AAGF,SAAO,gBAAAE,EAACxG,GAAqB,UAArB,EAA8B,OAAAuG,IAAe,UAAA1F,EAAA,CAAS;AAChE;ACpeO,SAAS4F,KAAmB;AACjC,QAAMC,IAAMC,GAAW3G,EAAoB;AAC3C,MAAI,CAAC0G;AACH,UAAM,IAAI,MAAM,yDAAyD;AAE3E,SAAOA;AACT;ACIO,SAASE,KAAsD;AACpE,QAAM,EAAE,QAAA9F,GAAQ,MAAAyB,GAAM,OAAAG,GAAO,QAAAC,EAAA,IAAW8D,GAAA;AACxC,SAAO,EAAE,QAAA3F,GAAQ,MAAAyB,GAAM,OAAAG,GAAO,QAAAC,EAAA;AAChC;;;;ACPO,SAASkE,GAAavG,GAA0B;AACrD,QAAM,EAAE,QAAAqC,EAAA,IAAW8D,GAAA;AACnB,SACE,gBAAAD;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS7D;AAAA,MACT,WAAW,CAACmE,GAAO,QAAQxG,EAAM,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAEnE,YAAM,YAAY;AAAA,IAAA;AAAA,EAAA;AAGzB;;;;;ACjBA,MAAIyG,IAAiB;AAAA,IACnB,QAAQ,SAAS,GAAGpB,GAAGqB,GAAIC,GAAG;AAC5B,UAAIC,IAAIF,IAAKrB;AACb,aAAOuB,IAAI,IAAID,IAAItB;AAAA,IACvB;AAAA,IACE,YAAY,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AAChC,UAAIC,IAAIF,IAAKrB;AACb,aAAOuB,KAAK,KAAKD,KAAK,IAAItB;AAAA,IAC9B;AAAA,IACE,aAAa,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AACjC,UAAIC,IAAIF,IAAKrB;AACb,aAAO,CAACuB,KAAK,KAAKD,MAAM,IAAI,KAAKtB;AAAA,IACrC;AAAA,IACE,eAAe,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AACnC,UAAIC,IAAIF,IAAKrB;AACb,cAAK,KAAKsB,IAAI,KAAK,IACVC,IAAI,IAAI,IAAI,IAAIvB,IAEhB,CAACuB,IAAI,KAAM,EAAE,KAAM,IAAI,KAAK,KAAKvB;AAAA,IAE9C;AAAA,IACE,aAAa,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AACjC,UAAIC,IAAIF,IAAKrB;AACb,aAAOuB,KAAK,KAAKD,KAAK,IAAI,IAAItB;AAAA,IAClC;AAAA,IACE,cAAc,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AAClC,UAAIC,IAAIF,IAAKrB;AACb,aAAOuB,MAAM,IAAI,IAAID,IAAI,KAAK,IAAI,IAAI,KAAKtB;AAAA,IAC/C;AAAA,IACE,gBAAgB,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AACpC,UAAIC,IAAIF,IAAKrB;AACb,cAAK,KAAKsB,IAAI,KAAK,IACVC,IAAI,IAAI,IAAI,IAAI,IAAIvB,IAEpBuB,IAAI,MAAM,KAAK,KAAK,IAAI,IAAI,KAAKvB;AAAA,IAE9C;AAAA,IACE,aAAa,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AACjC,UAAIC,IAAIF,IAAKrB;AACb,aAAOuB,KAAK,KAAKD,KAAK,IAAI,IAAI,IAAItB;AAAA,IACtC;AAAA,IACE,cAAc,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AAClC,UAAIC,IAAIF,IAAKrB;AACb,aAAO,CAACuB,MAAM,IAAI,IAAID,IAAI,KAAK,IAAI,IAAI,IAAI,KAAKtB;AAAA,IACpD;AAAA,IACE,gBAAgB,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AACpC,UAAIC,IAAIF,IAAKrB;AACb,cAAK,KAAKsB,IAAI,KAAK,IACVC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAIvB,IAExB,CAACuB,IAAI,MAAM,KAAK,KAAK,IAAI,IAAI,IAAI,KAAKvB;AAAA,IAEnD;AAAA,IACE,aAAa,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AACjC,UAAIC,IAAIF,IAAKrB;AACb,aAAOuB,KAAK,KAAKD,KAAK,IAAI,IAAI,IAAI,IAAItB;AAAA,IAC1C;AAAA,IACE,cAAc,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AAClC,UAAIC,IAAIF,IAAKrB;AACb,aAAOuB,MAAM,IAAI,IAAID,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,KAAKtB;AAAA,IACvD;AAAA,IACE,gBAAgB,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AACpC,UAAIC,IAAIF,IAAKrB;AACb,cAAK,KAAKsB,IAAI,KAAK,IACVC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAIvB,IAE5BuB,IAAI,MAAM,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,KAAKvB;AAAA,IAEtD;AAAA,IACE,YAAY,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AAChC,UAAIC,IAAIF,IAAKrB;AACb,aAAO,CAACuB,IAAI,KAAK,IAAI,IAAID,KAAK,KAAK,KAAK,EAAE,IAAIC,IAAIvB;AAAA,IACtD;AAAA,IACE,aAAa,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AACjC,UAAIC,IAAIF,IAAKrB;AACb,aAAOuB,IAAI,KAAK,IAAI,IAAID,KAAK,KAAK,KAAK,EAAE,IAAItB;AAAA,IACjD;AAAA,IACE,eAAe,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AACnC,UAAIC,IAAIF,IAAKrB;AACb,aAAO,CAACuB,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,IAAID,CAAC,IAAI,KAAKtB;AAAA,IACtD;AAAA,IACE,YAAY,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AAChC,UAAIC,IAAIF,IAAKrB;AACb,aAAQ,KAAG,IAAKA,IAAIuB,IAAI,KAAK,IAAI,GAAG,MAAM,IAAED,IAAI,EAAE,IAAItB;AAAA,IAC1D;AAAA,IACE,aAAa,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AACjC,UAAIC,IAAIF,IAAKrB;AACb,aAAQ,KAAGsB,IAAKtB,IAAEuB,IAAIA,KAAK,CAAC,KAAK,IAAI,GAAG,MAAM,IAAED,CAAC,IAAI,KAAKtB;AAAA,IAC9D;AAAA,IACE,eAAe,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AACnC,UAAIC,IAAIF,IAAKrB;AACb,aAAI,MAAM,IACDA,IAEL,MAAMsB,IACDtB,IAAIuB,KAER,KAAKD,IAAI,KAAK,IACVC,IAAI,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI,EAAE,IAAIvB,IAEpCuB,IAAI,KAAK,CAAC,KAAK,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,KAAKvB;AAAA,IAErD;AAAA,IACE,YAAY,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AAChC,UAAIC,IAAIF,IAAKrB;AACb,aAAO,CAACuB,KAAK,KAAK,KAAK,KAAK,KAAKD,KAAK,CAAC,IAAI,KAAKtB;AAAA,IACpD;AAAA,IACE,aAAa,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AACjC,UAAIC,IAAIF,IAAKrB;AACb,aAAOuB,IAAI,KAAK,KAAK,KAAK,IAAI,IAAID,IAAI,KAAK,CAAC,IAAItB;AAAA,IACpD;AAAA,IACE,eAAe,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AACnC,UAAIC,IAAIF,IAAKrB;AACb,cAAK,KAAKsB,IAAI,KAAK,IACV,CAACC,IAAI,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,KAAKvB,IAEtCuB,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,CAAC,IAAI,KAAKvB;AAAA,IAEzD;AAAA,IACE,eAAe,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AACnC,UAAIC,IAAIF,IAAKrB,GACTD,GAAGyB,GAAGC;AAIV,aAHAA,IAAI,SACJD,IAAI,GACJzB,IAAIwB,GACA,MAAM,IACDvB,KACG,KAAKsB,OAAO,IACftB,IAAIuB,KAERC,MACHA,IAAIF,IAAI,MAENvB,IAAI,KAAK,IAAIwB,CAAC,KAChBxB,IAAIwB,GACJE,IAAID,IAAI,KAERC,IAAID,KAAK,IAAI,KAAK,MAAM,KAAK,KAAKD,IAAIxB,CAAC,GAElC,EAAEA,IAAI,KAAK,IAAI,GAAG,MAAM,KAAK,EAAE,IAAI,KAAK,KAAK,IAAIuB,IAAIG,MAAM,IAAI,KAAK,MAAMD,CAAC,KAAKxB;AAAA,IAC3F;AAAA,IACE,gBAAgB,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AACpC,UAAIC,IAAIF,IAAKrB,GACTD,GAAGyB,GAAGC;AAIV,aAHAA,IAAI,SACJD,IAAI,GACJzB,IAAIwB,GACA,MAAM,IACDvB,KACG,KAAKsB,OAAO,IACftB,IAAIuB,KAERC,MACHA,IAAIF,IAAI,MAENvB,IAAI,KAAK,IAAIwB,CAAC,KAChBxB,IAAIwB,GACJE,IAAID,IAAI,KAERC,IAAID,KAAK,IAAI,KAAK,MAAM,KAAK,KAAKD,IAAIxB,CAAC,GAElCA,IAAI,KAAK,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,KAAK,IAAIuB,IAAIG,MAAM,IAAI,KAAK,MAAMD,CAAC,IAAID,IAAIvB;AAAA,IACtF;AAAA,IACE,kBAAkB,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AACtC,UAAIC,IAAIF,IAAKrB,GACTD,GAAGyB,GAAGC;AAIV,aAHAA,IAAI,SACJD,IAAI,GACJzB,IAAIwB,GACA,MAAM,IACDvB,KACG,KAAKsB,IAAI,OAAO,IACnBtB,IAAIuB,KAERC,MACHA,IAAIF,KAAK,MAAM,OAEbvB,IAAI,KAAK,IAAIwB,CAAC,KAChBxB,IAAIwB,GACJE,IAAID,IAAI,KAERC,IAAID,KAAK,IAAI,KAAK,MAAM,KAAK,KAAKD,IAAIxB,CAAC,GAErC,IAAI,IACC,QAAQA,IAAI,KAAK,IAAI,GAAG,MAAM,KAAK,EAAE,IAAI,KAAK,KAAK,IAAIuB,IAAIG,MAAM,IAAI,KAAK,MAAMD,CAAC,KAAKxB,IAEtFD,IAAI,KAAK,IAAI,GAAG,OAAO,KAAK,EAAE,IAAI,KAAK,KAAK,IAAIuB,IAAIG,MAAM,IAAI,KAAK,MAAMD,CAAC,IAAI,MAAMD,IAAIvB;AAAA,IAErG;AAAA,IACE,YAAY,SAAS,GAAGA,GAAGqB,GAAIC,GAAGG,GAAG;AACnC,UAAIF,IAAIF,IAAKrB;AACb,aAAIyB,MAAM,WACRA,IAAI,UAECF,KAAK,KAAKD,KAAK,MAAMG,IAAI,KAAK,IAAIA,KAAKzB;AAAA,IAClD;AAAA,IACE,aAAa,SAAS,GAAGA,GAAGqB,GAAIC,GAAGG,GAAG;AACpC,UAAIF,IAAIF,IAAKrB;AACb,aAAIyB,MAAM,WACRA,IAAI,UAECF,MAAM,IAAI,IAAID,IAAI,KAAK,MAAMG,IAAI,KAAK,IAAIA,KAAK,KAAKzB;AAAA,IAC/D;AAAA,IACE,eAAe,SAAS,GAAGA,GAAGqB,GAAIC,GAAGG,GAAG;AACtC,UAAIF,IAAIF,IAAKrB;AAIb,aAHIyB,MAAM,WACRA,IAAI,WAED,KAAKH,IAAI,KAAK,IACVC,IAAI,KAAK,IAAI,OAAOE,KAAK,SAAS,KAAK,IAAIA,MAAMzB,IAEjDuB,IAAI,MAAM,KAAK,KAAK,OAAOE,KAAK,SAAS,KAAK,IAAIA,KAAK,KAAKzB;AAAA,IAEzE;AAAA,IACE,cAAc,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AAClC,UAAIC,IAAIF,IAAKrB,GACT1C;AACJ,aAAAA,IAAI8D,EAAe,cAAcE,IAAI,GAAG,GAAGC,GAAGD,CAAC,GACxCC,IAAIjE,IAAI0C;AAAA,IACnB;AAAA,IACE,eAAe,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AACnC,UAAIC,IAAIF,IAAKrB;AACb,cAAK,KAAKsB,KAAK,IAAI,OACVC,KAAK,SAAS,IAAI,KAAKvB,IACrB,IAAI,IAAI,OACVuB,KAAK,UAAU,KAAK,MAAM,QAAQ,IAAI,QAAQvB,IAC5C,IAAI,MAAM,OACZuB,KAAK,UAAU,KAAK,OAAO,QAAQ,IAAI,UAAUvB,IAEjDuB,KAAK,UAAU,KAAK,QAAQ,QAAQ,IAAI,YAAYvB;AAAA,IAEjE;AAAA,IACE,iBAAiB,SAAS,GAAGA,GAAGqB,GAAIC,GAAG;AACrC,UAAIC,IAAIF,IAAKrB,GACT1C;AACJ,aAAI,IAAIgE,IAAI,KACVhE,IAAI8D,EAAe,aAAa,IAAI,GAAG,GAAGG,GAAGD,CAAC,GACvChE,IAAI,MAAM0C,MAEjB1C,IAAI8D,EAAe,cAAc,IAAI,IAAIE,GAAG,GAAGC,GAAGD,CAAC,GAC5ChE,IAAI,MAAMiE,IAAI,MAAMvB;AAAA,IAEjC;AAAA;AAGA,SAAA0B,KAAiBN;;;ACpPjB,SAASO,GAAcC,GAAS;AAC5B,SAAQA,IAAU,KAAK,KAAM;AACjC;AACA,SAASC,EAAY7C,GAAK8C,GAAK;AAC3B,SAAO9C,IAAM,KAAK,OAAM,KAAM8C,IAAM9C;AACxC;AACA,SAAS+C,GAAU/C,GAAK8C,GAAK;AACzB,SAAO,KAAK,MAAM9C,IAAM,KAAK,OAAM,KAAM8C,IAAM9C,IAAM,EAAE;AAC3D;AAEA,IAAIgD;AAAA,CACH,SAAUA,GAAe;AACtB,EAAAA,EAAcA,EAAc,SAAY,CAAC,IAAI,UAC7CA,EAAcA,EAAc,SAAY,CAAC,IAAI,UAC7CA,EAAcA,EAAc,QAAW,CAAC,IAAI;AAChD,GAAGA,OAAkBA,KAAgB,CAAA,EAAG;AACxC,IAAIC;AAAA,CACH,SAAUA,GAAmB;AAC1B,EAAAA,EAAkBA,EAAkB,WAAc,CAAC,IAAI,YACvDA,EAAkBA,EAAkB,WAAc,EAAE,IAAI;AAC5D,GAAGA,OAAsBA,KAAoB,CAAA,EAAG;AAChD,MAAMC,KAAqB,MAAO;AAClC,MAAMC,GAAS;AAAA,EACX,YAAYC,GAASC,GAAYC,GAAGC,GAAG;AACnC,SAAK,aAAaF;AAClB,UAAM,EAAE,QAAAG,GAAQ,kBAAAC,GAAkB,kBAAAC,EAAgB,IAAK,KAAK,WAAU;AACtE,SAAK,UAAUN,GACf,KAAK,IAAIE,GACT,KAAK,IAAIC,GACT,KAAK,IAAIV,EAAY,GAAG,EAAE,GAC1B,KAAK,IAAIA,EAAY,GAAG,EAAE,GAC1B,KAAK,SAASA,EAAY,GAAG,EAAE,GAC/B,KAAK,KACD,OAAOY,KAAqB,WACtBZ,EAAY,CAACY,GAAkBA,CAAgB,IAC/CZ,EAAYY,EAAiB,KAAKA,EAAiB,GAAG,GAChE,KAAK,KACD,OAAOC,KAAqB,WACtBb,EAAY,CAACa,GAAkB,CAAC,IAChCb,EAAYa,EAAiB,KAAKA,EAAiB,GAAG,GAChE,KAAK,QAAQX,GAAU,GAAG,CAAC,GAC3B,KAAK,QAAQJ,GAAcE,EAAY,GAAG,GAAG,CAAC,GAC9C,KAAK,cAAcA,EAAY,MAAM,GAAG,GACxC,KAAK,QAAQW,EAAO,KAAK,MAAM,KAAK,OAAM,IAAKA,EAAO,MAAM,CAAC,GAC7D,KAAK,UAAUX,EAAY,GAAG,CAAC,GAC/B,KAAK,oBAAoBA,EAAY,GAAG,CAAC,IACnCI,GAAkB,WAClBA,GAAkB;AAAA,EAC5B;AAAA,EACA,OAAOU,GAAS;AACZ,UAAM,EAAE,SAAAC,GAAS,MAAAC,GAAM,UAAAC,GAAU,SAAAC,GAAS,WAAAC,EAAS,IAAK,KAAK,WAAU,GACjEC,IAAsBN,IAAUT;AACtC,SAAK,KAAK,KAAK,KAAKe,GACpB,KAAK,KAAK,KAAK,KAAKA,GACpB,KAAK,MAAML,IAAUK,GACrB,KAAK,MAAMJ,IAAOI,GAClB,KAAK,MAAMH,KAAYG,GACvB,KAAK,MAAMH,KAAYG,GACnB,KAAK,WAAW,KAChB,KAAK,sBAAsBhB,GAAkB,WAC7C,KAAK,oBAAoBA,GAAkB,WAEtC,KAAK,WAAW,MACrB,KAAK,sBAAsBA,GAAkB,aAC7C,KAAK,oBAAoBA,GAAkB;AAE/C,UAAMiB,IAAc,MAAM,KAAK,oBAAoBD;AAcnD,QAbA,KAAK,WAAWC,GAChB,KAAK,SAAS,KAAK,aACnB,KAAK,QAAQ,KAAI,GACjB,KAAK,QAAQ,UAAU,KAAK,GAAG,KAAK,CAAC,GACrC,KAAK,QAAQ,OAAO,KAAK,KAAK,GAC9B,KAAK,QAAQ,MAAM,GAAG,KAAK,OAAO,GAClC,KAAK,QAAQ,OAAO,KAAK,KAAK,GAC9B,KAAK,QAAQ,UAAS,GACtB,KAAK,QAAQ,YAAY,KAAK,OAC9B,KAAK,QAAQ,cAAc,KAAK,OAChC,KAAK,QAAQ,cAAcH,GAC3B,KAAK,QAAQ,UAAU,SACvB,KAAK,QAAQ,YAAY,GACrBC,KAAa,OAAOA,KAAc;AAClC,MAAAA,EAAU,KAAK,MAAM,KAAK,OAAO;AAAA;AAGjC,cAAQ,KAAK,OAAK;AAAA,QACd,KAAKhB,GAAc,QAAQ;AACvB,eAAK,QAAQ,UAAS,GACtB,KAAK,QAAQ,IAAI,GAAG,GAAG,KAAK,QAAQ,GAAG,IAAI,KAAK,EAAE,GAClD,KAAK,QAAQ,KAAI;AACjB;AAAA,QACJ;AAAA,QACA,KAAKA,GAAc,QAAQ;AACvB,eAAK,QAAQ,SAAS,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;AAC9D;AAAA,QACJ;AAAA,QACA,KAAKA,GAAc,OAAO;AACtB,eAAK,QAAQ,SAAS,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AAClE;AAAA,QACJ;AAAA,MAChB;AAEQ,SAAK,QAAQ,UAAS,GACtB,KAAK,QAAQ,QAAO;AAAA,EACxB;AACJ;AAEA,MAAMmB,GAAkB;AAAA,EACpB,YAAYC,GAAQf,GAAY;AAC5B,SAAK,IAAI,GACT,KAAK,IAAI,GACT,KAAK,IAAI,GACT,KAAK,IAAI,GACT,KAAK,qBAAqB,GAC1B,KAAK,gBAAgB,GACrB,KAAK,YAAY,GACjB,KAAK,YAAY,CAAA,GACjB,KAAK,qBAAqB,GAC1B,KAAK,mBAAmB,CAAC7D,MAAM;AAC3B,WAAK,UAAU,OAAOA,GAAG,CAAC;AAAA,IAC9B,GACA,KAAK,cAAc,MAAM;AACrB,YAAM6E,IAAexB,EAAY,KAAK,GAAG,KAAK,IAAI,KAAK,CAAC,GAClDyB,IAAezB,EAAY,KAAK,GAAG,KAAK,IAAI,KAAK,CAAC;AACxD,aAAO,IAAIM,GAAS,KAAK,SAAS,KAAK,YAAYkB,GAAcC,CAAY;AAAA,IACjF,GACA,KAAK,UAAU,CAACX,MAAY;AACxB,YAAM,EAAE,QAAAS,GAAQ,SAAAhB,GAAS,oBAAAmB,GAAoB,oBAAAC,EAAkB,IAAK,MAC9D,EAAE,KAAAC,GAAK,SAAAC,GAAS,gBAAAC,GAAgB,OAAAC,GAAO,eAAAC,GAAe,eAAAC,EAAa,IAAM,KAAK,WAAU;AAC9F,UAAI,CAACL;AACD,eAAO;AAEX,YAAMM,IAAK,KAAK,UAAU,QACpBC,IAAcN,IAAUK,IAAKR;AAEnC,UAAIS,IAAcL,GAAgB;AAE9B,QAAIH,MAAuBG,MACvB,KAAK,gBAAgB,GACrB,KAAK,YAAYK,GACjB,KAAK,qBAAqBL,IAG9B,KAAK,gBAAgB,KAAK,IAAIG,GAAe,KAAK,IAAI,GAAG,KAAK,gBAAgBnB,CAAO,CAAC;AACtF,cAAMsB,IAAaJ,EAAc,KAAK,eAAe,KAAK,WAAWF,GAAgBG,CAAa,GAC5FI,IAAW,KAAK,MAAMD,IAAaD,CAAW;AACpD,iBAASxF,IAAI,GAAGA,IAAI0F,GAAU1F;AAC1B,eAAK,UAAU,KAAK,KAAK,YAAW,CAAE;AAE1C,aAAK,sBAAsB0F;AAAA,MAC/B;AACA,MAAIN,MAEAxB,EAAQ,OAAO,mBACfA,EAAQ,YAAY,QACpBA,EAAQ,YAAY,SACpBA,EAAQ,SAAS,cAAc2B,CAAE,IAAIX,EAAO,QAAQ,IAAIA,EAAO,SAAS,EAAE;AAG9E,eAAS5E,IAAI,KAAK,UAAU,SAAS,GAAGA,KAAK,GAAGA,KAAK;AACjD,cAAMgD,IAAI,KAAK,UAAUhD,CAAC;AAE1B,QAAAgD,EAAE,OAAOmB,CAAO,IAEZnB,EAAE,IAAI4B,EAAO,UACb5B,EAAE,IAAI,QACNA,EAAE,IAAI4B,EAAO,QAAQ,OACrB5B,EAAE,IAAI,UACFkC,KAAWM,KAAeL,IAE1B,KAAK,UAAUnF,CAAC,IAAI,KAAK,YAAW,IAGpC,KAAK,iBAAiBA,CAAC;AAAA,MAGnC;AACA,aAAOuF,IAAK,KAAKC,IAAcL;AAAA,IACnC,GACA,KAAK,SAASP;AACd,UAAMrC,IAAM,KAAK,OAAO,WAAW,IAAI;AACvC,QAAI,CAACA;AACD,YAAM,IAAI,MAAM,8BAA8B;AAElD,SAAK,UAAUA,GACf,KAAK,aAAasB;AAAA,EACtB;AACJ;AAEA,MAAM8B,KAAmB;AAAA,EACrB,OAAO,OAAO,SAAW,MAAc,OAAO,aAAa;AAAA,EAC3D,QAAQ,OAAO,SAAW,MAAc,OAAO,cAAc;AAAA,EAC7D,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,QAAQ;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACR;AAAA,EACI,SAAS;AAAA,EACT,OAAO;AAAA,EACP,eAAeC,GAAAA;AAAAA,EACf,eAAe;AAAA,EACf,SAAS;AAAA,EACT,KAAK;AACT;AACA,MAAMC,GAAS;AAAA,EACX,YAAYjB,GAAQkB,GAAM;AACtB,SAAK,gBAAgB,GACrB,KAAK,yBAAyB,CAACA,MAAS;AACpC,YAAMC,IAA2B;AAAA,QAC7B,gBAAgB;AAAA,UACZ,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG,KAAK,OAAO;AAAA,UACf,GAAG;AAAA,QACvB;AAAA,MACA;AACY,WAAK,WAAW;AAAA,QACZ,GAAGA;AAAA,QACH,GAAGJ;AAAA,QACH,GAAGG;AAAA,MACnB,GACY,OAAO,OAAO,MAAMA,EAAK,cAAc;AAAA,IAC3C,GACA,KAAK,SAAS,CAACE,IAAY,MAAM;AAC7B,YAAM,EAAE,SAAS,EAAE,KAAAf,GAAK,oBAAAgB,GAAoB,WAAAC,KAAa,QAAAtB,GAAQ,SAAAhB,EAAO,IAAM,MAExEO,IAAU,KAAK,IAAI6B,IAAY,KAAK,eAAe,EAAE;AAE3D,UAAIE,KAAa/B,IAAU,MAAO+B,GAAW;AACzC,aAAK,QAAQ,sBAAsB,KAAK,MAAM;AAC9C;AAAA,MACJ;AACA,WAAK,gBAAgBF,KAAaE,IAAY/B,IAAU+B,IAAY,IAChEjB,MACArB,EAAQ,YAAY,SACpBA,EAAQ,UAAU,GAAG,GAAGgB,EAAO,OAAOA,EAAO,MAAM,IAEnD,KAAK,UAAU,QAAQT,CAAO,IAC9B,KAAK,QAAQ,sBAAsB,KAAK,MAAM,KAG1C8B,KACA,OAAOA,KAAuB,cAC9B,KAAK,UAAU,qBAAqB,KACpCA,EAAmB,KAAK,MAAM,IAAI,GAEtC,KAAK,SAAS,MAAM;AAAA,IAE5B,GACA,KAAK,QAAQ,MAAM;AACf,MAAI,KAAK,aAAa,KAAK,UAAU,qBAAqB,MACtD,KAAK,UAAU,qBAAqB,GACpC,KAAK,UAAU,YAAY,CAAA,GAC3B,KAAK,UAAU,qBAAqB;AAAA,IAE5C,GACA,KAAK,OAAO,MAAM;AACd,WAAK,UAAU,EAAE,KAAK,GAAK,GACvB,KAAK,UACL,qBAAqB,KAAK,KAAK,GAC/B,KAAK,QAAQ;AAAA,IAErB,GACA,KAAK,SAASrB;AACd,UAAMrC,IAAM,KAAK,OAAO,WAAW,IAAI;AACvC,QAAI,CAACA;AACD,YAAM,IAAI,MAAM,8BAA8B;AAElD,SAAK,UAAUA,GACf,KAAK,YAAY,IAAIoC,GAAkB,KAAK,QAAQ,MAAM,KAAK,OAAO,GACtE,KAAK,UAAUmB,GACf,KAAK,OAAM;AAAA,EACf;AAAA,EACA,IAAI,UAAU;AACV,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,IAAI,QAAQA,GAAM;;AACd,UAAMK,KAAerI,IAAA,KAAK,aAAL,gBAAAA,EAAe,KAC9BsI,KAAmBnE,IAAA,KAAK,aAAL,gBAAAA,EAAe;AACxC,SAAK,uBAAuB6D,CAAI,GAC5B,KAAK,cACL,OAAO,OAAO,KAAK,WAAW,KAAK,QAAQ,cAAc,GACrD,OAAOA,EAAK,WAAY,aACxBA,EAAK,WACLM,MAAqB,OACrB,KAAK,UAAU,qBAAqB,KAAK,UAAU,UAAU,UAGjE,OAAON,EAAK,OAAQ,aAAaA,EAAK,OAAOK,MAAiB,MAC9D,KAAK,OAAM;AAAA,EAEnB;AACJ;AAEA,MAAME,KAAMC,GAAM,UAAS;AAC3B,MAAMC,WAA8BD,GAAM,UAAU;AAAA,EAChD,YAAYnK,GAAO;AACf,UAAMA,CAAK,GACX,KAAK,SAASmK,GAAM,UAAS,GAC7B,KAAK,SAASnK,EAAM,aAAakK;AAAA,EACrC;AAAA,EACA,oBAAoB;AAChB,QAAI,KAAK,OAAO,SAAS;AACrB,YAAMP,IAAOU,GAAmB,KAAK,KAAK,EAAE,CAAC;AAC7C,WAAK,WAAW,IAAIX,GAAS,KAAK,OAAO,SAASC,CAAI;AAAA,IAC1D;AAAA,EACJ;AAAA,EACA,qBAAqB;AACjB,UAAMW,IAAkBD,GAAmB,KAAK,KAAK,EAAE,CAAC;AACxD,IAAI,KAAK,aACL,KAAK,SAAS,UAAUC;AAAA,EAEhC;AAAA,EACA,uBAAuB;AACnB,IAAI,KAAK,YACL,KAAK,SAAS,KAAI,GAEtB,KAAK,WAAW;AAAA,EACpB;AAAA,EACA,SAAS;AACL,UAAM,CAACA,GAAiBC,CAAW,IAAIF,GAAmB,KAAK,KAAK,GAC9DG,IAAe;AAAA,MACjB,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,eAAe;AAAA,MACf,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,GAAGD,EAAY;AAAA,IAC3B;AACQ,WAAQrE,EAAI,UAAU,EAAE,OAAOoE,EAAgB,OAAO,QAAQA,EAAgB,QAAQ,KAAK,KAAK,QAAQ,GAAGC,GAAa,OAAOC,GAAc;AAAA,EACjJ;AACJ;AACAJ,GAAsB,eAAe;AAAA,EACjC,GAAGZ;AACP;AACAY,GAAsB,cAAc;AACpC,SAASC,GAAmBrK,GAAO;AAC/B,QAAMsK,IAAkB,CAAA,GAClBG,IAAO,CAAA,GACPhH,IAAO,CAAA,GACPiH,IAAqB;AAAA,IACvB,GAAG,OAAO,KAAKlB,EAAgB;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACR,GACUmB,IAAW,CAAC,WAAW;AAC7B,aAAWC,KAAQ5K,GAAO;AACtB,UAAM6K,IAAM7K,EAAM4K,CAAI;AACtB,IAAIF,EAAmB,SAASE,CAAI,IAChCN,EAAgBM,CAAI,IAAIC,IAEnBF,EAAS,SAASC,CAAI,IAC3BD,EAASC,CAAI,IAAIC,IAGjBpH,EAAKmH,CAAI,IAAIC;AAAA,EAErB;AACA,SAAO,CAACP,GAAiB7G,GAAMgH,CAAI;AACvC;AACA,MAAMK,KAAgBX,GAAM,WAAW,CAACnK,GAAOkK,MAAQhE,EAAIkE,IAAuB,EAAE,WAAWF,GAAK,GAAGlK,EAAK,CAAE,CAAC;ACnY/G;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,MAAM+K,KAAc,CAACC,MAAWA,EAAO,QAAQ,sBAAsB,OAAO,EAAE,YAAW,GACnFC,KAAc,CAACD,MAAWA,EAAO;AAAA,EACrC;AAAA,EACA,CAACE,GAAOC,GAAIC,MAAOA,IAAKA,EAAG,YAAW,IAAKD,EAAG,YAAW;AAC3D,GACME,KAAe,CAACL,MAAW;AAC/B,QAAMM,IAAYL,GAAYD,CAAM;AACpC,SAAOM,EAAU,OAAO,CAAC,EAAE,YAAW,IAAKA,EAAU,MAAM,CAAC;AAC9D,GACMC,KAAe,IAAIC,MAAYA,EAAQ,OAAO,CAACC,GAAWC,GAAOC,MAC9D,EAAQF,KAAcA,EAAU,KAAI,MAAO,MAAME,EAAM,QAAQF,CAAS,MAAMC,CACtF,EAAE,KAAK,GAAG,EAAE,KAAI,GACXE,KAAc,CAAC5L,MAAU;AAC7B,aAAW4K,KAAQ5K;AACjB,QAAI4K,EAAK,WAAW,OAAO,KAAKA,MAAS,UAAUA,MAAS;AAC1D,aAAO;AAGb;ACzBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,IAAIiB,KAAoB;AAAA,EACtB,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,eAAe;AAAA,EACf,gBAAgB;AAClB;ACjBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA,MAAMC,KAAOC;AAAA,EACX,CAAC;AAAA,IACC,OAAAC,IAAQ;AAAA,IACR,MAAAC,IAAO;AAAA,IACP,aAAAC,IAAc;AAAA,IACd,qBAAAC;AAAA,IACA,WAAAV,IAAY;AAAA,IACZ,UAAAlL;AAAA,IACA,UAAA6L;AAAA,IACA,GAAG3I;AAAA,EACP,GAAKyG,MAAQmC;AAAA,IACT;AAAA,IACA;AAAA,MACE,KAAAnC;AAAA,MACA,GAAG2B;AAAA,MACH,OAAOI;AAAA,MACP,QAAQA;AAAA,MACR,QAAQD;AAAA,MACR,aAAaG,IAAsB,OAAOD,CAAW,IAAI,KAAK,OAAOD,CAAI,IAAIC;AAAA,MAC7E,WAAWX,GAAa,UAAUE,CAAS;AAAA,MAC3C,GAAG,CAAClL,KAAY,CAACqL,GAAYnI,CAAI,KAAK,EAAE,eAAe,OAAM;AAAA,MAC7D,GAAGA;AAAA,IACT;AAAA,IACI;AAAA,MACE,GAAG2I,EAAS,IAAI,CAAC,CAACE,GAAKC,CAAK,MAAMF,GAAcC,GAAKC,CAAK,CAAC;AAAA,MAC3D,GAAG,MAAM,QAAQhM,CAAQ,IAAIA,IAAW,CAACA,CAAQ;AAAA,IACvD;AAAA,EACA;AACA;ACvCA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA,MAAMiM,KAAmB,CAACC,GAAUL,MAAa;AAC/C,QAAMM,IAAYX;AAAA,IAChB,CAAC,EAAE,WAAAN,GAAW,GAAGzL,EAAK,GAAIkK,MAAQmC,GAAcP,IAAM;AAAA,MACpD,KAAA5B;AAAA,MACA,UAAAkC;AAAA,MACA,WAAWb;AAAA,QACT,UAAUR,GAAYM,GAAaoB,CAAQ,CAAC,CAAC;AAAA,QAC7C,UAAUA,CAAQ;AAAA,QAClBhB;AAAA,MACR;AAAA,MACM,GAAGzL;AAAA,IACT,CAAK;AAAA,EACL;AACE,SAAA0M,EAAU,cAAcrB,GAAaoB,CAAQ,GACtCC;AACT;AC1BA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMC,KAAa;AAAA,EACjB,CAAC,QAAQ,EAAE,GAAG,oBAAoB,KAAK,SAAQ,CAAE;AAAA,EACjD,CAAC,UAAU,EAAE,IAAI,MAAM,IAAI,MAAM,GAAG,KAAK,KAAK,SAAQ,CAAE;AAC1D,GACMC,KAASJ,GAAiB,UAAUG,EAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACH7C,SAASE,GAAoB7M,GAAiC;;AACnE,QAAM;AAAA,IACJ,QAAAQ;AAAA,IACA,OAAA4B;AAAA,IACA,SAAAzB;AAAA,IACA,YAAAE;AAAA,IACA,OAAApB;AAAA,IACA,cAAAuB;AAAA,IACA,QAAAE;AAAA,IACA,kBAAAE;AAAA,IACA,YAAA4C;AAAA,IACA,gBAAAC;AAAA,IACA,aAAArB;AAAA,IACA,YAAAsB;AAAA,IACA,aAAAC;AAAA,IACA,WAAAI;AAAA,IACA,QAAAwB;AAAA,IACA,mBAAAC;AAAA,EAAA,IACEG,GAAA,GAEE,CAAC2G,GAAcC,CAAe,IAAIrM,EAAS,EAAK,GAChD,CAACsM,GAAaC,CAAc,IAAIvM,EAAS,EAAE,GAC3CwM,KAAiBzL,EAAgC,IAAI,GACrD0L,KAAY1L,EAA2B,IAAI,GAC3C2L,KAAqB3L,EAA8B,IAAI,GAEvD,CAAC4L,IAAYC,EAAa,IAAI5M,EAA4C,MAC1E,OAAO,SAAW,MAAoB,EAAE,OAAO,GAAG,QAAQ,EAAA,IACvD,EAAE,OAAO,OAAO,YAAY,QAAQ,OAAO,YAAA,CACnD,GAEK,CAAC6M,IAAaC,EAAc,IAAI9M,EAAS,CAAC,GAC1C,CAAC+M,IAAgBC,EAAiB,IAAIhN,EAAgE,IAAI,GAC1G,CAACiN,IAAkBC,EAAmB,IAAIlN,EAAS,EAAK,GACxDmN,IAAmBpM,EAAsB,IAAI,GAC7CqM,KAA+BrM,EAAeyC,CAAU,GACxD6J,IAAmB,KAEnB,CAACC,IAAgBC,EAAiB,IAAIvN,EAAS,CAAC,GAChD,CAACwN,IAAiBC,EAAkB,IAAIzN,EAAwB,IAAI,GACpE,CAAC0N,IAAqBC,EAAsB,IAAI3N,EAAS,EAAK,GAC9D4N,KAAsB7M,EAAsB,IAAI,GAChD8M,KAAwB,MAExBC,IAAmB,CAACvI,MAAkB;AAC1C,UAAMnG,IAAI,OAAO,WAAWmG,CAAK;AACjC,WAAK,OAAO,SAASnG,CAAC,IACf,OAAO,KAAK,MAAMA,CAAC,CAAC,IADKmG;AAAA,EAElC,GAEMwI,IAAuB,CAACC,MAA+E;AAC3G,UAAM/E,KAAQ+E,KAAmB,CAAA,GAAI,OAAO,CAACC,MAAM;;AACjD,YAAMC,KAAOjN,IAAAgN,KAAA,gBAAAA,EAAG,SAAH,gBAAAhN,EAAS,QAChBsE,KAAQH,IAAA6I,KAAA,gBAAAA,EAAG,UAAH,gBAAA7I,EAAU;AAExB,aADI,GAAC8I,KAAQ,CAAC3I,KACV2I,EAAK,kBAAkB;AAAA,IAE7B,CAAC;AACD,WAAKjF,EAAK,SACHA,EAAK,IAAI,CAACgF,MAAM,GAAGA,EAAE,IAAI,KAAKA,EAAE,KAAK,EAAE,EAAE,KAAK,KAAK,IADjC;AAAA,EAE3B,GAEME,IAAwB,CAAClM,MAAyC;;AACtE,aAAOhB,IAAAgB,EAAE,YAAF,gBAAAhB,EAAW,UAASgB,EAAE,eAAeA,EAAE;AAAA,EAChD,GAEMmM,IAAsB,CAACnM,MAAyC;AACpE,UAAMiM,IAAOC,EAAsBlM,CAAC,GAC9BgH,IAAO8E,EAAqB9L,EAAE,eAAe;AACnD,WAAO,CAACiM,GAAMjF,CAAI,EAAE,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,EAChD,GAEM,CAACoF,IAAWC,CAAY,IAAItO,EAASF,CAAM,GAC3CyO,IAAgBxN,EAAsB,IAAI,GAE1CyN,IAAc,CAACC,MAAmB;AACtC,UAAMrP,IAAI,OAAOqP,CAAM;AACvB,QAAI,CAAC,OAAO,SAASrP,CAAC,EAAG,QAAOqP;AAEhC,QAAInO;AACF,UAAI;AACF,eAAO,IAAI,KAAK,aAAa,QAAW,EAAE,OAAO,YAAY,UAAUA,EAAA,CAAc,EAAE,OAAOlB,CAAC;AAAA,MACjG,QAAQ;AAAA,MAER;AAGF,WAAO,IAAIA,EAAE,QAAQ,CAAC,CAAC;AAAA,EACzB,GAEMsP,OAAQzN,KAAAT,KAAA,gBAAAA,EAAQ,UAAR,gBAAAS,GAAe,WAAU,qBACjCY,IAAgBC,EAAQ,MAAM;AAClC,UAAMC,IAAM,QAAOvB,KAAA,gBAAAA,EAAQ,kBAAiB,GAAG,GACzCpB,IAAI,OAAO,SAAS2C,CAAG,IAAI,KAAK,MAAMA,CAAG,IAAI;AACnD,WAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK3C,CAAC,CAAC;AAAA,EACrC,GAAG,CAACoB,KAAA,gBAAAA,EAAQ,aAAa,CAAC,GACpBmO,KAAoBnL,KAAc3B,GAElC+M,IAAS9M,EAAQ,MACd,CAAC,GAAGpB,CAAgB,EAAE,KAAK,CAACgE,GAAGC,MAAMD,EAAE,YAAY,cAAcC,EAAE,WAAW,CAAC,GACrF,CAACjE,CAAgB,CAAC,GAEfmO,IAAmB/M,EAAQ,MAAM;AACrC,UAAMO,IAAIiK,EAAY,KAAA,EAAO,YAAA;AAC7B,QAAI,CAACjK,EAAG,QAAOuM;AAEf,UAAME,IAASzM,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO,GACtC0M,IAAU,CAAC9M,MAA+B;;AAC9C,YAAM+M,IAAkB,CAAA;AACxB,MAAAA,EAAM,KAAK/M,EAAE,WAAW,IACpBhB,IAAAgB,EAAE,YAAF,QAAAhB,EAAW,WAAa,KAAKgB,EAAE,QAAQ,KAAK;AAChD,iBAAWgM,KAAKhM,EAAE,mBAAmB,CAAA;AACnC,QAAA+M,EAAM,KAAKf,EAAE,IAAI,GACjBe,EAAM,KAAKf,EAAE,KAAK;AAEpB,YAAMgB,IAAWD,EAAM,KAAK,GAAG,EAAE,YAAA;AACjC,aAAOF,EAAO,MAAM,CAACI,MAAMD,EAAS,SAASC,CAAC,CAAC;AAAA,IACjD;AAEA,WAAON,EAAO,OAAOG,CAAO;AAAA,EAC9B,GAAG,CAACzC,GAAasC,CAAM,CAAC,GAElBnK,IAAc3C,EAAQ,MACnB,CAAC,IAAItB,KAAA,gBAAAA,EAAQ,UAAS,CAAA,CAAG,EAAE,KAAK,CAACkE,GAAGC,MAAMD,EAAE,gBAAgBC,EAAE,aAAa,GACjF,CAACnE,KAAA,gBAAAA,EAAQ,KAAK,CAAC,GAEZ2O,IAAiBrN,EAAQ,MAAM,KAAK,IAAI,GAAG2B,IAAcD,CAAU,GAAG,CAACA,GAAYC,CAAW,CAAC,GAE/FmB,KAAc9C,EAAQ,MAAM;AAChC,QAAIsN,IAAO;AACX,eAAWxL,KAAKa;AACd,MAAIjB,KAAcI,EAAE,kBAAewL,IAAOxL;AAE5C,WAAOwL;AAAA,EACT,GAAG,CAAC5L,GAAYiB,CAAW,CAAC,GAEtBI,IAAyB/C,EAAQ,MAAM;AAC3C,QAAI,CAAC8C,GAAa,QAAO;AACzB,UAAME,IAAM,OAAO,WAAWF,GAAY,eAAe;AACzD,WAAI,CAAC,OAAO,SAASE,CAAG,KAAKA,KAAO,IAAU,OACvCA;AAAA,EACT,GAAG,CAACF,EAAW,CAAC,GAEVyK,KAAyBvN,EAAQ,MAAM;AAC3C,UAAM8B,IAAIa,EAAY,CAAC;AACvB,QAAI,CAACb,EAAG,QAAO;AACf,UAAMkB,IAAM,OAAO,WAAWlB,EAAE,eAAe;AAC/C,WAAI,CAAC,OAAO,SAASkB,CAAG,KAAKA,KAAO,IAAU,OACvCA;AAAA,EACT,GAAG,CAACL,CAAW,CAAC,GAEV6K,KAAuBzK,KAA0BwK,IAEjDE,KAAWzN,EAAQ,MAAM;AAC7B,UAAMsC,IAAO,IAAI,IAAI1D,EAAiB,IAAI,CAACuB,MAAM,CAACA,EAAE,IAAIA,CAAC,CAAU,CAAC;AACpE,QAAIuN,IAAQ;AACZ,eAAW,CAAClL,GAAWC,CAAG,KAAK,OAAO,QAAQjB,CAAU,GAAG;AACzD,YAAMjB,IAAIkC,KAAO;AACjB,UAAIlC,KAAK,EAAG;AACZ,YAAMJ,IAAImC,EAAK,IAAIE,CAAS,GACtBE,IAAQ,OAAOvC,KAAA,gBAAAA,EAAG,KAAK;AAC7B,MAAK,OAAO,SAASuC,CAAK,MAC1BgL,KAAShL,IAAQnC;AAAA,IACnB;AAEA,WAAO,KAAK,MAAMmN,IAAQ,GAAG,IAAI;AAAA,EACnC,GAAG,CAAC9O,GAAkB4C,CAAU,CAAC,GAE3BmM,KAAkB3N,EAAQ,MAAM;AACpC,QAAI,CAAC+C,EAAwB,QAAO0K;AACpC,UAAMC,IAAQD,MAAY,IAAI1K,IAAyB;AACvD,WAAO,KAAK,MAAM2K,IAAQ,GAAG,IAAI;AAAA,EACnC,GAAG,CAAC3K,GAAwB0K,EAAQ,CAAC,GAE/BG,KAAc5N,EAAQ,MACrB2C,EAAY,SACV,KAAK,IAAI,GAAGA,EAAY,IAAI,CAACb,MAAMA,EAAE,aAAa,CAAC,IAD1B,GAE/B,CAACa,CAAW,CAAC,GAEVkL,KAAiB7N,EAAQ,MAAM;AACnC,UAAMsC,IAAO,IAAI,IAAI1D,EAAiB,IAAI,CAACuB,MAAM,CAACA,EAAE,IAAIA,CAAC,CAAU,CAAC;AACpE,WAAOsB,EACJ,IAAI,CAACe,MAAcF,EAAK,IAAIE,CAAS,CAAC,EACtC,OAAO,CAACrC,MAA8C,EAAQA,CAAE;AAAA,EACrE,GAAG,CAACvB,GAAkB6C,CAAc,CAAC,GAE/BqM,KAAmB9N,EAAQ,MAAM;;AAErC,UAAM+N,wBAAU,IAAA;AAChB,eAAWjM,KAAKa,GAAa;AAC3B,YAAMqL,IAAM,KAAK,IAAI,GAAGlM,EAAE,gBAAgB,CAAC;AAC3C,MAAAiM,EAAI,IAAIC,GAAK;AAAA,QACX,iBAAiBlM,EAAE;AAAA,QACnB,eAAeA,EAAE;AAAA,QACjB,SAAO3C,IAAA2C,EAAE,UAAF,gBAAA3C,EAAS,WAAU,OAAO2C,EAAE,aAAa;AAAA,MAAA,CACjD;AAAA,IACH;AACA,WAAOiM;AAAA,EACT,GAAG,CAACpL,CAAW,CAAC,GAEVsL,KAAYjO,EAAQ,MAEjB,KAAK,IAAI4N,MAAejM,GAAakM,GAAe,MAAM,GAChE,CAACA,GAAe,QAAQD,IAAajM,CAAW,CAAC,GAG9C,CAACuM,IAA6BC,EAA8B,IAAIjQ,EAAS,EAAI,GAC7EkQ,KAAwBnP,EAAOoO,CAAc;AAGnD,EAAAnO,EAAU,MAAM;AAEd,UADmBR,KAAA,gBAAAA,EAAQ,kBAAiB,mBACzB,wBAAwB;AACzC,YAAM2P,IAAcD,GAAsB,UAAU;AAGpD,MAEED,GAFE,EAAAE,KAFchB,MAAmB,EAIC;AAAA,IAKxC;AACA,IAAAe,GAAsB,UAAUf;AAAA,EAClC,GAAG,CAACA,GAAgB3O,KAAA,gBAAAA,EAAQ,aAAa,CAAC;AAE1C,QAAM4P,KAAWrP,EAA8B,IAAI,GAC7CsP,KAAUtP,EAA8B,IAAI,GAC5CuP,KAAsBvP,EAA8B,IAAI,GACxDwP,KAAoBxP,EAAeyC,CAAU,GAE7CgN,KAA2B,CAAClM,MAAsB;AACtD,UAAMmM,IAAYJ,GAAQ;AAC1B,QAAI,CAACI,EAAW;AAChB,UAAMC,IAAMD,EAAU,cAA2B,sBAAsBnM,CAAS,IAAI;AACpF,QAAI,CAACoM,EAAK;AAEV,UAAMxK,IAAIuK,EAAU,sBAAA,GACd7M,IAAI8M,EAAI,sBAAA,GACRC,IAAU;AAEhB,QADuB/M,EAAE,OAAOsC,EAAE,MAAMyK,KAAW/M,EAAE,UAAUsC,EAAE,SAASyK,EACtD;AAEpB,UAAMC,IAAS,KAAK,IAAI,GAAGH,EAAU,eAAeA,EAAU,YAAY,GACpEI,IAAmBjN,EAAE,MAAMsC,EAAE,MAAOtC,EAAE,SAAS,GAC/CkN,IAAYL,EAAU,YAAYI,IAAkBJ,EAAU,eAAe,GAC7EM,KAAU,KAAK,IAAIH,GAAQ,KAAK,IAAI,GAAGE,CAAS,CAAC;AACvD,IAAAL,EAAU,SAAS,EAAE,KAAKM,IAAS,UAAU,UAAU;AAAA,EACzD;AAoKA,SAlKA/P,EAAU,MAAM;AACd,QAAI,CAAClB,EAAQ;AACb,UAAMkR,IAAY,CAAC3P,MAAqB;AACtC,MAAIA,EAAE,QAAQ,YAAUK,EAAA;AAAA,IAC1B;AACA,kBAAO,iBAAiB,WAAWsP,CAAS,GACrC,MAAM,OAAO,oBAAoB,WAAWA,CAAS;AAAA,EAC9D,GAAG,CAACtP,GAAO5B,CAAM,CAAC,GAElBkB,EAAU,MAAM;AACd,QAAI,OAAO,SAAW,IAAa;AACnC,UAAMiQ,IAAW,MAAMrE,GAAc,EAAE,OAAO,OAAO,YAAY,QAAQ,OAAO,aAAa;AAC7F,WAAAqE,EAAA,GACA,OAAO,iBAAiB,UAAUA,CAAQ,GACnC,MAAM,OAAO,oBAAoB,UAAUA,CAAQ;AAAA,EAC5D,GAAG,CAAA,CAAE,GAELjQ,EAAU,MAAM;AAMd,QALIuN,EAAc,WAAW,SAC3B,OAAO,aAAaA,EAAc,OAAO,GACzCA,EAAc,UAAU,OAGtBzO,GAAQ;AACV,MAAAwO,EAAa,EAAI;AACjB;AAAA,IACF;AAGA,IAAAC,EAAc,UAAU,OAAO,WAAW,MAAM;AAC9C,MAAAD,EAAa,EAAK,GAClBC,EAAc,UAAU;AAAA,IAC1B,GAAG,GAAG;AAAA,EACR,GAAG,CAACzO,CAAM,CAAC,GAEXkB,EAAU,MACD,MAAM;AACX,IAAIuN,EAAc,WAAW,QAAM,OAAO,aAAaA,EAAc,OAAO;AAAA,EAC9E,GACC,CAAA,CAAE,GAELvN,EAAU,MACD,MAAM;AACX,IAAImM,EAAiB,WAAW,QAAM,OAAO,aAAaA,EAAiB,OAAO;AAAA,EACpF,GACC,CAAA,CAAE,GAELnM,EAAU,MACD,MAAM;AACX,IAAI4M,GAAoB,WAAW,QAAM,OAAO,aAAaA,GAAoB,OAAO;AAAA,EAC1F,GACC,CAAA,CAAE,GAEL5M,EAAU,MAAM;AAEd,QADI,CAAClB,KACD,CAACsM,EAAc;AACnB,UAAM8E,IAAM,sBAAsB,MAAA;;AAAM,cAAAjQ,IAAAuL,GAAe,YAAf,gBAAAvL,EAAwB;AAAA,KAAO;AACvE,WAAO,MAAM,qBAAqBiQ,CAAG;AAAA,EACvC,GAAG,CAACpR,GAAQsM,CAAY,CAAC,GAEzBpL,EAAU,MAAM;AACd,UAAMsB,IAAOiO,GAAkB;AAI/B,QAHAA,GAAkB,UAAU/M,GAGxBA,KAAclB,EAAM;AAExB,UAAMmO,IAAYH,GAAoB;AACtC,QAAI,CAACG,EAAW;AAEhB,UAAMU,IAAe1M,EAAY,KAAK,CAACb,MAAMA,EAAE,kBAAkBJ,CAAU,GACrE4N,IAAgB3M,EAAY,KAAK,CAACb,MAAMA,EAAE,gBAAgBJ,CAAU,GAIpE6N,IAAYD,KAAiBD,IAAeC,EAAc,gBAAgB,IAAKA,IAAiC,OAAjB5N,IAAa;AAClH,QAAI6N,KAAa,QAAQA,IAAY,EAAG;AAExC,UAAMH,IAAM,sBAAsB,MAAM;AACtC,YAAMI,IAAKb,EAAU,cAA2B,mBAAmBY,CAAS,IAAI;AAChF,UAAI,CAACC,EAAI;AAET,YAAMC,IAAgBd,EAAU,sBAAA,GAE1Be,IADSF,EAAG,sBAAA,EACQ,QAAQC,EAAc;AAGhD,UAAIC,KAAc,EAAG;AAErB,YAAMC,KAAU,KAAK,IAAI,GAAGhB,EAAU,cAAcA,EAAU,WAAW,GACnEiB,KAAW,KAAK,IAAID,IAAS,KAAK,IAAI,GAAGhB,EAAU,aAAae,CAAU,CAAC;AACjF,MAAAf,EAAU,SAAS,EAAE,MAAMiB,IAAU,UAAU,UAAU;AAAA,IAC3D,CAAC;AAED,WAAO,MAAM,qBAAqBR,CAAG;AAAA,EACvC,GAAG,CAAC1N,GAAYiB,CAAW,CAAC,GAE5BzD,EAAU,MAAM;AACd,QAAI,CAAClB,EAAQ;AAEb,UAAMwC,IAAO8K,GAA6B;AAI1C,QAHAA,GAA6B,UAAU5J,GAGnCA,KAAclB,EAAM;AAGxB,UAAMqP,IAAUlN,EAAY,KAAK,CAACb,MAAMA,EAAE,kBAAkBJ,CAAU;AACtE,IAAKmO,MAGLlE,GAAmB,kBAAkBK,EAAiB6D,EAAQ,eAAe,CAAC,aAAa,GAC3FpE,GAAkB,CAACqE,MAAMA,IAAI,CAAC,GAC9BjE,GAAuB,EAAI,GACvBC,GAAoB,WAAW,QAAM,OAAO,aAAaA,GAAoB,OAAO,GACxFA,GAAoB,UAAU,OAAO,WAAW,MAAM;AACpD,MAAAD,GAAuB,EAAK,GAC5BC,GAAoB,UAAU;AAAA,IAChC,GAAGC,EAAqB;AAAA,EAC1B,GAAG,CAACrK,GAAY1D,GAAQ2E,CAAW,CAAC,GAEpCzD,EAAU,MAAM;AAGd,QAFI,CAAClB,KACD,CAAC4N,MACD,CAACF,GAAiB;AAGtB,UAAM0D,IAAM,sBAAsB,MAAM;;AACtC,YAAMW,IAASnF,GAAmB,SAC5BoF,IAAOD,KAAA,gBAAAA,EAAQ,yBAGfE,KAAY9Q,IAAAmP,GAAS,YAAT,gBAAAnP,EAAkB,yBAC9B+Q,IAAUF,IAAOA,EAAK,OAAOA,EAAK,QAAQ,IAAIC,IAAYA,EAAU,OAAOA,EAAU,QAAQ,IAAI,OAAO,aAAa,GACrHE,IAAUH,IAAOA,EAAK,MAAMA,EAAK,SAAS,IAAIC,IAAYA,EAAU,MAAMA,EAAU,SAAS,IAAI,OAAO,cAAc,GAEtHG,IAAS;AAAA,QACb,GAAGF,IAAU;AAAA,QACb,GAAGC,IAAU;AAAA,QACb,GAAG;AAAA,QACH,GAAG;AAAA,MAAA;AAGL,MAAAjF,GAAkBkF,CAAM,GACxBpF,GAAe,CAAC8E,MAAMA,IAAI,CAAC,GAC3B1E,GAAoB,EAAI,GAEpBC,EAAiB,WAAW,QAAM,OAAO,aAAaA,EAAiB,OAAO,GAClFA,EAAiB,UAAU,OAAO,WAAW,MAAM;AACjD,QAAAD,GAAoB,EAAK,GACzBC,EAAiB,UAAU;AAAA,MAC7B,GAAGE,CAAgB;AAAA,IACrB,CAAC;AAED,WAAO,MAAM,qBAAqB6D,CAAG;AAAA,EACvC,GAAG,CAAC5D,IAAgBE,IAAiBH,GAAkBK,IAAqB5N,CAAM,CAAC,GAEnFkB,EAAU,MAAM;;AACd,IAAKlB,OACLmB,IAAAmP,GAAS,YAAT,QAAAnP,EAAkB;AAAA,EACpB,GAAG,CAACnB,CAAM,CAAC,GAENuO,KAGH,gBAAA8D;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAW;AAAA,MACX,cAAW;AAAA,MACX,WAAW,CAACrM,EAAO,UAAUhG,IAASgG,EAAO,eAAeA,EAAO,gBAAgBxG,EAAM,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC5H,aAAa,CAAC+B,MAAM;AAClB,QAAIA,EAAE,WAAWA,EAAE,iBAAeK,EAAA;AAAA,MACpC;AAAA,MAEC,UAAA;AAAA,QAAAuL,MAAoBF,MAAkBJ,GAAW,QAAQ,KAAKA,GAAW,SAAS,IACjF,gBAAAnH;AAAA,UAACwD;AAAAA,UAAA;AAAA,YAEC,OAAO2D,GAAW;AAAA,YAClB,QAAQA,GAAW;AAAA,YACnB,gBAAAI;AAAA,YACA,QAAQ;AAAA,cACN;AAAA;AAAA,cACA;AAAA;AAAA,cACA;AAAA;AAAA,cACA;AAAA;AAAA,cACA;AAAA;AAAA,cACA;AAAA;AAAA,YAAA;AAAA,YAEF,SAAS;AAAA,YACT,gBAAgB;AAAA,YAChB,eAAe;AAAA,YACf,SAAS;AAAA,YACT,kBAAkB,EAAE,KAAK,KAAK,KAAK,IAAA;AAAA,YACnC,kBAAkB,EAAE,KAAK,IAAI,KAAK,EAAA;AAAA,YAClC,OAAO,EAAE,UAAU,SAAS,OAAO,GAAG,eAAe,QAAQ,QAAQ,WAAA;AAAA,UAAW;AAAA,UAlB3EF;AAAA,QAAA,IAoBL;AAAA,QACJ,gBAAAsF,EAAC,WAAM,KAAK/B,IAAU,WAAW,CAACtK,EAAO,OAAOhG,IAASgG,EAAO,YAAYA,EAAO,WAAW,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,UAAU,IAClI,UAAA;AAAA,UAAA4H,MAAuBF,KACtB,gBAAAhI,EAAC,OAAA,EAAI,WAAWM,EAAO,oBAAoB,eAAY,QACrD,UAAA,gBAAAN,EAAC,OAAA,EAAyB,KAAKkH,IAAoB,WAAW5G,EAAO,iBAClE,UAAA0H,GAAA,GADOF,EAEV,GACF,IACE;AAAA,4BACH,UAAA,EAAO,WAAW,CAACxH,EAAO,QAAQsG,IAAetG,EAAO,mBAAmB,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GACxG,UAAA;AAAA,YAAA,gBAAAN;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAWM,EAAO;AAAA,gBAClB,cAAYsG,IAAe,sBAAsB;AAAA,gBACjD,iBAAeA;AAAA,gBACf,SAAS,MAAM;AACb,kBAAAC,EAAgB,EAAI;AAAA,gBACtB;AAAA,gBAEA,UAAA,gBAAA7G,EAAC0G,IAAA,EAAO,MAAM,IAAI,eAAY,OAAA,CAAO;AAAA,cAAA;AAAA,YAAA;AAAA,YAGvC,gBAAAiG,EAAC,OAAA,EAAI,WAAWrM,EAAO,cACrB,UAAA;AAAA,cAAA,gBAAAN,EAAC,OAAA,EAAI,WAAWM,EAAO,iBAAiB,eAAasG,GACnD,UAAA,gBAAA5G,EAAC,MAAA,EAAG,WAAWM,EAAO,OAAQ,UAAA4I,GAAA,CAAM,GACtC;AAAA,cAEA,gBAAAlJ,EAAC,OAAA,EAAI,WAAWM,EAAO,kBAAkB,eAAa,CAACsG,GACrD,UAAA,gBAAA+F,EAAC,OAAA,EAAI,WAAWrM,EAAO,WACrB,UAAA;AAAA,gBAAA,gBAAAN;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,KAAKgH;AAAA,oBACL,WAAW1G,EAAO;AAAA,oBAClB,MAAK;AAAA,oBACL,OAAOwG;AAAA,oBACP,aAAY;AAAA,oBACZ,UAAU,CAACjL,MAAMkL,EAAelL,EAAE,OAAO,KAAK;AAAA,oBAC9C,QAAQ,MAAM;AACZ,sBAAIiL,EAAY,KAAA,MAAW,QAAoB,EAAK;AAAA,oBACtD;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEDA,EAAY,SACX,gBAAA9G;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAWM,EAAO;AAAA,oBAClB,aAAa,CAACzE,MAAM;AAElB,sBAAAA,EAAE,eAAA;AAAA,oBACJ;AAAA,oBACA,SAAS,MAAM;;AACb,sBAAAkL,EAAe,EAAE,IACjBtL,IAAAuL,GAAe,YAAf,QAAAvL,EAAwB;AAAA,oBAC1B;AAAA,oBACA,cAAW;AAAA,oBACZ,UAAA;AAAA,kBAAA;AAAA,gBAAA,IAGC;AAAA,cAAA,EAAA,CACN,EAAA,CACF;AAAA,YAAA,GACF;AAAA,YAEA,gBAAAuE,EAAC,UAAA,EAAO,MAAK,UAAS,SAAS9D,GAAO,UAAUvB,GAAY,WAAW2F,EAAO,aAAa,cAAW,SAAQ,UAAA,IAAA,CAE9G;AAAA,UAAA,GACF;AAAA,4BAEC,OAAA,EAAI,WAAWA,EAAO,MAAM,KAAKuK,IAC/B,UAAA;AAAA,YAAApQ,sBAAW,KAAA,EAAE,WAAW6F,EAAO,OAAO,sBAAQ,IAAO;AAAA,YACrD/G,IAAQ,gBAAAyG,EAAC,KAAA,EAAE,WAAWM,EAAO,OAAQ,aAAM,IAAO;AAAA,YAClD,CAAC7F,KAAWO,KAAU,CAACA,EAAO,WAAW,gBAAAgF,EAAC,KAAA,EAAE,WAAWM,EAAO,OAAO,UAAA,0BAAA,CAAuB,IAAO;AAAA,YAEpG,gBAAAN,EAAC,OAAA,EAAI,WAAWM,EAAO,UACrB,UAAA,gBAAAN,EAAC,MAAA,EAAG,WAAWM,EAAO,aACnB,UAAA+I,EAAiB,IAAI,CAAC5M,MAAM;;AAC3B,oBAAMsC,IAAMjB,EAAWrB,EAAE,EAAE,KAAK,GAC1BmQ,IAAqBjE,EAAsBlM,CAAC,GAC5CoQ,IAAoBtE,EAAqB9L,EAAE,eAAe,GAC1DqQ,IAAclE,EAAoBnM,CAAC,GAKnCsQ,IAAuBjD,IACvBkD,IAAsB,OAAOvQ,EAAE,KAAK,GACpCwQ,IACJF,KAAwB,QACxB,OAAO,SAASA,CAAoB,KACpCA,IAAuB,KACvB,OAAO,SAASC,CAAmB,GAC/BE,IAAwBD,IAC1B,KAAK,MAAMD,KAAuB,IAAID,IAAuB,OAAO,GAAG,IAAI,MAC3E;AAEJ,uCACG,MAAA,EAAc,WAAWzM,EAAO,YAAY,oBAAkB7D,EAAE,IAC/D,UAAA;AAAA,gBAAA,gBAAAkQ,EAAC,OAAA,EAAI,WAAWrM,EAAO,aACrB,UAAA;AAAA,kBAAA,gBAAAN,EAAC,OAAA,EAAI,WAAWM,EAAO,cAAc,eAAY,QAC9C,WAAA7E,IAAAgB,EAAE,UAAF,QAAAhB,EAAS,MACR,gBAAAuE;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAWM,EAAO;AAAA,sBAClB,KAAK7D,EAAE,MAAM;AAAA,sBACb,KAAKA,EAAE,MAAM,WAAWqQ;AAAA,sBACxB,SAAQ;AAAA,oBAAA;AAAA,kBAAA,IAGV,gBAAA9M,EAAC,OAAA,EAAI,WAAWM,EAAO,sBAAuB,YAAA6M,MAAA3M,MAAAZ,KAAAnD,EAAE,YAAF,gBAAAmD,GAAW,UAAX,gBAAAY,GAAkB,MAAM,GAAG,OAA3B,gBAAA2M,GAA+B,kBAAiB,KAAI,GAEtG;AAAA,kBAEA,gBAAAR,EAAC,OAAA,EAAI,WAAWrM,EAAO,aACrB,UAAA;AAAA,oBAAA,gBAAAN,EAAC,OAAA,EAAI,WAAWM,EAAO,aAAc,UAAAsM,GAAmB;AAAA,oBACvDC,IAAoB,gBAAA7M,EAAC,OAAA,EAAI,WAAWM,EAAO,aAAc,aAAkB,IAAS;AAAA,oBACrF,gBAAAqM,EAAC,OAAA,EAAI,WAAWrM,EAAO,iBACpB,UAAA;AAAA,sBAAA2M,sBACE,QAAA,EAAK,WAAW3M,EAAO,kBACrB,YAAY,OAAO,SAAS0M,CAAmB,IAAIA,EAAoB,QAAQ,CAAC,IAAIvQ,EAAE,KAAK,GAC9F,IACE;AAAA,sBACJ,gBAAAuD,EAAC,QAAA,EAAK,WAAWM,EAAO,cACrB,UAAA0I;AAAA,wBACCkE,KAAyB,OACrBA,EAAsB,QAAQ,CAAC,IAC/B,OAAO,SAASF,CAAmB,IACjCA,EAAoB,QAAQ,CAAC,IAC7BvQ,EAAE;AAAA,sBAAA,EACV,CACF;AAAA,oBAAA,EAAA,CACF;AAAA,kBAAA,EAAA,CACF;AAAA,gBAAA,GACF;AAAA,gBACCsC,KAAO,IACN,gBAAAiB;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAMtD,EAAYD,EAAE,IAAI,CAAC;AAAA,oBAClC,UAAU9B,KAAcwO;AAAA,oBACxB,WAAW7I,EAAO;AAAA,oBAClB,cAAY,OAAOwM,CAAW;AAAA,oBAC/B,UAAA;AAAA,kBAAA;AAAA,gBAAA,IAID,gBAAAH,EAAC,OAAA,EAAI,WAAWrM,EAAO,aACrB,UAAA;AAAA,kBAAA,gBAAAN;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAMtD,EAAYD,EAAE,IAAIsC,IAAM,CAAC;AAAA,sBACxC,UAAUpE,KAAcoE,KAAO;AAAA,sBAC/B,WAAWuB,EAAO;AAAA,sBAClB,cAAY,YAAYwM,CAAW;AAAA,sBACpC,UAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAGD,gBAAA9M,EAAC,UAAK,WAAWM,EAAO,UAAU,cAAY,YAAYvB,CAAG,IAC1D,UAAAA,EAAA,CACH;AAAA,kBACA,gBAAAiB;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAMtD,EAAYD,EAAE,IAAIsC,IAAM,CAAC;AAAA,sBACxC,UAAUpE,KAAcwO;AAAA,sBACxB,WAAW7I,EAAO;AAAA,sBAClB,cAAY,YAAYwM,CAAW;AAAA,sBACpC,UAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAED,EAAA,CACF;AAAA,cAAA,EAAA,GArEKrQ,EAAE,EAuEX;AAAA,YAEJ,CAAC,GACH,EAAA,CACF;AAAA,UAAA,GACF;AAAA,4BAEC,UAAA,EAAO,WAAW6D,EAAO,QAAQ,KAAK2G,IACrC,UAAA;AAAA,YAAA,gBAAAjH,EAAC,OAAA,EAAI,WAAWM,EAAO,kBAAkB,KAAKwK,IAC5C,UAAA,gBAAA9K,EAAC,OAAA,EAAI,WAAWM,EAAO,eAAe,cAAW,sBAC9C,UAAA,MAAM,KAAK,EAAE,QAAQiK,GAAA,CAAW,EAAE,IAAI,CAACjN,GAAGgN,MAAQ;;AACjD,oBAAM8C,IAAUjD,GAAeG,CAAG,GAC5B+C,IAAYjD,GAAiB,IAAIE,CAAG,GACpCgD,IAAW,EAAQF,GAGnBG,IAAc,EAAQF,GACtBG,IAAgBD,KAAe,CAACD,GAChCG,IAAeJ,IAAY,GAAGA,EAAU,eAAe,UAAU,MAEjEK,IAAYJ,IAAWF,EAAS,cAAc,QAAQ9C,IAAM,CAAC;AAEnE,uCACG,OAAA,EAAc,iBAAeA,GAAK,WAAWhK,EAAO,SACnD,UAAA;AAAA,gBAAA,gBAAAN;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW;AAAA,sBACTM,EAAO;AAAA,sBACPgN,IAAWhN,EAAO,gBAAgBA,EAAO;AAAA,sBACzCiN,IAAcjN,EAAO,mBAAmB;AAAA,sBACxCgN,IAAWhN,EAAO,mBAAmB;AAAA,oBAAA,EAEpC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,oBACX,MAAMgN,IAAW,WAAW;AAAA,oBAC5B,UAAUA,IAAW,IAAI;AAAA,oBACzB,SAASA,IAAW,MAAMtC,GAAyBoC,EAAS,EAAE,IAAI;AAAA,oBAClE,WACEE,IACI,CAACzR,OAAM;AACP,uBAAIA,GAAE,QAAQ,WAAWA,GAAE,QAAQ,SACjCA,GAAE,eAAA,GACFmP,GAAyBoC,EAAS,EAAE;AAAA,oBAExC,IACE;AAAA,oBAEN,cAAYI,KAAiBC,IAAe,GAAGC,CAAS,aAAaD,CAAY,MAAMC;AAAA,oBACvF,OAAOF,KAAiBC,IAAe,GAAGC,CAAS,cAAcD,CAAY,KAAKC;AAAA,oBAEjF,UAAAJ,KACC7R,IAAA2R,EAAS,UAAT,QAAA3R,EAAgB,MACd,gBAAAuE;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,WAAWM,EAAO;AAAA,wBAClB,KAAK8M,EAAS,MAAO;AAAA,wBACrB,KAAKA,EAAS,MAAO,WAAWA,EAAS;AAAA,wBACzC,SAAQ;AAAA,sBAAA;AAAA,oBAAA,IAGV,gBAAApN,EAAC,OAAA,EAAI,WAAWM,EAAO,iBAAiB,eAAY,QACjD,YAAA6M,MAAA3M,MAAAZ,KAAAwN,EAAS,YAAT,gBAAAxN,GAAkB,UAAlB,gBAAAY,GAAyB,MAAM,GAAG,OAAlC,gBAAA2M,GAAsC,kBAAiB,KAC1D,IAEAK,KAAiBC,IACnB,gBAAAzN,EAAC,OAAA,EAAI,WAAWM,EAAO,qBAAsB,UAAAmN,EAAA,CAAa,IAE1D,gBAAAzN,EAAC,SAAI,WAAWM,EAAO,aAAa,eAAY,QAAO,UAAA,IAAA,CAEvD;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAIHiN,sBAAe,OAAA,EAAI,WAAWjN,EAAO,mBAAoB,UAAA+M,EAAW,OAAM,IAAS;AAAA,cAAA,EAAA,GAhD5E/C,CAiDV;AAAA,YAEJ,CAAC,GACH,GACF;AAAA,YACA,gBAAAtK;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW,CAACM,EAAO,eAAeqJ,KAAkB,IAAIrJ,EAAO,uBAAuB,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,gBACpH,eAAaqJ,IAAiB;AAAA,gBAE9B,4BAAC,OAAA,EAAI,WAAWrJ,EAAO,WAAW,cAAW,UAC1C,UAAA;AAAA,kBAAAwJ,KACC,gBAAA6C,EAAC,QAAA,EAAK,WAAWrM,EAAO,kBACrB,UAAA;AAAA,oBAAAwJ;AAAA,oBAAqB;AAAA,kBAAA,EAAA,CACxB,sBAEC,QAAA,EAAK;AAAA,kBAGR,gBAAA9J,EAAC,QAAA,EACE,UAAAX,IACC,gBAAAsN,EAAAgB,IAAA,EACE,UAAA;AAAA,oBAAA,gBAAA3N,EAAC,QAAA,EAAK,WAAWM,EAAO,iBAAkB,YAAYyJ,GAAS,QAAQ,CAAC,CAAC,EAAA,CAAE;AAAA,oBAAQ;AAAA,oBACnF,gBAAA/J,EAAC,QAAA,EAAK,WAAWM,EAAO,gBAAiB,YAAY2J,GAAgB,QAAQ,CAAC,CAAC,EAAA,CAAE;AAAA,kBAAA,EAAA,CACnF,IAEA,gBAAAjK,EAAC,QAAA,EAAK,WAAWM,EAAO,gBAAiB,UAAA0I,EAAYe,GAAS,QAAQ,CAAC,CAAC,EAAA,CAAE,EAAA,CAE9E;AAAA,gBAAA,EAAA,CACF;AAAA,cAAA;AAAA,YAAA;AAAA,aAGA,MAAM;AACN,oBAAM6D,KAAa5S,KAAA,gBAAAA,EAAQ,kBAAiB;AAC5C,qBAAI4S,MAAe,yBAGbjE,IAAiB,IAEjB,gBAAA3J,EAAC,YAAO,MAAK,UAAS,SAASH,GAAQ,UAAU,CAACxB,GAAW,WAAWiC,EAAO,KAC5E,UAAA3F,IAAa,YAAY,OAAOgP,CAAc,gBAAgBA,MAAmB,IAAI,KAAK,GAAG,GAAA,CAChG,IAKF,gBAAAgD,EAAC,OAAA,EAAI,WAAW,GAAGrM,EAAO,cAAc,IAAIkK,KAA8BlK,EAAO,0BAA0B,EAAE,IAC3G,UAAA;AAAA,gBAAA,gBAAAN;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAASH;AAAA,oBACT,UAAU,CAACxB;AAAA,oBACX,WAAW,GAAGiC,EAAO,WAAW,IAAIkK,KAA8BlK,EAAO,uBAAuB,EAAE;AAAA,oBAElG,UAAA,gBAAAN,EAAC,QAAA,EAAM,UAAArF,IAAa,YAAY,gBAAA,CAAgB;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAElD,gBAAAqF;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAASF;AAAA,oBACT,UAAU,CAACzB;AAAA,oBACX,WAAW,GAAGiC,EAAO,YAAY,IAAIkK,KAA8BlK,EAAO,wBAAwB,EAAE;AAAA,oBAEpG,UAAA,gBAAAN,EAAC,QAAA,EAAM,UAAArF,IAAa,gBAAgB,WAAA,CAAW;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACjD,GACF,IAIAiT,MAAe,aAEf,gBAAA5N,EAAC,UAAA,EAAO,MAAK,UAAS,SAASF,GAAmB,UAAU,CAACzB,GAAW,WAAWiC,EAAO,KACvF,cAAa,gBAAgBqJ,IAAiB,IAAI,OAAOA,CAAc,gBAAgBA,MAAmB,IAAI,KAAK,GAAG,KAAK,WAAA,CAC9H,IAMF,gBAAA3J,EAAC,UAAA,EAAO,MAAK,UAAS,SAASH,GAAQ,UAAU,CAACxB,GAAW,WAAWiC,EAAO,KAC5E,cAAa,YAAYqJ,IAAiB,IAAI,OAAOA,CAAc,gBAAgBA,MAAmB,IAAI,KAAK,GAAG,KAAK,gBAAA,CAC1H;AAAA,YAEJ,GAAA;AAAA,YAEA,gBAAAgD,EAAC,OAAA,EAAI,WAAWrM,EAAO,WAAW,UAAA;AAAA,cAAA;AAAA,cACrB,gBAAAN,EAAC,OAAE,MAAK,yCAAwC,QAAO,UAAS,KAAI,uBAAsB,UAAA,eAAA,CAAY;AAAA,YAAA,EAAA,CACnH;AAAA,UAAA,EAAA,CACF;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,IArWmB;AAwWzB;AC7wBA,SAAS6N,GAAaC,GAAwC;AAC5D,MAAKA,KAAA,QAAAA,EAAY;AACjB,WAAOA,EAAW,OAA+B,CAACC,GAAKC,OACjDA,KAAA,QAAAA,EAAM,QAAKD,EAAIC,EAAK,GAAG,IAAIA,EAAK,SAAS,KACtCD,IACN,CAAA,CAAE;AACP;AAEA,SAASE,GAAmBtR,GAAuB;AACjD,QAAMqI,IAAQ,WAAW,KAAKrI,CAAa;AAC3C,SAAOqI,IAAQA,EAAM,CAAC,IAAIrI;AAC5B;AAEA,SAASuR,KAAa;;AAEpB,WAAQzS,IAAA,iCAAgB,WAAhB,gBAAAA,EAAwB,aAAY;AAC9C;AAEA,eAAe0S,KAAiC;AAC9C,MAAI;AACF,UAAMC,IAAUF,GAAA,GACVG,IAAgB,mBAAmB,oDAAoD,GACvFC,IAAM,MAAM,MAAM,GAAGF,CAAO,aAAaC,CAAa,IAAI,EAAE,QAAQ,MAAA,CAAO;AACjF,QAAI,CAACC,EAAI,GAAI;AAEb,UAAMC,IAAY,MAAMD,EAAI,OAAO,MAAM,MAAM,IAAI;AACnD,QAAI,CAACC,EAAU;AAEf,UAAMC,IAAa,CAAC,eAAe,oBAAoB,uBAAuB;AAC9E,eAAWC,KAAaD,GAAY;AAClC,YAAME,IAAaH,EAASE,CAAS;AACrC,UAAI,CAACC,EAAY;AAEjB,YAAMC,IAAO,IAAI,UAAA,EAAY,gBAAgBD,GAAY,WAAW,GAC9DE,IAAgBD,EAAK,eAAeF,CAAS,KAAKE,EAAK,cAAcF,CAAS,GAC9EI,IAAgB,SAAS,eAAeJ,CAAS,KAAK,SAAS,cAAcA,CAAS;AAC5F,MAAII,KAAiBD,KACnBC,EAAc,YAAYD,CAAa;AAAA,IAE3C;AAEA,UAAME,IAAS,SAAS,cAAc,aAAa;AACnD,QAAIA,KAAU,OAAOA,EAAO,QAAS,YAAY;AAC/C,MAAAA,EAAO,KAAA;AACP;AAAA,IACF;AAGA,aAAS,KAAK,UAAU,IAAI,iBAAiB;AAC7C,UAAMC,IAAY,SAAS,cAAc,aAAa,KAAK,SAAS,cAAc,mBAAmB;AACrG,IAAIA,MACEA,EAAU,UAAU,SAAS,UAAU,KAAGA,EAAU,UAAU,OAAO,UAAU,GACnFA,EAAU,UAAU,IAAI,QAAQ;AAAA,EAEpC,QAAQ;AAAA,EAER;AACF;AAEA,eAAeC,GAAaC,GAAkBC,GAAkC;AAC9E,QAAMZ,IAAM,MAAM,MAAMW,GAAU;AAAA,IAChC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,gBAAgB;AAAA,IAAA;AAAA,IAElB,MAAM,KAAK,UAAUC,CAAO;AAAA,EAAA,CAC7B;AACD,MAAI,CAACZ,EAAI,IAAI;AACX,UAAMa,IAAO,MAAMb,EAAI,OAAO,MAAM,MAAM,EAAE;AAC5C,UAAM,IAAI,MAAMa,KAAQ,wBAAwBb,EAAI,MAAM,EAAE;AAAA,EAC9D;AACA,SAAOA,EAAI,KAAA,EAAO,MAAM,MAAM,IAAI;AACpC;AAEO,SAASc,KAA6C;AAC3D,SAAO;AAAA,IACL,MAAM,SAAS1Q,GAAO;AACpB,YAAM2Q,IAAQ3Q,EAAM,IAAI,CAAC4Q,OAAU;AAAA,QACjC,IAAIrB,GAAmBqB,EAAK,aAAa;AAAA,QACzC,UAAUA,EAAK;AAAA,QACf,YAAYzB,GAAayB,EAAK,UAAU;AAAA,MAAA,EACxC;AACF,YAAMN,GAAa,gBAAgB,EAAE,OAAAK,GAAO;AAAA,IAC9C;AAAA,IACA,MAAM,oBAAoB3Q,GAAO;AAC/B,YAAM2Q,IAAQ3Q,EAAM,IAAI,CAAC4Q,OAAU;AAAA,QACjC,IAAIrB,GAAmBqB,EAAK,aAAa;AAAA,QACzC,UAAUA,EAAK;AAAA,QACf,YAAYzB,GAAayB,EAAK,UAAU;AAAA,MAAA,EACxC;AACF,YAAMN,GAAa,gBAAgB,EAAE,OAAAK,GAAO;AAAA,IAC9C;AAAA,IACA,MAAM,YAAY3Q,GAAO;AACvB,iBAAW4Q,KAAQ5Q;AACjB,cAAMsQ,GAAa,mBAAmB;AAAA,UACpC,IAAIM,EAAK;AAAA,UACT,UAAUA,EAAK;AAAA,UACf,YAAYzB,GAAayB,EAAK,UAAU;AAAA,QAAA,CACzC;AAAA,IAEL;AAAA,IACA,MAAM,YAAYC,GAAS;AACzB,iBAAW3R,KAAM2R;AACf,cAAMP,GAAa,mBAAmB,EAAE,IAAApR,GAAI,UAAU,GAAG;AAAA,IAE7D;AAAA,IACA,aAAa;AAEX,aAAO,WAAW,MAAM;AACtB,QAAKuQ,GAAA;AAAA,MACP,GAAG,CAAC;AAAA,IACN;AAAA,IACA,qBAAqB;AAEnB,aAAO,SAAS,OAAO;AAAA,IACzB;AAAA,EAAA;AAEJ;","x_google_ignoreList":[7,8,9,10,11,12,13]}