@getmicdrop/venue-calendar 4.0.81 → 4.0.82
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/{CarouselView.legacy-Bn76lnuH.js → CarouselView.legacy-DAixPl6l.js} +3 -3
- package/dist/{CarouselView.legacy-Bn76lnuH.js.map → CarouselView.legacy-DAixPl6l.js.map} +1 -1
- package/dist/{CartView-lR1zLxmN.js → CartView-CsdqWB24.js} +6 -6
- package/dist/{CartView-lR1zLxmN.js.map → CartView-CsdqWB24.js.map} +1 -1
- package/dist/{Checkout-KyLZlwLk.js → Checkout-B15JygVy.js} +7 -7
- package/dist/{Checkout-KyLZlwLk.js.map → Checkout-B15JygVy.js.map} +1 -1
- package/dist/{Checkout-D5mXj5zN.js → Checkout-CUwOrErt.js} +4 -4
- package/dist/{Checkout-D5mXj5zN.js.map → Checkout-CUwOrErt.js.map} +1 -1
- package/dist/{Checkout.legacy-Dl8Oh7y3.js → Checkout.legacy-CrFgAYYe.js} +6 -6
- package/dist/{Checkout.legacy-Dl8Oh7y3.js.map → Checkout.legacy-CrFgAYYe.js.map} +1 -1
- package/dist/{CheckoutTimer-Deo1mLnO.js → CheckoutTimer-qLOtPDt3.js} +4 -4
- package/dist/{CheckoutTimer-Deo1mLnO.js.map → CheckoutTimer-qLOtPDt3.js.map} +1 -1
- package/dist/{CollectionView-C1O9xfVC.js → CollectionView-D2bRelLR.js} +5 -5
- package/dist/{CollectionView-C1O9xfVC.js.map → CollectionView-D2bRelLR.js.map} +1 -1
- package/dist/{CollectionView.legacy-DK_mCA_g.js → CollectionView.legacy-DLb5fzi-.js} +6 -6
- package/dist/{CollectionView.legacy-DK_mCA_g.js.map → CollectionView.legacy-DLb5fzi-.js.map} +1 -1
- package/dist/{Event-B5WRygEf.js → Event-DZpU-Ec1.js} +6 -6
- package/dist/{Event-B5WRygEf.js.map → Event-DZpU-Ec1.js.map} +1 -1
- package/dist/{EventPage-f1AOk4Jb.js → EventPage-CL0yuKWZ.js} +7 -7
- package/dist/{EventPage-f1AOk4Jb.js.map → EventPage-CL0yuKWZ.js.map} +1 -1
- package/dist/{EventPage.legacy-Bk3PJyJs.js → EventPage.legacy-EujdNc3A.js} +7 -7
- package/dist/{EventPage.legacy-Bk3PJyJs.js.map → EventPage.legacy-EujdNc3A.js.map} +1 -1
- package/dist/{FeaturedView.legacy-BzCt1X1W.js → FeaturedView.legacy-CbLBD-tn.js} +2 -2
- package/dist/{FeaturedView.legacy-BzCt1X1W.js.map → FeaturedView.legacy-CbLBD-tn.js.map} +1 -1
- package/dist/{GalleryCard-C1EKGErR.js → GalleryCard-BcIcYghD.js} +3 -3
- package/dist/{GalleryCard-C1EKGErR.js.map → GalleryCard-BcIcYghD.js.map} +1 -1
- package/dist/{GalleryView.legacy-BmQtZKl7.js → GalleryView.legacy-XpQUg-5_.js} +3 -3
- package/dist/{GalleryView.legacy-BmQtZKl7.js.map → GalleryView.legacy-XpQUg-5_.js.map} +1 -1
- package/dist/{GroupedListView.legacy-D72fbNfA.js → GroupedListView.legacy-qvwIV5Qm.js} +3 -3
- package/dist/{GroupedListView.legacy-D72fbNfA.js.map → GroupedListView.legacy-qvwIV5Qm.js.map} +1 -1
- package/dist/{Heading-Bwevh2c4.js → Heading-5CT9Nk0b.js} +2 -2
- package/dist/{Heading-Bwevh2c4.js.map → Heading-5CT9Nk0b.js.map} +1 -1
- package/dist/{ModalHeader-DKwE5ZYZ.js → ModalHeader-CGaXzdcs.js} +2 -2
- package/dist/{ModalHeader-DKwE5ZYZ.js.map → ModalHeader-CGaXzdcs.js.map} +1 -1
- package/dist/{OrderSummarySkeleton-DKWKZNLL.js → OrderSummarySkeleton-pqfhjvKT.js} +2 -2
- package/dist/{OrderSummarySkeleton-DKWKZNLL.js.map → OrderSummarySkeleton-pqfhjvKT.js.map} +1 -1
- package/dist/{ScarcityBadge-3cFxTOCh.js → ScarcityBadge-BkRFHRif.js} +2 -2
- package/dist/{ScarcityBadge-3cFxTOCh.js.map → ScarcityBadge-BkRFHRif.js.map} +1 -1
- package/dist/{SeriesPage-Cq4Q8Vah.js → SeriesPage-NWCA_Aez.js} +5 -5
- package/dist/{SeriesPage-Cq4Q8Vah.js.map → SeriesPage-NWCA_Aez.js.map} +1 -1
- package/dist/{SeriesPage.legacy-zvgW0S_y.js → SeriesPage.legacy-BXSwM5jV.js} +3 -3
- package/dist/{SeriesPage.legacy-zvgW0S_y.js.map → SeriesPage.legacy-BXSwM5jV.js.map} +1 -1
- package/dist/{Success-kyiEO6_Z.js → Success-B4CM_cy1.js} +8 -8
- package/dist/{Success-kyiEO6_Z.js.map → Success-B4CM_cy1.js.map} +1 -1
- package/dist/{Success.legacy-BxKYmXgz.js → Success.legacy-BWAmPmZz.js} +2 -2
- package/dist/{Success.legacy-BxKYmXgz.js.map → Success.legacy-BWAmPmZz.js.map} +1 -1
- package/dist/{Text-_bLxSPv-.js → Text-WY42WIKI.js} +2 -2
- package/dist/{Text-_bLxSPv-.js.map → Text-WY42WIKI.js.map} +1 -1
- package/dist/{VenueCalendar-d8u6MKEu.js → VenueCalendar-DMSeDRSN.js} +18 -18
- package/dist/VenueCalendar-DMSeDRSN.js.map +1 -0
- package/dist/{ViewTicketsEmbed-DquJJVIK.js → ViewTicketsEmbed-AlVzNvxE.js} +4 -4
- package/dist/{ViewTicketsEmbed-DquJJVIK.js.map → ViewTicketsEmbed-AlVzNvxE.js.map} +1 -1
- package/dist/{api-BzICORqy.js → api-ChzBkXfo.js} +2 -2
- package/dist/{api-BzICORqy.js.map → api-ChzBkXfo.js.map} +1 -1
- package/dist/{data-toggle-store.svelte-BGbzblUJ.js → data-toggle-store.svelte-CtW4s3Vw.js} +2 -2
- package/dist/{data-toggle-store.svelte-BGbzblUJ.js.map → data-toggle-store.svelte-CtW4s3Vw.js.map} +1 -1
- package/dist/{labels-Bj_cocb1.js → labels-BB1JG19g.js} +3 -3
- package/dist/{labels-Bj_cocb1.js.map → labels-BB1JG19g.js.map} +1 -1
- package/dist/{transform-D7Oe8jUp.js → transform-BlXf-shc.js} +2 -2
- package/dist/{transform-D7Oe8jUp.js.map → transform-BlXf-shc.js.map} +1 -1
- package/dist/venue-calendar.es.js +1 -1
- package/dist/venue-calendar.iife.js +2 -2
- package/dist/venue-calendar.iife.js.map +1 -1
- package/dist/venue-calendar.umd.js +2 -2
- package/dist/venue-calendar.umd.js.map +1 -1
- package/package.json +1 -1
- package/dist/VenueCalendar-d8u6MKEu.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VenueCalendar-DMSeDRSN.js","sources":["../node_modules/tailwind-merge/dist/bundle-mjs.mjs","../node_modules/clsx/dist/clsx.mjs","../node_modules/@getmicdrop/svelte-components/dist/utils/classNames.js","../node_modules/@getmicdrop/svelte-components/dist/utils/logger.js","../node_modules/@getmicdrop/svelte-components/dist/utils/deprecation.js","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/ChevronLeftOutline.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/ChevronRightOutline.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/CheckOutline.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/EyeOutline.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/EyeSlashOutline.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/CloseCircleOutline.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/ExclamationCircleOutline.svelte","../node_modules/@getmicdrop/svelte-components/dist/tokens/typography.js","../node_modules/@getmicdrop/svelte-components/dist/utils/transitions.js","../node_modules/@getmicdrop/svelte-components/dist/tokens/variants.js","../node_modules/@getmicdrop/svelte-components/dist/errors/classes/AppError.js","../node_modules/@getmicdrop/svelte-components/dist/types/brands.js","../node_modules/@getmicdrop/svelte-components/dist/datetime/types.js","../node_modules/@getmicdrop/svelte-components/dist/datetime/constants.js","../node_modules/@getmicdrop/svelte-components/dist/datetime/timezone.js","../node_modules/date-fns/constants.js","../node_modules/date-fns/constructFrom.js","../node_modules/date-fns/toDate.js","../node_modules/date-fns/_lib/defaultOptions.js","../node_modules/date-fns/startOfWeek.js","../node_modules/date-fns/startOfISOWeek.js","../node_modules/date-fns/getISOWeekYear.js","../node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js","../node_modules/date-fns/_lib/normalizeDates.js","../node_modules/date-fns/startOfDay.js","../node_modules/date-fns/differenceInCalendarDays.js","../node_modules/date-fns/startOfISOWeekYear.js","../node_modules/date-fns/isDate.js","../node_modules/date-fns/isValid.js","../node_modules/date-fns/startOfYear.js","../node_modules/date-fns/locale/en-US/_lib/formatDistance.js","../node_modules/date-fns/locale/_lib/buildFormatLongFn.js","../node_modules/date-fns/locale/en-US/_lib/formatLong.js","../node_modules/date-fns/locale/en-US/_lib/formatRelative.js","../node_modules/date-fns/locale/_lib/buildLocalizeFn.js","../node_modules/date-fns/locale/en-US/_lib/localize.js","../node_modules/date-fns/locale/_lib/buildMatchFn.js","../node_modules/date-fns/locale/_lib/buildMatchPatternFn.js","../node_modules/date-fns/locale/en-US/_lib/match.js","../node_modules/date-fns/locale/en-US.js","../node_modules/date-fns/getDayOfYear.js","../node_modules/date-fns/getISOWeek.js","../node_modules/date-fns/getWeekYear.js","../node_modules/date-fns/startOfWeekYear.js","../node_modules/date-fns/getWeek.js","../node_modules/date-fns/_lib/addLeadingZeros.js","../node_modules/date-fns/_lib/format/lightFormatters.js","../node_modules/date-fns/_lib/format/formatters.js","../node_modules/date-fns/_lib/format/longFormatters.js","../node_modules/date-fns/_lib/protectedTokens.js","../node_modules/date-fns/format.js","../node_modules/date-fns-tz/dist/esm/_lib/tzTokenizeDate/index.js","../node_modules/date-fns-tz/dist/esm/_lib/newDateUTC/index.js","../node_modules/date-fns-tz/dist/esm/_lib/tzParseTimezone/index.js","../node_modules/date-fns-tz/dist/esm/_lib/getTimezoneOffsetInMilliseconds/index.js","../node_modules/date-fns-tz/dist/esm/_lib/tzPattern/index.js","../node_modules/date-fns-tz/dist/esm/toDate/index.js","../node_modules/date-fns-tz/dist/esm/toZonedTime/index.js","../node_modules/@getmicdrop/svelte-components/dist/datetime/format.js","../node_modules/@getmicdrop/svelte-components/dist/tokens/sizing.js","../node_modules/@getmicdrop/svelte-components/dist/primitives/Badges/Badge.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/BlurBackdropImage/BlurBackdropImage.svelte","../node_modules/@getmicdrop/svelte-components/dist/utils/focusTrap.js","../node_modules/@getmicdrop/svelte-components/dist/primitives/Spinner/Spinner.svelte","../node_modules/@getmicdrop/svelte-components/dist/utils/haptic.js","../node_modules/@getmicdrop/svelte-components/dist/primitives/Button/Button.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Button/ButtonRoot.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Button/ButtonGroup.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Button/index.js","../node_modules/@getmicdrop/svelte-components/dist/utils/formatters.js","../node_modules/@getmicdrop/svelte-components/dist/primitives/Input/Input.svelte","../node_modules/@getmicdrop/svelte-components/dist/utils/portal.js","../node_modules/@getmicdrop/svelte-components/dist/primitives/Modal/context.js","../node_modules/@getmicdrop/svelte-components/dist/utils/inertBackground.js","../node_modules/@getmicdrop/svelte-components/dist/primitives/Modal/ModalRoot.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Modal/ModalOverlay.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Modal/ModalPanelScope.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Modal/ModalPanel.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Modal/ModalBody.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Modal/ModalFooter.svelte","../node_modules/@getmicdrop/svelte-components/dist/tokens/spacing.js","../node_modules/@getmicdrop/svelte-components/dist/components/Layout/Grid.svelte","../node_modules/@getmicdrop/svelte-components/dist/utils/lazyOnce.js","../node_modules/@getmicdrop/svelte-components/dist/recipes/feedback/EmptyState/EmptyState.svelte","../node_modules/carbon-icons-svelte/lib/Renew.svelte","../node_modules/carbon-icons-svelte/lib/CheckmarkFilled.svelte","../node_modules/@getmicdrop/svelte-components/dist/calendar/EventCard/tokens.js","../node_modules/@getmicdrop/svelte-components/dist/calendar/EventCard/EventCard.svelte","../node_modules/@getmicdrop/svelte-components/dist/calendar/MonthSwitcher/MonthSwitcher.svelte","../node_modules/@getmicdrop/svelte-components/dist/utils/imageUrl.js","../node_modules/@getmicdrop/svelte-components/dist/transforms/ticket.js","../node_modules/@getmicdrop/svelte-components/dist/transforms/event.js","../node_modules/@getmicdrop/svelte-components/dist/utils/timezones.js","../src/lib/utils/textUtils.ts","../src/lib/url-manager/params.ts","../src/lib/url-manager/index.ts","../node_modules/@getmicdrop/svelte-components/dist/widget-filters/engine.js","../node_modules/@getmicdrop/svelte-components/dist/widget-filters/schema.js","../src/lib/widget-filters.js","../src/lib/embed-bridge.js","../src/lib/browse-widgets/utils.ts","../src/lib/browse-widgets/defaults.ts","../src/lib/browse-widgets/status.ts","../src/lib/utils/datetime.js","../src/lib/browse-widgets/to-event-card-props.ts","../src/lib/utils/constants.js","../src/components/Calendar/Calendar.svelte","../node_modules/carbon-icons-svelte/lib/Add.svelte","../node_modules/carbon-icons-svelte/lib/Apple.svelte","../node_modules/carbon-icons-svelte/lib/ArrowLeft.svelte","../node_modules/carbon-icons-svelte/lib/Calendar.svelte","../node_modules/carbon-icons-svelte/lib/Checkmark.svelte","../node_modules/carbon-icons-svelte/lib/ChevronDown.svelte","../node_modules/carbon-icons-svelte/lib/ChevronLeft.svelte","../node_modules/carbon-icons-svelte/lib/Close.svelte","../node_modules/carbon-icons-svelte/lib/Email.svelte","../node_modules/carbon-icons-svelte/lib/ErrorFilled.svelte","../node_modules/carbon-icons-svelte/lib/Fire.svelte","../node_modules/carbon-icons-svelte/lib/Gift.svelte","../node_modules/carbon-icons-svelte/lib/Help.svelte","../node_modules/carbon-icons-svelte/lib/Information.svelte","../node_modules/carbon-icons-svelte/lib/Location.svelte","../node_modules/carbon-icons-svelte/lib/LocationFilled.svelte","../node_modules/carbon-icons-svelte/lib/Locked.svelte","../node_modules/carbon-icons-svelte/lib/Search.svelte","../node_modules/carbon-icons-svelte/lib/Share.svelte","../node_modules/carbon-icons-svelte/lib/Subtract.svelte","../node_modules/carbon-icons-svelte/lib/Theater.svelte","../node_modules/carbon-icons-svelte/lib/Time.svelte","../node_modules/carbon-icons-svelte/lib/User.svelte","../node_modules/carbon-icons-svelte/lib/Warning.svelte","../node_modules/carbon-icons-svelte/lib/WarningFilled.svelte","../node_modules/carbon-icons-svelte/lib/WifiOff.svelte","../src/components/CalendarToolbar/CalendarToolbar.svelte","../src/lib/browse-widgets/adapter.ts","../src/lib/browse-widgets/ListView.svelte","../src/lib/browse-widgets/GalleryView.svelte","../src/lib/browse-widgets/CarouselView.svelte","../src/lib/browse-widgets/FeaturedView.svelte","../src/components/SkeletonLoader/SkeletonLoader.svelte","../src/lib/api/client.ts","../src/lib/api/orders.ts","../src/lib/api/promo.ts","../src/lib/api/events.ts","../src/lib/api/venues.ts","../src/lib/api/transformers/giftCard.ts","../src/lib/api/gift-cards.ts","../src/lib/api/waitlist.ts","../src/lib/api/transformers/event.ts","../src/lib/utils/event-transform.js","../node_modules/js-cookie/dist/js.cookie.mjs","../src/lib/utils/cookies.ts","../src/lib/utils/checkoutState.ts","../src/lib/utils/orderApi.ts","../src/lib/utils/utm.ts","../src/components/PoweredByMicdrop.svelte","../src/components/Modals/NetworkErrorModal.svelte","../src/lib/i18n/defaultLabels.js","../src/lib/i18n/locales/es.js","../src/lib/i18n/index.js","../src/components/CalendarContainer/CalendarContainer.svelte","../src/lib/seo/helpers.ts","../src/lib/seo/buildEventJsonLd.ts","../src/lib/seo/buildSeriesJsonLd.ts","../src/lib/seo/buildCollectionJsonLd.ts","../src/lib/seo/HostSeoController.ts","../src/assets/icons/calendar-month.svg","../src/assets/icons/list-outline.svg","../src/assets/icons/grid-outline.svg","../src/lib/theme.js","../src/lib/config.js","../src/lib/scheme-colors.js","../src/lib/web-component.js","../src/lib/VenueCalendar.js"],"sourcesContent":["/**\n * Concatenates two arrays faster than the array spread operator.\n */\nconst concatArrays = (array1, array2) => {\n // Pre-allocate for better V8 optimization\n const combinedArray = new Array(array1.length + array2.length);\n for (let i = 0; i < array1.length; i++) {\n combinedArray[i] = array1[i];\n }\n for (let i = 0; i < array2.length; i++) {\n combinedArray[array1.length + i] = array2[i];\n }\n return combinedArray;\n};\n\n// Factory function ensures consistent object shapes\nconst createClassValidatorObject = (classGroupId, validator) => ({\n classGroupId,\n validator\n});\n// Factory ensures consistent ClassPartObject shape\nconst createClassPartObject = (nextPart = new Map(), validators = null, classGroupId) => ({\n nextPart,\n validators,\n classGroupId\n});\nconst CLASS_PART_SEPARATOR = '-';\nconst EMPTY_CONFLICTS = [];\n// I use two dots here because one dot is used as prefix for class groups in plugins\nconst ARBITRARY_PROPERTY_PREFIX = 'arbitrary..';\nconst createClassGroupUtils = config => {\n const classMap = createClassMap(config);\n const {\n conflictingClassGroups,\n conflictingClassGroupModifiers\n } = config;\n const getClassGroupId = className => {\n if (className.startsWith('[') && className.endsWith(']')) {\n return getGroupIdForArbitraryProperty(className);\n }\n const classParts = className.split(CLASS_PART_SEPARATOR);\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and skip it.\n const startIndex = classParts[0] === '' && classParts.length > 1 ? 1 : 0;\n return getGroupRecursive(classParts, startIndex, classMap);\n };\n const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {\n if (hasPostfixModifier) {\n const modifierConflicts = conflictingClassGroupModifiers[classGroupId];\n const baseConflicts = conflictingClassGroups[classGroupId];\n if (modifierConflicts) {\n if (baseConflicts) {\n // Merge base conflicts with modifier conflicts\n return concatArrays(baseConflicts, modifierConflicts);\n }\n // Only modifier conflicts\n return modifierConflicts;\n }\n // Fall back to without postfix if no modifier conflicts\n return baseConflicts || EMPTY_CONFLICTS;\n }\n return conflictingClassGroups[classGroupId] || EMPTY_CONFLICTS;\n };\n return {\n getClassGroupId,\n getConflictingClassGroupIds\n };\n};\nconst getGroupRecursive = (classParts, startIndex, classPartObject) => {\n const classPathsLength = classParts.length - startIndex;\n if (classPathsLength === 0) {\n return classPartObject.classGroupId;\n }\n const currentClassPart = classParts[startIndex];\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);\n if (nextClassPartObject) {\n const result = getGroupRecursive(classParts, startIndex + 1, nextClassPartObject);\n if (result) return result;\n }\n const validators = classPartObject.validators;\n if (validators === null) {\n return undefined;\n }\n // Build classRest string efficiently by joining from startIndex onwards\n const classRest = startIndex === 0 ? classParts.join(CLASS_PART_SEPARATOR) : classParts.slice(startIndex).join(CLASS_PART_SEPARATOR);\n const validatorsLength = validators.length;\n for (let i = 0; i < validatorsLength; i++) {\n const validatorObj = validators[i];\n if (validatorObj.validator(classRest)) {\n return validatorObj.classGroupId;\n }\n }\n return undefined;\n};\n/**\n * Get the class group ID for an arbitrary property.\n *\n * @param className - The class name to get the group ID for. Is expected to be string starting with `[` and ending with `]`.\n */\nconst getGroupIdForArbitraryProperty = className => className.slice(1, -1).indexOf(':') === -1 ? undefined : (() => {\n const content = className.slice(1, -1);\n const colonIndex = content.indexOf(':');\n const property = content.slice(0, colonIndex);\n return property ? ARBITRARY_PROPERTY_PREFIX + property : undefined;\n})();\n/**\n * Exported for testing only\n */\nconst createClassMap = config => {\n const {\n theme,\n classGroups\n } = config;\n return processClassGroups(classGroups, theme);\n};\n// Split into separate functions to maintain monomorphic call sites\nconst processClassGroups = (classGroups, theme) => {\n const classMap = createClassPartObject();\n for (const classGroupId in classGroups) {\n const group = classGroups[classGroupId];\n processClassesRecursively(group, classMap, classGroupId, theme);\n }\n return classMap;\n};\nconst processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {\n const len = classGroup.length;\n for (let i = 0; i < len; i++) {\n const classDefinition = classGroup[i];\n processClassDefinition(classDefinition, classPartObject, classGroupId, theme);\n }\n};\n// Split into separate functions for each type to maintain monomorphic call sites\nconst processClassDefinition = (classDefinition, classPartObject, classGroupId, theme) => {\n if (typeof classDefinition === 'string') {\n processStringDefinition(classDefinition, classPartObject, classGroupId);\n return;\n }\n if (typeof classDefinition === 'function') {\n processFunctionDefinition(classDefinition, classPartObject, classGroupId, theme);\n return;\n }\n processObjectDefinition(classDefinition, classPartObject, classGroupId, theme);\n};\nconst processStringDefinition = (classDefinition, classPartObject, classGroupId) => {\n const classPartObjectToEdit = classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition);\n classPartObjectToEdit.classGroupId = classGroupId;\n};\nconst processFunctionDefinition = (classDefinition, classPartObject, classGroupId, theme) => {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);\n return;\n }\n if (classPartObject.validators === null) {\n classPartObject.validators = [];\n }\n classPartObject.validators.push(createClassValidatorObject(classGroupId, classDefinition));\n};\nconst processObjectDefinition = (classDefinition, classPartObject, classGroupId, theme) => {\n const entries = Object.entries(classDefinition);\n const len = entries.length;\n for (let i = 0; i < len; i++) {\n const [key, value] = entries[i];\n processClassesRecursively(value, getPart(classPartObject, key), classGroupId, theme);\n }\n};\nconst getPart = (classPartObject, path) => {\n let current = classPartObject;\n const parts = path.split(CLASS_PART_SEPARATOR);\n const len = parts.length;\n for (let i = 0; i < len; i++) {\n const part = parts[i];\n let next = current.nextPart.get(part);\n if (!next) {\n next = createClassPartObject();\n current.nextPart.set(part, next);\n }\n current = next;\n }\n return current;\n};\n// Type guard maintains monomorphic check\nconst isThemeGetter = func => 'isThemeGetter' in func && func.isThemeGetter === true;\n\n// LRU cache implementation using plain objects for simplicity\nconst createLruCache = maxCacheSize => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {}\n };\n }\n let cacheSize = 0;\n let cache = Object.create(null);\n let previousCache = Object.create(null);\n const update = (key, value) => {\n cache[key] = value;\n cacheSize++;\n if (cacheSize > maxCacheSize) {\n cacheSize = 0;\n previousCache = cache;\n cache = Object.create(null);\n }\n };\n return {\n get(key) {\n let value = cache[key];\n if (value !== undefined) {\n return value;\n }\n if ((value = previousCache[key]) !== undefined) {\n update(key, value);\n return value;\n }\n },\n set(key, value) {\n if (key in cache) {\n cache[key] = value;\n } else {\n update(key, value);\n }\n }\n };\n};\nconst IMPORTANT_MODIFIER = '!';\nconst MODIFIER_SEPARATOR = ':';\nconst EMPTY_MODIFIERS = [];\n// Pre-allocated result object shape for consistency\nconst createResultObject = (modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition, isExternal) => ({\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n isExternal\n});\nconst createParseClassName = config => {\n const {\n prefix,\n experimentalParseClassName\n } = config;\n /**\n * Parse class name into parts.\n *\n * Inspired by `splitAtTopLevelOnly` used in Tailwind CSS\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n */\n let parseClassName = className => {\n // Use simple array with push for better performance\n const modifiers = [];\n let bracketDepth = 0;\n let parenDepth = 0;\n let modifierStart = 0;\n let postfixModifierPosition;\n const len = className.length;\n for (let index = 0; index < len; index++) {\n const currentCharacter = className[index];\n if (bracketDepth === 0 && parenDepth === 0) {\n if (currentCharacter === MODIFIER_SEPARATOR) {\n modifiers.push(className.slice(modifierStart, index));\n modifierStart = index + 1;\n continue;\n }\n if (currentCharacter === '/') {\n postfixModifierPosition = index;\n continue;\n }\n }\n if (currentCharacter === '[') bracketDepth++;else if (currentCharacter === ']') bracketDepth--;else if (currentCharacter === '(') parenDepth++;else if (currentCharacter === ')') parenDepth--;\n }\n const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.slice(modifierStart);\n // Inline important modifier check\n let baseClassName = baseClassNameWithImportantModifier;\n let hasImportantModifier = false;\n if (baseClassNameWithImportantModifier.endsWith(IMPORTANT_MODIFIER)) {\n baseClassName = baseClassNameWithImportantModifier.slice(0, -1);\n hasImportantModifier = true;\n } else if (\n /**\n * In Tailwind CSS v3 the important modifier was at the start of the base class name. This is still supported for legacy reasons.\n * @see https://github.com/dcastil/tailwind-merge/issues/513#issuecomment-2614029864\n */\n baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER)) {\n baseClassName = baseClassNameWithImportantModifier.slice(1);\n hasImportantModifier = true;\n }\n const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : undefined;\n return createResultObject(modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition);\n };\n if (prefix) {\n const fullPrefix = prefix + MODIFIER_SEPARATOR;\n const parseClassNameOriginal = parseClassName;\n parseClassName = className => className.startsWith(fullPrefix) ? parseClassNameOriginal(className.slice(fullPrefix.length)) : createResultObject(EMPTY_MODIFIERS, false, className, undefined, true);\n }\n if (experimentalParseClassName) {\n const parseClassNameOriginal = parseClassName;\n parseClassName = className => experimentalParseClassName({\n className,\n parseClassName: parseClassNameOriginal\n });\n }\n return parseClassName;\n};\n\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nconst createSortModifiers = config => {\n // Pre-compute weights for all known modifiers for O(1) comparison\n const modifierWeights = new Map();\n // Assign weights to sensitive modifiers (highest priority, but preserve order)\n config.orderSensitiveModifiers.forEach((mod, index) => {\n modifierWeights.set(mod, 1000000 + index); // High weights for sensitive mods\n });\n return modifiers => {\n const result = [];\n let currentSegment = [];\n // Process modifiers in one pass\n for (let i = 0; i < modifiers.length; i++) {\n const modifier = modifiers[i];\n // Check if modifier is sensitive (starts with '[' or in orderSensitiveModifiers)\n const isArbitrary = modifier[0] === '[';\n const isOrderSensitive = modifierWeights.has(modifier);\n if (isArbitrary || isOrderSensitive) {\n // Sort and flush current segment alphabetically\n if (currentSegment.length > 0) {\n currentSegment.sort();\n result.push(...currentSegment);\n currentSegment = [];\n }\n result.push(modifier);\n } else {\n // Regular modifier - add to current segment for batch sorting\n currentSegment.push(modifier);\n }\n }\n // Sort and add any remaining segment items\n if (currentSegment.length > 0) {\n currentSegment.sort();\n result.push(...currentSegment);\n }\n return result;\n };\n};\nconst createConfigUtils = config => ({\n cache: createLruCache(config.cacheSize),\n parseClassName: createParseClassName(config),\n sortModifiers: createSortModifiers(config),\n ...createClassGroupUtils(config)\n});\nconst SPLIT_CLASSES_REGEX = /\\s+/;\nconst mergeClassList = (classList, configUtils) => {\n const {\n parseClassName,\n getClassGroupId,\n getConflictingClassGroupIds,\n sortModifiers\n } = configUtils;\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict = [];\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);\n let result = '';\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index];\n const {\n isExternal,\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition\n } = parseClassName(originalClassName);\n if (isExternal) {\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n let hasPostfixModifier = !!maybePostfixModifierPosition;\n let classGroupId = getClassGroupId(hasPostfixModifier ? baseClassName.substring(0, maybePostfixModifierPosition) : baseClassName);\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n classGroupId = getClassGroupId(baseClassName);\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n hasPostfixModifier = false;\n }\n // Fast path: skip sorting for empty or single modifier\n const variantModifier = modifiers.length === 0 ? '' : modifiers.length === 1 ? modifiers[0] : sortModifiers(modifiers).join(':');\n const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;\n const classId = modifierId + classGroupId;\n if (classGroupsInConflict.indexOf(classId) > -1) {\n // Tailwind class omitted due to conflict\n continue;\n }\n classGroupsInConflict.push(classId);\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i];\n classGroupsInConflict.push(modifierId + group);\n }\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n }\n return result;\n};\n\n/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\nconst twJoin = (...classLists) => {\n let index = 0;\n let argument;\n let resolvedValue;\n let string = '';\n while (index < classLists.length) {\n if (argument = classLists[index++]) {\n if (resolvedValue = toValue(argument)) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n};\nconst toValue = mix => {\n // Fast path for strings\n if (typeof mix === 'string') {\n return mix;\n }\n let resolvedValue;\n let string = '';\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if (resolvedValue = toValue(mix[k])) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n};\nconst createTailwindMerge = (createConfigFirst, ...createConfigRest) => {\n let configUtils;\n let cacheGet;\n let cacheSet;\n let functionToCall;\n const initTailwindMerge = classList => {\n const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());\n configUtils = createConfigUtils(config);\n cacheGet = configUtils.cache.get;\n cacheSet = configUtils.cache.set;\n functionToCall = tailwindMerge;\n return tailwindMerge(classList);\n };\n const tailwindMerge = classList => {\n const cachedResult = cacheGet(classList);\n if (cachedResult) {\n return cachedResult;\n }\n const result = mergeClassList(classList, configUtils);\n cacheSet(classList, result);\n return result;\n };\n functionToCall = initTailwindMerge;\n return (...args) => functionToCall(twJoin(...args));\n};\nconst fallbackThemeArr = [];\nconst fromTheme = key => {\n const themeGetter = theme => theme[key] || fallbackThemeArr;\n themeGetter.isThemeGetter = true;\n return themeGetter;\n};\nconst arbitraryValueRegex = /^\\[(?:(\\w[\\w-]*):)?(.+)\\]$/i;\nconst arbitraryVariableRegex = /^\\((?:(\\w[\\w-]*):)?(.+)\\)$/i;\nconst fractionRegex = /^\\d+(?:\\.\\d+)?\\/\\d+(?:\\.\\d+)?$/;\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/;\nconst lengthUnitRegex = /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/;\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\\(.+\\)$/;\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/;\nconst imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/;\nconst isFraction = value => fractionRegex.test(value);\nconst isNumber = value => !!value && !Number.isNaN(Number(value));\nconst isInteger = value => !!value && Number.isInteger(Number(value));\nconst isPercent = value => value.endsWith('%') && isNumber(value.slice(0, -1));\nconst isTshirtSize = value => tshirtUnitRegex.test(value);\nconst isAny = () => true;\nconst isLengthOnly = value =>\n// `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n// For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n// I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\nlengthUnitRegex.test(value) && !colorFunctionRegex.test(value);\nconst isNever = () => false;\nconst isShadow = value => shadowRegex.test(value);\nconst isImage = value => imageRegex.test(value);\nconst isAnyNonArbitrary = value => !isArbitraryValue(value) && !isArbitraryVariable(value);\nconst isArbitrarySize = value => getIsArbitraryValue(value, isLabelSize, isNever);\nconst isArbitraryValue = value => arbitraryValueRegex.test(value);\nconst isArbitraryLength = value => getIsArbitraryValue(value, isLabelLength, isLengthOnly);\nconst isArbitraryNumber = value => getIsArbitraryValue(value, isLabelNumber, isNumber);\nconst isArbitraryWeight = value => getIsArbitraryValue(value, isLabelWeight, isAny);\nconst isArbitraryFamilyName = value => getIsArbitraryValue(value, isLabelFamilyName, isNever);\nconst isArbitraryPosition = value => getIsArbitraryValue(value, isLabelPosition, isNever);\nconst isArbitraryImage = value => getIsArbitraryValue(value, isLabelImage, isImage);\nconst isArbitraryShadow = value => getIsArbitraryValue(value, isLabelShadow, isShadow);\nconst isArbitraryVariable = value => arbitraryVariableRegex.test(value);\nconst isArbitraryVariableLength = value => getIsArbitraryVariable(value, isLabelLength);\nconst isArbitraryVariableFamilyName = value => getIsArbitraryVariable(value, isLabelFamilyName);\nconst isArbitraryVariablePosition = value => getIsArbitraryVariable(value, isLabelPosition);\nconst isArbitraryVariableSize = value => getIsArbitraryVariable(value, isLabelSize);\nconst isArbitraryVariableImage = value => getIsArbitraryVariable(value, isLabelImage);\nconst isArbitraryVariableShadow = value => getIsArbitraryVariable(value, isLabelShadow, true);\nconst isArbitraryVariableWeight = value => getIsArbitraryVariable(value, isLabelWeight, true);\n// Helpers\nconst getIsArbitraryValue = (value, testLabel, testValue) => {\n const result = arbitraryValueRegex.exec(value);\n if (result) {\n if (result[1]) {\n return testLabel(result[1]);\n }\n return testValue(result[2]);\n }\n return false;\n};\nconst getIsArbitraryVariable = (value, testLabel, shouldMatchNoLabel = false) => {\n const result = arbitraryVariableRegex.exec(value);\n if (result) {\n if (result[1]) {\n return testLabel(result[1]);\n }\n return shouldMatchNoLabel;\n }\n return false;\n};\n// Labels\nconst isLabelPosition = label => label === 'position' || label === 'percentage';\nconst isLabelImage = label => label === 'image' || label === 'url';\nconst isLabelSize = label => label === 'length' || label === 'size' || label === 'bg-size';\nconst isLabelLength = label => label === 'length';\nconst isLabelNumber = label => label === 'number';\nconst isLabelFamilyName = label => label === 'family-name';\nconst isLabelWeight = label => label === 'number' || label === 'weight';\nconst isLabelShadow = label => label === 'shadow';\nconst validators = /*#__PURE__*/Object.defineProperty({\n __proto__: null,\n isAny,\n isAnyNonArbitrary,\n isArbitraryFamilyName,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isArbitraryVariable,\n isArbitraryVariableFamilyName,\n isArbitraryVariableImage,\n isArbitraryVariableLength,\n isArbitraryVariablePosition,\n isArbitraryVariableShadow,\n isArbitraryVariableSize,\n isArbitraryVariableWeight,\n isArbitraryWeight,\n isFraction,\n isInteger,\n isNumber,\n isPercent,\n isTshirtSize\n}, Symbol.toStringTag, {\n value: 'Module'\n});\nconst getDefaultConfig = () => {\n /**\n * Theme getters for theme variable namespaces\n * @see https://tailwindcss.com/docs/theme#theme-variable-namespaces\n */\n /***/\n const themeColor = fromTheme('color');\n const themeFont = fromTheme('font');\n const themeText = fromTheme('text');\n const themeFontWeight = fromTheme('font-weight');\n const themeTracking = fromTheme('tracking');\n const themeLeading = fromTheme('leading');\n const themeBreakpoint = fromTheme('breakpoint');\n const themeContainer = fromTheme('container');\n const themeSpacing = fromTheme('spacing');\n const themeRadius = fromTheme('radius');\n const themeShadow = fromTheme('shadow');\n const themeInsetShadow = fromTheme('inset-shadow');\n const themeTextShadow = fromTheme('text-shadow');\n const themeDropShadow = fromTheme('drop-shadow');\n const themeBlur = fromTheme('blur');\n const themePerspective = fromTheme('perspective');\n const themeAspect = fromTheme('aspect');\n const themeEase = fromTheme('ease');\n const themeAnimate = fromTheme('animate');\n /**\n * Helpers to avoid repeating the same scales\n *\n * We use functions that create a new array every time they're called instead of static arrays.\n * This ensures that users who modify any scale by mutating the array (e.g. with `array.push(element)`) don't accidentally mutate arrays in other parts of the config.\n */\n /***/\n const scaleBreak = () => ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'];\n const scalePosition = () => ['center', 'top', 'bottom', 'left', 'right', 'top-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-top', 'top-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-top', 'bottom-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-bottom', 'bottom-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-bottom'];\n const scalePositionWithArbitrary = () => [...scalePosition(), isArbitraryVariable, isArbitraryValue];\n const scaleOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'];\n const scaleOverscroll = () => ['auto', 'contain', 'none'];\n const scaleUnambiguousSpacing = () => [isArbitraryVariable, isArbitraryValue, themeSpacing];\n const scaleInset = () => [isFraction, 'full', 'auto', ...scaleUnambiguousSpacing()];\n const scaleGridTemplateColsRows = () => [isInteger, 'none', 'subgrid', isArbitraryVariable, isArbitraryValue];\n const scaleGridColRowStartAndEnd = () => ['auto', {\n span: ['full', isInteger, isArbitraryVariable, isArbitraryValue]\n }, isInteger, isArbitraryVariable, isArbitraryValue];\n const scaleGridColRowStartOrEnd = () => [isInteger, 'auto', isArbitraryVariable, isArbitraryValue];\n const scaleGridAutoColsRows = () => ['auto', 'min', 'max', 'fr', isArbitraryVariable, isArbitraryValue];\n const scaleAlignPrimaryAxis = () => ['start', 'end', 'center', 'between', 'around', 'evenly', 'stretch', 'baseline', 'center-safe', 'end-safe'];\n const scaleAlignSecondaryAxis = () => ['start', 'end', 'center', 'stretch', 'center-safe', 'end-safe'];\n const scaleMargin = () => ['auto', ...scaleUnambiguousSpacing()];\n const scaleSizing = () => [isFraction, 'auto', 'full', 'dvw', 'dvh', 'lvw', 'lvh', 'svw', 'svh', 'min', 'max', 'fit', ...scaleUnambiguousSpacing()];\n const scaleSizingInline = () => [isFraction, 'screen', 'full', 'dvw', 'lvw', 'svw', 'min', 'max', 'fit', ...scaleUnambiguousSpacing()];\n const scaleSizingBlock = () => [isFraction, 'screen', 'full', 'lh', 'dvh', 'lvh', 'svh', 'min', 'max', 'fit', ...scaleUnambiguousSpacing()];\n const scaleColor = () => [themeColor, isArbitraryVariable, isArbitraryValue];\n const scaleBgPosition = () => [...scalePosition(), isArbitraryVariablePosition, isArbitraryPosition, {\n position: [isArbitraryVariable, isArbitraryValue]\n }];\n const scaleBgRepeat = () => ['no-repeat', {\n repeat: ['', 'x', 'y', 'space', 'round']\n }];\n const scaleBgSize = () => ['auto', 'cover', 'contain', isArbitraryVariableSize, isArbitrarySize, {\n size: [isArbitraryVariable, isArbitraryValue]\n }];\n const scaleGradientStopPosition = () => [isPercent, isArbitraryVariableLength, isArbitraryLength];\n const scaleRadius = () => [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', 'full', themeRadius, isArbitraryVariable, isArbitraryValue];\n const scaleBorderWidth = () => ['', isNumber, isArbitraryVariableLength, isArbitraryLength];\n const scaleLineStyle = () => ['solid', 'dashed', 'dotted', 'double'];\n const scaleBlendMode = () => ['normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'color-dodge', 'color-burn', 'hard-light', 'soft-light', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity'];\n const scaleMaskImagePosition = () => [isNumber, isPercent, isArbitraryVariablePosition, isArbitraryPosition];\n const scaleBlur = () => [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeBlur, isArbitraryVariable, isArbitraryValue];\n const scaleRotate = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleScale = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleSkew = () => [isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleTranslate = () => [isFraction, 'full', ...scaleUnambiguousSpacing()];\n return {\n cacheSize: 500,\n theme: {\n animate: ['spin', 'ping', 'pulse', 'bounce'],\n aspect: ['video'],\n blur: [isTshirtSize],\n breakpoint: [isTshirtSize],\n color: [isAny],\n container: [isTshirtSize],\n 'drop-shadow': [isTshirtSize],\n ease: ['in', 'out', 'in-out'],\n font: [isAnyNonArbitrary],\n 'font-weight': ['thin', 'extralight', 'light', 'normal', 'medium', 'semibold', 'bold', 'extrabold', 'black'],\n 'inset-shadow': [isTshirtSize],\n leading: ['none', 'tight', 'snug', 'normal', 'relaxed', 'loose'],\n perspective: ['dramatic', 'near', 'normal', 'midrange', 'distant', 'none'],\n radius: [isTshirtSize],\n shadow: [isTshirtSize],\n spacing: ['px', isNumber],\n text: [isTshirtSize],\n 'text-shadow': [isTshirtSize],\n tracking: ['tighter', 'tight', 'normal', 'wide', 'wider', 'widest']\n },\n classGroups: {\n // --------------\n // --- Layout ---\n // --------------\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [{\n aspect: ['auto', 'square', isFraction, isArbitraryValue, isArbitraryVariable, themeAspect]\n }],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n * @deprecated since Tailwind CSS v4.0.0\n */\n container: ['container'],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [{\n columns: [isNumber, isArbitraryValue, isArbitraryVariable, themeContainer]\n }],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{\n 'break-after': scaleBreak()\n }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{\n 'break-before': scaleBreak()\n }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{\n 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column']\n }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{\n 'box-decoration': ['slice', 'clone']\n }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{\n box: ['border', 'content']\n }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: ['block', 'inline-block', 'inline', 'flex', 'inline-flex', 'table', 'inline-table', 'table-caption', 'table-cell', 'table-column', 'table-column-group', 'table-footer-group', 'table-header-group', 'table-row-group', 'table-row', 'flow-root', 'grid', 'inline-grid', 'contents', 'list-item', 'hidden'],\n /**\n * Screen Reader Only\n * @see https://tailwindcss.com/docs/display#screen-reader-only\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{\n float: ['right', 'left', 'none', 'start', 'end']\n }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{\n clear: ['left', 'right', 'both', 'none', 'start', 'end']\n }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{\n object: ['contain', 'cover', 'fill', 'none', 'scale-down']\n }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{\n object: scalePositionWithArbitrary()\n }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{\n overflow: scaleOverflow()\n }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{\n 'overflow-x': scaleOverflow()\n }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{\n 'overflow-y': scaleOverflow()\n }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{\n overscroll: scaleOverscroll()\n }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{\n 'overscroll-x': scaleOverscroll()\n }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{\n 'overscroll-y': scaleOverscroll()\n }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Inset\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{\n inset: scaleInset()\n }],\n /**\n * Inset Inline\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{\n 'inset-x': scaleInset()\n }],\n /**\n * Inset Block\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{\n 'inset-y': scaleInset()\n }],\n /**\n * Inset Inline Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n * @todo class group will be renamed to `inset-s` in next major release\n */\n start: [{\n 'inset-s': scaleInset(),\n /**\n * @deprecated since Tailwind CSS v4.2.0 in favor of `inset-s-*` utilities.\n * @see https://github.com/tailwindlabs/tailwindcss/pull/19613\n */\n start: scaleInset()\n }],\n /**\n * Inset Inline End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n * @todo class group will be renamed to `inset-e` in next major release\n */\n end: [{\n 'inset-e': scaleInset(),\n /**\n * @deprecated since Tailwind CSS v4.2.0 in favor of `inset-e-*` utilities.\n * @see https://github.com/tailwindlabs/tailwindcss/pull/19613\n */\n end: scaleInset()\n }],\n /**\n * Inset Block Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-bs': [{\n 'inset-bs': scaleInset()\n }],\n /**\n * Inset Block End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-be': [{\n 'inset-be': scaleInset()\n }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{\n top: scaleInset()\n }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{\n right: scaleInset()\n }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{\n bottom: scaleInset()\n }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{\n left: scaleInset()\n }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{\n z: [isInteger, 'auto', isArbitraryVariable, isArbitraryValue]\n }],\n // ------------------------\n // --- Flexbox and Grid ---\n // ------------------------\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [{\n basis: [isFraction, 'full', 'auto', themeContainer, ...scaleUnambiguousSpacing()]\n }],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{\n flex: ['row', 'row-reverse', 'col', 'col-reverse']\n }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{\n flex: ['nowrap', 'wrap', 'wrap-reverse']\n }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{\n flex: [isNumber, isFraction, 'auto', 'initial', 'none', isArbitraryValue]\n }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{\n grow: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{\n shrink: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [{\n order: [isInteger, 'first', 'last', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{\n 'grid-cols': scaleGridTemplateColsRows()\n }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [{\n col: scaleGridColRowStartAndEnd()\n }],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{\n 'col-start': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{\n 'col-end': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{\n 'grid-rows': scaleGridTemplateColsRows()\n }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [{\n row: scaleGridColRowStartAndEnd()\n }],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{\n 'row-start': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{\n 'row-end': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{\n 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense']\n }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{\n 'auto-cols': scaleGridAutoColsRows()\n }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{\n 'auto-rows': scaleGridAutoColsRows()\n }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{\n gap: scaleUnambiguousSpacing()\n }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{\n 'gap-x': scaleUnambiguousSpacing()\n }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{\n 'gap-y': scaleUnambiguousSpacing()\n }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{\n justify: [...scaleAlignPrimaryAxis(), 'normal']\n }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{\n 'justify-items': [...scaleAlignSecondaryAxis(), 'normal']\n }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{\n 'justify-self': ['auto', ...scaleAlignSecondaryAxis()]\n }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{\n content: ['normal', ...scaleAlignPrimaryAxis()]\n }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{\n items: [...scaleAlignSecondaryAxis(), {\n baseline: ['', 'last']\n }]\n }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [{\n self: ['auto', ...scaleAlignSecondaryAxis(), {\n baseline: ['', 'last']\n }]\n }],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{\n 'place-content': scaleAlignPrimaryAxis()\n }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{\n 'place-items': [...scaleAlignSecondaryAxis(), 'baseline']\n }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{\n 'place-self': ['auto', ...scaleAlignSecondaryAxis()]\n }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{\n p: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Inline\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{\n px: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Block\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{\n py: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Inline Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{\n ps: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Inline End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{\n pe: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Block Start\n * @see https://tailwindcss.com/docs/padding\n */\n pbs: [{\n pbs: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Block End\n * @see https://tailwindcss.com/docs/padding\n */\n pbe: [{\n pbe: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{\n pt: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{\n pr: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{\n pb: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{\n pl: scaleUnambiguousSpacing()\n }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{\n m: scaleMargin()\n }],\n /**\n * Margin Inline\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{\n mx: scaleMargin()\n }],\n /**\n * Margin Block\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{\n my: scaleMargin()\n }],\n /**\n * Margin Inline Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{\n ms: scaleMargin()\n }],\n /**\n * Margin Inline End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{\n me: scaleMargin()\n }],\n /**\n * Margin Block Start\n * @see https://tailwindcss.com/docs/margin\n */\n mbs: [{\n mbs: scaleMargin()\n }],\n /**\n * Margin Block End\n * @see https://tailwindcss.com/docs/margin\n */\n mbe: [{\n mbe: scaleMargin()\n }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{\n mt: scaleMargin()\n }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{\n mr: scaleMargin()\n }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{\n mb: scaleMargin()\n }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{\n ml: scaleMargin()\n }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x': [{\n 'space-x': scaleUnambiguousSpacing()\n }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y': [{\n 'space-y': scaleUnambiguousSpacing()\n }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y-reverse': ['space-y-reverse'],\n // --------------\n // --- Sizing ---\n // --------------\n /**\n * Size\n * @see https://tailwindcss.com/docs/width#setting-both-width-and-height\n */\n size: [{\n size: scaleSizing()\n }],\n /**\n * Inline Size\n * @see https://tailwindcss.com/docs/width\n */\n 'inline-size': [{\n inline: ['auto', ...scaleSizingInline()]\n }],\n /**\n * Min-Inline Size\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-inline-size': [{\n 'min-inline': ['auto', ...scaleSizingInline()]\n }],\n /**\n * Max-Inline Size\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-inline-size': [{\n 'max-inline': ['none', ...scaleSizingInline()]\n }],\n /**\n * Block Size\n * @see https://tailwindcss.com/docs/height\n */\n 'block-size': [{\n block: ['auto', ...scaleSizingBlock()]\n }],\n /**\n * Min-Block Size\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-block-size': [{\n 'min-block': ['auto', ...scaleSizingBlock()]\n }],\n /**\n * Max-Block Size\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-block-size': [{\n 'max-block': ['none', ...scaleSizingBlock()]\n }],\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [{\n w: [themeContainer, 'screen', ...scaleSizing()]\n }],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [{\n 'min-w': [themeContainer, 'screen', /** Deprecated. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'none', ...scaleSizing()]\n }],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [{\n 'max-w': [themeContainer, 'screen', 'none', /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'prose', /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n {\n screen: [themeBreakpoint]\n }, ...scaleSizing()]\n }],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [{\n h: ['screen', 'lh', ...scaleSizing()]\n }],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [{\n 'min-h': ['screen', 'lh', 'none', ...scaleSizing()]\n }],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [{\n 'max-h': ['screen', 'lh', ...scaleSizing()]\n }],\n // ------------------\n // --- Typography ---\n // ------------------\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [{\n text: ['base', themeText, isArbitraryVariableLength, isArbitraryLength]\n }],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [{\n font: [themeFontWeight, isArbitraryVariableWeight, isArbitraryWeight]\n }],\n /**\n * Font Stretch\n * @see https://tailwindcss.com/docs/font-stretch\n */\n 'font-stretch': [{\n 'font-stretch': ['ultra-condensed', 'extra-condensed', 'condensed', 'semi-condensed', 'normal', 'semi-expanded', 'expanded', 'extra-expanded', 'ultra-expanded', isPercent, isArbitraryValue]\n }],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [{\n font: [isArbitraryVariableFamilyName, isArbitraryFamilyName, themeFont]\n }],\n /**\n * Font Feature Settings\n * @see https://tailwindcss.com/docs/font-feature-settings\n */\n 'font-features': [{\n 'font-features': [isArbitraryValue]\n }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [{\n tracking: [themeTracking, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [{\n 'line-clamp': [isNumber, 'none', isArbitraryVariable, isArbitraryNumber]\n }],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [{\n leading: [/** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n themeLeading, ...scaleUnambiguousSpacing()]\n }],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{\n 'list-image': ['none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{\n list: ['inside', 'outside']\n }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [{\n list: ['disc', 'decimal', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{\n text: ['left', 'center', 'right', 'justify', 'start', 'end']\n }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://v3.tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{\n placeholder: scaleColor()\n }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{\n text: scaleColor()\n }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{\n decoration: [...scaleLineStyle(), 'wavy']\n }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [{\n decoration: [isNumber, 'from-font', 'auto', isArbitraryVariable, isArbitraryLength]\n }],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{\n decoration: scaleColor()\n }],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [{\n 'underline-offset': [isNumber, 'auto', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{\n text: ['wrap', 'nowrap', 'balance', 'pretty']\n }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{\n indent: scaleUnambiguousSpacing()\n }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [{\n align: ['baseline', 'top', 'middle', 'bottom', 'text-top', 'text-bottom', 'sub', 'super', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [{\n whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces']\n }],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{\n break: ['normal', 'words', 'all', 'keep']\n }],\n /**\n * Overflow Wrap\n * @see https://tailwindcss.com/docs/overflow-wrap\n */\n wrap: [{\n wrap: ['break-word', 'anywhere', 'normal']\n }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{\n hyphens: ['none', 'manual', 'auto']\n }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{\n content: ['none', isArbitraryVariable, isArbitraryValue]\n }],\n // -------------------\n // --- Backgrounds ---\n // -------------------\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{\n bg: ['fixed', 'local', 'scroll']\n }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{\n 'bg-clip': ['border', 'padding', 'content', 'text']\n }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{\n 'bg-origin': ['border', 'padding', 'content']\n }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{\n bg: scaleBgPosition()\n }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{\n bg: scaleBgRepeat()\n }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{\n bg: scaleBgSize()\n }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [{\n bg: ['none', {\n linear: [{\n to: ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl']\n }, isInteger, isArbitraryVariable, isArbitraryValue],\n radial: ['', isArbitraryVariable, isArbitraryValue],\n conic: [isInteger, isArbitraryVariable, isArbitraryValue]\n }, isArbitraryVariableImage, isArbitraryImage]\n }],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{\n bg: scaleColor()\n }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{\n from: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{\n via: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{\n to: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{\n from: scaleColor()\n }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{\n via: scaleColor()\n }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{\n to: scaleColor()\n }],\n // ---------------\n // --- Borders ---\n // ---------------\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{\n rounded: scaleRadius()\n }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{\n 'rounded-s': scaleRadius()\n }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{\n 'rounded-e': scaleRadius()\n }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{\n 'rounded-t': scaleRadius()\n }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{\n 'rounded-r': scaleRadius()\n }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{\n 'rounded-b': scaleRadius()\n }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{\n 'rounded-l': scaleRadius()\n }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{\n 'rounded-ss': scaleRadius()\n }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{\n 'rounded-se': scaleRadius()\n }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{\n 'rounded-ee': scaleRadius()\n }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{\n 'rounded-es': scaleRadius()\n }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{\n 'rounded-tl': scaleRadius()\n }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{\n 'rounded-tr': scaleRadius()\n }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{\n 'rounded-br': scaleRadius()\n }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{\n 'rounded-bl': scaleRadius()\n }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{\n border: scaleBorderWidth()\n }],\n /**\n * Border Width Inline\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{\n 'border-x': scaleBorderWidth()\n }],\n /**\n * Border Width Block\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{\n 'border-y': scaleBorderWidth()\n }],\n /**\n * Border Width Inline Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{\n 'border-s': scaleBorderWidth()\n }],\n /**\n * Border Width Inline End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{\n 'border-e': scaleBorderWidth()\n }],\n /**\n * Border Width Block Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-bs': [{\n 'border-bs': scaleBorderWidth()\n }],\n /**\n * Border Width Block End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-be': [{\n 'border-be': scaleBorderWidth()\n }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{\n 'border-t': scaleBorderWidth()\n }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{\n 'border-r': scaleBorderWidth()\n }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{\n 'border-b': scaleBorderWidth()\n }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{\n 'border-l': scaleBorderWidth()\n }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x': [{\n 'divide-x': scaleBorderWidth()\n }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y': [{\n 'divide-y': scaleBorderWidth()\n }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{\n border: [...scaleLineStyle(), 'hidden', 'none']\n }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/border-style#setting-the-divider-style\n */\n 'divide-style': [{\n divide: [...scaleLineStyle(), 'hidden', 'none']\n }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{\n border: scaleColor()\n }],\n /**\n * Border Color Inline\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{\n 'border-x': scaleColor()\n }],\n /**\n * Border Color Block\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{\n 'border-y': scaleColor()\n }],\n /**\n * Border Color Inline Start\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{\n 'border-s': scaleColor()\n }],\n /**\n * Border Color Inline End\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{\n 'border-e': scaleColor()\n }],\n /**\n * Border Color Block Start\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-bs': [{\n 'border-bs': scaleColor()\n }],\n /**\n * Border Color Block End\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-be': [{\n 'border-be': scaleColor()\n }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{\n 'border-t': scaleColor()\n }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{\n 'border-r': scaleColor()\n }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{\n 'border-b': scaleColor()\n }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{\n 'border-l': scaleColor()\n }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{\n divide: scaleColor()\n }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{\n outline: [...scaleLineStyle(), 'none', 'hidden']\n }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [{\n 'outline-offset': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [{\n outline: ['', isNumber, isArbitraryVariableLength, isArbitraryLength]\n }],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{\n outline: scaleColor()\n }],\n // ---------------\n // --- Effects ---\n // ---------------\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [{\n shadow: [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-shadow-color\n */\n 'shadow-color': [{\n shadow: scaleColor()\n }],\n /**\n * Inset Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-shadow\n */\n 'inset-shadow': [{\n 'inset-shadow': ['none', themeInsetShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Inset Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-shadow-color\n */\n 'inset-shadow-color': [{\n 'inset-shadow': scaleColor()\n }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-a-ring\n */\n 'ring-w': [{\n ring: scaleBorderWidth()\n }],\n /**\n * Ring Width Inset\n * @see https://v3.tailwindcss.com/docs/ring-width#inset-rings\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-ring-color\n */\n 'ring-color': [{\n ring: scaleColor()\n }],\n /**\n * Ring Offset Width\n * @see https://v3.tailwindcss.com/docs/ring-offset-width\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-w': [{\n 'ring-offset': [isNumber, isArbitraryLength]\n }],\n /**\n * Ring Offset Color\n * @see https://v3.tailwindcss.com/docs/ring-offset-color\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-color': [{\n 'ring-offset': scaleColor()\n }],\n /**\n * Inset Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-ring\n */\n 'inset-ring-w': [{\n 'inset-ring': scaleBorderWidth()\n }],\n /**\n * Inset Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-ring-color\n */\n 'inset-ring-color': [{\n 'inset-ring': scaleColor()\n }],\n /**\n * Text Shadow\n * @see https://tailwindcss.com/docs/text-shadow\n */\n 'text-shadow': [{\n 'text-shadow': ['none', themeTextShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Text Shadow Color\n * @see https://tailwindcss.com/docs/text-shadow#setting-the-shadow-color\n */\n 'text-shadow-color': [{\n 'text-shadow': scaleColor()\n }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{\n opacity: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{\n 'mix-blend': [...scaleBlendMode(), 'plus-darker', 'plus-lighter']\n }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{\n 'bg-blend': scaleBlendMode()\n }],\n /**\n * Mask Clip\n * @see https://tailwindcss.com/docs/mask-clip\n */\n 'mask-clip': [{\n 'mask-clip': ['border', 'padding', 'content', 'fill', 'stroke', 'view']\n }, 'mask-no-clip'],\n /**\n * Mask Composite\n * @see https://tailwindcss.com/docs/mask-composite\n */\n 'mask-composite': [{\n mask: ['add', 'subtract', 'intersect', 'exclude']\n }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image-linear-pos': [{\n 'mask-linear': [isNumber]\n }],\n 'mask-image-linear-from-pos': [{\n 'mask-linear-from': scaleMaskImagePosition()\n }],\n 'mask-image-linear-to-pos': [{\n 'mask-linear-to': scaleMaskImagePosition()\n }],\n 'mask-image-linear-from-color': [{\n 'mask-linear-from': scaleColor()\n }],\n 'mask-image-linear-to-color': [{\n 'mask-linear-to': scaleColor()\n }],\n 'mask-image-t-from-pos': [{\n 'mask-t-from': scaleMaskImagePosition()\n }],\n 'mask-image-t-to-pos': [{\n 'mask-t-to': scaleMaskImagePosition()\n }],\n 'mask-image-t-from-color': [{\n 'mask-t-from': scaleColor()\n }],\n 'mask-image-t-to-color': [{\n 'mask-t-to': scaleColor()\n }],\n 'mask-image-r-from-pos': [{\n 'mask-r-from': scaleMaskImagePosition()\n }],\n 'mask-image-r-to-pos': [{\n 'mask-r-to': scaleMaskImagePosition()\n }],\n 'mask-image-r-from-color': [{\n 'mask-r-from': scaleColor()\n }],\n 'mask-image-r-to-color': [{\n 'mask-r-to': scaleColor()\n }],\n 'mask-image-b-from-pos': [{\n 'mask-b-from': scaleMaskImagePosition()\n }],\n 'mask-image-b-to-pos': [{\n 'mask-b-to': scaleMaskImagePosition()\n }],\n 'mask-image-b-from-color': [{\n 'mask-b-from': scaleColor()\n }],\n 'mask-image-b-to-color': [{\n 'mask-b-to': scaleColor()\n }],\n 'mask-image-l-from-pos': [{\n 'mask-l-from': scaleMaskImagePosition()\n }],\n 'mask-image-l-to-pos': [{\n 'mask-l-to': scaleMaskImagePosition()\n }],\n 'mask-image-l-from-color': [{\n 'mask-l-from': scaleColor()\n }],\n 'mask-image-l-to-color': [{\n 'mask-l-to': scaleColor()\n }],\n 'mask-image-x-from-pos': [{\n 'mask-x-from': scaleMaskImagePosition()\n }],\n 'mask-image-x-to-pos': [{\n 'mask-x-to': scaleMaskImagePosition()\n }],\n 'mask-image-x-from-color': [{\n 'mask-x-from': scaleColor()\n }],\n 'mask-image-x-to-color': [{\n 'mask-x-to': scaleColor()\n }],\n 'mask-image-y-from-pos': [{\n 'mask-y-from': scaleMaskImagePosition()\n }],\n 'mask-image-y-to-pos': [{\n 'mask-y-to': scaleMaskImagePosition()\n }],\n 'mask-image-y-from-color': [{\n 'mask-y-from': scaleColor()\n }],\n 'mask-image-y-to-color': [{\n 'mask-y-to': scaleColor()\n }],\n 'mask-image-radial': [{\n 'mask-radial': [isArbitraryVariable, isArbitraryValue]\n }],\n 'mask-image-radial-from-pos': [{\n 'mask-radial-from': scaleMaskImagePosition()\n }],\n 'mask-image-radial-to-pos': [{\n 'mask-radial-to': scaleMaskImagePosition()\n }],\n 'mask-image-radial-from-color': [{\n 'mask-radial-from': scaleColor()\n }],\n 'mask-image-radial-to-color': [{\n 'mask-radial-to': scaleColor()\n }],\n 'mask-image-radial-shape': [{\n 'mask-radial': ['circle', 'ellipse']\n }],\n 'mask-image-radial-size': [{\n 'mask-radial': [{\n closest: ['side', 'corner'],\n farthest: ['side', 'corner']\n }]\n }],\n 'mask-image-radial-pos': [{\n 'mask-radial-at': scalePosition()\n }],\n 'mask-image-conic-pos': [{\n 'mask-conic': [isNumber]\n }],\n 'mask-image-conic-from-pos': [{\n 'mask-conic-from': scaleMaskImagePosition()\n }],\n 'mask-image-conic-to-pos': [{\n 'mask-conic-to': scaleMaskImagePosition()\n }],\n 'mask-image-conic-from-color': [{\n 'mask-conic-from': scaleColor()\n }],\n 'mask-image-conic-to-color': [{\n 'mask-conic-to': scaleColor()\n }],\n /**\n * Mask Mode\n * @see https://tailwindcss.com/docs/mask-mode\n */\n 'mask-mode': [{\n mask: ['alpha', 'luminance', 'match']\n }],\n /**\n * Mask Origin\n * @see https://tailwindcss.com/docs/mask-origin\n */\n 'mask-origin': [{\n 'mask-origin': ['border', 'padding', 'content', 'fill', 'stroke', 'view']\n }],\n /**\n * Mask Position\n * @see https://tailwindcss.com/docs/mask-position\n */\n 'mask-position': [{\n mask: scaleBgPosition()\n }],\n /**\n * Mask Repeat\n * @see https://tailwindcss.com/docs/mask-repeat\n */\n 'mask-repeat': [{\n mask: scaleBgRepeat()\n }],\n /**\n * Mask Size\n * @see https://tailwindcss.com/docs/mask-size\n */\n 'mask-size': [{\n mask: scaleBgSize()\n }],\n /**\n * Mask Type\n * @see https://tailwindcss.com/docs/mask-type\n */\n 'mask-type': [{\n 'mask-type': ['alpha', 'luminance']\n }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image': [{\n mask: ['none', isArbitraryVariable, isArbitraryValue]\n }],\n // ---------------\n // --- Filters ---\n // ---------------\n /**\n * Filter\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [{\n filter: [\n // Deprecated since Tailwind CSS v3.0.0\n '', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{\n blur: scaleBlur()\n }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{\n brightness: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{\n contrast: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [{\n 'drop-shadow': [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeDropShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Drop Shadow Color\n * @see https://tailwindcss.com/docs/filter-drop-shadow#setting-the-shadow-color\n */\n 'drop-shadow-color': [{\n 'drop-shadow': scaleColor()\n }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{\n grayscale: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{\n 'hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{\n invert: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{\n saturate: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{\n sepia: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Filter\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [{\n 'backdrop-filter': [\n // Deprecated since Tailwind CSS v3.0.0\n '', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{\n 'backdrop-blur': scaleBlur()\n }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [{\n 'backdrop-brightness': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [{\n 'backdrop-contrast': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [{\n 'backdrop-grayscale': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [{\n 'backdrop-hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [{\n 'backdrop-invert': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [{\n 'backdrop-opacity': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [{\n 'backdrop-saturate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [{\n 'backdrop-sepia': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n // --------------\n // --- Tables ---\n // --------------\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{\n border: ['collapse', 'separate']\n }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{\n 'border-spacing': scaleUnambiguousSpacing()\n }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{\n 'border-spacing-x': scaleUnambiguousSpacing()\n }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{\n 'border-spacing-y': scaleUnambiguousSpacing()\n }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{\n table: ['auto', 'fixed']\n }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{\n caption: ['top', 'bottom']\n }],\n // ---------------------------------\n // --- Transitions and Animation ---\n // ---------------------------------\n /**\n * Transition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [{\n transition: ['', 'all', 'colors', 'opacity', 'shadow', 'transform', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Behavior\n * @see https://tailwindcss.com/docs/transition-behavior\n */\n 'transition-behavior': [{\n transition: ['normal', 'discrete']\n }],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{\n duration: [isNumber, 'initial', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [{\n ease: ['linear', 'initial', themeEase, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{\n delay: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{\n animate: ['none', themeAnimate, isArbitraryVariable, isArbitraryValue]\n }],\n // ------------------\n // --- Transforms ---\n // ------------------\n /**\n * Backface Visibility\n * @see https://tailwindcss.com/docs/backface-visibility\n */\n backface: [{\n backface: ['hidden', 'visible']\n }],\n /**\n * Perspective\n * @see https://tailwindcss.com/docs/perspective\n */\n perspective: [{\n perspective: [themePerspective, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Perspective Origin\n * @see https://tailwindcss.com/docs/perspective-origin\n */\n 'perspective-origin': [{\n 'perspective-origin': scalePositionWithArbitrary()\n }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{\n rotate: scaleRotate()\n }],\n /**\n * Rotate X\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-x': [{\n 'rotate-x': scaleRotate()\n }],\n /**\n * Rotate Y\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-y': [{\n 'rotate-y': scaleRotate()\n }],\n /**\n * Rotate Z\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-z': [{\n 'rotate-z': scaleRotate()\n }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{\n scale: scaleScale()\n }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{\n 'scale-x': scaleScale()\n }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{\n 'scale-y': scaleScale()\n }],\n /**\n * Scale Z\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-z': [{\n 'scale-z': scaleScale()\n }],\n /**\n * Scale 3D\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-3d': ['scale-3d'],\n /**\n * Skew\n * @see https://tailwindcss.com/docs/skew\n */\n skew: [{\n skew: scaleSkew()\n }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{\n 'skew-x': scaleSkew()\n }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{\n 'skew-y': scaleSkew()\n }],\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [{\n transform: [isArbitraryVariable, isArbitraryValue, '', 'none', 'gpu', 'cpu']\n }],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [{\n origin: scalePositionWithArbitrary()\n }],\n /**\n * Transform Style\n * @see https://tailwindcss.com/docs/transform-style\n */\n 'transform-style': [{\n transform: ['3d', 'flat']\n }],\n /**\n * Translate\n * @see https://tailwindcss.com/docs/translate\n */\n translate: [{\n translate: scaleTranslate()\n }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{\n 'translate-x': scaleTranslate()\n }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{\n 'translate-y': scaleTranslate()\n }],\n /**\n * Translate Z\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-z': [{\n 'translate-z': scaleTranslate()\n }],\n /**\n * Translate None\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-none': ['translate-none'],\n // ---------------------\n // --- Interactivity ---\n // ---------------------\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{\n accent: scaleColor()\n }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{\n appearance: ['none', 'auto']\n }],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{\n caret: scaleColor()\n }],\n /**\n * Color Scheme\n * @see https://tailwindcss.com/docs/color-scheme\n */\n 'color-scheme': [{\n scheme: ['normal', 'dark', 'light', 'light-dark', 'only-dark', 'only-light']\n }],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [{\n cursor: ['auto', 'default', 'pointer', 'wait', 'text', 'move', 'help', 'not-allowed', 'none', 'context-menu', 'progress', 'cell', 'crosshair', 'vertical-text', 'alias', 'copy', 'no-drop', 'grab', 'grabbing', 'all-scroll', 'col-resize', 'row-resize', 'n-resize', 'e-resize', 's-resize', 'w-resize', 'ne-resize', 'nw-resize', 'se-resize', 'sw-resize', 'ew-resize', 'ns-resize', 'nesw-resize', 'nwse-resize', 'zoom-in', 'zoom-out', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Field Sizing\n * @see https://tailwindcss.com/docs/field-sizing\n */\n 'field-sizing': [{\n 'field-sizing': ['fixed', 'content']\n }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{\n 'pointer-events': ['auto', 'none']\n }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{\n resize: ['none', '', 'y', 'x']\n }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{\n scroll: ['auto', 'smooth']\n }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{\n 'scroll-m': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Inline\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{\n 'scroll-mx': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Block\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{\n 'scroll-my': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Inline Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{\n 'scroll-ms': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Inline End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{\n 'scroll-me': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Block Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mbs': [{\n 'scroll-mbs': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Block End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mbe': [{\n 'scroll-mbe': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{\n 'scroll-mt': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{\n 'scroll-mr': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{\n 'scroll-mb': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{\n 'scroll-ml': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{\n 'scroll-p': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Inline\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{\n 'scroll-px': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Block\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{\n 'scroll-py': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Inline Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{\n 'scroll-ps': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Inline End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{\n 'scroll-pe': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Block Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pbs': [{\n 'scroll-pbs': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Block End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pbe': [{\n 'scroll-pbe': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{\n 'scroll-pt': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{\n 'scroll-pr': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{\n 'scroll-pb': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{\n 'scroll-pl': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{\n snap: ['start', 'end', 'center', 'align-none']\n }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{\n snap: ['normal', 'always']\n }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{\n snap: ['none', 'x', 'y', 'both']\n }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{\n snap: ['mandatory', 'proximity']\n }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [{\n touch: ['auto', 'none', 'manipulation']\n }],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [{\n 'touch-pan': ['x', 'left', 'right']\n }],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [{\n 'touch-pan': ['y', 'up', 'down']\n }],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{\n select: ['none', 'text', 'all', 'auto']\n }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [{\n 'will-change': ['auto', 'scroll', 'contents', 'transform', isArbitraryVariable, isArbitraryValue]\n }],\n // -----------\n // --- SVG ---\n // -----------\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{\n fill: ['none', ...scaleColor()]\n }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [{\n stroke: [isNumber, isArbitraryVariableLength, isArbitraryLength, isArbitraryNumber]\n }],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{\n stroke: ['none', ...scaleColor()]\n }],\n // ---------------------\n // --- Accessibility ---\n // ---------------------\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{\n 'forced-color-adjust': ['auto', 'none']\n }]\n },\n conflictingClassGroups: {\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: ['inset-x', 'inset-y', 'inset-bs', 'inset-be', 'start', 'end', 'top', 'right', 'bottom', 'left'],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pbs', 'pbe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mbs', 'mbe', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': ['fvn-ordinal', 'fvn-slashed-zero', 'fvn-figure', 'fvn-spacing', 'fvn-fraction'],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: ['rounded-s', 'rounded-e', 'rounded-t', 'rounded-r', 'rounded-b', 'rounded-l', 'rounded-ss', 'rounded-se', 'rounded-ee', 'rounded-es', 'rounded-tl', 'rounded-tr', 'rounded-br', 'rounded-bl'],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': ['border-w-x', 'border-w-y', 'border-w-s', 'border-w-e', 'border-w-bs', 'border-w-be', 'border-w-t', 'border-w-r', 'border-w-b', 'border-w-l'],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': ['border-color-x', 'border-color-y', 'border-color-s', 'border-color-e', 'border-color-bs', 'border-color-be', 'border-color-t', 'border-color-r', 'border-color-b', 'border-color-l'],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n translate: ['translate-x', 'translate-y', 'translate-none'],\n 'translate-none': ['translate', 'translate-x', 'translate-y', 'translate-z'],\n 'scroll-m': ['scroll-mx', 'scroll-my', 'scroll-ms', 'scroll-me', 'scroll-mbs', 'scroll-mbe', 'scroll-mt', 'scroll-mr', 'scroll-mb', 'scroll-ml'],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': ['scroll-px', 'scroll-py', 'scroll-ps', 'scroll-pe', 'scroll-pbs', 'scroll-pbe', 'scroll-pt', 'scroll-pr', 'scroll-pb', 'scroll-pl'],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch']\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading']\n },\n orderSensitiveModifiers: ['*', '**', 'after', 'backdrop', 'before', 'details-content', 'file', 'first-letter', 'first-line', 'marker', 'placeholder', 'selection']\n };\n};\n\n/**\n * @param baseConfig Config where other config will be merged into. This object will be mutated.\n * @param configExtension Partial config to merge into the `baseConfig`.\n */\nconst mergeConfigs = (baseConfig, {\n cacheSize,\n prefix,\n experimentalParseClassName,\n extend = {},\n override = {}\n}) => {\n overrideProperty(baseConfig, 'cacheSize', cacheSize);\n overrideProperty(baseConfig, 'prefix', prefix);\n overrideProperty(baseConfig, 'experimentalParseClassName', experimentalParseClassName);\n overrideConfigProperties(baseConfig.theme, override.theme);\n overrideConfigProperties(baseConfig.classGroups, override.classGroups);\n overrideConfigProperties(baseConfig.conflictingClassGroups, override.conflictingClassGroups);\n overrideConfigProperties(baseConfig.conflictingClassGroupModifiers, override.conflictingClassGroupModifiers);\n overrideProperty(baseConfig, 'orderSensitiveModifiers', override.orderSensitiveModifiers);\n mergeConfigProperties(baseConfig.theme, extend.theme);\n mergeConfigProperties(baseConfig.classGroups, extend.classGroups);\n mergeConfigProperties(baseConfig.conflictingClassGroups, extend.conflictingClassGroups);\n mergeConfigProperties(baseConfig.conflictingClassGroupModifiers, extend.conflictingClassGroupModifiers);\n mergeArrayProperties(baseConfig, extend, 'orderSensitiveModifiers');\n return baseConfig;\n};\nconst overrideProperty = (baseObject, overrideKey, overrideValue) => {\n if (overrideValue !== undefined) {\n baseObject[overrideKey] = overrideValue;\n }\n};\nconst overrideConfigProperties = (baseObject, overrideObject) => {\n if (overrideObject) {\n for (const key in overrideObject) {\n overrideProperty(baseObject, key, overrideObject[key]);\n }\n }\n};\nconst mergeConfigProperties = (baseObject, mergeObject) => {\n if (mergeObject) {\n for (const key in mergeObject) {\n mergeArrayProperties(baseObject, mergeObject, key);\n }\n }\n};\nconst mergeArrayProperties = (baseObject, mergeObject, key) => {\n const mergeValue = mergeObject[key];\n if (mergeValue !== undefined) {\n baseObject[key] = baseObject[key] ? baseObject[key].concat(mergeValue) : mergeValue;\n }\n};\nconst extendTailwindMerge = (configExtension, ...createConfig) => typeof configExtension === 'function' ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig) : createTailwindMerge(() => mergeConfigs(getDefaultConfig(), configExtension), ...createConfig);\nconst twMerge = /*#__PURE__*/createTailwindMerge(getDefaultConfig);\nexport { createTailwindMerge, extendTailwindMerge, fromTheme, getDefaultConfig, mergeConfigs, twJoin, twMerge, validators };\n//# sourceMappingURL=bundle-mjs.mjs.map\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import { twMerge } from \"tailwind-merge\";\nimport clsx from \"clsx\";\n/**\n * Join class names, filtering out falsy values.\n */\nexport function classNames(...classes) {\n return classes.filter(Boolean).join(\" \");\n}\n/**\n * Merge Tailwind CSS classes with conflict resolution.\n * Combines clsx (conditional classes) with tailwind-merge (conflict resolution).\n */\nexport function cn(...inputs) {\n return twMerge(clsx(inputs));\n}\n","/**\n * Centralized logger utility for MicDrop applications\n * Can be disabled in production or configured for different log levels\n *\n * Usage (factory — recommended for consuming apps):\n * import { createLogger } from '@getmicdrop/svelte-components/utils/logger';\n * const log = createLogger('MF');\n * log.info('booting'); // → [MF] [INFO] booting\n *\n * Usage (singleton — legacy, still works):\n * import { logger, configureLogger } from '@getmicdrop/svelte-components/utils/logger';\n * configureLogger({ prefix: '[MF]' });\n * logger.info('booting');\n */\nconst LOG_LEVELS = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\nconst isEnabled = () => typeof window !== 'undefined' &&\n (typeof process === 'undefined' || process.env?.NODE_ENV !== 'production');\n/**\n * Create an independent logger instance with its own config.\n *\n * @param prefix - Tag shown in log output, e.g. 'MF' produces `[MF]`\n * @param options - Optional overrides for enabled/level\n */\nexport function createLogger(prefix, options = {}) {\n let config = {\n enabled: options.enabled ?? isEnabled(),\n level: options.level ?? 'debug',\n prefix: prefix.startsWith('[') ? prefix : `[${prefix}]`,\n };\n function shouldLog(level) {\n return config.enabled && LOG_LEVELS[level] >= LOG_LEVELS[config.level];\n }\n function formatMessage(level, message) {\n return `${config.prefix} [${level.toUpperCase()}] ${message}`;\n }\n return {\n debug(message, ...args) {\n if (shouldLog('debug')) {\n console.log(formatMessage('debug', message), ...args);\n }\n },\n info(message, ...args) {\n if (shouldLog('info')) {\n console.info(formatMessage('info', message), ...args);\n }\n },\n warn(message, ...args) {\n if (shouldLog('warn')) {\n console.warn(formatMessage('warn', message), ...args);\n }\n },\n error(message, ...args) {\n if (shouldLog('error')) {\n console.error(formatMessage('error', message), ...args);\n }\n },\n configure(opts) {\n config = { ...config, ...opts };\n },\n };\n}\n// ---------------------------------------------------------------------------\n// Singleton (backward-compatible) — uses the factory internally\n// ---------------------------------------------------------------------------\nlet config = {\n enabled: isEnabled(),\n level: 'debug',\n prefix: '[MicDrop]',\n};\nexport function configureLogger(options) {\n config = { ...config, ...options };\n}\nfunction shouldLog(level) {\n return config.enabled && LOG_LEVELS[level] >= LOG_LEVELS[config.level];\n}\nfunction formatMessage(level, message) {\n return `${config.prefix} [${level.toUpperCase()}] ${message}`;\n}\nexport const logger = {\n debug: (message, ...args) => {\n if (shouldLog('debug')) {\n console.log(formatMessage('debug', message), ...args);\n }\n },\n info: (message, ...args) => {\n if (shouldLog('info')) {\n console.info(formatMessage('info', message), ...args);\n }\n },\n warn: (message, ...args) => {\n if (shouldLog('warn')) {\n console.warn(formatMessage('warn', message), ...args);\n }\n },\n error: (message, ...args) => {\n if (shouldLog('error')) {\n console.error(formatMessage('error', message), ...args);\n }\n },\n};\nexport default logger;\n","import { createLogger } from './logger.js';\nimport { DEV } from 'esm-env';\nconst logger = createLogger('deprecation');\nconst _warned = new Set();\n/**\n * Emit a one-time deprecation warning per unique message.\n * Completely tree-shaken from production builds via esm-env DEV guard.\n *\n * @param message - Include migration snippet showing old -> new usage\n *\n * @example\n * deprecation(\n * `Alert flat API is deprecated. Replace:\\n` +\n * ` <Alert title=\"...\" />\\n` +\n * `with:\\n` +\n * ` <AlertRoot><AlertTitle>...</AlertTitle></AlertRoot>`\n * );\n */\nexport function deprecation(message) {\n if (DEV) {\n if (!_warned.has(message)) {\n _warned.add(message);\n logger.warn(`[micdrop] ${message}`);\n }\n }\n}\n","<script lang=\"ts\">\r\n interface Props {\r\n size?: string;\r\n color?: string;\r\n class?: string;\r\n }\r\n let { size = \"24\", color = \"currentColor\", class: className = \"\" }: Props = $props();\r\n</script>\r\n\r\n<svg\r\n class={className}\r\n aria-hidden=\"true\"\r\n width={size}\r\n height={size}\r\n fill=\"none\"\r\n stroke={color}\r\n stroke-width=\"2\"\r\n viewBox=\"0 0 24 24\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n>\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15.75 19.5L8.25 12l7.5-7.5\" />\r\n</svg>\r\n","<script lang=\"ts\">\r\n interface Props {\r\n size?: string;\r\n color?: string;\r\n class?: string;\r\n }\r\n let { size = \"24\", color = \"currentColor\", class: className = \"\" }: Props = $props();\r\n</script>\r\n\r\n<svg\r\n class={className}\r\n aria-hidden=\"true\"\r\n width={size}\r\n height={size}\r\n fill=\"none\"\r\n stroke={color}\r\n stroke-width=\"2\"\r\n viewBox=\"0 0 24 24\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n>\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" />\r\n</svg>\r\n","<script lang=\"ts\">\r\n interface Props {\r\n size?: string;\r\n color?: string;\r\n class?: string;\r\n }\r\n let { size = \"24\", color = \"currentColor\", class: className = \"\" }: Props = $props();\r\n</script>\r\n\r\n<svg\r\n class={className}\r\n aria-hidden=\"true\"\r\n width={size}\r\n height={size}\r\n fill=\"none\"\r\n stroke={color}\r\n stroke-width=\"2\"\r\n viewBox=\"0 0 24 24\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n>\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" />\r\n</svg>\r\n","<script lang=\"ts\">\r\n interface Props {\r\n size?: string;\r\n color?: string;\r\n class?: string;\r\n }\r\n let { size = \"24\", color = \"currentColor\", class: className = \"\" }: Props = $props();\r\n</script>\r\n\r\n<svg\r\n class={className}\r\n aria-hidden=\"true\"\r\n width={size}\r\n height={size}\r\n fill=\"none\"\r\n stroke={color}\r\n stroke-width=\"1.5\"\r\n viewBox=\"0 0 24 24\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n>\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M2.036 12.322a1.012 1.012 0 010-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178z\" />\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\r\n</svg>\r\n","<script lang=\"ts\">\r\n interface Props {\r\n size?: string;\r\n color?: string;\r\n class?: string;\r\n }\r\n let { size = \"24\", color = \"currentColor\", class: className = \"\" }: Props = $props();\r\n</script>\r\n\r\n<svg\r\n class={className}\r\n aria-hidden=\"true\"\r\n width={size}\r\n height={size}\r\n fill=\"none\"\r\n stroke={color}\r\n stroke-width=\"1.5\"\r\n viewBox=\"0 0 24 24\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n>\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.98 8.223A10.477 10.477 0 001.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.45 10.45 0 0112 4.5c4.756 0 8.773 3.162 10.065 7.498a10.523 10.523 0 01-4.293 5.774M6.228 6.228L3 3m3.228 3.228l3.65 3.65m7.894 7.894L21 21m-3.228-3.228l-3.65-3.65m0 0a3 3 0 10-4.243-4.243m4.242 4.242L9.88 9.88\" />\r\n</svg>\r\n","<script lang=\"ts\">\r\n interface Props {\r\n size?: string;\r\n color?: string;\r\n class?: string;\r\n }\r\n let { size = \"24\", color = \"currentColor\", class: className = \"\" }: Props = $props();\r\n</script>\r\n\r\n<svg\r\n class={className}\r\n aria-hidden=\"true\"\r\n width={size}\r\n height={size}\r\n fill=\"none\"\r\n stroke={color}\r\n stroke-width=\"1.5\"\r\n viewBox=\"0 0 24 24\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n>\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9.75 9.75l4.5 4.5m0-4.5l-4.5 4.5M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\r\n</svg>\r\n","<script lang=\"ts\">\r\n interface Props {\r\n size?: string;\r\n color?: string;\r\n class?: string;\r\n }\r\n let { size = \"24\", color = \"currentColor\", class: className = \"\" }: Props = $props();\r\n</script>\r\n\r\n<svg\r\n class={className}\r\n aria-hidden=\"true\"\r\n width={size}\r\n height={size}\r\n fill=\"none\"\r\n stroke={color}\r\n stroke-width=\"1.5\"\r\n viewBox=\"0 0 24 24\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n>\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z\" />\r\n</svg>\r\n","/**\n * Typography Design Tokens\n *\n * Centralized text styling classes to ensure consistency across all Micdrop apps.\n * Import and use these instead of writing raw Tailwind classes for text.\n *\n * @example\n * ```svelte\n * <script>\n * import { typography } from '@getmicdrop/svelte-components';\n * </script>\n *\n * <h1 class={typography.h1}>Page Title</h1>\n * <p class={typography.body}>Content here</p>\n * <span class={typography.muted}>Helper text</span>\n * ```\n */\nexport const typography = {\n // ==========================================================================\n // HEADINGS\n // ==========================================================================\n /** Page title - 2xl semibold */\n h1: \"text-2xl font-semibold text-text-primary\",\n /** Section title - xl semibold */\n h2: \"text-xl font-semibold text-text-primary\",\n /** Subsection title - lg semibold */\n h3: \"text-lg font-semibold text-text-primary\",\n /** Card/group title - base semibold */\n h4: \"text-base font-semibold text-text-primary\",\n /** Small title - sm semibold */\n h5: \"text-sm font-semibold text-text-primary\",\n /** Micro title - xs semibold */\n h6: \"text-xs font-semibold text-text-primary\",\n // ==========================================================================\n // BODY TEXT\n // ==========================================================================\n /** Standard body text */\n body: \"text-base text-text-primary leading-relaxed\",\n /** Body text - muted/secondary */\n bodyMuted: \"text-base text-muted-foreground leading-relaxed\",\n /** Small body text */\n sm: \"text-sm text-text-primary\",\n /** Small text - muted/secondary */\n smMuted: \"text-sm text-muted-foreground\",\n /** Extra small text */\n xs: \"text-xs text-text-primary\",\n /** Extra small text - muted */\n xsMuted: \"text-xs text-muted-foreground\",\n /** Muted text color only (no size) - for applying to elements with other size classes */\n textMuted: \"text-muted-foreground\",\n /** Muted icon color - same as textMuted, for semantic clarity */\n iconMuted: \"text-muted-foreground\",\n // ==========================================================================\n // LABELS & FORM TEXT\n // ==========================================================================\n /** Form field label */\n label: \"text-sm font-medium text-text-primary\",\n /** Form field label - with standard spacing */\n labelSpaced: \"text-sm font-medium text-text-primary mb-2\",\n /** Helper/description text below inputs */\n helper: \"text-sm text-muted-foreground\",\n /** Placeholder-style text */\n placeholder: \"text-sm text-muted-foreground\",\n // ==========================================================================\n // STATUS & FEEDBACK\n // ==========================================================================\n /** Error message text */\n error: \"text-sm text-accent-danger\",\n /** Success message text */\n success: \"text-sm text-accent-success\",\n /** Warning message text */\n warning: \"text-sm text-accent-warning\",\n /** Info message text */\n info: \"text-sm text-brand-primary\",\n // ==========================================================================\n // LINKS\n // ==========================================================================\n /** Standard link */\n link: \"text-sm text-brand-primary hover:underline\",\n /** Muted/subtle link */\n linkMuted: \"text-sm text-muted-foreground hover:text-text-secondary\",\n // ==========================================================================\n // SPECIAL CASES\n // ==========================================================================\n /** Price/currency display */\n price: \"text-lg font-semibold text-text-primary\",\n /** Large price display */\n priceLg: \"text-2xl font-bold text-text-primary\",\n /** Badge/tag text */\n badge: \"text-xs font-medium\",\n /** Table header */\n tableHeader: \"text-xs font-semibold text-muted-foreground uppercase tracking-wider\",\n /** Code/monospace */\n code: \"text-sm font-mono text-text-primary\",\n /** Muted code */\n codeMuted: \"text-xs font-mono text-muted-foreground\",\n};\n","/**\n * Animation and transition utilities for polished UX\n *\n * Duration guidelines (research-backed):\n * - Micro-interactions: 150-200ms (instant feel)\n * - UI transitions: 200-300ms (smooth without slow)\n * - Page transitions: 300-400ms (noticeable but fast)\n * - Complex animations: 400-600ms (elaborate sequences)\n *\n * The standard Svelte slide transition can produce \"Invalid keyframe value for property height: NaNpx\"\n * when the element hasn't been measured yet (e.g., during SSR hydration or when mounted in an unmeasured container).\n *\n * These utilities wrap Svelte's transitions with guards against invalid values.\n */\nimport { fade as svelteFade, fly as svelteFly, slide as svelteSlide, } from 'svelte/transition';\nimport { backOut, cubicInOut, cubicOut, expoOut, quintOut, sineIn } from 'svelte/easing';\n/**\n * Duration constants — JS mirror of CSS `--motion-*` tokens in tokens/motion.css.\n *\n * Svelte's built-in transitions take a numeric `duration` arg at the call\n * site, so we can't pass `var(--motion-fast)` directly. These constants\n * MUST stay in sync with motion.css. If you change one, change both.\n *\n * Reduced-motion handling: CSS tokens collapse to 0.001ms via media query.\n * For JS-driven `setTimeout` / Web Animations API use cases, call\n * `getAnimationDuration()` which reads `matchMedia('prefers-reduced-motion')`\n * and returns 0 when reduce is set.\n */\nexport const DURATION = {\n instant: 100,\n micro: 150,\n fast: 200,\n normal: 300,\n slow: 400,\n elaborate: 600,\n};\n/**\n * Easing functions — JS mirror of CSS `--ease-*` tokens in tokens/motion.css.\n *\n * The cubic-bezier coefficients in motion.css were chosen to match these\n * Svelte easing functions byte-for-byte. JS Svelte transitions and CSS\n * animations using motion tokens will look visually identical.\n */\nexport const EASING = {\n /** Standard ease-out for most UI (deceleration). CSS: var(--ease-out) */\n out: cubicOut,\n /** Ease in-out for page transitions. CSS: var(--ease-in-out) */\n inOut: cubicInOut,\n /** Bouncy ease-out for celebration/success. CSS: var(--ease-bounce) */\n bounce: backOut,\n /** Smooth for scroll-linked animations. CSS: var(--ease-smooth) */\n smooth: quintOut,\n /**\n * Snappy \"smooth ease-out\" reveal signature (Linear/Kowalski). Front-loaded,\n * settles faster than `smooth`. Use for reveals / list entrances.\n * CSS: var(--ease-reveal) — cubic-bezier(0.16, 1, 0.3, 1) === expoOut.\n */\n reveal: expoOut,\n /** Gentle ease-in for elements leaving the screen (drawer close, etc.) */\n in: sineIn,\n};\n/**\n * A safe version of Svelte's slide transition that guards against NaN height values.\n *\n * When an element is inside an {#if} block and the condition becomes true,\n * Svelte tries to animate from height 0. If the element hasn't been measured yet,\n * offsetHeight can be 0 or undefined, leading to NaN in the animation.\n *\n * This wrapper checks if the element is measurable and skips the animation if not.\n */\nexport function safeSlide(node, params = {}) {\n const height = node.offsetHeight;\n const width = node.offsetWidth;\n if ((!height && !width) || !isFinite(height) || !isFinite(width)) {\n return {\n delay: params.delay || 0,\n duration: 0,\n css: () => '',\n };\n }\n return svelteSlide(node, params);\n}\n/**\n * A safe version of Svelte's fade transition that respects prefers-reduced-motion.\n *\n * When the user has reduced-motion enabled, returns a 0-duration no-op so the\n * element appears/disappears instantly instead of animating. Otherwise delegates\n * to svelte/transition's `fade`.\n */\nexport function safeFade(node, params = {}) {\n if (prefersReducedMotion()) {\n return { delay: params.delay || 0, duration: 0, css: () => '' };\n }\n return svelteFade(node, params);\n}\n/**\n * A safe version of Svelte's fly transition that respects prefers-reduced-motion.\n *\n * When the user has reduced-motion enabled, returns a 0-duration no-op so the\n * element appears/disappears instantly instead of flying. Otherwise delegates\n * to svelte/transition's `fly`.\n */\nexport function safeFly(node, params = {}) {\n if (prefersReducedMotion()) {\n return { delay: params.delay || 0, duration: 0, css: () => '' };\n }\n return svelteFly(node, params);\n}\n/**\n * Reduced-motion-safe fade + scale, tuned for overlay panels (modal/dialog).\n *\n * The decided premium feel (brief 05) is a soft fade with a subtle scale from\n * `start` (0.96) up to 1 over ~150ms — calmer than the old fly/slide, and the\n * same in and out. Mirrors `fadeScale` but:\n * - respects `prefers-reduced-motion` (0-duration no-op when the user opts in),\n * matching the `safeFade` / `safeFly` convention used elsewhere in the modal,\n * - defaults to the overlay-panel values (`start: 0.96`, `DURATION.micro`,\n * `EASING.out`) so call sites read intent, not magic numbers.\n *\n * Multiplies the node's CURRENT opacity/transform so it composes with any\n * inherited transform (consistent with `fadeScale`).\n */\nexport function safeFadeScale(node, { delay = 0, duration = DURATION.micro, easing = EASING.out, start = 0.96, } = {}) {\n if (prefersReducedMotion()) {\n return { delay, duration: 0, css: () => '' };\n }\n const style = getComputedStyle(node);\n const opacity = +style.opacity;\n const transform = style.transform === 'none' ? '' : style.transform;\n return {\n delay,\n duration,\n easing,\n css: t => `\r\n transform: ${transform} scale(${start + (1 - start) * t});\r\n opacity: ${opacity * t};\r\n `,\n };\n}\n/**\n * Bloom-style dropdown animation.\n * Scales up from origin point with fade for a polished \"bloom\" effect.\n *\n * Reads the node's CURRENT opacity via getComputedStyle and multiplies it\n * into the t-based fade — important when the node already has a non-1\n * opacity (e.g. inside a faded-disabled container) so bloom doesn't snap\n * the element to opaque on the way in.\n *\n * Note: micdrop-frontend's pre-Wave-7 fork defaulted `origin: 'top left'`.\n * If you're migrating consumer code that relied on that default, pass\n * `origin: 'top left'` explicitly. This export keeps SC's historical\n * `top right` default to avoid breaking SC's existing consumers.\n */\nexport function bloom(node, { duration = 200, delay = 0, origin = 'top right', easing = cubicOut, start = 0.95, } = {}) {\n const baseOpacity = +getComputedStyle(node).opacity;\n return {\n delay,\n duration,\n easing,\n css: (t) => `\r\n transform: scale(${start + (1 - start) * t});\r\n transform-origin: ${origin};\r\n opacity: ${baseOpacity * t};\r\n `,\n };\n}\n/**\n * Reduced-motion-safe `bloom` — the origin-anchored scale-and-fade popover\n * reveal, gated on `prefers-reduced-motion` (0-duration no-op when the user\n * opts in), matching the `safeFade` / `safeFly` / `safeFadeScale` convention.\n *\n * Use this (not raw `bloom`) for new dropdown/popover surfaces so they\n * conform to brief 00 §A's \"motion from transitions tokens, reduced-motion\n * gated\" rule. Same default `origin: 'top right'` and feel as `bloom`.\n */\nexport function safeBloom(node, params = {}) {\n if (prefersReducedMotion()) {\n return { delay: params.delay || 0, duration: 0, css: () => '' };\n }\n return bloom(node, params);\n}\n/**\n * Fade with slight scale - more polished than plain fade\n */\nexport function fadeScale(node, { delay = 0, duration = DURATION.normal, easing = EASING.out, start = 0.95, } = {}) {\n const style = getComputedStyle(node);\n const opacity = +style.opacity;\n const transform = style.transform === 'none' ? '' : style.transform;\n return {\n delay,\n duration,\n easing,\n css: t => `\r\n transform: ${transform} scale(${start + (1 - start) * t});\r\n opacity: ${opacity * t};\r\n `,\n };\n}\n/**\n * Slide up with fade - great for form fields appearing\n */\nexport function slideUp(node, { delay = 0, duration = DURATION.normal, easing = EASING.out, distance = 20, } = {}) {\n const style = getComputedStyle(node);\n const opacity = +style.opacity;\n const transform = style.transform === 'none' ? '' : style.transform;\n return {\n delay,\n duration,\n easing,\n css: t => `\r\n transform: ${transform} translateY(${(1 - t) * distance}px);\r\n opacity: ${opacity * t};\r\n `,\n };\n}\n/**\n * Reveal — fade + 8px slide-up at 200ms on the `--ease-reveal` curve.\n *\n * The premium default for content appearing (cards, panels, list items,\n * section reveals). Snappier and more \"premium\" than `slideUp`'s 20px/300ms:\n * shorter travel, faster `EASING.reveal` (expoOut) settle.\n *\n * Reduced-motion safe: when the user opts in, returns a 0-duration no-op\n * (element appears instantly) — but, like `safeFade`/`safeFly`, the\n * transition still \"fires\" so any `onintroend` / `onoutroend` hooks run.\n *\n * Compose with `listStagger` for cascading list entrances:\n * {#each items as item, i}\n * <li in:reveal={{ delay: listStagger(i) }}>…</li>\n * {/each}\n */\nexport function reveal(node, { delay = 0, duration = DURATION.fast, easing = EASING.reveal, distance = 8, } = {}) {\n if (prefersReducedMotion()) {\n return { delay, duration: 0, css: () => '' };\n }\n const style = getComputedStyle(node);\n const opacity = +style.opacity;\n const transform = style.transform === 'none' ? '' : style.transform;\n return {\n delay,\n duration,\n easing,\n css: t => `\r\n transform: ${transform} translateY(${(1 - t) * distance}px);\r\n opacity: ${opacity * t};\r\n `,\n };\n}\n/**\n * Slide in from left - for progress/step animations\n */\nexport function slideInLeft(node, { delay = 0, duration = DURATION.normal, easing = EASING.out, distance = 30, } = {}) {\n const style = getComputedStyle(node);\n const opacity = +style.opacity;\n const transform = style.transform === 'none' ? '' : style.transform;\n return {\n delay,\n duration,\n easing,\n css: t => `\r\n transform: ${transform} translateX(${(1 - t) * -distance}px);\r\n opacity: ${opacity * t};\r\n `,\n };\n}\n/**\n * Pop in - for success states and celebrations\n */\nexport function popIn(node, { delay = 0, duration = DURATION.normal, easing = EASING.bounce, } = {}) {\n const style = getComputedStyle(node);\n const opacity = +style.opacity;\n const transform = style.transform === 'none' ? '' : style.transform;\n return {\n delay,\n duration,\n easing,\n css: t => `\r\n transform: ${transform} scale(${t * 1});\r\n opacity: ${opacity * t};\r\n `,\n };\n}\n/**\n * Stagger delay calculator for list animations\n */\nexport function staggerDelay(index, base = 50, max = 500) {\n return Math.min(index * base, max);\n}\n/** Per-item gap range for `listStagger`, in ms. The default is `LIST_STAGGER_STEP`. */\nexport const LIST_STAGGER_STEP_RANGE = { min: 40, max: 120 };\n/** Default per-item gap for `listStagger`, in ms — a restrained, premium cadence. */\nexport const LIST_STAGGER_STEP = 50;\n/** Ceiling on the total stagger delay so long lists don't crawl in. */\nexport const LIST_STAGGER_MAX_DELAY = 500;\n/**\n * Per-item delay for a staggered list entrance — the curated companion to\n * `reveal`. Returns the delay (ms) for item `index` so successive items\n * cascade in `step` ms apart.\n *\n * `step` is clamped to 40–120ms (`LIST_STAGGER_STEP_RANGE`, default 50) and\n * the total delay is capped at `LIST_STAGGER_MAX_DELAY` so long lists stay\n * snappy. Reduced-motion safe: returns 0 for every item when the user opts\n * in, so the list reveals instantly instead of crawling.\n *\n * @example\n * {#each items as item, i}\n * <li in:reveal={{ delay: listStagger(i) }}>{item.label}</li>\n * {/each}\n */\nexport function listStagger(index, step = LIST_STAGGER_STEP, maxDelay = LIST_STAGGER_MAX_DELAY) {\n if (prefersReducedMotion())\n return 0;\n const clampedStep = Math.min(LIST_STAGGER_STEP_RANGE.max, Math.max(LIST_STAGGER_STEP_RANGE.min, step));\n return Math.min(index * clampedStep, maxDelay);\n}\n/**\n * Cross-fade between two elements (for step transitions)\n * Returns [outParams, inParams] for use with Svelte's transition directive\n */\nexport function crossFadeParams(durationMs = DURATION.normal) {\n const outParams = { duration: durationMs * 0.4 };\n const inParams = { delay: durationMs * 0.2, duration: durationMs * 0.6 };\n return [outParams, inParams];\n}\n/**\n * Reduced motion check - respects user preferences\n * SSR-safe: returns false on the server\n */\nexport function prefersReducedMotion() {\n if (typeof window === 'undefined')\n return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n/**\n * Get duration based on reduced motion preference\n * Returns 0 if user prefers reduced motion, otherwise returns the given duration\n */\nexport function getAnimationDuration(duration) {\n if (prefersReducedMotion()) {\n return 0;\n }\n return duration;\n}\n/**\n * Create a reactive store for the `prefers-reduced-motion` OS preference.\n * Automatically re-notifies subscribers when the user changes the system\n * setting (via `matchMedia` change event).\n *\n * SSR-safe: when `window` is undefined the store reports `false` and never\n * fires change events.\n *\n * @example\n * const motion = createReducedMotionStore();\n * const unsubscribe = motion.subscribe((reduced) => {\n * // Skip animation when reduced === true\n * });\n */\nexport function createReducedMotionStore() {\n const subscribers = new Set();\n let currentValue = prefersReducedMotion();\n let mediaQuery = null;\n const handleChange = (event) => {\n currentValue = event.matches;\n subscribers.forEach(callback => callback(currentValue));\n };\n function attachListener() {\n if (typeof window === 'undefined')\n return;\n mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handleChange);\n }\n else {\n // addListener is the deprecated Safari < 14 fallback; not in modern TS lib typings\n mediaQuery.addListener(handleChange);\n }\n }\n function detachListener() {\n if (!mediaQuery)\n return;\n if (typeof mediaQuery.removeEventListener === 'function') {\n mediaQuery.removeEventListener('change', handleChange);\n }\n else if (typeof mediaQuery.removeListener === 'function') {\n // removeListener is the deprecated Safari < 14 fallback\n mediaQuery.removeListener(handleChange);\n }\n mediaQuery = null;\n }\n return {\n get prefersReducedMotion() {\n return currentValue;\n },\n subscribe(_callback) {\n if (subscribers.size === 0) {\n // First subscriber — attach the OS listener now so it only lives\n // as long as at least one subscriber exists.\n attachListener();\n }\n subscribers.add(_callback);\n _callback(currentValue);\n return () => {\n subscribers.delete(_callback);\n if (subscribers.size === 0) {\n // Last subscriber gone — detach the OS listener to prevent leaks.\n detachListener();\n }\n };\n },\n };\n}\n/**\n * CSS animation class helper - for Tailwind-based animations\n */\nexport const ANIMATION_CLASSES = {\n fadeIn: 'animate-in fade-in duration-300',\n fadeOut: 'animate-out fade-out duration-200',\n slideUp: 'animate-in slide-in-from-bottom-2 duration-300',\n slideDown: 'animate-in slide-in-from-top-2 duration-300',\n scaleIn: 'animate-in zoom-in-95 duration-200',\n scaleOut: 'animate-out zoom-out-95 duration-150',\n spin: 'animate-spin',\n pulse: 'animate-pulse',\n bounce: 'animate-bounce',\n};\n","/**\n * Shared Color Variant Classes\n *\n * Centralized Tailwind class definitions for semantic color variants.\n * Used across Badge, Alert, Spinner, and other status-indicating components.\n *\n * This eliminates duplication of color variant switch statements across components.\n */\n/**\n * Semantic color variants for badges/status indicators.\n * Pattern: text color + background color with dark mode support.\n */\nexport const badgeColorVariants = {\n // Semantic variants\n success: 'text-status-success-text bg-status-success-bg',\n warning: 'text-status-warning-text bg-status-warning-bg',\n error: 'text-status-error-text bg-status-error-bg',\n danger: 'text-status-error-text bg-status-error-bg',\n info: 'text-status-info-text bg-status-info-bg',\n neutral: 'text-text-primary bg-muted',\n // Color variants\n red: 'text-status-error-text bg-status-error-bg',\n blue: 'text-status-info-text bg-status-info-bg',\n purple: 'text-brand-primary bg-status-info-bg',\n green: 'text-status-success-text bg-status-success-bg',\n orange: 'text-status-warning-text bg-status-warning-bg',\n yellow: 'text-status-warning-text bg-status-warning-bg',\n gray: 'text-text-primary bg-muted',\n pink: 'text-accent-danger bg-status-error-bg',\n indigo: 'text-brand-primary bg-status-info-bg',\n cyan: 'text-status-info-text bg-status-info-bg',\n // Special variants\n notification: 'text-white bg-accent-danger',\n};\n/**\n * Alert color variants - slightly different pattern (uses bg-*-50).\n */\nexport const alertColorVariants = {\n info: 'text-status-info-text border border-status-info-border bg-status-info-bg',\n success: 'text-status-success-text border border-status-success-border bg-status-success-bg',\n warning: 'text-status-warning-text border border-status-warning-border bg-status-warning-bg',\n danger: 'text-status-error-text border border-status-error-border bg-status-error-bg',\n};\n/**\n * Alert close button color variants - specific hover states per type.\n */\nexport const alertCloseButtonVariants = {\n info: 'bg-status-info-bg text-brand-primary hover:bg-status-info-bg/80',\n success: 'bg-status-success-bg text-accent-success hover:bg-status-success-bg/80',\n warning: 'bg-status-warning-bg text-accent-warning hover:bg-status-warning-bg/80',\n danger: 'bg-status-error-bg text-accent-danger hover:bg-status-error-bg/80',\n};\n/**\n * Spinner fill color variants.\n */\nexport const spinnerColorVariants = {\n blue: 'fill-brand-primary',\n gray: 'fill-muted-foreground',\n green: 'fill-accent-success',\n red: 'fill-accent-danger',\n yellow: 'fill-accent-warning',\n pink: 'fill-accent-danger',\n purple: 'fill-brand-primary',\n white: 'fill-white',\n};\n/**\n * Helper to get badge variant classes with fallback.\n */\nexport function getBadgeVariantClasses(variant) {\n const normalized = String(variant || 'neutral').toLowerCase();\n return (badgeColorVariants[normalized] ||\n badgeColorVariants.neutral);\n}\n/**\n * Helper to get alert variant classes with fallback.\n */\nexport function getAlertVariantClasses(variant) {\n const normalized = String(variant || 'info').toLowerCase();\n return (alertColorVariants[normalized] ||\n alertColorVariants.info);\n}\n/**\n * Helper to get spinner color classes with fallback.\n */\nexport function getSpinnerColorClasses(color) {\n const normalized = String(color || 'blue').toLowerCase();\n return (spinnerColorVariants[normalized] ||\n spinnerColorVariants.blue);\n}\n","/**\n * Base Application Error\n *\n * All custom errors extend this class for consistent error handling.\n * Provides structured error information with serialization support.\n */\nexport class AppError extends Error {\n constructor(message, code, options = {}) {\n super(message);\n this.name = 'AppError';\n this.code = code;\n this.status = options.status ?? 500;\n this.details = options.details;\n this.timestamp = new Date();\n this.recoverable = options.recoverable ?? true;\n this.cause = options.cause;\n // Maintains proper stack trace\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n /**\n * Serialize error for logging/reporting\n */\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n status: this.status,\n details: this.details,\n timestamp: this.timestamp.toISOString(),\n recoverable: this.recoverable,\n stack: this.stack,\n cause: this.cause?.message,\n };\n }\n /**\n * Get user-friendly message.\n *\n * Subclasses override this and may consult an optional `ErrorMessageResolver`\n * to localize. The base class returns the raw message and ignores any\n * resolver (the parameter exists only so the signature is uniform across the\n * hierarchy).\n */\n getUserMessage(_resolver) {\n return this.message;\n }\n /**\n * Check if this error type is retryable\n */\n isRetryable() {\n return this.recoverable;\n }\n}\n","/**\n * Branded primitive types — the convergent core of the canonical-redefinition\n * defense. Each brand pairs a primitive (number / string) with a tag the\n * compiler tracks but the runtime ignores. The only way a value of `Cents`\n * gets created is by passing through {@link toCents} (or another canonical\n * that returns `Cents`); raw `42` cannot be silently passed where `Cents`\n * is expected.\n *\n * Why this works where audits don't: an audit lists patterns that BYPASS\n * canonicals and greps for them — non-convergent because the catalog lags\n * developer creativity. Brands invert the polarity: they verify a canonical\n * is THE ONLY path that compiles for its concept. New variants of a bypass\n * cannot exist because the type is unforgeable. See the spec section\n * \"negative-space vs positive-space\" for the full rationale.\n *\n * Boundary policy:\n * - Smart constructors (`toCents`, `toDateOnly`, etc.) are the only public\n * way to MINT a brand. They live here.\n * - Casts (`asCents`, etc.) are intended for the API-response-transform\n * layer ONLY — server load functions, store hydration, response\n * mappers. They unsafely tag a primitive as already-validated.\n * - Feature code never sees `as Cents`; if it needs to ingest a raw\n * number it goes through the smart constructor.\n *\n * Real-world precedent: Stripe (Money, Currency), Shopify (MoneyV2),\n * Atlassian. See https://www.learningtypescript.com/articles/branded-types\n */\n// ── Smart constructors ───────────────────────────────────────────────────\n/**\n * Validate and brand a number as `Cents`. Throws on NaN/Infinity/non-int.\n *\n * @example\n * const price = toCents(2550); // Cents — \"$25.50\"\n * const bad = toCents(25.5); // throws: cents must be integer\n */\nexport function toCents(n) {\n if (!Number.isFinite(n)) {\n throw new TypeError(`cents must be a finite number, got ${n}`);\n }\n if (!Number.isInteger(n)) {\n throw new TypeError(`cents must be integer, got ${n}`);\n }\n return n;\n}\n/**\n * Validate and brand a number as `USD`. Allows fractional dollars but\n * rejects non-finite values.\n */\nexport function toUSD(n) {\n if (!Number.isFinite(n)) {\n throw new TypeError(`USD must be a finite number, got ${n}`);\n }\n return n;\n}\n/**\n * Convert dollars (decimal) to `Cents` rounded half-away-from-zero.\n * The conversion is the only place dollar→cent rounding happens; once\n * minted, a `Cents` value is canonical and addition is exact.\n */\nexport function dollarsToCents(dollars) {\n if (!Number.isFinite(dollars)) {\n throw new TypeError(`dollars must be a finite number, got ${dollars}`);\n }\n return Math.round(dollars * 100);\n}\n/** Convert `Cents` back to dollars (decimal). Loses the brand intentionally. */\nexport function centsToDollars(c) {\n return c / 100;\n}\n/**\n * Validate a `YYYY-MM-DD` string and brand it as `DateOnly`. Only matches\n * exact ISO calendar-date shape; rejects `2026-1-1`, `2026/01/01`, etc.\n */\nexport function toDateOnly(s) {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(s)) {\n throw new TypeError(`DateOnly must be YYYY-MM-DD, got ${JSON.stringify(s)}`);\n }\n // Verify it's a real calendar date (rejects 2026-02-30).\n const [y, m, d] = s.split('-').map(Number);\n const probe = new Date(Date.UTC(y, m - 1, d));\n if (probe.getUTCFullYear() !== y ||\n probe.getUTCMonth() !== m - 1 ||\n probe.getUTCDate() !== d) {\n throw new TypeError(`DateOnly must be a real calendar date, got ${s}`);\n }\n return s;\n}\n/**\n * Validate an IANA timezone via `Intl.DateTimeFormat` resolution.\n * Throws for non-canonical identifiers.\n */\nexport function toIANATimezone(s) {\n try {\n // Will throw RangeError on invalid timezones.\n new Intl.DateTimeFormat('en-US', { timeZone: s }).format(new Date());\n return s;\n }\n catch {\n throw new TypeError(`IANATimezone must be a valid zone, got ${s}`);\n }\n}\n/**\n * Brand a string as `AssetUrl`. Validates http(s)/data scheme so the\n * result is safe to drop into an `<img src>` without further checks.\n */\nexport function toAssetUrl(s) {\n if (typeof s !== 'string' || s.length === 0) {\n throw new TypeError(`AssetUrl must be non-empty string, got ${s}`);\n }\n if (!s.startsWith('https://') &&\n !s.startsWith('http://') &&\n !s.startsWith('data:') &&\n !s.startsWith('/')) {\n throw new TypeError(`AssetUrl must be http(s):, data:, or path-absolute, got ${s.slice(0, 32)}…`);\n }\n return s;\n}\n/** Identifier-brand smart constructors. Reject 0/negative/NaN. */\nfunction brandId(brand) {\n return (n) => {\n if (!Number.isInteger(n) || n <= 0) {\n throw new TypeError(`${brand} must be a positive integer, got ${n}`);\n }\n return n;\n };\n}\n// eslint-disable-next-line no-unused-vars -- intentionally retained (prop/slot/forward-compat or Svelte-5 reactive binding eslint cannot see)\nexport const toEventId = brandId('EventId');\n// eslint-disable-next-line no-unused-vars -- intentionally retained (prop/slot/forward-compat or Svelte-5 reactive binding eslint cannot see)\nexport const toOrderId = brandId('OrderId');\n// eslint-disable-next-line no-unused-vars -- intentionally retained (prop/slot/forward-compat or Svelte-5 reactive binding eslint cannot see)\nexport const toUserId = brandId('UserId');\n// eslint-disable-next-line no-unused-vars -- intentionally retained (prop/slot/forward-compat or Svelte-5 reactive binding eslint cannot see)\nexport const toVenueId = brandId('VenueId');\n/**\n * Parse-and-brand helpers for entity IDs that arrive as either a `number`\n * (e.g. internal store state) or a `string` (e.g. SvelteKit route params,\n * URL query strings, ad-hoc form inputs). Each accepts the union and routes\n * through the underlying smart constructor, so the positive-integer check\n * still applies — `parseEventId(\"0\")` throws the same way `toEventId(0)` does.\n *\n * Use these at the boundary where the caller has a union-typed ID value\n * (typically a public component prop or callback) and needs to land a brand\n * on the inside. Example: `onBuyTickets(eventId: number | string)` callbacks\n * in public ticket-buying components.\n */\n// eslint-disable-next-line no-unused-vars -- intentionally retained (prop/slot/forward-compat or Svelte-5 reactive binding eslint cannot see)\nfunction parseId(brand, ctor) {\n return (value) => {\n let n;\n if (typeof value === 'string') {\n // Strict integer shape — reject partial numerics (`\"42abc\"`, `\"42.5\"`,\n // `\"1e2\"`, leading whitespace) that parseInt would silently truncate.\n if (!/^-?\\d+$/.test(value)) {\n throw new TypeError(`${brand} must be a numeric integer string, got ${JSON.stringify(value)}`);\n }\n n = Number(value);\n // Reject values above Number.MAX_SAFE_INTEGER — Number(...) rounds them\n // before the constructor sees them, which would brand a malformed\n // deep-link to the wrong entity row instead of failing closed.\n if (!Number.isSafeInteger(n)) {\n throw new TypeError(`${brand} must fit in a safe integer, got ${JSON.stringify(value)}`);\n }\n }\n else {\n n = value;\n // Same safe-integer guard the string branch applies — a number typed\n // value above 2^53 has already lost precision by the time it reaches\n // this function, and branding it would point at the wrong entity row.\n if (Number.isFinite(n) && !Number.isSafeInteger(n) && Number.isInteger(n)) {\n throw new TypeError(`${brand} must fit in a safe integer, got ${value}`);\n }\n }\n if (!Number.isFinite(n)) {\n throw new TypeError(`${brand} must be a numeric value, got ${JSON.stringify(value)}`);\n }\n return ctor(n);\n };\n}\nexport const parseEventId = parseId('EventId', toEventId);\nexport const parseOrderId = parseId('OrderId', toOrderId);\nexport const parseUserId = parseId('UserId', toUserId);\nexport const parseVenueId = parseId('VenueId', toVenueId);\n/**\n * Brand a string as `E164PhoneNumber` after validating the E.164 shape.\n * Throws on input that isn't a `+` followed by digits. This is a *shape*\n * check; for full carrier-aware validation use `isValidE164` from\n * `phoneUtils` (which also returns this brand via type predicate).\n */\nexport function toE164PhoneNumber(s) {\n if (typeof s !== 'string' || !/^\\+[1-9]\\d{6,14}$/.test(s)) {\n throw new TypeError(`E164PhoneNumber must be +<digits>, got ${s}`);\n }\n return s;\n}\n/**\n * Validate and brand an email address. Loose RFC 5322 shape check —\n * matches HTML5 `<input type=\"email\">` semantics. For deliverability\n * checks the value still has to round-trip through the backend.\n */\nexport function toEmailAddress(s) {\n if (typeof s !== 'string' || !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(s)) {\n throw new TypeError(`EmailAddress must be local@domain.tld, got ${s}`);\n }\n return s;\n}\n/**\n * Brand a path-absolute SvelteKit route as `RoutePath`. Rejects external\n * URLs (`http(s)://...`), protocol-relative URLs (`//foo`), and empty\n * strings. The intended call site is a URL builder in `lib/<domain>/navigation`\n * — feature code never mints a `RoutePath` from a literal in the markup.\n */\nexport function toRoutePath(s) {\n if (typeof s !== 'string' || s.length === 0) {\n throw new TypeError(`RoutePath must be non-empty string, got ${s}`);\n }\n if (!s.startsWith('/') || s.startsWith('//')) {\n throw new TypeError(`RoutePath must start with single '/', got ${JSON.stringify(s)}`);\n }\n if (/^\\/\\w+:\\//.test(s)) {\n // catches `/http:/...` accidentally produced by string concat\n throw new TypeError(`RoutePath must not embed a scheme, got ${s}`);\n }\n return s;\n}\n/** Validate and brand a millisecond count as `DurationMs`. */\nexport function toDurationMs(n) {\n if (!Number.isFinite(n) || !Number.isInteger(n) || n < 0) {\n throw new TypeError(`DurationMs must be non-negative integer, got ${n}`);\n }\n return n;\n}\n/** Convenience builders. Each returns a `DurationMs` so arithmetic stays branded. */\nexport const seconds = (n) => toDurationMs(Math.round(n * 1000));\nexport const minutes = (n) => toDurationMs(Math.round(n * 60000));\nexport const hours = (n) => toDurationMs(Math.round(n * 3600000));\nexport const days = (n) => toDurationMs(Math.round(n * 86400000));\n// ── API-boundary casts ───────────────────────────────────────────────────\n/**\n * Unsafe cast helpers for the API-response-transform layer.\n *\n * Use ONLY at the boundary where untyped API JSON becomes domain types\n * (server load functions, store hydration, response mappers). Feature\n * code uses the smart constructors above. These exist because validating\n * every field at every wire boundary is expensive and the API contract\n * already guarantees the shape.\n *\n * Convention: name them `as*` (matches TypeScript's `as`) so the unsafe\n * cast intent is loud at the call site. Linting rules (Phase B) restrict\n * which files may import these — boundary-only.\n */\nexport const asCents = (n) => n;\nexport const asUSD = (n) => n;\nexport const asDateOnly = (s) => s;\nexport const asIANATimezone = (s) => s;\nexport const asAssetUrl = (s) => s;\nexport const asEventId = (n) => n;\nexport const asOrderId = (n) => n;\nexport const asUserId = (n) => n;\nexport const asVenueId = (n) => n;\nexport const asE164PhoneNumber = (s) => s;\nexport const asEmailAddress = (s) => s;\nexport const asRoutePath = (s) => s;\nexport const asDurationMs = (n) => n;\n// ── Brand algebra ────────────────────────────────────────────────────────\n/**\n * Operations that preserve a numeric brand. Without these, every tax /\n * discount / fee site has to cast back to `number` to add or multiply,\n * which defeats the boundary. The plan calls this the \"algebra of\n * brand-preserving operations\" and ships it alongside the brands.\n *\n * All `Cents` ops round to integer; `USD` ops do not (decimal-dollar by\n * design). For mixed-precision math, convert at the boundary via\n * {@link centsToDollars} / {@link dollarsToCents}.\n */\nexport const addCents = (a, b) => (a + b);\nexport const subCents = (a, b) => (a - b);\nexport const mulCents = (c, n) => Math.round(c * n);\nexport const sumCents = (xs) => xs.reduce((acc, c) => addCents(acc, c), 0);\nexport const addUSD = (a, b) => (a + b);\nexport const subUSD = (a, b) => (a - b);\nexport const mulUSD = (u, n) => (u * n);\nexport const sumUSD = (xs) => xs.reduce((acc, u) => addUSD(acc, u), 0);\n/** Compare two `Cents` values; sortable like a regular comparator. */\nexport const compareCents = (a, b) => a - b;\n/** Compare two `USD` values; sortable like a regular comparator. */\nexport const compareUSD = (a, b) => a - b;\n/**\n * Add `n` calendar days to a `DateOnly`, preserving the brand. Uses UTC\n * arithmetic so DST / timezone changes don't introduce off-by-one. To\n * shift in a specific timezone, project to that zone first.\n */\nexport const addDays = (d, n) => {\n const [y, m, day] = d.split('-').map(Number);\n const probe = new Date(Date.UTC(y, m - 1, day));\n probe.setUTCDate(probe.getUTCDate() + n);\n const yy = String(probe.getUTCFullYear()).padStart(4, '0');\n const mm = String(probe.getUTCMonth() + 1).padStart(2, '0');\n const dd = String(probe.getUTCDate()).padStart(2, '0');\n return `${yy}-${mm}-${dd}`;\n};\n/**\n * Difference in calendar days between two `DateOnly` values: `b - a`.\n * Uses UTC midnight anchors so DST never inflates / deflates the count.\n */\nexport const diffDays = (a, b) => {\n const toUtc = (s) => {\n const [y, m, d] = s.split('-').map(Number);\n return Date.UTC(y, m - 1, d);\n };\n const ms = toUtc(b) - toUtc(a);\n return Math.round(ms / 86400000);\n};\n/**\n * Brand-preserving arithmetic on `DurationMs`. Subtraction clamps at 0\n * since negative durations don't have a domain meaning here.\n */\nexport const addDuration = (a, b) => (a + b);\nexport const subDuration = (a, b) => Math.max(0, a - b);\nexport const mulDuration = (d, n) => Math.max(0, Math.round(d * n));\nexport const compareDuration = (a, b) => a - b;\n// ── Type guards ──────────────────────────────────────────────────────────\n/** Runtime guard: is this value already a valid `Cents`? */\nexport const isCents = (x) => typeof x === 'number' && Number.isInteger(x) && Number.isFinite(x);\n/** Runtime guard: is this value a valid `USD`? */\nexport const isUSD = (x) => typeof x === 'number' && Number.isFinite(x);\n/** Runtime guard: is this value a valid `DateOnly`? */\nexport const isDateOnly = (x) => typeof x === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(x);\n/** Runtime guard: shape-validates an email. */\nexport const isEmailAddress = (x) => typeof x === 'string' && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(x);\n/** Runtime guard: shape-validates a SvelteKit route path. */\nexport const isRoutePath = (x) => typeof x === 'string' &&\n x.length > 0 &&\n x.startsWith('/') &&\n !x.startsWith('//') &&\n !/^\\/\\w+:\\//.test(x);\n/** Runtime guard: is this value a valid `DurationMs`? */\nexport const isDurationMs = (x) => typeof x === 'number' && Number.isInteger(x) && Number.isFinite(x) && x >= 0;\n// ── Smart constructors for the new brands ────────────────────────────────\n/** Brand a positive integer as `PerformerId`. */\n// eslint-disable-next-line no-unused-vars -- intentionally retained (prop/slot/forward-compat or Svelte-5 reactive binding eslint cannot see)\nexport const toPerformerId = brandId('PerformerId');\n/** Brand a positive integer as `OrganizationId`. */\n// eslint-disable-next-line no-unused-vars -- intentionally retained (prop/slot/forward-compat or Svelte-5 reactive binding eslint cannot see)\nexport const toOrganizationId = brandId('OrganizationId');\n/** Brand a positive integer as `SeriesId`. */\n// eslint-disable-next-line no-unused-vars -- intentionally retained (prop/slot/forward-compat or Svelte-5 reactive binding eslint cannot see)\nexport const toSeriesId = brandId('SeriesId');\n/** Brand a positive integer as `TicketId`. */\n// eslint-disable-next-line no-unused-vars -- intentionally retained (prop/slot/forward-compat or Svelte-5 reactive binding eslint cannot see)\nexport const toTicketId = brandId('TicketId');\n/** Brand a positive integer as `SectionId`. */\n// eslint-disable-next-line no-unused-vars -- intentionally retained (prop/slot/forward-compat or Svelte-5 reactive binding eslint cannot see)\nexport const toSectionId = brandId('SectionId');\n/** Brand a positive integer as `LogId`. */\n// eslint-disable-next-line no-unused-vars -- intentionally retained (prop/slot/forward-compat or Svelte-5 reactive binding eslint cannot see)\nexport const toLogId = brandId('LogId');\n/** Brand a positive integer as `SlotId`. */\n// eslint-disable-next-line no-unused-vars -- intentionally retained (prop/slot/forward-compat or Svelte-5 reactive binding eslint cannot see)\nexport const toSlotId = brandId('SlotId');\n/** Brand a positive integer as `TransactionId`. */\n// eslint-disable-next-line no-unused-vars -- intentionally retained (prop/slot/forward-compat or Svelte-5 reactive binding eslint cannot see)\nexport const toTransactionId = brandId('TransactionId');\n/**\n * Brand a non-empty UUID/code string as `GiftCardId`. Accepts the public\n * gift-card UUID or human-readable code that MF's gift-card routes consume.\n * Rejects empty/whitespace input; intentionally permissive on format so\n * lookup-by-code paths work alongside UUID paths.\n */\nexport function toGiftCardId(s) {\n if (typeof s !== 'string' || s.trim().length === 0) {\n throw new TypeError(`GiftCardId must be a non-empty string, got ${s}`);\n }\n return s;\n}\n/**\n * Brand a non-empty string as `CookieName`. Accepts any non-empty cookie key;\n * intentionally permissive on format so the canonical `COOKIE_NAMES` registry\n * entries AND the per-event templated builders (`checkout-promocode-${id}`)\n * both mint valid names. Rejects empty / whitespace-only input.\n */\nexport function toCookieName(s) {\n if (typeof s !== 'string' || s.trim().length === 0) {\n throw new TypeError(`CookieName must be a non-empty string, got ${s}`);\n }\n return s;\n}\n/**\n * Brand a non-empty string as `RoleId`. Accepts any non-empty string\n * identifier; intentionally permissive on format so route-param values\n * (numeric DB id serialized as string) and any future slug-style\n * migration both work.\n */\nexport function toRoleId(s) {\n if (typeof s !== 'string' || s.trim().length === 0) {\n throw new TypeError(`RoleId must be a non-empty string, got ${s}`);\n }\n return s;\n}\n/**\n * Brand a non-empty string as `CollectionId`. Accepts any non-empty\n * string identifier; intentionally permissive on format so\n * route-param values (numeric DB id serialized as string) AND any\n * future UUID-style migration both work.\n */\nexport function toCollectionId(s) {\n if (typeof s !== 'string' || s.trim().length === 0) {\n throw new TypeError(`CollectionId must be a non-empty string, got ${s}`);\n }\n return s;\n}\n/**\n * Validate an ISO-8601 UTC timestamp and brand it as `UTCTimestamp`.\n *\n * Accepts the canonical wire forms: `2026-05-24T15:30:00Z`,\n * `2026-05-24T15:30:00.000Z`. Explicit `+00:00` offsets are also accepted\n * but normalized to `Z` is recommended on the producer side.\n *\n * Rejects: missing timezone (`2026-05-24T15:30:00`), non-UTC zones\n * (`2026-05-24T15:30:00-07:00`), invalid calendar dates, malformed shape.\n */\nexport function toUTCTimestamp(s) {\n if (typeof s !== 'string') {\n throw new TypeError(`UTCTimestamp must be a string, got ${typeof s}`);\n }\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d{1,3}))?(?:Z|\\+00:00)$/.exec(s);\n if (!m) {\n throw new TypeError(`UTCTimestamp must be ISO-8601 in UTC (e.g. 2026-05-24T15:30:00Z), got ${JSON.stringify(s)}`);\n }\n const [, yy, mm, dd, hh, mi, ss] = m;\n const y = Number(yy), mo = Number(mm), d = Number(dd);\n const h = Number(hh), min = Number(mi), sec = Number(ss);\n // V8's Date.parse normalizes invalid calendar dates (2026-02-30 → 2026-03-02),\n // which would silently brand a typo'd payload. Compare round-tripped UTC\n // components against the source to reject normalization.\n const probe = new Date(Date.UTC(y, mo - 1, d, h, min, sec));\n if (probe.getUTCFullYear() !== y ||\n probe.getUTCMonth() !== mo - 1 ||\n probe.getUTCDate() !== d ||\n probe.getUTCHours() !== h ||\n probe.getUTCMinutes() !== min ||\n probe.getUTCSeconds() !== sec) {\n throw new TypeError(`UTCTimestamp must be a real instant, got ${s}`);\n }\n return s;\n}\n/** Set of canonical role values. Updated alongside `RoleValue` whenever a role is added. */\nconst ROLE_VALUES = new Set(['admin', 'editor', 'viewer', 'guest']);\n/**\n * Validate that a string is one of the canonical `RoleValue` literals.\n * Acts as a type narrow at the wire boundary — the response mapper\n * uses this so a backend role string can flow into role-checked code.\n */\nexport function toRoleValue(s) {\n if (!ROLE_VALUES.has(s)) {\n throw new TypeError(`RoleValue must be one of ${[...ROLE_VALUES].join(' | ')}, got ${JSON.stringify(s)}`);\n }\n return s;\n}\n/**\n * Validate an ISO 3166-1 alpha-2 country code (two uppercase ASCII letters).\n * Shape-only — does not check against the real ISO list at runtime; that\n * belongs in the country-options canonical, which mints branded values\n * via this constructor.\n */\nexport function toISO3166Alpha2(s) {\n if (typeof s !== 'string' || !/^[A-Z]{2}$/.test(s)) {\n throw new TypeError(`ISO3166Alpha2 must be two uppercase ASCII letters, got ${JSON.stringify(s)}`);\n }\n return s;\n}\n/**\n * Validate an ISO 4217 currency code (three uppercase ASCII letters).\n * Shape-only — the currency-options canonical mints branded values from\n * the real ISO list.\n */\nexport function toISO4217(s) {\n if (typeof s !== 'string' || !/^[A-Z]{3}$/.test(s)) {\n throw new TypeError(`ISO4217 must be three uppercase ASCII letters, got ${JSON.stringify(s)}`);\n }\n return s;\n}\n/**\n * Brand a millisecond value as `MotionDuration`. Same shape check as\n * `toDurationMs` — the brand is narrower because of its semantic\n * (motion-only), not its representation.\n */\nexport function toMotionDuration(n) {\n if (!Number.isFinite(n) || !Number.isInteger(n) || n < 0) {\n throw new TypeError(`MotionDuration must be non-negative integer, got ${n}`);\n }\n return n;\n}\n/**\n * Brand a string as `MotionEasing`. The string must be either a CSS\n * cubic-bezier expression, one of the standard named CSS easings, or one\n * of the Svelte easing function names. Validation is shape-only; the\n * canonical `EASING` token table is the source of well-formed values.\n */\nexport function toMotionEasing(s) {\n if (typeof s !== 'string' || s.length === 0) {\n throw new TypeError(`MotionEasing must be a non-empty string, got ${JSON.stringify(s)}`);\n }\n return s;\n}\n/**\n * Brand a Tailwind utility-class string as a `ClassToken` of the given\n * kind. Caller asserts the kind — this is a typing helper for the\n * canonical class-token table; feature code generally does not call it\n * directly. The runtime validates only that the string is non-empty.\n */\nexport function toClassToken(s, _kind) {\n if (typeof s !== 'string' || s.length === 0) {\n throw new TypeError(`ClassToken must be a non-empty string, got ${JSON.stringify(s)}`);\n }\n return s;\n}\n/**\n * Brand a string as a translated, user-facing message. Only Paraglide\n * message functions and canonical formatters should mint this brand;\n * the smart constructor here exists so tests can mint sample values\n * without rigging Paraglide.\n */\nexport function toUserFacingMessage(s) {\n if (typeof s !== 'string') {\n throw new TypeError(`UserFacingMessage must be a string, got ${typeof s}`);\n }\n return s;\n}\n// ── Boundary casts for the new brands ────────────────────────────────────\n/** Unsafe boundary cast — use only at API-mapper layer. See header. */\nexport const asPerformerId = (n) => n;\n/** Unsafe boundary cast — use only at API-mapper layer. See header. */\nexport const asOrganizationId = (n) => n;\n/** Unsafe boundary cast — use only at API-mapper layer. See header. */\nexport const asSeriesId = (n) => n;\n/** Unsafe boundary cast — use only at API-mapper layer. See header. */\nexport const asTicketId = (n) => n;\n/** Unsafe boundary cast — use only at API-mapper layer. See header. */\nexport const asSectionId = (n) => n;\n/**\n * Unsafe boundary cast — use only at API-mapper layer. See header.\n * Accepts `string | number` because the API response carries the field as\n * `number` (integer PK) while route params deliver it as `string`. This is\n * the canonical pattern for mixed-shape entity brands: absorb the wire-shape\n * ambiguity here so everything above the boundary is union-free `CollectionId`.\n */\nexport const asCollectionId = (raw) => String(raw);\n/**\n * ambiguity here so everything above the boundary is union-free `RoleId`.\n */\nexport const asRoleId = (raw) => String(raw);\n/** Unsafe boundary cast — use only at API-mapper layer. See header. */\nexport const asGiftCardId = (s) => s;\n/** Unsafe boundary cast — use only at the cookies-canonical boundary. See header. */\nexport const asCookieName = (s) => s;\n/** Unsafe boundary cast — use only at API-mapper layer. See header. */\nexport const asTransactionId = (n) => n;\n/** Unsafe boundary cast — use only at API-mapper layer. See header. */\nexport const asSlotId = (n) => n;\n/** Unsafe boundary cast — use only at API-mapper layer. See header. */\nexport const asLogId = (n) => n;\n/** Unsafe boundary cast — use only at API-mapper layer. See header. */\nexport const asUTCTimestamp = (s) => s;\n/** Unsafe boundary cast — use only at API-mapper layer. See header. */\nexport const asRoleValue = (s) => s;\n/** Unsafe boundary cast — use only at API-mapper layer. See header. */\nexport const asISO3166Alpha2 = (s) => s;\n/** Unsafe boundary cast — use only at API-mapper layer. See header. */\nexport const asISO4217 = (s) => s;\n/** Unsafe boundary cast — use only at API-mapper layer. See header. */\nexport const asMotionDuration = (n) => n;\n/** Unsafe boundary cast — use only at API-mapper layer. See header. */\nexport const asMotionEasing = (s) => s;\n/** Unsafe boundary cast — use only at API-mapper layer. See header. */\nexport const asClassToken = (s) => s;\n/** Unsafe boundary cast — use only at API-mapper layer. See header. */\nexport const asUserFacingMessage = (s) => s;\n// ── Type guards for the new brands ───────────────────────────────────────\n/** Runtime guard: is this value a canonical `RoleValue`? */\nexport const isRoleValue = (x) => typeof x === 'string' && ROLE_VALUES.has(x);\n/** Runtime guard: is this string a well-shaped UTC ISO timestamp that round-trips through Date? */\nexport const isUTCTimestamp = (x) => {\n if (typeof x !== 'string')\n return false;\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:\\.\\d{1,3})?(?:Z|\\+00:00)$/.exec(x);\n if (!m)\n return false;\n const [, yy, mm, dd, hh, mi, ss] = m;\n const y = Number(yy), mo = Number(mm), d = Number(dd);\n const h = Number(hh), min = Number(mi), sec = Number(ss);\n const probe = new Date(Date.UTC(y, mo - 1, d, h, min, sec));\n return (probe.getUTCFullYear() === y &&\n probe.getUTCMonth() === mo - 1 &&\n probe.getUTCDate() === d &&\n probe.getUTCHours() === h &&\n probe.getUTCMinutes() === min &&\n probe.getUTCSeconds() === sec);\n};\n/** Runtime guard: is this string a well-shaped ISO 3166-1 alpha-2 code? */\nexport const isISO3166Alpha2 = (x) => typeof x === 'string' && /^[A-Z]{2}$/.test(x);\n/** Runtime guard: is this string a well-shaped ISO 4217 currency code? */\nexport const isISO4217 = (x) => typeof x === 'string' && /^[A-Z]{3}$/.test(x);\n","/**\n * DateTime Module Type Definitions\n *\n * This module provides type-safe date/time handling for the MicDrop platform.\n * All datetime operations should use these types to ensure consistency.\n *\n * @module datetime/types\n */\n/* eslint-disable no-unused-vars -- exported types/enum members are consumed by sibling modules; no-unused-vars only sees this file. */\n/**\n * Error thrown when datetime operations fail.\n */\nexport class DateTimeError extends Error {\n constructor(message, code, details) {\n super(message);\n this.code = code;\n this.details = details;\n this.name = 'DateTimeError';\n }\n}\n/**\n * Error codes for datetime operations.\n */\nexport var DateTimeErrorCode;\n(function (DateTimeErrorCode) {\n DateTimeErrorCode[\"INVALID_TIMEZONE\"] = \"INVALID_TIMEZONE\";\n DateTimeErrorCode[\"INVALID_ISO_STRING\"] = \"INVALID_ISO_STRING\";\n DateTimeErrorCode[\"INVALID_DATE\"] = \"INVALID_DATE\";\n DateTimeErrorCode[\"INVALID_TIME\"] = \"INVALID_TIME\";\n DateTimeErrorCode[\"MISSING_TIMEZONE\"] = \"MISSING_TIMEZONE\";\n DateTimeErrorCode[\"PARSE_ERROR\"] = \"PARSE_ERROR\";\n})(DateTimeErrorCode || (DateTimeErrorCode = {}));\n","/**\n * DateTime Constants\n *\n * Centralized constants for datetime operations.\n * Use these instead of magic numbers throughout the codebase.\n *\n * @module datetime/constants\n */\nimport { toIANATimezone } from '../types/brands.js';\n/**\n * Duration constants in milliseconds.\n */\nexport const DURATIONS = {\n /** One second in milliseconds */\n SECOND: 1000,\n /** One minute in milliseconds */\n MINUTE: 60 * 1000,\n /** One hour in milliseconds */\n HOUR: 60 * 60 * 1000,\n /** One day in milliseconds */\n DAY: 24 * 60 * 60 * 1000,\n /** One week in milliseconds */\n WEEK: 7 * 24 * 60 * 60 * 1000,\n};\n/**\n * Duration constants in minutes.\n */\nexport const DURATIONS_MINUTES = {\n /** One hour in minutes */\n HOUR: 60,\n /** One day in minutes */\n DAY: 24 * 60,\n /** One week in minutes */\n WEEK: 7 * 24 * 60,\n};\n/**\n * Date format strings for use with date-fns.\n */\nexport const DATE_FORMATS = {\n /** API format: UTC ISO string */\n API: \"yyyy-MM-dd'T'HH:mm:ss'Z'\",\n /** Date for API without time */\n API_DATE: 'yyyy-MM-dd',\n /** Display date (e.g., \"Dec 20, 2025\") */\n DISPLAY_DATE: 'MMM d, yyyy',\n /** Display date without year (e.g., \"Dec 20\") */\n DISPLAY_DATE_SHORT: 'MMM d',\n /** Display date with short weekday, no year (e.g., \"Thu, Oct 24\") */\n DISPLAY_WEEKDAY_DATE: 'EEE, MMM d',\n /** Display full date with weekday and ordinal day (e.g., \"Thursday, October 24th, 2024\") */\n DISPLAY_FULL_DATE_ORDINAL: \"EEEE, MMMM do, yyyy\",\n /** Display time (e.g., \"7:00 PM\") */\n DISPLAY_TIME: 'h:mm a',\n /** Display time with seconds (e.g., \"7:00:00 PM\") */\n DISPLAY_TIME_SECONDS: 'h:mm:ss a',\n /** Display datetime (e.g., \"Dec 20, 2025 at 7:00 PM\") */\n DISPLAY_DATETIME: \"MMM d, yyyy 'at' h:mm a\",\n /**\n * Admin-absolute datetime (e.g., \"Mar 14, 2026, 8:00 PM\"). Comma separator,\n * always year, always time — the unambiguous form for operator-facing\n * surfaces (brief 03 `absolute` preset).\n */\n DISPLAY_ABSOLUTE: 'MMM d, yyyy, h:mm a',\n /**\n * Public-friendly full datetime (e.g., \"Friday, March 14 · 8:00 PM\").\n * Full weekday + month, no year, middot separator before the time — the\n * warm, scannable form for attendee-facing surfaces (brief 03 `eventFull`\n * preset). The `·` is a literal (not a date-fns token), wrapped in quotes\n * so date-fns treats it verbatim.\n */\n DISPLAY_EVENT_FULL: \"EEEE, MMMM d '·' h:mm a\",\n /** Display full datetime with day (e.g., \"Mon, Dec 20, 2025 at 7:00 PM\") */\n DISPLAY_DATETIME_FULL: \"EEE, MMM d, yyyy 'at' h:mm a\",\n /**\n * Short-weekday datetime, comma-separated (e.g., \"Sat, Mar 14, 2026, 8:00 PM\").\n * Short weekday + short month + day + year + time, all comma-separated — the\n * byte-for-byte equivalent of the legacy viewer-local\n * `utils/dateHelpers.ts::formatDateTime` (and micdrop-frontend's `formatDateTime`\n * date helper), which used `Intl` with `{ weekday:'short', year:'numeric',\n * month:'short', day:'numeric', hour:'numeric', minute:'numeric', hour12:true }`.\n * This is `DISPLAY_ABSOLUTE` with a short-weekday prefix — the `<Time>`\n * primitive's `dateTimeShort` preset, so consumers can migrate those renders\n * to a timezone-required `<Time>` with zero pixel change.\n */\n DISPLAY_WEEKDAY_DATETIME: 'EEE, MMM d, yyyy, h:mm a',\n /** Day of week short (e.g., \"Mon\") */\n DAY_SHORT: 'EEE',\n /** Day of week full (e.g., \"Monday\") */\n DAY_FULL: 'EEEE',\n /** Month short (e.g., \"Dec\") */\n MONTH_SHORT: 'MMM',\n /** Month full (e.g., \"December\") */\n MONTH_FULL: 'MMMM',\n /** Year only (e.g., \"2025\") */\n YEAR: 'yyyy',\n /** 24-hour time (e.g., \"19:00\") */\n TIME_24H: 'HH:mm',\n};\n/**\n * Commonly used US timezones for quick selection.\n */\nexport const COMMON_US_TIMEZONES = [\n { id: 'America/Los_Angeles', label: 'Pacific Time (PT)', abbr: 'PT' },\n { id: 'America/Denver', label: 'Mountain Time (MT)', abbr: 'MT' },\n { id: 'America/Chicago', label: 'Central Time (CT)', abbr: 'CT' },\n { id: 'America/New_York', label: 'Eastern Time (ET)', abbr: 'ET' },\n { id: 'America/Phoenix', label: 'Arizona (no DST)', abbr: 'AZ' },\n { id: 'Pacific/Honolulu', label: 'Hawaii Time (HT)', abbr: 'HT' },\n { id: 'America/Anchorage', label: 'Alaska Time (AKT)', abbr: 'AKT' },\n];\n/**\n * Default timezone when none is specified (should rarely be used).\n * Prefer explicitly passing timezone in all operations.\n *\n * Branded as `IANATimezone` so it satisfies canonicals that demand the\n * branded type without a bypass cast. This is the canonical default — it\n * supersedes `utils/timezones.ts::getDefaultTimezone()`, which can be\n * deleted once its callers migrate to `getDefaultTimezone()` below.\n */\nexport const DEFAULT_TIMEZONE = toIANATimezone('America/Los_Angeles');\n/**\n * Returns the canonical default timezone, branded as `IANATimezone`.\n *\n * Function form mirrors `utils/timezones.ts::getDefaultTimezone()` so that\n * legacy module can become a one-line re-export (then be deleted) once\n * callers import from `$lib/datetime` instead.\n *\n * @returns Branded IANA timezone (`'America/Los_Angeles'`)\n */\nexport function getDefaultTimezone() {\n return DEFAULT_TIMEZONE;\n}\n/**\n * Relative time thresholds for formatRelativeTime.\n */\nexport const RELATIVE_TIME_THRESHOLDS = {\n /** Under this many seconds, show \"just now\" */\n JUST_NOW_SECONDS: 60,\n /** Under this many minutes, show \"X minutes ago/from now\" */\n MINUTES_THRESHOLD: 60,\n /** Under this many hours, show \"X hours ago/from now\" */\n HOURS_THRESHOLD: 24,\n /** Under this many days, show \"X days ago/from now\" */\n DAYS_THRESHOLD: 7,\n /** Under this many weeks, show \"X weeks ago/from now\" */\n WEEKS_THRESHOLD: 4,\n};\n/**\n * MicDrop-specific event defaults.\n */\nexport const EVENT_DEFAULTS = {\n /** Default event duration in minutes */\n DEFAULT_DURATION_MINUTES: 120,\n /** Minimum event duration in minutes */\n MIN_DURATION_MINUTES: 15,\n /** Maximum event duration in minutes (24 hours) */\n MAX_DURATION_MINUTES: 24 * 60,\n /** Default doors open time before event start (minutes) */\n DEFAULT_DOORS_BEFORE_MINUTES: 30,\n};\n/**\n * Legacy timezone mappings from venue data.\n * Maps human-readable location names to IANA timezone identifiers.\n * Used for backwards compatibility with older venue data that stored\n * location names instead of proper IANA timezone IDs.\n *\n * Consulted by {@link import('./timezone.js').getIANATimezone} BEFORE the\n * `isValidTimezone` passthrough, which is load-bearing for the numeric-offset\n * entries below (see their note).\n */\nexport const LEGACY_TIMEZONE_MAP = {\n 'UTC': 'UTC',\n 'GMT': 'UTC',\n // Bare ISO-8601 UTC designator. Intl rejects 'Z' as a timezone, so without\n // this entry it would fall through to the default instead of resolving to UTC.\n 'Z': 'UTC',\n // California\n 'California USA': 'America/Los_Angeles',\n 'California': 'America/Los_Angeles',\n 'Los Angeles': 'America/Los_Angeles',\n 'Los Angeles USA': 'America/Los_Angeles',\n // New York\n 'New York': 'America/New_York',\n 'New York USA': 'America/New_York',\n // Chicago\n 'Chicago': 'America/Chicago',\n 'Chicago USA': 'America/Chicago',\n // Denver\n 'Denver': 'America/Denver',\n 'Denver USA': 'America/Denver',\n // Phoenix (no DST)\n 'Phoenix': 'America/Phoenix',\n 'Phoenix USA': 'America/Phoenix',\n // Region names — folded in from venue-calendar-npm's LEGACY_TIMEZONE_MAP so\n // deleting that shadow loses no coverage. (Abbreviations like PST/EST are\n // handled separately by normalizeTimezone(), not this map.)\n 'Pacific': 'America/Los_Angeles',\n 'Mountain': 'America/Denver',\n 'Central': 'America/Chicago',\n 'Eastern': 'America/New_York',\n 'HST': 'Pacific/Honolulu',\n 'AKST': 'America/Anchorage',\n 'AKDT': 'America/Anchorage',\n // Numeric UTC offsets. Intl.DateTimeFormat ACCEPTS strings like '-08:00' as a\n // valid timezone, so getIANATimezone would otherwise pass them through\n // verbatim (a fixed offset that ignores DST) instead of resolving them to a\n // named zone. These are consulted before the isValidTimezone passthrough so a\n // stored numeric offset becomes a real, DST-aware IANA zone — the\n // venue-calendar-npm coverage that must survive deleting its shadow.\n '-08:00': 'America/Los_Angeles',\n '-07:00': 'America/Denver',\n '-06:00': 'America/Chicago',\n '-05:00': 'America/New_York',\n '-04:00': 'America/New_York', // EDT\n '+00:00': 'UTC',\n};\n","/**\n * Timezone Utilities\n *\n * Functions for working with IANA timezones.\n * All timezone operations require explicit timezone IDs - no defaults.\n *\n * @module datetime/timezone\n */\nimport { DEFAULT_TIMEZONE, LEGACY_TIMEZONE_MAP } from './constants.js';\nimport { DateTimeError, DateTimeErrorCode } from './types.js';\nimport { asIANATimezone } from '../types/brands.js';\n/**\n * Cache for timezone validation results to avoid repeated Intl calls.\n */\nconst timezoneValidationCache = new Map();\n/**\n * Common timezone abbreviations that should NOT be considered valid IANA timezones.\n * These are handled separately by normalizeTimezone().\n */\nconst TIMEZONE_ABBREVIATIONS = new Set([\n 'PST',\n 'PDT',\n 'PT',\n 'MST',\n 'MDT',\n 'MT',\n 'CST',\n 'CDT',\n 'CT',\n 'EST',\n 'EDT',\n 'ET',\n 'GMT',\n 'BST',\n 'CET',\n 'CEST',\n 'JST',\n 'AEST',\n 'AEDT',\n]);\n/**\n * Validates whether a string is a valid IANA timezone identifier.\n * Rejects common abbreviations like PST, EST, etc. even if the runtime accepts them.\n *\n * @param timezone - The timezone string to validate\n * @returns true if valid IANA timezone, false otherwise\n *\n * @example\n * isValidTimezone('America/Los_Angeles') // true\n * isValidTimezone('PST') // false (abbreviations not valid)\n * isValidTimezone('Invalid/Zone') // false\n */\nexport function isValidTimezone(timezone) {\n if (!timezone || typeof timezone !== 'string') {\n return false;\n }\n // Reject known abbreviations - they're not proper IANA identifiers\n if (TIMEZONE_ABBREVIATIONS.has(timezone.toUpperCase())) {\n return false;\n }\n // Check cache first\n const cached = timezoneValidationCache.get(timezone);\n if (cached !== undefined) {\n return cached;\n }\n try {\n // Attempt to create a DateTimeFormat with the timezone\n // This throws for invalid timezones\n Intl.DateTimeFormat(undefined, { timeZone: timezone });\n timezoneValidationCache.set(timezone, true);\n return true;\n }\n catch {\n timezoneValidationCache.set(timezone, false);\n return false;\n }\n}\n/**\n * Extracts the timezone from a venue object.\n * Throws if the venue doesn't have a valid timezone.\n *\n * @param venue - Venue object with optional timezone property\n * @returns The venue's timezone ID\n * @throws {DateTimeError} If venue timezone is missing or invalid\n *\n * @example\n * const tz = getVenueTimezone({ timezone: 'America/Los_Angeles' });\n * // tz === 'America/Los_Angeles'\n *\n * getVenueTimezone({}) // throws DateTimeError\n */\nexport function getVenueTimezone(venue) {\n const timezone = venue?.timezone;\n if (!timezone || typeof timezone !== 'string' || timezone.trim() === '') {\n throw new DateTimeError('Venue timezone is required', DateTimeErrorCode.MISSING_TIMEZONE, { venue });\n }\n if (!isValidTimezone(timezone)) {\n throw new DateTimeError(`Invalid venue timezone: ${timezone}`, DateTimeErrorCode.INVALID_TIMEZONE, { venue, timezone });\n }\n return timezone;\n}\n/**\n * LENIENT, casing-defensive, never-empty venue/event timezone reader.\n *\n * This is the consolidation canonical for the casing-defensive tz read that MF\n * (`utils/eventTransform.ts`) and PP (three `+page` sites) each hand-rolled\n * because the strict {@link getVenueTimezone} only reads a single lowercase key\n * and THROWS. Prefer THIS for any raw API entity whose tz field casing is\n * unknown; use {@link getVenueTimezone} only when a single validated lowercase\n * `timezone` is guaranteed and a throw-on-missing contract is wanted.\n *\n * Reads the timezone from any of four wire casings in priority order\n * (`timeZone` PascalCase = canonical backend form, then `TimeZone`, `timezone`,\n * `Timezone`), with an optional `eventFallback` entity tried next (PP needs\n * venue-tz-then-event-tz), normalizes legacy/invalid values via\n * {@link getIANATimezone}, and brands the result as `IANATimezone`.\n *\n * Uses `||` (NOT `??`) between casings so an EMPTY-STRING canonical field falls\n * through to the next casing instead of short-circuiting — e.g.\n * `venueTimeZone({ timeZone: '', timezone: 'America/New_York' })` resolves to\n * New_York, not the default.\n *\n * HARD INVARIANT: never returns an empty string. Empty/missing/invalid input\n * falls back to the SC platform default (`America/Los_Angeles`, via\n * `getIANATimezone`'s `DEFAULT_TIMEZONE`) — deliberately NOT `'UTC'`, so\n * callers never silently render\n * times in the viewer's browser zone, and so the same bad input renders the\n * same time everywhere).\n *\n * @param entity - Primary object that may carry a venue/event timezone field\n * @param eventFallback - Optional secondary entity (e.g. the event) whose tz is\n * used when `entity` carries no usable tz across any casing\n * @returns Branded `IANATimezone` (never empty)\n *\n * @example\n * venueTimeZone({ timeZone: 'America/Chicago' }) // 'America/Chicago' (PascalCase wins)\n * venueTimeZone({ timezone: 'America/New_York' }) // 'America/New_York' (legacy casing)\n * venueTimeZone({ timeZone: 'California USA' }) // 'America/Los_Angeles' (normalised)\n * venueTimeZone({ timeZone: '' }, { timezone: 'America/Denver' }) // 'America/Denver' (event fallback)\n * venueTimeZone({}) // 'America/Los_Angeles' (default, never empty)\n */\nexport function venueTimeZone(entity, eventFallback) {\n // PascalCase is the canonical backend wire field; fall through to legacy\n // casings, then the optional event fallback. `||` (not `??`) so an\n // empty-string field falls through instead of short-circuiting.\n const raw = entity?.timeZone ||\n entity?.TimeZone ||\n entity?.timezone ||\n entity?.Timezone ||\n eventFallback?.timeZone ||\n eventFallback?.TimeZone ||\n eventFallback?.timezone ||\n eventFallback?.Timezone;\n // getIANATimezone maps null/undefined/empty/legacy strings → a valid IANA id\n // or the default (it validates via Intl.DateTimeFormat internally), so the\n // boundary brand cast is safe and the never-empty invariant holds.\n return asIANATimezone(getIANATimezone(raw ?? null));\n}\n/**\n * Gets the user's browser/system timezone.\n *\n * @returns The user's IANA timezone ID\n *\n * @example\n * const userTz = getUserTimezone();\n * // e.g., 'America/Los_Angeles'\n */\nexport function getUserTimezone() {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n/**\n * Gets the viewer's browser/system locale (BCP-47) — the locale sibling of\n * {@link getUserTimezone}.\n *\n * Used as the default locale for the library's locale-aware formatters (e.g.\n * {@link import('./format.js').formatDateLocalized}) when the consumer doesn't\n * pass an explicit app locale. An app with its own i18n runtime (e.g.\n * micdrop-frontend's Paraglide `getIntlLocale()`) should pass that locale\n * explicitly so the rendered locale matches the chosen UI language rather than\n * the browser default; pass explicitly for SSR / deterministic output too.\n *\n * @returns The viewer's resolved BCP-47 locale (e.g. \"en-US\", \"fr-FR\")\n *\n * @example\n * const locale = getUserLocale();\n * // e.g., 'en-US'\n */\nexport function getUserLocale() {\n return Intl.DateTimeFormat().resolvedOptions().locale;\n}\n/**\n * Gets a human-readable timezone offset string.\n *\n * @param timezone - IANA timezone ID\n * @param date - Optional date for DST-aware offset (defaults to now)\n * @returns Formatted offset string (e.g., \"PST (UTC-8)\" or \"PDT (UTC-7)\")\n * @throws {DateTimeError} If timezone is invalid\n *\n * @example\n * getTimezoneOffset('America/Los_Angeles')\n * // \"PST (UTC-8)\" in winter, \"PDT (UTC-7)\" in summer\n */\nexport function getTimezoneOffset(timezone, date = new Date()) {\n if (!isValidTimezone(timezone)) {\n throw new DateTimeError(`Invalid timezone: ${timezone}`, DateTimeErrorCode.INVALID_TIMEZONE, { timezone });\n }\n // Get the timezone abbreviation\n const formatter = new Intl.DateTimeFormat('en-US', {\n timeZone: timezone,\n timeZoneName: 'short',\n });\n const parts = formatter.formatToParts(date);\n const tzPart = parts.find(p => p.type === 'timeZoneName');\n const abbr = tzPart?.value || timezone;\n // Extract the exact UTC offset via longOffset (e.g. \"GMT+05:30\", \"GMT-03:30\").\n // This is the only reliable way to get sub-hour precision — the toLocaleString\n // round-trip + Math.round approach incorrectly rounds Asia/Kolkata (+5:30) to\n // UTC+6, America/St_Johns (-3:30) to UTC-4, etc.\n const offsetFormatter = new Intl.DateTimeFormat('en-US', {\n timeZone: timezone,\n timeZoneName: 'longOffset',\n });\n const offsetParts = offsetFormatter.formatToParts(date);\n const offsetRaw = offsetParts.find(p => p.type === 'timeZoneName')?.value ?? 'GMT+00:00';\n // offsetRaw is \"GMT+HH:MM\" or \"GMT-HH:MM\" or \"GMT\" (for UTC).\n let utcLabel;\n const match = offsetRaw.match(/GMT([+-])(\\d{1,2})(?::(\\d{2}))?/);\n if (match) {\n const sign = match[1];\n // Strip leading zero from the hours group so whole-hour labels match the\n // original integer format exactly (e.g. \"UTC-8\", not \"UTC-08\").\n const hours = parseInt(match[2], 10);\n const mins = match[3];\n // Include minutes only for sub-hour zones (keeps whole-hour labels clean).\n utcLabel = mins && mins !== '00'\n ? `UTC${sign}${hours}:${mins}`\n : `UTC${sign}${hours}`;\n }\n else {\n // UTC itself — longOffset returns bare \"GMT\"\n utcLabel = 'UTC+0';\n }\n return `${abbr} (${utcLabel})`;\n}\n/**\n * Resolves the short, DST-aware abbreviation for a timezone at a given\n * instant (e.g. \"PST\" in winter, \"PDT\" in summer; \"EST\"/\"EDT\" for New York).\n * Falls back to the raw IANA id if the runtime can't produce an abbreviation.\n *\n * Public so callers (e.g. the `<Time>` primitive's `showTzLabel=\"always\"`)\n * can ask for the venue-local label unconditionally, without round-tripping\n * through {@link formatTzLabel}'s viewer comparison.\n *\n * @param timezone - IANA timezone ID\n * @param date - Reference instant for DST-correct abbreviation (defaults to now)\n * @returns Short tz abbreviation (e.g. \"PST\"), or the raw id if unavailable\n * @throws {DateTimeError} If `timezone` is invalid\n *\n * @example\n * formatTzAbbreviation('America/Los_Angeles', new Date('2026-01-15T12:00:00Z'))\n * // \"PST\"\n */\nexport function formatTzAbbreviation(timezone, date = new Date()) {\n if (!isValidTimezone(timezone)) {\n throw new DateTimeError(`Invalid timezone: ${timezone}`, DateTimeErrorCode.INVALID_TIMEZONE, { timezone });\n }\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone: timezone,\n timeZoneName: 'short',\n }).formatToParts(date);\n return parts.find(p => p.type === 'timeZoneName')?.value || timezone;\n}\n/**\n * Canonicalizes an IANA id to the form the runtime resolves it to (e.g. an\n * alias collapses to its primary zone), so two ids that name the *same* zone\n * compare equal while distinct zones that merely share an abbreviation/offset\n * (America/Los_Angeles vs America/Vancouver — both \"PST/PDT\") stay distinct.\n * @internal\n */\nfunction canonicalZoneId(timezone) {\n try {\n return new Intl.DateTimeFormat('en-US', { timeZone: timezone })\n .resolvedOptions().timeZone;\n }\n catch {\n return timezone;\n }\n}\n/**\n * Returns the short, DST-aware timezone label for `venueTz` (e.g. \"PST\"),\n * but ONLY when the venue's zone differs from the viewer's — otherwise returns\n * the empty string. This is the \"show the zone only when it matters\" helper:\n * a viewer in the venue's own timezone sees no redundant suffix, while a\n * viewer elsewhere gets the venue-local label so the displayed clock time is\n * never ambiguous. Times are NEVER converted to the viewer's zone — the label\n * is the disambiguator, the time stays venue-local (brief 03 decided feel).\n *\n * Composes {@link getUserTimezone} (viewer) with the venue-local abbreviation.\n * The \"show only when different\" rule compares **canonical IANA zone ids**, not\n * abbreviations — so an LA venue viewed from Vancouver (both resolve \"PST/PDT\"\n * but are genuinely different zones) still shows the label, while an LA venue\n * viewed from LA (or an alias of it) suppresses it.\n *\n * @param venueTz - The venue's IANA timezone ID (the zone the time is shown in)\n * @param viewerTz - The viewer's IANA timezone ID. Defaults to\n * {@link getUserTimezone}. Pass explicitly for SSR or testing.\n * @param date - Optional reference instant for DST-correct abbreviation\n * (defaults to now). Pass the event instant so a summer event reads \"PDT\".\n * @returns Short tz label (e.g. \"PST\") when the zones differ, else `''`.\n * @throws {DateTimeError} If `venueTz` is invalid.\n *\n * @example\n * // viewer in America/New_York, venue in America/Los_Angeles\n * formatTzLabel('America/Los_Angeles', 'America/New_York') // \"PST\"\n * // viewer and venue both Pacific\n * formatTzLabel('America/Los_Angeles', 'America/Los_Angeles') // \"\"\n * // venue LA, viewer Vancouver — same abbreviation, DIFFERENT zone → labelled\n * formatTzLabel('America/Los_Angeles', 'America/Vancouver') // \"PST\"\n */\nexport function formatTzLabel(venueTz, viewerTz = getUserTimezone(), date = new Date()) {\n // formatTzAbbreviation validates venueTz (throws on invalid).\n const venueAbbr = formatTzAbbreviation(venueTz, date);\n // Same IANA id → never label (cheap exact path).\n if (venueTz === viewerTz) {\n return '';\n }\n // If the viewer's zone is invalid/unknown, fail open and still show the\n // venue label (the safer default — a stray label beats an ambiguous time).\n if (!isValidTimezone(viewerTz)) {\n return venueAbbr;\n }\n // Suppress ONLY when the two ids canonicalize to the same zone (an alias of\n // the venue zone). Distinct zones that share an abbreviation (LA vs\n // Vancouver) keep the label — compare zone identity, not the abbreviation.\n return canonicalZoneId(venueTz) === canonicalZoneId(viewerTz)\n ? ''\n : venueAbbr;\n}\n/**\n * Gets the display name for a timezone.\n *\n * @param timezone - IANA timezone ID\n * @returns Human-readable timezone name\n * @throws {DateTimeError} If timezone is invalid\n *\n * @example\n * getTimezoneDisplayName('America/Los_Angeles')\n * // \"Pacific Time\"\n */\nexport function getTimezoneDisplayName(timezone) {\n if (!isValidTimezone(timezone)) {\n throw new DateTimeError(`Invalid timezone: ${timezone}`, DateTimeErrorCode.INVALID_TIMEZONE, { timezone });\n }\n const formatter = new Intl.DateTimeFormat('en-US', {\n timeZone: timezone,\n timeZoneName: 'long',\n });\n const parts = formatter.formatToParts(new Date());\n const tzPart = parts.find(p => p.type === 'timeZoneName');\n return tzPart?.value || timezone;\n}\n/**\n * Normalizes legacy or non-standard timezone strings to valid IANA IDs.\n * This is useful for handling user input or legacy data.\n *\n * @param timezone - Timezone string that may be non-standard\n * @returns Valid IANA timezone ID\n * @throws {DateTimeError} If timezone cannot be normalized\n *\n * @example\n * normalizeTimezone('PST') // might return 'America/Los_Angeles'\n * normalizeTimezone('Eastern') // might return 'America/New_York'\n */\nexport function normalizeTimezone(timezone) {\n if (!timezone || typeof timezone !== 'string') {\n throw new DateTimeError('Timezone is required', DateTimeErrorCode.MISSING_TIMEZONE);\n }\n const trimmed = timezone.trim();\n // If already valid, return as-is\n if (isValidTimezone(trimmed)) {\n return trimmed;\n }\n // Common abbreviation mappings (US-focused for MicDrop)\n const abbreviationMap = {\n PST: 'America/Los_Angeles',\n PDT: 'America/Los_Angeles',\n PT: 'America/Los_Angeles',\n PACIFIC: 'America/Los_Angeles',\n MST: 'America/Denver',\n MDT: 'America/Denver',\n MT: 'America/Denver',\n MOUNTAIN: 'America/Denver',\n CST: 'America/Chicago',\n CDT: 'America/Chicago',\n CT: 'America/Chicago',\n CENTRAL: 'America/Chicago',\n EST: 'America/New_York',\n EDT: 'America/New_York',\n ET: 'America/New_York',\n EASTERN: 'America/New_York',\n UTC: 'UTC',\n GMT: 'UTC',\n };\n const normalized = abbreviationMap[trimmed.toUpperCase()];\n if (normalized) {\n return normalized;\n }\n throw new DateTimeError(`Cannot normalize timezone: ${timezone}`, DateTimeErrorCode.INVALID_TIMEZONE, { timezone });\n}\n/**\n * Checks if a timezone is currently observing Daylight Saving Time.\n *\n * @param timezone - IANA timezone ID\n * @param date - Date to check (defaults to now)\n * @returns true if DST is in effect\n * @throws {DateTimeError} If timezone is invalid\n */\nexport function isDST(timezone, date = new Date()) {\n if (!isValidTimezone(timezone)) {\n throw new DateTimeError(`Invalid timezone: ${timezone}`, DateTimeErrorCode.INVALID_TIMEZONE, { timezone });\n }\n // Compare January and July offsets to determine whether this zone observes DST\n // and, if so, whether the given date falls in the DST period.\n // Uses Intl longOffset parts to get exact minute-precision offsets — the old\n // toLocaleString round-trip + Math.round approach was imprecise for sub-hour zones.\n const jan = new Date(date.getFullYear(), 0, 1);\n const jul = new Date(date.getFullYear(), 6, 1);\n const getOffsetMinutes = (d) => {\n const fmt = new Intl.DateTimeFormat('en-US', {\n timeZone: timezone,\n timeZoneName: 'longOffset',\n });\n const raw = fmt.formatToParts(d).find(p => p.type === 'timeZoneName')?.value ?? 'GMT+00:00';\n const m = raw.match(/GMT([+-])(\\d{1,2})(?::(\\d{2}))?/);\n if (!m)\n return 0;\n const sign = m[1] === '-' ? -1 : 1;\n return sign * (parseInt(m[2], 10) * 60 + parseInt(m[3] ?? '0', 10));\n };\n const janOffset = getOffsetMinutes(jan);\n const julOffset = getOffsetMinutes(jul);\n const currentOffset = getOffsetMinutes(date);\n // DST is the period with the larger (more-positive) offset.\n const dstOffset = Math.max(janOffset, julOffset);\n return currentOffset === dstOffset && janOffset !== julOffset;\n}\n// ============================================================================\n// Legacy Timezone Support & Select Component Utilities\n// ============================================================================\n/**\n * Convert a potentially legacy timezone string to an IANA identifier.\n * Handles legacy location names (e.g., \"California USA\"), IANA identifiers,\n * and timezone abbreviations (e.g., \"PST\").\n *\n * This is the primary function for normalizing timezone strings from\n * older venue data or user input.\n *\n * @param tzString - Timezone string from API or user input\n * @returns Valid IANA timezone identifier\n *\n * @example\n * getIANATimezone('California USA') // 'America/Los_Angeles'\n * getIANATimezone('America/New_York') // 'America/New_York' (passthrough)\n * getIANATimezone('PST') // 'America/Los_Angeles'\n * getIANATimezone(null) // 'America/Los_Angeles' (default)\n */\nexport function getIANATimezone(tzString) {\n if (!tzString || tzString === 'NaN') {\n return DEFAULT_TIMEZONE;\n }\n // Check legacy mappings first (e.g., \"California USA\" -> \"America/Los_Angeles\")\n const legacyMatch = LEGACY_TIMEZONE_MAP[tzString];\n if (legacyMatch) {\n return legacyMatch;\n }\n // Try to validate as IANA timezone\n if (isValidTimezone(tzString)) {\n return tzString;\n }\n // Try normalizing abbreviations (PST, EST, etc.)\n try {\n return normalizeTimezone(tzString);\n }\n catch {\n // If all else fails, return default\n return DEFAULT_TIMEZONE;\n }\n}\n/**\n * Alias for isValidTimezone for backwards compatibility.\n * @deprecated Use isValidTimezone instead\n */\nexport const isValidIANATimezone = isValidTimezone;\n/**\n * Get all supported IANA timezone identifiers.\n * Uses the browser's Intl API to get the complete list.\n *\n * @returns Array of all valid IANA timezone identifiers\n *\n * @example\n * const timezones = getAllTimezones();\n * // ['Africa/Abidjan', 'Africa/Accra', ..., 'Pacific/Wallis']\n */\nexport function getAllTimezones() {\n // Cast to support Intl.supportedValuesOf which is ES2023+.\n // Go through `unknown` since `typeof Intl` does not structurally overlap.\n return Intl.supportedValuesOf('timeZone');\n}\n/**\n * Format a timezone identifier into a human-readable display string.\n * Includes the timezone abbreviation and UTC offset.\n *\n * @param timezone - IANA timezone identifier\n * @returns Formatted display string\n *\n * @example\n * formatTimezoneForDisplay('America/Los_Angeles')\n * // \"America / Los Angeles (PST)\"\n */\nexport function formatTimezoneForDisplay(timezone) {\n try {\n const now = new Date();\n const formatter = new Intl.DateTimeFormat('en-US', {\n timeZone: timezone,\n timeZoneName: 'short',\n });\n const parts = formatter.formatToParts(now);\n const tzAbbrev = parts.find(p => p.type === 'timeZoneName')?.value || '';\n // Get UTC offset\n const offsetFormatter = new Intl.DateTimeFormat('en-US', {\n timeZone: timezone,\n timeZoneName: 'longOffset',\n });\n const offsetParts = offsetFormatter.formatToParts(now);\n const offset = offsetParts.find(p => p.type === 'timeZoneName')?.value || '';\n // Format the display name\n const displayName = timezone.replace(/_/g, ' ').replace(/\\//g, ' / ');\n return `${displayName} (${tzAbbrev || offset})`;\n }\n catch {\n // Fallback if formatting fails\n return timezone.replace(/_/g, ' ');\n }\n}\n/**\n * Get all timezones formatted for use in a Select component.\n *\n * @returns Array of timezone options with value and display name\n *\n * @example\n * const options = getTimezoneOptions();\n * // [{ value: 'Africa/Abidjan', name: 'Africa / Abidjan (GMT)' }, ...]\n */\nexport function getTimezoneOptions() {\n const timezones = getAllTimezones();\n return timezones.map(tz => ({\n value: tz,\n name: formatTimezoneForDisplay(tz),\n }));\n}\n/**\n * Get commonly used US timezones formatted for Select component.\n * Useful for quick timezone selection when most users are in the US.\n *\n * @returns Array of common US timezone options\n *\n * @example\n * const options = getCommonUSTimezoneOptions();\n * // [{ value: 'America/Los_Angeles', name: 'America / Los Angeles (PST)' }, ...]\n */\nexport function getCommonUSTimezoneOptions() {\n const commonTimezones = [\n 'America/Los_Angeles',\n 'America/Denver',\n 'America/Phoenix',\n 'America/Chicago',\n 'America/New_York',\n 'America/Anchorage',\n 'Pacific/Honolulu',\n ];\n return commonTimezones.map(tz => ({\n value: tz,\n name: formatTimezoneForDisplay(tz),\n }));\n}\n","/**\n * @module constants\n * @summary Useful constants\n * @description\n * Collection of useful date constants.\n *\n * The constants could be imported from `date-fns/constants`:\n *\n * ```ts\n * import { maxTime, minTime } from \"./constants/date-fns/constants\";\n *\n * function isAllowedTime(time) {\n * return time <= maxTime && time >= minTime;\n * }\n * ```\n */\n\n/**\n * @constant\n * @name daysInWeek\n * @summary Days in 1 week.\n */\nexport const daysInWeek = 7;\n\n/**\n * @constant\n * @name daysInYear\n * @summary Days in 1 year.\n *\n * @description\n * How many days in a year.\n *\n * One years equals 365.2425 days according to the formula:\n *\n * > Leap year occurs every 4 years, except for years that are divisible by 100 and not divisible by 400.\n * > 1 mean year = (365+1/4-1/100+1/400) days = 365.2425 days\n */\nexport const daysInYear = 365.2425;\n\n/**\n * @constant\n * @name maxTime\n * @summary Maximum allowed time.\n *\n * @example\n * import { maxTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = 8640000000000001 <= maxTime;\n * //=> false\n *\n * new Date(8640000000000001);\n * //=> Invalid Date\n */\nexport const maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000;\n\n/**\n * @constant\n * @name minTime\n * @summary Minimum allowed time.\n *\n * @example\n * import { minTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = -8640000000000001 >= minTime;\n * //=> false\n *\n * new Date(-8640000000000001)\n * //=> Invalid Date\n */\nexport const minTime = -maxTime;\n\n/**\n * @constant\n * @name millisecondsInWeek\n * @summary Milliseconds in 1 week.\n */\nexport const millisecondsInWeek = 604800000;\n\n/**\n * @constant\n * @name millisecondsInDay\n * @summary Milliseconds in 1 day.\n */\nexport const millisecondsInDay = 86400000;\n\n/**\n * @constant\n * @name millisecondsInMinute\n * @summary Milliseconds in 1 minute\n */\nexport const millisecondsInMinute = 60000;\n\n/**\n * @constant\n * @name millisecondsInHour\n * @summary Milliseconds in 1 hour\n */\nexport const millisecondsInHour = 3600000;\n\n/**\n * @constant\n * @name millisecondsInSecond\n * @summary Milliseconds in 1 second\n */\nexport const millisecondsInSecond = 1000;\n\n/**\n * @constant\n * @name minutesInYear\n * @summary Minutes in 1 year.\n */\nexport const minutesInYear = 525600;\n\n/**\n * @constant\n * @name minutesInMonth\n * @summary Minutes in 1 month.\n */\nexport const minutesInMonth = 43200;\n\n/**\n * @constant\n * @name minutesInDay\n * @summary Minutes in 1 day.\n */\nexport const minutesInDay = 1440;\n\n/**\n * @constant\n * @name minutesInHour\n * @summary Minutes in 1 hour.\n */\nexport const minutesInHour = 60;\n\n/**\n * @constant\n * @name monthsInQuarter\n * @summary Months in 1 quarter.\n */\nexport const monthsInQuarter = 3;\n\n/**\n * @constant\n * @name monthsInYear\n * @summary Months in 1 year.\n */\nexport const monthsInYear = 12;\n\n/**\n * @constant\n * @name quartersInYear\n * @summary Quarters in 1 year\n */\nexport const quartersInYear = 4;\n\n/**\n * @constant\n * @name secondsInHour\n * @summary Seconds in 1 hour.\n */\nexport const secondsInHour = 3600;\n\n/**\n * @constant\n * @name secondsInMinute\n * @summary Seconds in 1 minute.\n */\nexport const secondsInMinute = 60;\n\n/**\n * @constant\n * @name secondsInDay\n * @summary Seconds in 1 day.\n */\nexport const secondsInDay = secondsInHour * 24;\n\n/**\n * @constant\n * @name secondsInWeek\n * @summary Seconds in 1 week.\n */\nexport const secondsInWeek = secondsInDay * 7;\n\n/**\n * @constant\n * @name secondsInYear\n * @summary Seconds in 1 year.\n */\nexport const secondsInYear = secondsInDay * daysInYear;\n\n/**\n * @constant\n * @name secondsInMonth\n * @summary Seconds in 1 month\n */\nexport const secondsInMonth = secondsInYear / 12;\n\n/**\n * @constant\n * @name secondsInQuarter\n * @summary Seconds in 1 quarter.\n */\nexport const secondsInQuarter = secondsInMonth * 3;\n\n/**\n * @constant\n * @name constructFromSymbol\n * @summary Symbol enabling Date extensions to inherit properties from the reference date.\n *\n * The symbol is used to enable the `constructFrom` function to construct a date\n * using a reference date and a value. It allows to transfer extra properties\n * from the reference date to the new date. It's useful for extensions like\n * [`TZDate`](https://github.com/date-fns/tz) that accept a time zone as\n * a constructor argument.\n */\nexport const constructFromSymbol = Symbol.for(\"constructDateFrom\");\n","import { constructFromSymbol } from \"./constants.js\";\n\n/**\n * @name constructFrom\n * @category Generic Helpers\n * @summary Constructs a date using the reference date and the value\n *\n * @description\n * The function constructs a new date using the constructor from the reference\n * date and the given value. It helps to build generic functions that accept\n * date extensions.\n *\n * It defaults to `Date` if the passed reference date is a number or a string.\n *\n * Starting from v3.7.0, it allows to construct a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The reference date to take constructor from\n * @param value - The value to create the date\n *\n * @returns Date initialized using the given date and value\n *\n * @example\n * import { constructFrom } from \"./constructFrom/date-fns\";\n *\n * // A function that clones a date preserving the original type\n * function cloneDate<DateType extends Date>(date: DateType): DateType {\n * return constructFrom(\n * date, // Use constructor from the given date\n * date.getTime() // Use the date value to create a new date\n * );\n * }\n */\nexport function constructFrom(date, value) {\n if (typeof date === \"function\") return date(value);\n\n if (date && typeof date === \"object\" && constructFromSymbol in date)\n return date[constructFromSymbol](value);\n\n if (date instanceof Date) return new date.constructor(value);\n\n return new Date(value);\n}\n\n// Fallback for modularized imports:\nexport default constructFrom;\n","import { constructFrom } from \"./constructFrom.js\";\n\n/**\n * @name toDate\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If the argument is none of the above, the function returns Invalid Date.\n *\n * Starting from v3.7.0, it clones a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param argument - The value to convert\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Clone the date:\n * const result = toDate(new Date(2014, 1, 11, 11, 30, 30))\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert the timestamp to date:\n * const result = toDate(1392098430000)\n * //=> Tue Feb 11 2014 11:30:30\n */\nexport function toDate(argument, context) {\n // [TODO] Get rid of `toDate` or `constructFrom`?\n return constructFrom(context || argument, argument);\n}\n\n// Fallback for modularized imports:\nexport default toDate;\n","let defaultOptions = {};\n\nexport function getDefaultOptions() {\n return defaultOptions;\n}\n\nexport function setDefaultOptions(newOptions) {\n defaultOptions = newOptions;\n}\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfWeek} function options.\n */\n\n/**\n * @name startOfWeek\n * @category Week Helpers\n * @summary Return the start of a week for the given date.\n *\n * @description\n * Return the start of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week\n *\n * @example\n * // The start of a week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfWeek(date, options) {\n const defaultOptions = getDefaultOptions();\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const _date = toDate(date, options?.in);\n const day = _date.getDay();\n const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n\n _date.setDate(_date.getDate() - diff);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeek;\n","import { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfISOWeek} function options.\n */\n\n/**\n * @name startOfISOWeek\n * @category ISO Week Helpers\n * @summary Return the start of an ISO week for the given date.\n *\n * @description\n * Return the start of an ISO week for the given date.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week\n *\n * @example\n * // The start of an ISO week for 2 September 2014 11:55:00:\n * const result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfISOWeek(date, options) {\n return startOfWeek(date, { ...options, weekStartsOn: 1 });\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeek;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeekYear} function options.\n */\n\n/**\n * @name getISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Get the ISO week-numbering year of the given date.\n *\n * @description\n * Get the ISO week-numbering year of the given date,\n * which always starts 3 days before the year's first Thursday.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n *\n * @returns The ISO week-numbering year\n *\n * @example\n * // Which ISO-week numbering year is 2 January 2005?\n * const result = getISOWeekYear(new Date(2005, 0, 2))\n * //=> 2004\n */\nexport function getISOWeekYear(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n\n const fourthOfJanuaryOfNextYear = constructFrom(_date, 0);\n fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);\n fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);\n\n const fourthOfJanuaryOfThisYear = constructFrom(_date, 0);\n fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);\n fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);\n\n if (_date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (_date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getISOWeekYear;\n","import { toDate } from \"../toDate.js\";\n\n/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nexport function getTimezoneOffsetInMilliseconds(date) {\n const _date = toDate(date);\n const utcDate = new Date(\n Date.UTC(\n _date.getFullYear(),\n _date.getMonth(),\n _date.getDate(),\n _date.getHours(),\n _date.getMinutes(),\n _date.getSeconds(),\n _date.getMilliseconds(),\n ),\n );\n utcDate.setUTCFullYear(_date.getFullYear());\n return +date - +utcDate;\n}\n","import { constructFrom } from \"../constructFrom.js\";\n\nexport function normalizeDates(context, ...dates) {\n const normalize = constructFrom.bind(\n null,\n context || dates.find((date) => typeof date === \"object\"),\n );\n return dates.map(normalize);\n}\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfDay} function options.\n */\n\n/**\n * @name startOfDay\n * @category Day Helpers\n * @summary Return the start of a day for the given date.\n *\n * @description\n * Return the start of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a day\n *\n * @example\n * // The start of a day for 2 September 2014 11:55:00:\n * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 00:00:00\n */\nexport function startOfDay(date, options) {\n const _date = toDate(date, options?.in);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfDay;\n","import { getTimezoneOffsetInMilliseconds } from \"./_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { millisecondsInDay } from \"./constants.js\";\nimport { startOfDay } from \"./startOfDay.js\";\n\n/**\n * The {@link differenceInCalendarDays} function options.\n */\n\n/**\n * @name differenceInCalendarDays\n * @category Day Helpers\n * @summary Get the number of calendar days between the given dates.\n *\n * @description\n * Get the number of calendar days between the given dates. This means that the times are removed\n * from the dates and then the difference in days is calculated.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - The options object\n *\n * @returns The number of calendar days\n *\n * @example\n * // How many calendar days are between\n * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?\n * const result = differenceInCalendarDays(\n * new Date(2012, 6, 2, 0, 0),\n * new Date(2011, 6, 2, 23, 0)\n * )\n * //=> 366\n * // How many calendar days are between\n * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?\n * const result = differenceInCalendarDays(\n * new Date(2011, 6, 3, 0, 1),\n * new Date(2011, 6, 2, 23, 59)\n * )\n * //=> 1\n */\nexport function differenceInCalendarDays(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n\n const laterStartOfDay = startOfDay(laterDate_);\n const earlierStartOfDay = startOfDay(earlierDate_);\n\n const laterTimestamp =\n +laterStartOfDay - getTimezoneOffsetInMilliseconds(laterStartOfDay);\n const earlierTimestamp =\n +earlierStartOfDay - getTimezoneOffsetInMilliseconds(earlierStartOfDay);\n\n // Round the number of days to the nearest integer because the number of\n // milliseconds in a day is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round((laterTimestamp - earlierTimestamp) / millisecondsInDay);\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarDays;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { getISOWeekYear } from \"./getISOWeekYear.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\n\n/**\n * The {@link startOfISOWeekYear} function options.\n */\n\n/**\n * @name startOfISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Return the start of an ISO week-numbering year for the given date.\n *\n * @description\n * Return the start of an ISO week-numbering year,\n * which always starts 3 days before the year's first Thursday.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week-numbering year\n *\n * @example\n * // The start of an ISO week-numbering year for 2 July 2005:\n * const result = startOfISOWeekYear(new Date(2005, 6, 2))\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfISOWeekYear(date, options) {\n const year = getISOWeekYear(date, options);\n const fourthOfJanuary = constructFrom(options?.in || date, 0);\n fourthOfJanuary.setFullYear(year, 0, 4);\n fourthOfJanuary.setHours(0, 0, 0, 0);\n return startOfISOWeek(fourthOfJanuary);\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeekYear;\n","/**\n * @name isDate\n * @category Common Helpers\n * @summary Is the given value a date?\n *\n * @description\n * Returns true if the given value is an instance of Date. The function works for dates transferred across iframes.\n *\n * @param value - The value to check\n *\n * @returns True if the given value is a date\n *\n * @example\n * // For a valid date:\n * const result = isDate(new Date())\n * //=> true\n *\n * @example\n * // For an invalid date:\n * const result = isDate(new Date(NaN))\n * //=> true\n *\n * @example\n * // For some value:\n * const result = isDate('2014-02-31')\n * //=> false\n *\n * @example\n * // For an object:\n * const result = isDate({})\n * //=> false\n */\nexport function isDate(value) {\n return (\n value instanceof Date ||\n (typeof value === \"object\" &&\n Object.prototype.toString.call(value) === \"[object Date]\")\n );\n}\n\n// Fallback for modularized imports:\nexport default isDate;\n","import { isDate } from \"./isDate.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * @name isValid\n * @category Common Helpers\n * @summary Is the given date valid?\n *\n * @description\n * Returns false if argument is Invalid Date and true otherwise.\n * Argument is converted to Date using `toDate`. See [toDate](https://date-fns.org/docs/toDate)\n * Invalid Date is a Date, whose time value is NaN.\n *\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * @param date - The date to check\n *\n * @returns The date is valid\n *\n * @example\n * // For the valid date:\n * const result = isValid(new Date(2014, 1, 31))\n * //=> true\n *\n * @example\n * // For the value, convertible into a date:\n * const result = isValid(1393804800000)\n * //=> true\n *\n * @example\n * // For the invalid date:\n * const result = isValid(new Date(''))\n * //=> false\n */\nexport function isValid(date) {\n return !((!isDate(date) && typeof date !== \"number\") || isNaN(+toDate(date)));\n}\n\n// Fallback for modularized imports:\nexport default isValid;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfYear} function options.\n */\n\n/**\n * @name startOfYear\n * @category Year Helpers\n * @summary Return the start of a year for the given date.\n *\n * @description\n * Return the start of a year for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a year\n *\n * @example\n * // The start of a year for 2 September 2014 11:55:00:\n * const result = startOfYear(new Date(2014, 8, 2, 11, 55, 00))\n * //=> Wed Jan 01 2014 00:00:00\n */\nexport function startOfYear(date, options) {\n const date_ = toDate(date, options?.in);\n date_.setFullYear(date_.getFullYear(), 0, 1);\n date_.setHours(0, 0, 0, 0);\n return date_;\n}\n\n// Fallback for modularized imports:\nexport default startOfYear;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"less than a second\",\n other: \"less than {{count}} seconds\",\n },\n\n xSeconds: {\n one: \"1 second\",\n other: \"{{count}} seconds\",\n },\n\n halfAMinute: \"half a minute\",\n\n lessThanXMinutes: {\n one: \"less than a minute\",\n other: \"less than {{count}} minutes\",\n },\n\n xMinutes: {\n one: \"1 minute\",\n other: \"{{count}} minutes\",\n },\n\n aboutXHours: {\n one: \"about 1 hour\",\n other: \"about {{count}} hours\",\n },\n\n xHours: {\n one: \"1 hour\",\n other: \"{{count}} hours\",\n },\n\n xDays: {\n one: \"1 day\",\n other: \"{{count}} days\",\n },\n\n aboutXWeeks: {\n one: \"about 1 week\",\n other: \"about {{count}} weeks\",\n },\n\n xWeeks: {\n one: \"1 week\",\n other: \"{{count}} weeks\",\n },\n\n aboutXMonths: {\n one: \"about 1 month\",\n other: \"about {{count}} months\",\n },\n\n xMonths: {\n one: \"1 month\",\n other: \"{{count}} months\",\n },\n\n aboutXYears: {\n one: \"about 1 year\",\n other: \"about {{count}} years\",\n },\n\n xYears: {\n one: \"1 year\",\n other: \"{{count}} years\",\n },\n\n overXYears: {\n one: \"over 1 year\",\n other: \"over {{count}} years\",\n },\n\n almostXYears: {\n one: \"almost 1 year\",\n other: \"almost {{count}} years\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", count.toString());\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"in \" + result;\n } else {\n return result + \" ago\";\n }\n }\n\n return result;\n};\n","export function buildFormatLongFn(args) {\n return (options = {}) => {\n // TODO: Remove String()\n const width = options.width ? String(options.width) : args.defaultWidth;\n const format = args.formats[width] || args.formats[args.defaultWidth];\n return format;\n };\n}\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.js\";\n\nconst dateFormats = {\n full: \"EEEE, MMMM do, y\",\n long: \"MMMM do, y\",\n medium: \"MMM d, y\",\n short: \"MM/dd/yyyy\",\n};\n\nconst timeFormats = {\n full: \"h:mm:ss a zzzz\",\n long: \"h:mm:ss a z\",\n medium: \"h:mm:ss a\",\n short: \"h:mm a\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'at' {{time}}\",\n long: \"{{date}} 'at' {{time}}\",\n medium: \"{{date}}, {{time}}\",\n short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: \"'last' eeee 'at' p\",\n yesterday: \"'yesterday at' p\",\n today: \"'today at' p\",\n tomorrow: \"'tomorrow at' p\",\n nextWeek: \"eeee 'at' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","/**\n * The localize function argument callback which allows to convert raw value to\n * the actual type.\n *\n * @param value - The value to convert\n *\n * @returns The converted value\n */\n\n/**\n * The map of localized values for each width.\n */\n\n/**\n * The index type of the locale unit value. It types conversion of units of\n * values that don't start at 0 (i.e. quarters).\n */\n\n/**\n * Converts the unit value to the tuple of values.\n */\n\n/**\n * The tuple of localized era values. The first element represents BC,\n * the second element represents AD.\n */\n\n/**\n * The tuple of localized quarter values. The first element represents Q1.\n */\n\n/**\n * The tuple of localized day values. The first element represents Sunday.\n */\n\n/**\n * The tuple of localized month values. The first element represents January.\n */\n\nexport function buildLocalizeFn(args) {\n return (value, options) => {\n const context = options?.context ? String(options.context) : \"standalone\";\n\n let valuesArray;\n if (context === \"formatting\" && args.formattingValues) {\n const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;\n const width = options?.width ? String(options.width) : defaultWidth;\n\n valuesArray =\n args.formattingValues[width] || args.formattingValues[defaultWidth];\n } else {\n const defaultWidth = args.defaultWidth;\n const width = options?.width ? String(options.width) : args.defaultWidth;\n\n valuesArray = args.values[width] || args.values[defaultWidth];\n }\n const index = args.argumentCallback ? args.argumentCallback(value) : value;\n\n // @ts-expect-error - For some reason TypeScript just don't want to match it, no matter how hard we try. I challenge you to try to remove it!\n return valuesArray[index];\n };\n}\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.js\";\n\nconst eraValues = {\n narrow: [\"B\", \"A\"],\n abbreviated: [\"BC\", \"AD\"],\n wide: [\"Before Christ\", \"Anno Domini\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n wide: [\"1st quarter\", \"2nd quarter\", \"3rd quarter\", \"4th quarter\"],\n};\n\n// Note: in English, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\nconst monthValues = {\n narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n abbreviated: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ],\n\n wide: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n short: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"],\n abbreviated: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n wide: [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n ],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, _options) => {\n const number = Number(dirtyNumber);\n\n // If ordinal numbers depend on context, for example,\n // if they are different for different grammatical genders,\n // use `options.unit`.\n //\n // `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear',\n // 'day', 'hour', 'minute', 'second'.\n\n const rem100 = number % 100;\n if (rem100 > 20 || rem100 < 10) {\n switch (rem100 % 10) {\n case 1:\n return number + \"st\";\n case 2:\n return number + \"nd\";\n case 3:\n return number + \"rd\";\n }\n }\n return number + \"th\";\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","export function buildMatchFn(args) {\n return (string, options = {}) => {\n const width = options.width;\n\n const matchPattern =\n (width && args.matchPatterns[width]) ||\n args.matchPatterns[args.defaultMatchWidth];\n const matchResult = string.match(matchPattern);\n\n if (!matchResult) {\n return null;\n }\n const matchedString = matchResult[0];\n\n const parsePatterns =\n (width && args.parsePatterns[width]) ||\n args.parsePatterns[args.defaultParseWidth];\n\n const key = Array.isArray(parsePatterns)\n ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString))\n : // [TODO] -- I challenge you to fix the type\n findKey(parsePatterns, (pattern) => pattern.test(matchedString));\n\n let value;\n\n value = args.valueCallback ? args.valueCallback(key) : key;\n value = options.valueCallback\n ? // [TODO] -- I challenge you to fix the type\n options.valueCallback(value)\n : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n\nfunction findKey(object, predicate) {\n for (const key in object) {\n if (\n Object.prototype.hasOwnProperty.call(object, key) &&\n predicate(object[key])\n ) {\n return key;\n }\n }\n return undefined;\n}\n\nfunction findIndex(array, predicate) {\n for (let key = 0; key < array.length; key++) {\n if (predicate(array[key])) {\n return key;\n }\n }\n return undefined;\n}\n","export function buildMatchPatternFn(args) {\n return (string, options = {}) => {\n const matchResult = string.match(args.matchPattern);\n if (!matchResult) return null;\n const matchedString = matchResult[0];\n\n const parseResult = string.match(args.parsePattern);\n if (!parseResult) return null;\n let value = args.valueCallback\n ? args.valueCallback(parseResult[0])\n : parseResult[0];\n\n // [TODO] I challenge you to fix the type\n value = options.valueCallback ? options.valueCallback(value) : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.js\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.js\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(th|st|nd|rd)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(b|a)/i,\n abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n wide: /^(before christ|before common era|anno domini|common era)/i,\n};\nconst parseEraPatterns = {\n any: [/^b/i, /^(a|c)/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](th|st|nd|rd)? quarter/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^j/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^j/i,\n /^j/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^ja/i,\n /^f/i,\n /^mar/i,\n /^ap/i,\n /^may/i,\n /^jun/i,\n /^jul/i,\n /^au/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[smtwf]/i,\n short: /^(su|mo|tu|we|th|fr|sa)/i,\n abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i,\n};\nconst parseDayPatterns = {\n narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],\n any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n any: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mi/i,\n noon: /^no/i,\n morning: /morning/i,\n afternoon: /afternoon/i,\n evening: /evening/i,\n night: /night/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value, 10),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { formatDistance } from \"./en-US/_lib/formatDistance.js\";\nimport { formatLong } from \"./en-US/_lib/formatLong.js\";\nimport { formatRelative } from \"./en-US/_lib/formatRelative.js\";\nimport { localize } from \"./en-US/_lib/localize.js\";\nimport { match } from \"./en-US/_lib/match.js\";\n\n/**\n * @category Locales\n * @summary English locale (United States).\n * @language English\n * @iso-639-2 eng\n * @author Sasha Koss [@kossnocorp](https://github.com/kossnocorp)\n * @author Lesha Koss [@leshakoss](https://github.com/leshakoss)\n */\nexport const enUS = {\n code: \"en-US\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0 /* Sunday */,\n firstWeekContainsDate: 1,\n },\n};\n\n// Fallback for modularized imports:\nexport default enUS;\n","import { differenceInCalendarDays } from \"./differenceInCalendarDays.js\";\nimport { startOfYear } from \"./startOfYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getDayOfYear} function options.\n */\n\n/**\n * @name getDayOfYear\n * @category Day Helpers\n * @summary Get the day of the year of the given date.\n *\n * @description\n * Get the day of the year of the given date.\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The day of year\n *\n * @example\n * // Which day of the year is 2 July 2014?\n * const result = getDayOfYear(new Date(2014, 6, 2))\n * //=> 183\n */\nexport function getDayOfYear(date, options) {\n const _date = toDate(date, options?.in);\n const diff = differenceInCalendarDays(_date, startOfYear(_date));\n const dayOfYear = diff + 1;\n return dayOfYear;\n}\n\n// Fallback for modularized imports:\nexport default getDayOfYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { startOfISOWeekYear } from \"./startOfISOWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeek} function options.\n */\n\n/**\n * @name getISOWeek\n * @category ISO Week Helpers\n * @summary Get the ISO week of the given date.\n *\n * @description\n * Get the ISO week of the given date.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The ISO week\n *\n * @example\n * // Which week of the ISO-week numbering year is 2 January 2005?\n * const result = getISOWeek(new Date(2005, 0, 2))\n * //=> 53\n */\nexport function getISOWeek(date, options) {\n const _date = toDate(date, options?.in);\n const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getISOWeek;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeekYear} function options.\n */\n\n/**\n * @name getWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Get the local week-numbering year of the given date.\n *\n * @description\n * Get the local week-numbering year of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options.\n *\n * @returns The local week-numbering year\n *\n * @example\n * // Which week numbering year is 26 December 2004 with the default settings?\n * const result = getWeekYear(new Date(2004, 11, 26))\n * //=> 2005\n *\n * @example\n * // Which week numbering year is 26 December 2004 if week starts on Saturday?\n * const result = getWeekYear(new Date(2004, 11, 26), { weekStartsOn: 6 })\n * //=> 2004\n *\n * @example\n * // Which week numbering year is 26 December 2004 if the first week contains 4 January?\n * const result = getWeekYear(new Date(2004, 11, 26), { firstWeekContainsDate: 4 })\n * //=> 2004\n */\nexport function getWeekYear(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const firstWeekOfNextYear = constructFrom(options?.in || date, 0);\n firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);\n firstWeekOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);\n\n const firstWeekOfThisYear = constructFrom(options?.in || date, 0);\n firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);\n firstWeekOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);\n\n if (+_date >= +startOfNextYear) {\n return year + 1;\n } else if (+_date >= +startOfThisYear) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getWeekYear;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { getWeekYear } from \"./getWeekYear.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfWeekYear} function options.\n */\n\n/**\n * @name startOfWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Return the start of a local week-numbering year for the given date.\n *\n * @description\n * Return the start of a local week-numbering year.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week-numbering year\n *\n * @example\n * // The start of an a week-numbering year for 2 July 2005 with default settings:\n * const result = startOfWeekYear(new Date(2005, 6, 2))\n * //=> Sun Dec 26 2004 00:00:00\n *\n * @example\n * // The start of a week-numbering year for 2 July 2005\n * // if Monday is the first day of week\n * // and 4 January is always in the first week of the year:\n * const result = startOfWeekYear(new Date(2005, 6, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfWeekYear(date, options) {\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const year = getWeekYear(date, options);\n const firstWeek = constructFrom(options?.in || date, 0);\n firstWeek.setFullYear(year, 0, firstWeekContainsDate);\n firstWeek.setHours(0, 0, 0, 0);\n const _date = startOfWeek(firstWeek, options);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeekYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { startOfWeekYear } from \"./startOfWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeek} function options.\n */\n\n/**\n * @name getWeek\n * @category Week Helpers\n * @summary Get the local week index of the given date.\n *\n * @description\n * Get the local week index of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The week\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005 with default options?\n * const result = getWeek(new Date(2005, 0, 2))\n * //=> 2\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005,\n * // if Monday is the first day of the week,\n * // and the first week of the year always contains 4 January?\n * const result = getWeek(new Date(2005, 0, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> 53\n */\nexport function getWeek(date, options) {\n const _date = toDate(date, options?.in);\n const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getWeek;\n","export function addLeadingZeros(number, targetLength) {\n const sign = number < 0 ? \"-\" : \"\";\n const output = Math.abs(number).toString().padStart(targetLength, \"0\");\n return sign + output;\n}\n","import { addLeadingZeros } from \"../addLeadingZeros.js\";\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | |\n * | d | Day of month | D | |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | m | Minute | M | Month |\n * | s | Second | S | Fraction of second |\n * | y | Year (abs) | Y | |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n */\n\nexport const lightFormatters = {\n // Year\n y(date, token) {\n // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_tokens\n // | Year | y | yy | yyy | yyyy | yyyyy |\n // |----------|-------|----|-------|-------|-------|\n // | AD 1 | 1 | 01 | 001 | 0001 | 00001 |\n // | AD 12 | 12 | 12 | 012 | 0012 | 00012 |\n // | AD 123 | 123 | 23 | 123 | 0123 | 00123 |\n // | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 |\n // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\n\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return addLeadingZeros(token === \"yy\" ? year % 100 : year, token.length);\n },\n\n // Month\n M(date, token) {\n const month = date.getMonth();\n return token === \"M\" ? String(month + 1) : addLeadingZeros(month + 1, 2);\n },\n\n // Day of the month\n d(date, token) {\n return addLeadingZeros(date.getDate(), token.length);\n },\n\n // AM or PM\n a(date, token) {\n const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return dayPeriodEnumValue.toUpperCase();\n case \"aaa\":\n return dayPeriodEnumValue;\n case \"aaaaa\":\n return dayPeriodEnumValue[0];\n case \"aaaa\":\n default:\n return dayPeriodEnumValue === \"am\" ? \"a.m.\" : \"p.m.\";\n }\n },\n\n // Hour [1-12]\n h(date, token) {\n return addLeadingZeros(date.getHours() % 12 || 12, token.length);\n },\n\n // Hour [0-23]\n H(date, token) {\n return addLeadingZeros(date.getHours(), token.length);\n },\n\n // Minute\n m(date, token) {\n return addLeadingZeros(date.getMinutes(), token.length);\n },\n\n // Second\n s(date, token) {\n return addLeadingZeros(date.getSeconds(), token.length);\n },\n\n // Fraction of second\n S(date, token) {\n const numberOfDigits = token.length;\n const milliseconds = date.getMilliseconds();\n const fractionalSeconds = Math.trunc(\n milliseconds * Math.pow(10, numberOfDigits - 3),\n );\n return addLeadingZeros(fractionalSeconds, token.length);\n },\n};\n","import { getDayOfYear } from \"../../getDayOfYear.js\";\nimport { getISOWeek } from \"../../getISOWeek.js\";\nimport { getISOWeekYear } from \"../../getISOWeekYear.js\";\nimport { getWeek } from \"../../getWeek.js\";\nimport { getWeekYear } from \"../../getWeekYear.js\";\n\nimport { addLeadingZeros } from \"../addLeadingZeros.js\";\nimport { lightFormatters } from \"./lightFormatters.js\";\n\nconst dayPeriodEnum = {\n am: \"am\",\n pm: \"pm\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n};\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | Milliseconds in day |\n * | b | AM, PM, noon, midnight | B | Flexible day period |\n * | c | Stand-alone local day of week | C* | Localized hour w/ day period |\n * | d | Day of month | D | Day of year |\n * | e | Local day of week | E | Day of week |\n * | f | | F* | Day of week in month |\n * | g* | Modified Julian day | G | Era |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | i! | ISO day of week | I! | ISO week of year |\n * | j* | Localized hour w/ day period | J* | Localized hour w/o day period |\n * | k | Hour [1-24] | K | Hour [0-11] |\n * | l* | (deprecated) | L | Stand-alone month |\n * | m | Minute | M | Month |\n * | n | | N | |\n * | o! | Ordinal number modifier | O | Timezone (GMT) |\n * | p! | Long localized time | P! | Long localized date |\n * | q | Stand-alone quarter | Q | Quarter |\n * | r* | Related Gregorian year | R! | ISO week-numbering year |\n * | s | Second | S | Fraction of second |\n * | t! | Seconds timestamp | T! | Milliseconds timestamp |\n * | u | Extended year | U* | Cyclic year |\n * | v* | Timezone (generic non-locat.) | V* | Timezone (location) |\n * | w | Local week of year | W* | Week of month |\n * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) |\n * | y | Year (abs) | Y | Local week-numbering year |\n * | z | Timezone (specific non-locat.) | Z* | Timezone (aliases) |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `format` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n * i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n * `R` is supposed to be used in conjunction with `I` and `i`\n * for universal ISO week-numbering date, whereas\n * `Y` is supposed to be used in conjunction with `w` and `e`\n * for week-numbering date specific to the locale.\n * - `P` is long localized date format\n * - `p` is long localized time format\n */\n\nexport const formatters = {\n // Era\n G: function (date, token, localize) {\n const era = date.getFullYear() > 0 ? 1 : 0;\n switch (token) {\n // AD, BC\n case \"G\":\n case \"GG\":\n case \"GGG\":\n return localize.era(era, { width: \"abbreviated\" });\n // A, B\n case \"GGGGG\":\n return localize.era(era, { width: \"narrow\" });\n // Anno Domini, Before Christ\n case \"GGGG\":\n default:\n return localize.era(era, { width: \"wide\" });\n }\n },\n\n // Year\n y: function (date, token, localize) {\n // Ordinal number\n if (token === \"yo\") {\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return localize.ordinalNumber(year, { unit: \"year\" });\n }\n\n return lightFormatters.y(date, token);\n },\n\n // Local week-numbering year\n Y: function (date, token, localize, options) {\n const signedWeekYear = getWeekYear(date, options);\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;\n\n // Two digit year\n if (token === \"YY\") {\n const twoDigitYear = weekYear % 100;\n return addLeadingZeros(twoDigitYear, 2);\n }\n\n // Ordinal number\n if (token === \"Yo\") {\n return localize.ordinalNumber(weekYear, { unit: \"year\" });\n }\n\n // Padding\n return addLeadingZeros(weekYear, token.length);\n },\n\n // ISO week-numbering year\n R: function (date, token) {\n const isoWeekYear = getISOWeekYear(date);\n\n // Padding\n return addLeadingZeros(isoWeekYear, token.length);\n },\n\n // Extended year. This is a single number designating the year of this calendar system.\n // The main difference between `y` and `u` localizers are B.C. years:\n // | Year | `y` | `u` |\n // |------|-----|-----|\n // | AC 1 | 1 | 1 |\n // | BC 1 | 1 | 0 |\n // | BC 2 | 2 | -1 |\n // Also `yy` always returns the last two digits of a year,\n // while `uu` pads single digit years to 2 characters and returns other years unchanged.\n u: function (date, token) {\n const year = date.getFullYear();\n return addLeadingZeros(year, token.length);\n },\n\n // Quarter\n Q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"Q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"QQ\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"Qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"QQQ\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"QQQQQ\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"QQQQ\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone quarter\n q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"qq\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"qqq\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"qqqqq\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"qqqq\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // Month\n M: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n case \"M\":\n case \"MM\":\n return lightFormatters.M(date, token);\n // 1st, 2nd, ..., 12th\n case \"Mo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"MMM\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // J, F, ..., D\n case \"MMMMM\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // January, February, ..., December\n case \"MMMM\":\n default:\n return localize.month(month, { width: \"wide\", context: \"formatting\" });\n }\n },\n\n // Stand-alone month\n L: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n // 1, 2, ..., 12\n case \"L\":\n return String(month + 1);\n // 01, 02, ..., 12\n case \"LL\":\n return addLeadingZeros(month + 1, 2);\n // 1st, 2nd, ..., 12th\n case \"Lo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"LLL\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // J, F, ..., D\n case \"LLLLL\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // January, February, ..., December\n case \"LLLL\":\n default:\n return localize.month(month, { width: \"wide\", context: \"standalone\" });\n }\n },\n\n // Local week of year\n w: function (date, token, localize, options) {\n const week = getWeek(date, options);\n\n if (token === \"wo\") {\n return localize.ordinalNumber(week, { unit: \"week\" });\n }\n\n return addLeadingZeros(week, token.length);\n },\n\n // ISO week of year\n I: function (date, token, localize) {\n const isoWeek = getISOWeek(date);\n\n if (token === \"Io\") {\n return localize.ordinalNumber(isoWeek, { unit: \"week\" });\n }\n\n return addLeadingZeros(isoWeek, token.length);\n },\n\n // Day of the month\n d: function (date, token, localize) {\n if (token === \"do\") {\n return localize.ordinalNumber(date.getDate(), { unit: \"date\" });\n }\n\n return lightFormatters.d(date, token);\n },\n\n // Day of year\n D: function (date, token, localize) {\n const dayOfYear = getDayOfYear(date);\n\n if (token === \"Do\") {\n return localize.ordinalNumber(dayOfYear, { unit: \"dayOfYear\" });\n }\n\n return addLeadingZeros(dayOfYear, token.length);\n },\n\n // Day of week\n E: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n switch (token) {\n // Tue\n case \"E\":\n case \"EE\":\n case \"EEE\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"EEEEE\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"EEEEEE\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"EEEE\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Local day of week\n e: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (Nth day of week with current locale or weekStartsOn)\n case \"e\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"ee\":\n return addLeadingZeros(localDayOfWeek, 2);\n // 1st, 2nd, ..., 7th\n case \"eo\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"eee\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"eeeee\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"eeeeee\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"eeee\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone local day of week\n c: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (same as in `e`)\n case \"c\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"cc\":\n return addLeadingZeros(localDayOfWeek, token.length);\n // 1st, 2nd, ..., 7th\n case \"co\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"ccc\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // T\n case \"ccccc\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // Tu\n case \"cccccc\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"standalone\",\n });\n // Tuesday\n case \"cccc\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // ISO day of week\n i: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;\n switch (token) {\n // 2\n case \"i\":\n return String(isoDayOfWeek);\n // 02\n case \"ii\":\n return addLeadingZeros(isoDayOfWeek, token.length);\n // 2nd\n case \"io\":\n return localize.ordinalNumber(isoDayOfWeek, { unit: \"day\" });\n // Tue\n case \"iii\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"iiiii\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"iiiiii\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"iiii\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM or PM\n a: function (date, token, localize) {\n const hours = date.getHours();\n const dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"aaa\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"aaaaa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"aaaa\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM, PM, midnight, noon\n b: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours === 12) {\n dayPeriodEnumValue = dayPeriodEnum.noon;\n } else if (hours === 0) {\n dayPeriodEnumValue = dayPeriodEnum.midnight;\n } else {\n dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n }\n\n switch (token) {\n case \"b\":\n case \"bb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"bbb\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"bbbbb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"bbbb\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // in the morning, in the afternoon, in the evening, at night\n B: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours >= 17) {\n dayPeriodEnumValue = dayPeriodEnum.evening;\n } else if (hours >= 12) {\n dayPeriodEnumValue = dayPeriodEnum.afternoon;\n } else if (hours >= 4) {\n dayPeriodEnumValue = dayPeriodEnum.morning;\n } else {\n dayPeriodEnumValue = dayPeriodEnum.night;\n }\n\n switch (token) {\n case \"B\":\n case \"BB\":\n case \"BBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"BBBBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"BBBB\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Hour [1-12]\n h: function (date, token, localize) {\n if (token === \"ho\") {\n let hours = date.getHours() % 12;\n if (hours === 0) hours = 12;\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return lightFormatters.h(date, token);\n },\n\n // Hour [0-23]\n H: function (date, token, localize) {\n if (token === \"Ho\") {\n return localize.ordinalNumber(date.getHours(), { unit: \"hour\" });\n }\n\n return lightFormatters.H(date, token);\n },\n\n // Hour [0-11]\n K: function (date, token, localize) {\n const hours = date.getHours() % 12;\n\n if (token === \"Ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Hour [1-24]\n k: function (date, token, localize) {\n let hours = date.getHours();\n if (hours === 0) hours = 24;\n\n if (token === \"ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Minute\n m: function (date, token, localize) {\n if (token === \"mo\") {\n return localize.ordinalNumber(date.getMinutes(), { unit: \"minute\" });\n }\n\n return lightFormatters.m(date, token);\n },\n\n // Second\n s: function (date, token, localize) {\n if (token === \"so\") {\n return localize.ordinalNumber(date.getSeconds(), { unit: \"second\" });\n }\n\n return lightFormatters.s(date, token);\n },\n\n // Fraction of second\n S: function (date, token) {\n return lightFormatters.S(date, token);\n },\n\n // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)\n X: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n if (timezoneOffset === 0) {\n return \"Z\";\n }\n\n switch (token) {\n // Hours and optional minutes\n case \"X\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XX`\n case \"XXXX\":\n case \"XX\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XXX`\n case \"XXXXX\":\n case \"XXX\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)\n x: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Hours and optional minutes\n case \"x\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xx`\n case \"xxxx\":\n case \"xx\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xxx`\n case \"xxxxx\":\n case \"xxx\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (GMT)\n O: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"O\":\n case \"OO\":\n case \"OOO\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"OOOO\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (specific non-location)\n z: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"z\":\n case \"zz\":\n case \"zzz\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"zzzz\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Seconds timestamp\n t: function (date, token, _localize) {\n const timestamp = Math.trunc(+date / 1000);\n return addLeadingZeros(timestamp, token.length);\n },\n\n // Milliseconds timestamp\n T: function (date, token, _localize) {\n return addLeadingZeros(+date, token.length);\n },\n};\n\nfunction formatTimezoneShort(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = Math.trunc(absOffset / 60);\n const minutes = absOffset % 60;\n if (minutes === 0) {\n return sign + String(hours);\n }\n return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);\n}\n\nfunction formatTimezoneWithOptionalMinutes(offset, delimiter) {\n if (offset % 60 === 0) {\n const sign = offset > 0 ? \"-\" : \"+\";\n return sign + addLeadingZeros(Math.abs(offset) / 60, 2);\n }\n return formatTimezone(offset, delimiter);\n}\n\nfunction formatTimezone(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2);\n const minutes = addLeadingZeros(absOffset % 60, 2);\n return sign + hours + delimiter + minutes;\n}\n","const dateLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"P\":\n return formatLong.date({ width: \"short\" });\n case \"PP\":\n return formatLong.date({ width: \"medium\" });\n case \"PPP\":\n return formatLong.date({ width: \"long\" });\n case \"PPPP\":\n default:\n return formatLong.date({ width: \"full\" });\n }\n};\n\nconst timeLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"p\":\n return formatLong.time({ width: \"short\" });\n case \"pp\":\n return formatLong.time({ width: \"medium\" });\n case \"ppp\":\n return formatLong.time({ width: \"long\" });\n case \"pppp\":\n default:\n return formatLong.time({ width: \"full\" });\n }\n};\n\nconst dateTimeLongFormatter = (pattern, formatLong) => {\n const matchResult = pattern.match(/(P+)(p+)?/) || [];\n const datePattern = matchResult[1];\n const timePattern = matchResult[2];\n\n if (!timePattern) {\n return dateLongFormatter(pattern, formatLong);\n }\n\n let dateTimeFormat;\n\n switch (datePattern) {\n case \"P\":\n dateTimeFormat = formatLong.dateTime({ width: \"short\" });\n break;\n case \"PP\":\n dateTimeFormat = formatLong.dateTime({ width: \"medium\" });\n break;\n case \"PPP\":\n dateTimeFormat = formatLong.dateTime({ width: \"long\" });\n break;\n case \"PPPP\":\n default:\n dateTimeFormat = formatLong.dateTime({ width: \"full\" });\n break;\n }\n\n return dateTimeFormat\n .replace(\"{{date}}\", dateLongFormatter(datePattern, formatLong))\n .replace(\"{{time}}\", timeLongFormatter(timePattern, formatLong));\n};\n\nexport const longFormatters = {\n p: timeLongFormatter,\n P: dateTimeLongFormatter,\n};\n","const dayOfYearTokenRE = /^D+$/;\nconst weekYearTokenRE = /^Y+$/;\n\nconst throwTokens = [\"D\", \"DD\", \"YY\", \"YYYY\"];\n\nexport function isProtectedDayOfYearToken(token) {\n return dayOfYearTokenRE.test(token);\n}\n\nexport function isProtectedWeekYearToken(token) {\n return weekYearTokenRE.test(token);\n}\n\nexport function warnOrThrowProtectedError(token, format, input) {\n const _message = message(token, format, input);\n console.warn(_message);\n if (throwTokens.includes(token)) throw new RangeError(_message);\n}\n\nfunction message(token, format, input) {\n const subject = token[0] === \"Y\" ? \"years\" : \"days of the month\";\n return `Use \\`${token.toLowerCase()}\\` instead of \\`${token}\\` (in \\`${format}\\`) for formatting ${subject} to the input \\`${input}\\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`;\n}\n","import { defaultLocale } from \"./_lib/defaultLocale.js\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { formatters } from \"./_lib/format/formatters.js\";\nimport { longFormatters } from \"./_lib/format/longFormatters.js\";\nimport {\n isProtectedDayOfYearToken,\n isProtectedWeekYearToken,\n warnOrThrowProtectedError,\n} from \"./_lib/protectedTokens.js\";\nimport { isValid } from \"./isValid.js\";\nimport { toDate } from \"./toDate.js\";\n\n// Rexports of internal for libraries to use.\n// See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874\nexport { formatters, longFormatters };\n\n// This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n// (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n// except a single quote symbol, which ends the sequence.\n// Two quote characters do not end the sequence.\n// If there is no matching single quote\n// then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\nconst formattingTokensRegExp =\n /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n// This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\nconst longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\n\nconst escapedStringRegExp = /^'([^]*?)'?$/;\nconst doubleQuoteRegExp = /''/g;\nconst unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n\nexport { format as formatDate };\n\n/**\n * The {@link format} function options.\n */\n\n/**\n * @name format\n * @alias formatDate\n * @category Common Helpers\n * @summary Format the date.\n *\n * @description\n * Return the formatted date string in the given format. The result may vary by locale.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * The characters wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n * (see the last example)\n *\n * Format of the string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 7 below the table).\n *\n * Accepted patterns:\n * | Unit | Pattern | Result examples | Notes |\n * |---------------------------------|---------|-----------------------------------|-------|\n * | Era | G..GGG | AD, BC | |\n * | | GGGG | Anno Domini, Before Christ | 2 |\n * | | GGGGG | A, B | |\n * | Calendar year | y | 44, 1, 1900, 2017 | 5 |\n * | | yo | 44th, 1st, 0th, 17th | 5,7 |\n * | | yy | 44, 01, 00, 17 | 5 |\n * | | yyy | 044, 001, 1900, 2017 | 5 |\n * | | yyyy | 0044, 0001, 1900, 2017 | 5 |\n * | | yyyyy | ... | 3,5 |\n * | Local week-numbering year | Y | 44, 1, 1900, 2017 | 5 |\n * | | Yo | 44th, 1st, 1900th, 2017th | 5,7 |\n * | | YY | 44, 01, 00, 17 | 5,8 |\n * | | YYY | 044, 001, 1900, 2017 | 5 |\n * | | YYYY | 0044, 0001, 1900, 2017 | 5,8 |\n * | | YYYYY | ... | 3,5 |\n * | ISO week-numbering year | R | -43, 0, 1, 1900, 2017 | 5,7 |\n * | | RR | -43, 00, 01, 1900, 2017 | 5,7 |\n * | | RRR | -043, 000, 001, 1900, 2017 | 5,7 |\n * | | RRRR | -0043, 0000, 0001, 1900, 2017 | 5,7 |\n * | | RRRRR | ... | 3,5,7 |\n * | Extended year | u | -43, 0, 1, 1900, 2017 | 5 |\n * | | uu | -43, 01, 1900, 2017 | 5 |\n * | | uuu | -043, 001, 1900, 2017 | 5 |\n * | | uuuu | -0043, 0001, 1900, 2017 | 5 |\n * | | uuuuu | ... | 3,5 |\n * | Quarter (formatting) | Q | 1, 2, 3, 4 | |\n * | | Qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | QQ | 01, 02, 03, 04 | |\n * | | QQQ | Q1, Q2, Q3, Q4 | |\n * | | QQQQ | 1st quarter, 2nd quarter, ... | 2 |\n * | | QQQQQ | 1, 2, 3, 4 | 4 |\n * | Quarter (stand-alone) | q | 1, 2, 3, 4 | |\n * | | qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | qq | 01, 02, 03, 04 | |\n * | | qqq | Q1, Q2, Q3, Q4 | |\n * | | qqqq | 1st quarter, 2nd quarter, ... | 2 |\n * | | qqqqq | 1, 2, 3, 4 | 4 |\n * | Month (formatting) | M | 1, 2, ..., 12 | |\n * | | Mo | 1st, 2nd, ..., 12th | 7 |\n * | | MM | 01, 02, ..., 12 | |\n * | | MMM | Jan, Feb, ..., Dec | |\n * | | MMMM | January, February, ..., December | 2 |\n * | | MMMMM | J, F, ..., D | |\n * | Month (stand-alone) | L | 1, 2, ..., 12 | |\n * | | Lo | 1st, 2nd, ..., 12th | 7 |\n * | | LL | 01, 02, ..., 12 | |\n * | | LLL | Jan, Feb, ..., Dec | |\n * | | LLLL | January, February, ..., December | 2 |\n * | | LLLLL | J, F, ..., D | |\n * | Local week of year | w | 1, 2, ..., 53 | |\n * | | wo | 1st, 2nd, ..., 53th | 7 |\n * | | ww | 01, 02, ..., 53 | |\n * | ISO week of year | I | 1, 2, ..., 53 | 7 |\n * | | Io | 1st, 2nd, ..., 53th | 7 |\n * | | II | 01, 02, ..., 53 | 7 |\n * | Day of month | d | 1, 2, ..., 31 | |\n * | | do | 1st, 2nd, ..., 31st | 7 |\n * | | dd | 01, 02, ..., 31 | |\n * | Day of year | D | 1, 2, ..., 365, 366 | 9 |\n * | | Do | 1st, 2nd, ..., 365th, 366th | 7 |\n * | | DD | 01, 02, ..., 365, 366 | 9 |\n * | | DDD | 001, 002, ..., 365, 366 | |\n * | | DDDD | ... | 3 |\n * | Day of week (formatting) | E..EEE | Mon, Tue, Wed, ..., Sun | |\n * | | EEEE | Monday, Tuesday, ..., Sunday | 2 |\n * | | EEEEE | M, T, W, T, F, S, S | |\n * | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | ISO day of week (formatting) | i | 1, 2, 3, ..., 7 | 7 |\n * | | io | 1st, 2nd, ..., 7th | 7 |\n * | | ii | 01, 02, ..., 07 | 7 |\n * | | iii | Mon, Tue, Wed, ..., Sun | 7 |\n * | | iiii | Monday, Tuesday, ..., Sunday | 2,7 |\n * | | iiiii | M, T, W, T, F, S, S | 7 |\n * | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 7 |\n * | Local day of week (formatting) | e | 2, 3, 4, ..., 1 | |\n * | | eo | 2nd, 3rd, ..., 1st | 7 |\n * | | ee | 02, 03, ..., 01 | |\n * | | eee | Mon, Tue, Wed, ..., Sun | |\n * | | eeee | Monday, Tuesday, ..., Sunday | 2 |\n * | | eeeee | M, T, W, T, F, S, S | |\n * | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | Local day of week (stand-alone) | c | 2, 3, 4, ..., 1 | |\n * | | co | 2nd, 3rd, ..., 1st | 7 |\n * | | cc | 02, 03, ..., 01 | |\n * | | ccc | Mon, Tue, Wed, ..., Sun | |\n * | | cccc | Monday, Tuesday, ..., Sunday | 2 |\n * | | ccccc | M, T, W, T, F, S, S | |\n * | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | AM, PM | a..aa | AM, PM | |\n * | | aaa | am, pm | |\n * | | aaaa | a.m., p.m. | 2 |\n * | | aaaaa | a, p | |\n * | AM, PM, noon, midnight | b..bb | AM, PM, noon, midnight | |\n * | | bbb | am, pm, noon, midnight | |\n * | | bbbb | a.m., p.m., noon, midnight | 2 |\n * | | bbbbb | a, p, n, mi | |\n * | Flexible day period | B..BBB | at night, in the morning, ... | |\n * | | BBBB | at night, in the morning, ... | 2 |\n * | | BBBBB | at night, in the morning, ... | |\n * | Hour [1-12] | h | 1, 2, ..., 11, 12 | |\n * | | ho | 1st, 2nd, ..., 11th, 12th | 7 |\n * | | hh | 01, 02, ..., 11, 12 | |\n * | Hour [0-23] | H | 0, 1, 2, ..., 23 | |\n * | | Ho | 0th, 1st, 2nd, ..., 23rd | 7 |\n * | | HH | 00, 01, 02, ..., 23 | |\n * | Hour [0-11] | K | 1, 2, ..., 11, 0 | |\n * | | Ko | 1st, 2nd, ..., 11th, 0th | 7 |\n * | | KK | 01, 02, ..., 11, 00 | |\n * | Hour [1-24] | k | 24, 1, 2, ..., 23 | |\n * | | ko | 24th, 1st, 2nd, ..., 23rd | 7 |\n * | | kk | 24, 01, 02, ..., 23 | |\n * | Minute | m | 0, 1, ..., 59 | |\n * | | mo | 0th, 1st, ..., 59th | 7 |\n * | | mm | 00, 01, ..., 59 | |\n * | Second | s | 0, 1, ..., 59 | |\n * | | so | 0th, 1st, ..., 59th | 7 |\n * | | ss | 00, 01, ..., 59 | |\n * | Fraction of second | S | 0, 1, ..., 9 | |\n * | | SS | 00, 01, ..., 99 | |\n * | | SSS | 000, 001, ..., 999 | |\n * | | SSSS | ... | 3 |\n * | Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | |\n * | | XX | -0800, +0530, Z | |\n * | | XXX | -08:00, +05:30, Z | |\n * | | XXXX | -0800, +0530, Z, +123456 | 2 |\n * | | XXXXX | -08:00, +05:30, Z, +12:34:56 | |\n * | Timezone (ISO-8601 w/o Z) | x | -08, +0530, +00 | |\n * | | xx | -0800, +0530, +0000 | |\n * | | xxx | -08:00, +05:30, +00:00 | 2 |\n * | | xxxx | -0800, +0530, +0000, +123456 | |\n * | | xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |\n * | Timezone (GMT) | O...OOO | GMT-8, GMT+5:30, GMT+0 | |\n * | | OOOO | GMT-08:00, GMT+05:30, GMT+00:00 | 2 |\n * | Timezone (specific non-locat.) | z...zzz | GMT-8, GMT+5:30, GMT+0 | 6 |\n * | | zzzz | GMT-08:00, GMT+05:30, GMT+00:00 | 2,6 |\n * | Seconds timestamp | t | 512969520 | 7 |\n * | | tt | ... | 3,7 |\n * | Milliseconds timestamp | T | 512969520900 | 7 |\n * | | TT | ... | 3,7 |\n * | Long localized date | P | 04/29/1453 | 7 |\n * | | PP | Apr 29, 1453 | 7 |\n * | | PPP | April 29th, 1453 | 7 |\n * | | PPPP | Friday, April 29th, 1453 | 2,7 |\n * | Long localized time | p | 12:00 AM | 7 |\n * | | pp | 12:00:00 AM | 7 |\n * | | ppp | 12:00:00 AM GMT+2 | 7 |\n * | | pppp | 12:00:00 AM GMT+02:00 | 2,7 |\n * | Combination of date and time | Pp | 04/29/1453, 12:00 AM | 7 |\n * | | PPpp | Apr 29, 1453, 12:00:00 AM | 7 |\n * | | PPPppp | April 29th, 1453 at ... | 7 |\n * | | PPPPpppp| Friday, April 29th, 1453 at ... | 2,7 |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n * are the same as \"stand-alone\" units, but are different in some languages.\n * \"Formatting\" units are declined according to the rules of the language\n * in the context of a date. \"Stand-alone\" units are always nominative singular:\n *\n * `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n * `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n * the single quote characters (see below).\n * If the sequence is longer than listed in table (e.g. `EEEEEEEEEEE`)\n * the output will be the same as default pattern for this unit, usually\n * the longest one (in case of ISO weekdays, `EEEE`). Default patterns for units\n * are marked with \"2\" in the last column of the table.\n *\n * `format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'`\n *\n * `format(new Date(2017, 10, 6), 'MMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'`\n *\n * 3. Some patterns could be unlimited length (such as `yyyyyyyy`).\n * The output will be padded with zeros to match the length of the pattern.\n *\n * `format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'`\n *\n * 4. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n * These tokens represent the shortest form of the quarter.\n *\n * 5. The main difference between `y` and `u` patterns are B.C. years:\n *\n * | Year | `y` | `u` |\n * |------|-----|-----|\n * | AC 1 | 1 | 1 |\n * | BC 1 | 1 | 0 |\n * | BC 2 | 2 | -1 |\n *\n * Also `yy` always returns the last two digits of a year,\n * while `uu` pads single digit years to 2 characters and returns other years unchanged:\n *\n * | Year | `yy` | `uu` |\n * |------|------|------|\n * | 1 | 01 | 01 |\n * | 14 | 14 | 14 |\n * | 376 | 76 | 376 |\n * | 1453 | 53 | 1453 |\n *\n * The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n * except local week-numbering years are dependent on `options.weekStartsOn`\n * and `options.firstWeekContainsDate` (compare [getISOWeekYear](https://date-fns.org/docs/getISOWeekYear)\n * and [getWeekYear](https://date-fns.org/docs/getWeekYear)).\n *\n * 6. Specific non-location timezones are currently unavailable in `date-fns`,\n * so right now these tokens fall back to GMT timezones.\n *\n * 7. These patterns are not in the Unicode Technical Standard #35:\n * - `i`: ISO day of week\n * - `I`: ISO week of year\n * - `R`: ISO week-numbering year\n * - `t`: seconds timestamp\n * - `T`: milliseconds timestamp\n * - `o`: ordinal number modifier\n * - `P`: long localized date\n * - `p`: long localized time\n *\n * 8. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 9. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * @param date - The original date\n * @param format - The string of tokens\n * @param options - An object with options\n *\n * @returns The formatted date string\n *\n * @throws `date` must not be Invalid Date\n * @throws `options.locale` must contain `localize` property\n * @throws `options.locale` must contain `formatLong` property\n * @throws use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws format string contains an unescaped latin alphabet character\n *\n * @example\n * // Represent 11 February 2014 in middle-endian format:\n * const result = format(new Date(2014, 1, 11), 'MM/dd/yyyy')\n * //=> '02/11/2014'\n *\n * @example\n * // Represent 2 July 2014 in Esperanto:\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = format(new Date(2014, 6, 2), \"do 'de' MMMM yyyy\", {\n * locale: eoLocale\n * })\n * //=> '2-a de julio 2014'\n *\n * @example\n * // Escape string by single quote characters:\n * const result = format(new Date(2014, 6, 2, 15), \"h 'o''clock'\")\n * //=> \"3 o'clock\"\n */\nexport function format(date, formatStr, options) {\n const defaultOptions = getDefaultOptions();\n const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const originalDate = toDate(date, options?.in);\n\n if (!isValid(originalDate)) {\n throw new RangeError(\"Invalid time value\");\n }\n\n let parts = formatStr\n .match(longFormattingTokensRegExp)\n .map((substring) => {\n const firstCharacter = substring[0];\n if (firstCharacter === \"p\" || firstCharacter === \"P\") {\n const longFormatter = longFormatters[firstCharacter];\n return longFormatter(substring, locale.formatLong);\n }\n return substring;\n })\n .join(\"\")\n .match(formattingTokensRegExp)\n .map((substring) => {\n // Replace two single quote characters with one single quote character\n if (substring === \"''\") {\n return { isToken: false, value: \"'\" };\n }\n\n const firstCharacter = substring[0];\n if (firstCharacter === \"'\") {\n return { isToken: false, value: cleanEscapedString(substring) };\n }\n\n if (formatters[firstCharacter]) {\n return { isToken: true, value: substring };\n }\n\n if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n throw new RangeError(\n \"Format string contains an unescaped latin alphabet character `\" +\n firstCharacter +\n \"`\",\n );\n }\n\n return { isToken: false, value: substring };\n });\n\n // invoke localize preprocessor (only for french locales at the moment)\n if (locale.localize.preprocessor) {\n parts = locale.localize.preprocessor(originalDate, parts);\n }\n\n const formatterOptions = {\n firstWeekContainsDate,\n weekStartsOn,\n locale,\n };\n\n return parts\n .map((part) => {\n if (!part.isToken) return part.value;\n\n const token = part.value;\n\n if (\n (!options?.useAdditionalWeekYearTokens &&\n isProtectedWeekYearToken(token)) ||\n (!options?.useAdditionalDayOfYearTokens &&\n isProtectedDayOfYearToken(token))\n ) {\n warnOrThrowProtectedError(token, formatStr, String(date));\n }\n\n const formatter = formatters[token[0]];\n return formatter(originalDate, token, locale.localize, formatterOptions);\n })\n .join(\"\");\n}\n\nfunction cleanEscapedString(input) {\n const matched = input.match(escapedStringRegExp);\n\n if (!matched) {\n return input;\n }\n\n return matched[1].replace(doubleQuoteRegExp, \"'\");\n}\n\n// Fallback for modularized imports:\nexport default format;\n","/**\n * Returns the [year, month, day, hour, minute, seconds] tokens of the provided\n * `date` as it will be rendered in the `timeZone`.\n */\nexport function tzTokenizeDate(date, timeZone) {\n const dtf = getDateTimeFormat(timeZone);\n return 'formatToParts' in dtf ? partsOffset(dtf, date) : hackyOffset(dtf, date);\n}\nconst typeToPos = {\n year: 0,\n month: 1,\n day: 2,\n hour: 3,\n minute: 4,\n second: 5,\n};\nfunction partsOffset(dtf, date) {\n try {\n const formatted = dtf.formatToParts(date);\n const filled = [];\n for (let i = 0; i < formatted.length; i++) {\n const pos = typeToPos[formatted[i].type];\n if (pos !== undefined) {\n filled[pos] = parseInt(formatted[i].value, 10);\n }\n }\n return filled;\n }\n catch (error) {\n if (error instanceof RangeError) {\n return [NaN];\n }\n throw error;\n }\n}\nfunction hackyOffset(dtf, date) {\n const formatted = dtf.format(date);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const parsed = /(\\d+)\\/(\\d+)\\/(\\d+),? (\\d+):(\\d+):(\\d+)/.exec(formatted);\n // const [, fMonth, fDay, fYear, fHour, fMinute, fSecond] = parsed\n // return [fYear, fMonth, fDay, fHour, fMinute, fSecond]\n return [\n parseInt(parsed[3], 10),\n parseInt(parsed[1], 10),\n parseInt(parsed[2], 10),\n parseInt(parsed[4], 10),\n parseInt(parsed[5], 10),\n parseInt(parsed[6], 10),\n ];\n}\n// Get a cached Intl.DateTimeFormat instance for the IANA `timeZone`. This can be used\n// to get deterministic local date/time output according to the `en-US` locale which\n// can be used to extract local time parts as necessary.\nconst dtfCache = {};\n// New browsers use `hourCycle`, IE and Chrome <73 does not support it and uses `hour12`\nconst testDateFormatted = new Intl.DateTimeFormat('en-US', {\n hourCycle: 'h23',\n timeZone: 'America/New_York',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n}).format(new Date('2014-06-25T04:00:00.123Z'));\nconst hourCycleSupported = testDateFormatted === '06/25/2014, 00:00:00' ||\n testDateFormatted === '06/25/2014 00:00:00';\nfunction getDateTimeFormat(timeZone) {\n if (!dtfCache[timeZone]) {\n dtfCache[timeZone] = hourCycleSupported\n ? new Intl.DateTimeFormat('en-US', {\n hourCycle: 'h23',\n timeZone: timeZone,\n year: 'numeric',\n month: 'numeric',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n })\n : new Intl.DateTimeFormat('en-US', {\n hour12: false,\n timeZone: timeZone,\n year: 'numeric',\n month: 'numeric',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n }\n return dtfCache[timeZone];\n}\n","/**\n * Use instead of `new Date(Date.UTC(...))` to support years below 100 which doesn't work\n * otherwise due to the nature of the\n * [`Date` constructor](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#interpretation_of_two-digit_years.\n *\n * For `Date.UTC(...)`, use `newDateUTC(...).getTime()`.\n */\nexport function newDateUTC(fullYear, month, day, hour, minute, second, millisecond) {\n const utcDate = new Date(0);\n utcDate.setUTCFullYear(fullYear, month, day);\n utcDate.setUTCHours(hour, minute, second, millisecond);\n return utcDate;\n}\n","import { tzTokenizeDate } from '../tzTokenizeDate/index.js';\nimport { newDateUTC } from '../newDateUTC/index.js';\nconst MILLISECONDS_IN_HOUR = 3600000;\nconst MILLISECONDS_IN_MINUTE = 60000;\nconst patterns = {\n timezone: /([Z+-].*)$/,\n timezoneZ: /^(Z)$/,\n timezoneHH: /^([+-]\\d{2})$/,\n timezoneHHMM: /^([+-])(\\d{2}):?(\\d{2})$/,\n};\n// Parse constious time zone offset formats to an offset in milliseconds\nexport function tzParseTimezone(timezoneString, date, isUtcDate) {\n // Empty string\n if (!timezoneString) {\n return 0;\n }\n // Z\n let token = patterns.timezoneZ.exec(timezoneString);\n if (token) {\n return 0;\n }\n let hours;\n let absoluteOffset;\n // ±hh\n token = patterns.timezoneHH.exec(timezoneString);\n if (token) {\n hours = parseInt(token[1], 10);\n if (!validateTimezone(hours)) {\n return NaN;\n }\n return -(hours * MILLISECONDS_IN_HOUR);\n }\n // ±hh:mm or ±hhmm\n token = patterns.timezoneHHMM.exec(timezoneString);\n if (token) {\n hours = parseInt(token[2], 10);\n const minutes = parseInt(token[3], 10);\n if (!validateTimezone(hours, minutes)) {\n return NaN;\n }\n absoluteOffset = Math.abs(hours) * MILLISECONDS_IN_HOUR + minutes * MILLISECONDS_IN_MINUTE;\n return token[1] === '+' ? -absoluteOffset : absoluteOffset;\n }\n // IANA time zone\n if (isValidTimezoneIANAString(timezoneString)) {\n date = new Date(date || Date.now());\n const utcDate = isUtcDate ? date : toUtcDate(date);\n const offset = calcOffset(utcDate, timezoneString);\n const fixedOffset = isUtcDate ? offset : fixOffset(date, offset, timezoneString);\n return -fixedOffset;\n }\n return NaN;\n}\nfunction toUtcDate(date) {\n return newDateUTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n}\nfunction calcOffset(date, timezoneString) {\n const tokens = tzTokenizeDate(date, timezoneString);\n // ms dropped because it's not provided by tzTokenizeDate\n const asUTC = newDateUTC(tokens[0], tokens[1] - 1, tokens[2], tokens[3] % 24, tokens[4], tokens[5], 0).getTime();\n let asTS = date.getTime();\n const over = asTS % 1000;\n asTS -= over >= 0 ? over : 1000 + over;\n return asUTC - asTS;\n}\nfunction fixOffset(date, offset, timezoneString) {\n const localTS = date.getTime();\n // Our UTC time is just a guess because our offset is just a guess\n let utcGuess = localTS - offset;\n // Test whether the zone matches the offset for this ts\n const o2 = calcOffset(new Date(utcGuess), timezoneString);\n // If so, offset didn't change, and we're done\n if (offset === o2) {\n return offset;\n }\n // If not, change the ts by the difference in the offset\n utcGuess -= o2 - offset;\n // If that gives us the local time we want, we're done\n const o3 = calcOffset(new Date(utcGuess), timezoneString);\n if (o2 === o3) {\n return o2;\n }\n // If it's different, we're in a hole time. The offset has changed, but we don't adjust the time\n return Math.max(o2, o3);\n}\nfunction validateTimezone(hours, minutes) {\n return -23 <= hours && hours <= 23 && (minutes == null || (0 <= minutes && minutes <= 59));\n}\nconst validIANATimezoneCache = {};\nfunction isValidTimezoneIANAString(timeZoneString) {\n if (validIANATimezoneCache[timeZoneString])\n return true;\n try {\n new Intl.DateTimeFormat(undefined, { timeZone: timeZoneString });\n validIANATimezoneCache[timeZoneString] = true;\n return true;\n }\n catch (error) {\n return false;\n }\n}\n","/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nexport function getTimezoneOffsetInMilliseconds(date) {\n const utcDate = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()));\n utcDate.setUTCFullYear(date.getFullYear());\n return +date - +utcDate;\n}\n","/** Regex to identify the presence of a time zone specifier in a date string */\nexport const tzPattern = /(Z|[+-]\\d{2}(?::?\\d{2})?| UTC| [a-zA-Z]+\\/[a-zA-Z_]+(?:\\/[a-zA-Z_]+)?)$/;\n","import { getTimezoneOffsetInMilliseconds } from '../_lib/getTimezoneOffsetInMilliseconds/index.js';\nimport { tzParseTimezone } from '../_lib/tzParseTimezone/index.js';\nimport { tzPattern } from '../_lib/tzPattern/index.js';\nconst MILLISECONDS_IN_HOUR = 3600000;\nconst MILLISECONDS_IN_MINUTE = 60000;\nconst DEFAULT_ADDITIONAL_DIGITS = 2;\nconst patterns = {\n dateTimePattern: /^([0-9W+-]+)(T| )(.*)/,\n datePattern: /^([0-9W+-]+)(.*)/,\n plainTime: /:/,\n // year tokens\n YY: /^(\\d{2})$/,\n YYY: [\n /^([+-]\\d{2})$/, // 0 additional digits\n /^([+-]\\d{3})$/, // 1 additional digit\n /^([+-]\\d{4})$/, // 2 additional digits\n ],\n YYYY: /^(\\d{4})/,\n YYYYY: [\n /^([+-]\\d{4})/, // 0 additional digits\n /^([+-]\\d{5})/, // 1 additional digit\n /^([+-]\\d{6})/, // 2 additional digits\n ],\n // date tokens\n MM: /^-(\\d{2})$/,\n DDD: /^-?(\\d{3})$/,\n MMDD: /^-?(\\d{2})-?(\\d{2})$/,\n Www: /^-?W(\\d{2})$/,\n WwwD: /^-?W(\\d{2})-?(\\d{1})$/,\n HH: /^(\\d{2}([.,]\\d*)?)$/,\n HHMM: /^(\\d{2}):?(\\d{2}([.,]\\d*)?)$/,\n HHMMSS: /^(\\d{2}):?(\\d{2}):?(\\d{2}([.,]\\d*)?)$/,\n // time zone tokens (to identify the presence of a tz)\n timeZone: tzPattern,\n};\n/**\n * @name toDate\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If an argument is a string, the function tries to parse it.\n * Function accepts complete ISO 8601 formats as well as partial implementations.\n * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601\n * If the function cannot parse the string or the values are invalid, it returns Invalid Date.\n *\n * If the argument is none of the above, the function returns Invalid Date.\n *\n * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n * All *date-fns* functions will throw `RangeError` if `options.additionalDigits` is not 0, 1, 2 or undefined.\n *\n * @param argument the value to convert\n * @param options the object with options. See [Options]{@link https://date-fns.org/docs/Options}\n * @param {0|1|2} [options.additionalDigits=2] - the additional number of digits in the extended year format\n * @param {string} [options.timeZone=''] - used to specify the IANA time zone offset of a date String.\n *\n * @returns the parsed date in the local time zone\n * @throws {TypeError} 1 argument required\n * @throws {RangeError} `options.additionalDigits` must be 0, 1 or 2\n *\n * @example\n * // Convert string '2014-02-11T11:30:30' to date:\n * const result = toDate('2014-02-11T11:30:30')\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert string '+02014101' to date,\n * // if the additional number of digits in the extended year format is 1:\n * const result = toDate('+02014101', {additionalDigits: 1})\n * //=> Fri Apr 11 2014 00:00:00\n */\nexport function toDate(argument, options = {}) {\n if (arguments.length < 1) {\n throw new TypeError('1 argument required, but only ' + arguments.length + ' present');\n }\n if (argument === null) {\n return new Date(NaN);\n }\n const additionalDigits = options.additionalDigits == null ? DEFAULT_ADDITIONAL_DIGITS : Number(options.additionalDigits);\n if (additionalDigits !== 2 && additionalDigits !== 1 && additionalDigits !== 0) {\n throw new RangeError('additionalDigits must be 0, 1 or 2');\n }\n // Clone the date\n if (argument instanceof Date ||\n (typeof argument === 'object' && Object.prototype.toString.call(argument) === '[object Date]')) {\n // Prevent the date to lose the milliseconds when passed to new Date() in IE10\n return new Date(argument.getTime());\n }\n else if (typeof argument === 'number' ||\n Object.prototype.toString.call(argument) === '[object Number]') {\n return new Date(argument);\n }\n else if (!(Object.prototype.toString.call(argument) === '[object String]')) {\n return new Date(NaN);\n }\n const dateStrings = splitDateString(argument);\n const { year, restDateString } = parseYear(dateStrings.date, additionalDigits);\n const date = parseDate(restDateString, year);\n if (date === null || isNaN(date.getTime())) {\n return new Date(NaN);\n }\n if (date) {\n const timestamp = date.getTime();\n let time = 0;\n let offset;\n if (dateStrings.time) {\n time = parseTime(dateStrings.time);\n if (time === null || isNaN(time)) {\n return new Date(NaN);\n }\n }\n if (dateStrings.timeZone || options.timeZone) {\n offset = tzParseTimezone(dateStrings.timeZone || options.timeZone, new Date(timestamp + time));\n if (isNaN(offset)) {\n return new Date(NaN);\n }\n }\n else {\n // get offset accurate to hour in time zones that change offset\n offset = getTimezoneOffsetInMilliseconds(new Date(timestamp + time));\n offset = getTimezoneOffsetInMilliseconds(new Date(timestamp + time + offset));\n }\n return new Date(timestamp + time + offset);\n }\n else {\n return new Date(NaN);\n }\n}\nfunction splitDateString(dateString) {\n const dateStrings = {};\n let parts = patterns.dateTimePattern.exec(dateString);\n let timeString;\n if (!parts) {\n parts = patterns.datePattern.exec(dateString);\n if (parts) {\n dateStrings.date = parts[1];\n timeString = parts[2];\n }\n else {\n dateStrings.date = null;\n timeString = dateString;\n }\n }\n else {\n dateStrings.date = parts[1];\n timeString = parts[3];\n }\n if (timeString) {\n const token = patterns.timeZone.exec(timeString);\n if (token) {\n dateStrings.time = timeString.replace(token[1], '');\n dateStrings.timeZone = token[1].trim();\n }\n else {\n dateStrings.time = timeString;\n }\n }\n return dateStrings;\n}\nfunction parseYear(dateString, additionalDigits) {\n if (dateString) {\n const patternYYY = patterns.YYY[additionalDigits];\n const patternYYYYY = patterns.YYYYY[additionalDigits];\n // YYYY or ±YYYYY\n let token = patterns.YYYY.exec(dateString) || patternYYYYY.exec(dateString);\n if (token) {\n const yearString = token[1];\n return {\n year: parseInt(yearString, 10),\n restDateString: dateString.slice(yearString.length),\n };\n }\n // YY or ±YYY\n token = patterns.YY.exec(dateString) || patternYYY.exec(dateString);\n if (token) {\n const centuryString = token[1];\n return {\n year: parseInt(centuryString, 10) * 100,\n restDateString: dateString.slice(centuryString.length),\n };\n }\n }\n // Invalid ISO-formatted year\n return {\n year: null,\n };\n}\nfunction parseDate(dateString, year) {\n // Invalid ISO-formatted year\n if (year === null) {\n return null;\n }\n let date;\n let month;\n let week;\n // YYYY\n if (!dateString || !dateString.length) {\n date = new Date(0);\n date.setUTCFullYear(year);\n return date;\n }\n // YYYY-MM\n let token = patterns.MM.exec(dateString);\n if (token) {\n date = new Date(0);\n month = parseInt(token[1], 10) - 1;\n if (!validateDate(year, month)) {\n return new Date(NaN);\n }\n date.setUTCFullYear(year, month);\n return date;\n }\n // YYYY-DDD or YYYYDDD\n token = patterns.DDD.exec(dateString);\n if (token) {\n date = new Date(0);\n const dayOfYear = parseInt(token[1], 10);\n if (!validateDayOfYearDate(year, dayOfYear)) {\n return new Date(NaN);\n }\n date.setUTCFullYear(year, 0, dayOfYear);\n return date;\n }\n // yyyy-MM-dd or YYYYMMDD\n token = patterns.MMDD.exec(dateString);\n if (token) {\n date = new Date(0);\n month = parseInt(token[1], 10) - 1;\n const day = parseInt(token[2], 10);\n if (!validateDate(year, month, day)) {\n return new Date(NaN);\n }\n date.setUTCFullYear(year, month, day);\n return date;\n }\n // YYYY-Www or YYYYWww\n token = patterns.Www.exec(dateString);\n if (token) {\n week = parseInt(token[1], 10) - 1;\n if (!validateWeekDate(week)) {\n return new Date(NaN);\n }\n return dayOfISOWeekYear(year, week);\n }\n // YYYY-Www-D or YYYYWwwD\n token = patterns.WwwD.exec(dateString);\n if (token) {\n week = parseInt(token[1], 10) - 1;\n const dayOfWeek = parseInt(token[2], 10) - 1;\n if (!validateWeekDate(week, dayOfWeek)) {\n return new Date(NaN);\n }\n return dayOfISOWeekYear(year, week, dayOfWeek);\n }\n // Invalid ISO-formatted date\n return null;\n}\nfunction parseTime(timeString) {\n let hours;\n let minutes;\n // hh\n let token = patterns.HH.exec(timeString);\n if (token) {\n hours = parseFloat(token[1].replace(',', '.'));\n if (!validateTime(hours)) {\n return NaN;\n }\n return (hours % 24) * MILLISECONDS_IN_HOUR;\n }\n // hh:mm or hhmm\n token = patterns.HHMM.exec(timeString);\n if (token) {\n hours = parseInt(token[1], 10);\n minutes = parseFloat(token[2].replace(',', '.'));\n if (!validateTime(hours, minutes)) {\n return NaN;\n }\n return (hours % 24) * MILLISECONDS_IN_HOUR + minutes * MILLISECONDS_IN_MINUTE;\n }\n // hh:mm:ss or hhmmss\n token = patterns.HHMMSS.exec(timeString);\n if (token) {\n hours = parseInt(token[1], 10);\n minutes = parseInt(token[2], 10);\n const seconds = parseFloat(token[3].replace(',', '.'));\n if (!validateTime(hours, minutes, seconds)) {\n return NaN;\n }\n return (hours % 24) * MILLISECONDS_IN_HOUR + minutes * MILLISECONDS_IN_MINUTE + seconds * 1000;\n }\n // Invalid ISO-formatted time\n return null;\n}\nfunction dayOfISOWeekYear(isoWeekYear, week, day) {\n week = week || 0;\n day = day || 0;\n const date = new Date(0);\n date.setUTCFullYear(isoWeekYear, 0, 4);\n const fourthOfJanuaryDay = date.getUTCDay() || 7;\n const diff = week * 7 + day + 1 - fourthOfJanuaryDay;\n date.setUTCDate(date.getUTCDate() + diff);\n return date;\n}\n// Validation functions\nconst DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nconst DAYS_IN_MONTH_LEAP_YEAR = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nfunction isLeapYearIndex(year) {\n return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0);\n}\nfunction validateDate(year, month, date) {\n if (month < 0 || month > 11) {\n return false;\n }\n if (date != null) {\n if (date < 1) {\n return false;\n }\n const isLeapYear = isLeapYearIndex(year);\n if (isLeapYear && date > DAYS_IN_MONTH_LEAP_YEAR[month]) {\n return false;\n }\n if (!isLeapYear && date > DAYS_IN_MONTH[month]) {\n return false;\n }\n }\n return true;\n}\nfunction validateDayOfYearDate(year, dayOfYear) {\n if (dayOfYear < 1) {\n return false;\n }\n const isLeapYear = isLeapYearIndex(year);\n if (isLeapYear && dayOfYear > 366) {\n return false;\n }\n if (!isLeapYear && dayOfYear > 365) {\n return false;\n }\n return true;\n}\nfunction validateWeekDate(week, day) {\n if (week < 0 || week > 52) {\n return false;\n }\n if (day != null && (day < 0 || day > 6)) {\n return false;\n }\n return true;\n}\nfunction validateTime(hours, minutes, seconds) {\n if (hours < 0 || hours >= 25) {\n return false;\n }\n if (minutes != null && (minutes < 0 || minutes >= 60)) {\n return false;\n }\n if (seconds != null && (seconds < 0 || seconds >= 60)) {\n return false;\n }\n return true;\n}\n","import { tzParseTimezone } from '../_lib/tzParseTimezone/index.js';\nimport { toDate } from '../toDate/index.js';\n/**\n * @name toZonedTime\n * @category Time Zone Helpers\n * @summary Get a date/time representing local time in a given time zone from the UTC date\n *\n * @description\n * Returns a date instance with values representing the local time in the time zone\n * specified of the UTC time from the date provided. In other words, when the new date\n * is formatted it will show the equivalent hours in the target time zone regardless\n * of the current system time zone.\n *\n * @param date the date with the relevant UTC time\n * @param timeZone the time zone to get local time for, can be an offset or IANA time zone\n * @param options the object with options. See [Options]{@link https://date-fns.org/docs/Options}\n * @param {0|1|2} [options.additionalDigits=2] - passed to `toDate`. See [toDate]{@link https://date-fns.org/docs/toDate}\n *\n * @throws {TypeError} 2 arguments required\n * @throws {RangeError} `options.additionalDigits` must be 0, 1 or 2\n *\n * @example\n * // In June 10am UTC is 6am in New York (-04:00)\n * const result = toZonedTime('2014-06-25T10:00:00.000Z', 'America/New_York')\n * //=> Jun 25 2014 06:00:00\n */\nexport function toZonedTime(date, timeZone, options) {\n date = toDate(date, options);\n const offsetMilliseconds = tzParseTimezone(timeZone, date, true);\n const d = new Date(date.getTime() - offsetMilliseconds);\n const resultDate = new Date(0);\n resultDate.setFullYear(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate());\n resultDate.setHours(d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), d.getUTCMilliseconds());\n return resultDate;\n}\n","/**\n * DateTime Formatting Functions\n *\n * All formatting functions require an explicit timezone parameter.\n * No defaults - timezone must always be provided.\n *\n * @module datetime/format\n */\n// Foundational utilities: datetime/format exports timezone-aware formatters using date-fns.\n// Intl cannot produce custom format strings (e.g., \"EEEE 'at' h:mm a\") that consumers\n// expect. This module IS the canonical formatting layer for SC event/datetime display —\n// `format` and `toZonedTime` from date-fns are the foundational utilities used here.\nimport { format } from 'date-fns';\nimport { toZonedTime } from 'date-fns-tz';\nimport { toDateOnly } from '../types/brands.js';\nimport { DATE_FORMATS, DURATIONS, RELATIVE_TIME_THRESHOLDS } from './constants.js';\nimport { getUserLocale, isValidTimezone } from './timezone.js';\nimport { DateTimeError, DateTimeErrorCode } from './types.js';\n/**\n * Validates an ISO date string and returns a Date object.\n * @internal\n */\nfunction parseAndValidateISO(utcIso) {\n if (!utcIso || typeof utcIso !== 'string') {\n throw new DateTimeError('ISO date string is required', DateTimeErrorCode.INVALID_ISO_STRING, { value: utcIso });\n }\n const date = new Date(utcIso);\n if (isNaN(date.getTime())) {\n throw new DateTimeError(`Invalid ISO date string: ${utcIso}`, DateTimeErrorCode.INVALID_ISO_STRING, { value: utcIso });\n }\n return date;\n}\n/**\n * Validates timezone and returns zoned date.\n * @internal\n */\nfunction getZonedDate(utcIso, timezone) {\n if (!isValidTimezone(timezone)) {\n throw new DateTimeError(`Invalid timezone: ${timezone}`, DateTimeErrorCode.INVALID_TIMEZONE, { timezone });\n }\n const date = parseAndValidateISO(utcIso);\n return toZonedTime(date, timezone);\n}\n/**\n * Formats a UTC datetime as a time string in the specified timezone.\n *\n * @param utcIso - UTC ISO datetime string\n * @param timezone - IANA timezone ID\n * @param options - Optional formatting options\n * @returns Formatted time (e.g., \"7:00 PM\")\n * @throws {DateTimeError} If timezone or ISO string is invalid\n *\n * @example\n * formatEventTime('2023-12-25T03:00:00Z', 'America/Los_Angeles')\n * // \"7:00 PM\" (Dec 24 in LA)\n */\nexport function formatEventTime(utcIso, timezone, options) {\n const zonedDate = getZonedDate(utcIso, timezone);\n const formatStr = options?.includeSeconds\n ? DATE_FORMATS.DISPLAY_TIME_SECONDS\n : DATE_FORMATS.DISPLAY_TIME;\n return format(zonedDate, formatStr);\n}\n/**\n * Formats a UTC datetime as a date string in the specified timezone.\n *\n * @param utcIso - UTC ISO datetime string\n * @param timezone - IANA timezone ID\n * @param options - Optional formatting options\n * @returns Formatted date (e.g., \"Dec 20, 2025\")\n * @throws {DateTimeError} If timezone or ISO string is invalid\n *\n * @example\n * formatEventDate('2023-12-25T03:00:00Z', 'America/Los_Angeles')\n * // \"Dec 24, 2023\" (still Dec 24 in LA at 7 PM)\n */\nexport function formatEventDate(utcIso, timezone, options) {\n const zonedDate = getZonedDate(utcIso, timezone);\n const formatStr = options?.includeYear === false\n ? DATE_FORMATS.DISPLAY_DATE_SHORT\n : DATE_FORMATS.DISPLAY_DATE;\n return format(zonedDate, formatStr);\n}\n/**\n * **Locale-aware date-only** preset (brief 03 — migration parity, i18n).\n *\n * Short month + day + year with NO time of day — the locale-aware sibling of\n * {@link formatEventDate} (`dateOnly`). Where `formatEventDate` is pinned\n * byte-for-byte to en-US (its parity oracle), this localizes the month name to\n * the caller's locale, reproducing micdrop-frontend's i18n date helper\n * `formatDate(x, { year:'numeric', month:'short', day:'numeric' },\n * getIntlLocale(), tz)`. So localized date renders can migrate to the\n * `<Time>` primitive (`preset=\"dateOnlyLocalized\"`) with zero pixel change in\n * any locale: en-US is byte-identical to `formatEventDate` (\"Mar 14, 2026\"),\n * while other locales localize the month (\"14 mars 2026\", \"14.03.2026\").\n *\n * Uses `Intl.DateTimeFormat` directly — the canonical locale/tz-aware seam.\n * date-fns `format` cannot localize without bundling per-locale objects, and\n * `Intl` is exactly what the legacy helper used, so parity is guaranteed by\n * construction. The `<time datetime>` attribute the primitive emits stays the\n * canonical UTC ISO regardless of locale; only the human-readable body localizes.\n *\n * @param utcIso - UTC ISO datetime string\n * @param venueTz - The venue's IANA timezone ID\n * @param locale - BCP-47 locale tag. Defaults to the viewer's resolved locale\n * via {@link import('./timezone.js').getUserLocale}. An app with its own i18n\n * runtime should pass that locale explicitly (e.g. Paraglide's\n * `getIntlLocale()`); pass explicitly for SSR / deterministic output too.\n * @returns Locale-aware date-only (e.g., \"Mar 14, 2026\" / \"14 mars 2026\")\n * @throws {DateTimeError} If timezone or ISO string is invalid\n *\n * @example\n * formatDateLocalized('2026-03-15T03:00:00Z', 'America/Los_Angeles', 'en-US')\n * // \"Mar 14, 2026\"\n * formatDateLocalized('2026-03-15T03:00:00Z', 'America/Los_Angeles', 'fr-FR')\n * // \"14 mars 2026\"\n */\nexport function formatDateLocalized(utcIso, venueTz, locale = getUserLocale()) {\n // Validate inputs explicitly: this formatter passes `timeZone` straight to\n // Intl (to keep month-name localization in Intl's hands) rather than routing\n // through `getZonedDate`, so it must reproduce the same ISO + timezone guards.\n const date = parseAndValidateISO(utcIso);\n if (!isValidTimezone(venueTz)) {\n throw new DateTimeError(`Invalid timezone: ${venueTz}`, DateTimeErrorCode.INVALID_TIMEZONE, { timezone: venueTz });\n }\n return new Intl.DateTimeFormat(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n timeZone: venueTz,\n }).format(date);\n}\n/**\n * Formats a UTC datetime as a long date with weekday and ordinal day in the\n * specified timezone (e.g., \"Thursday, October 24th, 2024\").\n *\n * Timezone-required replacement for the viewer-local\n * `utils/dateHelpers.ts::formattedFullDate`. The ordinal (\"24th\", \"1st\",\n * \"2nd\", \"3rd\", \"21st\") comes from date-fns' `do` token.\n *\n * @param utcIso - UTC ISO datetime string\n * @param timezone - IANA timezone ID\n * @returns Formatted long date (e.g., \"Thursday, October 24th, 2024\")\n * @throws {DateTimeError} If timezone or ISO string is invalid\n *\n * @example\n * formatFullDate('2024-10-24T18:00:00Z', 'America/Los_Angeles')\n * // \"Thursday, October 24th, 2024\"\n */\nexport function formatFullDate(utcIso, timezone) {\n const zonedDate = getZonedDate(utcIso, timezone);\n return format(zonedDate, DATE_FORMATS.DISPLAY_FULL_DATE_ORDINAL);\n}\n/**\n * Formats a UTC datetime as a short weekday date in the specified timezone\n * (e.g., \"Thu, Oct 24\").\n *\n * Timezone-required replacement for the viewer-local\n * `utils/dateHelpers.ts::formattedDate`.\n *\n * @param utcIso - UTC ISO datetime string\n * @param timezone - IANA timezone ID\n * @returns Formatted short weekday date (e.g., \"Thu, Oct 24\")\n * @throws {DateTimeError} If timezone or ISO string is invalid\n *\n * @example\n * formatWeekdayDate('2024-10-24T18:00:00Z', 'America/Los_Angeles')\n * // \"Thu, Oct 24\"\n */\nexport function formatWeekdayDate(utcIso, timezone) {\n const zonedDate = getZonedDate(utcIso, timezone);\n return format(zonedDate, DATE_FORMATS.DISPLAY_WEEKDAY_DATE);\n}\n/**\n * Formats a UTC datetime as a full datetime string in the specified timezone.\n *\n * @param utcIso - UTC ISO datetime string\n * @param timezone - IANA timezone ID\n * @param options - Optional formatting options\n * @returns Formatted datetime (e.g., \"Dec 20, 2025 at 7:00 PM\")\n * @throws {DateTimeError} If timezone or ISO string is invalid\n *\n * @example\n * formatEventDateTime('2023-12-26T03:00:00Z', 'America/Los_Angeles')\n * // \"Dec 25, 2023 at 7:00 PM\"\n */\nexport function formatEventDateTime(utcIso, timezone, options) {\n const zonedDate = getZonedDate(utcIso, timezone);\n // Respect includeDate/includeTime options\n const includeDate = options?.includeDate !== false;\n const includeTime = options?.includeTime !== false;\n if (includeDate && includeTime) {\n return format(zonedDate, DATE_FORMATS.DISPLAY_DATETIME);\n }\n else if (includeDate && !includeTime) {\n return format(zonedDate, DATE_FORMATS.DISPLAY_DATE);\n }\n else if (!includeDate && includeTime) {\n return format(zonedDate, DATE_FORMATS.DISPLAY_TIME);\n }\n // Fallback to full datetime\n return format(zonedDate, DATE_FORMATS.DISPLAY_DATETIME);\n}\n/**\n * **Admin / absolute** datetime preset (brief 03).\n *\n * Always-absolute, always-with-year, comma-separated — the unambiguous form\n * operators read on dashboards and tables. Never relative, never friendly:\n * an admin reading a list of events needs the exact wall-clock instant in the\n * venue's zone, every row, no guessing.\n *\n * Pairs with the `<Time>` primitive's `preset=\"absolute\"`. Renders venue-local\n * (pass the venue's timezone); the `<Time>` primitive layers the conditional\n * tz label on top when the viewer's zone differs.\n *\n * @param utcIso - UTC ISO datetime string\n * @param venueTz - The venue's IANA timezone ID\n * @returns Absolute datetime (e.g., \"Mar 14, 2026, 8:00 PM\")\n * @throws {DateTimeError} If timezone or ISO string is invalid\n *\n * @example\n * formatAbsolute('2026-03-15T03:00:00Z', 'America/Los_Angeles')\n * // \"Mar 14, 2026, 8:00 PM\"\n */\nexport function formatAbsolute(utcIso, venueTz) {\n const zonedDate = getZonedDate(utcIso, venueTz);\n return format(zonedDate, DATE_FORMATS.DISPLAY_ABSOLUTE);\n}\n/**\n * **Public / friendly** full datetime preset (brief 03).\n *\n * Full weekday + month, no year, a middot before the time — the warm,\n * scannable form attendees see on public event pages\n * (\"Friday, March 14 · 8:00 PM\"). Distinct from {@link formatFullDate}\n * (which uses an ordinal day + comma and omits the time): `eventFull` joins\n * the date and time into one line with the `·` separator the public surfaces\n * decided on.\n *\n * Pairs with the `<Time>` primitive's `preset=\"eventFull\"`. Renders\n * venue-local; the primitive adds the conditional tz label.\n *\n * @param utcIso - UTC ISO datetime string\n * @param venueTz - The venue's IANA timezone ID\n * @returns Friendly full datetime (e.g., \"Friday, March 14 · 8:00 PM\")\n * @throws {DateTimeError} If timezone or ISO string is invalid\n *\n * @example\n * formatEventFull('2026-03-15T03:00:00Z', 'America/Los_Angeles')\n * // \"Friday, March 14 · 8:00 PM\"\n */\nexport function formatEventFull(utcIso, venueTz) {\n const zonedDate = getZonedDate(utcIso, venueTz);\n return format(zonedDate, DATE_FORMATS.DISPLAY_EVENT_FULL);\n}\n/**\n * **Short-weekday absolute** datetime preset (brief 03 — migration parity).\n *\n * Short weekday + short month + day + year + time, comma-separated\n * (\"Sat, Mar 14, 2026, 8:00 PM\"). This is {@link formatAbsolute} with a\n * short-weekday prefix, and it reproduces — byte-for-byte — the output of the\n * legacy viewer-local `utils/dateHelpers.ts::formatDateTime` (and the matching\n * `formatDateTime` date helper in micdrop-frontend), which formatted via `Intl`\n * with `{ weekday:'short', year:'numeric', month:'short', day:'numeric',\n * hour:'numeric', minute:'numeric', hour12:true }`. It exists so those renders\n * can migrate to the timezone-required `<Time>` primitive\n * (`preset=\"dateTimeShort\"`) with zero pixel change — the only difference being\n * that the day is now resolved in the venue's zone instead of the viewer's.\n *\n * Pairs with the `<Time>` primitive's `preset=\"dateTimeShort\"`. Renders\n * venue-local; the primitive adds the conditional tz label.\n *\n * @param utcIso - UTC ISO datetime string\n * @param venueTz - The venue's IANA timezone ID\n * @returns Short-weekday datetime (e.g., \"Sat, Mar 14, 2026, 8:00 PM\")\n * @throws {DateTimeError} If timezone or ISO string is invalid\n *\n * @example\n * formatWeekdayDateTime('2026-03-15T03:00:00Z', 'America/Los_Angeles')\n * // \"Sat, Mar 14, 2026, 8:00 PM\"\n */\nexport function formatWeekdayDateTime(utcIso, venueTz) {\n const zonedDate = getZonedDate(utcIso, venueTz);\n return format(zonedDate, DATE_FORMATS.DISPLAY_WEEKDAY_DATETIME);\n}\n/**\n * Formats a time range in the specified timezone.\n *\n * @param startUtc - Start time as UTC ISO string\n * @param endUtc - End time as UTC ISO string\n * @param timezone - IANA timezone ID\n * @returns Formatted time range (e.g., \"7:00 PM - 10:00 PM\")\n * @throws {DateTimeError} If timezone or ISO strings are invalid\n *\n * @example\n * formatTimeRange(\n * '2023-12-25T03:00:00Z',\n * '2023-12-25T06:00:00Z',\n * 'America/Los_Angeles'\n * )\n * // \"7:00 PM - 10:00 PM\"\n */\nexport function formatTimeRange(startUtc, endUtc, timezone) {\n const startTime = formatEventTime(startUtc, timezone);\n const endTime = formatEventTime(endUtc, timezone);\n return `${startTime} - ${endTime}`;\n}\n/**\n * Formats a date range in the specified timezone.\n * Handles same-day, same-month, and cross-month/year ranges intelligently.\n *\n * @param startUtc - Start date as UTC ISO string\n * @param endUtc - End date as UTC ISO string\n * @param timezone - IANA timezone ID\n * @returns Formatted date range (e.g., \"Dec 20 - 22, 2025\" or \"Dec 20 - Jan 5, 2026\")\n * @throws {DateTimeError} If timezone or ISO strings are invalid\n *\n * @example\n * formatDateRange(\n * '2023-12-20T08:00:00Z',\n * '2023-12-22T08:00:00Z',\n * 'America/Los_Angeles'\n * )\n * // \"Dec 20 - 22, 2023\"\n */\nexport function formatDateRange(startUtc, endUtc, timezone) {\n const startZoned = getZonedDate(startUtc, timezone);\n const endZoned = getZonedDate(endUtc, timezone);\n const startYear = startZoned.getFullYear();\n const endYear = endZoned.getFullYear();\n const startMonth = startZoned.getMonth();\n const endMonth = endZoned.getMonth();\n const startDay = startZoned.getDate();\n const endDay = endZoned.getDate();\n // Same day\n if (startYear === endYear && startMonth === endMonth && startDay === endDay) {\n return format(startZoned, DATE_FORMATS.DISPLAY_DATE);\n }\n // Same month and year\n if (startYear === endYear && startMonth === endMonth) {\n return `${format(startZoned, 'MMM d')} - ${endDay}, ${startYear}`;\n }\n // Same year, different months\n if (startYear === endYear) {\n return `${format(startZoned, 'MMM d')} - ${format(endZoned, 'MMM d')}, ${startYear}`;\n }\n // Different years\n return `${format(startZoned, DATE_FORMATS.DISPLAY_DATE)} - ${format(endZoned, DATE_FORMATS.DISPLAY_DATE)}`;\n}\n/**\n * Formats a datetime as a relative time string (e.g., \"2 hours ago\", \"in 3 days\").\n *\n * @param utcIso - UTC ISO datetime string\n * @param timezone - IANA timezone ID (used for consistency, though relative time is timezone-agnostic)\n * @returns Relative time string\n * @throws {DateTimeError} If timezone or ISO string is invalid\n *\n * @example\n * formatRelativeTime(new Date(Date.now() - 30 * 60 * 1000).toISOString(), 'America/Los_Angeles')\n * // \"30 minutes ago\"\n */\nexport function formatRelativeTime(utcIso, timezone) {\n // Validate inputs\n if (!isValidTimezone(timezone)) {\n throw new DateTimeError(`Invalid timezone: ${timezone}`, DateTimeErrorCode.INVALID_TIMEZONE, { timezone });\n }\n const date = parseAndValidateISO(utcIso);\n const now = new Date();\n const diffMs = date.getTime() - now.getTime();\n const absDiffMs = Math.abs(diffMs);\n const isPast = diffMs < 0;\n const seconds = Math.floor(absDiffMs / DURATIONS.SECOND);\n const minutes = Math.floor(absDiffMs / DURATIONS.MINUTE);\n const hours = Math.floor(absDiffMs / DURATIONS.HOUR);\n const days = Math.floor(absDiffMs / DURATIONS.DAY);\n const weeks = Math.floor(absDiffMs / DURATIONS.WEEK);\n const formatUnit = (value, unit) => {\n const plural = value === 1 ? '' : 's';\n if (isPast) {\n return `${value} ${unit}${plural} ago`;\n }\n return `in ${value} ${unit}${plural}`;\n };\n if (seconds < RELATIVE_TIME_THRESHOLDS.JUST_NOW_SECONDS) {\n return 'just now';\n }\n if (minutes < RELATIVE_TIME_THRESHOLDS.MINUTES_THRESHOLD) {\n return formatUnit(minutes, 'minute');\n }\n if (hours < RELATIVE_TIME_THRESHOLDS.HOURS_THRESHOLD) {\n return formatUnit(hours, 'hour');\n }\n if (days < RELATIVE_TIME_THRESHOLDS.DAYS_THRESHOLD) {\n return formatUnit(days, 'day');\n }\n if (weeks < RELATIVE_TIME_THRESHOLDS.WEEKS_THRESHOLD) {\n return formatUnit(weeks, 'week');\n }\n // For older dates, show the actual date\n return formatEventDate(utcIso, timezone);\n}\n/**\n * Extracts date parts from a UTC datetime in the specified timezone.\n *\n * @param utcIso - UTC ISO datetime string\n * @param timezone - IANA timezone ID\n * @returns Object with day, month, date, and year\n * @throws {DateTimeError} If timezone or ISO string is invalid\n *\n * @example\n * getDateParts('2023-12-25T20:00:00Z', 'America/Los_Angeles')\n * // { day: 'Mon', month: 'Dec', date: 25, year: 2023 }\n */\nexport function getDateParts(utcIso, timezone) {\n const zonedDate = getZonedDate(utcIso, timezone);\n return {\n day: format(zonedDate, DATE_FORMATS.DAY_SHORT),\n month: format(zonedDate, DATE_FORMATS.MONTH_SHORT),\n date: zonedDate.getDate(),\n year: zonedDate.getFullYear(),\n };\n}\n/**\n * Formats a datetime for display in notifications.\n * Shows relative time for recent events, date for older ones.\n *\n * @param utcIso - UTC ISO datetime string\n * @param timezone - IANA timezone ID\n * @returns Formatted string suitable for notifications\n */\nexport function formatNotificationTime(utcIso, timezone) {\n const date = parseAndValidateISO(utcIso);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n // Less than 24 hours ago\n if (diffMs < DURATIONS.DAY) {\n return formatRelativeTime(utcIso, timezone);\n }\n // Less than 7 days ago\n if (diffMs < DURATIONS.WEEK) {\n const zonedDate = getZonedDate(utcIso, timezone);\n return format(zonedDate, \"EEEE 'at' h:mm a\");\n }\n // Older - show full date\n return formatEventDateTime(utcIso, timezone);\n}\n/**\n * Formats the day of week from a UTC datetime.\n *\n * @param utcIso - UTC ISO datetime string\n * @param timezone - IANA timezone ID\n * @param short - If true, returns short form (e.g., \"Mon\"), otherwise full (e.g., \"Monday\")\n * @returns Day of week string\n */\nexport function formatDayOfWeek(utcIso, timezone, short = true) {\n const zonedDate = getZonedDate(utcIso, timezone);\n return format(zonedDate, short ? DATE_FORMATS.DAY_SHORT : DATE_FORMATS.DAY_FULL);\n}\n/**\n * Formats the month from a UTC datetime.\n *\n * @param utcIso - UTC ISO datetime string\n * @param timezone - IANA timezone ID\n * @param short - If true, returns short form (e.g., \"Dec\"), otherwise full (e.g., \"December\")\n * @returns Month string\n */\nexport function formatMonth(utcIso, timezone, short = true) {\n const zonedDate = getZonedDate(utcIso, timezone);\n return format(zonedDate, short ? DATE_FORMATS.MONTH_SHORT : DATE_FORMATS.MONTH_FULL);\n}\n/**\n * Gets the hour in the specified timezone (0-23).\n *\n * @param utcIso - UTC ISO datetime string\n * @param timezone - IANA timezone ID\n * @returns Hour (0-23)\n */\nexport function getHourInTimezone(utcIso, timezone) {\n const zonedDate = getZonedDate(utcIso, timezone);\n return zonedDate.getHours();\n}\n/**\n * Gets the venue-local calendar day (YYYY-MM-DD) for a UTC instant.\n *\n * Returns the branded {@link DateOnly} type: the `yyyy-MM-dd` output is\n * always a well-formed calendar date, so consumers can rely on the brand\n * without re-validating. This is the canonical, timezone-required\n * replacement for `utils/formatters.ts::formatDateForAPI` (which infers the\n * day from local time when no tz is passed — a tz bug) and for the\n * UTC-hardcoded day extraction in `utils/dateHelpers.ts::getDateRange`.\n *\n * @param utcIso - UTC ISO datetime string\n * @param timezone - IANA timezone ID\n * @returns Branded `DateOnly` in YYYY-MM-DD format\n * @throws {DateTimeError} If timezone or ISO string is invalid\n *\n * @example\n * // 06:00 UTC on Dec 25 is still Dec 24 in LA\n * getDateInTimezone('2023-12-25T06:00:00Z', 'America/Los_Angeles')\n * // \"2023-12-24\"\n */\nexport function getDateInTimezone(utcIso, timezone) {\n const zonedDate = getZonedDate(utcIso, timezone);\n return toDateOnly(format(zonedDate, DATE_FORMATS.API_DATE));\n}\n/**\n * Canonical, timezone-required builder for `YYYY-MM-DD` query-string date\n * params. Alias of {@link getDateInTimezone} under the name the legacy\n * `utils/formatters.ts::formatDateForAPI` uses, so that helper can become a\n * thin re-export once its callers pass an explicit venue timezone.\n *\n * @param utcIso - UTC ISO datetime string\n * @param timezone - IANA timezone ID\n * @returns Branded `DateOnly` in YYYY-MM-DD format\n * @throws {DateTimeError} If timezone or ISO string is invalid\n */\nexport function formatDateForAPI(utcIso, timezone) {\n return getDateInTimezone(utcIso, timezone);\n}\n/**\n * Lists every venue-local calendar day (`YYYY-MM-DD`) touched by the span\n * `[startUtc, endUtc]`, inclusive of both endpoints.\n *\n * Timezone-required replacement for `utils/dateHelpers.ts::getDateRange`,\n * which walked days in UTC and emitted unpadded `YYYY-M-D`. This version\n * resolves each boundary to its venue-local day first, then walks calendar\n * days with `toDateOnly`/`addDays`-style UTC arithmetic on the date parts,\n * so it is immune to DST shifts in the target zone (the iteration happens in\n * date-space, not instant-space).\n *\n * @param startUtc - Start instant as UTC ISO string\n * @param endUtc - End instant as UTC ISO string\n * @param timezone - IANA timezone ID\n * @returns Ascending list of branded `DateOnly` strings, first..last inclusive.\n * Empty if `endUtc` resolves before `startUtc`.\n * @throws {DateTimeError} If timezone or either ISO string is invalid\n *\n * @example\n * eachDayInTimezone(\n * '2023-12-25T06:00:00Z', // Dec 24 in LA\n * '2023-12-26T06:00:00Z', // Dec 25 in LA\n * 'America/Los_Angeles'\n * )\n * // ['2023-12-24', '2023-12-25']\n */\nexport function eachDayInTimezone(startUtc, endUtc, timezone) {\n const startDay = getDateInTimezone(startUtc, timezone);\n const endDay = getDateInTimezone(endUtc, timezone);\n const days = [];\n // Walk calendar days in UTC date-space (DST-immune). Parse the local\n // start day as a UTC midnight, increment by whole days, and re-emit as\n // YYYY-MM-DD until we pass the local end day.\n const [sy, sm, sd] = startDay.split('-').map(Number);\n const [ey, em, ed] = endDay.split('-').map(Number);\n const cursor = new Date(Date.UTC(sy, sm - 1, sd));\n const last = Date.UTC(ey, em - 1, ed);\n while (cursor.getTime() <= last) {\n days.push(toDateOnly(`${cursor.getUTCFullYear()}-${String(cursor.getUTCMonth() + 1).padStart(2, '0')}-${String(cursor.getUTCDate()).padStart(2, '0')}`));\n cursor.setUTCDate(cursor.getUTCDate() + 1);\n }\n return days;\n}\n// ============================================================================\n// Additional Formatting Functions\n// ============================================================================\n/**\n * Formats an hour number (0-23) to a display string with AM/PM.\n * This is a simple utility that doesn't require timezone since it works\n * with a raw hour number, not a datetime.\n *\n * @param hour - Hour number (0-23)\n * @returns Formatted hour string (e.g., \"8 PM\", \"12 AM\")\n *\n * @example\n * formatHour(8) // \"8 AM\"\n * formatHour(20) // \"8 PM\"\n * formatHour(0) // \"12 AM\"\n * formatHour(12) // \"12 PM\"\n */\nexport function formatHour(hour) {\n const suffix = hour >= 12 ? 'PM' : 'AM';\n const displayHour = hour % 12 || 12;\n return `${displayHour} ${suffix}`;\n}\n/**\n * Checks if a UTC datetime represents today in the specified timezone.\n *\n * @param utcIso - UTC ISO datetime string\n * @param timezone - IANA timezone ID\n * @returns True if the date is today in the given timezone\n * @throws {DateTimeError} If timezone or ISO string is invalid\n *\n * @example\n * isToday('2025-01-04T19:00:00Z', 'America/Los_Angeles')\n * // true (if today is Jan 4, 2025 in LA)\n */\nexport function isToday(utcIso, timezone) {\n const zonedDate = getZonedDate(utcIso, timezone);\n const nowZoned = toZonedTime(new Date(), timezone);\n return (zonedDate.getDate() === nowZoned.getDate() &&\n zonedDate.getMonth() === nowZoned.getMonth() &&\n zonedDate.getFullYear() === nowZoned.getFullYear());\n}\n/**\n * Formats a date for simple display (e.g., lists, dropdowns).\n * Format: \"Jan 15, 2024\"\n *\n * A timezone is REQUIRED (this module's no-defaults contract — the legacy\n * `= 'UTC'` default was removed in Stage C of the datetime unification).\n * For richer timezone-aware formatting, use formatEventDate instead.\n *\n * @param utcIso - UTC ISO datetime string\n * @param timezone - IANA timezone ID (required)\n * @returns Formatted date string (e.g., \"Jan 15, 2024\")\n * @throws {DateTimeError} If timezone or ISO string is invalid\n *\n * @example\n * formatShortDate('2024-01-15T20:30:00Z', 'America/Los_Angeles')\n * // \"Jan 15, 2024\" (in LA timezone)\n */\nexport function formatShortDate(utcIso, timezone) {\n const zonedDate = getZonedDate(utcIso, timezone);\n return format(zonedDate, DATE_FORMATS.DISPLAY_DATE);\n}\n/**\n * Formats a time range with clean formatting (omits :00 minutes).\n * More compact display for times on the hour.\n *\n * @param startUtc - Start time as UTC ISO string\n * @param endUtc - End time as UTC ISO string\n * @param timezone - IANA timezone ID\n * @returns Formatted time range (e.g., \"8 PM - 11 PM\" or \"8:30 PM - 11 PM\")\n * @throws {DateTimeError} If timezone or ISO strings are invalid\n *\n * @example\n * formatCleanTimeRange(\n * '2023-12-25T03:00:00Z',\n * '2023-12-25T06:00:00Z',\n * 'America/Los_Angeles'\n * )\n * // \"7 PM - 10 PM\" (times are on the hour, so no :00)\n *\n * formatCleanTimeRange(\n * '2023-12-25T03:30:00Z',\n * '2023-12-25T06:00:00Z',\n * 'America/Los_Angeles'\n * )\n * // \"7:30 PM - 10 PM\"\n */\nexport function formatCleanTimeRange(startUtc, endUtc, timezone) {\n const formatCleanTime = (utcIso) => {\n const zonedDate = getZonedDate(utcIso, timezone);\n const minutes = zonedDate.getMinutes();\n if (minutes === 0) {\n // Omit minutes if on the hour: \"8 PM\"\n return format(zonedDate, 'h a');\n }\n // Include minutes: \"8:30 PM\"\n return format(zonedDate, DATE_FORMATS.DISPLAY_TIME);\n };\n const startTime = formatCleanTime(startUtc);\n const endTime = formatCleanTime(endUtc);\n return `${startTime} - ${endTime}`;\n}\n","/**\n * Sizing Tokens\n *\n * Shared size class mappings for consistent component sizing across the design system.\n * Single source of truth for all component size variants.\n */\n// =============================================================================\n// FORM CONTROLS\n// =============================================================================\n/**\n * Form input sizes - for Input component with fixed heights\n * Uses explicit heights for consistent toolbar alignment.\n */\nexport const formInputSizes = {\n sm: 'h-9 px-3 text-sm',\n md: 'h-10 px-4 text-sm',\n lg: 'h-12 px-4 text-base',\n};\n/**\n * Form control sizes - for Select and other form controls\n * Uses explicit heights to match buttons and inputs for toolbar alignment.\n */\nexport const formControlSizes = {\n sm: 'h-9 px-3 text-sm',\n md: 'h-10 px-4 text-sm',\n lg: 'h-12 px-4 text-base',\n};\n// =============================================================================\n// ICON/SPINNER SIZES\n// =============================================================================\n/**\n * Icon dimension sizes - width and height classes for icons and spinners.\n * Used by Spinner and icon-only components.\n *\n * Note on the 16px→32px (`sm`→`md`) jump: the t-shirt grammar\n * (xs/sm/md/lg/xl) is fully occupied, so a 24px (`w-6 h-6`) intermediate has\n * no clean non-breaking slot here — inserting it would require renumbering an\n * existing size, which is a user-facing breakage. The 24px need is already\n * served by `buttonSizes['icon-xs']` (`w-6 h-6 p-0`) for icon buttons. Left\n * as-is intentionally.\n */\nexport const iconSizes = {\n xs: 'w-3 h-3',\n sm: 'w-4 h-4',\n md: 'w-8 h-8',\n lg: 'w-12 h-12',\n xl: 'w-16 h-16',\n};\n// =============================================================================\n// BADGE SIZES\n// =============================================================================\n/**\n * Badge sizes - text, padding, and font weight for badges.\n */\nexport const badgeSizes = {\n xs: 'text-xs px-1.5 py-0.5 font-medium',\n sm: 'text-xs px-2 py-0.5 font-medium',\n md: 'text-xs px-2.5 py-0.5 font-medium',\n lg: 'text-sm px-3 py-0.5 font-medium',\n};\n/**\n * Legacy badge size name mapping for backwards compatibility.\n */\nexport const badgeSizeLegacyMap = {\n small: 'sm',\n medium: 'md',\n large: 'lg',\n};\n// =============================================================================\n// SKELETON SIZES\n// =============================================================================\n/**\n * Skeleton line height sizes - for loading placeholder lines.\n */\nexport const skeletonSizes = {\n sm: 'h-2',\n md: 'h-2.5',\n lg: 'h-3',\n xl: 'h-3.5',\n '2xl': 'h-4',\n};\n// =============================================================================\n// BUTTON SIZES\n// =============================================================================\n/**\n * Standard button sizes - padding, text sizing, and explicit heights for consistency.\n * All toolbar elements (buttons, inputs, selects) should align at the same height.\n *\n * Primitive size scale: `xs` | `sm` | `md` | `lg` | `xl` (+ the `icon-*`\n * square variants). The width/layout recipe entries (`xl-medium`, `full`,\n * `full-md-auto`, `half`, `landing`) are use-cases, not size primitives —\n * they are deprecated and should migrate to Button's own `variant`/width\n * props. See the per-member `@deprecated` notes below. Kept working for now.\n */\nexport const buttonSizes = {\n xs: 'h-8 px-3 text-xs',\n sm: 'h-9 px-3 text-sm',\n md: 'h-10 px-4 text-sm',\n lg: 'h-11 px-5 text-sm',\n xl: 'h-12 px-6 text-sm',\n /** @deprecated Recipe, not a size primitive. Use Button's full-width prop with size `xl`. Migrating to Button's `variant` prop; kept working for now. */\n 'xl-medium': 'w-full h-12 px-6 text-sm',\n /** @deprecated Recipe, not a size primitive. Use Button's full-width prop with size `lg`. Migrating to Button's `variant` prop; kept working for now. */\n full: 'w-full h-11 px-5 text-sm',\n /** @deprecated Recipe, not a size primitive. Use Button's responsive full-width prop with size `lg`. Migrating to Button's `variant` prop; kept working for now. */\n 'full-md-auto': 'w-full h-11 px-5 text-sm md:w-auto',\n /** @deprecated Recipe, not a size primitive. Use Button's half-width prop with size `md`. Migrating to Button's `variant` prop; kept working for now. */\n half: 'w-1/2 h-10 px-4 text-sm',\n // Square icon-only sizes — for any variant used as an icon button (e.g. +/- controls)\n // 24px square — for compact icon buttons in dropdowns, dense toolbars,\n // and quantity-stepper controls. Closes the WidgetBuilder /\n // EventPicker / ColorPreviewPanel `!w-6 !h-6 !p-0` override pattern.\n 'icon-xs': 'w-6 h-6 p-0',\n // 36px square — quantity +/- buttons (TicketBlock), inline-icon\n // controls in chips.\n 'icon-sm': 'w-9 h-9 p-0',\n // 40px square — default icon-button size.\n 'icon-md': 'w-10 h-10 p-0',\n // 44px square — accessibility-min touch target.\n 'icon-lg': 'w-11 h-11 p-0',\n /** @deprecated Recipe, not a size primitive — a landing-page hero treatment (responsive height + larger text). Migrating to a Button `variant=\"hero\"` (or equivalent) prop; kept working for now. */\n landing: 'h-12 sm:h-14 px-6 sm:px-8 text-base sm:text-lg',\n};\n/**\n * Icon-only button sizes - padding only, no text.\n * For variant=\"icon\" (transparent). For other variants with icon-only,\n * use the square sizes in buttonSizes (icon-sm, icon-md, icon-lg).\n */\nexport const buttonIconSizes = {\n xs: 'p-1.5',\n sm: 'p-2',\n md: 'p-2.5',\n lg: 'p-3',\n};\n/**\n * Avatar button sizes - minimal padding, just dimensions.\n */\nexport const buttonAvatarSizes = {\n sm: 'min-w-8 min-h-8',\n md: 'min-w-10 min-h-10',\n lg: 'min-w-12 min-h-12',\n};\n/**\n * Menu item button sizes - for dropdown and sheet items.\n */\nexport const buttonMenuItemSizes = {\n sm: 'py-2 px-4 text-sm',\n md: 'py-3 px-4 text-sm',\n lg: 'py-4 px-6 text-base',\n nav: 'py-2 px-3 text-base font-normal',\n};\n/**\n * Card button sizes - larger padding for card-like buttons.\n */\nexport const buttonCardSizes = {\n sm: 'p-3 text-sm',\n md: 'p-4 text-sm',\n lg: 'p-5 text-base',\n};\n","<script lang=\"ts\">\r\n import type { Snippet } from 'svelte';\r\n import { classNames } from \"./../../utils/utils.js\";\r\n import { badgeColorVariants, type BadgeColorVariant } from '../../tokens/variants.js';\r\n import { badgeSizes, badgeSizeLegacyMap, type BadgeSize, type BadgeSizeLegacy } from '../../tokens/sizing.js';\r\n\r\n type Size = BadgeSize | BadgeSizeLegacy;\r\n type Variant = BadgeColorVariant;\r\n\r\n interface Props {\r\n /** Size variant */\r\n size?: Size;\r\n /** Additional CSS classes */\r\n class?: string;\r\n /** Semantic or color variant */\r\n variant?: Variant;\r\n /**\r\n * Visual tone. `default` (the current behavior) renders the badge\r\n * with a tinted background — a \"chip\" / \"pill\" feel. `minimal`\r\n * strips the background + padding chrome, keeping only the colored\r\n * text. Use `minimal` for inline-with-text indicators (scarcity,\r\n * status next to titles, etc.) where a full chip is too loud.\r\n *\r\n * Atlas convergence: closes the VC ScarcityBadge override pattern\r\n * (`background: transparent !important; padding: 0.125rem 0\r\n * !important;` etc. wrapped around an SC Badge).\r\n */\r\n tone?: 'default' | 'minimal';\r\n /** Custom text color (hex) - overrides variant */\r\n textColor?: string | null;\r\n /** Custom background color (hex or rgba) - overrides variant */\r\n bgColor?: string | null;\r\n /** Show status dot before text (uses variant color) */\r\n showDot?: boolean;\r\n /** Pill mode for counts/notifications (circular, minimal padding) */\r\n pill?: boolean;\r\n /** Border radius style - default or full pill */\r\n shape?: \"rounded\" | \"pill\";\r\n /** Large size (Flowbite API compatibility) */\r\n large?: boolean;\r\n /** Click handler callback */\r\n // eslint-disable-next-line no-unused-vars -- intentionally retained (prop/slot/forward-compat or Svelte-5 reactive binding eslint cannot see)\n onclick?: (e: MouseEvent) => void;\r\n /** Left icon slot */\r\n leftIcon?: Snippet;\r\n /** Child content */\r\n children?: Snippet;\r\n }\r\n\r\n let {\r\n size = \"md\",\r\n class: className = '',\r\n variant = \"neutral\",\r\n tone = \"default\",\r\n textColor = null,\r\n bgColor = null,\r\n showDot = false,\r\n pill = false,\r\n shape = \"rounded\",\r\n large = false,\r\n onclick,\r\n leftIcon,\r\n children\r\n }: Props = $props();\r\n\r\nlet resolvedSize = $derived((): BadgeSize => {\r\n if (large) return 'lg';\r\n const legacyMapped = badgeSizeLegacyMap[size];\r\n if (legacyMapped) return legacyMapped;\r\n return (size as BadgeSize) || 'md';\r\n });\r\n\r\n let sizeClasses = $derived((() => {\r\n const baseSize = badgeSizes[resolvedSize()] || badgeSizes.md;\r\n // Tone=minimal: strip the chip horizontal/vertical padding so the\r\n // colored text sits inline with surrounding text.\r\n // Codex round 1 caught: previously kept px-2.5 py-0.5.\r\n if (tone === 'minimal') {\r\n return baseSize.replace(/\\bp[xy]?-[^\\s]+/g, '').trim();\r\n }\r\n return baseSize;\r\n })());\r\n\r\n let shapeClasses = $derived((() => {\r\n // Tone=minimal: no chrome — drop rounded corners + chip padding\r\n // (handled above in sizeClasses).\r\n if (tone === 'minimal') return '';\r\n if (pill) return \"rounded-full min-w-5 h-5 px-1.5 justify-center\";\r\n return shape === \"pill\" ? \"rounded-full\" : \"rounded\";\r\n })());\r\n\r\n let normalizedVariant = $derived(String(variant).toLowerCase());\r\n\r\n // Variants whose foreground color is white (designed for a colored\r\n // background). When `tone=\"minimal\"` strips the bg, white text on\r\n // a light parent is invisible. Substitute with a colored-text class.\r\n // Codex round 1 caught: `notification` was the only such variant.\r\n // tw-primitive-ok: substring match needed to detect existing variant content\r\n const WHITE_FG = 'text-' + 'white';\r\n const MINIMAL_FOREGROUND_OVERRIDES: Partial<Record<BadgeColorVariant, string>> = {\r\n notification: 'text-accent-danger',\r\n };\r\n\r\nlet variantClasses = $derived((() => {\r\n const base = badgeColorVariants[normalizedVariant as BadgeColorVariant] ||\r\n badgeColorVariants.neutral;\r\n if (tone === 'minimal') {\r\n const stripped = base.replace(/\\bbg-[^\\s]+/g, '').trim();\r\n const override = MINIMAL_FOREGROUND_OVERRIDES[normalizedVariant as BadgeColorVariant];\r\n if (override) {\r\n return stripped.includes(WHITE_FG)\r\n ? stripped.replace(WHITE_FG, override)\r\n : override;\r\n }\r\n return stripped;\r\n }\r\n return base;\r\n })());\r\n\r\n let customStyle = $derived((() => {\r\n const styles: string[] = [];\r\n if (textColor) styles.push(`color: ${textColor}`);\r\n if (bgColor) styles.push(`background-color: ${bgColor}`);\r\n return styles.length > 0 ? styles.join(\"; \") : undefined;\r\n })());\r\n</script>\r\n\r\n<!-- svelte-ignore a11y_click_events_have_key_events -->\r\n<!-- svelte-ignore a11y_no_static_element_interactions -->\r\n<div\r\n class={classNames(\r\n \"inline-flex items-center gap-1.5\",\r\n sizeClasses,\r\n variantClasses,\r\n shapeClasses,\r\n className\r\n )}\r\n style={customStyle}\r\n onclick={(e) => onclick?.(e)}\r\n>\r\n {#if showDot}\r\n <span class=\"w-1.5 h-1.5 rounded-full bg-current shrink-0\"></span>\r\n {/if}\r\n {@render leftIcon?.()}\r\n {@render children?.()}\r\n</div>\r\n","<!--\r\n BlurBackdropImage.svelte\r\n\r\n @deprecated Use `<Image>` instead. As of Atlas premium brief 04, `<Image>`'s\r\n DEFAULT framing IS the blur-backdrop (object-contain over a blurred same-image\r\n fill) — so `<BlurBackdropImage src={url} class=\"…\" />` becomes just\r\n `<Image src={url} class=\"…\" />`, and `<BlurBackdropImage … fill />` becomes\r\n `<Image … fit=\"cover\" />`. `<Image>` additionally reuses the already-fetched\r\n bitmap for the blur layer (no second network fetch) and adds zero-CLS\r\n dimensions + blur-up loading. This standalone component is kept intact only as\r\n a back-compat shim while consumers migrate; it will be DELETED in a paired\r\n cleanup cell once all call sites are moved over. Do NOT reach for it in new\r\n code.\r\n\r\n Displays an image with object-contain and a blurred copy behind it.\r\n Fills empty space around non-standard aspect ratios with a soft color\r\n wash instead of flat gray. Canonical pattern for any user-uploaded\r\n image where we don't control the aspect ratio (event posters, venue\r\n images, etc).\r\n\r\n Set sizing/shape via the `class` prop:\r\n <BlurBackdropImage src={url} class=\"size-15 rounded-lg\" />\r\n <BlurBackdropImage src={url} class=\"aspect-video rounded-lg\" />\r\n\r\n When the image is known to fill the container (e.g. forced-square\r\n performer avatars in a square box), pass `fill={true}` to skip the\r\n blur layer entirely — saves an extra fetch and a heavy blur pass.\r\n-->\r\n<script lang=\"ts\">\r\n interface Props {\r\n /** Image source URL. If empty/missing, falls back to `fallback`. */\r\n src?: string;\r\n /** Alt text for the foreground image. */\r\n alt?: string;\r\n /** Additional CSS classes (sizing, rounded corners, etc). */\r\n class?: string;\r\n /** Fallback URL used when src is empty or fails to load. */\r\n fallback?: string;\r\n /**\r\n * When the image is known to fill the container (e.g. forced-square\r\n * performer avatars in a square box), set `fill={true}` to render a\r\n * single object-cover img and skip the blur backdrop entirely.\r\n * Default false — render blur backdrop + object-contain main image.\r\n */\r\n fill?: boolean;\r\n }\r\n\r\n let {\r\n src = '',\r\n alt = '',\r\n class: className = '',\r\n fallback = '',\r\n fill = false,\r\n }: Props = $props();\r\n\r\n let resolvedSrc = $derived(src || fallback);\r\n\r\n function handleError(e: Event) {\r\n if (fallback) {\r\n const img = e.target as HTMLImageElement;\r\n if (img.src !== fallback) img.src = fallback;\r\n }\r\n }\r\n</script>\r\n\r\n{#if resolvedSrc}\r\n <div class=\"blur-backdrop-image {className}\">\r\n {#if !fill}\r\n <img\r\n src={resolvedSrc}\r\n alt=\"\"\r\n class=\"blur-layer\"\r\n aria-hidden=\"true\"\r\n onerror={handleError}\r\n />\r\n {/if}\r\n <img\r\n src={resolvedSrc}\r\n {alt}\r\n class={fill ? 'fill-layer' : 'main-layer'}\r\n onerror={handleError}\r\n />\r\n </div>\r\n{:else}\r\n <div class=\"blur-backdrop-image {className}\"></div>\r\n{/if}\r\n\r\n<style>\r\n .blur-backdrop-image {\r\n container-type: inline-size;\r\n position: relative;\r\n overflow: hidden;\r\n background: hsl(var(--bg-quaternary));\r\n }\r\n\r\n .blur-layer {\r\n position: absolute;\r\n inset: 0;\r\n width: 100%;\r\n height: 100%;\r\n max-width: none;\r\n object-fit: cover;\r\n transform: scale(1.15);\r\n filter: blur(16px) saturate(1.2);\r\n }\r\n\r\n /* Small containers (<=80px): blur() applies before scale() in the render\r\n pipeline, so the blur halo gets scaled up too. Need enough scale that\r\n opaque image extends past the container edge even after the halo grows.\r\n At 40px with scale(2) + blur(6px): 22px overflow - 12px halo = 10px safe margin. */\r\n @container (max-width: 5rem) {\r\n .blur-layer {\r\n transform: scale(2);\r\n filter: blur(6px) saturate(1.2);\r\n }\r\n }\r\n\r\n .main-layer {\r\n position: relative;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: contain;\r\n }\r\n\r\n .fill-layer {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n }\r\n</style>\r\n","/**\r\n * Svelte action to trap focus within an element (for modals and dialogs).\r\n * When used, focus will cycle between focusable elements within the container.\r\n *\r\n * @param {HTMLElement} node - The container element to trap focus within\r\n * @param {Object} options - Configuration options\r\n * @param {boolean} options.enabled - Whether the focus trap is active\r\n * @param {HTMLElement | null} [options.returnFocusTo] - Element to return focus to when trap is disabled (falls back to the previously focused element)\r\n * @returns {Object} Svelte action lifecycle methods\r\n *\r\n * Usage:\r\n * <div use:focusTrap={{ enabled: isOpen, returnFocusTo: triggerElement }}>\r\n * ...modal content...\r\n * </div>\r\n */\r\nexport function focusTrap(node, options = {}) {\r\n const FOCUSABLE_SELECTORS = [\r\n 'a[href]',\r\n 'area[href]',\r\n 'input:not([disabled]):not([type=\"hidden\"])',\r\n 'select:not([disabled])',\r\n 'textarea:not([disabled])',\r\n 'button:not([disabled])',\r\n '[tabindex]:not([tabindex=\"-1\"])',\r\n '[contenteditable]',\r\n 'audio[controls]',\r\n 'video[controls]',\r\n 'details>summary:first-of-type',\r\n 'details',\r\n ].join(',');\r\n\r\n let enabled = options.enabled ?? true;\r\n let returnFocusTo = options.returnFocusTo ?? null;\r\n let previouslyFocused = null;\r\n\r\n function getFocusableElements() {\r\n const elements = Array.from(node.querySelectorAll(FOCUSABLE_SELECTORS));\r\n return elements.filter(\r\n el => !el.hasAttribute('disabled') && el.tabIndex !== -1 && isVisible(el)\r\n );\r\n }\r\n\r\n function isVisible(element) {\r\n return !!(\r\n element.offsetWidth ||\r\n element.offsetHeight ||\r\n element.getClientRects().length\r\n );\r\n }\r\n\r\n function handleKeydown(event) {\r\n if (!enabled || event.key !== 'Tab') return;\r\n\r\n const focusableElements = getFocusableElements();\r\n if (focusableElements.length === 0) return;\r\n\r\n const firstElement = focusableElements[0];\r\n const lastElement = focusableElements[focusableElements.length - 1];\r\n\r\n if (event.shiftKey) {\r\n // Shift+Tab: going backwards\r\n if (document.activeElement === firstElement) {\r\n event.preventDefault();\r\n lastElement.focus();\r\n }\r\n } else {\r\n // Tab: going forwards\r\n if (document.activeElement === lastElement) {\r\n event.preventDefault();\r\n firstElement.focus();\r\n }\r\n }\r\n }\r\n\r\n function activate() {\r\n if (!enabled) return;\r\n\r\n // Store previously focused element\r\n previouslyFocused = document.activeElement;\r\n\r\n // Focus the first focusable element or the container itself\r\n const focusableElements = getFocusableElements();\r\n if (focusableElements.length > 0) {\r\n // Use requestAnimationFrame to ensure DOM is ready\r\n requestAnimationFrame(() => {\r\n focusableElements[0].focus();\r\n });\r\n } else {\r\n // If no focusable elements, make the container focusable\r\n node.setAttribute('tabindex', '-1');\r\n node.focus();\r\n }\r\n\r\n document.addEventListener('keydown', handleKeydown);\r\n }\r\n\r\n function deactivate() {\r\n document.removeEventListener('keydown', handleKeydown);\r\n\r\n // Return focus to the specified element or the previously focused element\r\n const focusTarget = returnFocusTo || previouslyFocused;\r\n if (focusTarget && typeof focusTarget.focus === 'function') {\r\n focusTarget.focus();\r\n }\r\n }\r\n\r\n // Initialize\r\n if (enabled) {\r\n activate();\r\n }\r\n\r\n return {\r\n update(newOptions) {\r\n const newEnabled = newOptions.enabled ?? true;\r\n returnFocusTo = newOptions.returnFocusTo ?? null;\r\n\r\n if (newEnabled !== enabled) {\r\n enabled = newEnabled;\r\n if (enabled) {\r\n activate();\r\n } else {\r\n deactivate();\r\n }\r\n }\r\n },\r\n destroy() {\r\n deactivate();\r\n },\r\n };\r\n}\r\n","<script lang=\"ts\">\r\n import {\r\n spinnerColorVariants,\r\n type SpinnerColorVariant,\r\n } from '../../tokens/variants.js';\r\n import { iconSizes, type IconSize } from '../../tokens/sizing.js';\r\n\r\n const defaultLabels = {\r\n loading: 'Loading...',\r\n };\r\n\r\n interface Props {\r\n size?: IconSize;\r\n color?: SpinnerColorVariant;\r\n class?: string;\r\n labels?: Partial<typeof defaultLabels>;\r\n }\r\n\r\n let {\r\n size = 'md',\r\n color = 'blue',\r\n class: className = '',\r\n labels: userLabels = {},\r\n }: Props = $props();\r\n\r\n let labels = $derived({ ...defaultLabels, ...userLabels });\r\n\r\n let sizeClass = $derived(iconSizes[size] || iconSizes.md);\r\n let colorClass = $derived(spinnerColorVariants[color] || spinnerColorVariants.blue);\r\n</script>\r\n\r\n<svg\r\n aria-hidden=\"true\"\r\n class=\"{sizeClass} text-text-tertiary animate-spin {colorClass} {className}\"\r\n viewBox=\"0 0 100 101\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n role=\"status\"\r\n>\r\n <path\r\n d=\"M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z\"\r\n fill=\"currentColor\"\r\n />\r\n <path\r\n d=\"M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z\"\r\n fill=\"currentFill\"\r\n />\r\n</svg>\r\n<span class=\"sr-only\">{labels.loading}</span>\r\n","/**\n * Haptic Feedback Utility\n *\n * Provides tactile feedback for user actions across iOS, Android, and web.\n * Part of QOL Bible - \"Instant Response to Every Touch\"\n *\n * Supports:\n * - iOS WebKit (native app wrapper)\n * - iOS TapticEngine (older API)\n * - Android/Web Vibration API (fallback)\n *\n * Usage:\n * import { triggerHaptic } from './haptic.js';\n * triggerHaptic('success'); // On form submission success\n * triggerHaptic('light'); // On toggle/selection\n * triggerHaptic('heavy'); // On destructive action confirmation\n */\n// Vibration durations in ms for each style\nconst VIBRATION_PATTERNS = {\n light: 10,\n medium: 20,\n heavy: 30,\n success: [10, 50, 20], // double tap feel\n warning: [20, 40, 20],\n error: [30, 50, 30, 50, 30], // triple pulse\n selection: 8, // very light for toggles/checkboxes\n};\n/**\n * Trigger haptic feedback\n *\n * @param style - The haptic intensity/pattern\n * - light: Subtle confirmation (toggles, selections)\n * - medium: Standard confirmation (form saves, status changes)\n * - heavy: Strong confirmation (destructive actions, transfers)\n * - success: Double-tap pattern for achievements\n * - warning: Alert pattern\n * - error: Triple-pulse for errors\n * - selection: Very light for toggle/checkbox state changes\n */\nexport function triggerHaptic(style = 'light') {\n if (typeof window === 'undefined')\n return;\n // iOS WebKit bridge (native app wrapper)\n // @ts-expect-error - iOS WebKit\n if (window.webkit?.messageHandlers?.haptic) {\n // @ts-expect-error - iOS WebKit\n window.webkit.messageHandlers.haptic.postMessage(style);\n return;\n }\n // iOS TapticEngine (older native API)\n // @ts-expect-error - Taptic Engine\n if (window.TapticEngine) {\n // Map our styles to TapticEngine styles\n const tapticStyle = style === 'success' ||\n style === 'warning' ||\n style === 'error' ||\n style === 'selection'\n ? 'medium'\n : style;\n // @ts-expect-error - Taptic Engine\n window.TapticEngine.impact({ style: tapticStyle });\n return;\n }\n // Android/Web Vibration API fallback\n if (navigator.vibrate) {\n const pattern = VIBRATION_PATTERNS[style];\n navigator.vibrate(pattern);\n }\n}\n/**\n * Check if haptic feedback is available on this device\n */\nexport function isHapticAvailable() {\n if (typeof window === 'undefined')\n return false;\n return !!(\n // @ts-expect-error - iOS WebKit\n window.webkit?.messageHandlers?.haptic ||\n // @ts-expect-error - Taptic Engine\n window.TapticEngine ||\n navigator.vibrate);\n}\n/**\n * Map button variants to appropriate haptic styles\n * Used by Button component to provide context-aware feedback\n */\nexport function getHapticForButtonVariant(variant, isSuccess) {\n if (isSuccess)\n return 'success';\n switch (variant) {\n case 'red':\n case 'red-outline':\n case 'ghost-red':\n case 'menu-item-danger':\n return 'heavy'; // Destructive actions get strong feedback\n case 'default':\n case 'outline':\n case 'landing':\n return 'medium'; // Primary actions get standard feedback\n case 'alternative':\n case 'ghost':\n case 'landing-secondary':\n return 'light'; // Secondary actions get subtle feedback\n case 'toggle':\n case 'nav':\n return 'selection'; // Selection changes get very light feedback\n case 'icon':\n case 'menu-item':\n case 'search-result':\n case 'link':\n return null; // These don't need haptic (too frequent or navigation)\n default:\n return 'light';\n }\n}\n","<script lang=\"ts\">\r\n /* eslint-disable svelte/valid-compile, svelte/no-navigation-without-resolve -- drift(tracked): template-position lint (href/resolve, svelte-ignore, compile note); refactor deferred */\r\n /**\r\n * Button Component - Flowbite Native (Pure Tailwind)\r\n * Migrated to Svelte 5 runes\r\n *\r\n * Variants (Flowbite naming):\r\n * - default: Primary blue button\r\n * - alternative: Gray outline button\r\n * - outline: Blue outline button\r\n * - red: Destructive solid button\r\n * - red-outline: Destructive outline button\r\n * - orange: Warning solid button\r\n * - orange-outline: Warning outline button\r\n * - ghost: Text-only button\r\n * - ghost-red: Destructive text button\r\n * - icon: Icon-only button\r\n * - toggle: Toggle/pill button\r\n * - avatar: Avatar/image trigger button (no padding, opacity hover)\r\n * - menu-item: Dropdown/sheet menu item (full width, left-aligned)\r\n * - menu-item-danger: Destructive menu item (red text)\r\n * - card: Selectable card button (bordered, for list selections)\r\n * - sidebar-toggle: Compact pill for sidebar expand/collapse\r\n * - chart-row: Leaderboard/chart list row with progress bar\r\n * - landing: Primary hero CTA (blue, shadow, rounded-xl)\r\n * - landing-secondary: Secondary hero CTA (outline, shadow, rounded-xl)\r\n *\r\n * Sizes (Flowbite native): xs, sm, md, lg, xl, landing\r\n *\r\n * Haptic Feedback:\r\n * - Automatic haptic on success state transition\r\n * - Optional haptic on click via `haptic` prop\r\n * - Variant-aware feedback intensity\r\n */\r\n import { CheckOutline } from '../Icons';\r\n import Spinner from '../Spinner/Spinner.svelte';\r\n import { twMerge } from 'tailwind-merge';\r\n import type { Snippet } from 'svelte';\r\n import {\r\n buttonSizes,\r\n buttonIconSizes,\r\n } from '../../tokens/sizing.js';\r\n import { triggerHaptic, getHapticForButtonVariant } from '../../utils/haptic.js';\r\n import { deprecation } from '../../utils/deprecation.js';\r\n\r\n type ButtonVariant =\r\n | 'default' | 'alternative' | 'outline'\r\n | 'red' | 'red-outline' | 'green-outline'\r\n | 'orange' | 'orange-outline'\r\n | 'ghost' | 'ghost-red'\r\n | 'link' | 'icon' | 'toggle'\r\n // Legacy aliases (deprecated, emit warning)\r\n | 'blue-solid' | 'gray-outline' | 'blue-outline'\r\n | 'red-solid' | 'red-text' | 'gray-text';\r\n\r\n type ButtonSize = keyof typeof buttonSizes | keyof typeof buttonIconSizes;\r\n\r\n interface Props {\r\n variant?: ButtonVariant;\r\n size?: ButtonSize;\r\n disabled?: boolean;\r\n loading?: boolean;\r\n success?: boolean;\r\n successText?: string;\r\n active?: boolean;\r\n href?: string | null;\r\n type?: 'button' | 'submit' | 'reset';\r\n /** Enable haptic feedback on click. When true, uses variant-aware haptic style. */\r\n haptic?: boolean;\r\n children?: Snippet;\r\n trailing?: Snippet;\r\n class?: string;\r\n // eslint-disable-next-line no-unused-vars -- intentionally retained (prop/slot/forward-compat or Svelte-5 reactive binding eslint cannot see)\r\n onclick?: (e: MouseEvent) => void;\r\n id?: string;\r\n name?: string;\r\n title?: string;\r\n tabindex?: number;\r\n 'data-testid'?: string;\r\n 'aria-label'?: string;\r\n 'aria-busy'?: boolean;\r\n 'aria-expanded'?: boolean;\r\n 'aria-haspopup'?: boolean | 'true' | 'false' | 'menu' | 'listbox' | 'tree' | 'grid' | 'dialog';\r\n 'aria-controls'?: string;\r\n 'aria-pressed'?: boolean;\r\n 'aria-describedby'?: string;\r\n }\r\n\r\n let {\r\n variant = \"default\",\r\n size = \"md\",\r\n disabled = false,\r\n loading: loadingProp,\r\n success = false,\r\n successText = \"\",\r\n active = false,\r\n href = null,\r\n type = \"button\",\r\n haptic = false,\r\n children,\r\n trailing,\r\n class: className = \"\",\r\n onclick,\r\n id,\r\n name,\r\n title,\r\n tabindex,\r\n 'data-testid': dataTestid,\r\n 'aria-label': ariaLabel,\r\n 'aria-busy': ariaBusy,\r\n 'aria-expanded': ariaExpanded,\r\n 'aria-haspopup': ariaHaspopup,\r\n 'aria-controls': ariaControls,\r\n 'aria-pressed': ariaPressed,\r\n 'aria-describedby': ariaDescribedby,\r\n }: Props = $props();\r\n\r\n // Normalize the optional `loading` prop. We deliberately do NOT default it in\r\n // the destructure: a button is \"loadable\" if the consumer wired `loading` at\r\n // all (even `loading={false}`), so we can reserve a fixed-size leading\r\n // spinner slot — present-but-empty when idle — and toggling `loading` causes\r\n // NO width jump (brief 02-A). Buttons that never load get no slot, so their\r\n // idle layout is untouched.\r\n let loading = $derived(loadingProp ?? false);\r\n let isLoadable = $derived(loadingProp !== undefined);\r\n\r\n // Track previous success state to detect transitions\r\n let prevSuccess = $state(false);\r\n\r\n // Trigger haptic on success state transition (QOL Bible)\r\n $effect(() => {\r\n if (success && !prevSuccess) {\r\n triggerHaptic('success');\r\n }\r\n prevSuccess = success;\r\n });\r\n\r\n // Legacy variant name mapping\r\n const variantMap: Record<string, string> = {\r\n \"blue-solid\": \"default\",\r\n \"gray-outline\": \"alternative\",\r\n \"blue-outline\": \"outline\",\r\n \"red-solid\": \"red\",\r\n \"red-text\": \"ghost-red\",\r\n \"gray-text\": \"ghost\",\r\n };\r\n\r\n // Resolve legacy names (with deprecation warning)\r\n let resolvedVariant = $derived((() => {\r\n const mapped = variantMap[variant];\r\n if (mapped) {\r\n deprecation(\r\n `Button variant \"${variant}\" is deprecated. Use \"${mapped}\" instead.\\n` +\r\n ` Replace: <Button variant=\"${variant}\">\\n` +\r\n ` With: <Button variant=\"${mapped}\">`\r\n );\r\n return mapped;\r\n }\r\n return variant;\r\n })());\r\n let effectiveDisabled = $derived(disabled || loading || success);\r\n\r\n // Icon-only buttons (variant=\"icon\" or a square icon-* size) have no text\r\n // label — their content IS the icon. When loading, we swap that icon FOR the\r\n // spinner in the SAME square (brief 02-A regression fix: never add a separate\r\n // reserved leading slot to an icon-only button — that distorts it).\r\n let isIconOnly = $derived(\r\n resolvedVariant === \"icon\" ||\r\n (typeof size === \"string\" && size.startsWith(\"icon-\"))\r\n );\r\n\r\n // For icon-only buttons we wrap BOTH the idle icon AND the loading spinner in\r\n // ONE fixed-size content box (sized to the conventional icon for that size).\r\n // `variant=\"icon\"` sizes (xs/sm/md/lg) are padding-only — the icon sets the\r\n // width — so without a fixed box, swapping in a smaller spinner would SHRINK\r\n // the button (codex round 3). The box keeps idle↔loading width identical; the\r\n // spinner fills it (w-full h-full) and the idle icon centers inside it.\r\n const iconBoxSizes: Record<string, string> = {\r\n // padding-only icon variant sizes — icons are authored ~w-5 h-5 (w-6 at lg)\r\n xs: \"w-5 h-5\",\r\n sm: \"w-5 h-5\",\r\n md: \"w-5 h-5\",\r\n lg: \"w-6 h-6\",\r\n // square icon-* sizes — box scales with the square button\r\n \"icon-xs\": \"w-4 h-4\",\r\n \"icon-sm\": \"w-4 h-4\",\r\n \"icon-md\": \"w-5 h-5\",\r\n \"icon-lg\": \"w-5 h-5\",\r\n };\r\n let iconBoxClass = $derived(\r\n (typeof size === \"string\" && iconBoxSizes[size]) || \"w-5 h-5\"\r\n );\r\n\r\n // Size classes imported from centralized tokens\r\n\r\n // Variant classes with all states in Tailwind (no focus rings - design decision)\r\n // NOTE: menu-item, avatar, nav, card, search-result, landing, sidebar-toggle, calendar-day, chart-row\r\n // have been extracted to dedicated components: MenuItem, AvatarButton, NavItem, CardAction,\r\n // SearchResultItem, LandingButton, SidebarToggle. Use those components instead.\r\n const variantClasses: Record<string, string> = {\r\n default: \"text-white bg-brand-primary border border-brand-primary hover:bg-brand-primary/90\",\r\n alternative: \"text-text-primary bg-card border border-border hover:bg-muted hover:text-brand-primary\",\r\n outline: \"text-brand-primary bg-transparent border border-brand-primary hover:text-white hover:bg-brand-primary\",\r\n red: \"text-white bg-accent-danger border border-accent-danger hover:bg-accent-danger/90\",\r\n \"red-outline\": \"text-status-error-text bg-transparent border border-accent-danger hover:text-white hover:bg-accent-danger\",\r\n \"green-outline\": \"text-status-success-text bg-transparent border border-accent-success hover:text-white hover:bg-accent-success\",\r\n orange: \"text-white bg-accent-warning border border-accent-warning hover:bg-accent-warning/90\",\r\n \"orange-outline\": \"text-status-warning-text bg-transparent border border-accent-warning hover:text-white hover:bg-accent-warning\",\r\n ghost: \"text-muted-foreground bg-transparent border-transparent hover:bg-muted hover:text-text-primary\",\r\n \"ghost-red\": \"text-status-error-text bg-transparent border-transparent hover:bg-status-error-bg hover:text-accent-danger\",\r\n link: \"text-brand-primary bg-transparent border-transparent hover:underline\",\r\n icon: \"text-muted-foreground bg-transparent border-transparent hover:bg-muted\",\r\n toggle: \"text-text-primary bg-muted border border-border hover:bg-bg-tertiary\",\r\n success: \"text-white bg-accent-success border border-accent-success hover:bg-accent-success/90\",\r\n };\r\n\r\n // Active state classes for ghost and toggle\r\n // NOTE: menu-item and nav active states are now handled by MenuItem and NavItem components\r\n const activeClasses: Record<string, string> = {\r\n ghost: \"text-brand-primary bg-status-info-bg\",\r\n toggle: \"text-white bg-brand-primary border-brand-primary hover:bg-brand-primary\",\r\n };\r\n\r\n // Disabled classes\r\n const disabledClasses = \"bg-bg-tertiary border-border text-muted-foreground cursor-not-allowed\";\r\n // Disabled classes for transparent variants (link, ghost) - no background\r\n const disabledTransparentClasses = \"text-muted-foreground cursor-not-allowed\";\r\n\r\nlet sizeClass = $derived((() => {\r\n // When variant=\"icon\" + size is one of the square icon-* keys\r\n // (icon-xs, icon-sm, icon-md, icon-lg), use buttonSizes' square\r\n // classes — those have explicit w/h that the icon variant's\r\n // padding-only sizing doesn't provide. Without this, e.g.\r\n // variant=\"icon\" size=\"icon-xs\" silently fell back to\r\n // buttonIconSizes.sm (codex round 1 caught the gap).\r\n if (resolvedVariant === \"icon\") {\r\n if (typeof size === \"string\" && size.startsWith(\"icon-\")) {\r\n return buttonSizes[size as keyof typeof buttonSizes] || buttonIconSizes.sm;\r\n }\r\n return buttonIconSizes[size as keyof typeof buttonIconSizes] || buttonIconSizes.sm;\r\n }\r\n if (resolvedVariant === \"link\") return \"text-sm\";\r\n return buttonSizes[size as keyof typeof buttonSizes] || buttonSizes.md;\r\n })());\r\n\r\n // Variants that should stay transparent when disabled\r\n const transparentVariants = [\"link\", \"ghost\", \"ghost-red\", \"icon\"];\r\n\r\n let variantClass = $derived((() => {\r\n if (success) return variantClasses.success;\r\n if (disabled && !loading && !success) {\r\n return transparentVariants.includes(resolvedVariant)\r\n ? disabledTransparentClasses\r\n : disabledClasses;\r\n }\r\n if (active && activeClasses[resolvedVariant]) {\r\n // When active, use ONLY active classes (they include all necessary styling)\r\n return activeClasses[resolvedVariant];\r\n }\r\n return variantClasses[resolvedVariant] || variantClasses.default;\r\n })());\r\n\r\n // Button is always centered - left-aligned variants have been extracted to dedicated components\r\n let isLeftAligned = $derived(false);\r\n\r\n // Use justify-between when there's trailing content (e.g., chevrons in nav items)\r\n let hasTrailing = $derived(typeof trailing === 'function' || trailing);\r\n\r\n // Standard buttons use rounded-lg - landing variants have been extracted to LandingButton\r\n let roundedClass = $derived(\"rounded-lg\");\r\n\r\n // Click handler with optional haptic feedback\r\n function handleClick(e: MouseEvent) {\r\n // <a href> has no native `disabled`, so guard here: when the button is\r\n // disabled/loading/success, suppress navigation AND the onclick callback.\r\n // (The <button> branch is also guarded natively by `disabled`.)\r\n if (effectiveDisabled) {\r\n e.preventDefault();\r\n return;\r\n }\r\n if (haptic) {\r\n const hapticStyle = getHapticForButtonVariant(resolvedVariant);\r\n if (hapticStyle) {\r\n triggerHaptic(hapticStyle);\r\n }\r\n }\r\n onclick?.(e);\r\n }\r\n\r\n let buttonClasses = $derived(twMerge(\r\n \"relative\",\r\n isLeftAligned\r\n ? (hasTrailing ? \"flex items-center justify-between\" : \"flex items-center justify-start\")\r\n : \"inline-flex items-center justify-center\",\r\n roundedClass,\r\n \"font-medium leading-none\",\r\n \"focus:outline-hidden\",\r\n // Apple-style micro-interactions (only when not disabled).\r\n // Press uses the --ease-spring motion token (~0.98 spring-back), not an\r\n // arbitrary ease-out value. duration-fast/ease-spring read from motion.css,\r\n // which the global reduced-motion reset collapses to ~0 — so the press is\r\n // gated for prefers-reduced-motion with no per-component guard.\r\n \"transition-all duration-fast ease-spring\",\r\n effectiveDisabled ? \"\" : \"active:scale-[0.98] active:opacity-90\",\r\n \"select-none\",\r\n sizeClass,\r\n variantClass,\r\n effectiveDisabled ? \"cursor-not-allowed\" : \"cursor-pointer\",\r\n className\r\n ));\r\n</script>\r\n\r\n{#if href}\r\n <a\r\n href={effectiveDisabled ? undefined : href}\r\n {id}\r\n {title}\r\n tabindex={effectiveDisabled ? -1 : tabindex}\r\n class={buttonClasses}\r\n onclick={handleClick}\r\n data-testid={dataTestid}\r\n aria-label={ariaLabel}\r\n aria-disabled={effectiveDisabled || undefined}\r\n aria-busy={loading || ariaBusy || undefined}\r\n aria-expanded={ariaExpanded}\r\n aria-haspopup={ariaHaspopup}\r\n aria-controls={ariaControls}\r\n aria-pressed={ariaPressed}\r\n aria-describedby={ariaDescribedby}\r\n >\r\n <!-- Loading: inline spinner appears, LABEL STAYS VISIBLE (decided feel).\r\n Only `success` hides the label (the checkmark overlay replaces it). -->\r\n <span class=\"inline-flex items-center gap-1.5\" class:invisible={success}>\r\n {#if isIconOnly}\r\n <!-- Icon-only: ONE fixed-size box holds either the idle icon OR the\r\n loading spinner, so idle↔loading width is identical even for\r\n padding-only icon sizes (where the icon sets the width). The\r\n spinner fills the box; the idle icon centers inside it. -->\r\n {#if isLoadable}\r\n <span class=\"grid {iconBoxClass} shrink-0 place-items-center\">\r\n {#if loading}\r\n <!-- Spinner fills the fixed box. `[&]:w-full [&]:h-full` wins over\r\n the Spinner's intrinsic size-sm w/h (it concatenates classes,\r\n no twMerge) so the box size — not the spinner — sets dims. -->\r\n <Spinner size=\"sm\" labels={{ loading: '' }} class=\"[&]:w-full [&]:h-full text-current [&_path]:fill-current\" />\r\n {:else if typeof children === 'function'}{@render children()}{:else if children}{children}{/if}\r\n </span>\r\n {:else if typeof children === 'function'}{@render children()}{:else if children}{children}{/if}\r\n {:else}\r\n {#if isLoadable}\r\n <!-- Reserved leading slot (w-4 h-4 = Spinner size=\"sm\"). Always present\r\n for loadable text buttons so toggling `loading` causes NO width\r\n jump; holds the spinner only while busy, empty otherwise. -->\r\n <span class=\"grid w-4 h-4 shrink-0 place-items-center\" aria-hidden={!loading}>\r\n {#if loading}\r\n <!-- Single-tone spinner inheriting the button label color\r\n (currentColor), legible on every variant. Arbitrary fill\r\n variant beats the token fill-*. -->\r\n <Spinner size=\"sm\" labels={{ loading: '' }} class=\"text-current [&_path]:fill-current\" />\r\n {/if}\r\n </span>\r\n {/if}\r\n {#if typeof children === 'function'}{@render children()}{:else if children}{children}{/if}\r\n {/if}\r\n </span>\r\n {#if typeof trailing === 'function'}{@render trailing()}{:else if trailing}{trailing}{/if}\r\n </a>\r\n{:else}\r\n <button\r\n {type}\r\n {id}\r\n {name}\r\n {title}\r\n {tabindex}\r\n class={buttonClasses}\r\n disabled={effectiveDisabled}\r\n onclick={handleClick}\r\n data-testid={dataTestid}\r\n aria-label={ariaLabel}\r\n aria-busy={loading || ariaBusy || undefined}\r\n aria-expanded={ariaExpanded}\r\n aria-haspopup={ariaHaspopup}\r\n aria-controls={ariaControls}\r\n aria-pressed={ariaPressed}\r\n aria-describedby={ariaDescribedby}\r\n >\r\n <!-- Loading: inline spinner appears, LABEL STAYS VISIBLE (decided feel).\r\n Only `success` hides the label (the checkmark overlay replaces it). -->\r\n <span class=\"inline-flex items-center gap-1.5\" class:invisible={success}>\r\n {#if isIconOnly}\r\n <!-- Icon-only: ONE fixed-size box holds either the idle icon OR the\r\n loading spinner, so idle↔loading width is identical even for\r\n padding-only icon sizes (where the icon sets the width). The\r\n spinner fills the box; the idle icon centers inside it. -->\r\n {#if isLoadable}\r\n <span class=\"grid {iconBoxClass} shrink-0 place-items-center\">\r\n {#if loading}\r\n <!-- Spinner fills the fixed box. `[&]:w-full [&]:h-full` wins over\r\n the Spinner's intrinsic size-sm w/h (it concatenates classes,\r\n no twMerge) so the box size — not the spinner — sets dims. -->\r\n <Spinner size=\"sm\" labels={{ loading: '' }} class=\"[&]:w-full [&]:h-full text-current [&_path]:fill-current\" />\r\n {:else if typeof children === 'function'}{@render children()}{:else if children}{children}{/if}\r\n </span>\r\n {:else if typeof children === 'function'}{@render children()}{:else if children}{children}{/if}\r\n {:else}\r\n {#if isLoadable}\r\n <!-- Reserved leading slot (w-4 h-4 = Spinner size=\"sm\"). Always present\r\n for loadable text buttons so toggling `loading` causes NO width\r\n jump; holds the spinner only while busy, empty otherwise. -->\r\n <span class=\"grid w-4 h-4 shrink-0 place-items-center\" aria-hidden={!loading}>\r\n {#if loading}\r\n <!-- Single-tone spinner inheriting the button label color\r\n (currentColor), legible on every variant. Arbitrary fill\r\n variant beats the token fill-*. -->\r\n <Spinner size=\"sm\" labels={{ loading: '' }} class=\"text-current [&_path]:fill-current\" />\r\n {/if}\r\n </span>\r\n {/if}\r\n {#if typeof children === 'function'}{@render children()}{:else if children}{children}{/if}\r\n {/if}\r\n </span>\r\n {#if typeof trailing === 'function'}{@render trailing()}{:else if trailing}{trailing}{/if}\r\n {#if success}\r\n <span class=\"absolute inset-0 flex items-center justify-center gap-2\">\r\n <CheckOutline class=\"w-5 h-5\" />\r\n {#if successText}<span class=\"font-medium\">{successText}</span>{/if}\r\n </span>\r\n {/if}\r\n </button>\r\n{/if}\r\n","<script lang=\"ts\">\n /* eslint-disable svelte/no-navigation-without-resolve -- drift(tracked): template-position lint (href/resolve, svelte-ignore, compile note); refactor deferred */\r\n /**\r\n * ButtonRoot - Clean typed Button implementation (no escape hatch)\r\n *\r\n * This is the primary Button API. All props are explicitly typed.\r\n * No [key: string]: unknown, no restProps.\r\n *\r\n * Variants (Flowbite naming):\r\n * - default: Primary blue button\r\n * - alternative: Gray outline button\r\n * - outline: Blue outline button\r\n * - red: Destructive solid button\r\n * - red-outline: Destructive outline button\r\n * - ghost: Text-only button\r\n * - ghost-red: Destructive text button\r\n * - icon: Icon-only button\r\n * - toggle: Toggle/pill button\r\n *\r\n * Sizes (Flowbite native): xs, sm, md, lg, xl, landing\r\n *\r\n * Haptic Feedback:\r\n * - Automatic haptic on success state transition\r\n * - Optional haptic on click via `haptic` prop\r\n * - Variant-aware feedback intensity\r\n */\r\n import { CheckOutline } from '../Icons';\r\n import { twMerge } from 'tailwind-merge';\r\n import {\r\n buttonSizes,\r\n buttonIconSizes,\r\n } from '../../tokens/sizing.js';\r\n import { triggerHaptic, getHapticForButtonVariant } from '../../utils/haptic.js';\r\n import type { ButtonRootProps } from './button-types.js';\r\n\r\n let {\r\n variant = \"default\",\r\n size = \"md\",\r\n disabled = false,\r\n loading = false,\r\n success = false,\r\n successText = \"\",\r\n active = false,\r\n href = null,\r\n type = \"button\",\r\n haptic = false,\r\n children,\r\n trailing,\r\n class: className = \"\",\r\n onclick,\r\n // Explicit HTML passthrough props\r\n id,\r\n 'aria-label': ariaLabel,\r\n 'aria-expanded': ariaExpanded,\r\n 'aria-haspopup': ariaHaspopup,\r\n 'aria-controls': ariaControls,\r\n 'data-testid': dataTestid,\r\n tabindex,\r\n name,\r\n form,\r\n title,\r\n }: ButtonRootProps = $props();\r\n\r\n // Track previous success state to detect transitions\r\n let prevSuccess = $state(false);\r\n\r\n // Trigger haptic on success state transition (QOL Bible)\r\n $effect(() => {\r\n if (success && !prevSuccess) {\r\n triggerHaptic('success');\r\n }\r\n prevSuccess = success;\r\n });\r\n\r\n // Legacy variant name mapping\r\n const variantMap: Record<string, string> = {\r\n \"blue-solid\": \"default\",\r\n \"gray-outline\": \"alternative\",\r\n \"blue-outline\": \"outline\",\r\n \"red-solid\": \"red\",\r\n \"red-text\": \"ghost-red\",\r\n \"gray-text\": \"ghost\",\r\n };\r\n\r\n // Resolve legacy names\r\n let resolvedVariant = $derived(variantMap[variant] || variant);\r\n let effectiveDisabled = $derived(disabled || loading || success);\r\n\r\n // Variant classes with all states in Tailwind (no focus rings - design decision)\r\n const variantClasses: Record<string, string> = {\r\n default: \"text-white bg-brand-primary border border-brand-primary hover:bg-brand-primary/90\",\r\n alternative: \"text-text-primary bg-card border border-border hover:bg-muted hover:text-brand-primary\",\r\n outline: \"text-brand-primary bg-transparent border border-brand-primary hover:text-white hover:bg-brand-primary\",\r\n red: \"text-white bg-accent-danger border border-accent-danger hover:bg-accent-danger/90\",\r\n \"red-outline\": \"text-status-error-text bg-transparent border border-accent-danger hover:text-white hover:bg-accent-danger\",\r\n \"green-outline\": \"text-status-success-text bg-transparent border border-accent-success hover:text-white hover:bg-accent-success\",\r\n ghost: \"text-muted-foreground bg-transparent border-transparent hover:bg-muted hover:text-text-primary\",\r\n \"ghost-red\": \"text-status-error-text bg-transparent border-transparent hover:bg-status-error-bg hover:text-accent-danger\",\r\n link: \"text-brand-primary bg-transparent border-transparent hover:underline\",\r\n icon: \"text-muted-foreground bg-transparent border-transparent hover:bg-muted\",\r\n toggle: \"text-text-primary bg-muted border border-border hover:bg-bg-tertiary\",\r\n success: \"text-white bg-accent-success border border-accent-success hover:bg-accent-success/90\",\r\n };\r\n\r\n // Active state classes for ghost and toggle\r\n const activeClasses: Record<string, string> = {\r\n ghost: \"text-brand-primary bg-status-info-bg\",\r\n toggle: \"text-white bg-brand-primary border-brand-primary hover:bg-brand-primary\",\r\n };\r\n\r\n // Disabled classes\r\n const disabledClasses = \"bg-bg-tertiary border-border text-muted-foreground cursor-not-allowed\";\r\n // Disabled classes for transparent variants (link, ghost) - no background\r\n const disabledTransparentClasses = \"text-muted-foreground cursor-not-allowed\";\r\n\r\n let sizeClass = $derived((() => {\r\n if (resolvedVariant === \"icon\") return buttonIconSizes[size as keyof typeof buttonIconSizes] || buttonIconSizes.sm;\r\n if (resolvedVariant === \"link\") return \"text-sm\";\r\n return buttonSizes[size as keyof typeof buttonSizes] || buttonSizes.md;\r\n })());\r\n\r\n // Variants that should stay transparent when disabled\r\n const transparentVariants = [\"link\", \"ghost\", \"ghost-red\", \"icon\"];\r\n\r\n let variantClass = $derived((() => {\r\n if (success) return variantClasses.success;\r\n if (disabled && !loading && !success) {\r\n return transparentVariants.includes(resolvedVariant)\r\n ? disabledTransparentClasses\r\n : disabledClasses;\r\n }\r\n if (active && activeClasses[resolvedVariant]) {\r\n // When active, use ONLY active classes (they include all necessary styling)\r\n return activeClasses[resolvedVariant];\r\n }\r\n return variantClasses[resolvedVariant] || variantClasses.default;\r\n })());\r\n\r\n // Button is always centered - left-aligned variants have been extracted to dedicated components\r\n let isLeftAligned = $derived(false);\r\n\r\n // Use justify-between when there's trailing content (e.g., chevrons in nav items)\r\n let hasTrailing = $derived(typeof trailing === 'function' || trailing);\r\n\r\n // Standard buttons use rounded-lg - landing variants have been extracted to LandingButton\r\n let roundedClass = $derived(\"rounded-lg\");\r\n\r\n // Click handler with optional haptic feedback\r\n function handleClick(e: MouseEvent) {\r\n if (haptic && !effectiveDisabled) {\r\n const hapticStyle = getHapticForButtonVariant(resolvedVariant);\r\n if (hapticStyle) {\r\n triggerHaptic(hapticStyle);\r\n }\r\n }\r\n onclick?.(e);\r\n }\r\n\r\n let buttonClasses = $derived(twMerge(\r\n \"relative\",\r\n isLeftAligned\r\n ? (hasTrailing ? \"flex items-center justify-between\" : \"flex items-center justify-start\")\r\n : \"inline-flex items-center justify-center\",\r\n roundedClass,\r\n \"font-medium leading-none\",\r\n \"focus:outline-hidden\",\r\n // Apple-style micro-interactions (only when not disabled)\r\n \"transition-all duration-150 ease-out\",\r\n effectiveDisabled ? \"\" : \"active:scale-[0.97] active:opacity-90\",\r\n \"select-none\",\r\n sizeClass,\r\n variantClass,\r\n effectiveDisabled ? \"cursor-not-allowed\" : \"cursor-pointer\",\r\n className\r\n ));\r\n</script>\r\n\r\n{#if href}\r\n <a\r\n {href}\r\n class=\"{buttonClasses} {loading ? 'loading-pulse' : ''}\"\r\n onclick={handleClick}\r\n {id}\r\n aria-label={ariaLabel}\r\n aria-expanded={ariaExpanded}\r\n aria-haspopup={ariaHaspopup}\r\n aria-controls={ariaControls}\r\n data-testid={dataTestid}\r\n {tabindex}\r\n {title}\r\n >\r\n {#if loading}\r\n <span class=\"shimmer-overlay\"></span>\r\n {/if}\r\n <span class=\"inline-flex items-center gap-1.5\" class:invisible={loading || success}>\r\n {#if typeof children === 'function'}{@render children()}{:else if children}{children}{/if}\r\n </span>\r\n {#if typeof trailing === 'function'}{@render trailing()}{:else if trailing}{trailing}{/if}\r\n </a>\r\n{:else}\r\n <!-- eslint-disable-next-line micdrop/no-raw-button-tag -- this IS the Button component -->\r\n <button\r\n {type}\r\n class=\"{buttonClasses} {loading ? 'loading-pulse' : ''}\"\r\n disabled={effectiveDisabled}\r\n onclick={handleClick}\r\n {id}\r\n aria-label={ariaLabel}\r\n aria-expanded={ariaExpanded}\r\n aria-haspopup={ariaHaspopup}\r\n aria-controls={ariaControls}\r\n data-testid={dataTestid}\r\n {tabindex}\r\n {name}\r\n {form}\r\n {title}\r\n >\r\n {#if loading}\r\n <span class=\"shimmer-overlay\"></span>\r\n {/if}\r\n <span class=\"inline-flex items-center gap-1.5\" class:invisible={loading || success}>\r\n {#if typeof children === 'function'}{@render children()}{:else if children}{children}{/if}\r\n </span>\r\n {#if typeof trailing === 'function'}{@render trailing()}{:else if trailing}{trailing}{/if}\r\n {#if success}\r\n <span class=\"absolute inset-0 flex items-center justify-center gap-2\">\r\n <CheckOutline class=\"w-5 h-5\" />\r\n {#if successText}<span class=\"font-medium\">{successText}</span>{/if}\r\n </span>\r\n {/if}\r\n </button>\r\n{/if}\r\n\r\n<style>\r\n .loading-pulse {\r\n animation: pulse-bg 2s ease-in-out infinite;\r\n }\r\n\r\n @keyframes pulse-bg {\r\n 0%, 100% { filter: brightness(1); }\r\n 50% { filter: brightness(1.15); }\r\n }\r\n\r\n .shimmer-overlay {\r\n position: absolute;\r\n inset: 0;\r\n overflow: hidden;\r\n border-radius: inherit;\r\n }\r\n\r\n .shimmer-overlay::after {\r\n content: '';\r\n position: absolute;\r\n top: 0;\r\n left: -100%;\r\n width: 100%;\r\n height: 100%;\r\n background: linear-gradient(\r\n 90deg,\r\n transparent 0%,\r\n rgba(255, 255, 255, 0.2) 50%,\r\n transparent 100%\r\n );\r\n animation: shimmer 1s ease-in-out infinite;\r\n }\r\n\r\n @keyframes shimmer {\r\n 0% {\r\n left: -100%;\r\n }\r\n 100% {\r\n left: 100%;\r\n }\r\n }\r\n</style>\r\n","<script lang=\"ts\">\r\n /**\r\n * ButtonGroup - Groups related buttons together with connected styling\r\n *\r\n * Usage:\r\n * <ButtonGroup>\r\n * <Button variant=\"toggle\" active={selected === 'a'}>Option A</Button>\r\n * <Button variant=\"toggle\" active={selected === 'b'}>Option B</Button>\r\n * </ButtonGroup>\r\n */\r\n import type { Snippet } from 'svelte';\r\n\r\n interface Props {\r\n /** Additional CSS classes */\r\n class?: string;\r\n /** Children buttons to group */\r\n children?: Snippet;\r\n }\r\n\r\n let { class: className = '', children }: Props = $props();\r\n</script>\r\n\r\n<div\r\n class=\"inline-flex rounded-lg shadow {className}\"\r\n role=\"group\"\r\n>\r\n {#if children}\r\n {@render children()}\r\n {/if}\r\n</div>\r\n\r\n<style>\r\n div :global(button:not(:first-child):not(:last-child)) {\r\n border-radius: 0;\r\n }\r\n\r\n div :global(button:first-child) {\r\n border-top-right-radius: 0;\r\n border-bottom-right-radius: 0;\r\n }\r\n\r\n div :global(button:last-child) {\r\n border-top-left-radius: 0;\r\n border-bottom-left-radius: 0;\r\n }\r\n\r\n div :global(button:not(:first-child)) {\r\n margin-left: -1px;\r\n }\r\n</style>\r\n","import ButtonLegacy from './Button.svelte';\nimport Root from './ButtonRoot.svelte';\nimport Group from './ButtonGroup.svelte';\nconst Button = Object.assign(ButtonLegacy, { Root, Group });\nexport default Button;\nexport { Root, Group };\n","// =============================================================================\n// Currency\n// =============================================================================\n/**\n * Rounds a number to 2 decimal places (cents precision).\n * Use after any arithmetic on currency values to avoid IEEE 754 drift.\n * e.g. roundCurrency(167.79999999999) → 167.8\n */\nexport function roundCurrency(value) {\n return Math.round((value + Number.EPSILON) * 100) / 100;\n}\n/**\n * Converts cents (integer) to a formatted currency string.\n * Automatically divides by 100 and formats using Intl.NumberFormat.\n * Returns empty string for null/undefined.\n *\n * The `cents` argument is branded as `Cents` so callers cannot pass a\n * raw `number` (e.g. dollars, or an unvalidated API field). Mint a\n * `Cents` value via `toCents(n)` (validates integer + finite) or, at\n * the API-response-transform boundary, `asCents(n)`.\n *\n * @param cents - Amount in cents, branded\n * @param options - CurrencyFormatOptions (optional); pass `signed: true` to\n * prefix non-zero values with `+` or `-`\n * @param locale - BCP 47 locale tag (default: 'en-US')\n * @returns Formatted currency string\n *\n * @example\n * formatCentsAsCurrency(toCents(2550)) // \"$25.50\"\n * formatCentsAsCurrency(asCents(order.priceCents)) // boundary cast\n * formatCentsAsCurrency(toCents(2550), { currency: 'EUR' }) // \"€25.50\"\n * formatCentsAsCurrency(toCents(500), { signed: true }) // \"+$5.00\"\n * formatCentsAsCurrency(toCents(-500), { signed: true }) // \"-$5.00\"\n * formatCentsAsCurrency(toCents(0), { signed: true }) // \"$0.00\"\n */\nexport function formatCentsAsCurrency(cents, options, locale = 'en-US') {\n if (cents === null || cents === undefined)\n return '';\n const dollars = cents / 100;\n const { signed, ...intlOptions } = options ?? {};\n if (signed && dollars !== 0) {\n const sign = dollars > 0 ? '+' : '-';\n return `${sign}${formatCurrency(Math.abs(dollars), intlOptions, locale)}`;\n }\n return formatCurrency(dollars, intlOptions, locale);\n}\n/**\n * Brand-strict variant of {@link formatCurrency}: requires a {@link USD}\n * input (decimal-dollar amount) instead of a raw `number`. Use this in\n * new code so call sites cannot pass an unvalidated number that might\n * actually be cents, sales-tax-included dollars, a percentage decimal,\n * etc.\n *\n * `formatCurrency` stays around for backwards compatibility with the\n * 285 raw-number call sites the migrate-fleet sweep is converting; new\n * code should prefer this brand-strict version.\n *\n * @example\n * formatUSDAsCurrency(toUSD(25.50)) // \"$25.50\"\n * formatUSDAsCurrency(asUSD(order.totalDollars)) // boundary cast\n * formatUSDAsCurrency(toUSD(5), { signed: true }) // \"+$5.00\"\n * formatUSDAsCurrency(toUSD(-5), { signed: true }) // \"-$5.00\"\n * formatUSDAsCurrency(toUSD(0), { signed: true }) // \"$0.00\"\n */\nexport function formatUSDAsCurrency(value, options, locale = 'en-US') {\n if (value === null || value === undefined)\n return '';\n const n = value;\n const { signed, ...intlOptions } = options ?? {};\n if (signed && n !== 0) {\n const sign = n > 0 ? '+' : '-';\n return `${sign}${formatCurrency(Math.abs(n), intlOptions, locale)}`;\n }\n return formatCurrency(n, intlOptions, locale);\n}\n/**\n * Formats a currency value using Intl.NumberFormat.\n * Returns empty string for null/undefined.\n *\n * @param value - Amount in dollars (e.g. 25.5)\n * @param currencyOrOptions - ISO 4217 currency code (default: 'USD') OR Intl.NumberFormatOptions\n * @param locale - BCP 47 locale tag (default: 'en-US'). Ignored if currencyOrOptions is a full options object with its own locale.\n * @returns Formatted string (e.g. \"$25.50\")\n *\n * @example\n * // Legacy: currency code only\n * formatCurrency(25.5) // \"$25.50\" (USD, en-US)\n * formatCurrency(25.5, 'EUR') // \"€25.50\" (EUR, en-US)\n * formatCurrency(25.5, 'EUR', 'de-DE') // \"25,50 €\" (EUR, de-DE)\n *\n * // New: full Intl options\n * formatCurrency(1234.56, { minimumFractionDigits: 0, maximumFractionDigits: 0 })\n * // \"$1,235\" (USD, en-US, no decimals)\n * formatCurrency(1234.56, { currency: 'EUR', maximumFractionDigits: 2 })\n * // \"€1,234.56\" (EUR, en-US)\n */\nexport function formatCurrency(value, currencyOrOptions, locale = 'en-US') {\n if (value === null || value === undefined)\n return '';\n let formatOptions;\n if (typeof currencyOrOptions === 'string') {\n // Legacy: currency code string\n formatOptions = {\n style: 'currency',\n currency: currencyOrOptions,\n };\n }\n else if (currencyOrOptions && typeof currencyOrOptions === 'object') {\n // New: full Intl.NumberFormatOptions object\n formatOptions = {\n style: 'currency',\n currency: currencyOrOptions.currency ?? 'USD',\n ...currencyOrOptions,\n };\n }\n else {\n // Default: USD, en-US\n formatOptions = {\n style: 'currency',\n currency: 'USD',\n };\n }\n return new Intl.NumberFormat(locale, formatOptions).format(value);\n}\n// =============================================================================\n// Strict currency formatters + typed error\n// =============================================================================\n/**\n * Typed error thrown by the strict currency formatters. Use the `code`\n * discriminant to react in callers — null inputs surface differently from\n * NaN inputs from out-of-range inputs.\n *\n * @example\n * try {\n * formatCentsAsCurrencyStrict(rawPriceFromApi);\n * } catch (e) {\n * if (e instanceof CurrencyFormatError && e.code === 'NULL') {\n * reportMissingField('priceCents');\n * } else {\n * throw e;\n * }\n * }\n */\nexport class CurrencyFormatError extends Error {\n constructor(code, value, message) {\n super(message ?? `CurrencyFormatError(${code}): ${JSON.stringify(value)}`);\n this.name = 'CurrencyFormatError';\n this.code = code;\n this.value = value;\n }\n}\n/**\n * Strict variant of {@link formatCentsAsCurrency} — throws\n * {@link CurrencyFormatError} on null / undefined / NaN / out-of-range\n * instead of returning an empty string. Use at the data-trust boundary\n * (server load functions, response mappers) where a missing value should\n * fail loud rather than render as a blank price tag.\n *\n * @example\n * const formatted = formatCentsAsCurrencyStrict(toCents(order.priceCents));\n */\nexport function formatCentsAsCurrencyStrict(cents, options, locale = 'en-US') {\n if (cents === null || cents === undefined) {\n throw new CurrencyFormatError('NULL', cents);\n }\n const n = cents;\n if (!Number.isFinite(n)) {\n throw new CurrencyFormatError('NAN', cents);\n }\n if (Math.abs(n) > Number.MAX_SAFE_INTEGER) {\n throw new CurrencyFormatError('OUT_OF_RANGE', cents);\n }\n const dollars = n / 100;\n return formatCurrency(dollars, options, locale);\n}\n/**\n * Strict variant of {@link formatUSDAsCurrency} — same throw semantics\n * as {@link formatCentsAsCurrencyStrict}. Use at the data-trust boundary.\n */\nexport function formatUSDAsCurrencyStrict(value, options, locale = 'en-US') {\n if (value === null || value === undefined) {\n throw new CurrencyFormatError('NULL', value);\n }\n const n = value;\n if (!Number.isFinite(n)) {\n throw new CurrencyFormatError('NAN', value);\n }\n // Symmetry with formatCentsAsCurrencyStrict — strict APIs reject values\n // outside the safely-representable integer range so downstream rendering\n // can't show silently-rounded totals.\n if (Math.abs(n) > Number.MAX_SAFE_INTEGER) {\n throw new CurrencyFormatError('OUT_OF_RANGE', value);\n }\n return formatCurrency(n, options, locale);\n}\n/**\n * Format `Cents` as a decimal-dollar string with NO currency symbol and\n * NO locale (`\"25.50\"`, not `\"$25.50\"`). The canonical helper for CSV\n * exports / reports / wire-shaped outputs where the receiver wants the\n * raw number text.\n *\n * The convergence record's lint rule (`@micdrop/no-handrolled-currency`)\n * points consumers here when their `.toFixed(2)` site is a CSV export —\n * this is the supported alternative to the file-level `@currency-escape`\n * comment.\n *\n * @example\n * formatCentsAsDecimal(toCents(2550)) // \"25.50\"\n * formatCentsAsDecimal(toCents(0)) // \"0.00\"\n * formatCentsAsDecimal(null) // \"\"\n */\nexport function formatCentsAsDecimal(cents) {\n if (cents === null || cents === undefined)\n return '';\n const n = cents;\n if (!Number.isFinite(n))\n return '';\n return (n / 100).toFixed(2);\n}\n/**\n * Format a signed currency delta between two `Cents` values: rendered with\n * a leading `+` or `-` and the same currency formatting as\n * {@link formatCentsAsCurrency}. Zero deltas render as `$0.00` with no sign.\n *\n * Used by reports / comparisons where the sign of the change matters more\n * than the absolute amount.\n *\n * @example\n * formatCurrencyDelta(toCents(2550), toCents(3050)) // \"+$5.00\"\n * formatCurrencyDelta(toCents(2550), toCents(2300)) // \"-$2.50\"\n * formatCurrencyDelta(toCents(2550), toCents(2550)) // \"$0.00\"\n */\nexport function formatCurrencyDelta(from, to, options, locale = 'en-US') {\n const fromN = from;\n const toN = to;\n const diffCents = toN - fromN;\n const dollars = diffCents / 100;\n const sign = diffCents > 0 ? '+' : diffCents < 0 ? '-' : '';\n // Use the absolute value because Intl will already render a leading minus\n // for negatives via `signDisplay: 'never'` (which we don't set), so we\n // strip the sign ourselves and re-add it deterministically.\n const absFormatted = formatCurrency(Math.abs(dollars), options, locale);\n return `${sign}${absFormatted}`;\n}\n/**\n * Converts various date input types to a Date object.\n * Returns null for invalid or missing inputs.\n */\nfunction toDate(value) {\n if (value === null || value === undefined)\n return null;\n const date = value instanceof Date ? value : new Date(value);\n return isNaN(date.getTime()) ? null : date;\n}\n/**\n * Formats a date according to a locale.\n * Default output: abbreviated month, day, year (e.g. \"Dec 15, 2025\" in en-US).\n *\n * @param value - Date, ISO string, or epoch ms\n * @param options - Intl.DateTimeFormatOptions overrides\n * @param locale - BCP 47 locale tag (default: 'en-US')\n * @param timeZone - IANA timezone (e.g. 'America/Los_Angeles'). Overrides options.timeZone if passed.\n *\n * @deprecated Timezone-OPTIONAL generic. Prefer the timezone-strict canonical\n * from `@getmicdrop/svelte-components/datetime`: `formatEventDate` /\n * `formatShortDate` / `formatFullDate` (a timezone is always required there,\n * so the rendered day is never ambiguous). This generic stays for callers that\n * legitimately have no timezone; output is unchanged.\n */\nexport function formatDate(value, options, locale = 'en-US', timeZone) {\n const date = toDate(value);\n if (!date)\n return '';\n const defaults = {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n };\n const merged = { ...defaults, ...options };\n if (timeZone)\n merged.timeZone = timeZone;\n return new Intl.DateTimeFormat(locale, merged).format(date);\n}\n/**\n * Formats a date as an API-safe ISO date string (YYYY-MM-DD).\n * Uses the supplied timezone (or local time if omitted) to determine the\n * calendar day — this matches the historical per-route `formatDate` helpers\n * used for building query-string date parameters.\n *\n * Returns the branded `DateOnly` type so consumers cannot accept a raw\n * `string` where a calendar date is required — only canonicals that\n * validate the shape can mint one.\n *\n * @param value - Date, ISO string, or epoch ms\n * @param timeZone - IANA timezone (branded). Omit to use the runtime's local timezone.\n *\n * @deprecated Timezone-OPTIONAL lenient version: when `timeZone` is omitted this\n * infers the calendar day from the host timezone and returns a value gracefully\n * on null / epoch input. Prefer the timezone-strict canonical `formatDateForAPI`\n * from `@getmicdrop/svelte-components/datetime`, which REQUIRES a UTC ISO string +\n * IANA timezone and THROWS `DateTimeError` on missing-timezone / null input so the\n * rendered day is never ambiguous. This lenient version survives on the\n * `@getmicdrop/svelte-components/utils/formatters` subpath until the remaining\n * lenient call sites finish migrating.\n */\nexport function formatDateForAPI(value, timeZone) {\n const date = toDate(value);\n if (!date)\n return '';\n // Use en-CA — ISO-8601 formatted output (YYYY-MM-DD) with no additional parts.\n const parts = new Intl.DateTimeFormat('en-CA', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n ...(timeZone ? { timeZone: timeZone } : {}),\n }).formatToParts(date);\n const year = parts.find((p) => p.type === 'year')?.value ?? '';\n const month = parts.find((p) => p.type === 'month')?.value ?? '';\n const day = parts.find((p) => p.type === 'day')?.value ?? '';\n return `${year}-${month}-${day}`;\n}\n/**\n * Formats a date with time.\n * Default output: abbreviated month, day, year, hour, minute\n * (e.g. \"Dec 15, 2025, 3:30 PM\" in en-US).\n *\n * @param value - Date, ISO string, or epoch ms\n * @param options - Intl.DateTimeFormatOptions overrides\n * @param locale - BCP 47 locale tag (default: 'en-US')\n * @param timeZone - IANA timezone. Overrides options.timeZone if passed.\n *\n * @deprecated Timezone-OPTIONAL generic. Prefer the timezone-strict canonical\n * `formatEventDateTime` from `@getmicdrop/svelte-components/datetime` (timezone\n * always required). This generic stays for callers with no timezone; output is\n * unchanged.\n */\nexport function formatDateTime(value, options, locale = 'en-US', timeZone) {\n const date = toDate(value);\n if (!date)\n return '';\n const defaults = {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n };\n const merged = { ...defaults, ...options };\n if (timeZone)\n merged.timeZone = timeZone;\n return new Intl.DateTimeFormat(locale, merged).format(date);\n}\n/**\n * Like {@link formatDate} but with NO defaults — the caller's `options`\n * are passed straight to `Intl.DateTimeFormat`. Use this when migrating\n * existing `.toLocaleDateString(locale, opts)` call sites where the\n * defaults-merge of `formatDate` would change rendered output (e.g.\n * `{ weekday: 'short' }` should produce `\"Fri\"`, not `\"Fri, Dec 20, 2024\"`).\n *\n * `formatDate` is still preferred for new code where the venue-default\n * format is desired; `formatDateRaw` is the targeted exact-match path.\n *\n * @deprecated Timezone-OPTIONAL generic. Prefer the timezone-strict canonical\n * formatters from `@getmicdrop/svelte-components/datetime`. This generic stays\n * for callers with no timezone; output is unchanged.\n */\nexport function formatDateRaw(value, options, locale = 'en-US', timeZone) {\n const date = toDate(value);\n if (!date)\n return '';\n const merged = { ...options };\n if (timeZone)\n merged.timeZone = timeZone;\n return new Intl.DateTimeFormat(locale, merged).format(date);\n}\n/**\n * Like {@link formatDateTime} but with no defaults — see {@link formatDateRaw}.\n *\n * @deprecated Timezone-OPTIONAL generic. Prefer the timezone-strict canonical\n * formatters from `@getmicdrop/svelte-components/datetime`. This generic stays\n * for callers with no timezone; output is unchanged.\n */\nexport function formatDateTimeRaw(value, options, locale = 'en-US', timeZone) {\n return formatDateRaw(value, options, locale, timeZone);\n}\n/**\n * Formats time-only.\n * Default output: hour and minute (e.g. \"3:30 PM\" in en-US).\n *\n * @param value - Date, ISO string, or epoch ms\n * @param options - Intl.DateTimeFormatOptions overrides\n * @param locale - BCP 47 locale tag (default: 'en-US')\n * @param timeZone - IANA timezone. Overrides options.timeZone if passed.\n *\n * @deprecated Timezone-OPTIONAL generic. Prefer the timezone-strict canonical\n * `formatEventTime` from `@getmicdrop/svelte-components/datetime` (timezone\n * always required). This generic stays for callers with no timezone; output is\n * unchanged.\n */\nexport function formatTime(value, options, locale = 'en-US', timeZone) {\n const date = toDate(value);\n if (!date)\n return '';\n const defaults = {\n hour: 'numeric',\n minute: '2-digit',\n };\n const merged = { ...defaults, ...options };\n if (timeZone)\n merged.timeZone = timeZone;\n return new Intl.DateTimeFormat(locale, merged).format(date);\n}\n/**\n * Formats a number according to a locale.\n * Returns empty string for null/undefined.\n *\n * @param value - Number to format\n * @param options - Intl.NumberFormatOptions overrides\n * @param locale - BCP 47 locale tag (default: 'en-US')\n */\nexport function formatNumber(value, options, locale = 'en-US') {\n if (value === null || value === undefined)\n return '';\n return new Intl.NumberFormat(locale, options).format(value);\n}\n/**\n * Relative time string (e.g., \"5 minutes ago\", \"2 days ago\").\n * Computes the difference between the provided date and now.\n *\n * @param date - Date, ISO string, or epoch ms\n * @returns Relative time string\n *\n * @example\n * timeAgo(new Date()) // \"0 seconds ago\"\n * timeAgo(new Date(Date.now() - 3600000)) // \"1 hour ago\"\n * timeAgo('2025-12-01T10:00:00Z') // \"X days ago\" (depends on current time)\n *\n * @deprecated Prefer the canonical `formatRelativeTime` /\n * `formatNotificationTime` from `@getmicdrop/svelte-components/datetime`. This\n * generic stays for existing callers; output is unchanged.\n */\nexport function timeAgo(date) {\n const targetDate = toDate(date);\n if (!targetDate)\n return '';\n const now = new Date();\n const seconds = Math.floor((now.getTime() - targetDate.getTime()) / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n const months = Math.floor(days / 30);\n const years = Math.floor(months / 12);\n if (seconds < 60) {\n return `${seconds} second${seconds !== 1 ? 's' : ''} ago`;\n }\n else if (minutes < 60) {\n return `${minutes} minute${minutes !== 1 ? 's' : ''} ago`;\n }\n else if (hours < 24) {\n return `${hours} hour${hours !== 1 ? 's' : ''} ago`;\n }\n else if (days < 30) {\n return `${days} day${days !== 1 ? 's' : ''} ago`;\n }\n else if (months < 12) {\n return `${months} month${months !== 1 ? 's' : ''} ago`;\n }\n else {\n return `${years} year${years !== 1 ? 's' : ''} ago`;\n }\n}\n/**\n * Formats a decimal as a percentage string.\n * Returns empty string for null/undefined.\n *\n * @param value - Decimal to format as percentage (e.g. 0.25 → \"25%\")\n * @param decimals - Number of decimal places in the percentage (default: 0)\n * @param locale - BCP 47 locale tag (default: 'en-US')\n * @returns Formatted percentage string\n *\n * @example\n * formatPercent(0.25) // \"25%\"\n * formatPercent(0.2567, 2) // \"25.67%\"\n * formatPercent(0.33333, 1, 'de-DE') // \"33,3%\"\n */\nexport function formatPercent(value, decimals = 0, locale = 'en-US') {\n if (value === null || value === undefined)\n return '';\n return new Intl.NumberFormat(locale, {\n style: 'percent',\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(value);\n}\n/**\n * Formats a count (integer) using locale-aware thousand separators.\n * Returns empty string for null/undefined.\n *\n * @param value - Integer to format\n * @param locale - BCP 47 locale tag (default: 'en-US')\n * @returns Formatted count string\n *\n * @example\n * formatCount(1234) // \"1,234\"\n * formatCount(1234, 'de-DE') // \"1.234\"\n */\nexport function formatCount(value, locale = 'en-US') {\n if (value === null || value === undefined)\n return '';\n return new Intl.NumberFormat(locale, {\n useGrouping: true,\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(value);\n}\n// =============================================================================\n// Names\n// =============================================================================\n/**\n * Combines first and last names into a single full-name string.\n * Trims whitespace from each part and returns the appropriate format.\n * Returns empty string if both parts are empty/undefined.\n *\n * @param firstName - First name (optional)\n * @param lastName - Last name (optional)\n * @returns Full name string, or empty string if both are empty\n *\n * @example\n * formatFullName(\"John\", \"Doe\") // \"John Doe\"\n * formatFullName(\"John\") // \"John\"\n * formatFullName(undefined, \"Doe\") // \"Doe\"\n * formatFullName(\"\", \"\") // \"\"\n * formatFullName(\" John \", \" Doe \") // \"John Doe\"\n */\nexport function formatFullName(firstName, lastName) {\n const first = firstName?.trim() || '';\n const last = lastName?.trim() || '';\n if (first && last)\n return `${first} ${last}`;\n if (first)\n return first;\n if (last)\n return last;\n return '';\n}\n/**\n * Parses a full name string into first and last name components.\n * Splits on whitespace; treats the last word as lastName and everything\n * before it as firstName. Returns empty strings if input is empty/undefined.\n *\n * @param fullName - Full name string to parse\n * @returns Object with firstName and lastName strings\n *\n * @example\n * parseFullName(\"John Doe\") // { firstName: \"John\", lastName: \"Doe\" }\n * parseFullName(\"John\") // { firstName: \"John\", lastName: \"\" }\n * parseFullName(\"John Q Public\") // { firstName: \"John Q\", lastName: \"Public\" }\n * parseFullName(\"\") // { firstName: \"\", lastName: \"\" }\n * parseFullName(\" John Doe \") // { firstName: \"John\", lastName: \"Doe\" }\n */\nexport function parseFullName(fullName) {\n const parts = fullName.trim().split(/\\s+/);\n if (parts.length === 0 || (parts.length === 1 && !parts[0])) {\n return { firstName: '', lastName: '' };\n }\n if (parts.length === 1) {\n return { firstName: parts[0], lastName: '' };\n }\n // Last word is lastName, rest is firstName\n const lastName = parts.pop() || '';\n const firstName = parts.join(' ');\n return { firstName, lastName };\n}\n// =============================================================================\n// Text\n// =============================================================================\n/**\n * Truncates a string to maxLength characters, appending \"...\" when truncated.\n *\n * @param title - Text to truncate\n * @param maxLength - Maximum character count before truncation (default: 50)\n */\nexport function truncateTitle(title, maxLength = 50) {\n if (title.length > maxLength) {\n return title.slice(0, maxLength) + '...';\n }\n return title;\n}\n// =============================================================================\n// Input formatting (credit card, phone)\n// =============================================================================\n/**\n * Format a credit card number with spaces every 4 digits\n * @param value - Raw input (digits only)\n * @returns Formatted credit card number (e.g., \"1234 5678 9012 3456\")\n */\nexport function formatCreditCardNumber(value) {\n return value.replace(/\\D/g, \"\").replace(/(.{4})/g, \"$1 \").trim();\n}\n/**\n * Format a US phone number with dashes\n * @param value - Raw input (digits only)\n * @returns Formatted phone number (e.g., \"123-456-7890\")\n */\nexport function formatPhoneNumber(value) {\n const cleanedValue = value.replace(/\\D/g, \"\");\n let formattedValue = \"\";\n if (cleanedValue.length > 0)\n formattedValue += cleanedValue.substring(0, 3);\n if (cleanedValue.length >= 4)\n formattedValue += \"-\" + cleanedValue.substring(3, 6);\n if (cleanedValue.length >= 7)\n formattedValue += \"-\" + cleanedValue.substring(6, 10);\n return formattedValue;\n}\n/**\n * Validates a US phone number (10 digits).\n *\n * @param value - Phone number string (with or without formatting)\n * @returns true if valid 10-digit North American format, false otherwise\n *\n * @example\n * isValidPhoneNumber(\"123-456-7890\") // true\n * isValidPhoneNumber(\"1234567890\") // true\n * isValidPhoneNumber(\"(123) 456-7890\") // true\n * isValidPhoneNumber(\"123-456\") // false\n * isValidPhoneNumber(\"\") // false\n */\nexport function isValidPhoneNumber(value) {\n if (!value)\n return false;\n const cleanedValue = value.replace(/\\D/g, \"\");\n return cleanedValue.length === 10;\n}\n/**\n * Normalizes legacy fee dialect values to canonical enum values.\n *\n * Backend canonical: 'fixed' | 'percentage' | 'both'\n * Legacy values that may still arrive: 'flat' | 'percent' | 'cents'\n *\n * @param type - Raw charge type string from API / venue config\n * @returns Canonical ChargeType value\n */\nexport function normalizeChargeType(type) {\n switch (type) {\n case 'flat':\n case 'cents':\n console.warn(`[normalizeChargeType] Legacy serviceFeeChargeType \"${type}\" received -- use \"fixed\"`);\n return 'fixed';\n case 'percent':\n console.warn(`[normalizeChargeType] Legacy serviceFeeChargeType \"${type}\" received -- use \"percentage\"`);\n return 'percentage';\n case 'fixed':\n case 'percentage':\n case 'both':\n return type;\n default:\n return 'both';\n }\n}\n","<script lang=\"ts\">\r\n /**\r\n * Input Component - Flowbite Native\r\n * Migrated to Svelte 5 runes\r\n *\r\n * NOTE: This component does NOT perform any validation.\r\n * All validation should be handled externally (e.g., via Zod schemas).\r\n * Use the `errorText` prop to display validation errors.\r\n * Use the `color` prop ('red' | 'base') to style the border.\r\n */\r\n import type { Snippet } from 'svelte';\r\n import { safeSlide } from \"../../utils/transitions.js\";\r\n import { cubicOut } from \"svelte/easing\";\r\n import { onDestroy } from \"svelte\";\r\n import { EyeOutline, EyeSlashOutline, CloseCircleOutline, ExclamationCircleOutline } from \"../Icons\";\r\n import { typography } from \"../../tokens/typography\";\r\n import { formInputSizes } from \"../../tokens/sizing\";\r\n import { formatCreditCardNumber, formatPhoneNumber } from \"../../utils/formatters\";\r\n import { deprecation } from '../../utils/deprecation.js';\r\n\r\n type InputSize = 'sm' | 'md' | 'lg';\r\n type InputColor = 'base' | 'red';\r\n type StatusType = 'success' | 'error' | '';\r\n type InputValue = string | number | null;\r\n\r\n interface Labels {\r\n hidePassword?: string;\r\n showPassword?: string;\r\n clearInput?: string;\r\n buttonIconAlt?: string;\r\n inputIconAlt?: string;\r\n helperIconAlt?: string;\r\n optional?: string;\r\n }\r\n\r\n interface Props {\r\n required?: boolean;\r\n disabled?: boolean;\r\n optional?: boolean;\r\n icon?: string | null;\r\n buttonIcon?: string | null;\r\n buttonText?: string | null;\r\n maxlength?: number | null;\r\n minlength?: number | null;\r\n type?: string;\r\n placeholder?: string;\r\n label?: string;\r\n id?: string;\r\n name?: string;\r\n class?: string;\r\n size?: InputSize;\r\n textareaSize?: string;\r\n errorText?: string;\r\n color?: InputColor;\r\n helperText?: string;\r\n helperIcon?: string;\r\n hintText?: string;\r\n hintIcon?: string;\r\n contentFloat?: string;\r\n readonly?: boolean;\r\n controlled?: boolean;\r\n // eslint-disable-next-line no-unused-vars -- intentionally retained (prop/slot/forward-compat or Svelte-5 reactive binding eslint cannot see)\r\n onButtonClick?: ((value: string) => void) | null;\r\n // eslint-disable-next-line no-unused-vars -- intentionally retained (prop/slot/forward-compat or Svelte-5 reactive binding eslint cannot see)\r\n onbuttonclick?: ((value: string) => void) | null;\r\n value?: InputValue;\r\n autocomplete?: string | null;\r\n autofocus?: boolean;\r\n showPasswordToggle?: boolean;\r\n animateFocus?: boolean;\r\n statusText?: string;\r\n statusType?: StatusType | string;\r\n buttonDisabled?: boolean;\r\n inputmode?: 'none' | 'text' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search' | null;\r\n instantSearch?: boolean;\r\n debounceMs?: number;\r\n minSearchChars?: number;\r\n showClearButton?: boolean;\r\n // eslint-disable-next-line no-unused-vars -- intentionally retained (prop/slot/forward-compat or Svelte-5 reactive binding eslint cannot see)\r\n onsearch?: (detail: { query: string }) => void;\r\n onfocus?: () => void;\r\n onblur?: () => void;\r\n // eslint-disable-next-line no-unused-vars -- forwarded via restProps to the wrapper; keydown bubbles up from the input\r\n onkeydown?: (e: KeyboardEvent) => void;\r\n // eslint-disable-next-line no-unused-vars -- intentionally retained (prop/slot/forward-compat or Svelte-5 reactive binding eslint cannot see)\r\n oninputchange?: (value: string) => void;\r\n leftIcon?: Snippet;\r\n labels?: Labels;\r\n // Wrapper-div passthrough: allows consumers to set data-*/aria-* on the outer container.\r\n // Narrowly typed to keep known-prop safety while supporting HTML attrs.\r\n [key: `data-${string}`]: unknown;\r\n [key: `aria-${string}`]: unknown;\r\n }\r\n\r\n const defaultLabels: Required<Labels> = {\r\n hidePassword: 'Hide password',\r\n showPassword: 'Show password',\r\n clearInput: 'Clear input',\r\n buttonIconAlt: 'Button Icon',\r\n inputIconAlt: 'Input icon',\r\n helperIconAlt: 'Helper icon',\r\n optional: '(optional)',\r\n };\r\n\r\n let {\r\n required = false,\r\n disabled = false,\r\n optional = false,\r\n icon = null,\r\n buttonIcon = null,\r\n buttonText = null,\r\n maxlength = null,\r\n minlength = null,\r\n type = \"text\",\r\n placeholder = \"\",\r\n label = \"\",\r\n id = \"\",\r\n name = \"\",\r\n class: className = \"\",\r\n size = \"md\",\r\n textareaSize = \"\",\r\n errorText = \"\",\r\n color = \"base\",\r\n helperText = \"\",\r\n helperIcon = \"\",\r\n hintText = \"\",\r\n hintIcon = \"\",\r\n contentFloat = \"left\",\r\n readonly = false,\r\n controlled = false,\r\n onButtonClick = null,\r\n onbuttonclick = null,\r\n value = $bindable<InputValue>(\"\"),\r\n autocomplete = null,\r\n autofocus = false,\r\n showPasswordToggle = true,\r\n animateFocus = true,\r\n statusText = \"\",\r\n statusType = \"\",\r\n buttonDisabled = false,\r\n inputmode = null,\r\n instantSearch = false,\r\n debounceMs = 250,\r\n minSearchChars = 2,\r\n showClearButton = false,\r\n onsearch,\r\n onfocus,\r\n onblur,\r\n oninputchange,\r\n leftIcon,\r\n labels: userLabels = {},\r\n ...restProps\r\n }: Props = $props();\r\n\r\n // eslint-disable-next-line svelte/valid-compile -- known Svelte compiler note, accepted for this primitive\r\n if (onButtonClick && !onbuttonclick) {\r\n deprecation('Input: prop \"onButtonClick\" is deprecated. Use \"onbuttonclick\" instead.');\r\n }\r\n\r\n let resolvedOnButtonClick = $derived(onbuttonclick ?? onButtonClick);\r\n\r\n let labels = $derived({ ...defaultLabels, ...userLabels });\r\n\r\n // Same $state-captures-$prop anti-pattern as the old FormFieldRoot —\r\n // Svelte 5 strict silently breaks bindable propagation when $state is\r\n // initialized directly from a destructured $props() value. Start neutral\r\n // and let the $effect below sync on mount and subsequent prop changes.\r\n let inputValue = $state<InputValue>(\"\");\r\n let inputElement = $state<HTMLInputElement | HTMLTextAreaElement | null>(null);\r\n let debounceTimer: ReturnType<typeof setTimeout> | undefined;\r\n\r\n let computedInputmode = $derived(inputmode || getInputmodeFromType(type));\r\n\r\n // Cast to the DOM `autocomplete` attribute type (lib.dom.d.ts `AutoFill`).\r\n // Kept as a narrowed derived so TS accepts the assignment at call sites.\r\n let autocompleteCast = $derived<any>(autocomplete ?? null);\r\n\r\n function getInputmodeFromType(inputType: string): Props['inputmode'] {\r\n switch (inputType) {\r\n case 'phoneNumber':\r\n case 'creditCardNumber':\r\n return 'tel';\r\n case 'email':\r\n return 'email';\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n $effect(() => {\r\n if (value !== inputValue) {\r\n inputValue = value;\r\n }\r\n });\r\n\r\n function checkForAutofill() {\r\n if (inputElement && inputElement.value !== inputValue) {\r\n inputValue = inputElement.value;\r\n value = inputValue;\r\n }\r\n }\r\n\r\n let isPasswordVisible = $state(false);\r\n\r\n // Error state derived from color prop or errorText\r\n let hasError = $derived(color === 'red' || Boolean(errorText));\r\n\r\n let inputType = $derived(showPasswordToggle && isPasswordVisible ? \"text\" : type);\r\n let shouldAnimate = $derived(animateFocus && !disabled && !readonly);\r\n\r\n let sizeClass = $derived(formInputSizes[size] || formInputSizes.md);\r\n\r\n const togglePasswordVisibility = () => {\r\n isPasswordVisible = !isPasswordVisible;\r\n };\r\n\r\n const handleInput = (event: Event) => {\r\n const target = event.target as HTMLInputElement | HTMLTextAreaElement;\r\n let next: string = target.value;\r\n\r\n // Format special input types\r\n if (type === \"creditCardNumber\") {\r\n const rawInput = next.replace(/\\D/g, \"\");\r\n next = formatCreditCardNumber(rawInput);\r\n target.value = next;\r\n }\r\n\r\n if (type === \"phoneNumber\") {\r\n const rawInput = next.replace(/\\D/g, \"\");\r\n next = formatPhoneNumber(rawInput);\r\n target.value = next;\r\n }\r\n\r\n if (type === \"username\") {\r\n let sanitized = next.trim();\r\n const urlPattern = /(?:https?:\\/\\/)?(?:www\\.)?(?:instagram\\.com|twitter\\.com|x\\.com|facebook\\.com|fb\\.com|tiktok\\.com|linkedin\\.com)\\/(?:@)?([A-Za-z0-9._]+)\\/?/i;\r\n const urlMatch = sanitized.match(urlPattern);\r\n if (urlMatch) {\r\n sanitized = urlMatch[1];\r\n }\r\n sanitized = sanitized.replace(/^@+/, \"\");\r\n sanitized = sanitized.replace(/[^A-Za-z0-9._]/g, \"\");\r\n next = sanitized;\r\n target.value = next;\r\n }\r\n\r\n inputValue = next;\r\n value = next;\r\n\r\n // Call oninputchange callback if provided\r\n oninputchange?.(next);\r\n\r\n // Handle instant search\r\n if (instantSearch) {\r\n clearTimeout(debounceTimer);\r\n if (next.length === 0) {\r\n onsearch?.({ query: '' });\r\n return;\r\n }\r\n if (next.length >= minSearchChars) {\r\n debounceTimer = setTimeout(() => {\r\n onsearch?.({ query: next });\r\n }, debounceMs);\r\n }\r\n }\r\n };\r\n\r\n function clearInput() {\r\n inputValue = '';\r\n value = '';\r\n clearTimeout(debounceTimer);\r\n if (instantSearch) {\r\n onsearch?.({ query: '' });\r\n }\r\n if (inputElement) {\r\n inputElement.focus();\r\n }\r\n }\r\n\r\n function handleSearchKeyDown(event: KeyboardEvent) {\r\n if (instantSearch) {\r\n if (event.key === 'Enter') {\r\n clearTimeout(debounceTimer);\r\n onsearch?.({ query: String(inputValue ?? '') });\r\n }\r\n if (event.key === 'Escape') {\r\n clearInput();\r\n }\r\n }\r\n }\r\n\r\n onDestroy(() => {\r\n clearTimeout(debounceTimer);\r\n });\r\n\r\n const handleBlur = () => {\r\n onblur?.();\r\n };\r\n\r\n const handleFocus = () => {\r\n onfocus?.();\r\n };\r\n\r\n const getContentFloatClass = () => {\r\n switch (contentFloat) {\r\n case \"center\": return \"text-center\";\r\n case \"right\": return \"text-right\";\r\n default: return \"text-left\";\r\n }\r\n };\r\n\r\n const getTextareaSizeClass = () => {\r\n switch (textareaSize) {\r\n case \"sm\": return \"h-24\";\r\n case \"md\": return \"h-36\";\r\n case \"lg\": return \"h-44\";\r\n default: return \"\";\r\n }\r\n };\r\n\r\n const handleButtonClick = () => {\r\n if (typeof resolvedOnButtonClick === \"function\") {\r\n resolvedOnButtonClick(String(inputValue ?? ''));\r\n }\r\n };\r\n</script>\r\n\r\n<div class=\"flex flex-col gap-2 {className}\" {...restProps}>\r\n {#if label}\r\n <div class=\"flex justify-start items-center gap-1\">\r\n <label for={id} class={`${typography.label} leading-tight sm:leading-none`}>\r\n {label}{#if required}<span class=\"text-accent-danger font-medium text-sm ml-0.5\">*</span>{/if}\r\n </label>\r\n {#if statusText}\r\n <span class=\"text-sm font-medium {statusType === 'success' ? 'text-accent-success' : statusType === 'error' ? 'text-accent-danger' : ''}\">({statusText})</span>\r\n {/if}\r\n {#if optional}\r\n <span class={typography.smMuted}>{labels.optional}</span>\r\n {/if}\r\n </div>\r\n {/if}\r\n <div class=\"relative w-full\">\r\n {#if type === \"textarea\"}\r\n <textarea\r\n {id}\r\n {name}\r\n {placeholder}\r\n value={inputValue}\r\n oninput={handleInput}\r\n onblur={handleBlur}\r\n onfocus={handleFocus}\r\n {maxlength}\r\n {minlength}\r\n class=\"{typography.sm} w-full px-3 py-2 bg-bg-secondary border rounded-lg font-medium placeholder-muted-foreground transition-all focus:outline-none focus:ring-4 focus:ring-focus-ring resize-y {hasError ? 'border-status-error-border' : 'border-stroke-primary hover:border-interactive-border focus:border-interactive-border'} {getContentFloatClass()} {getTextareaSizeClass()} {shouldAnimate ? 'focus:scale-[1.01]' : ''}\"\r\n required={false}\r\n {disabled}\r\n {readonly}\r\n rows=\"4\"\r\n aria-required={required}\r\n ></textarea>\r\n {:else if type === \"password\" && showPasswordToggle}\r\n <div class=\"flex items-center w-full bg-bg-secondary border rounded-lg transition-all outline-none focus-within:ring-4 focus-within:ring-focus-ring {hasError ? 'border-status-error-border' : 'border-stroke-primary hover:border-interactive-border focus-within:border-interactive-border'} {shouldAnimate ? 'focus-within:scale-[1.01]' : ''} {disabled ? 'opacity-50 cursor-not-allowed' : ''}\">\r\n <!-- svelte-ignore a11y_autofocus -->\r\n <input\r\n bind:this={inputElement}\r\n {id}\r\n type={inputType}\r\n {name}\r\n {placeholder}\r\n value={inputValue}\r\n oninput={handleInput}\r\n onchange={checkForAutofill}\r\n onblur={handleBlur}\r\n onfocus={handleFocus}\r\n {maxlength}\r\n {minlength}\r\n class=\"password-input-inner {typography.sm} flex-1 w-full {sizeClass} bg-transparent border-0 font-medium placeholder-muted-foreground focus:outline-none focus:ring-0 {getContentFloatClass()}\"\r\n required={false}\r\n {disabled}\r\n {readonly}\r\n aria-required={required}\r\n autocomplete={autocompleteCast}\r\n {autofocus}\r\n inputmode={computedInputmode}\r\n />\r\n <button\r\n type=\"button\"\r\n onclick={togglePasswordVisibility}\r\n class=\"flex items-center justify-center px-3 text-muted-foreground hover:text-text-secondary focus:outline-none\"\r\n tabindex=\"-1\"\r\n aria-label={isPasswordVisible ? labels.hidePassword : labels.showPassword}\r\n >\r\n {#if isPasswordVisible}\r\n <EyeSlashOutline class=\"w-5 h-5\" />\r\n {:else}\r\n <EyeOutline class=\"w-5 h-5\" />\r\n {/if}\r\n </button>\r\n </div>\r\n {:else}\r\n <div class=\"relative flex items-center w-full\">\r\n {#if leftIcon}\r\n <div class=\"absolute left-3 inset-y-0 flex items-center text-muted-foreground z-10 pointer-events-none\">\r\n {@render leftIcon()}\r\n </div>\r\n {/if}\r\n <!-- svelte-ignore a11y_autofocus -->\r\n <input\r\n bind:this={inputElement}\r\n {id}\r\n type={inputType}\r\n {name}\r\n {placeholder}\r\n value={inputValue}\r\n oninput={handleInput}\r\n onchange={checkForAutofill}\r\n onblur={handleBlur}\r\n onfocus={handleFocus}\r\n onkeydown={handleSearchKeyDown}\r\n {maxlength}\r\n {minlength}\r\n class=\"{typography.body} w-full {sizeClass} bg-bg-secondary border rounded-lg font-medium placeholder-muted-foreground transition-all focus:outline-none focus:ring-4 focus:ring-focus-ring {hasError ? 'border-status-error-border' : 'border-stroke-primary hover:border-interactive-border focus:border-interactive-border'} {icon || (showClearButton && inputValue) ? 'pr-10' : ''} {leftIcon ? 'pl-10' : ''} {getContentFloatClass()} {shouldAnimate ? 'focus:scale-[1.01]' : ''} {disabled ? 'opacity-50 cursor-not-allowed' : ''}\"\r\n required={false}\r\n {disabled}\r\n {readonly}\r\n aria-required={required}\r\n autocomplete={autocompleteCast}\r\n {autofocus}\r\n inputmode={computedInputmode}\r\n />\r\n {#if showClearButton && inputValue}\r\n <button\r\n type=\"button\"\r\n onclick={clearInput}\r\n class=\"absolute right-2 top-1/2 -translate-y-1/2 flex items-center justify-center p-1 text-muted-foreground hover:text-text-secondary\"\r\n aria-label={labels.clearInput}\r\n tabindex=\"-1\"\r\n >\r\n <CloseCircleOutline class=\"w-4 h-4\" />\r\n </button>\r\n {:else if controlled && (buttonIcon || buttonText)}\r\n <button\r\n type=\"button\"\r\n onclick={handleButtonClick}\r\n disabled={buttonDisabled}\r\n class=\"absolute inset-y-0 right-0 gap-1 flex items-center justify-center px-4 text-brand-primary hover:text-brand-primary disabled:opacity-50 disabled:cursor-not-allowed {helperText || hintText || errorText ? 'mb-7' : ''}\"\r\n >\r\n {#if buttonIcon}\r\n <img src={buttonIcon} alt={labels.buttonIconAlt} class=\"w-5 h-5\" />\r\n {/if}\r\n {#if buttonText}\r\n <span class=\"text-sm font-medium\">{buttonText}</span>\r\n {/if}\r\n </button>\r\n {/if}\r\n {#if icon && type !== \"textarea\" && !(showClearButton && inputValue)}\r\n <img src={icon} alt={labels.inputIconAlt} class=\"absolute inset-y-0 right-0 w-5 h-5 mr-3 top-1/2 transform -translate-y-1/2\" />\r\n {/if}\r\n </div>\r\n {/if}\r\n\r\n {#if errorText}\r\n <div transition:safeSlide={{ duration: 300, easing: cubicOut }} class=\"flex items-start gap-1.5 mt-2\" role=\"alert\" aria-live=\"assertive\">\r\n <ExclamationCircleOutline class=\"w-4 h-4 shrink-0 text-accent-danger mt-0.5\" />\r\n <p class={typography.error}>{errorText}</p>\r\n </div>\r\n {:else if helperText || hintText}\r\n <div class={`mt-2 flex items-center ${typography.xsMuted} opacity-65`}>\r\n {#if helperIcon || hintIcon}\r\n <img src={helperIcon || hintIcon} alt={labels.helperIconAlt} class=\"w-4 h-4 mr-2\" />\r\n {/if}\r\n <!-- eslint-disable-next-line svelte/no-at-html-tags -->\r\n <span>{@html helperText || hintText}</span>\r\n </div>\r\n {/if}\r\n </div>\r\n</div>\r\n\r\n<style>\r\n /*\r\n * Override Tailwind v4 preflight which sets input { border: 1px solid currentColor }\r\n * in @layer base. The base layer's element selector has higher specificity than\r\n * utility class selectors like border-0 or border-none, so we need scoped overrides.\r\n *\r\n * This affects the password input which is wrapped in a container div that provides\r\n * the visible border - the inner input should have no border.\r\n */\r\n :global(.password-input-inner) {\r\n border: none !important;\r\n }\r\n</style>\r\n","/**\n * Svelte action that portals an element to a target container (default: document.body)\n * This moves the element outside of any stacking contexts, solving iOS z-index issues.\n *\n * Usage: <div use:portal>...</div>\n * Or: <div use:portal={document.getElementById('modal-root')}>...</div>\n */\nexport function portal(node, target = document.body) {\n // Move the node to the target\n target.appendChild(node);\n\n return {\n update(newTarget) {\n // If target changes, move to new target\n newTarget = newTarget || document.body;\n newTarget.appendChild(node);\n },\n destroy() {\n // Clean up - remove the node when component is destroyed\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n }\n };\n}\n","/**\n * Modal compound component context.\n *\n * Convention: Every compound component gets a context.ts file using\n * Svelte 5's createContext(). The returned [get, set] tuple provides\n * type-safe context that auto-throws if a sub-component is used\n * outside its Root.\n *\n * Prop-derived values (open, size, persistent, variant, role, titleId,\n * descriptionId) are exposed as GETTERS so they're correct during SSR and\n * reactive after mount with no $effect — effects don't run on the server\n * (brief 00 §A1). The a11y id wiring (aria-labelledby ← ModalTitle,\n * aria-describedby ← ModalDescription) follows the §A6 overlay archetype:\n * each part registers its presence; the Panel resolves the linked ids.\n *\n * `hasTitle` / `hasDescription` are owned mutable $state, registered by the\n * ModalTitle / ModalDescription parts (whose presence the Root can't know at\n * render time — this is the one case §A1 sanctions $effect registration, with\n * cleanup). The ids themselves are stable getters derived from a single\n * `$props.id()` so the link is byte-stable across SSR + hydration.\n */\nimport { createContext, getContext, setContext } from 'svelte';\n// Uses raw get/setContext (not createContext) so the getter can return\n// `undefined` instead of throwing when a Title/Description is rendered outside a\n// panel scope — those parts fall back to 'always'.\nconst MODAL_PANEL_VISIBILITY = Symbol('modal-panel-visibility');\nexport const setModalPanelVisibility = (visibility) => {\n setContext(MODAL_PANEL_VISIBILITY, visibility);\n};\nexport const getModalPanelVisibility = () => getContext(MODAL_PANEL_VISIBILITY);\nexport const [getModalContext, setModalContext] = createContext();\n","/**\r\n * Mark every sibling of the dialog node as `inert` + `aria-hidden` while a modal\r\n * is open, removing the background from the accessibility tree and the tab order\r\n * — including the screen-reader virtual cursor, which the hand-rolled Tab-cycler\r\n * in `focusTrap` cannot contain (Radix dialog contract; backbone §A6).\r\n *\r\n * The dialog node is expected to be portaled directly under `document.body`;\r\n * every other top-level child of `body` is inerted. Each sibling's PRIOR `inert`\r\n * and `aria-hidden` are recorded and restored EXACTLY on cleanup — so a sibling\r\n * that was already `aria-hidden=\"true\"` (or already `inert`) keeps that state\r\n * afterwards, and one that wasn't is returned to having no attribute. This makes\r\n * nested / stacked modals safe: an inner modal opening over an outer one won't\r\n * clobber the outer's state when it closes.\r\n *\r\n * `inert` is Baseline 2023 (all evergreen browsers). The `focusTrap` Tab-cycler\r\n * remains as a belt-and-suspenders fallback for keyboard focus on the rare\r\n * engine without `inert`.\r\n *\r\n * Exposed as an imperative apply-returns-cleanup function (call it from an\r\n * `$effect` keyed on `open`) rather than a Svelte `use:` action. The Modal\r\n * dialog is moved out of its block by `use:portal`, and Svelte does not reliably\r\n * fire a co-located action's `destroy` when a portaled node's `{#if}` is torn\r\n * down — so an `$effect` cleanup is the correct lifecycle hook here.\r\n *\r\n * @param {HTMLElement} dialogNode - The portaled dialog container (a body child).\r\n * @returns {() => void} cleanup — restores each sibling's exact prior state.\r\n */\r\nexport function applyInertBackground(dialogNode) {\r\n if (typeof document === 'undefined' || !dialogNode) {\r\n return () => {};\r\n }\r\n const root = dialogNode.parentElement ?? document.body;\r\n /**\r\n * @type {{ el: HTMLElement, prevInert: boolean, prevAriaHidden: string | null }[]}\r\n * Snapshot of each touched sibling's prior state, for exact restoration.\r\n */\r\n const touched = [];\r\n for (const sibling of Array.from(root.children)) {\r\n if (sibling === dialogNode) continue;\r\n if (!(sibling instanceof HTMLElement)) continue;\r\n touched.push({\r\n el: sibling,\r\n prevInert: sibling.inert,\r\n prevAriaHidden: sibling.getAttribute('aria-hidden'),\r\n });\r\n sibling.inert = true;\r\n sibling.setAttribute('aria-hidden', 'true');\r\n }\r\n\r\n return () => {\r\n for (const { el, prevInert, prevAriaHidden } of touched) {\r\n el.inert = prevInert;\r\n if (prevAriaHidden === null) {\r\n el.removeAttribute('aria-hidden');\r\n } else {\r\n el.setAttribute('aria-hidden', prevAriaHidden);\r\n }\r\n }\r\n touched.length = 0;\r\n };\r\n}\r\n","<script lang=\"ts\">\r\n import type { Snippet } from 'svelte';\r\n import { onDestroy } from 'svelte';\r\n import { setModalContext, type ModalContext, type ModalAriaRegistration } from './context.js';\r\n import { portal } from '../../utils/portal.js';\r\n import { triggerHaptic } from '../../utils/haptic.js';\r\n import { cn } from '../../utils/classNames.js';\r\n import { deprecation } from '../../utils/deprecation.js';\r\n import { focusTrap } from '../../utils/focusTrap.js';\r\n import { applyInertBackground } from '../../utils/inertBackground.js';\r\n import { SvelteMap } from 'svelte/reactivity';\r\n import Button from '../Button/Button.svelte';\r\n\r\n interface Props {\r\n open?: boolean;\r\n size?: 'sm' | 'md' | 'lg' | 'xl';\r\n persistent?: boolean;\r\n haptic?: boolean;\r\n /**\r\n * Dialog role. `'dialog'` (default) or `'alertdialog'` for destructive /\r\n * interruptive confirmations that demand a response. `alertdialog` also\r\n * disables close-on-backdrop (an interruptive prompt shouldn't be\r\n * dismissible by a stray click). R-MODAL-04 / R-A11Y-06 / backbone §A6.\r\n */\r\n role?: 'dialog' | 'alertdialog';\r\n /**\r\n * When `true`, an attempt to close the modal (Escape or backdrop click)\r\n * raises a nested \"Discard changes?\" confirmation instead of closing\r\n * immediately. Opt-in; the explicit Close button and `open = false` are\r\n * unaffected — only the dismissive gestures are guarded (R-MODAL-06).\r\n */\r\n dirty?: boolean;\r\n /** Copy for the dirty-close discard prompt. Override per consumer. */\r\n discardLabels?: { title?: string; description?: string; confirm?: string; cancel?: string };\r\n oncancel?: () => void;\r\n onclose?: () => void;\r\n children?: Snippet;\r\n class?: string;\r\n /**\r\n * Explicit `aria-labelledby` override. Normally unnecessary — a\r\n * `<ModalTitle>` auto-wires this via context (backbone §A6). Provide it only\r\n * when the labelling element lives outside the modal subtree.\r\n */\r\n 'aria-labelledby'?: string;\r\n /**\r\n * Layout variant. `'sheet'` (default) renders the bottom-sheet on mobile\r\n * and a centered card on md+. `'dialog'` renders centered on all viewports,\r\n * for admin/desktop-first dialogs where the bottom-sheet break is wrong.\r\n */\r\n variant?: 'sheet' | 'dialog';\r\n }\r\n\r\n // `$props.id()` is SSR-stable + hydration-safe — unlike crypto.randomUUID(),\r\n // which produces a different value on server and client (backbone §A1). The\r\n // title / description ids derive from it so the aria-labelledby /\r\n // aria-describedby links are byte-identical across SSR + hydration.\r\n const uid = $props.id();\r\n\r\n let {\r\n open = $bindable(false),\r\n size = 'md',\r\n persistent = false,\r\n haptic = true,\r\n role = 'dialog',\r\n dirty = false,\r\n discardLabels,\r\n oncancel,\r\n onclose,\r\n children,\r\n class: className,\r\n 'aria-labelledby': ariaLabelledbyProp,\r\n variant = 'sheet',\r\n }: Props = $props();\r\n\r\n // eslint-disable-next-line svelte/valid-compile -- known Svelte compiler note, accepted for this primitive\r\n if (onclose) {\r\n deprecation(\r\n `Modal prop 'onclose' is deprecated. Use 'oncancel' instead.`\r\n );\r\n }\r\n\r\n let effectiveOncancel = $derived(oncancel ?? onclose);\r\n\r\n // Monotonic counters → SSR-stable, deterministic per-instance ids. The\r\n // responsive Modal renders children twice (mobile sheet + desktop card), so\r\n // each ModalTitle/Description instance mints its own id in mount order\r\n // (`-0`, `-1`, …) — no duplicate ids, and the Root references every one.\r\n let titleSeq = 0;\r\n let descSeq = 0;\r\n const nextTitleId = () => `${uid}-title-${titleSeq++}`;\r\n const nextDescriptionId = () => `${uid}-description-${descSeq++}`;\r\n\r\n // Registered title / description parts, keyed by id → its visibility. Reactive\r\n // maps so aria-labelledby / aria-describedby update as parts mount/unmount.\r\n // This is the §A1-sanctioned $effect registration case (presence is unknowable\r\n // from Root props); each part cleans up on unmount.\r\n const titleRegs = new SvelteMap<string, ModalAriaRegistration['visibility']>();\r\n const descriptionRegs = new SvelteMap<string, ModalAriaRegistration['visibility']>();\r\n\r\n const registerTitle = (reg: ModalAriaRegistration) => { titleRegs.set(reg.id, reg.visibility); };\r\n const unregisterTitle = (id: string) => { titleRegs.delete(id); };\r\n const registerDescription = (reg: ModalAriaRegistration) => { descriptionRegs.set(reg.id, reg.visibility); };\r\n const unregisterDescription = (id: string) => { descriptionRegs.delete(id); };\r\n\r\n // Current viewport, keyed off the SAME `md` breakpoint (768px) that ModalPanel\r\n // uses to show/hide the sheet vs card. Reactive — updates on viewport resize.\r\n let isDesktop = $state(\r\n typeof window !== 'undefined' && window.matchMedia\r\n ? window.matchMedia('(min-width: 768px)').matches\r\n : true\r\n );\r\n $effect(() => {\r\n if (typeof window === 'undefined' || !window.matchMedia) return;\r\n const mq = window.matchMedia('(min-width: 768px)');\r\n const sync = () => { isDesktop = mq.matches; };\r\n sync();\r\n mq.addEventListener('change', sync);\r\n return () => mq.removeEventListener('change', sync);\r\n });\r\n\r\n // Pick the id of the registration that is actually visible at the current\r\n // viewport, so a screen reader announces the name ONCE — never the\r\n // display:none twin. 'always' (variant=\"dialog\" single panel) matches any\r\n // viewport. Preserves registration (mount) order via the Map.\r\n function visibleId(\r\n regs: SvelteMap<string, ModalAriaRegistration['visibility']>,\r\n ): string | undefined {\r\n for (const [id, visibility] of regs) {\r\n if (\r\n visibility === 'always' ||\r\n (visibility === 'desktop' && isDesktop) ||\r\n (visibility === 'mobile' && !isDesktop)\r\n ) {\r\n return id;\r\n }\r\n }\r\n // No registration matches the current viewport (shouldn't happen in normal\r\n // use) — fall back to the first registered id so the link never dangles.\r\n const first = regs.keys().next();\r\n return first.done ? undefined : first.value;\r\n }\r\n\r\n // Resolved labelling: explicit prop wins; else the single visible ModalTitle\r\n // id. undefined when none, so no dangling ref and no duplicated name.\r\n let resolvedLabelledby = $derived(ariaLabelledbyProp ?? visibleId(titleRegs));\r\n let resolvedDescribedby = $derived(visibleId(descriptionRegs));\r\n\r\n // The portaled dialog element — bound so the inert-background effect can mark\r\n // its body-level siblings inert while open (see effect below).\r\n let dialogEl: HTMLElement | null = $state(null);\r\n\r\n // Wrapper around the main modal content. While the dirty-close discard prompt\r\n // is up, this is inerted so Tab/SR focus can't leak back to the modal behind\r\n // the prompt (the prompt runs its own focus trap). Bound + driven by $effect.\r\n let contentEl: HTMLElement | null = $state(null);\r\n\r\n // Store scroll position for iOS scroll lock\r\n let scrollY = $state(0);\r\n\r\n // Track previous open state to detect open transitions\r\n let prevOpen = $state(false);\r\n\r\n // Nested \"Discard changes?\" prompt visibility (dirty-close guard).\r\n let showDiscard = $state(false);\r\n let resolvedDiscardLabels = $derived({\r\n title: discardLabels?.title ?? 'Discard changes?',\r\n description: discardLabels?.description ?? 'You have unsaved changes. Are you sure you want to close?',\r\n confirm: discardLabels?.confirm ?? 'Discard',\r\n cancel: discardLabels?.cancel ?? 'Keep editing',\r\n });\r\n\r\n // Element that had focus when the modal opened — focus is returned\r\n // here on close (WCAG 2.4.3 Focus Order). Captured at the open\r\n // transition so a click-to-open trigger gets focus restored.\r\n let previouslyFocused: HTMLElement | null = $state(null);\r\n $effect(() => {\r\n if (open && !prevOpen && typeof document !== 'undefined') {\r\n previouslyFocused = document.activeElement as HTMLElement | null;\r\n }\r\n });\r\n\r\n // Close modal and notify consumer. Bypasses the dirty guard — it's the\r\n // committed close path (used by the discard prompt + the Close part).\r\n const resetModal = () => {\r\n showDiscard = false;\r\n effectiveOncancel?.();\r\n open = false;\r\n };\r\n\r\n // A dismissive gesture (Escape / backdrop). Honors the dirty guard.\r\n const requestClose = () => {\r\n if (dirty) {\r\n showDiscard = true;\r\n return;\r\n }\r\n resetModal();\r\n };\r\n\r\n // Prop-derived context values are GETTERS, not $state synced by an $effect:\r\n // effects don't run during SSR, so an effect-synced $state would serve the\r\n // neutral defaults on the server and only fix them on the client → hydration\r\n // mismatch (backbone §A1). Getters evaluate live on both. Only hasTitle /\r\n // hasDescription are owned mutable $state (registered by the parts).\r\n const ctx: ModalContext = {\r\n get open() { return open; },\r\n get size() { return size; },\r\n get persistent() { return persistent; },\r\n get variant() { return variant; },\r\n get role() { return role; },\r\n nextTitleId,\r\n nextDescriptionId,\r\n registerTitle,\r\n unregisterTitle,\r\n registerDescription,\r\n unregisterDescription,\r\n resetModal,\r\n };\r\n setModalContext(ctx);\r\n\r\n // Trigger haptic on modal open transition\r\n $effect(() => {\r\n if (open && !prevOpen && haptic) {\r\n triggerHaptic('light');\r\n }\r\n prevOpen = open;\r\n // A close (open → false) clears any lingering discard prompt.\r\n if (!open) showDiscard = false;\r\n });\r\n\r\n // Handle escape key\r\n function handleKeydown(event: KeyboardEvent) {\r\n if (event.key !== 'Escape' || !open) return;\r\n // The discard prompt owns Escape while it's up: Esc keeps editing.\r\n if (showDiscard) {\r\n showDiscard = false;\r\n return;\r\n }\r\n if (!persistent) requestClose();\r\n }\r\n\r\n // iOS-compatible scroll lock using position:fixed approach\r\n // Also compensates for scrollbar width to prevent layout shift\r\n $effect(() => {\r\n if (typeof document !== 'undefined') {\r\n if (open) {\r\n scrollY = window.scrollY;\r\n // Calculate scrollbar width before hiding it\r\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\r\n document.body.style.position = 'fixed';\r\n document.body.style.top = `-${scrollY}px`;\r\n document.body.style.left = '0';\r\n document.body.style.right = '0';\r\n document.body.style.overflow = 'hidden';\r\n // Add padding to compensate for scrollbar disappearing\r\n document.body.style.paddingRight = `${scrollbarWidth}px`;\r\n } else {\r\n document.body.style.position = '';\r\n document.body.style.top = '';\r\n document.body.style.left = '';\r\n document.body.style.right = '';\r\n document.body.style.overflow = '';\r\n document.body.style.paddingRight = '';\r\n window.scrollTo(0, scrollY);\r\n }\r\n }\r\n });\r\n\r\n // Inert the background while open (backbone §A6). Driven by an $effect — not a\r\n // use: action — because use:portal moves the dialog out of its block and\r\n // Svelte won't reliably fire a co-located action's destroy on close. The\r\n // effect cleanup runs on every open→false (and on unmount), reverting cleanly.\r\n // Runs after paint so the portal has appended the dialog under body first.\r\n $effect(() => {\r\n if (!open || !dialogEl) return;\r\n const cleanup = applyInertBackground(dialogEl);\r\n return cleanup;\r\n });\r\n\r\n // While the discard prompt is up, inert + aria-hide the main modal content so\r\n // focus (Tab AND the SR virtual cursor) is contained to the prompt's own trap\r\n // and can't leak to the controls behind it (backbone §A6 nested-dialog\r\n // containment). Cleanup reverts on dismiss/confirm.\r\n $effect(() => {\r\n if (!showDiscard || !contentEl) return;\r\n contentEl.inert = true;\r\n contentEl.setAttribute('aria-hidden', 'true');\r\n return () => {\r\n if (contentEl) {\r\n contentEl.inert = false;\r\n contentEl.removeAttribute('aria-hidden');\r\n }\r\n };\r\n });\r\n\r\n // Clean up scroll lock if component is destroyed while open\r\n onDestroy(() => {\r\n if (typeof document !== 'undefined') {\r\n document.body.style.position = '';\r\n document.body.style.top = '';\r\n document.body.style.left = '';\r\n document.body.style.right = '';\r\n document.body.style.overflow = '';\r\n document.body.style.paddingRight = '';\r\n }\r\n });\r\n</script>\r\n\r\n<svelte:window onkeydown={handleKeydown} />\r\n\r\n{#if open}\r\n <!-- svelte-ignore a11y_click_events_have_key_events -->\r\n <!-- svelte-ignore a11y_no_static_element_interactions -->\r\n <!-- eslint-disable-next-line svelte/valid-compile -- known Svelte compiler note, accepted for this primitive -->\r\n <div\r\n class={cn(\r\n 'fixed inset-0 flex justify-center touch-none overscroll-none z-50',\r\n variant === 'dialog'\r\n ? 'items-center p-4'\r\n : 'items-end md:items-center md:p-4',\r\n className,\r\n )}\r\n onmousedown={(e) => {\r\n // Only track direct clicks on backdrop, not drags that end on backdrop.\r\n // alertdialog is interruptive — never dismissed by a backdrop click.\r\n if (e.target === e.currentTarget && !persistent && role !== 'alertdialog') {\r\n e.currentTarget.dataset.clickStartedOnBackdrop = 'true';\r\n }\r\n }}\r\n onmouseup={(e) => {\r\n // Only close if both mousedown and mouseup were on the backdrop\r\n const el = e.currentTarget as HTMLElement;\r\n if (\r\n e.target === e.currentTarget &&\r\n el.dataset.clickStartedOnBackdrop === 'true' &&\r\n !persistent &&\r\n role !== 'alertdialog'\r\n ) {\r\n requestClose();\r\n }\r\n delete el.dataset.clickStartedOnBackdrop;\r\n }}\r\n {role}\r\n aria-modal=\"true\"\r\n aria-labelledby={resolvedLabelledby}\r\n aria-describedby={resolvedDescribedby}\r\n bind:this={dialogEl}\r\n use:portal\r\n use:focusTrap={{ enabled: open && !showDiscard, returnFocusTo: previouslyFocused }}\r\n >\r\n <!-- display:contents so wrapping the content doesn't disturb the dialog's\r\n flex layout; it exists only to carry the inert/aria-hidden toggle while\r\n the discard prompt is up. -->\r\n <div class=\"contents\" bind:this={contentEl}>\r\n {@render children?.()}\r\n </div>\r\n\r\n {#if showDiscard}\r\n <!-- Nested dirty-close confirmation. Built from inline markup (not a\r\n ConfirmationModal recipe) so the Modal primitive stays free of\r\n recipe-layer dependencies. It's an alertdialog: interruptive,\r\n never backdrop-dismissible. -->\r\n <!-- svelte-ignore a11y_click_events_have_key_events -->\r\n <!-- svelte-ignore a11y_no_static_element_interactions -->\r\n <div\r\n class=\"absolute inset-0 z-10 flex items-center justify-center p-4\"\r\n onmousedown={(e) => e.stopPropagation()}\r\n onmouseup={(e) => e.stopPropagation()}\r\n >\r\n <div class=\"absolute inset-0 bg-overlay-bg/60 backdrop-blur-sm\"></div>\r\n <!-- Own focus trap: focus is contained to Keep editing / Discard while\r\n the outer content is inerted (above). -->\r\n <div\r\n role=\"alertdialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby={`${uid}-discard-title`}\r\n aria-describedby={`${uid}-discard-desc`}\r\n tabindex=\"-1\"\r\n class=\"relative bg-card rounded-lg w-full max-w-sm shadow-2xl p-6 flex flex-col gap-4\"\r\n onclick={(e) => e.stopPropagation()}\r\n use:focusTrap={{ enabled: showDiscard }}\r\n >\r\n <div class=\"flex flex-col gap-1\">\r\n <h2 id={`${uid}-discard-title`} class=\"text-lg font-semibold text-text-primary\">\r\n {resolvedDiscardLabels.title}\r\n </h2>\r\n <p id={`${uid}-discard-desc`} class=\"text-sm text-text-secondary\">\r\n {resolvedDiscardLabels.description}\r\n </p>\r\n </div>\r\n <div class=\"flex flex-col md:flex-row md:justify-end gap-3\">\r\n <Button variant=\"alternative\" size=\"md\" onclick={() => { showDiscard = false; }}>\r\n {resolvedDiscardLabels.cancel}\r\n </Button>\r\n <Button variant=\"red\" size=\"md\" onclick={resetModal}>\r\n {resolvedDiscardLabels.confirm}\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n {/if}\r\n </div>\r\n{/if}\r\n","<script lang=\"ts\">\r\n import type { Snippet } from 'svelte';\r\n import { safeFade } from '../../utils/transitions.js';\r\n import { getModalContext } from './context.js';\r\n import { cn } from '../../utils/classNames.js';\r\n\r\n interface Props {\r\n class?: string;\r\n children?: Snippet;\r\n }\r\n\r\n let { class: className, children }: Props = $props();\r\n\r\n // Validates this component is inside ModalRoot\r\n getModalContext();\r\n</script>\r\n\r\n<!-- Backdrop: dim + blur (brief 05 feel — was dim only). `backdrop-blur-sm`\r\n frosts the page behind the panel (iOS/Stripe), reinforcing focus on the\r\n dialog. The blur is a paint effect, not motion, so it's left on under\r\n reduced-motion; only the fade duration is gated (safeFade). -->\r\n<div\r\n class={cn('absolute inset-0 bg-overlay-bg/60 backdrop-blur-sm pointer-events-none', className)}\r\n transition:safeFade={{ duration: 300 }}\r\n>\r\n {#if children}{@render children()}{/if}\r\n</div>\r\n","<script lang=\"ts\">\r\n /**\r\n * Tags everything rendered inside it with the viewport a panel is visible at,\r\n * so ModalTitle / ModalDescription can register their ids against the right\r\n * breakpoint. ModalPanel renders its children TWICE (mobile sheet + desktop\r\n * card); wrapping each render in its own scope is the only way to give the two\r\n * otherwise-identical subtrees distinct visibility context (setContext can't be\r\n * called per-block in a single component). Backbone §A6.\r\n */\r\n import type { Snippet } from 'svelte';\r\n import { setModalPanelVisibility, type ModalPanelVisibility } from './context.js';\r\n\r\n interface Props {\r\n visibility: ModalPanelVisibility;\r\n children?: Snippet;\r\n }\r\n\r\n let { visibility, children }: Props = $props();\r\n\r\n // `visibility` is fixed for the lifetime of a given scope instance (a panel is\r\n // mobile, desktop, or always — it never switches), so capturing the initial\r\n // value at init is exactly right; setContext must run during init anyway.\r\n // eslint-disable-next-line svelte/valid-compile -- intentional one-time context set with a static prop\r\n setModalPanelVisibility(visibility);\r\n</script>\r\n\r\n{@render children?.()}\r\n","<script lang=\"ts\">\r\n import type { Snippet } from 'svelte';\r\n import { safeFly, safeFadeScale } from '../../utils/transitions.js';\r\n import { cubicOut } from 'svelte/easing';\r\n import { getModalContext } from './context.js';\r\n import { cn } from '../../utils/classNames.js';\r\n import ModalPanelScope from './ModalPanelScope.svelte';\r\n\r\n interface Props {\r\n class?: string;\r\n children?: Snippet;\r\n }\r\n\r\n let { class: className, children }: Props = $props();\r\n\r\n const ctx = getModalContext();\r\n\r\n const sizeClasses: Record<string, string> = {\r\n sm: 'max-w-sm',\r\n md: 'max-w-md',\r\n lg: 'max-w-xl',\r\n xl: 'max-w-2xl',\r\n };\r\n\r\n let modalSizeClass = $derived(sizeClasses[ctx.size] || sizeClasses.md);\r\n\r\n // In 'dialog' variant a single panel renders at every viewport; in 'sheet'\r\n // variant the centred card is the desktop-only twin of the mobile sheet.\r\n let desktopVisibility = $derived<'always' | 'desktop'>(\r\n ctx.variant === 'dialog' ? 'always' : 'desktop'\r\n );\r\n</script>\r\n\r\n{#if ctx.variant !== 'dialog'}\r\n <!-- Mobile: Bottom sheet. Only rendered in 'sheet' variant. Children are\r\n expected to be ModalHeader / ModalBody / ModalFooter. Header and Footer\r\n pin (shrink-0); only the Body scrolls. -->\r\n <!-- svelte-ignore a11y_click_events_have_key_events -->\r\n <!-- svelte-ignore a11y_no_static_element_interactions -->\r\n <div\r\n class={cn(\r\n 'relative md:hidden bg-card rounded-t-3xl w-full max-h-[90vh] max-h-[90dvh] overflow-hidden flex flex-col shadow-[0_-10px_40px_rgba(0,0,0,0.15)] touch-pan-y overscroll-contain',\r\n className,\r\n )}\r\n onclick={(e) => e.stopPropagation()}\r\n transition:safeFly={{ y: 300, duration: 300, easing: cubicOut }}\r\n >\r\n <div class=\"flex justify-center pt-3 pb-1 shrink-0\">\r\n <div class=\"w-10 h-1 bg-bg-quaternary rounded-xs\"></div>\r\n </div>\r\n <ModalPanelScope visibility=\"mobile\">\r\n {@render children?.()}\r\n </ModalPanelScope>\r\n </div>\r\n{/if}\r\n\r\n<!-- Centered card. In 'sheet' variant: desktop (md+) layout paired with the\r\n mobile bottom-sheet above. In 'dialog' variant: rendered at every\r\n viewport (no bottom-sheet break). Header and Footer pin (shrink-0);\r\n only the Body scrolls. The panel clips to its rounded corners so any\r\n scrollbar inside Body stays within the radius. -->\r\n<!-- svelte-ignore a11y_click_events_have_key_events -->\r\n<!-- svelte-ignore a11y_no_static_element_interactions -->\r\n<div\r\n class={cn(\r\n 'relative bg-card rounded-lg w-full max-h-[calc(100vh-4rem)] overflow-hidden shadow-2xl',\r\n ctx.variant === 'dialog' ? 'flex flex-col' : 'hidden md:flex md:flex-col',\r\n modalSizeClass,\r\n className,\r\n )}\r\n onclick={(e) => e.stopPropagation()}\r\n transition:safeFadeScale\r\n>\r\n <ModalPanelScope visibility={desktopVisibility}>\r\n {@render children?.()}\r\n </ModalPanelScope>\r\n</div>\r\n","<script lang=\"ts\">\r\n import type { Snippet } from 'svelte';\r\n import { getModalContext } from './context.js';\r\n import { cn } from '../../utils/classNames.js';\r\n\r\n interface Props {\r\n class?: string;\r\n children?: Snippet;\r\n }\r\n\r\n let { class: className, children }: Props = $props();\r\n\r\n // Validates this component is inside ModalRoot\r\n getModalContext();\r\n</script>\r\n\r\n<div class={cn('flex-1 min-h-0 overflow-y-auto px-6 py-3', className)}>\r\n {#if children}{@render children()}{/if}\r\n</div>\r\n","<script lang=\"ts\">\r\n import type { Snippet } from 'svelte';\r\n import { getModalContext } from './context.js';\r\n import { cn } from '../../utils/classNames.js';\r\n\r\n interface Props {\r\n class?: string;\r\n children?: Snippet;\r\n }\r\n\r\n let { class: className, children }: Props = $props();\r\n\r\n // Validates this component is inside ModalRoot\r\n getModalContext();\r\n</script>\r\n\r\n<div class={cn('shrink-0 w-full flex flex-col md:flex-row md:justify-end gap-3 px-6 pt-3 pb-6 empty:hidden', className)}>\r\n {#if children}{@render children()}{/if}\r\n</div>\r\n","/**\n * @packageDocumentation\n * Tailwind-compatible spacing scale.\n */\nexport const spacing = {\n 'px': '1px',\n '0': '0px',\n '0.5': '0.125rem',\n '1': '0.25rem',\n '1.5': '0.375rem',\n '2': '0.5rem',\n '2.5': '0.625rem',\n '3': '0.75rem',\n '3.5': '0.875rem',\n '4': '1rem',\n '5': '1.25rem',\n '6': '1.5rem',\n '7': '1.75rem',\n '8': '2rem',\n '9': '2.25rem',\n '10': '2.5rem',\n '11': '2.75rem',\n '12': '3rem',\n '14': '3.5rem',\n '16': '4rem',\n '20': '5rem',\n '24': '6rem',\n '28': '7rem',\n '32': '8rem',\n '36': '9rem',\n '40': '10rem',\n '44': '11rem',\n '48': '12rem',\n '52': '13rem',\n '56': '14rem',\n '60': '15rem',\n '64': '16rem',\n '72': '18rem',\n '80': '20rem',\n '96': '24rem',\n};\nexport const spacingAliases = {\n xs: spacing['1'],\n sm: spacing['2'],\n md: spacing['4'],\n lg: spacing['6'],\n xl: spacing['8'],\n '2xl': spacing['12'],\n '3xl': spacing['16'],\n cardPadding: spacing['4'],\n modalPadding: spacing['6'],\n formGap: spacing['4'],\n buttonPaddingX: spacing['4'],\n buttonPaddingY: spacing['2'],\n inputPaddingX: spacing['3'],\n inputPaddingY: spacing['2'],\n tableCellPaddingX: spacing['4'],\n tableCellPaddingY: spacing['3'],\n};\n/**\n * Gap scale for flex/grid layouts.\n * Consolidates gap mappings from Stack and Grid components.\n *\n * ## Canonical axis (R-TOKEN-01): `gapScale.semantic`\n * **`gapScale.semantic` is the canonical gap axis.** Always reach for a\n * semantic key first — it encodes layout *intent* (`content`, `section`,\n * `layout`, …) instead of raw pixel counts.\n *\n * ## Escape hatch: `gapScale.numeric`\n * Use the numeric axis only when you need an exact Tailwind step that has no\n * semantic equivalent (e.g. `gapScale.numeric['1.5']` for an 6px inline\n * nudge). Prefer semantic wherever intent is expressible.\n *\n * ## Deprecated axes\n * `gapScale.legacy` and `gapScale.grid` are redundant duplicates of\n * `semantic`/`numeric` with less expressive names. They remain spread into\n * `gapMap` so existing string keys still resolve without a breaking change.\n * **Migrate callers to the semantic axis; these axes will be removed in the\n * next minor.** See the per-member `@deprecated` JSDoc for the exact\n * migration mapping.\n */\nexport const gapScale = {\n // Semantic names (preferred)\n semantic: {\n minimal: 'gap-1', // 4px - Very compact spacing\n compact: 'gap-1.5', // 6px - Slightly more than minimal\n item: 'gap-2', // 8px - Between list items\n group: 'gap-3', // 12px - Between related elements\n tight: 'gap-4', // 16px - Tight grid/content spacing\n content: 'gap-4', // 16px - Default content spacing\n card: 'gap-5', // 20px - Card internal spacing\n standard: 'gap-6', // 24px - Standard grid spacing\n section: 'gap-6', // 24px - Between sections\n spacious: 'gap-8', // 32px - Spacious grid items\n layout: 'gap-8', // 32px - Major layout divisions\n page: 'gap-12', // 48px - Page-level spacing\n },\n // Numeric scale (Tailwind spacing)\n numeric: {\n '0': 'gap-0',\n '1': 'gap-1',\n '1.5': 'gap-1.5',\n '2': 'gap-2',\n '3': 'gap-3',\n '4': 'gap-4',\n '6': 'gap-6',\n '8': 'gap-8',\n '12': 'gap-12',\n '16': 'gap-16',\n },\n /**\n * @deprecated Redundant duplicate of the `numeric`/`semantic` axes.\n * Migrate each member to its `semantic` equivalent (or `numeric` escape\n * hatch): `none`→`numeric['0']`, `xs`→`semantic.minimal`,\n * `sm`→`semantic.item`, `md`→`semantic.content`, `lg`→`semantic.section`,\n * `xl`→`semantic.layout`. Kept working via `gapMap` for now; removed in the\n * next minor.\n */\n legacy: {\n none: 'gap-0',\n xs: 'gap-1', // Use 'minimal' instead\n sm: 'gap-2', // Use 'item' instead\n md: 'gap-4', // Use 'content' instead\n lg: 'gap-6', // Use 'section' instead\n xl: 'gap-8', // Use 'layout' instead\n },\n /**\n * @deprecated Redundant duplicate of the `semantic` axis. The `grid-`\n * prefix carries no distinct value — `grid-tight`→`semantic.content`\n * (gap-4), `grid-standard`→`semantic.standard` (gap-6),\n * `grid-spacious`→`semantic.spacious` (gap-8). Kept working via `gapMap`\n * for now; removed in the next minor.\n */\n grid: {\n 'grid-tight': 'gap-4', // 16px - Tight grid items\n 'grid-standard': 'gap-6', // 24px - Standard grid items\n 'grid-spacious': 'gap-8', // 32px - Spacious grid items\n },\n};\n/** Combined gap map for component use */\nexport const gapMap = {\n ...gapScale.numeric,\n ...gapScale.legacy,\n ...gapScale.semantic,\n ...gapScale.grid,\n};\n/**\n * Align scale for flex layouts (items-*)\n */\nexport const alignScale = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n};\n/**\n * Justify scale for flex layouts (justify-*)\n */\nexport const justifyScale = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n};\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n import { gapMap, type GapKey } from '../../tokens/spacing.js';\n\n /**\n * Grid - Responsive grid container with automatic column sizing\n *\n * Use Grid for laying out cards, stats, or any items in a responsive grid.\n * Automatically stacks on mobile and expands on larger screens.\n *\n * @example Numeric gap\n * <Grid cols=\"3\" gap=\"6\">\n * <StatsCard>Revenue</StatsCard>\n * <StatsCard>Users</StatsCard>\n * <StatsCard>Orders</StatsCard>\n * </Grid>\n *\n * @example Semantic gap (recommended)\n * <Grid cols=\"3\" gap=\"section\">\n * <Card>Card 1</Card>\n * <Card>Card 2</Card>\n * <Card>Card 3</Card>\n * </Grid>\n *\n * @example Auto-fit columns\n * <Grid cols=\"auto\" minWidth=\"300px\" gap=\"section\">\n * {#each items as item}\n * <Card>{item.name}</Card>\n * {/each}\n * </Grid>\n *\n * @example 12-column layout grid\n * <Grid cols=\"12\" gap=\"none\">\n * <div class=\"col-span-4\">Sidebar</div>\n * <div class=\"col-span-8\">Content</div>\n * </Grid>\n *\n * Semantic Gap Values (from tokens/spacing.ts):\n * - none: 0px - No gap (for 12-col layouts)\n * - xs: 4px (1) - Extra small gap\n * - sm: 8px (2) - Small gap\n * - tight: 16px (4) - Tight grid items (alias: md, content)\n * - standard: 24px (6) - Standard grid items (alias: lg, section)\n * - spacious: 32px (8) - Spacious grid items (alias: xl, layout)\n */\n\n interface Props {\n /** Number of columns or 'auto' for auto-fit */\n cols?: '1' | '2' | '3' | '4' | '5' | '6' | '12' | 'auto';\n /** Gap between grid items - semantic names or Tailwind spacing scale */\n gap?: GapKey;\n /** Minimum width for auto-fit columns (only used when cols='auto') */\n minWidth?: string;\n /** HTML element to render as */\n as?: 'div' | 'section' | 'ul';\n /** Additional CSS classes */\n class?: string;\n /** Child content */\n children?: Snippet;\n }\n\n let {\n cols = '3',\n gap = '4',\n minWidth = '280px',\n as = 'div',\n class: className = '',\n children\n }: Props = $props();\n\n // Responsive column mappings - stack on mobile, expand on larger screens\n const colsMap: Record<string, string> = {\n '1': 'grid-cols-1',\n '2': 'grid-cols-1 md:grid-cols-2',\n '3': 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',\n '4': 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4',\n '5': 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-5',\n '6': 'grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-6',\n '12': 'grid-cols-12',\n 'auto': '' // Uses inline style\n };\n\n let gridStyle = $derived(\n cols === 'auto'\n ? `grid-template-columns: repeat(auto-fit, minmax(${minWidth}, 1fr));`\n : ''\n );\n\n let classes = $derived(\n [\n 'grid',\n cols !== 'auto' ? colsMap[cols] : '',\n gapMap[gap] || 'gap-4',\n className\n ].filter(Boolean).join(' ')\n );\n</script>\n\r\n<svelte:element this={as} class={classes} style={gridStyle || undefined}>\r\n {@render children?.()}\r\n</svelte:element>\r\n","/**\n * lazyOnce — memoize a dynamic-import loader, but NEVER cache a rejection.\n *\n * The bug class this kills: a naive memoized loader caches the *promise*\n * returned by `import()` on first call. If that promise REJECTS (a transient\n * chunk-load failure — flaky network, a deploy swapping hashed chunks mid-\n * session, an offline blip), the rejected promise is cached forever. Every\n * later call returns the same settled-rejected promise, so the feature stays\n * bricked until a full page reload. import() failures must not be memoized.\n *\n * `lazyOnce(loader)` returns a zero-arg function that:\n * - memoizes the loader's promise on SUCCESS (loader runs at most once), but\n * - RESETS the memo when the promise rejects, so the next call retries fresh,\n * - and rethrows the rejection to the caller so it can react / show an error.\n *\n * Dependency-free and framework-agnostic, so it's fully unit-testable with a\n * mocked loader and no DOM.\n *\n * @example\n * ```ts\n * const loadStrength = lazyOnce(() => import('check-password-strength'));\n * // first keystroke kicks it off; a transient failure here…\n * try { await loadStrength(); } catch { /* show neutral state *\\/ }\n * // …does NOT brick the feature — the next keystroke retries from scratch.\n * ```\n *\n * @param loader Zero-arg function returning the promise to memoize (typically\n * `() => import('...')`).\n * @returns A zero-arg function returning the memoized promise; rejections reset\n * the memo and are rethrown. Carries a `reset()` to clear the memo manually\n * (handy in tests).\n */\nexport function lazyOnce(loader) {\n let promise = null;\n const run = (() => {\n if (!promise) {\n promise = loader().catch((err) => {\n // Do NOT cache a rejected load — drop the memo so the next call retries.\n promise = null;\n throw err;\n });\n }\n return promise;\n });\n run.reset = () => {\n promise = null;\n };\n return run;\n}\n","<script lang=\"ts\">\r\n import type { Component, Snippet } from 'svelte';\r\n import { typography } from '../../../tokens/typography';\r\n\r\n const defaultLabels = {\r\n noResultsFound: 'No results found',\r\n };\r\n\r\n interface Props {\r\n /** Title text (alias for message) */\r\n title?: string;\r\n /** Main message to display */\r\n message?: string;\r\n /** Description text (alias for subtext) */\r\n description?: string;\r\n /** Secondary descriptive text */\r\n subtext?: string;\r\n /** Icon component (when iconType='component') */\r\n icon?: Component<any> | null;\r\n /** Image path (when iconType='image') */\r\n imageSrc?: string;\r\n /** Type of icon provided */\r\n iconType?: 'component' | 'image';\r\n /** Size classes for the icon */\r\n iconSize?: string;\r\n /** Additional CSS classes */\r\n class?: string;\r\n /** Optional action content (buttons, links, etc.) */\r\n children?: Snippet;\r\n /** Override user-visible strings */\r\n labels?: Partial<typeof defaultLabels>;\r\n }\r\n\r\n let {\r\n title = '',\r\n message = '',\r\n description = '',\r\n subtext = '',\r\n icon = null,\r\n imageSrc = '',\r\n iconType = 'component',\r\n iconSize = 'w-20 h-20',\r\n class: className = '',\r\n children,\r\n labels: userLabels = {},\r\n }: Props = $props();\r\n\r\n let labels = $derived({ ...defaultLabels, ...userLabels });\r\n\r\n // Support both naming conventions\r\n let displayTitle = $derived(title || message || labels.noResultsFound);\r\n let displaySubtext = $derived(description || subtext);\r\n</script>\r\n\r\n<div class=\"flex flex-col items-center justify-center px-6 py-10 text-center {className}\">\r\n {#if icon || imageSrc}\r\n {#if iconType === 'component' && icon}\r\n {@const IconComponent = icon}\r\n <IconComponent class=\"mb-3 text-muted-foreground {iconSize}\" />\r\n {:else if iconType === 'image' && imageSrc}\r\n <img src={imageSrc} alt=\"\" class=\"mb-3 {iconSize}\" />\r\n {/if}\r\n {/if}\r\n\r\n <h3 class={typography.h3}>{displayTitle}</h3>\r\n {#if displaySubtext}\r\n <p class={`${typography.smMuted} mt-1`}>{displaySubtext}</p>\r\n {/if}\r\n \r\n {#if children}\r\n <div class=\"mt-4\">\r\n {@render children()}\r\n </div>\r\n {/if}\r\n</div>\r\n","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M12 10H6.78A11 11 0 0127 16h2A13 13 0 006 7.68V4H4v8h8zM20 22h5.22A11 11 0 015 16H3a13 13 0 0023 8.32V28h2V20H20z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M16,2A14,14,0,1,0,30,16,14,14,0,0,0,16,2ZM14,21.5908l-5-5L10.5906,15,14,18.4092,21.41,11l1.5957,1.5859Z\"></path><path fill=\"none\" d=\"M14 21.591L9 16.591 10.591 15 14 18.409 21.41 11 23.005 12.585 14 21.591z\" data-icon-path=\"inner-path\"></path>\n</svg>","/**\n * EventCard — Density + Layout tokens\n *\n * Two orthogonal knobs:\n * - layout: structural DOM shape (image on top, image on left, micro cell)\n * - density: scalar size (padding, gap, type-scale)\n *\n * Density tokens that are scalar values live as CSS custom properties on the\n * card element (see EventCard.svelte). Props passed to SC primitives\n * (Badge size, Button size) live here in TS because SC accepts a string union.\n */\nexport const EVENT_CARD_DENSITY = {\n micro: { badgeSize: 'xs', pillSize: 'xs' },\n compact: { badgeSize: 'sm', pillSize: 'xs' },\n standard: { badgeSize: 'sm', pillSize: 'xs' },\n featured: { badgeSize: 'sm', pillSize: 'sm' },\n};\n","<script module lang=\"ts\">\r\n\t// Per-instance counter for unique ids — titles can repeat across a page,\r\n\t// so deriving the title id from the title text produces duplicate ids and\r\n\t// ambiguous aria-labelledby. A monotonic counter guarantees uniqueness.\r\n\tlet _eventCardSeq = 0;\r\n\tfunction nextEventCardId(): number {\r\n\t\treturn (_eventCardSeq += 1);\r\n\t}\r\n</script>\r\n\r\n<script lang=\"ts\">\r\n\t/**\r\n\t * EventCard — the canonical event card.\r\n\t *\r\n\t * One primitive, two knobs:\r\n\t * layout = 'vertical' | 'horizontal' | 'micro'\r\n\t * density = 'micro' | 'compact' | 'standard' | 'featured'\r\n\t *\r\n\t * PRESENTATIONAL: takes resolved data as props and emits click events. It\r\n\t * knows nothing about event models, URL building, or status thresholds —\r\n\t * the consuming view shell (e.g. venue-calendar's ListView/GalleryView)\r\n\t * computes the badge, date label, href, and time-pills and passes them in.\r\n\t * That keeps the card reusable across any consumer.\r\n\t *\r\n\t * Solves the historical two-block padding gap via a stretched-link pattern:\r\n\t * the title link's ::before pseudo covers the whole article, so the entire\r\n\t * card is one click target. Time pill <Button>s sit on top via relative\r\n\t * z-index, keeping them independently clickable. One padded content\r\n\t * container, one rhythm, no compound margins.\r\n\t */\r\n\timport { Badge, BlurBackdropImage, Button } from '../../primitives';\r\n\timport {\r\n\t\tEVENT_CARD_DENSITY,\r\n\t\ttype EventCardDensity,\r\n\t\ttype EventCardLayout,\r\n\t} from './tokens';\r\n\r\n\tinterface TimePill {\r\n\t\t/** Pre-formatted time, e.g. \"8:00 PM\". */\r\n\t\ttimeLabel: string;\r\n\t\t/** Destination for this showtime (consumer builds it). */\r\n\t\thref: string;\r\n\t\tariaLabel?: string;\r\n\t}\r\n\r\n\tinterface Props {\r\n\t\ttitle: string;\r\n\t\t/** Main card link — the consuming view builds this. */\r\n\t\thref: string;\r\n\t\tlayout?: EventCardLayout;\r\n\t\tdensity?: EventCardDensity;\r\n\t\timageUrl?: string;\r\n\t\tplaceholderImage?: string;\r\n\t\t/** Pre-formatted date line, e.g. \"Tue, May 26\". Omit to hide. */\r\n\t\tdateLabel?: string;\r\n\t\tdescription?: string;\r\n\t\t/** Full a11y label for the card link. Falls back to title. */\r\n\t\tariaLabel?: string;\r\n\t\t/**\r\n\t\t * Resolved status/scarcity badge. The view decides whether to show a\r\n\t\t * status badge (\"Sold out\", \"Cancelled\") or a scarcity badge (\"Only 3\r\n\t\t * left\") and passes the final text + SC Badge variant. Null = no badge.\r\n\t\t */\r\n\t\tbadge?: { text: string; variant: string } | null;\r\n\t\t/** Time pills — one per showtime. Single events pass one pill. */\r\n\t\tpills?: TimePill[];\r\n\t\t/** Show truncated description (only honored at standard/featured density). */\r\n\t\tshowDescription?: boolean;\r\n\t\t/** Hide the date line. Set true when the layout shows the date elsewhere\r\n\t\t * (e.g. List view's left date rail). */\r\n\t\thideDate?: boolean;\r\n\t\t/** Card click (title / poster / stretched-link). */\r\n\t\tonclick?: () => void;\r\n\t\t/** Pill click — index into `pills`. */\r\n\t\tonpillclick?: (index: number) => void;\r\n\t}\r\n\r\n\tlet {\r\n\t\ttitle,\r\n\t\thref,\r\n\t\tlayout = 'vertical',\r\n\t\tdensity = 'standard',\r\n\t\timageUrl = '',\r\n\t\tplaceholderImage = '',\r\n\t\tdateLabel = '',\r\n\t\tdescription = '',\r\n\t\tariaLabel,\r\n\t\tbadge = null,\r\n\t\tpills = [],\r\n\t\tshowDescription = false,\r\n\t\thideDate = false,\r\n\t\tonclick,\r\n\t\tonpillclick,\r\n\t}: Props = $props();\r\n\r\n\tlet token = $derived(EVENT_CARD_DENSITY[density]);\r\n\tconst titleId = `event-card-title-${nextEventCardId()}`;\r\n\r\n\tlet allowDescription = $derived(\r\n\t\tshowDescription &&\r\n\t\t\t!!description &&\r\n\t\t\t(density === 'standard' || density === 'featured')\r\n\t);\r\n\tlet allowDate = $derived(!hideDate && density !== 'micro' && !!dateLabel);\r\n\r\n\tfunction onPillClick(index: number, e: MouseEvent) {\r\n\t\t// Let the browser handle modified clicks (cmd/ctrl/shift/alt → open in\r\n\t\t// new tab) and the no-handler case — the pill's href navigates normally.\r\n\t\tif (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\r\n\t\tif (!onpillclick) return;\r\n\t\te.preventDefault();\r\n\t\te.stopPropagation();\r\n\t\tonpillclick(index);\r\n\t}\r\n\r\n\tfunction onCardClick(e: MouseEvent) {\r\n\t\tif (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\r\n\t\tif (!onclick) return;\r\n\t\te.preventDefault();\r\n\t\tonclick();\r\n\t}\r\n</script>\r\n\r\n<article\r\n\tclass=\"event-card relative rounded-lg border bg-card border-border overflow-hidden flex flex-col\"\r\n\tdata-layout={layout}\r\n\tdata-density={density}\r\n\taria-labelledby={titleId}\r\n>\r\n\t<div class=\"event-card__poster w-full aspect-video bg-muted shrink-0 overflow-hidden\">\r\n\t\t<BlurBackdropImage\r\n\t\t\tsrc={imageUrl}\r\n\t\t\tfallback={placeholderImage}\r\n\t\t\tclass=\"event-card__poster-fill\"\r\n\t\t/>\r\n\t</div>\r\n\r\n\t<div class=\"event-card__content flex flex-col flex-1 min-w-0\">\r\n\t\t<header class=\"event-card__header\">\r\n\t\t\t<h3\r\n\t\t\t\tclass=\"event-card__title font-semibold text-text-primary m-0\"\r\n\t\t\t\tid={titleId}\r\n\t\t\t>\r\n\t\t\t\t{#if badge}\r\n\t\t\t\t\t<span class=\"event-card__badge\">\r\n\t\t\t\t\t\t<Badge variant={badge.variant} size={token.badgeSize}>\r\n\t\t\t\t\t\t\t{badge.text}\r\n\t\t\t\t\t\t</Badge>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t{/if}\r\n\t\t\t\t<a\r\n\t\t\t\t\tclass=\"event-card__title-link\"\r\n\t\t\t\t\t{href}\r\n\t\t\t\t\tonclick={onCardClick}\r\n\t\t\t\t\taria-label={ariaLabel ?? title}\r\n\t\t\t\t>\r\n\t\t\t\t\t{title}\r\n\t\t\t\t</a>\r\n\t\t\t</h3>\r\n\t\t</header>\r\n\r\n\t\t{#if allowDate}\r\n\t\t\t<span class=\"event-card__date text-text-secondary font-medium\">\r\n\t\t\t\t{dateLabel}\r\n\t\t\t</span>\r\n\t\t{/if}\r\n\r\n\t\t{#if pills.length > 0}\r\n\t\t\t<div class=\"event-card__pills flex flex-wrap gap-2 relative\">\r\n\t\t\t\t{#each pills as pill, i (pill.href + pill.timeLabel)}\r\n\t\t\t\t\t<Button\r\n\t\t\t\t\t\thref={pill.href}\r\n\t\t\t\t\t\tvariant=\"alternative\"\r\n\t\t\t\t\t\tsize={token.pillSize}\r\n\t\t\t\t\t\tonclick={(e) => onPillClick(i, e)}\r\n\t\t\t\t\t\taria-label={pill.ariaLabel ?? pill.timeLabel}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{pill.timeLabel}\r\n\t\t\t\t\t</Button>\r\n\t\t\t\t{/each}\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\r\n\t\t{#if allowDescription}\r\n\t\t\t<p class=\"event-card__description text-sm text-text-secondary m-0\">{description}</p>\r\n\t\t{/if}\r\n\t</div>\r\n</article>\r\n\r\n<style>\r\n\t/* === Shell motion === */\r\n\t.event-card {\r\n\t\t/* Card-internal stacking ladder. These are intentionally tiny local\r\n\t\t * values (NOT the global --z-* page ladder, whose smallest step is 10):\r\n\t\t * at rest the card establishes no stacking context, so inflating these\r\n\t\t * would let them compete with sibling page elements. They only need to\r\n\t\t * order three layers inside the card — base content < stretched-link\r\n\t\t * overlay < interactive badge/pills. Tokenized so the z-index canonical\r\n\t\t * stays satisfied while the effective integers (1, 2) are preserved. */\r\n\t\t--z-event-card-stretched-link: 1;\r\n\t\t--z-event-card-interactive: 2;\r\n\t\ttransition: border-color 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease;\r\n\t\t/* Fill the grid cell so cards in the same row equalize height. Image\r\n\t\t * stays anchored to top via aspect-video; the content stack absorbs\r\n\t\t * the extra. Cards look uniform regardless of title length / pill\r\n\t\t * count / badge presence. */\r\n\t\theight: 100%;\r\n\t}\r\n\r\n\t.event-card:hover {\r\n\t\tborder-color: var(--color-stroke-primary, currentColor);\r\n\t\ttransform: translateY(-2px);\r\n\t\tbox-shadow: 0 4px 12px color-mix(in srgb, black 10%, transparent);\r\n\t}\r\n\r\n\t.event-card:active {\r\n\t\ttransform: translateY(0);\r\n\t}\r\n\r\n\t/* === Layout: horizontal (List) — always image-left, never stacks. ===\r\n\t * Poster keeps 16:9. When content (title + badge + multi-pill row) is\r\n\t * taller than the natural poster height, align-items:center distributes\r\n\t * the extra height above AND below the poster — reads as intentional\r\n\t * vertical centering, not orphaned blank space below the image.\r\n\t *\r\n\t * Padding + gap progression: 8 / 12 / 16 (space-2 / 3 / 4). Same value\r\n\t * used for inner padding AND poster-to-content gap so the cards read\r\n\t * uniformly at every breakpoint. */\r\n\t.event-card[data-layout='horizontal'] {\r\n\t\tflex-direction: row;\r\n\t\talign-items: center;\r\n\t\tpadding: 0.5rem;\r\n\t\tgap: 0.5rem;\r\n\t}\r\n\r\n\t@media (min-width: 640px) {\r\n\t\t.event-card[data-layout='horizontal'] {\r\n\t\t\tpadding: 0.75rem; /* 12px = space-3 */\r\n\t\t\tgap: 0.75rem;\r\n\t\t}\r\n\t}\r\n\r\n\t@media (min-width: 1024px) {\r\n\t\t.event-card[data-layout='horizontal'] {\r\n\t\t\tpadding: 1rem; /* 16px = space-4 */\r\n\t\t\tgap: 1rem;\r\n\t\t}\r\n\t}\r\n\r\n\t/* Drop the content's own padding when in horizontal layout — the article\r\n\t * shell provides it. Keeps the gap rhythm intact. */\r\n\t.event-card[data-layout='horizontal'] .event-card__content {\r\n\t\tpadding: 0;\r\n\t}\r\n\r\n\t/* Poster gets its own rounded corners since it's no longer flush against\r\n\t * the article's clipped edge. */\r\n\t.event-card[data-layout='horizontal'] .event-card__poster {\r\n\t\tborder-radius: 0.5rem;\r\n\t}\r\n\r\n\t@media (min-width: 1024px) {\r\n\t\t.event-card[data-layout='horizontal'] .event-card__poster {\r\n\t\t\tborder-radius: 0.75rem;\r\n\t\t}\r\n\t}\r\n\r\n\t/* Sizes mirror v1 ListView at every breakpoint:\r\n\t * mobile w-24 (6rem / 96px)\r\n\t * tablet w-28 (7rem / 112px)\r\n\t * desktop w-52 (13rem / 208px)\r\n\t * Aspect ratio stays 16:9 via the .event-card__poster base rules. */\r\n\t.event-card[data-layout='horizontal'] .event-card__poster {\r\n\t\twidth: 6rem;\r\n\t}\r\n\r\n\t@media (min-width: 640px) {\r\n\t\t.event-card[data-layout='horizontal'] .event-card__poster {\r\n\t\t\twidth: var(--event-card-poster-width, 7rem);\r\n\t\t}\r\n\t}\r\n\r\n\t@media (min-width: 1024px) {\r\n\t\t.event-card[data-layout='horizontal'] .event-card__poster {\r\n\t\t\twidth: var(--event-card-poster-width-lg, 13rem);\r\n\t\t}\r\n\t}\r\n\r\n\t/* === Layout: micro centers content === */\r\n\t.event-card[data-layout='micro'] .event-card__content {\r\n\t\ttext-align: center;\r\n\t\talign-items: stretch;\r\n\t}\r\n\r\n\t:global(.event-card__poster .event-card__poster-fill) {\r\n\t\twidth: 100%;\r\n\t\theight: 100%;\r\n\t}\r\n\r\n\t/* === Content stack — single padded container, single rhythm. */\r\n\t.event-card__content {\r\n\t\tpadding: var(--event-card-padding);\r\n\t\tgap: var(--event-card-gap);\r\n\t}\r\n\r\n\t/* === Density tokens (CSS-only — scalar values that drive padding/gap/type) === */\r\n\t.event-card[data-density='micro'] {\r\n\t\t--event-card-padding: 0.25rem;\r\n\t\t--event-card-gap: 0.25rem;\r\n\t\t--event-card-title-size: 0.8125rem;\r\n\t\t--event-card-title-leading: 1.2;\r\n\t\t--event-card-title-clamp: 2;\r\n\t\t--event-card-date-size: 0.6875rem;\r\n\t}\r\n\r\n\t/* At micro density: drop the outer card chrome. The day cell already\r\n\t * provides the bg/border framing. Without this, every cell looks like\r\n\t * a card-inside-a-card (two borders, two paddings, two radii) — too busy\r\n\t * at 130-150px wide. The card becomes just image + title + pills. */\r\n\t.event-card[data-density='micro'] {\r\n\t\tborder: 0;\r\n\t\tbackground: transparent;\r\n\t\tborder-radius: 0;\r\n\t\toverflow: visible;\r\n\t}\r\n\t.event-card[data-density='micro']:hover {\r\n\t\tborder-color: transparent;\r\n\t\ttransform: none;\r\n\t\tbox-shadow: none;\r\n\t}\r\n\t/* Re-clip the poster's own corners since the outer overflow no longer\r\n\t * clips. Keep the image rounded so it doesn't look ragged. */\r\n\t.event-card[data-density='micro'] .event-card__poster {\r\n\t\tborder-radius: 0.375rem;\r\n\t\toverflow: hidden;\r\n\t}\r\n\r\n\t/* Micro density centered title. Badge floats right-of-title via the\r\n\t * .event-card__badge float pattern (defined below). */\r\n\t.event-card[data-density='micro'] .event-card__title {\r\n\t\ttext-align: center;\r\n\t}\r\n\t.event-card[data-density='compact'] {\r\n\t\t--event-card-padding: 0.75rem;\r\n\t\t--event-card-gap: 0.5rem;\r\n\t\t--event-card-title-size: 1rem;\r\n\t\t--event-card-title-leading: 1.3;\r\n\t\t--event-card-title-clamp: 2;\r\n\t\t--event-card-date-size: 0.875rem;\r\n\t}\r\n\t.event-card[data-density='standard'] {\r\n\t\t--event-card-padding: 1rem; /* token: space-4 */\r\n\t\t--event-card-gap: 0.5rem;\r\n\t\t--event-card-title-size: 1rem;\r\n\t\t--event-card-title-leading: 1.3;\r\n\t\t--event-card-title-clamp: 2;\r\n\t\t--event-card-date-size: 0.875rem;\r\n\t}\r\n\t.event-card[data-density='featured'] {\r\n\t\t--event-card-padding: 1.25rem;\r\n\t\t--event-card-gap: 0.75rem;\r\n\t\t--event-card-title-size: 1.25rem;\r\n\t\t--event-card-title-leading: 1.3;\r\n\t\t--event-card-title-clamp: 2;\r\n\t\t--event-card-date-size: 1rem;\r\n\t}\r\n\r\n\t@media (min-width: 1024px) {\r\n\t\t.event-card[data-density='compact'] {\r\n\t\t\t--event-card-padding: 1rem;\r\n\t\t\t--event-card-title-size: 1.0625rem; /* parity with standard at desktop */\r\n\t\t}\r\n\t\t.event-card[data-density='standard'] {\r\n\t\t\t--event-card-padding: 1rem;\r\n\t\t\t--event-card-title-size: 1.0625rem;\r\n\t\t}\r\n\t\t.event-card[data-density='featured'] {\r\n\t\t\t--event-card-padding: 1.5rem;\r\n\t\t\t--event-card-title-size: 1.375rem;\r\n\t\t}\r\n\t}\r\n\r\n\t/* Horizontal layout (List): 3-line clamp so long names fit after the\r\n\t * float-right badge eats line 1. */\r\n\t.event-card[data-layout='horizontal'] {\r\n\t\t--event-card-title-clamp: 3;\r\n\t}\r\n\r\n\t/* Micro density (Calendar tile): badge sits on its OWN row above the\r\n\t * title, not floated inline. Tile is too narrow (~128px) for the\r\n\t * float-right pattern — short first words land next to the badge and the\r\n\t * title fractures. Block badge on its own row keeps the title full-width.\r\n\t * Three-line clamp covers the longest worst-case title. */\r\n\t.event-card[data-density='micro'] {\r\n\t\t--event-card-title-clamp: 3;\r\n\t}\r\n\t.event-card[data-density='micro'] .event-card__badge {\r\n\t\tfloat: none;\r\n\t\tdisplay: block;\r\n\t\tmargin: 0 auto 0.25rem;\r\n\t}\r\n\t/* The badge sits inside the .event-card__title h3, so its block height\r\n\t * counts against the title's max-height clamp. Drop the clamp for micro\r\n\t * so the badge row + 3 title lines both fit. */\r\n\t.event-card[data-density='micro'] .event-card__title {\r\n\t\tmax-height: none;\r\n\t}\r\n\r\n\t/* Horizontal layout below sm bumps title down one notch (16px → 14px). */\r\n\t@media (max-width: 639px) {\r\n\t\t.event-card[data-layout='horizontal'] {\r\n\t\t\t--event-card-title-size: 0.875rem;\r\n\t\t}\r\n\t}\r\n\r\n\t/* === Title type size + soft clamp via max-height + overflow ===\r\n\t * float on .event-card__badge needs regular block flow to wrap title text\r\n\t * around it, so we use max-height + overflow:hidden (not -webkit-box).\r\n\t * Clamp = lines * line-height; line-height is unitless. */\r\n\t.event-card__title {\r\n\t\tfont-size: var(--event-card-title-size);\r\n\t\tline-height: var(--event-card-title-leading);\r\n\t\tmax-height: calc(var(--event-card-title-leading) * var(--event-card-title-clamp) * 1em);\r\n\t\toverflow: hidden;\r\n\t}\r\n\r\n\t/* Badge floats right-of-title so long names dodge it on line 1 then use\r\n\t * the full content width on subsequent lines. Sits above the stretched\r\n\t * link via z-index so its pointer events still hit. */\r\n\t.event-card__badge {\r\n\t\tfloat: right;\r\n\t\tmargin-left: 0.5rem;\r\n\t\tmargin-bottom: 0.25rem;\r\n\t\tposition: relative;\r\n\t\tz-index: var(--z-event-card-interactive);\r\n\t}\r\n\r\n\t/* === Stretched link === */\r\n\t.event-card__title-link {\r\n\t\tcolor: inherit;\r\n\t\ttext-decoration: none;\r\n\t}\r\n\t.event-card__title-link::before {\r\n\t\tcontent: '';\r\n\t\tposition: absolute;\r\n\t\tinset: 0;\r\n\t\tz-index: var(--z-event-card-stretched-link);\r\n\t}\r\n\t.event-card__title-link:focus-visible {\r\n\t\toutline: 2px solid var(--color-focus-ring, currentColor);\r\n\t\toutline-offset: 2px;\r\n\t}\r\n\r\n\t.event-card__date {\r\n\t\tfont-size: var(--event-card-date-size);\r\n\t}\r\n\r\n\t/* === Pills sit above stretched-link pseudo === */\r\n\t.event-card__pills {\r\n\t\tz-index: var(--z-event-card-interactive);\r\n\t}\r\n\r\n\t.event-card[data-layout='micro'] .event-card__pills {\r\n\t\tjustify-content: center;\r\n\t}\r\n\r\n\t/* Sold-out time pills render IDENTICALLY to other pills — per project\r\n\t * rule, we don't dim or differentiate sold-out states. The pill stays\r\n\t * full opacity; user clicks through and gets the waitlist option on the\r\n\t * event page. aria-label still announces \"sold out\" for screen readers\r\n\t * when the consuming view sets it. */\r\n\r\n\t/* At micro density: stack pills vertically, each full-width. */\r\n\t.event-card[data-density='micro'] .event-card__pills {\r\n\t\tflex-direction: column;\r\n\t\tgap: 0.25rem;\r\n\t}\r\n\t.event-card[data-density='micro'] .event-card__pills :global(> *) {\r\n\t\twidth: 100%;\r\n\t}\r\n\r\n\t/* === Description clamp === */\r\n\t.event-card__description {\r\n\t\tdisplay: -webkit-box;\r\n\t\t-webkit-line-clamp: 2;\r\n\t\tline-clamp: 2;\r\n\t\t-webkit-box-orient: vertical;\r\n\t\toverflow: hidden;\r\n\t}\r\n\r\n\t@media (prefers-reduced-motion: reduce) {\r\n\t\t.event-card,\r\n\t\t.event-card:hover {\r\n\t\t\ttransform: none;\r\n\t\t\ttransition: none;\r\n\t\t}\r\n\t}\r\n</style>\r\n","<script>\r\n import { ChevronLeftOutline, ChevronRightOutline } from '../../primitives/Icons';\r\n import { typography } from '../../tokens/typography';\r\n import { formatMonth } from '../../datetime/format';\r\n\r\n const defaultLabels = {\r\n today: 'Today',\r\n previousMonth: 'Previous month',\r\n goToCurrentMonth: 'Go to current month',\r\n nextMonth: 'Next month',\r\n };\r\n\r\n const today = new Date();\r\n const todayLocalMonth = today.getMonth();\r\n const todayLocalYear = today.getFullYear();\r\n\r\n let {\r\n currentYear = todayLocalYear,\r\n currentMonth = todayLocalMonth,\r\n handleNext = () => {},\r\n handlePrev = () => {},\r\n handleToday = () => {},\r\n disablePastNavigation = true,\r\n labels: userLabels = {},\r\n } = $props();\r\n\r\n let labels = $derived({ ...defaultLabels, ...userLabels });\r\n\r\n let isAtCurrentMonth = $derived(\r\n currentYear === todayLocalYear && currentMonth === todayLocalMonth\r\n );\r\n\r\n let canGoPrev = $derived(!disablePastNavigation || !isAtCurrentMonth);\r\n\r\n let prevPressed = $state(false);\r\n let nextPressed = $state(false);\r\n let todayPressed = $state(false);\r\n\r\n function triggerHaptic(style = 'light') {\r\n if (typeof window === 'undefined') return;\r\n\r\n if (window.webkit?.messageHandlers?.haptic) {\r\n window.webkit.messageHandlers.haptic.postMessage(style);\r\n return;\r\n }\r\n\r\n if (window.TapticEngine) {\r\n window.TapticEngine.impact({ style });\r\n return;\r\n }\r\n\r\n if (navigator.vibrate) {\r\n navigator.vibrate(style === 'light' ? 10 : 20);\r\n }\r\n }\r\n\r\n function handlePrevClick() {\r\n if (canGoPrev) {\r\n triggerHaptic('light');\r\n handlePrev();\r\n }\r\n }\r\n\r\n function handleNextClick() {\r\n triggerHaptic('light');\r\n handleNext();\r\n }\r\n\r\n function handleTodayClick() {\r\n triggerHaptic('light');\r\n handleToday();\r\n }\r\n</script>\r\n\r\n<header class=\"w-full flex items-center justify-between select-none\">\r\n <h2 class=\"{typography.h1} text-3xl\">\r\n {formatMonth(new Date(currentYear, currentMonth, 1).toISOString(), 'UTC', false)}\r\n </h2>\r\n <div class=\"flex items-center gap-2\">\r\n <button\r\n class=\"p-3 -m-1.5 flex items-center justify-center border-0 rounded-full bg-transparent text-muted-foreground cursor-pointer select-none transition-transform duration-100 ease-out hover:bg-muted hover:text-text-primary focus:outline-hidden disabled:opacity-50 disabled:cursor-not-allowed\"\r\n class:scale-90={prevPressed}\r\n class:bg-muted={prevPressed}\r\n class:text-text-primary={prevPressed}\r\n onclick={handlePrevClick}\r\n ontouchstart={() => prevPressed = true}\r\n ontouchend={() => prevPressed = false}\r\n ontouchcancel={() => prevPressed = false}\r\n onmousedown={() => prevPressed = true}\r\n onmouseup={() => prevPressed = false}\r\n onmouseleave={() => prevPressed = false}\r\n disabled={!canGoPrev}\r\n aria-label={labels.previousMonth}\r\n >\r\n <ChevronLeftOutline class=\"w-5 h-5\" />\r\n </button>\r\n <button\r\n class=\"{`${typography.label} px-3 py-1 border border-stroke-primary rounded-lg bg-transparent cursor-pointer select-none transition-transform duration-100 ease-out hover:bg-brand-primary hover:text-white hover:border-brand-primary focus:outline-hidden disabled:opacity-40 disabled:cursor-not-allowed disabled:text-muted-foreground:text-muted-foreground`}\"\r\n class:scale-95={todayPressed}\r\n class:bg-brand-primary={todayPressed}\r\n class:text-white={todayPressed}\r\n onclick={handleTodayClick}\r\n ontouchstart={() => todayPressed = true}\r\n ontouchend={() => todayPressed = false}\r\n ontouchcancel={() => todayPressed = false}\r\n onmousedown={() => todayPressed = true}\r\n onmouseup={() => todayPressed = false}\r\n onmouseleave={() => todayPressed = false}\r\n disabled={isAtCurrentMonth}\r\n aria-label={labels.goToCurrentMonth}\r\n >\r\n {labels.today}\r\n </button>\r\n <button\r\n class=\"p-3 -m-1.5 flex items-center justify-center border-0 rounded-full bg-transparent text-muted-foreground cursor-pointer select-none transition-transform duration-100 ease-out hover:bg-muted hover:text-text-primary focus:outline-hidden\"\r\n class:scale-90={nextPressed}\r\n class:bg-muted={nextPressed}\r\n class:text-text-primary={nextPressed}\r\n onclick={handleNextClick}\r\n ontouchstart={() => nextPressed = true}\r\n ontouchend={() => nextPressed = false}\r\n ontouchcancel={() => nextPressed = false}\r\n onmousedown={() => nextPressed = true}\r\n onmouseup={() => nextPressed = false}\r\n onmouseleave={() => nextPressed = false}\r\n aria-label={labels.nextMonth}\r\n >\r\n <ChevronRightOutline class=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n</header>\r\n","/**\n * Image URL resolution utility — canonical.\n *\n * API responses return image paths as relative strings (e.g.\n * `/uploads/events/poster.jpg`). These need a DigitalOcean Spaces base\n * URL prepended to form a valid URL.\n *\n * Two base URLs are supported:\n * - Origin (default): direct DO Spaces, fine for admin dashboards and\n * upload preview.\n * - CDN: CloudFront-fronted, faster — use for public-facing high-\n * traffic pages (event detail, series detail, og:image).\n *\n * Hoisted from micdrop-frontend `$lib/utils/imageUrl` into\n * @getmicdrop/svelte-components in 5.34.0 so performersportal and\n * venue-calendar-npm can stop hand-rolling `getImageUrl`/`getPhotoUrl`\n * variants. Migration codemod: `migrate-moxy-urls`.\n *\n * Returns `AssetUrl` (branded) so call sites passing raw strings into\n * AssetUrl-typed slots become compile errors. The empty-string\n * fallback also flows out as `AssetUrl` — that's intentional: empty\n * means \"no asset\", not \"invalid URL\".\n */\nconst SPACES_BASE_URL_ORIGIN = 'https://moxy.sfo3.digitaloceanspaces.com';\nconst SPACES_BASE_URL_CDN = 'https://moxy.sfo3.cdn.digitaloceanspaces.com';\n/**\n * Resolves an image path from the API into a full URL.\n *\n * - Full URLs (http/https), `data:`, and `blob:` pass through unchanged.\n * - Relative paths get the DO Spaces base URL prepended.\n * - Empty/null returns `options.fallback` (default `''`).\n * - Pass `{ cdn: true }` for the CloudFront-fronted variant.\n *\n * Backwards-compatible with the legacy `(path, fallback: string)` shape.\n */\nexport function resolveImageUrl(path, options = {}) {\n const opts = typeof options === 'string' ? { fallback: options } : options;\n const fallback = opts.fallback ?? '';\n const cdn = opts.cdn ?? false;\n if (!path || path.trim() === '')\n return fallback;\n if (path.startsWith('http') ||\n path.startsWith('data:') ||\n path.startsWith('blob:')) {\n return path;\n }\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const base = cdn ? SPACES_BASE_URL_CDN : SPACES_BASE_URL_ORIGIN;\n return `${base}${normalizedPath}`;\n}\n/**\n * Resolve an event's display image, reading the legacy field fallback chain\n * (`image → coverImage → imageUrl → image_url`) and delegating the\n * relative-path / CDN resolution to {@link resolveImageUrl}.\n *\n * Hoisted from the MF/VC `getEventImageUrl` + `getCDNImageUrl` duplicates\n * (consolidation audit #4). The CDN-prepend step IS `resolveImageUrl`, so no\n * separate `getCDNImageUrl` is needed.\n *\n * @param event - Event-shaped object\n * @param options - Placeholder + CDN options\n * @returns Resolved image URL, or `options.placeholder` when no field is set\n *\n * @example\n * getEventImageUrl({ coverImage: '/p.jpg' }) // origin URL\n * getEventImageUrl({}, { placeholder: '/fallback.png' }) // '/fallback.png'\n */\nexport function getEventImageUrl(event, options = {}) {\n const { placeholder = '', cdn = false } = options;\n const raw = event.image || event.coverImage || event.imageUrl || event.image_url || '';\n return resolveImageUrl(raw, { fallback: placeholder, cdn });\n}\nexport { SPACES_BASE_URL_ORIGIN as SPACES_BASE_URL, SPACES_BASE_URL_CDN, SPACES_BASE_URL_ORIGIN, };\n","/**\n * Ticket domain transforms — canonical.\n *\n * Status / public-filter / scarcity / lowest-price derivations over the raw\n * API ticket \"wire\" shape. Hoisted into @getmicdrop/svelte-components so MF\n * (`micdrop-frontend/src/lib/utils/eventTransform.ts`) and VC\n * (`venue-calendar-npm/src/lib/utils/event-transform.js`) stop maintaining\n * two function-for-function copies of the same logic (see consolidation\n * audit #5). MF is the source of truth for `calculateTicketStatus`'s status\n * vocabulary; this module ships the union of the two repos' accepted field\n * names so both can migrate onto it.\n *\n * Pure domain logic only — no Svelte, no app state, no formatting.\n *\n * NOTE on types: this operates on the RAW wire ticket (lossy DB integers for\n * `salesChannel` / `visibility`), which is distinct from `schemas/ticket.ts`\n * (the zod CREATION-input validator whose enums are string canonicals). The\n * named constants below pin the integer↔enum correspondence.\n */\n/**\n * Sales-channel wire codes (raw API `salesChannel` integer). Mirrors the\n * `salesChannelSchema` string enum in `schemas/ticket.ts`\n * (everywhere/onlineOnly/boxOfficeOnly) — named here because these transforms\n * run on the wire integer, before any zod decode. `2` is the \"at the door\n * only\" channel excluded from online/public sales.\n */\nexport const SALES_CHANNEL = {\n EVERYWHERE: 0,\n ONLINE_ONLY: 1,\n BOX_OFFICE_ONLY: 2,\n};\n/**\n * Ticket-visibility wire codes (raw API `visibility` integer). Mirrors\n * `ticketVisibilitySchema` (visible/hidden/promoOnly). `0` is the publicly\n * visible ticket; non-zero values are hidden / promo-gated.\n */\nexport const TICKET_VISIBILITY = {\n VISIBLE: 0,\n HIDDEN: 1,\n PROMO_ONLY: 2,\n};\n/** Fraction of remaining/total stock below which a ticket reads as \"low\". */\nexport const LOW_STOCK_THRESHOLD = 0.1;\n/**\n * Remaining capacity for a ticket, reading the wire field aliases in order.\n *\n * Returns 0 immediately when `soldOut === true` — the backend's explicit\n * sold-out signal is authoritative and must be honoured by every stock-based\n * path (calculateTicketStatus, calculateScarcity, low-stock ratio) without\n * each consumer needing its own guard.\n *\n * **Deliberate design decision — `quantity` is treated as REMAINING, not TOTAL.**\n * The pinned MF characterization (`eventTransform.ts`) treats `quantity` as a\n * remaining-capacity alias, not a total-capacity field. Subtracting `sold` from\n * `quantity` would undercount availability on endpoints that send `quantity` as\n * remaining. Consequently a payload such as `{ quantity: 50, sold: 50 }` with\n * no other fields resolves `quantity` (50) as remaining and reads 'on_sale'.\n * This is intentional: the authoritative signal for sold-out is `soldOut: true`\n * or an explicit remaining field (`remainingCapacity` / `quantityRemaining`).\n * Backends that track sales via `sold` MUST also send `soldOut: true` or a\n * remaining field when the ticket is sold out; `sold` alone is insufficient.\n *\n * The `sold`-derivation (`totalCapacity - sold`) is applied only when\n * `totalCapacity` is present and no remaining field exists, because in that\n * shape `totalCapacity` unambiguously names the ceiling.\n *\n * Falls back to deriving `totalCapacity - sold` only when no explicit\n * remaining field is present on the wire payload.\n */\nfunction ticketRemaining(ticket) {\n // Explicit backend sold-out signal: treat as zero remaining so all\n // consumers (calculateTicketStatus, calculateScarcity, low-stock) agree.\n if (ticket.soldOut === true)\n return 0;\n if (ticket.remainingCapacity != null)\n return ticket.remainingCapacity;\n if (ticket.quantityRemaining != null)\n return ticket.quantityRemaining;\n if (ticket.quantity != null)\n return ticket.quantity;\n // Derived fallback: when the payload provides sold count + totalCapacity but\n // no remaining field, derive remaining so stock-based checks still work.\n if (ticket.sold != null && ticket.totalCapacity != null) {\n return Math.max(0, ticket.totalCapacity - ticket.sold);\n }\n return 0;\n}\n/** Total capacity for a ticket, falling back to quantity then remaining. */\nfunction ticketTotal(ticket, remaining) {\n return ticket.totalCapacity ?? ticket.quantity ?? remaining;\n}\n/**\n * Derive a display status from a ticket's sale window and stock.\n *\n * Pinned to the MF implementation: returns `scheduled` before the window\n * opens, `sales_ended` after it closes, then `sold_out` / `low` / `on_sale`\n * by stock. Reads the sale window preferring the backend-RESOLVED\n * `effectiveSalesBegin`/`effectiveSalesEnd` (correct for relative-offset\n * tickets, whose raw window can be stale), then the MF (`salesBegin`/\n * `salesEnd`) or VC (`saleStartDate`/`saleEndDate`) field names. Absolute\n * tickets carry no effective fields, so their behavior is unchanged.\n *\n * @param ticket - Raw wire ticket\n * @returns Status string (see {@link TicketStatus})\n */\nexport function calculateTicketStatus(ticket) {\n const now = new Date();\n // Prefer the backend-RESOLVED window for relative-offset tickets — the raw\n // `salesBegin`/`salesEnd` can be stale, while `effectiveSalesBegin`/\n // `effectiveSalesEnd` carry the concrete window the backend computed. For\n // absolute tickets the effective fields are absent, so this read is\n // identical to the prior raw-only read.\n const startRaw = ticket.effectiveSalesBegin ?? ticket.salesBegin ?? ticket.saleStartDate ?? null;\n const endRaw = ticket.effectiveSalesEnd ?? ticket.salesEnd ?? ticket.saleEndDate ?? null;\n const salesBegin = startRaw ? new Date(startRaw) : null;\n const salesEnd = endRaw ? new Date(endRaw) : null;\n if (salesBegin && now < salesBegin)\n return 'scheduled';\n if (salesEnd && now > salesEnd)\n return 'sales_ended';\n // soldOut wire flag: explicit backend signal — checked before stock maths.\n if (ticket.soldOut === true)\n return 'sold_out';\n const remaining = ticketRemaining(ticket);\n const total = ticketTotal(ticket, remaining);\n if (remaining === 0)\n return 'sold_out';\n if (total > 0 && remaining / total < LOW_STOCK_THRESHOLD)\n return 'low';\n return 'on_sale';\n}\n/**\n * Filter tickets to the public / online-sellable subset.\n *\n * @param tickets - Tickets to filter\n * @param options - Which exclusions to apply\n * @returns Filtered tickets (a new array; input order preserved)\n */\nexport function filterPublicTickets(tickets, options = {}) {\n if (!Array.isArray(tickets))\n return [];\n let filtered = tickets;\n if (options.excludeDoorOnly) {\n filtered = filtered.filter(t => t.salesChannel !== SALES_CHANNEL.BOX_OFFICE_ONLY);\n }\n if (options.publicOnly) {\n filtered = filtered.filter(t => t.visibility === TICKET_VISIBILITY.VISIBLE);\n }\n return filtered;\n}\n/**\n * Sum remaining / total capacity across tickets (pre-filter to public first).\n *\n * @param tickets - Tickets to aggregate\n * @returns Scarcity totals; `isSoldOut` true when nothing remains\n */\nexport function calculateScarcity(tickets) {\n if (!Array.isArray(tickets) || tickets.length === 0) {\n return { totalRemaining: 0, totalCapacity: 0, isSoldOut: false };\n }\n let totalRemaining = 0;\n let totalCapacity = 0;\n for (const ticket of tickets) {\n const remaining = ticketRemaining(ticket);\n totalRemaining += remaining;\n totalCapacity += ticketTotal(ticket, remaining);\n }\n return {\n totalRemaining,\n totalCapacity,\n isSoldOut: totalRemaining === 0,\n };\n}\n/**\n * Lowest positive price across a set of tickets, reading `price` then\n * `ticketPrice`. String prices are coerced to number; non-positive and\n * non-finite values are ignored. Returns `0` when no priced ticket exists.\n *\n * @param tickets - Tickets to scan\n * @returns Lowest positive price, or `0`\n */\nexport function findLowestPrice(tickets) {\n if (!Array.isArray(tickets) || tickets.length === 0)\n return 0;\n const prices = tickets\n .map(t => Number(t.price ?? t.ticketPrice ?? 0))\n .filter(p => Number.isFinite(p) && p > 0);\n return prices.length > 0 ? Math.min(...prices) : 0;\n}\n","/**\n * Event domain transforms — canonical.\n *\n * Wire→display derivations over the raw API event shape: series-template\n * filtering, upcoming/past timing windows, hidden-ticket purchasability, CTA\n * state, and event-level scarcity (composing the ticket transforms). Hoisted\n * into @getmicdrop/svelte-components so MF\n * (`micdrop-frontend/src/routes/a/(event-tabs)/events/_utils/eventsTransforms.ts`)\n * and VC (`venue-calendar-npm/src/lib/utils/event-transform.js`,\n * `src/lib/api/transformers/event.ts`) stop maintaining per-repo copies of the\n * same domain rules. Each function documents which repo's implementation it is\n * characterization-pinned to; the wire types ship the union of the two repos'\n * accepted field names so both can migrate onto it.\n *\n * Pure domain logic only — no Svelte, no app state, no formatting.\n *\n * Deliberately NOT here (see the barrel note + per-repo modules):\n * - event→image-URL resolution (`utils/imageUrl`), tz resolution + date/time\n * formatting (`datetime`) — excluded by the transforms barrel note.\n * - MF table/collection row shaping and i18n status labels\n * (`statusVariants`/paraglide) — app-specific presentation.\n * - MF's event status machine (`$lib/events/status.ts`) — admin-app domain\n * with English labels + Tailwind classes; the server is authoritative for\n * status transitions.\n * - VC's `parseEvent`/`parseTicket` wire→domain normalizers — VC-app boundary\n * with deliberately preserved `||` falsy semantics.\n */\nimport { SALES_CHANNEL, TICKET_VISIBILITY, calculateScarcity, filterPublicTickets, } from './ticket.js';\n// ============================================================================\n// Named constants — timing grace windows\n// ============================================================================\n/**\n * How long after its `endDate` an event still counts as \"upcoming\"\n * (4 hours). MF keeps a just-finished show in the upcoming tab briefly so\n * operators working the door don't watch it vanish mid-event.\n */\nexport const UPCOMING_GRACE_AFTER_END_MS = 4 * 60 * 60 * 1000;\n/**\n * How long after its start an event WITHOUT an end date still counts as\n * \"upcoming\" (6 hours) — the assumed maximum show length when the wire\n * payload carries no `endDate`.\n */\nexport const UPCOMING_GRACE_AFTER_START_MS = 6 * 60 * 60 * 1000;\n// ============================================================================\n// Wire-field readers\n// ============================================================================\n/** Event start raw string, reading the wire field aliases in order. */\nfunction eventStartRaw(event) {\n return (event.startDate ||\n event.startDateTime ||\n event.start_date_time ||\n event.date ||\n undefined);\n}\n/** Event end raw string, reading the wire field aliases in order. */\nfunction eventEndRaw(event) {\n return event.endDate || event.endDateTime || event.end_date_time || undefined;\n}\n/** Tickets array, reading the wire field aliases in order. */\nfunction eventTickets(event) {\n return event.availableTickets || event.available_tickets || event.tickets || [];\n}\n// ============================================================================\n// Series-template filtering\n// ============================================================================\n/**\n * Filter out series template/master events from an event list.\n *\n * Template events are placeholders with no start date that hold series\n * configuration; they must never appear in user-facing event listings.\n * Pinned to the MF implementation (`filterOutTemplateEvents`).\n *\n * @param events - Events to filter\n * @returns Events excluding series templates (a new array; order preserved)\n */\nexport function filterOutTemplateEvents(events) {\n if (!Array.isArray(events))\n return [];\n return events.filter(e => {\n const seriesId = e.eventSeriesId ?? e.event_series_id;\n const start = eventStartRaw(e);\n return !(seriesId && seriesId > 0 && !start);\n });\n}\n// ============================================================================\n// Upcoming / past timing windows\n// ============================================================================\n/**\n * Tri-state temporal classification mirroring MF's paired filter loops.\n * Events whose dates don't parse land in NEITHER list (NaN comparisons are\n * false in both directions) — preserved from the MF implementation.\n */\nfunction eventTemporalState(event, now) {\n // MF: `new Date(event.startDate || event.date)` — a missing start yields an\n // Invalid Date, which classifies as indeterminate below.\n const startDate = new Date(eventStartRaw(event));\n if (startDate >= now)\n return 'upcoming';\n const endRaw = eventEndRaw(event);\n const endDate = endRaw ? new Date(endRaw) : null;\n const cutoff = endDate\n ? new Date(endDate.getTime() + UPCOMING_GRACE_AFTER_END_MS)\n : new Date(startDate.getTime() + UPCOMING_GRACE_AFTER_START_MS);\n if (now <= cutoff)\n return 'upcoming';\n if (now > cutoff)\n return 'past';\n return 'indeterminate'; // NaN cutoff — unparseable dates\n}\n/**\n * Keep events that are upcoming or still inside their grace window: start in\n * the future, OR within {@link UPCOMING_GRACE_AFTER_END_MS} of the end date,\n * OR (no end date) within {@link UPCOMING_GRACE_AFTER_START_MS} of the start.\n * Pinned to the MF implementation (`filterUpcomingEvents`).\n *\n * @param events - Events to filter\n * @returns Upcoming events (a new array; order preserved)\n */\nexport function filterUpcomingEvents(events) {\n if (!Array.isArray(events))\n return [];\n const now = new Date();\n return events.filter(e => eventTemporalState(e, now) === 'upcoming');\n}\n/**\n * Keep events strictly past their grace window (complement of\n * {@link filterUpcomingEvents}, except unparseable dates land in neither).\n * Pinned to the MF implementation (`filterPastEvents`).\n *\n * @param events - Events to filter\n * @returns Past events (a new array; order preserved)\n */\nexport function filterPastEvents(events) {\n if (!Array.isArray(events))\n return [];\n const now = new Date();\n return events.filter(e => eventTemporalState(e, now) === 'past');\n}\n/**\n * Dispatch an event list through the tab filters.\n *\n * @param events - Events to filter\n * @param tab - `all` (no filtering) / `upcoming` / `past`\n * @returns Filtered events\n */\nexport function filterEventsByTab(events, tab) {\n switch (tab) {\n case 'upcoming':\n return filterUpcomingEvents(events);\n case 'past':\n return filterPastEvents(events);\n default:\n return Array.isArray(events) ? events : [];\n }\n}\n// ============================================================================\n// Hidden-ticket purchasability\n// ============================================================================\n/**\n * Is this ticket a hidden (promo-gated) ticket that's still purchasable right\n * now? Drives the \"Sales ended\" / \"Sold out\" / \"No tickets\" → \"Get tickets\"\n * CTA override on the public site. Pinned to the VC implementation\n * (`isHiddenTicketPurchasable`); the sale-window alias chains additionally\n * accept the `saleStartDate`/`saleEndDate` casing (lowest precedence) so the\n * canonical ticket wire decodes too, and prefer the backend-RESOLVED\n * `effectiveSalesBegin`/`effectiveSalesEnd` (highest precedence) so\n * relative-offset tickets honour their resolved window rather than a stale\n * raw one.\n *\n * A ticket with NO capacity fields at all counts as purchasable (capacity\n * unknown ≠ sold out) — unlike `calculateTicketStatus`, which defaults\n * unknown stock to 0.\n *\n * @param ticket - Raw wire ticket\n * @returns True when hidden AND inside its sale window AND not sold out\n */\nexport function isHiddenTicketPurchasable(ticket) {\n if (!ticket)\n return false;\n const isHidden = ticket.isHidden === true ||\n (typeof ticket.visibility === 'number' &&\n ticket.visibility >= TICKET_VISIBILITY.PROMO_ONLY);\n if (!isHidden)\n return false;\n if (ticket.salesChannel === SALES_CHANNEL.BOX_OFFICE_ONLY)\n return false;\n const now = new Date();\n // Prefer the backend-RESOLVED window (`effectiveSalesBegin`/\n // `effectiveSalesEnd`) for relative-offset tickets; absent for absolute\n // tickets, so the raw chain below is used unchanged in that case.\n const salesBegin = ticket.effectiveSalesBegin ||\n ticket.salesBegin ||\n ticket.salesStart ||\n ticket.saleBegin ||\n ticket.onSaleStart ||\n ticket.saleStartDate;\n const salesEnd = ticket.effectiveSalesEnd ||\n ticket.salesEnd ||\n ticket.saleEnd ||\n ticket.onSaleEnd ||\n ticket.saleEndDate;\n if (salesBegin && new Date(salesBegin) > now)\n return false;\n if (salesEnd && new Date(salesEnd) < now)\n return false;\n const remaining = ticket.remainingCapacity ?? ticket.quantityRemaining ?? ticket.quantity;\n const isSoldOut = ticket.soldOut ||\n (remaining !== null && remaining !== undefined && remaining <= 0);\n if (isSoldOut)\n return false;\n return true;\n}\n/**\n * Whether an event has any purchasable hidden tickets. The backend may strip\n * hidden tickets from `availableTickets` on list endpoints; the top-level\n * `hasHiddenTickets` flag wins when set. Pinned to the VC implementation\n * (`eventHasPurchasableHiddenTickets`).\n *\n * @param event - Raw wire event\n * @returns True when the flag is set or any ticket passes\n * {@link isHiddenTicketPurchasable}\n */\nexport function eventHasPurchasableHiddenTickets(event) {\n if (!event)\n return false;\n if (event.hasHiddenTickets === true)\n return true;\n return eventTickets(event).some(isHiddenTicketPurchasable);\n}\n// ============================================================================\n// CTA state\n// ============================================================================\n/**\n * Derive the public-site CTA state for an event.\n *\n * Precedence (pinned to the VC implementation, `calculateCtaState`):\n * 1. explicit `ctaState`/`cta_state` on the wire — passed through;\n * 2. cancelled or already-started events → `ended`;\n * 3. backend-aggregated `ticketsAvailable` count → `sold_out`/`available`;\n * 4. tickets array — none → `coming_soon`, else sum of gross quantity minus\n * sold → `sold_out`/`available`.\n *\n * @param event - Raw wire event\n * @returns CTA state (see {@link CtaState})\n */\nexport function calculateCtaState(event) {\n const explicitState = event.ctaState || event.cta_state;\n if (explicitState)\n return explicitState;\n if (event.isCancelled || event.is_cancelled)\n return 'ended';\n const eventDate = eventStartRaw(event);\n if (eventDate) {\n const eventTime = new Date(eventDate).getTime();\n if (eventTime < Date.now())\n return 'ended';\n }\n const availableCount = event.ticketsAvailable ?? event.tickets_available;\n if (availableCount !== undefined) {\n return availableCount <= 0 ? 'sold_out' : 'available';\n }\n const tickets = eventTickets(event);\n if (tickets.length === 0)\n return 'coming_soon';\n const totalAvailable = tickets.reduce((sum, t) => {\n const qty = t.quantityAvailable ?? t.quantity_available ?? t.quantity ?? 0;\n const sold = t.quantitySold ?? t.quantity_sold ?? 0;\n return sum + Math.max(0, qty - sold);\n }, 0);\n return totalAvailable <= 0 ? 'sold_out' : 'available';\n}\n// ============================================================================\n// Event-level scarcity\n// ============================================================================\n/**\n * Aggregate remaining/total capacity for an event.\n *\n * Prefers the backend-supplied remaining/total pair when both are numbers\n * (VC's org-month endpoint omits the ticket array). Casings are tried as\n * COMPLETE SAME-CASING PAIRS — mixing fields across casings is forbidden\n * because a partial cross-casing match (e.g. `ticketsRemaining: 0` from VC\n * + `totalSeats: 200` from prod) would form a synthetic sold-out result and\n * wrongly skip the ticket-array fallback. The VC pair\n * (`ticketsRemaining`/`ticketsTotal`) is tried first — it's pinned from live\n * VC org-month payloads — then the prod seat-aggregate pair\n * (`remainingSeats`/`totalSeats`). In the fast-path branch `isSoldOut`\n * additionally requires a positive capacity, so a zero-capacity event never\n * reads as sold out. Otherwise filters the ticket\n * array to online-sellable tickets (`excludeDoorOnly`, hidden tickets kept)\n * and sums via `calculateScarcity`. Pinned to the VC implementation\n * (`transformBrowseEvent`'s inline scarcity block).\n *\n * @param event - Raw wire event\n * @returns Scarcity totals (see `ScarcityData` in the ticket transforms)\n */\nexport function calculateEventScarcity(event) {\n if (!event)\n return { totalRemaining: 0, totalCapacity: 0, isSoldOut: false };\n // Each casing is tried as a COMPLETE SAME-CASING PAIR — never mixing fields\n // across casings. Mixing would allow a payload with `ticketsRemaining: 0`\n // (VC) + `totalSeats: 200` (prod) to form a synthetic pair, report sold-out,\n // and skip the ticket-array fallback incorrectly.\n //\n // VC pair (`ticketsRemaining`/`ticketsTotal`) is tried first — pinned from\n // live VC org-month payloads (Stack/Carousel/Spotlight widgets consume them).\n // Prod seat-aggregate pair (`remainingSeats`/`totalSeats`) is the fallback.\n const vcPairComplete = typeof event.ticketsRemaining === 'number' &&\n typeof event.ticketsTotal === 'number';\n const prodPairComplete = typeof event.remainingSeats === 'number' &&\n typeof event.totalSeats === 'number';\n const wireRemaining = vcPairComplete\n ? event.ticketsRemaining\n : prodPairComplete\n ? event.remainingSeats\n : null;\n const wireTotal = vcPairComplete\n ? event.ticketsTotal\n : prodPairComplete\n ? event.totalSeats\n : null;\n if (typeof wireRemaining === 'number' && typeof wireTotal === 'number') {\n const totalRemaining = wireRemaining;\n const totalCapacity = wireTotal;\n return {\n totalRemaining,\n totalCapacity,\n isSoldOut: totalCapacity > 0 && totalRemaining <= 0,\n };\n }\n const publicTickets = filterPublicTickets(eventTickets(event), {\n excludeDoorOnly: true,\n publicOnly: false,\n });\n return calculateScarcity(publicTickets);\n}\n","/**\n * Timezone utility helpers.\n * Canonical source for timezone defaults and validation.\n */\n/**\n * Returns the default timezone for Micdrop, branded as `IANATimezone`.\n * Used when no explicit timezone is provided to date formatters. Bypass\n * call sites that pass `'America/Los_Angeles'` literally are red-squiggle\n * type errors at canonicals that take `IANATimezone` — the fix is to\n * thread `getDefaultTimezone()` through.\n *\n * @returns Branded IANA timezone (`'America/Los_Angeles'`)\n *\n * @example\n * formatDate(new Date(), {}, 'en-US', getDefaultTimezone())\n *\n * @deprecated Duplicate of the canonical default. Use `getDefaultTimezone`\n * (or the `DEFAULT_TIMEZONE` constant) from `$lib/datetime`\n * (re-exported via `datetime/constants`) — the single source of truth.\n */\nexport function getDefaultTimezone() {\n return 'America/Los_Angeles';\n}\n/**\n * Validates an IANA timezone string.\n * Uses Intl.DateTimeFormat to test if the timezone is recognized.\n *\n * @param tz - Timezone string to validate\n * @returns true if valid IANA timezone, false otherwise\n *\n * @example\n * isValidTimezone('America/Los_Angeles') // true\n * isValidTimezone('Invalid/Zone') // false\n *\n * @deprecated Lenient: `Intl.DateTimeFormat` accepts non-canonical inputs.\n * Use `isValidTimezone` from `$lib/datetime` (stricter — rejects\n * abbreviations like `'PST'`), or `toIANATimezone` from `$lib/types/brands`\n * when you need a branded value.\n */\nexport function isValidTimezone(tz) {\n try {\n new Intl.DateTimeFormat('en-US', { timeZone: tz });\n return true;\n }\n catch {\n return false;\n }\n}\n","/**\r\n * Text utility functions: generateSlug, validateNegativeNumber\r\n *\r\n * classNames and truncateTitle re-exported from @getmicdrop/svelte-components\r\n * via ./utils.js for backward compatibility with existing consumers.\r\n */\r\n\r\n/**\r\n * Generate a URL-friendly slug from a string\r\n */\r\nexport function generateSlug(text: string): string {\r\n if (!text) return '';\r\n\r\n return text\r\n .toLowerCase()\r\n .trim()\r\n .replace(/[^\\w\\s-]/g, '')\r\n .replace(/\\s+/g, '-')\r\n .replace(/--+/g, '-')\r\n .replace(/^-+|-+$/g, '');\r\n}\r\n\r\n/**\r\n * Validate that a value is a positive number\r\n * Returns an error message string, or empty string if valid\r\n */\r\nexport function validateNegativeNumber(\r\n value: string | number | null | undefined\r\n): string {\r\n if (value === null || value === undefined || value === '') {\r\n return 'Must be greater than zero.';\r\n }\r\n\r\n const stringValue = String(value).trim();\r\n\r\n if (\r\n stringValue.includes('--') ||\r\n stringValue.includes('++') ||\r\n stringValue.match(/^-+$/) ||\r\n stringValue.match(/^\\++$/)\r\n ) {\r\n return 'Please enter a valid number';\r\n }\r\n\r\n if (stringValue.match(/^-?\\d+-$/)) {\r\n return 'Please enter a valid number';\r\n }\r\n\r\n if ((stringValue.match(/\\./g) || []).length > 1) {\r\n return 'Please enter a valid number';\r\n }\r\n\r\n const numValue = Number(value);\r\n if (isNaN(numValue)) {\r\n return 'Please enter a valid number';\r\n }\r\n\r\n if (numValue < 0 || numValue === 0) {\r\n return 'Price must be greater than zero.';\r\n }\r\n\r\n return '';\r\n}\r\n","/**\r\n * Hash deep-link builders for the calendar widget.\r\n *\r\n * These produce entity-agnostic hash hrefs like `#123-my-event` (no e/s/c\r\n * type prefix). The widget intercepts the click to open the show in-place and\r\n * mirrors the hash via replaceState; the href also makes the row middle-click\r\n * / share friendly. The widget resolves the entity type by id from its own\r\n * loaded data.\r\n */\r\n\r\nimport { generateSlug } from '$lib/utils/textUtils';\r\n\r\n/** Split \"123-some-slug\" into { id, slug }. Splits on first dash only (slug may contain dashes). */\r\nexport function parseEntityParam(value: string): { id: string; slug: string } {\r\n\tconst dashIndex = value.indexOf('-');\r\n\tif (dashIndex === -1) {\r\n\t\treturn { id: value, slug: '' };\r\n\t}\r\n\treturn {\r\n\t\tid: value.substring(0, dashIndex),\r\n\t\tslug: value.substring(dashIndex + 1),\r\n\t};\r\n}\r\n\r\n/**\r\n * Build an event hash href for anchor tags.\r\n * Accepts objects with either `id` or `eventID` (Calendar uses `id`, browse-widgets use `eventID`).\r\n * Returns `#{id}-{slug}`.\r\n */\r\nexport function buildEventHref(event: {\r\n\tid?: number | string;\r\n\teventID?: number | string;\r\n\tslug?: string;\r\n\tname?: string;\r\n}): string {\r\n\tconst id = event.id || event.eventID || 0;\r\n\tconst slug = event.slug || generateSlug(event.name || '');\r\n\treturn `#${id}${slug ? '-' + slug : ''}`;\r\n}\r\n\r\n/**\r\n * Build a series hash href. Returns `#{id}-{slug}` (entity-agnostic).\r\n */\r\nexport function buildSeriesHref(series: {\r\n\tid: number | string;\r\n\tslug?: string;\r\n}): string {\r\n\tconst slug = series.slug || '';\r\n\treturn `#${series.id}${slug ? '-' + slug : ''}`;\r\n}\r\n\r\n/**\r\n * Build a collection hash href. Returns `#{id}-{slug}` (entity-agnostic).\r\n */\r\nexport function buildCollectionHref(collection: {\r\n\tid: number | string;\r\n\tslug?: string;\r\n}): string {\r\n\tconst slug = collection.slug || '';\r\n\treturn `#${collection.id}${slug ? '-' + slug : ''}`;\r\n}\r\n","/**\r\n * WidgetUrlManager -- manages URL state for the calendar widget.\r\n *\r\n * Entity deep links live in the URL HASH as `#{id}-{slug}` (entity-agnostic —\r\n * no e/s/c type prefix). The hash is updated via replaceState so an embedded\r\n * widget never pollutes the host page's history, and reflected back via the\r\n * `hashchange` event (external/back-forward changes). Month navigation stays\r\n * in the `?m=` query param (replaceState). The widget resolves the entity\r\n * type by id from its own loaded data, so the hash carries no type.\r\n */\r\n\r\nimport type { WidgetNavState, WidgetUrlManagerOptions, EntityParam } from './types';\r\nimport { parseEntityParam } from './params';\r\n\r\nexport class WidgetUrlManager {\r\n\tprivate onNavigate: (state: WidgetNavState) => void;\r\n\tprivate handleHashChange: () => void;\r\n\tprivate prevEntityKey: string;\r\n\r\n\tconstructor(options: WidgetUrlManagerOptions) {\r\n\t\tthis.onNavigate = options.onNavigate;\r\n\r\n\t\t// Snapshot the initial entity state to detect real changes\r\n\t\tthis.prevEntityKey = this.getEntityKey();\r\n\r\n\t\tthis.handleHashChange = () => {\r\n\t\t\tconst currentKey = this.getEntityKey();\r\n\t\t\t// Only fire onNavigate when the entity hash actually changed\r\n\t\t\tif (currentKey !== this.prevEntityKey) {\r\n\t\t\t\tthis.prevEntityKey = currentKey;\r\n\t\t\t\tthis.onNavigate(this.readState());\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tif (typeof window !== 'undefined') {\r\n\t\t\twindow.addEventListener('hashchange', this.handleHashChange);\r\n\t\t}\r\n\t}\r\n\r\n\t/** Read current navigation state from the URL (hash entity + ?m= month). */\r\n\treadState(): WidgetNavState {\r\n\t\tif (typeof window === 'undefined') {\r\n\t\t\treturn { entity: null, month: null };\r\n\t\t}\r\n\r\n\t\tconst entity = this.readEntityFromHash();\r\n\t\tconst month = new URLSearchParams(window.location.search).get('m') || null;\r\n\r\n\t\treturn { entity, month };\r\n\t}\r\n\r\n\t/**\r\n\t * Set the entity hash to `#{id}-{slug}` via replaceState. Entity-agnostic:\r\n\t * no type prefix — the widget resolves the type by id.\r\n\t */\r\n\tpushEntity(id: string | number, slug: string): void {\r\n\t\tif (typeof window === 'undefined') return;\r\n\r\n\t\tconst hash = `#${id}${slug ? '-' + slug : ''}`;\r\n\t\tthis.prevEntityKey = `${id}`;\r\n\t\tthis.replaceHash(hash);\r\n\t}\r\n\r\n\t/** Return to listing view (clears the entity hash, keeps query/month). */\r\n\tpushListing(): void {\r\n\t\tif (typeof window === 'undefined') return;\r\n\t\tthis.prevEntityKey = '';\r\n\t\tthis.replaceHash('');\r\n\t}\r\n\r\n\t/** Set the month param via replaceState (no history entry). */\r\n\tsetMonth(yearMonth: string): void {\r\n\t\tif (typeof window === 'undefined') return;\r\n\r\n\t\tconst url = new URL(window.location.href);\r\n\t\turl.searchParams.set('m', yearMonth);\r\n\t\twindow.history.replaceState({ micdrop: true }, '', url.toString());\r\n\t}\r\n\r\n\t/** Remove the hashchange listener. */\r\n\tdestroy(): void {\r\n\t\tif (typeof window !== 'undefined') {\r\n\t\t\twindow.removeEventListener('hashchange', this.handleHashChange);\r\n\t\t}\r\n\t}\r\n\r\n\t/** Parse `#{id}-{slug}` from the location hash. */\r\n\tprivate readEntityFromHash(): EntityParam | null {\r\n\t\tconst raw = (window.location.hash || '').replace(/^#/, '');\r\n\t\tif (!raw) return null;\r\n\t\tconst { id, slug } = parseEntityParam(raw);\r\n\t\t// Guard: only treat a leading-numeric-id hash as an entity deep link, so\r\n\t\t// unrelated host-page anchors (e.g. #contact) don't open a phantom show.\r\n\t\tif (!/^\\d+$/.test(id)) return null;\r\n\t\treturn { id, slug };\r\n\t}\r\n\r\n\t/**\r\n\t * Replace the hash without adding a history entry and without the default\r\n\t * scroll-to-anchor jump. Preserves the existing path + query.\r\n\t */\r\n\tprivate replaceHash(hash: string): void {\r\n\t\tconst url = new URL(window.location.href);\r\n\t\turl.hash = hash;\r\n\t\twindow.history.replaceState({ micdrop: true }, '', url.toString());\r\n\t}\r\n\r\n\t/** The current entity id (or '') — used to detect real hash changes. */\r\n\tprivate getEntityKey(): string {\r\n\t\tif (typeof window === 'undefined') return '';\r\n\t\treturn this.readEntityFromHash()?.id ?? '';\r\n\t}\r\n}\r\n\r\n// Re-export everything from params and types for convenience\r\nexport * from './params';\r\nexport * from './types';\r\n","/**\n * Widget filter engine — the one filter implementation.\n *\n * Semantics (identical in builder preview and live embed):\n *\n * 1. INCLUDE ALLOWLIST first — the union of: directly selected events,\n * events whose `seriesId` matches a selected series, events whose\n * `collectionIds` intersect a selected collection, and any\n * `extraIncludeIds` resolved by the caller. When include filters are\n * set, only allowlisted events survive — and an allowlist that\n * matched NOTHING yields zero events (a selected series with no\n * upcoming shows must not silently show the whole calendar).\n *\n * 2. NARROWING filters intersect on top (venue, dates, day-of-week,\n * title, stage, type, age, price, sales %, performers).\n *\n * 3. AVAILABILITY toggles: `includeSoldOut` / `includeNotYetOnSale`\n * are keep-toggles — `false` excludes those events.\n *\n * 4. SKIP-WHEN-UNANSWERABLE: a data-dependent dimension that no event\n * in the input can answer (e.g. an event-type filter against a feed\n * that doesn't carry event types) is SKIPPED and reported in\n * `skippedDimensions`, instead of strictly excluding everything.\n * Deterministic on both sides: the builder turns the report into a\n * warning; the embed keeps rendering instead of blanking a customer\n * site over a data gap. When at least one event carries the field,\n * the dimension applies strictly (events missing it are excluded).\n *\n * 5. TIMEZONES: weekday and calendar-day comparisons resolve in the\n * EVENT's venue timezone, falling back to the platform default —\n * never the viewer's browser zone, so a show near midnight lands on\n * the same weekday for every visitor. Relative ranges (\"next 7\n * days\") compare instants; weekend and custom ranges are\n * venue-local calendar days.\n */\nimport { DEFAULT_TIMEZONE, getDateInTimezone } from '../datetime/index.js';\n// ── Small helpers ──────────────────────────────────────────────────────\nfunction toNum(v) {\n const n = Number(v);\n return Number.isNaN(n) ? null : n;\n}\nfunction idSet(arr) {\n return new Set(arr.map(String));\n}\nfunction matchesNumericFilter(value, filterValue, operator) {\n if (value == null)\n return false;\n if (operator === 'between' && Array.isArray(filterValue)) {\n return value >= filterValue[0] && value <= filterValue[1];\n }\n const target = toNum(filterValue);\n if (target == null)\n return false;\n switch (operator) {\n case 'equals':\n return value === target;\n case 'greater_than':\n return value > target;\n case 'less_than':\n return value < target;\n default:\n return false;\n }\n}\n// ── Timezone-aware date helpers ────────────────────────────────────────\n/**\n * Venue-local calendar day ('YYYY-MM-DD') of an instant. Falls back to\n * `fallbackTz` when the event's zone is missing/invalid — never the\n * viewer's local day.\n */\nfunction venueLocalDay(iso, tz, fallbackTz) {\n if (!iso || Number.isNaN(new Date(iso).getTime()))\n return null;\n for (const zone of [tz, fallbackTz]) {\n if (!zone)\n continue;\n try {\n return String(getDateInTimezone(iso, zone));\n }\n catch {\n // invalid zone — try the fallback\n }\n }\n return null;\n}\n/** Weekday (0=Sun … 6=Sat) of the venue-local day. -1 = unresolvable. */\nfunction venueLocalWeekday(iso, tz, fallbackTz) {\n const day = venueLocalDay(iso, tz, fallbackTz);\n if (!day)\n return -1;\n const [y, m, d] = day.split('-').map(Number);\n return new Date(y, m - 1, d).getDay();\n}\n/**\n * The CURRENT Fri–Sun window as venue-local days. On Saturday or Sunday\n * that is the weekend in progress (the old builder logic sent Sunday\n * viewers to NEXT weekend and ran Saturday's window through Monday).\n */\nfunction weekendWindow(now, tz, fallbackTz) {\n const todayDay = venueLocalDay(now.toISOString(), tz, fallbackTz);\n if (!todayDay)\n return null;\n const [y, m, d] = todayDay.split('-').map(Number);\n const today = new Date(y, m - 1, d);\n const dow = today.getDay();\n const daysUntilFri = dow === 0 ? -2 : dow === 6 ? -1 : 5 - dow;\n const friday = new Date(today);\n friday.setDate(today.getDate() + daysUntilFri);\n const sunday = new Date(friday);\n sunday.setDate(friday.getDate() + 2);\n const fmt = (x) => `${x.getFullYear()}-${String(x.getMonth() + 1).padStart(2, '0')}-${String(x.getDate()).padStart(2, '0')}`;\n return { from: fmt(friday), to: fmt(sunday) };\n}\n/**\n * Apply a widget's saved `FilterValues` to a list of events.\n *\n * Pass `FilterValues` straight from `parseFilterValues()`. Events are the\n * caller's own type adapted to {@link FilterableEvent}; the result\n * preserves the input objects and order.\n */\nexport function applyWidgetFilters(events, filters, options = {}) {\n const now = options.now ?? new Date();\n const fallbackTz = options.defaultTimeZone ?? DEFAULT_TIMEZONE;\n const skipped = [];\n let result = [...events];\n // ── 1. Include allowlist (union; applied first) ──────────────────────\n const wantsEvents = filters.eventIds.length > 0;\n const wantsSeries = filters.seriesIds.length > 0;\n const wantsCollections = filters.collectionIds.length > 0;\n const extraIds = options.extraIncludeIds ?? null;\n // A collections term is resolvable when the caller supplied memberships:\n // event-side collectionIds, or a pre-resolved extra-ids set. A NON-NULL\n // extra set counts even when EMPTY — empty means \"I resolved the selected\n // collection and it has no upcoming events\", which must render zero\n // events, not fall through to the whole calendar.\n const collectionsResolvable = wantsCollections &&\n (extraIds != null ||\n events.some(e => (e.collectionIds?.length ?? 0) > 0));\n if (wantsCollections && !collectionsResolvable) {\n skipped.push('collectionIds');\n }\n const includeRequested = wantsEvents || wantsSeries || (wantsCollections && collectionsResolvable);\n if (includeRequested) {\n const eventIds = idSet(filters.eventIds);\n const seriesIds = idSet(filters.seriesIds);\n const collectionIds = idSet(filters.collectionIds);\n result = result.filter(e => {\n if (wantsEvents && eventIds.has(String(e.id)))\n return true;\n if (wantsSeries && e.seriesId != null && seriesIds.has(String(e.seriesId)))\n return true;\n if (wantsCollections && collectionsResolvable) {\n if (extraIds?.has(String(e.id)))\n return true;\n if (e.collectionIds?.some(c => collectionIds.has(String(c))))\n return true;\n }\n return false;\n });\n }\n else if (extraIds != null) {\n // Caller-resolved allowlist with no include filters set — honor it,\n // including an EMPTY set (a resolved selection with no matches).\n result = result.filter(e => extraIds.has(String(e.id)));\n }\n // ── 2. Always-answerable narrowing filters ───────────────────────────\n if (filters.venueId.length > 0) {\n const venues = idSet(filters.venueId);\n result = result.filter(e => e.venueId != null && venues.has(String(e.venueId)));\n }\n if (filters.title.trim() !== '') {\n const needle = filters.title.trim().toLowerCase();\n result = result.filter(e => (e.title ?? '').toLowerCase().includes(needle));\n }\n // Custom calendar-day range (venue-local, inclusive) wins over presets.\n if (filters.customDateFrom || filters.customDateTo) {\n result = result.filter(e => {\n const day = venueLocalDay(e.startDateTime ?? '', e.timeZone, fallbackTz);\n if (!day)\n return false;\n return ((!filters.customDateFrom || day >= filters.customDateFrom) &&\n (!filters.customDateTo || day <= filters.customDateTo));\n });\n }\n else if (filters.dateRange === 'this-weekend') {\n result = result.filter(e => {\n const day = venueLocalDay(e.startDateTime ?? '', e.timeZone, fallbackTz);\n if (!day)\n return false;\n const win = weekendWindow(now, e.timeZone, fallbackTz);\n return win != null && day >= win.from && day <= win.to;\n });\n }\n else if (typeof filters.dateRange === 'number') {\n // Relative windows compare instants: from now to now + N×24h, in\n // millisecond math. `setDate()` would advance in the RUNTIME's local\n // zone, so a customer page near a DST boundary would get a 23/25-hour\n // window that differs per viewer.\n const end = new Date(now.getTime() + filters.dateRange * 86400000);\n result = result.filter(e => {\n const d = new Date(e.startDateTime ?? '');\n return !Number.isNaN(d.getTime()) && d >= now && d <= end;\n });\n }\n if (filters.dayOfWeek.length > 0) {\n result = result.filter(e => filters.dayOfWeek.includes(venueLocalWeekday(e.startDateTime ?? '', e.timeZone, fallbackTz)));\n }\n // ── 3. Data-dependent dimensions (skip-when-unanswerable) ────────────\n const dimensions = [\n {\n dimension: 'stageId',\n active: filters.stageId.length > 0,\n answers: e => e.stageId != null && String(e.stageId) !== '',\n passes: e => idSet(filters.stageId).has(String(e.stageId)),\n },\n {\n dimension: 'eventType',\n active: filters.eventType.length > 0,\n answers: e => (e.eventTypes?.length ?? 0) > 0,\n passes: e => e.eventTypes.some(t => filters.eventType.includes(t)),\n },\n {\n dimension: 'ageRestriction',\n active: filters.ageRestriction.length > 0,\n answers: e => e.ageRestriction != null,\n passes: e => filters.ageRestriction.map(Number).includes(e.ageRestriction),\n },\n {\n dimension: 'priceRange',\n active: filters.priceRange !== '',\n answers: e => e.minPrice != null,\n passes: e => matchesNumericFilter(e.minPrice, filters.priceRange, filters.priceRangeOp),\n },\n {\n dimension: 'ticketSalesPercent',\n active: filters.ticketSalesPercent !== '',\n answers: e => e.salesPercent != null,\n passes: e => matchesNumericFilter(e.salesPercent, filters.ticketSalesPercent, filters.ticketSalesPercentOp),\n },\n {\n dimension: 'performerIds',\n active: filters.performerIds.length > 0,\n answers: e => (e.performerIds?.length ?? 0) > 0,\n passes: e => {\n const wanted = idSet(filters.performerIds);\n return e.performerIds.some(p => wanted.has(String(p)));\n },\n },\n {\n dimension: 'includeSoldOut',\n active: filters.includeSoldOut === false,\n answers: e => e.isSoldOut != null,\n passes: e => e.isSoldOut !== true,\n },\n {\n dimension: 'includeNotYetOnSale',\n active: filters.includeNotYetOnSale === false,\n answers: e => e.isNotYetOnSale != null,\n passes: e => e.isNotYetOnSale !== true,\n },\n ];\n for (const spec of dimensions) {\n if (!spec.active)\n continue;\n // Capability check runs against the ORIGINAL input: \"can this feed\n // answer the dimension at all\", not \"did earlier filters leave any\".\n if (!events.some(spec.answers)) {\n skipped.push(spec.dimension);\n continue;\n }\n result = result.filter(e => spec.answers(e) && spec.passes(e));\n }\n return { events: result, skippedDimensions: skipped };\n}\n/** True when any filter deviates from \"show every upcoming event\". */\nexport function hasActiveWidgetFilters(filters) {\n return (filters.dateRange !== null ||\n filters.customDateFrom !== '' ||\n filters.customDateTo !== '' ||\n filters.dayOfWeek.length > 0 ||\n filters.title.trim() !== '' ||\n filters.eventIds.length > 0 ||\n filters.seriesIds.length > 0 ||\n filters.collectionIds.length > 0 ||\n filters.venueId.length > 0 ||\n filters.stageId.length > 0 ||\n filters.eventType.length > 0 ||\n filters.ageRestriction.length > 0 ||\n filters.priceRange !== '' ||\n filters.ticketSalesPercent !== '' ||\n filters.includeSoldOut === false ||\n filters.includeNotYetOnSale === false ||\n filters.performerIds.length > 0);\n}\n","const OPERATORS = new Set([\n 'equals',\n 'greater_than',\n 'less_than',\n 'between',\n]);\nconst YMD = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst NUMERIC = /^-?\\d+(\\.\\d+)?$/;\nfunction isIdLike(v) {\n return typeof v === 'string' || (typeof v === 'number' && !Number.isNaN(v));\n}\nfunction idArray(v) {\n return Array.isArray(v) ? v.filter(isIdLike) : [];\n}\nfunction weekdayArray(v) {\n return Array.isArray(v)\n ? v.filter((d) => typeof d === 'number' && Number.isInteger(d) && d >= 0 && d <= 6)\n : [];\n}\nfunction intArray(v) {\n return Array.isArray(v)\n ? v.filter((d) => typeof d === 'number' && Number.isInteger(d))\n : [];\n}\nfunction ymd(v) {\n return typeof v === 'string' && YMD.test(v) ? v : '';\n}\nfunction operator(v, fallback) {\n return typeof v === 'string' && OPERATORS.has(v)\n ? v\n : fallback;\n}\n/** number | [min, max] | '' — numeric strings coerce (builder inputs stored strings historically). */\nfunction numericFilter(v) {\n if (typeof v === 'number' && !Number.isNaN(v))\n return v;\n if (typeof v === 'string' && NUMERIC.test(v))\n return Number(v);\n if (Array.isArray(v) &&\n v.length === 2 &&\n typeof v[0] === 'number' &&\n typeof v[1] === 'number' &&\n !Number.isNaN(v[0]) &&\n !Number.isNaN(v[1])) {\n return [v[0], v[1]];\n }\n return '';\n}\nfunction dateRange(v) {\n if (v === 'this-weekend')\n return v;\n if (typeof v === 'number' && !Number.isNaN(v))\n return v;\n if (typeof v === 'string' && NUMERIC.test(v))\n return Number(v);\n return null;\n}\nfunction bool(v, fallback) {\n return typeof v === 'boolean' ? v : fallback;\n}\n/**\n * Canonical defaults — a widget with no filters shows every upcoming event.\n *\n * Availability toggles default to TRUE: a public calendar shows sold-out\n * shows (badged) and announced-but-not-on-sale shows by default — hiding\n * them silently shrank \"what's on\" pages. Operators can still untick\n * either to build a \"only buyable right now\" widget.\n */\nfunction freshDefaults() {\n return {\n dateRange: null,\n customDateFrom: '',\n customDateTo: '',\n dayOfWeek: [],\n title: '',\n eventIds: [],\n seriesIds: [],\n collectionIds: [],\n venueId: [],\n stageId: [],\n eventType: [],\n ageRestriction: [],\n priceRange: '',\n priceRangeOp: 'less_than',\n ticketSalesPercent: '',\n ticketSalesPercentOp: 'less_than',\n includeSoldOut: true,\n includeNotYetOnSale: true,\n performerIds: [],\n };\n}\n// DEEP-frozen (arrays too): this is a shared template, and a consumer\n// mutating one of its arrays would contaminate every later parse. Use\n// `parseFilterValues({})` (or spread per-field) for a mutable copy —\n// the parser always returns freshly-constructed arrays.\nexport const DEFAULT_FILTER_VALUES = (() => {\n const d = freshDefaults();\n for (const v of Object.values(d)) {\n if (Array.isArray(v))\n Object.freeze(v);\n }\n return Object.freeze(d);\n})();\n/**\n * Parse an unknown payload into a complete, safe `FilterValues`.\n * Unknown keys are dropped, missing/invalid fields take their defaults,\n * `null`/non-object input returns pure defaults. Never throws.\n */\nexport function parseFilterValues(raw) {\n if (raw == null || typeof raw !== 'object' || Array.isArray(raw)) {\n // Freshly-constructed (incl. arrays) — never hand out references to\n // the frozen shared template.\n return freshDefaults();\n }\n const r = raw;\n return {\n dateRange: dateRange(r.dateRange),\n customDateFrom: ymd(r.customDateFrom),\n customDateTo: ymd(r.customDateTo),\n dayOfWeek: weekdayArray(r.dayOfWeek),\n title: typeof r.title === 'string' ? r.title : '',\n eventIds: idArray(r.eventIds),\n seriesIds: idArray(r.seriesIds),\n collectionIds: idArray(r.collectionIds),\n venueId: idArray(r.venueId),\n stageId: idArray(r.stageId),\n eventType: intArray(r.eventType),\n ageRestriction: idArray(r.ageRestriction),\n priceRange: numericFilter(r.priceRange),\n priceRangeOp: operator(r.priceRangeOp, 'less_than'),\n ticketSalesPercent: numericFilter(r.ticketSalesPercent),\n ticketSalesPercentOp: operator(r.ticketSalesPercentOp, 'less_than'),\n includeSoldOut: bool(r.includeSoldOut, true),\n includeNotYetOnSale: bool(r.includeNotYetOnSale, true),\n performerIds: idArray(r.performerIds),\n };\n}\n","/**\n * Widget filter application for embedded <micdrop-calendar widget-id=\"…\">.\n *\n * THIN ADAPTER over the canonical engine in\n * `@getmicdrop/svelte-components/widget-filters` — the SAME engine the\n * micdrop-frontend builder uses for its preview, so a widget can never\n * preview one subset and ship another. This module only (a) normalizes\n * the raw saved config via `parseFilterValues` and (b) maps the\n * calendar's transformed event shape onto the engine's\n * `FilterableEvent` view. All filter SEMANTICS live in the engine; do\n * not add filtering logic here.\n *\n * The public month feeds carry every saved-filter dimension except\n * not-yet-on-sale (stageId, eventCategoryTypes, ageRestriction,\n * publicPerformers, collectionIds rode in on the 2026-06 backend\n * change). A dimension the feed still can't answer is skipped by the\n * engine per its skip-when-unanswerable contract and reported via a\n * debug log — the embed keeps rendering instead of blanking a customer\n * site over a data gap.\n */\n\nimport {\n applyWidgetFilters,\n parseFilterValues,\n} from '@getmicdrop/svelte-components/widget-filters';\n\nfunction num(v) {\n const n = Number(v);\n return Number.isNaN(n) ? null : n;\n}\n\n/** Percent sold (0–100) from whichever seat-count pair the shape carries. */\nfunction salesPercent(e) {\n const total = num(e.ticketsTotal);\n const remaining = num(e.ticketsRemaining);\n if (total != null && total > 0 && remaining != null) {\n return ((total - remaining) / total) * 100;\n }\n const sold = num(e.ticketsSold);\n const avail = num(e.ticketsAvailable);\n if (sold == null) return null;\n const t = sold + (avail ?? 0);\n if (t <= 0) return null;\n return (sold / t) * 100;\n}\n\n/** Sold-out across the shapes that reach the calendar (browse/detail/legacy). */\nfunction isSoldOut(e) {\n if (typeof e.isSoldOut === 'boolean') return e.isSoldOut;\n if (e.ctaState && e.ctaState.reason === 'sold_out') return true;\n if (typeof e.ticketsAvailable === 'number') return e.ticketsAvailable <= 0;\n if (/sold[\\s_-]?out/i.test(String(e.status || ''))) return true;\n return null; // unanswerable — let the engine skip the dimension\n}\n\n/** Numeric id array → engine shape; null when absent/empty (= unanswerable). */\nfunction idList(arr) {\n if (!Array.isArray(arr) || arr.length === 0) return null;\n return arr;\n}\n\n/** Map a transformed calendar event onto the engine's FilterableEvent view. */\nfunction asFilterable(e) {\n return {\n id: e.id,\n title: e.name || e.title || '',\n startDateTime: e.startDateTime || e.date || e.start_date_time || null,\n // Browse transformer emits PascalCase `timeZone`; legacy paths lowercase.\n timeZone: e.timeZone || e.timezone || null,\n venueId: e.venueId ?? e.venueID ?? null,\n seriesId: e.eventSeriesId ?? null,\n // Backend serializes \"no stage\" as 0 — fold it to null (unanswerable)\n // so a stage-less feed skips the dimension instead of blanking.\n stageId: e.stageId || null,\n eventTypes: idList(e.eventCategoryTypes),\n // ageRestriction 0 is a real value (\"All ages\") — only null/undefined\n // mean the feed can't answer.\n ageRestriction: e.ageRestriction ?? null,\n performerIds: idList(\n (e.publicPerformers || []).map(p => p?.id).filter(id => id != null)\n ),\n collectionIds: idList(e.collectionIds),\n minPrice: num(e.minPrice ?? e.price),\n salesPercent: salesPercent(e),\n isSoldOut: isSoldOut(e),\n source: e,\n };\n}\n\n/**\n * Filter transformed calendar events by a saved widget FilterValues blob.\n * Returns the input unchanged when `filters` is missing/empty.\n * @param {any[]} events transformed calendar events\n * @param {any} filters saved FilterValues (raw, untrusted)\n * @returns {any[]}\n */\nexport function filterWidgetEvents(events, filters) {\n if (!Array.isArray(events) || !filters || typeof filters !== 'object') {\n return events;\n }\n // No feed yet (initial render, month still loading) — nothing to filter and\n // nothing to learn: the engine would report every active data-dependent\n // dimension as \"skipped\", which reads as \"feed lacks the fields\" noise on\n // every embed boot. Real gaps still log once events arrive.\n if (events.length === 0) {\n return events;\n }\n const parsed = parseFilterValues(filters);\n const { events: kept, skippedDimensions } = applyWidgetFilters(\n events.map(asFilterable),\n parsed\n );\n if (skippedDimensions.length > 0) {\n // eslint-disable-next-line no-console\n console.debug?.(\n '[micdrop-calendar] widget filters skipped (feed lacks the fields):',\n skippedDimensions.join(', ')\n );\n }\n return kept.map(w => w.source);\n}\n","// Embed bridge — postMessage + auto-height between an iframe-embedded calendar\r\n// and its host page.\r\n//\r\n// Two embed shapes exist (see DECISIONS \"No scrollbar-in-a-scrollbar\"):\r\n// • Script embed (light DOM): the calendar is part of the host document, so\r\n// the host scrolls as one document — there is NO iframe and this bridge is\r\n// inert (window.parent === window).\r\n// • iframe embed (Wix / the future /embed/calendar route): the frame must be\r\n// continuously sized to the full content height so content never overflows\r\n// it (no inner scrollbar). The widget measures itself and posts its height;\r\n// the host loader sets the iframe height (iframe-resizer pattern).\r\n//\r\n// Protocol (matches micdrop-frontend deep-linking.md Part 3):\r\n// widget → host: { type:'MICDROP_NAVIGATION', payload:{ id, slug, title } }\r\n// { type:'MICDROP_RESIZE', payload:{ height } }\r\n// host → widget: { type:'MICDROP_NAVIGATE', payload:{ id, slug } }\r\n// `id: null` on MICDROP_NAVIGATION signals \"back to the listing\" (host clears\r\n// the hash). `id` falsy on an inbound MICDROP_NAVIGATE means \"go back\".\r\n\r\nimport { createLogger } from '@getmicdrop/svelte-components';\r\n\r\nconst logger = createLogger('embed-bridge');\r\n\r\nexport const MICDROP_MESSAGE_SOURCE = 'micdrop-calendar';\r\n\r\n/**\r\n * True only for a proper absolute origin with no path/query/hash, e.g.\r\n * 'https://venue.example' or 'http://localhost:3000'. Rejects '*', falsy\r\n * values, bare hostnames ('venue.example'), and anything with a trailing\r\n * path — exactly the inputs that would make `postMessage(payload, origin)`\r\n * throw a SyntaxError. (`new URL('venue.example')` throws; a URL with a path\r\n * has `.origin` shorter than the input, so the strict-equality check rejects\r\n * it.)\r\n *\r\n * @param {unknown} origin\r\n * @returns {boolean}\r\n */\r\nfunction isConcreteOrigin(origin) {\r\n if (!origin || typeof origin !== 'string' || origin === '*') return false;\r\n try {\r\n return new URL(origin).origin === origin;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/** True when running inside a cross-document iframe (so postMessage matters). */\r\nexport function isEmbeddedInIframe() {\r\n try {\r\n return (\r\n typeof window !== 'undefined' && window.parent && window.parent !== window\r\n );\r\n } catch {\r\n // Cross-origin access to window.parent can throw — that itself means we're\r\n // framed by a different origin.\r\n return true;\r\n }\r\n}\r\n\r\n/** Post the current content height to the host (no-op unless iframe-embedded). */\r\nexport function postResize(height) {\r\n if (!isEmbeddedInIframe()) return;\r\n window.parent.postMessage(\r\n { type: 'MICDROP_RESIZE', source: MICDROP_MESSAGE_SOURCE, payload: { height } },\r\n '*'\r\n );\r\n}\r\n\r\n/**\r\n * Post a navigation event so the host can mirror it in its URL hash. Pass\r\n * `{ id: null }` when returning to the listing.\r\n */\r\nexport function postNavigation({ id = null, slug = '', title = '' } = {}) {\r\n if (!isEmbeddedInIframe()) return;\r\n window.parent.postMessage(\r\n {\r\n type: 'MICDROP_NAVIGATION',\r\n source: MICDROP_MESSAGE_SOURCE,\r\n payload: { id: id ?? null, slug: slug || '', title: title || '' },\r\n },\r\n '*'\r\n );\r\n}\r\n\r\n/**\r\n * Post the opt-in 'checkout-complete' message to the host page when an order\r\n * finishes. Unlike postNavigation/postResize (public data, '*' by design),\r\n * this REQUIRES a concrete targetOrigin — order-completion data must never be\r\n * broadcast. Refuses '*', falsy, and non-absolute-origin strings (a bare\r\n * hostname like 'venue.example' would make postMessage throw a SyntaxError);\r\n * on a bad origin it logs one warning and no-ops rather than throwing, so a\r\n * misconfigured embed can never crash the buyer's confirmation screen. The\r\n * postMessage call itself is also guarded so a hostile/exotic origin can't\r\n * bubble an exception into the caller's onMount.\r\n *\r\n * Works in both embed shapes: iframe (window.parent) and script-embed light\r\n * DOM (window — a same-page host listener receives it).\r\n *\r\n * @param {{ orderId: string, eventId: (string|number|null) }} payload\r\n * @param {string} targetOrigin - concrete origin, e.g. 'https://venue.example'\r\n * @returns {boolean} true if the message was posted\r\n */\r\nexport function postCheckoutComplete(payload, targetOrigin) {\r\n if (typeof window === 'undefined') return false;\r\n if (!isConcreteOrigin(targetOrigin)) {\r\n logger.warn(\r\n 'postMessageOnSuccess is enabled but postMessageTargetOrigin is not a concrete origin — checkout-complete not sent'\r\n );\r\n return false;\r\n }\r\n const target = isEmbeddedInIframe() ? window.parent : window;\r\n try {\r\n target.postMessage(\r\n {\r\n type: 'checkout-complete',\r\n source: MICDROP_MESSAGE_SOURCE,\r\n payload: { orderId: payload?.orderId ?? '', eventId: payload?.eventId ?? null },\r\n },\r\n targetOrigin\r\n );\r\n return true;\r\n } catch (err) {\r\n logger.warn('checkout-complete postMessage failed; not sent:', err);\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Observe an element's height and call `onHeight(px)` whenever it changes.\r\n * Re-measures on image load (images settle after first layout). Returns a\r\n * cleanup function. Safe to call when not embedded — it simply won't be wired\r\n * by the caller in that case.\r\n *\r\n * @param {HTMLElement} el\r\n * @param {(height: number) => void} onHeight\r\n * @returns {() => void}\r\n */\r\nexport function observeHeight(el, onHeight, measureHeight) {\r\n if (typeof window === 'undefined' || !el) return () => {};\r\n\r\n // Default measures the observed element's own box. Callers in iframe mode\r\n // pass a measure that returns the full document height (so body margin/\r\n // padding around the widget root is included and the host frame can't end\r\n // up shorter than its own document → no inner scrollbar).\r\n const measureFn =\r\n typeof measureHeight === 'function'\r\n ? measureHeight\r\n : () => Math.ceil(el.getBoundingClientRect().height);\r\n\r\n let last = 0;\r\n const measure = () => {\r\n const h = measureFn();\r\n if (h && h !== last) {\r\n last = h;\r\n onHeight(h);\r\n }\r\n };\r\n\r\n let ro = null;\r\n if (typeof ResizeObserver !== 'undefined') {\r\n ro = new ResizeObserver(measure);\r\n ro.observe(el);\r\n }\r\n\r\n // Images load after layout and change height — capture their load events.\r\n const onLoad = e => {\r\n if (e.target && e.target.tagName === 'IMG') measure();\r\n };\r\n el.addEventListener('load', onLoad, true);\r\n\r\n // Initial measure (covers the case where the element is already laid out).\r\n measure();\r\n\r\n return () => {\r\n if (ro) ro.disconnect();\r\n el.removeEventListener('load', onLoad, true);\r\n };\r\n}\r\n\r\n/**\r\n * Listen for host → widget navigation commands. The handler receives the\r\n * message payload (`{ id, slug }`). Returns a cleanup function.\r\n *\r\n * @param {(payload: { id?: string|number|null, slug?: string }) => void} handler\r\n * @returns {() => void}\r\n */\r\nexport function listenForHostNavigation(handler) {\r\n if (typeof window === 'undefined') return () => {};\r\n const onMessage = e => {\r\n // Only accept commands from our host frame. A sibling iframe / ad / script\r\n // that holds a reference to our contentWindow would post with its own\r\n // window as e.source (!== window.parent) — reject those so they can't drive\r\n // arbitrary navigation. (A null source, e.g. synthetic events, is allowed.)\r\n if (e?.source && e.source !== window.parent) return;\r\n const data = e?.data;\r\n if (!data || data.type !== 'MICDROP_NAVIGATE') return;\r\n handler(data.payload || {});\r\n };\r\n window.addEventListener('message', onMessage);\r\n return () => window.removeEventListener('message', onMessage);\r\n}\r\n","/**\r\n * Browse Widgets — Utilities\r\n * Production utilities for browse widget data processing.\r\n */\r\n\r\nimport type { BrowseEvent, GroupedEvent } from './types';\r\n\r\n/**\r\n * Group events by series + date. Same-day events with the same eventSeriesId\r\n * are bundled into a single GroupedEvent with multiple instances.\r\n * Non-series events appear as solo entries.\r\n *\r\n * Result is sorted chronologically by first instance.\r\n */\r\nexport function groupEventsBySeries(events: BrowseEvent[]): GroupedEvent[] {\r\n\tconst seriesDateMap = new Map<string, BrowseEvent[]>();\r\n\tconst result: GroupedEvent[] = [];\r\n\r\n\tfor (const event of events) {\r\n\t\tconst seriesId = event.eventSeriesId;\r\n\t\tif (seriesId && seriesId > 0) {\r\n\t\t\t// Key by seriesId + date so same series on different dates are separate groups\r\n\t\t\tconst key = `${seriesId}:${event.date}`;\r\n\t\t\tconst group = seriesDateMap.get(key) || [];\r\n\t\t\tgroup.push(event);\r\n\t\t\tseriesDateMap.set(key, group);\r\n\t\t} else {\r\n\t\t\tresult.push({ event, instances: [event], isSeries: false });\r\n\t\t}\r\n\t}\r\n\r\n\tfor (const instances of seriesDateMap.values()) {\r\n\t\tinstances.sort((a, b) => a.startDateTime.localeCompare(b.startDateTime));\r\n\t\tresult.push({\r\n\t\t\tevent: instances[0],\r\n\t\t\tinstances,\r\n\t\t\tisSeries: instances.length > 1\r\n\t\t});\r\n\t}\r\n\r\n\t// Sort all by first instance start time\r\n\tresult.sort((a, b) => a.instances[0].startDateTime.localeCompare(b.instances[0].startDateTime));\r\n\treturn result;\r\n}\r\n","/**\r\n * Browse Widgets — Defaults & Constants\r\n * Shared configuration values across all variants.\r\n */\r\n\r\nimport type { WidgetType } from './types';\r\n\r\n// === Widget Types ===\r\n\r\nexport const WIDGET_TYPES = [\r\n\t'calendar',\r\n\t'list',\r\n\t'gallery',\r\n\t'carousel',\r\n\t'featured'\r\n] as const satisfies readonly WidgetType[];\r\n\r\nexport const WIDGET_LABELS: Record<WidgetType, string> = {\r\n\tcalendar: 'Calendar',\r\n\tlist: 'List',\r\n\tgallery: 'Gallery',\r\n\tcarousel: 'Carousel',\r\n\tfeatured: 'Featured'\r\n};\r\n\r\n// === Skeleton Timing ===\r\n\r\n/** Delay before showing skeleton (ms) — prevents flash on fast loads */\r\nexport const SKELETON_DELAY_MS = 250;\r\n\r\n// === Scarcity Thresholds ===\r\n\r\n/** Show \"Selling fast\" badge when remaining tickets are at or below this percentage (i.e. 80%+ sold) */\r\nexport const SCARCITY_LOW_PCT = 20;\r\n\r\n/** Never show scarcity badge below this absolute floor */\r\nexport const SCARCITY_ABSOLUTE_FLOOR = 5;\r\n\r\n/** Never show scarcity badge above this absolute cap (even if % is low) */\r\nexport const SCARCITY_ABSOLUTE_CAP = 30;\r\n\r\n// === Touch / Gesture ===\r\n\r\n/** Minimum touch target size (px) — Apple HIG */\r\nexport const MIN_TOUCH_TARGET = 56;\r\n\r\n/** Haptic durations (ms) */\r\nexport const HAPTIC_LIGHT = 10;\r\nexport const HAPTIC_MEDIUM = 20;\r\n\r\n// === Swipe Physics ===\r\n\r\nexport const SWIPE_THRESHOLD = 50; // px\r\nexport const SWIPE_VELOCITY_THRESHOLD = 0.3; // px/ms\r\nexport const MOMENTUM_FRICTION = 0.92;\r\n\r\n// === Calendar ===\r\n\r\nexport const DAYS_OF_WEEK = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] as const;\r\n\r\n// === Animation Durations ===\r\n\r\nexport const DURATION_FAST = 150; // ms — UI controls\r\nexport const DURATION_DEFAULT = 300; // ms — general transitions\r\nexport const DURATION_SLOW = 500; // ms — page-level transitions\r\n\r\n// === Image ===\r\n\r\nexport const PLACEHOLDER_IMAGE =\r\n\t'https://images.unsplash.com/photo-1514525253161-7a46d19cd819?w=800&h=600&fit=crop';\r\n\r\n// === Status Badge Priority ===\r\n\r\nexport const STATUS_PRIORITY = [\r\n\t'cancelled',\r\n\t'past',\r\n\t'sold_out',\r\n\t'sales_ended',\r\n\t'coming_soon',\r\n\t'scarcity'\r\n] as const;\r\n","import { formatDateForAPI } from '@getmicdrop/svelte-components/utils/formatters';\r\n/**\r\n * Browse Widgets — Canonical Status Utilities\r\n *\r\n * Single source of truth for status computation, dimming, badge variants,\r\n * and event filtering. Merges the best of browse-status.js, ScarcityBadge,\r\n * and all variant-specific utils into one file.\r\n *\r\n * All variants should import from here instead of maintaining local copies.\r\n */\r\n\r\nimport type { BrowseEvent, BrowseStatus, BrowseStatusType } from './types';\r\nimport {\r\n\tSCARCITY_LOW_PCT,\r\n\tSTATUS_PRIORITY\r\n} from './defaults';\r\n\r\n// === Status Computation ===\r\n\r\n/**\r\n * Normalize an event status string for comparison.\r\n * Handles variations like \"sold_out\", \"soldout\", \"sold-out\", \"Sold Out\", etc.\r\n */\r\nfunction normalizeStatus(status: string): string {\r\n\treturn status.toLowerCase().replace(/[\\s_-]+/g, '');\r\n}\r\n\r\n/**\r\n * Check if an event qualifies for a \"Selling fast\" badge.\r\n *\r\n * Shows when 80-99% of tickets are sold (i.e. ≤20% remaining).\r\n *\r\n * Conditions (all must be true):\r\n * - Event is on_sale\r\n * - Has ticket data (remaining + total)\r\n * - Not a free event (total > 0)\r\n * - Remaining > 0 (not sold out — sold out has its own badge)\r\n * - Percentage remaining <= SCARCITY_LOW_PCT (20%)\r\n */\r\nfunction isScarcityEvent(event: BrowseEvent): boolean {\r\n\tconst normalized = normalizeStatus(event.status);\r\n\tif (normalized !== 'onsale') return false;\r\n\tif (event.ticketsRemaining == null || event.ticketsTotal == null) return false;\r\n\tif (event.ticketsTotal === 0) return false; // free event\r\n\tif (event.ticketsRemaining <= 0) return false;\r\n\r\n\tconst pctRemaining = (event.ticketsRemaining / event.ticketsTotal) * 100;\r\n\treturn pctRemaining <= SCARCITY_LOW_PCT;\r\n}\r\n\r\n/**\r\n * Derive the single highest-priority browse-level status for an event.\r\n *\r\n * Priority: cancelled > past > sold_out > sales_ended > coming_soon > scarcity\r\n *\r\n * Features merged from all sources:\r\n * - Status normalization (handles \"sold_out\", \"soldout\", \"sold-out\", etc.)\r\n * - Past event detection via endDateTime (from browse-status.js)\r\n * - Ticket-data sold-out detection: remaining=0 with known total (from browse-status.js)\r\n * - Scarcity at 80%+ sold threshold (\"Selling fast\")\r\n * - Free event suppression for scarcity\r\n */\r\nexport function getBrowseStatus(event: BrowseEvent, labels?: Record<string, string>): BrowseStatus | null {\r\n\t// Guard a fully-missing event AND a missing `status` field (the embed badge +\r\n\t// hide-cancelled filter call this over raw API events) — otherwise the\r\n\t// .toLowerCase()/.startDateTime/.ticketsRemaining accesses below would throw\r\n\t// and blank the grid cell.\r\n\tif (!event) return null;\r\n\tconst normalized = normalizeStatus(event.status ?? '');\r\n\r\n\tfor (const status of STATUS_PRIORITY) {\r\n\t\tswitch (status) {\r\n\t\t\tcase 'cancelled':\r\n\t\t\t\tif (normalized === 'cancelled' || normalized === 'canceled') {\r\n\t\t\t\t\treturn { text: labels?.statusCancelled || 'Cancelled', type: 'cancelled' };\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'past':\r\n\t\t\t\tif (event.startDateTime) {\r\n\t\t\t\t\tconst eventEnd = event.endDateTime || event.startDateTime;\r\n\t\t\t\t\tif (new Date(eventEnd) < new Date()) {\r\n\t\t\t\t\t\treturn { text: labels?.statusPastEvent || 'Past event', type: 'past' };\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'sold_out':\r\n\t\t\t\tif (normalized === 'soldout') {\r\n\t\t\t\t\treturn { text: labels?.statusSoldOut || 'Sold out', type: 'sold_out' };\r\n\t\t\t\t}\r\n\t\t\t\t// Detect sold-out from ticket data even when status says on_sale\r\n\t\t\t\tif (\r\n\t\t\t\t\tevent.ticketsRemaining != null &&\r\n\t\t\t\t\tevent.ticketsRemaining <= 0 &&\r\n\t\t\t\t\tevent.ticketsTotal != null &&\r\n\t\t\t\t\tevent.ticketsTotal > 0\r\n\t\t\t\t) {\r\n\t\t\t\t\treturn { text: labels?.statusSoldOut || 'Sold out', type: 'sold_out' };\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'sales_ended':\r\n\t\t\t\tif (normalized === 'salesended') {\r\n\t\t\t\t\treturn { text: labels?.statusSalesEnded || 'Sales ended', type: 'sales_ended' };\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'coming_soon':\r\n\t\t\t\tif (normalized === 'comingsoon') {\r\n\t\t\t\t\treturn { text: labels?.statusComingSoon || 'Coming soon', type: 'coming_soon' };\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'scarcity':\r\n\t\t\t\tif (isScarcityEvent(event)) {\r\n\t\t\t\t\treturn { text: labels?.statusSellingFast || 'Selling fast', type: 'scarcity' };\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\treturn null;\r\n}\r\n\r\n// === Availability & Dimming ===\r\n\r\n/**\r\n * Check if an event is unavailable (cannot be purchased).\r\n * Used for disabling click actions and general unavailability indicators.\r\n */\r\nexport function isEventUnavailable(browseStatus: BrowseStatus | null): boolean {\r\n\tif (!browseStatus) return false;\r\n\tconst t = browseStatus.type;\r\n\treturn t === 'cancelled' || t === 'past' || t === 'sold_out' || t === 'sales_ended';\r\n}\r\n\r\n/**\r\n * Check if an event should be visually dimmed (reduced opacity, grayscale).\r\n *\r\n * Only sold_out and cancelled are dimmed — NOT sales_ended.\r\n * Sales ended events may still have their status change back, so they stay\r\n * visually prominent. Past events are filtered out rather than dimmed.\r\n */\r\nexport function isEventDimmed(event: BrowseEvent): boolean {\r\n\tconst status = getBrowseStatus(event);\r\n\tif (!status) return false;\r\n\treturn status.type === 'sold_out' || status.type === 'cancelled';\r\n}\r\n\r\n/**\r\n * Check if a pre-computed browse status should trigger visual dimming.\r\n * Use this when you already have the BrowseStatus and don't want to recompute.\r\n */\r\nexport function isDimmedStatus(status: BrowseStatus | null): boolean {\r\n\tif (!status) return false;\r\n\treturn status.type === 'sold_out' || status.type === 'cancelled';\r\n}\r\n\r\n// === Group-Level Status ===\r\n\r\n/**\r\n * Compute one badge for a group of events (e.g., a series with multiple showtimes).\r\n * Returns the highest-priority status found across all events.\r\n *\r\n * NOTE: this aggregator returns the most-alarming status across ALL instances,\r\n * which is misleading for the browse-card use case (a 5-show series with 1\r\n * sold-out instance would render as \"Sold out\" even though 4 are still on\r\n * sale). Prefer `getSeriesBrowseStatus` for browse cards. Kept here for any\r\n * consumer that legitimately wants \"is there ANY cancelled instance\" type\r\n * logic.\r\n */\r\nexport function getGroupStatus(events: BrowseEvent[], labels?: Record<string, string>): BrowseStatus | null {\r\n\tconst found = new Set<BrowseStatusType>();\r\n\r\n\tfor (const e of events) {\r\n\t\tconst status = getBrowseStatus(e, labels);\r\n\t\tif (status) found.add(status.type);\r\n\t}\r\n\r\n\tfor (const t of STATUS_PRIORITY) {\r\n\t\tif (found.has(t)) {\r\n\t\t\treturn { type: t, text: statusText(t, labels) };\r\n\t\t}\r\n\t}\r\n\r\n\treturn null;\r\n}\r\n\r\n/**\r\n * Compute the badge for a multi-instance series shown on a browse card.\r\n *\r\n * Rule (per Peet 2026-05-25 + Eventbrite/Ticketmaster patterns):\r\n * - \"Cancelled\" only if EVERY instance is cancelled (whole series cancelled)\r\n * - \"Sold out\" only if EVERY instance is sold out (no shows available)\r\n * - \"Selling fast\" only if EVERY non-sold-out instance is scarcity (the\r\n * remaining stock is uniformly going fast)\r\n * - Otherwise null — the card has no badge; the user drills in to see\r\n * per-instance availability\r\n *\r\n * Why so conservative: a 5-show series with 1 sold-out instance is NOT\r\n * \"Sold out\" from the user's perspective. They can still get tickets to 4\r\n * other showtimes. Showing \"Sold out\" on the series card would actively\r\n * deceive. Same logic for scarcity — if only 1 of 5 is selling fast, the\r\n * series-level badge would overstate urgency.\r\n *\r\n * For single-instance events (length 1), this matches getBrowseStatus()'s\r\n * output exactly.\r\n */\r\nexport function getSeriesBrowseStatus(\r\n\tinstances: BrowseEvent[],\r\n\tlabels?: Record<string, string>\r\n): BrowseStatus | null {\r\n\tif (instances.length === 0) return null;\r\n\tif (instances.length === 1) return getBrowseStatus(instances[0], labels);\r\n\r\n\tconst statuses = instances.map((e) => getBrowseStatus(e, labels));\r\n\r\n\tif (statuses.every((s) => s?.type === 'cancelled')) {\r\n\t\treturn { type: 'cancelled', text: statusText('cancelled', labels) };\r\n\t}\r\n\r\n\tif (statuses.every((s) => s?.type === 'sold_out')) {\r\n\t\treturn { type: 'sold_out', text: statusText('sold_out', labels) };\r\n\t}\r\n\r\n\t// \"Selling fast\" requires EVERY non-sold-out instance to be scarcity.\r\n\t// Skip cancelled instances when evaluating (they're not bookable).\r\n\tconst bookable = statuses.filter((s) => s?.type !== 'sold_out' && s?.type !== 'cancelled');\r\n\tif (bookable.length > 0 && bookable.every((s) => s?.type === 'scarcity')) {\r\n\t\treturn { type: 'scarcity', text: statusText('scarcity', labels) };\r\n\t}\r\n\r\n\treturn null;\r\n}\r\n\r\n/**\r\n * Map a BrowseStatusType to its display text.\r\n */\r\nexport function statusText(type: BrowseStatusType, labels?: Record<string, string>): string {\r\n\tswitch (type) {\r\n\t\tcase 'cancelled':\r\n\t\t\treturn labels?.statusCancelled || 'Cancelled';\r\n\t\tcase 'past':\r\n\t\t\treturn labels?.statusPastEvent || 'Past event';\r\n\t\tcase 'sold_out':\r\n\t\t\treturn labels?.statusSoldOut || 'Sold out';\r\n\t\tcase 'sales_ended':\r\n\t\t\treturn labels?.statusSalesEnded || 'Sales ended';\r\n\t\tcase 'coming_soon':\r\n\t\t\treturn labels?.statusComingSoon || 'Coming soon';\r\n\t\tcase 'scarcity':\r\n\t\t\treturn labels?.statusSellingFast || 'Selling fast';\r\n\t}\r\n}\r\n\r\n// === Badge Variant ===\r\n\r\n/**\r\n * Badge variant union from @getmicdrop/svelte-components.\r\n */\r\ntype BadgeVariant =\r\n\t| 'error'\r\n\t| 'neutral'\r\n\t| 'info'\r\n\t| 'warning'\r\n\t| 'success'\r\n\t| 'danger'\r\n\t| 'red'\r\n\t| 'gray'\r\n\t| 'blue'\r\n\t| 'orange'\r\n\t| 'purple'\r\n\t| 'green'\r\n\t| 'yellow'\r\n\t| 'pink'\r\n\t| 'indigo'\r\n\t| 'cyan'\r\n\t| 'notification';\r\n\r\n/**\r\n * Map a browse status type to a Badge component variant.\r\n *\r\n * Canonical mapping consumed by ListView, GalleryCard, Calendar embed via\r\n * <Badge variant={badgeVariant(type)} /> from @getmicdrop/svelte-components.\r\n *\r\n * - cancelled → 'neutral' (gray — not happening, no action; matches the\r\n * ticket-level \"Sales ended\" badge)\r\n * - sold_out → 'error' (red, attention-grabbing — matches existing UX)\r\n * - sales_ended → 'neutral' (gray, no action possible)\r\n * - coming_soon → 'info' (blue, informational)\r\n * - scarcity → 'warning' (amber, urgency)\r\n * - past → 'neutral' (gray)\r\n */\r\nexport function badgeVariant(type: BrowseStatusType): BadgeVariant {\r\n\tswitch (type) {\r\n\t\tcase 'cancelled':\r\n\t\t\treturn 'neutral';\r\n\t\tcase 'past':\r\n\t\t\treturn 'neutral';\r\n\t\tcase 'sold_out':\r\n\t\t\treturn 'error';\r\n\t\tcase 'sales_ended':\r\n\t\t\treturn 'neutral';\r\n\t\tcase 'coming_soon':\r\n\t\t\treturn 'info';\r\n\t\tcase 'scarcity':\r\n\t\t\treturn 'warning';\r\n\t\tdefault:\r\n\t\t\treturn 'neutral';\r\n\t}\r\n}\r\n\r\n// === Filtering ===\r\n\r\n/**\r\n * Filter an event list to today and future dates, sorted chronologically.\r\n * From browse-status.js, now typed.\r\n */\r\nexport function filterTodayAndFuture(events: BrowseEvent[]): BrowseEvent[] {\r\n\tconst today = new Date();\r\n\ttoday.setHours(0, 0, 0, 0);\r\n\tconst todayStr = formatDateForAPI(today);\r\n\r\n\treturn events\r\n\t\t.filter((event) => event.date >= todayStr)\r\n\t\t.sort((a, b) => a.date.localeCompare(b.date));\r\n}\r\n","/**\r\n * DateTime Utilities\r\n *\r\n * Consolidated date/time formatting with timezone support.\r\n * Uses Intl.DateTimeFormat for consistent timezone-aware formatting.\r\n *\r\n * Timezone resolvers (`getIANATimezone`, `isValidTimezone`,\r\n * `isValidIANATimezone`, `LEGACY_TIMEZONE_MAP`, `DEFAULT_TIMEZONE`) are the\r\n * canonical ones from `@getmicdrop/svelte-components` — VC's local shadows were\r\n * deleted (the local default was `'UTC'`, a latent bug; the canonical default is\r\n * `America/Los_Angeles`, matching MicDrop / admin). The format helpers below\r\n * remain VC-specific.\r\n *\r\n * @example\r\n * import { formatEventTime, formatTimeRange, getDateParts } from './datetime.js';\r\n *\r\n * const time = formatEventTime(event.startDateTime, event.timeZone);\r\n * const range = formatTimeRange(event.startDateTime, event.endDateTime, event.timeZone);\r\n * const { day, month, date } = getDateParts(event.startDateTime, event.timeZone);\r\n */\r\n\r\n// `isValidTimezone` is pinned to the `/utils/timezones` subpath: VC relies on\r\n// the LENIENT check (accepts abbreviations like 'PST'). SC's pending root-barrel\r\n// flip repoints the bare `isValidTimezone` to the STRICT datetime/ version\r\n// (rejects 'PST'/'EST'/''), which would change the `isValidTimezone(tz) ? tz :\r\n// DEFAULT_TIMEZONE` guard below. The subpath import is flip-immune.\r\nimport { isValidTimezone } from '@getmicdrop/svelte-components/utils/timezones';\r\nimport {\r\n getIANATimezone,\r\n isValidIANATimezone,\r\n LEGACY_TIMEZONE_MAP,\r\n DEFAULT_TIMEZONE,\r\n} from '@getmicdrop/svelte-components';\r\n\r\n// Re-export canonical timezone utilities so existing `./datetime.js` importers\r\n// (and the barrel in ./utils.js) keep resolving the same symbols.\r\nexport {\r\n getIANATimezone,\r\n isValidTimezone,\r\n isValidIANATimezone,\r\n LEGACY_TIMEZONE_MAP,\r\n DEFAULT_TIMEZONE,\r\n};\r\n\r\n/** Default locale for Intl.DateTimeFormat. Can be overridden per-call. */\r\nexport let DEFAULT_LOCALE = 'en-US';\r\n\r\n/**\r\n * Set the default locale for all datetime formatting.\r\n * @param {string} locale - BCP 47 locale string (e.g., 'en-US', 'es', 'fr-FR')\r\n */\r\nexport function setDefaultLocale(locale) {\r\n DEFAULT_LOCALE = locale;\r\n}\r\n\r\n// =============================================================================\r\n// Format Functions\r\n// =============================================================================\r\n\r\n/**\r\n * Parse and validate an ISO date string.\r\n * @param {string} utcIso - ISO date string\r\n * @returns {Date|null}\r\n */\r\nfunction parseISO(utcIso) {\r\n if (!utcIso || typeof utcIso !== 'string') return null;\r\n const date = new Date(utcIso);\r\n return isNaN(date.getTime()) ? null : date;\r\n}\r\n\r\n/**\r\n * Format a datetime in the specified timezone.\r\n * @param {string} utcIso - ISO date string\r\n * @param {string} timezone - IANA timezone\r\n * @param {Object} options - Intl.DateTimeFormat options\r\n * @param {string} [locale] - BCP 47 locale string (defaults to DEFAULT_LOCALE)\r\n * @returns {string}\r\n */\r\nfunction formatInTz(utcIso, timezone, options, locale) {\r\n const date = parseISO(utcIso);\r\n if (!date) return '';\r\n\r\n const tz = isValidTimezone(timezone) ? timezone : DEFAULT_TIMEZONE;\r\n return new Intl.DateTimeFormat(locale || DEFAULT_LOCALE, { ...options, timeZone: tz }).format(date);\r\n}\r\n\r\n/**\r\n * Format event time (e.g., \"7:00 PM\").\r\n * @param {string} utcIso - ISO date string\r\n * @param {string} timezone - IANA timezone\r\n * @returns {string}\r\n */\r\nexport function formatEventTime(utcIso, timezone) {\r\n return formatInTz(utcIso, timezone, {\r\n hour: 'numeric',\r\n minute: '2-digit',\r\n hour12: true,\r\n });\r\n}\r\n\r\n/**\r\n * Format event date (e.g., \"Dec 25, 2023\").\r\n * @param {string} utcIso - ISO date string\r\n * @param {string} timezone - IANA timezone\r\n * @returns {string}\r\n */\r\nexport function formatEventDate(utcIso, timezone) {\r\n return formatInTz(utcIso, timezone, {\r\n month: 'short',\r\n day: 'numeric',\r\n year: 'numeric',\r\n });\r\n}\r\n\r\n/**\r\n * Format time range (e.g., \"7:00 PM - 10:00 PM\").\r\n * @param {string} startUtc - Start ISO date string\r\n * @param {string} endUtc - End ISO date string\r\n * @param {string} timezone - IANA timezone\r\n * @returns {string}\r\n */\r\nexport function formatTimeRange(startUtc, endUtc, timezone) {\r\n const start = formatEventTime(startUtc, timezone);\r\n if (!endUtc) return start;\r\n \r\n const end = formatEventTime(endUtc, timezone);\r\n return start && end ? `${start} - ${end}` : start;\r\n}\r\n\r\n/**\r\n * Format clean time range (omits :00 minutes).\r\n * @param {string} startUtc - Start ISO date string\r\n * @param {string} endUtc - End ISO date string\r\n * @param {string} timezone - IANA timezone\r\n * @param {string} [locale] - BCP 47 locale string (defaults to DEFAULT_LOCALE)\r\n * @returns {string}\r\n */\r\nexport function formatCleanTimeRange(startUtc, endUtc, timezone, locale) {\r\n const formatClean = (utcIso) => {\r\n const date = parseISO(utcIso);\r\n if (!date) return '';\r\n\r\n const tz = isValidTimezone(timezone) ? timezone : DEFAULT_TIMEZONE;\r\n const parts = new Intl.DateTimeFormat(locale || DEFAULT_LOCALE, {\r\n hour: 'numeric',\r\n minute: '2-digit',\r\n hour12: true,\r\n timeZone: tz,\r\n }).formatToParts(date);\r\n \r\n const hour = parts.find(p => p.type === 'hour')?.value || '';\r\n const minute = parts.find(p => p.type === 'minute')?.value || '00';\r\n const period = parts.find(p => p.type === 'dayPeriod')?.value || '';\r\n \r\n return minute === '00' ? `${hour} ${period}` : `${hour}:${minute} ${period}`;\r\n };\r\n \r\n const start = formatClean(startUtc);\r\n if (!endUtc) return start;\r\n \r\n const end = formatClean(endUtc);\r\n return start && end ? `${start} - ${end}` : start;\r\n}\r\n\r\n/**\r\n * Get date parts for display.\r\n * @param {string} utcIso - ISO date string\r\n * @param {string} timezone - IANA timezone\r\n * @returns {{ day: string, month: string, date: number, year: number }}\r\n */\r\nexport function getDateParts(utcIso, timezone) {\r\n const date = parseISO(utcIso);\r\n if (!date) return { day: '', month: '', date: 0, year: 0 };\r\n \r\n const tz = isValidTimezone(timezone) ? timezone : DEFAULT_TIMEZONE;\r\n \r\n return {\r\n day: formatInTz(utcIso, tz, { weekday: 'short' }),\r\n month: formatInTz(utcIso, tz, { month: 'short' }),\r\n date: parseInt(formatInTz(utcIso, tz, { day: 'numeric' }), 10),\r\n year: parseInt(formatInTz(utcIso, tz, { year: 'numeric' }), 10),\r\n };\r\n}\r\n\r\n/**\r\n * Format browse card date (e.g., \"Mon, Jan 15\").\r\n * Used for gallery cards and list views.\r\n * @param {string} utcIso - ISO date string\r\n * @param {string} timezone - IANA timezone\r\n * @returns {string}\r\n */\r\nexport function formatBrowseDate(utcIso, timezone) {\r\n return formatInTz(utcIso, timezone, {\r\n weekday: 'short',\r\n month: 'short',\r\n day: 'numeric',\r\n });\r\n}\r\n\r\n/**\r\n * Format full date with year (e.g., \"Monday, January 15, 2026\").\r\n * Used for event detail pages and aria-labels.\r\n * @param {string} utcIso - ISO date string\r\n * @param {string} timezone - IANA timezone\r\n * @returns {string}\r\n */\r\nexport function formatFullDate(utcIso, timezone) {\r\n return formatInTz(utcIso, timezone, {\r\n weekday: 'long',\r\n year: 'numeric',\r\n month: 'long',\r\n day: 'numeric',\r\n });\r\n}\r\n\r\n/**\r\n * Format full date without year (e.g., \"Monday, January 15\").\r\n * Used for sidebar/compact displays.\r\n * @param {string} utcIso - ISO date string\r\n * @param {string} timezone - IANA timezone\r\n * @returns {string}\r\n */\r\nexport function formatFullDateCompact(utcIso, timezone) {\r\n return formatInTz(utcIso, timezone, {\r\n weekday: 'long',\r\n month: 'long',\r\n day: 'numeric',\r\n });\r\n}\r\n\r\n/**\r\n * Format sales date for ticket windows (e.g., \"Jan 15, 7:00 PM\").\r\n * @param {string} utcIso - ISO date string\r\n * @param {string} [timezone] - IANA timezone (optional, uses browser default if omitted)\r\n * @returns {string}\r\n */\r\nexport function formatSalesDate(utcIso, timezone) {\r\n return formatInTz(utcIso, timezone, {\r\n month: 'short',\r\n day: 'numeric',\r\n hour: 'numeric',\r\n minute: '2-digit',\r\n hour12: true,\r\n });\r\n}\r\n\r\n/**\r\n * Format doors open time in venue timezone.\r\n * Handles pre-formatted strings (e.g., \"7:30 PM\") and ISO date strings.\r\n * @param {string} doorsOpenTime - Pre-formatted time string or ISO date string\r\n * @param {string} timezone - IANA timezone\r\n * @returns {string}\r\n */\r\nexport function formatDoorsTime(doorsOpenTime, timezone) {\r\n if (!doorsOpenTime) return '';\r\n\r\n // If it's already a nicely formatted time string like \"7:30 PM\", return as-is\r\n if (typeof doorsOpenTime === 'string' && /^\\d{1,2}:\\d{2}\\s*(AM|PM)$/i.test(doorsOpenTime)) {\r\n return doorsOpenTime;\r\n }\r\n\r\n // If it's an ISO date string or timestamp, parse and format in venue timezone\r\n const formatted = formatEventTime(doorsOpenTime, timezone);\r\n return formatted || doorsOpenTime;\r\n}\r\n\r\n","/**\r\n * Maps a GroupedEvent (venue-calendar's event model) to the presentational\r\n * props the SC <EventCard> expects. EventCard knows nothing about events,\r\n * URLs, or status thresholds — this is where venue-calendar's domain logic\r\n * (browse status, scarcity, href building, date formatting) is resolved so\r\n * every view shell can stay a thin arranger.\r\n *\r\n * Click wiring stays in the shell: the shell calls `oneventClick(grouped.event)`\r\n * on card click and `oneventClick(pillEvents[i])` on pill click, using the\r\n * `pillEvents` returned here.\r\n */\r\nimport {\r\n\tgetBrowseStatus,\r\n\tgetSeriesBrowseStatus,\r\n\tbadgeVariant,\r\n} from './status';\r\nimport { buildEventHref } from '$lib/url-manager/params';\r\nimport { formatBrowseDate, formatEventTime } from '$lib/utils/datetime.js';\r\nimport type { BrowseEvent, GroupedEvent } from './types';\r\n\r\nconst LOW_PCT = 20;\r\n\r\n/** Browse-context scarcity badge — single events only (a series rep event's\r\n * solo ticket count is misleading). Mirrors ScarcityBadge browse rules:\r\n * remaining<=0 → Sold out (error); <=20% remaining → Selling fast (warning). */\r\nfunction scarcityBadge(\r\n\tevent: BrowseEvent,\r\n\tlabels: Record<string, string>\r\n): { text: string; variant: string } | null {\r\n\tconst remaining = event.ticketsRemaining ?? 0;\r\n\tconst total = event.ticketsTotal ?? 0;\r\n\tif (!total || total <= 0) return null;\r\n\tif (remaining <= 0) {\r\n\t\treturn { text: labels.statusSoldOut || 'Sold out', variant: 'error' };\r\n\t}\r\n\tconst pct = (remaining / total) * 100;\r\n\tif (pct <= LOW_PCT) {\r\n\t\treturn { text: labels.statusSellingFast || 'Selling fast', variant: 'warning' };\r\n\t}\r\n\treturn null;\r\n}\r\n\r\nexport interface EventCardProps {\r\n\ttitle: string;\r\n\thref: string;\r\n\timageUrl: string;\r\n\tdateLabel: string;\r\n\tdescription: string;\r\n\tariaLabel: string;\r\n\tbadge: { text: string; variant: string } | null;\r\n\tpills: Array<{ timeLabel: string; href: string; ariaLabel: string }>;\r\n\t/** Events behind each pill, in pill order — for the shell's onpillclick. */\r\n\tpillEvents: BrowseEvent[];\r\n}\r\n\r\nexport function toEventCardProps(\r\n\tgrouped: GroupedEvent,\r\n\tlabels: Record<string, string> = {}\r\n): EventCardProps {\r\n\tconst event = grouped.event;\r\n\r\n\tconst status = grouped.isSeries\r\n\t\t? getSeriesBrowseStatus(grouped.instances, labels)\r\n\t\t: getBrowseStatus(event, labels);\r\n\t// 'past' is never surfaced as a badge anywhere (Peet directive). Past\r\n\t// events read as dimmed/contextual, not flagged.\r\n\tlet badge: { text: string; variant: string } | null =\r\n\t\tstatus && status.type !== 'past'\r\n\t\t\t? { text: status.text, variant: badgeVariant(status.type) }\r\n\t\t\t: null;\r\n\tif (!badge && !grouped.isSeries) badge = scarcityBadge(event, labels);\r\n\r\n\tconst href = buildEventHref(event);\r\n\tconst dateLabel = event.startDateTime\r\n\t\t? formatBrowseDate(event.startDateTime, event.timeZone)\r\n\t\t: '';\r\n\r\n\tconst pillEvents: BrowseEvent[] = grouped.isSeries\r\n\t\t? grouped.instances\r\n\t\t: event.startDateTime\r\n\t\t\t? [event]\r\n\t\t\t: [];\r\n\tconst pills = pillEvents.map((e) => {\r\n\t\tconst time = formatEventTime(e.startDateTime, e.timeZone);\r\n\t\tconst soldOut = getBrowseStatus(e, labels)?.type === 'sold_out';\r\n\t\treturn {\r\n\t\t\ttimeLabel: time,\r\n\t\t\thref: buildEventHref(e),\r\n\t\t\tariaLabel: `${event.name} at ${time}${soldOut ? ', sold out' : ''}`,\r\n\t\t};\r\n\t});\r\n\r\n\tconst parts: string[] = [event.name];\r\n\tif (event.startDateTime) {\r\n\t\tparts.push(`on ${formatBrowseDate(event.startDateTime, event.timeZone)}`);\r\n\t}\r\n\tif (grouped.isSeries) {\r\n\t\tparts.push(`${grouped.instances.length} showtimes available`);\r\n\t} else if (event.startDateTime) {\r\n\t\tparts.push(`at ${formatEventTime(event.startDateTime, event.timeZone)}`);\r\n\t}\r\n\tif (status) parts.push(status.text);\r\n\r\n\treturn {\r\n\t\ttitle: event.name,\r\n\t\thref,\r\n\t\timageUrl: event.imageUrl ?? '',\r\n\t\tdateLabel,\r\n\t\tdescription: event.description ?? '',\r\n\t\tariaLabel: parts.join(', '),\r\n\t\tbadge,\r\n\t\tpills,\r\n\t\tpillEvents,\r\n\t};\r\n}\r\n","/**\r\n * Shared constants for the venue calendar components\r\n */\r\n\r\n// Placeholder image for events without images\r\n// Neutral gray background with a calendar icon\r\n// SVG file located at /static/placeholder-event.svg\r\nexport const PLACEHOLDER_IMAGE = \"/placeholder-event.svg\";\r\n","<!--\r\n native-element-exception: VC is an embeddable widget — the mini-grid day cells are native\r\n <button>s on purpose (widget-controlled styling on calendar cells, no SC Button chrome).\r\n @style-escape: the 3-page swipe track uses a dynamic `style:transform` translate3d driven by\r\n the live drag offset (swipeOffset px) — a runtime gesture value, not a themeable token.\r\n @raw-intl-datetimeformat-escape: the weekday column headers use Intl.DateTimeFormat\r\n (weekday short/narrow) for locale-aware day labels; SC formatDate/DATE_FORMATS has no\r\n bare-weekday preset, so it can't express these single-letter/short headers.\r\n-->\r\n<script>\r\n\t/**\r\n\t * Calendar — month grid with <EventCard> at density=\"micro\" in each day\r\n\t * cell. Ported wholesale from the v2 public-calendar-flow prototype. Two\r\n\t * layouts:\r\n\t *\r\n\t * Desktop (lg+): full month grid, EventCards render inline in cells.\r\n\t * Fully-past empty weeks compress to a thin row.\r\n\t * Mobile + tablet (<lg): mini month grid (numbers + tap-to-select) at\r\n\t * top, selected-day list of horizontal EventCards below.\r\n\t *\r\n\t * Month state is owned by the parent (CalendarContainer): the displayed\r\n\t * month comes from `currentYear`/`currentMonth`, and month changes are\r\n\t * delegated via `onswipePrev`/`onswipeNext`. The 3-page slide track\r\n\t * (prev/current/next) is driven both by touch gestures and by the\r\n\t * external MonthSwitcher buttons through the exposed\r\n\t * `animateMonthTransition(direction, onComplete)` method.\r\n\t *\r\n\t * No inline card logic: every cell maps its GroupedEvent through the\r\n\t * shared `toEventCardProps` mapper, exactly like the other v2 views.\r\n\t */\r\n\timport { EventCard, Grid, triggerHaptic } from '@getmicdrop/svelte-components';\r\n\timport { groupEventsBySeries } from '$lib/browse-widgets/utils';\r\n\timport { toEventCardProps } from '$lib/browse-widgets/to-event-card-props';\r\n\timport { getBrowseStatus } from '$lib/browse-widgets/status';\r\n\timport { PLACEHOLDER_IMAGE } from '$lib/utils/constants.js';\r\n\r\n\tlet {\r\n\t\t// Accepted for API compatibility with the legacy Calendar; the v2\r\n\t\t// calendar renders a single embed-style grid regardless.\r\n\t\tisScheduledBtn = false,\r\n\t\teventCalendar = false,\r\n\t\tembedCalendar = false,\r\n\t\tcurrentYear = new Date().getFullYear(),\r\n\t\tcurrentMonth = new Date().getMonth(),\r\n\t\tcurrentevents = [],\r\n\t\tshowPartialPreview = true,\r\n\t\toneventClick,\r\n\t\tondaySelect,\r\n\t\tonswipePrev,\r\n\t\tonswipeNext,\r\n\t\tlabels = {},\r\n\t\tlocale = 'en-US',\r\n\t} = $props();\r\n\r\n\t// Displayed month is parent-owned (props). Internal slide state advances\r\n\t// the track visually; the actual month change is delegated upward.\r\n\tlet viewYear = $derived(currentYear);\r\n\tlet viewMonth = $derived(currentMonth);\r\n\r\n\tconst today = new Date();\r\n\r\n\tfunction ymd(y, m, d) {\r\n\t\tconst mm = String(m + 1).padStart(2, '0');\r\n\t\tconst dd = String(d).padStart(2, '0');\r\n\t\treturn `${y}-${mm}-${dd}`;\r\n\t}\r\n\r\n\tlet todayStr = $derived(ymd(today.getFullYear(), today.getMonth(), today.getDate()));\r\n\r\n\tlet monthLabel = $derived(\r\n\t\tnew Date(viewYear, viewMonth, 1).toLocaleString(locale, {\r\n\t\t\tmonth: 'long',\r\n\t\t\tyear: 'numeric',\r\n\t\t})\r\n\t);\r\n\r\n\t// Day-of-week labels via Intl so non-English viewers see translated names.\r\n\t// Reference a known Sunday (1970-01-04) then walk 7 days. Short (\"Sun\")\r\n\t// for desktop, narrow (\"S\") for the mobile mini-grid.\r\n\tlet weekdayLabels = $derived.by(() => {\r\n\t\tconst shortFmt = new Intl.DateTimeFormat(locale, { weekday: 'short' });\r\n\t\tconst narrowFmt = new Intl.DateTimeFormat(locale, { weekday: 'narrow' });\r\n\t\tconst sunday = new Date(1970, 0, 4);\r\n\t\tconst out = [];\r\n\t\tfor (let i = 0; i < 7; i++) {\r\n\t\t\tconst d = new Date(sunday.getFullYear(), sunday.getMonth(), sunday.getDate() + i);\r\n\t\t\tout.push({ short: shortFmt.format(d), narrow: narrowFmt.format(d) });\r\n\t\t}\r\n\t\treturn out;\r\n\t});\r\n\r\n\t// Build a 7×N grid of cells for a month, including leading/trailing\r\n\t// out-of-month days needed to fill complete weeks.\r\n\tfunction buildCells(y, m, eventsIdx) {\r\n\t\tconst daysInMo = new Date(y, m + 1, 0).getDate();\r\n\t\tconst firstWk = new Date(y, m, 1).getDay();\r\n\t\tconst result = [];\r\n\t\tconst prevMo = m === 0 ? 11 : m - 1;\r\n\t\tconst prevYr = m === 0 ? y - 1 : y;\r\n\t\tconst daysInPrev = new Date(prevYr, prevMo + 1, 0).getDate();\r\n\t\tfor (let i = firstWk - 1; i >= 0; i--) {\r\n\t\t\tconst d = daysInPrev - i;\r\n\t\t\tresult.push({\r\n\t\t\t\tday: d,\r\n\t\t\t\tdate: ymd(prevYr, prevMo, d),\r\n\t\t\t\tgroupedEvents: [],\r\n\t\t\t\tisOutsideMonth: true,\r\n\t\t\t\tisToday: false,\r\n\t\t\t});\r\n\t\t}\r\n\t\tfor (let d = 1; d <= daysInMo; d++) {\r\n\t\t\tconst dateStr = ymd(y, m, d);\r\n\t\t\tconst dayEvents = eventsIdx.get(dateStr) ?? [];\r\n\t\t\tresult.push({\r\n\t\t\t\tday: d,\r\n\t\t\t\tdate: dateStr,\r\n\t\t\t\tgroupedEvents: groupEventsBySeries(dayEvents),\r\n\t\t\t\tisOutsideMonth: false,\r\n\t\t\t\tisToday: dateStr === todayStr,\r\n\t\t\t});\r\n\t\t}\r\n\t\twhile (result.length % 7 !== 0) {\r\n\t\t\tconst offset = result.length - (firstWk + daysInMo);\r\n\t\t\tconst nextMo = m === 11 ? 0 : m + 1;\r\n\t\t\tconst nextYr = m === 11 ? y + 1 : y;\r\n\t\t\tconst d = offset + 1;\r\n\t\t\tresult.push({\r\n\t\t\t\tday: d,\r\n\t\t\t\tdate: ymd(nextYr, nextMo, d),\r\n\t\t\t\tgroupedEvents: [],\r\n\t\t\t\tisOutsideMonth: true,\r\n\t\t\t\tisToday: false,\r\n\t\t\t});\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// Desktop: compress fully-past empty weeks to a thin row.\r\n\tfunction buildVisibleCells(monthCells) {\r\n\t\tconst result = [];\r\n\t\tfor (let i = 0; i < monthCells.length; i += 7) {\r\n\t\t\tconst week = monthCells.slice(i, i + 7);\r\n\t\t\tconst weekIsPastEmpty = week.every(\r\n\t\t\t\t(c) => c.date < todayStr && c.groupedEvents.length === 0\r\n\t\t\t);\r\n\t\t\tfor (const c of week) result.push({ cell: c, compressed: weekIsPastEmpty });\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// Pre-index events by date once per events-change so each grid cell is an\r\n\t// O(1) Map lookup instead of an O(events) filter — the grids build three\r\n\t// months at ~35 cells each, so per-cell filtering was O(days × events × 3).\r\n\t// This index also feeds the selected-day lookup below (selectedEvents): one\r\n\t// canonical date index, used GLOBALLY (not just this month's cells) so\r\n\t// selecting a day then swiping months still resolves its events.\r\n\tlet allEventsByDate = $derived.by(() => {\r\n\t\tconst map = new Map();\r\n\t\tfor (const e of currentevents) {\r\n\t\t\t// Hide cancelled events (incl. cancelled series instances) from the\r\n\t\t\t// grid AND the selected-day list, using the canonical status helper so\r\n\t\t\t// it matches how the rest of the browse widgets classify cancellation.\r\n\t\t\t// See findings: series-cancelled-instance-on-embed.\r\n\t\t\tif (getBrowseStatus(e)?.type === 'cancelled') continue;\r\n\t\t\tif (!map.has(e.date)) map.set(e.date, []);\r\n\t\t\tmap.get(e.date).push(e);\r\n\t\t}\r\n\t\treturn map;\r\n\t});\r\n\r\n\t// Prev / current / next month — rendered side-by-side in the slide track.\r\n\tlet cells = $derived(buildCells(viewYear, viewMonth, allEventsByDate));\r\n\tlet prevCells = $derived.by(() => {\r\n\t\tconst d = new Date(viewYear, viewMonth - 1, 1);\r\n\t\treturn buildCells(d.getFullYear(), d.getMonth(), allEventsByDate);\r\n\t});\r\n\tlet nextCells = $derived.by(() => {\r\n\t\tconst d = new Date(viewYear, viewMonth + 1, 1);\r\n\t\treturn buildCells(d.getFullYear(), d.getMonth(), allEventsByDate);\r\n\t});\r\n\r\n\tlet visibleCells = $derived(buildVisibleCells(cells));\r\n\tlet prevVisibleCells = $derived(buildVisibleCells(prevCells));\r\n\tlet nextVisibleCells = $derived(buildVisibleCells(nextCells));\r\n\r\n\t// === Month nav: swipe gesture + external button bridge =================\r\n\tconst SWIPE_THRESHOLD = 0.08; // 8% of grid width\r\n\tconst VELOCITY_THRESHOLD = 0.2; // px/ms — a gentle flick commits\r\n\tconst DRAG_RESISTANCE = 0.95;\r\n\r\n\tlet touchStartX = 0;\r\n\tlet touchStartY = 0;\r\n\tlet lastTouchX = 0;\r\n\tlet lastTouchTime = 0;\r\n\tlet velocityX = 0;\r\n\tlet isSwiping = $state(false);\r\n\tlet swipeOffset = $state(0);\r\n\tlet isSnapping = $state(false);\r\n\tlet isAnimating = $state(false);\r\n\tlet commitTimeoutId = null;\r\n\tlet prefersReducedMotion = $state(false);\r\n\r\n\t// Both layouts bind their own host so width calc uses whichever is visible.\r\n\tlet gridWrapperDesktop = $state(null);\r\n\tlet gridWrapperMobile = $state(null);\r\n\tfunction hostWidth() {\r\n\t\treturn (\r\n\t\t\tgridWrapperDesktop?.offsetWidth ||\r\n\t\t\tgridWrapperMobile?.offsetWidth ||\r\n\t\t\t320\r\n\t\t);\r\n\t}\r\n\r\n\t$effect(() => {\r\n\t\tif (typeof window === 'undefined') return;\r\n\t\tconst mq = window.matchMedia('(prefers-reduced-motion: reduce)');\r\n\t\tprefersReducedMotion = mq.matches;\r\n\t\tconst handler = (e) => (prefersReducedMotion = e.matches);\r\n\t\tmq.addEventListener('change', handler);\r\n\t\treturn () => mq.removeEventListener('change', handler);\r\n\t});\r\n\r\n\t// Shared slide driver. `commit` performs the actual month change (parent\r\n\t// callback for gestures; the caller's onComplete for external buttons).\r\n\tfunction runMonthSlide(direction, commit, containerWidth) {\r\n\t\tif (isAnimating) {\r\n\t\t\tcommit?.();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (prefersReducedMotion) {\r\n\t\t\tcommit?.();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tisAnimating = true;\r\n\t\tconst w = containerWidth || hostWidth();\r\n\t\t// direction 1 (next) slides track left to reveal the right page.\r\n\t\tswipeOffset = direction === 1 ? -w : w;\r\n\t\tcommitTimeoutId = window.setTimeout(() => {\r\n\t\t\tcommitTimeoutId = null;\r\n\t\t\t// isSnapping (transition:none) must land BEFORE the transform\r\n\t\t\t// resets, or the browser animates the snap-back as a second slide.\r\n\t\t\tisSnapping = true;\r\n\t\t\trequestAnimationFrame(() => {\r\n\t\t\t\tcommit?.(); // parent advances month → props change → cells rebuild\r\n\t\t\t\tswipeOffset = 0;\r\n\t\t\t\tisAnimating = false;\r\n\t\t\t\trequestAnimationFrame(() => {\r\n\t\t\t\t\tisSnapping = false;\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}, 320);\r\n\t}\r\n\r\n\t// Exposed for CalendarContainer's MonthSwitcher (prev/next/today). Keeps\r\n\t// the same signature as the legacy Calendar so it stays a drop-in.\r\n\texport async function animateMonthTransition(direction, onComplete) {\r\n\t\trunMonthSlide(direction, onComplete);\r\n\t}\r\n\r\n\tfunction handleTouchStart(e) {\r\n\t\tif (isAnimating) {\r\n\t\t\tif (commitTimeoutId !== null) {\r\n\t\t\t\tclearTimeout(commitTimeoutId);\r\n\t\t\t\tcommitTimeoutId = null;\r\n\t\t\t}\r\n\t\t\tisAnimating = false;\r\n\t\t\tisSnapping = false;\r\n\t\t}\r\n\t\ttouchStartX = e.touches[0].clientX;\r\n\t\ttouchStartY = e.touches[0].clientY;\r\n\t\tlastTouchX = touchStartX;\r\n\t\tlastTouchTime = e.timeStamp;\r\n\t\tvelocityX = 0;\r\n\t\tisSwiping = false;\r\n\t\tswipeOffset = 0;\r\n\t}\r\n\r\n\tfunction handleTouchMove(e) {\r\n\t\tif (!touchStartX || isAnimating) return;\r\n\t\tconst curX = e.touches[0].clientX;\r\n\t\tconst curY = e.touches[0].clientY;\r\n\t\tconst diffX = touchStartX - curX;\r\n\t\tconst diffY = touchStartY - curY;\r\n\t\tconst now = e.timeStamp;\r\n\r\n\t\tif (!isSwiping && Math.abs(diffX) > 10) {\r\n\t\t\tif (Math.abs(diffX) > Math.abs(diffY)) {\r\n\t\t\t\tisSwiping = true;\r\n\t\t\t} else {\r\n\t\t\t\ttouchStartX = 0;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (isSwiping) {\r\n\t\t\te.preventDefault();\r\n\t\t\tconst dt = now - lastTouchTime;\r\n\t\t\tif (dt > 0) velocityX = (lastTouchX - curX) / dt;\r\n\t\t\tlastTouchX = curX;\r\n\t\t\tlastTouchTime = now;\r\n\t\t\tswipeOffset = -diffX * DRAG_RESISTANCE;\r\n\t\t}\r\n\t}\r\n\r\n\tfunction handleTouchEnd(e) {\r\n\t\tif (!touchStartX || !isSwiping || isAnimating) {\r\n\t\t\ttouchStartX = 0;\r\n\t\t\tisSwiping = false;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst containerWidth = e.currentTarget?.offsetWidth || hostWidth();\r\n\t\tconst swipePercent = Math.abs(swipeOffset) / containerWidth;\r\n\t\tconst overThreshold = swipePercent > SWIPE_THRESHOLD;\r\n\t\tconst flickedHard = Math.abs(velocityX) > VELOCITY_THRESHOLD;\r\n\t\tconst direction = swipeOffset > 0 ? -1 : 1;\r\n\r\n\t\tif (overThreshold || flickedHard) {\r\n\t\t\ttriggerHaptic('medium');\r\n\t\t\trunMonthSlide(\r\n\t\t\t\tdirection,\r\n\t\t\t\t() => (direction === 1 ? onswipeNext?.() : onswipePrev?.()),\r\n\t\t\t\tcontainerWidth\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\tswipeOffset = 0;\r\n\t\t}\r\n\r\n\t\ttouchStartX = 0;\r\n\t\tisSwiping = false;\r\n\t\tvelocityX = 0;\r\n\t}\r\n\r\n\t// === Mobile selection + keyboard roving tabindex =======================\r\n\tlet selectedDate = $state('');\r\n\tlet focusedDate = $state('');\r\n\r\n\tfunction handleGridKeydown(e) {\r\n\t\tconst handled = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Enter', ' '];\r\n\t\tif (!handled.includes(e.key)) return;\r\n\t\tif (!focusedDate) return;\r\n\r\n\t\tconst idx = cells.findIndex((c) => c.date === focusedDate);\r\n\t\tif (idx === -1) return;\r\n\r\n\t\tif (e.key === 'Enter' || e.key === ' ') {\r\n\t\t\te.preventDefault();\r\n\t\t\tconst cell = cells[idx];\r\n\t\t\tif (cell.groupedEvents.length > 0) {\r\n\t\t\t\tselectedDate = cell.date;\r\n\t\t\t\tondaySelect?.({ date: cell.date, events: cell.groupedEvents });\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet nextIdx = idx;\r\n\t\tif (e.key === 'ArrowLeft') nextIdx = idx - 1;\r\n\t\telse if (e.key === 'ArrowRight') nextIdx = idx + 1;\r\n\t\telse if (e.key === 'ArrowUp') nextIdx = idx - 7;\r\n\t\telse if (e.key === 'ArrowDown') nextIdx = idx + 7;\r\n\r\n\t\tif (nextIdx < 0 || nextIdx >= cells.length) return;\r\n\t\te.preventDefault();\r\n\t\tfocusedDate = cells[nextIdx].date;\r\n\r\n\t\tqueueMicrotask(() => {\r\n\t\t\tconst el = /** @type {HTMLElement | null} */ (\r\n\t\t\t\tdocument.querySelector(`[data-cell-date=\"${cells[nextIdx].date}\"]`)\r\n\t\t\t);\r\n\t\t\tel?.focus();\r\n\t\t});\r\n\t}\r\n\r\n\t// Initial focusedDate: selected if in month, else today, else first\r\n\t// event-day, else first day.\r\n\t$effect(() => {\r\n\t\tif (focusedDate && cells.some((c) => c.date === focusedDate)) return;\r\n\t\tif (selectedDate && cells.some((c) => c.date === selectedDate)) {\r\n\t\t\tfocusedDate = selectedDate;\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst todayInView = cells.find((c) => c.isToday);\r\n\t\tif (todayInView) {\r\n\t\t\tfocusedDate = todayInView.date;\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst firstEvent = cells.find((c) => !c.isOutsideMonth && c.groupedEvents.length > 0);\r\n\t\tif (firstEvent) {\r\n\t\t\tfocusedDate = firstEvent.date;\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst firstDay = cells.find((c) => !c.isOutsideMonth);\r\n\t\tif (firstDay) focusedDate = firstDay.date;\r\n\t});\r\n\r\n\t$effect(() => {\r\n\t\tif (selectedDate) return;\r\n\t\tconst future = cells.find((c) => c.date >= todayStr && c.groupedEvents.length > 0);\r\n\t\tconst fallback = cells.find((c) => !c.isOutsideMonth);\r\n\t\tselectedDate = future?.date ?? fallback?.date ?? todayStr;\r\n\t});\r\n\r\n\t// Look up the selected day's events from the shared date index (declared\r\n\t// above, alongside the grid builders).\r\n\tlet selectedEvents = $derived.by(() => {\r\n\t\tif (!selectedDate) return [];\r\n\t\tconst dayEvents = allEventsByDate.get(selectedDate) ?? [];\r\n\t\treturn groupEventsBySeries(dayEvents);\r\n\t});\r\n</script>\r\n\r\n<!-- DESKTOP: full grid with EventCards inline (lg+: ≥1024). Tablet falls back\r\n to the mobile mini-cal pattern because day cells <1024px wide crush card\r\n text. -->\r\n<!-- svelte-ignore a11y_no_static_element_interactions -->\r\n<div\r\n\tclass=\"hidden lg:block calendar-swipe-host\"\r\n\tbind:this={gridWrapperDesktop}\r\n\tontouchstart={handleTouchStart}\r\n\tontouchmove={handleTouchMove}\r\n\tontouchend={handleTouchEnd}\r\n\tontouchcancel={handleTouchEnd}\r\n>\r\n\t<div class=\"dow-row\" aria-hidden=\"true\">\r\n\t\t{#each weekdayLabels as label, i (i)}\r\n\t\t\t<div class=\"dow-cell\">{label.short}</div>\r\n\t\t{/each}\r\n\t</div>\r\n\t<div class=\"swipe-viewport\">\r\n\t\t<div\r\n\t\t\tclass=\"swipe-track\"\r\n\t\t\tclass:swipe-track--swiping={isSwiping}\r\n\t\t\tclass:swipe-track--snapping={isSnapping}\r\n\t\t\tstyle:transform=\"translate3d(calc(-100% / 3 + {swipeOffset}px), 0, 0)\"\r\n\t\t>\r\n\t\t\t{@render monthPageDesktop(prevVisibleCells, 'prev')}\r\n\t\t\t{@render monthPageDesktop(visibleCells, monthLabel)}\r\n\t\t\t{@render monthPageDesktop(nextVisibleCells, 'next')}\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t{#snippet monthPageDesktop(pageCells, ariaLabel)}\r\n\t\t<div class=\"month-grid\" role=\"grid\" aria-label={ariaLabel}>\r\n\t\t\t{#each pageCells as { cell, compressed } (`${cell.date}|${cell.isOutsideMonth ? 'O' : 'I'}`)}\r\n\t\t\t\t<div\r\n\t\t\t\t\tclass=\"day-cell\"\r\n\t\t\t\t\tclass:day-cell--outside={cell.isOutsideMonth}\r\n\t\t\t\t\tclass:day-cell--today={cell.isToday}\r\n\t\t\t\t\tclass:day-cell--compressed={compressed}\r\n\t\t\t\t\trole=\"gridcell\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<div class=\"day-num\">{cell.day}</div>\r\n\t\t\t\t\t{#each cell.groupedEvents as g (g.event.eventID)}\r\n\t\t\t\t\t\t{@const { pillEvents, ...card } = toEventCardProps(g, labels)}\r\n\t\t\t\t\t\t<EventCard\r\n\t\t\t\t\t\t\t{...card}\r\n\t\t\t\t\t\t\tlayout=\"micro\"\r\n\t\t\t\t\t\t\tdensity=\"micro\"\r\n\t\t\t\t\t\t\thideDate\r\n\t\t\t\t\t\t\tplaceholderImage={PLACEHOLDER_IMAGE}\r\n\t\t\t\t\t\t\tonclick={() => oneventClick?.(g.event)}\r\n\t\t\t\t\t\t\tonpillclick={(i) => oneventClick?.(pillEvents[i] ?? g.event)}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t{/each}\r\n\t\t\t\t</div>\r\n\t\t\t{/each}\r\n\t\t</div>\r\n\t{/snippet}\r\n</div>\r\n\r\n<!-- MOBILE + TABLET: mini calendar + selected-day events list below\r\n (everything below lg). Cells stay tappable, no truncation. -->\r\n<!-- svelte-ignore a11y_no_static_element_interactions -->\r\n<div\r\n\tclass=\"lg:hidden calendar-swipe-host\"\r\n\tbind:this={gridWrapperMobile}\r\n\tontouchstart={handleTouchStart}\r\n\tontouchmove={handleTouchMove}\r\n\tontouchend={handleTouchEnd}\r\n\tontouchcancel={handleTouchEnd}\r\n\tonkeydown={handleGridKeydown}\r\n>\r\n\t<div class=\"dow-row\" aria-hidden=\"true\">\r\n\t\t{#each weekdayLabels as label, i (i)}\r\n\t\t\t<div class=\"dow-cell\">{label.narrow}</div>\r\n\t\t{/each}\r\n\t</div>\r\n\t<div class=\"swipe-viewport\">\r\n\t\t<div\r\n\t\t\tclass=\"swipe-track\"\r\n\t\t\tclass:swipe-track--swiping={isSwiping}\r\n\t\t\tclass:swipe-track--snapping={isSnapping}\r\n\t\t\tstyle:transform=\"translate3d(calc(-100% / 3 + {swipeOffset}px), 0, 0)\"\r\n\t\t>\r\n\t\t\t{@render monthPageMini(prevCells, 'prev')}\r\n\t\t\t{@render monthPageMini(cells, monthLabel)}\r\n\t\t\t{@render monthPageMini(nextCells, 'next')}\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t{#snippet monthPageMini(pageCells, ariaLabel)}\r\n\t\t<div class=\"mini-grid\" role=\"grid\" aria-label={ariaLabel}>\r\n\t\t\t{#each pageCells as cell (`${cell.date}|${cell.isOutsideMonth ? 'O' : 'I'}`)}\r\n\t\t\t\t{@const hasEvents = cell.groupedEvents.length > 0}\r\n\t\t\t\t{@const isSelected = cell.date === selectedDate}\r\n\t\t\t\t<button\r\n\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\tclass=\"mini-cell\"\r\n\t\t\t\t\tclass:mini-cell--outside={cell.isOutsideMonth}\r\n\t\t\t\t\tclass:mini-cell--selected={isSelected}\r\n\t\t\t\t\tclass:mini-cell--has-events={hasEvents}\r\n\t\t\t\t\tonclick={hasEvents\r\n\t\t\t\t\t\t? () => {\r\n\t\t\t\t\t\t\t\tselectedDate = cell.date;\r\n\t\t\t\t\t\t\t\tfocusedDate = cell.date;\r\n\t\t\t\t\t\t\t\tondaySelect?.({ date: cell.date, events: cell.groupedEvents });\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t: undefined}\r\n\t\t\t\t\tdisabled={!hasEvents}\r\n\t\t\t\t\ttabindex={focusedDate === cell.date ? 0 : -1}\r\n\t\t\t\t\tdata-cell-date={cell.date}\r\n\t\t\t\t\taria-label=\"{cell.day} {hasEvents\r\n\t\t\t\t\t\t? `· ${cell.groupedEvents.length} event${cell.groupedEvents.length === 1 ? '' : 's'}`\r\n\t\t\t\t\t\t: ''}\"\r\n\t\t\t\t\taria-pressed={isSelected}\r\n\t\t\t\t>\r\n\t\t\t\t\t<span class=\"mini-day\">{cell.day}</span>\r\n\t\t\t\t</button>\r\n\t\t\t{/each}\r\n\t\t</div>\r\n\t{/snippet}\r\n\r\n\t<div class=\"mt-4\">\r\n\t\t{#if selectedEvents.length > 0}\r\n\t\t\t<Grid cols=\"1\" gap=\"2\" as=\"ul\">\r\n\t\t\t\t{#each selectedEvents as g (g.event.eventID)}\r\n\t\t\t\t\t{@const { pillEvents, ...card } = toEventCardProps(g, labels)}\r\n\t\t\t\t\t<li class=\"list-none\">\r\n\t\t\t\t\t\t<EventCard\r\n\t\t\t\t\t\t\t{...card}\r\n\t\t\t\t\t\t\tlayout=\"horizontal\"\r\n\t\t\t\t\t\t\tdensity=\"compact\"\r\n\t\t\t\t\t\t\thideDate\r\n\t\t\t\t\t\t\tplaceholderImage={PLACEHOLDER_IMAGE}\r\n\t\t\t\t\t\t\tonclick={() => oneventClick?.(g.event)}\r\n\t\t\t\t\t\t\tonpillclick={(i) => oneventClick?.(pillEvents[i] ?? g.event)}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</li>\r\n\t\t\t\t{/each}\r\n\t\t\t</Grid>\r\n\t\t{/if}\r\n\t</div>\r\n</div>\r\n\r\n<style>\r\n\t/* Swipe host — owns the touch handlers and clips its child grids so the\r\n\t * sliding-out month doesn't bleed past the viewport. */\r\n\t.calendar-swipe-host {\r\n\t\toverflow-x: hidden;\r\n\t\ttouch-action: pan-y; /* vertical page scroll; horizontal goes to JS */\r\n\t}\r\n\r\n\t/* 3-page slide track: prev / current / next rendered side by side in a\r\n\t * flex row 3x the viewport wide. Track at translateX(-100%/3) shows the\r\n\t * middle (current) page. Commit animates to 0 (prev) or -200% (next),\r\n\t * then snaps back to -100%/3 with no transition AND advances the month. */\r\n\t.swipe-viewport {\r\n\t\toverflow: hidden;\r\n\t\twidth: 100%;\r\n\t}\r\n\t.swipe-track {\r\n\t\tdisplay: flex;\r\n\t\twidth: 300%;\r\n\t\twill-change: transform;\r\n\t\ttransition: transform 320ms cubic-bezier(0.32, 0.72, 0, 1);\r\n\t}\r\n\t.swipe-track > :global(.month-grid),\r\n\t.swipe-track > :global(.mini-grid) {\r\n\t\tflex: 0 0 33.333%;\r\n\t\tmin-width: 0;\r\n\t}\r\n\t.swipe-track--swiping {\r\n\t\ttransition: none;\r\n\t}\r\n\t.swipe-track--snapping {\r\n\t\ttransition: none;\r\n\t}\r\n\r\n\t@media (prefers-reduced-motion: reduce) {\r\n\t\t.swipe-track {\r\n\t\t\ttransition: none;\r\n\t\t}\r\n\t}\r\n\r\n\t.dow-row {\r\n\t\tdisplay: grid;\r\n\t\tgrid-template-columns: repeat(7, 1fr);\r\n\t\tgap: 0.25rem;\r\n\t\tpadding-bottom: 0.5rem;\r\n\t}\r\n\t.dow-cell {\r\n\t\tfont-size: 0.6875rem;\r\n\t\tfont-weight: 700;\r\n\t\ttext-transform: uppercase;\r\n\t\tletter-spacing: 0.06em;\r\n\t\tcolor: hsl(var(--text-tertiary));\r\n\t\ttext-align: center;\r\n\t\tpadding: 0.25rem 0;\r\n\t}\r\n\r\n\t/* === DESKTOP: full grid with events inline === */\r\n\t.month-grid {\r\n\t\tdisplay: grid;\r\n\t\tgrid-template-columns: repeat(7, 1fr);\r\n\t\t/* `align-content: start` stops grid rows from being row-equalised when\r\n\t\t * the flex parent (.swipe-track) stretches each month-grid to the\r\n\t\t * tallest sibling — otherwise .day-cell--compressed has no effect. */\r\n\t\talign-content: start;\r\n\t\tgap: 0.375rem;\r\n\t\tborder: 1px solid hsl(var(--border));\r\n\t\tborder-radius: 0.5rem;\r\n\t\tpadding: 0.375rem;\r\n\t\tbackground: hsl(var(--bg-primary));\r\n\t}\r\n\r\n\t.day-cell {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t\tgap: 0.25rem;\r\n\t\tmin-height: 6rem;\r\n\t\tpadding: 0.375rem;\r\n\t\tborder-radius: 0.375rem;\r\n\t\tbackground: hsl(var(--bg-secondary));\r\n\t}\r\n\r\n\t.day-cell--outside {\r\n\t\topacity: 0.5;\r\n\t}\r\n\r\n\t.day-cell--today .day-num {\r\n\t\tcolor: hsl(var(--brand-primary));\r\n\t\tfont-weight: 700;\r\n\t}\r\n\r\n\t.day-num {\r\n\t\tfont-size: 0.75rem;\r\n\t\tfont-weight: 600;\r\n\t\tcolor: hsl(var(--text-secondary));\r\n\t\ttext-align: right;\r\n\t\tpadding-right: 0.25rem;\r\n\t}\r\n\r\n\t@media (min-width: 1024px) {\r\n\t\t.day-cell {\r\n\t\t\tmin-height: 8rem;\r\n\t\t}\r\n\t}\r\n\r\n\t.day-cell--compressed,\r\n\t.day-cell--compressed:where(*) {\r\n\t\tmin-height: 0;\r\n\t\tpadding: 0.125rem 0.375rem;\r\n\t\tbackground: transparent;\r\n\t\topacity: 0.5;\r\n\t}\r\n\t.day-cell--compressed .day-num {\r\n\t\tpadding-right: 0;\r\n\t}\r\n\r\n\t/* === MOBILE: mini grid (numbers, tap-to-select) === */\r\n\t.mini-grid {\r\n\t\tdisplay: grid;\r\n\t\tgrid-template-columns: repeat(7, 1fr);\r\n\t\tgap: 0.125rem;\r\n\t\tborder: 1px solid hsl(var(--border));\r\n\t\tborder-radius: 0.5rem;\r\n\t\tpadding: 0.25rem;\r\n\t\tbackground: hsl(var(--bg-primary));\r\n\t}\r\n\r\n\t.mini-cell {\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\theight: 2.5rem;\r\n\t\tpadding: 0.125rem;\r\n\t\tborder-radius: 0.375rem;\r\n\t\tbackground: transparent;\r\n\t\tborder: 0;\r\n\t\tcursor: pointer;\r\n\t\tcolor: hsl(var(--text-primary));\r\n\t\tfont-size: 0.875rem;\r\n\t\tfont-weight: 500;\r\n\t\ttransition: background-color 0.12s ease;\r\n\t}\r\n\r\n\t.mini-cell--outside {\r\n\t\topacity: 0.5;\r\n\t}\r\n\r\n\t.mini-cell--has-events {\r\n\t\tbackground: color-mix(in srgb, hsl(var(--brand-primary)) 12%, transparent);\r\n\t\tfont-weight: 600;\r\n\t}\r\n\r\n\t.mini-cell--has-events:active {\r\n\t\tbackground: color-mix(in srgb, hsl(var(--brand-primary)) 18%, transparent);\r\n\t}\r\n\r\n\t.mini-cell--selected,\r\n\t.mini-cell--selected.mini-cell--has-events {\r\n\t\tbackground: hsl(var(--brand-primary));\r\n\t\tcolor: white;\r\n\t\tfont-weight: 700;\r\n\t}\r\n\r\n\t.mini-day {\r\n\t\tline-height: 1;\r\n\t}\r\n</style>\r\n","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M17 15L17 8 15 8 15 15 8 15 8 17 15 17 15 24 17 24 17 17 24 17 24 15z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M21.7788,8a11.4843,11.4843,0,0,0-3.0547.5342,14.5665,14.5665,0,0,1-1.8225.4126A6.0054,6.0054,0,0,0,11,4V6a3.9933,3.9933,0,0,1,3.8267,2.9c-.5181-.0879-1.0569-.2207-1.6172-.3648A12.89,12.89,0,0,0,10.0317,8C6.311,8,4,11.0652,4,16c0,7.51,4.0679,11.999,8.0005,12h.0015a7.1576,7.1576,0,0,0,2.49-.59A5.0128,5.0128,0,0,1,16,27a5.0266,5.0266,0,0,1,1.5112.41A7.15,7.15,0,0,0,20,28h0c3.9307-.001,8-4.49,8-12C28,12.3094,26.3706,8,21.7788,8ZM20,26h0a5.5038,5.5038,0,0,1-1.7905-.4639A6.4168,6.4168,0,0,0,16,25a6.4043,6.4043,0,0,0-2.2061.5361A5.5343,5.5343,0,0,1,12,26h.0015C9.0513,25.9988,6,22.2586,6,16c0-1.8037.3931-6,4.0317-6a11.2363,11.2363,0,0,1,2.6807.4726A12.9819,12.9819,0,0,0,15.7612,11h.4922a11.7955,11.7955,0,0,0,2.9956-.5361A9.8483,9.8483,0,0,1,21.7788,10C25.7964,10,26,14.9978,26,16,26,22.2586,22.9482,25.9988,20,26Z\"></path><path d=\"M18,7H17V6a2.0021,2.0021,0,0,1,2-2h1V5A2.0021,2.0021,0,0,1,18,7Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M14 26L15.41 24.59 7.83 17 28 17 28 15 7.83 15 15.41 7.41 14 6 4 16 14 26z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M26,4h-4V2h-2v2h-8V2h-2v2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V6C28,4.9,27.1,4,26,4z M26,26H6V12h20\tV26z M26,10H6V6h4v2h2V6h8v2h2V6h4V10z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M13 24L4 15 5.414 13.586 13 21.171 26.586 7.586 28 9 13 24z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M16 22L6 12 7.4 10.6 16 19.2 24.6 10.6 26 12z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M10 16L20 6 21.4 7.4 12.8 16 21.4 24.6 20 26z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M17.4141 16L24 9.4141 22.5859 8 16 14.5859 9.4143 8 8 9.4141 14.5859 16 8 22.5859 9.4143 24 16 17.4141 22.5859 24 24 22.5859 17.4141 16z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M28,6H4A2,2,0,0,0,2,8V24a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V8A2,2,0,0,0,28,6ZM25.8,8,16,14.78,6.2,8ZM4,24V8.91l11.43,7.91a1,1,0,0,0,1.14,0L28,8.91V24Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path fill=\"none\" d=\"M14.9 7.2H17.1V24.799H14.9z\" data-icon-path=\"inner-path\" transform=\"rotate(-45 16 16)\"></path><path d=\"M16,2A13.914,13.914,0,0,0,2,16,13.914,13.914,0,0,0,16,30,13.914,13.914,0,0,0,30,16,13.914,13.914,0,0,0,16,2Zm5.4449,21L9,10.5557,10.5557,9,23,21.4448Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M24.832,16.9688c-.2724-.6465-.5815-1.38-.8833-2.2852-.79-2.3682,1.7344-4.9522,1.7583-4.9766L24.293,8.293c-.1407.1406-3.4234,3.4775-2.2417,7.0234.3261.978.6513,1.749.938,2.43A9.3812,9.3812,0,0,1,24,22a6.24,6.24,0,0,1-4.1892,5.293,8.52,8.52,0,0,0-2.1038-8l-1.0444-1.0445-.5815,1.3575C14.2449,23.89,12.06,25.76,10.7747,26.54A5.8437,5.8437,0,0,1,8,22a9.6239,9.6239,0,0,1,.9287-3.6289A11.3329,11.3329,0,0,0,10,14V12.2217c.8735.36,2,1.3037,2,3.7783v2.6035l1.7432-1.9341c3.1118-3.4546,2.4624-7.5678,1.206-10.3081A4.4859,4.4859,0,0,1,18,11h2c0-5.5371-4.5786-7-7-7H11l1.1992,1.5986c.1377.1856,2.8628,3.9278,1.3535,7.688A4.9426,4.9426,0,0,0,9,10H8v4a9.6239,9.6239,0,0,1-.9287,3.6289A11.3329,11.3329,0,0,0,6,22c0,3.8477,3.8232,8,10,8s10-4.1523,10-8A11.3771,11.3771,0,0,0,24.832,16.9688ZM12.8352,27.5264a16.4987,16.4987,0,0,0,4.3665-5.5987,6.1053,6.1053,0,0,1,.2573,5.9717A11.3213,11.3213,0,0,1,16,28,10.3278,10.3278,0,0,1,12.8352,27.5264Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M26,10H23.2383A4.4867,4.4867,0,0,0,16,4.7065,4.4873,4.4873,0,0,0,8.7617,10H6a2.0025,2.0025,0,0,0-2,2v4a2.0025,2.0025,0,0,0,2,2V28a2.0025,2.0025,0,0,0,2,2H24a2.0025,2.0025,0,0,0,2-2V18a2.0025,2.0025,0,0,0,2-2V12A2.0025,2.0025,0,0,0,26,10ZM17,7.5A2.5,2.5,0,1,1,19.5,10H17ZM12.5,5A2.503,2.503,0,0,1,15,7.5V10H12.5a2.5,2.5,0,0,1,0-5ZM6,12h9v4H6Zm2,6h7V28H8ZM24.0012,28H17V18h7ZM17,16V12h9l.0012,4Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M16,2A14,14,0,1,0,30,16,14,14,0,0,0,16,2Zm0,26A12,12,0,1,1,28,16,12,12,0,0,1,16,28Z\"></path><circle cx=\"16\" cy=\"23.5\" r=\"1.5\"></circle><path d=\"M17,8H15.5A4.49,4.49,0,0,0,11,12.5V13h2v-.5A2.5,2.5,0,0,1,15.5,10H17a2.5,2.5,0,0,1,0,5H15v4.5h2V17a4.5,4.5,0,0,0,0-9Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M17 22L17 14 13 14 13 16 15 16 15 22 12 22 12 24 20 24 20 22 17 22zM16 8a1.5 1.5 0 101.5 1.5A1.5 1.5 0 0016 8z\"></path><path d=\"M16,30A14,14,0,1,1,30,16,14,14,0,0,1,16,30ZM16,4A12,12,0,1,0,28,16,12,12,0,0,0,16,4Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M16,18a5,5,0,1,1,5-5A5.0057,5.0057,0,0,1,16,18Zm0-8a3,3,0,1,0,3,3A3.0033,3.0033,0,0,0,16,10Z\"></path><path d=\"M16,30,7.5645,20.0513c-.0479-.0571-.3482-.4515-.3482-.4515A10.8888,10.8888,0,0,1,5,13a11,11,0,0,1,22,0,10.8844,10.8844,0,0,1-2.2148,6.5973l-.0015.0025s-.3.3944-.3447.4474ZM8.8125,18.395c.001.0007.2334.3082.2866.3744L16,26.9079l6.91-8.15c.0439-.0552.2783-.3649.2788-.3657A8.901,8.901,0,0,0,25,13,9,9,0,1,0,7,13a8.9054,8.9054,0,0,0,1.8125,5.395Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M16,2A11.0134,11.0134,0,0,0,5,13a10.8885,10.8885,0,0,0,2.2163,6.6s.3.3945.3482.4517L16,30l8.439-9.9526c.0444-.0533.3447-.4478.3447-.4478l.0015-.0024A10.8846,10.8846,0,0,0,27,13,11.0134,11.0134,0,0,0,16,2Zm0,15a4,4,0,1,1,4-4A4.0045,4.0045,0,0,1,16,17Z\"></path><circle cx=\"16\" cy=\"13\" r=\"4\" fill=\"none\"></circle>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M24,14H22V8A6,6,0,0,0,10,8v6H8a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H24a2,2,0,0,0,2-2V16A2,2,0,0,0,24,14ZM12,8a4,4,0,0,1,8,0v6H12ZM24,28H8V16H24Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M29,27.5859l-7.5521-7.5521a11.0177,11.0177,0,1,0-1.4141,1.4141L27.5859,29ZM4,13a9,9,0,1,1,9,9A9.01,9.01,0,0,1,4,13Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M23,20a5,5,0,0,0-3.89,1.89L11.8,17.32a4.46,4.46,0,0,0,0-2.64l7.31-4.57A5,5,0,1,0,18,7a4.79,4.79,0,0,0,.2,1.32l-7.31,4.57a5,5,0,1,0,0,6.22l7.31,4.57A4.79,4.79,0,0,0,18,25a5,5,0,1,0,5-5ZM23,4a3,3,0,1,1-3,3A3,3,0,0,1,23,4ZM7,19a3,3,0,1,1,3-3A3,3,0,0,1,7,19Zm16,9a3,3,0,1,1,3-3A3,3,0,0,1,23,28Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M8 15H24V17H8z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M20 25a6.9908 6.9908 0 01-5.833-3.1287l1.666-1.1074a5.0007 5.0007 0 008.334 0l1.666 1.1074A6.9908 6.9908 0 0120 25zM24 14a2 2 0 102 2A1.9806 1.9806 0 0024 14zM16 14a2 2 0 102 2A1.9806 1.9806 0 0016 14z\"></path><path d=\"M28,8H22V4a2.0023,2.0023,0,0,0-2-2H4A2.0023,2.0023,0,0,0,2,4V14a10.01,10.01,0,0,0,8.8027,9.9214A9.9989,9.9989,0,0,0,30,20V10A2.0023,2.0023,0,0,0,28,8ZM4,14V4H20V8H12a2.0023,2.0023,0,0,0-2,2V20a9.9628,9.9628,0,0,0,.168,1.78A8.0081,8.0081,0,0,1,4,14Zm24,6a8,8,0,0,1-16,0V10H28Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M16,30A14,14,0,1,1,30,16,14,14,0,0,1,16,30ZM16,4A12,12,0,1,0,28,16,12,12,0,0,0,16,4Z\"></path><path d=\"M20.59 22L15 16.41 15 7 17 7 17 15.58 22 20.59 20.59 22z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M16 4a5 5 0 11-5 5 5 5 0 015-5m0-2a7 7 0 107 7A7 7 0 0016 2zM26 30H24V25a5 5 0 00-5-5H13a5 5 0 00-5 5v5H6V25a7 7 0 017-7h6a7 7 0 017 7z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M16,2A14,14,0,1,0,30,16,14,14,0,0,0,16,2Zm0,26A12,12,0,1,1,28,16,12,12,0,0,1,16,28Z\"></path><path d=\"M15 8H17V19H15zM16 22a1.5 1.5 0 101.5 1.5A1.5 1.5 0 0016 22z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M16,2C8.3,2,2,8.3,2,16s6.3,14,14,14s14-6.3,14-14C30,8.3,23.7,2,16,2z M14.9,8h2.2v11h-2.2V8z M16,25\tc-0.8,0-1.5-0.7-1.5-1.5S15.2,22,16,22c0.8,0,1.5,0.7,1.5,1.5S16.8,25,16,25z\"></path><path fill=\"none\" d=\"M17.5,23.5c0,0.8-0.7,1.5-1.5,1.5c-0.8,0-1.5-0.7-1.5-1.5S15.2,22,16,22\tC16.8,22,17.5,22.7,17.5,23.5z M17.1,8h-2.2v11h2.2V8z\" data-icon-path=\"inner-path\" opacity=\"0\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <circle cx=\"16\" cy=\"25\" r=\"2\"></circle><path d=\"M30 3.4141L28.5859 2 2 28.5859 3.4141 30 14.0962 19.3179a5.9359 5.9359 0 016.01 1.3193L21.52 19.2236a7.9669 7.9669 0 00-5.125-2.2041l3.3875-3.3877a11.9908 11.9908 0 014.5647 2.7647L25.76 14.9829A13.975 13.975 0 0021.334 12.08L24.3308 9.083a17.9364 17.9364 0 014.2546 3.0747L30 10.7432v-.002a20.02 20.02 0 00-4.1895-3.1377zM14.68 13.0776l2.0415-2.0415C16.481 11.0234 16.2437 11 16 11a13.9447 13.9447 0 00-9.771 3.9927l1.4136 1.4136A11.97 11.97 0 0114.68 13.0776zM16 7a17.87 17.87 0 014.2324.5254L21.875 5.8828A19.9537 19.9537 0 002 10.7412v.0225L3.4043 12.168A17.9193 17.9193 0 0116 7z\"></path>\n</svg>","<!-- native-element-exception: VC is an embeddable widget — native <button>s are intentional here (widget-controlled styling on calendar cells, date selectors, checkout/nav CTAs). -->\r\n<script>\r\n import { Input, Button } from '@getmicdrop/svelte-components';\r\n import { ChevronDown, Search } from 'carbon-icons-svelte';\r\n\r\n /** @type {{\r\n * viewOptions?: any[];\r\n * selectedView?: string;\r\n * onViewChange?: (v: string) => void;\r\n * onsearch?: (detail: { query: string }) => void;\r\n * labels?: Record<string, string>;\r\n * }} */\r\n let {\r\n viewOptions = [],\r\n selectedView = '',\r\n onViewChange = () => {},\r\n onsearch = () => {},\r\n labels = {},\r\n } = $props();\r\n\r\n let dropdownOpen = $state(false);\r\n let dropdownRef = $state(null);\r\n\r\n function toggleDropdown() {\r\n dropdownOpen = !dropdownOpen;\r\n }\r\n\r\n function selectView(option) {\r\n onViewChange(option);\r\n dropdownOpen = false;\r\n }\r\n\r\n function handleSearch(event) {\r\n onsearch?.({ query: event.detail.query });\r\n }\r\n\r\n function handleClickOutside(event) {\r\n if (dropdownRef && !dropdownRef.contains(event.target)) {\r\n dropdownOpen = false;\r\n }\r\n }\r\n\r\n // Get selected view label\r\n let selectedLabel = $derived(\r\n viewOptions.find(opt => opt.id === selectedView)?.text || 'Calendar'\r\n );\r\n</script>\r\n\r\n<svelte:window onclick={handleClickOutside} />\r\n\r\n<div class=\"flex flex-col sm:flex-row sm:items-center gap-3\">\r\n <!-- Search input - full width on mobile, flex-1 on desktop -->\r\n <div class=\"flex-1 min-w-0\">\r\n <Input\r\n size=\"md\"\r\n type=\"text\"\r\n placeholder={labels.searchPlaceholder || 'Search for events'}\r\n class=\"w-full\"\r\n instantSearch\r\n debounceMs={300}\r\n minSearchChars={0}\r\n showClearButton\r\n {onsearch}\r\n >\r\n <Search slot=\"leftIcon\" size={16} />\r\n </Input>\r\n </div>\r\n\r\n <!-- View selector dropdown -->\r\n {#if viewOptions.length > 0}\r\n <div class=\"relative shrink-0\" bind:this={dropdownRef}>\r\n <Button\r\n variant=\"alternative\"\r\n size=\"md\"\r\n onclick={toggleDropdown}\r\n class=\"min-w-32 justify-between border border-border rounded-lg\"\r\n >\r\n <span class=\"text-sm font-medium\">{selectedLabel}</span>\r\n <ChevronDown class=\"w-4 h-4 ml-2 shrink-0\" />\r\n </Button>\r\n\r\n {#if dropdownOpen}\r\n <div\r\n class=\"absolute top-full right-0 mt-1 w-32 bg-card border border-border rounded-lg shadow-lg py-1 z-50\"\r\n >\r\n {#each viewOptions as option}\r\n <button\r\n type=\"button\"\r\n class=\"w-full text-left px-3 py-2 text-sm text-text-primary hover:bg-bg-secondary transition-colors\"\r\n class:bg-bg-secondary={option.id === selectedView}\r\n class:font-medium={option.id === selectedView}\r\n onclick={() => selectView(option)}\r\n >\r\n {option.text}\r\n </button>\r\n {/each}\r\n </div>\r\n {/if}\r\n </div>\r\n {/if}\r\n</div>","/**\r\n * Browse Widgets — BrowseEvent Adapter\r\n * Converts CalendarContainer event format (from transformEventData in api.js)\r\n * to BrowseEvent[] used by premium browse widgets.\r\n *\r\n * Loosely coupled: operates on the output shape of transformEventData,\r\n * does NOT import transformEventData directly.\r\n */\r\n\r\nimport type { BrowseEvent, EventStatus } from './types';\r\n\r\n/**\r\n * Map a CalendarContainer status string to BrowseEvent's EventStatus.\r\n *\r\n * Handles case variations and the isSoldOut override:\r\n * if the event's isSoldOut flag is true and the derived status would be 'on_sale',\r\n * the result is overridden to 'sold_out'.\r\n */\r\nexport function mapCalendarStatusToBrowseStatus(status: string, isSoldOut: boolean): EventStatus {\r\n\tconst normalized = (status || '').toLowerCase().replace(/\\s+/g, '_');\r\n\r\n\tlet mapped: EventStatus;\r\n\r\n\tswitch (normalized) {\r\n\t\tcase 'on_sale':\r\n\t\t\tmapped = 'on_sale';\r\n\t\t\tbreak;\r\n\t\tcase 'sold_out':\r\n\t\tcase 'soldout':\r\n\t\t\tmapped = 'sold_out';\r\n\t\t\tbreak;\r\n\t\tcase 'coming_soon':\r\n\t\tcase 'comingsoon':\r\n\t\t\tmapped = 'coming_soon';\r\n\t\t\tbreak;\r\n\t\tcase 'sales_ended':\r\n\t\tcase 'salesended':\r\n\t\t\tmapped = 'sales_ended';\r\n\t\t\tbreak;\r\n\t\tcase 'cancelled':\r\n\t\tcase 'canceled':\r\n\t\t\tmapped = 'cancelled';\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tmapped = 'on_sale';\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\t// Override: isSoldOut flag takes precedence over 'on_sale'\r\n\tif (isSoldOut && mapped === 'on_sale') {\r\n\t\treturn 'sold_out';\r\n\t}\r\n\r\n\treturn mapped;\r\n}\r\n\r\n/**\r\n * Convert an array of CalendarContainer events (as produced by transformEventData)\r\n * into BrowseEvent[] for consumption by browse widgets.\r\n *\r\n * Events with falsy `id` are filtered out as a defensive guard.\r\n */\r\nexport function adaptToBrowseEvents(calendarEvents: any[]): BrowseEvent[] {\r\n\tif (!Array.isArray(calendarEvents)) return [];\r\n\r\n\treturn calendarEvents\r\n\t\t.filter((event) => !!event.id)\r\n\t\t.map((event) => ({\r\n\t\t\teventID: event.id,\r\n\t\t\tname: event.name,\r\n\t\t\tdate: event.date,\r\n\t\t\tstartDateTime: event.startDateTime || '',\r\n\t\t\tendDateTime: event.endDateTime || undefined,\r\n\t\t\timageUrl: event.image,\r\n\t\t\tstatus: mapCalendarStatusToBrowseStatus(event.status, event.isSoldOut || false),\r\n\t\t\teventSeriesId: event.eventSeriesId || undefined,\r\n\t\t\tticketsRemaining: event.ticketsRemaining,\r\n\t\t\tticketsTotal: event.ticketsTotal,\r\n\t\t\tdescription: event.description || undefined,\r\n\t\t\ttimeZone: event.timeZone || event.timezone || undefined,\r\n\t\t\tslug: event.slug || undefined,\r\n\t\t\tvenueName: event.venueName || undefined,\r\n\t\t\tvenueAddress: event.venueAddress || undefined\r\n\t\t}));\r\n}\r\n","<script lang=\"ts\">\r\n\t/**\r\n\t * ListView — v2 browse view. Groups events by date with a left date rail;\r\n\t * each date stacks its events as horizontal EventCards. Series with multiple\r\n\t * showtimes on the same day bundle into one card with clickable time pills.\r\n\t *\r\n\t * Thin arranger: groups events, maps each to EventCard props via\r\n\t * toEventCardProps, renders horizontal/compact cards under a shared date rail.\r\n\t */\r\n\timport { EventCard } from \"@getmicdrop/svelte-components\";\r\n\timport { filterTodayAndFuture } from \"$lib/utils/browse-status.js\";\r\n\timport { groupEventsBySeries } from \"$lib/browse-widgets/utils\";\r\n\timport { getDateParts } from \"$lib/utils/datetime.js\";\r\n\timport { toEventCardProps } from \"$lib/browse-widgets/to-event-card-props\";\r\n\timport type { BrowseEvent, GroupedEvent } from \"$lib/browse-widgets/types\";\r\n\r\n\tinterface Props {\r\n\t\tevents?: BrowseEvent[];\r\n\t\toneventClick?: (event: BrowseEvent) => void;\r\n\t\tlabels?: Record<string, string>;\r\n\t\t/** Show the left date rail. False for the calendar's selected-day\r\n\t\t * drilldown, where the section header already states the date. */\r\n\t\tshowDateColumn?: boolean;\r\n\t\t/** Filter to today+future. False for the calendar selected-day list so\r\n\t\t * a past day still shows its events instead of the empty state. */\r\n\t\tfilterFutureOnly?: boolean;\r\n\t\t/** Accepted for API compatibility; this view renders all events. */\r\n\t\tinitialCount?: number;\r\n\t}\r\n\r\n\tlet {\r\n\t\tevents = [],\r\n\t\toneventClick,\r\n\t\tlabels = {},\r\n\t\tshowDateColumn = true,\r\n\t\tfilterFutureOnly = true,\r\n\t\tinitialCount,\r\n\t}: Props = $props();\r\n\r\n\tinterface DateGroup {\r\n\t\tdate: string;\r\n\t\trail: { month: string; day: string; weekday: string };\r\n\t\titems: GroupedEvent[];\r\n\t}\r\n\r\n\tfunction formatRail(e: BrowseEvent) {\r\n\t\tif (!e?.startDateTime) return { month: \"\", day: \"\", weekday: \"\" };\r\n\t\tconst p = getDateParts(e.startDateTime, e.timeZone);\r\n\t\treturn {\r\n\t\t\tmonth: p.month.toUpperCase(),\r\n\t\t\tday: String(p.date).padStart(2, \"0\"),\r\n\t\t\tweekday: p.day.toUpperCase(),\r\n\t\t};\r\n\t}\r\n\r\n\t// Filter future, group by series, then group by date so multi-event days\r\n\t// stack under a single date rail.\r\n\tlet groupedByDate: DateGroup[] = $derived.by(() => {\r\n\t\tconst visible = filterFutureOnly ? filterTodayAndFuture(events) : events;\r\n\t\tconst grouped = groupEventsBySeries(visible);\r\n\t\tconst byDate = new Map<string, GroupedEvent[]>();\r\n\t\tfor (const g of grouped) {\r\n\t\t\tconst k = g.event.date;\r\n\t\t\tif (!byDate.has(k)) byDate.set(k, []);\r\n\t\t\tbyDate.get(k)!.push(g);\r\n\t\t}\r\n\t\treturn [...byDate.entries()]\r\n\t\t\t.sort(([a], [b]) => a.localeCompare(b))\r\n\t\t\t.map(([date, items]) => ({\r\n\t\t\t\tdate,\r\n\t\t\t\trail: formatRail(items[0].event),\r\n\t\t\t\titems,\r\n\t\t\t}));\r\n\t});\r\n</script>\r\n\r\n<div class=\"max-w-5xl mx-auto py-4 sm:px-4 sm:py-6 lg:px-8 lg:py-8\">\r\n\t<ul class=\"date-list\" class:no-date-column={!showDateColumn}>\r\n\t\t{#each groupedByDate as group (group.date)}\r\n\t\t\t<li class=\"list-none date-group\">\r\n\t\t\t\t{#if showDateColumn}\r\n\t\t\t\t\t<div class=\"date-rail\" aria-hidden=\"true\">\r\n\t\t\t\t\t\t<span class=\"date-rail__month\">{group.rail.month}</span>\r\n\t\t\t\t\t\t<span class=\"date-rail__day\">{group.rail.day}</span>\r\n\t\t\t\t\t\t<span class=\"date-rail__weekday\">{group.rail.weekday}</span>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t{/if}\r\n\t\t\t\t<div class=\"date-group__items\">\r\n\t\t\t\t\t{#each group.items as g (g.event.eventID)}\r\n\t\t\t\t\t\t{@const { pillEvents, ...card } = toEventCardProps(g, labels)}\r\n\t\t\t\t\t\t<EventCard\r\n\t\t\t\t\t\t\t{...card}\r\n\t\t\t\t\t\t\tlayout=\"horizontal\"\r\n\t\t\t\t\t\t\tdensity=\"compact\"\r\n\t\t\t\t\t\t\thideDate\r\n\t\t\t\t\t\t\tshowDescription\r\n\t\t\t\t\t\t\tonclick={() => oneventClick?.(g.event)}\r\n\t\t\t\t\t\t\tonpillclick={(i) => oneventClick?.(pillEvents[i] ?? g.event)}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t{/each}\r\n\t\t\t\t</div>\r\n\t\t\t</li>\r\n\t\t{/each}\r\n\t</ul>\r\n\r\n\t{#if groupedByDate.length === 0}\r\n\t\t<div class=\"text-center py-8 text-text-secondary\">\r\n\t\t\t{labels.noUpcomingEvents || \"No upcoming events yet.\"}\r\n\t\t</div>\r\n\t{/if}\r\n</div>\r\n\r\n<style>\r\n\t/* Between-card vertical rhythm sits one step tighter than in-card padding\r\n\t * so adjacent cards visually group. EventCard horizontal padding scales\r\n\t * 8/12/16 (mobile/tablet/desktop); between-card scales 4/8/12. */\r\n\t.date-list {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t\tgap: 0.25rem;\r\n\t\tmargin: 0;\r\n\t\tpadding: 0;\r\n\t\tlist-style: none;\r\n\t}\r\n\r\n\t@media (min-width: 640px) {\r\n\t\t.date-list {\r\n\t\t\tgap: 0.5rem;\r\n\t\t}\r\n\t}\r\n\r\n\t@media (min-width: 1024px) {\r\n\t\t.date-list {\r\n\t\t\tgap: 0.75rem;\r\n\t\t}\r\n\t}\r\n\r\n\t/* Date rail stays on the left at every breakpoint — just narrower on mobile.\r\n\t * Gap matches page horizontal padding 1:1 — keeps the centered digit\r\n\t * equidistant from page edge AND card edge at every breakpoint.\r\n\t * mobile page-pad 0 · gap 0\r\n\t * sm: page-pad 16 · gap 16 (space-4)\r\n\t * lg: page-pad 32 · gap 32 (space-8) */\r\n\t.date-group {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: row;\r\n\t\talign-items: flex-start;\r\n\t\tgap: 0;\r\n\t}\r\n\r\n\t/* No rail (calendar selected-day drilldown): drop the rail gap at every\r\n\t * breakpoint so cards sit flush — higher specificity wins over the\r\n\t * breakpoint gaps below. */\r\n\t.no-date-column .date-group {\r\n\t\tgap: 0;\r\n\t}\r\n\r\n\t@media (min-width: 640px) {\r\n\t\t.date-group {\r\n\t\t\tgap: 1rem;\r\n\t\t}\r\n\t}\r\n\r\n\t@media (min-width: 1024px) {\r\n\t\t.date-group {\r\n\t\t\tgap: 2rem;\r\n\t\t}\r\n\t}\r\n\r\n\t/* Rail: fixed-width column, no horizontal padding (digit centers natively).\r\n\t * mobile width 40 (space-10) · pad-y 8 (space-2)\r\n\t * sm: width 80 (space-20) · pad-y 16 (space-4) */\r\n\t.date-rail {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tflex-shrink: 0;\r\n\t\tpadding: 0.5rem 0;\r\n\t\tmin-width: 2.5rem;\r\n\t\ttext-align: center;\r\n\t}\r\n\r\n\t@media (min-width: 640px) {\r\n\t\t.date-rail {\r\n\t\t\tpadding: 1rem 0;\r\n\t\t\tmin-width: 5rem;\r\n\t\t}\r\n\t}\r\n\r\n\t.date-rail__month {\r\n\t\tfont-size: 0.6875rem;\r\n\t\tfont-weight: 700;\r\n\t\tletter-spacing: 0.06em;\r\n\t\tcolor: var(--color-text-tertiary);\r\n\t}\r\n\r\n\t.date-rail__day {\r\n\t\tfont-size: 1.25rem;\r\n\t\tfont-weight: 700;\r\n\t\tline-height: 1.1;\r\n\t\tcolor: var(--color-text-primary);\r\n\t}\r\n\r\n\t@media (min-width: 640px) {\r\n\t\t.date-rail__day {\r\n\t\t\tfont-size: 2rem;\r\n\t\t}\r\n\t}\r\n\r\n\t.date-rail__weekday {\r\n\t\tfont-size: 0.6875rem;\r\n\t\tfont-weight: 700;\r\n\t\tletter-spacing: 0.06em;\r\n\t\tcolor: var(--color-text-tertiary);\r\n\t\tmargin-top: 0.125rem;\r\n\t}\r\n\r\n\t/* Right column — stack of events for this date. Matches .date-list (4/8/12). */\r\n\t.date-group__items {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t\tgap: 0.25rem;\r\n\t\tflex: 1;\r\n\t\tmin-width: 0;\r\n\t}\r\n\r\n\t@media (min-width: 640px) {\r\n\t\t.date-group__items {\r\n\t\t\tgap: 0.5rem;\r\n\t\t}\r\n\t}\r\n\r\n\t@media (min-width: 1024px) {\r\n\t\t.date-group__items {\r\n\t\t\tgap: 0.75rem;\r\n\t\t}\r\n\t}\r\n</style>\r\n","<script lang=\"ts\">\r\n\t/**\r\n\t * Time Pills — Gallery View\r\n\t * Evolved from GalleryView.svelte. Uses groupEventsBySeries to bundle\r\n\t * same-day series events, then renders GalleryCard for each group.\r\n\t *\r\n\t * Grid: 1 col mobile, 2 col sm (640px), 3 col md (768px), 3 col lg (1024px).\r\n\t * At lg, cards are wider with description visible — so 3 cols instead of 4.\r\n\t * Infinite scroll with IntersectionObserver.\r\n\t */\r\n\timport { onMount, onDestroy } from \"svelte\";\r\n\timport { EventCard } from \"@getmicdrop/svelte-components\";\r\n\timport { filterTodayAndFuture } from \"$lib/utils/browse-status.js\";\r\n\timport { groupEventsBySeries } from \"$lib/browse-widgets/utils\";\r\n\timport { toEventCardProps } from \"$lib/browse-widgets/to-event-card-props\";\r\n\timport type { BrowseEvent } from \"$lib/browse-widgets/types\";\r\n\timport type { GroupedEvent } from \"$lib/browse-widgets/types\";\r\n\r\n\tinterface Props {\r\n\t\tevents?: BrowseEvent[];\r\n\t\tinitialCount?: number;\r\n\t\tloadMoreCount?: number;\r\n\t\toneventClick?: (event: BrowseEvent) => void;\r\n\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet {\r\n\t\tevents = [],\r\n\t\tinitialCount = 12,\r\n\t\tloadMoreCount = 12,\r\n\t\toneventClick,\r\n\t\tlabels = {},\r\n\t}: Props = $props();\r\n\r\n\t/* svelte-ignore state_referenced_locally */\r\n\tlet displayedCount = $state(initialCount);\r\n\tlet loadMoreTrigger = $state<HTMLDivElement | null>(null);\r\n\tlet observer: IntersectionObserver | undefined;\r\n\r\n\t// Filter to today and future, then group by series+date\r\n\tlet futureEvents = $derived(filterTodayAndFuture(events));\r\n\tlet groupedEvents: GroupedEvent[] = $derived(groupEventsBySeries(futureEvents));\r\n\tlet displayedGroups = $derived(groupedEvents.slice(0, displayedCount));\r\n\tlet hasMore = $derived(displayedCount < groupedEvents.length);\r\n\r\n\tfunction loadMore() {\r\n\t\tdisplayedCount += loadMoreCount;\r\n\t}\r\n\r\n\tonMount(() => {\r\n\t\tobserver = new IntersectionObserver(\r\n\t\t\t(entries) => {\r\n\t\t\t\tif (entries[0].isIntersecting && hasMore) {\r\n\t\t\t\t\tloadMore();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t{ rootMargin: \"100px\" }\r\n\t\t);\r\n\r\n\t\tif (loadMoreTrigger) {\r\n\t\t\tobserver.observe(loadMoreTrigger);\r\n\t\t}\r\n\t});\r\n\r\n\tonDestroy(() => {\r\n\t\tif (observer) {\r\n\t\t\tobserver.disconnect();\r\n\t\t}\r\n\t});\r\n\r\n\t// Re-observe when trigger element changes\r\n\t$effect(() => {\r\n\t\tif (observer && loadMoreTrigger) {\r\n\t\t\tobserver.disconnect();\r\n\t\t\tobserver.observe(loadMoreTrigger);\r\n\t\t}\r\n\t});\r\n</script>\r\n\r\n<section class=\"gallery-view\" aria-label={labels.eventsGallery || 'Events gallery'}>\r\n\t<h2 class=\"sr-only\">{labels.upcomingEvents || 'Upcoming events'}</h2>\r\n\t<ul class=\"gallery-grid\" role=\"list\">\r\n\t\t{#each displayedGroups as grouped (grouped.event.eventID)}\r\n\t\t\t{@const { pillEvents, ...card } = toEventCardProps(grouped, labels)}\r\n\t\t\t<li class=\"gallery-card-wrapper\">\r\n\t\t\t\t<EventCard\r\n\t\t\t\t\t{...card}\r\n\t\t\t\t\tlayout=\"vertical\"\r\n\t\t\t\t\tdensity=\"standard\"\r\n\t\t\t\t\tonclick={() => oneventClick?.(grouped.event)}\r\n\t\t\t\t\tonpillclick={(i) => oneventClick?.(pillEvents[i] ?? grouped.event)}\r\n\t\t\t\t/>\r\n\t\t\t</li>\r\n\t\t{/each}\r\n\t</ul>\r\n\r\n\t<!-- Infinite scroll trigger -->\r\n\t{#if hasMore}\r\n\t\t<div bind:this={loadMoreTrigger} class=\"load-more-trigger\" role=\"status\" aria-live=\"polite\">\r\n\t\t\t<span class=\"loading-text\">{labels.loadingMoreEvents || 'Loading more events...'}</span>\r\n\t\t</div>\r\n\t{/if}\r\n</section>\r\n\r\n<style>\r\n\t.gallery-view {\r\n\t\twidth: 100%;\r\n\t}\r\n\r\n\t.gallery-grid {\r\n\t\tdisplay: grid;\r\n\t\tgrid-template-columns: 1fr;\r\n\t\tgap: 1rem;\r\n\t\tbackground-color: hsl(var(--bg-secondary));\r\n\t\tpadding: 0.5rem;\r\n\t}\r\n\r\n\t\r\n\r\n\t@media (width >= 640px) {\r\n\t\t.gallery-grid {\r\n\t\t\tgrid-template-columns: repeat(2, 1fr);\r\n\t\t\tgap: 1rem;\r\n\t\t\tpadding: 0.75rem;\r\n\t\t}\r\n\t}\r\n\r\n\t@media (width >= 768px) {\r\n\t\t.gallery-grid {\r\n\t\t\tgrid-template-columns: repeat(3, 1fr);\r\n\t\t\tgap: 1.25rem;\r\n\t\t\tpadding: 1rem;\r\n\t\t}\r\n\t}\r\n\r\n\t@media (width >= 1024px) {\r\n\t\t.gallery-grid {\r\n\t\t\tgrid-template-columns: repeat(3, 1fr);\r\n\t\t\tgap: 1.5rem;\r\n\t\t\tpadding: 1.5rem;\r\n\t\t}\r\n\t}\r\n\r\n\t.load-more-trigger {\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tgap: 0.5rem;\r\n\t\tpadding: 0.5rem 1.5rem;\r\n\t}\r\n\r\n\t.loading-text {\r\n\t\tfont-size: 0.875rem;\r\n\t\tcolor: hsl(var(--text-tertiary));\r\n\t}\r\n\r\n\t\r\n\r\n\t.gallery-card-wrapper {\r\n\t\tlist-style: none;\r\n\t}\r\n\r\n\t/* Screen reader only text */\r\n\t.sr-only {\r\n\t\tposition: absolute;\r\n\t\twidth: 1px;\r\n\t\theight: 1px;\r\n\t\tpadding: 0;\r\n\t\tmargin: -1px;\r\n\t\toverflow: hidden;\r\n\t\tclip: rect(0, 0, 0, 0);\r\n\t\twhite-space: nowrap;\r\n\t\tborder-width: 0;\r\n\t}\r\n</style>\r\n","<!-- native-element-exception: VC is an embeddable widget — native <button>s are intentional here (widget-controlled styling on calendar cells, date selectors, checkout/nav CTAs). -->\r\n<script lang=\"ts\">\r\n\t/**\r\n\t * Time Pills — Carousel View\r\n\t * Thin wrapper that renders GalleryCard in a horizontal scroll container.\r\n\t * Scroll mechanics (snap, arrows, ResizeObserver) adapted from CarouselView.svelte.\r\n\t */\r\n\timport { onMount } from \"svelte\";\r\n\timport { EventCard } from \"@getmicdrop/svelte-components\";\r\n\timport { filterTodayAndFuture } from \"$lib/utils/browse-status.js\";\r\n\timport { groupEventsBySeries } from \"$lib/browse-widgets/utils\";\r\n\timport { toEventCardProps } from \"$lib/browse-widgets/to-event-card-props\";\r\n\timport type { BrowseEvent } from \"$lib/browse-widgets/types\";\r\n\r\n\tinterface Props {\r\n\t\tevents?: BrowseEvent[];\r\n\t\toneventClick?: (event: BrowseEvent) => void;\r\n\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { events = [], oneventClick, labels = {} }: Props = $props();\r\n\r\n\tlet scrollContainer = $state<HTMLDivElement | null>(null);\r\n\tlet canScrollLeft = $state(false);\r\n\tlet canScrollRight = $state(false);\r\n\tlet showArrows = $state(false);\r\n\r\n\t// Filter to today and future, group by series\r\n\tlet futureEvents = $derived(filterTodayAndFuture(events));\r\n\tlet groupedEvents = $derived(groupEventsBySeries(futureEvents));\r\n\r\n\tfunction updateScrollState() {\r\n\t\tif (!scrollContainer) return;\r\n\t\tconst { scrollLeft, scrollWidth, clientWidth } = scrollContainer;\r\n\t\tcanScrollLeft = scrollLeft > 1;\r\n\t\tcanScrollRight = scrollLeft + clientWidth < scrollWidth - 1;\r\n\t\tshowArrows = scrollWidth > clientWidth + 1;\r\n\t}\r\n\r\n\tfunction scrollByCard(direction: number) {\r\n\t\tif (!scrollContainer) return;\r\n\t\tconst firstCard = scrollContainer.querySelector('.carousel-item') as HTMLElement | null;\r\n\t\tif (!firstCard) return;\r\n\t\tconst cardWidth = firstCard.offsetWidth + 16; // card width + gap\r\n\t\tscrollContainer.scrollBy({ left: direction * cardWidth, behavior: 'smooth' });\r\n\t}\r\n\r\n\tonMount(() => {\r\n\t\tupdateScrollState();\r\n\t\tconst observer = new ResizeObserver(() => updateScrollState());\r\n\t\tif (scrollContainer) {\r\n\t\t\tobserver.observe(scrollContainer);\r\n\t\t}\r\n\t\treturn () => observer.disconnect();\r\n\t});\r\n</script>\r\n\r\n<section class=\"carousel-view\" aria-label={labels.eventsCarousel || 'Events carousel'}>\r\n\t<h2 class=\"sr-only\">{labels.upcomingEvents || 'Upcoming events'}</h2>\r\n\r\n\t<div class=\"carousel-wrapper\">\r\n\t\t<!-- Left arrow -->\r\n\t\t{#if showArrows && canScrollLeft}\r\n\t\t\t<button\r\n\t\t\t\tclass=\"carousel-arrow carousel-arrow-left\"\r\n\t\t\t\tonclick={() => scrollByCard(-1)}\r\n\t\t\t\taria-label={labels.scrollLeft || 'Scroll left'}\r\n\t\t\t>\r\n\t\t\t\t<svg aria-hidden=\"true\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"arrow-icon\"><polyline points=\"15 18 9 12 15 6\"></polyline></svg>\r\n\t\t\t</button>\r\n\t\t{/if}\r\n\r\n\t\t<!-- Scroll container -->\r\n\t\t<div\r\n\t\t\tclass=\"carousel-scroll\"\r\n\t\t\tbind:this={scrollContainer}\r\n\t\t\tonscroll={updateScrollState}\r\n\t\t\trole=\"list\"\r\n\t\t>\r\n\t\t\t{#each groupedEvents as grouped (grouped.event.eventID)}\r\n\t\t\t\t{@const { pillEvents, ...card } = toEventCardProps(grouped, labels)}\r\n\t\t\t\t<div class=\"carousel-item\" role=\"listitem\">\r\n\t\t\t\t\t<EventCard\r\n\t\t\t\t\t\t{...card}\r\n\t\t\t\t\t\tlayout=\"vertical\"\r\n\t\t\t\t\t\tdensity=\"standard\"\r\n\t\t\t\t\t\tonclick={() => oneventClick?.(grouped.event)}\r\n\t\t\t\t\t\tonpillclick={(i) => oneventClick?.(pillEvents[i] ?? grouped.event)}\r\n\t\t\t\t\t/>\r\n\t\t\t\t</div>\r\n\t\t\t{/each}\r\n\t\t</div>\r\n\r\n\t\t<!-- Right arrow -->\r\n\t\t{#if showArrows && canScrollRight}\r\n\t\t\t<button\r\n\t\t\t\tclass=\"carousel-arrow carousel-arrow-right\"\r\n\t\t\t\tonclick={() => scrollByCard(1)}\r\n\t\t\t\taria-label={labels.scrollRight || 'Scroll right'}\r\n\t\t\t>\r\n\t\t\t\t<svg aria-hidden=\"true\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"arrow-icon\"><polyline points=\"9 18 15 12 9 6\"></polyline></svg>\r\n\t\t\t</button>\r\n\t\t{/if}\r\n\t</div>\r\n</section>\r\n\r\n<style>\r\n\t.carousel-view {\r\n\t\twidth: 100%;\r\n\t}\r\n\r\n\t.carousel-wrapper {\r\n\t\tposition: relative;\r\n\t}\r\n\r\n\t.carousel-scroll {\r\n\t\tdisplay: flex;\r\n\t\tgap: 1rem;\r\n\t\toverflow-x: auto;\r\n\t\tpadding: 0.5rem;\r\n\t\tscroll-snap-type: x mandatory;\r\n\t\t-webkit-overflow-scrolling: touch;\r\n\t\tscrollbar-width: none;\r\n\t}\r\n\r\n\t.carousel-scroll::-webkit-scrollbar {\r\n\t\tdisplay: none;\r\n\t}\r\n\r\n\t.carousel-item {\r\n\t\tscroll-snap-align: start;\r\n\t\tflex: 0 0 85%;\r\n\t}\r\n\r\n\t@media (width >= 640px) {\r\n\t\t.carousel-item {\r\n\t\t\tflex: 0 0 calc(50% - 8px);\r\n\t\t}\r\n\r\n\t\t.carousel-scroll {\r\n\t\t\tpadding: 0.75rem;\r\n\t\t}\r\n\t}\r\n\r\n\t@media (width >= 1024px) {\r\n\t\t.carousel-item {\r\n\t\t\tflex: 0 0 calc(33.333% - 11px);\r\n\t\t}\r\n\r\n\t\t.carousel-scroll {\r\n\t\t\tpadding: 1rem;\r\n\t\t}\r\n\t}\r\n\r\n\t/* Arrow buttons */\r\n\t.carousel-arrow {\r\n\t\tposition: absolute;\r\n\t\ttop: 50%;\r\n\t\ttransform: translateY(-50%);\r\n\t\tz-index: var(--z-sticky);\r\n\t\twidth: 2.5rem;\r\n\t\theight: 2.5rem;\r\n\t\tborder-radius: 9999px;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tbackground-color: hsl(var(--bg-primary) / 90%);\r\n\t\tborder: 1px solid hsl(var(--border));\r\n\t\tbox-shadow: 0 10px 15px -3px rgb(0 0 0 / 10%);\r\n\t\tcursor: pointer;\r\n\t\ttransition: opacity 200ms;\r\n\t}\r\n\r\n\t\r\n\r\n\t.carousel-arrow:hover {\r\n\t\tbackground-color: hsl(var(--bg-primary));\r\n\t}\r\n\r\n\t\r\n\r\n\t.carousel-arrow:focus-visible {\r\n\t\toutline: 2px solid hsl(var(--brand-primary));\r\n\t\toutline-offset: 2px;\r\n\t}\r\n\r\n\t.carousel-arrow-left {\r\n\t\tleft: 8px;\r\n\t}\r\n\r\n\t.carousel-arrow-right {\r\n\t\tright: 8px;\r\n\t}\r\n\r\n\t.arrow-icon {\r\n\t\twidth: 1.25rem;\r\n\t\theight: 1.25rem;\r\n\t\tcolor: hsl(var(--text-secondary));\r\n\t}\r\n\r\n\t\r\n\r\n\t@media (width <= 639px) {\r\n\t\t.carousel-arrow {\r\n\t\t\tdisplay: none;\r\n\t\t}\r\n\t}\r\n\r\n\t@media (prefers-reduced-motion: reduce) {\r\n\t\t.carousel-scroll {\r\n\t\t\tscroll-behavior: auto;\r\n\t\t}\r\n\t}\r\n\r\n\t/* Screen reader only text */\r\n\t.sr-only {\r\n\t\tposition: absolute;\r\n\t\twidth: 1px;\r\n\t\theight: 1px;\r\n\t\tpadding: 0;\r\n\t\tmargin: -1px;\r\n\t\toverflow: hidden;\r\n\t\tclip: rect(0, 0, 0, 0);\r\n\t\twhite-space: nowrap;\r\n\t\tborder-width: 0;\r\n\t}\r\n</style>","<script lang=\"ts\">\r\n\t/**\r\n\t * Time Pills — Featured View\r\n\t * Thin wrapper that renders the first grouped event as a large hero-sized\r\n\t * GalleryCard. When no events, shows an empty state message.\r\n\t */\r\n\timport { EventCard } from \"@getmicdrop/svelte-components\";\r\n\timport { filterTodayAndFuture } from \"$lib/utils/browse-status.js\";\r\n\timport { groupEventsBySeries } from \"$lib/browse-widgets/utils\";\r\n\timport { toEventCardProps } from \"$lib/browse-widgets/to-event-card-props\";\r\n\timport type { BrowseEvent } from \"$lib/browse-widgets/types\";\r\n\r\n\tinterface Props {\r\n\t\tevents?: BrowseEvent[];\r\n\t\tfeaturedItem?: any;\r\n\t\toneventClick?: (event: BrowseEvent) => void;\r\n\t\tlabels?: Record<string, string>;\r\n\t}\r\n\r\n\tlet { events = [], featuredItem, oneventClick, labels = {} }: Props = $props();\r\n\r\n\t// Filter to today and future, group by series\r\n\tlet futureEvents = $derived(filterTodayAndFuture(events));\r\n\tlet groupedEvents = $derived(groupEventsBySeries(futureEvents));\r\n\tlet heroGrouped = $derived(groupedEvents.length > 0 ? groupedEvents[0] : null);\r\n</script>\r\n\r\n<section class=\"featured-view\" aria-label={labels.featuredEvent || 'Featured event'}>\r\n\t{#if heroGrouped}\r\n\t\t{@const { pillEvents, ...card } = toEventCardProps(heroGrouped, labels)}\r\n\t\t<div class=\"featured-card-container\">\r\n\t\t\t<EventCard\r\n\t\t\t\t{...card}\r\n\t\t\t\tlayout=\"vertical\"\r\n\t\t\t\tdensity=\"featured\"\r\n\t\t\t\tshowDescription\r\n\t\t\t\tonclick={() => oneventClick?.(heroGrouped.event)}\r\n\t\t\t\tonpillclick={(i) => oneventClick?.(pillEvents[i] ?? heroGrouped.event)}\r\n\t\t\t/>\r\n\t\t</div>\r\n\t{:else}\r\n\t\t<div class=\"featured-empty\">\r\n\t\t\t<p class=\"empty-text\">{labels.noUpcomingEventsToFeature || 'No upcoming events to feature'}</p>\r\n\t\t</div>\r\n\t{/if}\r\n</section>\r\n\r\n<style>\r\n\t.featured-view {\r\n\t\twidth: 100%;\r\n\t}\r\n\r\n\t.featured-card-container {\r\n\t\tmax-width: 42rem;\r\n\t\tmargin-left: auto;\r\n\t\tmargin-right: auto;\r\n\t}\r\n\r\n\t.featured-empty {\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tpadding: 3rem 0;\r\n\t\tborder-radius: 0.5rem;\r\n\t\tborder: 1px solid hsl(var(--border));\r\n\t\tbackground-color: hsl(var(--bg-secondary));\r\n\t}\r\n\r\n\t\r\n\r\n\t.empty-text {\r\n\t\tfont-size: 0.875rem;\r\n\t\tcolor: hsl(var(--text-tertiary));\r\n\t}\r\n\r\n\t\r\n</style>\r\n","<!--\r\n @loading-state-escape: This is the canonical Skeleton loader component.\r\n It IS the loading-state primitive — rendering 'Loading...' is its\r\n definition. behavior-loading-state record documents the Skeleton\r\n component as exempt.\r\n-->\r\n<script>\r\n let { type = '', labels = {} } = $props();\r\n let boxes = 30;\r\n let hoursInDay = 17;\r\n let quarter = 3;\r\n let month = 9;\r\n</script>\r\n\r\n<div\r\n role=\"status\"\r\n aria-busy=\"true\"\r\n aria-label={labels.loadingContent || \"Loading content\"}\r\n class=\"skeleton-wrapper animate-pulse\"\r\n>\r\n <span class=\"sr-only\">Loading...</span>\r\n{#if type === 'monthly'}\r\n <div class=\"skeleton-animation p-7 rounded-lg skeleton-bar\" aria-hidden=\"true\"></div>\r\n <div class=\"skeleton-monthly\" aria-hidden=\"true\">\r\n {#each Array(boxes) as _, index (index)}\r\n <div class=\"skeleton-animation\">\r\n <div class=\"w-full h-40 rounded-md skeleton-bar\"></div>\r\n </div>\r\n {/each}\r\n </div>\r\n{:else if type === 'daily'}\r\n <div class=\"skeleton-animation\">\r\n <div class=\"flex\">\r\n <div class=\"p-5 w-[10%] mb-2\"></div>\r\n <div class=\"p-5 rounded-md w-[30%] mb-2 skeleton-bar\"></div>\r\n </div>\r\n <div class=\"p-5 rounded-md w-full mb-2 skeleton-bar\"></div>\r\n <div class=\"flex gap-2\">\r\n <div class=\"flex flex-col gap-2 w-[15%]\">\r\n {#each Array(hoursInDay) as _, index (index)}\r\n <div class=\"w-full h-10 rounded-lg skeleton-bar\"></div>\r\n {/each}\r\n </div>\r\n <div class=\"flex flex-col gap-2 w-[85%]\">\r\n {#each Array(hoursInDay) as _, index (index)}\r\n <div class=\"w-full h-10 rounded-lg skeleton-bar\"></div>\r\n {/each}\r\n </div>\r\n </div>\r\n </div>\r\n{:else if type === 'weekly'}\r\n <div class=\"skeleton-animation\">\r\n <div class=\"p-6 rounded-md w-full mb-3 skeleton-bar\"></div>\r\n <div class=\"flex gap-2\">\r\n <div class=\"flex flex-col gap-2 w-[15%]\">\r\n {#each Array(hoursInDay) as _, index (index)}\r\n <div class=\"w-full h-10 rounded-lg skeleton-bar\"></div>\r\n {/each}\r\n </div>\r\n <div class=\"flex flex-col gap-2 w-[85%]\">\r\n {#each Array(hoursInDay) as _, index (index)}\r\n <div class=\"w-full h-10 rounded-lg skeleton-bar\"></div>\r\n {/each}\r\n </div>\r\n </div>\r\n </div>\r\n{:else if type === 'quarter'}\r\n <div class=\"skeleton-animation\">\r\n <div class=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2 lg:gap-4\">\r\n {#each Array(quarter) as _, index (index)}\r\n <div>\r\n <div class=\"w-full h-80 rounded-md skeleton-bar\"></div>\r\n </div>\r\n {/each}\r\n </div>\r\n </div>\r\n{:else if type === 'yearly'}\r\n <div class=\"skeleton-animation\">\r\n <div class=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2 lg:gap-4\">\r\n {#each Array(month) as _, index (index)}\r\n <div>\r\n <div class=\"w-full h-64 rounded-md skeleton-bar\"></div>\r\n </div>\r\n {/each}\r\n </div>\r\n </div>\r\n{:else if type === 'list'}\r\n <!-- List view skeleton -->\r\n <div class=\"skeleton-animation skeleton-list\">\r\n {#each Array(5) as _, index (index)}\r\n <div class=\"skeleton-list-row\">\r\n <!-- Date column -->\r\n <div class=\"skeleton-date-col\">\r\n <div class=\"skeleton-bar w-8 h-3 rounded mb-1\"></div>\r\n <div class=\"skeleton-bar w-6 h-6 rounded\"></div>\r\n <div class=\"skeleton-bar w-8 h-3 rounded mt-1\"></div>\r\n </div>\r\n <!-- Event row -->\r\n <div class=\"skeleton-event-row\">\r\n <div class=\"skeleton-bar skeleton-event-image\"></div>\r\n <div class=\"skeleton-event-details\">\r\n <div class=\"skeleton-bar w-3/4 h-5 rounded mb-2\"></div>\r\n <div class=\"skeleton-bar w-1/4 h-4 rounded\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n {/each}\r\n </div>\r\n{:else if type === 'gallery'}\r\n <!-- Gallery view skeleton -->\r\n <div class=\"skeleton-animation skeleton-gallery\">\r\n {#each Array(8) as _, index (index)}\r\n <div class=\"skeleton-gallery-card\">\r\n <div class=\"skeleton-bar skeleton-gallery-image\"></div>\r\n <div class=\"skeleton-gallery-content\">\r\n <div class=\"skeleton-bar w-full h-5 rounded mb-2\"></div>\r\n <div class=\"skeleton-bar w-2/3 h-4 rounded\"></div>\r\n </div>\r\n </div>\r\n {/each}\r\n </div>\r\n{:else if type === 'event'}\r\n <!-- Event page skeleton -->\r\n <div class=\"skeleton-animation skeleton-event\">\r\n <div class=\"skeleton-event-layout\">\r\n <!-- Main content -->\r\n <div class=\"skeleton-event-main\">\r\n <!-- Hero image -->\r\n <div class=\"skeleton-bar skeleton-event-hero\"></div>\r\n <!-- Event header card -->\r\n <div class=\"skeleton-event-header\">\r\n <div class=\"skeleton-bar w-3/4 h-8 rounded mb-3\"></div>\r\n <div class=\"skeleton-bar w-1/2 h-4 rounded mb-6\"></div>\r\n <!-- Meta rows -->\r\n <div class=\"skeleton-event-meta\">\r\n <div class=\"skeleton-bar w-48 h-5 rounded mb-3\"></div>\r\n <div class=\"skeleton-bar w-40 h-5 rounded mb-3\"></div>\r\n <div class=\"skeleton-bar w-56 h-5 rounded\"></div>\r\n </div>\r\n </div>\r\n <!-- About section -->\r\n <div class=\"skeleton-event-section\">\r\n <div class=\"skeleton-bar w-24 h-6 rounded mb-4\"></div>\r\n <div class=\"skeleton-bar w-full h-4 rounded mb-2\"></div>\r\n <div class=\"skeleton-bar w-full h-4 rounded mb-2\"></div>\r\n <div class=\"skeleton-bar w-2/3 h-4 rounded\"></div>\r\n </div>\r\n </div>\r\n <!-- Sidebar -->\r\n <div class=\"skeleton-event-sidebar\">\r\n <div class=\"skeleton-event-price-card\">\r\n <div class=\"skeleton-bar w-20 h-8 rounded mb-4\"></div>\r\n <div class=\"skeleton-bar w-full h-12 rounded\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n{:else if type === 'tickets'}\r\n <!-- Tickets page skeleton -->\r\n <div class=\"skeleton-animation skeleton-tickets\">\r\n <!-- Event info header -->\r\n <div class=\"skeleton-tickets-header\">\r\n <div class=\"skeleton-bar w-16 h-16 rounded mr-4\"></div>\r\n <div class=\"flex-1\">\r\n <div class=\"skeleton-bar w-2/3 h-6 rounded mb-2\"></div>\r\n <div class=\"skeleton-bar w-1/2 h-4 rounded\"></div>\r\n </div>\r\n </div>\r\n <!-- Ticket groups -->\r\n {#each Array(3) as _, index (index)}\r\n <div class=\"skeleton-ticket-block\">\r\n <div class=\"skeleton-bar w-1/3 h-6 rounded mb-2\"></div>\r\n <div class=\"skeleton-bar w-1/4 h-5 rounded mb-3\"></div>\r\n <div class=\"skeleton-bar w-full h-4 rounded\"></div>\r\n </div>\r\n {/each}\r\n <!-- Continue button -->\r\n <div class=\"skeleton-bar w-full h-12 rounded mt-6\"></div>\r\n </div>\r\n{:else if type === 'checkout'}\r\n <!-- Checkout page skeleton -->\r\n <div class=\"skeleton-animation skeleton-checkout\">\r\n <div class=\"skeleton-checkout-layout\">\r\n <!-- Left column - form -->\r\n <div class=\"skeleton-checkout-form\">\r\n <div class=\"skeleton-bar w-40 h-7 rounded mb-6\"></div>\r\n <!-- Form fields -->\r\n {#each Array(4) as _, index (index)}\r\n <div class=\"mb-4\">\r\n <div class=\"skeleton-bar w-24 h-4 rounded mb-2\"></div>\r\n <div class=\"skeleton-bar w-full h-11 rounded\"></div>\r\n </div>\r\n {/each}\r\n <!-- Payment section -->\r\n <div class=\"skeleton-bar w-32 h-7 rounded mb-4 mt-8\"></div>\r\n <div class=\"skeleton-bar w-full h-40 rounded\"></div>\r\n </div>\r\n <!-- Right column - order summary -->\r\n <div class=\"skeleton-checkout-summary\">\r\n <div class=\"skeleton-bar w-32 h-6 rounded mb-4\"></div>\r\n <div class=\"skeleton-bar w-full h-4 rounded mb-2\"></div>\r\n <div class=\"skeleton-bar w-full h-4 rounded mb-2\"></div>\r\n <div class=\"skeleton-bar w-full h-4 rounded mb-4\"></div>\r\n <div class=\"skeleton-bar w-full h-1 rounded mb-4\"></div>\r\n <div class=\"skeleton-bar w-full h-6 rounded\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n{:else}\r\n <!-- Default calendar skeleton -->\r\n <div class=\"skeleton-animation\" aria-hidden=\"true\">\r\n <!-- Calendar grid skeleton -->\r\n <div class=\"skeleton-calendar-grid\">\r\n <!-- Day headers -->\r\n {#each Array(7) as _, index (index)}\r\n <div class=\"skeleton-day-header skeleton-bar\"></div>\r\n {/each}\r\n <!-- Day cells -->\r\n {#each Array(35) as _, index (index)}\r\n <div class=\"skeleton-day-cell\">\r\n <div class=\"skeleton-bar w-6 h-6 rounded-full mb-2\"></div>\r\n <div class=\"skeleton-bar w-full h-16 rounded-md hidden sm:block\"></div>\r\n </div>\r\n {/each}\r\n </div>\r\n </div>\r\n{/if}\r\n</div>\r\n\r\n<style>\r\n /* Theme-responsive skeleton colors */\r\n .skeleton-bar {\r\n background-color: hsl(var(--bg-quaternary));\r\n border-radius: 0.25rem;\r\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\r\n }\r\n\r\n \r\n\r\n .skeleton-monthly {\r\n display: grid;\r\n grid-template-columns: repeat(7, minmax(100px, 1fr));\r\n grid-gap: 1px;\r\n padding-top: 0.25rem;\r\n }\r\n\r\n .skeleton-animation {\r\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\r\n }\r\n\r\n /* Calendar skeleton grid */\r\n .skeleton-calendar-grid {\r\n display: grid;\r\n grid-template-columns: repeat(7, minmax(40px, 1fr));\r\n gap: 1px;\r\n }\r\n\r\n @media (width >= 640px) {\r\n .skeleton-calendar-grid {\r\n grid-template-columns: repeat(7, minmax(100px, 1fr));\r\n }\r\n }\r\n\r\n .skeleton-day-header {\r\n height: 2rem;\r\n border-radius: 0.25rem;\r\n }\r\n\r\n .skeleton-day-cell {\r\n min-height: 3.5rem;\r\n padding: 0.5rem;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n }\r\n\r\n @media (width >= 640px) {\r\n .skeleton-day-cell {\r\n min-height: 8rem;\r\n padding: 0.75rem;\r\n }\r\n }\r\n\r\n /* List view skeleton */\r\n .skeleton-list {\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n\r\n .skeleton-list-row {\r\n display: flex;\r\n border-bottom: 1px solid hsl(var(--border));\r\n }\r\n\r\n \r\n\r\n .skeleton-date-col {\r\n width: 4rem;\r\n min-width: 4rem;\r\n padding: 1rem 0.625rem;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n background-color: hsl(var(--bg-secondary));\r\n border-right: 1px solid hsl(var(--border));\r\n }\r\n\r\n \r\n\r\n .skeleton-event-row {\r\n flex: 1;\r\n display: flex;\r\n gap: 1rem;\r\n padding: 1.25rem;\r\n background-color: hsl(var(--bg-primary));\r\n }\r\n\r\n \r\n\r\n .skeleton-event-image {\r\n width: 9rem;\r\n height: 6rem;\r\n min-width: 9rem;\r\n border-radius: 0.5rem;\r\n }\r\n\r\n .skeleton-event-details {\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n }\r\n\r\n @media (width <= 640px) {\r\n .skeleton-date-col {\r\n width: 3rem;\r\n min-width: 3rem;\r\n padding: 0.625rem 0.375rem;\r\n }\r\n\r\n .skeleton-event-row {\r\n padding: 0.75rem;\r\n gap: 0.625rem;\r\n }\r\n\r\n .skeleton-event-image {\r\n width: 5rem;\r\n height: 4rem;\r\n min-width: 5rem;\r\n }\r\n }\r\n\r\n /* Gallery view skeleton */\r\n .skeleton-gallery {\r\n display: grid;\r\n grid-template-columns: 1fr;\r\n gap: 1rem;\r\n background-color: hsl(var(--bg-secondary));\r\n padding: 0.5rem;\r\n }\r\n\r\n \r\n\r\n @media (width >= 640px) {\r\n .skeleton-gallery {\r\n grid-template-columns: repeat(2, 1fr);\r\n padding: 0.75rem;\r\n }\r\n }\r\n\r\n @media (width >= 768px) {\r\n .skeleton-gallery {\r\n grid-template-columns: repeat(3, 1fr);\r\n gap: 1.25rem;\r\n padding: 1rem;\r\n }\r\n }\r\n\r\n @media (width >= 1024px) {\r\n .skeleton-gallery {\r\n grid-template-columns: repeat(4, 1fr);\r\n gap: 1.5rem;\r\n padding: 1.25rem;\r\n }\r\n }\r\n\r\n .skeleton-gallery-card {\r\n border-radius: 0.5rem;\r\n border: 1px solid hsl(var(--border));\r\n background-color: hsl(var(--bg-primary));\r\n overflow: hidden;\r\n }\r\n\r\n \r\n\r\n .skeleton-gallery-image {\r\n width: 100%;\r\n height: 12rem;\r\n }\r\n\r\n @media (width <= 639px) {\r\n .skeleton-gallery-image {\r\n height: 14rem;\r\n }\r\n }\r\n\r\n @media (width >= 1024px) {\r\n .skeleton-gallery-image {\r\n height: 11rem;\r\n }\r\n }\r\n\r\n .skeleton-gallery-content {\r\n padding: 0.75rem;\r\n }\r\n\r\n @media (width >= 640px) {\r\n .skeleton-gallery-content {\r\n padding: 0.875rem;\r\n }\r\n }\r\n\r\n /* Event page skeleton */\r\n .skeleton-event {\r\n min-height: 100vh;\r\n background-color: hsl(var(--bg-secondary));\r\n padding: 1.25rem;\r\n }\r\n\r\n \r\n\r\n .skeleton-event-layout {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 1.5rem;\r\n max-width: 80rem;\r\n margin-left: auto;\r\n margin-right: auto;\r\n }\r\n\r\n @media (width >= 1024px) {\r\n .skeleton-event-layout {\r\n flex-direction: row;\r\n }\r\n\r\n .skeleton-event-main {\r\n flex: 1;\r\n }\r\n\r\n .skeleton-event-sidebar {\r\n width: 20rem;\r\n }\r\n }\r\n\r\n .skeleton-event-hero {\r\n width: 100%;\r\n height: 18rem;\r\n border-radius: 0.5rem;\r\n margin-bottom: 1.25rem;\r\n }\r\n\r\n @media (width >= 640px) {\r\n .skeleton-event-hero {\r\n height: 24rem;\r\n }\r\n }\r\n\r\n .skeleton-event-header {\r\n border-radius: 0.5rem;\r\n border: 1px solid hsl(var(--border));\r\n background-color: hsl(var(--bg-primary));\r\n padding: 1.5rem;\r\n margin-bottom: 1.25rem;\r\n }\r\n\r\n \r\n\r\n .skeleton-event-meta {\r\n margin-top: 1rem;\r\n }\r\n\r\n .skeleton-event-section {\r\n border-radius: 0.5rem;\r\n border: 1px solid hsl(var(--border));\r\n background-color: hsl(var(--bg-primary));\r\n padding: 1.5rem;\r\n }\r\n\r\n \r\n\r\n .skeleton-event-price-card {\r\n border-radius: 0.5rem;\r\n border: 1px solid hsl(var(--border));\r\n background-color: hsl(var(--bg-primary));\r\n padding: 1.5rem;\r\n position: sticky;\r\n top: 1.25rem;\r\n }\r\n\r\n \r\n\r\n /* Tickets page skeleton */\r\n .skeleton-tickets {\r\n max-width: 36rem;\r\n margin-left: auto;\r\n margin-right: auto;\r\n padding: 1.25rem;\r\n }\r\n\r\n .skeleton-tickets-header {\r\n display: flex;\r\n align-items: center;\r\n padding: 1rem;\r\n border-radius: 0.5rem;\r\n border: 1px solid hsl(var(--border));\r\n background-color: hsl(var(--bg-primary));\r\n margin-bottom: 1.5rem;\r\n }\r\n\r\n \r\n\r\n .skeleton-ticket-block {\r\n border-radius: 0.5rem;\r\n border: 1px solid hsl(var(--border));\r\n background-color: hsl(var(--bg-primary));\r\n padding: 1.25rem;\r\n margin-bottom: 1rem;\r\n }\r\n\r\n \r\n\r\n /* Checkout page skeleton */\r\n .skeleton-checkout {\r\n max-width: 56rem;\r\n margin-left: auto;\r\n margin-right: auto;\r\n padding: 1.25rem;\r\n }\r\n\r\n .skeleton-checkout-layout {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 1.5rem;\r\n }\r\n\r\n @media (width >= 768px) {\r\n .skeleton-checkout-layout {\r\n flex-direction: row;\r\n }\r\n\r\n .skeleton-checkout-form {\r\n flex: 1;\r\n }\r\n\r\n .skeleton-checkout-summary {\r\n width: 20rem;\r\n }\r\n }\r\n\r\n .skeleton-checkout-form {\r\n border-radius: 0.5rem;\r\n border: 1px solid hsl(var(--border));\r\n background-color: hsl(var(--bg-primary));\r\n padding: 1.5rem;\r\n }\r\n\r\n \r\n\r\n .skeleton-checkout-summary {\r\n border-radius: 0.5rem;\r\n border: 1px solid hsl(var(--border));\r\n background-color: hsl(var(--bg-primary));\r\n padding: 1.5rem;\r\n height: fit-content;\r\n }\r\n\r\n \r\n\r\n @keyframes pulse {\r\n 0%,\r\n 100% {\r\n opacity: 1;\r\n }\r\n\r\n 50% {\r\n opacity: 0.5;\r\n }\r\n }\r\n\r\n /* Screen reader only text */\r\n .sr-only {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip: rect(0, 0, 0, 0);\r\n white-space: nowrap;\r\n border: 0;\r\n }\r\n</style>\r\n","/**\r\n * API Client for MicDrop Public Checkout API\r\n *\r\n * Provides a centralized HTTP client with:\r\n * - Configurable base URL\r\n * - Per-request timeout via AbortController\r\n * - Exponential-backoff retry on 5xx and network errors (idempotent methods)\r\n * - Consistent error surfacing\r\n * - Request/response typing\r\n */\r\n\r\nimport { createLogger } from '@getmicdrop/svelte-components/utils/logger';\r\nconst logger = createLogger('VC');\r\nimport type { ApiConfig, ApiResponse } from './types.js';\r\n\r\n// Default API configuration\r\nconst DEFAULT_CONFIG: Required<ApiConfig> = {\r\n baseUrl: 'https://get-micdrop.com',\r\n timeout: 30000,\r\n retries: 2,\r\n retryDelay: 500,\r\n onError: (error: Error) => logger.error('API Error:', error),\r\n};\r\n\r\nlet globalConfig: Required<ApiConfig> = { ...DEFAULT_CONFIG };\r\n\r\nexport function configureApi(config: Partial<ApiConfig>): void {\r\n globalConfig = { ...globalConfig, ...config };\r\n}\r\n\r\nexport function getApiConfig(): Required<ApiConfig> {\r\n return { ...globalConfig };\r\n}\r\n\r\nexport function getPublicBaseUrl(): string {\r\n return `${globalConfig.baseUrl}/api/v2/public`;\r\n}\r\n\r\nexport function getLegacyPublicUrl(): string {\r\n return `${globalConfig.baseUrl}/api/public`;\r\n}\r\n\r\nexport function getOrdersV2Url(): string {\r\n return `${globalConfig.baseUrl}/api/orders/v2/public`;\r\n}\r\n\r\n/** @deprecated IP is now resolved server-side via request headers. */\r\nexport async function getClientIP(): Promise<string> {\r\n return '';\r\n}\r\n\r\n/**\r\n * Sleep utility for retry backoff.\r\n */\r\nconst sleep = (ms: number): Promise<void> =>\r\n new Promise((resolve) => setTimeout(resolve, ms));\r\n\r\n/**\r\n * fetch with timeout, idempotent retry, and exponential backoff.\r\n *\r\n * - Retries on network errors and 5xx (transient) responses.\r\n * - Never retries non-idempotent methods (POST/PUT/PATCH/DELETE) — those are\r\n * left to caller-driven retries to avoid duplicate writes.\r\n * - The supplied AbortSignal (if any) is respected and short-circuits retries.\r\n */\r\nasync function fetchWithRetry(\r\n url: string,\r\n init: RequestInit,\r\n cfg: Required<ApiConfig>\r\n): Promise<Response> {\r\n const method = (init.method || 'GET').toUpperCase();\r\n const isIdempotent = method === 'GET' || method === 'HEAD';\r\n const maxAttempts = isIdempotent ? cfg.retries + 1 : 1;\r\n\r\n let lastError: unknown;\r\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), cfg.timeout);\r\n\r\n // Chain the caller's signal if provided.\r\n const callerSignal = init.signal;\r\n let onCallerAbort: (() => void) | undefined;\r\n if (callerSignal) {\r\n if (callerSignal.aborted) controller.abort();\r\n else {\r\n onCallerAbort = () => controller.abort();\r\n callerSignal.addEventListener('abort', onCallerAbort, { once: true });\r\n }\r\n }\r\n\r\n try {\r\n // @api-client-escape: internal canonical client implementation — not drift\r\n const response = await fetch(url, { ...init, signal: controller.signal });\r\n\r\n // Retry transient server errors.\r\n if (response.status >= 500 && attempt < maxAttempts) {\r\n lastError = new Error(`HTTP ${response.status}`);\r\n } else {\r\n return response;\r\n }\r\n } catch (err) {\r\n lastError = err;\r\n // Caller aborted — give up.\r\n if (callerSignal?.aborted) throw err;\r\n } finally {\r\n clearTimeout(timeoutId);\r\n if (callerSignal && onCallerAbort) {\r\n callerSignal.removeEventListener('abort', onCallerAbort);\r\n }\r\n }\r\n\r\n if (attempt < maxAttempts) {\r\n await sleep(cfg.retryDelay * Math.pow(2, attempt - 1));\r\n }\r\n }\r\n\r\n throw lastError;\r\n}\r\n\r\nexport async function apiGet<T>(\r\n endpoint: string,\r\n options?: RequestInit\r\n): Promise<ApiResponse<T>> {\r\n return apiRequest<T>('GET', endpoint, undefined, options);\r\n}\r\n\r\nexport async function apiPost<T>(\r\n endpoint: string,\r\n body?: unknown,\r\n options?: RequestInit\r\n): Promise<ApiResponse<T>> {\r\n return apiRequest<T>('POST', endpoint, body, options);\r\n}\r\n\r\nexport async function apiPut<T>(\r\n endpoint: string,\r\n body?: unknown,\r\n options?: RequestInit\r\n): Promise<ApiResponse<T>> {\r\n return apiRequest<T>('PUT', endpoint, body, options);\r\n}\r\n\r\nexport async function apiDelete<T>(\r\n endpoint: string,\r\n options?: RequestInit\r\n): Promise<ApiResponse<T>> {\r\n return apiRequest<T>('DELETE', endpoint, undefined, options);\r\n}\r\n\r\nasync function apiRequest<T>(\r\n method: string,\r\n endpoint: string,\r\n body?: unknown,\r\n options?: RequestInit\r\n): Promise<ApiResponse<T>> {\r\n const url = endpoint.startsWith('http')\r\n ? endpoint\r\n : `${getPublicBaseUrl()}${endpoint}`;\r\n\r\n try {\r\n const response = await fetchWithRetry(\r\n url,\r\n {\r\n method,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...options?.headers,\r\n },\r\n body: body !== undefined ? JSON.stringify(body) : undefined,\r\n credentials: 'include',\r\n ...options,\r\n },\r\n globalConfig\r\n );\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const message =\r\n errorData.error || errorData.message || `HTTP ${response.status}`;\r\n globalConfig.onError(new Error(message));\r\n return { success: false, error: message, statusCode: response.status };\r\n }\r\n\r\n const data = await response.json();\r\n return { success: true, data: data as T, statusCode: response.status };\r\n } catch (error) {\r\n const errorMessage =\r\n error instanceof Error\r\n ? error.name === 'AbortError'\r\n ? 'Request timed out'\r\n : error.message\r\n : 'Unknown error';\r\n\r\n globalConfig.onError(\r\n error instanceof Error ? error : new Error(errorMessage)\r\n );\r\n return { success: false, error: errorMessage };\r\n }\r\n}\r\n\r\n/**\r\n * Simple fetch wrapper that returns parsed JSON or null on error.\r\n * Inherits the global timeout + retry policy for GETs.\r\n */\r\nexport async function simpleFetch<T>(\r\n url: string,\r\n options?: RequestInit\r\n): Promise<T | null> {\r\n try {\r\n const response = await fetchWithRetry(\r\n url,\r\n { credentials: 'include', ...options },\r\n globalConfig\r\n );\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n logger.error(`API request failed: ${response.status}`, errorData);\r\n return null;\r\n }\r\n\r\n return response.json();\r\n } catch (error) {\r\n logger.error('API request error:', error);\r\n return null;\r\n }\r\n}\r\n","import { AppError } from '@getmicdrop/svelte-components';\r\n/**\r\n * Orders API\r\n *\r\n * Functions for managing orders, payments, and reservations\r\n * in the public checkout flow.\r\n */\r\n\r\nimport { createLogger } from '@getmicdrop/svelte-components/utils/logger';\r\nconst logger = createLogger('VC');\r\nimport { getPublicBaseUrl, getOrdersV2Url, simpleFetch, apiPost, apiGet } from './client.js';\r\nimport { parseCart } from './transformers/cart.js';\r\nimport type {\r\n PaymentIntentResponse,\r\n CompleteReservationResponse,\r\n CancelReservationResponse,\r\n CreateOrderResponse,\r\n ValidatePaymentRequest,\r\n ValidatePaymentResponse,\r\n ExtendSessionResponse,\r\n SessionStatus,\r\n Order,\r\n} from './types.js';\r\n\r\n/**\r\n * Create a payment intent for the cart\r\n *\r\n * This initiates the Stripe payment flow by creating a PaymentIntent\r\n * on the backend. The response includes the client_secret needed\r\n * for Stripe Elements.\r\n *\r\n * @param cartId - The cart/order UUID\r\n * @param quantities - Map of ticketId -> quantity\r\n * @param donationAmounts - Map of ticketId -> donation amount in dollars (for type=2 tickets)\r\n * @returns Payment intent data including client_secret, or null on error\r\n */\r\nexport async function createPaymentIntent(\r\n cartId: string,\r\n quantities: Record<string | number, number>,\r\n donationAmounts?: Record<string | number, number>\r\n): Promise<PaymentIntentResponse | null> {\r\n try {\r\n const apiResult = await apiPost<PaymentIntentResponse>(\r\n `${getOrdersV2Url()}/cart/${cartId}/payment-intent`,\r\n {\r\n productQuantities: quantities,\r\n ...(donationAmounts && Object.keys(donationAmounts).length > 0\r\n ? { donationAmounts }\r\n : {}),\r\n }\r\n );\r\n\r\n if (!apiResult.success) {\r\n logger.error('Payment intent creation failed:', apiResult.error);\r\n throw new AppError(apiResult.error || 'Failed to create payment intent', 'lib/api/orders/createPaymentIntent');\r\n }\r\n\r\n logger.debug('Payment intent created:', apiResult.data);\r\n return apiResult.data!;\r\n } catch (error) {\r\n logger.error('createPaymentIntent error:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Fetch an existing cart by UUID (cross-device pre-fill — §1.3).\r\n *\r\n * Returns the server's authoritative view of a cart so a second device\r\n * visiting the tickets page can see the in-progress reservation it created\r\n * on another device. Returns `null` if:\r\n * - the cart no longer exists (404)\r\n * - the cart belongs to a different event than `expectedEventID` (when\r\n * supplied) — we don't want to mix carts across events\r\n * - the cart status is no longer `reserved` / `active` (e.g. expired,\r\n * completed, abandoned) — caller should treat the local cookie as stale\r\n * - any network/decode failure (caller falls back to localStorage only)\r\n *\r\n * Returned shape matches the orders-service `GET /v2Public/cart/{uuid}`\r\n * response: a Cart model with embedded Reservations.\r\n */\r\nexport interface CartReservationView {\r\n ticketID: number;\r\n quantity: number;\r\n priceAtReservation: number;\r\n status: string;\r\n}\r\nexport interface CartView {\r\n uuid: string;\r\n eventID: number;\r\n status: string;\r\n expiresAt: string;\r\n reservations: CartReservationView[];\r\n}\r\n\r\nexport async function getCartByUUID(\r\n cartUUID: string,\r\n expectedEventID?: string | number\r\n): Promise<CartView | null> {\r\n if (!cartUUID) return null;\r\n try {\r\n const apiResult = await apiGet<unknown>(\r\n `${getOrdersV2Url()}/cart/${cartUUID}`\r\n );\r\n if (!apiResult.success) {\r\n // 404 / 410 / 5xx — caller treats as stale\r\n return null;\r\n }\r\n // Wire->domain normalization (PascalCase/camelCase reconciliation, numeric\r\n // coercion, reservation sub-parse) lives in parseCart — byte-identical to\r\n // the inline mapper this replaced. Staleness/event-mismatch policy below\r\n // stays here because it is a caller decision, not normalization.\r\n const { uuid, eventID, status, expiresAt, reservations } = parseCart(\r\n apiResult.data!\r\n );\r\n if (status !== 'reserved' && status !== 'active') {\r\n // stale cart row — caller clears the cookie\r\n return null;\r\n }\r\n if (expectedEventID !== undefined && eventID !== Number(expectedEventID)) {\r\n // cart belongs to a different event — don't mix\r\n return null;\r\n }\r\n return { uuid, eventID, status, expiresAt, reservations };\r\n } catch (err) {\r\n logger.error('getCartByUUID error:', err);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Update cart quantities after the cart already exists.\r\n *\r\n * Replaces all reservations on the cart with the new quantities.\r\n * The orders-service handler releases old reservations (returning\r\n * inventory) and creates new ones (decrementing inventory) atomically.\r\n *\r\n * Use this when the user changes ticket counts AFTER the initial\r\n * cart was created via initiateOrder. The cart UUID is preserved,\r\n * so the timer and extension state stay intact.\r\n *\r\n * @returns true on success, false on failure\r\n */\r\nexport async function updateCartQuantities(\r\n cartId: string,\r\n quantities: Record<string | number, number>,\r\n donationAmounts?: Record<string | number, number>\r\n): Promise<boolean> {\r\n try {\r\n // Convert string keys to numbers (the orders-service handler\r\n // unmarshals into map[uint]int).\r\n const numericQuantities: Record<number, number> = {};\r\n for (const [k, v] of Object.entries(quantities)) {\r\n const n = typeof k === 'number' ? k : parseInt(k, 10);\r\n if (!Number.isNaN(n) && v > 0) numericQuantities[n] = v;\r\n }\r\n const numericDonations: Record<number, number> = {};\r\n if (donationAmounts) {\r\n for (const [k, v] of Object.entries(donationAmounts)) {\r\n const n = typeof k === 'number' ? k : parseInt(k, 10);\r\n if (!Number.isNaN(n) && v > 0) numericDonations[n] = v;\r\n }\r\n }\r\n // @fetch-escape: status-only endpoint — PUT /cart/:id returns an empty 2xx (no JSON body)\r\n // on success; the canonical apiPut runs response.json() unconditionally on 2xx and would\r\n // throw on the empty body, mis-reporting a successful cart update as a failure. Migrate once\r\n // the client tolerates 204/empty bodies.\r\n const response = await fetch(`${getOrdersV2Url()}/cart/${cartId}`, {\r\n method: 'PUT',\r\n headers: { 'Content-Type': 'application/json' },\r\n credentials: 'include',\r\n body: JSON.stringify({\r\n quantities: numericQuantities,\r\n ...(Object.keys(numericDonations).length > 0\r\n ? { donationAmounts: numericDonations }\r\n : {}),\r\n }),\r\n });\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n logger.error('Cart update failed:', errorData);\r\n return false;\r\n }\r\n return true;\r\n } catch (err) {\r\n logger.error('updateCartQuantities error:', err);\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Complete reservation after successful payment\r\n *\r\n * Called after Stripe confirms the payment to finalize the order\r\n * and generate tickets.\r\n *\r\n * @param orderUuid - The order UUID\r\n * @returns Success status and message\r\n */\r\nexport async function completeReservation(\r\n orderUuid: string\r\n): Promise<CompleteReservationResponse> {\r\n try {\r\n const apiResult = await apiPost<{ message?: string }>(\r\n `${getPublicBaseUrl()}/orders/complete/${orderUuid}`\r\n );\r\n\r\n if (!apiResult.success) {\r\n return {\r\n success: false,\r\n error: apiResult.error || 'Failed to complete reservation',\r\n };\r\n }\r\n\r\n return {\r\n success: true,\r\n message: apiResult.data?.message,\r\n };\r\n } catch (error) {\r\n logger.error('Error completing reservation:', error);\r\n return { success: false, error: 'Network error completing reservation' };\r\n }\r\n}\r\n\r\n/**\r\n * Cancel reservation and release tickets back to inventory\r\n *\r\n * Called when user abandons checkout or session expires.\r\n *\r\n * @param orderUuid - The order UUID\r\n * @returns Success status and message\r\n */\r\nexport async function cancelReservation(\r\n orderUuid: string\r\n): Promise<CancelReservationResponse> {\r\n try {\r\n const apiResult = await apiPost<{ message?: string }>(\r\n `${getPublicBaseUrl()}/orders/cancel/${orderUuid}`\r\n );\r\n\r\n if (!apiResult.success) {\r\n return {\r\n success: false,\r\n error: apiResult.error || 'Failed to cancel reservation',\r\n };\r\n }\r\n\r\n return {\r\n success: true,\r\n message: apiResult.data?.message,\r\n };\r\n } catch (error) {\r\n logger.error('Error cancelling reservation:', error);\r\n return { success: false, error: 'Network error cancelling reservation' };\r\n }\r\n}\r\n\r\n/**\r\n * Create a new order/cart\r\n *\r\n * This creates an empty order that can be used for checkout.\r\n * The order UUID is used for all subsequent operations.\r\n *\r\n * @param eventId - The event ID\r\n * @param promoCode - Optional promo code to apply\r\n * @returns The order UUID, or null on error\r\n */\r\nexport async function createOrder(\r\n eventId: string | number,\r\n promoCode?: string\r\n): Promise<CreateOrderResponse | null> {\r\n try {\r\n const apiResult = await apiPost<CreateOrderResponse>(\r\n `${getPublicBaseUrl()}/orders/create`,\r\n { eventID: eventId, promoCode }\r\n );\r\n\r\n if (!apiResult.success) {\r\n logger.error('Create order failed:', apiResult.error);\r\n return null;\r\n }\r\n\r\n return apiResult.data!;\r\n } catch (error) {\r\n logger.error('createOrder error:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Get order details (public, no auth required)\r\n *\r\n * Fetches the order details for displaying on the success page.\r\n *\r\n * @param orderId - The order UUID or ID\r\n * @returns The order details, or null on error\r\n */\r\nexport async function getOrder(orderId: string): Promise<Order | null> {\r\n return simpleFetch<Order>(`${getPublicBaseUrl()}/orders/${orderId}`);\r\n}\r\n\r\n/**\r\n * Validate payment intent and complete the order\r\n *\r\n * This is an alternative to completeReservation that accepts\r\n * additional payment details. Used by micdrop-frontend.\r\n *\r\n * @param cartId - The cart/order UUID\r\n * @param payload - Payment validation payload\r\n * @returns Validation result\r\n */\r\nexport async function validatePaymentIntent(\r\n cartId: string,\r\n payload: ValidatePaymentRequest\r\n): Promise<ValidatePaymentResponse | null> {\r\n try {\r\n const apiResult = await apiPost<{ status?: string; orderUUID?: string; uuid?: string }>(\r\n `${getOrdersV2Url()}/validatePaymentIntent/${cartId}`,\r\n payload\r\n );\r\n\r\n if (!apiResult.success) {\r\n logger.error('Payment validation failed:', apiResult.error);\r\n return {\r\n success: false,\r\n status: 'failed',\r\n error: apiResult.error || 'Payment validation failed',\r\n };\r\n }\r\n\r\n const result = apiResult.data!;\r\n return {\r\n success: true,\r\n status: result.status || 'Payment succeeded',\r\n orderUUID: result.orderUUID || result.uuid,\r\n };\r\n } catch (error) {\r\n logger.error('validatePaymentIntent error:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Extend the checkout session by 15 minutes\r\n *\r\n * Users get a limited number of extensions (typically 2-3).\r\n *\r\n * @param orderUuid - The order UUID\r\n * @returns Extension result with new expiry time\r\n */\r\nexport async function extendCheckoutSession(\r\n orderUuid: string\r\n): Promise<ExtendSessionResponse> {\r\n try {\r\n const apiResult = await apiPost<{ newExpiryTime?: string; remainingExtensions?: number }>(\r\n `${getPublicBaseUrl()}/orders/extend-session`,\r\n { orderUuid }\r\n );\r\n\r\n if (!apiResult.success) {\r\n return {\r\n success: false,\r\n error: apiResult.error || 'Failed to extend session',\r\n statusCode: apiResult.statusCode,\r\n };\r\n }\r\n\r\n const result = apiResult.data!;\r\n return {\r\n success: true,\r\n newExpiryTime: result.newExpiryTime,\r\n remainingExtensions: result.remainingExtensions,\r\n };\r\n } catch (error) {\r\n logger.error('Error extending checkout session:', error);\r\n return { success: false, error: 'Network error extending session' };\r\n }\r\n}\r\n\r\n/**\r\n * Get current session status including expiry time\r\n *\r\n * Used to display countdown timer and check if extensions are available.\r\n *\r\n * @param orderUuid - The order UUID\r\n * @returns Session status including expiry time\r\n */\r\nexport async function getSessionStatus(\r\n orderUuid: string\r\n): Promise<SessionStatus> {\r\n try {\r\n const apiResult = await apiGet<SessionStatus>(\r\n `${getPublicBaseUrl()}/orders/session/${orderUuid}`\r\n );\r\n\r\n if (!apiResult.success) {\r\n return {\r\n error: apiResult.error || 'No active session found',\r\n notFound: apiResult.statusCode === 404,\r\n };\r\n }\r\n\r\n const result = apiResult.data!;\r\n return {\r\n expiresAt: result.expiresAt,\r\n extensionCount: result.extensionCount,\r\n remainingExtensions: result.remainingExtensions,\r\n canExtend: result.canExtend,\r\n reservationCount: result.reservationCount,\r\n };\r\n } catch (error) {\r\n logger.error('Error getting session status:', error);\r\n return { error: 'Network error getting session status' };\r\n }\r\n}\r\n\r\n/**\r\n * Initiate a new order (alias for createOrder)\r\n *\r\n * This function provides backwards compatibility with micdrop-frontend.\r\n * It accepts the same parameters as the legacy initiateOrder function.\r\n *\r\n * @param cartData - Object containing eventID and optional quantities/promoCode\r\n * @returns The order UUID, or null on error\r\n */\r\nexport async function initiateOrder(\r\n cartData: {\r\n eventID: string | number;\r\n promoCode?: string;\r\n quantities?: Record<string | number, number>;\r\n } = {} as any\r\n): Promise<string | null> {\r\n try {\r\n const apiResult = await apiPost<{ uuid?: string }>(\r\n `${getPublicBaseUrl()}/orders/create`,\r\n cartData\r\n );\r\n\r\n if (!apiResult.success) {\r\n logger.error('Order initiation failed:', apiResult.error);\r\n return null;\r\n }\r\n\r\n return apiResult.data?.uuid ?? null;\r\n } catch (error) {\r\n logger.error('initiateOrder error:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Track UTM source for analytics\r\n *\r\n * Records the traffic source (utm_source parameter) for marketing analytics.\r\n *\r\n * @param venueId - The venue ID\r\n * @returns Promise that resolves when tracking is complete\r\n */\r\nexport async function trackUTMSource(venueId: string | number): Promise<void> {\r\n if (typeof window === 'undefined') return;\r\n\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const utmSource = urlParams.get('utm_source') || 'Direct';\r\n\r\n try {\r\n // @fetch-escape: fire-and-forget UTM beacon — GET with no response body consumed; simpleFetch would parse JSON on empty 200 and log false-positive errors\r\n await fetch(\r\n `${getPublicBaseUrl()}/utm/${venueId}/${encodeURIComponent(utmSource)}`\r\n );\r\n } catch (error) {\r\n logger.error('UTM tracking failed:', error);\r\n }\r\n}\r\n","/**\r\n * Promo Codes API\r\n *\r\n * Functions for validating and checking promo codes\r\n * in the public checkout flow.\r\n */\r\n\r\nimport { createLogger } from '@getmicdrop/svelte-components/utils/logger';\r\nconst logger = createLogger('VC');\r\nimport { apiGet, apiPost, getOrdersV2Url } from './client.js';\r\nimport type { PromoValidationResponse, HasPromoCodesResponse } from './types.js';\r\n\r\nconst ORDERS_V2_PUBLIC = () => getOrdersV2Url();\r\n\r\n/**\r\n * Validate a promo code for an event\r\n *\r\n * Checks if a promo code is valid and returns its effects:\r\n * - Discount amount and type\r\n * - Hidden ticket reveal\r\n *\r\n * @param eventId - The event ID\r\n * @param code - The promo code to validate\r\n * @returns Validation result with discount info\r\n */\r\nexport async function validatePromoCode(\r\n eventId: string | number,\r\n code: string\r\n): Promise<PromoValidationResponse> {\r\n try {\r\n if (!code || !code.trim()) {\r\n return { valid: false, error: 'Promo code is required' };\r\n }\r\n\r\n // API uses GET with code in URL path\r\n const encodedCode = encodeURIComponent(code.trim());\r\n const apiResult = await apiGet<PromoValidationResponse>(\r\n `/promo-codes/validate/${eventId}/${encodedCode}`\r\n );\r\n\r\n if (!apiResult.success) {\r\n // 404 = invalid code, other errors are server issues\r\n if (apiResult.statusCode === 404) {\r\n return { valid: false, error: 'Invalid promo code' };\r\n }\r\n return { valid: false, error: 'Failed to validate code' };\r\n }\r\n\r\n const result = apiResult.data!;\r\n return {\r\n valid: result.valid ?? true,\r\n revealHiddenTickets: result.revealHiddenTickets,\r\n revealTicketIds: result.revealTicketIds,\r\n provideDiscount: result.provideDiscount,\r\n discountType: result.discountType,\r\n amount: result.amount,\r\n code: result.code || code,\r\n };\r\n } catch (error) {\r\n logger.error('Error validating promo code:', error);\r\n return { valid: false, error: 'Network error validating code' };\r\n }\r\n}\r\n\r\n/**\r\n * Check if promo codes are available for an event\r\n *\r\n * Used to conditionally show/hide the promo code input field.\r\n *\r\n * @param eventId - The event ID\r\n * @returns Whether promo codes exist for this event\r\n */\r\nexport async function hasPromoCodes(eventId: string | number): Promise<boolean> {\r\n try {\r\n const apiResult = await apiGet<HasPromoCodesResponse>(\r\n `/promo-codes/check/${eventId}`\r\n );\r\n\r\n if (!apiResult.success) {\r\n // If endpoint doesn't exist or errors, default to showing the input\r\n return true;\r\n }\r\n\r\n return apiResult.data!.hasPromoCodes === true;\r\n } catch (error) {\r\n logger.error('Error checking promo codes availability:', error);\r\n // Default to showing promo input if we can't check\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Apply a promo code to a cart\r\n *\r\n * This updates the cart with the promo code discount.\r\n *\r\n * @param cartId - The cart UUID\r\n * @param code - The promo code to apply\r\n * @returns Success status\r\n */\r\nexport async function applyPromoCode(\r\n cartId: string,\r\n code: string\r\n): Promise<{ success: boolean; error?: string }> {\r\n try {\r\n // Backend route: POST /api/orders/v2/public/cart/{uuid}/apply-promo with a\r\n // `promoCode` body (mirrors apply-gift-card). The old path/body\r\n // (/orders/{id}/apply-promo + {code}) matched no route, so the cart's\r\n // DiscountAmount was never set and the buyer was charged full price despite\r\n // the UI showing a discount.\r\n const apiResult = await apiPost(\r\n `${ORDERS_V2_PUBLIC()}/cart/${cartId}/apply-promo`,\r\n { promoCode: code }\r\n );\r\n\r\n if (!apiResult.success) {\r\n return {\r\n success: false,\r\n error: apiResult.error || 'Failed to apply promo code',\r\n };\r\n }\r\n\r\n return { success: true };\r\n } catch (error) {\r\n logger.error('Error applying promo code:', error);\r\n return { success: false, error: 'Network error applying code' };\r\n }\r\n}\r\n\r\n/**\r\n * Remove a promo code from a cart\r\n *\r\n * @param cartId - The cart UUID\r\n * @returns Success status\r\n */\r\nexport async function removePromoCode(\r\n cartId: string\r\n): Promise<{ success: boolean; error?: string }> {\r\n try {\r\n const apiResult = await apiPost(`/orders/${cartId}/remove-promo`);\r\n\r\n if (!apiResult.success) {\r\n return {\r\n success: false,\r\n error: apiResult.error || 'Failed to remove promo code',\r\n };\r\n }\r\n\r\n return { success: true };\r\n } catch (error) {\r\n logger.error('Error removing promo code:', error);\r\n return { success: false, error: 'Network error removing code' };\r\n }\r\n}\r\n","import { AppError } from '@getmicdrop/svelte-components';\r\n/**\r\n * Events API\r\n *\r\n * Functions for fetching event data, tickets, and performers\r\n * in the public checkout flow.\r\n */\r\n\r\nimport { createLogger } from '@getmicdrop/svelte-components/utils/logger';\r\nconst logger = createLogger('VC');\r\nimport { getPublicBaseUrl, simpleFetch, apiPost } from './client.js';\r\nimport { parseEventPerformers } from './transformers/performer.js';\r\nimport type {\r\n Event,\r\n AvailableTicket,\r\n EventPerformersResponse,\r\n SeriesOccurrencesResponse,\r\n SeriesPageData,\r\n PublicCollectionData,\r\n ResolvedEntity,\r\n} from './types.js';\r\n\r\n/**\r\n * In-flight `fetchEventDetails` requests keyed by event ID. Lets\r\n * concurrent callers (Checkout, CartView, EventDetailsView, +page.js\r\n * server load — all of which may run during a single navigation) share\r\n * one HTTP request rather than triggering three.\r\n *\r\n * The entry deletes as soon as the underlying promise settles, so this\r\n * is dedup not cache. For real cache-with-TTL we'd want SWR; that's a\r\n * future milestone.\r\n */\r\nconst _eventDetailsInflight = new Map<string, Promise<Event | null>>();\r\n\r\n/**\r\n * Fetch event details\r\n *\r\n * Gets full event information including venue and ticket data.\r\n *\r\n * @param eventId - The event ID\r\n * @param customFetch - Optional custom fetch function (for SSR)\r\n * @returns Event details or null on error\r\n */\r\nexport async function fetchEventDetails(\r\n eventId: string | number,\r\n customFetch: typeof fetch = fetch,\r\n password?: string\r\n): Promise<Event | null> {\r\n // Password-protected events are gated server-side: the detail endpoint returns\r\n // a stripped teaser (+ passwordRequired:true) until the correct ?password= is\r\n // supplied. The password varies the dedup key so an unlock re-fetch is never\r\n // served the cached locked teaser.\r\n const key = password ? `${eventId}:pw` : String(eventId);\r\n // Only dedup when using the default fetch — custom-fetch callers\r\n // (e.g. SvelteKit server loads) bring their own request context.\r\n if (customFetch === fetch) {\r\n const inflight = _eventDetailsInflight.get(key);\r\n if (inflight) return inflight;\r\n }\r\n\r\n const run = (async () => {\r\n try {\r\n const url = password\r\n ? `${getPublicBaseUrl()}/events/${eventId}?password=${encodeURIComponent(password)}`\r\n : `${getPublicBaseUrl()}/events/${eventId}`;\r\n // @fetch-escape: customFetch injection for SSR context — caller-supplied fetch instance, cannot use simpleFetch\r\n const response = await customFetch(url);\r\n if (!response.ok) {\r\n throw new AppError(\r\n `Failed to fetch event details: ${response.status}`,\r\n 'lib/api/events/fetchEventDetails'\r\n );\r\n }\r\n return await response.json();\r\n } catch (error) {\r\n logger.error('Error fetching event details:', error);\r\n return null;\r\n }\r\n })();\r\n\r\n if (customFetch === fetch) {\r\n _eventDetailsInflight.set(key, run);\r\n run.finally(() => {\r\n // Only clear if this same promise is still the inflight one — a\r\n // later call may have set up a fresh request after the user\r\n // triggered an explicit refresh.\r\n if (_eventDetailsInflight.get(key) === run) {\r\n _eventDetailsInflight.delete(key);\r\n }\r\n });\r\n }\r\n return run;\r\n}\r\n\r\n/**\r\n * Fetch available tickets for an event\r\n *\r\n * Returns all ticket types that are currently available for sale.\r\n *\r\n * @param eventId - The event ID\r\n * @returns Array of available tickets\r\n */\r\nexport async function fetchEventTickets(\r\n eventId: string | number\r\n): Promise<AvailableTicket[]> {\r\n try {\r\n const tickets = await simpleFetch<AvailableTicket[]>(\r\n `${getPublicBaseUrl()}/tickets/event/${eventId}`\r\n );\r\n return Array.isArray(tickets) ? tickets : [];\r\n } catch (error) {\r\n logger.error('Error fetching tickets:', error);\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Fetch performers for an event\r\n *\r\n * Returns the lineup with pre-resolved avatar URLs.\r\n *\r\n * @param eventId - The event ID\r\n * @returns Performers list and visibility flag\r\n */\r\nexport async function fetchEventPerformers(\r\n eventId: string | number\r\n): Promise<EventPerformersResponse> {\r\n try {\r\n if (!eventId) {\r\n logger.warn('fetchEventPerformers called without eventId');\r\n return { performers: [], showPerformers: false };\r\n }\r\n\r\n const data = await simpleFetch<EventPerformersResponse>(\r\n `${getPublicBaseUrl()}/events/${eventId}/performers`\r\n );\r\n\r\n if (!data) {\r\n logger.error('Failed to fetch performers: network or server error');\r\n return { performers: [], showPerformers: false };\r\n }\r\n\r\n // Normalization (performers->array, showPerformers->strict boolean) lives\r\n // in parseEventPerformers — byte-identical to the inline mapping it\r\n // replaced. The network-failure guard above stays here.\r\n return parseEventPerformers(data);\r\n } catch (error) {\r\n logger.error('Error fetching event performers:', error);\r\n return { performers: [], showPerformers: false };\r\n }\r\n}\r\n\r\n/**\r\n * Fetch all venues for an organization\r\n *\r\n * @param orgId - The organization ID\r\n * @returns Array of venues\r\n */\r\nexport async function fetchAllVenues(orgId: string | number): Promise<any[]> {\r\n try {\r\n if (!orgId) {\r\n logger.warn('fetchAllVenues called without orgId');\r\n return [];\r\n }\r\n\r\n const venues = await simpleFetch<any[]>(\r\n `${getPublicBaseUrl()}/venues/organization/${orgId}`\r\n );\r\n\r\n if (!venues) {\r\n logger.error('Failed to fetch venues: network or server error');\r\n return [];\r\n }\r\n\r\n return Array.isArray(venues) ? venues : [];\r\n } catch (error) {\r\n logger.error('Error fetching venues:', error);\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Fetch events for a venue\r\n *\r\n * @param venueId - The venue ID\r\n * @returns Array of events\r\n */\r\nexport async function fetchVenueEvents(\r\n venueId: string | number\r\n): Promise<Event[]> {\r\n try {\r\n if (!venueId) {\r\n logger.warn('fetchVenueEvents called without venueId');\r\n return [];\r\n }\r\n\r\n const events = await simpleFetch<Event[]>(\r\n `${getPublicBaseUrl()}/events/venue/${venueId}`\r\n );\r\n\r\n if (!events) {\r\n logger.error('Failed to fetch venue events: network or server error');\r\n return [];\r\n }\r\n\r\n return Array.isArray(events) ? events : [];\r\n } catch (error) {\r\n logger.error('Error fetching venue events:', error);\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Get events for a specific month\r\n *\r\n * Used for calendar views to efficiently load events.\r\n *\r\n * @param venueId - The venue ID\r\n * @param year - The year (e.g., 2024)\r\n * @param month - The month (1-12)\r\n * @returns Array of events for the month\r\n */\r\nexport async function getMonthEvents(\r\n venueId: string | number,\r\n year: number,\r\n month: number\r\n): Promise<Event[]> {\r\n try {\r\n const data = await simpleFetch<{ events?: Event[] } | Event[]>(\r\n `${getPublicBaseUrl()}/events/venue/${venueId}/month/${year}/${month}`\r\n );\r\n\r\n if (!data) {\r\n logger.error('Failed to fetch month events: network or server error');\r\n return [];\r\n }\r\n\r\n if (Array.isArray(data)) return data;\r\n return Array.isArray((data as { events?: Event[] }).events)\r\n ? (data as { events: Event[] }).events\r\n : [];\r\n } catch (error) {\r\n logger.error('Error fetching month events:', error);\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Get events for an organization for a specific month\r\n *\r\n * @param orgId - The organization ID\r\n * @param year - The year (e.g., 2024)\r\n * @param month - The month (1-12)\r\n * @returns Array of events for the month\r\n */\r\nexport async function getOrgMonthEvents(\r\n orgId: string | number,\r\n year: number,\r\n month: number\r\n): Promise<Event[]> {\r\n try {\r\n const data = await simpleFetch<{ events?: Event[] } | Event[]>(\r\n `${getPublicBaseUrl()}/events/organization/${orgId}/month/${year}/${month}`\r\n );\r\n\r\n if (!data) {\r\n logger.error('Failed to fetch org month events: network or server error');\r\n return [];\r\n }\r\n\r\n if (Array.isArray(data)) return data;\r\n return Array.isArray((data as { events?: Event[] }).events)\r\n ? (data as { events: Event[] }).events\r\n : [];\r\n } catch (error) {\r\n logger.error('Error fetching org month events:', error);\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Get series occurrences for date selector\r\n *\r\n * Returns all instances of a recurring event series.\r\n *\r\n * @param eventSeriesId - The series ID\r\n * @returns Series occurrences\r\n */\r\nexport async function getSeriesOccurrences(\r\n eventSeriesId: number\r\n): Promise<SeriesOccurrencesResponse | null> {\r\n try {\r\n const data = await simpleFetch<SeriesOccurrencesResponse>(\r\n `${getPublicBaseUrl()}/series/${eventSeriesId}/occurrences`\r\n );\r\n\r\n if (!data) {\r\n logger.error(\r\n 'Failed to fetch series occurrences: network or server error'\r\n );\r\n return null;\r\n }\r\n\r\n return data;\r\n } catch (error) {\r\n logger.error('Error fetching series occurrences:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Fetch series occurrences with CTA state\r\n *\r\n * Returns full series data including availability status.\r\n *\r\n * @param eventSeriesId - The series ID\r\n * @param venueId - The venue ID\r\n * @returns Series occurrences with CTA state\r\n */\r\nexport async function fetchSeriesOccurrences(\r\n eventSeriesId: number,\r\n venueId: string | number\r\n): Promise<SeriesOccurrencesResponse | null> {\r\n try {\r\n const data = await simpleFetch<SeriesOccurrencesResponse>(\r\n `${getPublicBaseUrl()}/series/${eventSeriesId}/occurrences?venueId=${venueId}`\r\n );\r\n\r\n if (!data) {\r\n logger.error('Failed to fetch series with CTA: network or server error');\r\n return null;\r\n }\r\n\r\n return data;\r\n } catch (error) {\r\n logger.error('Error fetching series occurrences:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Resolve an entity-agnostic public id to its concrete type + data.\r\n *\r\n * The embed deep-link (`#{id}-{slug}`) carries no type prefix, so a cold\r\n * deep link (the show isn't in the loaded calendar month) needs the backend\r\n * to say whether the id is an event, series, or collection before the widget\r\n * can render the right view. This is the same `/api/v2/public/resolve/{id}`\r\n * endpoint get-micdrop.com's `/e/{slugId}` page resolves server-side; here we\r\n * call it cross-origin from the venue's page (the public API already serves\r\n * the calendar cross-origin, so CORS is in place).\r\n *\r\n * @param id - The entity id (numeric, type-agnostic)\r\n * @param slug - Optional slug hint (lets the backend canonicalize)\r\n * @returns `{ type, id, title, data }` or null on failure\r\n */\r\nexport async function resolvePublicEntity(\r\n id: string | number,\r\n slug?: string\r\n): Promise<ResolvedEntity | null> {\r\n try {\r\n const qs = slug ? `?slug=${encodeURIComponent(slug)}` : '';\r\n const data = await simpleFetch<ResolvedEntity>(\r\n `${getPublicBaseUrl()}/resolve/${encodeURIComponent(String(id))}${qs}`\r\n );\r\n\r\n if (!data || !data.type) {\r\n throw new AppError(\r\n 'Failed to resolve entity',\r\n 'lib/api/events/resolvePublicEntity'\r\n );\r\n }\r\n\r\n return data;\r\n } catch (error) {\r\n logger.error('Error resolving public entity:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Fetch series page data\r\n *\r\n * Returns full series information including occurrences, venue, and performers.\r\n *\r\n * @param seriesId - The series ID\r\n * @returns Series page data or null on error\r\n */\r\nexport async function fetchSeriesPage(\r\n seriesId: string | number\r\n): Promise<SeriesPageData | null> {\r\n try {\r\n const data = await simpleFetch<SeriesPageData>(\r\n `${getPublicBaseUrl()}/series/${seriesId}/page`\r\n );\r\n\r\n if (!data) {\r\n throw new AppError(\r\n 'Failed to fetch series page',\r\n 'lib/api/events/fetchSeriesPage'\r\n );\r\n }\r\n\r\n return data;\r\n } catch (error) {\r\n logger.error('Error fetching series page:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Fetch public collection data\r\n *\r\n * Returns collection info including events list.\r\n * For password-protected collections, pass the password to authenticate.\r\n *\r\n * @param collectionId - The collection ID\r\n * @param password - Optional password for protected collections\r\n * @returns Collection data or null on error\r\n */\r\nexport async function fetchPublicCollection(\r\n collectionId: string | number,\r\n password?: string\r\n): Promise<PublicCollectionData | null> {\r\n try {\r\n // Backend route is GET /api/v2/public/collections/:id (password via ?password=\r\n // query, read by GetPublicCollection). The previous \"/public\" suffix matched\r\n // no route and 404'd every public collection fetch.\r\n const url = password\r\n ? `${getPublicBaseUrl()}/collections/${collectionId}?password=${encodeURIComponent(password)}`\r\n : `${getPublicBaseUrl()}/collections/${collectionId}`;\r\n\r\n const data = await simpleFetch<PublicCollectionData>(url);\r\n\r\n if (!data) {\r\n throw new AppError(\r\n 'Failed to fetch collection',\r\n 'lib/api/events/fetchPublicCollection'\r\n );\r\n }\r\n\r\n return data;\r\n } catch (error) {\r\n logger.error('Error fetching collection:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Check collection password\r\n *\r\n * Validates password for password-protected collections.\r\n *\r\n * @param collectionId - The collection ID\r\n * @param password - The password to check\r\n * @returns Whether the password is valid\r\n */\r\nexport async function checkCollectionPassword(\r\n collectionId: string | number,\r\n password: string\r\n): Promise<boolean> {\r\n try {\r\n const encodedPassword = encodeURIComponent(password);\r\n const result = await simpleFetch<{ valid: boolean }>(\r\n `${getPublicBaseUrl()}/collections/${collectionId}/check-password/${encodedPassword}`\r\n );\r\n\r\n return result?.valid === true;\r\n } catch (error) {\r\n logger.error('Error checking collection password:', error);\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Check event password\r\n *\r\n * Validates password for password-protected events.\r\n *\r\n * @param eventId - The event ID\r\n * @param password - The password to check\r\n * @returns Whether the password is valid\r\n */\r\nexport async function checkEventPassword(\r\n eventId: string | number,\r\n password: string\r\n): Promise<{ valid: boolean }> {\r\n try {\r\n // POST in the body — never in the URL path, which is captured by\r\n // access logs, browser history, and Referer headers.\r\n const apiResult = await apiPost<{ valid: boolean } | boolean>(\r\n `${getPublicBaseUrl()}/events/${eventId}/check-password`,\r\n { password }\r\n );\r\n\r\n if (!apiResult.success) return { valid: false };\r\n\r\n const result = apiResult.data;\r\n if (typeof result === 'boolean') return { valid: result };\r\n return { valid: (result as { valid: boolean }).valid === true };\r\n } catch (error) {\r\n logger.error('Error checking event password:', error);\r\n return { valid: false };\r\n }\r\n}\r\n\r\n/**\r\n * Test network connection\r\n *\r\n * Health check endpoint for connectivity testing.\r\n *\r\n * @param orgId - Optional org ID\r\n * @param venueId - Optional venue ID\r\n * @returns Whether the connection is working\r\n */\r\nexport async function testNetworkConnection(\r\n orgId?: string | number,\r\n venueId?: string | number\r\n): Promise<boolean> {\r\n try {\r\n // Use a simple endpoint to test connectivity\r\n const url = venueId\r\n ? `${getPublicBaseUrl()}/events/venue/${venueId}`\r\n : orgId\r\n ? `${getPublicBaseUrl()}/venues/organization/${orgId}`\r\n : `${getPublicBaseUrl()}/health`;\r\n\r\n // @fetch-escape: HEAD request for connectivity probe — simpleFetch always parses JSON body; HEAD has no body\r\n const response = await fetch(url, {\r\n method: 'HEAD',\r\n });\r\n\r\n return response.ok;\r\n } catch (error) {\r\n logger.error('Network connection test failed:', error);\r\n return false;\r\n }\r\n}\r\n","/**\r\n * Venues API\r\n *\r\n * Functions for fetching venue data including\r\n * service fees and tax configuration.\r\n */\r\n\r\nimport { createLogger } from '@getmicdrop/svelte-components/utils/logger';\r\nconst logger = createLogger('VC');\r\nimport { apiGet } from './client.js';\r\nimport type { Venue } from './types.js';\r\n\r\n/**\r\n * Get venue details (public, no auth required)\r\n *\r\n * Fetches venue information including service fees and taxes\r\n * needed for checkout calculations.\r\n *\r\n * @param venueId - The venue ID\r\n * @returns Venue details or null on error\r\n */\r\nexport async function getVenue(venueId: string | number): Promise<Venue | null> {\r\n try {\r\n if (!venueId) {\r\n logger.warn('getVenue called without venueId');\r\n return null;\r\n }\r\n\r\n const result = await apiGet<Venue>(`/venues/${venueId}`);\r\n if (!result.success) {\r\n logger.error(`Failed to fetch venue: ${result.statusCode}`);\r\n return null;\r\n }\r\n return result.data ?? null;\r\n } catch (error) {\r\n logger.error('Error fetching venue:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Get venue service fee configuration\r\n *\r\n * Returns just the fee-related fields for checkout calculations.\r\n *\r\n * @param venueId - The venue ID\r\n * @returns Fee configuration or null on error\r\n */\r\nexport async function getVenueFees(\r\n venueId: string | number\r\n): Promise<{\r\n serviceFeePercentage: number;\r\n serviceFeeCents: number;\r\n taxPercentage: number;\r\n} | null> {\r\n const venue = await getVenue(venueId);\r\n\r\n if (!venue) {\r\n return null;\r\n }\r\n\r\n return {\r\n serviceFeePercentage: venue.serviceFeePercentage ?? 0,\r\n serviceFeeCents: venue.serviceFeeCents ?? 0,\r\n taxPercentage: venue.taxPercentage ?? 0,\r\n };\r\n}\r\n\r\n/**\r\n * Get venue by slug\r\n *\r\n * Fetches venue using its URL-friendly slug.\r\n *\r\n * @param slug - The venue slug\r\n * @returns Venue details or null on error\r\n */\r\nexport async function getVenueBySlug(slug: string): Promise<Venue | null> {\r\n try {\r\n if (!slug) {\r\n logger.warn('getVenueBySlug called without slug');\r\n return null;\r\n }\r\n\r\n const encodedSlug = encodeURIComponent(slug);\r\n const result = await apiGet<Venue>(`/venues/slug/${encodedSlug}`);\r\n if (!result.success) {\r\n logger.error(`Failed to fetch venue by slug: ${result.statusCode}`);\r\n return null;\r\n }\r\n return result.data ?? null;\r\n } catch (error) {\r\n logger.error('Error fetching venue by slug:', error);\r\n return null;\r\n }\r\n}\r\n","/**\r\n * Gift Card Application Transformer\r\n *\r\n * Normalizes the orders-service `POST /cart/{id}/apply-gift-card` SUCCESS\r\n * payload into the ApplyGiftCardResult shape the Checkout component /\r\n * GiftCardInput consume.\r\n *\r\n * Wire->domain boundary: one parseGiftCardApplication(raw: unknown) entry\r\n * point. The wire field shape (ApplyGiftCardApiResponse) is named ONLY inside\r\n * this module and never escapes. Error paths (429 rate-limit, !success,\r\n * network catch) are CALLER concerns and stay in applyGiftCard -- this parser\r\n * only maps the success body.\r\n *\r\n * UNIT CONTRACT (do NOT \"fix\" this -- VC public endpoints speak cents):\r\n * Backend ApplyGiftCardResponse (orders-service controllers/cart.go):\r\n * - appliedAmount : integer CENTS (int64)\r\n * - giftCardBalance : integer CENTS (int64)\r\n * - remainingTotal : DOLLARS (float64)\r\n * Domain ApplyGiftCardResult (formatCurrency-ready, DOLLARS):\r\n * - giftCardAmount : appliedAmount / 100 (cents -> dollars)\r\n * - stripeAmount : remainingTotal (already dollars, no /100)\r\n * - giftCardBalance : passed through as-is (raw CENTS, not displayed via\r\n * formatCurrency)\r\n * The cents->dollars conversion lives HERE, exactly where/how the inline\r\n * mapper in applyGiftCard had it -- byte-identical.\r\n */\r\n\r\nimport type { ApplyGiftCardResult } from '../gift-cards.js';\r\n\r\n// -- Wire shape (internal -- never exported) ---------------------------------\r\n// Source of truth: orders-service controllers/cart.go ApplyGiftCardResponse.\r\ninterface ApplyGiftCardApiResponse {\r\n valid: boolean;\r\n message?: string;\r\n giftCardCode?: string;\r\n giftCardBalance?: number; // cents\r\n appliedAmount?: number; // cents\r\n remainingTotal?: number; // dollars\r\n fullyCoveredByCard?: boolean;\r\n}\r\n\r\n/**\r\n * Parse a successful apply-gift-card backend payload into ApplyGiftCardResult.\r\n *\r\n * Maps the real backend contract to what the Checkout component expects:\r\n * - appliedAmount (cents) -> giftCardAmount (dollars)\r\n * - remainingTotal (dollars) -> stripeAmount (dollars, residual to charge)\r\n * - fullyCoveredByCard -> paymentType 'gift_card_only' | 'split' + requiresStripe\r\n * Byte-identical to the inline success-path mapping previously in applyGiftCard.\r\n */\r\nexport function parseGiftCardApplication(raw: unknown): ApplyGiftCardResult {\r\n const data = (raw ?? {}) as ApplyGiftCardApiResponse;\r\n\r\n const giftCardAmountDollars = (data.appliedAmount ?? 0) / 100;\r\n const residualDollars = data.remainingTotal ?? 0;\r\n // Full coverage when the card covers everything (no residual to charge).\r\n const fullyCovered = data.fullyCoveredByCard ?? residualDollars <= 0;\r\n const requiresStripe = !fullyCovered;\r\n\r\n return {\r\n valid: true,\r\n giftCardCode: data.giftCardCode,\r\n giftCardAmount: giftCardAmountDollars,\r\n giftCardBalance: data.giftCardBalance,\r\n paymentType: fullyCovered ? 'gift_card_only' : 'split',\r\n stripeAmount: residualDollars,\r\n orderTotal: giftCardAmountDollars + residualDollars,\r\n requiresStripe,\r\n };\r\n}\r\n","import { AppError, asVenueId } from '@getmicdrop/svelte-components';\r\nimport type { VenueId } from '@getmicdrop/svelte-components';\r\n/**\r\n * Gift Card Purchase API Client\r\n * Handles gift card purchase creation, cart application/removal,\r\n * and gift-card-only checkout completion.\r\n */\r\n\r\nimport { createLogger } from '@getmicdrop/svelte-components/utils/logger';\r\nimport { getOrdersV2Url, apiPost, apiDelete } from './client.js';\r\nimport { parseGiftCardApplication } from './transformers/giftCard.js';\r\nconst logger = createLogger('VC');\r\n\r\nconst API_BASE_URL = 'https://get-micdrop.com';\r\nconst ORDERS_V2_URL = `${API_BASE_URL}/api/orders/v2`;\r\nconst ORDERS_V2_PUBLIC = () => getOrdersV2Url();\r\n\r\n/**\r\n * Request payload for creating a gift card purchase\r\n */\r\nexport interface GiftCardPurchaseRequest {\r\n // Public boundary — accept plain number too so external TypeScript callers\r\n // that pass `venueId: 1` keep compiling. Runtime serializes a number either\r\n // way. Internal call sites pass branded VenueId via asVenueId().\r\n venueId: number | VenueId;\r\n amount: number; // In cents (e.g., 5000 = $50.00)\r\n recipientEmail: string;\r\n recipientName: string;\r\n personalMessage?: string;\r\n purchaserEmail: string;\r\n purchaserName: string;\r\n scheduledDeliveryAt?: string | null; // ISO date string or null for immediate\r\n}\r\n\r\n/**\r\n * Response from gift card purchase creation\r\n */\r\nexport interface GiftCardPurchaseResponse {\r\n giftCardUUID: string;\r\n clientSecret: string;\r\n amount: number;\r\n stripePublishableKey: string;\r\n}\r\n\r\n/**\r\n * Venue information needed for gift card purchase\r\n */\r\nexport interface VenueInfo {\r\n id: VenueId;\r\n name: string;\r\n slug: string;\r\n stripePublishableKey?: string;\r\n}\r\n\r\n/**\r\n * Create a gift card purchase and get Stripe client secret\r\n * @param req - Gift card purchase request details\r\n * @returns Gift card UUID and Stripe client secret, or null on failure\r\n */\r\nexport async function createGiftCardPurchase(\r\n req: GiftCardPurchaseRequest\r\n): Promise<GiftCardPurchaseResponse | null> {\r\n try {\r\n const apiResult = await apiPost<GiftCardPurchaseResponse>(\r\n `${ORDERS_V2_URL}/gift-cards`,\r\n req\r\n );\r\n\r\n if (!apiResult.success) {\r\n logger.error('Gift card purchase creation failed:', apiResult.error);\r\n throw new AppError(apiResult.error || 'Failed to create gift card purchase', 'lib/api/gift-cards/createGiftCardPurchase');\r\n }\r\n\r\n logger.debug('Gift card purchase created:', apiResult.data);\r\n return apiResult.data!;\r\n } catch (error) {\r\n logger.error('Gift card purchase creation error:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Result shape consumed by the Checkout component / GiftCardInput.\r\n * Monetary fields here are in DOLLARS (formatCurrency-ready).\r\n */\r\nexport interface ApplyGiftCardResult {\r\n valid: boolean;\r\n giftCardCode?: string;\r\n giftCardAmount?: number; // dollars applied from the gift card\r\n giftCardBalance?: number; // cents (raw balance, not displayed via formatCurrency)\r\n paymentType?: string; // 'gift_card_only' (full) | 'split' (partial)\r\n stripeAmount?: number; // dollars the card must still cover (residual)\r\n orderTotal?: number; // dollars (gift card + residual)\r\n requiresStripe?: boolean;\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Apply a gift card to a cart.\r\n */\r\nexport async function applyGiftCard(\r\n cartId: string,\r\n code: string\r\n): Promise<ApplyGiftCardResult> {\r\n try {\r\n const apiResult = await apiPost<unknown>(\r\n `${ORDERS_V2_PUBLIC()}/cart/${cartId}/apply-gift-card`,\r\n { giftCardCode: code }\r\n );\r\n\r\n if (!apiResult.success) {\r\n if (apiResult.statusCode === 429) {\r\n return {\r\n valid: false,\r\n error: 'Too many attempts. Please wait a moment and try again.',\r\n };\r\n }\r\n logger.error('Apply gift card failed:', apiResult.error);\r\n return { valid: false, error: apiResult.error || 'Invalid gift card code' };\r\n }\r\n\r\n // Success-path mapping (cents->dollars, fullyCovered/requiresStripe) lives\r\n // in parseGiftCardApplication — byte-identical to the inline mapper this\r\n // replaced. The cents->dollars conversion stays in the parser (unit\r\n // contract documented there). Error/429/network branches stay here.\r\n return parseGiftCardApplication(apiResult.data);\r\n } catch (err) {\r\n logger.error('applyGiftCard error:', err);\r\n return {\r\n valid: false,\r\n error: 'Network error. Please check your connection and try again.',\r\n };\r\n }\r\n}\r\n\r\nexport interface RemoveGiftCardResult {\r\n success: boolean;\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Remove a gift card from a cart.\r\n */\r\nexport async function removeGiftCard(cartId: string): Promise<RemoveGiftCardResult> {\r\n try {\r\n const apiResult = await apiDelete(`${ORDERS_V2_PUBLIC()}/cart/${cartId}/gift-card`);\r\n\r\n if (!apiResult.success) {\r\n logger.error('Remove gift card failed:', apiResult.error);\r\n return { success: false, error: apiResult.error || 'Failed to remove gift card' };\r\n }\r\n\r\n return { success: true };\r\n } catch (err) {\r\n logger.error('removeGiftCard error:', err);\r\n return {\r\n success: false,\r\n error: 'Network error. Please check your connection and try again.',\r\n };\r\n }\r\n}\r\n\r\nexport interface CompleteGiftCardPaymentInput {\r\n firstName: string;\r\n lastName: string;\r\n email: string;\r\n phoneNumber?: string | null;\r\n mailingList?: boolean;\r\n}\r\n\r\nexport interface CompleteGiftCardPaymentResult {\r\n success: boolean;\r\n orderId?: string;\r\n confirmationNumber?: string;\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Complete a gift-card-only payment (no Stripe required when balance >= total).\r\n */\r\nexport async function completeGiftCardPayment(\r\n cartId: string,\r\n customerDetails: CompleteGiftCardPaymentInput\r\n): Promise<CompleteGiftCardPaymentResult> {\r\n try {\r\n const apiResult = await apiPost<{ orderId?: string; confirmationNumber?: string }>(\r\n `${ORDERS_V2_PUBLIC()}/cart/${cartId}/complete-gift-card-payment`,\r\n {\r\n firstName: customerDetails.firstName,\r\n lastName: customerDetails.lastName,\r\n email: customerDetails.email,\r\n phoneNumber: customerDetails.phoneNumber || null,\r\n mailingList: customerDetails.mailingList || false,\r\n }\r\n );\r\n\r\n if (!apiResult.success) {\r\n logger.error('Complete gift card payment failed:', apiResult.error);\r\n return { success: false, error: apiResult.error || 'Failed to complete payment' };\r\n }\r\n\r\n return {\r\n success: true,\r\n orderId: apiResult.data?.orderId,\r\n confirmationNumber: apiResult.data?.confirmationNumber,\r\n };\r\n } catch (err) {\r\n logger.error('completeGiftCardPayment error:', err);\r\n return {\r\n success: false,\r\n error: 'Network error. Please check your connection and try again.',\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Fetch venue information by slug\r\n * @param slug - Venue slug\r\n * @returns Venue info or null on failure\r\n */\r\nexport async function getVenueBySlug(\r\n slug: string,\r\n customFetch: typeof fetch = fetch\r\n): Promise<VenueInfo | null> {\r\n try {\r\n // @fetch-escape: customFetch injection for SSR context — cannot use apiGet (caller-supplied fetch instance)\r\n const response = await customFetch(\r\n `${API_BASE_URL}/api/v2/public/venues/slug/${slug}`\r\n );\r\n\r\n if (!response.ok) {\r\n logger.error(`Failed to fetch venue by slug: ${response.status}`);\r\n return null;\r\n }\r\n\r\n const venue = await response.json();\r\n return {\r\n id: asVenueId(venue.id),\r\n name: venue.name,\r\n slug: venue.slug,\r\n stripePublishableKey: venue.stripePublishableKey,\r\n };\r\n } catch (error) {\r\n logger.error('Error fetching venue by slug:', error);\r\n return null;\r\n }\r\n}\r\n","/**\r\n * Waitlist API\r\n *\r\n * Endpoints for the sold-out-event waitlist flow.\r\n */\r\n\r\nimport { createLogger } from '@getmicdrop/svelte-components/utils/logger';\r\nimport { apiPost, apiGet } from './client.js';\r\n\r\nconst logger = createLogger('VC');\r\n\r\nexport interface JoinWaitlistResult {\r\n success: boolean;\r\n // No position — opaque to the customer (decision #2/#20).\r\n updated?: boolean;\r\n error?: string;\r\n}\r\n\r\nconst WAITLIST_ERROR_MESSAGES: Record<string, string> = {\r\n waitlist_not_enabled: 'Waitlist is not available for this event',\r\n event_not_found: 'Event not found',\r\n invalid_phone: 'Please enter a valid phone number',\r\n already_purchased: 'You have already purchased tickets for this event',\r\n phone_already_registered: 'This phone number is already on the waitlist',\r\n};\r\n\r\n/**\r\n * Join the waitlist for a sold-out event.\r\n */\r\nexport async function joinWaitlist(\r\n eventId: string | number,\r\n email: string,\r\n phone: string | null = null,\r\n smsOptIn = false\r\n): Promise<JoinWaitlistResult> {\r\n try {\r\n const body: Record<string, unknown> = { email };\r\n if (phone && smsOptIn) {\r\n body.phone = phone;\r\n body.smsOptIn = true;\r\n }\r\n\r\n const apiResult = await apiPost<{ updated?: boolean }>(\r\n `/events/${eventId}/waitlist`,\r\n body\r\n );\r\n\r\n if (!apiResult.success) {\r\n logger.error('Join waitlist failed:', apiResult.error);\r\n return {\r\n success: false,\r\n error:\r\n WAITLIST_ERROR_MESSAGES[apiResult.error ?? ''] ||\r\n 'Failed to join waitlist. Please try again.',\r\n };\r\n }\r\n\r\n return {\r\n success: true,\r\n updated: apiResult.data?.updated,\r\n };\r\n } catch (err) {\r\n logger.error('joinWaitlist error:', err);\r\n return {\r\n success: false,\r\n error: 'Network error. Please check your connection and try again.',\r\n };\r\n }\r\n}\r\n\r\nexport interface WaitlistStatusResult {\r\n waitlistEnabled: boolean;\r\n soldOut: boolean;\r\n /**\r\n * When gated, the public event page should present \"Sold Out — join the\r\n * waitlist\" to non-members even if tickets are technically available, and only\r\n * a valid tokenized link unlocks checkout (reconciled decision #3).\r\n */\r\n gated: boolean;\r\n}\r\n\r\n/**\r\n * Fetch an event's waitlist gating status. Returns a non-gated default if the\r\n * request fails so the page degrades to normal behavior.\r\n */\r\nexport async function getWaitlistStatus(\r\n eventId: string | number\r\n): Promise<WaitlistStatusResult> {\r\n const fallback: WaitlistStatusResult = {\r\n waitlistEnabled: false,\r\n soldOut: false,\r\n gated: false,\r\n };\r\n try {\r\n const apiResult = await apiGet<{ waitlistEnabled: boolean; soldOut: boolean; gated: boolean }>(\r\n `/events/${eventId}/waitlist/status`\r\n );\r\n if (!apiResult.success) return fallback;\r\n return {\r\n waitlistEnabled: !!apiResult.data?.waitlistEnabled,\r\n soldOut: !!apiResult.data?.soldOut,\r\n gated: !!apiResult.data?.gated,\r\n };\r\n } catch (err) {\r\n logger.error('getWaitlistStatus error:', err);\r\n return fallback;\r\n }\r\n}\r\n","/**\n * Event Transformer\n *\n * Normalizes API event responses to a consistent format.\n * Handles image URL resolution and CTA state calculation.\n *\n * Wire->domain boundary: one parse<Entity>(raw: unknown) per entity.\n * The wire field shape (ApiEvent / ApiTicket interface) is named only inside\n * this module and never escapes it. Above the boundary only Event / AvailableTicket.\n *\n * IMPLEMENTATION NOTE — why no Zod schema here:\n * The old mappers used `||` (falsy fallthrough) for every primitive field, so\n * {venueId:0, venue_id:7} -> 7, {isHidden:false, is_hidden:true} -> true, etc.\n * Zod z.number()/z.boolean() would throw on wrong primitive types; firstDefined\n * (??) would silently mis-select 0/false values. This implementation replicates\n * the old `||` chains verbatim, wrapped in a typed parse<Entity>(raw: unknown)\n * boundary. Throw behavior is identical to the old mapper: null/undefined input (property access on a nullish value)\n * or a non-array where .map is called throws exactly as the old code did. Callers\n * always pass real wire objects.\n */\n\nimport type { Event, AvailableTicket } from '../types.js';\n\n// CDN base URL for images\nconst CDN_BASE_URL = 'https://micdrop-images.sfo3.digitaloceanspaces.com';\n\n// ── Wire shape (internal — never exported) ───────────────────────────────\ninterface ApiTicket {\n id?: number;\n ID?: number;\n name?: string;\n ticketName?: string;\n description?: string;\n price?: number;\n quantity?: number;\n totalQuantity?: number;\n quantitySold?: number;\n quantity_sold?: number;\n quantityAvailable?: number;\n quantity_available?: number;\n minPerOrder?: number;\n min_per_order?: number;\n maxPerOrder?: number;\n max_per_order?: number;\n saleStartDate?: string;\n sale_start_date?: string;\n saleEndDate?: string;\n sale_end_date?: string;\n isHidden?: boolean;\n is_hidden?: boolean;\n revealWithPromoCode?: boolean;\n reveal_with_promo_code?: boolean;\n ticketType?: number;\n ticket_type?: number;\n sectionId?: number;\n section_id?: number;\n sortOrder?: number;\n sort_order?: number;\n}\n\ninterface ApiEvent {\n eventID?: number;\n id?: number;\n ID?: number;\n name?: string;\n title?: string;\n slug?: string;\n description?: string;\n date?: string;\n startDateTime?: string;\n start_date_time?: string;\n endDateTime?: string;\n end_date_time?: string;\n doorsOpenTime?: string;\n doors_open_time?: string;\n timezone?: string;\n time_zone?: string;\n venueId?: number;\n venue_id?: number;\n venueName?: string;\n venue_name?: string;\n venueAddress?: string;\n venue_address?: string;\n location?: string;\n imageUrl?: string;\n imageURL?: string;\n image_url?: string;\n image?: string;\n status?: string;\n isPublished?: boolean;\n is_published?: boolean;\n isCancelled?: boolean;\n is_cancelled?: boolean;\n availableTickets?: any[];\n available_tickets?: any[];\n tickets?: any[];\n ticketsAvailable?: number;\n tickets_available?: number;\n ticketsSold?: number;\n tickets_sold?: number;\n minPrice?: number;\n min_price?: number;\n maxPrice?: number;\n max_price?: number;\n ctaText?: string;\n cta_text?: string;\n ctaState?: string;\n cta_state?: string;\n showPerformers?: boolean;\n show_performers?: boolean;\n eventSeriesId?: number;\n event_series_id?: number;\n seriesInstanceNumber?: number;\n series_instance_number?: number;\n // ── Passthrough seam fields (events convergence) ──────────────────────\n // Carried verbatim onto the domain Event so the view-shape projections\n // (utils/event-transform.js DETAIL/BROWSE, pcf/transform.ts EventData) can\n // compose parseEvent instead of reading the wire directly. See the\n // composition note above parseEvent.\n timeZone?: string; // PascalCase variant some admin payloads carry\n eventSummary?: string;\n password?: string;\n hasPassword?: boolean;\n disclaimer?: string;\n ticketType?: number; // event-level ticketing type (1 = registration)\n eventTicketingType?: number;\n ageRestriction?: number;\n displayAgeRestriction?: boolean;\n displayStartTime?: boolean;\n displayEndTime?: boolean;\n displayDoorsTime?: boolean;\n collectionId?: number;\n collection_id?: number;\n ticketsRemaining?: number; // backend-supplied scarcity (org-month endpoint)\n ticketsTotal?: number;\n hasHiddenTickets?: boolean;\n stage?: { name?: string } | null;\n stageName?: string;\n // Widget-filter dimensions carried by the public month feeds (venue +\n // organization). publicPerformers is the backend's redacted summary\n // (id/displayName/image) — ids are roster-performer ids, the same id-space\n // the widget builder's performer filter saves.\n stageId?: number;\n eventCategoryTypes?: number[] | null;\n publicPerformers?: Array<{\n id?: number;\n displayName?: string;\n image?: string;\n }> | null;\n collectionIds?: number[] | null;\n venue?: Record<string, any>;\n performers?: Record<string, any>[];\n faqs?: Record<string, any>[];\n showtimes?: Record<string, any>[];\n purchasedTickets?: Record<string, any>[];\n}\n\n/**\n * Get CDN image URL\n *\n * Prepends the CDN base URL if the path is relative.\n */\nexport function getCDNImageUrl(path: string | undefined): string {\n if (!path) return '';\n if (path.startsWith('http')) return path;\n return `${CDN_BASE_URL}/${path.replace(/^\\//, '')}`;\n}\n\n/**\n * Extract image URL from event with fallbacks.\n *\n * NOTE: shadows SC's hoisted `getEventImageUrl` (surfaced once VC pinned SC\n * 6.24.78 for EventCard). NOT swapped to SC's yet because the field coverage\n * differs -- this transformer reads `imageUrl -> imageURL -> image_url -> image`\n * (incl. the camelCase `imageURL`, asserted by event.test.ts), whereas SC reads\n * `image -> coverImage -> imageUrl -> image_url` (no `imageURL`, different\n * precedence). Reconciling those is consolidation audit #4/#5's job; deferring\n * here keeps the API-transformer behavior unchanged.\n */\n// eslint-disable-next-line micdrop/no-shadowed-helper -- see note above: SC's getEventImageUrl has different field coverage; consolidation deferred to audit #4/#5\nexport function getEventImageUrl(apiEvent: ApiEvent): string {\n const rawUrl =\n apiEvent.imageUrl ||\n apiEvent.imageURL ||\n apiEvent.image_url ||\n apiEvent.image ||\n '';\n\n return getCDNImageUrl(rawUrl);\n}\n\n/**\n * Calculate CTA state based on ticket availability\n */\n/**\n * VC's 4-state CTA derivation (available/sold_out/coming_soon/ended) for parsed events.\n * Distinct from SC's `calculateCtaState` (richer wire-level canonical) — renamed to\n * avoid shadowing the SC export; this variant reads the parsed/raw event shape parseEvent consumes.\n */\nexport function deriveEventCtaState(\n apiEvent: ApiEvent\n): 'available' | 'sold_out' | 'coming_soon' | 'ended' {\n // Check explicit CTA state first\n const explicitState = apiEvent.ctaState || apiEvent.cta_state;\n if (explicitState) {\n return explicitState as any;\n }\n\n // Check if event is cancelled or ended\n if (apiEvent.isCancelled || apiEvent.is_cancelled) {\n return 'ended';\n }\n\n // Check event date\n const eventDate =\n apiEvent.startDateTime || apiEvent.start_date_time || apiEvent.date;\n if (eventDate) {\n const eventTime = new Date(eventDate).getTime();\n const now = Date.now();\n\n if (eventTime < now) {\n return 'ended';\n }\n }\n\n // Check ticket availability\n const availableCount =\n apiEvent.ticketsAvailable ?? apiEvent.tickets_available;\n\n if (availableCount !== undefined) {\n if (availableCount <= 0) {\n return 'sold_out';\n }\n return 'available';\n }\n\n // Check tickets array\n const tickets =\n apiEvent.availableTickets ||\n apiEvent.available_tickets ||\n apiEvent.tickets ||\n [];\n\n if (tickets.length === 0) {\n return 'coming_soon';\n }\n\n const totalAvailable = tickets.reduce((sum: number, t: any) => {\n const qty = t.quantityAvailable ?? t.quantity_available ?? t.quantity ?? 0;\n const sold = t.quantitySold ?? t.quantity_sold ?? 0;\n return sum + Math.max(0, qty - sold);\n }, 0);\n\n if (totalAvailable <= 0) {\n return 'sold_out';\n }\n\n return 'available';\n}\n\n/**\n * Parse a raw ticket payload into the normalized AvailableTicket domain shape.\n *\n * Wire shape is contained inside this module. Uses `||` chains matching the\n * old transformer exactly -- 0/false values fall through to the next variant\n * or default, byte-identical to previous behavior.\n */\nexport function parseTicket(raw: unknown): AvailableTicket {\n const apiTicket = raw as ApiTicket;\n return {\n id: apiTicket.id || apiTicket.ID,\n name: apiTicket.name || apiTicket.ticketName || '',\n description: apiTicket.description,\n price: apiTicket.price || 0,\n quantity: apiTicket.quantity || apiTicket.totalQuantity || 0,\n quantitySold: apiTicket.quantitySold || apiTicket.quantity_sold || 0,\n quantityAvailable:\n apiTicket.quantityAvailable ||\n apiTicket.quantity_available ||\n (apiTicket.quantity || 0) - (apiTicket.quantitySold || 0),\n minPerOrder: apiTicket.minPerOrder || apiTicket.min_per_order || 1,\n maxPerOrder: apiTicket.maxPerOrder || apiTicket.max_per_order || 10,\n saleStartDate: apiTicket.saleStartDate || apiTicket.sale_start_date,\n saleEndDate: apiTicket.saleEndDate || apiTicket.sale_end_date,\n isHidden: apiTicket.isHidden || apiTicket.is_hidden || false,\n revealWithPromoCode:\n apiTicket.revealWithPromoCode || apiTicket.reveal_with_promo_code,\n ticketType: apiTicket.ticketType || apiTicket.ticket_type || 0,\n sectionId: apiTicket.sectionId || apiTicket.section_id,\n sortOrder: apiTicket.sortOrder || apiTicket.sort_order || 0,\n };\n}\n\n/**\n * Parse a raw event payload into the normalized Event domain shape.\n *\n * Wire shape (ApiEvent) is contained inside this module and never escapes it.\n * Uses `||` chains matching the old transformer exactly -- 0/false values fall\n * through to the next variant, byte-identical to previous behavior. Throw\n * behavior preserved from old mapper: null/undefined input (property access on a nullish value) or a non-array\n * tickets field throws exactly as the old code did. Callers always pass real\n * wire objects.\n *\n * COMPOSITION NOTE — passthrough seams (events convergence):\n * The trailing block of fields below is carried VERBATIM from the wire (no\n * fallback chains, no normalization) so that the view-shape projections —\n * `utils/event-transform.js` (DETAIL/BROWSE) and\n * `public-calendar-flow/transform.ts` (EventData) — can compose parseEvent\n * for every event-level scalar instead of reading the wire themselves.\n * `venue`/`performers`/`faqs`/`showtimes`/`purchasedTickets` stay raw objects\n * by contract: their consumers (and #260's performer canonical) own that\n * variance; normalizing them here would change rendered output.\n */\nexport function parseEvent(raw: unknown): Event {\n const apiEvent = raw as ApiEvent;\n\n // Extract tickets array from various possible field names\n const rawTickets =\n apiEvent.availableTickets ||\n apiEvent.available_tickets ||\n apiEvent.tickets ||\n [];\n\n const tickets = rawTickets.map(parseTicket);\n\n // Calculate min/max prices from tickets\n const prices = tickets.map(t => t.price).filter(p => p > 0);\n const minPrice = prices.length > 0 ? Math.min(...prices) : undefined;\n const maxPrice = prices.length > 0 ? Math.max(...prices) : undefined;\n\n return {\n eventID: apiEvent.eventID || apiEvent.id || apiEvent.ID || 0,\n id: apiEvent.id || apiEvent.ID,\n name: apiEvent.name || apiEvent.title || '',\n title: apiEvent.title || apiEvent.name,\n slug: apiEvent.slug,\n description: apiEvent.description,\n date:\n apiEvent.date || apiEvent.startDateTime || apiEvent.start_date_time || '',\n startDateTime: apiEvent.startDateTime || apiEvent.start_date_time,\n endDateTime: apiEvent.endDateTime || apiEvent.end_date_time,\n doorsOpenTime: apiEvent.doorsOpenTime || apiEvent.doors_open_time,\n timezone: apiEvent.timezone || apiEvent.time_zone,\n venueId: apiEvent.venueId || apiEvent.venue_id,\n venueName: apiEvent.venueName || apiEvent.venue_name,\n venueAddress: apiEvent.venueAddress || apiEvent.venue_address,\n location:\n apiEvent.location || apiEvent.venueAddress || apiEvent.venue_address,\n imageUrl: getEventImageUrl(apiEvent),\n imageURL: getEventImageUrl(apiEvent),\n status: apiEvent.status,\n isPublished: apiEvent.isPublished ?? apiEvent.is_published,\n isCancelled: apiEvent.isCancelled ?? apiEvent.is_cancelled,\n availableTickets: tickets,\n ticketsAvailable:\n apiEvent.ticketsAvailable ??\n apiEvent.tickets_available ??\n tickets.reduce((sum, t) => sum + (t.quantityAvailable || 0), 0),\n ticketsSold: apiEvent.ticketsSold ?? apiEvent.tickets_sold,\n minPrice: apiEvent.minPrice ?? apiEvent.min_price ?? minPrice,\n maxPrice: apiEvent.maxPrice ?? apiEvent.max_price ?? maxPrice,\n ctaText: apiEvent.ctaText || apiEvent.cta_text,\n ctaState: deriveEventCtaState(apiEvent),\n showPerformers: apiEvent.showPerformers ?? apiEvent.show_performers,\n eventSeriesId: apiEvent.eventSeriesId || apiEvent.event_series_id,\n seriesInstanceNumber:\n apiEvent.seriesInstanceNumber || apiEvent.series_instance_number,\n // ── Passthrough seams (see composition note above) — verbatim wire ──\n timeZone: apiEvent.timeZone,\n eventSummary: apiEvent.eventSummary,\n password: apiEvent.password,\n hasPassword: apiEvent.hasPassword,\n disclaimer: apiEvent.disclaimer,\n ticketType: apiEvent.ticketType,\n eventTicketingType: apiEvent.eventTicketingType,\n ageRestriction: apiEvent.ageRestriction,\n displayAgeRestriction: apiEvent.displayAgeRestriction,\n displayStartTime: apiEvent.displayStartTime,\n displayEndTime: apiEvent.displayEndTime,\n displayDoorsTime: apiEvent.displayDoorsTime,\n collectionId: apiEvent.collectionId || apiEvent.collection_id,\n ticketsRemaining: apiEvent.ticketsRemaining,\n ticketsTotal: apiEvent.ticketsTotal,\n hasHiddenTickets: apiEvent.hasHiddenTickets,\n stage: apiEvent.stage,\n stageName: apiEvent.stageName,\n stageId: apiEvent.stageId,\n eventCategoryTypes: apiEvent.eventCategoryTypes,\n publicPerformers: apiEvent.publicPerformers,\n collectionIds: apiEvent.collectionIds,\n venue: apiEvent.venue,\n performers: apiEvent.performers,\n faqs: apiEvent.faqs,\n showtimes: apiEvent.showtimes,\n purchasedTickets: apiEvent.purchasedTickets,\n };\n}\n\n/**\n * Back-compat alias -- existing call sites using transformTicket continue\n * to work unchanged.\n */\nexport const transformTicket = parseTicket;\n\n/**\n * Back-compat alias -- existing call sites using transformEvent(apiEvent)\n * continue to work unchanged.\n */\nexport const transformEvent = parseEvent;\n\n/**\n * Legacy transformer name for backwards compatibility.\n */\nexport const transformEventData = parseEvent;\n\nexport function parseEventList(raws: unknown[]): Event[] {\n return raws.map(parseEvent);\n}\n","/**\n * Event Transformation Utilities\n *\n * View-shape PROJECTIONS over the canonical wire→domain boundary.\n *\n * COMPOSITION NOTE (events convergence): `transformEvent` (DETAIL) and\n * `transformEventData` (BROWSE) are domain→view projections — every\n * event-level scalar is read off `parseEvent`'s Event domain\n * ($lib/api/transformers/event.ts), never off the wire. Three deliberate\n * wire seams remain, characterization-pinned in\n * event-shapers.characterization.test.js:\n *\n * 1. TICKETS — detail tickets pass through RAW (spread + status) by\n * contract: downstream (TicketsGroup, premium-ticket-experience, SC's\n * filterPublicTickets/calculateScarcity/calculateTicketStatus) owns the\n * ticket wire variance (visibility/salesChannel/remainingCapacity/…).\n * parseTicket NORMALIZES to AvailableTicket — routing tickets through it\n * would drop those fields and change rendered output.\n * 2. IMAGE — resolved via SC's getEventImageUrl (placeholder-injecting\n * wrapper below); its field precedence intentionally differs from the\n * canonical transformer's (see note in api/transformers/event.ts).\n * 3. eventID — preserves the legacy raw `.ID`-only read (admin-shaped\n * payloads); domain.eventID folds id variants and defaults to 0,\n * which would change the output for id-only payloads.\n *\n * Domain projection widens snake_case coverage (start_date_time etc. now\n * fold) — strictly additive; real payloads are camelCase.\n */\n\nimport {\n formatDate as scFormatDate,\n formatDateRaw,\n getIANATimezone,\n // Canonical ticket/event-image transforms — VC's local copies were deleted in\n // favour of these (consolidation audit #4/#5, SC 6.24.75). `getEventImageUrl`\n // is re-exported below (renamed from SC's) as the placeholder-injecting\n // wrapper; the others are re-exported verbatim for back-compat.\n getEventImageUrl as scGetEventImageUrl,\n calculateTicketStatus,\n filterPublicTickets,\n calculateScarcity,\n findLowestPrice,\n // Canonical hidden-ticket purchasability predicate. SC's copy was pinned FROM\n // VC's body (dedup #392); it additionally prefers the backend-resolved\n // `effectiveSalesBegin`/`effectiveSalesEnd` window for relative-offset\n // tickets (#388), falling back to VC's raw alias chain when absent.\n isHiddenTicketPurchasable,\n // Event-level wrapper (same dedup): reads availableTickets (+ snake/`tickets`\n // aliases) and honours the backend `hasHiddenTickets` flag. Superset of VC's\n // former local body, which only read `availableTickets`.\n eventHasPurchasableHiddenTickets,\n} from '@getmicdrop/svelte-components';\nimport {\n formatEventTime,\n formatTimeRange,\n getDateParts as getDatePartsNew,\n} from './datetime.js';\n// Canonical wire→domain boundary — all event-level scalar reads go through it.\nimport { parseEvent } from '$lib/api/transformers/event';\n\n// Re-export the SC canonicals so `$lib/utils/utils.js` and other call sites\n// that import these from this module keep working unchanged.\nexport {\n calculateTicketStatus,\n filterPublicTickets,\n calculateScarcity,\n findLowestPrice,\n isHiddenTicketPurchasable,\n eventHasPurchasableHiddenTickets,\n};\n\n/**\n * Default placeholder image\n * Using a data URI SVG to avoid third-party dependencies\n */\nconst PLACEHOLDER_IMAGE =\n 'data:image/svg+xml,' +\n encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 200 300\" fill=\"none\">\n <rect width=\"200\" height=\"300\" fill=\"#E5E7EB\"/>\n <rect x=\"60\" y=\"90\" width=\"80\" height=\"80\" rx=\"10\" fill=\"#D1D5DB\"/>\n <circle cx=\"85\" cy=\"115\" r=\"10\" fill=\"#9CA3AF\"/>\n <path d=\"M70 155 L100 125 L130 155 L130 155\" stroke=\"#9CA3AF\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"/>\n <text x=\"100\" y=\"210\" text-anchor=\"middle\" font-family=\"system-ui, sans-serif\" font-size=\"14\" fill=\"#6B7280\">Event Image</text>\n</svg>`);\n\n// ============================================================================\n// Shared Helpers\n// ============================================================================\n\n/**\n * Extract image URL from event data with fallbacks.\n *\n * Thin wrapper over SC's canonical `getEventImageUrl`, injecting VC's inline\n * SVG placeholder for the no-image case (SC intentionally does NOT bake in an\n * app-specific placeholder). Declared under a non-shadowing name and re-exported\n * below as `getEventImageUrl` so call sites keep their existing import.\n *\n * @param {Object} event - Event object from API\n * @returns {string} Resolved image URL\n */\nfunction resolveEventImageUrl(event) {\n return scGetEventImageUrl(event, { placeholder: PLACEHOLDER_IMAGE });\n}\n\nexport { resolveEventImageUrl as getEventImageUrl };\n\n// `isHiddenTicketPurchasable` — \"Sales ended\" / \"Sold out\" / \"No tickets\" →\n// \"Get tickets\" override (promo-gated tickets still on sale) — now comes from\n// @getmicdrop/svelte-components (imported + re-exported at the top of this\n// file). VC's identical local copy was deleted in the dedup #392 migration.\n\n// `eventHasPurchasableHiddenTickets` (the event-level \"any purchasable hidden\n// ticket?\" check, with the `hasHiddenTickets` strip-flag fallback) now also\n// comes from @getmicdrop/svelte-components (imported + re-exported above). VC's\n// local copy was deleted in the dedup #392 migration so the predicate has a\n// single source.\n\n// `filterPublicTickets`, `calculateScarcity`, and `findLowestPrice` now come\n// from @getmicdrop/svelte-components (imported + re-exported at the top of this\n// file). VC's identical local copies were deleted in the SC 6.24.75 migration.\n\n// ============================================================================\n// Date/Time Formatting\n// Now uses consolidated datetime module from @getmicdrop/svelte-components\n// ============================================================================\n\n/**\n * Format a datetime for display in a specific timezone.\n * @deprecated Use formatEventTime from datetime.js\n *\n * @param {string} isoString - ISO datetime string\n * @param {string} timeZone - IANA timezone\n * @param {Object} options - Intl.DateTimeFormat options\n * @returns {string} Formatted string\n */\n// Memoize Intl.DateTimeFormat instances. Constructing a formatter is\n// expensive (~1ms each call in V8); a typical month-fetch transforms\n// 50–200 events × multiple format calls → noticeable CPU on slow venues.\n// Cache is keyed by (locale, timeZone, JSON(options)); bounded by an LRU.\nconst _formatterCache = new Map();\nconst _formatterCacheMax = 64;\n\nfunction _getFormatter(locale, timeZone, options) {\n const key = `${locale}|${timeZone}|${JSON.stringify(options)}`;\n let fmt = _formatterCache.get(key);\n if (fmt) {\n // Refresh recency.\n _formatterCache.delete(key);\n _formatterCache.set(key, fmt);\n return fmt;\n }\n fmt = new Intl.DateTimeFormat(locale, { ...options, timeZone });\n _formatterCache.set(key, fmt);\n if (_formatterCache.size > _formatterCacheMax) {\n // Evict oldest insertion. Map preserves insertion order.\n const oldestKey = _formatterCache.keys().next().value;\n _formatterCache.delete(oldestKey);\n }\n return fmt;\n}\n\nexport function formatInTimezone(isoString, timeZone, options) {\n if (!isoString) return '';\n\n const date = new Date(isoString);\n if (isNaN(date.getTime())) return '';\n\n return _getFormatter('en-US', timeZone, options).format(date);\n}\n\n/**\n * Format event time range for display.\n * Uses formatTimeRange from datetime module.\n *\n * @param {Object} event - Event object with startDateTime/endDateTime\n * @param {string} timeZone - IANA timezone\n * @returns {string} Formatted time range (e.g., \"8:00 PM - 10:00 PM\")\n */\nexport function formatEventTimeRange(event, timeZone) {\n if (!event.startDateTime) return '';\n\n try {\n if (!event.endDateTime) {\n return formatEventTime(event.startDateTime, timeZone);\n }\n return formatTimeRange(event.startDateTime, event.endDateTime, timeZone);\n } catch {\n // Fallback to legacy implementation for invalid data\n const formatOptions = {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n };\n\n const startTime = formatInTimezone(\n event.startDateTime,\n timeZone,\n formatOptions\n );\n\n if (!event.endDateTime) return startTime;\n\n const endTime = formatInTimezone(\n event.endDateTime,\n timeZone,\n formatOptions\n );\n return startTime && endTime ? `${startTime} - ${endTime}` : startTime;\n }\n}\n\n/**\n * Get event date parts for display: day-of-week (short), month (short), and\n * day-of-month (as a string).\n *\n * Thin adapter over SC's canonical `getDateParts` (imported as `getDatePartsNew`\n * above to avoid shadowing). SC returns `{ day, month, date: number, year }`;\n * this adapter renames `date` → `dateOfMonth` and stringifies it to match the\n * shape expected by `transformDetailEvent` and the event-detail widget props.\n * The fallback branch preserves legacy behaviour when the SC call throws\n * (e.g. malformed ISO input).\n *\n * @param {string} isoString - ISO datetime string\n * @param {string} timeZone - IANA timezone\n * @returns {{ day: string, month: string, dateOfMonth: string }}\n */\nexport function getEventDateParts(isoString, timeZone) {\n if (!isoString) return { day: '', month: '', dateOfMonth: '' };\n\n try {\n const parts = getDatePartsNew(isoString, timeZone);\n return {\n day: parts.day,\n month: parts.month,\n dateOfMonth: String(parts.date),\n };\n } catch {\n // Fallback to legacy implementation for invalid data\n return {\n day: formatInTimezone(isoString, timeZone, { weekday: 'short' }),\n month: formatInTimezone(isoString, timeZone, { month: 'short' }),\n dateOfMonth: formatInTimezone(isoString, timeZone, { day: 'numeric' }),\n };\n }\n}\n\n// ============================================================================\n// Main Transform Functions\n// ============================================================================\n\n/**\n * Transform modes for different use cases.\n */\nexport const TransformMode = {\n /** Minimal data for list/card views */\n BROWSE: 'browse',\n /** Full data for detail pages */\n DETAIL: 'detail',\n};\n\n/**\n * Transform an API event into display-ready format.\n *\n * @param {Object} apiEvent - Raw event from API\n * @param {Object} options - Transform options\n * @param {string} options.mode - Transform mode: 'browse' or 'detail'\n * @returns {Object} Transformed event\n */\nexport function transformEvent(\n apiEvent,\n options = { mode: TransformMode.DETAIL }\n) {\n const { mode = TransformMode.DETAIL } = options;\n\n if (!apiEvent) {\n return mode === TransformMode.BROWSE\n ? getEmptyBrowseEvent()\n : getEmptyDetailEvent();\n }\n\n // Wire→domain ONCE. Every event-level scalar below projects off `domain`;\n // the remaining direct `apiEvent` reads are the documented seams (see the\n // module composition note).\n const domain = parseEvent(apiEvent);\n\n // Raw API events carry lowercase `timezone` / snake `time_zone`; some carry\n // PascalCase `timeZone`. domain.timeZone is the verbatim PascalCase\n // passthrough, domain.timezone folds the other two — same chain as before,\n // so non-LA venues aren't defaulted to LA.\n const timeZone = getIANATimezone(domain.timeZone || domain.timezone);\n const imageUrl = resolveEventImageUrl(apiEvent); // image seam\n\n // Base properties shared by both modes\n const base = {\n id: domain.id,\n name: domain.title || '',\n image: imageUrl,\n timeZone,\n startDateTime: domain.startDateTime || null,\n };\n\n if (mode === TransformMode.BROWSE) {\n return transformBrowseEvent(apiEvent, domain, base, timeZone);\n }\n\n return transformDetailEvent(apiEvent, domain, base, timeZone, imageUrl);\n}\n\n/**\n * Transform for browse/list views (minimal data).\n */\nfunction transformBrowseEvent(apiEvent, domain, base, timeZone) {\n // Calculate date in venue timezone\n let startDate = '';\n if (domain.startDateTime) {\n const dt = new Date(domain.startDateTime);\n startDate = formatDateRaw(\n dt,\n {\n timeZone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n },\n 'en-CA'\n );\n }\n\n // Filter and calculate scarcity. Prefer backend-supplied\n // ticketsRemaining/ticketsTotal when present (org-month endpoint, which\n // omits the full ticket array).\n let scarcity;\n if (\n typeof domain.ticketsRemaining === 'number' &&\n typeof domain.ticketsTotal === 'number'\n ) {\n const totalRemaining = domain.ticketsRemaining;\n const totalCapacity = domain.ticketsTotal;\n scarcity = {\n totalRemaining,\n totalCapacity,\n isSoldOut: totalCapacity > 0 && totalRemaining <= 0,\n };\n } else {\n // TICKET SEAM: scarcity math operates on RAW wire tickets (visibility/\n // salesChannel fields parseTicket doesn't carry) — see composition note.\n const publicTickets = filterPublicTickets(apiEvent.availableTickets || [], {\n excludeDoorOnly: true,\n publicOnly: false,\n });\n scarcity = calculateScarcity(publicTickets);\n }\n\n return {\n ...base,\n date: startDate || domain.date || '',\n status: domain.status || 'On Sale',\n timeline: formatEventTimeRange(domain, timeZone),\n description: domain.description || domain.eventSummary || '',\n venueId: domain.venueId,\n eventSeriesId: domain.eventSeriesId || null,\n // Scarcity data\n ticketsRemaining: scarcity.totalRemaining,\n ticketsTotal: scarcity.totalCapacity,\n isSoldOut: scarcity.isSoldOut,\n // TICKET SEAM (raw ticket scan)\n hasPurchasableHiddenTickets: eventHasPurchasableHiddenTickets(apiEvent),\n // Widget-filter dimensions (saved-widget engine) — pass-through so\n // lib/widget-filters.js can answer stage/type/age/performer/collection\n // filters on the live embed. `?? null` (not `||`): ageRestriction 0 is a\n // real value (\"All ages\"); stageId 0 (= no stage) is normalized to null in\n // the widget-filters adapter, not here.\n stageId: domain.stageId ?? null,\n eventCategoryTypes: domain.eventCategoryTypes ?? null,\n ageRestriction: domain.ageRestriction ?? null,\n publicPerformers: domain.publicPerformers ?? null,\n collectionIds: domain.collectionIds ?? null,\n };\n}\n\n/**\n * Transform for detail views (full data).\n */\nfunction transformDetailEvent(apiEvent, domain, base, timeZone, imageUrl) {\n // TICKET SEAM: detail tickets pass through RAW (spread + derived status) —\n // downstream owns the ticket wire variance. See composition note.\n const allTickets = (apiEvent.availableTickets || []).map(ticket => ({\n ...ticket,\n status: calculateTicketStatus(ticket),\n }));\n const publicTickets = filterPublicTickets(allTickets, {\n excludeDoorOnly: false,\n publicOnly: true,\n });\n const dateParts = getEventDateParts(domain.startDateTime, timeZone);\n\n return {\n ...base,\n date: domain.startDateTime ? formatDateCustom(domain.startDateTime) : null,\n endDateTime: domain.endDateTime,\n description: domain.description,\n timeline: formatInTimezone(domain.startDateTime, timeZone, {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n }),\n location:\n domain.venue?.googleLocationNameCache || domain.venue?.address || '',\n ...dateParts,\n coverImage: imageUrl,\n price: findLowestPrice(apiEvent.availableTickets), // ticket seam\n status: domain.status || 'On Sale',\n eventSummary: domain.eventSummary,\n password: domain.password,\n availableTickets: allTickets,\n publicTickets,\n // TICKET SEAM (raw ticket scan)\n hasPurchasableHiddenTickets: eventHasPurchasableHiddenTickets(apiEvent),\n doorsOpenTime: domain.doorsOpenTime,\n venue: domain.venue,\n venueID: domain.venueId,\n // eventID SEAM: legacy `.ID`-only read — see composition note.\n eventID: apiEvent.ID,\n stage: domain.stage,\n performers: domain.performers,\n ticketType: domain.ticketType,\n eventTicketingType: domain.eventTicketingType,\n purchasedTickets: domain.purchasedTickets,\n ShowImage: imageUrl,\n displayStartTime: domain.displayStartTime,\n displayEndTime: domain.displayEndTime,\n displayDoorsTime: domain.displayDoorsTime,\n ageRestriction: domain.ageRestriction || null,\n minimumAge: domain.ageRestriction || null,\n ageRequirement: domain.ageRestriction ? `${domain.ageRestriction}` : null,\n hasAgeRestriction: !!domain.ageRestriction,\n displayAgeRestriction: domain.displayAgeRestriction ?? false,\n };\n}\n\n/**\n * Format date to custom format (for backwards compatibility).\n * Uses SC's formatDate with weekday: 'short' (defaults: month short, day numeric, year numeric).\n */\nfunction formatDateCustom(isoString) {\n if (!isoString) return null;\n const result = scFormatDate(isoString, { weekday: 'short' });\n return result || null;\n}\n\n/**\n * Empty event for browse mode.\n */\nfunction getEmptyBrowseEvent() {\n return {\n id: null,\n name: '',\n date: '',\n image: '',\n status: 'unavailable',\n timeline: '',\n description: '',\n venueId: null,\n timeZone: 'UTC',\n eventSeriesId: null,\n startDateTime: null,\n ticketsRemaining: 0,\n ticketsTotal: 0,\n isSoldOut: false,\n hasPurchasableHiddenTickets: false,\n };\n}\n\n/**\n * Empty event for detail mode.\n */\nfunction getEmptyDetailEvent() {\n return {\n id: null,\n name: '',\n date: null,\n startDateTime: null,\n endDateTime: null,\n description: '',\n timeline: '',\n location: '',\n day: '',\n month: '',\n dateOfMonth: null,\n image: '',\n coverImage: '',\n price: 0,\n status: 'unavailable',\n eventSummary: '',\n password: '',\n availableTickets: [],\n publicTickets: [],\n hasPurchasableHiddenTickets: false,\n doorsOpenTime: null,\n venue: null,\n venueID: null,\n eventID: null,\n stage: null,\n performers: [],\n ticketType: 0,\n eventTicketingType: 0,\n purchasedTickets: [],\n ShowImage: '',\n displayStartTime: null,\n displayEndTime: null,\n ageRestriction: null,\n minimumAge: null,\n ageRequirement: null,\n hasAgeRestriction: false,\n timeZone: 'UTC',\n };\n}\n\n// ============================================================================\n// Backward Compatibility Exports\n// ============================================================================\n\n/**\n * @deprecated Use transformEvent(event, { mode: TransformMode.BROWSE }) instead.\n */\nexport function transformEventData(apiEvent) {\n return transformEvent(apiEvent, { mode: TransformMode.BROWSE });\n}\n","/*! js-cookie v3.0.8 | MIT */\nfunction assign (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (key === '__proto__') continue\n target[key] = source[key];\n }\n }\n return target\n}\n\nvar defaultConverter = {\n read: function (value) {\n if (value[0] === '\"') {\n value = value.slice(1, -1);\n }\n return value.replace(/(%[\\dA-F]{2})+/gi, decodeURIComponent)\n },\n write: function (value) {\n return encodeURIComponent(value).replace(\n /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,\n decodeURIComponent\n )\n }\n};\n\nfunction init(converter, defaultAttributes) {\n function set(name, value, attributes) {\n if (typeof document === 'undefined') {\n return\n }\n\n attributes = assign({}, defaultAttributes, attributes);\n\n if (typeof attributes.expires === 'number') {\n attributes.expires = new Date(Date.now() + attributes.expires * 864e5);\n }\n if (attributes.expires) {\n attributes.expires = attributes.expires.toUTCString();\n }\n\n name = encodeURIComponent(name)\n .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)\n .replace(/[()]/g, escape);\n\n var stringifiedAttributes = '';\n for (var attributeName in attributes) {\n if (!attributes[attributeName]) {\n continue\n }\n\n stringifiedAttributes += '; ' + attributeName;\n\n if (attributes[attributeName] === true) {\n continue\n }\n\n // Considers RFC 6265 section 5.2:\n // ...\n // 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n // character:\n // Consume the characters of the unparsed-attributes up to,\n // not including, the first %x3B (\";\") character.\n // ...\n stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n }\n\n return (document.cookie =\n name + '=' + converter.write(value, name) + stringifiedAttributes)\n }\n\n function get(name) {\n if (typeof document === 'undefined' || (arguments.length && !name)) {\n return\n }\n\n // To prevent the for loop in the first place assign an empty array\n // in case there are no cookies at all.\n var cookies = document.cookie ? document.cookie.split('; ') : [];\n var jar = {};\n for (var i = 0; i < cookies.length; i++) {\n var parts = cookies[i].split('=');\n var value = parts.slice(1).join('=');\n\n try {\n var found = decodeURIComponent(parts[0]);\n if (!(found in jar)) jar[found] = converter.read(value, found);\n if (name === found) {\n break\n }\n } catch (_e) {\n // Do nothing...\n }\n }\n\n return name ? jar[name] : jar\n }\n\n return Object.create(\n {\n set: set,\n get: get,\n remove: function (name, attributes) {\n set(\n name,\n '',\n assign({}, attributes, {\n expires: -1\n })\n );\n },\n withAttributes: function (attributes) {\n return init(this.converter, assign({}, this.attributes, attributes))\n },\n withConverter: function (converter) {\n return init(assign({}, this.converter, converter), this.attributes)\n }\n },\n {\n attributes: { value: Object.freeze(defaultAttributes) },\n converter: { value: Object.freeze(converter) }\n }\n )\n}\n\nvar api = init(defaultConverter, { path: '/' });\n\nexport { api as default };\n","/**\r\n * Cookie management wrappers around js-cookie\r\n */\r\nimport Cookies from \"js-cookie\";\r\n\r\nexport function setCookie(name: string, value: string, options: Parameters<typeof Cookies.set>[2] = {}): void {\r\n Cookies.set(name, value, options);\r\n}\r\n\r\nexport function getCookie(name: string): string | undefined {\r\n return Cookies.get(name);\r\n}\r\n\r\nexport function removeCookie(name: string): void {\r\n Cookies.remove(name);\r\n}\r\n","// @storage-escape: Canonical checkout-state persistence wrapper — this\r\n// module IS the localStorage layer for checkout state (cart, promo,\r\n// totals) across page refreshes. utility-storage record documents\r\n// the persistence-wrapper shape as exempt.\r\n\r\nimport { createLogger } from '@getmicdrop/svelte-components';\r\n/**\r\n * Checkout state persistence: localStorage with cookie fallback for migration\r\n */\r\nimport { getCookie, setCookie, removeCookie } from './cookies';\r\n\r\nconst logger = createLogger('checkoutState');\r\n\r\ninterface CheckoutTicket {\r\n ID: number | string;\r\n name: string;\r\n price: number;\r\n type?: string;\r\n visibility?: string;\r\n salesChannel?: string;\r\n [key: string]: unknown;\r\n}\r\n\r\ninterface CheckoutState {\r\n quantities: Record<string, number>;\r\n donationAmounts: Record<string, number>;\r\n promocode: string;\r\n promoDiscountAmount: number;\r\n tickets: CheckoutTicket[];\r\n}\r\n\r\ninterface PersistCheckoutParams {\r\n eventID: string;\r\n quantities: Record<string, number>;\r\n donationAmounts?: Record<string, number>;\r\n promocode: string;\r\n promoDiscountAmount: number;\r\n tickets: CheckoutTicket[];\r\n}\r\n\r\n/**\r\n * Load checkout state from localStorage (preferred) with cookie fallback for migration\r\n */\r\nexport function loadCheckoutStateFromCookies(eventID: string): CheckoutState {\r\n let quantities: Record<string, number> = {};\r\n let donationAmounts: Record<string, number> = {};\r\n let tickets: CheckoutTicket[] = [];\r\n let promocode = '';\r\n let promoDiscountAmount = 0;\r\n\r\n if (typeof window === 'undefined') {\r\n return {\r\n quantities,\r\n donationAmounts,\r\n promocode,\r\n promoDiscountAmount,\r\n tickets,\r\n };\r\n }\r\n\r\n // Try localStorage first (new approach)\r\n try {\r\n const stored = localStorage.getItem(`checkout-state-${eventID}`); // @storage-escape: canonical checkout-state persistence wrapper — this module IS the localStorage layer (see file header)\r\n if (stored) {\r\n const parsed = JSON.parse(stored);\r\n return {\r\n quantities: parsed.quantities || {},\r\n donationAmounts: parsed.donationAmounts || {},\r\n promocode: parsed.promocode || '',\r\n promoDiscountAmount: parseFloat(parsed.promoDiscountAmount) || 0,\r\n tickets: parsed.tickets || [],\r\n };\r\n }\r\n } catch (e) {\r\n logger.warn('Failed to parse checkout state from localStorage:', e);\r\n }\r\n\r\n // Fallback to cookies for migration (old approach)\r\n try {\r\n quantities = JSON.parse(\r\n getCookie(`checkout-quantities-${eventID}`) || '{}'\r\n );\r\n } catch (e) {\r\n logger.warn('Failed to parse checkout quantities cookie:', e);\r\n quantities = {};\r\n }\r\n\r\n try {\r\n tickets = JSON.parse(getCookie(`checkout-tickets-${eventID}`) || '[]');\r\n } catch (e) {\r\n logger.warn('Failed to parse checkout tickets cookie:', e);\r\n tickets = [];\r\n }\r\n\r\n promocode = getCookie(`checkout-promocode-${eventID}`) || '';\r\n promoDiscountAmount = parseFloat(getCookie('checkout-promo-discount') || '0');\r\n\r\n // If we found data in cookies, migrate it to localStorage and clear cookies\r\n if (Object.keys(quantities).length > 0 || tickets.length > 0 || promocode) {\r\n persistCheckoutState({\r\n eventID,\r\n quantities,\r\n donationAmounts,\r\n promocode,\r\n promoDiscountAmount,\r\n tickets,\r\n });\r\n clearCheckoutCookies(eventID);\r\n }\r\n\r\n return {\r\n quantities,\r\n donationAmounts,\r\n promocode,\r\n promoDiscountAmount,\r\n tickets,\r\n };\r\n}\r\n\r\n/**\r\n * Clear checkout state from both localStorage and cookies\r\n */\r\nexport function clearCheckoutCookies(eventID: string): void {\r\n // Clear localStorage (new approach)\r\n if (typeof window !== 'undefined') {\r\n localStorage.removeItem(`checkout-state-${eventID}`); // @storage-escape: canonical checkout-state persistence wrapper — this module IS the localStorage layer (see file header)\r\n }\r\n\r\n // Clear cookies (for migration cleanup)\r\n removeCookie(`checkout-quantities-${eventID}`);\r\n removeCookie(`checkout-promocode-${eventID}`);\r\n removeCookie(`checkout-promo-discount`);\r\n removeCookie(`checkout-tickets-${eventID}`);\r\n}\r\n\r\n/**\r\n * Persist checkout state to localStorage\r\n * Uses localStorage instead of cookies to avoid size limits and reduce request overhead\r\n */\r\nexport function persistCheckoutState({\r\n eventID,\r\n quantities,\r\n donationAmounts,\r\n promocode,\r\n promoDiscountAmount,\r\n tickets,\r\n}: PersistCheckoutParams): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n // Store minimal ticket data to avoid storage bloat\r\n const minimalTickets = (tickets || []).map(t => ({\r\n ID: t.ID,\r\n name: t.name,\r\n price: t.price,\r\n type: t.type, // Include type for donation ticket detection\r\n visibility: t.visibility,\r\n salesChannel: t.salesChannel,\r\n }));\r\n\r\n const state = {\r\n quantities: quantities || {},\r\n donationAmounts: donationAmounts || {},\r\n promocode: promocode || '',\r\n promoDiscountAmount: promoDiscountAmount || 0,\r\n tickets: minimalTickets,\r\n updatedAt: Date.now(),\r\n };\r\n\r\n try {\r\n localStorage.setItem(`checkout-state-${eventID}`, JSON.stringify(state)); // @storage-escape: canonical checkout-state persistence wrapper — this module IS the localStorage layer (see file header)\r\n } catch (e) {\r\n logger.warn('Failed to persist checkout state to localStorage:', e);\r\n }\r\n}\r\n\r\n/**\r\n * Ensure order ID exists, create if not\r\n */\r\nexport async function ensureOrderIdExists(eventId: string): Promise<string> {\r\n const existingOrderId = getCookie(`order-id-${eventId}`);\r\n\r\n if (existingOrderId) {\r\n return existingOrderId;\r\n }\r\n\r\n const newOrderId = `order-${eventId}-${Date.now()}`;\r\n // SameSite=None; Secure so the cookie survives iframe embeds on\r\n // third-party origins (Safari ITP / Chrome SameSite-Lax-by-default).\r\n setCookie(`order-id-${eventId}`, newOrderId, {\r\n secure: true,\r\n sameSite: 'none' as const,\r\n path: '/',\r\n });\r\n\r\n return newOrderId;\r\n}\r\n","import { AppError, createLogger } from '@getmicdrop/svelte-components';\r\n/**\r\n * Order-related API calls: getVenueDetails, initiateOrder, getOrder,\r\n * createPaymentIntent, validatePaymentIntent, getClientIP\r\n *\r\n * @legacy-retire-with=?legacy=1\r\n * LEGACY — slated for deletion. Do NOT add new code here and do NOT build\r\n * canonicals against the untyped `[key: string]: unknown` bag interfaces below\r\n * (VenueResponse / PaymentIntentResponse / ValidatePaymentResponse /\r\n * OrderResponse). They survive only via `as` casts and exist purely for\r\n * backward compat. The canonical, typed wire->domain home for all of this is\r\n * `src/lib/api/transformers/*` (parseOrder, parseCart, parseGiftCardApplication,\r\n * parseEventPerformers, parseVenue, parseEvent) composed by the `src/lib/api/*`\r\n * clients (orders.ts, gift-cards.ts, events.ts). Retire this module behind the\r\n * `?legacy=1` flag once its remaining consumer is migrated to `$lib/api/*`.\r\n *\r\n * Live consumer (as of this change): `src/lib/utils/utils.js` re-exports\r\n * getClientIP / getVenueDetails / initiateOrder / getOrder / createPaymentIntent\r\n * / validatePaymentIntent from here (the `$lib/utils/utils.js` back-compat\r\n * barrel). That barrel is the single retirement blocker to plan around.\r\n */\r\nimport { apiGet, apiPost } from '$lib/api/client';\r\nimport { getCookie, setCookie } from './cookies';\r\n\r\nconst logger = createLogger('orderApi');\r\n\r\ninterface OrderResult {\r\n success: boolean;\r\n uuid?: string;\r\n serviceFee?: number;\r\n subtotal?: number;\r\n error?: string;\r\n errorType?: 'inventory' | 'server' | 'network';\r\n}\r\n\r\ninterface CartData {\r\n eventID?: string | number;\r\n quantities?: Record<string, number>;\r\n donationAmounts?: Record<string, number>;\r\n [key: string]: unknown;\r\n}\r\n\r\ninterface PaymentIntentResponse {\r\n clientSecret?: string;\r\n stripe_publishable_key?: string;\r\n [key: string]: unknown;\r\n}\r\n\r\ninterface ValidatePaymentResponse {\r\n [key: string]: unknown;\r\n}\r\n\r\ninterface OrderResponse {\r\n [key: string]: unknown;\r\n}\r\n\r\ninterface VenueResponse {\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * @deprecated IP is now resolved server-side via request headers\r\n */\r\nexport async function getClientIP(): Promise<string | null> {\r\n return null;\r\n}\r\n\r\nexport async function getVenueDetails(\r\n venueID: string | number\r\n): Promise<VenueResponse> {\r\n try {\r\n const result = await apiGet<VenueResponse>(`/venues/${venueID}`);\r\n\r\n if (!result.success) {\r\n throw new AppError(\r\n result.error ?? `API error: ${result.statusCode}`,\r\n 'lib/utils/orderApi/getVenueDetails'\r\n );\r\n }\r\n\r\n return result.data as VenueResponse;\r\n } catch (error) {\r\n logger.error('getVenueDetails error:', error);\r\n throw error;\r\n }\r\n}\r\n\r\nexport async function initiateOrder(\r\n cartData: CartData = {}\r\n): Promise<OrderResult> {\r\n try {\r\n const ip = await getClientIP();\r\n\r\n const { eventID, quantities, donationAmounts, ...restCartData } = cartData;\r\n\r\n // Convert quantities keys to numbers and eventID to number (API expects numeric types)\r\n const numericQuantities = quantities\r\n ? Object.fromEntries(\r\n Object.entries(quantities).map(([k, v]) => [parseInt(k, 10), v])\r\n )\r\n : {};\r\n\r\n // Convert donationAmounts keys to numbers and values to floats\r\n const numericDonationAmounts = donationAmounts\r\n ? Object.fromEntries(\r\n Object.entries(donationAmounts)\r\n .filter(([, v]) => parseFloat(String(v)) > 0)\r\n .map(([k, v]) => [parseInt(k, 10), parseFloat(String(v))])\r\n )\r\n : undefined;\r\n\r\n const orderPayload = {\r\n purchaserIP: ip,\r\n eventID: eventID ? parseInt(String(eventID), 10) : undefined,\r\n quantities: numericQuantities,\r\n ...(numericDonationAmounts &&\r\n Object.keys(numericDonationAmounts).length > 0\r\n ? { donationAmounts: numericDonationAmounts }\r\n : {}),\r\n ...restCartData,\r\n };\r\n\r\n const result = await apiPost<Record<string, unknown>>(\r\n `/orders/create`,\r\n orderPayload\r\n );\r\n\r\n const data = result.data ?? {};\r\n\r\n // Check for API errors (including 200-with-error-field pattern)\r\n if (!result.success || data['error']) {\r\n const errorMessage =\r\n (data['error'] as string) ||\r\n (data['message'] as string) ||\r\n result.error ||\r\n 'Order creation failed';\r\n // Check for inventory-related errors\r\n const isInventoryError =\r\n errorMessage.toLowerCase().includes('inventory') ||\r\n errorMessage.toLowerCase().includes('sold out') ||\r\n errorMessage.toLowerCase().includes('not available') ||\r\n errorMessage.toLowerCase().includes('insufficient') ||\r\n result.statusCode === 409; // Conflict status often used for inventory issues\r\n\r\n return {\r\n success: false,\r\n error: errorMessage,\r\n errorType: isInventoryError ? 'inventory' : 'server',\r\n };\r\n }\r\n\r\n // SameSite=None; Secure so the cookie survives iframe embeds on\r\n // third-party origins (Safari ITP / Chrome SameSite-Lax-by-default).\r\n // Without this, embedding the calendar in another venue's site\r\n // silently drops the cart on every navigation.\r\n setCookie(\r\n 'checkout-cartid',\r\n (data['uuid'] as string) || (data['cartUUID'] as string),\r\n {\r\n secure: true,\r\n sameSite: 'none' as const,\r\n path: '/',\r\n }\r\n );\r\n return {\r\n success: true,\r\n uuid: (data['uuid'] as string) || (data['cartUUID'] as string),\r\n serviceFee: (data['serviceFee'] as number) ?? 0,\r\n subtotal: (data['subtotal'] as number) ?? 0,\r\n };\r\n } catch (err: unknown) {\r\n const message = err instanceof Error ? err.message : 'Network error';\r\n logger.error('Order initiation failed:', err);\r\n return {\r\n success: false,\r\n error: message,\r\n errorType: 'network',\r\n };\r\n }\r\n}\r\n\r\nexport async function getOrder(orderId: string): Promise<OrderResponse> {\r\n try {\r\n const result = await apiGet<OrderResponse>(`/orders/${orderId}`);\r\n\r\n if (!result.success) {\r\n const errorMessage =\r\n result.error ?? `Failed to fetch order (${result.statusCode})`;\r\n logger.error('getOrder error response:', errorMessage);\r\n throw new AppError(errorMessage, 'lib/utils/orderApi/getOrder');\r\n }\r\n\r\n return result.data as OrderResponse;\r\n } catch (err) {\r\n logger.error('getOrder error:', err);\r\n throw err;\r\n }\r\n}\r\n\r\nexport async function createPaymentIntent(\r\n cartId: string,\r\n quantities: Record<string, number>,\r\n donationAmounts?: Record<string, number>\r\n): Promise<PaymentIntentResponse> {\r\n const token = getCookie('operator_token');\r\n\r\n try {\r\n const result = await apiPost<PaymentIntentResponse>(\r\n `/orders/${cartId}/payment-intent`,\r\n {\r\n productQuantities: quantities,\r\n ...(donationAmounts && Object.keys(donationAmounts).length > 0\r\n ? { donationAmounts }\r\n : {}),\r\n },\r\n {\r\n headers: {\r\n Authorization: token ? `Bearer ${token}` : '',\r\n },\r\n }\r\n );\r\n\r\n if (!result.success) {\r\n logger.error('Payment intent creation failed:', result.error);\r\n throw new AppError(\r\n result.error === 'Request timed out'\r\n ? 'Request timed out. Please check your connection and try again.'\r\n : result.error?.includes('Failed to fetch')\r\n ? 'Unable to connect to payment server. Please check your internet connection or try again later.'\r\n : (result.error ??\r\n `Failed to create payment intent: ${result.statusCode}`),\r\n 'lib/utils/orderApi/createPaymentIntent'\r\n );\r\n }\r\n\r\n return result.data as PaymentIntentResponse;\r\n } catch (err: unknown) {\r\n logger.error('createPaymentIntent error:', err);\r\n // Re-throw the error so the caller can handle it\r\n throw err;\r\n }\r\n}\r\n\r\nexport async function validatePaymentIntent(\r\n cartId: string,\r\n payload: Record<string, unknown>\r\n): Promise<ValidatePaymentResponse | null> {\r\n try {\r\n const token = getCookie('operator_token');\r\n\r\n const result = await apiPost<ValidatePaymentResponse>(\r\n `/orders/${cartId}/validate-payment`,\r\n payload,\r\n {\r\n headers: {\r\n Authorization: token ? `Bearer ${token}` : '',\r\n },\r\n }\r\n );\r\n\r\n return result.data ?? null;\r\n } catch (err) {\r\n logger.error('validatePaymentIntent error:', err);\r\n return null;\r\n }\r\n}\r\n","// @fetch-escape: widget-intentional. \r\n// @api-client-escape: fire-and-forget UTM beacon — keeps raw fetch (GET, no body, response ignored).\r\n// Migrating to apiPost broke the GET contract; apiGet would parse JSON on a no-body 200 and log a false-positive error.\r\nimport { createLogger } from '@getmicdrop/svelte-components';\r\nconst logger = createLogger('utm');\r\n\r\n/**\r\n * UTM source tracking\r\n */\r\n\r\n/**\r\n * Track UTM source for an event (parameter named venueID for backwards compatibility\r\n * but actually represents eventID)\r\n */\r\nexport async function trackUTMSource(venueID: string | number): Promise<void> {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const utmSource = urlParams.get(\"utm_source\") || \"Direct\";\r\n\r\n try {\r\n await fetch(\r\n `https://get-micdrop.com/api/v2/public/utm/${venueID}/${utmSource}`\r\n );\r\n } catch (err) {\r\n logger.error(\"UTM tracking failed:\", err);\r\n }\r\n}","<script>\r\n let { size = 'default', labels = {} } = $props();\r\n</script>\r\n\r\n<div class=\"flex items-center justify-center {size === 'small' ? 'gap-1 py-3' : 'gap-1.5 py-4'}\">\r\n <span class=\"text-color-muted {size === 'small' ? 'text-xs' : 'text-xs'}\">{labels.poweredBy || 'Powered by'}</span>\r\n <a\r\n href=\"https://get-micdrop.com\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n class=\"flex items-center no-underline opacity-70 hover:opacity-100 transition-opacity duration-150\"\r\n aria-label={labels.micdropAriaLabel || 'MicDrop - Event ticketing platform'}\r\n >\r\n <svg\r\n class=\"{size === 'small' ? 'h-3.5' : 'h-4'} w-auto\"\r\n viewBox=\"0 0 285.03 82.38\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <g>\r\n <g>\r\n <path d=\"M50.55,70.84c-1.46,0-2.86-.29-4.13-.8-1.28.52-2.68.8-4.13.8h-10.45c-1.45,0-2.85-.28-4.13-.8-1.28.52-2.67.8-4.13.8h-12.57c-6.08,0-11-4.92-11-11V11C0,4.92,4.92,0,11,0h18.58c2.9,0,5.59,1.13,7.58,3.03,2-1.9,4.68-3.03,7.58-3.03h18.71c6.08,0,11,4.92,11,11v48.84c0,6.08-4.92,11-11,11h-12.91Z\" class=\"fill-muted-foreground\"/>\r\n <path d=\"M69.06,70.84c-6.08,0-11-4.92-11-11V25c0-.72.07-1.43.2-2.12-.13-.68-.2-1.39-.2-2.12v-9.77c0-6.08,4.92-11,11-11h12.91c6.08,0,11,4.92,11,11v9.77c0,.72-.07,1.43-.2,2.12.13.69.2,1.39.2,2.12v34.83c0,6.08-4.92,11-11,11h-12.91Z\" class=\"fill-muted-foreground\"/>\r\n <path d=\"M104.64,71.93c-4.25,0-8.25-.73-11.89-2.18-3.68-1.46-6.93-3.55-9.65-6.2-2.78-2.7-4.94-5.93-6.42-9.6-1.44-3.56-2.17-7.41-2.17-11.46s.73-7.91,2.17-11.47c1.47-3.64,3.61-6.86,6.37-9.58,2.72-2.69,5.99-4.8,9.7-6.28,3.64-1.45,7.64-2.18,11.89-2.18,3.65,0,7.09.54,10.24,1.6,3.3,1.11,6.25,2.74,8.77,4.83,2.58,2.14,4.68,4.72,6.26,7.68,1.57,2.94,2.55,6.17,2.94,9.6.19,1.66-.01,3.33-.56,4.87.54,1.29.83,2.71.83,4.2,0,3.71-.76,7.26-2.26,10.54-1.48,3.23-3.57,6.07-6.22,8.44-2.59,2.32-5.67,4.12-9.17,5.37-3.35,1.2-7,1.8-10.84,1.8Z\" class=\"fill-muted-foreground\"/>\r\n <path d=\"M139.75,72c-3.76,0-7.33-.71-10.62-2.12-3.41-1.46-6.4-3.62-8.86-6.41-2.35-2.66-4.18-5.87-5.44-9.56-1.19-3.46-1.79-7.35-1.79-11.56,0-3.9.57-7.59,1.69-10.96,1.18-3.55,2.92-6.71,5.16-9.4,2.41-2.89,5.34-5.15,8.73-6.72,3.05-1.42,6.38-2.2,9.89-2.33v-1.93c0-6.08,4.92-11,11-11h12.91c6.08,0,11,4.92,11,11v48.84c0,6.08-4.92,11-11,11h-12.29c-.81,0-1.59-.09-2.35-.25-2.52.94-5.21,1.41-8.03,1.41Z\" class=\"fill-muted-foreground\"/>\r\n <path d=\"M167.41,70.84c-6.08,0-11-4.92-11-11V25c0-6.08,4.92-11,11-11h12.29c1.08,0,2.13.16,3.12.45,2.4-.8,4.97-1.2,7.68-1.2s5.01.49,7.03,1.5c3.73,1.86,6.09,5.67,6.09,9.84v11c0,6.08-4.92,11-11,11h-.27c-.34,0-.68-.02-1.02-.05v13.29c0,6.08-4.92,11-11,11h-12.91Z\" class=\"fill-muted-foreground\"/>\r\n <path d=\"M213.38,71.93c-4.3,0-8.32-.73-11.95-2.18-3.71-1.47-6.96-3.58-9.67-6.25-2.73-2.69-4.86-5.91-6.33-9.55-1.44-3.56-2.17-7.41-2.17-11.46s.73-7.91,2.17-11.47c1.46-3.62,3.57-6.82,6.28-9.53,2.71-2.71,5.98-4.85,9.72-6.33,3.64-1.45,7.66-2.18,11.96-2.18s8.32.73,11.95,2.18c3.77,1.5,7.04,3.65,9.75,6.39,2.68,2.72,4.76,5.94,6.19,9.57,1.39,3.53,2.1,7.36,2.1,11.37s-.71,7.84-2.1,11.37c-1.44,3.66-3.54,6.88-6.25,9.59s-5.96,4.82-9.69,6.3c-3.64,1.45-7.66,2.18-11.95,2.18Z\" class=\"fill-muted-foreground\"/>\r\n <path d=\"M235.92,82.38c-6.08,0-11-4.92-11-11V25c0-6.08,4.92-11,11-11h12.29c.87,0,1.72.1,2.54.29,2.62-.92,5.48-1.39,8.53-1.39,4.13,0,7.96.93,11.4,2.75,3.27,1.74,6.05,4.11,8.27,7.06,2.05,2.72,3.61,5.89,4.64,9.4.95,3.25,1.43,6.69,1.43,10.23,0,3.98-.54,7.71-1.61,11.07-1.15,3.63-2.85,6.83-5.04,9.52-2.39,2.92-5.33,5.2-8.76,6.76-3.02,1.38-6.32,2.15-9.81,2.28-.31,5.8-5.11,10.4-10.98,10.4h-12.91Z\" class=\"fill-muted-foreground\"/>\r\n </g>\r\n <g>\r\n <path d=\"M11,11h18.58l7.51,27.32h.14l7.51-27.32h18.71v48.84h-12.91v-30.6h-.14l-8.13,30.6h-10.45l-8.13-30.6h-.14v30.6h-12.57V11Z\" class=\"fill-white\"/>\r\n <path d=\"M69.06,11h12.91v9.77h-12.91v-9.77ZM69.06,25h12.91v34.83h-12.91V25Z\" class=\"fill-white\"/>\r\n <path d=\"M104.64,60.93c-2.87,0-5.48-.47-7.82-1.4-2.35-.93-4.36-2.22-6.04-3.86-1.69-1.64-2.98-3.59-3.89-5.84-.91-2.25-1.37-4.7-1.37-7.34s.46-5.09,1.37-7.34c.91-2.25,2.21-4.21,3.89-5.87,1.68-1.66,3.7-2.96,6.04-3.89,2.34-.93,4.95-1.4,7.82-1.4,2.46,0,4.7.34,6.73,1.03,2.03.68,3.78,1.64,5.26,2.87,1.48,1.23,2.67,2.7,3.59,4.41.91,1.71,1.48,3.59,1.71,5.64h-12.43c-.37-1.59-.93-2.81-1.71-3.65s-1.87-1.26-3.28-1.26c-2,0-3.48.84-4.44,2.53s-1.43,4.01-1.43,6.97.5,5.2,1.5,6.86c1,1.66,2.5,2.49,4.51,2.49,1.59,0,2.79-.51,3.59-1.54.8-1.02,1.29-2.54,1.47-4.54h12.43c0,2.14-.42,4.13-1.26,5.98-.84,1.84-2.03,3.45-3.55,4.82-1.53,1.37-3.37,2.44-5.53,3.21-2.16.77-4.54,1.16-7.14,1.16Z\" class=\"fill-white\"/>\r\n <path d=\"M139.75,61c-2.28,0-4.37-.41-6.28-1.23-1.91-.82-3.56-2.01-4.95-3.59s-2.48-3.52-3.28-5.84c-.8-2.32-1.2-4.99-1.2-7.99,0-2.73.38-5.23,1.13-7.48.75-2.25,1.81-4.2,3.18-5.84,1.37-1.64,3-2.9,4.92-3.79,1.91-.89,4.03-1.33,6.35-1.33,2.5,0,4.46.43,5.87,1.3,1.41.87,2.69,2.03,3.83,3.48h.21V11h12.91v48.84h-12.29v-4.85h-.14c-1.14,1.96-2.58,3.45-4.34,4.47-1.75,1.02-3.72,1.54-5.91,1.54ZM143.44,51.23c.96,0,1.83-.24,2.63-.72.8-.48,1.47-1.13,2.01-1.95.55-.82.98-1.78,1.3-2.87.32-1.09.48-2.28.48-3.55s-.16-2.39-.48-3.48c-.32-1.09-.75-2.05-1.3-2.87-.55-.82-1.22-1.46-2.01-1.91-.8-.45-1.67-.68-2.63-.68-1.91,0-3.44.82-4.58,2.46-1.14,1.64-1.71,3.8-1.71,6.49s.57,4.87,1.71,6.56c1.14,1.69,2.66,2.53,4.58,2.53Z\" class=\"fill-white\"/>\r\n <path d=\"M179.71,30.26h.2c1.41-2.19,2.97-3.73,4.68-4.64,1.71-.91,3.68-1.37,5.91-1.37.96,0,1.66.11,2.12.34v11h-.27c-3.83-.64-6.79-.12-8.88,1.54-2.09,1.66-3.14,4.47-3.14,8.44v14.28h-12.91V25h12.29v5.26Z\" class=\"fill-white\"/>\r\n <path d=\"M213.38,60.93c-2.92,0-5.54-.47-7.89-1.4-2.35-.93-4.35-2.22-6.01-3.86-1.66-1.64-2.95-3.59-3.86-5.84-.91-2.25-1.37-4.7-1.37-7.34s.46-5.09,1.37-7.34c.91-2.25,2.2-4.21,3.86-5.87,1.66-1.66,3.67-2.96,6.01-3.89,2.34-.93,4.97-1.4,7.89-1.4s5.54.47,7.89,1.4c2.34.93,4.34,2.23,5.98,3.89,1.64,1.66,2.9,3.62,3.79,5.87s1.33,4.7,1.33,7.34-.44,5.09-1.33,7.34c-.89,2.25-2.15,4.2-3.79,5.84s-3.63,2.93-5.98,3.86c-2.35.93-4.98,1.4-7.89,1.4ZM213.24,52.32c2,0,3.51-.9,4.51-2.7,1-1.8,1.5-4.18,1.5-7.14s-.5-5.34-1.5-7.14c-1-1.8-2.5-2.7-4.51-2.7s-3.48.9-4.44,2.7-1.43,4.18-1.43,7.14.48,5.34,1.43,7.14,2.44,2.7,4.44,2.7Z\" class=\"fill-white\"/>\r\n <path d=\"M235.92,25h12.29v4.1h.2c1.27-1.64,2.8-2.91,4.58-3.83,1.78-.91,3.87-1.37,6.28-1.37s4.41.49,6.25,1.47c1.84.98,3.39,2.3,4.64,3.96,1.25,1.66,2.21,3.62,2.87,5.87s.99,4.63.99,7.14c0,2.87-.37,5.45-1.09,7.75-.73,2.3-1.75,4.26-3.07,5.87-1.32,1.62-2.93,2.86-4.82,3.72s-4,1.3-6.32,1.3c-4.05,0-7.29-1.48-9.7-4.44h-.21v14.82h-12.91V25ZM254.91,51.5c1.91,0,3.39-.76,4.44-2.29,1.05-1.53,1.57-3.63,1.57-6.32s-.52-4.8-1.57-6.35c-1.05-1.55-2.53-2.32-4.44-2.32s-3.6.82-4.78,2.46c-1.18,1.64-1.78,3.71-1.78,6.21s.59,4.62,1.78,6.22c1.18,1.59,2.78,2.39,4.78,2.39Z\" class=\"fill-white\"/>\r\n </g>\r\n </g>\r\n </svg>\r\n </a>\r\n</div>\r\n","<script>\r\n import { ModalRoot, ModalOverlay, ModalPanel, ModalBody, ModalFooter, Button } from '@getmicdrop/svelte-components';\r\n import { WifiOff } from 'carbon-icons-svelte';\r\n\r\n /**\r\n * @typedef {Object} Props\r\n * @property {boolean} [open]\r\n * @property {(e: MouseEvent) => void} [onRetry]\r\n * @property {(e: MouseEvent) => void} [onClose]\r\n * @property {string} [title]\r\n * @property {string} [message]\r\n * @property {string} [retryText]\r\n * @property {string} [cancelText]\r\n * @property {boolean} [loading]\r\n * @property {Record<string, string>} [labels]\r\n */\r\n /** @type {Props} */\r\n let {\r\n open = $bindable(false),\r\n onRetry = () => {},\r\n onClose = () => {},\r\n title,\r\n message,\r\n retryText,\r\n cancelText,\r\n loading = false,\r\n labels = {},\r\n } = $props();\r\n\r\n // Resolve label defaults: explicit prop > labels > hardcoded English fallback\r\n let resolvedTitle = $derived(title ?? labels.connectionError ?? 'Connection Error');\r\n let resolvedMessage = $derived(message ?? labels.networkErrorMessage ?? \"We couldn't connect to our servers. Please check your internet connection and try again.\");\r\n let resolvedRetryText = $derived(retryText ?? labels.networkErrorRetry ?? 'Try again');\r\n let resolvedCancelText = $derived(cancelText ?? labels.networkErrorCancel ?? 'Cancel');\r\n let resolvedRetryingLabel = $derived(labels.retryingConnection ?? 'Retrying connection');\r\n</script>\r\n\r\n<ModalRoot\r\n bind:open\r\n size=\"sm\"\r\n>\r\n <ModalOverlay />\r\n <ModalPanel>\r\n <ModalBody>\r\n <div class=\"flex flex-col items-center text-center pt-6 px-4 pb-4\">\r\n <div class=\"w-16 h-16 rounded-full flex items-center justify-center mb-4 bg-status-warning-bg0/10 text-accent-warning\" aria-hidden=\"true\">\r\n <WifiOff size={32} aria-hidden=\"true\" />\r\n </div>\r\n <h3 id=\"network-error-title\" class=\"text-xl font-semibold text-text-primary mb-2\">{resolvedTitle}</h3>\r\n <p id=\"network-error-message\" class=\"text-sm text-text-secondary leading-relaxed max-w-72\">{resolvedMessage}</p>\r\n </div>\r\n </ModalBody>\r\n <ModalFooter>\r\n <div class=\"flex gap-3 w-full\" role=\"group\" aria-label={labels.dialogActions || 'Dialog actions'}>\r\n <Button size=\"full\" variant=\"alternative\" onclick={onClose} disabled={loading} aria-label={resolvedCancelText}>\r\n {resolvedCancelText}\r\n </Button>\r\n <Button size=\"full\" variant=\"default\" onclick={onRetry} {loading} aria-label={loading ? resolvedRetryingLabel : resolvedRetryText}>\r\n {resolvedRetryText}\r\n </Button>\r\n </div>\r\n </ModalFooter>\r\n </ModalPanel>\r\n</ModalRoot>\r\n","/**\r\n * Default English labels for the VenueCalendar component.\r\n *\r\n * Pass a partial object to CalendarContainer's `labels` prop to override\r\n * any subset of these strings. Missing keys fall back to these defaults.\r\n *\r\n * @example\r\n * import { defaultLabels } from '@getmicdrop/venue-calendar';\r\n * // see all available keys:\r\n * console.log(Object.keys(defaultLabels));\r\n */\r\n\r\nexport const defaultLabels = {\r\n // -- View options (CalendarToolbar / CalendarContainer) --\r\n viewList: 'List',\r\n viewGallery: 'Gallery',\r\n viewCalendar: 'Calendar',\r\n\r\n // -- Search --\r\n searchPlaceholder: 'Search for events',\r\n searchAriaLabel: 'Search events',\r\n\r\n // -- Page / document title fragments --\r\n listView: 'List View',\r\n galleryView: 'Gallery View',\r\n calendarView: 'Calendar View',\r\n eventCalendarTitle: 'Event Calendar',\r\n\r\n // -- Empty / loading states --\r\n noUpcomingEvents: 'No upcoming events',\r\n noUpcomingEventsSubtext:\r\n 'There are no events scheduled at this time. Check back soon for new shows!',\r\n loadingEvents: 'Loading events',\r\n loadingEventsWait: 'Loading events, please wait...',\r\n loading: 'Loading...',\r\n loadingMoreEvents: 'Loading more events...',\r\n loadingMoreShows: 'Loading more shows...',\r\n\r\n // -- Status labels (browse-level) --\r\n statusOnSale: 'On Sale',\r\n statusSoldOut: 'Sold out',\r\n statusSellingFast: 'Selling fast',\r\n statusAlmostSoldOut: 'Almost sold out',\r\n statusCancelled: 'Cancelled',\r\n statusPastEvent: 'Past event',\r\n statusSalesEnded: 'Sales ended',\r\n statusComingSoon: 'Coming soon',\r\n statusFewTicketsLeft: 'Few tickets left',\r\n\r\n // -- Scarcity badge --\r\n /** Use {remaining} as placeholder for the number */\r\n scarcityOnlyNLeft: 'Only {remaining} left',\r\n scarcityLowAvailability: 'Low availability',\r\n\r\n // -- CTA / actions --\r\n getTickets: 'Get tickets',\r\n schedule: 'Schedule',\r\n pressEnterToView: 'Press Enter to view details',\r\n pressEnterToGetTickets: 'Press Enter to get tickets',\r\n pressEnterToPurchase: 'Press Enter to purchase.',\r\n\r\n // -- Accessibility (sr-only / aria) --\r\n upcomingEvents: 'Upcoming events',\r\n eventsCarousel: 'Events carousel',\r\n eventsGallery: 'Events gallery',\r\n eventListings: 'Event listings',\r\n eventListGroupedByDate: 'Event list grouped by date',\r\n featuredEvent: 'Featured event',\r\n scrollLeft: 'Scroll left',\r\n scrollRight: 'Scroll right',\r\n previousMonth: 'Previous month',\r\n nextMonth: 'Next month',\r\n calendarSearchAndViewOptions: 'Calendar search and view options',\r\n calendarMonthNavigation: 'Calendar month navigation',\r\n switchView: 'Switch view',\r\n viewOptions: 'View options',\r\n dialogActions: 'Dialog actions',\r\n availableShowtimes: 'Available showtimes',\r\n eventsForSelectedDay: 'Events for selected day',\r\n chooseDate: 'Choose date',\r\n\r\n // -- Calendar grid --\r\n today: 'Today',\r\n noEvents: 'No events',\r\n /** Use {count} as placeholder */\r\n eventCount: '{count} event',\r\n eventsCount: '{count} events',\r\n pressEnterToViewDay: 'Press Enter to view.',\r\n /** Use {count} as placeholder */\r\n eventsSelected: '{count} event{count, plural, one {} other {s}} selected. Use Tab to navigate to events.',\r\n\r\n // -- Day names (short / long) --\r\n daySun: 'Sun',\r\n dayMon: 'Mon',\r\n dayTue: 'Tue',\r\n dayWed: 'Wed',\r\n dayThu: 'Thu',\r\n dayFri: 'Fri',\r\n daySat: 'Sat',\r\n daySunFull: 'Sunday',\r\n dayMonFull: 'Monday',\r\n dayTueFull: 'Tuesday',\r\n dayWedFull: 'Wednesday',\r\n dayThuFull: 'Thursday',\r\n dayFriFull: 'Friday',\r\n daySatFull: 'Saturday',\r\n\r\n // -- Month names --\r\n monthJanuary: 'January',\r\n monthFebruary: 'February',\r\n monthMarch: 'March',\r\n monthApril: 'April',\r\n monthMay: 'May',\r\n monthJune: 'June',\r\n monthJuly: 'July',\r\n monthAugust: 'August',\r\n monthSeptember: 'September',\r\n monthOctober: 'October',\r\n monthNovember: 'November',\r\n monthDecember: 'December',\r\n\r\n // -- FeaturedView --\r\n series: 'Series',\r\n collection: 'Collection',\r\n noUpcomingEventsToFeature: 'No upcoming events to feature',\r\n /** Use {date} and {time} as placeholders */\r\n nextEventAt: 'Next: {date} at {time}',\r\n\r\n // -- SpotlightView (time buckets) --\r\n tonight: 'Tonight',\r\n tomorrow: 'Tomorrow',\r\n thisWeekend: 'This Weekend',\r\n nextWeek: 'Next Week',\r\n comingUp: 'Coming Up',\r\n noUpcomingShowsScheduled: 'No upcoming shows scheduled',\r\n\r\n // -- EditorialEmpty --\r\n nothingOn: 'Nothing on',\r\n noUpcomingEventsScheduled: 'No upcoming events scheduled',\r\n nextUp: 'Next up:',\r\n on: 'on',\r\n jumpTo: 'Jump to',\r\n\r\n // -- Network error modal --\r\n connectionError: 'Connection Error',\r\n networkErrorMessage:\r\n \"We couldn't connect to our servers. Please check your internet connection and try again.\",\r\n networkErrorRetry: 'Try again',\r\n networkErrorCancel: 'Cancel',\r\n retryingConnection: 'Retrying connection',\r\n couldNotLoadEvents:\r\n \"We couldn't load the events. Please check your internet connection and try again.\",\r\n\r\n // -- Offline banner --\r\n offlineMessage:\r\n \"You're offline. Some features may not work until you reconnect.\",\r\n\r\n // -- Powered by --\r\n poweredBy: 'Powered by',\r\n micdropAriaLabel: 'MicDrop - Event ticketing platform',\r\n\r\n // -- DatePicker --\r\n datePickerToday: 'Today',\r\n datePickerClear: 'Clear',\r\n pastDatesNotAvailable: 'Past dates are not available',\r\n dayNotAvailable: 'This day of the week is not available',\r\n\r\n // -- Preview day label --\r\n preview: 'preview',\r\n\r\n // -- Event details / loading / error --\r\n loadingEvent: 'Loading event...',\r\n loadingCollection: 'Loading collection...',\r\n loadingYourOrder: 'Loading your order...',\r\n loadingSecurePaymentForm: 'Loading secure payment form...',\r\n errorPrefix: 'Error:',\r\n goBack: 'Go back',\r\n goBackToCalendar: 'Go back to calendar',\r\n goBackToEventDetails: 'Go back to event details',\r\n goBackToTicketSelection: 'Go back to ticket selection',\r\n eventDetails: 'Event Details',\r\n eventPoster: 'Event poster',\r\n\r\n // -- Password protection --\r\n passwordProtectedTitle: 'This event is password protected',\r\n passwordProtectedDescription: 'Enter the event password to view details and purchase tickets.',\r\n enterPassword: 'Enter password',\r\n enterEventPassword: 'Enter event password',\r\n passwordModalDescription: 'This event requires a password to view. Please enter the password provided by the event organizer.',\r\n passwordLabel: 'Password',\r\n unlockEvent: 'Unlock event',\r\n incorrectPassword: 'Incorrect password. Please try again.',\r\n unableToVerifyPassword: 'Unable to verify password. Please try again.',\r\n\r\n // -- Collection password --\r\n collectionPrivateTitle: 'This collection is private',\r\n collectionPrivateDescription: 'Please enter the password to view this collection.',\r\n viewCollection: 'View Collection',\r\n\r\n // -- Cancelled event --\r\n eventCancelledTitle: 'This event has been cancelled',\r\n eventCancelledMessage: \"We're sorry, but this event is no longer taking place.\",\r\n eventCancelledRefund: 'Refund information:',\r\n eventCancelledRefundDetails: 'If you purchased tickets, a full refund will be processed automatically to your original payment method within 5-10 business days. Check your email for confirmation.',\r\n learnMore: 'Learn more',\r\n cancelledRefundAuto: \"If your event is cancelled, we'll automatically refund the credit card used for purchase* (usually within 30 business days of the cancellation announcement).\",\r\n cancelledRefundBoxOffice: \"Bought your tickets at the venue's box office? Please take the tickets directly to the box office for a refund.\",\r\n cancelledRefundFootnote: '*Please note that we cannot submit the refund to an alternate card. If your credit card number has changed since you made the purchase this should not impact your ability to receive the refund.',\r\n\r\n // -- Event ended --\r\n eventHasEnded: 'Event has ended',\r\n eventEndedMessage: 'Your charges weren\\'t saved because you cannot change the details of an event that has already ended.',\r\n thisEventHasEnded: 'This event has ended',\r\n ticketsNoLongerAvailable: 'Tickets are no longer available for this event.',\r\n ok: 'OK',\r\n\r\n // -- Tabs (EventDetailsView) --\r\n tabAboutTheShow: 'About the show',\r\n tabFeaturing: 'Featuring',\r\n tabFAQs: 'FAQs',\r\n tabDisclaimers: 'Disclaimers',\r\n\r\n // -- Disclaimer --\r\n disclaimer: 'Disclaimer',\r\n\r\n // -- Age restriction --\r\n allAges: 'All ages',\r\n /** Use {age} as placeholder for the minimum age */\r\n agesPlus: 'Ages {age}+',\r\n\r\n // -- Doors open --\r\n /** Use {time} as placeholder for the formatted time */\r\n doorsOpen: 'Doors open {time}',\r\n\r\n // -- Venue fallback --\r\n venue: 'Venue',\r\n\r\n // -- General Admission --\r\n generalAdmission: 'General Admission',\r\n\r\n // -- Ticket actions (CTA) --\r\n eventCancelled: 'Event Cancelled',\r\n salesEnded: 'Sales Ended',\r\n soldOut: 'Sold Out',\r\n joinWaitlist: 'Join Waitlist',\r\n getNotifiedWhenAvailable: 'Get notified when tickets are available',\r\n reserve: 'Reserve',\r\n reserveASpot: 'Reserve a spot',\r\n secureCheckout: 'Secure checkout',\r\n from: 'From',\r\n startsFrom: 'Starts from',\r\n free: 'Free',\r\n /** Use {fee} as placeholder for the formatted fee amount */\r\n inclFee: 'incl. {fee} fee',\r\n /** Use {fee} as placeholder for the formatted fee amount */\r\n includingFee: 'including {fee} service fee',\r\n originalPrice: 'Original price:',\r\n ticketPurchase: 'Ticket purchase',\r\n ticketPurchaseOptions: 'Ticket purchase options',\r\n loadingPrice: 'Loading price',\r\n\r\n // -- Ticket block --\r\n discountApplied: 'Discount applied',\r\n unlocked: 'Unlocked',\r\n /** Use {salesStart} as placeholder */\r\n salesStart: 'Sales start {salesStart}',\r\n salesEndPrefix: 'Sales end',\r\n quantity: 'Quantity:',\r\n /** Use {title} as placeholder */\r\n decreaseQuantity: 'Decrease quantity for {title}',\r\n /** Use {title} as placeholder */\r\n increaseQuantity: 'Increase quantity for {title}',\r\n /** Use {title} as placeholder */\r\n quantitySelector: 'Quantity selector for {title}',\r\n donationAmountLabel: 'Donation amount in dollars',\r\n minimumDonation: 'Minimum $1.00',\r\n\r\n // -- Ticket block time formatting --\r\n /** Use {n} as placeholder for the number of minutes */\r\n inNMinute: 'in {n} minute',\r\n /** Use {n} as placeholder for the number of minutes */\r\n inNMinutes: 'in {n} minutes',\r\n /** Use {n} as placeholder for the number of hours */\r\n inNHour: 'in {n} hour',\r\n /** Use {n} as placeholder for the number of hours */\r\n inNHours: 'in {n} hours',\r\n /** Use {time} as placeholder for the formatted time */\r\n tomorrowAtTime: 'tomorrow at {time}',\r\n /** Use {day} and {time} as placeholders */\r\n onDayAtTime: 'on {day} at {time}',\r\n /** Use {date} as placeholder for the formatted date */\r\n onDate: 'on {date}',\r\n\r\n // -- Tickets group --\r\n noTicketsAvailable: 'No tickets available',\r\n noTicketsAvailableDescription: 'There are currently no tickets available for this event.',\r\n availableTickets: 'Available tickets',\r\n selectedTickets: 'Selected tickets',\r\n other: 'Other',\r\n /** Use {section} as placeholder for the section name */\r\n ticketsInSection: 'Tickets in {section}',\r\n\r\n // -- Order breakdown --\r\n subtotal: 'Subtotal',\r\n fees: 'Fees',\r\n taxes: 'Taxes',\r\n promoDiscount: 'Promo discount',\r\n total: 'Total',\r\n orderBreakdown: 'Order breakdown',\r\n priceBreakdown: 'Price breakdown',\r\n\r\n // -- Personal details / billing --\r\n billingInformation: 'Billing information',\r\n firstName: 'First name',\r\n lastName: 'Last name',\r\n emailAddress: 'Email address',\r\n phoneNumber: 'Phone number',\r\n keepMeUpdated: 'Keep me updated on more events and news',\r\n subscribeToUpdates: 'Subscribe to event updates and news',\r\n /** Use {index} as placeholder for the ticket number, {name} for ticket name */\r\n ticketN: 'Ticket {index} - {name}',\r\n sameAsPersonalDetails: 'Same as personal details',\r\n\r\n // -- Payment section --\r\n payWith: 'Pay with',\r\n paymentMethodSelection: 'Payment method selection',\r\n creditOrDebitCard: 'Credit or debit card',\r\n applePay: 'Apple Pay',\r\n googlePay: 'Google Pay',\r\n cardPaymentForm: 'Card payment form',\r\n payWithCard: 'Pay with credit or debit card',\r\n payWithApplePay: 'Pay with Apple Pay',\r\n payWithGooglePay: 'Pay with Google Pay',\r\n\r\n // -- Checkout footer --\r\n placeOrder: 'Place order',\r\n processing: 'Processing...',\r\n processingYourOrder: 'Processing your order',\r\n termsPrefix: 'By selecting Place order, I agree to the',\r\n termsOfService: 'terms of service',\r\n\r\n // -- Terms and conditions --\r\n termsAndConditions: 'Terms and conditions',\r\n agreeToTerms: 'I agree to the',\r\n termsAndConditionsLink: 'terms and conditions',\r\n\r\n // -- Gift card --\r\n haveAGiftCard: 'Have a gift card?',\r\n enterGiftCardCode: 'Enter gift card code',\r\n apply: 'Apply',\r\n giftCardApplied: 'Gift card applied',\r\n removeGiftCard: 'Remove gift card',\r\n appliedToOrder: 'Applied to order',\r\n fullyCoveredByGiftCard: 'Fully covered by gift card',\r\n remainingToPay: 'Remaining to pay',\r\n invalidGiftCardCode: 'Invalid gift card code',\r\n failedToApplyGiftCard: 'Failed to apply gift card. Please try again.',\r\n failedToRemoveGiftCard: 'Failed to remove gift card. Please try again.',\r\n giftCardNoPaymentRequired: 'No payment required',\r\n giftCardCompleteOrder: 'Complete Order',\r\n\r\n // -- Promo code --\r\n promoCode: 'Promo code',\r\n promoCodeEntry: 'Promo code entry',\r\n remove: 'Remove',\r\n checking: 'Checking...',\r\n pleaseEnterPromoCode: 'Please enter a promo code.',\r\n invalidOrExpiredPromoCode: 'Invalid or expired promo code.',\r\n unableToValidatePromoCode: 'Unable to validate promo code. Please try again.',\r\n hiddenTicketsVisible: 'Hidden tickets are now visible.',\r\n /** Use {amount} as placeholder */\r\n dollarDiscountAvailable: 'A {amount} discount is available.',\r\n /** Use {amount} as placeholder */\r\n percentDiscountAvailable: 'A {amount}% discount is available.',\r\n /** Use {code} as placeholder */\r\n promoApplied: '{code} applied.',\r\n removePromoCode: 'Remove promo code',\r\n applyPromoCode: 'Apply promo code',\r\n checkingPromoCode: 'Checking promo code',\r\n\r\n // -- Waitlist modal --\r\n // Copy per reconciled decisions #19/#20. Position is opaque to the customer\r\n // (#2) — there is intentionally no waitlistPosition label.\r\n waitlistTitle: 'This show is sold out.',\r\n waitlistDescription: 'Want to be notified if tickets become available?',\r\n waitlistEmailLabel: 'Email address',\r\n waitlistEmailPlaceholder: 'you@example.com',\r\n waitlistPhonePlaceholder: '(555) 123-4567',\r\n pleaseEnterValidEmail: 'Please enter a valid email',\r\n pleaseEnterValidEmailAddress: 'Please enter a valid email address',\r\n pleaseEnterValidPhone: 'Please enter a valid phone number',\r\n smsOptIn: 'Text me when tickets are available',\r\n smsDisclaimer: 'Message & data rates may apply. Reply STOP to unsubscribe.',\r\n joining: 'Joining...',\r\n notifyMe: 'Notify Me',\r\n done: 'Done',\r\n cancel: 'Cancel',\r\n youreOnTheList: \"You're on the waitlist\",\r\n /** Use {eventName} as placeholder */\r\n waitlistAdded: \"You're on the waitlist for {eventName}.\",\r\n waitlistNotifyByEmail: \"We'll let you know if tickets become available.\",\r\n waitlistSmsAlerts: \"You'll also receive SMS alerts.\",\r\n\r\n // -- Showtimes (DateSelector / DateSelectorGrouped) --\r\n showtimes: 'Showtimes',\r\n /** Use {dateTime} as placeholder for the formatted date/time */\r\n selectShowtime: 'Select showtime, currently {dateTime}',\r\n pressEnterToGetTicketsForDate: 'Press Enter to get tickets',\r\n onSale: 'On sale',\r\n\r\n // -- Cart / error modals --\r\n checkout: 'Checkout',\r\n unableToReserveTickets: 'Unable to Reserve Tickets',\r\n connectionIssue: 'Connection Issue',\r\n cartFailedMessage: \"We couldn't reserve your tickets. This may be due to a network issue or the tickets may no longer be available.\",\r\n pleaseGoBackAndTryAgain: 'Please go back and try again.',\r\n cartSuccessMessage: 'Good news! Your tickets have been reserved and are being held for you.',\r\n cartSuccessNetworkError: 'However, we encountered a connection issue. Please refresh the page to continue to checkout.',\r\n refreshPage: 'Refresh Page',\r\n limitedAvailability: 'Limited Availability',\r\n /** Use {available} and {requested} as placeholders */\r\n onlyNAvailable: 'Only {available} available (you selected {requested})',\r\n /** Use {requested} as placeholder */\r\n soldOutYouSelected: 'Sold out (you selected {requested})',\r\n ticketsNoLongerAvailableMessage: 'Some tickets you selected are no longer available in the requested quantities:',\r\n ticketAvailabilityChanges: 'Ticket availability changes',\r\n continueWithAvailable: 'Continue with available',\r\n\r\n // -- Checkout errors --\r\n noCheckoutSession: 'No checkout session found. Please select tickets first.',\r\n failedToCreatePaymentIntent: 'Failed to create payment intent. Please try again.',\r\n paymentConfigError: 'Payment configuration error. Please try again.',\r\n failedToInitPayment: 'Failed to initialize payment. Please try again.',\r\n paymentFormNotReady: 'Payment form is not ready. Please wait a moment and try again.',\r\n paymentSystemNotInitialized: 'Payment system is not initialized. Please refresh the page.',\r\n paymentAmountMismatch: 'Payment amount mismatch. Please refresh and try again.',\r\n paymentValidationFailed: 'Payment validation failed. Please try again.',\r\n\r\n // -- Checkout timer --\r\n timeLeft: 'Time left',\r\n\r\n // -- Session extension (checkout timer) --\r\n sessionExpiringSoon: 'Session Expiring Soon',\r\n sessionExpireMessage: 'Your session will expire in',\r\n sessionExtendQuestion: 'Would you like to extend your time to complete your purchase?',\r\n sessionExtendButton: 'Extend Time (+5 min)',\r\n sessionNoThanks: 'No Thanks',\r\n sessionExtendAria: 'Extend session by 5 minutes',\r\n sessionDismissAria: 'Dismiss and continue without extending',\r\n\r\n // -- Internal error messages --\r\n noEventIdProvided: 'No event ID provided',\r\n failedToLoadEvent: 'Failed to load event',\r\n noCollectionIdProvided: 'No collection ID provided',\r\n failedToLoadCollection: 'Failed to load collection',\r\n failedToCompleteOrder: 'Failed to complete order. Please try again.',\r\n\r\n // -- Event info header --\r\n viewOrderDetails: 'View order details',\r\n\r\n // -- Cart partial availability --\r\n partialAvailabilityContinue: 'Would you like to continue with the available tickets?',\r\n allTicketsSoldOut: 'Unfortunately, all the tickets you selected have sold out.',\r\n\r\n // -- Success page --\r\n failedToLoadEventData: 'Failed to load event data.',\r\n ticketFallbackName: 'Ticket',\r\n\r\n // -- Accessibility (aria-labels) --\r\n ariaEventBooking: 'Event booking',\r\n ariaGetTickets: 'Get tickets',\r\n ariaItemTotal: 'Item total',\r\n ariaCloseAndReturn: 'Close and return to home',\r\n ariaEventDateTime: 'Event date and time',\r\n /** Use {total} as placeholder for the formatted total */\r\n ariaOrderTotal: 'Order total: {total}',\r\n\r\n // -- Gift card recipient form --\r\n giftCardRecipientInfo: 'Recipient Information',\r\n giftCardRecipientName: 'Recipient Name',\r\n giftCardRecipientNamePlaceholder: \"Enter recipient's name\",\r\n giftCardRecipientNameRequired: 'Recipient name is required',\r\n giftCardRecipientEmail: 'Recipient Email',\r\n giftCardRecipientEmailPlaceholder: \"Enter recipient's email\",\r\n giftCardRecipientEmailRequired: 'Recipient email is required',\r\n giftCardInvalidEmail: 'Please enter a valid email address',\r\n giftCardPersonalMessage: 'Personal Message',\r\n giftCardOptional: '(optional)',\r\n giftCardMessagePlaceholder: 'Write a personal message to include with the gift card...',\r\n giftCardCharsRemaining: 'characters remaining',\r\n\r\n // -- Gift card amount selector --\r\n giftCardSelectAmount: 'Select Amount',\r\n giftCardCustom: 'Custom',\r\n giftCardCustomAmountAria: 'Custom amount',\r\n giftCardAmountHelp: 'Enter amount between $1.00 and $500.00',\r\n giftCardInvalidAmount: 'Please enter a valid amount',\r\n giftCardMinAmount: 'Minimum amount is $1.00',\r\n giftCardMaxAmount: 'Maximum amount is $500.00',\r\n\r\n // -- Gift card delivery scheduler --\r\n giftCardDeliveryOptions: 'Delivery Options',\r\n giftCardSendImmediately: 'Send Immediately',\r\n giftCardSendImmediatelyDesc: 'Gift card will be sent right after purchase',\r\n giftCardScheduleForLater: 'Schedule for Later',\r\n giftCardScheduleDesc: 'Choose a specific date and time',\r\n giftCardDeliveryDate: 'Delivery Date',\r\n giftCardDeliveryTime: 'Delivery Time',\r\n giftCardScheduledFor: 'Scheduled for:',\r\n\r\n // -- Locale for Intl.DateTimeFormat (BCP 47 language tag) --\r\n locale: 'en-US',\r\n\r\n // -- Accessibility & browse widget labels --\r\n ticketAriaLabel: '{title} ticket',\r\n ticketSoldOutSuffix: ', sold out',\r\n ticketSalesNotStartedSuffix: ', sales not yet started',\r\n ticketSalesEndedSuffix: ', sales ended',\r\n discountedPriceLabel: 'Discounted price',\r\n priceLabel: 'Price',\r\n statusLabel: 'Status:',\r\n checkoutFormLabel: 'Checkout form',\r\n loadingContent: 'Loading content',\r\n loadingTicketInfo: 'Loading ticket information',\r\n loadingOrderSummary: 'Loading order summary',\r\n close: 'Close',\r\n selectShowtimeFor: 'Select showtime for {name}',\r\n viewShowtimes: 'View showtimes',\r\n pickAShowtime: 'Pick a showtime',\r\n checkBackSoon: 'Check back soon for new shows.',\r\n nUpcomingDates: '{n} upcoming dates',\r\n nMore: '{n} more',\r\n nShows: '{n} Shows',\r\n previousSlide: 'Previous slide',\r\n nextSlide: 'Next slide',\r\n goToSlide: 'Go to slide {n}',\r\n eventCarousel: 'Event carousel',\r\n hasEvents: 'Has events',\r\n viewMode: 'View mode',\r\n goToCurrentMonth: 'Go to current month',\r\n nShowtimes: '{n} showtimes',\r\n};\r\n\r\n/**\r\n * Merge user-supplied labels with defaults.\r\n * @param {Partial<typeof defaultLabels>} userLabels\r\n * @returns {typeof defaultLabels}\r\n */\r\nexport function mergeLabels(userLabels = {}) {\r\n return { ...defaultLabels, ...userLabels };\r\n}\r\n\r\nexport default defaultLabels;\r\n","/**\r\n * Spanish (es) labels.\r\n *\r\n * Only the user-visible strings are translated here. Anything not listed\r\n * falls back to English via mergeLabels(). To add more keys, copy them\r\n * from src/lib/i18n/defaultLabels.js and translate.\r\n */\r\nexport const es = {\r\n // View options\r\n viewList: 'Lista',\r\n viewGallery: 'Galería',\r\n viewCalendar: 'Calendario',\r\n\r\n // Search\r\n searchPlaceholder: 'Buscar eventos',\r\n searchAriaLabel: 'Buscar eventos',\r\n\r\n // Page titles\r\n listView: 'Vista de lista',\r\n galleryView: 'Vista de galería',\r\n calendarView: 'Vista de calendario',\r\n eventCalendarTitle: 'Calendario de eventos',\r\n\r\n // Empty / loading\r\n noUpcomingEvents: 'No hay próximos eventos',\r\n noUpcomingEventsSubtext:\r\n 'No hay eventos programados en este momento. ¡Vuelve pronto para ver nuevos shows!',\r\n loadingEvents: 'Cargando eventos',\r\n loadingEventsWait: 'Cargando eventos, por favor espera...',\r\n loading: 'Cargando...',\r\n loadingMoreEvents: 'Cargando más eventos...',\r\n loadingMoreShows: 'Cargando más shows...',\r\n\r\n // Status labels\r\n statusOnSale: 'A la venta',\r\n statusSoldOut: 'Agotado',\r\n statusSellingFast: 'Vendiéndose rápido',\r\n statusAlmostSoldOut: 'Casi agotado',\r\n statusCancelled: 'Cancelado',\r\n statusPastEvent: 'Evento pasado',\r\n statusSalesEnded: 'Ventas cerradas',\r\n statusComingSoon: 'Próximamente',\r\n statusFewTicketsLeft: 'Pocos boletos disponibles',\r\n\r\n // Scarcity\r\n scarcityOnlyNLeft: '¡Solo quedan {remaining}!',\r\n scarcityLowAvailability: 'Pocas disponibilidades',\r\n\r\n // CTA / actions\r\n getTickets: 'Comprar boletos',\r\n schedule: 'Horario',\r\n pressEnterToView: 'Presiona Enter para ver detalles',\r\n pressEnterToGetTickets: 'Presiona Enter para comprar boletos',\r\n pressEnterToPurchase: 'Presiona Enter para comprar.',\r\n\r\n // Accessibility\r\n upcomingEvents: 'Próximos eventos',\r\n eventsCarousel: 'Carrusel de eventos',\r\n eventsGallery: 'Galería de eventos',\r\n eventListings: 'Listado de eventos',\r\n previousMonth: 'Mes anterior',\r\n nextMonth: 'Mes siguiente',\r\n switchView: 'Cambiar vista',\r\n viewOptions: 'Opciones de vista',\r\n availableShowtimes: 'Horarios disponibles',\r\n chooseDate: 'Elegir fecha',\r\n previousSlide: 'Diapositiva anterior',\r\n nextSlide: 'Siguiente diapositiva',\r\n goToCurrentMonth: 'Ir al mes actual',\r\n};\r\n","/**\r\n * i18n module — exports for consuming apps.\r\n *\r\n * Resolution order for label strings (highest priority first):\r\n * 1. user-supplied `labels` prop (per-render override)\r\n * 2. locale-specific bundle (`./locales/<locale>.js`)\r\n * 3. English defaults (`./defaultLabels.js`)\r\n *\r\n * Locales are bundled statically because they are small (English = 552\r\n * lines, others smaller) and the lookup happens on every render. Adding a\r\n * new locale = drop a file in `./locales/`, register it below.\r\n */\r\n\r\nimport { defaultLabels } from './defaultLabels.js';\r\nimport { en } from './locales/en.js';\r\nimport { es } from './locales/es.js';\r\n\r\nexport { defaultLabels, mergeLabels } from './defaultLabels.js';\r\nexport { setDefaultLocale } from '../utils/datetime.js';\r\n\r\n/** All bundled locales. Keys are BCP-47 language tags (lowercase base). */\r\nconst LOCALES = { en, es };\r\n\r\n/**\r\n * Resolve a locale tag (`en-US`, `es-MX`, etc.) to a bundled locale.\r\n * Falls back to `en` if no bundled locale matches.\r\n *\r\n * @param {string} [tag]\r\n * @returns {{labels: object, locale: string}}\r\n */\r\nexport function resolveLocale(tag) {\r\n if (!tag || typeof tag !== 'string') return { labels: en, locale: 'en' };\r\n const lower = tag.toLowerCase();\r\n // Exact match (e.g. 'es-mx' -> exists)\r\n if (LOCALES[lower]) return { labels: LOCALES[lower], locale: lower };\r\n // Base match (e.g. 'es-mx' -> 'es')\r\n const base = lower.split('-')[0];\r\n if (LOCALES[base]) return { labels: LOCALES[base], locale: base };\r\n return { labels: en, locale: 'en' };\r\n}\r\n\r\n/**\r\n * Detect the consumer's browser locale. Returns null on the server.\r\n */\r\nexport function detectLocale() {\r\n if (typeof navigator === 'undefined') return null;\r\n return navigator.language || /** @type {any} */ (navigator).userLanguage || null;\r\n}\r\n\r\n/**\r\n * Build the final label set for a given locale + user override.\r\n * Equivalent to `{ ...defaults, ...localeBundle, ...userLabels }`.\r\n *\r\n * @param {string} [locale] - BCP-47 tag or undefined for auto-detect\r\n * @param {object} [userLabels] - per-call override\r\n */\r\nexport function getLabelsForLocale(locale, userLabels = {}) {\r\n const tag = locale || detectLocale() || 'en';\r\n const { labels } = resolveLocale(tag);\r\n return { ...defaultLabels, ...labels, ...userLabels };\r\n}\r\n\r\n/** List of bundled locale tags, useful for UI pickers. */\r\nexport function listLocales() {\r\n return Object.keys(LOCALES);\r\n}\r\n","<script module>\r\n import { createLogger } from '@getmicdrop/svelte-components';\r\n const logger = createLogger('CalendarContainer');\r\n</script>\r\n\r\n<script>\r\n import { writable } from 'svelte/store';\r\n import { onMount, onDestroy } from 'svelte';\r\n import { WidgetUrlManager } from '$lib/url-manager';\r\n import { filterWidgetEvents } from '$lib/widget-filters.js';\r\n import {\r\n isEmbeddedInIframe,\r\n observeHeight,\r\n postResize,\r\n postNavigation,\r\n listenForHostNavigation,\r\n } from '$lib/embed-bridge.js';\r\n\r\n // Create a simple page store for standalone use (no SvelteKit dependency)\r\n function getInitialUrl() {\r\n if (typeof window === 'undefined') return new URL('http://localhost');\r\n try {\r\n return new URL(window.location.href);\r\n } catch {\r\n return new URL('http://localhost');\r\n }\r\n }\r\n\r\n const pageStore = writable({\r\n url: getInitialUrl(),\r\n params: {},\r\n route: { id: null },\r\n status: 200,\r\n error: null,\r\n data: {},\r\n form: null,\r\n state: {},\r\n });\r\n\r\n // Sync pageStore whenever location changes (called from WidgetUrlManager's onNavigate\r\n // and from gotoUrl for view-switching)\r\n function syncPageStore() {\r\n pageStore.set({\r\n url: new URL(window.location.href),\r\n params: {},\r\n route: { id: null },\r\n status: 200,\r\n error: null,\r\n data: {},\r\n form: null,\r\n state: {},\r\n });\r\n }\r\n\r\n // Simple goto replacement for standalone use (view switching only -- NOT entity navigation)\r\n function gotoUrl(url, options = {}) {\r\n if (typeof window === 'undefined') return;\r\n if (options.replaceState) {\r\n window.history.replaceState({}, '', url);\r\n } else {\r\n window.history.pushState({}, '', url);\r\n }\r\n syncPageStore();\r\n }\r\n\r\n // Use the standalone page store\r\n const page = pageStore;\r\n\r\n // WidgetUrlManager instance (created on mount, browser-only)\r\n let urlManager = null;\r\n // Saved scroll position for back-navigation restore\r\n let savedScrollY = 0;\r\n // Root element of the widget (used to measure content height for the\r\n // iframe-embed auto-height bridge).\r\n let rootEl = $state();\r\n // Cleanup handles for the embed bridge (height observer + host-nav listener).\r\n let cleanupHeightObserver = null;\r\n let cleanupHostNavListener = null;\r\n import Calendar from '../Calendar/Calendar.svelte';\r\n import CalendarToolbar from '../CalendarToolbar/CalendarToolbar.svelte';\r\n import { MonthSwitcher } from '@getmicdrop/svelte-components';\r\n import { adaptToBrowseEvents } from '$lib/browse-widgets/adapter';\r\n import ListView from '$lib/browse-widgets/ListView.svelte';\r\n import GalleryView from '$lib/browse-widgets/GalleryView.svelte';\r\n import CarouselView from '$lib/browse-widgets/CarouselView.svelte';\r\n import FeaturedView from '$lib/browse-widgets/FeaturedView.svelte';\r\n import SkeletonLoader from '../SkeletonLoader/SkeletonLoader.svelte';\r\n import { ArrowLeft } from 'carbon-icons-svelte';\r\n import {\r\n fetchVenueEvents,\r\n fetchAllVenues,\r\n getMonthEvents,\r\n getOrgMonthEvents,\r\n resolvePublicEntity,\r\n getApiConfig,\r\n } from '$lib/api';\r\n // transformEventData returns the BROWSE-mode shape that Calendar/views\r\n // depend on; the canonical $lib/api alias points at the DETAIL-mode\r\n // transform and is not interchangeable.\r\n import { transformEventData } from '$lib/utils/event-transform.js';\r\n import { generateSlug } from '../../lib/utils/utils.js';\r\n import PoweredByMicdrop from '../PoweredByMicdrop.svelte';\r\n import NetworkErrorModal from '../Modals/NetworkErrorModal.svelte';\r\n import { EmptyState } from '@getmicdrop/svelte-components';\r\n import { mergeLabels } from '$lib/i18n/defaultLabels.js';\r\n import { getLabelsForLocale, detectLocale } from '$lib/i18n';\r\n import { setDefaultLocale } from '$lib/utils/datetime.js';\r\n\r\n // Fallback switch: ?legacy=1 renders legacy browse views.\r\n // RETIREMENT: see docs/LEGACY_RETIREMENT.md — 2026-08-13.\r\n let useLegacy = $state(false);\r\n let LegacyGalleryView = $state(null);\r\n let LegacyGroupedListView = $state(null);\r\n let LegacyCarouselView = $state(null);\r\n let LegacyFeaturedView = $state(null);\r\n\r\n if (typeof window !== 'undefined') {\r\n const params = new URLSearchParams(window.location.search);\r\n if (params.get('legacy') === '1') {\r\n useLegacy = true;\r\n }\r\n }\r\n\r\n // Track which month images have been prefetched\r\n let prefetchedMonths = new Set();\r\n\r\n // Month-based event cache: Map<\"YYYY-MM\", events[]>\r\n // Must use $state() for Svelte 5 reactivity - derived values like allCachedEvents depend on this\r\n let monthEventsCache = $state(new Map());\r\n // Track which months are currently loading\r\n let loadingMonths = new Set();\r\n // Pagination info from API\r\n let paginationInfo = null;\r\n\r\n // Helper function to navigate (works with or without SvelteKit)\r\n function navigateTo(url) {\r\n if (typeof window !== 'undefined') {\r\n window.location.href = url;\r\n }\r\n }\r\n\r\n /**\r\n * @typedef {{ id: number; text: string; icon: string; ariaLabel?: string }} ViewOption\r\n * @typedef {Object} Props\r\n * @property {boolean | ViewOption[]} [showViewOptions]\r\n * @property {boolean} [showMonthSwitcher]\r\n * @property {(() => void)} [handleNext]\r\n * @property {(() => void)} [handlePrev]\r\n * @property {any[]} [events]\r\n * @property {any} [currentMonth]\r\n * @property {any} [currentYear]\r\n * @property {string} [venueId]\r\n * @property {string} [organizationId]\r\n * @property {((event: any) => void)} [onEventClick]\r\n * @property {any} [featuredItem]\r\n * @property {Record<string, string>} [labels]\r\n * @property {string | undefined} [locale]\r\n * @property {any} [seoController]\r\n * @property {any} [filterValues]\r\n * @property {'pushState' | 'none'} [urlMode]\r\n * @property {boolean} [inlineEntityViews]\r\n */\r\n /** @type {Props} */\r\n let {\r\n showViewOptions = false,\r\n showMonthSwitcher = false,\r\n handleNext,\r\n handlePrev,\r\n events = [],\r\n currentMonth,\r\n currentYear,\r\n venueId = '',\r\n organizationId = '',\r\n onEventClick,\r\n featuredItem = null,\r\n labels: userLabels = {},\r\n // locale undefined → browser locale (navigator.language) → en\r\n locale = undefined,\r\n seoController = null,\r\n // Saved widget FilterValues (embed via widget-id). null = no widget filter.\r\n filterValues = null,\r\n urlMode = 'pushState', // 'pushState' (default) or 'none' (for iframe/Wix embeds)\r\n // When true (set by the embed entry points — initVenueCalendar / autoMount /\r\n // <micdrop-calendar>), the widget renders the show detail / series /\r\n // collection IN-PLACE instead of navigating the host page to /e/...\r\n // get-micdrop.com mounts the <VenueCalendar> component directly and leaves\r\n // this false, keeping its SvelteKit route navigation untouched.\r\n inlineEntityViews = false,\r\n } = $props();\r\n\r\n // Resolve labels using locale fallback chain:\r\n // English defaults < locale bundle < user-supplied labels.\r\n // When `locale` is undefined we auto-detect via navigator.language.\r\n let resolvedLocale = $derived(locale || detectLocale() || 'en-US');\r\n let labels = $derived(getLabelsForLocale(resolvedLocale, userLabels));\r\n\r\n // Sync locale to the datetime formatting module\r\n $effect(() => {\r\n setDefaultLocale(resolvedLocale);\r\n });\r\n\r\n // Keep mergeLabels around for compat with downstream consumers that\r\n // import it from this module via legacy paths.\r\n void mergeLabels;\r\n\r\n // Core loading state - must use $state() for Svelte 5 reactivity with derived values\r\n let isLoading = $state(false);\r\n let error = $state(null);\r\n let fetchedEvents = $state([]);\r\n let hasLoaded = $state(false);\r\n let isLoadingPromise = null;\r\n let isMounted = $state(false);\r\n\r\n // Pending deep link from URL (resolved once events load)\r\n let pendingDeepLink = $state(null);\r\n\r\n // ---------------------------------------------------------------------------\r\n // In-widget entity views (embed only — gated by inlineEntityViews)\r\n //\r\n // The embed renders the show detail / series / collection IN-PLACE rather\r\n // than navigating the host page away. widgetView drives which view shows;\r\n // activeEntity holds the resolved { type, id, slug, data }. The view\r\n // components are lazy-loaded (Stripe/checkout code stays out of the\r\n // calendar-only bundle) the first time they're needed.\r\n // ---------------------------------------------------------------------------\r\n // 'calendar' | 'detail' | 'series' | 'collection' | 'checkout' | 'success'\r\n let widgetView = $state('calendar');\r\n let activeEntity = $state(null); // { type, id, slug, data, initialEventData }\r\n // Payload handed from Checkout → Success on a completed purchase.\r\n let successPayload = $state(null);\r\n let entityResolving = $state(false); // true while resolvePublicEntity is in flight\r\n // Monotonic token: guards against a slow resolve landing after the user has\r\n // already navigated elsewhere (back to the calendar, or on to a different\r\n // show). Every entity open/close/resolve bumps it; stale async work bails.\r\n let entityNav = 0;\r\n let EventPageComp = $state(null);\r\n let SeriesPageComp = $state(null);\r\n let CollectionViewComp = $state(null);\r\n let CheckoutComp = $state(null);\r\n let SuccessComp = $state(null);\r\n\r\n // Network error modal state\r\n let showNetworkError = $state(false);\r\n let networkErrorRetrying = $state(false);\r\n let failedMonthKey = null;\r\n\r\n // Delayed skeleton: only show if loading takes > 250ms (avoids flash on fast connections)\r\n const SKELETON_DELAY_MS = 250;\r\n let showDelayedSkeleton = $state(false);\r\n let skeletonTimeout = null;\r\n\r\n // Start skeleton timer when loading begins\r\n $effect(() => {\r\n if (isLoading && !hasLoaded) {\r\n skeletonTimeout = setTimeout(() => {\r\n if (isLoading) showDelayedSkeleton = true;\r\n }, SKELETON_DELAY_MS);\r\n }\r\n });\r\n\r\n // Clear skeleton when loading completes\r\n $effect(() => {\r\n if (hasLoaded) {\r\n if (skeletonTimeout) clearTimeout(skeletonTimeout);\r\n showDelayedSkeleton = false;\r\n }\r\n });\r\n\r\n // Dynamically import legacy browse views when ?legacy=1 is active.\r\n // RETIREMENT: 2026-08-13 — see docs/LEGACY_RETIREMENT.md.\r\n $effect(() => {\r\n if (useLegacy) {\r\n logger.warn(\r\n '[VC] DEPRECATED: ?legacy=1 fallback for CalendarContainer views retires on 2026-08-13. See docs/LEGACY_RETIREMENT.md.'\r\n );\r\n import('../Calendar/GalleryView.legacy.svelte').then(m => {\r\n LegacyGalleryView = m.default;\r\n });\r\n import('../Calendar/GroupedListView.legacy.svelte').then(m => {\r\n LegacyGroupedListView = m.default;\r\n });\r\n import('../Calendar/CarouselView.legacy.svelte').then(m => {\r\n LegacyCarouselView = m.default;\r\n });\r\n import('../Calendar/FeaturedView.legacy.svelte').then(m => {\r\n LegacyFeaturedView = m.default;\r\n });\r\n }\r\n });\r\n\r\n // Cleanup on destroy\r\n onDestroy(() => {\r\n if (skeletonTimeout) clearTimeout(skeletonTimeout);\r\n });\r\n\r\n // Show skeleton if delayed timer fired, OR show nothing if still loading (fast connection case)\r\n // Only show content when hasLoaded is true\r\n let shouldShowSkeleton = $derived(showDelayedSkeleton);\r\n let showContent = $derived(hasLoaded && !shouldShowSkeleton);\r\n let calendarRef = $state(); // Reference to Calendar component for animations\r\n\r\n const VIEW = {\r\n LIST: 0,\r\n GALLERY: 1,\r\n CALENDAR: 2,\r\n CAROUSEL: 3,\r\n FEATURED: 4,\r\n };\r\n\r\n const VIEW_NAMES = ['list', 'gallery', 'calendar', 'carousel', 'featured'];\r\n\r\n // Get view from URL reactively via $page store\r\n let viewFromUrl = $derived.by(() => {\r\n const viewParam = $page.url.searchParams.get('view');\r\n const viewIndex = VIEW_NAMES.indexOf(viewParam);\r\n return viewIndex >= 0 ? viewIndex : VIEW.CALENDAR;\r\n });\r\n\r\n let publicView = writable(VIEW.CALENDAR);\r\n let displayedCount = writable(12);\r\n\r\n // Sync store with URL (runs on initial load and URL changes)\r\n $effect(() => {\r\n publicView.set(viewFromUrl);\r\n });\r\n\r\n // Use local time for consistency with MonthSwitcher and calendar display\r\n // Initialize with current date, then sync with props via $effect below\r\n let internalMonth = writable(new Date().getMonth());\r\n let internalYear = writable(new Date().getFullYear());\r\n\r\n // Sync internal stores with props when they change (only for non-store props)\r\n $effect(() => {\r\n if (typeof currentMonth === 'number') {\r\n internalMonth.set(currentMonth);\r\n }\r\n });\r\n\r\n $effect(() => {\r\n if (typeof currentYear === 'number') {\r\n internalYear.set(currentYear);\r\n }\r\n });\r\n\r\n let month = $derived(\r\n typeof currentMonth?.subscribe === 'function' ? currentMonth : internalMonth\r\n );\r\n let year = $derived(\r\n typeof currentYear?.subscribe === 'function' ? currentYear : internalYear\r\n );\r\n\r\n const defaultHandleNext = () => {\r\n internalMonth.update(m =>\r\n m === 11 ? (internalYear.update(y => y + 1), 0) : m + 1\r\n );\r\n };\r\n const defaultHandlePrev = () => {\r\n internalMonth.update(m =>\r\n m === 0 ? (internalYear.update(y => y - 1), 11) : m - 1\r\n );\r\n };\r\n // defaultHandleToday needs to update the correct store (either internal or passed-in)\r\n // We can't use $month directly in a function, so we need to check which store to update\r\n function defaultHandleToday() {\r\n // Use local time to match calendar display\r\n const now = new Date();\r\n const targetMonth = now.getMonth();\r\n const targetYear = now.getFullYear();\r\n\r\n // Update the correct stores based on what was passed in\r\n if (typeof currentMonth?.subscribe === 'function') {\r\n // Parent passed a store - update it\r\n currentMonth.set(targetMonth);\r\n } else {\r\n // Using internal store\r\n internalMonth.set(targetMonth);\r\n }\r\n\r\n if (typeof currentYear?.subscribe === 'function') {\r\n // Parent passed a store - update it\r\n currentYear.set(targetYear);\r\n } else {\r\n // Using internal store\r\n internalYear.set(targetYear);\r\n }\r\n }\r\n\r\n // Animated version of handleToday - determines direction based on current vs target month\r\n function animatedHandleToday() {\r\n const now = new Date();\r\n const targetMonth = now.getMonth();\r\n const targetYear = now.getFullYear();\r\n\r\n // Get current values from the appropriate stores\r\n const currMonth =\r\n typeof currentMonth?.subscribe === 'function' ? $month : $internalMonth;\r\n const currYear =\r\n typeof currentYear?.subscribe === 'function' ? $year : $internalYear;\r\n\r\n // Calculate direction: negative = go back (prev), positive = go forward (next)\r\n const monthDiff = (targetYear - currYear) * 12 + (targetMonth - currMonth);\r\n\r\n if (monthDiff === 0) {\r\n // Already on current month, no animation needed\r\n return;\r\n }\r\n\r\n const direction = monthDiff < 0 ? -1 : 1;\r\n\r\n if (calendarRef?.animateMonthTransition) {\r\n calendarRef.animateMonthTransition(direction, defaultHandleToday);\r\n } else {\r\n defaultHandleToday();\r\n }\r\n }\r\n\r\n let effectiveHandleNext = $derived(handleNext ?? defaultHandleNext);\r\n let effectiveHandlePrev = $derived(handlePrev ?? defaultHandlePrev);\r\n\r\n // Animated versions for chevron clicks - uses Calendar's animation function\r\n function animatedHandleNext() {\r\n if (calendarRef?.animateMonthTransition) {\r\n calendarRef.animateMonthTransition(1, effectiveHandleNext);\r\n } else {\r\n effectiveHandleNext();\r\n }\r\n }\r\n\r\n function animatedHandlePrev() {\r\n if (calendarRef?.animateMonthTransition) {\r\n calendarRef.animateMonthTransition(-1, effectiveHandlePrev);\r\n } else {\r\n effectiveHandlePrev();\r\n }\r\n }\r\n\r\n // Default view options when showViewOptions is true (but not an array)\r\n let DEFAULT_VIEW_OPTIONS = $derived([\r\n { id: VIEW.LIST, text: labels.viewList },\r\n { id: VIEW.GALLERY, text: labels.viewGallery },\r\n { id: VIEW.CALENDAR, text: labels.viewCalendar },\r\n ]);\r\n\r\n let PublicOptions = $derived(\r\n showViewOptions\r\n ? Array.isArray(showViewOptions)\r\n ? showViewOptions\r\n : DEFAULT_VIEW_OPTIONS\r\n : []\r\n );\r\n\r\n function selectOption(option) {\r\n publicView.set(option.id);\r\n // Update URL with view parameter\r\n const params = new URLSearchParams($page.url.searchParams);\r\n params.set('view', VIEW_NAMES[option.id]);\r\n gotoUrl(`?${params.toString()}`, { replaceState: true, keepFocus: true });\r\n }\r\n\r\n let searchQuery = writable('');\r\n // Initialize with empty array - the $effect below will sync with allEvents\r\n let filteredEvents = writable([]);\r\n\r\n /**\r\n * Load events for a specific month using the paginated API\r\n * @param {number} targetYear - Year (e.g., 2025)\r\n * @param {number} targetMonth - Month (0-indexed like JS Date)\r\n * @param {boolean} isInitial - Whether this is the initial load (shows skeleton)\r\n */\r\n async function loadMonthEvents(targetYear, targetMonth, isInitial = false) {\r\n if (!isMounted) return;\r\n if (!venueId && !organizationId) {\r\n return;\r\n }\r\n\r\n const monthKey = `${targetYear}-${String(targetMonth + 1).padStart(2, '0')}`;\r\n\r\n // Skip if already cached or loading\r\n if (monthEventsCache.has(monthKey) || loadingMonths.has(monthKey)) {\r\n return;\r\n }\r\n\r\n loadingMonths.add(monthKey);\r\n if (isInitial) {\r\n isLoading = true;\r\n }\r\n\r\n try {\r\n // API uses 1-indexed months\r\n const apiMonth = targetMonth + 1;\r\n let result;\r\n\r\n if (organizationId) {\r\n result = await getOrgMonthEvents(organizationId, targetYear, apiMonth);\r\n } else if (venueId) {\r\n result = await getMonthEvents(venueId, targetYear, apiMonth);\r\n }\r\n\r\n if (!isMounted) return;\r\n\r\n const resultAny = /** @type {any} */ (result);\r\n // getOrgMonthEvents / getMonthEvents return the UNWRAPPED Event[] array.\r\n // (Tolerate a legacy { events, pagination } wrapper too, defensively.)\r\n // Reading resultAny.events off a bare array silently yields undefined,\r\n // which is what made every calendar render \"No upcoming events\".\r\n const rawEvents = Array.isArray(resultAny)\r\n ? resultAny\r\n : Array.isArray(resultAny?.events)\r\n ? resultAny.events\r\n : [];\r\n const transformedEvents = rawEvents\r\n .map(transformEventData)\r\n .filter(Boolean);\r\n\r\n // Cache the events for this month\r\n monthEventsCache.set(monthKey, transformedEvents);\r\n // With $state(), we need to reassign for reactivity to trigger\r\n monthEventsCache = new Map(monthEventsCache);\r\n\r\n // Store pagination info (only present on the legacy wrapper shape)\r\n if (!Array.isArray(resultAny) && resultAny?.pagination) {\r\n paginationInfo = resultAny.pagination;\r\n }\r\n } catch (err) {\r\n logger.error(`Error loading events for ${monthKey}:`, err);\r\n // Show error modal for initial load failures\r\n if (isInitial && isMounted) {\r\n failedMonthKey = monthKey;\r\n showNetworkError = true;\r\n } else {\r\n // Cache empty array to prevent retrying for background loads\r\n monthEventsCache.set(monthKey, []);\r\n monthEventsCache = new Map(monthEventsCache);\r\n }\r\n } finally {\r\n loadingMonths.delete(monthKey);\r\n if (isInitial && isMounted) {\r\n isLoading = false;\r\n hasLoaded = true;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Preload adjacent months (prev and next) during idle time\r\n */\r\n function preloadAdjacentMonths(currentMo, currentYr) {\r\n const scheduleIdle =\r\n typeof requestIdleCallback !== 'undefined'\r\n ? requestIdleCallback\r\n : cb => setTimeout(cb, 100);\r\n\r\n scheduleIdle(() => {\r\n // Calculate previous month\r\n const prevMonth = currentMo === 0 ? 11 : currentMo - 1;\r\n const prevYear = currentMo === 0 ? currentYr - 1 : currentYr;\r\n loadMonthEvents(prevYear, prevMonth);\r\n\r\n // Calculate next month\r\n const nextMonth = currentMo === 11 ? 0 : currentMo + 1;\r\n const nextYear = currentMo === 11 ? currentYr + 1 : currentYr;\r\n loadMonthEvents(nextYear, nextMonth);\r\n });\r\n }\r\n\r\n async function loadEvents() {\r\n if (!isMounted) {\r\n return;\r\n }\r\n if (isLoadingPromise) {\r\n return isLoadingPromise;\r\n }\r\n if (hasLoaded && !venueId && !organizationId) {\r\n return;\r\n }\r\n isLoading = true;\r\n error = null;\r\n\r\n isLoadingPromise = (async () => {\r\n try {\r\n if (!isMounted) {\r\n return;\r\n }\r\n\r\n let apiEvents = [];\r\n\r\n if (organizationId) {\r\n const venues = await fetchAllVenues(organizationId);\r\n\r\n if (!isMounted) {\r\n return;\r\n }\r\n if (Array.isArray(venues) && venues.length > 0) {\r\n const eventPromises = venues.map(venue =>\r\n fetchVenueEvents(venue.id || venue.ID)\r\n );\r\n const eventArrays = await Promise.all(eventPromises);\r\n apiEvents = eventArrays.flat();\r\n\r\n const eventsFromVenues = venues\r\n .filter(venue => venue.nextEvent)\r\n .map(venue => {\r\n const nextEventDate = new Date(venue.nextEvent);\r\n if (!isNaN(nextEventDate.getTime())) {\r\n return {\r\n id: `${venue.id}`,\r\n title: `${venue.name}`,\r\n name: venue.name,\r\n slug: generateSlug(venue.name || ''),\r\n startDateTime: nextEventDate.toISOString(), // @datetime-escape: startDateTime API payload\r\n description: venue.description || '',\r\n venueId: venue.id,\r\n image: venue.image || '',\r\n status: 'On Sale',\r\n };\r\n }\r\n return null;\r\n })\r\n .filter(Boolean);\r\n\r\n apiEvents = [...apiEvents, ...eventsFromVenues];\r\n }\r\n } else if (venueId) {\r\n apiEvents = await fetchVenueEvents(venueId);\r\n\r\n // Check again after async operation\r\n if (!isMounted) {\r\n return;\r\n }\r\n }\r\n\r\n // Final check before updating state\r\n if (!isMounted) {\r\n return;\r\n }\r\n\r\n fetchedEvents = Array.isArray(apiEvents)\r\n ? apiEvents.map(transformEventData).filter(Boolean)\r\n : [];\r\n } catch (err) {\r\n // Only update state if component is still mounted\r\n if (isMounted) {\r\n fetchedEvents = [...events];\r\n error = null;\r\n }\r\n } finally {\r\n if (isMounted) {\r\n isLoading = false;\r\n hasLoaded = true;\r\n }\r\n isLoadingPromise = null;\r\n }\r\n })();\r\n\r\n return isLoadingPromise;\r\n }\r\n\r\n // Track the IDs we last loaded for, so we can reload when they change\r\n let loadedVenueId = null;\r\n let loadedOrgId = null;\r\n\r\n onMount(() => {\r\n isMounted = true;\r\n\r\n // Initialize WidgetUrlManager for pushState/popstate URL sync\r\n // Skip URL management in 'none' mode (iframe/Wix embeds where pushState is broken)\r\n if (urlMode === 'none') {\r\n urlManager = null;\r\n } else {\r\n urlManager = new WidgetUrlManager({\r\n onNavigate: state => {\r\n // Sync the page store so $page.url reflects the new URL\r\n syncPageStore();\r\n\r\n if (inlineEntityViews) {\r\n // Embed: hash changed (back/forward, or host edited the hash) -->\r\n // open or close the entity view in-place. Resolve by id so it works\r\n // even when the show isn't in the loaded month (cross-month).\r\n if (state.entity) {\r\n const id = String(state.entity.id);\r\n if (!activeEntity || String(activeEntity.id) !== id) {\r\n resolveAndOpenEntity(id, state.entity.slug, {\r\n pushHash: false,\r\n });\r\n }\r\n } else if (widgetView !== 'calendar') {\r\n closeEntityToCalendar({ pushHash: false });\r\n }\r\n } else if (state.entity) {\r\n // Back/forward navigated TO an entity -- find and open it\r\n const targetId = String(state.entity.id);\r\n const match = allEvents.find(ev => String(ev.id) === targetId);\r\n if (match) {\r\n // Simulate event click to open detail view (use the internal callback path)\r\n if (onEventClick && typeof onEventClick === 'function') {\r\n onEventClick(match);\r\n } else {\r\n // SvelteKit context: navigate to event page\r\n const eventSlug =\r\n match.slug || generateSlug(match.name || 'event');\r\n navigateTo(`/e/${match.id}-${eventSlug}`);\r\n }\r\n } else {\r\n // Entity not found in loaded events -- fall back to listing.\r\n // Go through the manager so its change-detection state stays in sync.\r\n urlManager?.pushListing();\r\n }\r\n } else {\r\n // Navigated back to listing -- restore SEO state and scroll position\r\n if (seoController) {\r\n seoController.onBackToListing();\r\n }\r\n requestAnimationFrame(() => window.scrollTo(0, savedScrollY));\r\n }\r\n\r\n // Handle month param changes\r\n if (state.month) {\r\n const [yearStr, monthStr] = state.month.split('-');\r\n const targetYear = parseInt(yearStr, 10);\r\n const targetMonth = parseInt(monthStr, 10) - 1; // 0-indexed\r\n if (!isNaN(targetYear) && !isNaN(targetMonth)) {\r\n internalYear.set(targetYear);\r\n internalMonth.set(targetMonth);\r\n }\r\n }\r\n },\r\n });\r\n\r\n // Read initial URL state for deep linking (READ only, no pushState)\r\n const initialState = urlManager.readState();\r\n if (initialState.entity) {\r\n // Will be handled by the $effect below once events are loaded\r\n // Store it for the initial-load deep link handler\r\n pendingDeepLink = initialState.entity;\r\n }\r\n if (initialState.month) {\r\n const [yearStr, monthStr] = initialState.month.split('-');\r\n const targetYear = parseInt(yearStr, 10);\r\n const targetMonth = parseInt(monthStr, 10) - 1;\r\n if (!isNaN(targetYear) && !isNaN(targetMonth)) {\r\n internalYear.set(targetYear);\r\n internalMonth.set(targetMonth);\r\n }\r\n }\r\n } // end urlMode !== 'none'\r\n\r\n // Embed bridge — iframe embeds only (inert for script/light-DOM embeds,\r\n // where the host scrolls as one document by construction).\r\n if (isEmbeddedInIframe()) {\r\n // Report the full document height so the host sizes the frame to fit\r\n // (iframe-resizer pattern) — no inner scrollbar. We observe the widget\r\n // root for change triggers but report documentElement.scrollHeight so any\r\n // body margin/padding around the widget is included.\r\n if (rootEl) {\r\n cleanupHeightObserver = observeHeight(rootEl, postResize, () =>\r\n Math.ceil(document.documentElement.scrollHeight)\r\n );\r\n }\r\n // Accept host → widget navigation commands (open a show / go back).\r\n if (inlineEntityViews) {\r\n cleanupHostNavListener = listenForHostNavigation(({ id, slug }) => {\r\n // Back to listing on an empty id.\r\n if (id === null || id === undefined || id === '') {\r\n closeEntityToCalendar({ pushHash: true });\r\n return;\r\n }\r\n // Only act on a numeric id — ignore anything malformed so a hostile\r\n // message can't drive arbitrary /resolve/{id} fetches.\r\n const safeId = String(id);\r\n if (!/^\\d+$/.test(safeId)) return;\r\n resolveAndOpenEntity(safeId, typeof slug === 'string' ? slug : '');\r\n });\r\n }\r\n }\r\n });\r\n\r\n // Initial load effect - runs when organizationId or venueId becomes available\r\n $effect(() => {\r\n if (isMounted && !hasLoaded && (organizationId || venueId)) {\r\n const initialMonth =\r\n typeof currentMonth === 'number' ? currentMonth : new Date().getMonth();\r\n const initialYear =\r\n typeof currentYear === 'number'\r\n ? currentYear\r\n : new Date().getFullYear();\r\n loadMonthEvents(initialYear, initialMonth, true);\r\n }\r\n });\r\n\r\n onDestroy(() => {\r\n isMounted = false;\r\n isLoadingPromise = null;\r\n if (urlManager) {\r\n urlManager.destroy();\r\n urlManager = null;\r\n }\r\n if (seoController) {\r\n seoController.destroy();\r\n seoController = null;\r\n }\r\n if (cleanupHeightObserver) {\r\n cleanupHeightObserver();\r\n cleanupHeightObserver = null;\r\n }\r\n if (cleanupHostNavListener) {\r\n cleanupHostNavListener();\r\n cleanupHostNavListener = null;\r\n }\r\n });\r\n\r\n // Load events when month changes (reactive) + sync month param to URL\r\n $effect(() => {\r\n if (isMounted && hasLoaded && $month !== undefined && $year !== undefined) {\r\n loadMonthEvents($year, $month);\r\n // Preload adjacent months during idle time\r\n preloadAdjacentMonths($month, $year);\r\n // Sync month param to URL via replaceState (no history entry)\r\n if (urlManager) {\r\n const monthStr = `${$year}-${String($month + 1).padStart(2, '0')}`;\r\n urlManager.setMonth(monthStr);\r\n }\r\n }\r\n });\r\n\r\n // Combine all cached month events into a single array for components that need all events\r\n // Note: For calendar view, we filter by month anyway, so this is mainly for list/gallery views\r\n let allCachedEvents = $derived(Array.from(monthEventsCache.values()).flat());\r\n\r\n // Check if there are no real events (for empty state)\r\n // Empty state shows when: data has loaded, no cached events, and no passed-in events\r\n let hasNoEvents = $derived(\r\n hasLoaded && allCachedEvents.length === 0 && events.length === 0\r\n );\r\n\r\n // Merge cached month events with any passed-in events\r\n let allEvents = $derived.by(() => {\r\n const cachedEvents = allCachedEvents.length > 0 ? allCachedEvents : [];\r\n const passedEvents = events.length > 0 ? events : [];\r\n // Dedupe by ID\r\n const seen = new Set();\r\n const deduped = [...cachedEvents, ...passedEvents].filter(e => {\r\n if (seen.has(e.id)) return false;\r\n seen.add(e.id);\r\n return true;\r\n });\r\n // Apply the saved widget filter (embed via widget-id) so the embed shows\r\n // the same subset configured in the builder. No-op when filterValues is null.\r\n return filterValues ? filterWidgetEvents(deduped, filterValues) : deduped;\r\n });\r\n\r\n // Handle pending deep link.\r\n $effect(() => {\r\n if (!pendingDeepLink) return;\r\n\r\n if (inlineEntityViews) {\r\n // Embed: resolve the id directly and open in-place. Don't wait for the\r\n // calendar month to load — a cold deep link may point at a show in a\r\n // different month than the one shown (cross-month deep link), so we\r\n // must NOT depend on the entity being present in allEvents.\r\n const { id, slug } = pendingDeepLink;\r\n pendingDeepLink = null;\r\n resolveAndOpenEntity(id, slug, { pushHash: false });\r\n return;\r\n }\r\n\r\n // Non-embed (consumer onEventClick / SvelteKit SSR): wait for events to\r\n // load, then match by id.\r\n if (hasLoaded && allEvents.length > 0) {\r\n const targetId = String(pendingDeepLink.id);\r\n const match = allEvents.find(ev => String(ev.id) === targetId);\r\n if (match) {\r\n if (onEventClick && typeof onEventClick === 'function') {\r\n onEventClick(match);\r\n }\r\n // Note: in SvelteKit context (no onEventClick), the deep link resolves\r\n // on the server via +layout.server.ts, so no client-side action needed\r\n } else {\r\n // Entity not found -- clear the entity hash through the manager so its\r\n // change-detection state stays in sync.\r\n urlManager?.pushListing();\r\n }\r\n pendingDeepLink = null;\r\n }\r\n });\r\n\r\n /**\r\n * Get events for a specific month/year\r\n */\r\n function getEventsForMonth(eventsList, targetMonth, targetYear) {\r\n return eventsList.filter(event => {\r\n if (!event.date) return false;\r\n const [year, month] = event.date.split('-').map(Number);\r\n return month - 1 === targetMonth && year === targetYear;\r\n });\r\n }\r\n\r\n /**\r\n * Prefetch images for a specific month using requestIdleCallback\r\n */\r\n function prefetchImagesForMonth(eventsList, targetMonth, targetYear) {\r\n const monthKey = `${targetYear}-${targetMonth}`;\r\n if (prefetchedMonths.has(monthKey)) return;\r\n\r\n const monthEvents = getEventsForMonth(eventsList, targetMonth, targetYear);\r\n const imageUrls = monthEvents\r\n .map(event => event.image)\r\n .filter(url => url && !url.startsWith('data:'));\r\n\r\n if (imageUrls.length === 0) {\r\n prefetchedMonths.add(monthKey);\r\n return;\r\n }\r\n\r\n // Use requestIdleCallback for non-blocking prefetch, fallback to setTimeout\r\n const scheduleIdle =\r\n typeof requestIdleCallback !== 'undefined'\r\n ? requestIdleCallback\r\n : cb => setTimeout(cb, 1);\r\n\r\n scheduleIdle(() => {\r\n imageUrls.forEach(url => {\r\n const img = new Image();\r\n img.src = url;\r\n });\r\n prefetchedMonths.add(monthKey);\r\n });\r\n }\r\n\r\n /**\r\n * Prefetch images for adjacent months (prev and next)\r\n */\r\n function prefetchAdjacentMonths(eventsList, currentMo, currentYr) {\r\n // Calculate previous month\r\n const prevMonth = currentMo === 0 ? 11 : currentMo - 1;\r\n const prevYear = currentMo === 0 ? currentYr - 1 : currentYr;\r\n\r\n // Calculate next month\r\n const nextMonth = currentMo === 11 ? 0 : currentMo + 1;\r\n const nextYear = currentMo === 11 ? currentYr + 1 : currentYr;\r\n\r\n // Prefetch both adjacent months\r\n prefetchImagesForMonth(eventsList, prevMonth, prevYear);\r\n prefetchImagesForMonth(eventsList, nextMonth, nextYear);\r\n }\r\n\r\n // Prefetch adjacent month images when events are loaded and month changes\r\n $effect(() => {\r\n if (\r\n hasLoaded &&\r\n allEvents.length > 0 &&\r\n $month !== undefined &&\r\n $year !== undefined\r\n ) {\r\n // First prefetch current month (should already be loaded, but ensures it's tracked)\r\n prefetchImagesForMonth(allEvents, $month, $year);\r\n // Then prefetch adjacent months during idle time\r\n prefetchAdjacentMonths(allEvents, $month, $year);\r\n }\r\n });\r\n\r\n // SEO controller: notify when events are loaded\r\n $effect(() => {\r\n if (seoController && hasLoaded && allCachedEvents.length > 0) {\r\n // Extract venue info from first event (all events in a venue widget share the same venue)\r\n const firstEvent = allCachedEvents[0];\r\n const venue = {\r\n name: firstEvent.venueName || '',\r\n googleLocationNameCache: firstEvent.venueAddress || '',\r\n };\r\n\r\n // Build simplified event list for ItemList JSON-LD (only needs id, name, slug)\r\n const eventsForSeo = allCachedEvents.map(ev => ({\r\n id: ev.id,\r\n name: ev.name,\r\n slug: ev.slug || generateSlug(ev.name || ''),\r\n startDateTime: ev.startDateTime,\r\n image: ev.image,\r\n }));\r\n\r\n seoController.onEventsLoaded(eventsForSeo, venue);\r\n }\r\n });\r\n\r\n function handleSearch(event) {\r\n const query = event.detail.query.toLowerCase();\r\n searchQuery.set(query);\r\n filteredEvents.set(\r\n allEvents.filter(ev => ev.name.toLowerCase().includes(query))\r\n );\r\n }\r\n\r\n // Adapt calendar events to BrowseEvent[] for Time Pills components\r\n let browseEvents = $derived(adaptToBrowseEvents($filteredEvents));\r\n\r\n $effect(() => {\r\n if (allEvents) filteredEvents.set(allEvents);\r\n });\r\n\r\n function navigate(url, options = {}) {\r\n if (typeof window === 'undefined') return;\r\n\r\n // Use pushState for client-side navigation (no page refresh)\r\n if (options.replaceState) {\r\n window.history.replaceState({}, '', url);\r\n } else {\r\n window.history.pushState({}, '', url);\r\n }\r\n window.dispatchEvent(\r\n new CustomEvent('micdrop-navigate', {\r\n detail: { url, route: 'details', replaceState: options.replaceState },\r\n })\r\n );\r\n }\r\n\r\n // Network error retry handler\r\n async function handleNetworkRetry() {\r\n if (!failedMonthKey) return;\r\n\r\n networkErrorRetrying = true;\r\n const [year, month] = failedMonthKey.split('-').map(Number);\r\n // Convert back to 0-indexed month\r\n const targetMonth = month - 1;\r\n\r\n try {\r\n // Clear the failed state and retry\r\n showNetworkError = false;\r\n await loadMonthEvents(year, targetMonth, true);\r\n } finally {\r\n networkErrorRetrying = false;\r\n failedMonthKey = null;\r\n }\r\n }\r\n\r\n function handleNetworkErrorClose() {\r\n showNetworkError = false;\r\n failedMonthKey = null;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // In-widget entity view helpers (embed only)\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Swap the listing JSON-LD/head tags for the selected entity's. */\r\n function notifyEntitySelectedSeo(type, data) {\r\n if (!seoController || !data) return;\r\n const seoVenue = {\r\n name: allCachedEvents[0]?.venueName || '',\r\n googleLocationNameCache: allCachedEvents[0]?.venueAddress || '',\r\n };\r\n try {\r\n seoController.onEntitySelected(type, data, seoVenue);\r\n } catch (err) {\r\n logger.error('SEO onEntitySelected failed:', err);\r\n }\r\n }\r\n\r\n /** Lazy-load the view component for an entity type (memoized). */\r\n async function loadEntityComponent(type) {\r\n if (type === 'series') {\r\n if (!SeriesPageComp) {\r\n SeriesPageComp = (await import('../Views/SeriesPage.svelte')).default;\r\n }\r\n } else if (type === 'collection') {\r\n if (!CollectionViewComp) {\r\n CollectionViewComp = (await import('../Views/CollectionView.svelte'))\r\n .default;\r\n }\r\n } else if (!EventPageComp) {\r\n // The real inline event page (Event.svelte / BookingWidget — tickets\r\n // selected on the page, no modal). NOT the stray EventPage.\r\n EventPageComp = (await import('../Views/EventPage.svelte')).default;\r\n }\r\n }\r\n\r\n /**\r\n * Render an entity (event/series/collection) in-place. Mirrors the show in\r\n * the hash, updates SEO, scrolls the widget to the top, then lazy-loads the\r\n * view component.\r\n *\r\n * `data` is the SEO/render payload (the full event/series/collection object\r\n * when known). `initialEventData` is passed to EventPage ONLY when it\r\n * is the FULL detail payload (e.g. from resolve) — a calendar-list event is\r\n * the partial browse shape, so we pass null there and let EventPage\r\n * fetch the full record by id (otherwise tickets/showtimes/venue are missing).\r\n */\r\n async function openEntityInWidget({\r\n type,\r\n id,\r\n slug = '',\r\n data = null,\r\n initialEventData = null,\r\n pushHash = true,\r\n }) {\r\n entityNav++;\r\n activeEntity = {\r\n type,\r\n id: String(id),\r\n slug: slug || '',\r\n data,\r\n initialEventData,\r\n };\r\n widgetView =\r\n type === 'series'\r\n ? 'series'\r\n : type === 'collection'\r\n ? 'collection'\r\n : 'detail';\r\n entityResolving = false;\r\n\r\n // Mirror the show in the URL hash (#{id}-{slug}) + keep the page store in sync.\r\n if (pushHash && urlManager) {\r\n urlManager.pushEntity(id, slug || '');\r\n syncPageStore();\r\n }\r\n\r\n notifyEntitySelectedSeo(type, data);\r\n\r\n // Tell an iframe host to mirror the show in its own URL hash (no-op for\r\n // script embeds). title is best-effort from whatever payload we have.\r\n postNavigation({\r\n id,\r\n slug: slug || '',\r\n title: data?.name || data?.title || data?.collectionTitle || '',\r\n });\r\n\r\n // Bring the detail to the top of the widget (mirrors a fresh page load).\r\n if (typeof window !== 'undefined') {\r\n requestAnimationFrame(() => {\r\n const el = document.querySelector('.micdrop-calendar-container');\r\n if (el && typeof el.scrollIntoView === 'function') {\r\n el.scrollIntoView({ block: 'start', behavior: 'auto' });\r\n }\r\n });\r\n }\r\n\r\n await loadEntityComponent(type);\r\n }\r\n\r\n /** Return to the calendar listing from an entity view. */\r\n function closeEntityToCalendar({ pushHash = true } = {}) {\r\n entityNav++;\r\n widgetView = 'calendar';\r\n activeEntity = null;\r\n entityResolving = false;\r\n if (pushHash && urlManager) {\r\n urlManager.pushListing();\r\n syncPageStore();\r\n }\r\n if (seoController) seoController.onBackToListing();\r\n // Tell an iframe host to clear its hash (back to the listing).\r\n postNavigation({ id: null });\r\n if (typeof window !== 'undefined') {\r\n requestAnimationFrame(() => window.scrollTo(0, savedScrollY));\r\n }\r\n }\r\n\r\n /**\r\n * Resolve a type-agnostic id to its concrete entity then open it in-place.\r\n * Used for cold deep links and back/forward navigation, where the widget\r\n * doesn't already know whether the id is an event, series, or collection.\r\n */\r\n async function resolveAndOpenEntity(id, slug, { pushHash = false } = {}) {\r\n const token = ++entityNav;\r\n entityResolving = true;\r\n widgetView = 'loading';\r\n const resolved = await resolvePublicEntity(id, slug);\r\n // Superseded while the resolve was in flight (user went back, or opened a\r\n // different show) — drop this stale result.\r\n if (token !== entityNav) return;\r\n if (resolved && resolved.type) {\r\n // resolve returns the FULL entity payload, so for events it's safe to\r\n // hand straight to EventPage as initialEventData (no refetch).\r\n await openEntityInWidget({\r\n type: resolved.type,\r\n id,\r\n slug,\r\n data: resolved.data,\r\n initialEventData: resolved.type === 'event' ? resolved.data : null,\r\n pushHash,\r\n });\r\n } else {\r\n // Resolve unavailable — fall back to an event so EventPage's own\r\n // fetch-by-id can try (and surface its own error UI if the id is bad).\r\n await openEntityInWidget({\r\n type: 'event',\r\n id,\r\n slug,\r\n data: null,\r\n pushHash,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Buy CTA from the in-widget detail view → render Checkout IN-PLACE (the\r\n * frame grows; the host scrolls — never a fixed modal trapped in the frame).\r\n * EventPage already created the cart and set the `checkout-cartid`\r\n * cookie (SameSite=None; Secure, so it survives iframe embeds) before calling\r\n * this, so Checkout finds a live session. We keep the show in the hash; the\r\n * checkout/success steps are transient (not deep-linkable).\r\n */\r\n async function handleInWidgetCart(eventId, slug, eventPayload = null) {\r\n entityNav++;\r\n // Keep activeEntity (the show) so back / success can return to it. Prefer\r\n // the full raw event EventPage just fetched/validated — the show may\r\n // have been opened from a series/collection occurrence with data:null, so\r\n // this is the only place the full payload is available for checkout/success.\r\n activeEntity = {\r\n type: 'event',\r\n id: String(eventId),\r\n slug: slug || activeEntity?.slug || '',\r\n data: eventPayload || activeEntity?.data || null,\r\n initialEventData: eventPayload || activeEntity?.initialEventData || null,\r\n };\r\n widgetView = 'checkout';\r\n if (typeof window !== 'undefined') {\r\n requestAnimationFrame(() => {\r\n const el = document.querySelector('.micdrop-calendar-container');\r\n el?.scrollIntoView?.({ block: 'start', behavior: 'auto' });\r\n });\r\n }\r\n if (!CheckoutComp) {\r\n CheckoutComp = (await import('../Views/Checkout.svelte')).default;\r\n }\r\n }\r\n\r\n /** Payment succeeded in the in-widget Checkout → render Success in-place. */\r\n async function handleInWidgetSuccess(payload) {\r\n entityNav++;\r\n successPayload = payload || {};\r\n widgetView = 'success';\r\n if (typeof window !== 'undefined') {\r\n requestAnimationFrame(() => {\r\n const el = document.querySelector('.micdrop-calendar-container');\r\n el?.scrollIntoView?.({ block: 'start', behavior: 'auto' });\r\n });\r\n }\r\n if (!SuccessComp) {\r\n SuccessComp = (await import('../Views/Success.svelte')).default;\r\n }\r\n }\r\n\r\n /** Back from the in-widget Checkout → return to the show detail. */\r\n function handleCheckoutBack() {\r\n if (activeEntity) {\r\n openEntityInWidget({\r\n type: 'event',\r\n id: activeEntity.id,\r\n slug: activeEntity.slug,\r\n data: activeEntity.data,\r\n initialEventData: activeEntity.initialEventData,\r\n pushHash: false,\r\n });\r\n } else {\r\n closeEntityToCalendar();\r\n }\r\n }\r\n\r\n /** A series occurrence was clicked — open it as an event detail in-place. */\r\n function handleSeriesOccurrence(id, slug, name) {\r\n openEntityInWidget({\r\n type: 'event',\r\n id,\r\n slug: slug || generateSlug(name || 'event'),\r\n data: null,\r\n });\r\n }\r\n\r\n /** A collection item was clicked — open it as an event detail in-place. */\r\n function handleCollectionEvent(id, slug) {\r\n openEntityInWidget({ type: 'event', id, slug: slug || '', data: null });\r\n }\r\n\r\n function handleEventClick(event) {\r\n const eventData = event.detail || event;\r\n const eventSlug = eventData.slug || generateSlug(eventData.name || 'event');\r\n\r\n // Save scroll position before navigating to detail view\r\n if (typeof window !== 'undefined') {\r\n savedScrollY = window.scrollY;\r\n }\r\n\r\n if (onEventClick && typeof onEventClick === 'function') {\r\n const eventSlug =\r\n eventData.slug || generateSlug(eventData.name || 'event');\r\n // Embedded context: mirror the show in the URL hash FIRST, then invoke callback\r\n if (urlManager) {\r\n urlManager.pushEntity(eventData.id, eventSlug);\r\n syncPageStore();\r\n }\r\n // Notify SEO controller of entity selection (updates JSON-LD, OG tags, canonical, title)\r\n if (seoController) {\r\n const seoEvent = {\r\n name: eventData.name || eventData.title || '',\r\n startDateTime: eventData.startDateTime || '',\r\n endDateTime: eventData.endDateTime || '',\r\n description: eventData.description || '',\r\n image: eventData.image || '',\r\n status: eventData.status || '',\r\n id: eventData.id,\r\n slug: eventSlug,\r\n };\r\n const seoVenue = {\r\n name: allCachedEvents[0]?.venueName || '',\r\n googleLocationNameCache: allCachedEvents[0]?.venueAddress || '',\r\n };\r\n seoController.onEntitySelected('event', seoEvent, seoVenue);\r\n }\r\n onEventClick(eventData);\r\n // urlManager.pushEntity above already mirrored the show in the URL hash\r\n // (#{id}-{slug}); the legacy updateHostDeepLink helper was removed in ac487f5.\r\n return;\r\n }\r\n\r\n // Embed: render the show detail in-place instead of navigating the host.\r\n // Calendar items are always events, so type is known here — no resolve.\r\n // eventData is the partial browse shape (no tickets/showtimes/venue), so we\r\n // pass it for SEO only and leave initialEventData null — EventPage\r\n // fetches the full record by id.\r\n if (inlineEntityViews) {\r\n openEntityInWidget({\r\n type: 'event',\r\n id: eventData.id,\r\n slug: eventSlug,\r\n data: eventData,\r\n initialEventData: null,\r\n });\r\n return;\r\n }\r\n\r\n const eventId = eventData.id;\r\n if (eventId) {\r\n // Notify SEO controller before SvelteKit navigation (for cached page preview)\r\n if (seoController) {\r\n const seoEvent = {\r\n name: eventData.name || eventData.title || '',\r\n startDateTime: eventData.startDateTime || '',\r\n description: eventData.description || '',\r\n image: eventData.image || '',\r\n status: eventData.status || '',\r\n id: eventData.id,\r\n slug: eventSlug,\r\n };\r\n seoController.onEntitySelected('event', seoEvent);\r\n }\r\n // SvelteKit / get-micdrop.com context: full-page navigation to event route\r\n const params = new URLSearchParams();\r\n if (organizationId) params.set('orgId', organizationId);\r\n if (venueId) params.set('venueId', venueId);\r\n\r\n navigateTo(`/e/${eventId}-${eventSlug}?${params.toString()}`);\r\n }\r\n }\r\n\r\n /**\r\n * Bridge function: converts BrowseEvent click into CalendarContainer's handleEventClick format.\r\n * Used by Time Pills browse views (list, gallery, carousel, featured).\r\n */\r\n function handleBrowseEventClick(browseEvent) {\r\n handleEventClick({\r\n id: browseEvent.eventID,\r\n name: browseEvent.name,\r\n slug: browseEvent.slug,\r\n image: browseEvent.imageUrl,\r\n date: browseEvent.date,\r\n status: browseEvent.status,\r\n startDateTime: browseEvent.startDateTime,\r\n });\r\n }\r\n</script>\r\n\r\n<svelte:head>\r\n {#if !seoController}\r\n <title\r\n >{labels.eventCalendarTitle} | {$publicView === VIEW.LIST\r\n ? labels.listView\r\n : $publicView === VIEW.GALLERY\r\n ? labels.galleryView\r\n : labels.calendarView}</title\r\n >\r\n {/if}\r\n</svelte:head>\r\n\r\n<!-- native-element-exception: the in-widget back control is a plain styled\r\n button matching EventPage's own raw back arrow (same package, same\r\n visual language); pulling in the SC compound Button for one icon affordance\r\n would be inconsistent with the sibling detail view. -->\r\n<!-- `micdrop` scope class on the ROOT: the compiled @layer base (Tailwind\r\n preflight + SC typography) is scoped under `.micdrop` at build time\r\n (scripts/css-scope.js). The init/IIFE paths add `.micdrop` to the mount\r\n TARGET via _resolveTarget, but the documented direct Svelte export\r\n (`import { VenueCalendar }` → `<VenueCalendar/>`) bypasses that entirely —\r\n so without this, direct-component renders lose preflight (buttons/inputs/\r\n headings fall back to host/UA defaults). Putting it on the component root\r\n covers BOTH paths; the init path adding it to the target too is harmless. -->\r\n<div class=\"micdrop micdrop-calendar-container\" bind:this={rootEl}>\r\n {#if inlineEntityViews && widgetView !== 'calendar'}\r\n <!-- In-widget entity view (embed only). Replaces the calendar in place so\r\n the host page never navigates away; the buy flow + nested scroll are\r\n handled by slices 3 / 2b respectively. -->\r\n <div class=\"micdrop-entity-view\">\r\n {#if widgetView === 'series' || widgetView === 'collection' || widgetView === 'success'}\r\n <button\r\n type=\"button\"\r\n class=\"micdrop-back-bar\"\r\n onclick={() => closeEntityToCalendar()}\r\n aria-label={labels.goBackToCalendar || 'Back to calendar'}\r\n >\r\n <ArrowLeft class=\"size-4\" aria-hidden=\"true\" />\r\n <span>{labels.goBack || 'Back'}</span>\r\n </button>\r\n {/if}\r\n\r\n {#if widgetView === 'loading' || entityResolving}\r\n <div role=\"status\" aria-label={labels.loadingEvents}>\r\n <SkeletonLoader />\r\n <span class=\"sr-only\">{labels.loadingEventsWait}</span>\r\n </div>\r\n {:else if widgetView === 'detail'}\r\n {#if EventPageComp && activeEntity}\r\n <!-- Key by id: EventPage only fetches on mount, so a detail→detail\r\n jump (e.g. clicking a series occurrence from inside the event\r\n page) must remount it, or it would keep the previous show. -->\r\n {#key activeEntity.id}\r\n <EventPageComp\r\n rawEvent={activeEntity.initialEventData}\r\n eventId={activeEntity.id}\r\n slug={activeEntity.slug}\r\n {organizationId}\r\n onNavigateBack={() => closeEntityToCalendar()}\r\n onNavigateToCart={handleInWidgetCart}\r\n onBuyTickets={(occId, occSlug) =>\r\n openEntityInWidget({\r\n type: 'event',\r\n id: occId,\r\n slug: occSlug || '',\r\n data: null,\r\n })}\r\n {labels}\r\n />\r\n {/key}\r\n {:else}\r\n <div role=\"status\" aria-label={labels.loadingEvents}>\r\n <SkeletonLoader />\r\n </div>\r\n {/if}\r\n {:else if widgetView === 'series'}\r\n {#if SeriesPageComp && activeEntity}\r\n <SeriesPageComp\r\n series={activeEntity.data}\r\n onNavigateToOccurrence={handleSeriesOccurrence}\r\n />\r\n {:else}\r\n <div role=\"status\" aria-label={labels.loadingEvents}>\r\n <SkeletonLoader />\r\n </div>\r\n {/if}\r\n {:else if widgetView === 'collection'}\r\n {#if CollectionViewComp && activeEntity}\r\n <CollectionViewComp\r\n collectionId={activeEntity.id}\r\n {organizationId}\r\n onNavigateToEvent={handleCollectionEvent}\r\n {labels}\r\n />\r\n {:else}\r\n <div role=\"status\" aria-label={labels.loadingEvents}>\r\n <SkeletonLoader />\r\n </div>\r\n {/if}\r\n {:else if widgetView === 'checkout'}\r\n {#if CheckoutComp && activeEntity}\r\n <CheckoutComp\r\n data={{\r\n id: activeEntity.id,\r\n slug: activeEntity.slug,\r\n event: activeEntity.data,\r\n }}\r\n venueId={activeEntity.data?.venueId ||\r\n activeEntity.data?.venueID ||\r\n venueId}\r\n {organizationId}\r\n onNavigateToSuccess={handleInWidgetSuccess}\r\n onNavigateBack={handleCheckoutBack}\r\n {labels}\r\n />\r\n {:else}\r\n <div role=\"status\" aria-label={labels.loadingEvents}>\r\n <SkeletonLoader />\r\n </div>\r\n {/if}\r\n {:else if widgetView === 'success'}\r\n {#if SuccessComp}\r\n <SuccessComp\r\n data={{\r\n id: activeEntity?.id,\r\n slug: activeEntity?.slug,\r\n event: activeEntity?.data,\r\n orderId: successPayload?.orderId,\r\n orderUuid: successPayload?.orderId,\r\n customerEmail: successPayload?.customerEmail,\r\n ticketCount: successPayload?.ticketCount,\r\n }}\r\n eventUrl={`${getApiConfig().baseUrl}/e/${activeEntity?.id}-${activeEntity?.slug || ''}`}\r\n browseUrl={typeof window !== 'undefined'\r\n ? window.location.origin + window.location.pathname\r\n : '/'}\r\n {labels}\r\n />\r\n {:else}\r\n <div role=\"status\" aria-label={labels.loadingEvents}>\r\n <SkeletonLoader />\r\n </div>\r\n {/if}\r\n {/if}\r\n </div>\r\n {:else}\r\n <!-- Visually hidden h1 for screen readers -->\r\n <h1 class=\"sr-only\">\r\n {labels.eventCalendarTitle} - {$publicView === VIEW.LIST\r\n ? labels.listView\r\n : $publicView === VIEW.GALLERY\r\n ? labels.galleryView\r\n : labels.calendarView}\r\n </h1>\r\n\r\n {#if showViewOptions}\r\n <CalendarToolbar\r\n viewOptions={PublicOptions}\r\n selectedView={String($publicView)}\r\n onViewChange={selectOption}\r\n onsearch={handleSearch}\r\n {labels}\r\n />\r\n {/if}\r\n\r\n {#if showMonthSwitcher && $publicView === VIEW.CALENDAR}\r\n <nav class=\"mt-4\" aria-label={labels.calendarMonthNavigation}>\r\n <MonthSwitcher\r\n currentYear={$year}\r\n currentMonth={$month}\r\n handleNext={animatedHandleNext}\r\n handlePrev={animatedHandlePrev}\r\n handleToday={animatedHandleToday}\r\n disablePastNavigation={false}\r\n />\r\n </nav>\r\n {/if}\r\n\r\n <main class=\"mt-4\" aria-busy={isLoading}>\r\n {#if shouldShowSkeleton}\r\n <div role=\"status\" aria-label={labels.loadingEvents}>\r\n <SkeletonLoader\r\n type={viewFromUrl === VIEW.LIST\r\n ? 'list'\r\n : viewFromUrl === VIEW.GALLERY ||\r\n viewFromUrl === VIEW.CAROUSEL ||\r\n viewFromUrl === VIEW.FEATURED\r\n ? 'gallery'\r\n : ''}\r\n />\r\n <span class=\"sr-only\">{labels.loadingEventsWait}</span>\r\n </div>\r\n {:else if !showContent}\r\n <!-- Fast connection: loading but skeleton delay hasn't triggered yet - show nothing -->\r\n <div class=\"sr-only\" role=\"status\" aria-live=\"polite\">\r\n {labels.loading}\r\n </div>\r\n {:else if hasNoEvents}\r\n <EmptyState\r\n message={labels.noUpcomingEvents}\r\n subtext={labels.noUpcomingEventsSubtext}\r\n />\r\n {:else if $publicView === VIEW.CALENDAR}\r\n <Calendar\r\n bind:this={calendarRef}\r\n embedCalendar\r\n currentYear={$year}\r\n currentMonth={$month}\r\n currentevents={browseEvents}\r\n oneventClick={handleBrowseEventClick}\r\n onswipeNext={effectiveHandleNext}\r\n onswipePrev={effectiveHandlePrev}\r\n ondaySelect={() => {}}\r\n {labels}\r\n {locale}\r\n />\r\n {:else if $publicView === VIEW.LIST}\r\n {#if useLegacy && LegacyGroupedListView}\r\n <LegacyGroupedListView\r\n events={$filteredEvents}\r\n oneventClick={handleEventClick}\r\n />\r\n {:else}\r\n <ListView\r\n events={browseEvents}\r\n oneventClick={handleBrowseEventClick}\r\n {labels}\r\n />\r\n {/if}\r\n {:else if $publicView === VIEW.GALLERY}\r\n {#if useLegacy && LegacyGalleryView}\r\n <LegacyGalleryView\r\n events={$filteredEvents}\r\n oneventClick={handleEventClick}\r\n />\r\n {:else}\r\n <GalleryView\r\n events={browseEvents}\r\n oneventClick={handleBrowseEventClick}\r\n {labels}\r\n />\r\n {/if}\r\n {:else if $publicView === VIEW.CAROUSEL}\r\n {#if useLegacy && LegacyCarouselView}\r\n <LegacyCarouselView\r\n events={$filteredEvents}\r\n oneventClick={handleEventClick}\r\n />\r\n {:else}\r\n <CarouselView\r\n events={browseEvents}\r\n oneventClick={handleBrowseEventClick}\r\n {labels}\r\n />\r\n {/if}\r\n {:else if $publicView === VIEW.FEATURED}\r\n {#if useLegacy && LegacyFeaturedView}\r\n <LegacyFeaturedView\r\n events={$filteredEvents}\r\n {featuredItem}\r\n oneventClick={handleEventClick}\r\n />\r\n {:else}\r\n <FeaturedView\r\n events={browseEvents}\r\n {featuredItem}\r\n oneventClick={handleBrowseEventClick}\r\n {labels}\r\n />\r\n {/if}\r\n {/if}\r\n </main>\r\n {/if}\r\n\r\n <PoweredByMicdrop {labels} />\r\n</div>\r\n\r\n<!-- Network Error Modal -->\r\n<NetworkErrorModal\r\n open={showNetworkError}\r\n onRetry={handleNetworkRetry}\r\n onClose={handleNetworkErrorClose}\r\n loading={networkErrorRetrying}\r\n message={labels.couldNotLoadEvents}\r\n {labels}\r\n/>\r\n\r\n<style>\r\n /* In-widget back control for series/collection views (the detail view has\r\n its own back arrow). */\r\n .micdrop-back-bar {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n padding: 0.5rem 0.75rem;\r\n margin: 0.75rem 0.5rem 0;\r\n border-radius: 0.5rem;\r\n font-size: 0.875rem;\r\n font-weight: 500;\r\n color: hsl(var(--text-primary));\r\n background-color: hsl(var(--bg-secondary, var(--bg-primary)));\r\n cursor: pointer;\r\n transition: background-color 0.2s ease;\r\n }\r\n\r\n .micdrop-back-bar:hover {\r\n background-color: hsl(var(--bg-secondary, var(--bg-primary)) / 80%);\r\n }\r\n\r\n /* Screen reader only text */\r\n .sr-only {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip: rect(0, 0, 0, 0);\r\n white-space: nowrap;\r\n border-width: 0;\r\n }\r\n</style>\r\n","/**\r\n * Shared helper utilities for JSON-LD builders.\r\n *\r\n * All functions are pure (no DOM, no Svelte, no side effects).\r\n * Extracted verbatim from EventStructuredData.svelte.\r\n *\r\n * @raw-intl-datetimeformat-escape: SEO/JSON-LD implementation. formatDateTimeWithOffset\r\n * must emit Google-required ISO-8601-with-tz-offset (\"2025-07-21T19:00:00-05:00\"), which\r\n * requires Intl.DateTimeFormat.formatToParts(...) with timeZoneName:'shortOffset' to read\r\n * the per-timezone UTC offset. The SC formatDate/DATE_FORMATS canonical produces\r\n * human-readable display strings, not parts-based offset extraction — it cannot express this.\r\n */\r\n\r\nimport { getDefaultTimezone } from '@getmicdrop/svelte-components/utils/timezones';\r\nimport type { EventTicketInput, EventPerformerInput } from './types';\r\n\r\n/**\r\n * Escape a JSON string for safe embedding inside an inline\r\n * <script type=\"application/ld+json\"> element.\r\n *\r\n * JSON.stringify does NOT escape `<`, `>` or `&`, so a field value containing\r\n * `</script><script>...` would break out of the script element and execute\r\n * (stored XSS). Replacing those characters with their unicode escape sequences\r\n * keeps the output valid JSON (parsers decode `<` back to `<`) while making\r\n * it impossible to terminate the surrounding <script> tag.\r\n *\r\n * This is the standard JSON-LD-in-<script> hardening; the sibling\r\n * HostSeoController avoids the issue entirely by using element.textContent.\r\n */\r\nexport function escapeJsonLdForScript(json: string): string {\r\n return json\r\n .replace(/</g, '\\\\u003c')\r\n .replace(/>/g, '\\\\u003e')\r\n .replace(/&/g, '\\\\u0026');\r\n}\r\n\r\n/**\r\n * Format datetime to ISO-8601 with timezone offset.\r\n * Google requires: \"2025-07-21T19:00:00-05:00\"\r\n *\r\n * Extracted from EventStructuredData.svelte lines 25-68.\r\n */\r\nexport function formatDateTimeWithOffset(\r\n isoString: string | null | undefined,\r\n tz: string\r\n): string | null {\r\n if (!isoString) return null;\r\n\r\n const date = new Date(isoString);\r\n if (isNaN(date.getTime())) return null;\r\n\r\n // Get the offset in the target timezone\r\n const offsetFormatOptions: Intl.DateTimeFormatOptions = {\r\n year: 'numeric',\r\n month: '2-digit',\r\n day: '2-digit',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n second: '2-digit',\r\n hour12: false,\r\n timeZoneName: 'shortOffset',\r\n };\r\n\r\n let formatter: Intl.DateTimeFormat;\r\n try {\r\n formatter = new Intl.DateTimeFormat('en-US', { ...offsetFormatOptions, timeZone: tz });\r\n } catch {\r\n // An invalid IANA timezone makes Intl.DateTimeFormat throw a RangeError,\r\n // which would otherwise escape the JSON-LD builders unguarded. Fall back\r\n // to the canonical default timezone — the same invalid-tz fallback the\r\n // rest of the repo uses ($lib/utils/datetime.js formatInTz).\r\n formatter = new Intl.DateTimeFormat('en-US', {\r\n ...offsetFormatOptions,\r\n timeZone: getDefaultTimezone(),\r\n });\r\n }\r\n\r\n const parts = formatter.formatToParts(date);\r\n const get = (type: string) => parts.find(p => p.type === type)?.value || '';\r\n\r\n const year = get('year');\r\n const month = get('month');\r\n const day = get('day');\r\n const hour = get('hour');\r\n const minute = get('minute');\r\n const second = get('second');\r\n const tzOffset = get('timeZoneName'); // e.g., \"GMT-5\" or \"GMT+2\"\r\n\r\n // Convert \"GMT-5\" to \"-05:00\" format\r\n let offset = '+00:00';\r\n if (tzOffset) {\r\n const match = tzOffset.match(/GMT([+-])(\\d+)(?::(\\d+))?/);\r\n if (match) {\r\n const sign = match[1];\r\n const hours = match[2].padStart(2, '0');\r\n const mins = match[3] || '00';\r\n offset = `${sign}${hours}:${mins}`;\r\n }\r\n }\r\n\r\n return `${year}-${month}-${day}T${hour}:${minute}:${second}${offset}`;\r\n}\r\n\r\n/**\r\n * Parse address string into PostalAddress components.\r\n * Input: \"7702 Santa Monica Blvd, West Hollywood, CA 90046\"\r\n * Output: { @type, streetAddress, addressLocality, addressRegion, postalCode, addressCountry }\r\n *\r\n * Extracted from EventStructuredData.svelte lines 75-111.\r\n */\r\nexport function parseAddressToPostal(\r\n addressStr: string | null | undefined\r\n): Record<string, string> | null {\r\n if (!addressStr) return null;\r\n\r\n const parts = addressStr.split(',').map(p => p.trim());\r\n\r\n if (parts.length < 2) {\r\n return {\r\n '@type': 'PostalAddress',\r\n streetAddress: addressStr,\r\n addressCountry: 'US',\r\n };\r\n }\r\n\r\n // Check if last part is \"State ZIP\" (e.g., \"CA 90046\")\r\n const lastPart = parts[parts.length - 1];\r\n const stateZipMatch = lastPart.match(/^([A-Z]{2})\\s+(\\d{5}(?:-\\d{4})?)$/);\r\n\r\n if (stateZipMatch && parts.length >= 3) {\r\n // Standard US address format\r\n return {\r\n '@type': 'PostalAddress',\r\n streetAddress: parts.slice(0, -2).join(', '),\r\n addressLocality: parts[parts.length - 2],\r\n addressRegion: stateZipMatch[1],\r\n postalCode: stateZipMatch[2],\r\n addressCountry: 'US',\r\n };\r\n }\r\n\r\n // Fallback for non-standard formats\r\n return {\r\n '@type': 'PostalAddress',\r\n streetAddress: parts[0],\r\n addressLocality: parts.slice(1).join(', '),\r\n addressCountry: 'US',\r\n };\r\n}\r\n\r\n/**\r\n * Structured postal-address parts, as the public resolve/series payloads now\r\n * expose them: `address` is the STREET line, with city/state/postalCode/country\r\n * as discrete fields (PublicVenueInfo / SeriesVenueDTO).\r\n */\r\nexport interface PostalAddressParts {\r\n address?: string | null; // street line\r\n city?: string | null;\r\n state?: string | null;\r\n postalCode?: string | null;\r\n country?: string | null;\r\n}\r\n\r\n/**\r\n * Build a schema.org PostalAddress, preferring discrete structured fields when\r\n * any locality signal (city / state / postalCode) is present, and otherwise\r\n * falling back to parsing a single comma-separated string (the street `address`\r\n * field if it carries a full address, else `googleLocationNameCache`).\r\n *\r\n * Discrete fields are more reliable than string-splitting — Google requires a\r\n * well-formed PostalAddress for Event rich-result eligibility (online-only\r\n * events lost eligibility June 2025).\r\n */\r\nexport function buildPostalAddress(\r\n parts: PostalAddressParts | null | undefined,\r\n fallback?: string | null\r\n): Record<string, string> | null {\r\n if (parts && (parts.city || parts.state || parts.postalCode)) {\r\n const out: Record<string, string> = { '@type': 'PostalAddress' };\r\n if (parts.address) out.streetAddress = parts.address;\r\n if (parts.city) out.addressLocality = parts.city;\r\n if (parts.state) out.addressRegion = parts.state;\r\n if (parts.postalCode) out.postalCode = parts.postalCode;\r\n out.addressCountry = parts.country || 'US';\r\n return out;\r\n }\r\n // No discrete locality fields — parse the best single string we have. The\r\n // street `address` may legacy-hold a full comma-separated address, so prefer\r\n // it over the location-name cache.\r\n return parseAddressToPostal((parts && parts.address) || fallback || null);\r\n}\r\n\r\n/**\r\n * Map event status to schema.org EventStatusType.\r\n *\r\n * Extracted from EventStructuredData.svelte lines 116-132.\r\n */\r\nexport function getEventStatus(rawStatus: string | null | undefined): string {\r\n if (!rawStatus) return 'https://schema.org/EventScheduled';\r\n\r\n const status = rawStatus.toLowerCase();\r\n\r\n if (status === 'cancelled' || status === 'canceled') {\r\n return 'https://schema.org/EventCancelled';\r\n }\r\n if (status === 'postponed') {\r\n return 'https://schema.org/EventPostponed';\r\n }\r\n if (status === 'rescheduled') {\r\n return 'https://schema.org/EventRescheduled';\r\n }\r\n\r\n return 'https://schema.org/EventScheduled';\r\n}\r\n\r\n/**\r\n * Map ticket availability to schema.org ItemAvailability.\r\n *\r\n * Extracted from EventStructuredData.svelte lines 137-157.\r\n */\r\nexport function getTicketAvailability(ticket: EventTicketInput): string {\r\n const remaining =\r\n ticket.remainingCapacity ?? ticket.quantityRemaining ?? ticket.quantity;\r\n\r\n if (remaining === 0 || ticket.soldOut) {\r\n return 'https://schema.org/SoldOut';\r\n }\r\n\r\n const now = new Date();\r\n const salesBegin =\r\n ticket.salesBegin ||\r\n ticket.salesStart ||\r\n ticket.saleBegin ||\r\n ticket.onSaleStart;\r\n const salesEnd = ticket.salesEnd || ticket.saleEnd || ticket.onSaleEnd;\r\n\r\n if (salesBegin && new Date(salesBegin) > now) {\r\n return 'https://schema.org/PreOrder';\r\n }\r\n\r\n if (salesEnd && new Date(salesEnd) < now) {\r\n return 'https://schema.org/SoldOut';\r\n }\r\n\r\n return 'https://schema.org/InStock';\r\n}\r\n\r\n/**\r\n * Build offers from available tickets.\r\n *\r\n * Extracted from EventStructuredData.svelte lines 162-208.\r\n */\r\nexport function buildOffers(\r\n tickets: EventTicketInput[] | null | undefined,\r\n url?: string\r\n): Record<string, unknown> | null {\r\n if (!tickets || tickets.length === 0) return null;\r\n\r\n // Filter to public tickets only (exclude door-only and hidden)\r\n const publicTickets = tickets.filter(t => {\r\n const visibility = t.visibility ?? 0;\r\n const isVisible = visibility === 0 || visibility === 1;\r\n const isPublic = t.salesChannel !== 2;\r\n return isVisible && isPublic;\r\n });\r\n\r\n if (publicTickets.length === 0) return null;\r\n\r\n // Find lowest and highest price\r\n const prices = publicTickets\r\n .map(t => parseFloat(String(t.price ?? 0)))\r\n .filter(p => !isNaN(p));\r\n\r\n if (prices.length === 0) return null;\r\n\r\n const lowPrice = Math.min(...prices);\r\n const highPrice = Math.max(...prices);\r\n\r\n // Use AggregateOffer when there are multiple price points\r\n if (lowPrice !== highPrice) {\r\n return {\r\n '@type': 'AggregateOffer',\r\n lowPrice: lowPrice,\r\n highPrice: highPrice,\r\n priceCurrency: 'USD',\r\n availability: getTicketAvailability(publicTickets[0]),\r\n url: url || undefined,\r\n validFrom:\r\n publicTickets[0]?.salesBegin ||\r\n publicTickets[0]?.salesStart ||\r\n undefined,\r\n };\r\n }\r\n\r\n // Single price point - use Offer\r\n const ticket = publicTickets[0];\r\n return {\r\n '@type': 'Offer',\r\n price: lowPrice,\r\n priceCurrency: 'USD',\r\n availability: getTicketAvailability(ticket),\r\n url: url || undefined,\r\n validFrom: ticket?.salesBegin || ticket?.salesStart || undefined,\r\n };\r\n}\r\n\r\n/**\r\n * Build performer array from event performers.\r\n *\r\n * Extracted from EventStructuredData.svelte lines 213-237.\r\n */\r\nexport function buildPerformers(\r\n performers: EventPerformerInput[] | null | undefined\r\n): Array<Record<string, string>> | null {\r\n if (!performers || performers.length === 0) return null;\r\n\r\n // Filter to confirmed, visible performers\r\n const confirmed = performers.filter(p => {\r\n const isConfirmed = p.acceptedState === 2;\r\n const isNotHidden = !p.shouldBeHidden;\r\n const profile = p.RosterPerformer?.User?.performerProfile;\r\n const hasName =\r\n profile?.firstName || profile?.lastName || profile?.displayName;\r\n return isConfirmed && isNotHidden && hasName;\r\n });\r\n\r\n if (confirmed.length === 0) return null;\r\n\r\n return confirmed.map(p => {\r\n const profile = p.RosterPerformer?.User?.performerProfile;\r\n const name =\r\n profile?.displayName ||\r\n [profile?.firstName, profile?.lastName].filter(Boolean).join(' ');\r\n\r\n return {\r\n '@type': 'PerformingGroup',\r\n name: name,\r\n };\r\n });\r\n}\r\n","import { getDefaultTimezone } from '@getmicdrop/svelte-components/utils/timezones';\n/**\n * Pure function that builds Event JSON-LD structured data for Google Events rich results.\n *\n * Extracted from EventStructuredData.svelte (lines 242-313).\n * Produces identical output to the original $derived.by block.\n */\n\nimport type { EventJsonLdInput, VenueInput, OrganizerInput } from './types';\nimport {\n formatDateTimeWithOffset,\n buildPostalAddress,\n getEventStatus,\n buildOffers,\n buildPerformers,\n} from './helpers';\n\nexport interface BuildEventJsonLdOptions {\n event: EventJsonLdInput;\n venue: VenueInput;\n venueTimeZone?: string;\n eventUrl?: string;\n organizer?: OrganizerInput;\n}\n\nexport function buildEventJsonLd(\n options: BuildEventJsonLdOptions\n): Record<string, unknown> | null {\n const {\n event,\n venue,\n venueTimeZone = getDefaultTimezone(),\n eventUrl,\n organizer,\n } = options;\n\n if (!event) return null;\n\n const startDate = formatDateTimeWithOffset(\n event.startDateTime,\n venueTimeZone\n );\n\n // Skip if we don't have required fields\n if (!event.name || !startDate || !venue?.name) {\n return null;\n }\n\n // Google requires a PostalAddress on a physical event's location (online-only\n // events lost rich-result eligibility June 2025). Prefer the venue's discrete\n // address fields (street/city/state/postalCode), falling back to parsing the\n // googleLocationNameCache string. Only attach `address` when we could build\n // one — never emit `address: null`. A missing address is a data-pipeline gap\n // (the resolve payload must carry the venue address).\n const postalAddress = buildPostalAddress(\n venue,\n venue?.googleLocationNameCache\n );\n const location: Record<string, unknown> = {\n '@type': 'Place',\n name: venue.name,\n };\n if (postalAddress) {\n location.address = postalAddress;\n }\n\n const data: Record<string, unknown> = {\n '@context': 'https://schema.org',\n '@type': 'Event',\n name: event.name,\n startDate: startDate,\n eventStatus: getEventStatus(event.status),\n eventAttendanceMode: 'https://schema.org/OfflineEventAttendanceMode',\n location,\n };\n\n // Add endDate if available\n const endDate = formatDateTimeWithOffset(event.endDateTime, venueTimeZone);\n if (endDate) {\n data.endDate = endDate;\n }\n\n // Add description\n const description = event.description || event.eventSummary;\n if (description) {\n data.description = description;\n }\n\n // Add image - Google recommends multiple aspect ratios\n const imageUrl = event.image || event.coverImage || event.ShowImage;\n if (imageUrl) {\n data.image = [imageUrl];\n }\n\n // Add offers from tickets\n const offers = buildOffers(event.availableTickets, eventUrl);\n if (offers) {\n data.offers = offers;\n }\n\n // Add performers\n const performers = buildPerformers(event.performers);\n if (performers && performers.length > 0) {\n data.performer = performers;\n }\n\n // Add organizer if provided\n if (organizer?.name) {\n const org: Record<string, string> = {\n '@type': 'Organization',\n name: organizer.name,\n };\n if (organizer.url) {\n org.url = organizer.url;\n }\n data.organizer = org;\n }\n\n // Add event URL if provided\n if (eventUrl) {\n data.url = eventUrl;\n }\n\n return data;\n}\n","/**\n * Pure function that builds EventSeries JSON-LD structured data.\n *\n * Series use schema.org EventSeries type with subEvent array containing\n * individual Event blocks for each occurrence. Each subEvent has its own\n * offers built from the simplified series ticket DTOs (different shape\n * from the event builder's tickets).\n *\n * Google Rich Results Test does NOT support EventSeries directly, but\n * the individual subEvent Event blocks can qualify for rich results.\n */\n\nimport type { SeriesJsonLdInput } from './types';\nimport {\n formatDateTimeWithOffset,\n buildPostalAddress,\n getEventStatus,\n} from './helpers';\n\nexport interface BuildSeriesJsonLdOptions {\n series: SeriesJsonLdInput;\n baseEventUrl?: string; // e.g., \"https://get-micdrop.com/e\" -- used to build subEvent @id URLs\n}\n\n/**\n * Map a series ticket status string to schema.org ItemAvailability.\n *\n * Series tickets use a simplified { name, price, status } shape from the\n * backend (SeriesTicketDTO), unlike event tickets which have visibility,\n * salesChannel, remainingCapacity, etc.\n */\nfunction mapSeriesTicketAvailability(status: string): string {\n switch (status) {\n case 'available':\n return 'https://schema.org/InStock';\n case 'sold_out':\n return 'https://schema.org/SoldOut';\n case 'coming_soon':\n return 'https://schema.org/PreOrder';\n case 'ended':\n return 'https://schema.org/SoldOut';\n default:\n return 'https://schema.org/InStock';\n }\n}\n\n/**\n * Build offers from series occurrence tickets.\n *\n * Series tickets have a simpler shape than event tickets: { name, price, status }.\n * Uses AggregateOffer for multiple price points, Offer for single price.\n */\nfunction buildSeriesOccurrenceOffers(\n tickets: Array<{ name: string; price: number; status: string }> | undefined,\n occurrenceStatus: string | undefined\n): Record<string, unknown> | null {\n if (!tickets || tickets.length === 0) return null;\n\n // Filter out sold_out and ended tickets for offer building\n const activeTickets = tickets.filter(\n t => t.status !== 'sold_out' && t.status !== 'ended'\n );\n\n // If all tickets are sold out / ended, report SoldOut with the price range\n if (activeTickets.length === 0) {\n const prices = tickets.map(t => t.price).filter(p => !isNaN(p));\n if (prices.length === 0) return null;\n\n const lowPrice = Math.min(...prices);\n const highPrice = Math.max(...prices);\n\n if (lowPrice !== highPrice) {\n return {\n '@type': 'AggregateOffer',\n lowPrice,\n highPrice,\n priceCurrency: 'USD',\n availability: 'https://schema.org/SoldOut',\n };\n }\n\n return {\n '@type': 'Offer',\n price: lowPrice,\n priceCurrency: 'USD',\n availability: 'https://schema.org/SoldOut',\n };\n }\n\n const prices = activeTickets.map(t => t.price).filter(p => !isNaN(p));\n if (prices.length === 0) return null;\n\n const lowPrice = Math.min(...prices);\n const highPrice = Math.max(...prices);\n\n if (lowPrice !== highPrice) {\n return {\n '@type': 'AggregateOffer',\n lowPrice,\n highPrice,\n priceCurrency: 'USD',\n availability: mapSeriesTicketAvailability(activeTickets[0].status),\n };\n }\n\n return {\n '@type': 'Offer',\n price: lowPrice,\n priceCurrency: 'USD',\n availability: mapSeriesTicketAvailability(activeTickets[0].status),\n };\n}\n\nexport function buildSeriesJsonLd(\n options: BuildSeriesJsonLdOptions\n): Record<string, unknown> | null {\n const { series, baseEventUrl } = options;\n\n // Required fields\n if (!series.title) return null;\n if (!series.occurrences || series.occurrences.length === 0) return null;\n if (!series.venue?.name) return null;\n\n // Build location — prefer the venue's discrete address fields, falling back to\n // parsing googleLocationNameCache (see buildEventJsonLd for the rationale).\n const address = buildPostalAddress(\n series.venue,\n series.venue.googleLocationNameCache\n );\n const location: Record<string, unknown> = {\n '@type': 'Place',\n name: series.venue.name,\n };\n if (address) {\n location.address = address;\n }\n\n // Build parent EventSeries\n const data: Record<string, unknown> = {\n '@context': 'https://schema.org',\n '@type': 'EventSeries',\n name: series.title,\n location,\n };\n\n // Description: prefer description, fall back to eventSummary\n const description = series.description || series.eventSummary;\n if (description) {\n data.description = description;\n }\n\n // Image\n if (series.image) {\n data.image = [series.image];\n }\n\n // Performers: flat displayName array (different from event builder's nested shape)\n const performers = series.performers?.filter(p => p.displayName);\n if (performers && performers.length > 0) {\n data.performer = performers.map(p => ({\n '@type': 'PerformingGroup',\n name: p.displayName,\n }));\n }\n\n // SubEvents: build Event blocks for each occurrence\n const subEvents: Record<string, unknown>[] = [];\n\n for (const occ of series.occurrences) {\n const startDate = formatDateTimeWithOffset(\n occ.startDateTime,\n series.timeZone\n );\n if (!startDate) continue; // Skip occurrences without valid startDate\n\n const subEvent: Record<string, unknown> = {\n '@type': 'Event',\n name: occ.title,\n startDate,\n eventStatus: getEventStatus(occ.status),\n location,\n };\n\n // @id from baseEventUrl\n if (baseEventUrl) {\n subEvent['@id'] = `${baseEventUrl}/${occ.id}-${occ.slug}`;\n }\n\n // endDate\n const endDate = formatDateTimeWithOffset(occ.endDateTime, series.timeZone);\n if (endDate) {\n subEvent.endDate = endDate;\n }\n\n // Offers from simplified ticket DTOs\n const offers = buildSeriesOccurrenceOffers(occ.tickets, occ.status);\n if (offers) {\n subEvent.offers = offers;\n }\n\n subEvents.push(subEvent);\n }\n\n // If all occurrences were skipped, return null\n if (subEvents.length === 0) return null;\n\n data.subEvent = subEvents;\n\n return data;\n}\n","/**\r\n * Pure function that builds CollectionPage JSON-LD for an event collection.\r\n *\r\n * A collection is a curated list of shows — NOT a single event, and NOT a\r\n * Festival (the product can't infer festival intent from a collection named\r\n * \"Detroit Comedy Festival\"; it's still just a collection). We emit a\r\n * schema.org `CollectionPage` whose `mainEntity` is a *summary-page* `ItemList`\r\n * — each `ListItem` is just `{ position, name, url }` pointing at the show's\r\n * canonical `/e/{id}-{slug}` leaf. The full `Event` rich-result markup lives on\r\n * each event's own page (one event = one leaf URL); duplicating full Event\r\n * objects here would create competing entities and trigger missing-field\r\n * (offers/address) warnings on the collection page.\r\n *\r\n * (Previously emitted `Festival` + `subEvent`, which Google's Rich Results\r\n * Test does not support.)\r\n */\r\n\r\nimport type { CollectionJsonLdInput } from './types';\r\n\r\nexport interface BuildCollectionJsonLdOptions {\r\n collection: CollectionJsonLdInput;\r\n baseEventUrl?: string; // e.g., \"https://get-micdrop.com/e\"\r\n /** Accepted for API compatibility; the summary ItemList carries no dates. */\r\n defaultTimeZone?: string;\r\n}\r\n\r\nexport function buildCollectionJsonLd(\r\n options: BuildCollectionJsonLdOptions,\r\n): Record<string, unknown> | null {\r\n const { collection, baseEventUrl } = options;\r\n\r\n // Required fields\r\n if (!collection.collectionTitle) return null;\r\n if (!collection.events || collection.events.length === 0) return null;\r\n\r\n // Build a summary ListItem per collection member: position + name + the\r\n // canonical leaf url. Prefer the slugged form, else bare `/e/{id}` (the app\r\n // self-heals bare ids to the slugged canonical).\r\n const itemListElement: Record<string, unknown>[] = [];\r\n\r\n for (const event of collection.events) {\r\n if (!event.title) continue; // Skip members with no name to list\r\n\r\n const listItem: Record<string, unknown> = {\r\n '@type': 'ListItem',\r\n position: itemListElement.length + 1,\r\n name: event.title,\r\n };\r\n\r\n if (baseEventUrl) {\r\n listItem.url = event.slug\r\n ? `${baseEventUrl}/${event.id}-${event.slug}`\r\n : `${baseEventUrl}/${event.id}`;\r\n }\r\n\r\n itemListElement.push(listItem);\r\n }\r\n\r\n // If every event was skipped, there's nothing to mark up.\r\n if (itemListElement.length === 0) return null;\r\n\r\n const data: Record<string, unknown> = {\r\n '@context': 'https://schema.org',\r\n '@type': 'CollectionPage',\r\n name: collection.collectionTitle,\r\n };\r\n\r\n // Description: prefer description, fall back to summary\r\n const description = collection.description || collection.summary;\r\n if (description) {\r\n data.description = description;\r\n }\r\n\r\n // Cover image\r\n if (collection.coverImage) {\r\n data.image = [collection.coverImage];\r\n }\r\n\r\n data.mainEntity = {\r\n '@type': 'ItemList',\r\n numberOfItems: itemListElement.length,\r\n itemListElement,\r\n };\r\n\r\n return data;\r\n}\r\n","import { getDefaultTimezone } from '@getmicdrop/svelte-components/utils/timezones';\r\n/**\r\n * HostSeoController -- manages JSON-LD structured data, canonical URLs,\r\n * OG tags, meta descriptions, and page title injection into venue pages'\r\n * <head> when the Micdrop calendar widget is embedded.\r\n *\r\n * Follows a save-replace-restore pattern to be a \"good citizen\" on venue pages:\r\n * idle -> listing -> entity -> listing -> ... -> destroyed\r\n *\r\n * Uses textContent (never innerHTML) for JSON-LD script tags to prevent XSS.\r\n */\r\n\r\nimport type { HostSeoControllerOptions } from './types';\r\nimport { buildEventJsonLd } from './buildEventJsonLd';\r\nimport { buildSeriesJsonLd } from './buildSeriesJsonLd';\r\nimport { buildCollectionJsonLd } from './buildCollectionJsonLd';\r\nimport { generateSlug } from '$lib/utils/textUtils';\r\n\r\ntype ControllerState = 'idle' | 'listing' | 'entity' | 'destroyed';\r\n\r\ninterface SavedOriginals {\r\n title: string;\r\n canonicalHref: string | null;\r\n ogTitle: string | null;\r\n ogDescription: string | null;\r\n ogImage: string | null;\r\n ogUrl: string | null;\r\n ogType: string | null;\r\n metaDescription: string | null;\r\n}\r\n\r\n// Minimal event shape for listing mode\r\ninterface ListingEvent {\r\n id: number | string;\r\n name: string;\r\n slug?: string;\r\n startDateTime?: string;\r\n image?: string;\r\n}\r\n\r\n// Venue data passed at runtime\r\ninterface VenueData {\r\n name: string;\r\n address?: string;\r\n googleLocationNameCache?: string;\r\n // Transformed venues carry lowercase `timezone`; raw/host data may use\r\n // PascalCase `timeZone`. Accept both so the venue tz isn't silently dropped.\r\n timeZone?: string;\r\n timezone?: string;\r\n}\r\n\r\nexport class HostSeoController {\r\n /**\r\n * Single active instance. A venue page that mounts >1 calendar embed\r\n * (e.g. \"upcoming shows\" + \"this weekend\") will see the *later*\r\n * controller take over `<head>` — the earlier one is destroyed.\r\n *\r\n * KNOWN LIMITATION: multi-embed pages cannot run two SEO controllers\r\n * in parallel because they would both fight to own `<title>`/OG/etc.\r\n * Pass `data-inject-seo=\"false\"` on all but one embed to opt out.\r\n */\r\n static _activeInstance: HostSeoController | null = null;\r\n\r\n private _state: ControllerState = 'idle';\r\n private _venueName: string;\r\n private _venueAddress: string | undefined;\r\n private _venueTimeZone: string;\r\n private _baseUrl: string;\r\n private _originals: SavedOriginals | null = null;\r\n private _originalsSaved = false;\r\n private _events: ListingEvent[] = [];\r\n\r\n constructor(options: HostSeoControllerOptions) {\r\n // SSR guard\r\n if (typeof document === 'undefined') return;\r\n\r\n // If another instance exists, destroy it first.\r\n if (\r\n HostSeoController._activeInstance &&\r\n HostSeoController._activeInstance !== this\r\n ) {\r\n HostSeoController._activeInstance.destroy();\r\n }\r\n\r\n this._venueName = options.venueName;\r\n this._venueAddress = options.venueAddress;\r\n this._venueTimeZone = options.venueTimeZone || getDefaultTimezone();\r\n this._baseUrl =\r\n options.baseUrl || window.location.origin + window.location.pathname;\r\n\r\n this._saveOriginals();\r\n\r\n HostSeoController._activeInstance = this;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Private helpers\r\n // ---------------------------------------------------------------------------\r\n\r\n private _saveOriginals(): void {\r\n if (this._originalsSaved) return;\r\n\r\n const canonical = document.querySelector('link[rel=\"canonical\"]') as HTMLLinkElement | null;\r\n const ogTitle = document.querySelector('meta[property=\"og:title\"]') as HTMLMetaElement | null;\r\n const ogDescription = document.querySelector('meta[property=\"og:description\"]') as HTMLMetaElement | null;\r\n const ogImage = document.querySelector('meta[property=\"og:image\"]') as HTMLMetaElement | null;\r\n const ogUrl = document.querySelector('meta[property=\"og:url\"]') as HTMLMetaElement | null;\r\n const ogType = document.querySelector('meta[property=\"og:type\"]') as HTMLMetaElement | null;\r\n const metaDescription = document.querySelector('meta[name=\"description\"]') as HTMLMetaElement | null;\r\n\r\n this._originals = {\r\n title: document.title,\r\n canonicalHref: canonical?.getAttribute('href') ?? null,\r\n ogTitle: ogTitle?.getAttribute('content') ?? null,\r\n ogDescription: ogDescription?.getAttribute('content') ?? null,\r\n ogImage: ogImage?.getAttribute('content') ?? null,\r\n ogUrl: ogUrl?.getAttribute('content') ?? null,\r\n ogType: ogType?.getAttribute('content') ?? null,\r\n metaDescription: metaDescription?.getAttribute('content') ?? null,\r\n };\r\n\r\n this._originalsSaved = true;\r\n }\r\n\r\n private _injectJsonLd(data: Record<string, unknown>): void {\r\n if (typeof document === 'undefined') return;\r\n\r\n // Remove any existing micdrop JSON-LD\r\n document.querySelectorAll('script[data-micdrop=\"jsonld\"]').forEach((el) => el.remove());\r\n\r\n const script = document.createElement('script');\r\n script.setAttribute('type', 'application/ld+json');\r\n script.setAttribute('data-micdrop', 'jsonld');\r\n // Use textContent (NOT innerHTML) to prevent XSS\r\n script.textContent = JSON.stringify(data);\r\n document.head.appendChild(script);\r\n }\r\n\r\n private _setMeta(property: string, content: string): void {\r\n if (typeof document === 'undefined') return;\r\n\r\n if (property.startsWith('og:')) {\r\n // OG tags use property attribute\r\n let el = document.querySelector(`meta[property=\"${property}\"]`) as HTMLMetaElement | null;\r\n if (el) {\r\n el.setAttribute('content', content);\r\n } else {\r\n el = document.createElement('meta');\r\n el.setAttribute('property', property);\r\n el.setAttribute('content', content);\r\n el.setAttribute('data-micdrop', 'og');\r\n document.head.appendChild(el);\r\n }\r\n } else {\r\n // Standard meta tags use name attribute (e.g., description)\r\n let el = document.querySelector(`meta[name=\"${property}\"]`) as HTMLMetaElement | null;\r\n if (el) {\r\n el.setAttribute('content', content);\r\n } else {\r\n el = document.createElement('meta');\r\n el.setAttribute('name', property);\r\n el.setAttribute('content', content);\r\n el.setAttribute('data-micdrop', 'meta');\r\n document.head.appendChild(el);\r\n }\r\n }\r\n }\r\n\r\n private _setCanonical(url: string): void {\r\n if (typeof document === 'undefined') return;\r\n\r\n let el = document.querySelector('link[rel=\"canonical\"]') as HTMLLinkElement | null;\r\n if (el) {\r\n el.setAttribute('href', url);\r\n } else {\r\n el = document.createElement('link');\r\n el.setAttribute('rel', 'canonical');\r\n el.setAttribute('href', url);\r\n el.setAttribute('data-micdrop', 'canonical');\r\n document.head.appendChild(el);\r\n }\r\n }\r\n\r\n private _removeAllInjected(): void {\r\n if (typeof document === 'undefined') return;\r\n document.querySelectorAll('[data-micdrop]').forEach((el) => el.remove());\r\n }\r\n\r\n private _restoreOriginals(): void {\r\n if (typeof document === 'undefined' || !this._originals) return;\r\n\r\n // Restore title\r\n document.title = this._originals.title;\r\n\r\n // Restore canonical\r\n if (this._originals.canonicalHref !== null) {\r\n const canonical = document.querySelector('link[rel=\"canonical\"]') as HTMLLinkElement | null;\r\n if (canonical) {\r\n canonical.setAttribute('href', this._originals.canonicalHref);\r\n }\r\n }\r\n\r\n // Restore OG tags\r\n this._restoreMetaProperty('og:title', this._originals.ogTitle);\r\n this._restoreMetaProperty('og:description', this._originals.ogDescription);\r\n this._restoreMetaProperty('og:image', this._originals.ogImage);\r\n this._restoreMetaProperty('og:url', this._originals.ogUrl);\r\n this._restoreMetaProperty('og:type', this._originals.ogType);\r\n\r\n // Restore meta description\r\n this._restoreMetaName('description', this._originals.metaDescription);\r\n\r\n this._originalsSaved = false;\r\n }\r\n\r\n private _restoreMetaProperty(property: string, originalContent: string | null): void {\r\n const el = document.querySelector(`meta[property=\"${property}\"]`) as HTMLMetaElement | null;\r\n if (originalContent !== null && el) {\r\n // Had original value -- restore it\r\n el.setAttribute('content', originalContent);\r\n } else if (originalContent === null && el?.hasAttribute('data-micdrop')) {\r\n // We created it -- remove it\r\n el.remove();\r\n }\r\n }\r\n\r\n private _restoreMetaName(name: string, originalContent: string | null): void {\r\n const el = document.querySelector(`meta[name=\"${name}\"]`) as HTMLMetaElement | null;\r\n if (originalContent !== null && el) {\r\n el.setAttribute('content', originalContent);\r\n } else if (originalContent === null && el?.hasAttribute('data-micdrop')) {\r\n el.remove();\r\n }\r\n }\r\n\r\n private _buildItemList(events: ListingEvent[]): Record<string, unknown> {\r\n return {\r\n '@context': 'https://schema.org',\r\n '@type': 'ItemList',\r\n itemListElement: events.map((event, i) => {\r\n const slug = event.slug || generateSlug(event.name);\r\n return {\r\n '@type': 'ListItem',\r\n position: i + 1,\r\n url: `${this._baseUrl}?e=${event.id}-${slug}`,\r\n };\r\n }),\r\n };\r\n }\r\n\r\n private _buildEntityUrl(type: string, id: string | number, slug: string): string {\r\n const prefix = type === 'event' ? 'e' : type === 'series' ? 's' : 'c';\r\n return `${this._baseUrl}?${prefix}=${id}-${slug}`;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Public API\r\n // ---------------------------------------------------------------------------\r\n\r\n /**\r\n * Called when events finish loading from the API.\r\n * Injects an ItemList JSON-LD for the listing. Does not modify OG/canonical/title.\r\n */\r\n onEventsLoaded(\r\n events: ListingEvent[],\r\n venue?: VenueData,\r\n ): void {\r\n if (typeof document === 'undefined') return;\r\n if (this._state === 'destroyed') return;\r\n\r\n // Update venue info from parameter if provided\r\n if (venue) {\r\n this._venueName = venue.name || this._venueName;\r\n this._venueAddress = venue.address || venue.googleLocationNameCache || this._venueAddress;\r\n const venueTz = venue.timeZone || venue.timezone;\r\n if (venueTz) {\r\n this._venueTimeZone = venueTz;\r\n }\r\n }\r\n\r\n // Store events for later use (re-injection on back to listing)\r\n this._events = events;\r\n\r\n // Build and inject ItemList JSON-LD\r\n const itemList = this._buildItemList(events);\r\n this._injectJsonLd(itemList);\r\n\r\n this._state = 'listing';\r\n }\r\n\r\n /**\r\n * Called when the user selects an event, series, or collection.\r\n * Replaces ItemList JSON-LD with entity-specific JSON-LD and updates\r\n * all head tags (canonical, OG, meta description, title).\r\n */\r\n onEntitySelected(\r\n type: 'event' | 'series' | 'collection',\r\n data: any,\r\n venue?: VenueData,\r\n ): void {\r\n if (typeof document === 'undefined') return;\r\n if (this._state === 'destroyed') return;\r\n\r\n // Save originals if not already saved\r\n this._saveOriginals();\r\n\r\n // Update venue info from parameter if provided\r\n if (venue) {\r\n this._venueName = venue.name || this._venueName;\r\n this._venueAddress = venue.address || venue.googleLocationNameCache || this._venueAddress;\r\n const venueTz = venue.timeZone || venue.timezone;\r\n if (venueTz) {\r\n this._venueTimeZone = venueTz;\r\n }\r\n }\r\n\r\n let jsonLd: Record<string, unknown> | null = null;\r\n let entityName = '';\r\n let entityDescription = '';\r\n let entityImage = '';\r\n let entityUrl = '';\r\n\r\n if (type === 'event') {\r\n const slug = data.slug || generateSlug(data.name || '');\r\n entityUrl = this._buildEntityUrl('event', data.id || data.eventID || '', slug);\r\n\r\n jsonLd = buildEventJsonLd({\r\n event: data,\r\n venue: {\r\n name: this._venueName,\r\n googleLocationNameCache: this._venueAddress,\r\n },\r\n venueTimeZone: this._venueTimeZone,\r\n eventUrl: entityUrl,\r\n });\r\n\r\n entityName = data.name || '';\r\n entityDescription = data.description || data.eventSummary || '';\r\n entityImage = data.image || data.coverImage || data.ShowImage || '';\r\n } else if (type === 'series') {\r\n const slug = data.slug || generateSlug(data.title || '');\r\n entityUrl = this._buildEntityUrl('series', data.id || '', slug);\r\n\r\n jsonLd = buildSeriesJsonLd({\r\n series: {\r\n ...data,\r\n venue: {\r\n name: this._venueName,\r\n googleLocationNameCache: this._venueAddress,\r\n },\r\n timeZone: this._venueTimeZone,\r\n },\r\n baseEventUrl: entityUrl,\r\n });\r\n\r\n entityName = data.title || '';\r\n entityDescription = data.description || data.eventSummary || '';\r\n entityImage = data.image || '';\r\n } else if (type === 'collection') {\r\n const slug = data.slug || generateSlug(data.collectionTitle || '');\r\n entityUrl = this._buildEntityUrl('collection', data.id || '', slug);\r\n\r\n jsonLd = buildCollectionJsonLd({\r\n collection: data,\r\n baseEventUrl: entityUrl,\r\n defaultTimeZone: this._venueTimeZone,\r\n });\r\n\r\n entityName = data.collectionTitle || '';\r\n entityDescription = data.description || data.summary || '';\r\n entityImage = data.coverImage || '';\r\n }\r\n\r\n // Inject JSON-LD (replaces existing micdrop JSON-LD)\r\n if (jsonLd) {\r\n this._injectJsonLd(jsonLd);\r\n }\r\n\r\n // Update canonical URL\r\n if (entityUrl) {\r\n this._setCanonical(entityUrl);\r\n }\r\n\r\n // Update OG tags\r\n if (entityName) {\r\n this._setMeta('og:title', entityName);\r\n }\r\n if (entityDescription) {\r\n this._setMeta('og:description', entityDescription);\r\n }\r\n if (entityImage) {\r\n this._setMeta('og:image', entityImage);\r\n }\r\n if (entityUrl) {\r\n this._setMeta('og:url', entityUrl);\r\n }\r\n this._setMeta('og:type', 'website');\r\n\r\n // Twitter Card: large image preview\r\n this._setMeta('twitter:card', 'summary_large_image');\r\n\r\n // Update meta description\r\n if (entityDescription) {\r\n this._setMeta('description', entityDescription);\r\n }\r\n\r\n // Update page title\r\n if (entityName) {\r\n document.title = `${entityName} | ${this._venueName}`;\r\n }\r\n\r\n this._state = 'entity';\r\n }\r\n\r\n /**\r\n * Called when the user navigates back to the event listing.\r\n * Restores original head elements and re-injects ItemList JSON-LD.\r\n */\r\n onBackToListing(): void {\r\n if (typeof document === 'undefined') return;\r\n if (this._state === 'destroyed') return;\r\n\r\n // Restore all originals\r\n this._restoreOriginals();\r\n\r\n // Remove any remaining injected elements\r\n this._removeAllInjected();\r\n\r\n // Re-inject ItemList JSON-LD if events are available\r\n if (this._events.length > 0) {\r\n const itemList = this._buildItemList(this._events);\r\n this._injectJsonLd(itemList);\r\n }\r\n\r\n // Re-save originals since we just restored them\r\n this._saveOriginals();\r\n\r\n this._state = 'listing';\r\n }\r\n\r\n /**\r\n * Called when the widget is destroyed. Removes all injected elements\r\n * and restores originals. Clears the static active instance.\r\n */\r\n destroy(): void {\r\n if (typeof document === 'undefined') return;\r\n if (this._state === 'destroyed') return;\r\n\r\n this._removeAllInjected();\r\n this._restoreOriginals();\r\n\r\n if (HostSeoController._activeInstance === this) {\r\n HostSeoController._activeInstance = null;\r\n }\r\n\r\n this._state = 'destroyed';\r\n }\r\n}\r\n","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M21.6%202.4H19.2V1.2C19.2%200.88174%2019.0736%200.576515%2018.8485%200.351472C18.6235%200.126428%2018.3183%200%2018%200C17.6817%200%2017.3765%200.126428%2017.1515%200.351472C16.9264%200.576515%2016.8%200.88174%2016.8%201.2V2.4H13.2V1.2C13.2%200.88174%2013.0736%200.576515%2012.8485%200.351472C12.6235%200.126428%2012.3183%200%2012%200C11.6817%200%2011.3765%200.126428%2011.1515%200.351472C10.9264%200.576515%2010.8%200.88174%2010.8%201.2V2.4H7.2V1.2C7.2%200.88174%207.07357%200.576515%206.84853%200.351472C6.62348%200.126428%206.31826%200%206%200C5.68174%200%205.37652%200.126428%205.15147%200.351472C4.92643%200.576515%204.8%200.88174%204.8%201.2V2.4H2.4C1.76348%202.4%201.15303%202.65286%200.702944%203.10294C0.252856%203.55303%200%204.16348%200%204.8V21.6C0%2022.2365%200.252856%2022.847%200.702944%2023.2971C1.15303%2023.7471%201.76348%2024%202.4%2024H21.6C22.2365%2024%2022.847%2023.7471%2023.2971%2023.2971C23.7471%2022.847%2024%2022.2365%2024%2021.6V4.8C24%204.16348%2023.7471%203.55303%2023.2971%203.10294C22.847%202.65286%2022.2365%202.4%2021.6%202.4ZM4.8%204.8C4.8%205.11826%204.92643%205.42348%205.15147%205.64853C5.37652%205.87357%205.68174%206%206%206C6.31826%206%206.62348%205.87357%206.84853%205.64853C7.07357%205.42348%207.2%205.11826%207.2%204.8H10.8C10.8%205.11826%2010.9264%205.42348%2011.1515%205.64853C11.3765%205.87357%2011.6817%206%2012%206C12.3183%206%2012.6235%205.87357%2012.8485%205.64853C13.0736%205.42348%2013.2%205.11826%2013.2%204.8H16.8C16.8%205.11826%2016.9264%205.42348%2017.1515%205.64853C17.3765%205.87357%2017.6817%206%2018%206C18.3183%206%2018.6235%205.87357%2018.8485%205.64853C19.0736%205.42348%2019.2%205.11826%2019.2%204.8H21.6V7.2H2.4V4.8H4.8ZM2.4%2021.6V9.6H21.6V21.6H2.4Z'%20fill='%23666C79'/%3e%3cpath%20d='M6.6%2012H5.4C5.06863%2012%204.8%2012.2686%204.8%2012.6V13.8C4.8%2014.1314%205.06863%2014.4%205.4%2014.4H6.6C6.93137%2014.4%207.2%2014.1314%207.2%2013.8V12.6C7.2%2012.2686%206.93137%2012%206.6%2012Z'%20fill='%23666C79'/%3e%3cpath%20d='M6.6%2016.8H5.4C5.06863%2016.8%204.8%2017.0686%204.8%2017.4V18.6C4.8%2018.9314%205.06863%2019.2%205.4%2019.2H6.6C6.93137%2019.2%207.2%2018.9314%207.2%2018.6V17.4C7.2%2017.0686%206.93137%2016.8%206.6%2016.8Z'%20fill='%23666C79'/%3e%3cpath%20d='M12.6%2012H11.4C11.0686%2012%2010.8%2012.2686%2010.8%2012.6V13.8C10.8%2014.1314%2011.0686%2014.4%2011.4%2014.4H12.6C12.9314%2014.4%2013.2%2014.1314%2013.2%2013.8V12.6C13.2%2012.2686%2012.9314%2012%2012.6%2012Z'%20fill='%23666C79'/%3e%3cpath%20d='M12.6%2016.8H11.4C11.0686%2016.8%2010.8%2017.0686%2010.8%2017.4V18.6C10.8%2018.9314%2011.0686%2019.2%2011.4%2019.2H12.6C12.9314%2019.2%2013.2%2018.9314%2013.2%2018.6V17.4C13.2%2017.0686%2012.9314%2016.8%2012.6%2016.8Z'%20fill='%23666C79'/%3e%3cpath%20d='M18.6%2012H17.4C17.0686%2012%2016.8%2012.2686%2016.8%2012.6V13.8C16.8%2014.1314%2017.0686%2014.4%2017.4%2014.4H18.6C18.9314%2014.4%2019.2%2014.1314%2019.2%2013.8V12.6C19.2%2012.2686%2018.9314%2012%2018.6%2012Z'%20fill='%23666C79'/%3e%3cpath%20d='M18.6%2016.8H17.4C17.0686%2016.8%2016.8%2017.0686%2016.8%2017.4V18.6C16.8%2018.9314%2017.0686%2019.2%2017.4%2019.2H18.6C18.9314%2019.2%2019.2%2018.9314%2019.2%2018.6V17.4C19.2%2017.0686%2018.9314%2016.8%2018.6%2016.8Z'%20fill='%23666C79'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='16'%20viewBox='0%200%2024%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M2.25%200H0.75C0.335786%200%200%200.358172%200%200.8V2.4C0%202.84183%200.335786%203.2%200.75%203.2H2.25C2.66421%203.2%203%202.84183%203%202.4V0.8C3%200.358172%202.66421%200%202.25%200Z'%20fill='%23666C79'/%3e%3cpath%20d='M2.25%206.4H0.75C0.335786%206.4%200%206.75817%200%207.2V8.8C0%209.24183%200.335786%209.6%200.75%209.6H2.25C2.66421%209.6%203%209.24183%203%208.8V7.2C3%206.75817%202.66421%206.4%202.25%206.4Z'%20fill='%23666C79'/%3e%3cpath%20d='M2.25%2012.8H0.75C0.335786%2012.8%200%2013.1582%200%2013.6V15.2C0%2015.6418%200.335786%2016%200.75%2016H2.25C2.66421%2016%203%2015.6418%203%2015.2V13.6C3%2013.1582%202.66421%2012.8%202.25%2012.8Z'%20fill='%23666C79'/%3e%3cpath%20d='M22.5%203.2H7.5C7.10218%203.2%206.72064%203.03143%206.43934%202.73137C6.15804%202.43131%206%202.02435%206%201.6C6%201.17565%206.15804%200.768688%206.43934%200.468629C6.72064%200.168571%207.10218%200%207.5%200H22.5C22.8978%200%2023.2794%200.168571%2023.5607%200.468629C23.842%200.768688%2024%201.17565%2024%201.6C24%202.02435%2023.842%202.43131%2023.5607%202.73137C23.2794%203.03143%2022.8978%203.2%2022.5%203.2Z'%20fill='%23666C79'/%3e%3cpath%20d='M22.5%209.6H7.5C7.10218%209.6%206.72064%209.43143%206.43934%209.13137C6.15804%208.83131%206%208.42435%206%208C6%207.57565%206.15804%207.16869%206.43934%206.86863C6.72064%206.56857%207.10218%206.4%207.5%206.4H22.5C22.8978%206.4%2023.2794%206.56857%2023.5607%206.86863C23.842%207.16869%2024%207.57565%2024%208C24%208.42435%2023.842%208.83131%2023.5607%209.13137C23.2794%209.43143%2022.8978%209.6%2022.5%209.6Z'%20fill='%23666C79'/%3e%3cpath%20d='M22.5%2016H7.5C7.10218%2016%206.72064%2015.8314%206.43934%2015.5314C6.15804%2015.2313%206%2014.8243%206%2014.4C6%2013.9757%206.15804%2013.5687%206.43934%2013.2686C6.72064%2012.9686%207.10218%2012.8%207.5%2012.8H22.5C22.8978%2012.8%2023.2794%2012.9686%2023.5607%2013.2686C23.842%2013.5687%2024%2013.9757%2024%2014.4C24%2014.8243%2023.842%2015.2313%2023.5607%2015.5314C23.2794%2015.8314%2022.8978%2016%2022.5%2016Z'%20fill='%23666C79'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M8.07162%201H2.17837C1.52758%201%201%201.52758%201%202.17837V8.07162C1%208.72242%201.52758%209.25%202.17837%209.25H8.07162C8.72242%209.25%209.25%208.72242%209.25%208.07162V2.17837C9.25%201.52758%208.72242%201%208.07162%201Z'%20stroke='%23666C79'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M21.8216%201H15.9284C15.2776%201%2014.75%201.52758%2014.75%202.17837V8.07162C14.75%208.72242%2015.2776%209.25%2015.9284%209.25H21.8216C22.4724%209.25%2023%208.72242%2023%208.07162V2.17837C23%201.52758%2022.4724%201%2021.8216%201Z'%20stroke='%23666C79'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M8.07162%2014.75H2.17837C1.52758%2014.75%201%2015.2776%201%2015.9284V21.8216C1%2022.4724%201.52758%2023%202.17837%2023H8.07162C8.72242%2023%209.25%2022.4724%209.25%2021.8216V15.9284C9.25%2015.2776%208.72242%2014.75%208.07162%2014.75Z'%20stroke='%23666C79'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M21.8216%2014.75H15.9284C15.2776%2014.75%2014.75%2015.2776%2014.75%2015.9284V21.8216C14.75%2022.4724%2015.2776%2023%2015.9284%2023H21.8216C22.4724%2023%2023%2022.4724%2023%2021.8216V15.9284C23%2015.2776%2022.4724%2014.75%2021.8216%2014.75Z'%20stroke='%23666C79'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/svg%3e\"","/**\r\n * Theme Configuration for Embeddable Calendar Widget\r\n *\r\n * This module provides comprehensive theming options for the calendar widget.\r\n * All colors use HSL format for easy manipulation.\r\n *\r\n * Usage:\r\n * 1. Import and call applyTheme() with your custom theme\r\n * 2. Or set CSS custom properties directly on the widget container\r\n *\r\n * Example:\r\n * ```js\r\n * import { applyTheme, themes } from '@getmicdrop/venue-calendar/theme';\r\n * applyTheme(themes.dark);\r\n *\r\n * // Or custom theme:\r\n * applyTheme({\r\n * brandPrimary: '270 76% 60%', // Purple\r\n * textPrimary: '0 0% 100%',\r\n * bgPrimary: '0 0% 10%',\r\n * });\r\n * ```\r\n */\r\n\r\n// Default light theme\r\nexport const lightTheme = {\r\n // Brand colors\r\n brandPrimary: '217 91% 60%', // #2563EB - Blue\r\n\r\n // Text colors\r\n textPrimary: '0 0% 0%', // Black\r\n textSecondary: '0 0% 40%', // Dark Gray\r\n textTertiary: '0 0% 60%', // Gray\r\n\r\n // Background colors\r\n bgPrimary: '0 0% 100%', // White\r\n bgSecondary: '0 0% 98%', // Light Gray\r\n bgQuaternary: '0 0% 96%', // Very Light Gray\r\n\r\n // Border/Stroke colors\r\n strokePrimary: '0 0% 80%', // Medium Gray\r\n strokeSecondary: '0 0% 90%', // Light Gray\r\n\r\n // Status colors\r\n statusOnSale: '217 91% 60%', // Blue\r\n statusSellingFast: '38 92% 50%', // Orange\r\n statusSoldOut: '0 84% 60%', // Red\r\n\r\n // Calendar specific\r\n todayBg: '217 91% 97%', // Light blue\r\n todayText: '217 91% 50%', // Blue\r\n eventDotOnSale: '217 91% 60%',\r\n eventDotSellingFast: '38 92% 50%',\r\n eventDotSoldOut: '0 84% 60%',\r\n\r\n // Interaction states\r\n hoverBg: '0 0% 96%',\r\n focusRing: '217 91% 60%',\r\n};\r\n\r\n// Dark theme\r\nexport const darkTheme = {\r\n // Brand colors\r\n brandPrimary: '217 91% 65%', // Lighter blue for dark mode\r\n\r\n // Text colors\r\n textPrimary: '0 0% 98%', // Near white\r\n textSecondary: '0 0% 70%', // Light gray\r\n textTertiary: '0 0% 50%', // Gray\r\n\r\n // Background colors\r\n bgPrimary: '0 0% 9%', // Very dark gray\r\n bgSecondary: '0 0% 13%', // Dark gray\r\n bgQuaternary: '0 0% 17%', // Slightly lighter\r\n\r\n // Border/Stroke colors\r\n strokePrimary: '0 0% 30%',\r\n strokeSecondary: '0 0% 20%',\r\n\r\n // Status colors\r\n statusOnSale: '217 91% 65%',\r\n statusSellingFast: '38 92% 55%',\r\n statusSoldOut: '0 84% 65%',\r\n\r\n // Calendar specific\r\n todayBg: '217 50% 20%',\r\n todayText: '217 91% 70%',\r\n eventDotOnSale: '217 91% 65%',\r\n eventDotSellingFast: '38 92% 55%',\r\n eventDotSoldOut: '0 84% 65%',\r\n\r\n // Interaction states\r\n hoverBg: '0 0% 20%',\r\n focusRing: '217 91% 65%',\r\n};\r\n\r\n// High contrast theme for accessibility\r\nexport const highContrastTheme = {\r\n brandPrimary: '217 100% 50%',\r\n textPrimary: '0 0% 0%',\r\n textSecondary: '0 0% 20%',\r\n textTertiary: '0 0% 30%',\r\n bgPrimary: '0 0% 100%',\r\n bgSecondary: '0 0% 95%',\r\n bgQuaternary: '0 0% 90%',\r\n strokePrimary: '0 0% 0%',\r\n strokeSecondary: '0 0% 30%',\r\n statusOnSale: '217 100% 40%',\r\n statusSellingFast: '30 100% 40%',\r\n statusSoldOut: '0 100% 40%',\r\n todayBg: '217 100% 90%',\r\n todayText: '217 100% 30%',\r\n eventDotOnSale: '217 100% 40%',\r\n eventDotSellingFast: '30 100% 40%',\r\n eventDotSoldOut: '0 100% 40%',\r\n hoverBg: '217 100% 95%',\r\n focusRing: '217 100% 40%',\r\n};\r\n\r\n// Preset themes collection\r\nexport const themes = {\r\n light: lightTheme,\r\n dark: darkTheme,\r\n highContrast: highContrastTheme,\r\n};\r\n\r\n/**\r\n * Apply a theme to the calendar widget\r\n * @param {Object} theme - Theme object with HSL color values\r\n * @param {HTMLElement} container - Optional container element (defaults to :root)\r\n */\r\nexport function applyTheme(theme, container = document.documentElement) {\r\n const cssVarMap = {\r\n brandPrimary: '--brand-primary',\r\n textPrimary: '--text-primary',\r\n textSecondary: '--text-secondary',\r\n textTertiary: '--text-tertiary',\r\n bgPrimary: '--bg-primary',\r\n bgSecondary: '--bg-secondary',\r\n bgQuaternary: '--bg-quaternary',\r\n strokePrimary: '--stroke-primary',\r\n strokeSecondary: '--stroke-secondary',\r\n statusOnSale: '--status-on-sale',\r\n statusSellingFast: '--status-selling-fast',\r\n statusSoldOut: '--status-sold-out',\r\n todayBg: '--today-bg',\r\n todayText: '--today-text',\r\n eventDotOnSale: '--event-dot-on-sale',\r\n eventDotSellingFast: '--event-dot-selling-fast',\r\n eventDotSoldOut: '--event-dot-sold-out',\r\n hoverBg: '--hover-bg',\r\n focusRing: '--focus-ring',\r\n };\r\n\r\n Object.entries(theme).forEach(([key, value]) => {\r\n const cssVar = cssVarMap[key];\r\n if (cssVar) {\r\n container.style.setProperty(cssVar, value);\r\n }\r\n });\r\n\r\n // Sync data-theme attribute when a known preset is applied so SC\r\n // components (Stripe theme detector, DarkModeToggle reader, etc.)\r\n // see the same intent. Partial/custom themes don't trigger this —\r\n // they edit a few CSS vars without flipping the overall light/dark\r\n // mode signal.\r\n if (container.setAttribute) {\r\n if (theme === darkTheme) {\r\n container.setAttribute('data-theme', 'dark');\r\n } else if (theme === lightTheme || theme === highContrastTheme) {\r\n container.setAttribute('data-theme', 'light');\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Generate CSS string for embedding\r\n * @param {Object} theme - Theme object\r\n * @returns {string} CSS string\r\n */\r\nexport function generateThemeCSS(theme) {\r\n const cssVarMap = {\r\n brandPrimary: '--brand-primary',\r\n textPrimary: '--text-primary',\r\n textSecondary: '--text-secondary',\r\n textTertiary: '--text-tertiary',\r\n bgPrimary: '--bg-primary',\r\n bgSecondary: '--bg-secondary',\r\n bgQuaternary: '--bg-quaternary',\r\n strokePrimary: '--stroke-primary',\r\n strokeSecondary: '--stroke-secondary',\r\n statusOnSale: '--status-on-sale',\r\n statusSellingFast: '--status-selling-fast',\r\n statusSoldOut: '--status-sold-out',\r\n todayBg: '--today-bg',\r\n todayText: '--today-text',\r\n eventDotOnSale: '--event-dot-on-sale',\r\n eventDotSellingFast: '--event-dot-selling-fast',\r\n eventDotSoldOut: '--event-dot-sold-out',\r\n hoverBg: '--hover-bg',\r\n focusRing: '--focus-ring',\r\n };\r\n\r\n const lines = [];\r\n Object.entries(theme).forEach(([key, value]) => {\r\n const cssVar = cssVarMap[key];\r\n if (cssVar) {\r\n lines.push(` ${cssVar}: ${value};`);\r\n }\r\n });\r\n\r\n return `:root {\\n${lines.join('\\n')}\\n}`;\r\n}\r\n\r\nexport default {\r\n themes,\r\n lightTheme,\r\n darkTheme,\r\n highContrastTheme,\r\n applyTheme,\r\n generateThemeCSS,\r\n};\r\n","/**\r\n * Configuration module for npm-calendar\r\n * Allows consumers to set configuration values programmatically\r\n */\r\n\r\n// Module-level variable to store the Stripe publishable key\r\nlet stripePublishableKey = null;\r\n\r\n/**\r\n * Set the Stripe publishable key\r\n * @param {string} key - The Stripe publishable key\r\n */\r\nexport function setStripeKey(key) {\r\n stripePublishableKey = key;\r\n}\r\n\r\n/**\r\n * Get the Stripe publishable key\r\n * Falls back to VITE_STRIPE_PUBLISHABLE_KEY environment variable if not set manually\r\n * @returns {string|undefined} The Stripe publishable key\r\n */\r\nexport function getStripeKey() {\r\n if (stripePublishableKey) {\r\n return stripePublishableKey;\r\n }\r\n\r\n // Fall back to environment variable\r\n if (\r\n typeof import.meta !== 'undefined' &&\r\n import.meta.env?.VITE_STRIPE_PUBLISHABLE_KEY\r\n ) {\r\n return import.meta.env.VITE_STRIPE_PUBLISHABLE_KEY;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Embed config (checkout-edge-cases §14.3)\r\n//\r\n// Iframe consumers (a venue site embedding the calendar) sometimes need to\r\n// know when a checkout completes — for analytics, conversion pixels, or a\r\n// host-side \"thanks\" page. This is OPT-IN: hosts shouldn't receive order\r\n// signals unless they ask for them. The emitted payload is non-PII —\r\n// { orderId, eventId } only (see embed-bridge.postCheckoutComplete).\r\n//\r\n// Shape:\r\n// {\r\n// postMessageOnSuccess: boolean,\r\n// // Concrete target origin (e.g. 'https://venue.example'). REQUIRED to\r\n// // actually emit. The message is never posted to '*'; without a concrete\r\n// // origin nothing is sent and a warning is logged.\r\n// postMessageTargetOrigin: string | null,\r\n// }\r\n//\r\n// Default is OFF.\r\n// ---------------------------------------------------------------------------\r\nlet embedConfig = {\r\n postMessageOnSuccess: false,\r\n postMessageTargetOrigin: null,\r\n};\r\n\r\n/**\r\n * Update the embed config. Merges with existing values; pass only the\r\n * keys you want to change.\r\n *\r\n * @param {Partial<{\r\n * postMessageOnSuccess: boolean,\r\n * postMessageTargetOrigin: string | null,\r\n * }>} partial\r\n */\r\nexport function setEmbedConfig(partial = {}) {\r\n embedConfig = { ...embedConfig, ...partial };\r\n}\r\n\r\n/**\r\n * Read the current embed config. Returns a fresh object so callers\r\n * can't mutate the module-level state by accident.\r\n *\r\n * @returns {{\r\n * postMessageOnSuccess: boolean,\r\n * postMessageTargetOrigin: string | null,\r\n * }}\r\n */\r\nexport function getEmbedConfig() {\r\n return { ...embedConfig };\r\n}\r\n","/**\n * Color-scheme → venue-calendar CSS variable mapping for embedded widgets.\n *\n * An embedded <micdrop-calendar widget-id=\"…\"> fetches its saved color scheme\n * (the builder's ColorSchemeColors token shape — hex strings) and applies it so\n * the embed renders with the same brand colors the owner saw in the builder\n * preview. This is the package-side port of micdrop-frontend's\n * `src/lib/color-schemes/palette.ts:colorsToVenueCalendarVars` so the embed is\n * WYSIWYG with the builder. Keep the two in sync (TODO: dedupe — frontend\n * re-export from here once published).\n *\n * venue-calendar consumes raw HSL values (\"209 99% 50%\", no hsl() wrapper);\n * see src/app.css for the full variable list.\n */\n\n/** Convert a #rrggbb hex string to HSL parts. Returns null for invalid input. */\nfunction hexToHslParts(hex) {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex || '');\n if (!result) return null;\n\n const r = parseInt(result[1], 16) / 255;\n const g = parseInt(result[2], 16) / 255;\n const b = parseInt(result[3], 16) / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / d + 2) / 6;\n break;\n case b:\n h = ((r - g) / d + 4) / 6;\n break;\n }\n }\n\n return {\n h: Math.round(h * 360),\n s: Math.round(s * 100),\n l: Math.round(l * 100),\n };\n}\n\n/** Convert hex → \"H S% L%\" (venue-calendar's wrapper-less HSL), or null. */\nexport function hexToHSLString(hex) {\n const parts = hexToHslParts(hex);\n return parts ? `${parts.h} ${parts.s}% ${parts.l}%` : null;\n}\n\n/**\n * Map a saved ColorSchemeColors blob to venue-calendar CSS variables.\n * Tokens whose source color is missing/invalid are omitted (so a partial\n * \"quick\" scheme only overrides what it defines).\n * @param {Record<string, string>} colors\n * @returns {Record<string, string>} cssVarName → \"H S% L%\"\n */\nexport function schemeColorsToCSSVars(colors) {\n if (!colors || typeof colors !== 'object') return {};\n const hsl = hex => hexToHSLString(hex);\n\n // cssVar → source token. Mirrors palette.ts:colorsToVenueCalendarVars.\n const map = {\n '--brand-primary': colors.primary,\n '--brand-secondary': colors.secondary,\n '--bg-primary': colors.background,\n '--bg-secondary': colors.surface,\n '--text-primary': colors.text,\n '--text-secondary': colors.textMuted,\n '--text-tertiary': colors.textMuted,\n '--border': colors.border,\n '--stroke-primary': colors.border,\n '--stroke-secondary': colors.borderMuted,\n '--hover-primary': colors.surfaceHover,\n '--muted-foreground': colors.textMuted,\n '--accent-warning': colors.accent,\n '--accent-danger': colors.statusSoldOut,\n '--accent-success': colors.statusOnSale,\n\n '--Status-OnSale': colors.statusOnSale,\n '--Status-SellingFast': colors.statusSellingFast,\n '--Status-SoldOut': colors.statusSoldOut,\n\n '--Cal-Day-Header': colors.textMuted,\n '--Cal-Day-Header-BG': colors.surface,\n '--Cal-Cell-BG': colors.background,\n '--Cal-Cell-Border': colors.border,\n '--Cal-Date-Text': colors.text,\n '--Cal-Event-Dot': colors.primary,\n '--Cal-Today-BG': colors.primary,\n '--Cal-Nav-Text': colors.textMuted,\n '--Cal-Nav-BG': colors.surface,\n\n '--EC-Card-BG': colors.background,\n '--EC-Card-Border': colors.border,\n '--EC-Title': colors.text,\n '--EC-Date': colors.textMuted,\n '--EC-Price': colors.text,\n '--EC-Image-BG': colors.surface,\n\n '--EP-Title': colors.text,\n '--EP-Section-Header': colors.text,\n '--EP-Body-Text': colors.textMuted,\n '--EP-Venue': colors.textMuted,\n '--EP-Link': colors.primary,\n '--EP-Card-BG': colors.background,\n '--EP-Card-Border': colors.border,\n '--EP-Sidebar-BG': colors.surface,\n '--EP-Sidebar-Border': colors.border,\n '--EP-Sidebar-Label': colors.textMuted,\n '--EP-Sidebar-Price': colors.text,\n '--EP-CTA-BG': colors.primary,\n '--EP-CTA-Text': colors.textOnPrimary,\n '--EP-Trust': colors.textMuted,\n\n '--TS-Header-BG': colors.background,\n '--TS-Header-Border': colors.border,\n '--TS-Header-Title': colors.text,\n '--TS-Header-Text': colors.textMuted,\n '--TS-Card-BG': colors.background,\n '--TS-Card-Border': colors.border,\n '--TS-Card-Border-Hover': colors.primary,\n '--TS-Ticket-Name': colors.text,\n '--TS-Ticket-Desc': colors.textMuted,\n '--TS-Ticket-Price': colors.text,\n '--TS-Ticket-Fee': colors.textMuted,\n '--TS-Scarcity': colors.statusSellingFast,\n '--TS-Qty-Inactive': colors.textMuted,\n '--TS-Qty-Active': colors.primary,\n '--TS-Qty-Value': colors.text,\n '--TS-Qty-Border': colors.border,\n '--TS-Summary-BG': colors.surface,\n '--TS-Summary-Border': colors.border,\n '--TS-Summary-Title': colors.text,\n '--TS-Summary-Row': colors.textMuted,\n '--TS-Summary-Total': colors.text,\n '--TS-Checkout-BG': colors.primary,\n '--TS-Checkout-Text': colors.textOnPrimary,\n\n '--CO-Header-BG': colors.background,\n '--CO-Header-Border': colors.border,\n '--CO-Title': colors.text,\n '--CO-Timer': colors.statusSoldOut,\n '--CO-Close': colors.textMuted,\n '--CO-Card-BG': colors.background,\n '--CO-Card-Border': colors.border,\n '--CO-Section-Title': colors.text,\n '--CO-Secondary-Text': colors.textMuted,\n '--CO-Form-Label': colors.textMuted,\n '--CO-Input-BG': colors.background,\n '--CO-Input-Border': colors.border,\n '--CO-Input-Focus': colors.primary,\n '--CO-Input-Text': colors.text,\n '--CO-Placeholder': colors.textMuted,\n '--CO-Checkbox-Border': colors.border,\n '--CO-Radio-Active': colors.primary,\n '--CO-Order-BG': colors.primary,\n '--CO-Order-Text': colors.textOnPrimary,\n '--CO-Trust': colors.textMuted,\n\n '--Hover-BG': colors.surfaceHover,\n '--Focus-Ring': colors.primary,\n };\n\n /** @type {Record<string, string>} */\n const out = {};\n for (const [cssVar, srcHex] of Object.entries(map)) {\n const v = hsl(srcHex);\n if (v) out[cssVar] = v;\n // Fixed-literal token (white today text) — only meaningful with a scheme.\n if (cssVar === '--Cal-Today-BG' && v) out['--Cal-Today-Text'] = '0 0% 100%';\n }\n return out;\n}\n\n/**\n * Apply a saved color scheme to a container element as inline CSS variables,\n * so venue-calendar components inside inherit the themed colors. Mirrors how\n * the builder preview themes its calendar.\n * @param {Record<string, string>} colors ColorSchemeColors blob\n * @param {HTMLElement} container\n */\nexport function applySchemeColors(colors, container) {\n if (!container || !container.style) return;\n const vars = schemeColorsToCSSVars(colors);\n for (const [cssVar, value] of Object.entries(vars)) {\n container.style.setProperty(cssVar, value);\n }\n}\n","// @fetch-escape: widget-intentional. \r\n// Web Component wrapper for VenueCalendar\r\n//\r\n// Defines `<micdrop-calendar>` synchronously so that consumer pages parsed\r\n// before the bundle finishes loading still upgrade correctly. The actual\r\n// VenueCalendar implementation is dynamic-imported on first mount, so we\r\n// keep the cold-path cost off the script tag's parse step.\r\n\r\nimport { unmount } from 'svelte';\r\nimport { lazyOnce } from '@getmicdrop/svelte-components/utils/lazyOnce';\r\nimport { applySchemeColors } from './scheme-colors.js';\r\nimport { getPublicBaseUrl } from './api/client';\r\n\r\nlet MicDropCalendar = null;\r\n\r\n/**\r\n * Fetch a widget's saved render config (display type + filters + brand colors)\r\n * for an embedded `<micdrop-calendar widget-id=\"…\">`. Open-by-id public\r\n * endpoint; resolves null on any failure so the element still mounts.\r\n */\r\nasync function fetchWidgetConfig(widgetId) {\r\n try {\r\n const res = await fetch(\r\n `${getPublicBaseUrl()}/widgets/${encodeURIComponent(widgetId)}/config`\r\n );\r\n if (!res.ok) return null;\r\n return await res.json();\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n// Lazily-resolved init function. Cached after first import so additional\r\n// <micdrop-calendar> instances reuse the resolved module.\r\n//\r\n// lazyOnce is the SC canonical for this pattern: it memoizes the import on\r\n// success but NEVER memoizes a rejection — on failure it resets its memo and\r\n// rethrows, so a single failed chunk fetch on a flaky third-party host network\r\n// cannot brick every <micdrop-calendar> on the page. The next\r\n// connectedCallback / attribute-change retries the import from scratch.\r\nconst loadInit = lazyOnce(() =>\r\n import('./VenueCalendar.js').then((m) => m.initVenueCalendar)\r\n);\r\n\r\n// Exported so tests can reset the cache between runs. Maps to lazyOnce's\r\n// reset() so the test-hook contract is preserved unchanged.\r\nconst _resetInitCache = () => {\r\n loadInit.reset();\r\n};\r\n\r\nif (typeof window !== 'undefined' && typeof HTMLElement !== 'undefined') {\r\n\r\n // All attributes that map 1:1 to initVenueCalendar options. Kept in one\r\n // place so observedAttributes and the option-builder stay in sync.\r\n const ATTR_MAP = {\r\n 'venue-id': 'venueId',\r\n 'organization-id': 'organizationId',\r\n // widget-id: when present, the element fetches its saved config\r\n // (display type + filters + brand colors) and applies it before mount.\r\n 'widget-id': 'widgetId',\r\n 'view': 'view',\r\n 'show-view-options': 'showViewOptions',\r\n 'show-month-switcher': 'showMonthSwitcher',\r\n 'url-mode': 'urlMode',\r\n 'locale': 'locale',\r\n };\r\n\r\n const readOptions = (el) => {\r\n const opts = { target: el, events: [] };\r\n for (const [attr, key] of Object.entries(ATTR_MAP)) {\r\n const v = el.getAttribute(attr);\r\n if (v === null) continue;\r\n if (key === 'showViewOptions' || key === 'showMonthSwitcher') {\r\n opts[key] = v !== 'false';\r\n } else {\r\n opts[key] = v;\r\n }\r\n }\r\n return opts;\r\n };\r\n\r\n MicDropCalendar = class extends HTMLElement {\r\n constructor() {\r\n super();\r\n this.component = null;\r\n this._mountToken = 0;\r\n }\r\n\r\n connectedCallback() {\r\n const token = ++this._mountToken;\r\n loadInit()\r\n .then(async (initVenueCalendar) => {\r\n // The mount-token check covers both \"element disconnected\" and\r\n // \"element re-mounted with new attributes\" — disconnectedCallback\r\n // increments the token to invalidate any in-flight mount.\r\n if (token !== this._mountToken) return;\r\n const opts = readOptions(this);\r\n\r\n // widget-id: fetch the saved config and apply it before mounting.\r\n // displayType → view, filterValues passed through, colors applied as\r\n // CSS vars on this element so the calendar inside inherits the brand\r\n // theme. Any failure falls through to a plain mount.\r\n if (opts.widgetId) {\r\n const config = await fetchWidgetConfig(opts.widgetId);\r\n if (token !== this._mountToken) return;\r\n if (config) {\r\n if (config.colors) applySchemeColors(config.colors, this);\r\n if (config.displayType) opts.view = config.displayType;\r\n if (config.filterValues) opts.filterValues = config.filterValues;\r\n }\r\n }\r\n\r\n this.component = initVenueCalendar(opts);\r\n })\r\n .catch((err) => {\r\n // A failed chunk load (flaky host network, blocked CDN) leaves the\r\n // element un-mounted. loadInit() has already reset its memo, so the\r\n // next connectedCallback / attribute-change retries from scratch.\r\n // this.component stays null → the element is not half-initialized\r\n // and disconnectedCallback/remount paths stay safe.\r\n console.error('[micdrop-calendar] failed to load calendar bundle', err);\r\n });\r\n }\r\n\r\n disconnectedCallback() {\r\n // Invalidate any in-flight mount.\r\n this._mountToken++;\r\n if (this.component) {\r\n try {\r\n unmount(this.component);\r\n } catch {\r\n // Older mount return shapes — fall through.\r\n }\r\n this.component = null;\r\n }\r\n }\r\n\r\n static get observedAttributes() {\r\n return Object.keys(ATTR_MAP);\r\n }\r\n\r\n attributeChangedCallback(_name, oldValue, newValue) {\r\n if (oldValue === newValue) return;\r\n // Remount on attribute change. Acceptable for an embed (rare).\r\n if (this.component || this._mountToken > 0) {\r\n this.disconnectedCallback();\r\n this.connectedCallback();\r\n }\r\n }\r\n };\r\n\r\n if (!customElements.get('micdrop-calendar')) {\r\n customElements.define('micdrop-calendar', MicDropCalendar);\r\n }\r\n}\r\n\r\nexport { MicDropCalendar, _resetInitCache };","import { createLogger } from '@getmicdrop/svelte-components';\r\nimport { getDefaultTimezone } from '@getmicdrop/svelte-components/utils/timezones';\r\n// Main library entry point for @get-micdrop/venue-calendar.\r\n//\r\n// Hot path: the CalendarContainer is statically imported because every embed\r\n// uses it. Everything else in the checkout flow (Checkout/Cart/Success/\r\n// EventDetails/Series/Collection/CheckoutMain) is dynamic-imported on demand.\r\n// This is the central reason an embed that only renders a calendar no\r\n// longer pays for the entire checkout flow in its bundle.\r\nimport CalendarContainer from '../components/CalendarContainer/CalendarContainer.svelte';\r\nimport { mount, unmount } from 'svelte';\r\nimport { writable } from 'svelte/store';\r\nimport { HostSeoController } from './seo/HostSeoController';\r\nimport calendarIcon from '../assets/icons/calendar-month.svg';\r\nimport listIcon from '../assets/icons/list-outline.svg';\r\nimport gridIcon from '../assets/icons/grid-outline.svg';\r\nimport '../app.css';\r\nimport {\r\n themes,\r\n lightTheme,\r\n darkTheme,\r\n highContrastTheme,\r\n applyTheme,\r\n generateThemeCSS,\r\n} from './theme.js';\r\nimport { setStripeKey, setEmbedConfig } from './config.js';\r\nimport { configureApi } from './api/client.js';\r\n\r\n// Replaced at build time with the package.json version. The Vite config\r\n// for the lib bundle injects this; defaults to 'dev' when unset.\r\nconst VC_VERSION =\r\n typeof __VC_VERSION__ !== 'undefined' ? __VC_VERSION__ : 'dev';\r\n\r\n// Module logger — declared early so any init* function can use it without\r\n// a TDZ ReferenceError on hoisted refactors.\r\nconst logger = createLogger('VenueCalendar');\r\n\r\n// Optional consumer-supplied error reporter. Wired into the canonical API\r\n// client via configureApi() and also called from the library's own\r\n// catch sites. Receives (error, { source }).\r\nlet _errorReporter = null;\r\n\r\n/**\r\n * Configure the calendar widget at runtime. Accepts:\r\n * - onError(error, context): called whenever the widget surfaces a\r\n * caught error. Use to wire into Sentry/Rollbar/etc.\r\n * - apiBaseUrl: override the backend origin for multi-region setups.\r\n * - apiTimeout, apiRetries: forwarded to the canonical API client.\r\n *\r\n * @param {Object} options\r\n * @param {(err: Error, ctx: {source: string}) => void} [options.onError]\r\n * @param {string} [options.apiBaseUrl]\r\n * @param {number} [options.apiTimeout]\r\n * @param {number} [options.apiRetries]\r\n * @param {{postMessageOnSuccess?: boolean, postMessageTargetOrigin?: string | null}} [options.embed]\r\n * - postMessageOnSuccess: emit a 'checkout-complete' postMessage when an\r\n * order completes. Payload is non-PII: { orderId, eventId }.\r\n * - postMessageTargetOrigin: REQUIRED concrete origin\r\n * (e.g. 'https://venue.example'). The message is never posted to '*';\r\n * without a concrete origin nothing is sent and a warning is logged.\r\n */\r\nexport function configureVenueCalendar(options = {}) {\r\n if (typeof options.onError === 'function') {\r\n _errorReporter = options.onError;\r\n // Wire the same handler into the canonical API client so backend\r\n // failures don't fall on the floor.\r\n configureApi({\r\n onError: err => {\r\n try {\r\n options.onError(err, { source: 'api' });\r\n } catch (reporterError) {\r\n logger.error('onError handler threw:', reporterError);\r\n }\r\n },\r\n });\r\n }\r\n if (typeof options.apiBaseUrl === 'string') {\r\n configureApi({ baseUrl: options.apiBaseUrl });\r\n }\r\n if (typeof options.apiTimeout === 'number') {\r\n configureApi({ timeout: options.apiTimeout });\r\n }\r\n if (typeof options.apiRetries === 'number') {\r\n configureApi({ retries: options.apiRetries });\r\n }\r\n if (options.embed && typeof options.embed === 'object') {\r\n setEmbedConfig(options.embed);\r\n }\r\n}\r\n\r\n/**\r\n * Report a caught error through the consumer's configured handler\r\n * (no-op if none is configured). Internal use.\r\n *\r\n * @param {unknown} err\r\n * @param {string} source\r\n */\r\nexport function reportError(err, source = 'unknown') {\r\n if (!_errorReporter) return;\r\n try {\r\n const error = err instanceof Error ? err : new Error(String(err));\r\n _errorReporter(error, { source });\r\n } catch (reporterError) {\r\n logger.error('onError handler threw:', reporterError);\r\n }\r\n}\r\n\r\n// Surface the version + a tiny diagnostic helper on window so support\r\n// can ask \"open devtools, run __MICDROP_CALENDAR__.version\" instead of\r\n// playing source-map archaeology with a venue site.\r\nif (typeof window !== 'undefined') {\r\n /** @type {any} */\r\n const w = window;\r\n w.__MICDROP_CALENDAR__ = w.__MICDROP_CALENDAR__ || {};\r\n w.__MICDROP_CALENDAR__.version = VC_VERSION;\r\n w.__MICDROP_CALENDAR__.configure = configureVenueCalendar;\r\n}\r\n\r\n// Lazy-loader registry. Each entry returns a Promise<Component>; results\r\n// are memoized on first call so additional init* calls reuse the cached\r\n// module without paying a second network round-trip.\r\nconst _lazyCache = new Map();\r\nfunction _loadOnce(key, loader) {\r\n if (!_lazyCache.has(key)) _lazyCache.set(key, loader());\r\n return _lazyCache.get(key);\r\n}\r\nconst _load = {\r\n // EventPage is the canonical event-detail page (inline ticket selection via\r\n // BookingWidget — no modal). The old EventDetailsView (a stray modal-based\r\n // duplicate) has been deleted; everything uses EventPage.\r\n EventPage: () =>\r\n _loadOnce('EventPage', () =>\r\n import('../components/Views/EventPage.svelte').then(m => m.default)\r\n ),\r\n Checkout: () =>\r\n _loadOnce('Checkout', () =>\r\n import('../components/Views/Checkout.svelte').then(m => m.default)\r\n ),\r\n Success: () =>\r\n _loadOnce('Success', () =>\r\n import('../components/Views/Success.svelte').then(m => m.default)\r\n ),\r\n CartView: () =>\r\n _loadOnce('CartView', () =>\r\n import('../components/Views/CartView.svelte').then(m => m.default)\r\n ),\r\n ViewTicketsEmbed: () =>\r\n _loadOnce('ViewTicketsEmbed', () =>\r\n import('../components/Views/ViewTicketsEmbed.svelte').then(m => m.default)\r\n ),\r\n CheckoutMain: () =>\r\n _loadOnce('CheckoutMain', () =>\r\n import('./public-calendar-flow/Checkout.svelte').then(m => m.default)\r\n ),\r\n SeriesPage: () =>\r\n _loadOnce('SeriesPage', () =>\r\n import('../components/Views/SeriesPage.svelte').then(m => m.default)\r\n ),\r\n CollectionView: () =>\r\n _loadOnce('CollectionView', () =>\r\n import('../components/Views/CollectionView.svelte').then(m => m.default)\r\n ),\r\n};\r\n\r\nfunction _resolveTarget(target, name) {\r\n let el;\r\n if (typeof target === 'string') el = document.querySelector(target);\r\n else if (target instanceof HTMLElement) el = target;\r\n if (!el) logger.error(`${name}: Target element not found`);\r\n // Scope class: the compiled @layer base (Tailwind preflight + SC typography)\r\n // is scoped under .micdrop at build time (scripts/css-scope.js), so EVERY\r\n // mount root must carry it — not just the calendar — or those views render\r\n // unstyled. Covers initEventPage/initCheckout/initSuccess/initCartView too.\r\n if (el && !el.classList.contains('micdrop')) el.classList.add('micdrop');\r\n return el;\r\n}\r\n\r\n/**\r\n * Initialize the Venue Calendar component.\r\n *\r\n * Calendar is the only sync-mountable view because it is the hot path:\r\n * the auto-mount + script-tag embedding pattern needs the calendar to be\r\n * available the instant the bundle finishes evaluating.\r\n *\r\n * @param {Object} options - Configuration options\r\n * @returns {Object} - Returns the Svelte component instance\r\n */\r\nexport function initVenueCalendar(options = {}) {\r\n const {\r\n target,\r\n venueId = '',\r\n organizationId = '',\r\n view = 'calendar',\r\n events = [],\r\n showViewOptions = true,\r\n showMonthSwitcher = true,\r\n currentMonth,\r\n currentYear,\r\n handleNext,\r\n handlePrev,\r\n onEventClick,\r\n featuredItem,\r\n labels,\r\n seoController,\r\n urlMode,\r\n // Embeds render the show detail / series / collection IN-PLACE by default\r\n // (no host-page navigation). A consumer can opt out by passing false, or\r\n // override click handling entirely by passing their own onEventClick.\r\n inlineEntityViews = true,\r\n // Saved widget filter (embed via <micdrop-calendar widget-id>). null = none.\r\n filterValues = null,\r\n } = options;\r\n\r\n const targetElement = _resolveTarget(target, 'VenueCalendar');\r\n if (!targetElement) return null;\r\n\r\n const VIEW_MAP = {\r\n list: 0,\r\n gallery: 1,\r\n calendar: 2,\r\n carousel: 3,\r\n featured: 4,\r\n };\r\n const _viewId = VIEW_MAP[view.toLowerCase()] ?? 2;\r\n\r\n const viewOptions = showViewOptions\r\n ? [\r\n { id: 0, text: labels?.viewList || 'List', icon: listIcon },\r\n { id: 1, text: labels?.viewGallery || 'Gallery', icon: gridIcon },\r\n { id: 2, text: labels?.viewCalendar || 'Calendar', icon: calendarIcon },\r\n ]\r\n : null;\r\n\r\n const defaultMonth = writable(new Date().getUTCMonth());\r\n const defaultYear = writable(new Date().getUTCFullYear());\r\n\r\n const defaultHandleNext = () => {\r\n defaultMonth.update(m => {\r\n if (m === 11) {\r\n defaultYear.update(y => y + 1);\r\n return 0;\r\n }\r\n return m + 1;\r\n });\r\n };\r\n\r\n const defaultHandlePrev = () => {\r\n defaultMonth.update(m => {\r\n if (m === 0) {\r\n defaultYear.update(y => y - 1);\r\n return 11;\r\n }\r\n return m - 1;\r\n });\r\n };\r\n\r\n const props = {\r\n showMonthSwitcher,\r\n showViewOptions: viewOptions ?? false,\r\n events: events || [],\r\n venueId: venueId || '',\r\n organizationId: organizationId || '',\r\n currentMonth: currentMonth ?? defaultMonth,\r\n currentYear: currentYear ?? defaultYear,\r\n handleNext: handleNext ?? defaultHandleNext,\r\n handlePrev: handlePrev ?? defaultHandlePrev,\r\n onEventClick: onEventClick,\r\n featuredItem: featuredItem || null,\r\n seoController: seoController || null,\r\n inlineEntityViews,\r\n ...(filterValues ? { filterValues } : {}),\r\n ...(urlMode ? { urlMode } : {}),\r\n ...(labels ? { labels } : {}),\r\n };\r\n\r\n return mount(CalendarContainer, { target: targetElement, props });\r\n}\r\n\r\n/**\r\n * Parse the entity-agnostic `#{id}-{slug}` deep link from the host page hash.\r\n * No e/s/c type prefix — the widget resolves the type by id from its data.\r\n */\r\nfunction parseDeepLink() {\r\n if (typeof window === 'undefined') return null;\r\n try {\r\n const raw = (window.location.hash || '').replace(/^#/, '');\r\n if (!raw) return null;\r\n const dashIndex = raw.indexOf('-');\r\n const id = dashIndex === -1 ? raw : raw.substring(0, dashIndex);\r\n const slug = dashIndex === -1 ? '' : raw.substring(dashIndex + 1);\r\n // Only a leading-numeric-id hash is a show deep link; ignore plain\r\n // host-page anchors like #contact.\r\n if (!/^\\d+$/.test(id)) return null;\r\n return { id, slug };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function autoMount() {\r\n if (typeof window === 'undefined') return;\r\n\r\n const mountCalendars = () => {\r\n const containers = document.querySelectorAll('.micdrop-calendar-container');\r\n const deepLink = parseDeepLink();\r\n\r\n containers.forEach(\r\n /** @param {HTMLElement} container */ container => {\r\n if (container.dataset.micdropInitialized) return;\r\n\r\n const venueId =\r\n container.dataset.venueId ||\r\n container.getAttribute('data-venue-id') ||\r\n '';\r\n const organizationId =\r\n container.dataset.organizationId ||\r\n container.getAttribute('data-organization-id') ||\r\n '';\r\n const view =\r\n container.dataset.view ||\r\n container.getAttribute('data-view') ||\r\n 'calendar';\r\n const showViewOptions = container.dataset.showViewOptions !== 'false';\r\n const showMonthSwitcher =\r\n container.dataset.showMonthSwitcher !== 'false';\r\n // Per-embed locale override (BCP-47 tag). Falls back to the browser\r\n // locale inside CalendarContainer when undefined.\r\n const locale =\r\n container.dataset.locale ||\r\n container.getAttribute('data-locale') ||\r\n undefined;\r\n\r\n const injectSeo = container.dataset.injectSeo !== 'false';\r\n const urlMode =\r\n container.dataset.urlMode ||\r\n container.getAttribute('data-url-mode') ||\r\n 'pushState';\r\n\r\n let seoController = null;\r\n if (injectSeo) {\r\n seoController = new HostSeoController({\r\n venueName: '',\r\n venueTimeZone: getDefaultTimezone(),\r\n });\r\n }\r\n\r\n // Embeds render the show in-place (inlineEntityViews defaults true in\r\n // initVenueCalendar). The widget reads the #{id}-{slug} deep link from\r\n // the hash itself (WidgetUrlManager) and opens it in-place, so we no\r\n // longer wire a no-op onEventClick here.\r\n const instance = initVenueCalendar({\r\n target: container,\r\n venueId,\r\n organizationId,\r\n view,\r\n events: [],\r\n showViewOptions,\r\n showMonthSwitcher,\r\n seoController,\r\n urlMode,\r\n ...(locale ? { locale } : {}),\r\n });\r\n\r\n if (instance && deepLink) {\r\n container.dispatchEvent(\r\n new CustomEvent('micdrop-deep-link', {\r\n detail: { eventId: deepLink.id, slug: deepLink.slug },\r\n bubbles: true,\r\n })\r\n );\r\n }\r\n\r\n if (seoController)\r\n /** @type {any} */ (container)._micdropSeoController = seoController;\r\n if (instance) container.dataset.micdropInitialized = 'true';\r\n }\r\n );\r\n };\r\n\r\n if (document.readyState === 'loading') {\r\n document.addEventListener('DOMContentLoaded', mountCalendars);\r\n } else {\r\n mountCalendars();\r\n }\r\n}\r\n\r\n// Calendar entry — the only sync-exported view component.\r\nexport { CalendarContainer as VenueCalendar };\r\n\r\n// Theme utilities (no UI cost, safe to keep sync).\r\nexport {\r\n themes,\r\n lightTheme,\r\n darkTheme,\r\n highContrastTheme,\r\n applyTheme,\r\n generateThemeCSS,\r\n} from './theme.js';\r\n\r\n// Lazy view exports. Each is a function returning Promise<Component>, so a\r\n// consumer only pays for a view's chunk when it actually renders that view:\r\n// const Comp = await EventDetailsView();\r\n//\r\n// IMPORTANT: these MUST stay loader functions, not raw `export { X }` component\r\n// re-exports. Every consumer (the public event/series/collection pages and the\r\n// whole checkout flow) does `await module.X()`; exporting the raw component\r\n// makes `module.X()` invoke a Svelte component as a plain function, which reads\r\n// props off `undefined` and throws \"Cannot read properties of undefined\". Raw\r\n// re-exports also defeat per-view code-splitting (public pages would eagerly\r\n// bundle Stripe/checkout code). A polish PR (a345c56) regressed this; do not\r\n// reintroduce the raw re-exports.\r\nexport const EventPage = _load.EventPage;\r\nexport const Checkout = _load.Checkout;\r\nexport const Success = _load.Success;\r\nexport const CartView = _load.CartView;\r\nexport const ViewTicketsEmbed = _load.ViewTicketsEmbed;\r\nexport const CheckoutMain = _load.CheckoutMain;\r\nexport const SeriesPage = _load.SeriesPage;\r\nexport const CollectionView = _load.CollectionView;\r\n\r\n/**\r\n * Initialize the (inline) Event Page — tickets selected on the page, no modal.\r\n * Returns Promise<component>. The canonical replacement for the deleted\r\n * initEventDetailsView. Pass eventId (the page self-fetches) and/or rawEvent.\r\n */\r\nexport async function initEventPage(options = {}) {\r\n const {\r\n target,\r\n eventId,\r\n rawEvent = null,\r\n slug = '',\r\n organizationId = '',\r\n onNavigateBack,\r\n onNavigateToCart,\r\n onBuyTickets,\r\n labels,\r\n } = options;\r\n\r\n const targetElement = _resolveTarget(target, 'EventPage');\r\n if (!targetElement) return null;\r\n if (!eventId && !rawEvent) {\r\n logger.error('EventPage: eventId or rawEvent is required');\r\n return null;\r\n }\r\n\r\n const Component = await _load.EventPage();\r\n return mount(Component, {\r\n target: targetElement,\r\n props: {\r\n ...(rawEvent ? { rawEvent } : {}),\r\n eventId,\r\n slug,\r\n organizationId,\r\n onNavigateBack,\r\n onNavigateToCart,\r\n onBuyTickets,\r\n ...(labels ? { labels } : {}),\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Initialize Checkout View. Returns Promise<component>.\r\n */\r\nexport async function initCheckoutView(options = {}) {\r\n const {\r\n target,\r\n eventId,\r\n slug = '',\r\n venueId = '',\r\n organizationId = '',\r\n availableTickets = [],\r\n onSuccess,\r\n onNavigateToSuccess,\r\n stripePublishableKey,\r\n labels,\r\n } = options;\r\n\r\n if (stripePublishableKey) setStripeKey(stripePublishableKey);\r\n\r\n const targetElement = _resolveTarget(target, 'Checkout');\r\n if (!targetElement) return null;\r\n if (!eventId) {\r\n logger.error('Checkout: Event ID is required');\r\n return null;\r\n }\r\n\r\n const Component = await _load.Checkout();\r\n const component = mount(Component, {\r\n target: targetElement,\r\n props: {\r\n data: { id: eventId, slug, event: null },\r\n availableTickets,\r\n venueId,\r\n organizationId,\r\n onNavigateToSuccess,\r\n onSuccess,\r\n ...(labels ? { labels } : {}),\r\n },\r\n });\r\n\r\n if (onSuccess && typeof onSuccess === 'function') {\r\n const handleSuccess = event => {\r\n if (event && event.detail) onSuccess(event.detail);\r\n };\r\n targetElement.addEventListener('success', handleSuccess, true);\r\n // Stash the cleanup on the returned object so consumers can\r\n // unwire the listener when they unmount the component.\r\n component._successCleanup = () => {\r\n targetElement.removeEventListener('success', handleSuccess, true);\r\n };\r\n }\r\n\r\n return component;\r\n}\r\n\r\nexport const initCheckout = initCheckoutView;\r\n\r\n/**\r\n * Initialize Success View. Returns Promise<component>.\r\n */\r\nexport async function initSuccessView(options = {}) {\r\n const {\r\n target,\r\n eventId = '',\r\n slug = '',\r\n venueId = '',\r\n organizationId = '',\r\n orderId = '',\r\n labels,\r\n } = options;\r\n\r\n const targetElement = _resolveTarget(target, 'Success');\r\n if (!targetElement) return null;\r\n\r\n const Component = await _load.Success();\r\n return mount(Component, {\r\n target: targetElement,\r\n props: {\r\n data: {\r\n id: eventId,\r\n slug,\r\n event: null,\r\n orderId,\r\n venueId,\r\n organizationId,\r\n venueID: venueId,\r\n organizationID: organizationId,\r\n },\r\n ...(labels ? { labels } : {}),\r\n },\r\n });\r\n}\r\n\r\nexport const initSuccess = initSuccessView;\r\n\r\n/**\r\n * Initialize Cart View (ticket selection). Returns Promise<component>.\r\n */\r\nexport async function initCartView(options = {}) {\r\n const {\r\n target,\r\n eventId,\r\n venueId = '',\r\n organizationId = '',\r\n onNavigateBack,\r\n onNavigateToCheckout,\r\n } = options;\r\n\r\n const targetElement = _resolveTarget(target, 'CartView');\r\n if (!targetElement) return null;\r\n if (!eventId) {\r\n logger.error('CartView: Event ID is required');\r\n return null;\r\n }\r\n\r\n const Component = await _load.CartView();\r\n return mount(Component, {\r\n target: targetElement,\r\n props: {\r\n eventId,\r\n venueId,\r\n organizationId,\r\n onNavigateBack,\r\n onNavigateToCheckout,\r\n },\r\n });\r\n}\r\n\r\nexport const initCart = initCartView;\r\n\r\n// Allow consumers to opt into explicit unmount (Svelte 5 cleanup).\r\nexport { unmount };\r\n\r\n// Import and register web component (sync — registers the custom element\r\n// class but defers the actual VenueCalendar import to upgrade time).\r\nimport './web-component.js';\r\n\r\n// Auto-mount by default when loaded via script tag.\r\nif (\r\n typeof window !== 'undefined' &&\r\n !(/** @type {any} */ (window).__MICDROP_CALENDAR_NO_AUTO_MOUNT__)\r\n) {\r\n autoMount();\r\n}\r\n\r\n// Default export for convenience.\r\nexport default {\r\n initVenueCalendar,\r\n initEventPage,\r\n initCheckoutView,\r\n initCheckout,\r\n initSuccessView,\r\n initSuccess,\r\n initCartView,\r\n initCart,\r\n autoMount,\r\n unmount,\r\n VenueCalendar: CalendarContainer,\r\n themes,\r\n lightTheme,\r\n darkTheme,\r\n highContrastTheme,\r\n applyTheme,\r\n generateThemeCSS,\r\n // Async component loaders — call to obtain the Svelte component class.\r\n EventPage: _load.EventPage,\r\n Checkout: _load.Checkout,\r\n CheckoutView: _load.Checkout,\r\n Success: _load.Success,\r\n // Sucess (typo) — DEPRECATED, retires in v4. Resolves the correct\r\n // loader but logs a warning to flag the bad spelling.\r\n Sucess: () => {\r\n logger.warn(\r\n '[VC] DEPRECATED: `Sucess` (misspelling) retires in v4. Use `Success`.'\r\n );\r\n return _load.Success();\r\n },\r\n CartView: _load.CartView,\r\n ViewTicketsEmbed: _load.ViewTicketsEmbed,\r\n SeriesPage: _load.SeriesPage,\r\n CollectionView: _load.CollectionView,\r\n CheckoutMain: _load.CheckoutMain,\r\n};\r\n"],"names":["concatArrays","array1","array2","combinedArray","i","createClassValidatorObject","classGroupId","validator","createClassPartObject","nextPart","validators","CLASS_PART_SEPARATOR","EMPTY_CONFLICTS","ARBITRARY_PROPERTY_PREFIX","createClassGroupUtils","config","classMap","createClassMap","conflictingClassGroups","conflictingClassGroupModifiers","className","getGroupIdForArbitraryProperty","classParts","startIndex","getGroupRecursive","hasPostfixModifier","modifierConflicts","baseConflicts","classPartObject","currentClassPart","nextClassPartObject","result","classRest","validatorsLength","validatorObj","content","colonIndex","property","theme","classGroups","processClassGroups","group","processClassesRecursively","classGroup","len","classDefinition","processClassDefinition","processStringDefinition","processFunctionDefinition","processObjectDefinition","classPartObjectToEdit","getPart","isThemeGetter","entries","key","value","path","current","parts","part","next","func","createLruCache","maxCacheSize","cacheSize","cache","previousCache","update","IMPORTANT_MODIFIER","MODIFIER_SEPARATOR","EMPTY_MODIFIERS","createResultObject","modifiers","hasImportantModifier","baseClassName","maybePostfixModifierPosition","isExternal","createParseClassName","prefix","experimentalParseClassName","parseClassName","bracketDepth","parenDepth","modifierStart","postfixModifierPosition","index","currentCharacter","baseClassNameWithImportantModifier","fullPrefix","parseClassNameOriginal","createSortModifiers","modifierWeights","mod","currentSegment","modifier","isArbitrary","isOrderSensitive","createConfigUtils","SPLIT_CLASSES_REGEX","mergeClassList","classList","configUtils","getClassGroupId","getConflictingClassGroupIds","sortModifiers","classGroupsInConflict","classNames","originalClassName","variantModifier","modifierId","classId","conflictGroups","twJoin","classLists","argument","resolvedValue","string","toValue","mix","k","createTailwindMerge","createConfigFirst","createConfigRest","cacheGet","cacheSet","functionToCall","initTailwindMerge","previousConfig","createConfigCurrent","tailwindMerge","cachedResult","args","fallbackThemeArr","fromTheme","themeGetter","arbitraryValueRegex","arbitraryVariableRegex","fractionRegex","tshirtUnitRegex","lengthUnitRegex","colorFunctionRegex","shadowRegex","imageRegex","isFraction","isNumber","isInteger","isPercent","isTshirtSize","isAny","isLengthOnly","isNever","isShadow","isImage","isAnyNonArbitrary","isArbitraryValue","isArbitraryVariable","isArbitrarySize","getIsArbitraryValue","isLabelSize","isArbitraryLength","isLabelLength","isArbitraryNumber","isLabelNumber","isArbitraryWeight","isLabelWeight","isArbitraryFamilyName","isLabelFamilyName","isArbitraryPosition","isLabelPosition","isArbitraryImage","isLabelImage","isArbitraryShadow","isLabelShadow","isArbitraryVariableLength","getIsArbitraryVariable","isArbitraryVariableFamilyName","isArbitraryVariablePosition","isArbitraryVariableSize","isArbitraryVariableImage","isArbitraryVariableShadow","isArbitraryVariableWeight","testLabel","testValue","shouldMatchNoLabel","label","getDefaultConfig","themeColor","themeFont","themeText","themeFontWeight","themeTracking","themeLeading","themeBreakpoint","themeContainer","themeSpacing","themeRadius","themeShadow","themeInsetShadow","themeTextShadow","themeDropShadow","themeBlur","themePerspective","themeAspect","themeEase","themeAnimate","scaleBreak","scalePosition","scalePositionWithArbitrary","scaleOverflow","scaleOverscroll","scaleUnambiguousSpacing","scaleInset","scaleGridTemplateColsRows","scaleGridColRowStartAndEnd","scaleGridColRowStartOrEnd","scaleGridAutoColsRows","scaleAlignPrimaryAxis","scaleAlignSecondaryAxis","scaleMargin","scaleSizing","scaleSizingInline","scaleSizingBlock","scaleColor","scaleBgPosition","scaleBgRepeat","scaleBgSize","scaleGradientStopPosition","scaleRadius","scaleBorderWidth","scaleLineStyle","scaleBlendMode","scaleMaskImagePosition","scaleBlur","scaleRotate","scaleScale","scaleSkew","scaleTranslate","twMerge","r","e","t","f","n","o","clsx","classes","cn","inputs","LOG_LEVELS","isEnabled","createLogger","options","shouldLog","level","formatMessage","message","opts","logger","size","$","$$props","color","svg","root","typography","DURATION","EASING","cubicOut","safeSlide","node","params","height","width","svelteSlide","safeFade","prefersReducedMotion","svelteFade","safeFly","svelteFly","safeFadeScale","delay","duration","easing","start","style","opacity","transform","badgeColorVariants","spinnerColorVariants","AppError","code","_resolver","toCents","toDateOnly","s","y","m","d","probe","toIANATimezone","brandId","brand","toEventId","parseId","ctor","parseEventId","asIANATimezone","isEmailAddress","x","toTicketId","asCookieName","DateTimeError","details","DateTimeErrorCode","DATE_FORMATS","DEFAULT_TIMEZONE","LEGACY_TIMEZONE_MAP","timezoneValidationCache","TIMEZONE_ABBREVIATIONS","isValidTimezone","timezone","cached","venueTimeZone","entity","eventFallback","raw","getIANATimezone","normalizeTimezone","trimmed","normalized","tzString","legacyMatch","millisecondsInWeek","millisecondsInDay","constructFromSymbol","constructFrom","date","toDate","context","defaultOptions","getDefaultOptions","startOfWeek","weekStartsOn","_date","day","diff","startOfISOWeek","getISOWeekYear","year","fourthOfJanuaryOfNextYear","startOfNextYear","fourthOfJanuaryOfThisYear","startOfThisYear","getTimezoneOffsetInMilliseconds","utcDate","normalizeDates","dates","normalize","startOfDay","differenceInCalendarDays","laterDate","earlierDate","laterDate_","earlierDate_","laterStartOfDay","earlierStartOfDay","laterTimestamp","earlierTimestamp","startOfISOWeekYear","fourthOfJanuary","isDate","isValid","startOfYear","date_","formatDistanceLocale","formatDistance","token","count","tokenValue","buildFormatLongFn","dateFormats","timeFormats","dateTimeFormats","formatLong","formatRelativeLocale","formatRelative","_baseDate","_options","buildLocalizeFn","valuesArray","defaultWidth","eraValues","quarterValues","monthValues","dayValues","dayPeriodValues","formattingDayPeriodValues","ordinalNumber","dirtyNumber","number","rem100","localize","quarter","buildMatchFn","matchPattern","matchResult","matchedString","parsePatterns","findIndex","pattern","findKey","rest","object","predicate","array","buildMatchPatternFn","parseResult","matchOrdinalNumberPattern","parseOrdinalNumberPattern","matchEraPatterns","parseEraPatterns","matchQuarterPatterns","parseQuarterPatterns","matchMonthPatterns","parseMonthPatterns","matchDayPatterns","parseDayPatterns","matchDayPeriodPatterns","parseDayPeriodPatterns","match","enUS","getDayOfYear","getISOWeek","getWeekYear","firstWeekContainsDate","firstWeekOfNextYear","firstWeekOfThisYear","startOfWeekYear","firstWeek","getWeek","addLeadingZeros","targetLength","sign","output","lightFormatters","signedYear","month","dayPeriodEnumValue","numberOfDigits","milliseconds","fractionalSeconds","dayPeriodEnum","formatters","era","signedWeekYear","weekYear","twoDigitYear","isoWeekYear","week","isoWeek","dayOfYear","dayOfWeek","localDayOfWeek","isoDayOfWeek","hours","_localize","timezoneOffset","formatTimezoneWithOptionalMinutes","formatTimezone","formatTimezoneShort","timestamp","offset","delimiter","absOffset","minutes","dateLongFormatter","timeLongFormatter","dateTimeLongFormatter","datePattern","timePattern","dateTimeFormat","longFormatters","dayOfYearTokenRE","weekYearTokenRE","throwTokens","isProtectedDayOfYearToken","isProtectedWeekYearToken","warnOrThrowProtectedError","format","input","_message","subject","formattingTokensRegExp","longFormattingTokensRegExp","escapedStringRegExp","doubleQuoteRegExp","unescapedLatinCharacterRegExp","formatStr","locale","defaultLocale","originalDate","substring","firstCharacter","longFormatter","cleanEscapedString","formatterOptions","formatter","matched","tzTokenizeDate","timeZone","dtf","getDateTimeFormat","partsOffset","hackyOffset","typeToPos","formatted","filled","pos","error","parsed","dtfCache","testDateFormatted","hourCycleSupported","newDateUTC","fullYear","hour","minute","second","millisecond","MILLISECONDS_IN_HOUR","MILLISECONDS_IN_MINUTE","patterns","tzParseTimezone","timezoneString","isUtcDate","absoluteOffset","validateTimezone","isValidTimezoneIANAString","toUtcDate","calcOffset","fixOffset","tokens","asUTC","asTS","over","utcGuess","o2","o3","validIANATimezoneCache","timeZoneString","tzPattern","DEFAULT_ADDITIONAL_DIGITS","additionalDigits","dateStrings","splitDateString","restDateString","parseYear","parseDate","time","parseTime","dateString","timeString","patternYYY","patternYYYYY","yearString","centuryString","validateDate","validateDayOfYearDate","validateWeekDate","dayOfISOWeekYear","validateTime","seconds","fourthOfJanuaryDay","DAYS_IN_MONTH","DAYS_IN_MONTH_LEAP_YEAR","isLeapYearIndex","isLeapYear","toZonedTime","offsetMilliseconds","resultDate","parseAndValidateISO","utcIso","getZonedDate","formatMonth","short","zonedDate","getDateInTimezone","formInputSizes","iconSizes","badgeSizes","badgeSizeLegacyMap","buttonSizes","buttonIconSizes","variant","tone","textColor","bgColor","showDot","pill","shape","large","resolvedSize","legacyMapped","sizeClasses","baseSize","shapeClasses","normalizedVariant","WHITE_FG","MINIMAL_FOREGROUND_OVERRIDES","variantClasses","base","stripped","override","customStyle","styles","div","root_1","span","$$render","consequent","$0","src","alt","fallback","fill","resolvedSrc","handleError","img","img_1","img_2","node_1","div_1","root_2","consequent_1","alternate","focusTrap","FOCUSABLE_SELECTORS","enabled","returnFocusTo","previouslyFocused","getFocusableElements","el","isVisible","element","handleKeydown","event","focusableElements","firstElement","lastElement","activate","deactivate","focusTarget","newOptions","newEnabled","defaultLabels","userLabels","labels","sizeClass","colorClass","fragment","text","VIBRATION_PATTERNS","triggerHaptic","tapticStyle","getHapticForButtonVariant","isSuccess","disabled","success","successText","active","href","type","haptic","loading","isLoadable","prevSuccess","variantMap","resolvedVariant","mapped","effectiveDisabled","isIconOnly","iconBoxSizes","iconBoxClass","activeClasses","disabledClasses","disabledTransparentClasses","transparentVariants","variantClass","isLeftAligned","hasTrailing","roundedClass","handleClick","hapticStyle","buttonClasses","a","root_3","span_1","Spinner","$$anchor","consequent_2","consequent_4","consequent_5","span_2","consequent_7","consequent_8","consequent_9","consequent_10","consequent_6","consequent_11","consequent_12","button","root_6","span_3","span_4","consequent_15","consequent_16","consequent_18","consequent_19","span_5","consequent_21","consequent_22","consequent_23","consequent_24","consequent_20","alternate_1","consequent_25","consequent_26","span_6","root_5","CheckOutline","node_24","span_7","root_4","consequent_27","consequent_28","classes_1","consequent_13","alternate_2","consequent_3","node_6","node_12","Button","ButtonLegacy","Root","Group","roundCurrency","formatCentsAsCurrency","cents","dollars","signed","intlOptions","formatCurrency","currencyOrOptions","formatOptions","formatDate","merged","formatDateForAPI","p","formatDateTime","formatDateRaw","formatTime","formatFullName","firstName","lastName","first","last","formatCreditCardNumber","formatPhoneNumber","cleanedValue","formattedValue","normalizeChargeType","required","optional","icon","buttonIcon","buttonText","maxlength","minlength","placeholder","id","name","textareaSize","errorText","helperText","helperIcon","hintText","hintIcon","contentFloat","readonly","controlled","onButtonClick","onbuttonclick","autocomplete","autofocus","showPasswordToggle","animateFocus","statusText","statusType","buttonDisabled","inputmode","instantSearch","debounceMs","minSearchChars","showClearButton","restProps","rest_excludes","resolvedOnButtonClick","inputValue","inputElement","debounceTimer","computedInputmode","getInputmodeFromType","autocompleteCast","inputType","checkForAutofill","isPasswordVisible","hasError","shouldAnimate","togglePasswordVisibility","handleInput","target","rawInput","sanitized","urlPattern","urlMatch","clearInput","handleSearchKeyDown","onDestroy","handleBlur","handleFocus","getContentFloatClass","getTextareaSizeClass","handleButtonClick","root_15","label_1","text_2","div_2","textarea","$1","div_3","$$value","EyeSlashOutline","EyeOutline","div_4","root_11","div_5","input_1","button_1","CloseCircleOutline","node_9","button_2","root_9","root_7","root_8","root_10","div_6","root_12","ExclamationCircleOutline","node_14","div_7","root_14","root_13","consequent_14","node_15","portal","newTarget","MODAL_PANEL_VISIBILITY","setModalPanelVisibility","visibility","setContext","getModalContext","setModalContext","createContext","applyInertBackground","dialogNode","touched","sibling","prevInert","prevAriaHidden","uid","open","persistent","role","dirty","effectiveOncancel","titleSeq","descSeq","nextTitleId","nextDescriptionId","titleRegs","SvelteMap","descriptionRegs","registerTitle","reg","unregisterTitle","registerDescription","unregisterDescription","isDesktop","mq","sync","visibleId","regs","resolvedLabelledby","resolvedDescribedby","dialogEl","contentEl","scrollY","prevOpen","showDiscard","resolvedDiscardLabels","resetModal","requestClose","scrollbarWidth","h2","node_3","node_4","text_3","$$node","$$action_arg","text_1","ctx","modalSizeClass","desktopVisibility","ModalPanelScope","gapScale","gapMap","cols","gap","minWidth","as","colsMap","gridStyle","$$element","lazyOnce","loader","promise","run","err","title","description","subtext","imageSrc","iconType","iconSize","displayTitle","displaySubtext","IconComponent","IconComponent_1","h3","labelled","$$sanitized_props","attributes","$$restProps","title_1","EVENT_CARD_DENSITY","_eventCardSeq","nextEventCardId","layout","density","imageUrl","placeholderImage","dateLabel","badge","pills","showDescription","hideDate","titleId","allowDescription","allowDate","onPillClick","onCardClick","article","BlurBackdropImage","header","Badge","node_2","today","todayLocalMonth","todayLocalYear","currentYear","currentMonth","handleNext","handlePrev","handleToday","disablePastNavigation","isAtCurrentMonth","canGoPrev","prevPressed","nextPressed","todayPressed","handlePrevClick","handleNextClick","handleTodayClick","ChevronLeftOutline","ChevronRightOutline","classes_2","SPACES_BASE_URL_ORIGIN","SPACES_BASE_URL_CDN","resolveImageUrl","cdn","normalizedPath","getEventImageUrl","SALES_CHANNEL","TICKET_VISIBILITY","LOW_STOCK_THRESHOLD","ticketRemaining","ticket","ticketTotal","remaining","calculateTicketStatus","now","startRaw","endRaw","salesBegin","salesEnd","total","filterPublicTickets","tickets","filtered","calculateScarcity","totalRemaining","totalCapacity","findLowestPrice","prices","eventTickets","isHiddenTicketPurchasable","eventHasPurchasableHiddenTickets","getDefaultTimezone","tz","generateSlug","parseEntityParam","dashIndex","buildEventHref","slug","WidgetUrlManager","currentKey","hash","yearMonth","url","toNum","v","idSet","arr","matchesNumericFilter","filterValue","operator","venueLocalDay","iso","fallbackTz","zone","venueLocalWeekday","weekendWindow","todayDay","dow","daysUntilFri","friday","sunday","fmt","applyWidgetFilters","events","filters","skipped","wantsEvents","wantsSeries","wantsCollections","extraIds","collectionsResolvable","eventIds","seriesIds","collectionIds","c","venues","needle","win","end","dimensions","wanted","spec","OPERATORS","YMD","NUMERIC","isIdLike","idArray","weekdayArray","intArray","ymd","numericFilter","dateRange","bool","freshDefaults","parseFilterValues","num","salesPercent","sold","avail","isSoldOut","idList","asFilterable","filterWidgetEvents","kept","skippedDimensions","w","MICDROP_MESSAGE_SOURCE","isConcreteOrigin","origin","isEmbeddedInIframe","postResize","postNavigation","postCheckoutComplete","payload","targetOrigin","observeHeight","onHeight","measureHeight","measureFn","measure","h","ro","onLoad","listenForHostNavigation","handler","onMessage","data","groupEventsBySeries","seriesDateMap","seriesId","instances","b","SCARCITY_LOW_PCT","STATUS_PRIORITY","normalizeStatus","status","isScarcityEvent","getBrowseStatus","eventEnd","isEventUnavailable","browseStatus","getSeriesBrowseStatus","statuses","bookable","badgeVariant","filterTodayAndFuture","todayStr","DEFAULT_LOCALE","setDefaultLocale","parseISO","formatInTz","formatEventTime","formatTimeRange","startUtc","endUtc","getDateParts","formatBrowseDate","formatFullDate","formatFullDateCompact","formatDoorsTime","doorsOpenTime","LOW_PCT","scarcityBadge","toEventCardProps","grouped","pillEvents","soldOut","PLACEHOLDER_IMAGE","currentevents","viewYear","viewMonth","mm","dd","monthLabel","weekdayLabels","shortFmt","narrowFmt","out","buildCells","eventsIdx","daysInMo","firstWk","prevMo","prevYr","daysInPrev","dateStr","dayEvents","nextMo","nextYr","buildVisibleCells","monthCells","weekIsPastEmpty","allEventsByDate","map","cells","prevCells","nextCells","visibleCells","prevVisibleCells","nextVisibleCells","SWIPE_THRESHOLD","VELOCITY_THRESHOLD","DRAG_RESISTANCE","touchStartX","touchStartY","lastTouchX","lastTouchTime","velocityX","isSwiping","swipeOffset","isSnapping","isAnimating","commitTimeoutId","gridWrapperDesktop","gridWrapperMobile","hostWidth","runMonthSlide","direction","commit","containerWidth","animateMonthTransition","onComplete","handleTouchStart","handleTouchMove","curX","curY","diffX","diffY","dt","handleTouchEnd","overThreshold","flickedHard","selectedDate","focusedDate","handleGridKeydown","idx","cell","nextIdx","todayInView","firstEvent","firstDay","future","selectedEvents","monthPageDesktop","pageCells","ariaLabel","compressed","$$item","g","card","EventCard","div_8","monthPageMini","div_9","hasEvents","isSelected","$$args","div_10","div_11","div_12","div_13","node_5","div_14","Grid","li","classes_3","styles_1","viewOptions","selectedView","onViewChange","onsearch","dropdownOpen","dropdownRef","toggleDropdown","selectView","option","handleClickOutside","selectedLabel","opt","Input","Search","fragment_1","ChevronDown","mapCalendarStatusToBrowseStatus","adaptToBrowseEvents","calendarEvents","showDateColumn","filterFutureOnly","formatRail","groupedByDate","visible","byDate","items","ul","initialCount","loadMoreCount","displayedCount","loadMoreTrigger","observer","futureEvents","groupedEvents","displayedGroups","hasMore","loadMore","onMount","section","scrollContainer","canScrollLeft","canScrollRight","showArrows","updateScrollState","scrollLeft","scrollWidth","clientWidth","scrollByCard","firstCard","cardWidth","heroGrouped","boxes","hoursInDay","root_20","_","div_15","div_16","div_17","div_18","div_19","div_20","div_21","div_22","div_23","div_24","div_25","div_26","div_27","div_28","root_16","div_29","div_30","div_31","div_32","root_19","div_33","div_34","root_17","div_35","root_18","DEFAULT_CONFIG","globalConfig","configureApi","getApiConfig","getPublicBaseUrl","getOrdersV2Url","sleep","ms","resolve","fetchWithRetry","init","cfg","method","maxAttempts","lastError","attempt","controller","timeoutId","callerSignal","onCallerAbort","response","apiGet","endpoint","apiRequest","apiPost","body","apiDelete","errorData","errorMessage","simpleFetch","createPaymentIntent","cartId","quantities","donationAmounts","apiResult","updateCartQuantities","numericQuantities","numericDonations","validatePaymentIntent","extendCheckoutSession","orderUuid","getSessionStatus","ORDERS_V2_PUBLIC","validatePromoCode","eventId","encodedCode","hasPromoCodes","applyPromoCode","_eventDetailsInflight","fetchEventDetails","customFetch","password","inflight","fetchEventTickets","getMonthEvents","venueId","getOrgMonthEvents","orgId","fetchSeriesOccurrences","eventSeriesId","resolvePublicEntity","qs","fetchPublicCollection","collectionId","checkEventPassword","parseGiftCardApplication","giftCardAmountDollars","residualDollars","fullyCovered","requiresStripe","applyGiftCard","removeGiftCard","completeGiftCardPayment","customerDetails","WAITLIST_ERROR_MESSAGES","joinWaitlist","email","phone","smsOptIn","CDN_BASE_URL","getCDNImageUrl","apiEvent","rawUrl","deriveEventCtaState","explicitState","eventDate","eventTime","availableCount","sum","qty","parseTicket","apiTicket","parseEvent","minPrice","maxPrice","resolveEventImageUrl","scGetEventImageUrl","_formatterCache","_formatterCacheMax","_getFormatter","oldestKey","formatInTimezone","isoString","formatEventTimeRange","startTime","endTime","getEventDateParts","getDatePartsNew","TransformMode","transformEvent","mode","getEmptyBrowseEvent","getEmptyDetailEvent","domain","transformBrowseEvent","transformDetailEvent","startDate","scarcity","publicTickets","allTickets","dateParts","formatDateCustom","scFormatDate","transformEventData","assign","source","defaultConverter","converter","defaultAttributes","set","stringifiedAttributes","attributeName","get","cookies","jar","found","api","setCookie","Cookies","getCookie","removeCookie","loadCheckoutStateFromCookies","eventID","promocode","promoDiscountAmount","stored","persistCheckoutState","clearCheckoutCookies","minimalTickets","state","ensureOrderIdExists","existingOrderId","newOrderId","getClientIP","getVenueDetails","venueID","initiateOrder","cartData","ip","restCartData","numericDonationAmounts","orderPayload","isInventoryError","getOrder","orderId","trackUTMSource","utmSource","onRetry","onClose","resolvedTitle","resolvedMessage","resolvedRetryText","resolvedCancelText","resolvedRetryingLabel","ModalRoot","ModalOverlay","ModalPanel","ModalBody","WifiOff","ModalFooter","es","LOCALES","en","resolveLocale","tag","lower","detectLocale","getLabelsForLocale","getInitialUrl","pageStore","writable","syncPageStore","gotoUrl","page","urlManager","savedScrollY","rootEl","cleanupHeightObserver","cleanupHostNavListener","useLegacy","LegacyGalleryView","LegacyGroupedListView","LegacyCarouselView","LegacyFeaturedView","prefetchedMonths","monthEventsCache","loadingMonths","paginationInfo","navigateTo","showViewOptions","showMonthSwitcher","organizationId","featuredItem","seoController","filterValues","urlMode","inlineEntityViews","resolvedLocale","isLoading","hasLoaded","isMounted","pendingDeepLink","widgetView","activeEntity","successPayload","entityResolving","entityNav","EventPageComp","SeriesPageComp","CollectionViewComp","CheckoutComp","SuccessComp","showNetworkError","networkErrorRetrying","failedMonthKey","SKELETON_DELAY_MS","showDelayedSkeleton","skeletonTimeout","shouldShowSkeleton","showContent","calendarRef","VIEW","VIEW_NAMES","viewFromUrl","viewParam","$page","viewIndex","publicView","internalMonth","internalYear","defaultHandleNext","defaultHandlePrev","defaultHandleToday","targetMonth","targetYear","animatedHandleToday","currMonth","$month","$internalMonth","currYear","$year","$internalYear","monthDiff","effectiveHandleNext","effectiveHandlePrev","animatedHandleNext","animatedHandlePrev","DEFAULT_VIEW_OPTIONS","PublicOptions","selectOption","searchQuery","filteredEvents","loadMonthEvents","isInitial","monthKey","apiMonth","resultAny","transformedEvents","preloadAdjacentMonths","currentMo","currentYr","cb","prevMonth","prevYear","nextMonth","nextYear","resolveAndOpenEntity","closeEntityToCalendar","targetId","allEvents","ev","eventSlug","yearStr","monthStr","initialState","safeId","initialMonth","initialYear","allCachedEvents","hasNoEvents","cachedEvents","passedEvents","seen","deduped","getEventsForMonth","eventsList","prefetchImagesForMonth","imageUrls","prefetchAdjacentMonths","venue","eventsForSeo","handleSearch","query","browseEvents","$filteredEvents","handleNetworkRetry","handleNetworkErrorClose","notifyEntitySelectedSeo","seoVenue","loadEntityComponent","openEntityInWidget","initialEventData","pushHash","resolved","handleInWidgetCart","eventPayload","handleInWidgetSuccess","handleCheckoutBack","handleSeriesOccurrence","handleCollectionEvent","handleEventClick","eventData","seoEvent","handleBrowseEventClick","browseEvent","$publicView","ArrowLeft","SkeletonLoader","node_7","EventPageComp_1","occId","occSlug","SeriesPageComp_1","CollectionViewComp_1","CheckoutComp_1","node_18","alternate_3","SuccessComp_1","node_21","alternate_4","h1","fragment_13","CalendarToolbar","nav","MonthSwitcher","main","node_23","node_26","text_4","EmptyState","Calendar","LegacyGroupedListView_1","ListView","alternate_5","LegacyGalleryView_1","GalleryView","alternate_6","LegacyCarouselView_1","CarouselView","alternate_7","LegacyFeaturedView_1","FeaturedView","alternate_8","consequent_17","alternate_9","PoweredByMicdrop","node_35","NetworkErrorModal","node_36","formatDateTimeWithOffset","offsetFormatOptions","tzOffset","mins","parseAddressToPostal","addressStr","stateZipMatch","buildPostalAddress","getEventStatus","rawStatus","getTicketAvailability","buildOffers","isPublic","lowPrice","highPrice","buildPerformers","performers","confirmed","isConfirmed","isNotHidden","profile","hasName","buildEventJsonLd","eventUrl","organizer","postalAddress","location","endDate","offers","org","mapSeriesTicketAvailability","buildSeriesOccurrenceOffers","occurrenceStatus","activeTickets","buildSeriesJsonLd","series","baseEventUrl","address","subEvents","occ","subEvent","buildCollectionJsonLd","collection","itemListElement","listItem","_HostSeoController","canonical","ogTitle","ogDescription","ogImage","ogUrl","ogType","metaDescription","script","originalContent","venueTz","itemList","jsonLd","entityName","entityDescription","entityImage","entityUrl","HostSeoController","calendarIcon","listIcon","gridIcon","lightTheme","darkTheme","highContrastTheme","themes","applyTheme","container","cssVarMap","cssVar","generateThemeCSS","lines","embedConfig","setEmbedConfig","partial","getEmbedConfig","hexToHslParts","hex","max","min","l","hexToHSLString","schemeColorsToCSSVars","colors","hsl","srcHex","applySchemeColors","vars","MicDropCalendar","fetchWidgetConfig","widgetId","res","loadInit","VenueCalendar$1","ATTR_MAP","readOptions","attr","initVenueCalendar","unmount","_name","oldValue","newValue","VC_VERSION","_errorReporter","configureVenueCalendar","reporterError","reportError","_lazyCache","_loadOnce","_load","_resolveTarget","view","onEventClick","targetElement","defaultMonth","defaultYear","props","mount","CalendarContainer","parseDeepLink","autoMount","mountCalendars","containers","deepLink","injectSeo","instance","EventPage","Checkout","Success","CartView","ViewTicketsEmbed","CheckoutMain","SeriesPage","CollectionView","initEventPage","rawEvent","onNavigateBack","onNavigateToCart","onBuyTickets","Component","initCheckoutView","availableTickets","onSuccess","onNavigateToSuccess","stripePublishableKey","component","handleSuccess","initCheckout","initSuccessView","initSuccess","initCartView","onNavigateToCheckout","initCart","VenueCalendar"],"mappings":";;;;;;;;AAGA,MAAMA,KAAe,CAACC,GAAQC,MAAW;AAEvC,QAAMC,IAAgB,IAAI,MAAMF,EAAO,SAASC,EAAO,MAAM;AAC7D,WAASE,IAAI,GAAGA,IAAIH,EAAO,QAAQG;AACjC,IAAAD,EAAcC,CAAC,IAAIH,EAAOG,CAAC;AAE7B,WAASA,IAAI,GAAGA,IAAIF,EAAO,QAAQE;AACjC,IAAAD,EAAcF,EAAO,SAASG,CAAC,IAAIF,EAAOE,CAAC;AAE7C,SAAOD;AACT,GAGME,KAA6B,CAACC,GAAcC,OAAe;AAAA,EAC/D,cAAAD;AAAA,EACA,WAAAC;AACF,IAEMC,KAAwB,CAACC,IAAW,oBAAI,IAAG,GAAIC,IAAa,MAAMJ,OAAkB;AAAA,EACxF,UAAAG;AAAA,EACA,YAAAC;AAAA,EACA,cAAAJ;AACF,IACMK,KAAuB,KACvBC,KAAkB,CAAA,GAElBC,KAA4B,eAC5BC,KAAwB,CAAAC,MAAU;AACtC,QAAMC,IAAWC,GAAeF,CAAM,GAChC;AAAA,IACJ,wBAAAG;AAAA,IACA,gCAAAC;AAAA,EACJ,IAAMJ;AA2BJ,SAAO;AAAA,IACL,iBA3BsB,CAAAK,MAAa;AACnC,UAAIA,EAAU,WAAW,GAAG,KAAKA,EAAU,SAAS,GAAG;AACrD,eAAOC,GAA+BD,CAAS;AAEjD,YAAME,IAAaF,EAAU,MAAMT,EAAoB,GAEjDY,IAAaD,EAAW,CAAC,MAAM,MAAMA,EAAW,SAAS,IAAI,IAAI;AACvE,aAAOE,GAAkBF,GAAYC,GAAYP,CAAQ;AAAA,IAC3D;AAAA,IAoBE,6BAnBkC,CAACV,GAAcmB,MAAuB;AACxE,UAAIA,GAAoB;AACtB,cAAMC,IAAoBP,EAA+Bb,CAAY,GAC/DqB,IAAgBT,EAAuBZ,CAAY;AACzD,eAAIoB,IACEC,IAEK3B,GAAa2B,GAAeD,CAAiB,IAG/CA,IAGFC,KAAiBf;AAAA,MAC1B;AACA,aAAOM,EAAuBZ,CAAY,KAAKM;AAAA,IACjD;AAAA,EAIF;AACA,GACMY,KAAoB,CAACF,GAAYC,GAAYK,MAAoB;AAErE,MADyBN,EAAW,SAASC,MACpB;AACvB,WAAOK,EAAgB;AAEzB,QAAMC,IAAmBP,EAAWC,CAAU,GACxCO,IAAsBF,EAAgB,SAAS,IAAIC,CAAgB;AACzE,MAAIC,GAAqB;AACvB,UAAMC,IAASP,GAAkBF,GAAYC,IAAa,GAAGO,CAAmB;AAChF,QAAIC,EAAQ,QAAOA;AAAA,EACrB;AACA,QAAMrB,IAAakB,EAAgB;AACnC,MAAIlB,MAAe;AACjB;AAGF,QAAMsB,IAAYT,MAAe,IAAID,EAAW,KAAKX,EAAoB,IAAIW,EAAW,MAAMC,CAAU,EAAE,KAAKZ,EAAoB,GAC7HsB,IAAmBvB,EAAW;AACpC,WAASN,IAAI,GAAGA,IAAI6B,GAAkB7B,KAAK;AACzC,UAAM8B,IAAexB,EAAWN,CAAC;AACjC,QAAI8B,EAAa,UAAUF,CAAS;AAClC,aAAOE,EAAa;AAAA,EAExB;AAEF,GAMMb,KAAiC,CAAAD,MAAaA,EAAU,MAAM,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM,KAAK,UAAa,MAAM;AAClH,QAAMe,IAAUf,EAAU,MAAM,GAAG,EAAE,GAC/BgB,IAAaD,EAAQ,QAAQ,GAAG,GAChCE,IAAWF,EAAQ,MAAM,GAAGC,CAAU;AAC5C,SAAOC,IAAWxB,KAA4BwB,IAAW;AAC3D,GAAC,GAIKpB,KAAiB,CAAAF,MAAU;AAC/B,QAAM;AAAA,IACJ,OAAAuB;AAAA,IACA,aAAAC;AAAA,EACJ,IAAMxB;AACJ,SAAOyB,GAAmBD,GAAaD,CAAK;AAC9C,GAEME,KAAqB,CAACD,GAAaD,MAAU;AACjD,QAAMtB,IAAWR,GAAqB;AACtC,aAAWF,KAAgBiC,GAAa;AACtC,UAAME,IAAQF,EAAYjC,CAAY;AACtC,IAAAoC,GAA0BD,GAAOzB,GAAUV,GAAcgC,CAAK;AAAA,EAChE;AACA,SAAOtB;AACT,GACM0B,KAA4B,CAACC,GAAYf,GAAiBtB,GAAcgC,MAAU;AACtF,QAAMM,IAAMD,EAAW;AACvB,WAASvC,IAAI,GAAGA,IAAIwC,GAAKxC,KAAK;AAC5B,UAAMyC,IAAkBF,EAAWvC,CAAC;AACpC,IAAA0C,GAAuBD,GAAiBjB,GAAiBtB,GAAcgC,CAAK;AAAA,EAC9E;AACF,GAEMQ,KAAyB,CAACD,GAAiBjB,GAAiBtB,GAAcgC,MAAU;AACxF,MAAI,OAAOO,KAAoB,UAAU;AACvC,IAAAE,GAAwBF,GAAiBjB,GAAiBtB,CAAY;AACtE;AAAA,EACF;AACA,MAAI,OAAOuC,KAAoB,YAAY;AACzC,IAAAG,GAA0BH,GAAiBjB,GAAiBtB,GAAcgC,CAAK;AAC/E;AAAA,EACF;AACA,EAAAW,GAAwBJ,GAAiBjB,GAAiBtB,GAAcgC,CAAK;AAC/E,GACMS,KAA0B,CAACF,GAAiBjB,GAAiBtB,MAAiB;AAClF,QAAM4C,IAAwBL,MAAoB,KAAKjB,IAAkBuB,GAAQvB,GAAiBiB,CAAe;AACjH,EAAAK,EAAsB,eAAe5C;AACvC,GACM0C,KAA4B,CAACH,GAAiBjB,GAAiBtB,GAAcgC,MAAU;AAC3F,MAAIc,GAAcP,CAAe,GAAG;AAClC,IAAAH,GAA0BG,EAAgBP,CAAK,GAAGV,GAAiBtB,GAAcgC,CAAK;AACtF;AAAA,EACF;AACA,EAAIV,EAAgB,eAAe,SACjCA,EAAgB,aAAa,CAAA,IAE/BA,EAAgB,WAAW,KAAKvB,GAA2BC,GAAcuC,CAAe,CAAC;AAC3F,GACMI,KAA0B,CAACJ,GAAiBjB,GAAiBtB,GAAcgC,MAAU;AACzF,QAAMe,IAAU,OAAO,QAAQR,CAAe,GACxCD,IAAMS,EAAQ;AACpB,WAASjD,IAAI,GAAGA,IAAIwC,GAAKxC,KAAK;AAC5B,UAAM,CAACkD,GAAKC,CAAK,IAAIF,EAAQjD,CAAC;AAC9B,IAAAsC,GAA0Ba,GAAOJ,GAAQvB,GAAiB0B,CAAG,GAAGhD,GAAcgC,CAAK;AAAA,EACrF;AACF,GACMa,KAAU,CAACvB,GAAiB4B,MAAS;AACzC,MAAIC,IAAU7B;AACd,QAAM8B,IAAQF,EAAK,MAAM7C,EAAoB,GACvCiC,IAAMc,EAAM;AAClB,WAAStD,IAAI,GAAGA,IAAIwC,GAAKxC,KAAK;AAC5B,UAAMuD,IAAOD,EAAMtD,CAAC;AACpB,QAAIwD,IAAOH,EAAQ,SAAS,IAAIE,CAAI;AACpC,IAAKC,MACHA,IAAOpD,GAAqB,GAC5BiD,EAAQ,SAAS,IAAIE,GAAMC,CAAI,IAEjCH,IAAUG;AAAA,EACZ;AACA,SAAOH;AACT,GAEML,KAAgB,CAAAS,MAAQ,mBAAmBA,KAAQA,EAAK,kBAAkB,IAG1EC,KAAiB,CAAAC,MAAgB;AACrC,MAAIA,IAAe;AACjB,WAAO;AAAA,MACL,KAAK,MAAA;AAAA;AAAA,MACL,KAAK,MAAM;AAAA,MAAC;AAAA,IAClB;AAEE,MAAIC,IAAY,GACZC,IAAQ,uBAAO,OAAO,IAAI,GAC1BC,IAAgB,uBAAO,OAAO,IAAI;AACtC,QAAMC,IAAS,CAACb,GAAKC,MAAU;AAC7B,IAAAU,EAAMX,CAAG,IAAIC,GACbS,KACIA,IAAYD,MACdC,IAAY,GACZE,IAAgBD,GAChBA,IAAQ,uBAAO,OAAO,IAAI;AAAA,EAE9B;AACA,SAAO;AAAA,IACL,IAAIX,GAAK;AACP,UAAIC,IAAQU,EAAMX,CAAG;AACrB,UAAIC,MAAU;AACZ,eAAOA;AAET,WAAKA,IAAQW,EAAcZ,CAAG,OAAO;AACnC,eAAAa,EAAOb,GAAKC,CAAK,GACVA;AAAA,IAEX;AAAA,IACA,IAAID,GAAKC,GAAO;AACd,MAAID,KAAOW,IACTA,EAAMX,CAAG,IAAIC,IAEbY,EAAOb,GAAKC,CAAK;AAAA,IAErB;AAAA,EACJ;AACA,GACMa,KAAqB,KACrBC,KAAqB,KACrBC,KAAkB,CAAA,GAElBC,KAAqB,CAACC,GAAWC,GAAsBC,GAAeC,GAA8BC,OAAgB;AAAA,EACxH,WAAAJ;AAAA,EACA,sBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,8BAAAC;AAAA,EACA,YAAAC;AACF,IACMC,KAAuB,CAAA9D,MAAU;AACrC,QAAM;AAAA,IACJ,QAAA+D;AAAA,IACA,4BAAAC;AAAA,EACJ,IAAMhE;AAOJ,MAAIiE,IAAiB,CAAA5D,MAAa;AAEhC,UAAMoD,IAAY,CAAA;AAClB,QAAIS,IAAe,GACfC,IAAa,GACbC,IAAgB,GAChBC;AACJ,UAAMxC,IAAMxB,EAAU;AACtB,aAASiE,IAAQ,GAAGA,IAAQzC,GAAKyC,KAAS;AACxC,YAAMC,IAAmBlE,EAAUiE,CAAK;AACxC,UAAIJ,MAAiB,KAAKC,MAAe,GAAG;AAC1C,YAAII,MAAqBjB,IAAoB;AAC3C,UAAAG,EAAU,KAAKpD,EAAU,MAAM+D,GAAeE,CAAK,CAAC,GACpDF,IAAgBE,IAAQ;AACxB;AAAA,QACF;AACA,YAAIC,MAAqB,KAAK;AAC5B,UAAAF,IAA0BC;AAC1B;AAAA,QACF;AAAA,MACF;AACA,MAAIC,MAAqB,MAAKL,MAAwBK,MAAqB,MAAKL,MAAwBK,MAAqB,MAAKJ,MAAsBI,MAAqB,OAAKJ;AAAA,IACpL;AACA,UAAMK,IAAqCf,EAAU,WAAW,IAAIpD,IAAYA,EAAU,MAAM+D,CAAa;AAE7G,QAAIT,IAAgBa,GAChBd,IAAuB;AAC3B,IAAIc,EAAmC,SAASnB,EAAkB,KAChEM,IAAgBa,EAAmC,MAAM,GAAG,EAAE,GAC9Dd,IAAuB;AAAA;AAAA;AAAA;AAAA;AAAA,MAMzBc,EAAmC,WAAWnB,EAAkB,MAC9DM,IAAgBa,EAAmC,MAAM,CAAC,GAC1Dd,IAAuB;AAAA;AAEzB,UAAME,IAA+BS,KAA2BA,IAA0BD,IAAgBC,IAA0BD,IAAgB;AACpJ,WAAOZ,GAAmBC,GAAWC,GAAsBC,GAAeC,CAA4B;AAAA,EACxG;AACA,MAAIG,GAAQ;AACV,UAAMU,IAAaV,IAAST,IACtBoB,IAAyBT;AAC/B,IAAAA,IAAiB,CAAA5D,MAAaA,EAAU,WAAWoE,CAAU,IAAIC,EAAuBrE,EAAU,MAAMoE,EAAW,MAAM,CAAC,IAAIjB,GAAmBD,IAAiB,IAAOlD,GAAW,QAAW,EAAI;AAAA,EACrM;AACA,MAAI2D,GAA4B;AAC9B,UAAMU,IAAyBT;AAC/B,IAAAA,IAAiB,CAAA5D,MAAa2D,EAA2B;AAAA,MACvD,WAAA3D;AAAA,MACA,gBAAgBqE;AAAA,IACtB,CAAK;AAAA,EACH;AACA,SAAOT;AACT,GAOMU,KAAsB,CAAA3E,MAAU;AAEpC,QAAM4E,IAAkB,oBAAI,IAAG;AAE/B,SAAA5E,EAAO,wBAAwB,QAAQ,CAAC6E,GAAKP,MAAU;AACrD,IAAAM,EAAgB,IAAIC,GAAK,MAAUP,CAAK;AAAA,EAC1C,CAAC,GACM,CAAAb,MAAa;AAClB,UAAMzC,IAAS,CAAA;AACf,QAAI8D,IAAiB,CAAA;AAErB,aAASzF,IAAI,GAAGA,IAAIoE,EAAU,QAAQpE,KAAK;AACzC,YAAM0F,IAAWtB,EAAUpE,CAAC,GAEtB2F,IAAcD,EAAS,CAAC,MAAM,KAC9BE,IAAmBL,EAAgB,IAAIG,CAAQ;AACrD,MAAIC,KAAeC,KAEbH,EAAe,SAAS,MAC1BA,EAAe,KAAI,GACnB9D,EAAO,KAAK,GAAG8D,CAAc,GAC7BA,IAAiB,CAAA,IAEnB9D,EAAO,KAAK+D,CAAQ,KAGpBD,EAAe,KAAKC,CAAQ;AAAA,IAEhC;AAEA,WAAID,EAAe,SAAS,MAC1BA,EAAe,KAAI,GACnB9D,EAAO,KAAK,GAAG8D,CAAc,IAExB9D;AAAA,EACT;AACF,GACMkE,KAAoB,CAAAlF,OAAW;AAAA,EACnC,OAAO+C,GAAe/C,EAAO,SAAS;AAAA,EACtC,gBAAgB8D,GAAqB9D,CAAM;AAAA,EAC3C,eAAe2E,GAAoB3E,CAAM;AAAA,EACzC,GAAGD,GAAsBC,CAAM;AACjC,IACMmF,KAAsB,OACtBC,KAAiB,CAACC,GAAWC,MAAgB;AACjD,QAAM;AAAA,IACJ,gBAAArB;AAAA,IACA,iBAAAsB;AAAA,IACA,6BAAAC;AAAA,IACA,eAAAC;AAAA,EACJ,IAAMH,GAQEI,IAAwB,CAAA,GACxBC,IAAaN,EAAU,KAAI,EAAG,MAAMF,EAAmB;AAC7D,MAAInE,IAAS;AACb,WAASsD,IAAQqB,EAAW,SAAS,GAAGrB,KAAS,GAAGA,KAAS,GAAG;AAC9D,UAAMsB,IAAoBD,EAAWrB,CAAK,GACpC;AAAA,MACJ,YAAAT;AAAA,MACA,WAAAJ;AAAA,MACA,sBAAAC;AAAA,MACA,eAAAC;AAAA,MACA,8BAAAC;AAAA,IACN,IAAQK,EAAe2B,CAAiB;AACpC,QAAI/B,GAAY;AACd,MAAA7C,IAAS4E,KAAqB5E,EAAO,SAAS,IAAI,MAAMA,IAASA;AACjE;AAAA,IACF;AACA,QAAIN,IAAqB,CAAC,CAACkD,GACvBrE,IAAegG,EAAgB7E,IAAqBiD,EAAc,UAAU,GAAGC,CAA4B,IAAID,CAAa;AAChI,QAAI,CAACpE,GAAc;AACjB,UAAI,CAACmB,GAAoB;AAEvB,QAAAM,IAAS4E,KAAqB5E,EAAO,SAAS,IAAI,MAAMA,IAASA;AACjE;AAAA,MACF;AAEA,UADAzB,IAAegG,EAAgB5B,CAAa,GACxC,CAACpE,GAAc;AAEjB,QAAAyB,IAAS4E,KAAqB5E,EAAO,SAAS,IAAI,MAAMA,IAASA;AACjE;AAAA,MACF;AACA,MAAAN,IAAqB;AAAA,IACvB;AAEA,UAAMmF,IAAkBpC,EAAU,WAAW,IAAI,KAAKA,EAAU,WAAW,IAAIA,EAAU,CAAC,IAAIgC,EAAchC,CAAS,EAAE,KAAK,GAAG,GACzHqC,IAAapC,IAAuBmC,IAAkBxC,KAAqBwC,GAC3EE,IAAUD,IAAavG;AAC7B,QAAImG,EAAsB,QAAQK,CAAO,IAAI;AAE3C;AAEF,IAAAL,EAAsB,KAAKK,CAAO;AAClC,UAAMC,IAAiBR,EAA4BjG,GAAcmB,CAAkB;AACnF,aAASrB,IAAI,GAAGA,IAAI2G,EAAe,QAAQ,EAAE3G,GAAG;AAC9C,YAAMqC,IAAQsE,EAAe3G,CAAC;AAC9B,MAAAqG,EAAsB,KAAKI,IAAapE,CAAK;AAAA,IAC/C;AAEA,IAAAV,IAAS4E,KAAqB5E,EAAO,SAAS,IAAI,MAAMA,IAASA;AAAA,EACnE;AACA,SAAOA;AACT,GAWMiF,KAAS,IAAIC,MAAe;AAChC,MAAI5B,IAAQ,GACR6B,GACAC,GACAC,IAAS;AACb,SAAO/B,IAAQ4B,EAAW;AACxB,KAAIC,IAAWD,EAAW5B,GAAO,OAC3B8B,IAAgBE,GAAQH,CAAQ,OAClCE,MAAWA,KAAU,MACrBA,KAAUD;AAIhB,SAAOC;AACT,GACMC,KAAU,CAAAC,MAAO;AAErB,MAAI,OAAOA,KAAQ;AACjB,WAAOA;AAET,MAAIH,GACAC,IAAS;AACb,WAASG,IAAI,GAAGA,IAAID,EAAI,QAAQC;AAC9B,IAAID,EAAIC,CAAC,MACHJ,IAAgBE,GAAQC,EAAIC,CAAC,CAAC,OAChCH,MAAWA,KAAU,MACrBA,KAAUD;AAIhB,SAAOC;AACT,GACMI,KAAsB,CAACC,MAAsBC,MAAqB;AACtE,MAAIrB,GACAsB,GACAC,GACAC;AACJ,QAAMC,IAAoB,CAAA1B,MAAa;AACrC,UAAMrF,IAAS2G,EAAiB,OAAO,CAACK,GAAgBC,MAAwBA,EAAoBD,CAAc,GAAGN,GAAmB;AACxI,WAAApB,IAAcJ,GAAkBlF,CAAM,GACtC4G,IAAWtB,EAAY,MAAM,KAC7BuB,IAAWvB,EAAY,MAAM,KAC7BwB,IAAiBI,GACVA,EAAc7B,CAAS;AAAA,EAChC,GACM6B,IAAgB,CAAA7B,MAAa;AACjC,UAAM8B,IAAeP,EAASvB,CAAS;AACvC,QAAI8B;AACF,aAAOA;AAET,UAAMnG,IAASoE,GAAeC,GAAWC,CAAW;AACpD,WAAAuB,EAASxB,GAAWrE,CAAM,GACnBA;AAAA,EACT;AACA,SAAA8F,IAAiBC,GACV,IAAIK,MAASN,EAAeb,GAAO,GAAGmB,CAAI,CAAC;AACpD,GACMC,KAAmB,CAAA,GACnBC,KAAY,CAAA/E,MAAO;AACvB,QAAMgF,IAAc,CAAAhG,MAASA,EAAMgB,CAAG,KAAK8E;AAC3C,SAAAE,EAAY,gBAAgB,IACrBA;AACT,GACMC,KAAsB,+BACtBC,KAAyB,+BACzBC,KAAgB,kCAChBC,KAAkB,oCAClBC,KAAkB,6HAClBC,KAAqB,sDAErBC,KAAc,mEACdC,KAAa,gGACbC,KAAa,CAAAxF,MAASkF,GAAc,KAAKlF,CAAK,GAC9CyF,KAAW,CAAAzF,MAAS,CAAC,CAACA,KAAS,CAAC,OAAO,MAAM,OAAOA,CAAK,CAAC,GAC1D0F,KAAY,CAAA1F,MAAS,CAAC,CAACA,KAAS,OAAO,UAAU,OAAOA,CAAK,CAAC,GAC9D2F,KAAY,CAAA3F,MAASA,EAAM,SAAS,GAAG,KAAKyF,GAASzF,EAAM,MAAM,GAAG,EAAE,CAAC,GACvE4F,KAAe,CAAA5F,MAASmF,GAAgB,KAAKnF,CAAK,GAClD6F,KAAQ,MAAM,IACdC,KAAe,CAAA9F;AAAA;AAAA;AAAA;AAAA,EAIrBoF,GAAgB,KAAKpF,CAAK,KAAK,CAACqF,GAAmB,KAAKrF,CAAK;AAAA,GACvD+F,KAAU,MAAM,IAChBC,KAAW,CAAAhG,MAASsF,GAAY,KAAKtF,CAAK,GAC1CiG,KAAU,CAAAjG,MAASuF,GAAW,KAAKvF,CAAK,GACxCkG,KAAoB,CAAAlG,MAAS,CAACmG,EAAiBnG,CAAK,KAAK,CAACoG,EAAoBpG,CAAK,GACnFqG,KAAkB,CAAArG,MAASsG,GAAoBtG,GAAOuG,IAAaR,EAAO,GAC1EI,IAAmB,CAAAnG,MAASgF,GAAoB,KAAKhF,CAAK,GAC1DwG,KAAoB,CAAAxG,MAASsG,GAAoBtG,GAAOyG,IAAeX,EAAY,GACnFY,KAAoB,CAAA1G,MAASsG,GAAoBtG,GAAO2G,IAAelB,EAAQ,GAC/EmB,KAAoB,CAAA5G,MAASsG,GAAoBtG,GAAO6G,IAAehB,EAAK,GAC5EiB,KAAwB,CAAA9G,MAASsG,GAAoBtG,GAAO+G,IAAmBhB,EAAO,GACtFiB,KAAsB,CAAAhH,MAASsG,GAAoBtG,GAAOiH,IAAiBlB,EAAO,GAClFmB,KAAmB,CAAAlH,MAASsG,GAAoBtG,GAAOmH,IAAclB,EAAO,GAC5EmB,KAAoB,CAAApH,MAASsG,GAAoBtG,GAAOqH,IAAerB,EAAQ,GAC/EI,IAAsB,CAAApG,MAASiF,GAAuB,KAAKjF,CAAK,GAChEsH,KAA4B,CAAAtH,MAASuH,GAAuBvH,GAAOyG,EAAa,GAChFe,KAAgC,CAAAxH,MAASuH,GAAuBvH,GAAO+G,EAAiB,GACxFU,KAA8B,CAAAzH,MAASuH,GAAuBvH,GAAOiH,EAAe,GACpFS,KAA0B,CAAA1H,MAASuH,GAAuBvH,GAAOuG,EAAW,GAC5EoB,KAA2B,CAAA3H,MAASuH,GAAuBvH,GAAOmH,EAAY,GAC9ES,KAA4B,CAAA5H,MAASuH,GAAuBvH,GAAOqH,IAAe,EAAI,GACtFQ,KAA4B,CAAA7H,MAASuH,GAAuBvH,GAAO6G,IAAe,EAAI,GAEtFP,KAAsB,CAACtG,GAAO8H,GAAWC,MAAc;AAC3D,QAAMvJ,IAASwG,GAAoB,KAAKhF,CAAK;AAC7C,SAAIxB,IACEA,EAAO,CAAC,IACHsJ,EAAUtJ,EAAO,CAAC,CAAC,IAErBuJ,EAAUvJ,EAAO,CAAC,CAAC,IAErB;AACT,GACM+I,KAAyB,CAACvH,GAAO8H,GAAWE,IAAqB,OAAU;AAC/E,QAAMxJ,IAASyG,GAAuB,KAAKjF,CAAK;AAChD,SAAIxB,IACEA,EAAO,CAAC,IACHsJ,EAAUtJ,EAAO,CAAC,CAAC,IAErBwJ,IAEF;AACT,GAEMf,KAAkB,CAAAgB,MAASA,MAAU,cAAcA,MAAU,cAC7Dd,KAAe,CAAAc,MAASA,MAAU,WAAWA,MAAU,OACvD1B,KAAc,CAAA0B,MAASA,MAAU,YAAYA,MAAU,UAAUA,MAAU,WAC3ExB,KAAgB,CAAAwB,MAASA,MAAU,UACnCtB,KAAgB,CAAAsB,MAASA,MAAU,UACnClB,KAAoB,CAAAkB,MAASA,MAAU,eACvCpB,KAAgB,CAAAoB,MAASA,MAAU,YAAYA,MAAU,UACzDZ,KAAgB,CAAAY,MAASA,MAAU,UA8BnCC,KAAmB,MAAM;AAM7B,QAAMC,IAAarD,GAAU,OAAO,GAC9BsD,IAAYtD,GAAU,MAAM,GAC5BuD,IAAYvD,GAAU,MAAM,GAC5BwD,IAAkBxD,GAAU,aAAa,GACzCyD,IAAgBzD,GAAU,UAAU,GACpC0D,IAAe1D,GAAU,SAAS,GAClC2D,IAAkB3D,GAAU,YAAY,GACxC4D,IAAiB5D,GAAU,WAAW,GACtC6D,IAAe7D,GAAU,SAAS,GAClC8D,IAAc9D,GAAU,QAAQ,GAChC+D,IAAc/D,GAAU,QAAQ,GAChCgE,IAAmBhE,GAAU,cAAc,GAC3CiE,IAAkBjE,GAAU,aAAa,GACzCkE,IAAkBlE,GAAU,aAAa,GACzCmE,IAAYnE,GAAU,MAAM,GAC5BoE,IAAmBpE,GAAU,aAAa,GAC1CqE,IAAcrE,GAAU,QAAQ,GAChCsE,IAAYtE,GAAU,MAAM,GAC5BuE,IAAevE,GAAU,SAAS,GAQlCwE,IAAa,MAAM,CAAC,QAAQ,SAAS,OAAO,cAAc,QAAQ,QAAQ,SAAS,QAAQ,GAC3FC,IAAgB,MAAM;AAAA,IAAC;AAAA,IAAU;AAAA,IAAO;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAS;AAAA;AAAA,IAEzE;AAAA,IAAY;AAAA;AAAA,IAEZ;AAAA,IAAa;AAAA;AAAA,IAEb;AAAA,IAAgB;AAAA;AAAA,IAEhB;AAAA,EAAa,GACPC,IAA6B,MAAM,CAAC,GAAGD,EAAa,GAAInD,GAAqBD,CAAgB,GAC7FsD,IAAgB,MAAM,CAAC,QAAQ,UAAU,QAAQ,WAAW,QAAQ,GACpEC,IAAkB,MAAM,CAAC,QAAQ,WAAW,MAAM,GAClDC,IAA0B,MAAM,CAACvD,GAAqBD,GAAkBwC,CAAY,GACpFiB,IAAa,MAAM,CAACpE,IAAY,QAAQ,QAAQ,GAAGmE,GAAyB,GAC5EE,IAA4B,MAAM,CAACnE,IAAW,QAAQ,WAAWU,GAAqBD,CAAgB,GACtG2D,IAA6B,MAAM,CAAC,QAAQ;AAAA,IAChD,MAAM,CAAC,QAAQpE,IAAWU,GAAqBD,CAAgB;AAAA,EACnE,GAAKT,IAAWU,GAAqBD,CAAgB,GAC7C4D,IAA4B,MAAM,CAACrE,IAAW,QAAQU,GAAqBD,CAAgB,GAC3F6D,KAAwB,MAAM,CAAC,QAAQ,OAAO,OAAO,MAAM5D,GAAqBD,CAAgB,GAChG8D,IAAwB,MAAM,CAAC,SAAS,OAAO,UAAU,WAAW,UAAU,UAAU,WAAW,YAAY,eAAe,UAAU,GACxIC,KAA0B,MAAM,CAAC,SAAS,OAAO,UAAU,WAAW,eAAe,UAAU,GAC/FC,KAAc,MAAM,CAAC,QAAQ,GAAGR,EAAuB,CAAE,GACzDS,KAAc,MAAM,CAAC5E,IAAY,QAAQ,QAAQ,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,GAAGmE,GAAyB,GAC5IU,IAAoB,MAAM,CAAC7E,IAAY,UAAU,QAAQ,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,GAAGmE,EAAuB,CAAE,GAC/HW,IAAmB,MAAM,CAAC9E,IAAY,UAAU,QAAQ,MAAM,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,GAAGmE,EAAuB,CAAE,GACpIY,IAAa,MAAM,CAACpC,GAAY/B,GAAqBD,CAAgB,GACrEqE,KAAkB,MAAM,CAAC,GAAGjB,EAAa,GAAI9B,IAA6BT,IAAqB;AAAA,IACnG,UAAU,CAACZ,GAAqBD,CAAgB;AAAA,EACpD,CAAG,GACKsE,IAAgB,MAAM,CAAC,aAAa;AAAA,IACxC,QAAQ,CAAC,IAAI,KAAK,KAAK,SAAS,OAAO;AAAA,EAC3C,CAAG,GACKC,IAAc,MAAM,CAAC,QAAQ,SAAS,WAAWhD,IAAyBrB,IAAiB;AAAA,IAC/F,MAAM,CAACD,GAAqBD,CAAgB;AAAA,EAChD,CAAG,GACKwE,KAA4B,MAAM,CAAChF,IAAW2B,IAA2Bd,EAAiB,GAC1FoE,KAAc,MAAM;AAAA;AAAA,IAE1B;AAAA,IAAI;AAAA,IAAQ;AAAA,IAAQhC;AAAA,IAAaxC;AAAA,IAAqBD;AAAA,EAAgB,GAChE0E,KAAmB,MAAM,CAAC,IAAIpF,IAAU6B,IAA2Bd,EAAiB,GACpFsE,KAAiB,MAAM,CAAC,SAAS,UAAU,UAAU,QAAQ,GAC7DC,IAAiB,MAAM,CAAC,UAAU,YAAY,UAAU,WAAW,UAAU,WAAW,eAAe,cAAc,cAAc,cAAc,cAAc,aAAa,OAAO,cAAc,SAAS,YAAY,GACtNC,IAAyB,MAAM,CAACvF,IAAUE,IAAW8B,IAA6BT,EAAmB,GACrGiE,IAAY,MAAM;AAAA;AAAA,IAExB;AAAA,IAAI;AAAA,IAAQhC;AAAA,IAAW7C;AAAA,IAAqBD;AAAA,EAAgB,GACtD+E,IAAc,MAAM,CAAC,QAAQzF,IAAUW,GAAqBD,CAAgB,GAC5EgF,IAAa,MAAM,CAAC,QAAQ1F,IAAUW,GAAqBD,CAAgB,GAC3EiF,IAAY,MAAM,CAAC3F,IAAUW,GAAqBD,CAAgB,GAClEkF,IAAiB,MAAM,CAAC7F,IAAY,QAAQ,GAAGmE,EAAuB,CAAE;AAC9E,SAAO;AAAA,IACL,WAAW;AAAA,IACX,OAAO;AAAA,MACL,SAAS,CAAC,QAAQ,QAAQ,SAAS,QAAQ;AAAA,MAC3C,QAAQ,CAAC,OAAO;AAAA,MAChB,MAAM,CAAC/D,EAAY;AAAA,MACnB,YAAY,CAACA,EAAY;AAAA,MACzB,OAAO,CAACC,EAAK;AAAA,MACb,WAAW,CAACD,EAAY;AAAA,MACxB,eAAe,CAACA,EAAY;AAAA,MAC5B,MAAM,CAAC,MAAM,OAAO,QAAQ;AAAA,MAC5B,MAAM,CAACM,EAAiB;AAAA,MACxB,eAAe,CAAC,QAAQ,cAAc,SAAS,UAAU,UAAU,YAAY,QAAQ,aAAa,OAAO;AAAA,MAC3G,gBAAgB,CAACN,EAAY;AAAA,MAC7B,SAAS,CAAC,QAAQ,SAAS,QAAQ,UAAU,WAAW,OAAO;AAAA,MAC/D,aAAa,CAAC,YAAY,QAAQ,UAAU,YAAY,WAAW,MAAM;AAAA,MACzE,QAAQ,CAACA,EAAY;AAAA,MACrB,QAAQ,CAACA,EAAY;AAAA,MACrB,SAAS,CAAC,MAAMH,EAAQ;AAAA,MACxB,MAAM,CAACG,EAAY;AAAA,MACnB,eAAe,CAACA,EAAY;AAAA,MAC5B,UAAU,CAAC,WAAW,SAAS,UAAU,QAAQ,SAAS,QAAQ;AAAA,IACxE;AAAA,IACI,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQX,QAAQ,CAAC;AAAA,QACP,QAAQ,CAAC,QAAQ,UAAUJ,IAAYW,GAAkBC,GAAqB+C,CAAW;AAAA,MACjG,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMD,WAAW,CAAC,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,MAKvB,SAAS,CAAC;AAAA,QACR,SAAS,CAAC1D,IAAUU,GAAkBC,GAAqBsC,CAAc;AAAA,MACjF,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,eAAe,CAAC;AAAA,QACd,eAAeY,EAAU;AAAA,MACjC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,gBAAgB,CAAC;AAAA,QACf,gBAAgBA,EAAU;AAAA,MAClC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,gBAAgB,CAAC;AAAA,QACf,gBAAgB,CAAC,QAAQ,SAAS,cAAc,cAAc;AAAA,MACtE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,kBAAkB,CAAC;AAAA,QACjB,kBAAkB,CAAC,SAAS,OAAO;AAAA,MAC3C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,KAAK,CAAC;AAAA,QACJ,KAAK,CAAC,UAAU,SAAS;AAAA,MACjC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,SAAS,CAAC,SAAS,gBAAgB,UAAU,QAAQ,eAAe,SAAS,gBAAgB,iBAAiB,cAAc,gBAAgB,sBAAsB,sBAAsB,sBAAsB,mBAAmB,aAAa,aAAa,QAAQ,eAAe,YAAY,aAAa,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,MAKnT,IAAI,CAAC,WAAW,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,MAK7B,OAAO,CAAC;AAAA,QACN,OAAO,CAAC,SAAS,QAAQ,QAAQ,SAAS,KAAK;AAAA,MACvD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,OAAO,CAAC;AAAA,QACN,OAAO,CAAC,QAAQ,SAAS,QAAQ,QAAQ,SAAS,KAAK;AAAA,MAC/D,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,WAAW,CAAC,WAAW,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,MAKvC,cAAc,CAAC;AAAA,QACb,QAAQ,CAAC,WAAW,SAAS,QAAQ,QAAQ,YAAY;AAAA,MACjE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,mBAAmB,CAAC;AAAA,QAClB,QAAQE,EAA0B;AAAA,MAC1C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,UAAU,CAAC;AAAA,QACT,UAAUC,EAAa;AAAA,MAC/B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,cAAcA,EAAa;AAAA,MACnC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,cAAcA,EAAa;AAAA,MACnC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,YAAY,CAAC;AAAA,QACX,YAAYC,EAAe;AAAA,MACnC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,gBAAgB,CAAC;AAAA,QACf,gBAAgBA,EAAe;AAAA,MACvC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,gBAAgB,CAAC;AAAA,QACf,gBAAgBA,EAAe;AAAA,MACvC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,UAAU,CAAC,UAAU,SAAS,YAAY,YAAY,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,MAK9D,OAAO,CAAC;AAAA,QACN,OAAOE,EAAU;AAAA,MACzB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,WAAW,CAAC;AAAA,QACV,WAAWA,EAAU;AAAA,MAC7B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,WAAW,CAAC;AAAA,QACV,WAAWA,EAAU;AAAA,MAC7B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMD,OAAO,CAAC;AAAA,QACN,WAAWA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA,QAKrB,OAAOA,EAAU;AAAA,MACzB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMD,KAAK,CAAC;AAAA,QACJ,WAAWA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA,QAKrB,KAAKA,EAAU;AAAA,MACvB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,YAAY,CAAC;AAAA,QACX,YAAYA,EAAU;AAAA,MAC9B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,YAAY,CAAC;AAAA,QACX,YAAYA,EAAU;AAAA,MAC9B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,KAAK,CAAC;AAAA,QACJ,KAAKA,EAAU;AAAA,MACvB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,OAAO,CAAC;AAAA,QACN,OAAOA,EAAU;AAAA,MACzB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,QAAQ,CAAC;AAAA,QACP,QAAQA,EAAU;AAAA,MAC1B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,MAAM,CAAC;AAAA,QACL,MAAMA,EAAU;AAAA,MACxB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,YAAY,CAAC,WAAW,aAAa,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,MAK/C,GAAG,CAAC;AAAA,QACF,GAAG,CAAClE,IAAW,QAAQU,GAAqBD,CAAgB;AAAA,MACpE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQD,OAAO,CAAC;AAAA,QACN,OAAO,CAACX,IAAY,QAAQ,QAAQkD,GAAgB,GAAGiB,EAAuB,CAAE;AAAA,MACxF,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,kBAAkB,CAAC;AAAA,QACjB,MAAM,CAAC,OAAO,eAAe,OAAO,aAAa;AAAA,MACzD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,MAAM,CAAC,UAAU,QAAQ,cAAc;AAAA,MAC/C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,MAAM,CAAC;AAAA,QACL,MAAM,CAAClE,IAAUD,IAAY,QAAQ,WAAW,QAAQW,CAAgB;AAAA,MAChF,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,MAAM,CAAC;AAAA,QACL,MAAM,CAAC,IAAIV,IAAUW,GAAqBD,CAAgB;AAAA,MAClE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,QAAQ,CAAC;AAAA,QACP,QAAQ,CAAC,IAAIV,IAAUW,GAAqBD,CAAgB;AAAA,MACpE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,OAAO,CAAC;AAAA,QACN,OAAO,CAACT,IAAW,SAAS,QAAQ,QAAQU,GAAqBD,CAAgB;AAAA,MACzF,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAa0D,EAAyB;AAAA,MAC9C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,iBAAiB,CAAC;AAAA,QAChB,KAAKC,EAA0B;AAAA,MACvC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaC,EAAyB;AAAA,MAC9C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,WAAW,CAAC;AAAA,QACV,WAAWA,EAAyB;AAAA,MAC5C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaF,EAAyB;AAAA,MAC9C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,iBAAiB,CAAC;AAAA,QAChB,KAAKC,EAA0B;AAAA,MACvC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaC,EAAyB;AAAA,MAC9C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,WAAW,CAAC;AAAA,QACV,WAAWA,EAAyB;AAAA,MAC5C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAa,CAAC,OAAO,OAAO,SAAS,aAAa,WAAW;AAAA,MACrE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaC,GAAqB;AAAA,MAC1C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,GAAqB;AAAA,MAC1C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,KAAK,CAAC;AAAA,QACJ,KAAKL,EAAuB;AAAA,MACpC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,SAAS,CAAC;AAAA,QACR,SAASA,EAAuB;AAAA,MACxC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,SAAS,CAAC;AAAA,QACR,SAASA,EAAuB;AAAA,MACxC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,mBAAmB,CAAC;AAAA,QAClB,SAAS,CAAC,GAAGM,EAAqB,GAAI,QAAQ;AAAA,MACtD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,iBAAiB,CAAC;AAAA,QAChB,iBAAiB,CAAC,GAAGC,GAAuB,GAAI,QAAQ;AAAA,MAChE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,gBAAgB,CAAC;AAAA,QACf,gBAAgB,CAAC,QAAQ,GAAGA,GAAuB,CAAE;AAAA,MAC7D,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,iBAAiB,CAAC;AAAA,QAChB,SAAS,CAAC,UAAU,GAAGD,EAAqB,CAAE;AAAA,MACtD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,eAAe,CAAC;AAAA,QACd,OAAO,CAAC,GAAGC,MAA2B;AAAA,UACpC,UAAU,CAAC,IAAI,MAAM;AAAA,QAC/B,CAAS;AAAA,MACT,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,MAAM,CAAC,QAAQ,GAAGA,MAA2B;AAAA,UAC3C,UAAU,CAAC,IAAI,MAAM;AAAA,QAC/B,CAAS;AAAA,MACT,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,iBAAiB,CAAC;AAAA,QAChB,iBAAiBD,EAAqB;AAAA,MAC9C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,eAAe,CAAC;AAAA,QACd,eAAe,CAAC,GAAGC,GAAuB,GAAI,UAAU;AAAA,MAChE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,cAAc,CAAC,QAAQ,GAAGA,GAAuB,CAAE;AAAA,MAC3D,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMD,GAAG,CAAC;AAAA,QACF,GAAGP,EAAuB;AAAA,MAClC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,IAAI,CAAC;AAAA,QACH,IAAIA,EAAuB;AAAA,MACnC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,IAAI,CAAC;AAAA,QACH,IAAIA,EAAuB;AAAA,MACnC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,IAAI,CAAC;AAAA,QACH,IAAIA,EAAuB;AAAA,MACnC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,IAAI,CAAC;AAAA,QACH,IAAIA,EAAuB;AAAA,MACnC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,KAAK,CAAC;AAAA,QACJ,KAAKA,EAAuB;AAAA,MACpC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,KAAK,CAAC;AAAA,QACJ,KAAKA,EAAuB;AAAA,MACpC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,IAAI,CAAC;AAAA,QACH,IAAIA,EAAuB;AAAA,MACnC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,IAAI,CAAC;AAAA,QACH,IAAIA,EAAuB;AAAA,MACnC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,IAAI,CAAC;AAAA,QACH,IAAIA,EAAuB;AAAA,MACnC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,IAAI,CAAC;AAAA,QACH,IAAIA,EAAuB;AAAA,MACnC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,GAAG,CAAC;AAAA,QACF,GAAGQ,GAAW;AAAA,MACtB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,IAAI,CAAC;AAAA,QACH,IAAIA,GAAW;AAAA,MACvB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,IAAI,CAAC;AAAA,QACH,IAAIA,GAAW;AAAA,MACvB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,IAAI,CAAC;AAAA,QACH,IAAIA,GAAW;AAAA,MACvB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,IAAI,CAAC;AAAA,QACH,IAAIA,GAAW;AAAA,MACvB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,KAAK,CAAC;AAAA,QACJ,KAAKA,GAAW;AAAA,MACxB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,KAAK,CAAC;AAAA,QACJ,KAAKA,GAAW;AAAA,MACxB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,IAAI,CAAC;AAAA,QACH,IAAIA,GAAW;AAAA,MACvB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,IAAI,CAAC;AAAA,QACH,IAAIA,GAAW;AAAA,MACvB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,IAAI,CAAC;AAAA,QACH,IAAIA,GAAW;AAAA,MACvB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,IAAI,CAAC;AAAA,QACH,IAAIA,GAAW;AAAA,MACvB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,WAAW,CAAC;AAAA,QACV,WAAWR,EAAuB;AAAA,MAC1C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,mBAAmB,CAAC,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,MAKrC,WAAW,CAAC;AAAA,QACV,WAAWA,EAAuB;AAAA,MAC1C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,mBAAmB,CAAC,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQrC,MAAM,CAAC;AAAA,QACL,MAAMS,GAAW;AAAA,MACzB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,eAAe,CAAC;AAAA,QACd,QAAQ,CAAC,QAAQ,GAAGC,EAAiB,CAAE;AAAA,MAC/C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,mBAAmB,CAAC;AAAA,QAClB,cAAc,CAAC,QAAQ,GAAGA,EAAiB,CAAE;AAAA,MACrD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,mBAAmB,CAAC;AAAA,QAClB,cAAc,CAAC,QAAQ,GAAGA,EAAiB,CAAE;AAAA,MACrD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,OAAO,CAAC,QAAQ,GAAGC,EAAgB,CAAE;AAAA,MAC7C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,kBAAkB,CAAC;AAAA,QACjB,aAAa,CAAC,QAAQ,GAAGA,EAAgB,CAAE;AAAA,MACnD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,kBAAkB,CAAC;AAAA,QACjB,aAAa,CAAC,QAAQ,GAAGA,EAAgB,CAAE;AAAA,MACnD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,GAAG,CAAC;AAAA,QACF,GAAG,CAAC5B,GAAgB,UAAU,GAAG0B,GAAW,CAAE;AAAA,MACtD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,SAAS,CAAC;AAAA,QACR,SAAS;AAAA,UAAC1B;AAAA,UAAgB;AAAA;AAAA,UAC1B;AAAA,UAAQ,GAAG0B,GAAW;AAAA,QAAE;AAAA,MAChC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,SAAS,CAAC;AAAA,QACR,SAAS;AAAA,UAAC1B;AAAA,UAAgB;AAAA,UAAU;AAAA;AAAA,UACpC;AAAA;AAAA,UACA;AAAA,YACE,QAAQ,CAACD,CAAe;AAAA,UAClC;AAAA,UAAW,GAAG2B,GAAW;AAAA,QAAE;AAAA,MAC3B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,GAAG,CAAC;AAAA,QACF,GAAG,CAAC,UAAU,MAAM,GAAGA,GAAW,CAAE;AAAA,MAC5C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,SAAS,CAAC;AAAA,QACR,SAAS,CAAC,UAAU,MAAM,QAAQ,GAAGA,GAAW,CAAE;AAAA,MAC1D,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,SAAS,CAAC;AAAA,QACR,SAAS,CAAC,UAAU,MAAM,GAAGA,GAAW,CAAE;AAAA,MAClD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQD,aAAa,CAAC;AAAA,QACZ,MAAM,CAAC,QAAQ/B,GAAWf,IAA2Bd,EAAiB;AAAA,MAC9E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,kBAAkB,CAAC,eAAe,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA,MAKxD,cAAc,CAAC,UAAU,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,MAKrC,eAAe,CAAC;AAAA,QACd,MAAM,CAAC8B,GAAiBT,IAA2BjB,EAAiB;AAAA,MAC5E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,gBAAgB,CAAC;AAAA,QACf,gBAAgB,CAAC,mBAAmB,mBAAmB,aAAa,kBAAkB,UAAU,iBAAiB,YAAY,kBAAkB,kBAAkBjB,IAAWQ,CAAgB;AAAA,MACpM,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,eAAe,CAAC;AAAA,QACd,MAAM,CAACqB,IAA+BV,IAAuBsB,CAAS;AAAA,MAC9E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,iBAAiB,CAAC;AAAA,QAChB,iBAAiB,CAACjC,CAAgB;AAAA,MAC1C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,MAK5B,eAAe,CAAC,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,MAKzB,oBAAoB,CAAC,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,MAKnC,cAAc,CAAC,eAAe,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA,MAK7C,eAAe,CAAC,qBAAqB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,MAKnD,gBAAgB,CAAC,sBAAsB,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA,MAK1D,UAAU,CAAC;AAAA,QACT,UAAU,CAACoC,GAAenC,GAAqBD,CAAgB;AAAA,MACvE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,cAAc,CAACV,IAAU,QAAQW,GAAqBM,EAAiB;AAAA,MAC/E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,SAAS,CAAC;AAAA,QACR,SAAS;AAAA;AAAA,UACT8B;AAAA,UAAc,GAAGmB,EAAuB;AAAA,QAAE;AAAA,MAClD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,cAAc,CAAC,QAAQvD,GAAqBD,CAAgB;AAAA,MACpE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,uBAAuB,CAAC;AAAA,QACtB,MAAM,CAAC,UAAU,SAAS;AAAA,MAClC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,mBAAmB,CAAC;AAAA,QAClB,MAAM,CAAC,QAAQ,WAAW,QAAQC,GAAqBD,CAAgB;AAAA,MAC/E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,kBAAkB,CAAC;AAAA,QACjB,MAAM,CAAC,QAAQ,UAAU,SAAS,WAAW,SAAS,KAAK;AAAA,MACnE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMD,qBAAqB,CAAC;AAAA,QACpB,aAAaoE,EAAU;AAAA,MAC/B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,MAAMA,EAAU;AAAA,MACxB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,mBAAmB,CAAC,aAAa,YAAY,gBAAgB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,MAK3E,yBAAyB,CAAC;AAAA,QACxB,YAAY,CAAC,GAAGO,GAAc,GAAI,MAAM;AAAA,MAChD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,6BAA6B,CAAC;AAAA,QAC5B,YAAY,CAACrF,IAAU,aAAa,QAAQW,GAAqBI,EAAiB;AAAA,MAC1F,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,yBAAyB,CAAC;AAAA,QACxB,YAAY+D,EAAU;AAAA,MAC9B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,oBAAoB,CAAC;AAAA,QACnB,oBAAoB,CAAC9E,IAAU,QAAQW,GAAqBD,CAAgB;AAAA,MACpF,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,kBAAkB,CAAC,aAAa,aAAa,cAAc,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,MAKxE,iBAAiB,CAAC,YAAY,iBAAiB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,MAK1D,aAAa,CAAC;AAAA,QACZ,MAAM,CAAC,QAAQ,UAAU,WAAW,QAAQ;AAAA,MACpD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,QAAQ,CAAC;AAAA,QACP,QAAQwD,EAAuB;AAAA,MACvC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,kBAAkB,CAAC;AAAA,QACjB,OAAO,CAAC,YAAY,OAAO,UAAU,UAAU,YAAY,eAAe,OAAO,SAASvD,GAAqBD,CAAgB;AAAA,MACvI,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,YAAY,CAAC;AAAA,QACX,YAAY,CAAC,UAAU,UAAU,OAAO,YAAY,YAAY,cAAc;AAAA,MACtF,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,OAAO,CAAC;AAAA,QACN,OAAO,CAAC,UAAU,SAAS,OAAO,MAAM;AAAA,MAChD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,MAAM,CAAC;AAAA,QACL,MAAM,CAAC,cAAc,YAAY,QAAQ;AAAA,MACjD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,SAAS,CAAC;AAAA,QACR,SAAS,CAAC,QAAQ,UAAU,MAAM;AAAA,MAC1C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,SAAS,CAAC;AAAA,QACR,SAAS,CAAC,QAAQC,GAAqBD,CAAgB;AAAA,MAC/D,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQD,iBAAiB,CAAC;AAAA,QAChB,IAAI,CAAC,SAAS,SAAS,QAAQ;AAAA,MACvC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,WAAW,CAAC;AAAA,QACV,WAAW,CAAC,UAAU,WAAW,WAAW,MAAM;AAAA,MAC1D,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAa,CAAC,UAAU,WAAW,SAAS;AAAA,MACpD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,eAAe,CAAC;AAAA,QACd,IAAIqE,GAAe;AAAA,MAC3B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,IAAIC,EAAa;AAAA,MACzB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,WAAW,CAAC;AAAA,QACV,IAAIC,EAAW;AAAA,MACvB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,YAAY,CAAC;AAAA,QACX,IAAI,CAAC,QAAQ;AAAA,UACX,QAAQ,CAAC;AAAA,YACP,IAAI,CAAC,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,IAAI;AAAA,UAC3D,GAAahF,IAAWU,GAAqBD,CAAgB;AAAA,UACnD,QAAQ,CAAC,IAAIC,GAAqBD,CAAgB;AAAA,UAClD,OAAO,CAACT,IAAWU,GAAqBD,CAAgB;AAAA,QAClE,GAAWwB,IAA0BT,EAAgB;AAAA,MACrD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,YAAY,CAAC;AAAA,QACX,IAAIqD,EAAU;AAAA,MACtB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,qBAAqB,CAAC;AAAA,QACpB,MAAMI,GAAyB;AAAA,MACvC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,oBAAoB,CAAC;AAAA,QACnB,KAAKA,GAAyB;AAAA,MACtC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,mBAAmB,CAAC;AAAA,QAClB,IAAIA,GAAyB;AAAA,MACrC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,iBAAiB,CAAC;AAAA,QAChB,MAAMJ,EAAU;AAAA,MACxB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,gBAAgB,CAAC;AAAA,QACf,KAAKA,EAAU;AAAA,MACvB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,eAAe,CAAC;AAAA,QACd,IAAIA,EAAU;AAAA,MACtB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQD,SAAS,CAAC;AAAA,QACR,SAASK,GAAW;AAAA,MAC5B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,GAAW;AAAA,MAChC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,GAAW;AAAA,MAChC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,GAAW;AAAA,MAChC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,GAAW;AAAA,MAChC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,GAAW;AAAA,MAChC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,GAAW;AAAA,MAChC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,cAAcA,GAAW;AAAA,MACjC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,cAAcA,GAAW;AAAA,MACjC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,cAAcA,GAAW;AAAA,MACjC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,cAAcA,GAAW;AAAA,MACjC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,cAAcA,GAAW;AAAA,MACjC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,cAAcA,GAAW;AAAA,MACjC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,cAAcA,GAAW;AAAA,MACjC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,cAAcA,GAAW;AAAA,MACjC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,YAAY,CAAC;AAAA,QACX,QAAQC,GAAgB;AAAA,MAChC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,YAAYA,GAAgB;AAAA,MACpC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,YAAYA,GAAgB;AAAA,MACpC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,YAAYA,GAAgB;AAAA,MACpC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,YAAYA,GAAgB;AAAA,MACpC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,eAAe,CAAC;AAAA,QACd,aAAaA,GAAgB;AAAA,MACrC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,eAAe,CAAC;AAAA,QACd,aAAaA,GAAgB;AAAA,MACrC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,YAAYA,GAAgB;AAAA,MACpC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,YAAYA,GAAgB;AAAA,MACpC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,YAAYA,GAAgB;AAAA,MACpC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,YAAYA,GAAgB;AAAA,MACpC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,YAAY,CAAC;AAAA,QACX,YAAYA,GAAgB;AAAA,MACpC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,oBAAoB,CAAC,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,MAKvC,YAAY,CAAC;AAAA,QACX,YAAYA,GAAgB;AAAA,MACpC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,oBAAoB,CAAC,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,MAKvC,gBAAgB,CAAC;AAAA,QACf,QAAQ,CAAC,GAAGC,GAAc,GAAI,UAAU,MAAM;AAAA,MACtD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,gBAAgB,CAAC;AAAA,QACf,QAAQ,CAAC,GAAGA,GAAc,GAAI,UAAU,MAAM;AAAA,MACtD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,gBAAgB,CAAC;AAAA,QACf,QAAQP,EAAU;AAAA,MAC1B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,kBAAkB,CAAC;AAAA,QACjB,YAAYA,EAAU;AAAA,MAC9B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,kBAAkB,CAAC;AAAA,QACjB,YAAYA,EAAU;AAAA,MAC9B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,kBAAkB,CAAC;AAAA,QACjB,YAAYA,EAAU;AAAA,MAC9B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,kBAAkB,CAAC;AAAA,QACjB,YAAYA,EAAU;AAAA,MAC9B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,mBAAmB,CAAC;AAAA,QAClB,aAAaA,EAAU;AAAA,MAC/B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,mBAAmB,CAAC;AAAA,QAClB,aAAaA,EAAU;AAAA,MAC/B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,kBAAkB,CAAC;AAAA,QACjB,YAAYA,EAAU;AAAA,MAC9B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,kBAAkB,CAAC;AAAA,QACjB,YAAYA,EAAU;AAAA,MAC9B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,kBAAkB,CAAC;AAAA,QACjB,YAAYA,EAAU;AAAA,MAC9B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,kBAAkB,CAAC;AAAA,QACjB,YAAYA,EAAU;AAAA,MAC9B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,gBAAgB,CAAC;AAAA,QACf,QAAQA,EAAU;AAAA,MAC1B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,iBAAiB,CAAC;AAAA,QAChB,SAAS,CAAC,GAAGO,GAAc,GAAI,QAAQ,QAAQ;AAAA,MACvD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,kBAAkB,CAAC;AAAA,QACjB,kBAAkB,CAACrF,IAAUW,GAAqBD,CAAgB;AAAA,MAC1E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,SAAS,CAAC,IAAIV,IAAU6B,IAA2Bd,EAAiB;AAAA,MAC5E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,iBAAiB,CAAC;AAAA,QAChB,SAAS+D,EAAU;AAAA,MAC3B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQD,QAAQ,CAAC;AAAA,QACP,QAAQ;AAAA;AAAA,UAER;AAAA,UAAI;AAAA,UAAQ1B;AAAA,UAAajB;AAAA,UAA2BR;AAAA,QAAiB;AAAA,MAC7E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,gBAAgB,CAAC;AAAA,QACf,QAAQmD,EAAU;AAAA,MAC1B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,gBAAgB,CAAC;AAAA,QACf,gBAAgB,CAAC,QAAQzB,GAAkBlB,IAA2BR,EAAiB;AAAA,MAC/F,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,sBAAsB,CAAC;AAAA,QACrB,gBAAgBmD,EAAU;AAAA,MAClC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,UAAU,CAAC;AAAA,QACT,MAAMM,GAAgB;AAAA,MAC9B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOD,gBAAgB,CAAC,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,MAK7B,cAAc,CAAC;AAAA,QACb,MAAMN,EAAU;AAAA,MACxB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOD,iBAAiB,CAAC;AAAA,QAChB,eAAe,CAAC9E,IAAUe,EAAiB;AAAA,MACnD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOD,qBAAqB,CAAC;AAAA,QACpB,eAAe+D,EAAU;AAAA,MACjC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,gBAAgB,CAAC;AAAA,QACf,cAAcM,GAAgB;AAAA,MACtC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,oBAAoB,CAAC;AAAA,QACnB,cAAcN,EAAU;AAAA,MAChC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,eAAe,CAAC;AAAA,QACd,eAAe,CAAC,QAAQxB,GAAiBnB,IAA2BR,EAAiB;AAAA,MAC7F,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,qBAAqB,CAAC;AAAA,QACpB,eAAemD,EAAU;AAAA,MACjC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,SAAS,CAAC;AAAA,QACR,SAAS,CAAC9E,IAAUW,GAAqBD,CAAgB;AAAA,MACjE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAa,CAAC,GAAG4E,EAAc,GAAI,eAAe,cAAc;AAAA,MACxE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,YAAY,CAAC;AAAA,QACX,YAAYA,EAAc;AAAA,MAClC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAa,CAAC,UAAU,WAAW,WAAW,QAAQ,UAAU,MAAM;AAAA,MAC9E,GAAS,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,MAKjB,kBAAkB,CAAC;AAAA,QACjB,MAAM,CAAC,OAAO,YAAY,aAAa,SAAS;AAAA,MACxD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,yBAAyB,CAAC;AAAA,QACxB,eAAe,CAACtF,EAAQ;AAAA,MAChC,CAAO;AAAA,MACD,8BAA8B,CAAC;AAAA,QAC7B,oBAAoBuF,EAAsB;AAAA,MAClD,CAAO;AAAA,MACD,4BAA4B,CAAC;AAAA,QAC3B,kBAAkBA,EAAsB;AAAA,MAChD,CAAO;AAAA,MACD,gCAAgC,CAAC;AAAA,QAC/B,oBAAoBT,EAAU;AAAA,MACtC,CAAO;AAAA,MACD,8BAA8B,CAAC;AAAA,QAC7B,kBAAkBA,EAAU;AAAA,MACpC,CAAO;AAAA,MACD,yBAAyB,CAAC;AAAA,QACxB,eAAeS,EAAsB;AAAA,MAC7C,CAAO;AAAA,MACD,uBAAuB,CAAC;AAAA,QACtB,aAAaA,EAAsB;AAAA,MAC3C,CAAO;AAAA,MACD,2BAA2B,CAAC;AAAA,QAC1B,eAAeT,EAAU;AAAA,MACjC,CAAO;AAAA,MACD,yBAAyB,CAAC;AAAA,QACxB,aAAaA,EAAU;AAAA,MAC/B,CAAO;AAAA,MACD,yBAAyB,CAAC;AAAA,QACxB,eAAeS,EAAsB;AAAA,MAC7C,CAAO;AAAA,MACD,uBAAuB,CAAC;AAAA,QACtB,aAAaA,EAAsB;AAAA,MAC3C,CAAO;AAAA,MACD,2BAA2B,CAAC;AAAA,QAC1B,eAAeT,EAAU;AAAA,MACjC,CAAO;AAAA,MACD,yBAAyB,CAAC;AAAA,QACxB,aAAaA,EAAU;AAAA,MAC/B,CAAO;AAAA,MACD,yBAAyB,CAAC;AAAA,QACxB,eAAeS,EAAsB;AAAA,MAC7C,CAAO;AAAA,MACD,uBAAuB,CAAC;AAAA,QACtB,aAAaA,EAAsB;AAAA,MAC3C,CAAO;AAAA,MACD,2BAA2B,CAAC;AAAA,QAC1B,eAAeT,EAAU;AAAA,MACjC,CAAO;AAAA,MACD,yBAAyB,CAAC;AAAA,QACxB,aAAaA,EAAU;AAAA,MAC/B,CAAO;AAAA,MACD,yBAAyB,CAAC;AAAA,QACxB,eAAeS,EAAsB;AAAA,MAC7C,CAAO;AAAA,MACD,uBAAuB,CAAC;AAAA,QACtB,aAAaA,EAAsB;AAAA,MAC3C,CAAO;AAAA,MACD,2BAA2B,CAAC;AAAA,QAC1B,eAAeT,EAAU;AAAA,MACjC,CAAO;AAAA,MACD,yBAAyB,CAAC;AAAA,QACxB,aAAaA,EAAU;AAAA,MAC/B,CAAO;AAAA,MACD,yBAAyB,CAAC;AAAA,QACxB,eAAeS,EAAsB;AAAA,MAC7C,CAAO;AAAA,MACD,uBAAuB,CAAC;AAAA,QACtB,aAAaA,EAAsB;AAAA,MAC3C,CAAO;AAAA,MACD,2BAA2B,CAAC;AAAA,QAC1B,eAAeT,EAAU;AAAA,MACjC,CAAO;AAAA,MACD,yBAAyB,CAAC;AAAA,QACxB,aAAaA,EAAU;AAAA,MAC/B,CAAO;AAAA,MACD,yBAAyB,CAAC;AAAA,QACxB,eAAeS,EAAsB;AAAA,MAC7C,CAAO;AAAA,MACD,uBAAuB,CAAC;AAAA,QACtB,aAAaA,EAAsB;AAAA,MAC3C,CAAO;AAAA,MACD,2BAA2B,CAAC;AAAA,QAC1B,eAAeT,EAAU;AAAA,MACjC,CAAO;AAAA,MACD,yBAAyB,CAAC;AAAA,QACxB,aAAaA,EAAU;AAAA,MAC/B,CAAO;AAAA,MACD,qBAAqB,CAAC;AAAA,QACpB,eAAe,CAACnE,GAAqBD,CAAgB;AAAA,MAC7D,CAAO;AAAA,MACD,8BAA8B,CAAC;AAAA,QAC7B,oBAAoB6E,EAAsB;AAAA,MAClD,CAAO;AAAA,MACD,4BAA4B,CAAC;AAAA,QAC3B,kBAAkBA,EAAsB;AAAA,MAChD,CAAO;AAAA,MACD,gCAAgC,CAAC;AAAA,QAC/B,oBAAoBT,EAAU;AAAA,MACtC,CAAO;AAAA,MACD,8BAA8B,CAAC;AAAA,QAC7B,kBAAkBA,EAAU;AAAA,MACpC,CAAO;AAAA,MACD,2BAA2B,CAAC;AAAA,QAC1B,eAAe,CAAC,UAAU,SAAS;AAAA,MAC3C,CAAO;AAAA,MACD,0BAA0B,CAAC;AAAA,QACzB,eAAe,CAAC;AAAA,UACd,SAAS,CAAC,QAAQ,QAAQ;AAAA,UAC1B,UAAU,CAAC,QAAQ,QAAQ;AAAA,QACrC,CAAS;AAAA,MACT,CAAO;AAAA,MACD,yBAAyB,CAAC;AAAA,QACxB,kBAAkBhB,EAAa;AAAA,MACvC,CAAO;AAAA,MACD,wBAAwB,CAAC;AAAA,QACvB,cAAc,CAAC9D,EAAQ;AAAA,MAC/B,CAAO;AAAA,MACD,6BAA6B,CAAC;AAAA,QAC5B,mBAAmBuF,EAAsB;AAAA,MACjD,CAAO;AAAA,MACD,2BAA2B,CAAC;AAAA,QAC1B,iBAAiBA,EAAsB;AAAA,MAC/C,CAAO;AAAA,MACD,+BAA+B,CAAC;AAAA,QAC9B,mBAAmBT,EAAU;AAAA,MACrC,CAAO;AAAA,MACD,6BAA6B,CAAC;AAAA,QAC5B,iBAAiBA,EAAU;AAAA,MACnC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,MAAM,CAAC,SAAS,aAAa,OAAO;AAAA,MAC5C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,eAAe,CAAC;AAAA,QACd,eAAe,CAAC,UAAU,WAAW,WAAW,QAAQ,UAAU,MAAM;AAAA,MAChF,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,iBAAiB,CAAC;AAAA,QAChB,MAAMC,GAAe;AAAA,MAC7B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,eAAe,CAAC;AAAA,QACd,MAAMC,EAAa;AAAA,MAC3B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,MAAMC,EAAW;AAAA,MACzB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAa,CAAC,SAAS,WAAW;AAAA,MAC1C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,MAAM,CAAC,QAAQtE,GAAqBD,CAAgB;AAAA,MAC5D,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQD,QAAQ,CAAC;AAAA,QACP,QAAQ;AAAA;AAAA,UAER;AAAA,UAAI;AAAA,UAAQC;AAAA,UAAqBD;AAAA,QAAgB;AAAA,MACzD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,MAAM,CAAC;AAAA,QACL,MAAM8E,EAAS;AAAA,MACvB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,YAAY,CAAC;AAAA,QACX,YAAY,CAACxF,IAAUW,GAAqBD,CAAgB;AAAA,MACpE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,UAAU,CAAC;AAAA,QACT,UAAU,CAACV,IAAUW,GAAqBD,CAAgB;AAAA,MAClE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,eAAe,CAAC;AAAA,QACd,eAAe;AAAA;AAAA,UAEf;AAAA,UAAI;AAAA,UAAQ6C;AAAA,UAAiBpB;AAAA,UAA2BR;AAAA,QAAiB;AAAA,MACjF,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,qBAAqB,CAAC;AAAA,QACpB,eAAemD,EAAU;AAAA,MACjC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,WAAW,CAAC;AAAA,QACV,WAAW,CAAC,IAAI9E,IAAUW,GAAqBD,CAAgB;AAAA,MACvE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,cAAc,CAACV,IAAUW,GAAqBD,CAAgB;AAAA,MACtE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,QAAQ,CAAC;AAAA,QACP,QAAQ,CAAC,IAAIV,IAAUW,GAAqBD,CAAgB;AAAA,MACpE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,UAAU,CAAC;AAAA,QACT,UAAU,CAACV,IAAUW,GAAqBD,CAAgB;AAAA,MAClE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,OAAO,CAAC;AAAA,QACN,OAAO,CAAC,IAAIV,IAAUW,GAAqBD,CAAgB;AAAA,MACnE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,mBAAmB,CAAC;AAAA,QAClB,mBAAmB;AAAA;AAAA,UAEnB;AAAA,UAAI;AAAA,UAAQC;AAAA,UAAqBD;AAAA,QAAgB;AAAA,MACzD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,iBAAiB,CAAC;AAAA,QAChB,iBAAiB8E,EAAS;AAAA,MAClC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,uBAAuB,CAAC;AAAA,QACtB,uBAAuB,CAACxF,IAAUW,GAAqBD,CAAgB;AAAA,MAC/E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,qBAAqB,CAAC;AAAA,QACpB,qBAAqB,CAACV,IAAUW,GAAqBD,CAAgB;AAAA,MAC7E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,sBAAsB,CAAC;AAAA,QACrB,sBAAsB,CAAC,IAAIV,IAAUW,GAAqBD,CAAgB;AAAA,MAClF,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,uBAAuB,CAAC;AAAA,QACtB,uBAAuB,CAACV,IAAUW,GAAqBD,CAAgB;AAAA,MAC/E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,mBAAmB,CAAC;AAAA,QAClB,mBAAmB,CAAC,IAAIV,IAAUW,GAAqBD,CAAgB;AAAA,MAC/E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,oBAAoB,CAAC;AAAA,QACnB,oBAAoB,CAACV,IAAUW,GAAqBD,CAAgB;AAAA,MAC5E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,qBAAqB,CAAC;AAAA,QACpB,qBAAqB,CAACV,IAAUW,GAAqBD,CAAgB;AAAA,MAC7E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,kBAAkB,CAAC;AAAA,QACjB,kBAAkB,CAAC,IAAIV,IAAUW,GAAqBD,CAAgB;AAAA,MAC9E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQD,mBAAmB,CAAC;AAAA,QAClB,QAAQ,CAAC,YAAY,UAAU;AAAA,MACvC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,kBAAkB,CAAC;AAAA,QACjB,kBAAkBwD,EAAuB;AAAA,MACjD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,oBAAoB,CAAC;AAAA,QACnB,oBAAoBA,EAAuB;AAAA,MACnD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,oBAAoB,CAAC;AAAA,QACnB,oBAAoBA,EAAuB;AAAA,MACnD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,gBAAgB,CAAC;AAAA,QACf,OAAO,CAAC,QAAQ,OAAO;AAAA,MAC/B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,SAAS,CAAC;AAAA,QACR,SAAS,CAAC,OAAO,QAAQ;AAAA,MACjC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQD,YAAY,CAAC;AAAA,QACX,YAAY,CAAC,IAAI,OAAO,UAAU,WAAW,UAAU,aAAa,QAAQvD,GAAqBD,CAAgB;AAAA,MACzH,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,uBAAuB,CAAC;AAAA,QACtB,YAAY,CAAC,UAAU,UAAU;AAAA,MACzC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,UAAU,CAAC;AAAA,QACT,UAAU,CAACV,IAAU,WAAWW,GAAqBD,CAAgB;AAAA,MAC7E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,MAAM,CAAC;AAAA,QACL,MAAM,CAAC,UAAU,WAAWiD,GAAWhD,GAAqBD,CAAgB;AAAA,MACpF,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,OAAO,CAAC;AAAA,QACN,OAAO,CAACV,IAAUW,GAAqBD,CAAgB;AAAA,MAC/D,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,SAAS,CAAC;AAAA,QACR,SAAS,CAAC,QAAQkD,GAAcjD,GAAqBD,CAAgB;AAAA,MAC7E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQD,UAAU,CAAC;AAAA,QACT,UAAU,CAAC,UAAU,SAAS;AAAA,MACtC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAa,CAAC+C,GAAkB9C,GAAqBD,CAAgB;AAAA,MAC7E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,sBAAsB,CAAC;AAAA,QACrB,sBAAsBqD,EAA0B;AAAA,MACxD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,QAAQ,CAAC;AAAA,QACP,QAAQ0B,EAAW;AAAA,MAC3B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,YAAY,CAAC;AAAA,QACX,YAAYA,EAAW;AAAA,MAC/B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,YAAY,CAAC;AAAA,QACX,YAAYA,EAAW;AAAA,MAC/B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,YAAY,CAAC;AAAA,QACX,YAAYA,EAAW;AAAA,MAC/B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,OAAO,CAAC;AAAA,QACN,OAAOC,EAAU;AAAA,MACzB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,WAAW,CAAC;AAAA,QACV,WAAWA,EAAU;AAAA,MAC7B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,WAAW,CAAC;AAAA,QACV,WAAWA,EAAU;AAAA,MAC7B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,WAAW,CAAC;AAAA,QACV,WAAWA,EAAU;AAAA,MAC7B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,YAAY,CAAC,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,MAKvB,MAAM,CAAC;AAAA,QACL,MAAMC,EAAS;AAAA,MACvB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,UAAU,CAAC;AAAA,QACT,UAAUA,EAAS;AAAA,MAC3B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,UAAU,CAAC;AAAA,QACT,UAAUA,EAAS;AAAA,MAC3B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,WAAW,CAAC;AAAA,QACV,WAAW,CAAChF,GAAqBD,GAAkB,IAAI,QAAQ,OAAO,KAAK;AAAA,MACnF,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,oBAAoB,CAAC;AAAA,QACnB,QAAQqD,EAA0B;AAAA,MAC1C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,mBAAmB,CAAC;AAAA,QAClB,WAAW,CAAC,MAAM,MAAM;AAAA,MAChC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,WAAW,CAAC;AAAA,QACV,WAAW6B,EAAc;AAAA,MACjC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,eAAe,CAAC;AAAA,QACd,eAAeA,EAAc;AAAA,MACrC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,eAAe,CAAC;AAAA,QACd,eAAeA,EAAc;AAAA,MACrC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,eAAe,CAAC;AAAA,QACd,eAAeA,EAAc;AAAA,MACrC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,kBAAkB,CAAC,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQnC,QAAQ,CAAC;AAAA,QACP,QAAQd,EAAU;AAAA,MAC1B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,YAAY,CAAC;AAAA,QACX,YAAY,CAAC,QAAQ,MAAM;AAAA,MACnC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,eAAe,CAAC;AAAA,QACd,OAAOA,EAAU;AAAA,MACzB,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,gBAAgB,CAAC;AAAA,QACf,QAAQ,CAAC,UAAU,QAAQ,SAAS,cAAc,aAAa,YAAY;AAAA,MACnF,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,QAAQ,CAAC;AAAA,QACP,QAAQ,CAAC,QAAQ,WAAW,WAAW,QAAQ,QAAQ,QAAQ,QAAQ,eAAe,QAAQ,gBAAgB,YAAY,QAAQ,aAAa,iBAAiB,SAAS,QAAQ,WAAW,QAAQ,YAAY,cAAc,cAAc,cAAc,YAAY,YAAY,YAAY,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,eAAe,eAAe,WAAW,YAAYnE,GAAqBD,CAAgB;AAAA,MAC1d,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,gBAAgB,CAAC;AAAA,QACf,gBAAgB,CAAC,SAAS,SAAS;AAAA,MAC3C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,kBAAkB,CAAC;AAAA,QACjB,kBAAkB,CAAC,QAAQ,MAAM;AAAA,MACzC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,QAAQ,CAAC;AAAA,QACP,QAAQ,CAAC,QAAQ,IAAI,KAAK,GAAG;AAAA,MACrC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,mBAAmB,CAAC;AAAA,QAClB,QAAQ,CAAC,QAAQ,QAAQ;AAAA,MACjC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,YAAY,CAAC;AAAA,QACX,YAAYwD,EAAuB;AAAA,MAC3C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,EAAuB;AAAA,MAC5C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,EAAuB;AAAA,MAC5C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,EAAuB;AAAA,MAC5C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,EAAuB;AAAA,MAC5C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,cAAcA,EAAuB;AAAA,MAC7C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,cAAcA,EAAuB;AAAA,MAC7C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,EAAuB;AAAA,MAC5C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,EAAuB;AAAA,MAC5C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,EAAuB;AAAA,MAC5C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,EAAuB;AAAA,MAC5C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,YAAY,CAAC;AAAA,QACX,YAAYA,EAAuB;AAAA,MAC3C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,EAAuB;AAAA,MAC5C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,EAAuB;AAAA,MAC5C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,EAAuB;AAAA,MAC5C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,EAAuB;AAAA,MAC5C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,cAAcA,EAAuB;AAAA,MAC7C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,cAAcA,EAAuB;AAAA,MAC7C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,EAAuB;AAAA,MAC5C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,EAAuB;AAAA,MAC5C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,EAAuB;AAAA,MAC5C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,aAAaA,EAAuB;AAAA,MAC5C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,cAAc,CAAC;AAAA,QACb,MAAM,CAAC,SAAS,OAAO,UAAU,YAAY;AAAA,MACrD,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,MAAM,CAAC,UAAU,QAAQ;AAAA,MACjC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,aAAa,CAAC;AAAA,QACZ,MAAM,CAAC,QAAQ,KAAK,KAAK,MAAM;AAAA,MACvC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,mBAAmB,CAAC;AAAA,QAClB,MAAM,CAAC,aAAa,WAAW;AAAA,MACvC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,OAAO,CAAC;AAAA,QACN,OAAO,CAAC,QAAQ,QAAQ,cAAc;AAAA,MAC9C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,WAAW,CAAC;AAAA,QACV,aAAa,CAAC,KAAK,QAAQ,OAAO;AAAA,MAC1C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,WAAW,CAAC;AAAA,QACV,aAAa,CAAC,KAAK,MAAM,MAAM;AAAA,MACvC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,YAAY,CAAC,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,MAK/B,QAAQ,CAAC;AAAA,QACP,QAAQ,CAAC,QAAQ,QAAQ,OAAO,MAAM;AAAA,MAC9C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,eAAe,CAAC;AAAA,QACd,eAAe,CAAC,QAAQ,UAAU,YAAY,aAAavD,GAAqBD,CAAgB;AAAA,MACxG,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQD,MAAM,CAAC;AAAA,QACL,MAAM,CAAC,QAAQ,GAAGoE,EAAU,CAAE;AAAA,MACtC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,YAAY,CAAC;AAAA,QACX,QAAQ,CAAC9E,IAAU6B,IAA2Bd,IAAmBE,EAAiB;AAAA,MAC1F,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKD,QAAQ,CAAC;AAAA,QACP,QAAQ,CAAC,QAAQ,GAAG6D,EAAU,CAAE;AAAA,MACxC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQD,uBAAuB,CAAC;AAAA,QACtB,uBAAuB,CAAC,QAAQ,MAAM;AAAA,MAC9C,CAAO;AAAA,IACP;AAAA,IACI,wBAAwB;AAAA,MACtB,UAAU,CAAC,cAAc,YAAY;AAAA,MACrC,YAAY,CAAC,gBAAgB,cAAc;AAAA,MAC3C,OAAO,CAAC,WAAW,WAAW,YAAY,YAAY,SAAS,OAAO,OAAO,SAAS,UAAU,MAAM;AAAA,MACtG,WAAW,CAAC,SAAS,MAAM;AAAA,MAC3B,WAAW,CAAC,OAAO,QAAQ;AAAA,MAC3B,MAAM,CAAC,SAAS,QAAQ,QAAQ;AAAA,MAChC,KAAK,CAAC,SAAS,OAAO;AAAA,MACtB,GAAG,CAAC,MAAM,MAAM,MAAM,MAAM,OAAO,OAAO,MAAM,MAAM,MAAM,IAAI;AAAA,MAChE,IAAI,CAAC,MAAM,IAAI;AAAA,MACf,IAAI,CAAC,MAAM,IAAI;AAAA,MACf,GAAG,CAAC,MAAM,MAAM,MAAM,MAAM,OAAO,OAAO,MAAM,MAAM,MAAM,IAAI;AAAA,MAChE,IAAI,CAAC,MAAM,IAAI;AAAA,MACf,IAAI,CAAC,MAAM,IAAI;AAAA,MACf,MAAM,CAAC,KAAK,GAAG;AAAA,MACf,aAAa,CAAC,SAAS;AAAA,MACvB,cAAc,CAAC,eAAe,oBAAoB,cAAc,eAAe,cAAc;AAAA,MAC7F,eAAe,CAAC,YAAY;AAAA,MAC5B,oBAAoB,CAAC,YAAY;AAAA,MACjC,cAAc,CAAC,YAAY;AAAA,MAC3B,eAAe,CAAC,YAAY;AAAA,MAC5B,gBAAgB,CAAC,YAAY;AAAA,MAC7B,cAAc,CAAC,WAAW,UAAU;AAAA,MACpC,SAAS,CAAC,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,cAAc,cAAc,cAAc,cAAc,cAAc,cAAc,cAAc,YAAY;AAAA,MACtM,aAAa,CAAC,cAAc,YAAY;AAAA,MACxC,aAAa,CAAC,cAAc,YAAY;AAAA,MACxC,aAAa,CAAC,cAAc,YAAY;AAAA,MACxC,aAAa,CAAC,cAAc,YAAY;AAAA,MACxC,aAAa,CAAC,cAAc,YAAY;AAAA,MACxC,aAAa,CAAC,cAAc,YAAY;AAAA,MACxC,kBAAkB,CAAC,oBAAoB,kBAAkB;AAAA,MACzD,YAAY,CAAC,cAAc,cAAc,cAAc,cAAc,eAAe,eAAe,cAAc,cAAc,cAAc,YAAY;AAAA,MACzJ,cAAc,CAAC,cAAc,YAAY;AAAA,MACzC,cAAc,CAAC,cAAc,YAAY;AAAA,MACzC,gBAAgB,CAAC,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,gBAAgB;AAAA,MACrM,kBAAkB,CAAC,kBAAkB,gBAAgB;AAAA,MACrD,kBAAkB,CAAC,kBAAkB,gBAAgB;AAAA,MACrD,WAAW,CAAC,eAAe,eAAe,gBAAgB;AAAA,MAC1D,kBAAkB,CAAC,aAAa,eAAe,eAAe,aAAa;AAAA,MAC3E,YAAY,CAAC,aAAa,aAAa,aAAa,aAAa,cAAc,cAAc,aAAa,aAAa,aAAa,WAAW;AAAA,MAC/I,aAAa,CAAC,aAAa,WAAW;AAAA,MACtC,aAAa,CAAC,aAAa,WAAW;AAAA,MACtC,YAAY,CAAC,aAAa,aAAa,aAAa,aAAa,cAAc,cAAc,aAAa,aAAa,aAAa,WAAW;AAAA,MAC/I,aAAa,CAAC,aAAa,WAAW;AAAA,MACtC,aAAa,CAAC,aAAa,WAAW;AAAA,MACtC,OAAO,CAAC,WAAW,WAAW,UAAU;AAAA,MACxC,WAAW,CAAC,OAAO;AAAA,MACnB,WAAW,CAAC,OAAO;AAAA,MACnB,YAAY,CAAC,OAAO;AAAA,IAC1B;AAAA,IACI,gCAAgC;AAAA,MAC9B,aAAa,CAAC,SAAS;AAAA,IAC7B;AAAA,IACI,yBAAyB,CAAC,KAAK,MAAM,SAAS,YAAY,UAAU,mBAAmB,QAAQ,gBAAgB,cAAc,UAAU,eAAe,WAAW;AAAA,EACrK;AACA,GAsDMe,KAAuB,gBAAArH,GAAoBiE,EAAgB;AC/sGjE,SAASqD,GAAEC,GAAE;AAAC,MAAIC,GAAEC,GAAEC,IAAE;AAAG,MAAa,OAAOH,KAAjB,YAA8B,OAAOA,KAAjB,SAAmB,CAAAG,KAAGH;AAAA,WAAoB,OAAOA,KAAjB,SAAmB,KAAG,MAAM,QAAQA,CAAC,GAAE;AAAC,QAAII,IAAEJ,EAAE;AAAO,SAAIC,IAAE,GAAEA,IAAEG,GAAEH,IAAI,CAAAD,EAAEC,CAAC,MAAIC,IAAEH,GAAEC,EAAEC,CAAC,CAAC,OAAKE,MAAIA,KAAG,MAAKA,KAAGD;AAAA,EAAE,MAAM,MAAIA,KAAKF,EAAE,CAAAA,EAAEE,CAAC,MAAIC,MAAIA,KAAG,MAAKA,KAAGD;AAAG,SAAOC;AAAC;AAAQ,SAASE,KAAM;AAAC,WAAQL,GAAEC,GAAEC,IAAE,GAAEC,IAAE,IAAGC,IAAE,UAAU,QAAOF,IAAEE,GAAEF,IAAI,EAACF,IAAE,UAAUE,CAAC,OAAKD,IAAEF,GAAEC,CAAC,OAAKG,MAAIA,KAAG,MAAKA,KAAGF;AAAG,SAAOE;AAAC;ACKxW,SAASxI,MAAc2I,GAAS;AACnC,SAAOA,EAAQ,OAAO,OAAO,EAAE,KAAK,GAAG;AAC3C;AAKO,SAASC,MAAMC,GAAQ;AAC1B,SAAOV,GAAQO,GAAKG,CAAM,CAAC;AAC/B;ACAA,MAAMC,KAAa;AAAA,EACf,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AACX,GACMC,KAAY,MAAM,OAAO,SAAW,QACrC,OAAO,UAAY,OAAe;AAOhC,SAASC,GAAa5K,GAAQ6K,IAAU,IAAI;AAC/C,MAAI5O,IAAS;AAAA,IACT,SAAS4O,EAAQ,WAAWF,GAAA;AAAA,IAC5B,OAAOE,EAAQ,SAAS;AAAA,IACxB,QAAQ7K,EAAO,WAAW,GAAG,IAAIA,IAAS,IAAIA,CAAM;AAAA,EAAA;AAExD,WAAS8K,EAAUC,GAAO;AACtB,WAAO9O,EAAO,WAAWyO,GAAWK,CAAK,KAAKL,GAAWzO,EAAO,KAAK;AAAA,EACzE;AACA,WAAS+O,EAAcD,GAAOE,GAAS;AACnC,WAAO,GAAGhP,EAAO,MAAM,KAAK8O,EAAM,YAAA,CAAa,KAAKE,CAAO;AAAA,EAC/D;AACA,SAAO;AAAA,IACH,MAAMA,MAAY5H,GAAM;AACpB,MAAIyH,EAAU,OAAO,KACjB,QAAQ,IAAIE,EAAc,SAASC,CAAO,GAAG,GAAG5H,CAAI;AAAA,IAE5D;AAAA,IACA,KAAK4H,MAAY5H,GAAM;AACnB,MAAIyH,EAAU,MAAM,KAChB,QAAQ,KAAKE,EAAc,QAAQC,CAAO,GAAG,GAAG5H,CAAI;AAAA,IAE5D;AAAA,IACA,KAAK4H,MAAY5H,GAAM;AACnB,MAAIyH,EAAU,MAAM,KAChB,QAAQ,KAAKE,EAAc,QAAQC,CAAO,GAAG,GAAG5H,CAAI;AAAA,IAE5D;AAAA,IACA,MAAM4H,MAAY5H,GAAM;AACpB,MAAIyH,EAAU,OAAO,KACjB,QAAQ,MAAME,EAAc,SAASC,CAAO,GAAG,GAAG5H,CAAI;AAAA,IAE9D;AAAA,IACA,UAAU6H,GAAM;AACZjP,MAAAA,IAAS,EAAE,GAAGA,GAAQ,GAAGiP,EAAA;AAAA,IAC7B;AAAA,EAAA;AAER;AAIA,IAAIjP,KAAS;AAAA,EACT,SAAS0O,GAAA;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AACZ;AAIA,SAASG,GAAUC,GAAO;AACtB,SAAO9O,GAAO,WAAWyO,GAAWK,CAAK,KAAKL,GAAWzO,GAAO,KAAK;AACzE;AACA,SAAS+O,GAAcD,GAAOE,GAAS;AACnC,SAAO,GAAGhP,GAAO,MAAM,KAAK8O,EAAM,YAAA,CAAa,KAAKE,CAAO;AAC/D;AACO,MAAME,KAAS;AAAA,EAClB,OAAO,CAACF,MAAY5H,MAAS;AACzB,IAAIyH,GAAU,OAAO,KACjB,QAAQ,IAAIE,GAAc,SAASC,CAAO,GAAG,GAAG5H,CAAI;AAAA,EAE5D;AAAA,EACA,MAAM,CAAC4H,MAAY5H,MAAS;AACxB,IAAIyH,GAAU,MAAM,KAChB,QAAQ,KAAKE,GAAc,QAAQC,CAAO,GAAG,GAAG5H,CAAI;AAAA,EAE5D;AAAA,EACA,MAAM,CAAC4H,MAAY5H,MAAS;AACxB,IAAIyH,GAAU,MAAM,KAChB,QAAQ,KAAKE,GAAc,QAAQC,CAAO,GAAG,GAAG5H,CAAI;AAAA,EAE5D;AAAA,EACA,OAAO,CAAC4H,MAAY5H,MAAS;AACzB,IAAIyH,GAAU,OAAO,KACjB,QAAQ,MAAME,GAAc,SAASC,CAAO,GAAG,GAAG5H,CAAI;AAAA,EAE9D;AACJ;ACtGeuH,GAAa,aAAa;;kBCFzC;AAME,MAAMQ,IAAIC,EAAA,KAAAC,GAAA,QAAA,GAAG,IAAI,GAAEC,0BAAQ,cAAc,GAASjP,0BAAY,EAAE;MAGjEkP,IAAGC,GAAA;;AAAH,IAAAJ,EAAA,UAAAG,aACQlP,EAAS,CAAA,CAAA,GADjB+O,EAAA,cAAAG,YAGQJ,EAAI,CAAA,GAHZC,EAAA,cAAAG,aAISJ,EAAI,CAAA,GAJbC,EAAA,cAAAG,aAMSD,EAAK,CAAA;AAAA,kBANdC,CAAG;AAFI;;kBCPR;AAME,MAAMJ,IAAIC,EAAA,KAAAC,GAAA,QAAA,GAAG,IAAI,GAAEC,0BAAQ,cAAc,GAASjP,0BAAY,EAAE;MAGjEkP,IAAGC,GAAA;;AAAH,IAAAJ,EAAA,UAAAG,aACQlP,EAAS,CAAA,CAAA,GADjB+O,EAAA,cAAAG,YAGQJ,EAAI,CAAA,GAHZC,EAAA,cAAAG,aAISJ,EAAI,CAAA,GAJbC,EAAA,cAAAG,aAMSD,EAAK,CAAA;AAAA,kBANdC,CAAG;AAFI;;kBCPR;AAME,MAAMJ,IAAIC,EAAA,KAAAC,GAAA,QAAA,GAAG,IAAI,GAAEC,0BAAQ,cAAc,GAASjP,0BAAY,EAAE;MAGjEkP,IAAGC,GAAA;;AAAH,IAAAJ,EAAA,UAAAG,aACQlP,EAAS,CAAA,CAAA,GADjB+O,EAAA,cAAAG,YAGQJ,EAAI,CAAA,GAHZC,EAAA,cAAAG,aAISJ,EAAI,CAAA,GAJbC,EAAA,cAAAG,aAMSD,EAAK,CAAA;AAAA,kBANdC,CAAG;AAFI;;kBCPR;AAME,MAAMJ,IAAIC,EAAA,KAAAC,GAAA,QAAA,GAAG,IAAI,GAAEC,0BAAQ,cAAc,GAASjP,0BAAY,EAAE;MAGjEkP,IAAGC,GAAA;;AAAH,IAAAJ,EAAA,UAAAG,aACQlP,EAAS,CAAA,CAAA,GADjB+O,EAAA,cAAAG,YAGQJ,EAAI,CAAA,GAHZC,EAAA,cAAAG,aAISJ,EAAI,CAAA,GAJbC,EAAA,cAAAG,aAMSD,EAAK,CAAA;AAAA,kBANdC,CAAG;AAFI;;kBCPR;AAME,MAAMJ,IAAIC,EAAA,KAAAC,GAAA,QAAA,GAAG,IAAI,GAAEC,0BAAQ,cAAc,GAASjP,0BAAY,EAAE;MAGjEkP,IAAGC,GAAA;;AAAH,IAAAJ,EAAA,UAAAG,aACQlP,EAAS,CAAA,CAAA,GADjB+O,EAAA,cAAAG,YAGQJ,EAAI,CAAA,GAHZC,EAAA,cAAAG,aAISJ,EAAI,CAAA,GAJbC,EAAA,cAAAG,aAMSD,EAAK,CAAA;AAAA,kBANdC,CAAG;AAFI;;kBCPR;AAME,MAAMJ,IAAIC,EAAA,KAAAC,GAAA,QAAA,GAAG,IAAI,GAAEC,0BAAQ,cAAc,GAASjP,0BAAY,EAAE;MAGjEkP,IAAGC,GAAA;;AAAH,IAAAJ,EAAA,UAAAG,aACQlP,EAAS,CAAA,CAAA,GADjB+O,EAAA,cAAAG,YAGQJ,EAAI,CAAA,GAHZC,EAAA,cAAAG,aAISJ,EAAI,CAAA,GAJbC,EAAA,cAAAG,aAMSD,EAAK,CAAA;AAAA,kBANdC,CAAG;AAFI;;kBCPR;AAME,MAAMJ,IAAIC,EAAA,KAAAC,GAAA,QAAA,GAAG,IAAI,GAAEC,0BAAQ,cAAc,GAASjP,0BAAY,EAAE;MAGjEkP,IAAGC,GAAA;;AAAH,IAAAJ,EAAA,UAAAG,aACQlP,EAAS,CAAA,CAAA,GADjB+O,EAAA,cAAAG,YAGQJ,EAAI,CAAA,GAHZC,EAAA,cAAAG,aAISJ,EAAI,CAAA,GAJbC,EAAA,cAAAG,aAMSD,EAAK,CAAA;AAAA,kBANdC,CAAG;AAFI;ACUI,MAACE,KAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKtB,IAAI;AAAA;AAAA,EAEJ,IAAI;AAAA;AAAA,EAEJ,IAAI;AAAA;AAAA,EAEJ,IAAI;AAAA;AAAA,EAEJ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,MAAM;AAAA;AAAA,EAEN,WAAW;AAAA;AAAA,EAEX,IAAI;AAAA;AAAA,EAEJ,SAAS;AAAA;AAAA,EAIT,SAAS;AAAA;AAAA,EAIT,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAKX,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAWP,OAAO;AA6BX,GCpEaC,KAAW;AAAA,EAEpB,OAAO;AAAA,EACP,MAAM;AAIV,GAQaC,KAAS;AAAA;AAAA,EAElB,KAAKC;AAeT;AAUO,SAASC,GAAUC,GAAMC,IAAS,IAAI;AACzC,QAAMC,IAASF,EAAK,cACdG,IAAQH,EAAK;AACnB,SAAK,CAACE,KAAU,CAACC,KAAU,CAAC,SAASD,CAAM,KAAK,CAAC,SAASC,CAAK,IACpD;AAAA,IACH,OAAOF,EAAO,SAAS;AAAA,IACvB,UAAU;AAAA,IACV,KAAK,MAAM;AAAA,EACvB,IAEWG,GAAYJ,GAAMC,CAAM;AACnC;AAQO,SAASI,GAASL,GAAMC,IAAS,IAAI;AACxC,SAAIK,GAAoB,IACb,EAAE,OAAOL,EAAO,SAAS,GAAG,UAAU,GAAG,KAAK,MAAM,GAAE,IAE1DM,GAAWP,GAAMC,CAAM;AAClC;AAQO,SAASO,GAAQR,GAAMC,IAAS,IAAI;AACvC,SAAIK,GAAoB,IACb,EAAE,OAAOL,EAAO,SAAS,GAAG,UAAU,GAAG,KAAK,MAAM,GAAE,IAE1DQ,GAAUT,GAAMC,CAAM;AACjC;AAeO,SAASS,GAAcV,GAAM,EAAE,OAAAW,IAAQ,GAAG,UAAAC,IAAWhB,GAAS,OAAO,QAAAiB,IAAShB,GAAO,KAAK,OAAAiB,IAAQ,KAAI,IAAM,CAAA,GAAI;AACnH,MAAIR,GAAoB;AACpB,WAAO,EAAE,OAAAK,GAAO,UAAU,GAAG,KAAK,MAAM,GAAE;AAE9C,QAAMI,IAAQ,iBAAiBf,CAAI,GAC7BgB,IAAU,CAACD,EAAM,SACjBE,IAAYF,EAAM,cAAc,SAAS,KAAKA,EAAM;AAC1D,SAAO;AAAA,IACH,OAAAJ;AAAA,IACA,UAAAC;AAAA,IACA,QAAAC;AAAA,IACA,KAAK,CAAA1C,MAAK;AAAA,mBACC8C,CAAS,UAAUH,KAAS,IAAIA,KAAS3C,CAAC;AAAA,iBAC5C6C,IAAU7C,CAAC;AAAA;AAAA,EAE5B;AACA;AA8LO,SAASmC,KAAuB;AACnC,SAAI,OAAO,SAAW,MACX,KACJ,OAAO,WAAW,kCAAkC,EAAE;AACjE;AChUO,MAAMY,KAAqB;AAAA;AAAA,EAE9B,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA;AAAA,EAET,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA;AAAA,EAEN,cAAc;AAClB,GAsBaC,KAAuB;AAAA,EAChC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AACX;AC1DO,MAAMC,WAAiB,MAAM;AAAA,EAChC,YAAYlC,GAASmC,GAAMvC,IAAU,CAAA,GAAI;AACrC,UAAMI,CAAO,GACb,KAAK,OAAO,YACZ,KAAK,OAAOmC,GACZ,KAAK,SAASvC,EAAQ,UAAU,KAChC,KAAK,UAAUA,EAAQ,SACvB,KAAK,YAAY,oBAAI,KAAI,GACzB,KAAK,cAAcA,EAAQ,eAAe,IAC1C,KAAK,QAAQA,EAAQ,OAEjB,MAAM,qBACN,MAAM,kBAAkB,MAAM,KAAK,WAAW;AAAA,EAEtD;AAAA;AAAA;AAAA;AAAA,EAIA,SAAS;AACL,WAAO;AAAA,MACH,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,WAAW,KAAK,UAAU,YAAW;AAAA,MACrC,aAAa,KAAK;AAAA,MAClB,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK,OAAO;AAAA,IAC/B;AAAA,EACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAewC,GAAW;AACtB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAIA,cAAc;AACV,WAAO,KAAK;AAAA,EAChB;AACJ;ACnBO,SAASC,GAAQlD,GAAG;AACvB,MAAI,CAAC,OAAO,SAASA,CAAC;AAClB,UAAM,IAAI,UAAU,sCAAsCA,CAAC,EAAE;AAEjE,MAAI,CAAC,OAAO,UAAUA,CAAC;AACnB,UAAM,IAAI,UAAU,8BAA8BA,CAAC,EAAE;AAEzD,SAAOA;AACX;AA8BO,SAASmD,GAAWC,GAAG;AAC1B,MAAI,CAAC,sBAAsB,KAAKA,CAAC;AAC7B,UAAM,IAAI,UAAU,oCAAoC,KAAK,UAAUA,CAAC,CAAC,EAAE;AAG/E,QAAM,CAACC,GAAGC,GAAGC,CAAC,IAAIH,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM,GACnCI,IAAQ,IAAI,KAAK,KAAK,IAAIH,GAAGC,IAAI,GAAGC,CAAC,CAAC;AAC5C,MAAIC,EAAM,eAAc,MAAOH,KAC3BG,EAAM,kBAAkBF,IAAI,KAC5BE,EAAM,WAAU,MAAOD;AACvB,UAAM,IAAI,UAAU,8CAA8CH,CAAC,EAAE;AAEzE,SAAOA;AACX;AAKO,SAASK,GAAeL,GAAG;AAC9B,MAAI;AAEA,eAAI,KAAK,eAAe,SAAS,EAAE,UAAUA,EAAC,CAAE,EAAE,OAAO,oBAAI,MAAM,GAC5DA;AAAA,EACX,QACM;AACF,UAAM,IAAI,UAAU,0CAA0CA,CAAC,EAAE;AAAA,EACrE;AACJ;AAkBA,SAASM,GAAQC,GAAO;AACpB,SAAO,CAAC3D,MAAM;AACV,QAAI,CAAC,OAAO,UAAUA,CAAC,KAAKA,KAAK;AAC7B,YAAM,IAAI,UAAU,GAAG2D,CAAK,oCAAoC3D,CAAC,EAAE;AAEvE,WAAOA;AAAA,EACX;AACJ;AAEO,MAAM4D,KAAYF,GAAQ,SAAS;AAoB1C,SAASG,GAAQF,GAAOG,GAAM;AAC1B,SAAO,CAACzP,MAAU;AACd,QAAI2L;AACJ,QAAI,OAAO3L,KAAU,UAAU;AAG3B,UAAI,CAAC,UAAU,KAAKA,CAAK;AACrB,cAAM,IAAI,UAAU,GAAGsP,CAAK,0CAA0C,KAAK,UAAUtP,CAAK,CAAC,EAAE;AAMjG,UAJA2L,IAAI,OAAO3L,CAAK,GAIZ,CAAC,OAAO,cAAc2L,CAAC;AACvB,cAAM,IAAI,UAAU,GAAG2D,CAAK,oCAAoC,KAAK,UAAUtP,CAAK,CAAC,EAAE;AAAA,IAE/F,WAEI2L,IAAI3L,GAIA,OAAO,SAAS2L,CAAC,KAAK,CAAC,OAAO,cAAcA,CAAC,KAAK,OAAO,UAAUA,CAAC;AACpE,YAAM,IAAI,UAAU,GAAG2D,CAAK,oCAAoCtP,CAAK,EAAE;AAG/E,QAAI,CAAC,OAAO,SAAS2L,CAAC;AAClB,YAAM,IAAI,UAAU,GAAG2D,CAAK,iCAAiC,KAAK,UAAUtP,CAAK,CAAC,EAAE;AAExF,WAAOyP,EAAK9D,CAAC;AAAA,EACjB;AACJ;AACY,MAAC+D,KAAeF,GAAQ,WAAWD,EAAS,GA2E3CI,KAAiB,CAACZ,MAAMA,GA2ExBa,KAAiB,CAACC,MAAM,OAAOA,KAAM,YAAY,6BAA6B,KAAKA,CAAC,GAqBpFC,KAAaT,GAAQ,UAAU,GA6M/BU,KAAe,CAAChB,MAAMA;AC/hB5B,MAAMiB,WAAsB,MAAM;AAAA,EACrC,YAAYxD,GAASmC,GAAMsB,GAAS;AAChC,UAAMzD,CAAO,GACb,KAAK,OAAOmC,GACZ,KAAK,UAAUsB,GACf,KAAK,OAAO;AAAA,EAChB;AACJ;AAIO,IAAIC;AAAA,CACV,SAAUA,GAAmB;AAC1B,EAAAA,EAAkB,mBAAsB,oBACxCA,EAAkB,qBAAwB,sBAC1CA,EAAkB,eAAkB,gBACpCA,EAAkB,eAAkB,gBACpCA,EAAkB,mBAAsB,oBACxCA,EAAkB,cAAiB;AACvC,GAAGA,OAAsBA,KAAoB,CAAA,EAAG;ACOzC,MAAMC,KAAe;AAAA;AAAA,EAIxB,UAAU;AAAA;AAAA,EAgDV,aAAa;AAAA;AAAA,EAEb,YAAY;AAKhB,GAsBaC,KAAmBhB,GAAe,qBAAqB,GAmDvDiB,KAAsB;AAAA,EAC/B,KAAO;AAAA,EACP,KAAO;AAAA;AAAA;AAAA,EAGP,GAAK;AAAA;AAAA,EAEL,kBAAkB;AAAA,EAClB,YAAc;AAAA,EACd,eAAe;AAAA,EACf,mBAAmB;AAAA;AAAA,EAEnB,YAAY;AAAA,EACZ,gBAAgB;AAAA;AAAA,EAEhB,SAAW;AAAA,EACX,eAAe;AAAA;AAAA,EAEf,QAAU;AAAA,EACV,cAAc;AAAA;AAAA,EAEd,SAAW;AAAA,EACX,eAAe;AAAA;AAAA;AAAA;AAAA,EAIf,SAAW;AAAA,EACX,UAAY;AAAA,EACZ,SAAW;AAAA,EACX,SAAW;AAAA,EACX,KAAO;AAAA,EACP,MAAQ;AAAA,EACR,MAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA;AAAA,EACV,UAAU;AACd,GCzMMC,KAA0B,oBAAI,IAAG,GAKjCC,KAAyB,oBAAI,IAAI;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,CAAC;AAaM,SAASC,GAAgBC,GAAU;AAKtC,MAJI,CAACA,KAAY,OAAOA,KAAa,YAIjCF,GAAuB,IAAIE,EAAS,YAAW,CAAE;AACjD,WAAO;AAGX,QAAMC,IAASJ,GAAwB,IAAIG,CAAQ;AACnD,MAAIC,MAAW;AACX,WAAOA;AAEX,MAAI;AAGA,gBAAK,eAAe,QAAW,EAAE,UAAUD,EAAQ,CAAE,GACrDH,GAAwB,IAAIG,GAAU,EAAI,GACnC;AAAA,EACX,QACM;AACF,WAAAH,GAAwB,IAAIG,GAAU,EAAK,GACpC;AAAA,EACX;AACJ;AAiEO,SAASE,GAAcC,GAAQC,GAAe;AAIjD,QAAMC,IAAMF,GAAQ,YAChBA,GAAQ,YACRA,GAAQ,YACRA,GAAQ,YACRC,GAAe,YACfA,GAAe,YACfA,GAAe,YACfA,GAAe;AAInB,SAAOlB,GAAeoB,GAAgBD,KAAO,IAAI,CAAC;AACtD;AAwNO,SAASE,GAAkBP,GAAU;AACxC,MAAI,CAACA,KAAY,OAAOA,KAAa;AACjC,UAAM,IAAIT,GAAc,wBAAwBE,GAAkB,gBAAgB;AAEtF,QAAMe,IAAUR,EAAS,KAAI;AAE7B,MAAID,GAAgBS,CAAO;AACvB,WAAOA;AAuBX,QAAMC,IApBkB;AAAA,IACpB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,KAAK;AAAA,IACL,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,EACb,EACuCD,EAAQ,YAAW,CAAE;AACxD,MAAIC;AACA,WAAOA;AAEX,QAAM,IAAIlB,GAAc,8BAA8BS,CAAQ,IAAIP,GAAkB,kBAAkB,EAAE,UAAAO,GAAU;AACtH;AA0DO,SAASM,GAAgBI,GAAU;AACtC,MAAI,CAACA,KAAYA,MAAa;AAC1B,WAAOf;AAGX,QAAMgB,IAAcf,GAAoBc,CAAQ;AAChD,MAAIC;AACA,WAAOA;AAGX,MAAIZ,GAAgBW,CAAQ;AACxB,WAAOA;AAGX,MAAI;AACA,WAAOH,GAAkBG,CAAQ;AAAA,EACrC,QACM;AAEF,WAAOf;AAAA,EACX;AACJ;AC3ZO,MAAMiB,KAAqB,QAOrBC,KAAoB,OAoIpBC,KAAsB,uBAAO,IAAI,mBAAmB;AClL1D,SAASC,GAAcC,GAAMzR,GAAO;AACzC,SAAI,OAAOyR,KAAS,aAAmBA,EAAKzR,CAAK,IAE7CyR,KAAQ,OAAOA,KAAS,YAAYF,MAAuBE,IACtDA,EAAKF,EAAmB,EAAEvR,CAAK,IAEpCyR,aAAgB,OAAa,IAAIA,EAAK,YAAYzR,CAAK,IAEpD,IAAI,KAAKA,CAAK;AACvB;ACNO,SAAS0R,GAAO/N,GAAUgO,GAAS;AAExC,SAAOH,GAAcG,KAAWhO,GAAUA,CAAQ;AACpD;AC3CA,IAAIiO,KAAiB,CAAA;AAEd,SAASC,KAAoB;AAClC,SAAOD;AACT;AC8BO,SAASE,GAAYL,GAAMrF,GAAS;AACzC,QAAMwF,IAAiBC,GAAiB,GAClCE,IACJ3F,GAAS,gBACTA,GAAS,QAAQ,SAAS,gBAC1BwF,EAAe,gBACfA,EAAe,QAAQ,SAAS,gBAChC,GAEII,IAAQN,GAAOD,GAAMrF,GAAS,EAAE,GAChC6F,IAAMD,EAAM,OAAM,GAClBE,KAAQD,IAAMF,IAAe,IAAI,KAAKE,IAAMF;AAElD,SAAAC,EAAM,QAAQA,EAAM,QAAO,IAAKE,CAAI,GACpCF,EAAM,SAAS,GAAG,GAAG,GAAG,CAAC,GAClBA;AACT;ACpBO,SAASG,GAAeV,GAAMrF,GAAS;AAC5C,SAAO0F,GAAYL,GAAM,EAAE,GAAGrF,GAAS,cAAc,GAAG;AAC1D;ACJO,SAASgG,GAAeX,GAAMrF,GAAS;AAC5C,QAAM4F,IAAQN,GAAOD,GAAMrF,GAAS,EAAE,GAChCiG,IAAOL,EAAM,YAAW,GAExBM,IAA4Bd,GAAcQ,GAAO,CAAC;AACxD,EAAAM,EAA0B,YAAYD,IAAO,GAAG,GAAG,CAAC,GACpDC,EAA0B,SAAS,GAAG,GAAG,GAAG,CAAC;AAC7C,QAAMC,IAAkBJ,GAAeG,CAAyB,GAE1DE,IAA4BhB,GAAcQ,GAAO,CAAC;AACxD,EAAAQ,EAA0B,YAAYH,GAAM,GAAG,CAAC,GAChDG,EAA0B,SAAS,GAAG,GAAG,GAAG,CAAC;AAC7C,QAAMC,IAAkBN,GAAeK,CAAyB;AAEhE,SAAIR,EAAM,QAAO,KAAMO,EAAgB,QAAO,IACrCF,IAAO,IACLL,EAAM,QAAO,KAAMS,EAAgB,QAAO,IAC5CJ,IAEAA,IAAO;AAElB;ACpCO,SAASK,GAAgCjB,GAAM;AACpD,QAAMO,IAAQN,GAAOD,CAAI,GACnBkB,IAAU,IAAI;AAAA,IAClB,KAAK;AAAA,MACHX,EAAM,YAAW;AAAA,MACjBA,EAAM,SAAQ;AAAA,MACdA,EAAM,QAAO;AAAA,MACbA,EAAM,SAAQ;AAAA,MACdA,EAAM,WAAU;AAAA,MAChBA,EAAM,WAAU;AAAA,MAChBA,EAAM,gBAAe;AAAA,IAC3B;AAAA,EACA;AACE,SAAAW,EAAQ,eAAeX,EAAM,aAAa,GACnC,CAACP,IAAO,CAACkB;AAClB;AC1BO,SAASC,GAAejB,MAAYkB,GAAO;AAChD,QAAMC,IAAYtB,GAAc;AAAA,IAC9B;AAAA,IACWqB,EAAM,KAAK,CAACpB,MAAS,OAAOA,KAAS,QAAQ;AAAA,EAC5D;AACE,SAAOoB,EAAM,IAAIC,CAAS;AAC5B;ACoBO,SAASC,GAAWtB,GAAMrF,GAAS;AACxC,QAAM4F,IAAQN,GAAOD,GAAMrF,GAAS,EAAE;AACtC,SAAA4F,EAAM,SAAS,GAAG,GAAG,GAAG,CAAC,GAClBA;AACT;ACQO,SAASgB,GAAyBC,GAAWC,GAAa9G,GAAS;AACxE,QAAM,CAAC+G,GAAYC,CAAY,IAAIR;AAAA,IACjCxG,GAAS;AAAA,IACT6G;AAAA,IACAC;AAAA,EACJ,GAEQG,IAAkBN,GAAWI,CAAU,GACvCG,IAAoBP,GAAWK,CAAY,GAE3CG,IACJ,CAACF,IAAkBX,GAAgCW,CAAe,GAC9DG,IACJ,CAACF,IAAoBZ,GAAgCY,CAAiB;AAKxE,SAAO,KAAK,OAAOC,IAAiBC,KAAoBlC,EAAiB;AAC3E;AC1BO,SAASmC,GAAmBhC,GAAMrF,GAAS;AAChD,QAAMiG,IAAOD,GAAeX,GAAMrF,CAAO,GACnCsH,IAAkBlC,GAA6BC,GAAM,CAAC;AAC5D,SAAAiC,EAAgB,YAAYrB,GAAM,GAAG,CAAC,GACtCqB,EAAgB,SAAS,GAAG,GAAG,GAAG,CAAC,GAC5BvB,GAAeuB,CAAe;AACvC;ACPO,SAASC,GAAO3T,GAAO;AAC5B,SACEA,aAAiB,QAChB,OAAOA,KAAU,YAChB,OAAO,UAAU,SAAS,KAAKA,CAAK,MAAM;AAEhD;ACJO,SAAS4T,GAAQnC,GAAM;AAC5B,SAAO,EAAG,CAACkC,GAAOlC,CAAI,KAAK,OAAOA,KAAS,YAAa,MAAM,CAACC,GAAOD,CAAI,CAAC;AAC7E;ACRO,SAASoC,GAAYpC,GAAMrF,GAAS;AACzC,QAAM0H,IAAQpC,GAAOD,GAAMrF,GAAS,EAAE;AACtC,SAAA0H,EAAM,YAAYA,EAAM,YAAW,GAAI,GAAG,CAAC,GAC3CA,EAAM,SAAS,GAAG,GAAG,GAAG,CAAC,GAClBA;AACT;ACjCA,MAAMC,KAAuB;AAAA,EAC3B,kBAAkB;AAAA,IAChB,KAAK;AAAA,IACL,OAAO;AAAA,EACX;AAAA,EAEE,UAAU;AAAA,IACR,KAAK;AAAA,IACL,OAAO;AAAA,EACX;AAAA,EAEE,aAAa;AAAA,EAEb,kBAAkB;AAAA,IAChB,KAAK;AAAA,IACL,OAAO;AAAA,EACX;AAAA,EAEE,UAAU;AAAA,IACR,KAAK;AAAA,IACL,OAAO;AAAA,EACX;AAAA,EAEE,aAAa;AAAA,IACX,KAAK;AAAA,IACL,OAAO;AAAA,EACX;AAAA,EAEE,QAAQ;AAAA,IACN,KAAK;AAAA,IACL,OAAO;AAAA,EACX;AAAA,EAEE,OAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO;AAAA,EACX;AAAA,EAEE,aAAa;AAAA,IACX,KAAK;AAAA,IACL,OAAO;AAAA,EACX;AAAA,EAEE,QAAQ;AAAA,IACN,KAAK;AAAA,IACL,OAAO;AAAA,EACX;AAAA,EAEE,cAAc;AAAA,IACZ,KAAK;AAAA,IACL,OAAO;AAAA,EACX;AAAA,EAEE,SAAS;AAAA,IACP,KAAK;AAAA,IACL,OAAO;AAAA,EACX;AAAA,EAEE,aAAa;AAAA,IACX,KAAK;AAAA,IACL,OAAO;AAAA,EACX;AAAA,EAEE,QAAQ;AAAA,IACN,KAAK;AAAA,IACL,OAAO;AAAA,EACX;AAAA,EAEE,YAAY;AAAA,IACV,KAAK;AAAA,IACL,OAAO;AAAA,EACX;AAAA,EAEE,cAAc;AAAA,IACZ,KAAK;AAAA,IACL,OAAO;AAAA,EACX;AACA,GAEaC,KAAiB,CAACC,GAAOC,GAAO9H,MAAY;AACvD,MAAI5N;AAEJ,QAAM2V,IAAaJ,GAAqBE,CAAK;AAS7C,SARI,OAAOE,KAAe,WACxB3V,IAAS2V,IACAD,MAAU,IACnB1V,IAAS2V,EAAW,MAEpB3V,IAAS2V,EAAW,MAAM,QAAQ,aAAaD,EAAM,UAAU,GAG7D9H,GAAS,YACPA,EAAQ,cAAcA,EAAQ,aAAa,IACtC,QAAQ5N,IAERA,IAAS,SAIbA;AACT;ACpGO,SAAS4V,GAAkBxP,GAAM;AACtC,SAAO,CAACwH,IAAU,OAAO;AAEvB,UAAMqB,IAAQrB,EAAQ,QAAQ,OAAOA,EAAQ,KAAK,IAAIxH,EAAK;AAE3D,WADeA,EAAK,QAAQ6I,CAAK,KAAK7I,EAAK,QAAQA,EAAK,YAAY;AAAA,EAEtE;AACF;ACLA,MAAMyP,KAAc;AAAA,EAClB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AACT,GAEMC,KAAc;AAAA,EAClB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AACT,GAEMC,KAAkB;AAAA,EACtB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AACT,GAEaC,KAAa;AAAA,EACxB,MAAMJ,GAAkB;AAAA,IACtB,SAASC;AAAA,IACT,cAAc;AAAA,EAClB,CAAG;AAAA,EAED,MAAMD,GAAkB;AAAA,IACtB,SAASE;AAAA,IACT,cAAc;AAAA,EAClB,CAAG;AAAA,EAED,UAAUF,GAAkB;AAAA,IAC1B,SAASG;AAAA,IACT,cAAc;AAAA,EAClB,CAAG;AACH,GCtCME,KAAuB;AAAA,EAC3B,UAAU;AAAA,EACV,WAAW;AAAA,EACX,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,OAAO;AACT,GAEaC,KAAiB,CAACT,GAAOjC,GAAO2C,GAAWC,MACtDH,GAAqBR,CAAK;AC6BrB,SAASY,GAAgBjQ,GAAM;AACpC,SAAO,CAAC5E,GAAOoM,MAAY;AACzB,UAAMuF,IAAUvF,GAAS,UAAU,OAAOA,EAAQ,OAAO,IAAI;AAE7D,QAAI0I;AACJ,QAAInD,MAAY,gBAAgB/M,EAAK,kBAAkB;AACrD,YAAMmQ,IAAenQ,EAAK,0BAA0BA,EAAK,cACnD6I,IAAQrB,GAAS,QAAQ,OAAOA,EAAQ,KAAK,IAAI2I;AAEvD,MAAAD,IACElQ,EAAK,iBAAiB6I,CAAK,KAAK7I,EAAK,iBAAiBmQ,CAAY;AAAA,IACtE,OAAO;AACL,YAAMA,IAAenQ,EAAK,cACpB6I,IAAQrB,GAAS,QAAQ,OAAOA,EAAQ,KAAK,IAAIxH,EAAK;AAE5D,MAAAkQ,IAAclQ,EAAK,OAAO6I,CAAK,KAAK7I,EAAK,OAAOmQ,CAAY;AAAA,IAC9D;AACA,UAAMjT,IAAQ8C,EAAK,mBAAmBA,EAAK,iBAAiB5E,CAAK,IAAIA;AAGrE,WAAO8U,EAAYhT,CAAK;AAAA,EAC1B;AACF;AC3DA,MAAMkT,KAAY;AAAA,EAChB,QAAQ,CAAC,KAAK,GAAG;AAAA,EACjB,aAAa,CAAC,MAAM,IAAI;AAAA,EACxB,MAAM,CAAC,iBAAiB,aAAa;AACvC,GAEMC,KAAgB;AAAA,EACpB,QAAQ,CAAC,KAAK,KAAK,KAAK,GAAG;AAAA,EAC3B,aAAa,CAAC,MAAM,MAAM,MAAM,IAAI;AAAA,EACpC,MAAM,CAAC,eAAe,eAAe,eAAe,aAAa;AACnE,GAMMC,KAAc;AAAA,EAClB,QAAQ,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EACnE,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAAA,EAEE,MAAM;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,EACJ;AACA,GAEMC,KAAY;AAAA,EAChB,QAAQ,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EAC1C,OAAO,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,EAChD,aAAa,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,EAC7D,MAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAEMC,KAAkB;AAAA,EACtB,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,SAAS;AAAA,IACT,OAAO;AAAA,EACX;AAAA,EACE,aAAa;AAAA,IACX,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,SAAS;AAAA,IACT,OAAO;AAAA,EACX;AAAA,EACE,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,SAAS;AAAA,IACT,OAAO;AAAA,EACX;AACA,GAEMC,KAA4B;AAAA,EAChC,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,SAAS;AAAA,IACT,OAAO;AAAA,EACX;AAAA,EACE,aAAa;AAAA,IACX,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,SAAS;AAAA,IACT,OAAO;AAAA,EACX;AAAA,EACE,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,SAAS;AAAA,IACT,OAAO;AAAA,EACX;AACA,GAEMC,KAAgB,CAACC,GAAaX,MAAa;AAC/C,QAAMY,IAAS,OAAOD,CAAW,GAS3BE,IAASD,IAAS;AACxB,MAAIC,IAAS,MAAMA,IAAS;AAC1B,YAAQA,IAAS,IAAE;AAAA,MACjB,KAAK;AACH,eAAOD,IAAS;AAAA,MAClB,KAAK;AACH,eAAOA,IAAS;AAAA,MAClB,KAAK;AACH,eAAOA,IAAS;AAAA,IACxB;AAEE,SAAOA,IAAS;AAClB,GAEaE,KAAW;AAAA,EACtB,eAAAJ;AAAA,EAEA,KAAKT,GAAgB;AAAA,IACnB,QAAQG;AAAA,IACR,cAAc;AAAA,EAClB,CAAG;AAAA,EAED,SAASH,GAAgB;AAAA,IACvB,QAAQI;AAAA,IACR,cAAc;AAAA,IACd,kBAAkB,CAACU,MAAYA,IAAU;AAAA,EAC7C,CAAG;AAAA,EAED,OAAOd,GAAgB;AAAA,IACrB,QAAQK;AAAA,IACR,cAAc;AAAA,EAClB,CAAG;AAAA,EAED,KAAKL,GAAgB;AAAA,IACnB,QAAQM;AAAA,IACR,cAAc;AAAA,EAClB,CAAG;AAAA,EAED,WAAWN,GAAgB;AAAA,IACzB,QAAQO;AAAA,IACR,cAAc;AAAA,IACd,kBAAkBC;AAAA,IAClB,wBAAwB;AAAA,EAC5B,CAAG;AACH;AC1LO,SAASO,GAAahR,GAAM;AACjC,SAAO,CAACf,GAAQuI,IAAU,OAAO;AAC/B,UAAMqB,IAAQrB,EAAQ,OAEhByJ,IACHpI,KAAS7I,EAAK,cAAc6I,CAAK,KAClC7I,EAAK,cAAcA,EAAK,iBAAiB,GACrCkR,IAAcjS,EAAO,MAAMgS,CAAY;AAE7C,QAAI,CAACC;AACH,aAAO;AAET,UAAMC,IAAgBD,EAAY,CAAC,GAE7BE,IACHvI,KAAS7I,EAAK,cAAc6I,CAAK,KAClC7I,EAAK,cAAcA,EAAK,iBAAiB,GAErC7E,IAAM,MAAM,QAAQiW,CAAa,IACnCC,GAAUD,GAAe,CAACE,MAAYA,EAAQ,KAAKH,CAAa,CAAC;AAAA;AAAA,MAEjEI,GAAQH,GAAe,CAACE,MAAYA,EAAQ,KAAKH,CAAa,CAAC;AAAA;AAEnE,QAAI/V;AAEJ,IAAAA,IAAQ4E,EAAK,gBAAgBA,EAAK,cAAc7E,CAAG,IAAIA,GACvDC,IAAQoM,EAAQ;AAAA;AAAA,MAEZA,EAAQ,cAAcpM,CAAK;AAAA,QAC3BA;AAEJ,UAAMoW,IAAOvS,EAAO,MAAMkS,EAAc,MAAM;AAE9C,WAAO,EAAE,OAAA/V,GAAO,MAAAoW,EAAI;AAAA,EACtB;AACF;AAEA,SAASD,GAAQE,GAAQC,GAAW;AAClC,aAAWvW,KAAOsW;AAChB,QACE,OAAO,UAAU,eAAe,KAAKA,GAAQtW,CAAG,KAChDuW,EAAUD,EAAOtW,CAAG,CAAC;AAErB,aAAOA;AAIb;AAEA,SAASkW,GAAUM,GAAOD,GAAW;AACnC,WAASvW,IAAM,GAAGA,IAAMwW,EAAM,QAAQxW;AACpC,QAAIuW,EAAUC,EAAMxW,CAAG,CAAC;AACtB,aAAOA;AAIb;ACxDO,SAASyW,GAAoB5R,GAAM;AACxC,SAAO,CAACf,GAAQuI,IAAU,OAAO;AAC/B,UAAM0J,IAAcjS,EAAO,MAAMe,EAAK,YAAY;AAClD,QAAI,CAACkR,EAAa,QAAO;AACzB,UAAMC,IAAgBD,EAAY,CAAC,GAE7BW,IAAc5S,EAAO,MAAMe,EAAK,YAAY;AAClD,QAAI,CAAC6R,EAAa,QAAO;AACzB,QAAIzW,IAAQ4E,EAAK,gBACbA,EAAK,cAAc6R,EAAY,CAAC,CAAC,IACjCA,EAAY,CAAC;AAGjB,IAAAzW,IAAQoM,EAAQ,gBAAgBA,EAAQ,cAAcpM,CAAK,IAAIA;AAE/D,UAAMoW,IAAOvS,EAAO,MAAMkS,EAAc,MAAM;AAE9C,WAAO,EAAE,OAAA/V,GAAO,MAAAoW,EAAI;AAAA,EACtB;AACF;AChBA,MAAMM,KAA4B,yBAC5BC,KAA4B,QAE5BC,KAAmB;AAAA,EACvB,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,MAAM;AACR,GACMC,KAAmB;AAAA,EACvB,KAAK,CAAC,OAAO,SAAS;AACxB,GAEMC,KAAuB;AAAA,EAC3B,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,MAAM;AACR,GACMC,KAAuB;AAAA,EAC3B,KAAK,CAAC,MAAM,MAAM,MAAM,IAAI;AAC9B,GAEMC,KAAqB;AAAA,EACzB,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,MAAM;AACR,GACMC,KAAqB;AAAA,EACzB,QAAQ;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAAA,EAEE,KAAK;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAEMC,KAAmB;AAAA,EACvB,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,aAAa;AAAA,EACb,MAAM;AACR,GACMC,KAAmB;AAAA,EACvB,QAAQ,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,EACxD,KAAK,CAAC,QAAQ,OAAO,QAAQ,OAAO,QAAQ,OAAO,MAAM;AAC3D,GAEMC,KAAyB;AAAA,EAC7B,QAAQ;AAAA,EACR,KAAK;AACP,GACMC,KAAyB;AAAA,EAC7B,KAAK;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,SAAS;AAAA,IACT,OAAO;AAAA,EACX;AACA,GAEaC,KAAQ;AAAA,EACnB,eAAed,GAAoB;AAAA,IACjC,cAAcE;AAAA,IACd,cAAcC;AAAA,IACd,eAAe,CAAC3W,MAAU,SAASA,GAAO,EAAE;AAAA,EAChD,CAAG;AAAA,EAED,KAAK4V,GAAa;AAAA,IAChB,eAAegB;AAAA,IACf,mBAAmB;AAAA,IACnB,eAAeC;AAAA,IACf,mBAAmB;AAAA,EACvB,CAAG;AAAA,EAED,SAASjB,GAAa;AAAA,IACpB,eAAekB;AAAA,IACf,mBAAmB;AAAA,IACnB,eAAeC;AAAA,IACf,mBAAmB;AAAA,IACnB,eAAe,CAACjV,MAAUA,IAAQ;AAAA,EACtC,CAAG;AAAA,EAED,OAAO8T,GAAa;AAAA,IAClB,eAAeoB;AAAA,IACf,mBAAmB;AAAA,IACnB,eAAeC;AAAA,IACf,mBAAmB;AAAA,EACvB,CAAG;AAAA,EAED,KAAKrB,GAAa;AAAA,IAChB,eAAesB;AAAA,IACf,mBAAmB;AAAA,IACnB,eAAeC;AAAA,IACf,mBAAmB;AAAA,EACvB,CAAG;AAAA,EAED,WAAWvB,GAAa;AAAA,IACtB,eAAewB;AAAA,IACf,mBAAmB;AAAA,IACnB,eAAeC;AAAA,IACf,mBAAmB;AAAA,EACvB,CAAG;AACH,GCrHaE,KAAO;AAAA,EAClB,MAAM;AAAA,EACN,gBAAgBvD;AAAA,EAChB,YAAYQ;AAAA,EACZ,gBAAgBE;AAAA,EAChB,UAAUgB;AAAA,EACV,OAAO4B;AAAA,EACP,SAAS;AAAA,IACP,cAAc;AAAA,IACd,uBAAuB;AAAA,EAC3B;AACA;ACCO,SAASE,GAAa/F,GAAMrF,GAAS;AAC1C,QAAM4F,IAAQN,GAAOD,GAAMrF,GAAS,EAAE;AAGtC,SAFa4G,GAAyBhB,GAAO6B,GAAY7B,CAAK,CAAC,IACtC;AAE3B;ACFO,SAASyF,GAAWhG,GAAMrF,GAAS;AACxC,QAAM4F,IAAQN,GAAOD,GAAMrF,GAAS,EAAE,GAChC8F,IAAO,CAACC,GAAeH,CAAK,IAAI,CAACyB,GAAmBzB,CAAK;AAK/D,SAAO,KAAK,MAAME,IAAOb,EAAkB,IAAI;AACjD;ACMO,SAASqG,GAAYjG,GAAMrF,GAAS;AACzC,QAAM4F,IAAQN,GAAOD,GAAMrF,GAAS,EAAE,GAChCiG,IAAOL,EAAM,YAAW,GAExBJ,IAAiBC,GAAiB,GAClC8F,IACJvL,GAAS,yBACTA,GAAS,QAAQ,SAAS,yBAC1BwF,EAAe,yBACfA,EAAe,QAAQ,SAAS,yBAChC,GAEIgG,IAAsBpG,GAAcpF,GAAS,MAAMqF,GAAM,CAAC;AAChE,EAAAmG,EAAoB,YAAYvF,IAAO,GAAG,GAAGsF,CAAqB,GAClEC,EAAoB,SAAS,GAAG,GAAG,GAAG,CAAC;AACvC,QAAMrF,IAAkBT,GAAY8F,GAAqBxL,CAAO,GAE1DyL,IAAsBrG,GAAcpF,GAAS,MAAMqF,GAAM,CAAC;AAChE,EAAAoG,EAAoB,YAAYxF,GAAM,GAAGsF,CAAqB,GAC9DE,EAAoB,SAAS,GAAG,GAAG,GAAG,CAAC;AACvC,QAAMpF,IAAkBX,GAAY+F,GAAqBzL,CAAO;AAEhE,SAAI,CAAC4F,KAAS,CAACO,IACNF,IAAO,IACL,CAACL,KAAS,CAACS,IACbJ,IAEAA,IAAO;AAElB;AC1BO,SAASyF,GAAgBrG,GAAMrF,GAAS;AAC7C,QAAMwF,IAAiBC,GAAiB,GAClC8F,IACJvL,GAAS,yBACTA,GAAS,QAAQ,SAAS,yBAC1BwF,EAAe,yBACfA,EAAe,QAAQ,SAAS,yBAChC,GAEIS,IAAOqF,GAAYjG,GAAMrF,CAAO,GAChC2L,IAAYvG,GAAcpF,GAAS,MAAMqF,GAAM,CAAC;AACtD,SAAAsG,EAAU,YAAY1F,GAAM,GAAGsF,CAAqB,GACpDI,EAAU,SAAS,GAAG,GAAG,GAAG,CAAC,GACfjG,GAAYiG,GAAW3L,CAAO;AAE9C;AClBO,SAAS4L,GAAQvG,GAAMrF,GAAS;AACrC,QAAM4F,IAAQN,GAAOD,GAAMrF,GAAS,EAAE,GAChC8F,IAAO,CAACJ,GAAYE,GAAO5F,CAAO,IAAI,CAAC0L,GAAgB9F,GAAO5F,CAAO;AAK3E,SAAO,KAAK,MAAM8F,IAAOb,EAAkB,IAAI;AACjD;ACnDO,SAAS4G,GAAgBzC,GAAQ0C,GAAc;AACpD,QAAMC,IAAO3C,IAAS,IAAI,MAAM,IAC1B4C,IAAS,KAAK,IAAI5C,CAAM,EAAE,WAAW,SAAS0C,GAAc,GAAG;AACrE,SAAOC,IAAOC;AAChB;ACWO,MAAMC,KAAkB;AAAA;AAAA,EAE7B,EAAE5G,GAAMwC,GAAO;AAUb,UAAMqE,IAAa7G,EAAK,YAAW,GAE7BY,IAAOiG,IAAa,IAAIA,IAAa,IAAIA;AAC/C,WAAOL,GAAgBhE,MAAU,OAAO5B,IAAO,MAAMA,GAAM4B,EAAM,MAAM;AAAA,EACzE;AAAA;AAAA,EAGA,EAAExC,GAAMwC,GAAO;AACb,UAAMsE,IAAQ9G,EAAK,SAAQ;AAC3B,WAAOwC,MAAU,MAAM,OAAOsE,IAAQ,CAAC,IAAIN,GAAgBM,IAAQ,GAAG,CAAC;AAAA,EACzE;AAAA;AAAA,EAGA,EAAE9G,GAAMwC,GAAO;AACb,WAAOgE,GAAgBxG,EAAK,QAAO,GAAIwC,EAAM,MAAM;AAAA,EACrD;AAAA;AAAA,EAGA,EAAExC,GAAMwC,GAAO;AACb,UAAMuE,IAAqB/G,EAAK,SAAQ,IAAK,MAAM,IAAI,OAAO;AAE9D,YAAQwC,GAAK;AAAA,MACX,KAAK;AAAA,MACL,KAAK;AACH,eAAOuE,EAAmB,YAAW;AAAA,MACvC,KAAK;AACH,eAAOA;AAAA,MACT,KAAK;AACH,eAAOA,EAAmB,CAAC;AAAA,MAE7B;AACE,eAAOA,MAAuB,OAAO,SAAS;AAAA,IACtD;AAAA,EACE;AAAA;AAAA,EAGA,EAAE/G,GAAMwC,GAAO;AACb,WAAOgE,GAAgBxG,EAAK,SAAQ,IAAK,MAAM,IAAIwC,EAAM,MAAM;AAAA,EACjE;AAAA;AAAA,EAGA,EAAExC,GAAMwC,GAAO;AACb,WAAOgE,GAAgBxG,EAAK,SAAQ,GAAIwC,EAAM,MAAM;AAAA,EACtD;AAAA;AAAA,EAGA,EAAExC,GAAMwC,GAAO;AACb,WAAOgE,GAAgBxG,EAAK,WAAU,GAAIwC,EAAM,MAAM;AAAA,EACxD;AAAA;AAAA,EAGA,EAAExC,GAAMwC,GAAO;AACb,WAAOgE,GAAgBxG,EAAK,WAAU,GAAIwC,EAAM,MAAM;AAAA,EACxD;AAAA;AAAA,EAGA,EAAExC,GAAMwC,GAAO;AACb,UAAMwE,IAAiBxE,EAAM,QACvByE,IAAejH,EAAK,gBAAe,GACnCkH,IAAoB,KAAK;AAAA,MAC7BD,IAAe,KAAK,IAAI,IAAID,IAAiB,CAAC;AAAA,IACpD;AACI,WAAOR,GAAgBU,GAAmB1E,EAAM,MAAM;AAAA,EACxD;AACF,GClFM2E,KAAgB;AAAA,EAGpB,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AAAA,EACT,OAAO;AACT,GAgDaC,KAAa;AAAA;AAAA,EAExB,GAAG,SAAUpH,GAAMwC,GAAOyB,GAAU;AAClC,UAAMoD,IAAMrH,EAAK,YAAW,IAAK,IAAI,IAAI;AACzC,YAAQwC,GAAK;AAAA;AAAA,MAEX,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAOyB,EAAS,IAAIoD,GAAK,EAAE,OAAO,cAAa,CAAE;AAAA;AAAA,MAEnD,KAAK;AACH,eAAOpD,EAAS,IAAIoD,GAAK,EAAE,OAAO,SAAQ,CAAE;AAAA,MAG9C;AACE,eAAOpD,EAAS,IAAIoD,GAAK,EAAE,OAAO,OAAM,CAAE;AAAA,IAClD;AAAA,EACE;AAAA;AAAA,EAGA,GAAG,SAAUrH,GAAMwC,GAAOyB,GAAU;AAElC,QAAIzB,MAAU,MAAM;AAClB,YAAMqE,IAAa7G,EAAK,YAAW,GAE7BY,IAAOiG,IAAa,IAAIA,IAAa,IAAIA;AAC/C,aAAO5C,EAAS,cAAcrD,GAAM,EAAE,MAAM,OAAM,CAAE;AAAA,IACtD;AAEA,WAAOgG,GAAgB,EAAE5G,GAAMwC,CAAK;AAAA,EACtC;AAAA;AAAA,EAGA,GAAG,SAAUxC,GAAMwC,GAAOyB,GAAUtJ,GAAS;AAC3C,UAAM2M,IAAiBrB,GAAYjG,GAAMrF,CAAO,GAE1C4M,IAAWD,IAAiB,IAAIA,IAAiB,IAAIA;AAG3D,QAAI9E,MAAU,MAAM;AAClB,YAAMgF,IAAeD,IAAW;AAChC,aAAOf,GAAgBgB,GAAc,CAAC;AAAA,IACxC;AAGA,WAAIhF,MAAU,OACLyB,EAAS,cAAcsD,GAAU,EAAE,MAAM,OAAM,CAAE,IAInDf,GAAgBe,GAAU/E,EAAM,MAAM;AAAA,EAC/C;AAAA;AAAA,EAGA,GAAG,SAAUxC,GAAMwC,GAAO;AACxB,UAAMiF,IAAc9G,GAAeX,CAAI;AAGvC,WAAOwG,GAAgBiB,GAAajF,EAAM,MAAM;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,GAAG,SAAUxC,GAAMwC,GAAO;AACxB,UAAM5B,IAAOZ,EAAK,YAAW;AAC7B,WAAOwG,GAAgB5F,GAAM4B,EAAM,MAAM;AAAA,EAC3C;AAAA;AAAA,EAGA,GAAG,SAAUxC,GAAMwC,GAAOyB,GAAU;AAClC,UAAMC,IAAU,KAAK,MAAMlE,EAAK,SAAQ,IAAK,KAAK,CAAC;AACnD,YAAQwC,GAAK;AAAA;AAAA,MAEX,KAAK;AACH,eAAO,OAAO0B,CAAO;AAAA;AAAA,MAEvB,KAAK;AACH,eAAOsC,GAAgBtC,GAAS,CAAC;AAAA;AAAA,MAEnC,KAAK;AACH,eAAOD,EAAS,cAAcC,GAAS,EAAE,MAAM,UAAS,CAAE;AAAA;AAAA,MAE5D,KAAK;AACH,eAAOD,EAAS,QAAQC,GAAS;AAAA,UAC/B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA;AAAA,MAEH,KAAK;AACH,eAAOD,EAAS,QAAQC,GAAS;AAAA,UAC/B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,MAGH;AACE,eAAOD,EAAS,QAAQC,GAAS;AAAA,UAC/B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,IACT;AAAA,EACE;AAAA;AAAA,EAGA,GAAG,SAAUlE,GAAMwC,GAAOyB,GAAU;AAClC,UAAMC,IAAU,KAAK,MAAMlE,EAAK,SAAQ,IAAK,KAAK,CAAC;AACnD,YAAQwC,GAAK;AAAA;AAAA,MAEX,KAAK;AACH,eAAO,OAAO0B,CAAO;AAAA;AAAA,MAEvB,KAAK;AACH,eAAOsC,GAAgBtC,GAAS,CAAC;AAAA;AAAA,MAEnC,KAAK;AACH,eAAOD,EAAS,cAAcC,GAAS,EAAE,MAAM,UAAS,CAAE;AAAA;AAAA,MAE5D,KAAK;AACH,eAAOD,EAAS,QAAQC,GAAS;AAAA,UAC/B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA;AAAA,MAEH,KAAK;AACH,eAAOD,EAAS,QAAQC,GAAS;AAAA,UAC/B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,MAGH;AACE,eAAOD,EAAS,QAAQC,GAAS;AAAA,UAC/B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,IACT;AAAA,EACE;AAAA;AAAA,EAGA,GAAG,SAAUlE,GAAMwC,GAAOyB,GAAU;AAClC,UAAM6C,IAAQ9G,EAAK,SAAQ;AAC3B,YAAQwC,GAAK;AAAA,MACX,KAAK;AAAA,MACL,KAAK;AACH,eAAOoE,GAAgB,EAAE5G,GAAMwC,CAAK;AAAA;AAAA,MAEtC,KAAK;AACH,eAAOyB,EAAS,cAAc6C,IAAQ,GAAG,EAAE,MAAM,SAAS;AAAA;AAAA,MAE5D,KAAK;AACH,eAAO7C,EAAS,MAAM6C,GAAO;AAAA,UAC3B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA;AAAA,MAEH,KAAK;AACH,eAAO7C,EAAS,MAAM6C,GAAO;AAAA,UAC3B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,MAGH;AACE,eAAO7C,EAAS,MAAM6C,GAAO,EAAE,OAAO,QAAQ,SAAS,cAAc;AAAA,IAC7E;AAAA,EACE;AAAA;AAAA,EAGA,GAAG,SAAU9G,GAAMwC,GAAOyB,GAAU;AAClC,UAAM6C,IAAQ9G,EAAK,SAAQ;AAC3B,YAAQwC,GAAK;AAAA;AAAA,MAEX,KAAK;AACH,eAAO,OAAOsE,IAAQ,CAAC;AAAA;AAAA,MAEzB,KAAK;AACH,eAAON,GAAgBM,IAAQ,GAAG,CAAC;AAAA;AAAA,MAErC,KAAK;AACH,eAAO7C,EAAS,cAAc6C,IAAQ,GAAG,EAAE,MAAM,SAAS;AAAA;AAAA,MAE5D,KAAK;AACH,eAAO7C,EAAS,MAAM6C,GAAO;AAAA,UAC3B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA;AAAA,MAEH,KAAK;AACH,eAAO7C,EAAS,MAAM6C,GAAO;AAAA,UAC3B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,MAGH;AACE,eAAO7C,EAAS,MAAM6C,GAAO,EAAE,OAAO,QAAQ,SAAS,cAAc;AAAA,IAC7E;AAAA,EACE;AAAA;AAAA,EAGA,GAAG,SAAU9G,GAAMwC,GAAOyB,GAAUtJ,GAAS;AAC3C,UAAM+M,IAAOnB,GAAQvG,GAAMrF,CAAO;AAElC,WAAI6H,MAAU,OACLyB,EAAS,cAAcyD,GAAM,EAAE,MAAM,OAAM,CAAE,IAG/ClB,GAAgBkB,GAAMlF,EAAM,MAAM;AAAA,EAC3C;AAAA;AAAA,EAGA,GAAG,SAAUxC,GAAMwC,GAAOyB,GAAU;AAClC,UAAM0D,IAAU3B,GAAWhG,CAAI;AAE/B,WAAIwC,MAAU,OACLyB,EAAS,cAAc0D,GAAS,EAAE,MAAM,OAAM,CAAE,IAGlDnB,GAAgBmB,GAASnF,EAAM,MAAM;AAAA,EAC9C;AAAA;AAAA,EAGA,GAAG,SAAUxC,GAAMwC,GAAOyB,GAAU;AAClC,WAAIzB,MAAU,OACLyB,EAAS,cAAcjE,EAAK,QAAO,GAAI,EAAE,MAAM,QAAQ,IAGzD4G,GAAgB,EAAE5G,GAAMwC,CAAK;AAAA,EACtC;AAAA;AAAA,EAGA,GAAG,SAAUxC,GAAMwC,GAAOyB,GAAU;AAClC,UAAM2D,IAAY7B,GAAa/F,CAAI;AAEnC,WAAIwC,MAAU,OACLyB,EAAS,cAAc2D,GAAW,EAAE,MAAM,YAAW,CAAE,IAGzDpB,GAAgBoB,GAAWpF,EAAM,MAAM;AAAA,EAChD;AAAA;AAAA,EAGA,GAAG,SAAUxC,GAAMwC,GAAOyB,GAAU;AAClC,UAAM4D,IAAY7H,EAAK,OAAM;AAC7B,YAAQwC,GAAK;AAAA;AAAA,MAEX,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAOyB,EAAS,IAAI4D,GAAW;AAAA,UAC7B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA;AAAA,MAEH,KAAK;AACH,eAAO5D,EAAS,IAAI4D,GAAW;AAAA,UAC7B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA;AAAA,MAEH,KAAK;AACH,eAAO5D,EAAS,IAAI4D,GAAW;AAAA,UAC7B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,MAGH;AACE,eAAO5D,EAAS,IAAI4D,GAAW;AAAA,UAC7B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,IACT;AAAA,EACE;AAAA;AAAA,EAGA,GAAG,SAAU7H,GAAMwC,GAAOyB,GAAUtJ,GAAS;AAC3C,UAAMkN,IAAY7H,EAAK,OAAM,GACvB8H,KAAkBD,IAAYlN,EAAQ,eAAe,KAAK,KAAK;AACrE,YAAQ6H,GAAK;AAAA;AAAA,MAEX,KAAK;AACH,eAAO,OAAOsF,CAAc;AAAA;AAAA,MAE9B,KAAK;AACH,eAAOtB,GAAgBsB,GAAgB,CAAC;AAAA;AAAA,MAE1C,KAAK;AACH,eAAO7D,EAAS,cAAc6D,GAAgB,EAAE,MAAM,MAAK,CAAE;AAAA,MAC/D,KAAK;AACH,eAAO7D,EAAS,IAAI4D,GAAW;AAAA,UAC7B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA;AAAA,MAEH,KAAK;AACH,eAAO5D,EAAS,IAAI4D,GAAW;AAAA,UAC7B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA;AAAA,MAEH,KAAK;AACH,eAAO5D,EAAS,IAAI4D,GAAW;AAAA,UAC7B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,MAGH;AACE,eAAO5D,EAAS,IAAI4D,GAAW;AAAA,UAC7B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,IACT;AAAA,EACE;AAAA;AAAA,EAGA,GAAG,SAAU7H,GAAMwC,GAAOyB,GAAUtJ,GAAS;AAC3C,UAAMkN,IAAY7H,EAAK,OAAM,GACvB8H,KAAkBD,IAAYlN,EAAQ,eAAe,KAAK,KAAK;AACrE,YAAQ6H,GAAK;AAAA;AAAA,MAEX,KAAK;AACH,eAAO,OAAOsF,CAAc;AAAA;AAAA,MAE9B,KAAK;AACH,eAAOtB,GAAgBsB,GAAgBtF,EAAM,MAAM;AAAA;AAAA,MAErD,KAAK;AACH,eAAOyB,EAAS,cAAc6D,GAAgB,EAAE,MAAM,MAAK,CAAE;AAAA,MAC/D,KAAK;AACH,eAAO7D,EAAS,IAAI4D,GAAW;AAAA,UAC7B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA;AAAA,MAEH,KAAK;AACH,eAAO5D,EAAS,IAAI4D,GAAW;AAAA,UAC7B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA;AAAA,MAEH,KAAK;AACH,eAAO5D,EAAS,IAAI4D,GAAW;AAAA,UAC7B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,MAGH;AACE,eAAO5D,EAAS,IAAI4D,GAAW;AAAA,UAC7B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,IACT;AAAA,EACE;AAAA;AAAA,EAGA,GAAG,SAAU7H,GAAMwC,GAAOyB,GAAU;AAClC,UAAM4D,IAAY7H,EAAK,OAAM,GACvB+H,IAAeF,MAAc,IAAI,IAAIA;AAC3C,YAAQrF,GAAK;AAAA;AAAA,MAEX,KAAK;AACH,eAAO,OAAOuF,CAAY;AAAA;AAAA,MAE5B,KAAK;AACH,eAAOvB,GAAgBuB,GAAcvF,EAAM,MAAM;AAAA;AAAA,MAEnD,KAAK;AACH,eAAOyB,EAAS,cAAc8D,GAAc,EAAE,MAAM,MAAK,CAAE;AAAA;AAAA,MAE7D,KAAK;AACH,eAAO9D,EAAS,IAAI4D,GAAW;AAAA,UAC7B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA;AAAA,MAEH,KAAK;AACH,eAAO5D,EAAS,IAAI4D,GAAW;AAAA,UAC7B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA;AAAA,MAEH,KAAK;AACH,eAAO5D,EAAS,IAAI4D,GAAW;AAAA,UAC7B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,MAGH;AACE,eAAO5D,EAAS,IAAI4D,GAAW;AAAA,UAC7B,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,IACT;AAAA,EACE;AAAA;AAAA,EAGA,GAAG,SAAU7H,GAAMwC,GAAOyB,GAAU;AAElC,UAAM8C,IADQ/G,EAAK,SAAQ,IACQ,MAAM,IAAI,OAAO;AAEpD,YAAQwC,GAAK;AAAA,MACX,KAAK;AAAA,MACL,KAAK;AACH,eAAOyB,EAAS,UAAU8C,GAAoB;AAAA,UAC5C,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,MACH,KAAK;AACH,eAAO9C,EACJ,UAAU8C,GAAoB;AAAA,UAC7B,OAAO;AAAA,UACP,SAAS;AAAA,QACrB,CAAW,EACA,YAAW;AAAA,MAChB,KAAK;AACH,eAAO9C,EAAS,UAAU8C,GAAoB;AAAA,UAC5C,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,MAEH;AACE,eAAO9C,EAAS,UAAU8C,GAAoB;AAAA,UAC5C,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,IACT;AAAA,EACE;AAAA;AAAA,EAGA,GAAG,SAAU/G,GAAMwC,GAAOyB,GAAU;AAClC,UAAM+D,IAAQhI,EAAK,SAAQ;AAC3B,QAAI+G;AASJ,YARIiB,MAAU,KACZjB,IAAqBI,GAAc,OAC1Ba,MAAU,IACnBjB,IAAqBI,GAAc,WAEnCJ,IAAqBiB,IAAQ,MAAM,IAAI,OAAO,MAGxCxF,GAAK;AAAA,MACX,KAAK;AAAA,MACL,KAAK;AACH,eAAOyB,EAAS,UAAU8C,GAAoB;AAAA,UAC5C,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,MACH,KAAK;AACH,eAAO9C,EACJ,UAAU8C,GAAoB;AAAA,UAC7B,OAAO;AAAA,UACP,SAAS;AAAA,QACrB,CAAW,EACA,YAAW;AAAA,MAChB,KAAK;AACH,eAAO9C,EAAS,UAAU8C,GAAoB;AAAA,UAC5C,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,MAEH;AACE,eAAO9C,EAAS,UAAU8C,GAAoB;AAAA,UAC5C,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,IACT;AAAA,EACE;AAAA;AAAA,EAGA,GAAG,SAAU/G,GAAMwC,GAAOyB,GAAU;AAClC,UAAM+D,IAAQhI,EAAK,SAAQ;AAC3B,QAAI+G;AAWJ,YAVIiB,KAAS,KACXjB,IAAqBI,GAAc,UAC1Ba,KAAS,KAClBjB,IAAqBI,GAAc,YAC1Ba,KAAS,IAClBjB,IAAqBI,GAAc,UAEnCJ,IAAqBI,GAAc,OAG7B3E,GAAK;AAAA,MACX,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAOyB,EAAS,UAAU8C,GAAoB;AAAA,UAC5C,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,MACH,KAAK;AACH,eAAO9C,EAAS,UAAU8C,GAAoB;AAAA,UAC5C,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,MAEH;AACE,eAAO9C,EAAS,UAAU8C,GAAoB;AAAA,UAC5C,OAAO;AAAA,UACP,SAAS;AAAA,QACnB,CAAS;AAAA,IACT;AAAA,EACE;AAAA;AAAA,EAGA,GAAG,SAAU/G,GAAMwC,GAAOyB,GAAU;AAClC,QAAIzB,MAAU,MAAM;AAClB,UAAIwF,IAAQhI,EAAK,SAAQ,IAAK;AAC9B,aAAIgI,MAAU,MAAGA,IAAQ,KAClB/D,EAAS,cAAc+D,GAAO,EAAE,MAAM,OAAM,CAAE;AAAA,IACvD;AAEA,WAAOpB,GAAgB,EAAE5G,GAAMwC,CAAK;AAAA,EACtC;AAAA;AAAA,EAGA,GAAG,SAAUxC,GAAMwC,GAAOyB,GAAU;AAClC,WAAIzB,MAAU,OACLyB,EAAS,cAAcjE,EAAK,SAAQ,GAAI,EAAE,MAAM,QAAQ,IAG1D4G,GAAgB,EAAE5G,GAAMwC,CAAK;AAAA,EACtC;AAAA;AAAA,EAGA,GAAG,SAAUxC,GAAMwC,GAAOyB,GAAU;AAClC,UAAM+D,IAAQhI,EAAK,SAAQ,IAAK;AAEhC,WAAIwC,MAAU,OACLyB,EAAS,cAAc+D,GAAO,EAAE,MAAM,OAAM,CAAE,IAGhDxB,GAAgBwB,GAAOxF,EAAM,MAAM;AAAA,EAC5C;AAAA;AAAA,EAGA,GAAG,SAAUxC,GAAMwC,GAAOyB,GAAU;AAClC,QAAI+D,IAAQhI,EAAK,SAAQ;AAGzB,WAFIgI,MAAU,MAAGA,IAAQ,KAErBxF,MAAU,OACLyB,EAAS,cAAc+D,GAAO,EAAE,MAAM,OAAM,CAAE,IAGhDxB,GAAgBwB,GAAOxF,EAAM,MAAM;AAAA,EAC5C;AAAA;AAAA,EAGA,GAAG,SAAUxC,GAAMwC,GAAOyB,GAAU;AAClC,WAAIzB,MAAU,OACLyB,EAAS,cAAcjE,EAAK,WAAU,GAAI,EAAE,MAAM,UAAU,IAG9D4G,GAAgB,EAAE5G,GAAMwC,CAAK;AAAA,EACtC;AAAA;AAAA,EAGA,GAAG,SAAUxC,GAAMwC,GAAOyB,GAAU;AAClC,WAAIzB,MAAU,OACLyB,EAAS,cAAcjE,EAAK,WAAU,GAAI,EAAE,MAAM,UAAU,IAG9D4G,GAAgB,EAAE5G,GAAMwC,CAAK;AAAA,EACtC;AAAA;AAAA,EAGA,GAAG,SAAUxC,GAAMwC,GAAO;AACxB,WAAOoE,GAAgB,EAAE5G,GAAMwC,CAAK;AAAA,EACtC;AAAA;AAAA,EAGA,GAAG,SAAUxC,GAAMwC,GAAOyF,GAAW;AACnC,UAAMC,IAAiBlI,EAAK,kBAAiB;AAE7C,QAAIkI,MAAmB;AACrB,aAAO;AAGT,YAAQ1F,GAAK;AAAA;AAAA,MAEX,KAAK;AACH,eAAO2F,GAAkCD,CAAc;AAAA;AAAA;AAAA;AAAA,MAKzD,KAAK;AAAA,MACL,KAAK;AACH,eAAOE,GAAeF,CAAc;AAAA;AAAA,MAOtC;AACE,eAAOE,GAAeF,GAAgB,GAAG;AAAA,IACjD;AAAA,EACE;AAAA;AAAA,EAGA,GAAG,SAAUlI,GAAMwC,GAAOyF,GAAW;AACnC,UAAMC,IAAiBlI,EAAK,kBAAiB;AAE7C,YAAQwC,GAAK;AAAA;AAAA,MAEX,KAAK;AACH,eAAO2F,GAAkCD,CAAc;AAAA;AAAA;AAAA;AAAA,MAKzD,KAAK;AAAA,MACL,KAAK;AACH,eAAOE,GAAeF,CAAc;AAAA;AAAA,MAOtC;AACE,eAAOE,GAAeF,GAAgB,GAAG;AAAA,IACjD;AAAA,EACE;AAAA;AAAA,EAGA,GAAG,SAAUlI,GAAMwC,GAAOyF,GAAW;AACnC,UAAMC,IAAiBlI,EAAK,kBAAiB;AAE7C,YAAQwC,GAAK;AAAA;AAAA,MAEX,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,QAAQ6F,GAAoBH,GAAgB,GAAG;AAAA,MAGxD;AACE,eAAO,QAAQE,GAAeF,GAAgB,GAAG;AAAA,IACzD;AAAA,EACE;AAAA;AAAA,EAGA,GAAG,SAAUlI,GAAMwC,GAAOyF,GAAW;AACnC,UAAMC,IAAiBlI,EAAK,kBAAiB;AAE7C,YAAQwC,GAAK;AAAA;AAAA,MAEX,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,QAAQ6F,GAAoBH,GAAgB,GAAG;AAAA,MAGxD;AACE,eAAO,QAAQE,GAAeF,GAAgB,GAAG;AAAA,IACzD;AAAA,EACE;AAAA;AAAA,EAGA,GAAG,SAAUlI,GAAMwC,GAAOyF,GAAW;AACnC,UAAMK,IAAY,KAAK,MAAM,CAACtI,IAAO,GAAI;AACzC,WAAOwG,GAAgB8B,GAAW9F,EAAM,MAAM;AAAA,EAChD;AAAA;AAAA,EAGA,GAAG,SAAUxC,GAAMwC,GAAOyF,GAAW;AACnC,WAAOzB,GAAgB,CAACxG,GAAMwC,EAAM,MAAM;AAAA,EAC5C;AACF;AAEA,SAAS6F,GAAoBE,GAAQC,IAAY,IAAI;AACnD,QAAM9B,IAAO6B,IAAS,IAAI,MAAM,KAC1BE,IAAY,KAAK,IAAIF,CAAM,GAC3BP,IAAQ,KAAK,MAAMS,IAAY,EAAE,GACjCC,IAAUD,IAAY;AAC5B,SAAIC,MAAY,IACPhC,IAAO,OAAOsB,CAAK,IAErBtB,IAAO,OAAOsB,CAAK,IAAIQ,IAAYhC,GAAgBkC,GAAS,CAAC;AACtE;AAEA,SAASP,GAAkCI,GAAQC,GAAW;AAC5D,SAAID,IAAS,OAAO,KACLA,IAAS,IAAI,MAAM,OAClB/B,GAAgB,KAAK,IAAI+B,CAAM,IAAI,IAAI,CAAC,IAEjDH,GAAeG,GAAQC,CAAS;AACzC;AAEA,SAASJ,GAAeG,GAAQC,IAAY,IAAI;AAC9C,QAAM9B,IAAO6B,IAAS,IAAI,MAAM,KAC1BE,IAAY,KAAK,IAAIF,CAAM,GAC3BP,IAAQxB,GAAgB,KAAK,MAAMiC,IAAY,EAAE,GAAG,CAAC,GACrDC,IAAUlC,GAAgBiC,IAAY,IAAI,CAAC;AACjD,SAAO/B,IAAOsB,IAAQQ,IAAYE;AACpC;ACvwBA,MAAMC,KAAoB,CAAClE,GAAS1B,MAAe;AACjD,UAAQ0B,GAAO;AAAA,IACb,KAAK;AACH,aAAO1B,EAAW,KAAK,EAAE,OAAO,QAAO,CAAE;AAAA,IAC3C,KAAK;AACH,aAAOA,EAAW,KAAK,EAAE,OAAO,SAAQ,CAAE;AAAA,IAC5C,KAAK;AACH,aAAOA,EAAW,KAAK,EAAE,OAAO,OAAM,CAAE;AAAA,IAE1C;AACE,aAAOA,EAAW,KAAK,EAAE,OAAO,OAAM,CAAE;AAAA,EAC9C;AACA,GAEM6F,KAAoB,CAACnE,GAAS1B,MAAe;AACjD,UAAQ0B,GAAO;AAAA,IACb,KAAK;AACH,aAAO1B,EAAW,KAAK,EAAE,OAAO,QAAO,CAAE;AAAA,IAC3C,KAAK;AACH,aAAOA,EAAW,KAAK,EAAE,OAAO,SAAQ,CAAE;AAAA,IAC5C,KAAK;AACH,aAAOA,EAAW,KAAK,EAAE,OAAO,OAAM,CAAE;AAAA,IAE1C;AACE,aAAOA,EAAW,KAAK,EAAE,OAAO,OAAM,CAAE;AAAA,EAC9C;AACA,GAEM8F,KAAwB,CAACpE,GAAS1B,MAAe;AACrD,QAAMsB,IAAcI,EAAQ,MAAM,WAAW,KAAK,CAAA,GAC5CqE,IAAczE,EAAY,CAAC,GAC3B0E,IAAc1E,EAAY,CAAC;AAEjC,MAAI,CAAC0E;AACH,WAAOJ,GAAkBlE,GAAS1B,CAAU;AAG9C,MAAIiG;AAEJ,UAAQF,GAAW;AAAA,IACjB,KAAK;AACH,MAAAE,IAAiBjG,EAAW,SAAS,EAAE,OAAO,QAAO,CAAE;AACvD;AAAA,IACF,KAAK;AACH,MAAAiG,IAAiBjG,EAAW,SAAS,EAAE,OAAO,SAAQ,CAAE;AACxD;AAAA,IACF,KAAK;AACH,MAAAiG,IAAiBjG,EAAW,SAAS,EAAE,OAAO,OAAM,CAAE;AACtD;AAAA,IAEF;AACE,MAAAiG,IAAiBjG,EAAW,SAAS,EAAE,OAAO,OAAM,CAAE;AACtD;AAAA,EACN;AAEE,SAAOiG,EACJ,QAAQ,YAAYL,GAAkBG,GAAa/F,CAAU,CAAC,EAC9D,QAAQ,YAAY6F,GAAkBG,GAAahG,CAAU,CAAC;AACnE,GAEakG,KAAiB;AAAA,EAC5B,GAAGL;AAAA,EACH,GAAGC;AACL,GC/DMK,KAAmB,QACnBC,KAAkB,QAElBC,KAAc,CAAC,KAAK,MAAM,MAAM,MAAM;AAErC,SAASC,GAA0B7G,GAAO;AAC/C,SAAO0G,GAAiB,KAAK1G,CAAK;AACpC;AAEO,SAAS8G,GAAyB9G,GAAO;AAC9C,SAAO2G,GAAgB,KAAK3G,CAAK;AACnC;AAEO,SAAS+G,GAA0B/G,GAAOgH,GAAQC,GAAO;AAC9D,QAAMC,IAAW3O,GAAQyH,GAAOgH,GAAQC,CAAK;AAE7C,MADA,QAAQ,KAAKC,CAAQ,GACjBN,GAAY,SAAS5G,CAAK,EAAG,OAAM,IAAI,WAAWkH,CAAQ;AAChE;AAEA,SAAS3O,GAAQyH,GAAOgH,GAAQC,GAAO;AACrC,QAAME,IAAUnH,EAAM,CAAC,MAAM,MAAM,UAAU;AAC7C,SAAO,SAASA,EAAM,YAAW,CAAE,mBAAmBA,CAAK,YAAYgH,CAAM,sBAAsBG,CAAO,mBAAmBF,CAAK;AACpI;ACKA,MAAMG,KACJ,yDAIIC,KAA6B,qCAE7BC,KAAsB,gBACtBC,KAAoB,OACpBC,KAAgC;AAoS/B,SAASR,GAAOxJ,GAAMiK,GAAWtP,GAAS;AAC/C,QAAMwF,IAAiBC,GAAiB,GAClC8J,IAA4B/J,EAAe,UAAUgK,IAErDjE,IAGJ/F,EAAe,yBACfA,EAAe,QAAQ,SAAS,yBAChC,GAEIG,IAGJH,EAAe,gBACfA,EAAe,QAAQ,SAAS,gBAChC,GAEIiK,IAAenK,GAAOD,GAAMrF,GAAS,EAAE;AAE7C,MAAI,CAACwH,GAAQiI,CAAY;AACvB,UAAM,IAAI,WAAW,oBAAoB;AAG3C,MAAI1b,IAAQub,EACT,MAAMJ,EAA0B,EAChC,IAAI,CAACQ,MAAc;AAClB,UAAMC,IAAiBD,EAAU,CAAC;AAClC,QAAIC,MAAmB,OAAOA,MAAmB,KAAK;AACpD,YAAMC,IAAgBtB,GAAeqB,CAAc;AACnD,aAAOC,EAAcF,GAAWH,EAAO,UAAU;AAAA,IACnD;AACA,WAAOG;AAAA,EACT,CAAC,EACA,KAAK,EAAE,EACP,MAAMT,EAAsB,EAC5B,IAAI,CAACS,MAAc;AAElB,QAAIA,MAAc;AAChB,aAAO,EAAE,SAAS,IAAO,OAAO,IAAG;AAGrC,UAAMC,IAAiBD,EAAU,CAAC;AAClC,QAAIC,MAAmB;AACrB,aAAO,EAAE,SAAS,IAAO,OAAOE,GAAmBH,CAAS,EAAC;AAG/D,QAAIjD,GAAWkD,CAAc;AAC3B,aAAO,EAAE,SAAS,IAAM,OAAOD,EAAS;AAG1C,QAAIC,EAAe,MAAMN,EAA6B;AACpD,YAAM,IAAI;AAAA,QACR,mEACEM,IACA;AAAA,MACZ;AAGM,WAAO,EAAE,SAAS,IAAO,OAAOD,EAAS;AAAA,EAC3C,CAAC;AAGH,EAAIH,EAAO,SAAS,iBAClBxb,IAAQwb,EAAO,SAAS,aAAaE,GAAc1b,CAAK;AAG1D,QAAM+b,IAAmB;AAAA,IACvB,uBAAAvE;AAAA,IACA,cAAA5F;AAAA,IACA,QAAA4J;AAAA,EACJ;AAEE,SAAOxb,EACJ,IAAI,CAACC,MAAS;AACb,QAAI,CAACA,EAAK,QAAS,QAAOA,EAAK;AAE/B,UAAM6T,IAAQ7T,EAAK;AAEnB,KAEI2a,GAAyB9G,CAAK,KAE9B6G,GAA0B7G,CAAK,MAEjC+G,GAA0B/G,GAAOyH,GAAW,OAAOjK,CAAI,CAAC;AAG1D,UAAM0K,IAAYtD,GAAW5E,EAAM,CAAC,CAAC;AACrC,WAAOkI,EAAUN,GAAc5H,GAAO0H,EAAO,UAAUO,CAAgB;AAAA,EACzE,CAAC,EACA,KAAK,EAAE;AACZ;AAEA,SAASD,GAAmBf,GAAO;AACjC,QAAMkB,IAAUlB,EAAM,MAAMK,EAAmB;AAE/C,SAAKa,IAIEA,EAAQ,CAAC,EAAE,QAAQZ,IAAmB,GAAG,IAHvCN;AAIX;AC1aO,SAASmB,GAAe5K,GAAM6K,GAAU;AAC3C,QAAMC,IAAMC,GAAkBF,CAAQ;AACtC,SAAO,mBAAmBC,IAAME,GAAYF,GAAK9K,CAAI,IAAIiL,GAAYH,GAAK9K,CAAI;AAClF;AACA,MAAMkL,KAAY;AAAA,EACd,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AACZ;AACA,SAASF,GAAYF,GAAK9K,GAAM;AAC5B,MAAI;AACA,UAAMmL,IAAYL,EAAI,cAAc9K,CAAI,GAClCoL,IAAS,CAAA;AACf,aAAShgB,IAAI,GAAGA,IAAI+f,EAAU,QAAQ/f,KAAK;AACvC,YAAMigB,IAAMH,GAAUC,EAAU/f,CAAC,EAAE,IAAI;AACvC,MAAIigB,MAAQ,WACRD,EAAOC,CAAG,IAAI,SAASF,EAAU/f,CAAC,EAAE,OAAO,EAAE;AAAA,IAErD;AACA,WAAOggB;AAAA,EACX,SACOE,GAAO;AACV,QAAIA,aAAiB;AACjB,aAAO,CAAC,GAAG;AAEf,UAAMA;AAAA,EACV;AACJ;AACA,SAASL,GAAYH,GAAK9K,GAAM;AAC5B,QAAMmL,IAAYL,EAAI,OAAO9K,CAAI,GAE3BuL,IAAS,0CAA0C,KAAKJ,CAAS;AAGvE,SAAO;AAAA,IACH,SAASI,EAAO,CAAC,GAAG,EAAE;AAAA,IACtB,SAASA,EAAO,CAAC,GAAG,EAAE;AAAA,IACtB,SAASA,EAAO,CAAC,GAAG,EAAE;AAAA,IACtB,SAASA,EAAO,CAAC,GAAG,EAAE;AAAA,IACtB,SAASA,EAAO,CAAC,GAAG,EAAE;AAAA,IACtB,SAASA,EAAO,CAAC,GAAG,EAAE;AAAA,EAC9B;AACA;AAIA,MAAMC,KAAW,CAAA,GAEXC,KAAoB,IAAI,KAAK,eAAe,SAAS;AAAA,EACvD,WAAW;AAAA,EACX,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AACZ,CAAC,EAAE,OAAO,oBAAI,KAAK,0BAA0B,CAAC,GACxCC,KAAqBD,OAAsB,0BAC7CA,OAAsB;AAC1B,SAASV,GAAkBF,GAAU;AACjC,SAAKW,GAASX,CAAQ,MAClBW,GAASX,CAAQ,IAAIa,KACf,IAAI,KAAK,eAAe,SAAS;AAAA,IAC/B,WAAW;AAAA,IACX,UAAUb;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,EACxB,CAAa,IACC,IAAI,KAAK,eAAe,SAAS;AAAA,IAC/B,QAAQ;AAAA,IACR,UAAUA;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,EACxB,CAAa,IAEFW,GAASX,CAAQ;AAC5B;ACrFO,SAASc,GAAWC,GAAU9E,GAAOtG,GAAKqL,GAAMC,GAAQC,GAAQC,GAAa;AAChF,QAAM9K,IAAU,oBAAI,KAAK,CAAC;AAC1B,SAAAA,EAAQ,eAAe0K,GAAU9E,GAAOtG,CAAG,GAC3CU,EAAQ,YAAY2K,GAAMC,GAAQC,GAAQC,CAAW,GAC9C9K;AACX;ACVA,MAAM+K,KAAuB,MACvBC,KAAyB,KACzBC,KAAW;AAAA,EAEb,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,cAAc;AAClB;AAEO,SAASC,GAAgBC,GAAgBrM,GAAMsM,GAAW;AAE7D,MAAI,CAACD;AACD,WAAO;AAGX,MAAI7J,IAAQ2J,GAAS,UAAU,KAAKE,CAAc;AAClD,MAAI7J;AACA,WAAO;AAEX,MAAIwF,GACAuE;AAGJ,MADA/J,IAAQ2J,GAAS,WAAW,KAAKE,CAAc,GAC3C7J;AAEA,WADAwF,IAAQ,SAASxF,EAAM,CAAC,GAAG,EAAE,GACxBgK,GAAiBxE,CAAK,IAGpB,EAAEA,IAAQiE,MAFN;AAMf,MADAzJ,IAAQ2J,GAAS,aAAa,KAAKE,CAAc,GAC7C7J,GAAO;AACP,IAAAwF,IAAQ,SAASxF,EAAM,CAAC,GAAG,EAAE;AAC7B,UAAMkG,IAAU,SAASlG,EAAM,CAAC,GAAG,EAAE;AACrC,WAAKgK,GAAiBxE,GAAOU,CAAO,KAGpC6D,IAAiB,KAAK,IAAIvE,CAAK,IAAIiE,KAAuBvD,IAAUwD,IAC7D1J,EAAM,CAAC,MAAM,MAAM,CAAC+J,IAAiBA,KAHjC;AAAA,EAIf;AAEA,MAAIE,GAA0BJ,CAAc,GAAG;AAC3C,IAAArM,IAAO,IAAI,KAAKA,KAAQ,KAAK,IAAG,CAAE;AAClC,UAAMkB,IAAUoL,IAAYtM,IAAO0M,GAAU1M,CAAI,GAC3CuI,IAASoE,GAAWzL,GAASmL,CAAc;AAEjD,WAAO,EADaC,IAAY/D,IAASqE,GAAU5M,GAAMuI,GAAQ8D,CAAc;AAAA,EAEnF;AACA,SAAO;AACX;AACA,SAASK,GAAU1M,GAAM;AACrB,SAAO2L,GAAW3L,EAAK,YAAW,GAAIA,EAAK,SAAQ,GAAIA,EAAK,QAAO,GAAIA,EAAK,SAAQ,GAAIA,EAAK,WAAU,GAAIA,EAAK,WAAU,GAAIA,EAAK,iBAAiB;AACxJ;AACA,SAAS2M,GAAW3M,GAAMqM,GAAgB;AACtC,QAAMQ,IAASjC,GAAe5K,GAAMqM,CAAc,GAE5CS,IAAQnB,GAAWkB,EAAO,CAAC,GAAGA,EAAO,CAAC,IAAI,GAAGA,EAAO,CAAC,GAAGA,EAAO,CAAC,IAAI,IAAIA,EAAO,CAAC,GAAGA,EAAO,CAAC,GAAG,CAAC,EAAE,QAAO;AAC9G,MAAIE,IAAO/M,EAAK,QAAO;AACvB,QAAMgN,IAAOD,IAAO;AACpB,SAAAA,KAAQC,KAAQ,IAAIA,IAAO,MAAOA,GAC3BF,IAAQC;AACnB;AACA,SAASH,GAAU5M,GAAMuI,GAAQ8D,GAAgB;AAG7C,MAAIY,IAFYjN,EAAK,QAAO,IAEHuI;AAEzB,QAAM2E,IAAKP,GAAW,IAAI,KAAKM,CAAQ,GAAGZ,CAAc;AAExD,MAAI9D,MAAW2E;AACX,WAAO3E;AAGX,EAAA0E,KAAYC,IAAK3E;AAEjB,QAAM4E,IAAKR,GAAW,IAAI,KAAKM,CAAQ,GAAGZ,CAAc;AACxD,SAAIa,MAAOC,IACAD,IAGJ,KAAK,IAAIA,GAAIC,CAAE;AAC1B;AACA,SAASX,GAAiBxE,GAAOU,GAAS;AACtC,SAAO,OAAOV,KAASA,KAAS,OAAOU,KAAW,QAAS,KAAKA,KAAWA,KAAW;AAC1F;AACA,MAAM0E,KAAyB,CAAA;AAC/B,SAASX,GAA0BY,GAAgB;AAC/C,MAAID,GAAuBC,CAAc;AACrC,WAAO;AACX,MAAI;AACA,eAAI,KAAK,eAAe,QAAW,EAAE,UAAUA,EAAc,CAAE,GAC/DD,GAAuBC,CAAc,IAAI,IAClC;AAAA,EACX,QACc;AACV,WAAO;AAAA,EACX;AACJ;ACzFO,SAASpM,GAAgCjB,GAAM;AAClD,QAAMkB,IAAU,IAAI,KAAK,KAAK,IAAIlB,EAAK,eAAeA,EAAK,SAAQ,GAAIA,EAAK,QAAO,GAAIA,EAAK,YAAYA,EAAK,WAAU,GAAIA,EAAK,WAAU,GAAIA,EAAK,gBAAe,CAAE,CAAC;AACrK,SAAAkB,EAAQ,eAAelB,EAAK,aAAa,GAClC,CAACA,IAAO,CAACkB;AACpB;ACdO,MAAMoM,KAAY,2ECEnBrB,KAAuB,MACvBC,KAAyB,KACzBqB,KAA4B,GAC5BpB,KAAW;AAAA,EACb,iBAAiB;AAAA,EACjB,aAAa;AAAA;AAAA,EAGb,IAAI;AAAA,EACJ,KAAK;AAAA,IACD;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,EACR;AAAA,EACI,MAAM;AAAA,EACN,OAAO;AAAA,IACH;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,EACR;AAAA;AAAA,EAEI,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,QAAQ;AAAA;AAAA,EAER,UAAUmB;AACd;AA2CO,SAASrN,GAAO/N,GAAUyI,IAAU,IAAI;AAC3C,MAAI,UAAU,SAAS;AACnB,UAAM,IAAI,UAAU,mCAAmC,UAAU,SAAS,UAAU;AAExF,MAAIzI,MAAa;AACb,WAAO,oBAAI,KAAK,GAAG;AAEvB,QAAMsb,IAAmB7S,EAAQ,oBAAoB,OAAO4S,KAA4B,OAAO5S,EAAQ,gBAAgB;AACvH,MAAI6S,MAAqB,KAAKA,MAAqB,KAAKA,MAAqB;AACzE,UAAM,IAAI,WAAW,oCAAoC;AAG7D,MAAItb,aAAoB,QACnB,OAAOA,KAAa,YAAY,OAAO,UAAU,SAAS,KAAKA,CAAQ,MAAM;AAE9E,WAAO,IAAI,KAAKA,EAAS,SAAS;AAEjC,MAAI,OAAOA,KAAa,YACzB,OAAO,UAAU,SAAS,KAAKA,CAAQ,MAAM;AAC7C,WAAO,IAAI,KAAKA,CAAQ;AAEvB,MAAM,OAAO,UAAU,SAAS,KAAKA,CAAQ,MAAM;AACpD,WAAO,oBAAI,KAAK,GAAG;AAEvB,QAAMub,IAAcC,GAAgBxb,CAAQ,GACtC,EAAE,MAAA0O,GAAM,gBAAA+M,EAAc,IAAKC,GAAUH,EAAY,MAAMD,CAAgB,GACvExN,IAAO6N,GAAUF,GAAgB/M,CAAI;AAC3C,MAAIZ,MAAS,QAAQ,MAAMA,EAAK,QAAO,CAAE;AACrC,WAAO,oBAAI,KAAK,GAAG;AAEvB,MAAIA,GAAM;AACN,UAAMsI,IAAYtI,EAAK,QAAO;AAC9B,QAAI8N,IAAO,GACPvF;AACJ,QAAIkF,EAAY,SACZK,IAAOC,GAAUN,EAAY,IAAI,GAC7BK,MAAS,QAAQ,MAAMA,CAAI;AAC3B,aAAO,oBAAI,KAAK,GAAG;AAG3B,QAAIL,EAAY,YAAY9S,EAAQ;AAEhC,UADA4N,IAAS6D,GAAgBqB,EAAY,YAAY9S,EAAQ,UAAU,IAAI,KAAK2N,IAAYwF,CAAI,CAAC,GACzF,MAAMvF,CAAM;AACZ,eAAO,oBAAI,KAAK,GAAG;AAAA;AAKvB,MAAAA,IAAStH,GAAgC,IAAI,KAAKqH,IAAYwF,CAAI,CAAC,GACnEvF,IAAStH,GAAgC,IAAI,KAAKqH,IAAYwF,IAAOvF,CAAM,CAAC;AAEhF,WAAO,IAAI,KAAKD,IAAYwF,IAAOvF,CAAM;AAAA,EAC7C;AAEI,WAAO,oBAAI,KAAK,GAAG;AAE3B;AACA,SAASmF,GAAgBM,GAAY;AACjC,QAAMP,IAAc,CAAA;AACpB,MAAI/e,IAAQyd,GAAS,gBAAgB,KAAK6B,CAAU,GAChDC;AAgBJ,MAfKvf,KAYD+e,EAAY,OAAO/e,EAAM,CAAC,GAC1Buf,IAAavf,EAAM,CAAC,MAZpBA,IAAQyd,GAAS,YAAY,KAAK6B,CAAU,GACxCtf,KACA+e,EAAY,OAAO/e,EAAM,CAAC,GAC1Buf,IAAavf,EAAM,CAAC,MAGpB+e,EAAY,OAAO,MACnBQ,IAAaD,KAOjBC,GAAY;AACZ,UAAMzL,IAAQ2J,GAAS,SAAS,KAAK8B,CAAU;AAC/C,IAAIzL,KACAiL,EAAY,OAAOQ,EAAW,QAAQzL,EAAM,CAAC,GAAG,EAAE,GAClDiL,EAAY,WAAWjL,EAAM,CAAC,EAAE,KAAI,KAGpCiL,EAAY,OAAOQ;AAAA,EAE3B;AACA,SAAOR;AACX;AACA,SAASG,GAAUI,GAAYR,GAAkB;AAC7C,MAAIQ,GAAY;AACZ,UAAME,IAAa/B,GAAS,IAAIqB,CAAgB,GAC1CW,IAAehC,GAAS,MAAMqB,CAAgB;AAEpD,QAAIhL,IAAQ2J,GAAS,KAAK,KAAK6B,CAAU,KAAKG,EAAa,KAAKH,CAAU;AAC1E,QAAIxL,GAAO;AACP,YAAM4L,IAAa5L,EAAM,CAAC;AAC1B,aAAO;AAAA,QACH,MAAM,SAAS4L,GAAY,EAAE;AAAA,QAC7B,gBAAgBJ,EAAW,MAAMI,EAAW,MAAM;AAAA,MAClE;AAAA,IACQ;AAGA,QADA5L,IAAQ2J,GAAS,GAAG,KAAK6B,CAAU,KAAKE,EAAW,KAAKF,CAAU,GAC9DxL,GAAO;AACP,YAAM6L,IAAgB7L,EAAM,CAAC;AAC7B,aAAO;AAAA,QACH,MAAM,SAAS6L,GAAe,EAAE,IAAI;AAAA,QACpC,gBAAgBL,EAAW,MAAMK,EAAc,MAAM;AAAA,MACrE;AAAA,IACQ;AAAA,EACJ;AAEA,SAAO;AAAA,IACH,MAAM;AAAA,EACd;AACA;AACA,SAASR,GAAUG,GAAYpN,GAAM;AAEjC,MAAIA,MAAS;AACT,WAAO;AAEX,MAAIZ,GACA8G,GACAY;AAEJ,MAAI,CAACsG,KAAc,CAACA,EAAW;AAC3B,WAAAhO,IAAO,oBAAI,KAAK,CAAC,GACjBA,EAAK,eAAeY,CAAI,GACjBZ;AAGX,MAAIwC,IAAQ2J,GAAS,GAAG,KAAK6B,CAAU;AACvC,MAAIxL;AAGA,WAFAxC,IAAO,oBAAI,KAAK,CAAC,GACjB8G,IAAQ,SAAStE,EAAM,CAAC,GAAG,EAAE,IAAI,GAC5B8L,GAAa1N,GAAMkG,CAAK,KAG7B9G,EAAK,eAAeY,GAAMkG,CAAK,GACxB9G,KAHI,oBAAI,KAAK,GAAG;AAO3B,MADAwC,IAAQ2J,GAAS,IAAI,KAAK6B,CAAU,GAChCxL,GAAO;AACP,IAAAxC,IAAO,oBAAI,KAAK,CAAC;AACjB,UAAM4H,IAAY,SAASpF,EAAM,CAAC,GAAG,EAAE;AACvC,WAAK+L,GAAsB3N,GAAMgH,CAAS,KAG1C5H,EAAK,eAAeY,GAAM,GAAGgH,CAAS,GAC/B5H,KAHI,oBAAI,KAAK,GAAG;AAAA,EAI3B;AAGA,MADAwC,IAAQ2J,GAAS,KAAK,KAAK6B,CAAU,GACjCxL,GAAO;AACP,IAAAxC,IAAO,oBAAI,KAAK,CAAC,GACjB8G,IAAQ,SAAStE,EAAM,CAAC,GAAG,EAAE,IAAI;AACjC,UAAMhC,IAAM,SAASgC,EAAM,CAAC,GAAG,EAAE;AACjC,WAAK8L,GAAa1N,GAAMkG,GAAOtG,CAAG,KAGlCR,EAAK,eAAeY,GAAMkG,GAAOtG,CAAG,GAC7BR,KAHI,oBAAI,KAAK,GAAG;AAAA,EAI3B;AAGA,MADAwC,IAAQ2J,GAAS,IAAI,KAAK6B,CAAU,GAChCxL;AAEA,WADAkF,IAAO,SAASlF,EAAM,CAAC,GAAG,EAAE,IAAI,GAC3BgM,GAAiB9G,CAAI,IAGnB+G,GAAiB7N,GAAM8G,CAAI,IAFvB,oBAAI,KAAK,GAAG;AAM3B,MADAlF,IAAQ2J,GAAS,KAAK,KAAK6B,CAAU,GACjCxL,GAAO;AACP,IAAAkF,IAAO,SAASlF,EAAM,CAAC,GAAG,EAAE,IAAI;AAChC,UAAMqF,IAAY,SAASrF,EAAM,CAAC,GAAG,EAAE,IAAI;AAC3C,WAAKgM,GAAiB9G,GAAMG,CAAS,IAG9B4G,GAAiB7N,GAAM8G,GAAMG,CAAS,IAFlC,oBAAI,KAAK,GAAG;AAAA,EAG3B;AAEA,SAAO;AACX;AACA,SAASkG,GAAUE,GAAY;AAC3B,MAAIjG,GACAU,GAEAlG,IAAQ2J,GAAS,GAAG,KAAK8B,CAAU;AACvC,MAAIzL;AAEA,WADAwF,IAAQ,WAAWxF,EAAM,CAAC,EAAE,QAAQ,KAAK,GAAG,CAAC,GACxCkM,GAAa1G,CAAK,IAGfA,IAAQ,KAAMiE,KAFX;AAMf,MADAzJ,IAAQ2J,GAAS,KAAK,KAAK8B,CAAU,GACjCzL;AAGA,WAFAwF,IAAQ,SAASxF,EAAM,CAAC,GAAG,EAAE,GAC7BkG,IAAU,WAAWlG,EAAM,CAAC,EAAE,QAAQ,KAAK,GAAG,CAAC,GAC1CkM,GAAa1G,GAAOU,CAAO,IAGxBV,IAAQ,KAAMiE,KAAuBvD,IAAUwD,KAF5C;AAMf,MADA1J,IAAQ2J,GAAS,OAAO,KAAK8B,CAAU,GACnCzL,GAAO;AACP,IAAAwF,IAAQ,SAASxF,EAAM,CAAC,GAAG,EAAE,GAC7BkG,IAAU,SAASlG,EAAM,CAAC,GAAG,EAAE;AAC/B,UAAMmM,IAAU,WAAWnM,EAAM,CAAC,EAAE,QAAQ,KAAK,GAAG,CAAC;AACrD,WAAKkM,GAAa1G,GAAOU,GAASiG,CAAO,IAGjC3G,IAAQ,KAAMiE,KAAuBvD,IAAUwD,KAAyByC,IAAU,MAF/E;AAAA,EAGf;AAEA,SAAO;AACX;AACA,SAASF,GAAiBhH,GAAaC,GAAMlH,GAAK;AAC9C,EAAAkH,IAAOA,KAAQ,GACflH,IAAMA,KAAO;AACb,QAAMR,IAAO,oBAAI,KAAK,CAAC;AACvB,EAAAA,EAAK,eAAeyH,GAAa,GAAG,CAAC;AACrC,QAAMmH,IAAqB5O,EAAK,UAAS,KAAM,GACzCS,IAAOiH,IAAO,IAAIlH,IAAM,IAAIoO;AAClC,SAAA5O,EAAK,WAAWA,EAAK,WAAU,IAAKS,CAAI,GACjCT;AACX;AAEA,MAAM6O,KAAgB,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAC/DC,KAA0B,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAC/E,SAASC,GAAgBnO,GAAM;AAC3B,SAAOA,IAAO,QAAQ,KAAMA,IAAO,MAAM,KAAKA,IAAO,QAAQ;AACjE;AACA,SAAS0N,GAAa1N,GAAMkG,GAAO9G,GAAM;AACrC,MAAI8G,IAAQ,KAAKA,IAAQ;AACrB,WAAO;AAEX,MAAI9G,KAAQ,MAAM;AACd,QAAIA,IAAO;AACP,aAAO;AAEX,UAAMgP,IAAaD,GAAgBnO,CAAI;AAIvC,QAHIoO,KAAchP,IAAO8O,GAAwBhI,CAAK,KAGlD,CAACkI,KAAchP,IAAO6O,GAAc/H,CAAK;AACzC,aAAO;AAAA,EAEf;AACA,SAAO;AACX;AACA,SAASyH,GAAsB3N,GAAMgH,GAAW;AAC5C,MAAIA,IAAY;AACZ,WAAO;AAEX,QAAMoH,IAAaD,GAAgBnO,CAAI;AAIvC,SAHI,EAAAoO,KAAcpH,IAAY,OAG1B,CAACoH,KAAcpH,IAAY;AAInC;AACA,SAAS4G,GAAiB9G,GAAMlH,GAAK;AAIjC,SAHI,EAAAkH,IAAO,KAAKA,IAAO,MAGnBlH,KAAO,SAASA,IAAM,KAAKA,IAAM;AAIzC;AACA,SAASkO,GAAa1G,GAAOU,GAASiG,GAAS;AAO3C,SANI,EAAA3G,IAAQ,KAAKA,KAAS,MAGtBU,KAAW,SAASA,IAAU,KAAKA,KAAW,OAG9CiG,KAAW,SAASA,IAAU,KAAKA,KAAW;AAItD;ACpVO,SAASM,GAAYjP,GAAM6K,GAAUlQ,GAAS;AACjD,EAAAqF,IAAOC,GAAOD,GAAMrF,CAAO;AAC3B,QAAMuU,IAAqB9C,GAAgBvB,GAAU7K,GAAM,EAAI,GACzDvC,IAAI,IAAI,KAAKuC,EAAK,QAAO,IAAKkP,CAAkB,GAChDC,IAAa,oBAAI,KAAK,CAAC;AAC7B,SAAAA,EAAW,YAAY1R,EAAE,eAAc,GAAIA,EAAE,YAAW,GAAIA,EAAE,YAAY,GAC1E0R,EAAW,SAAS1R,EAAE,YAAW,GAAIA,EAAE,cAAa,GAAIA,EAAE,cAAa,GAAIA,EAAE,mBAAkB,CAAE,GAC1F0R;AACX;ACZA,SAASC,GAAoBC,GAAQ;AACjC,MAAI,CAACA,KAAU,OAAOA,KAAW;AAC7B,UAAM,IAAI9Q,GAAc,+BAA+BE,GAAkB,oBAAoB,EAAE,OAAO4Q,GAAQ;AAElH,QAAMrP,IAAO,IAAI,KAAKqP,CAAM;AAC5B,MAAI,MAAMrP,EAAK,QAAO,CAAE;AACpB,UAAM,IAAIzB,GAAc,4BAA4B8Q,CAAM,IAAI5Q,GAAkB,oBAAoB,EAAE,OAAO4Q,GAAQ;AAEzH,SAAOrP;AACX;AAKA,SAASsP,GAAaD,GAAQrQ,GAAU;AACpC,MAAI,CAACD,GAAgBC,CAAQ;AACzB,UAAM,IAAIT,GAAc,qBAAqBS,CAAQ,IAAIP,GAAkB,kBAAkB,EAAE,UAAAO,GAAU;AAE7G,QAAMgB,IAAOoP,GAAoBC,CAAM;AACvC,SAAOJ,GAAYjP,GAAMhB,CAAQ;AACrC;AAuaO,SAASuQ,GAAYF,GAAQrQ,GAAUwQ,IAAQ,IAAM;AACxD,QAAMC,IAAYH,GAAaD,GAAQrQ,CAAQ;AAC/C,SAAOwK,GAAOiG,GAAWD,IAAQ9Q,GAAa,cAAcA,GAAa,UAAU;AACvF;AAgCO,SAASgR,GAAkBL,GAAQrQ,GAAU;AAChD,QAAMyQ,IAAYH,GAAaD,GAAQrQ,CAAQ;AAC/C,SAAO3B,GAAWmM,GAAOiG,GAAW/Q,GAAa,QAAQ,CAAC;AAC9D;AC1eO,MAAMiR,KAAiB;AAAA,EAC1B,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACR,GAwBaC,KAAY;AAAA,EACrB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACR,GAOaC,KAAa;AAAA,EACtB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACR,GAIaC,KAAqB;AAAA,EAC9B,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACX,GA2BaC,KAAc;AAAA,EACvB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA;AAAA,EAEJ,aAAa;AAAA;AAAA,EAEb,MAAM;AAAA;AAAA,EAEN,gBAAgB;AAAA;AAAA,EAEhB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,EAKN,WAAW;AAAA;AAAA;AAAA,EAGX,WAAW;AAAA;AAAA,EAEX,WAAW;AAAA;AAAA,EAEX,WAAW;AAAA;AAAA,EAEX,SAAS;AACb,GAMaC,KAAkB;AAAA,EAC3B,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACR;;kBCrIA;;AAiDE,MACE9U,IAAIC,EAAA,KAAAC,GAAA,QAAA,GAAG,IAAI,GACJhP,0BAAY,EAAE,GACrB6jB,4BAAU,SAAS,GACnBC,yBAAO,SAAS,GAChBC,8BAAY,IAAI,GAChBC,4BAAU,IAAI,GACdC,4BAAU,EAAK,GACfC,yBAAO,EAAK,GACZC,0BAAQ,SAAS,GACjBC,0BAAQ,EAAK,GAMbC,0BAAyC;AACzC,QAAID,EAAK,EAAE,QAAO;AAClB,UAAME,IAAeZ,GAAmB5U,GAAI;AAC5C,WAAIwV,KACIxV,EAAI,KAAkB;AAAA,EAChC,CAAC,GAEGyV,2BAA8B;AAChC,UAAMC,IAAWf,GAAU1U,EAAA,IAACsV,CAAY,EAAA,CAAA,KAAOZ,GAAW;AAI1D,WAAIK,EAAI,MAAK,YACJU,EAAS,QAAQ,oBAAoB,EAAE,EAAE,KAAI,IAE/CA;AAAA,EACT,IAAC,GAEGC,oBAGEX,EAAI,MAAK,YAAkB,KAC3BI,EAAI,IAAS,mDACVC,EAAK,MAAK,SAAS,iBAAiB,SAC5C,GAEGO,IAAiB3V,EAAA,QAAA,MAAY,OAAO8U,EAAO,GAAE,aAAW;AAO5D,QAAMc,IAAW,cACXC,IAAwE,EAC5E,cAAc,qBAAoB;AAGtC,MAAIC,2BAAiC;AACjC,UAAMC,IAAOnU,GAAkB5B,EAAA,IAAC2V,CAAiB,CAAA,KAC/C/T,GAAmB;AACrB,QAAImT,EAAI,MAAK,WAAW;AACtB,YAAMiB,IAAWD,EAAK,QAAQ,gBAAgB,EAAE,EAAE,KAAI,GAChDE,IAAWJ,EAA4B7V,EAAA,IAAC2V,CAAiB,CAAA;AAC/D,aAAIM,IACKD,EAAS,SAASJ,CAAQ,IAC7BI,EAAS,QAAQJ,GAAUK,CAAQ,IACnCA,IAECD;AAAA,IACT;AACA,WAAOD;AAAA,EACT,IAAC,GAEGG,2BAA8B;AAChC,UAAMC,IAAgB,CAAA;AACtB,WAAInB,EAAS,KAAEmB,EAAO,eAAenB,EAAS,CAAA,EAAA,GAC1CC,EAAO,KAAEkB,EAAO,0BAA0BlB,EAAO,CAAA,EAAA,GAC9CkB,EAAO,SAAS,IAAIA,EAAO,KAAK,IAAI,IAAI;AAAA,EACjD,IAAC;MAKFC,IAAGC,GAAA,eAAHD,CAAG;;;UAYCE,IAAIlW,GAAA;kBAAJkW,CAAI;AAAA;;MADFpB,EAAO,KAAAqB,EAAAC,CAAA;AAAA;;;;;oDAXbJ,CAAG;;kBAAHA,GAAG,GAAAK,CAAA,GAAHzW,EAAA,UAAAoW,SAQQF,CAAW,CAAA;AAAA;;mBAPX3f,GACL,oCAAkCyJ,EAAA,IAClCwV,CAAW,SACXM,CAAc,GAAA9V,EAAA,IACd0V,CAAY,GACZzkB,GAAS,CAAA;AAAA;0BANZmlB,GAAG,CASQxX,MAACqB,EAAA,UAAerB,CAAC,CAAA,eAT5BwX,CAAG;AAJI;;;kBCjGR;AAmBE,MACEM,IAAG1W,EAAA,KAAAC,GAAA,OAAA,GAAG,EAAE,GACR0W,wBAAM,EAAE,GACD1lB,0BAAY,EAAE,GACrB2lB,6BAAW,EAAE,GACbC,yBAAO,EAAK,GAGVC,IAAW9W,EAAA,QAAA,MAAY0W,EAAG,KAAIE,GAAQ;AAE1C,WAASG,EAAYnY,GAAU;AAC7B,QAAIgY,EAAQ,GAAE;AACZ,YAAMI,IAAMpY,EAAE;AACd,MAAIoY,EAAI,QAAQJ,EAAQ,MAAEI,EAAI,MAAMJ,EAAQ;AAAA,IAC9C;AAAA,EACF;;;;UAICR,IAAGC,GAAA,eAAHD,CAAG;;;cAECa,IAAG7W,GAAA;AAAH,UAAAJ,EAAA,gBAAA,MAAAA,EAAA,cAAAiX,gBACMH,CAAW,CAAA,CAAA,GADjB9W,EAAA,MAAA,SAAAiX,GAKUF,CAAW,mBALrBE,CAAG,eAAHA,CAAG;AAAA;;UADAJ,EAAI,KAAAN,EAAAC,CAAA;AAAA;;UASTU,IAAGlX,EAAA,QAAAmX,GAAA,CAAA;cAVLf,CAAG;AAAH,QAAApW,EAAA,UAAAoW,6BAAgCnlB,OAAS,EAAA,IAAA,eAAA,GAUvC+O,EAAA,cAAAkX,gBACMJ,CAAW,CAAA,GADjB9W,EAAA,cAAAkX,UAEEP,EAAG,CAAA,GAFL3W,EAAA,UAAAkX,GAAG,GAAAlX,EAAA,KAGK6W,MAAO,eAAe,YAAY,GAAA,eAAA;AAAA,UAH1C7W,EAAA,MAAA,SAAAkX,GAIUH,CAAW,mBAJrBG,CAAG,eAVLd,CAAG;AAAA;UAkBHgB,IAAGC,GAAA;AAAH,MAAArX,EAAA,gBAAA,MAAAA,EAAA,UAAAoX,6BAAgCnmB,EAAS,KAAA,EAAA,IAAA,eAAA,CAAA,eAAzCmmB,CAAG;AAAA;;YAnBDN,CAAW,IAAAP,EAAAe,CAAA,IAAAf,EAAAgB,GAAA,EAAA;AAAA;;;AAFR;AChDD,SAASC,GAAU9W,GAAMlB,IAAU,IAAI;AAC5C,QAAMiY,IAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,EAAI,KAAK,GAAG;AAEV,MAAIC,IAAUlY,EAAQ,WAAW,IAC7BmY,IAAgBnY,EAAQ,iBAAiB,MACzCoY,IAAoB;AAExB,WAASC,IAAuB;AAE9B,WADiB,MAAM,KAAKnX,EAAK,iBAAiB+W,CAAmB,CAAC,EACtD;AAAA,MACd,CAAAK,MAAM,CAACA,EAAG,aAAa,UAAU,KAAKA,EAAG,aAAa,MAAMC,EAAUD,CAAE;AAAA,IAC9E;AAAA,EACE;AAEA,WAASC,EAAUC,GAAS;AAC1B,WAAO,CAAC,EACNA,EAAQ,eACRA,EAAQ,gBACRA,EAAQ,eAAc,EAAG;AAAA,EAE7B;AAEA,WAASC,EAAcC,GAAO;AAC5B,QAAI,CAACR,KAAWQ,EAAM,QAAQ,MAAO;AAErC,UAAMC,IAAoBN;AAC1B,QAAIM,EAAkB,WAAW,EAAG;AAEpC,UAAMC,IAAeD,EAAkB,CAAC,GAClCE,IAAcF,EAAkBA,EAAkB,SAAS,CAAC;AAElE,IAAID,EAAM,WAEJ,SAAS,kBAAkBE,MAC7BF,EAAM,eAAc,GACpBG,EAAY,MAAK,KAIf,SAAS,kBAAkBA,MAC7BH,EAAM,eAAc,GACpBE,EAAa,MAAK;AAAA,EAGxB;AAEA,WAASE,IAAW;AAClB,QAAI,CAACZ,EAAS;AAGd,IAAAE,IAAoB,SAAS;AAG7B,UAAMO,IAAoBN;AAC1B,IAAIM,EAAkB,SAAS,IAE7B,sBAAsB,MAAM;AAC1B,MAAAA,EAAkB,CAAC,EAAE;IACvB,CAAC,KAGDzX,EAAK,aAAa,YAAY,IAAI,GAClCA,EAAK,MAAK,IAGZ,SAAS,iBAAiB,WAAWuX,CAAa;AAAA,EACpD;AAEA,WAASM,IAAa;AACpB,aAAS,oBAAoB,WAAWN,CAAa;AAGrD,UAAMO,IAAcb,KAAiBC;AACrC,IAAIY,KAAe,OAAOA,EAAY,SAAU,cAC9CA,EAAY,MAAK;AAAA,EAErB;AAGA,SAAId,KACFY,KAGK;AAAA,IACL,OAAOG,GAAY;AACjB,YAAMC,IAAaD,EAAW,WAAW;AACzC,MAAAd,IAAgBc,EAAW,iBAAiB,MAExCC,MAAehB,MACjBA,IAAUgB,GACNhB,IACFY,MAEAC;IAGN;AAAA,IACA,UAAU;AACR,MAAAA;IACF;AAAA,EACJ;AACA;;kBCjIA;;AAOE,QAAMI,IAAa,EACjB,SAAS,aAAY;AAUvB,MACE5Y,IAAIC,EAAA,KAAAC,GAAA,QAAA,GAAG,IAAI,GACXC,0BAAQ,MAAM,GACPjP,0BAAY,EAAE,GACb2nB,IAAU5Y,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,CAAA,EAAA,GAGhB4Y,IAAM7Y,EAAA,QAAA,OAAA,EAAA,GAAiB2Y,GAAa,GAAKC,EAAU,EAAA,EAAA,GAEnDE,oBAAqBrE,GAAU1U,EAAI,CAAA,KAAK0U,GAAU,EAAE,GACpDsE,oBAAsBlX,GAAqB3B,EAAK,CAAA,KAAK2B,GAAqB,IAAI;gBAGnF1B,IAAGH,EAAA,YAAAgZ,CAAA,GAiBH1C,cAjBAnW,GAAG,CAAA,eAiBHmW,GAAI,EAAA;UAAJA,CAAI;AAjBJ,IAAAtW,EAAA,UAAAG,GAAG,GAAA,GAAAH,EAAA,IAEM8Y,CAAS,KAAA,EAAA,oCAAA9Y,EAAA,IAAmC+Y,CAAU,WAAG9nB,EAAS,KAAA,EAAA,EAAA,GAerD+O,EAAA,SAAAiZ,GAAAjZ,EAAA,IAAA6Y,CAAM,EAAC,OAAO;AAAA;AAnB7B;ACXR,MAAMK,KAAqB;AAAA,EACvB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS,CAAC,IAAI,IAAI,EAAE;AAAA;AAAA,EACpB,SAAS,CAAC,IAAI,IAAI,EAAE;AAAA,EACpB,OAAO,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA;AAAA,EAC1B,WAAW;AAAA;AACf;AAaO,SAASC,GAAc1X,IAAQ,SAAS;AAC3C,MAAI,SAAO,SAAW,MAItB;AAAA,QAAI,OAAO,QAAQ,iBAAiB,QAAQ;AAExC,aAAO,OAAO,gBAAgB,OAAO,YAAYA,CAAK;AACtD;AAAA,IACJ;AAGA,QAAI,OAAO,cAAc;AAErB,YAAM2X,IAAc3X,MAAU,aAC1BA,MAAU,aACVA,MAAU,WACVA,MAAU,cACR,WACAA;AAEN,aAAO,aAAa,OAAO,EAAE,OAAO2X,EAAW,CAAE;AACjD;AAAA,IACJ;AAEA,QAAI,UAAU,SAAS;AACnB,YAAM9P,IAAU4P,GAAmBzX,CAAK;AACxC,gBAAU,QAAQ6H,CAAO;AAAA,IAC7B;AAAA;AACJ;AAkBO,SAAS+P,GAA0BvE,GAASwE,GAAW;AAG1D,UAAQxE,GAAO;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA;AAAA,IACX;AACI,aAAO;AAAA,EACnB;AACA;;kBClHA;;AAwFE,MACEA,IAAO9U,EAAA,KAAAC,GAAA,WAAA,GAAG,SAAS,GACnBF,yBAAO,IAAI,GACXwZ,6BAAW,EAAK,GAEhBC,4BAAU,EAAK,GACfC,gCAAc,EAAE,GAChBC,2BAAS,EAAK,GACdC,yBAAO,IAAI,GACXC,yBAAO,QAAQ,GACfC,2BAAS,EAAK,GAGP5oB,0BAAY,EAAE,GAsBnB6oB,iCAAkC,EAAK,GACvCC,kCAAsC,MAAS,GAG/CC,IAAcha,EAAA,MAAO,EAAK;AAG9B,EAAAA,EAAA,kBAAc;AACZ,IAAIwZ,EAAO,KAAA,CAAAxZ,EAAA,IAAKga,CAAW,KACzBb,GAAc,SAAS,GAEzBnZ,EAAA,IAAAga,GAAcR,GAAO;AAAA,EACvB,CAAC;AAGD,QAAMS,IAAkC;AAAA,IACtC,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA;AAIf,MAAIC,2BAAkC;AACpC,UAAMC,KAASF,EAAWnF,GAAO;AACjC,WAAIqF,MAEmB,GAAArF,EAAO,IAAyBqF,KACpBrF,EAAO,IACPqF,MAE1BA,MAEFrF,EAAO;AAAA,EAChB,IAAC,GACGsF,IAAiBpa,EAAA,QAAA,MAAYuZ,EAAQ,KAAAvZ,EAAA,IAAI8Z,CAAO,KAAIN,GAAO,GAM3Da,IAAUra,EAAA,QAAA,MAAAA,EAAA,IACZka,CAAe,MAAK,UAAM,OAChBna,EAAI,KAAK,YAAYA,EAAI,EAAC,WAAW,OAAO,CAAA;AASxD,QAAMua,IAAoC;AAAA;AAAA,IAExC,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA;AAAA,IAEJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA;AAEb,MAAIC,IAAYva,EAAA,QAAA,MAAA,OACND,OAAS,YAAYua,EAAava,EAAI,CAAA,KAAM,SAAS;AAS/D,QAAM+V,IAAsC;AAAA,IAC1C,SAAS;AAAA,IACT,aAAa;AAAA,IACb,SAAS;AAAA,IACT,KAAK;AAAA,IACL,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,kBAAkB;AAAA,IAClB,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,KAKL0E,IAAqC;AAAA,IACzC,OAAO;AAAA,IACP,QAAQ;AAAA,KAIJC,IAAkB,yEAElBC,IAA6B;AAErC,MAAI5B,oBAOE9Y,EAAA,IAAEka,CAAe,MAAK,SACpB,OAASna,EAAI,KAAK,YAAYA,EAAI,EAAC,WAAW,OAAO,IAC9C6U,GAAY7U,GAAI,KAAiC8U,GAAgB,KAEnEA,GAAgB9U,GAAI,KAAqC8U,GAAgB,WAE9EqF,CAAe,MAAK,SAAe,YAChCtF,GAAY7U,GAAI,KAAiC6U,GAAY,EACrE;AAGD,QAAM+F,KAAuB,QAAQ,SAAS,aAAa,MAAM;AAEjE,MAAIC,oBACEpB,EAAO,IAAS1D,EAAe,UAC/ByD,EAAQ,KAAA,CAAAvZ,EAAA,IAAK8Z,CAAO,KAAA,CAAKN,MACpBmB,EAAoB,eAAST,CAAe,CAAA,IAC/CQ,IACAD,IAEFf,EAAM,KAAIc,EAAaxa,EAAA,IAACka,CAAe,KAElCM,EAAaxa,EAAA,IAACka,CAAe,CAAA,IAE/BpE,EAAc9V,EAAA,IAACka,CAAe,CAAA,KAAKpE,EAAe,OAC1D,GAGG+E,oBAAyB,EAAK,GAG9BC,0CAA2C,cAAU7a,EAAA,QAAA,GAGrD8a,oBAAwB,YAAY;AAGxC,WAASC,GAAYpc,IAAe;AAIlC,QAAEoB,EAAA,IAAEoa,CAAiB,GAAE;AACrB,MAAAxb,GAAE,eAAc;AAChB;AAAA,IACF;AACA,QAAIib,EAAM,GAAE;AACV,YAAMoB,IAAc5B,GAAyBrZ,EAAA,IAACka,CAAe,CAAA;AAC7D,MAAIe,KACF9B,GAAc8B,CAAW;AAAA,IAE7B;gBACUrc,EAAC;AAAA,EACb;AAEA,MAAIsc,qBAAyBxc;AAAA,IAC3B;AAAA,UACAmc,CAAa,UACRC,EAAW,IAAG,sCAAsC,oCACrD;AAAA,UACJC,CAAY;AAAA,IACZ;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA;AAAA,UACAX,CAAiB,IAAG,KAAK;AAAA,IACzB;AAAA,UACAtB,CAAS;AAAA,UACT8B,CAAY;AAAA,UACZR,CAAiB,IAAG,uBAAuB;AAAA,IAC3CnpB,EAAS;AAAA;;;;UAKVkqB,IAACC,GAAA,GAmBC9E,YAnBF6E,CAAC;;uBAmBC7E,CAAI;;;;;;kBAOE+E,KAAIjb,GAAA,gBAAJib,EAAI;;;AAKA,kBAAAC,GAAOC,IAAA;AAAA;oBAAqB,QAAA,EAAA,SAAS,GAAE;AAAA;;;;;;;;;;AAJrC,kBAAAvb,EAAA,IAAA8Z,CAAO,kCAKkB,aAAUvD,GAAAe,IAAA,CAAA,IAAArX,EAAA,YAAAsW,GAAAiF,IAAA,CAAA;AAAA;;sBANzCH,EAAI,GAAJrb,EAAA,gBAAA,MAAAA,EAAA,UAAAqb,qBAAkBd,CAAY,KAAA,EAAA,8BAAA,CAAA,gBAA9Bc,EAAI;AAAA;;;;;;;;AADF,cAAArb,EAAA,IAAA+Z,CAAU,iCASe,aAAUxD,GAAAkF,IAAA,CAAA,IAAAxb,EAAA,YAAAsW,GAAAmF,IAAA,CAAA;AAAA;;;;;;;kBAMrCC,KAAItF,GAAA,gBAAJsF,EAAI;;;AAKA,kBAAAL,GAAOC,IAAA;AAAA;oBAAqB,QAAA,EAAA,SAAS,GAAE;AAAA;;;;wBAJrCzB,CAAO,KAAAvD,GAAAqF,EAAA;AAAA;;sBADbD,EAAI,GAAJ3b,EAAA,gBAAA,MAAAA,EAAA,cAAA2b,0BAAoE7B,CAAO,CAAA,CAAA,gBAA3E6B,EAAI;AAAA;;oBAJF5B,CAAU,KAAAxD,GAAAsF,CAAA;AAAA;;;;;;;;;;;;mCAaU,aAAUtF,GAAAuF,EAAA,IAAA7b,EAAA,YAAAsW,GAAAwF,IAAA,CAAA;AAAA;;;;;gBA7BhC1B,CAAU,IAAA9D,EAAAyF,EAAA,IAAAzF,EAAAgB,IAAA,EAAA;AAAA;;cADhBjB,CAAI;wBAAJA,GAAI,CAAA;;;;;;;;;;+BAiCoB,aAAUC,EAAA0F,CAAA,IAAAhc,EAAA,YAAAsW,EAAA2F,GAAA,CAAA;AAAA;;cApDpCf,CAAC;AAAD,QAAAnb,EAAA,cAAAmb,GAAC,QAAAnb,EAAA,IACMoa,CAAiB,IAAG,SAAYT,GAAI,mBAD3CwB,GAAC,MAAAlb,EAAA,EAAA,mBAADkb,GAAC,SAAAlb,EAAA,KAAA,mBAADkb,GAAC,YAAAnb,EAAA,IAIUoa,CAAiB,IAAA,KAAKna,EAAA,QAAA,GAJjCD,EAAA,UAAAmb,mBAKQD,EAAa,CAAA,CAAA,mBALrBC,GAAC,eAAAlb,EAAA,aAAA,CAAA,mBAADkb,GAAC,cAAAlb,EAAA,YAAA,CAAA,mBAADkb,GAAC,iBAAAnb,EAAA,IASeoa,CAAiB,KAAI,MAAS,mBAT9Ce,GAAC,aAAAnb,EAAA,IAUW8Z,CAAO,KAAA7Z,EAAA,WAAA,KAAgB,MAAS,mBAV5Ckb,GAAC,iBAAAlb,EAAA,eAAA,CAAA,mBAADkb,GAAC,iBAAAlb,EAAA,eAAA,CAAA,mBAADkb,GAAC,iBAAAlb,EAAA,eAAA,CAAA,mBAADkb,GAAC,gBAAAlb,EAAA,cAAA,CAAA,mBAADkb,GAAC,oBAAAlb,EAAA,kBAAA,CAAA,GAmBCf,KAAAc,EAAA,UAAAsW,iEAA+DkD,EAAO,EAAA,CAAA;AAAA,UAnBxExZ,EAAA,UAAA,SAAAmb,GAMUH,EAAW,gBANrBG,CAAC;AAAA;UAuDDgB,IAAMC,GAAA,GAoBJC,YApBFF,CAAM;;uBAoBJE,CAAI;;;;;;kBAOEC,KAAIlc,GAAA,gBAAJkc,EAAI;;;AAKA,kBAAAhB,GAAOC,IAAA;AAAA;oBAAqB,QAAA,EAAA,SAAS,GAAE;AAAA;;;;;;;;;;AAJrC,kBAAAvb,EAAA,IAAA8Z,CAAO,kCAKkB,aAAUvD,GAAAgG,IAAA,CAAA,IAAAtc,EAAA,YAAAsW,GAAAiG,IAAA,CAAA;AAAA;;sBANzCF,EAAI,GAAJtc,EAAA,gBAAA,MAAAA,EAAA,UAAAsc,qBAAkB/B,CAAY,KAAA,EAAA,8BAAA,CAAA,gBAA9B+B,EAAI;AAAA;;;;;;;;AADF,cAAAtc,EAAA,IAAA+Z,CAAU,kCASe,aAAUxD,GAAAkG,IAAA,CAAA,IAAAxc,EAAA,YAAAsW,GAAAmG,IAAA,CAAA;AAAA;;;;;;;kBAMrCC,KAAItG,GAAA,gBAAJsG,EAAI;;;AAKA,kBAAArB,GAAOC,IAAA;AAAA;oBAAqB,QAAA,EAAA,SAAS,GAAE;AAAA;;;;wBAJrCzB,CAAO,KAAAvD,GAAAqG,EAAA;AAAA;;sBADbD,EAAI,GAAJ3c,EAAA,gBAAA,MAAAA,EAAA,cAAA2c,0BAAoE7C,CAAO,CAAA,CAAA,gBAA3E6C,EAAI;AAAA;;oBAJF5C,CAAU,KAAAxD,GAAAsG,EAAA;AAAA;;;;;;;;;;;;mCAaU,aAAUtG,GAAAuG,EAAA,IAAA7c,EAAA,YAAAsW,GAAAwG,IAAA,CAAA;AAAA;;;;;gBA7BhC1C,CAAU,IAAA9D,EAAAyG,EAAA,IAAAzG,EAAA0G,IAAA,EAAA;AAAA;;cADhBZ,CAAI;wBAAJA,GAAI,CAAA;;;;;;;;;;+BAiCoB,aAAU9F,EAAA2G,CAAA,IAAAjd,EAAA,YAAAsW,EAAA4G,GAAA,CAAA;AAAA;;;;;cAEhCC,IAAIC,GAAA,gBAAJD,CAAI;AACF,UAAAE,GAAYC,IAAA,EAAA,OAAA,UAAA,CAAA;;;;kBACKC,KAAIC,GAAA,gBAAJD,IAAI,EAAA;sBAAJA,EAAI,0CAAsB/D,EAAW,CAAA,CAAA,gBAArC+D,EAAI;AAAA;;cAAjB/D,EAAW,KAAAlD,GAAAmH,EAAA;AAAA;;kBAFjBN,CAAI,eAAJA,CAAI;AAAA;;UADF5D,EAAO,KAAAjD,EAAAoH,CAAA;AAAA;;cAtDbxB,CAAM;AAAN,QAAAnc,EAAA,cAAAmc,WACEvC,EAAI,CAAA,mBADNuC,GAAM,MAAAlc,EAAA,EAAA,mBAANkc,GAAM,QAAAlc,EAAA,IAAA,mBAANkc,GAAM,SAAAlc,EAAA,KAAA,mBAANkc,GAAM,YAAAlc,EAAA,QAAA,GAAND,EAAA,UAAAmc,mBAMQjB,EAAa,CAAA,CAAA,GANrBiB,mBAOW/B,CAAiB,mBAP5B+B,GAAM,eAAAlc,EAAA,aAAA,CAAA,mBAANkc,GAAM,cAAAlc,EAAA,YAAA,CAAA,mBAANkc,GAAM,aAAAnc,EAAA,IAWM8Z,CAAO,KAAA7Z,EAAA,WAAA,KAAgB,MAAS,mBAX5Ckc,GAAM,iBAAAlc,EAAA,eAAA,CAAA,mBAANkc,GAAM,iBAAAlc,EAAA,eAAA,CAAA,mBAANkc,GAAM,iBAAAlc,EAAA,eAAA,CAAA,mBAANkc,GAAM,gBAAAlc,EAAA,cAAA,CAAA,mBAANkc,GAAM,oBAAAlc,EAAA,kBAAA,CAAA,GAoBJ2d,KAAA5d,EAAA,UAAAqc,iEAA+D7C,EAAO,EAAA,CAAA;AAAA,UApBxExZ,EAAA,UAAA,SAAAmc,GAQUnB,EAAW,gBARrBmB,CAAM;AAAA;;MAxDJxC,EAAI,IAAApD,GAAAsH,CAAA,IAAAtH,GAAAuH,GAAA,EAAA;AAAA;;;AAFD;;;kBCtTR;;AAmCE,MACEhJ,IAAO9U,EAAA,KAAAC,GAAA,WAAA,GAAG,SAAS,GACnBF,yBAAO,IAAI,GACXwZ,6BAAW,EAAK,GAChBO,4BAAU,EAAK,GACfN,4BAAU,EAAK,GACfC,gCAAc,EAAE,GAChBC,2BAAS,EAAK,GACdC,yBAAO,IAAI,GACXC,yBAAO,QAAQ,GACfC,2BAAS,EAAK,GAGP5oB,0BAAY,EAAE,GAgBnB+oB,IAAcha,EAAA,MAAO,EAAK;AAG9B,EAAAA,EAAA,kBAAc;AACZ,IAAIwZ,EAAO,KAAA,CAAAxZ,EAAA,IAAKga,CAAW,KACzBb,GAAc,SAAS,GAEzBnZ,EAAA,IAAAga,GAAcR,GAAO;AAAA,EACvB,CAAC;AAGD,QAAMS,IAAkC;AAAA,IACtC,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA;AAIf,MAAIC,IAAela,EAAA,QAAA,MAAYia,EAAWnF,EAAO,MAAKA,GAAO,GACzDsF,IAAiBpa,EAAA,QAAA,MAAYuZ,EAAQ,KAAIO,EAAO,KAAIN,GAAO;AAG/D,QAAM1D,IAAsC;AAAA,IAC1C,SAAS;AAAA,IACT,aAAa;AAAA,IACb,SAAS;AAAA,IACT,KAAK;AAAA,IACL,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,KAIL0E,IAAqC;AAAA,IACzC,OAAO;AAAA,IACP,QAAQ;AAAA,KAIJC,IAAkB,yEAElBC,IAA6B;AAEnC,MAAI5B,oBACA9Y,EAAA,IAAEka,CAAe,MAAK,SAAerF,GAAgB9U,EAAI,CAAA,KAAqC8U,GAAgB,WAC5GqF,CAAe,MAAK,SAAe,YAChCtF,GAAY7U,GAAI,KAAiC6U,GAAY,EACrE;AAGD,QAAM+F,KAAuB,QAAQ,SAAS,aAAa,MAAM;AAEjE,MAAIC,oBACEpB,EAAO,IAAS1D,EAAe,UAC/ByD,EAAQ,KAAA,CAAKO,EAAO,KAAA,CAAKN,EAAO,IAC3BmB,EAAoB,eAAST,CAAe,CAAA,IAC/CQ,IACAD,IAEFf,EAAM,KAAIc,EAAaxa,EAAA,IAACka,CAAe,KAElCM,EAAaxa,EAAA,IAACka,CAAe,CAAA,IAE/BpE,EAAc9V,EAAA,IAACka,CAAe,CAAA,KAAKpE,EAAe,OAC1D,GAGG+E,oBAAyB,EAAK,GAG9BC,yCAA2C,cAAU7a,EAAA,QAAA,GAGrD8a,oBAAwB,YAAY;AAGxC,WAASC,EAAYpc,IAAe;AAClC,QAAIib,EAAM,KAAA,CAAA7Z,EAAA,IAAKoa,CAAiB,GAAE;AAChC,YAAMa,IAAc5B,GAAyBrZ,EAAA,IAACka,CAAe,CAAA;AAC7D,MAAIe,KACF9B,GAAc8B,CAAW;AAAA,IAE7B;gBACUrc,EAAC;AAAA,EACb;AAEA,MAAIsc,oBAAyBxc;AAAA,IAC3B;AAAA,UACAmc,CAAa,UACRC,CAAW,IAAG,sCAAsC,oCACrD;AAAA,UACJC,CAAY;AAAA,IACZ;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,UACAX,CAAiB,IAAG,KAAK;AAAA,IACzB;AAAA,UACAtB,CAAS;AAAA,UACT8B,CAAY;AAAA,UACZR,CAAiB,IAAG,uBAAuB;AAAA,IAC3CnpB,EAAS;AAAA;;;;UAKVkqB,IAAC9E,GAAA,eAAD8E,CAAC;;;cAcG7E,IAAIlW,GAAA;sBAAJkW,CAAI;AAAA;;UADFwD,EAAO,KAAAvD,EAAAC,CAAA;AAAA;;UAGX6E,KAAIrb,EAAA,QAAAmX,GAAA,CAAA;;sBAAJkE,EAAI;;;;;;;;;;+BACsB,aAAU9E,EAAAe,EAAA,IAAArX,EAAA,YAAAsW,EAAAiF,IAAA,CAAA;AAAA;;cADpCH,EAAI;yBAAJA,IAAI,CAAA;;;;;;;;;;+BAGoB,aAAU9E,EAAAwH,EAAA,IAAA9d,EAAA,YAAAsW,EAAAkF,GAAA,CAAA;AAAA;;cAnBpCN,CAAC;AAAD,QAAAnb,EAAA,cAAAmb,WACExB,EAAI,CAAA,GADN3Z,EAAA,UAAAmb,eAESD,CAAa,KAAA,EAAA,IAAGpB,EAAO,IAAG,kBAAkB,EAAE,IAAA,gBAAA,mBAFvDqB,GAAC,MAAAlb,EAAA,EAAA,mBAADkb,GAAC,cAAAlb,EAAA,YAAA,CAAA,mBAADkb,GAAC,iBAAAlb,EAAA,eAAA,CAAA,mBAADkb,GAAC,iBAAAlb,EAAA,eAAA,CAAA,mBAADkb,GAAC,iBAAAlb,EAAA,eAAA,CAAA,mBAADkb,GAAC,eAAAlb,EAAA,aAAA,CAAA,mBAADkb,GAAC,YAAAlb,EAAA,QAAA,mBAADkb,GAAC,SAAAlb,EAAA,KAAA,mBAgBCob,IAAI,GAAA,mDAAA,MAAAnc,GAAA,EAAA,WAA2D4a,EAAO,KAAIN,EAAO,EAAA,CAAA;AAAA,UAhBnFxZ,EAAA,UAAA,SAAAmb,GAGUH,CAAW,gBAHrBG,CAAC;AAAA;UAuBDgB,IAAMsB,GAAA,eAANtB,CAAM;;;cAiBFR,IAAIvb,GAAA;sBAAJub,CAAI;AAAA;;UADF7B,EAAO,KAAAvD,EAAAyF,CAAA;AAAA;;UAGXK,KAAIrc,EAAA,QAAAge,GAAA,CAAA;;sBAAJ3B,EAAI;;;;;;;;;;+BACsB,aAAU9F,EAAAqF,EAAA,IAAA3b,EAAA,YAAAsW,EAAAsF,IAAA,CAAA;AAAA;;cADpCQ,EAAI;yBAAJA,IAAI,CAAA;;;;;;;;;;+BAGoB,aAAU9F,EAAAuF,EAAA,IAAA7b,EAAA,YAAAsW,EAAAwF,GAAA,CAAA;AAAA;;;;;cAEhCO,IAAIlB,GAAA,eAAJkB,CAAI;AACF,UAAAgB,GAAYW,GAAA,EAAA,OAAA,UAAA,CAAA;;;;kBACKtB,KAAItF,GAAA,gBAAJsF,IAAI,EAAA;sBAAJA,EAAI,0CAAsBlD,EAAW,CAAA,CAAA,gBAArCkD,EAAI;AAAA;;cAAjBlD,EAAW,KAAAlD,GAAA0F,EAAA;AAAA;;kBAFjBK,CAAI,eAAJA,CAAI;AAAA;;UADF9C,EAAO,KAAAjD,EAAA2F,CAAA;AAAA;;cAvBbC,CAAM;AAAN,QAAAnc,EAAA,cAAAmc,WACEvC,EAAI,CAAA,GADN5Z,EAAA,UAAAmc,eAESjB,CAAa,KAAA,EAAA,IAAGpB,EAAO,IAAG,kBAAkB,EAAE,IAAA,gBAAA,GAFvDqC,mBAGW/B,CAAiB,mBAH5B+B,GAAM,MAAAlc,EAAA,EAAA,mBAANkc,GAAM,cAAAlc,EAAA,YAAA,CAAA,mBAANkc,GAAM,iBAAAlc,EAAA,eAAA,CAAA,mBAANkc,GAAM,iBAAAlc,EAAA,eAAA,CAAA,mBAANkc,GAAM,iBAAAlc,EAAA,eAAA,CAAA,mBAANkc,GAAM,eAAAlc,EAAA,aAAA,CAAA,mBAANkc,GAAM,YAAAlc,EAAA,QAAA,mBAANkc,GAAM,QAAAlc,EAAA,IAAA,mBAANkc,GAAM,QAAAlc,EAAA,IAAA,mBAANkc,GAAM,SAAAlc,EAAA,KAAA,mBAmBJoc,IAAI,GAAA,mDAAA,MAAAuB,GAAA,EAAA,WAA2D9D,EAAO,KAAIN,EAAO,EAAA,CAAA;AAAA,UAnBnFxZ,EAAA,UAAA,SAAAmc,GAIUnB,CAAW,gBAJrBmB,CAAM;AAAA;;MAxBJxC,EAAI,IAAApD,GAAAmF,EAAA,IAAAnF,GAAAgB,IAAA,EAAA;AAAA;;;AAFD;;;kBC/KR;AAmBE,MAAatmB,IAAS+O,EAAA,KAAAC,GAAA,SAAA,GAAG,EAAE;MAG5BmW,IAAGhW,GAAA,eAAHgW,CAAG;;;;;;;;;;UAAHA,CAAG,GAAHpW,EAAA,gBAAA,MAAAA,EAAA,UAAAoW,uCACuCnlB,EAAS,KAAA,EAAA,IAAA,gBAAA,CAAA,eADhDmlB,CAAG;AAFI;ACjBH,MAAC8H,KAAS,OAAO,OAAOC,IAAc,EAAA,MAAEC,IAAI,OAAEC,GAAK,CAAE;ACKnD,SAASC,GAAclrB,GAAO;AACjC,SAAO,KAAK,OAAOA,IAAQ,OAAO,WAAW,GAAG,IAAI;AACxD;AAyBO,SAASmrB,GAAsBC,GAAOhf,GAASuP,IAAS,SAAS;AACpE,MAAIyP,KAAU;AACV,WAAO;AACX,QAAMC,IAAUD,IAAQ,KAClB,EAAE,QAAAE,GAAQ,GAAGC,EAAW,IAAgB,CAAA;AAC9C,SAAID,KAAUD,MAAY,IAEf,GADMA,IAAU,IAAI,MAAM,GACnB,GAAGG,GAAe,KAAK,IAAIH,CAAO,GAAGE,GAAa5P,CAAM,CAAC,KAEpE6P,GAAeH,GAASE,GAAa5P,CAAM;AACtD;AAmDO,SAAS6P,GAAexrB,GAAOyrB,GAAmB9P,IAAS,SAAS;AACvE,MAAI3b,KAAU;AACV,WAAO;AACX,MAAI0rB;AACJ,SAAI,OAAOD,KAAsB,WAE7BC,IAAgB;AAAA,IACZ,OAAO;AAAA,IACP,UAAUD;AAAA,EACtB,IAEaA,KAAqB,OAAOA,KAAsB,WAEvDC,IAAgB;AAAA,IACZ,OAAO;AAAA,IACP,UAAUD,EAAkB,YAAY;AAAA,IACxC,GAAGA;AAAA,EACf,IAIQC,IAAgB;AAAA,IACZ,OAAO;AAAA,IACP,UAAU;AAAA,EACtB,GAEW,IAAI,KAAK,aAAa/P,GAAQ+P,CAAa,EAAE,OAAO1rB,CAAK;AACpE;AA6HA,SAAS0R,GAAO1R,GAAO;AACnB,MAAIA,KAAU;AACV,WAAO;AACX,QAAMyR,IAAOzR,aAAiB,OAAOA,IAAQ,IAAI,KAAKA,CAAK;AAC3D,SAAO,MAAMyR,EAAK,QAAO,CAAE,IAAI,OAAOA;AAC1C;AAgBO,SAASka,GAAW3rB,GAAOoM,GAASuP,IAAS,SAASW,GAAU;AACnE,QAAM7K,IAAOC,GAAO1R,CAAK;AACzB,MAAI,CAACyR;AACD,WAAO;AAMX,QAAMma,IAAS,EAAE,GALA;AAAA,IACb,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACb,GACkC,GAAGxf,EAAO;AAGxC,SAAO,IAAI,KAAK,eAAeuP,GAAQiQ,CAAM,EAAE,OAAOna,CAAI;AAC9D;AAuBO,SAASoa,GAAiB7rB,GAAOsc,GAAU;AAC9C,QAAM7K,IAAOC,GAAO1R,CAAK;AACzB,MAAI,CAACyR;AACD,WAAO;AAEX,QAAMtR,IAAQ,IAAI,KAAK,eAAe,SAAS;AAAA,IAC3C,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EAEb,CAAK,EAAE,cAAcsR,CAAI,GACfY,IAAOlS,EAAM,KAAK,CAAC2rB,MAAMA,EAAE,SAAS,MAAM,GAAG,SAAS,IACtDvT,IAAQpY,EAAM,KAAK,CAAC2rB,MAAMA,EAAE,SAAS,OAAO,GAAG,SAAS,IACxD7Z,IAAM9R,EAAM,KAAK,CAAC2rB,MAAMA,EAAE,SAAS,KAAK,GAAG,SAAS;AAC1D,SAAO,GAAGzZ,CAAI,IAAIkG,CAAK,IAAItG,CAAG;AAClC;AAgBO,SAAS8Z,GAAe/rB,GAAOoM,GAASuP,IAAS,SAASW,GAAU;AACvE,QAAM7K,IAAOC,GAAO1R,CAAK;AACzB,MAAI,CAACyR;AACD,WAAO;AAQX,QAAMma,IAAS,EAAE,GAPA;AAAA,IACb,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,EAChB,GACkC,GAAGxf,EAAO;AAGxC,SAAO,IAAI,KAAK,eAAeuP,GAAQiQ,CAAM,EAAE,OAAOna,CAAI;AAC9D;AAeO,SAASua,GAAchsB,GAAOoM,GAASuP,IAAS,SAASW,GAAU;AACtE,QAAM7K,IAAOC,GAAO1R,CAAK;AACzB,MAAI,CAACyR;AACD,WAAO;AACX,QAAMma,IAAS,EAAE,GAAGxf,EAAO;AAG3B,SAAO,IAAI,KAAK,eAAeuP,GAAQiQ,CAAM,EAAE,OAAOna,CAAI;AAC9D;AAyBO,SAASwa,GAAWjsB,GAAOoM,GAASuP,IAAS,SAASW,GAAU;AACnE,QAAM7K,IAAOC,GAAO1R,CAAK;AACzB,MAAI,CAACyR;AACD,WAAO;AAKX,QAAMma,IAAS,EAAE,GAJA;AAAA,IACb,MAAM;AAAA,IACN,QAAQ;AAAA,EAChB,GACkC,GAAGxf,EAAO;AAGxC,SAAO,IAAI,KAAK,eAAeuP,GAAQiQ,CAAM,EAAE,OAAOna,CAAI;AAC9D;AA2HO,SAASya,GAAeC,GAAWC,GAAU;AAChD,QAAMC,IAAQF,GAAW,KAAI,KAAM,IAC7BG,IAAOF,GAAU,KAAI,KAAM;AACjC,SAAIC,KAASC,IACF,GAAGD,CAAK,IAAIC,CAAI,KACvBD,KAEAC,KAEG;AACX;AAoDO,SAASC,GAAuBvsB,GAAO;AAC1C,SAAOA,EAAM,QAAQ,OAAO,EAAE,EAAE,QAAQ,WAAW,KAAK,EAAE,KAAI;AAClE;AAMO,SAASwsB,GAAkBxsB,GAAO;AACrC,QAAMysB,IAAezsB,EAAM,QAAQ,OAAO,EAAE;AAC5C,MAAI0sB,IAAiB;AACrB,SAAID,EAAa,SAAS,MACtBC,KAAkBD,EAAa,UAAU,GAAG,CAAC,IAC7CA,EAAa,UAAU,MACvBC,KAAkB,MAAMD,EAAa,UAAU,GAAG,CAAC,IACnDA,EAAa,UAAU,MACvBC,KAAkB,MAAMD,EAAa,UAAU,GAAG,EAAE,IACjDC;AACX;AA6BO,SAASC,GAAoBnG,GAAM;AACtC,UAAQA,GAAI;AAAA,IACR,KAAK;AAAA,IACL,KAAK;AACD,qBAAQ,KAAK,sDAAsDA,CAAI,2BAA2B,GAC3F;AAAA,IACX,KAAK;AACD,qBAAQ,KAAK,sDAAsDA,CAAI,gCAAgC,GAChG;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAOA;AAAA,IACX;AACI,aAAO;AAAA,EACnB;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCnpBA;;AA8FE,QAAMjB,IAA+B;AAAA,IACnC,cAAc;AAAA,IACd,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,cAAc;AAAA,IACd,eAAe;AAAA,IACf,UAAU;AAAA;AAGZ,MACEqH,IAAQhgB,EAAA,KAAAC,GAAA,YAAA,GAAG,EAAK,GAChBsZ,6BAAW,EAAK,GAChB0G,6BAAW,EAAK,GAChBC,yBAAO,IAAI,GACXC,+BAAa,IAAI,GACjBC,+BAAa,IAAI,GACjBC,8BAAY,IAAI,GAChBC,8BAAY,IAAI,GAChB1G,yBAAO,MAAM,GACb2G,gCAAc,EAAE,GAChBllB,0BAAQ,EAAE,GACVmlB,uBAAK,EAAE,GACPC,yBAAO,EAAE,GACFxvB,0BAAY,EAAE,GACrB8O,yBAAO,IAAI,GACX2gB,iCAAe,EAAE,GACjBC,8BAAY,EAAE,GACdzgB,0BAAQ,MAAM,GACd0gB,+BAAa,EAAE,GACfC,+BAAa,EAAE,GACfC,6BAAW,EAAE,GACbC,6BAAW,EAAE,GACbC,iCAAe,MAAM,GACrBC,6BAAW,EAAK,GAChBC,+BAAa,EAAK,GAClBC,kCAAgB,IAAI,GACpBC,mCAAgB,IAAI,GACpBhuB,2BAA8B,EAAE,GAChCiuB,kCAAe,IAAI,GACnBC,+BAAY,EAAK,GACjBC,wCAAqB,EAAI,GACzBC,iCAAe,EAAI,GACnBC,+BAAa,EAAE,GACfC,+BAAa,EAAE,GACfC,oCAAiB,EAAK,GACtBC,8BAAY,IAAI,GAChBC,kCAAgB,EAAK,GACrBC,gCAAa,GAAG,GAChBC,oCAAiB,CAAC,GAClBC,qCAAkB,EAAK,GAMfpJ,KAAU5Y,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,CAAA,EAAA,GACfgiB,IAASjiB,EAAA,WAAAC,GAAAiiB,EAAA;AAId,EAAIf,EAAa,KAAKC;AAItB,MAAIe,IAAqBniB,EAAA,QAAA,MAAYohB,GAAa,KAAID,GAAa,GAE/DtI,IAAM7Y,EAAA,QAAA,OAAA,EAAA,GAAiB2Y,GAAa,GAAKC,GAAU,EAAA,EAAA,GAMnDwJ,IAAapiB,EAAA,MAAmB,EAAE,GAClCqiB,IAAeriB,EAAA,MAAsD,IAAI,GACzEsiB,GAEAC,IAAiBviB,EAAA,QAAA,MAAY4hB,EAAS,KAAIY,GAAqB5I,EAAI,CAAA,CAAA,GAInE6I,KAAgBziB,EAAA,QAAA,MAAiBqhB,GAAY,KAAI,IAAI;AAEzD,WAASmB,GAAqBE,IAAuC;AACnE,YAAQA,IAAS;AAAA,MACf,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA;EAEb;AAEA,EAAA1iB,EAAA,kBAAc;AACZ,IAAI5M,EAAK,MAAA4M,EAAA,IAAKoiB,CAAU,KACtBpiB,EAAA,IAAAoiB,GAAahvB,EAAK,GAAA,EAAA;AAAA,EAEtB,CAAC;AAED,WAASuvB,KAAmB;AAC1B,IAAE3iB,EAAA,IAAEqiB,CAAY,KAAAriB,EAAA,IAAIqiB,CAAY,EAAC,UAAKriB,EAAA,IAAKoiB,CAAU,YACnDA,GAAUpiB,EAAA,IAAGqiB,CAAY,EAAC,OAAK,EAAA,GAC/BjvB,QAAQgvB,CAAU,CAAA;AAAA,EAEtB;AAEA,MAAIQ,KAAoB5iB,EAAA,MAAO,EAAK,GAGhC6iB,qBAAoB3iB,EAAK,MAAK,SAAS,EAAQygB,EAAS,CAAA,GAExD+B,qBAAqBnB,GAAkB,KAAAvhB,EAAA,IAAI4iB,EAAiB,IAAG,SAAShJ,EAAI,CAAA,GAC5EkJ,KAAa9iB,EAAA,QAAA,MAAYwhB,EAAY,KAAA,CAAKjI,EAAQ,MAAK0H,GAAQ,GAE/DnI,qBAAqBtE,GAAezU,EAAI,CAAA,KAAKyU,GAAe,EAAE;AAElE,QAAMuO,WAAiC;AACrC,IAAA/iB,EAAA,IAAA4iB,WAAqBA,EAAiB,CAAA;AAAA,EACxC,GAEMI,KAAW,CAAI9K,OAAiB;AACpC,UAAM+K,IAAS/K,GAAM;AACrB,QAAIzkB,IAAewvB,EAAO;AAG1B,QAAIrJ,EAAI,MAAK,oBAAoB;AAC/B,YAAMsJ,KAAWzvB,EAAK,QAAQ,OAAO,EAAE;AACvC,MAAAA,IAAOksB,GAAuBuD,EAAQ,GACtCD,EAAO,QAAQxvB;AAAA,IACjB;AAEA,QAAImmB,EAAI,MAAK,eAAe;AAC1B,YAAMsJ,KAAWzvB,EAAK,QAAQ,OAAO,EAAE;AACvC,MAAAA,IAAOmsB,GAAkBsD,EAAQ,GACjCD,EAAO,QAAQxvB;AAAA,IACjB;AAEA,QAAImmB,EAAI,MAAK,YAAY;AACvB,UAAIuJ,KAAY1vB,EAAK,KAAI;AACzB,YAAM2vB,KAAa,gJACbC,KAAWF,GAAU,MAAMC,EAAU;AAC3C,MAAIC,OACFF,KAAYE,GAAS,CAAC,IAExBF,KAAYA,GAAU,QAAQ,OAAO,EAAE,GACvCA,KAAYA,GAAU,QAAQ,mBAAmB,EAAE,GACnD1vB,IAAO0vB,IACPF,EAAO,QAAQxvB;AAAA,IACjB;AASA,QAPAuM,EAAA,IAAAoiB,GAAa3uB,GAAI,EAAA,GACjBL,EAAQK,CAAI,qBAGIA,CAAI,GAGhBouB,EAAa,GAAE;AAEjB,UADA,aAAaS,CAAa,GACtB7uB,EAAK,WAAW,GAAG;AACR,QAAAwM,EAAA,WAAA,EAAA,OAAO,GAAE,CAAA;AACtB;AAAA,MACF;AACA,MAAIxM,EAAK,UAAUsuB,SACjBO,IAAgB;AAAA,cAAiB;AAClB,UAAAriB,EAAA,WAAA,EAAA,OAAOxM,EAAI,CAAA;AAAA,QAC1B;AAAA,QAAGquB,GAAU;AAAA;IAEjB;AAAA,EACF;AAEA,WAASwB,KAAa;AACpB,IAAAtjB,EAAA,IAAAoiB,GAAa,EAAE,GACfhvB,EAAQ,EAAE,GACV,aAAakvB,CAAa,GACtBT,EAAa,KACF5hB,EAAA,WAAA,EAAA,OAAO,GAAE,CAAA,GAEtBD,EAAA,IAAEqiB,CAAY,KACdriB,EAAA,IAAAqiB,CAAY,EAAC,MAAK;AAAA,EAEtB;AAEA,WAASkB,GAAoBrL,IAAsB;AACjD,IAAI2J,EAAa,MACX3J,GAAM,QAAQ,YAChB,aAAaoK,CAAa,GACbriB,EAAA,WAAA,EAAA,OAAO,OAAMD,EAAA,IAACoiB,CAAU,KAAI,EAAE,GAAA,IAEzClK,GAAM,QAAQ,YAChBoL,GAAU;AAAA,EAGhB;AAEA,EAAAE,SAAgB;AACd,iBAAalB,CAAa;AAAA,EAC5B,CAAC;AAED,QAAMmB,WAAmB;;EAEzB,GAEMC,WAAoB;;EAE1B,GAEMC,WAA6B;AACjC,YAAQ3C,EAAY,GAAA;AAAA,MAClB,KAAK;AAAU,eAAO;AAAA,MACtB,KAAK;AAAS,eAAO;AAAA,MACrB;AAAS,eAAO;AAAA;EAEpB,GAEM4C,WAA6B;AACjC,YAAQlD,EAAY,GAAA;AAAA,MAClB,KAAK;AAAM,eAAO;AAAA,MAClB,KAAK;AAAM,eAAO;AAAA,MAClB,KAAK;AAAM,eAAO;AAAA,MAClB;AAAS,eAAO;AAAA;EAEpB,GAEMmD,WAA0B;AAC9B,IAAE,OAAA7jB,EAAA,IAASmiB,CAAqB,KAAK,cACnCniB,EAAA,IAAAmiB,CAAqB,EAAC,OAAMniB,EAAA,IAACoiB,CAAU,KAAI,EAAE,CAAA;AAAA,EAEjD;MAGDhM,IAAG0N,GAAA;qBAAH1N,GAAG,OAAA;AAAA,kCAA6BnlB,EAAS,KAAA,EAAA;AAAA,OAAOgxB;AAAA;kBAAhD7L,CAAG;;;UAECgB,IAAGC,GAAA,GACD0M,YADF3M,CAAG,gBACD2M,GAAK,EAAA;;;cACkBzN,KAAIlW,GAAA;uBAAJkW,EAAI;AAAA;;UAAd0J,EAAQ,KAAAzJ,GAAAC,EAAA;AAAA;;cADrBuN,CAAK;yBAALA,GAAK,CAAA;;;cAIH1I,KAAIhF,GAAA,gBAAJgF,EAAI;kBAAJA,EAAI;wBAAJA,IAAI,GAAA,uBAA6BqG,QAAe,YAAY,wBAAwBA,EAAU,MAAK,UAAU,uBAAuB,EAAE,EAAA,sBAAKD,OAAU,EAAA,GAAA;AAAA,2BAArJpG,EAAI;AAAA;;UADFoG,EAAU,KAAAlL,GAAAe,EAAA;AAAA;;;;;cAIZqE,KAAItF,GAAA,gBAAJsF,IAAI,EAAA;kBAAJA,EAAI;wBAAJA,IAAI,GAAA3b,EAAA,KAAQK,GAAW,OAAO,CAAA,GAAGL,EAAA,SAAAgkB,IAAAhkB,EAAA,IAAA6Y,CAAM,EAAC,QAAQ;AAAA,2BAAhD8C,EAAI;AAAA;;UADFsE,EAAQ,KAAA1J,GAAAiF,EAAA;AAAA;;cAPdpE,CAAG;AACD,QAAApX,EAAA,cAAA+jB,UAAWvD,EAAE,CAAA,eAAbuD,GAAK,GAAA,GAAoB1jB,GAAW,KAAK,gCAAA,kBACvChF,GAAK;AAAA,uBAFT+b,CAAG;AAAA;;MADD/b,EAAK,KAAAkb,GAAAwH,EAAA;AAAA;;MAaTkG,IAAGjkB,EAAA,QAAAU,GAAA,CAAA,gBAAHujB,CAAG;;;UAECC,IAAQ9I,GAAA;8BAAR8I,CAAQ,GAARA,aAWW;;AAXX,UAAAlkB,EAAA,cAAAkkB,SACE1D,EAAE,CAAA,GADJxgB,EAAA,cAAAkkB,WAEEzD,EAAI,CAAA,GAFNzgB,EAAA,cAAAkkB,kBAGE3D,EAAW,CAAA,GAHbvgB,EAAA,UAAAkkB,SAIQ9B,CAAU,CAAA,GAJlBpiB,EAAA,cAAAkkB,gBAQE7D,EAAS,CAAA,GARXrgB,EAAA,cAAAkkB,gBASE5D,EAAS,CAAA,GATXtgB,EAAA,UAAAkkB,GAAQ,GAAA,GAUC7jB,GAAW,sLAA+KwiB,EAAQ,IAAG,+BAA+B,uFAAuF,IAAApM,KAAA,EAAA,IAAA0N,MAAA,EAAA,IAAAnkB,EAAA,IAAqD8iB,EAAa,IAAG,uBAAuB,EAAE,EAAA,GAVlaoB,aAYE3K,EAAQ,GAZV2K,aAaEjD,EAAQ,GAbVjhB,EAAA,cAAAkkB,oBAegBlE,EAAQ,CAAA;AAAA;QAL+S,CAAA,MAAA2D,YAAyBC,GAAoB,CAAA;AAAA,SAVpX5jB,EAAA,UAAA,SAAAkkB,GAKUlB,EAAW,GALrBhjB,EAAA,MAAA,QAAAkkB,GAMST,EAAU,GANnBzjB,EAAA,MAAA,SAAAkkB,GAOUR,EAAW,gBAPrBQ,CAAQ;AAAA;UAkBRE,IAAG3G,GAAA,GAEDnP,YAFF8V,CAAG;8BAED9V,CAAK,GAALA,aAcW,IAdXtO,EAAA,UAAAsO,GAmBEgT,IAAS,eAnBXhT,GAAK,CAAA+V,OAAArkB,EAAA,IACOqiB,GAAYgC,EAAA,GAAA,MAAArkB,EAAA,IAAZqiB,CAAY,CAAA;AAqBxB,UAAAlG,eAtBA7N,GAAK,CAAA,gBAsBL6N,EAAM;;;AAQF,UAAAmI,GAAe/I,IAAA,EAAA,OAAA,UAAA,CAAA;AAAA;AAEf,UAAAgJ,GAAUhJ,IAAA,EAAA,OAAA,UAAA,CAAA;AAAA;;gBAHRqH,EAAiB,IAAArM,GAAAmF,EAAA,IAAAnF,GAAAgB,IAAA,EAAA;AAAA;;cAPvB4E,EAAM,WAxBRiI,CAAG;;AAAH,UAAApkB,EAAA,UAAAokB,uJAAoJvB,EAAQ,IAAG,+BAA+B,8FAA8F,IAAA7iB,EAAA,IAAG8iB,EAAa,IAAG,8BAA8B,EAAE,IAAGvJ,EAAQ,IAAG,kCAAkC,EAAE,EAAA,GAE/XvZ,EAAA,cAAAsO,SAEEkS,EAAE,CAAA,GAFJxgB,EAAA,cAAAsO,iBAGOoU,EAAS,CAAA,GAHhB1iB,EAAA,cAAAsO,WAIEmS,EAAI,CAAA,GAJNzgB,EAAA,cAAAsO,kBAKEiS,EAAW,CAAA,GALbvgB,EAAA,UAAAsO,SAMQ8T,CAAU,CAAA,GANlBpiB,EAAA,cAAAsO,gBAWE+R,EAAS,CAAA,GAXXrgB,EAAA,cAAAsO,gBAYEgS,EAAS,CAAA,GAZXtgB,EAAA,UAAAsO,GAAK,GAAA,wBAayBjO,GAAW,0BAAmByY,EAAS,KAAA,EAAA,qGAAArC,MAAA,EAAA,EAAA,GAbrEnI,aAeEiL,EAAQ,GAfVjL,aAgBE2S,EAAQ,GAhBVjhB,EAAA,cAAAsO,oBAiBgB0R,EAAQ,CAAA,GAjBxBhgB,EAAA,cAAAsO,yBAkBemU,EAAgB,CAAA,GAlB/BziB,EAAA,cAAAsO,sBAoBYiU,CAAiB,CAAA,GAE7BviB,EAAA,cAAAmc,wBAKayG,EAAiB,IAAG5iB,EAAA,IAAA6Y,CAAM,EAAC,eAAe7Y,EAAA,IAAA6Y,CAAM,EAAC,YAAY;AAAA;eAd+F8K,GAAoB,CAAA;AAAA,SAb7L3jB,EAAA,UAAA,SAAAsO,GAOU0U,EAAW,GAPrBhjB,EAAA,UAAA,UAAAsO,GAQWqU,EAAgB,GAR3B3iB,EAAA,MAAA,QAAAsO,GASSmV,EAAU,GATnBzjB,EAAA,MAAA,SAAAsO,GAUUoV,EAAW,GAYrB1jB,EAAA,UAAA,SAAAmc,IAEU4G,EAAwB,gBA1BpCqB,CAAG;AAAA;UAuCHI,IAAGC,GAAA,eAAHD,CAAG;;;cAECE,KAAGrH,GAAA,gBAAHqH,EAAG;mDAAHA,EAAG,gBAAHA,EAAG;AAAA;;;;;UAKLC,KAAK3kB,EAAA,QAAAge,GAAA,CAAA;8BAAL2G,EAAK,GAALA,cAeW,IAfX3kB,EAAA,UAAA2kB,IAoBErD,IAAS,eApBXqD,IAAK,CAAAN,OAAArkB,EAAA,IACOqiB,GAAYgC,EAAA,GAAA,MAAArkB,EAAA,IAAZqiB,CAAY,CAAA;yBADxBsC,IAAK,CAAA;;;cAwBHC,KAAMxI,GAAA,gBAANwI,EAAM;AAOJ,UAAAC,GAAkBC,IAAA,EAAA,OAAA,UAAA,CAAA,WAPpBF,EAAM,2CAANA,IAAM,cAAA5kB,EAAA,IAIO6Y,CAAM,EAAC,UAAU,CAAA,GAJ9B7Y,EAAA,UAAA,SAAA4kB,IAEUtB,EAAU,gBAFpBsB,EAAM;AAAA;cAUNG,KAAMC,GAAA,gBAAND,EAAM;;;kBAOF/N,KAAGiO,GAAA;;AAAH,gBAAAjlB,EAAA,cAAAgX,WAASmJ,EAAU,CAAA,mBAAnBnJ,IAAG,OAAAhX,EAAA,IAAuB6Y,CAAM,EAAC,aAAa;AAAA,+BAA9C7B,EAAG;AAAA;;cADDmJ,EAAU,KAAA5J,GAAAuF,EAAA;AAAA;;;;;kBAIZO,KAAI6I,GAAA,gBAAJ7I,IAAI,EAAA;sBAAJA,EAAI,0CAA8B+D,EAAU,CAAA,CAAA,gBAA5C/D,EAAI;AAAA;;cADF+D,EAAU,KAAA7J,GAAAwF,EAAA;AAAA;;kBAThBgJ,EAAM;AAAN,YAAAA,cAGWpD,GAAc,eAHzBoD,IAAM,GAAA,sKAIsKnE,OAAcE,EAAQ,KAAIH,EAAS,IAAG,SAAS,EAAE,EAAA;AAAA,cAJ7N3gB,EAAA,UAAA,SAAA+kB,IAEUlB,EAAiB,gBAF3BkB,EAAM;AAAA;;AAXJ,UAAA/C,GAAe,WAAII,CAAU,IAAA7L,GAAAsF,EAAA,IAUxBqF,EAAU,MAAKf,OAAcC,EAAU,MAAA7J,GAAA0F,IAAA,CAAA;AAAA;;;;;cAgB9ChF,KAAGkO,GAAA;;AAAH,YAAAnlB,EAAA,cAAAiX,WAASiJ,EAAI,CAAA,mBAAbjJ,IAAG,OAAAjX,EAAA,IAAiB6Y,CAAM,EAAC,YAAY;AAAA,2BAAvC5B,EAAG;AAAA;;AADD,UAAAiJ,EAAI,KAAItG,QAAS,cAAU,EAAMoI,GAAe,WAAII,CAAU,MAAA7L,GAAA2F,EAAA;AAAA;;cAvDpEsI,CAAG;;AAOD,UAAAxkB,EAAA,cAAA2kB,UAEEnE,EAAE,CAAA,GAFJxgB,EAAA,cAAA2kB,kBAGOjC,EAAS,CAAA,GAHhB1iB,EAAA,cAAA2kB,YAIElE,EAAI,CAAA,GAJNzgB,EAAA,cAAA2kB,mBAKEpE,EAAW,CAAA,GALbvgB,EAAA,UAAA2kB,UAMQvC,CAAU,CAAA,GANlBpiB,EAAA,cAAA2kB,iBAYEtE,EAAS,CAAA,GAZXrgB,EAAA,cAAA2kB,iBAaErE,EAAS,CAAA,GAbXtgB,EAAA,UAAA2kB,UAcStkB,GAAW,IAAI,WAAAL,EAAA,IAAU8Y,EAAS,iKAAmJ+J,EAAQ,IAAG,+BAA+B,uFAAuF,IAAG3C,EAAI,KAAK8B,GAAe,KAAAhiB,EAAA,IAAIoiB,CAAU,IAAI,UAAU,EAAE,IAAAniB,EAAA,WAAc,UAAU,EAAE,IAAAwW,MAAA,EAAA,IAAAzW,EAAA,IAA4B8iB,EAAa,IAAG,uBAAuB,EAAE,IAAGvJ,EAAQ,IAAG,kCAAkC,EAAE,EAAA,GAdzgBoL,cAgBEpL,EAAQ,GAhBVoL,cAiBE1D,EAAQ,GAjBVjhB,EAAA,cAAA2kB,qBAkBgB3E,EAAQ,CAAA,GAlBxBhgB,EAAA,cAAA2kB,0BAmBelC,EAAgB,CAAA,GAnB/BziB,EAAA,cAAA2kB,uBAqBYpC,CAAiB,CAAA;AAAA;eAPwXoB,GAAoB,CAAA;AAAA,SAdza3jB,EAAA,UAAA,SAAA2kB,IAOU3B,EAAW,GAPrBhjB,EAAA,UAAA,UAAA2kB,IAQWhC,EAAgB,GAR3B3iB,EAAA,MAAA,QAAA2kB,IASSlB,EAAU,GATnBzjB,EAAA,MAAA,SAAA2kB,IAUUjB,EAAW,GAVrB1jB,EAAA,UAAA,WAAA2kB,IAWYpB,EAAmB,gBAlBjCiB,CAAG;AAAA;;AA1DD,MAAA5K,EAAI,MAAK,aAAUrD,GAAAkF,EAAA,IAkBd7B,QAAS,cAAc2H,GAAkB,IAAAhL,GAAAyF,IAAA,CAAA,IAAAzF,GAAA0G,IAAA,EAAA;AAAA;;;;;UAsGhDmI,IAAGC,GAAA,eAAHD,CAAG;AACD,MAAAE,GAAwBC,GAAA,EAAA,OAAA,6CAAA,CAAA;UACxBrG,KAAClf,EAAA,QAAAulB,GAAA,CAAA,gBAADrG,IAAC,EAAA;cAADA,EAAC,WAFHkG,CAAG;oBAEDlG,IAAC,GAAAlf,EAAA,KAAQK,GAAW,KAAK,CAAA,kBAAGsgB,GAAS;AAAA,UAFvC3gB,EAAA,WAAA,GAAAolB,sBAA4B,UAAU,KAAK,QAAQ5kB,GAAQ,EAAA,gBAA3D4kB,CAAG;AAAA;UAKHI,IAAGC,GAAA,eAAHD,CAAG;;;cAECtO,KAAGwO,GAAA;;4BAAHxO,IAAG,OAAM2J,EAAU,KAAIE,GAAQ,mBAA/B7J,IAAG,OAAAlX,EAAA,IAAmC6Y,CAAM,EAAC,aAAa;AAAA,2BAA1D3B,EAAG;AAAA;;AADD,WAAA2J,EAAU,KAAIE,QAAQxK,GAAAoP,EAAA;AAAA;;UAI1BrJ,KAAItc,EAAA,QAAA4lB,GAAA,CAAA;aAAJtJ,IAAI,MAAQsE,EAAU,KAAIE,EAAQ,GAAA,EAAA,WAAlCxE,EAAI,WALNkJ,CAAG,uCAAHA,GAAG,GAAA,0BAAkCnlB,GAAW,OAAO,aAAA,CAAA,gBAAvDmlB,CAAG;AAAA;;MAND7E,EAAS,IAAApK,GAAAsH,EAAA,KAKJ+C,EAAU,KAAIE,EAAQ,MAAAvK,GAAAgG,IAAA,CAAA;AAAA;;UA7HjC0H,CAAG,WAdL7N,CAAG,eAAHA,CAAG;AAFI;;AC9TD,SAASyP,GAAOnlB,GAAMuiB,IAAS,SAAS,MAAM;AAEnD,SAAAA,EAAO,YAAYviB,CAAI,GAEhB;AAAA,IACL,OAAOolB,GAAW;AAEhB,MAAAA,IAAYA,KAAa,SAAS,MAClCA,EAAU,YAAYplB,CAAI;AAAA,IAC5B;AAAA,IACA,UAAU;AAER,MAAIA,EAAK,cACPA,EAAK,WAAW,YAAYA,CAAI;AAAA,IAEpC;AAAA,EACJ;AACA;ACCA,MAAMqlB,KAAyB,uBAAO,wBAAwB,GACjDC,KAA0B,CAACC,MAAe;AACnD,EAAAC,GAAWH,IAAwBE,CAAU;AACjD,GAEa,CAACE,IAAiBC,EAAe,IAAIC,GAAa;ACHxD,SAASC,GAAqBC,GAAY;AAC/C,MAAI,OAAO,WAAa,OAAe,CAACA;AACtC,WAAO,MAAM;AAAA,IAAC;AAEhB,QAAMnmB,IAAOmmB,EAAW,iBAAiB,SAAS,MAK5CC,IAAU,CAAA;AAChB,aAAWC,KAAW,MAAM,KAAKrmB,EAAK,QAAQ;AAC5C,IAAIqmB,MAAYF,KACVE,aAAmB,gBACzBD,EAAQ,KAAK;AAAA,MACX,IAAIC;AAAA,MACJ,WAAWA,EAAQ;AAAA,MACnB,gBAAgBA,EAAQ,aAAa,aAAa;AAAA,IACxD,CAAK,GACDA,EAAQ,QAAQ,IAChBA,EAAQ,aAAa,eAAe,MAAM;AAG5C,SAAO,MAAM;AACX,eAAW,EAAE,IAAA3O,GAAI,WAAA4O,GAAW,gBAAAC,EAAc,KAAMH;AAC9C,MAAA1O,EAAG,QAAQ4O,GACPC,MAAmB,OACrB7O,EAAG,gBAAgB,aAAa,IAEhCA,EAAG,aAAa,eAAe6O,CAAc;AAGjD,IAAAH,EAAQ,SAAS;AAAA,EACnB;AACF;;kBC5DA;QAwDQI,IAAG5mB,EAAA,SAAA;;AAET,MACE6mB,IAAI7mB,EAAA,KAAAC,GAAA,QAAA,IAAa,EAAK,GACtBF,yBAAO,IAAI,GACX+mB,+BAAa,EAAK,GAClBjN,2BAAS,EAAI,GACbkN,yBAAO,QAAQ,GACfC,0BAAQ,EAAK,GAOblS,4BAAU,OAAO;AAInB;AAMA,MAAImS,IAAiBjnB,EAAA,QAAA,MAAAC,EAAA,YAAAA,EAAA,OAAA,GAMjBinB,IAAW,GACXC,IAAU;AACd,QAAMC,IAAW,MAAA,GAAYR,CAAG,UAAUM,GAAQ,IAC5CG,IAAiB,MAAA,GAAYT,CAAG,gBAAgBO,GAAO,IAMvDG,IAAY,IAAIC,GAAS,GACzBC,IAAkB,IAAID,GAAS,GAE/BE,IAAa,CAAIC,MAA+B;AAAE,IAAAJ,EAAU,IAAII,EAAI,IAAIA,EAAI,UAAU;AAAA,EAAG,GACzFC,IAAe,CAAInH,MAAe;AAAE,IAAA8G,EAAU,OAAO9G,CAAE;AAAA,EAAG,GAC1DoH,IAAmB,CAAIF,MAA+B;AAAE,IAAAF,EAAgB,IAAIE,EAAI,IAAIA,EAAI,UAAU;AAAA,EAAG,GACrGG,IAAqB,CAAIrH,MAAe;AAAE,IAAAgH,EAAgB,OAAOhH,CAAE;AAAA,EAAG;AAI5E,MAAIsH,IAAY9nB,EAAA,MAAMA,EAAA,MAAA,OACb,SAAW,OAAe,OAAO,aACpC,OAAO,WAAW,oBAAoB,EAAE,UACxC,EAAI,CAAA;AAEV,EAAAA,EAAA,kBAAc;AACZ,QAAE,OAAS,SAAW,QAAgB,OAAO,WAAY;AACzD,UAAM+nB,IAAK,OAAO,WAAW,oBAAoB,GAC3CC,WAAa;YAAEF,GAAYC,EAAG,SAAO,EAAA;AAAA,IAAE;AAC7C,WAAAC,GAAI,GACJD,EAAG,iBAAiB,UAAUC,EAAI,SACrBD,EAAG,oBAAoB,UAAUC,EAAI;AAAA,EACpD,CAAC;AAMD,WAASC,EACPC,GACoB;AACpB,eAAW,CAAC1H,IAAIyF,EAAU,KAAKiC;AAC7B,UACEjC,OAAe,YACdA,OAAe,aAASjmB,EAAA,IAAI8nB,CAAS,KACrC7B,OAAe,YAAQ,CAAAjmB,EAAA,IAAK8nB,CAAS;AAEtC,eAAOtH;AAKX,UAAMf,KAAQyI,EAAK,KAAI,EAAG,KAAI;AAC9B,WAAOzI,GAAM,OAAO,SAAYA,GAAM;AAAA,EACxC;AAIA,MAAI0I,IAAkBnoB,EAAA,QAAA,MAAAC,EAAA,iBAAA,KAAkCgoB,EAAUX,CAAS,CAAA,GACvEc,IAAmBpoB,EAAA,QAAA,MAAYioB,EAAUT,CAAe,CAAA,GAIxDa,IAA+BroB,EAAA,MAAO,IAAI,GAK1CsoB,IAAgCtoB,EAAA,MAAO,IAAI,GAG3CuoB,IAAUvoB,EAAA,MAAO,CAAC,GAGlBwoB,IAAWxoB,EAAA,MAAO,EAAK,GAGvByoB,KAAczoB,EAAA,MAAO,EAAK,GAC1B0oB,IAAqB1oB,EAAA,QAAA,OAAA;AAAA,IACvB,OAAKC,EAAA,eAAiB,SAAS;AAAA,IAC/B,aAAWA,EAAA,eAAiB,eAAe;AAAA,IAC3C,SAAOA,EAAA,eAAiB,WAAW;AAAA,IACnC,QAAMA,EAAA,eAAiB,UAAU;AAAA,OAM/B2X,KAAwC5X,EAAA,MAAO,IAAI;AACvD,EAAAA,EAAA,kBAAc;AACZ,IAAI6mB,EAAI,KAAA,CAAA7mB,EAAA,IAAKwoB,CAAQ,YAAW,WAAa,aAC3C5Q,IAAoB,SAAS,eAAa,EAAA;AAAA,EAE9C,CAAC;AAID,QAAM+Q,WAAmB;AACvB,IAAA3oB,EAAA,IAAAyoB,IAAc,EAAK,SACnBxB,CAAiB,IAAA,GACjBJ,EAAO,EAAK;AAAA,EACd,GAGM+B,WAAqB;AACzB,QAAI5B,EAAK,GAAE;AACT,MAAAhnB,EAAA,IAAAyoB,IAAc,EAAI;AAClB;AAAA,IACF;AACA,IAAAE,GAAU;AAAA,EACZ;AAqBA,EAAAvC,GAduB;AAAA,IACrB,IAAI,OAAO;AAAE,aAAOS,EAAI;AAAA,IAAE;AAAA,IAC1B,IAAI,OAAO;AAAE,aAAO9mB,EAAI;AAAA,IAAE;AAAA,IAC1B,IAAI,aAAa;AAAE,aAAO+mB,EAAU;AAAA,IAAE;AAAA,IACtC,IAAI,UAAU;AAAE,aAAOhS,EAAO;AAAA,IAAE;AAAA,IAChC,IAAI,OAAO;AAAE,aAAOiS,EAAI;AAAA,IAAE;AAAA,IAC1B,aAAAK;AAAA,IACA,mBAAAC;AAAA,IACA,eAAAI;AAAA,IACA,iBAAAE;AAAA,IACA,qBAAAC;AAAA,IACA,uBAAAC;AAAA,IACA,YAAAc;AAAA,GAEiB,GAGnB3oB,EAAA,kBAAc;AACZ,IAAI6mB,EAAI,KAAA,CAAA7mB,EAAA,IAAKwoB,CAAQ,KAAI3O,OACvBV,GAAc,OAAO,GAEvBnZ,EAAA,IAAAwoB,GAAW3B,EAAI,GAAA,EAAA,GAEVA,EAAI,KAAA7mB,EAAA,IAAEyoB,IAAc,EAAK;AAAA,EAChC,CAAC;AAGD,WAASxQ,EAAcC,GAAsB;AAC3C,QAAI,EAAAA,EAAM,QAAQ,YAAQ,CAAK2O,EAAI,IAEnC;AAAA,UAAE7mB,EAAA,IAAEyoB,EAAW,GAAE;AACf,QAAAzoB,EAAA,IAAAyoB,IAAc,EAAK;AACnB;AAAA,MACF;AACA,MAAK3B,EAAU,KAAE8B,GAAY;AAAA;AAAA,EAC/B;AAIA,EAAA5oB,EAAA,kBAAc;AACZ,QAAE,OAAS,WAAa;AACtB,UAAI6mB,EAAI,GAAE;cACR0B,GAAU,OAAO,SAAO,EAAA;AAExB,cAAMM,IAAiB,OAAO,aAAa,SAAS,gBAAgB;AACpE,iBAAS,KAAK,MAAM,WAAW,SAC/B,SAAS,KAAK,MAAM,gBAAUN,CAAO,CAAA,MACrC,SAAS,KAAK,MAAM,OAAO,KAC3B,SAAS,KAAK,MAAM,QAAQ,KAC5B,SAAS,KAAK,MAAM,WAAW,UAE/B,SAAS,KAAK,MAAM,kBAAkBM,CAAc;AAAA,MACtD;AACE,iBAAS,KAAK,MAAM,WAAW,IAC/B,SAAS,KAAK,MAAM,MAAM,IAC1B,SAAS,KAAK,MAAM,OAAO,IAC3B,SAAS,KAAK,MAAM,QAAQ,IAC5B,SAAS,KAAK,MAAM,WAAW,IAC/B,SAAS,KAAK,MAAM,eAAe,IACnC,OAAO,SAAS,SAAGN,CAAO,CAAA;AAAA,EAGhC,CAAC,GAODvoB,EAAA,kBACI,CAAG6mB,EAAI,KAAA,CAAA7mB,EAAA,IAAKqoB,CAAQ,IAAE,SACR/B,GAAoBtmB,EAAA,IAACqoB,CAAQ,CAAA,CAE9C,GAMDroB,EAAA,kBAAc;AACZ,QAAE,GAAAA,EAAA,IAAGyoB,EAAW,KAAA,CAAAzoB,EAAA,IAAKsoB,CAAS;mBAC9BA,CAAS,EAAC,QAAQ,IAClBtoB,EAAA,IAAAsoB,CAAS,EAAC,aAAa,eAAe,MAAM,SAC/B;AACX,QAAEtoB,EAAA,IAAEsoB,CAAS,YACXA,CAAS,EAAC,QAAQ,UAClBA,CAAS,EAAC,gBAAgB,aAAa;AAAA,MAE3C;AAAA,EACF,CAAC,GAGD9E,SAAgB;AACd,IAAE,OAAS,WAAa,QACtB,SAAS,KAAK,MAAM,WAAW,IAC/B,SAAS,KAAK,MAAM,MAAM,IAC1B,SAAS,KAAK,MAAM,OAAO,IAC3B,SAAS,KAAK,MAAM,QAAQ,IAC5B,SAAS,KAAK,MAAM,WAAW,IAC/B,SAAS,KAAK,MAAM,eAAe;AAAA,EAEvC,CAAC;;+BAGuBvL,CAAa;;;;UAMpC7B,KAAGC,GAAA,GAuCDe,aAvCFhB,EAAG,gBAuCDgB,EAAG;yDAAHA,EAAG,eAAHA,IAAG,CAAAiN,MAAArkB,EAAA,IAA6BsoB,GAASjE,CAAA,GAAA,MAAArkB,EAAA,IAATsoB,CAAS,CAAA;yBAAzClR,IAAG,CAAA;;;cAWD6M,IAAG7jB,GAAA,GAQDgkB,sBARFH,CAAG,GAAA,CAAA,GAkBCO,YAVFJ,CAAG,GAWC0E,YADFtE,CAAG,eACDsE,GAAE,EAAA;kBAAFA,CAAE;AAGF,cAAA5J,eAHA4J,GAAE,CAAA,gBAGF5J,IAAC,EAAA;kBAADA,EAAC,WAJHsF,CAAG;AAQH,cAAAE,eARAF,GAAG,CAAA,gBAQHE,EAAG;AACDxG,UAAAA,GAAM6K,IAAA;AAAA;;2BAAgD;AAAE,cAAA/oB,EAAA,IAAAyoB,IAAc,EAAK;AAAA,YAAE;AAAA;;;AAC3E,cAAAzoB,EAAA,gBAAA,MAAAA,EAAA,SAAAgkB,IAAAhkB,EAAA,IAAA0oB,CAAqB,EAAC,MAAM,CAAA;;;;;AAE9BxK,UAAAA,GAAM8K,IAAA;AAAA;;qBAAkCL;AAAA;;;AACtC,cAAA3oB,EAAA,gBAAA,MAAAA,EAAA,SAAAipB,IAAAjpB,EAAA,IAAA0oB,CAAqB,EAAC,OAAO,CAAA;;;sBALjChE,EAAG,WAlBLN,CAAG,YAAHA,GAAG,CAAA8E,IAAAC,OAAA3R,KAAA0R,IAAAC,EAAA,GAAA,OAAA,EAQe,SAAOnpB,EAAA,IAAEyoB,EAAW,EAAA,EAAA,WAhBxCxE,CAAG;AAQD,YAAAjkB,EAAA,cAAAokB,yBAGqBwC,CAAG,gBAAA,GAHxB5mB,EAAA,cAAAokB,0BAIsBwC,CAAG,eAAA,GAOrB5mB,EAAA,cAAA8oB,YAAUlC,CAAG,gBAAA,GACX5mB,EAAA,SAAAiZ,GAAAjZ,EAAA,IAAA0oB,CAAqB,EAAC,KAAK,GAE7B1oB,EAAA,cAAAkf,aAAS0H,CAAG,eAAA,GACV5mB,EAAA,SAAAopB,IAAAppB,EAAA,IAAA0oB,CAAqB,EAAC,WAAW;AAAA,cAvBzC1oB,EAAA,UAAA,aAAAikB,GAAG,CAEYrlB,OAAMA,GAAE,iBAAe,GAFtCoB,EAAA,UAAA,WAAAikB,GAAG,CAGUrlB,OAAMA,GAAE,iBAAe,GAKlCoB,EAAA,UAAA,SAAAokB,GAAG,CAOQxlB,OAAMA,GAAE,iBAAe,eAfpCqlB,CAAG;AAAA;;gBAPDwE,EAAW,KAAAlS,EAAAC,CAAA;AAAA;;cA3CjBJ,EAAG,eAAHA,IAAG,CAAAiO,MAAArkB,EAAA,IAgCSqoB,GAAQhE,CAAA,GAAA,MAAArkB,EAAA,IAARqoB,CAAQ,CAAA,YAhCpBjS,IAAG,CAAA8S,MAAArD,KAAAqD,CAAA,CAAA,YAAH9S,IAAG,CAAA8S,GAAAC,MAAA3R,KAAA0R,GAAAC,CAAA,GAAA,OAAA;AAAA,QAkCe,SAAStC,EAAI,KAAA,CAAA7mB,EAAA,IAAKyoB,EAAW;AAAA,QAAE,qBAAe7Q,EAAiB;AAAA;;sBAlCjFxB,IAAG,GAAAK,CAAA,GAAHzW,EAAA,cAAAoW,YA4BE2Q,EAAI,CAAA,GA5BN/mB,EAAA,cAAAoW,6BA8BkB+R,CAAkB,CAAA,GA9BpCnoB,EAAA,cAAAoW,8BA+BmBgS,CAAmB,CAAA;AAAA;;uBA9B9BjpB;AAAA,YACL;AAAA,YACA2V,QAAY,WACR,qBACA;AAAA;;;kCALPsB,IAAG,CAQYxX,MAAM;AAGlB,QAAIA,EAAE,WAAWA,EAAE,iBAAa,CAAKkoB,EAAU,KAAIC,EAAI,MAAK,kBAC1DnoB,EAAE,cAAc,QAAQ,yBAAyB;AAAA,MAErD,CAAC,0BAdFwX,IAAG,CAeUxX,MAAM;AAEhB,cAAMkZ,IAAKlZ,EAAE;AACb,QACEA,EAAE,WAAWA,EAAE,iBACfkZ,EAAG,QAAQ,2BAA2B,UAAM,CAC3CgP,EAAU,KACXC,EAAI,MAAK,iBAET6B,GAAY,UAEP9Q,EAAG,QAAQ;AAAA,MACpB,CAAC,eA3BF1B,EAAG;AAAA;;MAJDyQ,EAAI,KAAAtQ,EAAAe,CAAA;AAAA;;;AAJD;;;kBCjTR;iBAcE6O,GAAe;MAOhB/P,IAAGhW,GAAA,eAAHgW,CAAG;;;;;;;;;;UAAHA,CAAG,wCAAHA,GAAG,GAAAK,CAAA,GAAA;AAAA,IACK,MAAAzW,EAAA,KAAAb,GAAG,0EAAwEc,EAAA,KAAA,CAAA;AAAA,sBADnFmW,GAAG,MAAArV,IAAA,OAAA,EAEqB,UAAU,IAAG,EAAA,eAFrCqV,CAAG;AANI;kBCfR;iBAuBE4P,GAAuB/lB,EAAA,UAAA;;;AACjB;;kBCxBR;;AAeE,QAAMopB,IAAMlD,GAAe,GAErB3Q,IAAmC;AAAA,IACvC,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA;AAGN,MAAI8T,IAActpB,EAAA,QAAA,MAAYwV,EAAY6T,EAAI,IAAI,KAAK7T,EAAY,EAAE,GAIjE+T,IAAiBvpB,EAAA,QAAA,MACnBqpB,EAAI,YAAY,WAAW,WAAW,SAAS;;;;UAUhDjT,IAAGhW,GAAA,yBAAHgW,CAAG,GAAA,CAAA;AAWD,MAAAoT,GAAerS,GAAA;AAAA;;;;;;kBAXjBf,CAAG,wCAAHA,GAAG,GAAAK,CAAA,GAAA;AAAA,QACK,MAAAzW,EAAA,KAAAb,GACL,kLAAgLc,EAAA,KAAA,CAAA;AAAA,UAFnLD,EAAA,UAAA,SAAAoW,GAAG,CAKQxX,MAAMA,EAAE,iBAAe,mBALlCwX,GAAG,MAAAlV,IAAA,OAAA,EAMoB,GAAG,KAAK,UAAU,KAAK,QAAQV,GAAQ,EAAA,eAN9D4V,CAAG;AAAA;;MANDiT,EAAI,YAAY,YAAQ9S,EAAAC,CAAA;AAAA;;MA8B5BY,IAAGpX,EAAA,QAAAU,GAAA,CAAA,eAAH0W,CAAG;AAUD,EAAAoS,GAAeT,GAAA;AAAA;mBAAaQ,CAAiB;AAAA;;;;;;cAV/CnS,CAAG,wCAAHA,GAAG,GAAAX,CAAA,GAAA;AAAA,IACK,MAAAzW,EAAA,KAAAb,GACL,0FACAkqB,EAAI,YAAY,WAAW,kBAAkB,oCAC7CC,CAAc,GAAArpB,EAAA,KAAA,CAAA;AAAA,MAJjBD,EAAA,UAAA,SAAAoX,GAAG,CAOQxY,MAAMA,EAAE,iBAAe,mBAPlCwY,GAAG,MAAAhW,EAAA;AAhCI;;;kBC/BR;iBAaE+kB,GAAe;MAGhB/P,IAAGhW,GAAA,eAAHgW,CAAG;;;;;;;;;;UAAHA,CAAG,wCAAHA,GAAG,GAAAK,CAAA,GAAA;AAAA,IAAQ,MAAAzW,EAAA,KAAAb,GAAG,4CAA0Cc,EAAA,KAAA,CAAA;AAAA,kBAAxDmW,CAAG;AAFI;;kBCdR;iBAaE+P,GAAe;MAGhB/P,IAAGhW,GAAA,eAAHgW,CAAG;;;;;;;;;;UAAHA,CAAG,wCAAHA,GAAG,GAAAK,CAAA,GAAA;AAAA,IAAQ,MAAAzW,EAAA,KAAAb,GAAG,8FAA4Fc,EAAA,KAAA,CAAA;AAAA,kBAA1GmW,CAAG;AAFI;ACmED,MAAMqT,KAAW;AAAA;AAAA,EAEpB,UAAU;AAAA,IACN,SAAS;AAAA;AAAA,IACT,SAAS;AAAA;AAAA,IACT,MAAM;AAAA;AAAA,IACN,OAAO;AAAA;AAAA,IACP,OAAO;AAAA;AAAA,IACP,SAAS;AAAA;AAAA,IACT,MAAM;AAAA;AAAA,IACN,UAAU;AAAA;AAAA,IACV,SAAS;AAAA;AAAA,IACT,UAAU;AAAA;AAAA,IACV,QAAQ;AAAA;AAAA,IACR,MAAM;AAAA;AAAA,EACd;AAAA;AAAA,EAEI,SAAS;AAAA,IACL,GAAK;AAAA,IACL,GAAK;AAAA,IACL,OAAO;AAAA,IACP,GAAK;AAAA,IACL,GAAK;AAAA,IACL,GAAK;AAAA,IACL,GAAK;AAAA,IACL,GAAK;AAAA,IACL,IAAM;AAAA,IACN,IAAM;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASI,QAAQ;AAAA,IACJ,MAAM;AAAA,IACN,IAAI;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQI,MAAM;AAAA,IACF,cAAc;AAAA;AAAA,IACd,iBAAiB;AAAA;AAAA,IACjB,iBAAiB;AAAA;AAAA,EACzB;AACA,GAEaC,KAAS;AAAA,EAClB,GAAGD,GAAS;AAAA,EACZ,GAAGA,GAAS;AAAA,EACZ,GAAGA,GAAS;AAAA,EACZ,GAAGA,GAAS;AAChB;kBCjJA;;AA6DE,MACEE,IAAI3pB,EAAA,KAAAC,GAAA,QAAA,GAAG,GAAG,GACV2pB,wBAAM,GAAG,GACTC,6BAAW,OAAO,GAClBC,uBAAK,KAAK,GACH74B,0BAAY,EAAE;AAKvB,QAAM84B,IAA+B;AAAA,IACnC,GAAK;AAAA,IACL,GAAK;AAAA,IACL,GAAK;AAAA,IACL,GAAK;AAAA,IACL,GAAK;AAAA,IACL,GAAK;AAAA,IACL,IAAM;AAAA,IACN,MAAQ;AAAA;AAAA;AAGV,MAAIC,IAAShqB,EAAA,QAAA,MACX2pB,EAAI,MAAK,2DAC6CE,EAAQ,CAAA,aAC1D,EAAC,GAGH3qB,IAAOc,EAAA,QAAA,MAAA;AAAA,IAEP;AAAA,IACA2pB,EAAI,MAAK,SAASI,EAAQJ,EAAI,KAAI;AAAA,IAClCD,GAAOE,EAAG,CAAA,KAAK;AAAA,IACf34B,EAAQ;AAAA,EACR,EAAA,OAAO,OAAO,EAAE,KAAK,GAAG,CAAA;;eAIR64B,GAAE,IAAA,CAAAG,GAAA1O,MAAA;gDAASrc,CAAO,GAAA,OAAAc,EAAA,IAASgqB,CAAS,KAAI,OAAS,EAAA;;;;AAF/D;AChED,SAASE,GAASC,GAAQ;AAC7B,MAAIC,IAAU;AACd,QAAMC,KAAO,OACJD,MACDA,IAAUD,EAAM,EAAG,MAAM,CAACG,MAAQ;AAE9B,UAAAF,IAAU,MACJE;AAAA,EACV,CAAC,IAEEF;AAEX,SAAAC,EAAI,QAAQ,MAAM;AACd,IAAAD,IAAU;AAAA,EACd,GACOC;AACX;;kBChDA;;AAIE,QAAM1R,IAAa,EACjB,gBAAgB,mBAAkB;AA4BpC,MACE4R,IAAKvqB,EAAA,KAAAC,GAAA,SAAA,GAAG,EAAE,GACVL,4BAAU,EAAE,GACZ4qB,gCAAc,EAAE,GAChBC,4BAAU,EAAE,GACZvK,yBAAO,IAAI,GACXwK,6BAAW,EAAE,GACbC,6BAAW,WAAW,GACtBC,6BAAW,WAAW,GACf35B,0BAAY,EAAE,GAEb2nB,IAAU5Y,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,CAAA,EAAA,GAGhB4Y,IAAM7Y,EAAA,QAAA,OAAA,EAAA,GAAiB2Y,GAAa,GAAKC,EAAU,EAAA,EAAA,GAGnDiS,oBAAwBN,EAAK,KAAI3qB,EAAO,KAAAI,EAAA,IAAI6Y,CAAM,EAAC,cAAc,GACjEiS,IAAc9qB,EAAA,QAAA,MAAYwqB,EAAW,KAAIC,GAAO;MAGrDrU,IAAGgF,GAAA,eAAHhF,CAAG;;;;;;AAGU,gBAAA2U,eAAgB7K,CAAI;;;AAC3B,YAAA8K,EAAazP,GAAA;AAAA;qDAAoCqP,EAAQ,KAAA,EAAA;AAAA;;;;cAEzD5T,KAAG5W,GAAA;;AAAH,YAAAJ,EAAA,cAAAgX,WAAS0T,EAAQ,CAAA,GAAjB1qB,EAAA,UAAAgX,eAAuC4T,EAAQ,KAAA,EAAA,EAAA;AAAA,0BAA/C5T,EAAG;AAAA;;UAJD2T,EAAQ,MAAK,eAAezK,EAAI,WAG3ByK,EAAQ,MAAK,WAAWD,EAAQ,KAAAnU,EAAAe,IAAA,CAAA;AAAA;;;;;AAJvC,OAAA4I,EAAI,KAAIwK,QAAQnU,EAAAiF,CAAA;AAAA;;MASpByP,IAAEjrB,EAAA,QAAAU,GAAA,CAAA,eAAFuqB,GAAE,EAAA;UAAFA,CAAE;oBAAFA,GAAE,CAAA;;;UAEA/L,IAAC7I,GAAA,eAAD6I,GAAC,EAAA;cAADA,CAAC;oBAADA,GAAC,GAAA,GAAW7e,GAAW,OAAO,OAAA,uBAAUyqB,CAAc,CAAA;AAAA,sBAAtD5L,CAAC;AAAA;;YADC4L,CAAc,KAAAvU,EAAAwH,CAAA;AAAA;;;;;UAKhB3G,IAAGC,GAAA,eAAHD,CAAG;8CAAHA,CAAG,eAAHA,CAAG;AAAA;;;;;UAhBPhB,CAAG;AAAH,IAAApW,EAAA,UAAAoW,0EAA6EnlB,EAAS,KAAA,EAAA,EAAA,eAUpFg6B,GAAE,GAAAjrB,EAAA,KAAQK,GAAW,EAAE,CAAA,uBAAGwqB,CAAY,CAAA;AAAA,kBAVxCzU,CAAG;AAFI;;kBCpDR;;;;AACS,MAAIrW,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;oBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;qBATXrW,CAAE,eAAFA,CAAE;AAFK;;;ACAD,MAAMorB,KAAqB;AAAA,EAC9B,OAAO,EAAE,WAAW,MAAM,UAAU,KAAI;AAAA,EACxC,SAAS,EAAE,WAAW,MAAM,UAAU,KAAI;AAAA,EAC1C,UAAU,EAAE,WAAW,MAAM,UAAU,KAAI;AAAA,EAC3C,UAAU,EAAE,WAAW,MAAM,UAAU,KAAI;AAC/C;ACZC,IAAIC,KAAgB;AACpB,SAASC,KAA0B;AAClC,SAAQD,MAAiB;AAC1B;;kBAGD;;AAmEC,MAGCE,IAAM1rB,EAAA,KAAAC,GAAA,UAAA,GAAG,UAAU,GACnB0rB,4BAAU,UAAU,GACpBC,6BAAW,EAAE,GACbC,qCAAmB,EAAE,GACrBC,8BAAY,EAAE,GACdtB,gCAAc,EAAE,GAEhBuB,0BAAQ,IAAI,GACZC,IAAKhsB,EAAA,KAAAC,GAAA,SAAA,IAAA,MAAA,EAAA,GACLgsB,oCAAkB,EAAK,GACvBC,6BAAW,EAAK,GAKb7kB,IAAKrH,EAAA,QAAA,MAAYurB,GAAmBI,EAAO,CAAA,CAAA;AAC/C,QAAMQ,wBAA8BV,GAAe,CAAA;AAEnD,MAAIW,IAAgBpsB,EAAA,QAAA,MACnBisB,EAAe,KAAA,CAAA,CACZzB,EAAW,MACZmB,EAAO,MAAK,cAAcA,EAAO,MAAK,WAAU,GAE/CU,qBAAsBH,OAAYP,QAAY,aAAaG,EAAS,CAAA;AAExE,WAASQ,EAAYp3B,GAAe0J,GAAe;AAGlD,IAAIA,EAAE,WAAWA,EAAE,WAAWA,EAAE,YAAYA,EAAE,4BAE9CA,EAAE,eAAc,GAChBA,EAAE,gBAAe,iBACL1J,CAAK;AAAA,EAClB;AAEA,WAASq3B,EAAY3tB,GAAe;AACnC,IAAIA,EAAE,WAAWA,EAAE,WAAWA,EAAE,YAAYA,EAAE,wBAE9CA,EAAE,eAAc;EAEjB;MAGA4tB,IAAO/O,GAAA,GAMNrH,YANDoW,CAAO,eAMNpW,CAAG;AACF,EAAAqW,GAAiB/rB,GAAA;AAAA;aACZkrB,EAAQ;AAAA;;aACHC,EAAgB;AAAA;;cAH3BzV,CAAG;AAQH,MAAAgB,cARAhB,GAAG,CAAA,GASFsW,YADDtV,CAAG,GAED6T,YADDyB,CAAM,eACLzB,CAAE;;;UAKA3U,IAAIlW,GAAA,eAAJkW,CAAI;AACH,MAAAqW,GAAKC,GAAA;AAAA;AAAU,iBAAAb,EAAK,EAAC;AAAA;;AAAe,iBAAA/rB,EAAA,IAAAqH,CAAK,EAAC;AAAA;;;;AACzC,UAAArH,EAAA,gBAAA,MAAAA,EAAA,SAAAiZ,GAAA8S,EAAK,EAAC,IAAI,CAAA;;;kBAFZzV,CAAI,eAAJA,CAAI;AAAA;;MADDyV,EAAK,KAAAxV,EAAAC,CAAA;AAAA;;MAOT2E,IAACnb,EAAA,QAAAmX,GAAA,CAAA,eAADgE,GAAC,EAAA;UAADA,CAAC,WAXF8P,CAAE,WADHyB,CAAM;oBAANA,GAAM,CAAA;;;UAwBLrR,IAAIhF,GAAA,eAAJgF,GAAI,EAAA;cAAJA,CAAI,yCACHyQ,EAAS,CAAA,CAAA,eADVzQ,CAAI;AAAA;;YADDgR,CAAS,KAAA9V,EAAAe,EAAA;AAAA;;;;;UAOZ2M,IAAG5M,GAAA;AAAH,MAAArX,EAAA,KAAAikB,GAAG,IACI+H,GAAK,CAAI7W,MAASA,EAAK,OAAOA,EAAK,eAA1BA,IAAIllB,MAAA;;AAMN,cAAAwmB,IAAAzW,EAAA,QAAA,MAAAA,EAAA,IAAAmV,EAAI,EAAC,aAASnV,EAAA,IAAImV,EAAI,EAAC,SAAS;AAL5C,UAAA+I,GAAM3C,GAAA;AAAA;AACA,qBAAAvb,EAAA,IAAAmV,EAAI,EAAC;AAAA;;;AAEL,qBAAAnV,EAAA,IAAAqH,CAAK,EAAC;AAAA;YACF,SAAA,CAAAzI,OAAM0tB,EAAWtsB,EAAA,IAAC/P,CAAC,GAAE2O,EAAC;AAAA;;;;;;AAG/B,cAAAoB,EAAA,gBAAA,MAAAA,EAAA,SAAAipB,IAAAjpB,EAAA,IAAAmV,EAAI,EAAC,SAAS,CAAA;;;;;kBATjB8O,CAAG,eAAHA,CAAG;AAAA;;MADA+H,EAAK,EAAC,SAAS,KAACzV,EAAAiF,EAAA;AAAA;;;;;UAiBnB0D,IAAC9D,GAAA,eAAD8D,GAAC,EAAA;cAADA,CAAC,yCAAkEsL,EAAW,CAAA,CAAA,eAA9EtL,CAAC;AAAA;;YADEkN,CAAgB,KAAA7V,EAAAwH,EAAA;AAAA;;UA9CrB3G,CAAG,WAdJoV,CAAO;AAAP,IAAAxsB,EAAA,cAAAwsB,kBAEad,EAAM,CAAA,GAFnB1rB,EAAA,cAAAwsB,mBAGcb,EAAO,CAAA,GAHrB3rB,EAAA,cAAAwsB,sBAIiBL,CAAO,GAYrBnsB,EAAA,cAAAirB,SAEIkB,CAAO,mBASVhR,GAAC,QAAAlb,EAAA,IAAA,mBAADkb,GAAC,cAAAlb,EAAA,aAAAA,EAAA,KAAA;MAADD,EAAA,UAAA,SAAAmb,GAGSoR,CAAW,eA9BxBC,CAAO;AAFA;;;kBCzHR;;AAKE,QAAM7T,IAAa;AAAA,IACjB,OAAO;AAAA,IACP,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,WAAW;AAAA,KAGPkU,IAAQ,oBAAI,KAAI,GAChBC,IAAkBD,EAAM,SAAQ,GAChCE,IAAiBF,EAAM,YAAW;AAExC,MACEG,IAAWhtB,EAAA,KAAAC,GAAA,eAAA,GAAG8sB,CAAc,GAC5BE,iCAAeH,CAAe,GAC9BI,IAAUltB,EAAA,KAAAC,GAAA,cAAA,GAAA,MAAS;AAAA,EAAC,CAAC,GACrBktB,IAAUntB,EAAA,KAAAC,GAAA,cAAA,GAAA,MAAS;AAAA,EAAC,CAAC,GACrBmtB,IAAWptB,EAAA,KAAAC,GAAA,eAAA,GAAA,MAAS;AAAA,EAAC,CAAC,GACtBotB,0CAAwB,EAAI,GACpBzU,IAAU5Y,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,CAAA,EAAA,GAGhB4Y,IAAM7Y,EAAA,QAAA,OAAA,EAAA,GAAiB2Y,GAAa,GAAKC,EAAU,EAAA,EAAA,GAEnD0U,oBACFN,EAAW,MAAKD,KAAkBE,EAAY,MAAKH,CAAe,GAGhES,IAASvtB,EAAA,QAAA,MAAA,CAAaqtB,EAAqB,KAAA,CAAArtB,EAAA,IAAKstB,CAAgB,CAAA,GAEhEE,IAAcxtB,EAAA,MAAO,EAAK,GAC1BytB,IAAcztB,EAAA,MAAO,EAAK,GAC1B0tB,IAAe1tB,EAAA,MAAO,EAAK;AAE/B,WAASmZ,EAAc1X,IAAQ,SAAS;AACtC,QAAE,SAAS,SAAW,MAEtB;AAAA,UAAI,OAAO,QAAQ,iBAAiB,QAAQ;AAC1C,eAAO,OAAO,gBAAgB,OAAO,YAAYA,CAAK;AACtD;AAAA,MACF;AAEA,UAAI,OAAO,cAAc;AACvB,eAAO,aAAa,SAAS,OAAAA,EAAK,CAAA;AAClC;AAAA,MACF;AAEA,MAAI,UAAU,WACZ,UAAU,QAAQA,MAAU,UAAU,KAAK,EAAE;AAAA;AAAA,EAEjD;AAEA,WAASksB,IAAkB;AACzB,IAAE3tB,EAAA,IAAEutB,CAAS,MACXpU,EAAc,OAAO,GACrBgU,IAAU;AAAA,EAEd;AAEA,WAASS,IAAkB;AACzB,IAAAzU,EAAc,OAAO,GACrB+T,IAAU;AAAA,EACZ;AAEA,WAASW,IAAmB;AAC1B,IAAA1U,EAAc,OAAO,GACrBiU,IAAW;AAAA,EACb;MAGDV,IAAMtsB,GAAA,GACJ0oB,YADF4D,CAAM,eACJ5D,GAAE,EAAA;UAAFA,CAAE;AAGF,MAAA1S,cAHA0S,GAAE,CAAA,GAIA3M,YADF/F,CAAG;;mBACD+F,CAAM;AAeJ,EAAA2R,GAAkBptB,IAAA,EAAA,OAAA,UAAA,CAAA,WAfpByb,CAAM;AAiBN,MAAAyI,cAjBAzI,GAAM,CAAA;;mBAiBNyI,GAAM,EAAA;UAANA,CAAM;AAiBN,MAAAG,eAjBAH,GAAM,CAAA;;kBAiBNG,EAAM;AAcJ,EAAAgJ,GAAmB5W,GAAA,EAAA,OAAA,UAAA,CAAA,WAdrB4N,EAAM,WAnCR3O,CAAG,WAJLsW,CAAM;;kBACJ5D,GAAE,GAAA,GAASzoB,GAAW,EAAE,WAAA,qCAItB8b,GAAM,GAAA,4RAAA,MAAAjd,GAAA;AAAA,0BAEWsuB,CAAW;AAAA,0BACXA,CAAW;AAAA,mCACFA,CAAW;AAAA,UAJrCrR,oBAYYoR,CAAS,mBAZrBpR,GAAM,cAAAnc,EAAA,IAaO6Y,CAAM,EAAC,aAAa,oBAIjC+L,GAAM,GAAA,GACMvkB,GAAW,KAAK,wUAAA,MAAAud,IAAA;AAAA,0BACX8P,CAAY;AAAA,kCACJA,CAAY;AAAA,4BAClBA,CAAY;AAAA,UAJ/B9I,mBAYW0I,CAAgB,mBAZ3B1I,GAAM,cAAA5kB,EAAA,IAaO6Y,CAAM,EAAC,gBAAgB,GAElC7Y,EAAA,SAAAopB,IAAAppB,EAAA,IAAA6Y,CAAM,EAAC,KAAK,mBAEdkM,IAAM,GAAA,4OAAA,MAAAiJ,GAAA;AAAA,0BAEWP,CAAW;AAAA,0BACXA,CAAW;AAAA,mCACFA,CAAW;AAAA,0BAJrC1I,IAAM,cAAA/kB,EAAA,IAYO6Y,CAAM,EAAC,SAAS;AAAA;;MAjD7B,MAAAzE,GAAY,IAAI,KAAK4Y,KAAaC,KAAc,CAAC,EAAE,eAAe,OAAO,EAAK;AAAA;KAG9EjtB,EAAA,UAAA,SAAAmc,GAKUwR,CAAe,6BALzBxR,GAAM,MAAAnc,EAAA,IAMewtB,GAAc,EAAI,GAAA,QAAA,EAAA,2BANvCrR,GAAM,MAAAnc,EAAA,IAOawtB,GAAc,EAAK,CAAA,0BAPtCrR,GAAM,MAAAnc,EAAA,IAQgBwtB,GAAc,EAAK,CAAA,4BARzCrR,GAAM,MAAAnc,EAAA,IAScwtB,GAAc,EAAI,CAAA,0BATtCrR,GAAM,MAAAnc,EAAA,IAUYwtB,GAAc,EAAK,CAAA,yBAVrCrR,GAAM,MAAAnc,EAAA,IAWewtB,GAAc,EAAK,CAAA,GAMxCxtB,EAAA,UAAA,SAAA4kB,GAKUiJ,CAAgB,6BAL1BjJ,GAAM,MAAA5kB,EAAA,IAMe0tB,GAAe,EAAI,GAAA,QAAA,EAAA,2BANxC9I,GAAM,MAAA5kB,EAAA,IAOa0tB,GAAe,EAAK,CAAA,0BAPvC9I,GAAM,MAAA5kB,EAAA,IAQgB0tB,GAAe,EAAK,CAAA,4BAR1C9I,GAAM,MAAA5kB,EAAA,IASc0tB,GAAe,EAAI,CAAA,0BATvC9I,GAAM,MAAA5kB,EAAA,IAUY0tB,GAAe,EAAK,CAAA,yBAVtC9I,GAAM,MAAA5kB,EAAA,IAWe0tB,GAAe,EAAK,CAAA,GAMzC1tB,EAAA,UAAA,SAAA+kB,IAKU6I,CAAe,6BALzB7I,IAAM,MAAA/kB,EAAA,IAMeytB,GAAc,EAAI,GAAA,QAAA,EAAA,2BANvC1I,IAAM,MAAA/kB,EAAA,IAOaytB,GAAc,EAAK,CAAA,0BAPtC1I,IAAM,MAAA/kB,EAAA,IAQgBytB,GAAc,EAAK,CAAA,4BARzC1I,IAAM,MAAA/kB,EAAA,IAScytB,GAAc,EAAI,CAAA,0BATtC1I,IAAM,MAAA/kB,EAAA,IAUYytB,GAAc,EAAK,CAAA,yBAVrC1I,IAAM,MAAA/kB,EAAA,IAWeytB,GAAc,EAAK,CAAA,eAlD5Cf,CAAM;AAFC;;ACjDR,MAAMuB,KAAyB,4CACzBC,KAAsB;AAWrB,SAASC,GAAgB96B,GAAMmM,IAAU,IAAI;AAChD,QAAMK,IAAO,OAAOL,KAAY,WAAW,EAAE,UAAUA,EAAO,IAAKA,GAC7DoX,IAAW/W,EAAK,YAAY,IAC5BuuB,IAAMvuB,EAAK,OAAO;AACxB,MAAI,CAACxM,KAAQA,EAAK,KAAI,MAAO;AACzB,WAAOujB;AACX,MAAIvjB,EAAK,WAAW,MAAM,KACtBA,EAAK,WAAW,OAAO,KACvBA,EAAK,WAAW,OAAO;AACvB,WAAOA;AAEX,QAAMg7B,IAAiBh7B,EAAK,WAAW,GAAG,IAAIA,IAAO,IAAIA,CAAI;AAE7D,SAAO,GADM+6B,IAAMF,KAAsBD,EAC3B,GAAGI,CAAc;AACnC;AAkBO,SAASC,GAAiBpW,GAAO1Y,IAAU,IAAI;AAClD,QAAM,EAAE,aAAA+gB,IAAc,IAAI,KAAA6N,IAAM,GAAK,IAAK5uB,GACpC0E,IAAMgU,EAAM,SAASA,EAAM,cAAcA,EAAM,YAAYA,EAAM,aAAa;AACpF,SAAOiW,GAAgBjqB,GAAK,EAAE,UAAUqc,GAAa,KAAA6N,EAAG,CAAE;AAC9D;AC7CO,MAAMG,KAAgB;AAAA,EAGzB,iBAAiB;AACrB,GAMaC,KAAoB;AAAA,EAC7B,SAAS;AAAA,EAET,YAAY;AAChB,GAEaC,KAAsB;AA2BnC,SAASC,GAAgBC,GAAQ;AAG7B,SAAIA,EAAO,YAAY,KACZ,IACPA,EAAO,qBAAqB,OACrBA,EAAO,oBACdA,EAAO,qBAAqB,OACrBA,EAAO,oBACdA,EAAO,YAAY,OACZA,EAAO,WAGdA,EAAO,QAAQ,QAAQA,EAAO,iBAAiB,OACxC,KAAK,IAAI,GAAGA,EAAO,gBAAgBA,EAAO,IAAI,IAElD;AACX;AAEA,SAASC,GAAYD,GAAQE,GAAW;AACpC,SAAOF,EAAO,iBAAiBA,EAAO,YAAYE;AACtD;AAeO,SAASC,GAAsBH,GAAQ;AAC1C,QAAMI,IAAM,oBAAI,KAAI,GAMdC,IAAWL,EAAO,uBAAuBA,EAAO,cAAcA,EAAO,iBAAiB,MACtFM,IAASN,EAAO,qBAAqBA,EAAO,YAAYA,EAAO,eAAe,MAC9EO,IAAaF,IAAW,IAAI,KAAKA,CAAQ,IAAI,MAC7CG,IAAWF,IAAS,IAAI,KAAKA,CAAM,IAAI;AAC7C,MAAIC,KAAcH,IAAMG;AACpB,WAAO;AACX,MAAIC,KAAYJ,IAAMI;AAClB,WAAO;AAEX,MAAIR,EAAO,YAAY;AACnB,WAAO;AACX,QAAME,IAAYH,GAAgBC,CAAM,GAClCS,IAAQR,GAAYD,GAAQE,CAAS;AAC3C,SAAIA,MAAc,IACP,aACPO,IAAQ,KAAKP,IAAYO,IAAQX,KAC1B,QACJ;AACX;AAQO,SAASY,GAAoBC,GAAS9vB,IAAU,IAAI;AACvD,MAAI,CAAC,MAAM,QAAQ8vB,CAAO;AACtB,WAAO,CAAA;AACX,MAAIC,IAAWD;AACf,SAAI9vB,EAAQ,oBACR+vB,IAAWA,EAAS,OAAO,CAAA1wB,MAAKA,EAAE,iBAAiB0vB,GAAc,eAAe,IAEhF/uB,EAAQ,eACR+vB,IAAWA,EAAS,OAAO,CAAA1wB,MAAKA,EAAE,eAAe2vB,GAAkB,OAAO,IAEvEe;AACX;AAOO,SAASC,GAAkBF,GAAS;AACvC,MAAI,CAAC,MAAM,QAAQA,CAAO,KAAKA,EAAQ,WAAW;AAC9C,WAAO,EAAE,gBAAgB,GAAG,eAAe,GAAG,WAAW,GAAK;AAElE,MAAIG,IAAiB,GACjBC,IAAgB;AACpB,aAAWf,KAAUW,GAAS;AAC1B,UAAMT,IAAYH,GAAgBC,CAAM;AACxC,IAAAc,KAAkBZ,GAClBa,KAAiBd,GAAYD,GAAQE,CAAS;AAAA,EAClD;AACA,SAAO;AAAA,IACH,gBAAAY;AAAA,IACA,eAAAC;AAAA,IACA,WAAWD,MAAmB;AAAA,EACtC;AACA;AASO,SAASE,GAAgBL,GAAS;AACrC,MAAI,CAAC,MAAM,QAAQA,CAAO,KAAKA,EAAQ,WAAW;AAC9C,WAAO;AACX,QAAMM,IAASN,EACV,IAAI,CAAAzwB,MAAK,OAAOA,EAAE,SAASA,EAAE,eAAe,CAAC,CAAC,EAC9C,OAAO,CAAAqgB,MAAK,OAAO,SAASA,CAAC,KAAKA,IAAI,CAAC;AAC5C,SAAO0Q,EAAO,SAAS,IAAI,KAAK,IAAI,GAAGA,CAAM,IAAI;AACrD;ACjIA,SAASC,GAAa3X,GAAO;AACzB,SAAOA,EAAM,oBAAoBA,EAAM,qBAAqBA,EAAM,WAAW,CAAA;AACjF;AAmHO,SAAS4X,GAA0BnB,GAAQ;AAQ9C,MAPI,CAACA,KAKD,EAHaA,EAAO,aAAa,MAChC,OAAOA,EAAO,cAAe,YAC1BA,EAAO,cAAcH,GAAkB,eAG3CG,EAAO,iBAAiBJ,GAAc;AACtC,WAAO;AACX,QAAMQ,IAAM,oBAAI,KAAI,GAIdG,IAAaP,EAAO,uBACtBA,EAAO,cACPA,EAAO,cACPA,EAAO,aACPA,EAAO,eACPA,EAAO,eACLQ,IAAWR,EAAO,qBACpBA,EAAO,YACPA,EAAO,WACPA,EAAO,aACPA,EAAO;AAGX,MAFIO,KAAc,IAAI,KAAKA,CAAU,IAAIH,KAErCI,KAAY,IAAI,KAAKA,CAAQ,IAAIJ;AACjC,WAAO;AACX,QAAMF,IAAYF,EAAO,qBAAqBA,EAAO,qBAAqBA,EAAO;AAGjF,SAFkB,EAAAA,EAAO,WACpBE,KAAc,QAAmCA,KAAa;AAIvE;AAWO,SAASkB,GAAiC7X,GAAO;AACpD,SAAKA,IAEDA,EAAM,qBAAqB,KACpB,KACJ2X,GAAa3X,CAAK,EAAE,KAAK4X,EAAyB,IAH9C;AAIf;AChNO,SAASE,KAAqB;AACjC,SAAO;AACX;AAiBO,SAASpsB,GAAgBqsB,GAAI;AAChC,MAAI;AACA,eAAI,KAAK,eAAe,SAAS,EAAE,UAAUA,EAAE,CAAE,GAC1C;AAAA,EACX,QACM;AACF,WAAO;AAAA,EACX;AACJ;ACrCO,SAASC,GAAajX,GAAsB;AACjD,SAAKA,IAEEA,EACJ,cACA,OACA,QAAQ,aAAa,EAAE,EACvB,QAAQ,QAAQ,GAAG,EACnB,QAAQ,QAAQ,GAAG,EACnB,QAAQ,YAAY,EAAE,IARP;AASpB;ACPO,SAASkX,GAAiB/8B,GAA6C;AAC7E,QAAMg9B,IAAYh9B,EAAM,QAAQ,GAAG;AACnC,SAAIg9B,MAAc,KACV,EAAE,IAAIh9B,GAAO,MAAM,GAAA,IAEpB;AAAA,IACN,IAAIA,EAAM,UAAU,GAAGg9B,CAAS;AAAA,IAChC,MAAMh9B,EAAM,UAAUg9B,IAAY,CAAC;AAAA,EAAA;AAErC;AAOO,SAASC,GAAenY,GAKpB;AACV,QAAMsI,IAAKtI,EAAM,MAAMA,EAAM,WAAW,GAClCoY,IAAOpY,EAAM,QAAQgY,GAAahY,EAAM,QAAQ,EAAE;AACxD,SAAO,IAAIsI,CAAE,GAAG8P,IAAO,MAAMA,IAAO,EAAE;AACvC;ACxBO,MAAMC,GAAiB;AAAA,EAK7B,YAAY/wB,GAAkC;AAC7C,SAAK,aAAaA,EAAQ,YAG1B,KAAK,gBAAgB,KAAK,aAAA,GAE1B,KAAK,mBAAmB,MAAM;AAC7B,YAAMgxB,IAAa,KAAK,aAAA;AAExB,MAAIA,MAAe,KAAK,kBACvB,KAAK,gBAAgBA,GACrB,KAAK,WAAW,KAAK,WAAW;AAAA,IAElC,GAEI,OAAO,SAAW,OACrB,OAAO,iBAAiB,cAAc,KAAK,gBAAgB;AAAA,EAE7D;AAAA;AAAA,EAGA,YAA4B;AAC3B,QAAI,OAAO,SAAW;AACrB,aAAO,EAAE,QAAQ,MAAM,OAAO,KAAA;AAG/B,UAAMxsB,IAAS,KAAK,mBAAA,GACd2H,IAAQ,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,GAAG,KAAK;AAEtE,WAAO,EAAE,QAAA3H,GAAQ,OAAA2H,EAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW6U,GAAqB8P,GAAoB;AACnD,QAAI,OAAO,SAAW,IAAa;AAEnC,UAAMG,IAAO,IAAIjQ,CAAE,GAAG8P,IAAO,MAAMA,IAAO,EAAE;AAC5C,SAAK,gBAAgB,GAAG9P,CAAE,IAC1B,KAAK,YAAYiQ,CAAI;AAAA,EACtB;AAAA;AAAA,EAGA,cAAoB;AACnB,IAAI,OAAO,SAAW,QACtB,KAAK,gBAAgB,IACrB,KAAK,YAAY,EAAE;AAAA,EACpB;AAAA;AAAA,EAGA,SAASC,GAAyB;AACjC,QAAI,OAAO,SAAW,IAAa;AAEnC,UAAMC,IAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AACxC,IAAAA,EAAI,aAAa,IAAI,KAAKD,CAAS,GACnC,OAAO,QAAQ,aAAa,EAAE,SAAS,MAAQ,IAAIC,EAAI,UAAU;AAAA,EAClE;AAAA;AAAA,EAGA,UAAgB;AACf,IAAI,OAAO,SAAW,OACrB,OAAO,oBAAoB,cAAc,KAAK,gBAAgB;AAAA,EAEhE;AAAA;AAAA,EAGQ,qBAAyC;AAChD,UAAMzsB,KAAO,OAAO,SAAS,QAAQ,IAAI,QAAQ,MAAM,EAAE;AACzD,QAAI,CAACA,EAAK,QAAO;AACjB,UAAM,EAAE,IAAAsc,GAAI,MAAA8P,MAASH,GAAiBjsB,CAAG;AAGzC,WAAK,QAAQ,KAAKsc,CAAE,IACb,EAAE,IAAAA,GAAI,MAAA8P,EAAA,IADiB;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,YAAYG,GAAoB;AACvC,UAAME,IAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AACxC,IAAAA,EAAI,OAAOF,GACX,OAAO,QAAQ,aAAa,EAAE,SAAS,MAAQ,IAAIE,EAAI,UAAU;AAAA,EAClE;AAAA;AAAA,EAGQ,eAAuB;AAC9B,WAAI,OAAO,SAAW,MAAoB,KACnC,KAAK,sBAAsB,MAAM;AAAA,EACzC;AACD;AC3EA,SAASC,GAAMC,GAAG;AACd,QAAM9xB,IAAI,OAAO8xB,CAAC;AAClB,SAAO,OAAO,MAAM9xB,CAAC,IAAI,OAAOA;AACpC;AACA,SAAS+xB,GAAMC,GAAK;AAChB,SAAO,IAAI,IAAIA,EAAI,IAAI,MAAM,CAAC;AAClC;AACA,SAASC,GAAqB59B,GAAO69B,GAAaC,GAAU;AACxD,MAAI99B,KAAS;AACT,WAAO;AACX,MAAI89B,MAAa,aAAa,MAAM,QAAQD,CAAW;AACnD,WAAO79B,KAAS69B,EAAY,CAAC,KAAK79B,KAAS69B,EAAY,CAAC;AAE5D,QAAMhO,IAAS2N,GAAMK,CAAW;AAChC,MAAIhO,KAAU;AACV,WAAO;AACX,UAAQiO,GAAQ;AAAA,IACZ,KAAK;AACD,aAAO99B,MAAU6vB;AAAA,IACrB,KAAK;AACD,aAAO7vB,IAAQ6vB;AAAA,IACnB,KAAK;AACD,aAAO7vB,IAAQ6vB;AAAA,IACnB;AACI,aAAO;AAAA,EACnB;AACA;AAOA,SAASkO,GAAcC,GAAKnB,GAAIoB,GAAY;AACxC,MAAI,CAACD,KAAO,OAAO,MAAM,IAAI,KAAKA,CAAG,EAAE,SAAS;AAC5C,WAAO;AACX,aAAWE,KAAQ,CAACrB,GAAIoB,CAAU;AAC9B,QAAKC;AAEL,UAAI;AACA,eAAO,OAAO/c,GAAkB6c,GAAKE,CAAI,CAAC;AAAA,MAC9C,QACM;AAAA,MAEN;AAEJ,SAAO;AACX;AAEA,SAASC,GAAkBH,GAAKnB,GAAIoB,GAAY;AAC5C,QAAMhsB,IAAM8rB,GAAcC,GAAKnB,GAAIoB,CAAU;AAC7C,MAAI,CAAChsB;AACD,WAAO;AACX,QAAM,CAACjD,GAAGC,GAAGC,CAAC,IAAI+C,EAAI,MAAM,GAAG,EAAE,IAAI,MAAM;AAC3C,SAAO,IAAI,KAAKjD,GAAGC,IAAI,GAAGC,CAAC,EAAE,OAAM;AACvC;AAMA,SAASkvB,GAAczC,GAAKkB,GAAIoB,GAAY;AACxC,QAAMI,IAAWN,GAAcpC,EAAI,YAAW,GAAIkB,GAAIoB,CAAU;AAChE,MAAI,CAACI;AACD,WAAO;AACX,QAAM,CAACrvB,GAAGC,GAAGC,CAAC,IAAImvB,EAAS,MAAM,GAAG,EAAE,IAAI,MAAM,GAC1C5E,IAAQ,IAAI,KAAKzqB,GAAGC,IAAI,GAAGC,CAAC,GAC5BovB,IAAM7E,EAAM,OAAM,GAClB8E,IAAeD,MAAQ,IAAI,KAAKA,MAAQ,IAAI,KAAK,IAAIA,GACrDE,IAAS,IAAI,KAAK/E,CAAK;AAC7B,EAAA+E,EAAO,QAAQ/E,EAAM,QAAO,IAAK8E,CAAY;AAC7C,QAAME,IAAS,IAAI,KAAKD,CAAM;AAC9B,EAAAC,EAAO,QAAQD,EAAO,QAAO,IAAK,CAAC;AACnC,QAAME,IAAM,CAAC7uB,MAAM,GAAGA,EAAE,aAAa,IAAI,OAAOA,EAAE,SAAQ,IAAK,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAOA,EAAE,QAAO,CAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AAC1H,SAAO,EAAE,MAAM6uB,EAAIF,CAAM,GAAG,IAAIE,EAAID,CAAM,EAAC;AAC/C;AAQO,SAASE,GAAmBC,GAAQC,GAASzyB,IAAU,CAAA,GAAI;AAC9D,QAAMuvB,IAAMvvB,EAAQ,OAAO,oBAAI,KAAI,GAC7B6xB,IAAa7xB,EAAQ,mBAAmBgE,IACxC0uB,IAAU,CAAA;AAChB,MAAItgC,IAAS,CAAC,GAAGogC,CAAM;AAEvB,QAAMG,IAAcF,EAAQ,SAAS,SAAS,GACxCG,IAAcH,EAAQ,UAAU,SAAS,GACzCI,IAAmBJ,EAAQ,cAAc,SAAS,GAClDK,IAAW9yB,EAAQ,mBAAmB,MAMtC+yB,IAAwBF,MACzBC,KAAY,QACTN,EAAO,KAAK,CAAApzB,OAAMA,EAAE,eAAe,UAAU,KAAK,CAAC;AAK3D,MAJIyzB,KAAoB,CAACE,KACrBL,EAAQ,KAAK,eAAe,GAEPC,KAAeC,KAAgBC,KAAoBE,GACtD;AAClB,UAAMC,IAAW1B,GAAMmB,EAAQ,QAAQ,GACjCQ,IAAY3B,GAAMmB,EAAQ,SAAS,GACnCS,IAAgB5B,GAAMmB,EAAQ,aAAa;AACjD,IAAArgC,IAASA,EAAO,OAAO,CAAAgN,MACf,GAAAuzB,KAAeK,EAAS,IAAI,OAAO5zB,EAAE,EAAE,CAAC,KAExCwzB,KAAexzB,EAAE,YAAY,QAAQ6zB,EAAU,IAAI,OAAO7zB,EAAE,QAAQ,CAAC,KAErEyzB,KAAoBE,MAChBD,GAAU,IAAI,OAAO1zB,EAAE,EAAE,CAAC,KAE1BA,EAAE,eAAe,KAAK,CAAA+zB,MAAKD,EAAc,IAAI,OAAOC,CAAC,CAAC,CAAC,GAIlE;AAAA,EACL,MACK,CAAIL,KAAY,SAGjB1gC,IAASA,EAAO,OAAO,CAAAgN,MAAK0zB,EAAS,IAAI,OAAO1zB,EAAE,EAAE,CAAC,CAAC;AAG1D,MAAIqzB,EAAQ,QAAQ,SAAS,GAAG;AAC5B,UAAMW,IAAS9B,GAAMmB,EAAQ,OAAO;AACpC,IAAArgC,IAASA,EAAO,OAAO,CAAAgN,MAAKA,EAAE,WAAW,QAAQg0B,EAAO,IAAI,OAAOh0B,EAAE,OAAO,CAAC,CAAC;AAAA,EAClF;AACA,MAAIqzB,EAAQ,MAAM,KAAI,MAAO,IAAI;AAC7B,UAAMY,IAASZ,EAAQ,MAAM,KAAI,EAAG,YAAW;AAC/C,IAAArgC,IAASA,EAAO,OAAO,CAAAgN,OAAMA,EAAE,SAAS,IAAI,YAAW,EAAG,SAASi0B,CAAM,CAAC;AAAA,EAC9E;AAEA,MAAIZ,EAAQ,kBAAkBA,EAAQ;AAClC,IAAArgC,IAASA,EAAO,OAAO,CAAAgN,MAAK;AACxB,YAAMyG,IAAM8rB,GAAcvyB,EAAE,iBAAiB,IAAIA,EAAE,UAAUyyB,CAAU;AACvE,aAAKhsB,KAEI,CAAC4sB,EAAQ,kBAAkB5sB,KAAO4sB,EAAQ,oBAC9C,CAACA,EAAQ,gBAAgB5sB,KAAO4sB,EAAQ,gBAFlC;AAAA,IAGf,CAAC;AAAA,WAEIA,EAAQ,cAAc;AAC3B,IAAArgC,IAASA,EAAO,OAAO,CAAAgN,MAAK;AACxB,YAAMyG,IAAM8rB,GAAcvyB,EAAE,iBAAiB,IAAIA,EAAE,UAAUyyB,CAAU;AACvE,UAAI,CAAChsB;AACD,eAAO;AACX,YAAMytB,IAAMtB,GAAczC,GAAKnwB,EAAE,UAAUyyB,CAAU;AACrD,aAAOyB,KAAO,QAAQztB,KAAOytB,EAAI,QAAQztB,KAAOytB,EAAI;AAAA,IACxD,CAAC;AAAA,WAEI,OAAOb,EAAQ,aAAc,UAAU;AAK5C,UAAMc,IAAM,IAAI,KAAKhE,EAAI,QAAO,IAAKkD,EAAQ,YAAY,KAAQ;AACjE,IAAArgC,IAASA,EAAO,OAAO,CAAAgN,MAAK;AACxB,YAAM0D,IAAI,IAAI,KAAK1D,EAAE,iBAAiB,EAAE;AACxC,aAAO,CAAC,OAAO,MAAM0D,EAAE,QAAO,CAAE,KAAKA,KAAKysB,KAAOzsB,KAAKywB;AAAA,IAC1D,CAAC;AAAA,EACL;AACA,EAAId,EAAQ,UAAU,SAAS,MAC3BrgC,IAASA,EAAO,OAAO,CAAAgN,MAAKqzB,EAAQ,UAAU,SAASV,GAAkB3yB,EAAE,iBAAiB,IAAIA,EAAE,UAAUyyB,CAAU,CAAC,CAAC;AAG5H,QAAM2B,IAAa;AAAA,IACf;AAAA,MACI,WAAW;AAAA,MACX,QAAQf,EAAQ,QAAQ,SAAS;AAAA,MACjC,SAAS,CAAArzB,MAAKA,EAAE,WAAW,QAAQ,OAAOA,EAAE,OAAO,MAAM;AAAA,MACzD,QAAQ,CAAAA,MAAKkyB,GAAMmB,EAAQ,OAAO,EAAE,IAAI,OAAOrzB,EAAE,OAAO,CAAC;AAAA,IACrE;AAAA,IACQ;AAAA,MACI,WAAW;AAAA,MACX,QAAQqzB,EAAQ,UAAU,SAAS;AAAA,MACnC,SAAS,CAAArzB,OAAMA,EAAE,YAAY,UAAU,KAAK;AAAA,MAC5C,QAAQ,CAAAA,MAAKA,EAAE,WAAW,KAAK,CAAAC,MAAKozB,EAAQ,UAAU,SAASpzB,CAAC,CAAC;AAAA,IAC7E;AAAA,IACQ;AAAA,MACI,WAAW;AAAA,MACX,QAAQozB,EAAQ,eAAe,SAAS;AAAA,MACxC,SAAS,CAAArzB,MAAKA,EAAE,kBAAkB;AAAA,MAClC,QAAQ,CAAAA,MAAKqzB,EAAQ,eAAe,IAAI,MAAM,EAAE,SAASrzB,EAAE,cAAc;AAAA,IACrF;AAAA,IACQ;AAAA,MACI,WAAW;AAAA,MACX,QAAQqzB,EAAQ,eAAe;AAAA,MAC/B,SAAS,CAAArzB,MAAKA,EAAE,YAAY;AAAA,MAC5B,QAAQ,CAAAA,MAAKoyB,GAAqBpyB,EAAE,UAAUqzB,EAAQ,YAAYA,EAAQ,YAAY;AAAA,IAClG;AAAA,IACQ;AAAA,MACI,WAAW;AAAA,MACX,QAAQA,EAAQ,uBAAuB;AAAA,MACvC,SAAS,CAAArzB,MAAKA,EAAE,gBAAgB;AAAA,MAChC,QAAQ,CAAAA,MAAKoyB,GAAqBpyB,EAAE,cAAcqzB,EAAQ,oBAAoBA,EAAQ,oBAAoB;AAAA,IACtH;AAAA,IACQ;AAAA,MACI,WAAW;AAAA,MACX,QAAQA,EAAQ,aAAa,SAAS;AAAA,MACtC,SAAS,CAAArzB,OAAMA,EAAE,cAAc,UAAU,KAAK;AAAA,MAC9C,QAAQ,CAAAA,MAAK;AACT,cAAMq0B,IAASnC,GAAMmB,EAAQ,YAAY;AACzC,eAAOrzB,EAAE,aAAa,KAAK,CAAAsgB,MAAK+T,EAAO,IAAI,OAAO/T,CAAC,CAAC,CAAC;AAAA,MACzD;AAAA,IACZ;AAAA,IACQ;AAAA,MACI,WAAW;AAAA,MACX,QAAQ+S,EAAQ,mBAAmB;AAAA,MACnC,SAAS,CAAArzB,MAAKA,EAAE,aAAa;AAAA,MAC7B,QAAQ,CAAAA,MAAKA,EAAE,cAAc;AAAA,IACzC;AAAA,IACQ;AAAA,MACI,WAAW;AAAA,MACX,QAAQqzB,EAAQ,wBAAwB;AAAA,MACxC,SAAS,CAAArzB,MAAKA,EAAE,kBAAkB;AAAA,MAClC,QAAQ,CAAAA,MAAKA,EAAE,mBAAmB;AAAA,IAC9C;AAAA,EACA;AACI,aAAWs0B,KAAQF;AACf,QAAKE,EAAK,QAIV;AAAA,UAAI,CAAClB,EAAO,KAAKkB,EAAK,OAAO,GAAG;AAC5B,QAAAhB,EAAQ,KAAKgB,EAAK,SAAS;AAC3B;AAAA,MACJ;AACA,MAAAthC,IAASA,EAAO,OAAO,CAAAgN,MAAKs0B,EAAK,QAAQt0B,CAAC,KAAKs0B,EAAK,OAAOt0B,CAAC,CAAC;AAAA;AAEjE,SAAO,EAAE,QAAQhN,GAAQ,mBAAmBsgC,EAAO;AACvD;ACjRA,MAAMiB,KAAY,oBAAI,IAAI;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,CAAC,GACKC,KAAM,uBACNC,KAAU;AAChB,SAASC,GAASzC,GAAG;AACjB,SAAO,OAAOA,KAAM,YAAa,OAAOA,KAAM,YAAY,CAAC,OAAO,MAAMA,CAAC;AAC7E;AACA,SAAS0C,GAAQ1C,GAAG;AAChB,SAAO,MAAM,QAAQA,CAAC,IAAIA,EAAE,OAAOyC,EAAQ,IAAI,CAAA;AACnD;AACA,SAASE,GAAa3C,GAAG;AACrB,SAAO,MAAM,QAAQA,CAAC,IAChBA,EAAE,OAAO,CAACvuB,MAAM,OAAOA,KAAM,YAAY,OAAO,UAAUA,CAAC,KAAKA,KAAK,KAAKA,KAAK,CAAC,IAChF,CAAA;AACV;AACA,SAASmxB,GAAS5C,GAAG;AACjB,SAAO,MAAM,QAAQA,CAAC,IAChBA,EAAE,OAAO,CAACvuB,MAAM,OAAOA,KAAM,YAAY,OAAO,UAAUA,CAAC,CAAC,IAC5D,CAAA;AACV;AACA,SAASoxB,GAAI7C,GAAG;AACZ,SAAO,OAAOA,KAAM,YAAYuC,GAAI,KAAKvC,CAAC,IAAIA,IAAI;AACtD;AACA,SAASK,GAASL,GAAGja,GAAU;AAC3B,SAAO,OAAOia,KAAM,YAAYsC,GAAU,IAAItC,CAAC,IACzCA,IACAja;AACV;AAEA,SAAS+c,GAAc9C,GAAG;AACtB,SAAI,OAAOA,KAAM,YAAY,CAAC,OAAO,MAAMA,CAAC,IACjCA,IACP,OAAOA,KAAM,YAAYwC,GAAQ,KAAKxC,CAAC,IAChC,OAAOA,CAAC,IACf,MAAM,QAAQA,CAAC,KACfA,EAAE,WAAW,KACb,OAAOA,EAAE,CAAC,KAAM,YAChB,OAAOA,EAAE,CAAC,KAAM,YAChB,CAAC,OAAO,MAAMA,EAAE,CAAC,CAAC,KAClB,CAAC,OAAO,MAAMA,EAAE,CAAC,CAAC,IACX,CAACA,EAAE,CAAC,GAAGA,EAAE,CAAC,CAAC,IAEf;AACX;AACA,SAAS+C,GAAU/C,GAAG;AAGlB,SAFIA,MAAM,kBAEN,OAAOA,KAAM,YAAY,CAAC,OAAO,MAAMA,CAAC,IACjCA,IACP,OAAOA,KAAM,YAAYwC,GAAQ,KAAKxC,CAAC,IAChC,OAAOA,CAAC,IACZ;AACX;AACA,SAASgD,GAAKhD,GAAGja,GAAU;AACvB,SAAO,OAAOia,KAAM,YAAYA,IAAIja;AACxC;AASA,SAASkd,KAAgB;AACrB,SAAO;AAAA,IACH,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,WAAW,CAAA;AAAA,IACX,OAAO;AAAA,IACP,UAAU,CAAA;AAAA,IACV,WAAW,CAAA;AAAA,IACX,eAAe,CAAA;AAAA,IACf,SAAS,CAAA;AAAA,IACT,SAAS,CAAA;AAAA,IACT,WAAW,CAAA;AAAA,IACX,gBAAgB,CAAA;AAAA,IAChB,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,cAAc,CAAA;AAAA,EACtB;AACA;AAAA,CAKsC,MAAM;AACxC,QAAMxxB,IAAIwxB,GAAa;AACvB,aAAWjD,KAAK,OAAO,OAAOvuB,CAAC;AAC3B,IAAI,MAAM,QAAQuuB,CAAC,KACf,OAAO,OAAOA,CAAC;AAEvB,SAAO,OAAO,OAAOvuB,CAAC;AAC1B,GAAC;AAMM,SAASyxB,GAAkB7vB,GAAK;AACnC,MAAIA,KAAO,QAAQ,OAAOA,KAAQ,YAAY,MAAM,QAAQA,CAAG;AAG3D,WAAO4vB,GAAa;AAExB,QAAMn1B,IAAIuF;AACV,SAAO;AAAA,IACH,WAAW0vB,GAAUj1B,EAAE,SAAS;AAAA,IAChC,gBAAgB+0B,GAAI/0B,EAAE,cAAc;AAAA,IACpC,cAAc+0B,GAAI/0B,EAAE,YAAY;AAAA,IAChC,WAAW60B,GAAa70B,EAAE,SAAS;AAAA,IACnC,OAAO,OAAOA,EAAE,SAAU,WAAWA,EAAE,QAAQ;AAAA,IAC/C,UAAU40B,GAAQ50B,EAAE,QAAQ;AAAA,IAC5B,WAAW40B,GAAQ50B,EAAE,SAAS;AAAA,IAC9B,eAAe40B,GAAQ50B,EAAE,aAAa;AAAA,IACtC,SAAS40B,GAAQ50B,EAAE,OAAO;AAAA,IAC1B,SAAS40B,GAAQ50B,EAAE,OAAO;AAAA,IAC1B,WAAW80B,GAAS90B,EAAE,SAAS;AAAA,IAC/B,gBAAgB40B,GAAQ50B,EAAE,cAAc;AAAA,IACxC,YAAYg1B,GAAch1B,EAAE,UAAU;AAAA,IACtC,cAAcuyB,GAASvyB,EAAE,cAAc,WAAW;AAAA,IAClD,oBAAoBg1B,GAAch1B,EAAE,kBAAkB;AAAA,IACtD,sBAAsBuyB,GAASvyB,EAAE,sBAAsB,WAAW;AAAA,IAClE,gBAAgBk1B,GAAKl1B,EAAE,gBAAgB,EAAI;AAAA,IAC3C,qBAAqBk1B,GAAKl1B,EAAE,qBAAqB,EAAI;AAAA,IACrD,cAAc40B,GAAQ50B,EAAE,YAAY;AAAA,EAC5C;AACA;AC9GA,SAASq1B,GAAInD,GAAG;AACd,QAAM9xB,IAAI,OAAO8xB,CAAC;AAClB,SAAO,OAAO,MAAM9xB,CAAC,IAAI,OAAOA;AAClC;AAGA,SAASk1B,GAAar1B,GAAG;AACvB,QAAMwwB,IAAQ4E,GAAIp1B,EAAE,YAAY,GAC1BiwB,IAAYmF,GAAIp1B,EAAE,gBAAgB;AACxC,MAAIwwB,KAAS,QAAQA,IAAQ,KAAKP,KAAa;AAC7C,YAASO,IAAQP,KAAaO,IAAS;AAEzC,QAAM8E,IAAOF,GAAIp1B,EAAE,WAAW,GACxBu1B,IAAQH,GAAIp1B,EAAE,gBAAgB;AACpC,MAAIs1B,KAAQ,KAAM,QAAO;AACzB,QAAMr1B,IAAIq1B,KAAQC,KAAS;AAC3B,SAAIt1B,KAAK,IAAU,OACXq1B,IAAOr1B,IAAK;AACtB;AAGA,SAASu1B,GAAUx1B,GAAG;AACpB,SAAI,OAAOA,EAAE,aAAc,YAAkBA,EAAE,YAC3CA,EAAE,YAAYA,EAAE,SAAS,WAAW,aAAmB,KACvD,OAAOA,EAAE,oBAAqB,WAAiBA,EAAE,oBAAoB,IACrE,kBAAkB,KAAK,OAAOA,EAAE,UAAU,EAAE,CAAC,IAAU,KACpD;AACT;AAGA,SAASy1B,GAAOtD,GAAK;AACnB,SAAI,CAAC,MAAM,QAAQA,CAAG,KAAKA,EAAI,WAAW,IAAU,OAC7CA;AACT;AAGA,SAASuD,GAAa11B,GAAG;AACvB,SAAO;AAAA,IACL,IAAIA,EAAE;AAAA,IACN,OAAOA,EAAE,QAAQA,EAAE,SAAS;AAAA,IAC5B,eAAeA,EAAE,iBAAiBA,EAAE,QAAQA,EAAE,mBAAmB;AAAA;AAAA,IAEjE,UAAUA,EAAE,YAAYA,EAAE,YAAY;AAAA,IACtC,SAASA,EAAE,WAAWA,EAAE,WAAW;AAAA,IACnC,UAAUA,EAAE,iBAAiB;AAAA;AAAA;AAAA,IAG7B,SAASA,EAAE,WAAW;AAAA,IACtB,YAAYy1B,GAAOz1B,EAAE,kBAAkB;AAAA;AAAA;AAAA,IAGvC,gBAAgBA,EAAE,kBAAkB;AAAA,IACpC,cAAcy1B;AAAA,OACXz1B,EAAE,oBAAoB,CAAA,GAAI,IAAI,CAAAsgB,MAAKA,GAAG,EAAE,EAAE,OAAO,CAAAsB,MAAMA,KAAM,IAAI;AAAA,IACxE;AAAA,IACI,eAAe6T,GAAOz1B,EAAE,aAAa;AAAA,IACrC,UAAUo1B,GAAIp1B,EAAE,YAAYA,EAAE,KAAK;AAAA,IACnC,cAAcq1B,GAAar1B,CAAC;AAAA,IAC5B,WAAWw1B,GAAUx1B,CAAC;AAAA,IACtB,QAAQA;AAAA,EACZ;AACA;AASO,SAAS21B,GAAmBvC,GAAQC,GAAS;AAQlD,MAPI,CAAC,MAAM,QAAQD,CAAM,KAAK,CAACC,KAAW,OAAOA,KAAY,YAOzDD,EAAO,WAAW;AACpB,WAAOA;AAET,QAAM5hB,IAAS2jB,GAAkB9B,CAAO,GAClC,EAAE,QAAQuC,GAAM,mBAAAC,EAAiB,IAAK1C;AAAA,IAC1CC,EAAO,IAAIsC,EAAY;AAAA,IACvBlkB;AAAA,EACJ;AACE,SAAIqkB,EAAkB,SAAS,KAE7B,QAAQ;AAAA,IACN;AAAA,IACAA,EAAkB,KAAK,IAAI;AAAA,EACjC,GAESD,EAAK,IAAI,CAAAE,MAAKA,EAAE,MAAM;AAC/B;ACnGA,MAAM50B,KAASP,GAAa,cAAc,GAE7Bo1B,KAAyB;AActC,SAASC,GAAiBC,GAAQ;AAChC,MAAI,CAACA,KAAU,OAAOA,KAAW,YAAYA,MAAW,IAAK,QAAO;AACpE,MAAI;AACF,WAAO,IAAI,IAAIA,CAAM,EAAE,WAAWA;AAAA,EACpC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAASC,KAAqB;AACnC,MAAI;AACF,WACE,OAAO,SAAW,OAAe,OAAO,UAAU,OAAO,WAAW;AAAA,EAExE,QAAQ;AAGN,WAAO;AAAA,EACT;AACF;AAGO,SAASC,GAAWn0B,GAAQ;AACjC,EAAKk0B,GAAkB,KACvB,OAAO,OAAO;AAAA,IACZ,EAAE,MAAM,kBAAkB,QAAQH,IAAwB,SAAS,EAAE,QAAA/zB,IAAQ;AAAA,IAC7E;AAAA,EACJ;AACA;AAMO,SAASo0B,GAAe,EAAE,IAAAxU,IAAK,MAAM,MAAA8P,IAAO,IAAI,OAAA/F,IAAQ,GAAE,IAAK,IAAI;AACxE,EAAKuK,GAAkB,KACvB,OAAO,OAAO;AAAA,IACZ;AAAA,MACE,MAAM;AAAA,MACN,QAAQH;AAAA,MACR,SAAS,EAAE,IAAInU,KAAM,MAAM,MAAM8P,KAAQ,IAAI,OAAO/F,KAAS,GAAE;AAAA,IACrE;AAAA,IACI;AAAA,EACJ;AACA;AAoBO,SAAS0K,GAAqBC,GAASC,GAAc;AAC1D,MAAI,OAAO,SAAW,IAAa,QAAO;AAC1C,MAAI,CAACP,GAAiBO,CAAY;AAChCr1B,WAAAA,GAAO;AAAA,MACL;AAAA,IACN,GACW;AAET,QAAMmjB,IAAS6R,GAAkB,IAAK,OAAO,SAAS;AACtD,MAAI;AACF,WAAA7R,EAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,QAAQ0R;AAAA,QACR,SAAS,EAAE,SAASO,GAAS,WAAW,IAAI,SAASA,GAAS,WAAW,KAAI;AAAA,MACrF;AAAA,MACMC;AAAA,IACN,GACW;AAAA,EACT,SAAS7K,GAAK;AACZxqB,WAAAA,GAAO,KAAK,mDAAmDwqB,CAAG,GAC3D;AAAA,EACT;AACF;AAYO,SAAS8K,GAActd,GAAIud,GAAUC,GAAe;AACzD,MAAI,OAAO,SAAW,OAAe,CAACxd,EAAI,QAAO,MAAM;AAAA,EAAC;AAMxD,QAAMyd,IACJ,OAAOD,KAAkB,aACrBA,IACA,MAAM,KAAK,KAAKxd,EAAG,sBAAqB,EAAG,MAAM;AAEvD,MAAI4H,IAAO;AACX,QAAM8V,IAAU,MAAM;AACpB,UAAMC,IAAIF;AACV,IAAIE,KAAKA,MAAM/V,MACbA,IAAO+V,GACPJ,EAASI,CAAC;AAAA,EAEd;AAEA,MAAIC,IAAK;AACT,EAAI,OAAO,iBAAmB,QAC5BA,IAAK,IAAI,eAAeF,CAAO,GAC/BE,EAAG,QAAQ5d,CAAE;AAIf,QAAM6d,IAAS,CAAA/2B,MAAK;AAClB,IAAIA,EAAE,UAAUA,EAAE,OAAO,YAAY,SAAO42B;EAC9C;AACA,SAAA1d,EAAG,iBAAiB,QAAQ6d,GAAQ,EAAI,GAGxCH,KAEO,MAAM;AACX,IAAIE,KAAIA,EAAG,cACX5d,EAAG,oBAAoB,QAAQ6d,GAAQ,EAAI;AAAA,EAC7C;AACF;AASO,SAASC,GAAwBC,GAAS;AAC/C,MAAI,OAAO,SAAW,IAAa,QAAO,MAAM;AAAA,EAAC;AACjD,QAAMC,IAAY,CAAAl3B,MAAK;AAKrB,QAAIA,GAAG,UAAUA,EAAE,WAAW,OAAO,OAAQ;AAC7C,UAAMm3B,IAAOn3B,GAAG;AAChB,IAAI,CAACm3B,KAAQA,EAAK,SAAS,sBAC3BF,EAAQE,EAAK,WAAW,CAAA,CAAE;AAAA,EAC5B;AACA,gBAAO,iBAAiB,WAAWD,CAAS,GACrC,MAAM,OAAO,oBAAoB,WAAWA,CAAS;AAC9D;AC1LO,SAASE,GAAoBhE,GAAuC;AAC1E,QAAMiE,wBAAoB,IAAA,GACpBrkC,IAAyB,CAAA;AAE/B,aAAWsmB,KAAS8Z,GAAQ;AAC3B,UAAMkE,IAAWhe,EAAM;AACvB,QAAIge,KAAYA,IAAW,GAAG;AAE7B,YAAM/iC,IAAM,GAAG+iC,CAAQ,IAAIhe,EAAM,IAAI,IAC/B5lB,IAAQ2jC,EAAc,IAAI9iC,CAAG,KAAK,CAAA;AACxC,MAAAb,EAAM,KAAK4lB,CAAK,GAChB+d,EAAc,IAAI9iC,GAAKb,CAAK;AAAA,IAC7B;AACC,MAAAV,EAAO,KAAK,EAAE,OAAAsmB,GAAO,WAAW,CAACA,CAAK,GAAG,UAAU,IAAO;AAAA,EAE5D;AAEA,aAAWie,KAAaF,EAAc;AACrC,IAAAE,EAAU,KAAK,CAAChb,GAAGib,MAAMjb,EAAE,cAAc,cAAcib,EAAE,aAAa,CAAC,GACvExkC,EAAO,KAAK;AAAA,MACX,OAAOukC,EAAU,CAAC;AAAA,MAClB,WAAAA;AAAA,MACA,UAAUA,EAAU,SAAS;AAAA,IAAA,CAC7B;AAIF,SAAAvkC,EAAO,KAAK,CAACupB,GAAGib,MAAMjb,EAAE,UAAU,CAAC,EAAE,cAAc,cAAcib,EAAE,UAAU,CAAC,EAAE,aAAa,CAAC,GACvFxkC;AACR;ACVO,MAAMykC,KAAmB,IAwCnBC,KAAkB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;ACzDA,SAASC,GAAgBC,GAAwB;AAChD,SAAOA,EAAO,YAAA,EAAc,QAAQ,YAAY,EAAE;AACnD;AAcA,SAASC,GAAgBve,GAA6B;AAKrD,SAJmBqe,GAAgBre,EAAM,MAAM,MAC5B,YACfA,EAAM,oBAAoB,QAAQA,EAAM,gBAAgB,QACxDA,EAAM,iBAAiB,KACvBA,EAAM,oBAAoB,IAAU,KAElBA,EAAM,mBAAmBA,EAAM,eAAgB,OAC9Cme;AACxB;AAcO,SAASK,GAAgBxe,GAAoBW,GAAsD;AAKzG,MAAI,CAACX,EAAO,QAAO;AACnB,QAAM5T,IAAaiyB,GAAgBre,EAAM,UAAU,EAAE;AAErD,aAAWse,KAAUF;AACpB,YAAQE,GAAA;AAAA,MACP,KAAK;AACJ,YAAIlyB,MAAe,eAAeA,MAAe;AAChD,iBAAO,EAAE,MAAMuU,GAAQ,mBAAmB,aAAa,MAAM,YAAA;AAE9D;AAAA,MAED,KAAK;AACJ,YAAIX,EAAM,eAAe;AACxB,gBAAMye,IAAWze,EAAM,eAAeA,EAAM;AAC5C,cAAI,IAAI,KAAKye,CAAQ,IAAI,oBAAI;AAC5B,mBAAO,EAAE,MAAM9d,GAAQ,mBAAmB,cAAc,MAAM,OAAA;AAAA,QAEhE;AACA;AAAA,MAED,KAAK;AACJ,YAAIvU,MAAe;AAClB,iBAAO,EAAE,MAAMuU,GAAQ,iBAAiB,YAAY,MAAM,WAAA;AAG3D,YACCX,EAAM,oBAAoB,QAC1BA,EAAM,oBAAoB,KAC1BA,EAAM,gBAAgB,QACtBA,EAAM,eAAe;AAErB,iBAAO,EAAE,MAAMW,GAAQ,iBAAiB,YAAY,MAAM,WAAA;AAE3D;AAAA,MAED,KAAK;AACJ,YAAIvU,MAAe;AAClB,iBAAO,EAAE,MAAMuU,GAAQ,oBAAoB,eAAe,MAAM,cAAA;AAEjE;AAAA,MAED,KAAK;AACJ,YAAIvU,MAAe;AAClB,iBAAO,EAAE,MAAMuU,GAAQ,oBAAoB,eAAe,MAAM,cAAA;AAEjE;AAAA,MAED,KAAK;AACJ,YAAI4d,GAAgBve,CAAK;AACxB,iBAAO,EAAE,MAAMW,GAAQ,qBAAqB,gBAAgB,MAAM,WAAA;AAEnE;AAAA,IAAA;AAIH,SAAO;AACR;AAQO,SAAS+d,GAAmBC,GAA4C;AAC9E,MAAI,CAACA,EAAc,QAAO;AAC1B,QAAMh4B,IAAIg4B,EAAa;AACvB,SAAOh4B,MAAM,eAAeA,MAAM,UAAUA,MAAM,cAAcA,MAAM;AACvE;AA0EO,SAASi4B,GACfX,GACAtd,GACsB;AACtB,MAAIsd,EAAU,WAAW,EAAG,QAAO;AACnC,MAAIA,EAAU,WAAW,EAAG,QAAOO,GAAgBP,EAAU,CAAC,GAAGtd,CAAM;AAEvE,QAAMke,IAAWZ,EAAU,IAAI,CAACv3B,MAAM83B,GAAgB93B,GAAGia,CAAM,CAAC;AAEhE,MAAIke,EAAS,MAAM,CAAC50B,MAAMA,GAAG,SAAS,WAAW;AAChD,WAAO,EAAE,MAAM,aAAa,MAAMsf,GAAW,aAAa5I,CAAM,EAAA;AAGjE,MAAIke,EAAS,MAAM,CAAC50B,MAAMA,GAAG,SAAS,UAAU;AAC/C,WAAO,EAAE,MAAM,YAAY,MAAMsf,GAAW,YAAY5I,CAAM,EAAA;AAK/D,QAAMme,IAAWD,EAAS,OAAO,CAAC50B,MAAMA,GAAG,SAAS,cAAcA,GAAG,SAAS,WAAW;AACzF,SAAI60B,EAAS,SAAS,KAAKA,EAAS,MAAM,CAAC70B,MAAMA,GAAG,SAAS,UAAU,IAC/D,EAAE,MAAM,YAAY,MAAMsf,GAAW,YAAY5I,CAAM,EAAA,IAGxD;AACR;AAKO,SAAS4I,GAAW7H,GAAwBf,GAAyC;AAC3F,UAAQe,GAAA;AAAA,IACP,KAAK;AACJ,aAAOf,GAAQ,mBAAmB;AAAA,IACnC,KAAK;AACJ,aAAOA,GAAQ,mBAAmB;AAAA,IACnC,KAAK;AACJ,aAAOA,GAAQ,iBAAiB;AAAA,IACjC,KAAK;AACJ,aAAOA,GAAQ,oBAAoB;AAAA,IACpC,KAAK;AACJ,aAAOA,GAAQ,oBAAoB;AAAA,IACpC,KAAK;AACJ,aAAOA,GAAQ,qBAAqB;AAAA,EAAA;AAEvC;AAwCO,SAASoe,GAAard,GAAsC;AAClE,UAAQA,GAAA;AAAA,IACP,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR,KAAK;AACJ,aAAO;AAAA,IACR;AACC,aAAO;AAAA,EAAA;AAEV;AAQO,SAASsd,GAAqBlF,GAAsC;AAC1E,QAAMnF,wBAAY,KAAA;AAClB,EAAAA,EAAM,SAAS,GAAG,GAAG,GAAG,CAAC;AACzB,QAAMsK,IAAWlY,GAAiB4N,CAAK;AAEvC,SAAOmF,EACL,OAAO,CAAC9Z,MAAUA,EAAM,QAAQif,CAAQ,EACxC,KAAK,CAAChc,GAAGib,MAAMjb,EAAE,KAAK,cAAcib,EAAE,IAAI,CAAC;AAC9C;AC1RO,IAAIgB,KAAiB;AAMrB,SAASC,GAAiBtoB,GAAQ;AACvC,EAAAqoB,KAAiBroB;AACnB;AAWA,SAASuoB,GAASpjB,GAAQ;AACxB,MAAI,CAACA,KAAU,OAAOA,KAAW,SAAU,QAAO;AAClD,QAAMrP,IAAO,IAAI,KAAKqP,CAAM;AAC5B,SAAO,MAAMrP,EAAK,QAAO,CAAE,IAAI,OAAOA;AACxC;AAUA,SAAS0yB,GAAWrjB,GAAQrQ,GAAUrE,GAASuP,GAAQ;AACrD,QAAMlK,IAAOyyB,GAASpjB,CAAM;AAC5B,MAAI,CAACrP,EAAM,QAAO;AAElB,QAAMorB,IAAKrsB,GAAgBC,CAAQ,IAAIA,IAAWL;AAClD,SAAO,IAAI,KAAK,eAAyB4zB,IAAgB,EAAE,GAAG53B,GAAS,UAAUywB,EAAE,CAAE,EAAE,OAAOprB,CAAI;AACpG;AAQO,SAAS2yB,GAAgBtjB,GAAQrQ,GAAU;AAChD,SAAO0zB,GAAWrjB,GAAQrQ,GAAU;AAAA,IAClC,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,EACZ,CAAG;AACH;AAuBO,SAAS4zB,GAAgBC,GAAUC,GAAQ9zB,GAAU;AAC1D,QAAMrC,IAAQg2B,GAAgBE,GAAU7zB,CAAQ;AAChD,MAAI,CAAC8zB,EAAQ,QAAOn2B;AAEpB,QAAMuxB,IAAMyE,GAAgBG,GAAQ9zB,CAAQ;AAC5C,SAAOrC,KAASuxB,IAAM,GAAGvxB,CAAK,MAAMuxB,CAAG,KAAKvxB;AAC9C;AA2CO,SAASo2B,GAAa1jB,GAAQrQ,GAAU;AAE7C,MAAI,CADSyzB,GAASpjB,CAAM,EACjB,QAAO,EAAE,KAAK,IAAI,OAAO,IAAI,MAAM,GAAG,MAAM,EAAC;AAExD,QAAM+b,IAAKrsB,GAAgBC,CAAQ,IAAIA,IAAWL;AAElD,SAAO;AAAA,IACL,KAAK+zB,GAAWrjB,GAAQ+b,GAAI,EAAE,SAAS,SAAS;AAAA,IAChD,OAAOsH,GAAWrjB,GAAQ+b,GAAI,EAAE,OAAO,SAAS;AAAA,IAChD,MAAM,SAASsH,GAAWrjB,GAAQ+b,GAAI,EAAE,KAAK,WAAW,GAAG,EAAE;AAAA,IAC7D,MAAM,SAASsH,GAAWrjB,GAAQ+b,GAAI,EAAE,MAAM,WAAW,GAAG,EAAE;AAAA,EAClE;AACA;AASO,SAAS4H,GAAiB3jB,GAAQrQ,GAAU;AACjD,SAAO0zB,GAAWrjB,GAAQrQ,GAAU;AAAA,IAClC,SAAS;AAAA,IACT,OAAO;AAAA,IACP,KAAK;AAAA,EACT,CAAG;AACH;AASO,SAASi0B,GAAe5jB,GAAQrQ,GAAU;AAC/C,SAAO0zB,GAAWrjB,GAAQrQ,GAAU;AAAA,IAClC,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACT,CAAG;AACH;AASO,SAASk0B,GAAsB7jB,GAAQrQ,GAAU;AACtD,SAAO0zB,GAAWrjB,GAAQrQ,GAAU;AAAA,IAClC,SAAS;AAAA,IACT,OAAO;AAAA,IACP,KAAK;AAAA,EACT,CAAG;AACH;AAyBO,SAASm0B,GAAgBC,GAAep0B,GAAU;AACvD,SAAKo0B,IAGD,OAAOA,KAAkB,YAAY,6BAA6B,KAAKA,CAAa,IAC/EA,IAIST,GAAgBS,GAAep0B,CAAQ,KACrCo0B,IATO;AAU7B;ACpPA,MAAMC,KAAU;AAKhB,SAASC,GACRjgB,GACAW,GAC2C;AAC3C,QAAMgW,IAAY3W,EAAM,oBAAoB,GACtCkX,IAAQlX,EAAM,gBAAgB;AACpC,SAAI,CAACkX,KAASA,KAAS,IAAU,OAC7BP,KAAa,IACT,EAAE,MAAMhW,EAAO,iBAAiB,YAAY,SAAS,QAAA,IAEhDgW,IAAYO,IAAS,OACvB8I,KACH,EAAE,MAAMrf,EAAO,qBAAqB,gBAAgB,SAAS,UAAA,IAE9D;AACR;AAeO,SAASuf,GACfC,GACAxf,IAAiC,IAChB;AACjB,QAAMX,IAAQmgB,EAAQ,OAEhB7B,IAAS6B,EAAQ,WACpBvB,GAAsBuB,EAAQ,WAAWxf,CAAM,IAC/C6d,GAAgBxe,GAAOW,CAAM;AAGhC,MAAIkT,IACHyK,KAAUA,EAAO,SAAS,SACvB,EAAE,MAAMA,EAAO,MAAM,SAASS,GAAaT,EAAO,IAAI,MACtD;AACJ,EAAI,CAACzK,KAAS,CAACsM,EAAQ,aAAUtM,IAAQoM,GAAcjgB,GAAOW,CAAM;AAEpE,QAAMc,IAAO0W,GAAenY,CAAK,GAC3B4T,IAAY5T,EAAM,gBACrB2f,GAAiB3f,EAAM,eAAeA,EAAM,QAAQ,IACpD,IAEGogB,IAA4BD,EAAQ,WACvCA,EAAQ,YACRngB,EAAM,gBACL,CAACA,CAAK,IACN,CAAA,GACE8T,IAAQsM,EAAW,IAAI,CAAC15B,MAAM;AACnC,UAAM+T,IAAO6kB,GAAgB54B,EAAE,eAAeA,EAAE,QAAQ,GAClD25B,IAAU7B,GAAgB93B,GAAGia,CAAM,GAAG,SAAS;AACrD,WAAO;AAAA,MACN,WAAWlG;AAAA,MACX,MAAM0d,GAAezxB,CAAC;AAAA,MACtB,WAAW,GAAGsZ,EAAM,IAAI,OAAOvF,CAAI,GAAG4lB,IAAU,eAAe,EAAE;AAAA,IAAA;AAAA,EAEnE,CAAC,GAEKhlC,IAAkB,CAAC2kB,EAAM,IAAI;AACnC,SAAIA,EAAM,iBACT3kB,EAAM,KAAK,MAAMskC,GAAiB3f,EAAM,eAAeA,EAAM,QAAQ,CAAC,EAAE,GAErEmgB,EAAQ,WACX9kC,EAAM,KAAK,GAAG8kC,EAAQ,UAAU,MAAM,sBAAsB,IAClDngB,EAAM,iBAChB3kB,EAAM,KAAK,MAAMikC,GAAgBtf,EAAM,eAAeA,EAAM,QAAQ,CAAC,EAAE,GAEpEse,KAAQjjC,EAAM,KAAKijC,EAAO,IAAI,GAE3B;AAAA,IACN,OAAOte,EAAM;AAAA,IACb,MAAAyB;AAAA,IACA,UAAUzB,EAAM,YAAY;AAAA,IAC5B,WAAA4T;AAAA,IACA,aAAa5T,EAAM,eAAe;AAAA,IAClC,WAAW3kB,EAAM,KAAK,IAAI;AAAA,IAC1B,OAAAw4B;AAAA,IACA,OAAAC;AAAA,IACA,YAAAsM;AAAA,EAAA;AAEF;AC3GY,MAACE,KAAoB;;kBCEjC;gDA8BmB,EAAK,iCACN,EAAK,iCACL,EAAK;AACrB,MAAAxL,IAAWhtB,EAAA,KAAAC,GAAA,eAAA,IAAA,OAAG,oBAAI,QAAO,aAAW,GACpCgtB,IAAYjtB,EAAA,KAAAC,GAAA,gBAAA,IAAA,OAAG,oBAAI,QAAO,UAAQ,GAClCw4B,IAAaz4B,EAAA,KAAAC,GAAA,iBAAA,IAAA,MAAA,EAAA;qCACQ,EAAI;MAKzB4Y,IAAM7Y,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,CAAA,EAAA,GACN8O,2BAAS,OAAO,GAKb2pB,cAAoB1L,CAAW,GAC/B2L,cAAqB1L,CAAY;AAErC,QAAMJ,IAAQ,oBAAI,KAAI;AAEtB,WAAS6G,EAAItxB,GAAGC,GAAGC,IAAG;AACrB,UAAMs2B,IAAK,OAAOv2B,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,GAClCw2B,KAAK,OAAOv2B,EAAC,EAAE,SAAS,GAAG,GAAG;AACpC,WAAM,GAAIF,CAAC,IAAIw2B,CAAE,IAAIC,EAAE;AAAA,EACxB;AAEA,MAAI1B,IAAQn3B,EAAA,QAAA,MAAY0zB,EAAI7G,EAAM,YAAW,GAAIA,EAAM,SAAQ,GAAIA,EAAM,QAAO,CAAA,CAAA,GAE5EiM,oBACH,IAAI,KAAI94B,EAAA,IAAC04B,CAAQ,GAAA14B,EAAA,IAAE24B,CAAS,GAAE,CAAC,EAAE,eAAe5pB,EAAM,GAAA,EACrD,OAAO,QACP,MAAM,UAAS,CAAA,CAAA,GAObgqB,oBAAkC;AACrC,UAAMC,IAAW,IAAI,KAAK,eAAejqB,EAAM,GAAA,EAAI,SAAS,SAAO,GAC7DkqB,IAAY,IAAI,KAAK,eAAelqB,EAAM,GAAA,EAAI,SAAS,UAAQ,GAC/D8iB,KAAS,IAAI,KAAK,MAAM,GAAG,CAAC,GAC5BqH,IAAG,CAAA;AACT,aAASjpC,KAAI,GAAGA,KAAI,GAAGA,MAAK;AAC3B,YAAMqS,KAAI,IAAI,KAAKuvB,GAAO,YAAW,GAAIA,GAAO,YAAYA,GAAO,QAAO,IAAK5hC,EAAC;AAChF,MAAAipC,EAAI,KAAI,EAAG,OAAOF,EAAS,OAAO12B,EAAC,GAAG,QAAQ22B,EAAU,OAAO32B,EAAC,EAAA,CAAA;AAAA,IACjE;AACA,WAAO42B;AAAA,EACR,CAAC;AAID,WAASC,EAAW/2B,GAAGC,GAAG+2B,IAAW;AACpC,UAAMC,IAAW,IAAI,KAAKj3B,GAAGC,IAAI,GAAG,CAAC,EAAE,QAAO,GACxCi3B,KAAU,IAAI,KAAKl3B,GAAGC,GAAG,CAAC,EAAE,OAAM,GAClCzQ,KAAM,CAAA,GACN2nC,KAASl3B,MAAM,IAAI,KAAKA,IAAI,GAC5Bm3B,KAASn3B,MAAM,IAAID,IAAI,IAAIA,GAC3Bq3B,KAAa,IAAI,KAAKD,IAAQD,KAAS,GAAG,CAAC,EAAE,QAAO;AAC1D,aAAStpC,KAAIqpC,KAAU,GAAGrpC,MAAK,GAAGA,MAAK;AACtC,YAAMqS,KAAIm3B,KAAaxpC;AACvB,MAAA2B,GAAO,KAAI;AAAA,QACV,KAAK0Q;AAAA,QACL,MAAMoxB,EAAI8F,IAAQD,IAAQj3B,EAAC;AAAA,QAC3B,eAAa,CAAA;AAAA,QACb,gBAAgB;AAAA,QAChB,SAAS;AAAA;IAEX;AACA,aAASA,KAAI,GAAGA,MAAK+2B,GAAU/2B,MAAK;AACnC,YAAMo3B,KAAUhG,EAAItxB,GAAGC,GAAGC,EAAC,GACrBq3B,KAAYP,GAAU,IAAIM,EAAO,KAAA,CAAA;AACvC,MAAA9nC,GAAO,KAAI;AAAA,QACV,KAAK0Q;AAAA,QACL,MAAMo3B;AAAA,QACN,eAAe1D,GAAoB2D,EAAS;AAAA,QAC5C,gBAAgB;AAAA,QAChB,SAASD,OAAO15B,EAAA,IAAKm3B,CAAQ;AAAA;IAE/B;AACA,WAAOvlC,GAAO,SAAS,MAAM,KAAG;AAC/B,YAAMwb,KAASxb,GAAO,UAAU0nC,KAAUD,IACpCO,KAASv3B,MAAM,KAAK,IAAIA,IAAI,GAC5Bw3B,KAASx3B,MAAM,KAAKD,IAAI,IAAIA,GAC5BE,IAAI8K,KAAS;AACnB,MAAAxb,GAAO,KAAI;AAAA,QACV,KAAK0Q;AAAA,QACL,MAAMoxB,EAAImG,IAAQD,IAAQt3B,CAAC;AAAA,QAC3B,eAAa,CAAA;AAAA,QACb,gBAAgB;AAAA,QAChB,SAAS;AAAA;IAEX;AACA,WAAO1Q;AAAA,EACR;AAGA,WAASkoC,EAAkBC,GAAY;AACtC,UAAMnoC,IAAM,CAAA;AACZ,aAAS3B,KAAI,GAAGA,KAAI8pC,EAAW,QAAQ9pC,MAAK,GAAG;AAC9C,YAAMsc,IAAOwtB,EAAW,MAAM9pC,IAAGA,KAAI,CAAC,GAChC+pC,KAAkBztB,EAAK,MAAK,CAChComB,OAAMA,GAAE,OAAI3yB,EAAA,IAAGm3B,CAAQ,KAAIxE,GAAE,cAAc,WAAW,CAAC;AAEzD,iBAAWA,MAAKpmB,EAAM,CAAA3a,EAAO,KAAI,EAAG,MAAM+gC,IAAG,YAAYqH,IAAe;AAAA,IACzE;AACA,WAAOpoC;AAAA,EACR;AAQA,MAAIqoC,oBAAoC;AACvC,UAAMC,IAAM,oBAAI,IAAG;AACnB,eAAWt7B,KAAK65B;AAKf,MAAI/B,GAAgB93B,CAAC,GAAG,SAAS,gBAC5Bs7B,EAAI,IAAIt7B,EAAE,IAAI,KAAGs7B,EAAI,IAAIt7B,EAAE,MAAI,EAAA,GACpCs7B,EAAI,IAAIt7B,EAAE,IAAI,EAAE,KAAKA,CAAC;AAEvB,WAAOs7B;AAAA,EACR,CAAC,GAGGC,oBAAiBhB,EAAUn5B,EAAA,IAAC04B,CAAQ,GAAA14B,EAAA,IAAE24B,CAAS,SAAEsB,CAAe,CAAA,CAAA,GAChEG,oBAA8B;AACjC,UAAM93B,IAAI,IAAI,KAAItC,EAAA,IAAC04B,CAAQ,GAAA14B,EAAA,IAAE24B,CAAS,IAAG,GAAG,CAAC;AAC7C,WAAOQ,EAAW72B,EAAE,eAAeA,EAAE,SAAQ,GAAAtC,EAAA,IAAIi6B,CAAe,CAAA;AAAA,EACjE,CAAC,GACGI,oBAA8B;AACjC,UAAM/3B,IAAI,IAAI,KAAItC,EAAA,IAAC04B,CAAQ,GAAA14B,EAAA,IAAE24B,CAAS,IAAG,GAAG,CAAC;AAC7C,WAAOQ,EAAW72B,EAAE,eAAeA,EAAE,SAAQ,GAAAtC,EAAA,IAAIi6B,CAAe,CAAA;AAAA,EACjE,CAAC,GAEGK,IAAYt6B,EAAA,QAAA,MAAY85B,EAAiB95B,EAAA,IAACm6B,CAAK,CAAA,CAAA,GAC/CI,IAAgBv6B,EAAA,QAAA,MAAY85B,EAAiB95B,EAAA,IAACo6B,CAAS,CAAA,CAAA,GACvDI,IAAgBx6B,EAAA,QAAA,MAAY85B,EAAiB95B,EAAA,IAACq6B,CAAS,CAAA,CAAA;AAG3D,QAAMI,IAAkB,MAClBC,IAAqB,KACrBC,IAAkB;AAExB,MAAIC,IAAc,GACdC,IAAc,GACdC,IAAa,GACbC,KAAgB,GAChBC,IAAY,GACZC,KAAYj7B,EAAA,MAAO,EAAK,GACxBk7B,KAAcl7B,EAAA,MAAO,CAAC,GACtBm7B,KAAan7B,EAAA,MAAO,EAAK,GACzBo7B,IAAcp7B,EAAA,MAAO,EAAK,GAC1Bq7B,IAAkB,MAClBr6B,IAAuBhB,EAAA,MAAO,EAAK,GAGnCs7B,KAAqBt7B,EAAA,MAAO,IAAI,GAChCu7B,IAAoBv7B,EAAA,MAAO,IAAI;AACnC,WAASw7B,IAAY;AACpB,WAAMx7B,EAAA,IACLs7B,EAAkB,GAAE,qBACpBC,CAAiB,GAAE,eACnB;AAAA,EAEF;AAEA,EAAAv7B,EAAA,kBAAc;AACb,QAAE,OAAS,SAAW,IAAa;AACnC,UAAM+nB,IAAK,OAAO,WAAW,kCAAkC;UAC/D/mB,GAAuB+mB,EAAG,SAAO,EAAA;AACjC,UAAM8N,KAAWj3B,OAACoB,EAAA,IAAMgB,GAAuBpC,GAAE,SAAO,EAAA;AACxD,WAAAmpB,EAAG,iBAAiB,UAAU8N,CAAO,SACxB9N,EAAG,oBAAoB,UAAU8N,CAAO;AAAA,EACtD,CAAC;AAID,WAAS4F,GAAcC,GAAWC,GAAQC,IAAgB;AACzD,QAAE57B,EAAA,IAAEo7B,CAAW,GAAE;AAChB,MAAAO,IAAM;AACN;AAAA,IACD;AACA,QAAE37B,EAAA,IAAEgB,CAAoB,GAAE;AACzB,MAAA26B,IAAM;AACN;AAAA,IACD;AACA,IAAA37B,EAAA,IAAAo7B,GAAc,EAAI;AAClB,UAAM1G,IAAIkH,MAAkBJ,EAAS;AAErC,IAAAx7B,EAAA,IAAAk7B,IAAcQ,MAAc,IAAC,CAAIhH,IAAIA,GAAC,EAAA,GACtC2G,IAAkB,OAAO;AAAA,YAAiB;AACzC,QAAAA,IAAkB,MAGlBr7B,EAAA,IAAAm7B,IAAa,EAAI,GACjB,4BAA4B;AAC3B,UAAAQ,OACA37B,EAAA,IAAAk7B,IAAc,CAAC,GACfl7B,EAAA,IAAAo7B,GAAc,EAAK,GACnB,4BAA4B;AAC3B,YAAAp7B,EAAA,IAAAm7B,IAAa,EAAK;AAAA,UACnB,CAAC;AAAA,QACF,CAAC;AAAA,MACF;AAAA,MAAG;AAAA;EACJ;AAIO,iBAAeU,GAAuBH,GAAWI,GAAY;AACnE,IAAAL,GAAcC,GAAWI,CAAU;AAAA,EACpC;AAEA,WAASC,GAAiBn9B,GAAG;AAC5B,IAAEoB,EAAA,IAAEo7B,CAAW,MACVC,MAAoB,SACvB,aAAaA,CAAe,GAC5BA,IAAkB,OAEnBr7B,EAAA,IAAAo7B,GAAc,EAAK,GACnBp7B,EAAA,IAAAm7B,IAAa,EAAK,IAEnBP,IAAch8B,EAAE,QAAQ,CAAC,EAAE,SAC3Bi8B,IAAcj8B,EAAE,QAAQ,CAAC,EAAE,SAC3Bk8B,IAAaF,GACbG,KAAgBn8B,EAAE,WAClBo8B,IAAY,GACZh7B,EAAA,IAAAi7B,IAAY,EAAK,GACjBj7B,EAAA,IAAAk7B,IAAc,CAAC;AAAA,EAChB;AAEA,WAASc,GAAgBp9B,GAAG;AAC3B,QAAE,CAAGg8B,KAAW56B,EAAA,IAAIo7B,CAAW,EAAE;AACjC,UAAMa,IAAOr9B,EAAE,QAAQ,CAAC,EAAE,SACpBs9B,KAAOt9B,EAAE,QAAQ,CAAC,EAAE,SACpBu9B,IAAQvB,IAAcqB,GACtBG,KAAQvB,IAAcqB,IACtBnN,KAAMnwB,EAAE;AAEd,QAAE,CAAAoB,EAAA,IAAGi7B,EAAS,KAAI,KAAK,IAAIkB,CAAK,IAAI;AACnC,UAAI,KAAK,IAAIA,CAAK,IAAI,KAAK,IAAIC,EAAK;AACnC,QAAAp8B,EAAA,IAAAi7B,IAAY,EAAI;AAAA,WACV;AACN,QAAAL,IAAc;AACd;AAAA,MACD;AAGD,QAAE56B,EAAA,IAAEi7B,EAAS,GAAE;AACd,MAAAr8B,EAAE,eAAc;AAChB,YAAMy9B,KAAKtN,KAAMgM;AACjB,MAAIsB,KAAK,MAAGrB,KAAaF,IAAamB,KAAQI,KAC9CvB,IAAamB,GACblB,KAAgBhM,UAChBmM,IAAW,CAAIiB,IAAQxB,CAAe;AAAA,IACvC;AAAA,EACD;AAEA,WAAS2B,EAAe19B,GAAG;AAC1B,SAAKg8B,KAAW,CAAA56B,EAAA,IAAKi7B,EAAS,KAAAj7B,EAAA,IAAIo7B,CAAW,GAAE;AAC9C,MAAAR,IAAc,GACd56B,EAAA,IAAAi7B,IAAY,EAAK;AACjB;AAAA,IACD;AAEA,UAAMW,IAAiBh9B,EAAE,eAAe,eAAe48B,EAAS,GAE1De,IADe,KAAK,IAAGv8B,EAAA,IAACk7B,EAAW,KAAIU,IACRnB,GAC/B+B,KAAc,KAAK,IAAIxB,CAAS,IAAIN,GACpCgB,WAAYR,EAAW,IAAG,IAAC,KAAQ;AAEzC,IAAIqB,KAAiBC,MACpBrjB,GAAc,QAAQ,GACtBsiB,GACCC,IAAS,MACFA,OAAc,2CACrBE,CAAc,KAGf57B,EAAA,IAAAk7B,IAAc,CAAC,GAGhBN,IAAc,GACd56B,EAAA,IAAAi7B,IAAY,EAAK,GACjBD,IAAY;AAAA,EACb;AAGA,MAAIyB,IAAez8B,EAAA,MAAO,EAAE,GACxB08B,IAAc18B,EAAA,MAAO,EAAE;AAE3B,WAAS28B,EAAkB/9B,GAAG;AAG7B,QADE,CADW;AAAA,MAAI;AAAA,MAAa;AAAA,MAAc;AAAA,MAAW;AAAA,MAAa;AAAA,MAAS;AAAA,MAChE,SAASA,EAAE,GAAG,KACzB,CAAAoB,EAAA,IAAG08B,CAAW,EAAE;AAElB,UAAME,KAAG58B,EAAA,IAAGm6B,CAAK,EAAC,UAAS,CAAExH,OAAMA,GAAE,SAAI3yB,EAAA,IAAK08B,CAAW,CAAA;AACzD,QAAIE,OAAG,GAAS;AAEhB,QAAIh+B,EAAE,QAAQ,WAAWA,EAAE,QAAQ,KAAK;AACvC,MAAAA,EAAE,eAAc;AAChB,YAAMi+B,KAAI78B,EAAA,IAAGm6B,CAAK,EAACyC,EAAG;AACtB,MAAIC,GAAK,cAAc,SAAS,YAC/BJ,GAAeI,GAAK,MAAI,EAAA,qBACR,MAAMA,GAAK,MAAM,QAAQA,GAAK,eAAa;AAE5D;AAAA,IACD;AAEA,QAAIC,IAAUF;AAMd,IALIh+B,EAAE,QAAQ,cAAak+B,IAAUF,KAAM,IAClCh+B,EAAE,QAAQ,eAAck+B,IAAUF,KAAM,IACxCh+B,EAAE,QAAQ,YAAWk+B,IAAUF,KAAM,IACrCh+B,EAAE,QAAQ,gBAAak+B,IAAUF,KAAM,IAE5C,EAAAE,IAAU,KAAKA,KAAO98B,EAAA,IAAIm6B,CAAK,EAAC,YACpCv7B,EAAE,eAAc,GAChBoB,EAAA,IAAA08B,GAAW18B,EAAA,IAAGm6B,CAAK,EAAC2C,CAAO,EAAE,MAAI,EAAA,GAEjC,qBAAqB;AAIpB;AAAA,MAFC,SAAS,cAAa,oBAAA98B,EAAA,IAAqBm6B,CAAK,EAAC2C,CAAO,EAAE,IAAI,IAAA,GAE3D,MAAK;AAAA,IACV,CAAC;AAAA,EACF;AAIA,EAAA98B,EAAA,kBAAc;AACb,QAAEA,EAAA,IAAE08B,CAAW,KAAA18B,EAAA,IAAIm6B,CAAK,EAAC,KAAI,CAAExH,MAAMA,EAAE,SAAI3yB,EAAA,IAAK08B,CAAW,GAAG;AAC9D,QAAE18B,EAAA,IAAEy8B,CAAY,KAAAz8B,EAAA,IAAIm6B,CAAK,EAAC,KAAI,CAAExH,MAAMA,EAAE,SAAI3yB,EAAA,IAAKy8B,CAAY,IAAG;AAC/D,MAAAz8B,EAAA,IAAA08B,SAAcD,CAAY,GAAA,EAAA;AAC1B;AAAA,IACD;AACA,UAAMM,IAAW/8B,EAAA,IAAGm6B,CAAK,EAAC,MAAMxH,MAAMA,EAAE,OAAO;AAC/C,QAAIoK,GAAa;YAChBL,GAAcK,EAAY,MAAI,EAAA;AAC9B;AAAA,IACD;AACA,UAAMC,IAAUh9B,EAAA,IAAGm6B,CAAK,EAAC,KAAI,CAAExH,MAAC,CAAMA,EAAE,kBAAkBA,EAAE,cAAc,SAAS,CAAC;AACpF,QAAIqK,GAAY;YACfN,GAAcM,EAAW,MAAI,EAAA;AAC7B;AAAA,IACD;AACA,UAAMC,KAAQj9B,EAAA,IAAGm6B,CAAK,EAAC,MAAMxH,MAAC,CAAMA,EAAE,cAAc;AACpD,IAAIsK,MAAQj9B,EAAA,IAAE08B,GAAcO,GAAS,MAAI,EAAA;AAAA,EAC1C,CAAC,GAEDj9B,EAAA,kBAAc;AACb,QAAEA,EAAA,IAAEy8B,CAAY,EAAE;AAClB,UAAMS,UAAS/C,CAAK,EAAC,KAAI,CAAExH,OAAMA,GAAE,QAAI3yB,EAAA,IAAIm3B,CAAQ,KAAIxE,GAAE,cAAc,SAAS,CAAC,GAC3E/b,IAAQ5W,EAAA,IAAGm6B,CAAK,EAAC,MAAMxH,OAAC,CAAMA,GAAE,cAAc;UACpD8J,GAAeS,GAAQ,QAAQtmB,GAAU,QAAI5W,EAAA,IAAIm3B,CAAQ,GAAA,EAAA;AAAA,EAC1D,CAAC;AAID,MAAIgG,oBAAmC;AACtC,QAAE,CAAAn9B,EAAA,IAAGy8B,CAAY,EAAE,QAAM,CAAA;AACzB,UAAM9C,IAAS35B,EAAA,IAAGi6B,CAAe,EAAC,UAAIwC,CAAY,CAAA,KAAA,CAAA;AAClD,WAAOzG,GAAoB2D,CAAS;AAAA,EACrC,CAAC;oDAODvjB,KAAGpW,EAAA,YAAAgZ,CAAA;;UA0BOokB,IAAgB,CAAA7hB,GAAC8hB,KAASr9B,EAAA,MAAEs9B,KAASt9B,EAAA,SAAA;UAC7CoX,KAAGf,GAAA;AAAH,MAAArW,EAAA,KAAAoX,QACOimB,IAAS,CAAA,EAAO,MAAAR,IAAM,YAAAU,GAAU,MAAA,GAAMV,GAAK,IAAI,IAAIA,GAAK,iBAAiB,MAAM,GAAG,IAAA,CAAAthB,IAAAiiB,OAAA;AAAlE,YAAAX,qBAAA,MAAMU,qBAAA;YAC3BtZ,KAAG7jB,GAAA;;AAOF,YAAAgkB,YAPDH,EAAG,gBAOFG,GAAG,EAAA;gBAAHA,CAAG;2BAAHA,GAAG,CAAA;6BACGyY,GAAI,EAAC,eAAa,CAAIY,OAAGA,GAAE,MAAM,SAAO,CAAAliB,IAAlBkiB,OAAC;;AAClB,kBAAA,EAAA,YAAAnF,OAAeoF,OAAQtF,GAAgBp4B,EAAA,IAACy9B,EAAC,GAAE5kB,GAAM;AAAjD,mBAAA,EAAA,YAAAyf,IAAe,MAAAoF,GAAI;AAAA;AAC7B,UAAAC,sCACI,MAAI;AAAA;;;;qBAIUnF;AAAAA;YACY,SAAA,MAAAv4B,EAAA,eAAAD,EAAA,IAAAy9B,EAAC,EAAC,KAAK;AAAA,YACvB,aAAA,CAAAxtC,kCAAqB,WAAWA,EAAC,KAAA+P,EAAA,IAAKy9B,EAAC,EAAC,KAAK;AAAA;oBAjB7DxZ,EAAG;0BAAHA,IAAG,GAAA,2BAAA,MAAA/kB,GAAA;AAAA,YAEsB,qBAAA29B,GAAI,EAAC;AAAA,YACP,mBAAAA,GAAI,EAAC;AAAA,oCACAU,GAAU;AAAA,cAGhBv9B,EAAA,SAAAiZ,IAAA4jB,GAAI,EAAC,GAAG;AAAA,yBAP9B5Y,EAAG;AAAA,kBAFL7M,EAAG,GAAHpX,EAAA,gBAAA,MAAAA,EAAA,cAAAoX,kBAA+CkmB,GAAS,CAAA,CAAA,eAAxDlmB,EAAG;AAAA;AAnBJ,QAAAoN,aARDpO,EAAG;WAQFoO,IAAG,IAAA,MAAAxkB,EAAA,IACI+4B,CAAa,GAAA/4B,EAAA,OAAA,CAAAub,GAAIlgB,OAAK;UAC3BqpB,KAAGrN,GAAA,gBAAHqN,IAAG,EAAA;cAAHA,EAAG,GAAmB1kB,EAAA,gBAAA,MAAAA,EAAA,SAAAopB,IAAAppB,EAAA,IAAA3E,EAAK,EAAC,KAAK,CAAA,eAAjCqpB,EAAG;AAAA,gBAFLF,EAAG;AAKH,QAAAY,eALAZ,IAAG,CAAA,GAMFgB,aADDJ,EAAG;;qBACFI,EAAG;AAMM,IAAA4X,EAAgBjmB,IAAA,MAAAnX,EAAA,IAACu6B,CAAgB,GAAA,MAAE,MAAM;;AACzC,IAAA6C,EAAgBxQ,IAAA,MAAA5sB,EAAA,IAACs6B,CAAY,GAAA,MAAAt6B,EAAA,IAAE84B,CAAU,CAAA;;AACzC,IAAAsE,EAAgBrU,IAAA,MAAA/oB,EAAA,IAACw6B,CAAgB,GAAA,MAAE,MAAM,WARlDhV,EAAG,WADJJ,EAAG,WAbJhP,EAAG,eAAHA,IAAG,CAAAiO,MAAArkB,EAAA,IAEQs7B,IAAkBjX,CAAA,GAAA,MAAArkB,EAAA,IAAlBs7B,EAAkB,CAAA;sBAY3B9V,IAAG,GAAA,8BAAA,MAAA5H,GAAA;AAAA,sCAEyBqd,EAAS;AAAA,uCACRE,EAAU;AAAA,2BAHvC3V,IAAG,IAAArP,IAAA;AAAA,yDAI4C+kB,EAAW,KAAA,EAAA;AAAA;;;AAwC5D,MAAA0C,eA1DAxnB,IAAG,CAAA;;UAqFOynB,IAAa,CAAAtiB,GAAC8hB,KAASr9B,EAAA,MAAEs9B,KAASt9B,EAAA,SAAA;UAC1C89B,KAAGrgB,GAAA;AAAH,MAAAzd,EAAA,KAAA89B,QACOT,IAAS,CAAIR,OAAI,GAAKA,GAAK,IAAI,IAAIA,GAAK,iBAAiB,MAAM,GAAG,SAArDA,OAAI;AACf,cAAAkB,2BAAYlB,EAAI,EAAC,cAAc,SAAS,CAAC,GACzCmB,KAAUh+B,EAAA,QAAA,MAAAA,EAAA,IAAG68B,EAAI,EAAC,eAASJ,CAAY,CAAA;YAC9CtgB,KAAMf,GAAA;;AAqBL,YAAA9E,YArBD6F,EAAM,gBAqBL7F,GAAI,EAAA;gBAAJA,CAAI,WArBL6F,EAAM;0BAANA,IAAM,GAAA,4BAAA,MAAA6R,GAAA;AAAA,YAGoB,sBAAAhuB,EAAA,IAAA68B,EAAI,EAAC;AAAA,yCACJmB,EAAU;AAAA,2CACRD,EAAS;AAAA,cALtC5hB,qBAaW4hB,EAAS,mBAbpB5hB,IAAM,YAAAnc,EAAA,IAcI08B,CAAW,MAAA18B,EAAA,IAAK68B,EAAI,EAAC,OAAO,IAAC,EAAK,mBAd5C1gB,IAAM,kBAAAnc,EAAA,IAeU68B,EAAI,EAAC,IAAI,GAfzB78B,EAAA,cAAAmc,IAAM,cAAA,GAAAnc,EAAA,IAgBO68B,EAAI,EAAC,mBAAMkB,EAAS,IACzB,KAAA/9B,EAAA,IAAA68B,EAAI,EAAC,cAAc,MAAM,eAASA,EAAI,EAAC,cAAc,WAAW,IAAI,KAAK,GAAG,KACjF,EAAE,EAAA,GAlBL78B,EAAA,cAAAmc,0BAmBc6hB,EAAU,CAAA,GAEAh+B,EAAA,SAAAgkB,IAAAhkB,EAAA,IAAA68B,EAAI,EAAC,GAAG;AAAA,iCArBhC1gB,IAAM,YAAA8hB,IAAA;iBAMGF,EAAS,UACT;kBACNtB,GAAYz8B,EAAA,IAAG68B,EAAI,EAAC,MAAI,EAAA,SACxBH,GAAW18B,EAAA,IAAG68B,EAAI,EAAC,MAAI,EAAA,qBACP,MAAI78B,EAAA,IAAE68B,EAAI,EAAC,MAAM,QAAM78B,EAAA,IAAE68B,EAAI,EAAC,cAAa,CAAA;AAAA,UAC5D,IACC,SAAS,MAAA,MAAAoB,EAAA;AAAA,yBAZZ9hB,EAAM;AAAA,kBAJR2hB,EAAG,GAAH99B,EAAA,gBAAA,MAAAA,EAAA,cAAA89B,kBAA8CR,GAAS,CAAA,CAAA,eAAvDQ,EAAG;AAAA;AAnBJ,QAAAI,aATDN,EAAG;WASFM,IAAG,IAAA,MAAAl+B,EAAA,IACI+4B,CAAa,GAAA/4B,EAAA,OAAA,CAAAub,GAAIlgB,OAAK;UAC3B8iC,KAAG9mB,GAAA,gBAAH8mB,IAAG,EAAA;cAAHA,EAAG,GAAmBn+B,EAAA,gBAAA,MAAAA,EAAA,SAAAipB,IAAAjpB,EAAA,IAAA3E,EAAK,EAAC,MAAM,CAAA,eAAlC8iC,EAAG;AAAA,gBAFLD,EAAG;AAKH,QAAAE,eALAF,IAAG,CAAA,GAMFG,aADDD,EAAG;;qBACFC,EAAG;AAMM,IAAAR,EAAa7U,IAAA,MAAAhpB,EAAA,IAACo6B,CAAS,GAAA,MAAE,MAAM;;AAC/B,IAAAyD,EAAaS,IAAA,MAAAt+B,EAAA,IAACm6B,CAAK,GAAA,MAAAn6B,EAAA,IAAE84B,CAAU,CAAA;;AAC/B,IAAA+E,EAAa7f,IAAA,MAAAhe,EAAA,IAACq6B,CAAS,GAAA,MAAE,MAAM,WARxCgE,EAAG,WADJD,EAAG;AA6CH,QAAAG,eA7CAH,IAAG,CAAA,gBA6CHG,EAAG;;;AAED,QAAAC,GAAIjjB,GAAA;AAAA;;;;;uCACG4hB,CAAc,GAAA,CAAIM,OAAGA,GAAE,MAAM,SAAO,CAAAliB,IAAlBkiB,OAAC;;AACd,sBAAA,EAAA,YAAAnF,MAAeoF,OAAQtF,GAAgBp4B,EAAA,IAACy9B,EAAC,GAAE5kB,GAAM;AAAjD,uBAAA,EAAA,YAAAyf,GAAe,MAAAoF,GAAI;AAAA;kBAC7Be,KAAEphB,GAAA,eAAFohB,EAAE;AACD,cAAAd,qCACI,MAAI;AAAA;;;;yBAIUnF;AAAAA;gBACY,SAAA,MAAAv4B,EAAA,eAAAD,EAAA,IAAAy9B,EAAC,EAAC,KAAK;AAAA,gBACvB,aAAA,CAAAxtC,iCAAqB,WAAWA,CAAC,KAAA+P,EAAA,IAAKy9B,EAAC,EAAC,KAAK;AAAA,2BAR5DgB,EAAE,gBAAFA,EAAE;AAAA;;;;;;cAJDtB,CAAc,EAAC,SAAS,KAAC5mB,EAAAC,EAAA;AAAA;;YAD9B+nB,EAAG,WA3DJX,EAAG,eAAHA,IAAG,CAAAvZ,MAAArkB,EAAA,IAEQu7B,GAAiBlX,CAAA,GAAA,MAAArkB,EAAA,IAAjBu7B,CAAiB,CAAA;sBAa1B8C,IAAG,GAAA,8BAAA,MAAAK,GAAA;AAAA,sCAEyBzD,EAAS;AAAA,uCACRE,EAAU;AAAA,2BAHvCkD,IAAG,IAAAM,IAAA;AAAA,yDAI4CzD,EAAW,KAAA,EAAA;AAAA;;;AA7E5D,SAAAl7B,EAAA,UAAA,cAAAoW,IAGc2lB,IAAgB,QAAA,EAAA,GAH9B/7B,EAAA,UAAA,aAAAoW,IAIa4lB,IAAe,QAAA,EAAA,GAJ5Bh8B,EAAA,UAAA,YAAAoW,IAKYkmB,CAAc,GAL1Bt8B,EAAA,MAAA,eAAAoW,IAMekmB,CAAc,GAoD7Bt8B,EAAA,UAAA,cAAA49B,IAGc7B,IAAgB,QAAA,EAAA,GAH9B/7B,EAAA,UAAA,aAAA49B,IAIa5B,IAAe,QAAA,EAAA,GAJ5Bh8B,EAAA,UAAA,YAAA49B,IAKYtB,CAAc,GAL1Bt8B,EAAA,MAAA,eAAA49B,IAMetB,CAAc,GAN7Bt8B,EAAA,UAAA,WAAA49B,IAOWjB,CAAiB;AAvErB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCzZR;;;;AACS,MAAI58B,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;oBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;qBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;oBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;oBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;oBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;oBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;oBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;oBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;oBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;qBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;oBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;oBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;qBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;qBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;qBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;qBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;oBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;oBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;oBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;oBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;qBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;qBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;oBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;qBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;qBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCXR;;;;AACS,MAAIJ,yBAAO,EAAE,GAETwqB,0BAAQ,MAAS;;;;AAEzB,MAAAvqB,EAAA,IAAAkrB,GAAQC,EAAW,YAAY,KAAAA,EAAa,iBAAiB,KAAKZ,GAAK;AAAA;;UACvEa,GAAU;AAAA,MACX,eAAaprB,EAAA,IAAEkrB,CAAQ,IAAG,SAAY;AAAA,MACtC,MAAIlrB,EAAA,IAAEkrB,CAAQ,IAAG,QAAQ;AAAA,MACzB,WAAW,OAAMC,EAAS,cAAiB,IAAI,KAAO;AAAA;;MAIzDhrB,IAAEkW,GAAA;qBAAFlW,GAAE,OAAA;AAAA;;;;WAKMJ,EAAI;AAAA,YACHA,EAAI;AAAA,aACRqrB,CAAU;AAAA,OACVC;AAAA;kBARLlrB,CAAE;;;UASWmrB,IAAKlrB,GAAA,eAALkrB,GAAK,EAAA;cAALA,CAAK,yCAAEf,EAAK,CAAA,CAAA,eAAZe,CAAK;AAAA;;MAAZf,EAAK,KAAAhU,EAAAC,CAAA;AAAA;;qBATXrW,CAAE,eAAFA,CAAE;AAFK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCVR;;AAWE,MAAIy+B,IACS5+B,EAAA,KAAAC,GAAA,eAAA,IAAA,MAAA,EAAA,GACX4+B,iCAAe,EAAE,GACjBC,IAAY9+B,EAAA,KAAAC,GAAA,gBAAA,GAAA,MAAS;AAAA,EAAC,CAAC,GACvB8+B,IAAQ/+B,EAAA,KAAAC,GAAA,YAAA,GAAA,MAAS;AAAA,EAAC,CAAC,GACnB4Y,IAAM7Y,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,CAAA,EAAA,GAGJ++B,IAAeh/B,EAAA,MAAO,EAAK,GAC3Bi/B,IAAcj/B,EAAA,MAAO,IAAI;AAE7B,WAASk/B,IAAiB;AACxB,IAAAl/B,EAAA,IAAAg/B,UAAgBA,CAAY,CAAA;AAAA,EAC9B;AAEA,WAASG,EAAWC,GAAQ;AAC1B,IAAAN,EAAY,EAACM,CAAM,GACnBp/B,EAAA,IAAAg/B,GAAe,EAAK;AAAA,EACtB;AAMA,WAASK,EAAmBnnB,GAAO;AACjC,IAAElY,EAAA,IAAEi/B,CAAW,KAAA,CAAAj/B,EAAA,IAAKi/B,CAAW,EAAC,SAAS/mB,EAAM,MAAM,KACnDlY,EAAA,IAAAg/B,GAAe,EAAK;AAAA,EAExB;AAGA,MAAIM,IAAat/B,EAAA,QAAA,MACf4+B,EAAW,EAAC,MAAKW,MAAOA,EAAI,OAAOV,EAAY,CAAA,GAAG,QAAQ,UAAU;MAMvEzoB,IAAGqH,GAAA;6BAFoB4hB,CAAkB;AAIvC,MAAAjoB,YAFFhB,CAAG,eAEDgB,CAAG;;4BAIayB,EAAM,EAAC,qBAAqB,mBAAmB;AAH7D,IAAA2mB,GAAK9+B,GAAA;AAAA;;;;;;;kBAMQ;AAAA,sBACI;AAAA;;eAEfq+B,EAAQ;AAAA;;;AAER,UAAAU,gCAA6B,IAAE;AAAA;;;;UAZnCroB,CAAG;oBAAHA,GAAG,CAAA;;;UAkBD6M,IAAG7I,GAAA,eAAH6I,CAAG;AACD,MAAA/F,GAAM0O,GAAA;AAAA;;iBAGIsS;AAAA;;wBAGR5oB,IAAItW,EAAA,YAAA0/B,CAAA,eAAJppB,GAAI,EAAA;kBAAJA,CAAI;4BAAJA,GAAI,CAAA;AACJ,UAAAqpB,GAAW5W,GAAA,EAAA,OAAA,wBAAA,CAAA,+CADuBuW,CAAa,CAAA,CAAA;;;;;;;cAK/Clb,IAAG/M,GAAA;iBAAH+M,GAAG,IAGKwa,GAAW5+B,EAAA,OAAA,CAAAub,GAAI6jB,MAAM;gBACzBjjB,IAAM9F,GAAA;;6BAAN8F,GAAM,EAAA;oBAANA,CAAM;8BAANA,GAAM,GAAA,gGAAA,MAAAjd,GAAA;AAAA,yCAGkBkgC,CAAM,EAAC,OAAOP,EAAY;AAAA,qCAC9BO,CAAM,EAAC,OAAOP,EAAY;AAAA,kBAG5C7+B,EAAA,SAAAopB,IAAAppB,EAAA,IAAAo/B,CAAM,EAAC,IAAI;AAAA,qCAPbjjB,GAAM,MAKUgjB,EAAUn/B,EAAA,IAACo/B,CAAM,CAAA,CAAA,eALjCjjB,CAAM;AAAA,sBAJViI,CAAG,eAAHA,CAAG;AAAA;;gBADD4a,CAAY,KAAAzoB,EAAAC,CAAA;AAAA;;cAXlByN,CAAG,eAAHA,GAAG,CAAAI,MAAArkB,EAAA,IAAsCi/B,GAAW5a,CAAA,GAAA,MAAArkB,EAAA,IAAXi/B,CAAW,CAAA,eAApDhb,CAAG;AAAA;;MADD2a,EAAW,EAAC,SAAS,KAACroB,EAAAe,CAAA;AAAA;;UAnB5BlB,CAAG,eAAHA,CAAG;AAJI;;AC5BD,SAASwpB,GAAgCpJ,GAAgBpC,GAAiC;AAChG,QAAM9vB,KAAckyB,KAAU,IAAI,cAAc,QAAQ,QAAQ,GAAG;AAEnE,MAAIrc;AAEJ,UAAQ7V,GAAA;AAAA,IACP,KAAK;AACJ,MAAA6V,IAAS;AACT;AAAA,IACD,KAAK;AAAA,IACL,KAAK;AACJ,MAAAA,IAAS;AACT;AAAA,IACD,KAAK;AAAA,IACL,KAAK;AACJ,MAAAA,IAAS;AACT;AAAA,IACD,KAAK;AAAA,IACL,KAAK;AACJ,MAAAA,IAAS;AACT;AAAA,IACD,KAAK;AAAA,IACL,KAAK;AACJ,MAAAA,IAAS;AACT;AAAA,IACD;AACC,MAAAA,IAAS;AACT;AAAA,EAAA;AAIF,SAAIia,KAAaja,MAAW,YACpB,aAGDA;AACR;AAQO,SAAS0lB,GAAoBC,GAAsC;AACzE,SAAK,MAAM,QAAQA,CAAc,IAE1BA,EACL,OAAO,CAAC5nB,MAAU,CAAC,CAACA,EAAM,EAAE,EAC5B,IAAI,CAACA,OAAW;AAAA,IAChB,SAASA,EAAM;AAAA,IACf,MAAMA,EAAM;AAAA,IACZ,MAAMA,EAAM;AAAA,IACZ,eAAeA,EAAM,iBAAiB;AAAA,IACtC,aAAaA,EAAM,eAAe;AAAA,IAClC,UAAUA,EAAM;AAAA,IAChB,QAAQ0nB,GAAgC1nB,EAAM,QAAQA,EAAM,aAAa,EAAK;AAAA,IAC9E,eAAeA,EAAM,iBAAiB;AAAA,IACtC,kBAAkBA,EAAM;AAAA,IACxB,cAAcA,EAAM;AAAA,IACpB,aAAaA,EAAM,eAAe;AAAA,IAClC,UAAUA,EAAM,YAAYA,EAAM,YAAY;AAAA,IAC9C,MAAMA,EAAM,QAAQ;AAAA,IACpB,WAAWA,EAAM,aAAa;AAAA,IAC9B,cAAcA,EAAM,gBAAgB;AAAA,EAAA,EACnC,IApBwC,CAAA;AAqB5C;;kBCpFA;;AA8BC,MAAI8Z,IACGhyB,EAAA,KAAAC,GAAA,UAAA,IAAA,MAAA,EAAA,GAEN4Y,IAAM7Y,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,CAAA,EAAA,GACN8/B,mCAAiB,EAAI,GACrBC,qCAAmB,EAAI;AAUxB,WAASC,EAAWrhC,GAAgB;AACnC,SAAKA,GAAG,cAAe,QAAM,EAAG,OAAO,IAAI,KAAK,IAAI,SAAS,GAAE;AAC/D,UAAMsgB,IAAI0Y,GAAah5B,EAAE,eAAeA,EAAE,QAAQ;AAClD,WAAM;AAAA,MACL,OAAOsgB,EAAE,MAAM,YAAW;AAAA,MAC1B,KAAK,OAAOA,EAAE,IAAI,EAAE,SAAS,GAAG,GAAG;AAAA,MACnC,SAASA,EAAE,IAAI,YAAW;AAAA;EAE5B;AAIA,MAAIghB,oBAA+C;AAClD,UAAMC,IAAUH,EAAgB,IAAG9I,GAAqBlF,EAAM,KAAIA,EAAM,GAClEqG,IAAUrC,GAAoBmK,CAAO,GACrCC,IAAS,oBAAI,IAAG;AACtB,eAAW3C,KAAKpF,GAAS;AACxB,YAAMjhC,IAAIqmC,EAAE,MAAM;AAClB,MAAK2C,EAAO,IAAIhpC,CAAC,KAAGgpC,EAAO,IAAIhpC,GAAC,EAAA,GAChCgpC,EAAO,IAAIhpC,CAAC,EAAG,KAAKqmC,CAAC;AAAA,IACtB;AACA,WAAM,CAAA,GAAK2C,EAAO,QAAO,GACvB,KAAI,CAAA,CAAGjlB,CAAC,GAAA,CAAIib,CAAC,MAAMjb,EAAE,cAAcib,CAAC,CAAA,EACpC,IAAG,CAAA,CAAGvxB,GAAMw7B,CAAK,OAAA,EACjB,MAAAx7B,GACA,MAAMo7B,EAAWI,EAAM,CAAC,EAAE,KAAK,GAC/B,OAAAA,EAAK,EAAA;AAAA,EAER,CAAC;MAGDjqB,IAAGgF,GAAA,GACFklB,YADDlqB,CAAG;;SACFkqB,GAAE,IAAA,MAAAtgC,EAAA,IACKkgC,CAAa,GAAA,CAAI5tC,MAAOA,EAAM,MAAI,CAAAipB,GAAjBjpB,MAAK;QAC3BmsC,IAAEpoB,GAAA,eAAFooB,CAAE;;;YAEArnB,IAAGhX,GAAA,GACFkW,YADDc,CAAG,eACFd,GAAI,EAAA;gBAAJA,CAAI;AACJ,YAAA+E,cADA/E,GAAI,CAAA,eACJ+E,GAAI,EAAA;gBAAJA,CAAI;AACJ,YAAAM,cADAN,GAAI,CAAA,eACJM,GAAI,EAAA;gBAAJA,CAAI,WAHLvE,CAAG;8BAC6B9kB,CAAK,EAAC,KAAK,KAAK,uBAClBA,CAAK,EAAC,KAAK,GAAG,uBACVA,CAAK,EAAC,KAAK,OAAO;AAAA,wBAHpD8kB,CAAG;AAAA;;QADA2oB,EAAc,KAAAxpB,EAAAC,CAAA;AAAA;;QAOlByN,IAAGjkB,EAAA,QAAAU,GAAA,CAAA;AAAH,IAAAV,EAAA,KAAAikB,GAAG,IAAA,MAAAjkB,EAAA,IACI1N,CAAK,EAAC,OAAK,CAAImrC,MAAGA,EAAE,MAAM,aAAXA,MAAC;;AACX,cAAA,EAAA,YAAAnF,MAAeoF,MAAQtF,GAAgBp4B,EAAA,IAACy9B,CAAC,GAAE5kB,GAAM;AAAjD,eAAA,EAAA,YAAAyf,GAAe,MAAAoF,EAAI;AAAA;AAC7B,MAAAC,oCACI,MAAI;AAAA;;;;QAKsB,SAAA,MAAA19B,EAAA,eAAAD,EAAA,IAAAy9B,CAAC,EAAC,KAAK;AAAA,QACvB,aAAA,CAAAxtC,gCAAqB,WAAWA,CAAC,KAAA+P,EAAA,IAAKy9B,CAAC,EAAC,KAAK;AAAA;gBAV7DxZ,CAAG,WARJwa,CAAE,eAAFA,CAAE;AAAA,cAFJ6B,CAAE;oBAAFA,GAAE,CAAA;;;UA6BDlc,IAAG/M,GAAA,eAAH+M,GAAG,EAAA;cAAHA,CAAG,yCACFvL,EAAM,EAAC,oBAAoB,yBAAyB,CAAA,eADrDuL,CAAG;AAAA;;YADA8b,CAAa,EAAC,WAAW,KAAC3pB,EAAAe,CAAA;AAAA;;UA7B/BlB,CAAG,GACFpW,EAAA,gBAAA,MAAAd,IAAAc,EAAA,UAAAsgC,gEAA4CP,EAAc,EAAA,CAAA,CAAA,eAD3D3pB,CAAG;AAFI;;kBC1ER;;AA0BC,MAAI4b,IACGhyB,EAAA,KAAAC,GAAA,UAAA,IAAA,MAAA,EAAA,GACNsgC,iCAAe,EAAE,GACjBC,kCAAgB,EAAE,GAElB3nB,IAAM7Y,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,CAAA,EAAA,GAIHwgC,IAAiBzgC,EAAA,MAAMA,EAAA,MAACugC,EAAY,CAAA,CAAA,GACpCG,IAAkB1gC,EAAA,MAA8B,IAAI,GACpD2gC,GAGAC,IAAY5gC,EAAA,QAAA,MAAYk3B,GAAqBlF,EAAM,CAAA,CAAA,GACnD6O,IAA6B7gC,EAAA,QAAA,MAAYg2B,GAAmBh2B,EAAA,IAAC4gC,CAAY,CAAA,CAAA,GACzEE,0BAA2BD,CAAa,EAAC,MAAM,SAAGJ,CAAc,CAAA,CAAA,GAChEM,IAAO/gC,EAAA,QAAA,MAAAA,EAAA,IAAYygC,CAAc,IAAAzgC,EAAA,IAAG6gC,CAAa,EAAC,MAAM;AAE5D,WAASG,IAAW;UACnBP,GAAczgC,EAAA,IAAdygC,CAAc,IAAID,GAAa;AAAA,EAChC;AAEA,EAAAS,SAAc;AACb,IAAAN,IAAW,IAAI;AAAA,MACb,CAAAztC,MAAY;AACZ,QAAIA,EAAQ,CAAC,EAAE,kBAAc8M,EAAA,IAAI+gC,CAAO,KACvCC,EAAQ;AAAA,MAEV;AAAA,MACE,EAAA,YAAY,QAAO;AAAA,OAGpBhhC,EAAA,IAAE0gC,CAAe,KAClBC,EAAS,QAAO3gC,EAAA,IAAC0gC,CAAe,CAAA;AAAA,EAElC,CAAC,GAEDld,SAAgB;AACf,IAAImd,KACHA,EAAS,WAAU;AAAA,EAErB,CAAC,GAGD3gC,EAAA,kBAAc;AACb,IAAI2gC,KAAQ3gC,EAAA,IAAI0gC,CAAe,MAC9BC,EAAS,WAAU,GACnBA,EAAS,QAAO3gC,EAAA,IAAC0gC,CAAe,CAAA;AAAA,EAElC,CAAC;MAGDQ,IAAO7pB,GAAA,GACNyR,YADDoY,CAAO,eACNpY,GAAE,EAAA;UAAFA,CAAE;AACF,MAAAwX,cADAxX,GAAE,CAAA;SACFwX,GAAE,IAAA,MAAAtgC,EAAA,IACK8gC,CAAe,GAAA,CAAIzI,MAASA,EAAQ,MAAM,SAAO,CAAA9c,GAA9B8c,MAAO;;AACrB,YAAA,EAAA,YAAAC,MAAeoF,MAAQtF,GAAgBp4B,EAAA,IAACq4B,CAAO,GAAExf,GAAM;AAAvD,aAAA,EAAA,YAAAyf,GAAe,MAAAoF,EAAI;AAAA;QAC7Be,IAAEr+B,GAAA,eAAFq+B,CAAE;AACD,IAAAd,oCACI,MAAI;AAAA;;MAGsB,SAAA,MAAA19B,EAAA,eAAAD,EAAA,IAAAq4B,CAAO,EAAC,KAAK;AAAA,MAC7B,aAAA,CAAApoC,gCAAqB,WAAWA,CAAC,KAAA+P,EAAA,IAAKq4B,CAAO,EAAC,KAAK;AAAA,iBANlEoG,CAAE,eAAFA,CAAE;AAAA,cAHJ6B,CAAE;oBAAFA,GAAE,CAAA;;;UAiBDlqB,IAAGC,GAAA,GACFC,YADDF,CAAG,eACFE,GAAI,EAAA;cAAJA,CAAI,WADLF,CAAG,eAAHA,GAAG,CAAAiO,MAAArkB,EAAA,IAAY0gC,GAAerc,CAAA,GAAA,MAAArkB,EAAA,IAAf0gC,CAAe,CAAA,yCACF7nB,EAAM,EAAC,qBAAqB,wBAAwB,CAAA,eADhFzC,CAAG;AAAA;;YADA2qB,CAAO,KAAAxqB,EAAAC,CAAA;AAAA;;UAlBZ0qB,CAAO;AAAP,IAAAlhC,EAAA,cAAAkhC,GAAO,cAAkCroB,EAAM,EAAC,iBAAiB,gBAAgB,iBAC5DA,EAAM,EAAC,kBAAkB,iBAAiB;AAAA,kBAD/DqoB,CAAO;AAFA;;kBC5ER;;AAmBC,MAAIlP,IAAQhyB,EAAA,KAAAC,GAAA,UAAA,IAAA,MAAA,EAAA,GAAqB4Y,IAAM7Y,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,CAAA,EAAA,GAEnCkhC,IAAkBnhC,EAAA,MAA8B,IAAI,GACpDohC,IAAgBphC,EAAA,MAAO,EAAK,GAC5BqhC,IAAiBrhC,EAAA,MAAO,EAAK,GAC7BshC,IAAathC,EAAA,MAAO,EAAK,GAGzB4gC,IAAY5gC,EAAA,QAAA,MAAYk3B,GAAqBlF,EAAM,CAAA,CAAA,GACnD6O,IAAa7gC,EAAA,QAAA,MAAYg2B,GAAmBh2B,EAAA,IAAC4gC,CAAY,CAAA,CAAA;AAE7D,WAASW,IAAoB;AAC5B,QAAE,CAAAvhC,EAAA,IAAGmhC,CAAe,EAAE;AACtB,UAAM,EAAE,YAAAK,GAAY,aAAAC,GAAa,aAAAC,EAAW,UAAKP,CAAe;UAChEC,GAAgBI,IAAa,CAAC,GAC9BxhC,EAAA,IAAAqhC,GAAiBG,IAAaE,IAAcD,IAAc,CAAC,GAC3DzhC,EAAA,IAAAshC,GAAaG,IAAcC,IAAc,CAAC;AAAA,EAC3C;AAEA,WAASC,EAAajG,GAAmB;AACxC,QAAE,CAAA17B,EAAA,IAAGmhC,CAAe,EAAE;AACtB,UAAMS,IAAS5hC,EAAA,IAAGmhC,CAAe,EAAC,cAAc,gBAAgB;AAChE,QAAE,CAAGS,EAAW;AAChB,UAAMC,IAAYD,EAAU,cAAc;UAC1CT,CAAe,EAAC,SAAQ,EAAG,MAAMzF,IAAYmG,GAAW,UAAU,UAAQ;AAAA,EAC3E;AAEA,EAAAZ,SAAc;AACb,IAAAM,EAAiB;AACjB,UAAMZ,IAAW,IAAI,qBAAqBY,EAAiB,CAAA;AAC3D,WAAEvhC,EAAA,IAAEmhC,CAAe,KAClBR,EAAS,QAAO3gC,EAAA,IAACmhC,CAAe,CAAA,GAE3B,MAAOR,EAAS,WAAU;AAAA,EACjC,CAAC;MAGDO,IAAO9lB,GAAA,GACN0N,YADDoY,CAAO,eACNpY,GAAE,EAAA;UAAFA,CAAE;AAEF,MAAA1S,cAFA0S,GAAE,CAAA,eAEF1S,CAAG;;;UAGD+F,IAAM/b,GAAA;AAAN,MAAAJ,EAAA,gBAAA,MAAAA,EAAA,cAAAmc,GAAM,cAGMtD,EAAM,EAAC,cAAc,aAAa,CAAA,wBAH9CsD,GAAM,MAESwlB,EAAY,EAAG,CAAA,eAF9BxlB,CAAM;AAAA;;AADH,MAAAnc,EAAA,IAAAshC,CAAU,WAAIF,CAAa,KAAA7qB,EAAAC,CAAA;AAAA;;MAW/BY,IAAGpX,EAAA,QAAAU,GAAA,CAAA;SAAH0W,GAAG,IAAA,MAAApX,EAAA,IAMI6gC,CAAa,GAAA,CAAIxI,MAASA,EAAQ,MAAM,SAAO,CAAA9c,GAA9B8c,MAAO;;AACnB,YAAA,EAAA,YAAAC,MAAeoF,MAAQtF,GAAgBp4B,EAAA,IAACq4B,CAAO,GAAExf,GAAM;AAAvD,aAAA,EAAA,YAAAyf,GAAe,MAAAoF,EAAI;AAAA;QAC7BzZ,IAAG5N,GAAA,eAAH4N,CAAG;AACF,IAAA0Z,oCACI,MAAI;AAAA;;MAGsB,SAAA,MAAA19B,EAAA,eAAAD,EAAA,IAAAq4B,CAAO,EAAC,KAAK;AAAA,MAC7B,aAAA,CAAApoC,gCAAqB,WAAWA,CAAC,KAAA+P,EAAA,IAAKq4B,CAAO,EAAC,KAAK;AAAA,iBANlEpU,CAAG,eAAHA,CAAG;AAAA,cARL7M,CAAG,eAAHA,GAAG,CAAAiN,MAAArkB,EAAA,IAEQmhC,GAAe9c,CAAA,GAAA,MAAArkB,EAAA,IAAfmhC,CAAe,CAAA;oBAF1B/pB,GAAG,CAAA;;;UAsBFwN,IAAMvN,GAAA;AAAN,MAAArX,EAAA,gBAAA,MAAAA,EAAA,cAAA4kB,GAAM,cAGM/L,EAAM,EAAC,eAAe,cAAc,CAAA,wBAHhD+L,GAAM,MAES+c,EAAa,CAAC,CAAA,eAF7B/c,CAAM;AAAA;;AADH,MAAA5kB,EAAA,IAAAshC,CAAU,WAAID,CAAc,KAAA9qB,EAAAe,CAAA;AAAA;;UAlCjClB,CAAG,WAHJ8qB,CAAO;AAAP,IAAAlhC,EAAA,cAAAkhC,GAAO,cAAmCroB,EAAM,EAAC,kBAAkB,iBAAiB,iBAC/DA,EAAM,EAAC,kBAAkB,iBAAiB;AAAA,MAe7D7Y,EAAA,MAAA,UAAAoX,GAGUmqB,CAAiB,eAnB7BL,CAAO;AAFA;;;kBCvDR;;AAmBC,MAAIlP,IAAQhyB,EAAA,KAAAC,GAAA,UAAA,IAAA,MAAA,EAAA,GAAmC4Y,IAAM7Y,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,CAAA,EAAA,GAGjD2gC,IAAY5gC,EAAA,QAAA,MAAYk3B,GAAqBlF,EAAM,CAAA,CAAA,GACnD6O,IAAa7gC,EAAA,QAAA,MAAYg2B,GAAmBh2B,EAAA,IAAC4gC,CAAY,CAAA,CAAA,GACzDkB,IAAW9hC,EAAA,QAAA,MAAAA,EAAA,IAAY6gC,CAAa,EAAC,SAAS,IAAC7gC,EAAA,IAAG6gC,CAAa,EAAC,CAAC,IAAI,IAAI;MAG7EK,IAAO7pB,GAAA,eAAP6pB,CAAO;;;;AAEK,cAAA,EAAA,YAAA5I,MAAeoF,MAAQtF,GAAgBp4B,EAAA,IAAC8hC,CAAW,GAAEjpB,GAAM;AAA3D,eAAA,EAAA,YAAAyf,GAAe,MAAAoF,EAAI;AAAA;UAC7BtnB,IAAGhW,GAAA,eAAHgW,CAAG;AACF,MAAAunB,oCACI,MAAI;AAAA;;;QAIsB,SAAA,MAAA19B,EAAA,eAAAD,EAAA,IAAA8hC,CAAW,EAAC,KAAK;AAAA,QACjC,aAAA,CAAA7xC,gCAAqB,WAAWA,CAAC,KAAA+P,EAAA,IAAK8hC,CAAW,EAAC,KAAK;AAAA,mBAPtE1rB,CAAG,eAAHA,CAAG;AAAA;UAWHgB,IAAGf,GAAA,GACF,YADDe,CAAG,eACF,GAAC,EAAA;cAAD,CAAC,WADFA,CAAG,yCACoByB,EAAM,EAAC,6BAA6B,+BAA+B,CAAA,eAD1FzB,CAAG;AAAA;;YAbA0qB,CAAW,IAAAvrB,EAAAC,CAAA,IAAAD,EAAAgB,GAAA,EAAA;AAAA;;UADhB2pB,CAAO,GAAPlhC,EAAA,gBAAA,MAAAA,EAAA,cAAAkhC,GAAO,cAAmCroB,EAAM,EAAC,iBAAiB,gBAAgB,CAAA,eAAlFqoB,CAAO;AAFA;;kBCnBR;;AACE,MAAMtnB,IAAI5Z,EAAA,KAAAC,GAAA,QAAA,GAAG,EAAE,GAAE4Y,IAAM7Y,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,CAAA,EAAA,GACnB8hC,IAAQ,IACRC,IAAa,IACbj5B,IAAU,GACV4C,IAAQ;MAGbyK,IAAG6rB,GAAA,yBAAH7rB,CAAG,GAAA,CAAA;;;oBASDgB,IAAGpX,EAAA,QAAAA,EAAA,YAAAgZ,CAAA,GAAA,CAAA;AAAH,MAAAhZ,EAAA,KAAAoX,GAAG,IAAA,MACK,MAAM2qB,CAAK,gBAAKG,MAAC;YACrBje,IAAG7jB,GAAA;oBAAH6jB,CAAG;AAAA,kBAFP7M,CAAG;;UAQHgN,IAAGhJ,GAAA,GAMDoJ,sBANFJ,CAAG,GAAA,CAAA,GAOCM,YADFF,CAAG;AACD,MAAAxkB,EAAA,KAAA0kB,GAAG,IAAA,MACK,MAAMsd,CAAU,gBAAKE,MAAC;YAC1B9c,IAAG/N,GAAA;oBAAH+N,CAAG;AAAA,kBAFPV,CAAG;AAKH,UAAAc,cALAd,GAAG,CAAA;AAKH,MAAA1kB,EAAA,KAAAwlB,GAAG,IAAA,MACK,MAAMwc,CAAU,gBAAKE,MAAC;YAC1BtE,IAAGvmB,GAAA;oBAAHumB,CAAG;AAAA,kBAFPpY,CAAG,WANLhB,CAAG,WANLJ,CAAG,eAAHA,CAAG;AAAA;UAoBH0Z,IAAGrgB,GAAA,GAEDygB,sBAFFJ,CAAG,GAAA,CAAA,GAGCK,YADFD,CAAG;AACD,MAAAl+B,EAAA,KAAAm+B,GAAG,IAAA,MACK,MAAM6D,CAAU,gBAAKE,MAAC;YAC1B9D,IAAG/mB,GAAA;oBAAH+mB,CAAG;AAAA,kBAFPD,CAAG;AAKH,UAAAE,cALAF,GAAG,CAAA;AAKH,MAAAn+B,EAAA,KAAAq+B,GAAG,IAAA,MACK,MAAM2D,CAAU,gBAAKE,MAAC;YAC1B3D,IAAGlnB,GAAA;oBAAHknB,CAAG;AAAA,kBAFPF,CAAG,WANLH,CAAG,WAFLJ,CAAG,eAAHA,CAAG;AAAA;UAgBHqE,IAAG/lB,GAAA,GACDgmB,YADFD,CAAG;AACD,MAAAniC,EAAA,KAAAoiC,GAAG,IAAA,MACK,MAAMr5B,CAAO,gBAAKm5B,MAAC;YACvBG,IAAGhlB,GAAA;oBAAHglB,CAAG;AAAA,kBAFPD,CAAG,WADLD,CAAG,eAAHA,CAAG;AAAA;UAUHG,IAAGlmB,GAAA,GACDmmB,YADFD,CAAG;AACD,MAAAtiC,EAAA,KAAAuiC,GAAG,IAAA,MACK,MAAM52B,CAAK,gBAAKu2B,MAAC;YACrBM,IAAGvd,GAAA;oBAAHud,CAAG;AAAA,kBAFPD,CAAG,WADLD,CAAG,eAAHA,CAAG;AAAA;UAWHG,IAAGzd,GAAA;AAAH,MAAAhlB,EAAA,KAAAyiC,GAAG,IAAA,MACK,MAAM,CAAC,gBAAKP,MAAC;YACjBQ,IAAGxd,GAAA;oBAAHwd,CAAG;AAAA,kBAFPD,CAAG,eAAHA,CAAG;AAAA;UAsBHE,IAAGle,GAAA;AAAH,MAAAzkB,EAAA,KAAA2iC,GAAG,IAAA,MACK,MAAM,CAAC,gBAAKT,MAAC;YACjBU,IAAGzd,GAAA;oBAAHyd,CAAG;AAAA,kBAFPD,CAAG,eAAHA,CAAG;AAAA;UAaHE,IAAGxd,GAAA;kBAAHwd,CAAG;AAAA;UAoCHC,IAAGrd,GAAA,yBAAHqd,CAAG,GAAA,CAAA;0BAUK,MAAM,CAAC,GAAA9iC,EAAA,OAAA,CAAAub,GAAK2mB,MAAC;YACjBa,IAAGrd,GAAA;oBAAHqd,CAAG;AAAA,6BAXPD,CAAG,eAAHA,CAAG;AAAA;UAsBHE,IAAGC,GAAA,GACDC,YADFF,CAAG,GAGCG,YAFFD,CAAG,yBAEDC,CAAG,GAAA,CAAA;0BAGK,MAAM,CAAC,GAAAnjC,EAAA,OAAA,CAAAub,GAAK2mB,MAAC;YACjBkB,IAAGtf,GAAA;oBAAHsf,CAAG;AAAA,6BAJPD,CAAG,sBAFLD,CAAG,WADLF,CAAG,eAAHA,CAAG;AAAA;UA6BHK,IAAGC,GAAA,GAEDC,YAFFF,CAAG,eAEDE,CAAG;0BAEK,MAAM,CAAC,GAAAvjC,EAAA,OAAA,CAAAub,GAAK2mB,MAAC;YACjBsB,IAAGC,GAAA;oBAAHD,CAAG;AAAA;;0BAGC,MAAM,EAAE,GAAAxjC,EAAA,OAAA,CAAAub,GAAK2mB,MAAC;YAClBwB,IAAGC,GAAA;oBAAHD,CAAG;AAAA,kBAPPH,CAAG,WAFLF,CAAG,eAAHA,CAAG;AAAA;;AA7LD,MAAAzpB,EAAI,MAAK,YAASrD,EAAAC,CAAA,IASboD,EAAI,MAAK,UAAOrD,EAAAe,GAAA,CAAA,IAoBhBsC,EAAI,MAAK,qBAgBTA,EAAI,MAAK,YAASrD,EAAAwH,GAAA,CAAA,IAUlBnE,EAAI,MAAK,WAAQrD,EAAAkF,GAAA,CAAA,IAUjB7B,EAAI,MAAK,SAAMrD,EAAAmF,GAAA,CAAA,IAsBf9B,EAAI,MAAK,YAASrD,EAAAyF,GAAA,CAAA,IAalBpC,EAAI,MAAK,oBAoCTA,EAAI,MAAK,YAASrD,EAAAsF,GAAA,CAAA,IAsBlBjC,EAAI,MAAK,aAAUrD,EAAAuF,GAAA,CAAA,IAAAvF,EAAAgB,GAAA,EAAA;AAAA;;UArK5BnB,CAAG,GAAHpW,EAAA,gBAAA,MAAAA,EAAA,cAAAoW,GAAG,cAGUyC,EAAM,EAAC,kBAAkB,iBAAiB,CAAA,eAHvDzC,CAAG;AAFI;ACAR,MAAMtW,KAASP,GAAa,IAAI,GAI1BqkC,KAAsC;AAAA,EAC1C,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,SAAS,CAACzzB,MAAiBrQ,GAAO,MAAM,cAAcqQ,CAAK;AAC7D;AAEA,IAAI0zB,KAAoC,EAAE,GAAGD,GAAA;AAEtC,SAASE,GAAalzC,GAAkC;AAC7D,EAAAizC,KAAe,EAAE,GAAGA,IAAc,GAAGjzC,EAAA;AACvC;AAEO,SAASmzC,KAAoC;AAClD,SAAO,EAAE,GAAGF,GAAA;AACd;AAEO,SAASG,KAA2B;AACzC,SAAO,GAAGH,GAAa,OAAO;AAChC;AAMO,SAASI,KAAyB;AACvC,SAAO,GAAGJ,GAAa,OAAO;AAChC;AAUA,MAAMK,KAAQ,CAACC,MACb,IAAI,QAAQ,CAACC,MAAY,WAAWA,GAASD,CAAE,CAAC;AAUlD,eAAeE,GACb1T,GACA2T,GACAC,GACmB;AACnB,QAAMC,KAAUF,EAAK,UAAU,OAAO,YAAA,GAEhCG,IADeD,MAAW,SAASA,MAAW,SACjBD,EAAI,UAAU,IAAI;AAErD,MAAIG;AACJ,WAASC,IAAU,GAAGA,KAAWF,GAAaE,KAAW;AACvD,UAAMC,IAAa,IAAI,gBAAA,GACjBC,IAAY,WAAW,MAAMD,EAAW,MAAA,GAASL,EAAI,OAAO,GAG5DO,IAAeR,EAAK;AAC1B,QAAIS;AACJ,IAAID,MACEA,EAAa,UAASF,EAAW,MAAA,KAEnCG,IAAgB,MAAMH,EAAW,MAAA,GACjCE,EAAa,iBAAiB,SAASC,GAAe,EAAE,MAAM,IAAM;AAIxE,QAAI;AAEF,YAAMC,IAAW,MAAM,MAAMrU,GAAK,EAAE,GAAG2T,GAAM,QAAQM,EAAW,QAAQ;AAGxE,UAAII,EAAS,UAAU,OAAOL,IAAUF;AACtC,QAAAC,IAAY,IAAI,MAAM,QAAQM,EAAS,MAAM,EAAE;AAAA;AAE/C,eAAOA;AAAA,IAEX,SAAS1a,GAAK;AAGZ,UAFAoa,IAAYpa,GAERwa,GAAc,QAAS,OAAMxa;AAAA,IACnC,UAAA;AACE,mBAAaua,CAAS,GAClBC,KAAgBC,KAClBD,EAAa,oBAAoB,SAASC,CAAa;AAAA,IAE3D;AAEA,IAAIJ,IAAUF,KACZ,MAAMP,GAAMK,EAAI,aAAa,KAAK,IAAI,GAAGI,IAAU,CAAC,CAAC;AAAA,EAEzD;AAEA,QAAMD;AACR;AAEA,eAAsBO,GACpBC,GACA1lC,GACyB;AACzB,SAAO2lC,GAAc,OAAOD,GAAU,QAAW1lC,CAAO;AAC1D;AAEA,eAAsB4lC,GACpBF,GACAG,GACA7lC,GACyB;AACzB,SAAO2lC,GAAc,QAAQD,GAAUG,GAAM7lC,CAAO;AACtD;AAUA,eAAsB8lC,GACpBJ,GACA1lC,GACyB;AACzB,SAAO2lC,GAAc,UAAUD,GAAU,QAAW1lC,CAAO;AAC7D;AAEA,eAAe2lC,GACbX,GACAU,GACAG,GACA7lC,GACyB;AACzB,QAAMmxB,IAAMuU,EAAS,WAAW,MAAM,IAClCA,IACA,GAAGlB,GAAA,CAAkB,GAAGkB,CAAQ;AAEpC,MAAI;AACF,UAAMF,IAAW,MAAMX;AAAA,MACrB1T;AAAA,MACA;AAAA,QACE,QAAA6T;AAAA,QACA,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,GAAGhlC,GAAS;AAAA,QAAA;AAAA,QAEd,MAAM6lC,MAAS,SAAY,KAAK,UAAUA,CAAI,IAAI;AAAA,QAClD,aAAa;AAAA,QACb,GAAG7lC;AAAA,MAAA;AAAA,MAELqkC;AAAA,IAAA;AAGF,QAAI,CAACmB,EAAS,IAAI;AAChB,YAAMO,IAAY,MAAMP,EAAS,KAAA,EAAO,MAAM,OAAO,CAAA,EAAG,GAClDplC,IACJ2lC,EAAU,SAASA,EAAU,WAAW,QAAQP,EAAS,MAAM;AACjE,aAAAnB,GAAa,QAAQ,IAAI,MAAMjkC,CAAO,CAAC,GAChC,EAAE,SAAS,IAAO,OAAOA,GAAS,YAAYolC,EAAS,OAAA;AAAA,IAChE;AAGA,WAAO,EAAE,SAAS,IAAM,MADX,MAAMA,EAAS,KAAA,GACa,YAAYA,EAAS,OAAA;AAAA,EAChE,SAAS70B,GAAO;AACd,UAAMq1B,IACJr1B,aAAiB,QACbA,EAAM,SAAS,eACb,sBACAA,EAAM,UACR;AAEN,WAAA0zB,GAAa;AAAA,MACX1zB,aAAiB,QAAQA,IAAQ,IAAI,MAAMq1B,CAAY;AAAA,IAAA,GAElD,EAAE,SAAS,IAAO,OAAOA,EAAA;AAAA,EAClC;AACF;AAMA,eAAsBC,GACpB9U,GACAnxB,GACmB;AACnB,MAAI;AACF,UAAMwlC,IAAW,MAAMX;AAAA,MACrB1T;AAAA,MACA,EAAE,aAAa,WAAW,GAAGnxB,EAAA;AAAA,MAC7BqkC;AAAA,IAAA;AAGF,QAAI,CAACmB,EAAS,IAAI;AAChB,YAAMO,IAAY,MAAMP,EAAS,KAAA,EAAO,MAAM,OAAO,CAAA,EAAG;AACxDllC,aAAAA,GAAO,MAAM,uBAAuBklC,EAAS,MAAM,IAAIO,CAAS,GACzD;AAAA,IACT;AAEA,WAAOP,EAAS,KAAA;AAAA,EAClB,SAAS70B,GAAO;AACdrQ,WAAAA,GAAO,MAAM,sBAAsBqQ,CAAK,GACjC;AAAA,EACT;AACF;ACzNA,MAAMrQ,KAASP,GAAa,IAAI;AA2BhC,eAAsBmmC,GACpBC,GACAC,GACAC,GACuC;AACvC,MAAI;AACF,UAAMC,IAAY,MAAMV;AAAA,MACtB,GAAGnB,GAAA,CAAgB,SAAS0B,CAAM;AAAA,MAClC;AAAA,QACE,mBAAmBC;AAAA,QACnB,GAAIC,KAAmB,OAAO,KAAKA,CAAe,EAAE,SAAS,IACzD,EAAE,iBAAAA,MACF,CAAA;AAAA,MAAC;AAAA,IACP;AAGF,QAAI,CAACC,EAAU;AACbhmC,YAAAA,GAAO,MAAM,mCAAmCgmC,EAAU,KAAK,GACzD,IAAIhkC,GAASgkC,EAAU,SAAS,mCAAmC,oCAAoC;AAG/GhmC,WAAAA,GAAO,MAAM,2BAA2BgmC,EAAU,IAAI,GAC/CA,EAAU;AAAA,EACnB,SAAS31B,GAAO;AACdrQ,WAAAA,GAAO,MAAM,8BAA8BqQ,CAAK,GACzC;AAAA,EACT;AACF;AAgFA,eAAsB41B,GACpBJ,GACAC,GACAC,GACkB;AAClB,MAAI;AAGF,UAAMG,IAA4C,CAAA;AAClD,eAAW,CAAC5uC,GAAGy5B,CAAC,KAAK,OAAO,QAAQ+U,CAAU,GAAG;AAC/C,YAAM7mC,IAAI,OAAO3H,KAAM,WAAWA,IAAI,SAASA,GAAG,EAAE;AACpD,MAAI,CAAC,OAAO,MAAM2H,CAAC,KAAK8xB,IAAI,MAAGmV,EAAkBjnC,CAAC,IAAI8xB;AAAA,IACxD;AACA,UAAMoV,IAA2C,CAAA,GAW3CjB,IAAW,MAAM,MAAM,GAAGf,IAAgB,SAAS0B,CAAM,IAAI;AAAA,MACjE,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAA;AAAA,MAC3B,aAAa;AAAA,MACb,MAAM,KAAK,UAAU;AAAA,QACnB,YAAYK;AAAA,QACZ,GAAI,OAAO,KAAKC,CAAgB,EAAE,SAAS,IACvC,EAAE,iBAAiBA,MACnB,CAAA;AAAA,MAAC,CACN;AAAA,IAAA,CACF;AACD,QAAI,CAACjB,EAAS,IAAI;AAChB,YAAMO,IAAY,MAAMP,EAAS,KAAA,EAAO,MAAM,OAAO,CAAA,EAAG;AACxDllC,aAAAA,GAAO,MAAM,uBAAuBylC,CAAS,GACtC;AAAA,IACT;AACA,WAAO;AAAA,EACT,SAASjb,GAAK;AACZxqB,WAAAA,GAAO,MAAM,+BAA+BwqB,CAAG,GACxC;AAAA,EACT;AACF;AA2HA,eAAsB4b,GACpBP,GACAzQ,GACyC;AACzC,MAAI;AACF,UAAM4Q,IAAY,MAAMV;AAAA,MACtB,GAAGnB,GAAA,CAAgB,0BAA0B0B,CAAM;AAAA,MACnDzQ;AAAA,IAAA;AAGF,QAAI,CAAC4Q,EAAU;AACbhmC,aAAAA,GAAO,MAAM,8BAA8BgmC,EAAU,KAAK,GACnD;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,OAAOA,EAAU,SAAS;AAAA,MAAA;AAI9B,UAAMl0C,IAASk0C,EAAU;AACzB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQl0C,EAAO,UAAU;AAAA,MACzB,WAAWA,EAAO,aAAaA,EAAO;AAAA,IAAA;AAAA,EAE1C,SAASue,GAAO;AACdrQ,WAAAA,GAAO,MAAM,gCAAgCqQ,CAAK,GAC3C;AAAA,EACT;AACF;AAUA,eAAsBg2B,GACpBC,GACgC;AAChC,MAAI;AACF,UAAMN,IAAY,MAAMV;AAAA,MACtB,GAAGpB,IAAkB;AAAA,MACrB,EAAE,WAAAoC,EAAA;AAAA,IAAU;AAGd,QAAI,CAACN,EAAU;AACb,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAOA,EAAU,SAAS;AAAA,QAC1B,YAAYA,EAAU;AAAA,MAAA;AAI1B,UAAMl0C,IAASk0C,EAAU;AACzB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,eAAel0C,EAAO;AAAA,MACtB,qBAAqBA,EAAO;AAAA,IAAA;AAAA,EAEhC,SAASue,GAAO;AACdrQ,WAAAA,GAAO,MAAM,qCAAqCqQ,CAAK,GAChD,EAAE,SAAS,IAAO,OAAO,kCAAA;AAAA,EAClC;AACF;AAUA,eAAsBk2B,GACpBD,GACwB;AACxB,MAAI;AACF,UAAMN,IAAY,MAAMb;AAAA,MACtB,GAAGjB,GAAA,CAAkB,mBAAmBoC,CAAS;AAAA,IAAA;AAGnD,QAAI,CAACN,EAAU;AACb,aAAO;AAAA,QACL,OAAOA,EAAU,SAAS;AAAA,QAC1B,UAAUA,EAAU,eAAe;AAAA,MAAA;AAIvC,UAAMl0C,IAASk0C,EAAU;AACzB,WAAO;AAAA,MACL,WAAWl0C,EAAO;AAAA,MAClB,gBAAgBA,EAAO;AAAA,MACvB,qBAAqBA,EAAO;AAAA,MAC5B,WAAWA,EAAO;AAAA,MAClB,kBAAkBA,EAAO;AAAA,IAAA;AAAA,EAE7B,SAASue,GAAO;AACdrQ,WAAAA,GAAO,MAAM,iCAAiCqQ,CAAK,GAC5C,EAAE,OAAO,uCAAA;AAAA,EAClB;AACF;ACtZA,MAAMrQ,KAASP,GAAa,IAAI,GAI1B+mC,KAAmB,MAAMrC,GAAA;AAa/B,eAAsBsC,GACpBC,GACAzkC,GACkC;AAClC,MAAI;AACF,QAAI,CAACA,KAAQ,CAACA,EAAK;AACjB,aAAO,EAAE,OAAO,IAAO,OAAO,yBAAA;AAIhC,UAAM0kC,IAAc,mBAAmB1kC,EAAK,KAAA,CAAM,GAC5C+jC,IAAY,MAAMb;AAAA,MACtB,yBAAyBuB,CAAO,IAAIC,CAAW;AAAA,IAAA;AAGjD,QAAI,CAACX,EAAU;AAEb,aAAIA,EAAU,eAAe,MACpB,EAAE,OAAO,IAAO,OAAO,qBAAA,IAEzB,EAAE,OAAO,IAAO,OAAO,0BAAA;AAGhC,UAAMl0C,IAASk0C,EAAU;AACzB,WAAO;AAAA,MACL,OAAOl0C,EAAO,SAAS;AAAA,MACvB,qBAAqBA,EAAO;AAAA,MAC5B,iBAAiBA,EAAO;AAAA,MACxB,iBAAiBA,EAAO;AAAA,MACxB,cAAcA,EAAO;AAAA,MACrB,QAAQA,EAAO;AAAA,MACf,MAAMA,EAAO,QAAQmQ;AAAA,IAAA;AAAA,EAEzB,SAASoO,GAAO;AACdrQ,WAAAA,GAAO,MAAM,gCAAgCqQ,CAAK,GAC3C,EAAE,OAAO,IAAO,OAAO,gCAAA;AAAA,EAChC;AACF;AAUA,eAAsBu2B,GAAcF,GAA4C;AAC9E,MAAI;AACF,UAAMV,IAAY,MAAMb;AAAA,MACtB,sBAAsBuB,CAAO;AAAA,IAAA;AAG/B,WAAKV,EAAU,UAKRA,EAAU,KAAM,kBAAkB,KAHhC;AAAA,EAIX,SAAS31B,GAAO;AACdrQ,WAAAA,GAAO,MAAM,4CAA4CqQ,CAAK,GAEvD;AAAA,EACT;AACF;AAWA,eAAsBw2B,GACpBhB,GACA5jC,GAC+C;AAC/C,MAAI;AAMF,UAAM+jC,IAAY,MAAMV;AAAA,MACtB,GAAGkB,GAAA,CAAkB,SAASX,CAAM;AAAA,MACpC,EAAE,WAAW5jC,EAAA;AAAA,IAAK;AAGpB,WAAK+jC,EAAU,UAOR,EAAE,SAAS,GAAA,IANT;AAAA,MACL,SAAS;AAAA,MACT,OAAOA,EAAU,SAAS;AAAA,IAAA;AAAA,EAKhC,SAAS31B,GAAO;AACdrQ,WAAAA,GAAO,MAAM,8BAA8BqQ,CAAK,GACzC,EAAE,SAAS,IAAO,OAAO,8BAAA;AAAA,EAClC;AACF;ACtHA,MAAMrQ,KAASP,GAAa,IAAI,GAuB1BqnC,yBAA4B,IAAA;AAWlC,eAAsBC,GACpBL,GACAM,IAA4B,OAC5BC,GACuB;AAKvB,QAAM5zC,IAAM4zC,IAAW,GAAGP,CAAO,QAAQ,OAAOA,CAAO;AAGvD,MAAIM,MAAgB,OAAO;AACzB,UAAME,IAAWJ,GAAsB,IAAIzzC,CAAG;AAC9C,QAAI6zC,EAAU,QAAOA;AAAA,EACvB;AAEA,QAAM3c,KAAO,YAAY;AACvB,QAAI;AACF,YAAMsG,IAAMoW,IACR,GAAG/C,GAAA,CAAkB,WAAWwC,CAAO,aAAa,mBAAmBO,CAAQ,CAAC,KAChF,GAAG/C,GAAA,CAAkB,WAAWwC,CAAO,IAErCxB,IAAW,MAAM8B,EAAYnW,CAAG;AACtC,UAAI,CAACqU,EAAS;AACZ,cAAM,IAAIljC;AAAA,UACR,kCAAkCkjC,EAAS,MAAM;AAAA,UACjD;AAAA,QAAA;AAGJ,aAAO,MAAMA,EAAS,KAAA;AAAA,IACxB,SAAS70B,GAAO;AACdrQ,aAAAA,GAAO,MAAM,iCAAiCqQ,CAAK,GAC5C;AAAA,IACT;AAAA,EACF,GAAA;AAEA,SAAI22B,MAAgB,UAClBF,GAAsB,IAAIzzC,GAAKk3B,CAAG,GAClCA,EAAI,QAAQ,MAAM;AAIhB,IAAIuc,GAAsB,IAAIzzC,CAAG,MAAMk3B,KACrCuc,GAAsB,OAAOzzC,CAAG;AAAA,EAEpC,CAAC,IAEIk3B;AACT;AAUA,eAAsB4c,GACpBT,GAC4B;AAC5B,MAAI;AACF,UAAMlX,IAAU,MAAMmW;AAAA,MACpB,GAAGzB,GAAA,CAAkB,kBAAkBwC,CAAO;AAAA,IAAA;AAEhD,WAAO,MAAM,QAAQlX,CAAO,IAAIA,IAAU,CAAA;AAAA,EAC5C,SAASnf,GAAO;AACdrQ,WAAAA,GAAO,MAAM,2BAA2BqQ,CAAK,GACtC,CAAA;AAAA,EACT;AACF;AA4GA,eAAsB+2B,GACpBC,GACA1hC,GACAkG,GACkB;AAClB,MAAI;AACF,UAAMoqB,IAAO,MAAM0P;AAAA,MACjB,GAAGzB,IAAkB,iBAAiBmD,CAAO,UAAU1hC,CAAI,IAAIkG,CAAK;AAAA,IAAA;AAGtE,WAAKoqB,IAKD,MAAM,QAAQA,CAAI,IAAUA,IACzB,MAAM,QAASA,EAA8B,MAAM,IACrDA,EAA6B,SAC9B,CAAA,KAPFj2B,GAAO,MAAM,uDAAuD,GAC7D,CAAA;AAAA,EAOX,SAASqQ,GAAO;AACdrQ,WAAAA,GAAO,MAAM,gCAAgCqQ,CAAK,GAC3C,CAAA;AAAA,EACT;AACF;AAUA,eAAsBi3B,GACpBC,GACA5hC,GACAkG,GACkB;AAClB,MAAI;AACF,UAAMoqB,IAAO,MAAM0P;AAAA,MACjB,GAAGzB,IAAkB,wBAAwBqD,CAAK,UAAU5hC,CAAI,IAAIkG,CAAK;AAAA,IAAA;AAG3E,WAAKoqB,IAKD,MAAM,QAAQA,CAAI,IAAUA,IACzB,MAAM,QAASA,EAA8B,MAAM,IACrDA,EAA6B,SAC9B,CAAA,KAPFj2B,GAAO,MAAM,2DAA2D,GACjE,CAAA;AAAA,EAOX,SAASqQ,GAAO;AACdrQ,WAAAA,GAAO,MAAM,oCAAoCqQ,CAAK,GAC/C,CAAA;AAAA,EACT;AACF;AAyCA,eAAsBm3B,GACpBC,GACAJ,GAC2C;AAC3C,MAAI;AACF,UAAMpR,IAAO,MAAM0P;AAAA,MACjB,GAAGzB,GAAA,CAAkB,WAAWuD,CAAa,wBAAwBJ,CAAO;AAAA,IAAA;AAG9E,WAAKpR,MACHj2B,GAAO,MAAM,0DAA0D,GAChE;AAAA,EAIX,SAASqQ,GAAO;AACdrQ,WAAAA,GAAO,MAAM,sCAAsCqQ,CAAK,GACjD;AAAA,EACT;AACF;AAiBA,eAAsBq3B,GACpBhnB,GACA8P,GACgC;AAChC,MAAI;AACF,UAAMmX,IAAKnX,IAAO,SAAS,mBAAmBA,CAAI,CAAC,KAAK,IAClDyF,IAAO,MAAM0P;AAAA,MACjB,GAAGzB,GAAA,CAAkB,YAAY,mBAAmB,OAAOxjB,CAAE,CAAC,CAAC,GAAGinB,CAAE;AAAA,IAAA;AAGtE,QAAI,CAAC1R,KAAQ,CAACA,EAAK;AACjB,YAAM,IAAIj0B;AAAA,QACR;AAAA,QACA;AAAA,MAAA;AAIJ,WAAOi0B;AAAA,EACT,SAAS5lB,GAAO;AACdrQ,WAAAA,GAAO,MAAM,kCAAkCqQ,CAAK,GAC7C;AAAA,EACT;AACF;AA0CA,eAAsBu3B,GACpBC,GACAZ,GACsC;AACtC,MAAI;AAIF,UAAMpW,IAAMoW,IACR,GAAG/C,GAAA,CAAkB,gBAAgB2D,CAAY,aAAa,mBAAmBZ,CAAQ,CAAC,KAC1F,GAAG/C,GAAA,CAAkB,gBAAgB2D,CAAY,IAE/C5R,IAAO,MAAM0P,GAAkC9U,CAAG;AAExD,QAAI,CAACoF;AACH,YAAM,IAAIj0B;AAAA,QACR;AAAA,QACA;AAAA,MAAA;AAIJ,WAAOi0B;AAAA,EACT,SAAS5lB,GAAO;AACdrQ,WAAAA,GAAO,MAAM,8BAA8BqQ,CAAK,GACzC;AAAA,EACT;AACF;AAqCA,eAAsBy3B,GACpBpB,GACAO,GAC6B;AAC7B,MAAI;AAGF,UAAMjB,IAAY,MAAMV;AAAA,MACtB,GAAGpB,GAAA,CAAkB,WAAWwC,CAAO;AAAA,MACvC,EAAE,UAAAO,EAAA;AAAA,IAAS;AAGb,QAAI,CAACjB,EAAU,QAAS,QAAO,EAAE,OAAO,GAAA;AAExC,UAAMl0C,IAASk0C,EAAU;AACzB,WAAI,OAAOl0C,KAAW,YAAkB,EAAE,OAAOA,EAAA,IAC1C,EAAE,OAAQA,EAA8B,UAAU,GAAA;AAAA,EAC3D,SAASue,GAAO;AACdrQ,WAAAA,GAAO,MAAM,kCAAkCqQ,CAAK,GAC7C,EAAE,OAAO,GAAA;AAAA,EAClB;AACF;AC/ee5Q,GAAa,IAAI;AC0CzB,SAASsoC,GAAyB3jC,GAAmC;AAC1E,QAAM6xB,IAAQ7xB,KAAO,CAAA,GAEf4jC,KAAyB/R,EAAK,iBAAiB,KAAK,KACpDgS,IAAkBhS,EAAK,kBAAkB,GAEzCiS,IAAejS,EAAK,sBAAsBgS,KAAmB,GAC7DE,IAAiB,CAACD;AAExB,SAAO;AAAA,IACL,OAAO;AAAA,IACP,cAAcjS,EAAK;AAAA,IACnB,gBAAgB+R;AAAA,IAChB,iBAAiB/R,EAAK;AAAA,IACtB,aAAaiS,IAAe,mBAAmB;AAAA,IAC/C,cAAcD;AAAA,IACd,YAAYD,IAAwBC;AAAA,IACpC,gBAAAE;AAAA,EAAA;AAEJ;AC1DA,MAAMnoC,KAASP,GAAa,IAAI,GAI1B+mC,KAAmB,MAAMrC,GAAA;AAqF/B,eAAsBiE,GACpBvC,GACA5jC,GAC8B;AAC9B,MAAI;AACF,UAAM+jC,IAAY,MAAMV;AAAA,MACtB,GAAGkB,GAAA,CAAkB,SAASX,CAAM;AAAA,MACpC,EAAE,cAAc5jC,EAAA;AAAA,IAAK;AAGvB,WAAK+jC,EAAU,UAeR+B,GAAyB/B,EAAU,IAAI,IAdxCA,EAAU,eAAe,MACpB;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IAAA,KAGXhmC,GAAO,MAAM,2BAA2BgmC,EAAU,KAAK,GAChD,EAAE,OAAO,IAAO,OAAOA,EAAU,SAAS,yBAAA;AAAA,EAQrD,SAASxb,GAAK;AACZxqB,WAAAA,GAAO,MAAM,wBAAwBwqB,CAAG,GACjC;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IAAA;AAAA,EAEX;AACF;AAUA,eAAsB6d,GAAexC,GAA+C;AAClF,MAAI;AACF,UAAMG,IAAY,MAAMR,GAAU,GAAGgB,IAAkB,SAASX,CAAM,YAAY;AAElF,WAAKG,EAAU,UAKR,EAAE,SAAS,GAAA,KAJhBhmC,GAAO,MAAM,4BAA4BgmC,EAAU,KAAK,GACjD,EAAE,SAAS,IAAO,OAAOA,EAAU,SAAS,6BAAA;AAAA,EAIvD,SAASxb,GAAK;AACZxqB,WAAAA,GAAO,MAAM,yBAAyBwqB,CAAG,GAClC;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,EAEX;AACF;AAoBA,eAAsB8d,GACpBzC,GACA0C,GACwC;AACxC,MAAI;AACF,UAAMvC,IAAY,MAAMV;AAAA,MACtB,GAAGkB,GAAA,CAAkB,SAASX,CAAM;AAAA,MACpC;AAAA,QACE,WAAW0C,EAAgB;AAAA,QAC3B,UAAUA,EAAgB;AAAA,QAC1B,OAAOA,EAAgB;AAAA,QACvB,aAAaA,EAAgB,eAAe;AAAA,QAC5C,aAAaA,EAAgB,eAAe;AAAA,MAAA;AAAA,IAC9C;AAGF,WAAKvC,EAAU,UAKR;AAAA,MACL,SAAS;AAAA,MACT,SAASA,EAAU,MAAM;AAAA,MACzB,oBAAoBA,EAAU,MAAM;AAAA,IAAA,KAPpChmC,GAAO,MAAM,sCAAsCgmC,EAAU,KAAK,GAC3D,EAAE,SAAS,IAAO,OAAOA,EAAU,SAAS,6BAAA;AAAA,EAQvD,SAASxb,GAAK;AACZxqB,WAAAA,GAAO,MAAM,kCAAkCwqB,CAAG,GAC3C;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,EAEX;AACF;AC5MA,MAAMxqB,KAASP,GAAa,IAAI,GAS1B+oC,KAAkD;AAAA,EACtD,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,0BAA0B;AAC5B;AAKA,eAAsBC,GACpB/B,GACAgC,GACAC,IAAuB,MACvBC,IAAW,IACkB;AAC7B,MAAI;AACF,UAAMrD,IAAgC,EAAE,OAAAmD,EAAA;AACxC,IAAIC,KAASC,MACXrD,EAAK,QAAQoD,GACbpD,EAAK,WAAW;AAGlB,UAAMS,IAAY,MAAMV;AAAA,MACtB,WAAWoB,CAAO;AAAA,MAClBnB;AAAA,IAAA;AAGF,WAAKS,EAAU,UAUR;AAAA,MACL,SAAS;AAAA,MACT,SAASA,EAAU,MAAM;AAAA,IAAA,KAXzBhmC,GAAO,MAAM,yBAAyBgmC,EAAU,KAAK,GAC9C;AAAA,MACL,SAAS;AAAA,MACT,OACEwC,GAAwBxC,EAAU,SAAS,EAAE,KAC7C;AAAA,IAAA;AAAA,EAQR,SAASxb,GAAK;AACZxqB,WAAAA,GAAO,MAAM,uBAAuBwqB,CAAG,GAChC;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,EAEX;AACF;AC5CA,MAAMqe,KAAe;AA0Id,SAASC,GAAev1C,GAAkC;AAC/D,SAAKA,IACDA,EAAK,WAAW,MAAM,IAAUA,IAC7B,GAAGs1C,EAAY,IAAIt1C,EAAK,QAAQ,OAAO,EAAE,CAAC,KAF/B;AAGpB;AAcO,SAASi7B,GAAiBua,GAA4B;AAC3D,QAAMC,IACJD,EAAS,YACTA,EAAS,YACTA,EAAS,aACTA,EAAS,SACT;AAEF,SAAOD,GAAeE,CAAM;AAC9B;AAUO,SAASC,GACdF,GACoD;AAEpD,QAAMG,IAAgBH,EAAS,YAAYA,EAAS;AACpD,MAAIG;AACF,WAAOA;AAIT,MAAIH,EAAS,eAAeA,EAAS;AACnC,WAAO;AAIT,QAAMI,IACJJ,EAAS,iBAAiBA,EAAS,mBAAmBA,EAAS;AACjE,MAAII,GAAW;AACb,UAAMC,IAAY,IAAI,KAAKD,CAAS,EAAE,QAAA,GAChCla,IAAM,KAAK,IAAA;AAEjB,QAAIma,IAAYna;AACd,aAAO;AAAA,EAEX;AAGA,QAAMoa,IACJN,EAAS,oBAAoBA,EAAS;AAExC,MAAIM,MAAmB;AACrB,WAAIA,KAAkB,IACb,aAEF;AAIT,QAAM7Z,IACJuZ,EAAS,oBACTA,EAAS,qBACTA,EAAS,WACT,CAAA;AAEF,SAAIvZ,EAAQ,WAAW,IACd,gBAGcA,EAAQ,OAAO,CAAC8Z,GAAavqC,MAAW;AAC7D,UAAMwqC,IAAMxqC,EAAE,qBAAqBA,EAAE,sBAAsBA,EAAE,YAAY,GACnEq1B,IAAOr1B,EAAE,gBAAgBA,EAAE,iBAAiB;AAClD,WAAOuqC,IAAM,KAAK,IAAI,GAAGC,IAAMnV,CAAI;AAAA,EACrC,GAAG,CAAC,KAEkB,IACb,aAGF;AACT;AASO,SAASoV,GAAYplC,GAA+B;AACzD,QAAMqlC,IAAYrlC;AAClB,SAAO;AAAA,IACL,IAAIqlC,EAAU,MAAMA,EAAU;AAAA,IAC9B,MAAMA,EAAU,QAAQA,EAAU,cAAc;AAAA,IAChD,aAAaA,EAAU;AAAA,IACvB,OAAOA,EAAU,SAAS;AAAA,IAC1B,UAAUA,EAAU,YAAYA,EAAU,iBAAiB;AAAA,IAC3D,cAAcA,EAAU,gBAAgBA,EAAU,iBAAiB;AAAA,IACnE,mBACEA,EAAU,qBACVA,EAAU,uBACTA,EAAU,YAAY,MAAMA,EAAU,gBAAgB;AAAA,IACzD,aAAaA,EAAU,eAAeA,EAAU,iBAAiB;AAAA,IACjE,aAAaA,EAAU,eAAeA,EAAU,iBAAiB;AAAA,IACjE,eAAeA,EAAU,iBAAiBA,EAAU;AAAA,IACpD,aAAaA,EAAU,eAAeA,EAAU;AAAA,IAChD,UAAUA,EAAU,YAAYA,EAAU,aAAa;AAAA,IACvD,qBACEA,EAAU,uBAAuBA,EAAU;AAAA,IAC7C,YAAYA,EAAU,cAAcA,EAAU,eAAe;AAAA,IAC7D,WAAWA,EAAU,aAAaA,EAAU;AAAA,IAC5C,WAAWA,EAAU,aAAaA,EAAU,cAAc;AAAA,EAAA;AAE9D;AAsBO,SAASC,GAAWtlC,GAAqB;AAC9C,QAAM2kC,IAAW3kC,GASXorB,KALJuZ,EAAS,oBACTA,EAAS,qBACTA,EAAS,WACT,CAAA,GAEyB,IAAIS,EAAW,GAGpC1Z,IAASN,EAAQ,IAAI,CAAAzwB,MAAKA,EAAE,KAAK,EAAE,OAAO,CAAAqgB,MAAKA,IAAI,CAAC,GACpDuqB,IAAW7Z,EAAO,SAAS,IAAI,KAAK,IAAI,GAAGA,CAAM,IAAI,QACrD8Z,IAAW9Z,EAAO,SAAS,IAAI,KAAK,IAAI,GAAGA,CAAM,IAAI;AAE3D,SAAO;AAAA,IACL,SAASiZ,EAAS,WAAWA,EAAS,MAAMA,EAAS,MAAM;AAAA,IAC3D,IAAIA,EAAS,MAAMA,EAAS;AAAA,IAC5B,MAAMA,EAAS,QAAQA,EAAS,SAAS;AAAA,IACzC,OAAOA,EAAS,SAASA,EAAS;AAAA,IAClC,MAAMA,EAAS;AAAA,IACf,aAAaA,EAAS;AAAA,IACtB,MACEA,EAAS,QAAQA,EAAS,iBAAiBA,EAAS,mBAAmB;AAAA,IACzE,eAAeA,EAAS,iBAAiBA,EAAS;AAAA,IAClD,aAAaA,EAAS,eAAeA,EAAS;AAAA,IAC9C,eAAeA,EAAS,iBAAiBA,EAAS;AAAA,IAClD,UAAUA,EAAS,YAAYA,EAAS;AAAA,IACxC,SAASA,EAAS,WAAWA,EAAS;AAAA,IACtC,WAAWA,EAAS,aAAaA,EAAS;AAAA,IAC1C,cAAcA,EAAS,gBAAgBA,EAAS;AAAA,IAChD,UACEA,EAAS,YAAYA,EAAS,gBAAgBA,EAAS;AAAA,IACzD,UAAUva,GAAiBua,CAAQ;AAAA,IACnC,UAAUva,GAAiBua,CAAQ;AAAA,IACnC,QAAQA,EAAS;AAAA,IACjB,aAAaA,EAAS,eAAeA,EAAS;AAAA,IAC9C,aAAaA,EAAS,eAAeA,EAAS;AAAA,IAC9C,kBAAkBvZ;AAAA,IAClB,kBACEuZ,EAAS,oBACTA,EAAS,qBACTvZ,EAAQ,OAAO,CAAC8Z,GAAKvqC,MAAMuqC,KAAOvqC,EAAE,qBAAqB,IAAI,CAAC;AAAA,IAChE,aAAagqC,EAAS,eAAeA,EAAS;AAAA,IAC9C,UAAUA,EAAS,YAAYA,EAAS,aAAaY;AAAA,IACrD,UAAUZ,EAAS,YAAYA,EAAS,aAAaa;AAAA,IACrD,SAASb,EAAS,WAAWA,EAAS;AAAA,IACtC,UAAUE,GAAoBF,CAAQ;AAAA,IACtC,gBAAgBA,EAAS,kBAAkBA,EAAS;AAAA,IACpD,eAAeA,EAAS,iBAAiBA,EAAS;AAAA,IAClD,sBACEA,EAAS,wBAAwBA,EAAS;AAAA;AAAA,IAE5C,UAAUA,EAAS;AAAA,IACnB,cAAcA,EAAS;AAAA,IACvB,UAAUA,EAAS;AAAA,IACnB,aAAaA,EAAS;AAAA,IACtB,YAAYA,EAAS;AAAA,IACrB,YAAYA,EAAS;AAAA,IACrB,oBAAoBA,EAAS;AAAA,IAC7B,gBAAgBA,EAAS;AAAA,IACzB,uBAAuBA,EAAS;AAAA,IAChC,kBAAkBA,EAAS;AAAA,IAC3B,gBAAgBA,EAAS;AAAA,IACzB,kBAAkBA,EAAS;AAAA,IAC3B,cAAcA,EAAS,gBAAgBA,EAAS;AAAA,IAChD,kBAAkBA,EAAS;AAAA,IAC3B,cAAcA,EAAS;AAAA,IACvB,kBAAkBA,EAAS;AAAA,IAC3B,OAAOA,EAAS;AAAA,IAChB,WAAWA,EAAS;AAAA,IACpB,SAASA,EAAS;AAAA,IAClB,oBAAoBA,EAAS;AAAA,IAC7B,kBAAkBA,EAAS;AAAA,IAC3B,eAAeA,EAAS;AAAA,IACxB,OAAOA,EAAS;AAAA,IAChB,YAAYA,EAAS;AAAA,IACrB,MAAMA,EAAS;AAAA,IACf,WAAWA,EAAS;AAAA,IACpB,kBAAkBA,EAAS;AAAA,EAAA;AAE/B;ACjUA,MAAMrQ,KACJ,wBACA,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAMd;AAiBP,SAASmR,GAAqBzxB,GAAO;AACnC,SAAO0xB,GAAmB1xB,GAAO,EAAE,aAAasgB,GAAiB,CAAE;AACrE;AAqCA,MAAMqR,KAAkB,oBAAI,IAAG,GACzBC,KAAqB;AAE3B,SAASC,GAAch7B,GAAQW,GAAUlQ,GAAS;AAChD,QAAMrM,IAAM,GAAG4b,CAAM,IAAIW,CAAQ,IAAI,KAAK,UAAUlQ,CAAO,CAAC;AAC5D,MAAIsyB,IAAM+X,GAAgB,IAAI12C,CAAG;AACjC,MAAI2+B;AAEF,WAAA+X,GAAgB,OAAO12C,CAAG,GAC1B02C,GAAgB,IAAI12C,GAAK2+B,CAAG,GACrBA;AAIT,MAFAA,IAAM,IAAI,KAAK,eAAe/iB,GAAQ,EAAE,GAAGvP,GAAS,UAAAkQ,GAAU,GAC9Dm6B,GAAgB,IAAI12C,GAAK2+B,CAAG,GACxB+X,GAAgB,OAAOC,IAAoB;AAE7C,UAAME,IAAYH,GAAgB,KAAI,EAAG,KAAI,EAAG;AAChD,IAAAA,GAAgB,OAAOG,CAAS;AAAA,EAClC;AACA,SAAOlY;AACT;AAEO,SAASmY,GAAiBC,GAAWx6B,GAAUlQ,GAAS;AAC7D,MAAI,CAAC0qC,EAAW,QAAO;AAEvB,QAAMrlC,IAAO,IAAI,KAAKqlC,CAAS;AAC/B,SAAI,MAAMrlC,EAAK,QAAO,CAAE,IAAU,KAE3BklC,GAAc,SAASr6B,GAAUlQ,CAAO,EAAE,OAAOqF,CAAI;AAC9D;AAUO,SAASslC,GAAqBjyB,GAAOxI,GAAU;AACpD,MAAI,CAACwI,EAAM,cAAe,QAAO;AAEjC,MAAI;AACF,WAAKA,EAAM,cAGJuf,GAAgBvf,EAAM,eAAeA,EAAM,aAAaxI,CAAQ,IAF9D8nB,GAAgBtf,EAAM,eAAexI,CAAQ;AAAA,EAGxD,QAAQ;AAEN,UAAMoP,IAAgB;AAAA,MACpB,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,IACd,GAEUsrB,IAAYH;AAAA,MAChB/xB,EAAM;AAAA,MACNxI;AAAA,MACAoP;AAAA,IACN;AAEI,QAAI,CAAC5G,EAAM,YAAa,QAAOkyB;AAE/B,UAAMC,IAAUJ;AAAA,MACd/xB,EAAM;AAAA,MACNxI;AAAA,MACAoP;AAAA,IACN;AACI,WAAOsrB,KAAaC,IAAU,GAAGD,CAAS,MAAMC,CAAO,KAAKD;AAAA,EAC9D;AACF;AAiBO,SAASE,GAAkBJ,GAAWx6B,GAAU;AACrD,MAAI,CAACw6B,EAAW,QAAO,EAAE,KAAK,IAAI,OAAO,IAAI,aAAa,GAAE;AAE5D,MAAI;AACF,UAAM32C,IAAQg3C,GAAgBL,GAAWx6B,CAAQ;AACjD,WAAO;AAAA,MACL,KAAKnc,EAAM;AAAA,MACX,OAAOA,EAAM;AAAA,MACb,aAAa,OAAOA,EAAM,IAAI;AAAA,IACpC;AAAA,EACE,QAAQ;AAEN,WAAO;AAAA,MACL,KAAK02C,GAAiBC,GAAWx6B,GAAU,EAAE,SAAS,SAAS;AAAA,MAC/D,OAAOu6B,GAAiBC,GAAWx6B,GAAU,EAAE,OAAO,SAAS;AAAA,MAC/D,aAAau6B,GAAiBC,GAAWx6B,GAAU,EAAE,KAAK,WAAW;AAAA,IAC3E;AAAA,EACE;AACF;AASO,MAAM86B,KAAgB;AAAA;AAAA,EAE3B,QAAQ;AAAA;AAAA,EAER,QAAQ;AACV;AAUO,SAASC,GACd5B,GACArpC,IAAU,EAAE,MAAMgrC,GAAc,OAAM,GACtC;AACA,QAAM,EAAE,MAAAE,IAAOF,GAAc,OAAM,IAAKhrC;AAExC,MAAI,CAACqpC;AACH,WAAO6B,MAASF,GAAc,SAC1BG,GAAmB,IACnBC,GAAmB;AAMzB,QAAMC,IAASrB,GAAWX,CAAQ,GAM5Bn5B,IAAWvL,GAAgB0mC,EAAO,YAAYA,EAAO,QAAQ,GAC7Djf,IAAW+d,GAAqBd,CAAQ,GAGxC9yB,IAAO;AAAA,IACX,IAAI80B,EAAO;AAAA,IACX,MAAMA,EAAO,SAAS;AAAA,IACtB,OAAOjf;AAAA,IACP,UAAAlc;AAAA,IACA,eAAem7B,EAAO,iBAAiB;AAAA,EAC3C;AAEE,SAAIH,MAASF,GAAc,SAClBM,GAAqBjC,GAAUgC,GAAQ90B,GAAMrG,CAAQ,IAGvDq7B,GAAqBlC,GAAUgC,GAAQ90B,GAAMrG,GAAUkc,CAAQ;AACxE;AAKA,SAASkf,GAAqBjC,GAAUgC,GAAQ90B,GAAMrG,GAAU;AAE9D,MAAIs7B,IAAY;AAChB,MAAIH,EAAO,eAAe;AACxB,UAAMxO,IAAK,IAAI,KAAKwO,EAAO,aAAa;AACxC,IAAAG,IAAY5rB;AAAA,MACVid;AAAA,MACA;AAAA,QACE,UAAA3sB;AAAA,QACA,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,MACb;AAAA,MACM;AAAA,IACN;AAAA,EACE;AAKA,MAAIu7B;AACJ,MACE,OAAOJ,EAAO,oBAAqB,YACnC,OAAOA,EAAO,gBAAiB,UAC/B;AACA,UAAMpb,IAAiBob,EAAO,kBACxBnb,IAAgBmb,EAAO;AAC7B,IAAAI,IAAW;AAAA,MACT,gBAAAxb;AAAA,MACA,eAAAC;AAAA,MACA,WAAWA,IAAgB,KAAKD,KAAkB;AAAA,IACxD;AAAA,EACE,OAAO;AAGL,UAAMyb,IAAgB7b,GAAoBwZ,EAAS,oBAAoB,CAAA,GAAI;AAAA,MACzE,iBAAiB;AAAA,MACjB,YAAY;AAAA,IAClB,CAAK;AACD,IAAAoC,IAAWzb,GAAkB0b,CAAa;AAAA,EAC5C;AAEA,SAAO;AAAA,IACL,GAAGn1B;AAAA,IACH,MAAMi1B,KAAaH,EAAO,QAAQ;AAAA,IAClC,QAAQA,EAAO,UAAU;AAAA,IACzB,UAAUV,GAAqBU,GAAQn7B,CAAQ;AAAA,IAC/C,aAAam7B,EAAO,eAAeA,EAAO,gBAAgB;AAAA,IAC1D,SAASA,EAAO;AAAA,IAChB,eAAeA,EAAO,iBAAiB;AAAA;AAAA,IAEvC,kBAAkBI,EAAS;AAAA,IAC3B,cAAcA,EAAS;AAAA,IACvB,WAAWA,EAAS;AAAA;AAAA,IAEpB,6BAA6Blb,GAAiC8Y,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMtE,SAASgC,EAAO,WAAW;AAAA,IAC3B,oBAAoBA,EAAO,sBAAsB;AAAA,IACjD,gBAAgBA,EAAO,kBAAkB;AAAA,IACzC,kBAAkBA,EAAO,oBAAoB;AAAA,IAC7C,eAAeA,EAAO,iBAAiB;AAAA,EAC3C;AACA;AAKA,SAASE,GAAqBlC,GAAUgC,GAAQ90B,GAAMrG,GAAUkc,GAAU;AAGxE,QAAMuf,KAActC,EAAS,oBAAoB,CAAA,GAAI,IAAI,CAAAla,OAAW;AAAA,IAClE,GAAGA;AAAA,IACH,QAAQG,GAAsBH,CAAM;AAAA,EACxC,EAAI,GACIuc,IAAgB7b,GAAoB8b,GAAY;AAAA,IACpD,iBAAiB;AAAA,IACjB,YAAY;AAAA,EAChB,CAAG,GACKC,IAAYd,GAAkBO,EAAO,eAAen7B,CAAQ;AAElE,SAAO;AAAA,IACL,GAAGqG;AAAA,IACH,MAAM80B,EAAO,gBAAgBQ,GAAiBR,EAAO,aAAa,IAAI;AAAA,IACtE,aAAaA,EAAO;AAAA,IACpB,aAAaA,EAAO;AAAA,IACpB,UAAUZ,GAAiBY,EAAO,eAAen7B,GAAU;AAAA,MACzD,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,IACd,CAAK;AAAA,IACD,UACEm7B,EAAO,OAAO,2BAA2BA,EAAO,OAAO,WAAW;AAAA,IACpE,GAAGO;AAAA,IACH,YAAYxf;AAAA,IACZ,OAAO+D,GAAgBkZ,EAAS,gBAAgB;AAAA;AAAA,IAChD,QAAQgC,EAAO,UAAU;AAAA,IACzB,cAAcA,EAAO;AAAA,IACrB,UAAUA,EAAO;AAAA,IACjB,kBAAkBM;AAAA,IAClB,eAAAD;AAAA;AAAA,IAEA,6BAA6Bnb,GAAiC8Y,CAAQ;AAAA,IACtE,eAAegC,EAAO;AAAA,IACtB,OAAOA,EAAO;AAAA,IACd,SAASA,EAAO;AAAA;AAAA,IAEhB,SAAShC,EAAS;AAAA,IAClB,OAAOgC,EAAO;AAAA,IACd,YAAYA,EAAO;AAAA,IACnB,YAAYA,EAAO;AAAA,IACnB,oBAAoBA,EAAO;AAAA,IAC3B,kBAAkBA,EAAO;AAAA,IACzB,WAAWjf;AAAA,IACX,kBAAkBif,EAAO;AAAA,IACzB,gBAAgBA,EAAO;AAAA,IACvB,kBAAkBA,EAAO;AAAA,IACzB,gBAAgBA,EAAO,kBAAkB;AAAA,IACzC,YAAYA,EAAO,kBAAkB;AAAA,IACrC,gBAAgBA,EAAO,iBAAiB,GAAGA,EAAO,cAAc,KAAK;AAAA,IACrE,mBAAmB,CAAC,CAACA,EAAO;AAAA,IAC5B,uBAAuBA,EAAO,yBAAyB;AAAA,EAC3D;AACA;AAMA,SAASQ,GAAiBnB,GAAW;AACnC,SAAKA,KACUoB,GAAapB,GAAW,EAAE,SAAS,QAAO,CAAE,KAC1C;AACnB;AAKA,SAASS,KAAsB;AAC7B,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,IACb,SAAS;AAAA,IACT,UAAU;AAAA,IACV,eAAe;AAAA,IACf,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,WAAW;AAAA,IACX,6BAA6B;AAAA,EACjC;AACA;AAKA,SAASC,KAAsB;AAC7B,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,eAAe;AAAA,IACf,aAAa;AAAA,IACb,aAAa;AAAA,IACb,UAAU;AAAA,IACV,UAAU;AAAA,IACV,KAAK;AAAA,IACL,OAAO;AAAA,IACP,aAAa;AAAA,IACb,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,UAAU;AAAA,IACV,kBAAkB,CAAA;AAAA,IAClB,eAAe,CAAA;AAAA,IACf,6BAA6B;AAAA,IAC7B,eAAe;AAAA,IACf,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,YAAY,CAAA;AAAA,IACZ,YAAY;AAAA,IACZ,oBAAoB;AAAA,IACpB,kBAAkB,CAAA;AAAA,IAClB,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,UAAU;AAAA,EACd;AACA;AASO,SAASW,GAAmB1C,GAAU;AAC3C,SAAO4B,GAAe5B,GAAU,EAAE,MAAM2B,GAAc,OAAM,CAAE;AAChE;AC9gBA,SAASgB,GAAQvoB,GAAQ;AACvB,WAAShzB,IAAI,GAAGA,IAAI,UAAU,QAAQA,KAAK;AACzC,QAAIw7C,IAAS,UAAUx7C,CAAC;AACxB,aAASkD,KAAOs4C;AACd,MAAIt4C,MAAQ,gBACZ8vB,EAAO9vB,CAAG,IAAIs4C,EAAOt4C,CAAG;AAAA,EAE5B;AACA,SAAO8vB;AACT;AAEA,IAAIyoB,KAAmB;AAAA,EACrB,MAAM,SAAUt4C,GAAO;AACrB,WAAIA,EAAM,CAAC,MAAM,QACfA,IAAQA,EAAM,MAAM,GAAG,EAAE,IAEpBA,EAAM,QAAQ,oBAAoB,kBAAkB;AAAA,EAC7D;AAAA,EACA,OAAO,SAAUA,GAAO;AACtB,WAAO,mBAAmBA,CAAK,EAAE;AAAA,MAC/B;AAAA,MACA;AAAA,IACN;AAAA,EACE;AACF;AAEA,SAASkxC,GAAKqH,GAAWC,GAAmB;AAC1C,WAASC,EAAIprB,GAAMrtB,GAAOg4B,GAAY;AACpC,QAAI,SAAO,WAAa,MAIxB;AAAA,MAAAA,IAAaogB,GAAO,IAAII,GAAmBxgB,CAAU,GAEjD,OAAOA,EAAW,WAAY,aAChCA,EAAW,UAAU,IAAI,KAAK,KAAK,QAAQA,EAAW,UAAU,KAAK,IAEnEA,EAAW,YACbA,EAAW,UAAUA,EAAW,QAAQ,YAAW,IAGrD3K,IAAO,mBAAmBA,CAAI,EAC3B,QAAQ,wBAAwB,kBAAkB,EAClD,QAAQ,SAAS,MAAM;AAE1B,UAAIqrB,IAAwB;AAC5B,eAASC,KAAiB3gB;AACxB,QAAKA,EAAW2gB,CAAa,MAI7BD,KAAyB,OAAOC,GAE5B3gB,EAAW2gB,CAAa,MAAM,OAWlCD,KAAyB,MAAM1gB,EAAW2gB,CAAa,EAAE,MAAM,GAAG,EAAE,CAAC;AAGvE,aAAQ,SAAS,SACftrB,IAAO,MAAMkrB,EAAU,MAAMv4C,GAAOqtB,CAAI,IAAIqrB;AAAA;AAAA,EAChD;AAEA,WAASE,EAAIvrB,GAAM;AACjB,QAAI,SAAO,WAAa,OAAgB,UAAU,UAAU,CAACA,IAQ7D;AAAA,eAFIwrB,IAAU,SAAS,SAAS,SAAS,OAAO,MAAM,IAAI,IAAI,CAAA,GAC1DC,IAAM,CAAA,GACD,IAAI,GAAG,IAAID,EAAQ,QAAQ,KAAK;AACvC,YAAI14C,IAAQ04C,EAAQ,CAAC,EAAE,MAAM,GAAG,GAC5B74C,IAAQG,EAAM,MAAM,CAAC,EAAE,KAAK,GAAG;AAEnC,YAAI;AACF,cAAI44C,IAAQ,mBAAmB54C,EAAM,CAAC,CAAC;AAEvC,cADM44C,KAASD,MAAMA,EAAIC,CAAK,IAAIR,EAAU,KAAKv4C,GAAO+4C,CAAK,IACzD1rB,MAAS0rB;AACX;AAAA,QAEJ,QAAa;AAAA,QAEb;AAAA,MACF;AAEA,aAAO1rB,IAAOyrB,EAAIzrB,CAAI,IAAIyrB;AAAA;AAAA,EAC5B;AAEA,SAAO,OAAO;AAAA,IACZ;AAAA,MACE,KAAKL;AAAA,MACL,KAAKG;AAAA,MACL,QAAQ,SAAUvrB,GAAM2K,GAAY;AAClC,QAAAygB;AAAA,UACEprB;AAAA,UACA;AAAA,UACA+qB,GAAO,CAAA,GAAIpgB,GAAY;AAAA,YACrB,SAAS;AAAA,UACrB,CAAW;AAAA,QACX;AAAA,MACM;AAAA,MACA,gBAAgB,SAAUA,GAAY;AACpC,eAAOkZ,GAAK,KAAK,WAAWkH,GAAO,CAAA,GAAI,KAAK,YAAYpgB,CAAU,CAAC;AAAA,MACrE;AAAA,MACA,eAAe,SAAUugB,GAAW;AAClC,eAAOrH,GAAKkH,GAAO,IAAI,KAAK,WAAWG,CAAS,GAAG,KAAK,UAAU;AAAA,MACpE;AAAA,IACN;AAAA,IACI;AAAA,MACE,YAAY,EAAE,OAAO,OAAO,OAAOC,CAAiB,EAAC;AAAA,MACrD,WAAW,EAAE,OAAO,OAAO,OAAOD,CAAS,EAAC;AAAA,IAClD;AAAA,EACA;AACA;AAEA,IAAIS,KAAM9H,GAAKoH,IAAkB,EAAE,MAAM,IAAG,CAAE;ACzHvC,SAASW,GAAU5rB,GAAcrtB,GAAeoM,IAA6C,CAAA,GAAU;AAC5G8sC,EAAAA,GAAQ,IAAI7rB,GAAMrtB,GAAOoM,CAAO;AAClC;AAEO,SAAS+sC,GAAU9rB,GAAkC;AAC1D,SAAO6rB,GAAQ,IAAI7rB,CAAI;AACzB;AAEO,SAAS+rB,GAAa/rB,GAAoB;AAC/C6rB,EAAAA,GAAQ,OAAO7rB,CAAI;AACrB;ACJA,MAAM3gB,KAASP,GAAa,eAAe;AAgCpC,SAASktC,GAA6BC,GAAgC;AAC3E,MAAI9G,IAAqC,CAAA,GACrCC,IAA0C,CAAA,GAC1CvW,IAA4B,CAAA,GAC5Bqd,IAAY,IACZC,IAAsB;AAE1B,MAAI,OAAO,SAAW;AACpB,WAAO;AAAA,MACL,YAAAhH;AAAA,MACA,iBAAAC;AAAA,MACA,WAAA8G;AAAA,MACA,qBAAAC;AAAA,MACA,SAAAtd;AAAA,IAAA;AAKJ,MAAI;AACF,UAAMud,IAAS,aAAa,QAAQ,kBAAkBH,CAAO,EAAE;AAC/D,QAAIG,GAAQ;AACV,YAAMz8B,IAAS,KAAK,MAAMy8B,CAAM;AAChC,aAAO;AAAA,QACL,YAAYz8B,EAAO,cAAc,CAAA;AAAA,QACjC,iBAAiBA,EAAO,mBAAmB,CAAA;AAAA,QAC3C,WAAWA,EAAO,aAAa;AAAA,QAC/B,qBAAqB,WAAWA,EAAO,mBAAmB,KAAK;AAAA,QAC/D,SAASA,EAAO,WAAW,CAAA;AAAA,MAAC;AAAA,IAEhC;AAAA,EACF,SAASxR,GAAG;AACVkB,IAAAA,GAAO,KAAK,qDAAqDlB,CAAC;AAAA,EACpE;AAGA,MAAI;AACF,IAAAgnC,IAAa,KAAK;AAAA,MAChB2G,GAAU,uBAAuBG,CAAO,EAAE,KAAK;AAAA,IAAA;AAAA,EAEnD,SAAS9tC,GAAG;AACVkB,IAAAA,GAAO,KAAK,+CAA+ClB,CAAC,GAC5DgnC,IAAa,CAAA;AAAA,EACf;AAEA,MAAI;AACF,IAAAtW,IAAU,KAAK,MAAMid,GAAU,oBAAoBG,CAAO,EAAE,KAAK,IAAI;AAAA,EACvE,SAAS9tC,GAAG;AACVkB,IAAAA,GAAO,KAAK,4CAA4ClB,CAAC,GACzD0wB,IAAU,CAAA;AAAA,EACZ;AAEA,SAAAqd,IAAYJ,GAAU,sBAAsBG,CAAO,EAAE,KAAK,IAC1DE,IAAsB,WAAWL,GAAU,yBAAyB,KAAK,GAAG,IAGxE,OAAO,KAAK3G,CAAU,EAAE,SAAS,KAAKtW,EAAQ,SAAS,KAAKqd,OAC9DG,GAAqB;AAAA,IACnB,SAAAJ;AAAA,IACA,YAAA9G;AAAA,IACA,iBAAAC;AAAA,IACA,WAAA8G;AAAA,IACA,qBAAAC;AAAA,IACA,SAAAtd;AAAA,EAAA,CACD,GACDyd,GAAqBL,CAAO,IAGvB;AAAA,IACL,YAAA9G;AAAA,IACA,iBAAAC;AAAA,IACA,WAAA8G;AAAA,IACA,qBAAAC;AAAA,IACA,SAAAtd;AAAA,EAAA;AAEJ;AAKO,SAASyd,GAAqBL,GAAuB;AAE1D,EAAI,OAAO,SAAW,OACpB,aAAa,WAAW,kBAAkBA,CAAO,EAAE,GAIrDF,GAAa,uBAAuBE,CAAO,EAAE,GAC7CF,GAAa,sBAAsBE,CAAO,EAAE,GAC5CF,GAAa,yBAAyB,GACtCA,GAAa,oBAAoBE,CAAO,EAAE;AAC5C;AAMO,SAASI,GAAqB;AAAA,EACnC,SAAAJ;AAAA,EACA,YAAA9G;AAAA,EACA,iBAAAC;AAAA,EACA,WAAA8G;AAAA,EACA,qBAAAC;AAAA,EACA,SAAAtd;AACF,GAAgC;AAC9B,MAAI,OAAO,SAAW,IAAa;AAGnC,QAAM0d,KAAkB1d,KAAW,CAAA,GAAI,IAAI,CAAAzwB,OAAM;AAAA,IAC/C,IAAIA,EAAE;AAAA,IACN,MAAMA,EAAE;AAAA,IACR,OAAOA,EAAE;AAAA,IACT,MAAMA,EAAE;AAAA;AAAA,IACR,YAAYA,EAAE;AAAA,IACd,cAAcA,EAAE;AAAA,EAAA,EAChB,GAEIouC,IAAQ;AAAA,IACZ,YAAYrH,KAAc,CAAA;AAAA,IAC1B,iBAAiBC,KAAmB,CAAA;AAAA,IACpC,WAAW8G,KAAa;AAAA,IACxB,qBAAqBC,KAAuB;AAAA,IAC5C,SAASI;AAAA,IACT,WAAW,KAAK,IAAA;AAAA,EAAI;AAGtB,MAAI;AACF,iBAAa,QAAQ,kBAAkBN,CAAO,IAAI,KAAK,UAAUO,CAAK,CAAC;AAAA,EACzE,SAASruC,GAAG;AACVkB,IAAAA,GAAO,KAAK,qDAAqDlB,CAAC;AAAA,EACpE;AACF;AAKA,eAAsBsuC,GAAoB1G,GAAkC;AAC1E,QAAM2G,IAAkBZ,GAAU,YAAY/F,CAAO,EAAE;AAEvD,MAAI2G;AACF,WAAOA;AAGT,QAAMC,IAAa,SAAS5G,CAAO,IAAI,KAAK,KAAK;AAGjD,SAAA6F,GAAU,YAAY7F,CAAO,IAAI4G,GAAY;AAAA,IAC3C,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,EAAA,CACP,GAEMA;AACT;AC3KA,MAAMttC,KAASP,GAAa,UAAU;AAuCtC,eAAsB8tC,KAAsC;AAC1D,SAAO;AACT;AAEA,eAAsBC,GACpBC,GACwB;AACxB,MAAI;AACF,UAAM37C,IAAS,MAAMqzC,GAAsB,WAAWsI,CAAO,EAAE;AAE/D,QAAI,CAAC37C,EAAO;AACV,YAAM,IAAIkQ;AAAA,QACRlQ,EAAO,SAAS,cAAcA,EAAO,UAAU;AAAA,QAC/C;AAAA,MAAA;AAIJ,WAAOA,EAAO;AAAA,EAChB,SAASue,GAAO;AACdrQ,UAAAA,GAAO,MAAM,0BAA0BqQ,CAAK,GACtCA;AAAA,EACR;AACF;AAEA,eAAsBq9B,GACpBC,IAAqB,IACC;AACtB,MAAI;AACF,UAAMC,IAAK,MAAML,GAAA,GAEX,EAAE,SAAAX,GAAS,YAAA9G,GAAY,iBAAAC,GAAiB,GAAG8H,MAAiBF,GAG5DzH,IAAoBJ,IACtB,OAAO;AAAA,MACL,OAAO,QAAQA,CAAU,EAAE,IAAI,CAAC,CAACxuC,GAAGy5B,CAAC,MAAM,CAAC,SAASz5B,GAAG,EAAE,GAAGy5B,CAAC,CAAC;AAAA,IAAA,IAEjE,CAAA,GAGE+c,IAAyB/H,IAC3B,OAAO;AAAA,MACL,OAAO,QAAQA,CAAe,EAC3B,OAAO,CAAC,CAAA,EAAGhV,CAAC,MAAM,WAAW,OAAOA,CAAC,CAAC,IAAI,CAAC,EAC3C,IAAI,CAAC,CAACz5B,GAAGy5B,CAAC,MAAM,CAAC,SAASz5B,GAAG,EAAE,GAAG,WAAW,OAAOy5B,CAAC,CAAC,CAAC,CAAC;AAAA,IAAA,IAE7D,QAEEgd,IAAe;AAAA,MACnB,aAAaH;AAAA,MACb,SAAShB,IAAU,SAAS,OAAOA,CAAO,GAAG,EAAE,IAAI;AAAA,MACnD,YAAY1G;AAAA,MACZ,GAAI4H,KACJ,OAAO,KAAKA,CAAsB,EAAE,SAAS,IACzC,EAAE,iBAAiBA,EAAA,IACnB,CAAA;AAAA,MACJ,GAAGD;AAAA,IAAA,GAGC/7C,IAAS,MAAMwzC;AAAA,MACnB;AAAA,MACAyI;AAAA,IAAA,GAGI9X,IAAOnkC,EAAO,QAAQ,CAAA;AAG5B,QAAI,CAACA,EAAO,WAAWmkC,EAAK,OAAU;AACpC,YAAMyP,IACHzP,EAAK,SACLA,EAAK,WACNnkC,EAAO,SACP,yBAEIk8C,IACJtI,EAAa,YAAA,EAAc,SAAS,WAAW,KAC/CA,EAAa,cAAc,SAAS,UAAU,KAC9CA,EAAa,cAAc,SAAS,eAAe,KACnDA,EAAa,cAAc,SAAS,cAAc,KAClD5zC,EAAO,eAAe;AAExB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO4zC;AAAA,QACP,WAAWsI,IAAmB,cAAc;AAAA,MAAA;AAAA,IAEhD;AAMA,WAAAzB;AAAA,MACE;AAAA,MACCtW,EAAK,QAAuBA,EAAK;AAAA,MAClC;AAAA,QACE,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,MAAM;AAAA,MAAA;AAAA,IACR,GAEK;AAAA,MACL,SAAS;AAAA,MACT,MAAOA,EAAK,QAAuBA,EAAK;AAAA,MACxC,YAAaA,EAAK,cAA4B;AAAA,MAC9C,UAAWA,EAAK,YAA0B;AAAA,IAAA;AAAA,EAE9C,SAASzL,GAAc;AACrB,UAAM1qB,IAAU0qB,aAAe,QAAQA,EAAI,UAAU;AACrDxqB,WAAAA,GAAO,MAAM,4BAA4BwqB,CAAG,GACrC;AAAA,MACL,SAAS;AAAA,MACT,OAAO1qB;AAAA,MACP,WAAW;AAAA,IAAA;AAAA,EAEf;AACF;AAEA,eAAsBmuC,GAASC,GAAyC;AACtE,MAAI;AACF,UAAMp8C,IAAS,MAAMqzC,GAAsB,WAAW+I,CAAO,EAAE;AAE/D,QAAI,CAACp8C,EAAO,SAAS;AACnB,YAAM4zC,IACJ5zC,EAAO,SAAS,0BAA0BA,EAAO,UAAU;AAC7DkO,YAAAA,GAAO,MAAM,4BAA4B0lC,CAAY,GAC/C,IAAI1jC,GAAS0jC,GAAc,6BAA6B;AAAA,IAChE;AAEA,WAAO5zC,EAAO;AAAA,EAChB,SAAS04B,GAAK;AACZxqB,UAAAA,GAAO,MAAM,mBAAmBwqB,CAAG,GAC7BA;AAAA,EACR;AACF;AAEA,eAAsBob,GACpBC,GACAC,GACAC,GACgC;AAChC,QAAMx+B,IAAQklC,GAAU,gBAAgB;AAExC,MAAI;AACF,UAAM36C,IAAS,MAAMwzC;AAAA,MACnB,WAAWO,CAAM;AAAA,MACjB;AAAA,QACE,mBAAmBC;AAAA,QACnB,GAAIC,KAAmB,OAAO,KAAKA,CAAe,EAAE,SAAS,IACzD,EAAE,iBAAAA,MACF,CAAA;AAAA,MAAC;AAAA,MAEP;AAAA,QACE,SAAS;AAAA,UACP,eAAex+B,IAAQ,UAAUA,CAAK,KAAK;AAAA,QAAA;AAAA,MAC7C;AAAA,IACF;AAGF,QAAI,CAACzV,EAAO;AACVkO,YAAAA,GAAO,MAAM,mCAAmClO,EAAO,KAAK,GACtD,IAAIkQ;AAAA,QACRlQ,EAAO,UAAU,sBACb,mEACAA,EAAO,OAAO,SAAS,iBAAiB,IACtC,mGACCA,EAAO,SACR,oCAAoCA,EAAO,UAAU;AAAA,QAC3D;AAAA,MAAA;AAIJ,WAAOA,EAAO;AAAA,EAChB,SAAS04B,GAAc;AACrBxqB,UAAAA,GAAO,MAAM,8BAA8BwqB,CAAG,GAExCA;AAAA,EACR;AACF;AAEA,eAAsB4b,GACpBP,GACAzQ,GACyC;AACzC,MAAI;AACF,UAAM7tB,IAAQklC,GAAU,gBAAgB;AAYxC,YAVe,MAAMnH;AAAA,MACnB,WAAWO,CAAM;AAAA,MACjBzQ;AAAA,MACA;AAAA,QACE,SAAS;AAAA,UACP,eAAe7tB,IAAQ,UAAUA,CAAK,KAAK;AAAA,QAAA;AAAA,MAC7C;AAAA,IACF,GAGY,QAAQ;AAAA,EACxB,SAASijB,GAAK;AACZxqB,WAAAA,GAAO,MAAM,gCAAgCwqB,CAAG,GACzC;AAAA,EACT;AACF;ACrQA,MAAMxqB,KAASP,GAAa,KAAK;AAUjC,eAAsB0uC,GAAeV,GAAyC;AAE5E,QAAMW,IADY,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAChC,IAAI,YAAY,KAAK;AAEjD,MAAI;AACF,UAAM;AAAA,MACJ,6CAA6CX,CAAO,IAAIW,CAAS;AAAA,IAAA;AAAA,EAErE,SAAS5jB,GAAK;AACZxqB,IAAAA,GAAO,MAAM,wBAAwBwqB,CAAG;AAAA,EAC1C;AACF;;kBCzBA;;AACE,MAAMvqB,IAAIC,EAAA,KAAAC,GAAA,QAAA,GAAG,SAAS,GAAE4Y,IAAM7Y,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,CAAA,EAAA;MAG/BmW,IAAGhW,GAAA,GACDkW,YADFF,CAAG;cACDE,GAAI,GAAA,0BAAA;kBAAJA,GAAI,EAAA;UAAJA,CAAI;AACJ,MAAA6E,cADA7E,GAAI,CAAA,GAQFnW,YAPFgb,CAAC;UAADA,CAAC,WAFH/E,CAAG;AAAH,IAAApW,EAAA,UAAAoW,0CAA6CrW,EAAI,MAAK,UAAU,eAAe,cAAc,EAAA,iBACjB8Y,EAAM,EAAC,aAAa,YAAY,GAC1G7Y,EAAA,cAAAmb,GAAC,cAKYtC,EAAM,EAAC,oBAAoB,oCAAoC,GAE1E7Y,EAAA,UAAAG,SACSJ,EAAI,MAAK,UAAU,UAAU,KAAK,SAAA;AAAA,kBAV/CqW,CAAG;AAFI;;kBCFR;;AAiBE,MACEyQ,IAAI7mB,EAAA,KAAAC,GAAA,QAAA,IAAa,EAAK,GACtBkuC,IAAOnuC,EAAA,KAAAC,GAAA,WAAA,GAAA,MAAS;AAAA,EAAC,CAAC,GAClBmuC,IAAOpuC,EAAA,KAAAC,GAAA,WAAA,GAAA,MAAS;AAAA,EAAC,CAAC,GAKlB6Z,4BAAU,EAAK,GACfjB,IAAM7Y,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,CAAA,EAAA,GAIJouC,IAAaruC,EAAA,QAAA,MAAAC,EAAA,SAAqB4Y,EAAM,EAAC,mBAAmB,kBAAkB,GAC9Ey1B,IAAetuC,EAAA,QAAA,MAAAC,EAAA,WAAuB4Y,EAAM,EAAC,uBAAuB,0FAA0F,GAC9J01B,IAAiBvuC,EAAA,QAAA,MAAAC,EAAA,aAAyB4Y,EAAM,EAAC,qBAAqB,WAAW,GACjF21B,IAAkBxuC,EAAA,QAAA,MAAAC,EAAA,cAA0B4Y,EAAM,EAAC,sBAAsB,QAAQ,GACjF41B,IAAqBzuC,EAAA,QAAA,MAAY6Y,EAAM,EAAC,sBAAsB,qBAAqB;AAGxF,EAAA61B,GAASnzB,GAAA;AAAA;QACR,OAAS;;;QAAT,KAAS8I,GAAA;;;;;AAGR,MAAAsqB,GAAYjuC,GAAA,EAAA;;AACZ,MAAAkuC,GAAUz3B,GAAA;AAAA;;AACV,UAAA03B,GAASjiB,GAAA;AAAA;kBACPxW,IAAGhW,GAAA,GACDgX,YADFhB,CAAG,eACDgB,CAAG;AACD,cAAA03B,cAAc,IAAE,eAAA,QAAA,WADlB13B,CAAG;AAGH,kBAAA6T,cAHA7T,GAAG,CAAA,eAGH6T,GAAE,EAAA;sBAAFA,CAAE;AACF,kBAAA/L,eADA+L,GAAE,CAAA,eACF/L,IAAC,EAAA;sBAADA,EAAC,WALH9I,CAAG;oCAIiFi4B,CAAa,CAAA,uBACJC,CAAe,CAAA;AAAA,8BAL5Gl4B,CAAG;AAAA;;;;AAQL,UAAA24B,GAAW/lB,GAAA;AAAA;kBACT/E,IAAG5N,GAAA,eAAH4N,CAAG;AACD,cAAA/F,GAAMogB,GAAA;AAAA;;;yBAA4C8P,EAAO;AAAA;;yBAAYt0B,EAAO;AAAA;;+BAAc00B,CAAkB;AAAA;;;;+DAC1GA,CAAkB,CAAA,CAAA;;;;;;wCAEyD10B,EAAO,UAAG20B,CAAqB,UAAGF,CAAiB,CAAA;AAAhI,gBAAArwB,GAAMF,GAAA;AAAA;;;2BAAwCmwB,EAAO;AAAA;;2BAAGr0B,EAAO;AAAA;;;;;;;gEAC7Dy0B,CAAiB,CAAA,CAAA;;;;;sBALrBtqB,CAAG,GAAHjkB,EAAA,gBAAA,MAAAA,EAAA,cAAAikB,GAAG,cAAoDpL,EAAM,EAAC,iBAAiB,gBAAgB,CAAA,eAA/FoL,CAAG;AAAA;;;;;;;;;AAlBA;ACvBD,MAAMtL,KAAgB;AAAA;AAAA,EAE3B,UAAU;AAAA,EACV,aAAa;AAAA,EACb,cAAc;AAAA;AAAA,EAGd,mBAAmB;AAAA,EACnB,iBAAiB;AAAA;AAAA,EAGjB,UAAU;AAAA,EACV,aAAa;AAAA,EACb,cAAc;AAAA,EACd,oBAAoB;AAAA;AAAA,EAGpB,kBAAkB;AAAA,EAClB,yBACE;AAAA,EACF,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,kBAAkB;AAAA;AAAA,EAGlB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA;AAAA;AAAA,EAItB,mBAAmB;AAAA,EACnB,yBAAyB;AAAA;AAAA,EAGzB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,sBAAsB;AAAA;AAAA,EAGtB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,wBAAwB;AAAA,EACxB,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,8BAA8B;AAAA,EAC9B,yBAAyB;AAAA,EACzB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,YAAY;AAAA;AAAA,EAGZ,OAAO;AAAA,EACP,UAAU;AAAA;AAAA,EAEV,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,qBAAqB;AAAA;AAAA,EAErB,gBAAgB;AAAA;AAAA,EAGhB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA;AAAA,EAGZ,cAAc;AAAA,EACd,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,eAAe;AAAA;AAAA,EAGf,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,2BAA2B;AAAA;AAAA,EAE3B,aAAa;AAAA;AAAA,EAGb,SAAS;AAAA,EACT,UAAU;AAAA,EACV,aAAa;AAAA,EACb,UAAU;AAAA,EACV,UAAU;AAAA,EACV,0BAA0B;AAAA;AAAA,EAG1B,WAAW;AAAA,EACX,2BAA2B;AAAA,EAC3B,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,QAAQ;AAAA;AAAA,EAGR,iBAAiB;AAAA,EACjB,qBACE;AAAA,EACF,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,oBACE;AAAA;AAAA,EAGF,gBACE;AAAA;AAAA,EAGF,WAAW;AAAA,EACX,kBAAkB;AAAA;AAAA,EAGlB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,uBAAuB;AAAA,EACvB,iBAAiB;AAAA;AAAA,EAGjB,SAAS;AAAA;AAAA,EAGT,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,0BAA0B;AAAA,EAC1B,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,yBAAyB;AAAA,EACzB,cAAc;AAAA,EACd,aAAa;AAAA;AAAA,EAGb,wBAAwB;AAAA,EACxB,8BAA8B;AAAA,EAC9B,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,0BAA0B;AAAA,EAC1B,eAAe;AAAA,EACf,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,wBAAwB;AAAA;AAAA,EAGxB,wBAAwB;AAAA,EACxB,8BAA8B;AAAA,EAC9B,gBAAgB;AAAA;AAAA,EAGhB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,WAAW;AAAA,EACX,qBAAqB;AAAA,EACrB,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA;AAAA,EAGzB,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,0BAA0B;AAAA,EAC1B,IAAI;AAAA;AAAA,EAGJ,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,SAAS;AAAA,EACT,gBAAgB;AAAA;AAAA,EAGhB,YAAY;AAAA;AAAA,EAGZ,SAAS;AAAA;AAAA,EAET,UAAU;AAAA;AAAA;AAAA,EAIV,WAAW;AAAA;AAAA,EAGX,OAAO;AAAA;AAAA,EAGP,kBAAkB;AAAA;AAAA,EAGlB,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,cAAc;AAAA,EACd,0BAA0B;AAAA,EAC1B,SAAS;AAAA,EACT,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,MAAM;AAAA;AAAA,EAEN,SAAS;AAAA;AAAA,EAET,cAAc;AAAA,EACd,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,cAAc;AAAA;AAAA,EAGd,iBAAiB;AAAA,EACjB,UAAU;AAAA;AAAA,EAEV,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,UAAU;AAAA;AAAA,EAEV,kBAAkB;AAAA;AAAA,EAElB,kBAAkB;AAAA;AAAA,EAElB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA;AAAA;AAAA,EAIjB,WAAW;AAAA;AAAA,EAEX,YAAY;AAAA;AAAA,EAEZ,SAAS;AAAA;AAAA,EAET,UAAU;AAAA;AAAA,EAEV,gBAAgB;AAAA;AAAA,EAEhB,aAAa;AAAA;AAAA,EAEb,QAAQ;AAAA;AAAA,EAGR,oBAAoB;AAAA,EACpB,+BAA+B;AAAA,EAC/B,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,OAAO;AAAA;AAAA,EAEP,kBAAkB;AAAA;AAAA,EAGlB,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,eAAe;AAAA,EACf,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,gBAAgB;AAAA;AAAA,EAGhB,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,UAAU;AAAA,EACV,cAAc;AAAA,EACd,aAAa;AAAA,EACb,eAAe;AAAA,EACf,oBAAoB;AAAA;AAAA,EAEpB,SAAS;AAAA,EACT,uBAAuB;AAAA;AAAA,EAGvB,SAAS;AAAA,EACT,wBAAwB;AAAA,EACxB,mBAAmB;AAAA,EACnB,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,kBAAkB;AAAA;AAAA,EAGlB,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,gBAAgB;AAAA;AAAA,EAGhB,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,wBAAwB;AAAA;AAAA,EAGxB,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,wBAAwB;AAAA,EACxB,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,uBAAuB;AAAA;AAAA,EAGvB,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,sBAAsB;AAAA,EACtB,2BAA2B;AAAA,EAC3B,2BAA2B;AAAA,EAC3B,sBAAsB;AAAA;AAAA,EAEtB,yBAAyB;AAAA;AAAA,EAEzB,0BAA0B;AAAA;AAAA,EAE1B,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,mBAAmB;AAAA;AAAA;AAAA;AAAA,EAKnB,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,uBAAuB;AAAA,EACvB,8BAA8B;AAAA,EAC9B,uBAAuB;AAAA,EACvB,UAAU;AAAA,EACV,eAAe;AAAA,EACf,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,gBAAgB;AAAA;AAAA,EAEhB,eAAe;AAAA,EACf,uBAAuB;AAAA,EACvB,mBAAmB;AAAA;AAAA,EAGnB,WAAW;AAAA;AAAA,EAEX,gBAAgB;AAAA,EAChB,+BAA+B;AAAA,EAC/B,QAAQ;AAAA;AAAA,EAGR,UAAU;AAAA,EACV,wBAAwB;AAAA,EACxB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,yBAAyB;AAAA,EACzB,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,aAAa;AAAA,EACb,qBAAqB;AAAA;AAAA,EAErB,gBAAgB;AAAA;AAAA,EAEhB,oBAAoB;AAAA,EACpB,iCAAiC;AAAA,EACjC,2BAA2B;AAAA,EAC3B,uBAAuB;AAAA;AAAA,EAGvB,mBAAmB;AAAA,EACnB,6BAA6B;AAAA,EAC7B,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,6BAA6B;AAAA,EAC7B,uBAAuB;AAAA,EACvB,yBAAyB;AAAA;AAAA,EAGzB,UAAU;AAAA;AAAA,EAGV,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA;AAAA,EAGpB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,uBAAuB;AAAA;AAAA,EAGvB,kBAAkB;AAAA;AAAA,EAGlB,6BAA6B;AAAA,EAC7B,mBAAmB;AAAA;AAAA,EAGnB,uBAAuB;AAAA,EACvB,oBAAoB;AAAA;AAAA,EAGpB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,mBAAmB;AAAA;AAAA,EAEnB,gBAAgB;AAAA;AAAA,EAGhB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,kCAAkC;AAAA,EAClC,+BAA+B;AAAA,EAC/B,wBAAwB;AAAA,EACxB,mCAAmC;AAAA,EACnC,gCAAgC;AAAA,EAChC,sBAAsB;AAAA,EACtB,yBAAyB;AAAA,EACzB,kBAAkB;AAAA,EAClB,4BAA4B;AAAA,EAC5B,wBAAwB;AAAA;AAAA,EAGxB,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,0BAA0B;AAAA,EAC1B,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA;AAAA,EAGnB,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,6BAA6B;AAAA,EAC7B,0BAA0B;AAAA,EAC1B,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA;AAAA,EAGtB,QAAQ;AAAA;AAAA,EAGR,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,6BAA6B;AAAA,EAC7B,wBAAwB;AAAA,EACxB,sBAAsB;AAAA,EACtB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,OAAO;AAAA,EACP,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,WAAW;AAAA,EACX,WAAW;AAAA,EACX,eAAe;AAAA,EACf,WAAW;AAAA,EACX,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,YAAY;AACd,GCthBaq2B,KAAK;AAAA;AAAA,EAEhB,UAAU;AAAA,EACV,aAAa;AAAA,EACb,cAAc;AAAA;AAAA,EAGd,mBAAmB;AAAA,EACnB,iBAAiB;AAAA;AAAA,EAGjB,UAAU;AAAA,EACV,aAAa;AAAA,EACb,cAAc;AAAA,EACd,oBAAoB;AAAA;AAAA,EAGpB,kBAAkB;AAAA,EAClB,yBACE;AAAA,EACF,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,kBAAkB;AAAA;AAAA,EAGlB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA;AAAA,EAGtB,mBAAmB;AAAA,EACnB,yBAAyB;AAAA;AAAA,EAGzB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,sBAAsB;AAAA;AAAA,EAGtB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,WAAW;AAAA,EACX,kBAAkB;AACpB,GChDMC,KAAU,EAAA,IAAEC,IAAI,IAAAF;AASf,SAASG,GAAcC,GAAK;AACjC,MAAY,OAAOA,KAAQ,SAAU,QAAO,EAAE,QAAQF,IAAI,QAAQ;AAClE,QAAMG,IAAQD,EAAI;AAElB,MAAIH,GAAQI,CAAK,EAAG,QAAO,EAAE,QAAQJ,GAAQI,CAAK,GAAG,QAAQA;AAE7D,QAAMt5B,IAAOs5B,EAAM,MAAM,GAAG,EAAE,CAAC;AAC/B,SAAIJ,GAAQl5B,CAAI,IAAU,EAAE,QAAQk5B,GAAQl5B,CAAI,GAAG,QAAQA,MACpD,EAAE,QAAQm5B,IAAI,QAAQ,KAAI;AACnC;AAKO,SAASI,KAAe;AAC7B,SAAI,OAAO,YAAc,MAAoB,OACtC,UAAU;AAAA,EAAgC,UAAW,gBAAgB;AAC9E;AASO,SAASC,GAAmBxgC,GAAQ6J,IAAa,IAAI;AAC1D,QAAMw2B,IAAMrgC,KAAUugC,GAAY,KAAM,MAClC,EAAE,QAAAz2B,EAAM,IAAKs2B,GAAcC,CAAG;AACpC,SAAO,EAAE,GAAGz2B,IAAe,GAAGE,GAAQ,GAAGD,EAAU;AACrD;AC1DE,MAAM9Y,KAASP,GAAa,mBAAmB;;kBAGjD;;;AAcE,WAASiwC,IAAgB;AACvB,QAAE,OAAS,SAAW,IAAa,QAAO,IAAI,IAAI,kBAAkB;AACpE,QAAI;AACF,aAAO,IAAI,IAAI,OAAO,SAAS,IAAI;AAAA,IACrC,QAAQ;AACN,aAAO,IAAI,IAAI,kBAAkB;AAAA,IACnC;AAAA,EACF;AAEA,QAAMC,IAAYC,GAAQ;AAAA,IACxB,KAAKF,EAAa;AAAA,IAClB,QAAM,CAAA;AAAA,IACN,OAAK,EAAI,IAAI,KAAI;AAAA,IACjB,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAI,CAAA;AAAA,IACJ,MAAM;AAAA,IACN,OAAK,CAAA;AAAA;AAKP,WAASG,IAAgB;AACvB,IAAAF,EAAU,IAAG;AAAA,MACX,KAAK,IAAI,IAAI,OAAO,SAAS,IAAI;AAAA,MACjC,QAAM,CAAA;AAAA,MACN,OAAK,EAAI,IAAI,KAAI;AAAA,MACjB,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,MAAI,CAAA;AAAA,MACJ,MAAM;AAAA,MACN,OAAK,CAAA;AAAA;EAET;AAGA,WAASG,EAAQjf,GAAKnxB,QAAc;AAClC,IAAE,OAAS,SAAW,QAClBA,EAAQ,eACV,OAAO,QAAQ,aAAY,CAAA,GAAK,IAAImxB,CAAG,IAEvC,OAAO,QAAQ,UAAS,CAAA,GAAK,IAAIA,CAAG,GAEtCgf,EAAa;AAAA,EACf;AAGA,QAAME,IAAOJ;AAGb,MAAIK,IAAa,MAEbC,IAAe,GAGfC,IAAShwC,EAAA,MAAM,MAAA,GAEfiwC,IAAwB,MACxBC,IAAyB,MAiCzBC,IAAYnwC,EAAA,MAAO,EAAK,GACxBowC,IAAoBpwC,EAAA,MAAO,IAAI,GAC/BqwC,IAAwBrwC,EAAA,MAAO,IAAI,GACnCswC,IAAqBtwC,EAAA,MAAO,IAAI,GAChCuwC,IAAqBvwC,EAAA,MAAO,IAAI;AAEpC,EAAE,OAAS,SAAW,OACL,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAC9C,IAAI,QAAQ,MAAM,OAC3BA,EAAA,IAAAmwC,GAAY,EAAI;AAKpB,MAAIK,IAAmB,oBAAI,IAAG,GAI1BC,IAAmBzwC,EAAA,MAAMA,EAAA,MAAC,oBAAI,IAAG,CAAA,CAAA,GAEjC0wC,IAAgB,oBAAI,IAAG,GAEvBC,KAAiB;AAGrB,WAASC,EAAWjgB,GAAK;AACvB,IAAE,OAAS,SAAW,QACpB,OAAO,SAAS,OAAOA;AAAA,EAE3B;AAwBA,MACEkgB,KAAe7wC,EAAA,KAAAC,GAAA,mBAAA,GAAG,EAAK,GACvB6wC,uCAAoB,EAAK,GAGzB9e,KAAMhyB,EAAA,KAAAC,GAAA,UAAA,IAAA,MAAA,EAAA,GAGNknC,4BAAU,EAAE,GACZ4J,mCAAiB,EAAE,GAEnBC,iCAAe,IAAI,GACXp4B,KAAU5Y,EAAA,KAAAC,GAAA,UAAA,IAAA,OAAA,CAAA,EAAA,GAElB8O,2BAAS,MAAS,GAClBkiC,kCAAgB,IAAI,GAEpBC,kCAAe,IAAI,GACnBC;;;;IAAU;AAAA;AAAA,KAMVC,uCAAoB,EAAK,GAMvBC,KAAcrxC,EAAA,QAAA,MAAY+O,OAAUugC,GAAY,KAAM,OAAO,GAC7Dz2B,IAAM7Y,EAAA,QAAA,MAAYuvC,GAAkBvvC,EAAA,IAACqxC,EAAc,GAAEz4B,GAAU,CAAA,CAAA;AAGnE,EAAA5Y,EAAA,kBAAc;AACZ,IAAAq3B,SAAiBga,EAAc,CAAA;AAAA,EACjC,CAAC;AAOD,MAAIC,IAAYtxC,EAAA,MAAO,EAAK;AAChB,EAAAA,EAAA,MAAO,IAAI,GACHA,EAAA,MAAMA,EAAA,MAAA,CAAA,CAAA,CAAA;AAC1B,MAAIuxC,IAAYvxC,EAAA,MAAO,EAAK,GAExBwxC,IAAYxxC,EAAA,MAAO,EAAK,GAGxByxC,IAAkBzxC,EAAA,MAAO,IAAI,GAY7B0xC,IAAa1xC,EAAA,MAAO,UAAU,GAC9B2xC,IAAe3xC,EAAA;AAAA,IAAO;AAAA;AAAA,KAEtB4xC,KAAiB5xC,EAAA,MAAO,IAAI,GAC5B6xC,KAAkB7xC,EAAA;AAAA,IAAO;AAAA;AAAA,KAIzB8xC,KAAY,GACZC,KAAgB/xC,EAAA,MAAO,IAAI,GAC3BgyC,KAAiBhyC,EAAA,MAAO,IAAI,GAC5BiyC,KAAqBjyC,EAAA,MAAO,IAAI,GAChCkyC,KAAelyC,EAAA,MAAO,IAAI,GAC1BmyC,KAAcnyC,EAAA,MAAO,IAAI,GAGzBoyC,KAAmBpyC,EAAA,MAAO,EAAK,GAC/BqyC,KAAuBryC,EAAA,MAAO,EAAK,GACnCsyC,KAAiB;AAGrB,QAAMC,KAAoB;AAC1B,MAAIC,KAAsBxyC,EAAA,MAAO,EAAK,GAClCyyC,KAAkB;AAGtB,EAAAzyC,EAAA,kBAAc;AACZ,IAAEA,EAAA,IAAEsxC,CAAS,KAAA,CAAAtxC,EAAA,IAAKuxC,CAAS,MACzBkB,KAAkB;AAAA,YAAiB;AACjC,QAAEzyC,EAAA,IAAEsxC,CAAS,KAAAtxC,EAAA,IAAEwyC,IAAsB,EAAI;AAAA,MAC3C;AAAA,MAAGD;AAAA;EAEP,CAAC,GAGDvyC,EAAA,kBAAc;AACZ,IAAEA,EAAA,IAAEuxC,CAAS,MACPkB,MAAiB,aAAaA,EAAe,GACjDzyC,EAAA,IAAAwyC,IAAsB,EAAK;AAAA,EAE/B,CAAC,GAIDxyC,EAAA,kBAAc;AACZ,IAAEA,EAAA,IAAEmwC,CAAS,MACXrwC,GAAO,KACL,uHAAuH,GAEzH,OAAO,kCAAuC,EAAE,KAAI,CAACuC,MAAK;YACxD+tC,GAAoB/tC,EAAE,SAAO,EAAA;AAAA,IAC/B,CAAC,GACD,OAAO,sCAA2C,EAAE,KAAI,CAACA,MAAK;YAC5DguC,GAAwBhuC,EAAE,SAAO,EAAA;AAAA,IACnC,CAAC,GACD,OAAO,mCAAwC,EAAE,KAAI,CAACA,MAAK;YACzDiuC,GAAqBjuC,EAAE,SAAO,EAAA;AAAA,IAChC,CAAC,GACD,OAAO,mCAAwC,EAAE,KAAI,CAACA,MAAK;YACzDkuC,GAAqBluC,EAAE,SAAO,EAAA;AAAA,IAChC,CAAC;AAAA,EAEL,CAAC,GAGDmhB,SAAgB;AACd,IAAIivB,MAAiB,aAAaA,EAAe;AAAA,EACnD,CAAC;AAID,MAAIC,2BAA8BF,EAAmB,CAAA,GACjDG,KAAW3yC,EAAA,QAAA,MAAAA,EAAA,IAAYuxC,CAAS,KAAA,CAAAvxC,EAAA,IAAK0yC,EAAkB,CAAA,GACvDE,KAAc5yC,EAAA,MAAM,MAAA;AAExB,QAAM6yC,MACJ,MAAM,GACN,SAAS,GACT,UAAU,GACV,UAAU,GACV,UAAU,EAAC,GAGPC,IAAU,CAAI,QAAQ,WAAW,YAAY,YAAY,UAAU;AAGzE,MAAIC,qBAAgC;AAClC,UAAMC,IAAYC,EAAK,EAAC,IAAI,aAAa,IAAI,MAAM,GAC7CC,IAAYJ,EAAW,QAAQE,CAAS;AAC9C,WAAOE,KAAa,IAAIA,IAAYL,EAAK;AAAA,EAC3C,CAAC,GAEGM,IAAazD,GAASmD,EAAK,QAAQ;AAClB,EAAAnD,GAAS,EAAE,GAGhC1vC,EAAA,kBAAc;AACZ,IAAAmzC,EAAW,IAAGnzC,EAAA,IAAC+yC,EAAW,CAAA;AAAA,EAC5B,CAAC;AAID,MAAIK,KAAgB1D,IAAS,oBAAI,KAAI,GAAG,SAAQ,CAAA,GAC5C2D,KAAe3D,IAAS,oBAAI,KAAI,GAAG,YAAW,CAAA;AAGlD,EAAA1vC,EAAA,kBAAc;AACZ,IAAE,OAAAC,EAAA,gBAA0B,YAC1BmzC,GAAc,IAAGnzC,EAAA,YAAA;AAAA,EAErB,CAAC,GAEDD,EAAA,kBAAc;AACZ,IAAE,OAAAC,EAAA,eAAyB,YACzBozC,GAAa,IAAGpzC,EAAA,WAAA;AAAA,EAEpB,CAAC;AAED,MAAI0L,KAAK3L,EAAA,QAAA,MAAA,OAAAC,EAAA,cACc,aAAc,8BAA4BmzC,EAAa,GAE1E3tC,KAAIzF,EAAA,QAAA,MAAA,OAAAC,EAAA,aACc,aAAc,6BAA2BozC,EAAY;AAG3E,QAAMC,WAA0B;AAC9B,IAAAF,GAAc,OAAM,CAAC/wC,MACnBA,MAAM,MAAMgxC,GAAa,OAAM,CAACjxC,MAAKA,IAAI,CAAC,GAAG,KAAKC,IAAI,CAAC;AAAA,EAE3D,GACMkxC,WAA0B;AAC9B,IAAAH,GAAc,OAAM,CAAC/wC,MACnBA,MAAM,KAAKgxC,GAAa,OAAM,CAACjxC,MAAKA,IAAI,CAAC,GAAG,MAAMC,IAAI,CAAC;AAAA,EAE3D;AAGA,WAASmxC,KAAqB;AAE5B,UAAMzkB,IAAM,oBAAI,KAAI,GACd0kB,IAAc1kB,EAAI,SAAQ,GAC1B2kB,IAAa3kB,EAAI,YAAW;AAGlC,IAAE,OAAA9uB,EAAA,cAAuB,aAAc,aAExBA,EAAA,aAAA,IAAIwzC,CAAW,IAG5BL,GAAc,IAAIK,CAAW,GAG7B,OAAAxzC,EAAA,aAAsB,aAAc,aAExBA,EAAA,YAAA,IAAIyzC,CAAU,IAG1BL,GAAa,IAAIK,CAAU;AAAA,EAE/B;AAGA,WAASC,KAAsB;AAC7B,UAAM5kB,IAAM,oBAAI,KAAI,GACd0kB,IAAc1kB,EAAI,SAAQ,GAC1B2kB,IAAa3kB,EAAI,YAAW,GAG5B6kB,2BACiB,aAAc,aAAaC,EAAM,IAAGC,EAAc,GACnEC,2BACgB,aAAc,aAAaC,EAAK,IAAGC,EAAa,GAGhEC,MAAaR,IAAaK,MAAY,MAAMN,IAAcG;AAEhE,QAAIM,OAAc;AAEhB;AAGF,UAAMxY,KAAYwY,KAAY,IAAC,KAAQ;AAEvC,IAAEl0C,EAAA,IAAE4yC,EAAW,GAAE,yBACf5yC,EAAA,IAAA4yC,EAAW,EAAC,uBAAuBlX,IAAW8X,EAAkB,IAEhEA,GAAkB;AAAA,EAEtB;AAEA,MAAIW,oCAA6Cb,EAAiB,GAC9Dc,oCAA6Cb,EAAiB;AAGlE,WAASc,KAAqB;AAC5B,IAAEr0C,EAAA,IAAE4yC,EAAW,GAAE,yBACf5yC,EAAA,IAAA4yC,EAAW,EAAC,uBAAuB,SAAGuB,CAAmB,CAAA,UAEzDA,CAAmB,EAAA;AAAA,EAEvB;AAEA,WAASG,KAAqB;AAC5B,IAAEt0C,EAAA,IAAE4yC,EAAW,GAAE,yBACf5yC,EAAA,IAAA4yC,EAAW,EAAC,uBAAsB,UAAKwB,CAAmB,CAAA,UAE1DA,CAAmB,EAAA;AAAA,EAEvB;AAGA,MAAIG,KAAoBv0C,EAAA,QAAA,MAAA;AAAA,MACpB,IAAI6yC,EAAK,MAAM,MAAI7yC,EAAA,IAAE6Y,CAAM,EAAC,SAAQ;AAAA,MACpC,IAAIg6B,EAAK,SAAS,MAAI7yC,EAAA,IAAE6Y,CAAM,EAAC,YAAW;AAAA,MAC1C,IAAIg6B,EAAK,UAAU,MAAI7yC,EAAA,IAAE6Y,CAAM,EAAC,aAAY;AAAA,MAG5C27B,qBACF3D,GAAe,IACX,MAAM,QAAQA,GAAe,CAAA,IAC3BA,aACA0D,EAAoB;AAI5B,WAASE,GAAarV,GAAQ;AAC5B,IAAA+T,EAAW,IAAI/T,EAAO,EAAE;AAExB,UAAMz+B,IAAS,IAAI,gBAAgBsyC,EAAK,EAAC,IAAI,YAAY;AACzD,IAAAtyC,EAAO,IAAI,QAAQmyC,EAAW1T,EAAO,EAAE,CAAA,GACvCwQ,EAAO,IAAKjvC,EAAO,SAAQ,CAAA,IAAA,EAAQ,cAAc,GAAqB,CAAA;AAAA,EACxE;AAEA,MAAI+zC,KAAchF,GAAS,EAAE,GAEzBiF,KAAiBjF,GAAQ,EAAA;AAQ7B,iBAAekF,GAAgBlB,GAAYD,GAAaoB,IAAY,IAAO;AAEzE,QADE,CAAA70C,EAAA,IAAGwxC,CAAS,KACZ,CAAGrK,EAAO,KAAA,CAAK4J;AACf;AAGF,UAAM+D,IAAQ,GAAMpB,CAAU,IAAI,OAAOD,IAAc,CAAC,EAAE,SAAS,GAAG,GAAG,CAAA;AAGzE,QAAE,EAAAzzC,EAAA,IAAEywC,CAAgB,EAAC,IAAIqE,CAAQ,KAAKpE,EAAc,IAAIoE,CAAQ,IAIhE;AAAA,MAAApE,EAAc,IAAIoE,CAAQ,GACtBD,KACF70C,EAAA,IAAAsxC,GAAY,EAAI;AAGlB,UAAI;AAEF,cAAMyD,KAAWtB,IAAc;AAC/B,YAAI7hD;AAQJ,YANIm/C,EAAc,IAChBn/C,KAAS,MAAMw1C,GAAkB2J,EAAc,GAAE2C,GAAYqB,EAAQ,IAC5D5N,QACTv1C,KAAS,MAAMs1C,GAAeC,EAAO,GAAEuM,GAAYqB,EAAQ,IAG3D,CAAA/0C,EAAA,IAAGwxC,CAAS,EAAE;AAEhB,cAAMwD;AAAA;AAAA,UAAgCpjD;AAAA,WAUhCqjD,MALY,MAAM,QAAQD,EAAS,IACrCA,KACA,MAAM,QAAQA,IAAW,MAAM,IAC7BA,GAAU,SAAM,CAAA,GAGnB,IAAIzJ,EAAkB,EACtB,OAAO,OAAO;AAGjB,QAAAvrC,EAAA,IAAAywC,CAAgB,EAAC,IAAIqE,GAAUG,EAAiB,GAEhDj1C,EAAA,IAAAywC,GAAmB,IAAI,UAAIA,CAAgB,CAAA,GAAA,EAAA,GAGzC,CAAG,MAAM,QAAQuE,EAAS,KAAKA,IAAW,eAC1CrE,KAAiBqE,GAAU;AAAA,MAE/B,SAAS1qB,IAAK;AACZxqB,QAAAA,GAAO,MAAK,4BAA6Bg1C,CAAQ,KAAKxqB,EAAG,GAErDuqB,KAAS70C,EAAA,IAAIwxC,CAAS,KACxBc,KAAiBwC,GACjB90C,EAAA,IAAAoyC,IAAmB,EAAI,YAGvB3B,CAAgB,EAAC,IAAIqE,GAAQ,CAAA,CAAA,GAC7B90C,EAAA,IAAAywC,GAAmB,IAAI,UAAIA,CAAgB,CAAA,GAAA,EAAA;AAAA,MAE/C,UAAC;AACC,QAAAC,EAAc,OAAOoE,CAAQ,GACzBD,KAAS70C,EAAA,IAAIwxC,CAAS,MACxBxxC,EAAA,IAAAsxC,GAAY,EAAK,GACjBtxC,EAAA,IAAAuxC,GAAY,EAAI;AAAA,MAEpB;AAAA;AAAA,EACF;AAKA,WAAS2D,GAAsBC,GAAWC,GAAW;AAMnD,KALkB,OACT,sBAAwB,MAC3B,sBAAmB,CACnBC,MAAM,WAAWA,GAAI,GAAG,SAEX;AAEjB,YAAMC,IAAYH,MAAc,IAAI,KAAKA,IAAY,GAC/CI,KAAWJ,MAAc,IAAIC,IAAY,IAAIA;AACnD,MAAAR,GAAgBW,IAAUD,CAAS;AAGnC,YAAME,KAAYL,MAAc,KAAK,IAAIA,IAAY,GAC/CM,KAAWN,MAAc,KAAKC,IAAY,IAAIA;AACpD,MAAAR,GAAgBa,IAAUD,EAAS;AAAA,IACrC,CAAC;AAAA,EACH;AAkGA,EAAAvU,SAAc;AAKZ,QAJAjhC,EAAA,IAAAwxC,GAAY,EAAI,GAIZL,GAAO,MAAK;AACd,MAAArB,IAAa;AAAA,SACR;AACL,MAAAA,IAAa,IAAIvf,GAAgB;AAAA,QAC/B,YAAU,CAAE0c,MAAS;AAInB,cAFA0C,EAAa,GAETyB,GAAiB;AAInB,gBAAInE,EAAM,QAAQ;AAChB,oBAAMzsB,IAAK,OAAOysB,EAAM,OAAO,EAAE;AACjC,eAAE,CAAAjtC,EAAA,IAAG2xC,CAAY,KAAI,OAAM3xC,EAAA,IAAC2xC,CAAY,EAAC,EAAE,MAAMnxB,MAC/Ck1B,GAAqBl1B,GAAIysB,EAAM,OAAO,MAAI,EACxC,UAAU,IAAK;AAAA,YAGrB,MAAO,OAAIyE,CAAU,MAAK,cACxBiE,GAAqB,EAAG,UAAU,IAAK;AAAA,mBAEhC1I,EAAM,QAAQ;AAEvB,kBAAM2I,IAAW,OAAO3I,EAAM,OAAO,EAAE,GACjCviC,IAAK1K,EAAA,IAAG61C,EAAS,EAAC,KAAI,CAACC,OAAM,OAAOA,GAAG,EAAE,MAAMF,CAAQ;AAC7D,gBAAIlrC;AAEF,kBAAEzK,EAAA,gBAAA,OAAAA,EAAA,gBAA0C;+BAC7ByK,CAAK;AAAA,mBACb;AAEL,sBAAMqrC,KACJrrC,EAAM,QAAQwlB,GAAaxlB,EAAM,QAAQ,OAAO;AAClD,gBAAAkmC,EAAU,MAAOlmC,EAAM,EAAE,IAAIqrC,EAAS,EAAA;AAAA,cACxC;AAAA;AAIA,cAAAjG,GAAY,YAAW;AAAA,UAE3B;AAEE,YAAImB,EAAa,KACfA,EAAa,EAAC,gBAAe,GAE/B,4BAA4B,OAAO,SAAS,GAAGlB,CAAY,CAAA;AAI7D,cAAI9C,EAAM,OAAO;AACf,kBAAM,CAAC+I,GAASC,CAAQ,IAAIhJ,EAAM,MAAM,MAAM,GAAG,GAC3CyG,KAAa,SAASsC,GAAS,EAAE,GACjCvC,KAAc,SAASwC,GAAU,EAAE,IAAI;AAC7C,YAAE,CAAG,MAAMvC,EAAU,MAAM,MAAMD,EAAW,MAC1CJ,GAAa,IAAIK,EAAU,GAC3BN,GAAc,IAAIK,EAAW;AAAA,UAEjC;AAAA,QACF;AAAA;AAIF,YAAMyC,IAAepG,EAAW,UAAS;AAMzC,UALIoG,EAAa,gBAGfzE,GAAkByE,EAAa,QAAM,EAAA,GAEnCA,EAAa,OAAO;AACtB,cAAM,CAACF,GAASC,CAAQ,IAAIC,EAAa,MAAM,MAAM,GAAG,GAClDxC,IAAa,SAASsC,GAAS,EAAE,GACjCvC,KAAc,SAASwC,GAAU,EAAE,IAAI;AAC7C,QAAE,CAAG,MAAMvC,CAAU,MAAM,MAAMD,EAAW,MAC1CJ,GAAa,IAAIK,CAAU,GAC3BN,GAAc,IAAIK,EAAW;AAAA,MAEjC;AAAA,IACF;AAIA,IAAI3e,GAAkB,MAKlB90B,EAAA,IAAEgwC,CAAM,MACRC,IAAwB7a,GAAap1B,EAAA,IAACgwC,CAAM,GAAEjb,IAAU,MACtD,KAAK,KAAK,SAAS,gBAAgB,YAAY,CAAA,IAI/Cqc,GAAiB,MACnBlB,IAAyBta,GAAuB,CAAA,EAAI,IAAApV,GAAI,MAAA8P,EAAI,MAAO;AAEjE,UAAI9P,KAAO,QAA4BA,MAAO,IAAI;AAChD,QAAAm1B,GAAqB,EAAG,UAAU,IAAI;AACtC;AAAA,MACF;AAGA,YAAMQ,IAAS,OAAO31B,CAAE;AACxB,MAAK,QAAQ,KAAK21B,CAAM,KACxBT,GAAqBS,GAAM,OAAS7lB,KAAS,WAAWA,IAAO,EAAE;AAAA,IACnE,CAAC;AAAA,EAGP,CAAC,GAGDtwB,EAAA,kBAAc;AACZ,QAAEA,EAAA,IAAEwxC,CAAS,KAAA,CAAAxxC,EAAA,IAAKuxC,CAAS,MAAKR,OAAkB5J,EAAO,IAAG;AAC1D,YAAMiP,6BACoB,WAAQn2C,EAAA,gBAAkB,oBAAI,KAAI,GAAG,SAAQ,GACjEo2C,4BACmB,WAAQp2C,EAAA,eAE3B,oBAAI,KAAI,GAAG,YAAW;AAC5B,MAAA20C,GAAgByB,GAAaD,GAAc,EAAI;AAAA,IACjD;AAAA,EACF,CAAC,GAED5yB,SAAgB;AACd,IAAAxjB,EAAA,IAAAwxC,GAAY,EAAK,GAEb1B,MACFA,EAAW,QAAO,GAClBA,IAAa,OAEXmB,EAAa,MACfA,EAAa,EAAC,QAAO,GACrBA,EAAgB,IAAI,IAElBhB,MACFA,EAAqB,GACrBA,IAAwB,OAEtBC,MACFA,EAAsB,GACtBA,IAAyB;AAAA,EAE7B,CAAC,GAGDlwC,EAAA,kBAAc;AACZ,QAAEA,EAAA,IAAEwxC,CAAS,KAAAxxC,EAAA,IAAIuxC,CAAS,KAAIsC,EAAM,MAAK,UAAaG,EAAK,MAAK,WAC9DY,GAAgBZ,KAAOH,GAAM,GAE7BqB,GAAsBrB,KAAQG,GAAK,GAE/BlE,IAAY;AACd,YAAMmG,IAAQ,GAAMjC,EAAK,CAAA,IAAI,OAAOH,EAAM,IAAG,CAAC,EAAE,SAAS,GAAG,GAAG,CAAA;AAC/D,MAAA/D,EAAW,SAASmG,CAAQ;AAAA,IAC9B;AAAA,EAEJ,CAAC;AAID,MAAIK,KAAet2C,EAAA,QAAA,MAAY,MAAM,WAAKywC,CAAgB,EAAC,OAAM,CAAA,EAAI,KAAI,CAAA,GAIrE8F,KAAWv2C,EAAA,QAAA,MAAAA,EAAA,IACbuxC,CAAS,KAAAvxC,EAAA,IAAIs2C,EAAe,EAAC,WAAW,KAAKtkB,GAAM,EAAC,WAAW,CAAC,GAI9D6jB,qBAA8B;AAChC,UAAMW,UAAeF,EAAe,EAAC,SAAS,UAAIA,EAAe,IAAA,CAAA,GAC3DG,IAAezkB,GAAM,EAAC,SAAS,IAAIA,GAAM,IAAA,CAAA,GAEzC0kB,IAAO,oBAAI,IAAG,GACdC,IAAO,CAAA,GAAOH,GAAY,GAAKC,CAAY,EAAE,OAAM,CAAC73C,OACpD83C,EAAK,IAAI93C,GAAE,EAAE,IAAU,MAC3B83C,EAAK,IAAI93C,GAAE,EAAE,GACN,GACR;AAGD,WAAOsyC,GAAY,IAAG3c,GAAmBoiB,GAASzF,GAAY,CAAA,IAAIyF;AAAA,EACpE,CAAC;AAGD,EAAA32C,EAAA,kBAAc;AACZ,QAAEA,EAAA,IAAGyxC,CAAe,GAEpB;AAAA,UAAIL,GAAiB,GAAE;AAKrB,cAAM,EAAE,IAAA5wB,GAAI,MAAA8P,EAAI,UAAKmhB,CAAe;AACpC,QAAAzxC,EAAA,IAAAyxC,GAAkB,IAAI,GACtBiE,GAAqBl1B,GAAI8P,GAAI,EAAI,UAAU,GAAK,CAAA;AAChD;AAAA,MACF;AAIA,UAAEtwB,EAAA,IAAEuxC,CAAS,KAAAvxC,EAAA,IAAI61C,EAAS,EAAC,SAAS,GAAG;AACrC,cAAMD,IAAW,OAAM51C,EAAA,IAACyxC,CAAe,EAAC,EAAE,GACpC/mC,IAAK1K,EAAA,IAAG61C,EAAS,EAAC,KAAI,CAACC,MAAM,OAAOA,EAAG,EAAE,MAAMF,CAAQ;AAC7D,QAAIlrC,IACAzK,EAAA,gBAAA,OAAAA,EAAA,gBAA0C,6BAC7ByK,CAAK,IAOpBolC,GAAY,YAAW,GAEzB9vC,EAAA,IAAAyxC,GAAkB,IAAI;AAAA,MACxB;AAAA;AAAA,EACF,CAAC;AAKD,WAASmF,GAAkBC,GAAYpD,GAAaC,GAAY;AAC9D,WAAOmD,EAAW,OAAM,CAAC3+B,MAAS;AAChC,WAAKA,EAAM,KAAM,QAAO;AACxB,YAAM,CAACzS,IAAMkG,EAAK,IAAIuM,EAAM,KAAK,MAAM,GAAG,EAAE,IAAI,MAAM;AACtD,aAAOvM,KAAQ,MAAM8nC,KAAehuC,OAASiuC;AAAA,IAC/C,CAAC;AAAA,EACH;AAKA,WAASoD,GAAuBD,GAAYpD,GAAaC,GAAY;AACnE,UAAMoB,IAAQ,GAAMpB,CAAU,IAAID,CAAW;AAC7C,QAAIjD,EAAiB,IAAIsE,CAAQ,EAAG;AAGpC,UAAMiC,KADcH,GAAkBC,GAAYpD,GAAaC,CAAU,EAEtE,IAAG,CAACx7B,OAASA,GAAM,KAAK,EACxB,OAAM,CAACyY,OAAOA,OAAQA,GAAI,WAAW,OAAO,CAAA;AAE/C,QAAIomB,GAAU,WAAW,GAAG;AAC1B,MAAAvG,EAAiB,IAAIsE,CAAQ;AAC7B;AAAA,IACF;AAQA,KALkB,OACT,sBAAwB,MAC3B,sBAAmB,CACnBO,OAAM,WAAWA,IAAI,CAAC,SAET;AACjB,MAAA0B,GAAU,QAAO,CAACpmB,OAAO;AACvB,cAAM3Z,KAAM,IAAI,MAAK;AACrB,QAAAA,GAAI,MAAM2Z;AAAA,MACZ,CAAC,GACD6f,EAAiB,IAAIsE,CAAQ;AAAA,IAC/B,CAAC;AAAA,EACH;AAKA,WAASkC,GAAuBH,GAAY1B,GAAWC,GAAW;AAEhE,UAAME,IAAYH,MAAc,IAAI,KAAKA,IAAY,GAC/CI,KAAWJ,MAAc,IAAIC,IAAY,IAAIA,GAG7CI,KAAYL,MAAc,KAAK,IAAIA,IAAY,GAC/CM,KAAWN,MAAc,KAAKC,IAAY,IAAIA;AAGpD,IAAA0B,GAAuBD,GAAYvB,GAAWC,EAAQ,GACtDuB,GAAuBD,GAAYrB,IAAWC,EAAQ;AAAA,EACxD;AAGA,EAAAz1C,EAAA,kBAAc;AACZ,UACEuxC,CAAS,KAAAvxC,EAAA,IACT61C,EAAS,EAAC,SAAS,KACnBhC,EAAM,MAAK,UACXG,EAAK,MAAK,WAGV8C,GAAsB92C,EAAA,IAAC61C,EAAS,GAAEhC,EAAM,GAAEG,GAAK,GAE/CgD,GAAsBh3C,EAAA,IAAC61C,EAAS,GAAEhC,EAAM,GAAEG,GAAK;AAAA,EAEnD,CAAC,GAGDh0C,EAAA,kBAAc;AACZ,QAAIixC,EAAa,KAAAjxC,EAAA,IAAIuxC,CAAS,KAAAvxC,EAAA,IAAIs2C,EAAe,EAAC,SAAS,GAAG;AAE5D,YAAMtZ,IAAUh9B,EAAA,IAAGs2C,EAAe,EAAC,CAAC,GAC9BW,IAAK;AAAA,QACT,MAAMja,EAAW,aAAa;AAAA,QAC9B,yBAAyBA,EAAW,gBAAgB;AAAA,SAIhDka,IAAYl3C,EAAA,IAAGs2C,EAAe,EAAC,KAAIR,OAAE;AAAA,QACzC,IAAIA,EAAG;AAAA,QACP,MAAMA,EAAG;AAAA,QACT,MAAMA,EAAG,QAAQ5lB,GAAa4lB,EAAG,QAAQ,EAAE;AAAA,QAC3C,eAAeA,EAAG;AAAA,QAClB,OAAOA,EAAG;AAAA;AAGZ,MAAA7E,IAAc,eAAeiG,GAAcD,CAAK;AAAA,IAClD;AAAA,EACF,CAAC;AAED,WAASE,GAAaj/B,GAAO;AAC3B,UAAMk/B,IAAQl/B,EAAM,OAAO,MAAM,YAAW;AAC5C,IAAAw8B,GAAY,IAAI0C,CAAK,GACrBzC,GAAe,IAAG30C,EAAA,IAChB61C,EAAS,EAAC,OAAM,CAACC,MAAMA,EAAG,KAAK,YAAW,EAAG,SAASsB,CAAK,CAAA,CAAA;AAAA,EAE/D;AAGA,MAAIC,KAAYr3C,EAAA,QAAA,MAAY6/B,GAAoByX,EAAe,CAAA,CAAA;AAE/D,EAAAt3C,EAAA,kBAAc;AACZ,UAAI61C,EAAS,KAAElB,GAAe,UAAIkB,EAAS,CAAA;AAAA,EAC7C,CAAC;AAmBD,iBAAe0B,KAAqB;AAClC,QAAE,CAAGjF,GAAgB;AAErB,IAAAtyC,EAAA,IAAAqyC,IAAuB,EAAI;AAC3B,UAAM,CAAC5sC,GAAMkG,CAAK,IAAI2mC,GAAe,MAAM,GAAG,EAAE,IAAI,MAAM,GAEpDmB,IAAc9nC,IAAQ;AAE5B,QAAI;AAEF,MAAA3L,EAAA,IAAAoyC,IAAmB,EAAK,GACxB,MAAMwC,GAAgBnvC,GAAMguC,GAAa,EAAI;AAAA,IAC/C,UAAC;AACC,MAAAzzC,EAAA,IAAAqyC,IAAuB,EAAK,GAC5BC,KAAiB;AAAA,IACnB;AAAA,EACF;AAEA,WAASkF,KAA0B;AACjC,IAAAx3C,EAAA,IAAAoyC,IAAmB,EAAK,GACxBE,KAAiB;AAAA,EACnB;AAOA,WAASmF,GAAwB79B,GAAMmc,GAAM;AAC3C,QAAE,CAAGkb,OAAa,CAAKlb,EAAM;AAC7B,UAAM2hB,IAAQ;AAAA,MACZ,YAAMpB,EAAe,EAAC,CAAC,GAAG,aAAa;AAAA,MACvC,+BAAyBA,EAAe,EAAC,CAAC,GAAG,gBAAgB;AAAA;AAE/D,QAAI;AACF,MAAArF,EAAa,EAAC,iBAAiBr3B,GAAMmc,GAAM2hB,CAAQ;AAAA,IACrD,SAASptB,GAAK;AACZxqB,MAAAA,GAAO,MAAM,gCAAgCwqB,CAAG;AAAA,IAClD;AAAA,EACF;AAGA,iBAAeqtB,GAAoB/9B,GAAM;AACvC,IAAIA,MAAS,WACT5Z,EAAA,IAAGgyC,EAAc,KACjBhyC,EAAA,IAAAgyC,KAAkB,MAAM,OAAO,0BAA4B,GAAG,SAAO,EAAA,IAE9Dp4B,MAAS,eAChB5Z,EAAA,IAAGiyC,EAAkB,KACrBjyC,EAAA,IAAAiyC,KAAsB,MAAM,OAAO,8BAAgC,EAAA,KAAA,CAAAlzC,MAAAA,EAAA,CAAA,GAChE,SAAO,EAAA,IAELiB,EAAA,IAAG+xC,EAAa,KAGvB/xC,EAAA,IAAA+xC,KAAiB,MAAM,OAAO,yBAA2B,EAAA,KAAA,CAAAhzC,MAAAA,EAAA,CAAA,GAAG,SAAO,EAAA;AAAA,EAEvE;AAaA,iBAAe64C;IACb,MAAAh+B;AAAA,IACA,IAAA4G;AAAA,IACA,MAAA8P,IAAO;AAAA,IACP,MAAAyF,IAAO;AAAA,IACP,kBAAA8hB,KAAmB;AAAA,IACnB,UAAAC,KAAW;AAAA,KACV;AACD,IAAAhG;MACAH;AAAA;QACE,MAAA/3B;AAAA,QACA,IAAI,OAAO4G,CAAE;AAAA,QACb,MAAM8P,KAAQ;AAAA,QACd,MAAAyF;AAAA,QACA,kBAAA8hB;AAAA;;;MAEFnG;AAAA,MACE93B,MAAS,WACL,WACAA,MAAS,eACP,eACA;AAAA;OACR5Z,EAAA,IAAA6xC,IAAkB,EAAK,GAGnBiG,MAAYhI,MACdA,EAAW,WAAWtvB,GAAI8P,KAAQ,EAAE,GACpCqf,EAAa,IAGf8H,GAAwB79B,GAAMmc,CAAI,GAIlCf,GAAc;AAAA,MACZ,IAAAxU;AAAA,MACA,MAAM8P,KAAQ;AAAA,MACd,OAAOyF,GAAM,QAAQA,GAAM,SAASA,GAAM,mBAAmB;AAAA,QAI7D,OAAS,SAAW,OACpB,4BAA4B;AAC1B,YAAMje,KAAK,SAAS,cAAc,6BAA6B;AAC/D,MAAIA,MAAE,OAAWA,GAAG,kBAAmB,cACrCA,GAAG,eAAc,EAAG,OAAO,SAAS,UAAU,QAAM;AAAA,IAExD,CAAC,GAGH,MAAM6/B,GAAoB/9B,CAAI;AAAA,EAChC;AAGA,WAAS+7B,GAAqB,EAAG,UAAAmC,IAAW,GAAI,QAAS;AACvD,IAAAhG,MACA9xC,EAAA,IAAA0xC,GAAa,UAAU,GACvB1xC,EAAA,IAAA2xC,GAAe,IAAI,GACnB3xC,EAAA,IAAA6xC,IAAkB,EAAK,GACnBiG,KAAYhI,MACdA,EAAW,YAAW,GACtBH,EAAa,IAEXsB,EAAa,KAAEA,EAAa,EAAC,gBAAe,GAEhDjc,GAAc,EAAG,IAAI,MAAI,GACvB,OAAS,SAAW,OACpB,4BAA4B,OAAO,SAAS,GAAG+a,CAAY,CAAA;AAAA,EAE/D;AAOA,iBAAe2F,GAAqBl1B,GAAI8P,GAAI,EAAI,UAAAwnB,IAAW,GAAK,IAAA,IAAS;AACvE,UAAMzwC,MAAUyqC;AAChB,IAAA9xC,EAAA,IAAA6xC,IAAkB,EAAI,GACtB7xC,EAAA,IAAA0xC,GAAa,SAAS;AACtB,UAAMqG,KAAW,MAAMvQ,GAAoBhnB,GAAI8P,CAAI;AAGnD,IAAIjpB,MAAUyqC,OACViG,MAAYA,GAAS,OAGvB,MAAMH,GAAkB;AAAA,MACtB,MAAMG,GAAS;AAAA,MACf,IAAAv3B;AAAA,MACA,MAAA8P;AAAA,MACA,MAAMynB,GAAS;AAAA,MACf,kBAAkBA,GAAS,SAAS,UAAUA,GAAS,OAAO;AAAA,MAC9D,UAAAD;AAAA,SAKF,MAAMF,GAAkB,EACtB,MAAM,SACN,IAAAp3B,GACA,MAAA8P,GACA,MAAM,MACN,UAAAwnB,GAAQ;AAAA,EAGd;AAUA,iBAAeE,GAAmBxR,GAASlW,GAAM2nB,IAAe,MAAM;AACpE,IAAAnG;MAKAH;AAAA;QACE,MAAM;AAAA,QACN,IAAI,OAAOnL,CAAO;AAAA,QAClB,MAAMlW,KAAItwB,EAAA,IAAI2xC,CAAY,GAAE,QAAQ;AAAA,QACpC,MAAMsG,KAAYj4C,EAAA,IAAI2xC,CAAY,GAAE,QAAQ;AAAA,QAC5C,kBAAkBsG,KAAYj4C,EAAA,IAAI2xC,CAAY,GAAE,oBAAoB;AAAA;;OAEtE3xC,EAAA,IAAA0xC,GAAa,UAAU,GACrB,OAAS,SAAW,OACpB,4BAA4B;AAE1B,MADW,SAAS,cAAc,6BAA6B,GAC3D,iBAAc,EAAK,OAAO,SAAS,UAAU,QAAM;AAAA,IACzD,CAAC,GAED1xC,EAAA,IAAGkyC,EAAY,KACflyC,EAAA,IAAAkyC,KAAgB,MAAM,OAAO,wBAA0B,EAAA,KAAA,CAAAnzC,MAAAA,EAAA,CAAA,GAAG,SAAO,EAAA;AAAA,EAErE;AAGA,iBAAem5C,GAAsBhjB,GAAS;AAC5C,IAAA4c,MACA9xC,EAAA,IAAA4xC,IAAiB1c,KAAO,CAAA,GAAA,EAAA,GACxBl1B,EAAA,IAAA0xC,GAAa,SAAS,GACpB,OAAS,SAAW,OACpB,4BAA4B;AAE1B,MADW,SAAS,cAAc,6BAA6B,GAC3D,iBAAc,EAAK,OAAO,SAAS,UAAU,QAAM;AAAA,IACzD,CAAC,GAED1xC,EAAA,IAAGmyC,EAAW,KACdnyC,EAAA,IAAAmyC,KAAe,MAAM,OAAO,uBAAyB,GAAG,SAAO,EAAA;AAAA,EAEnE;AAGA,WAASgG,KAAqB;AAC5B,IAAEn4C,EAAA,IAAE2xC,CAAY,IACdiG,GAAkB;AAAA,MAChB,MAAM;AAAA,MACN,IAAE53C,EAAA,IAAE2xC,CAAY,EAAC;AAAA,MACjB,MAAI3xC,EAAA,IAAE2xC,CAAY,EAAC;AAAA,MACnB,MAAI3xC,EAAA,IAAE2xC,CAAY,EAAC;AAAA,MACnB,kBAAgB3xC,EAAA,IAAE2xC,CAAY,EAAC;AAAA,MAC/B,UAAU;AAAA,SAGZgE,GAAqB;AAAA,EAEzB;AAGA,WAASyC,GAAuB53B,GAAI8P,GAAM7P,GAAM;AAC9C,IAAAm3B,GAAkB;AAAA,MAChB,MAAM;AAAA,MACN,IAAAp3B;AAAA,MACA,MAAM8P,KAAQJ,GAAazP,KAAQ,OAAO;AAAA,MAC1C,MAAM;AAAA;EAEV;AAGA,WAAS43B,GAAsB73B,GAAI8P,GAAM;AACvC,IAAAsnB,GAAkB,EAAG,MAAM,SAAS,IAAAp3B,GAAI,MAAM8P,KAAQ,IAAI,MAAM,MAAI;AAAA,EACtE;AAEA,WAASgoB,GAAiBpgC,GAAO;AAC/B,UAAMqgC,IAAYrgC,EAAM,UAAUA,GAC5B69B,IAAYwC,EAAU,QAAQroB,GAAaqoB,EAAU,QAAQ,OAAO;AAO1E,QAJE,OAAS,SAAW,QACpBxI,IAAe,OAAO,UAGtB9vC,EAAA,gBAAA,OAAAA,EAAA,gBAA0C,YAAY;AACtD,YAAM81C,KACJwC,EAAU,QAAQroB,GAAaqoB,EAAU,QAAQ,OAAO;AAO1D,UALIzI,MACFA,EAAW,WAAWyI,EAAU,IAAIxC,EAAS,GAC7CpG,EAAa,IAGXsB,EAAa,GAAE;AACjB,cAAMuH,KAAQ;AAAA,UACZ,MAAMD,EAAU,QAAQA,EAAU,SAAS;AAAA,UAC3C,eAAeA,EAAU,iBAAiB;AAAA,UAC1C,aAAaA,EAAU,eAAe;AAAA,UACtC,aAAaA,EAAU,eAAe;AAAA,UACtC,OAAOA,EAAU,SAAS;AAAA,UAC1B,QAAQA,EAAU,UAAU;AAAA,UAC5B,IAAIA,EAAU;AAAA,UACd,MAAMxC;AAAA,WAEF2B,KAAQ;AAAA,UACZ,YAAMpB,EAAe,EAAC,CAAC,GAAG,aAAa;AAAA,UACvC,+BAAyBA,EAAe,EAAC,CAAC,GAAG,gBAAgB;AAAA;AAE/D,QAAArF,EAAa,EAAC,iBAAiB,SAASuH,IAAUd,EAAQ;AAAA,MAC5D;qBACaa,CAAS;AAGtB;AAAA,IACF;AAOA,QAAInH,GAAiB,GAAE;AACrB,MAAAwG,GAAkB;AAAA,QAChB,MAAM;AAAA,QACN,IAAIW,EAAU;AAAA,QACd,MAAMxC;AAAA,QACN,MAAMwC;AAAA,QACN,kBAAkB;AAAA;AAEpB;AAAA,IACF;AAEA,UAAM/R,IAAU+R,EAAU;AAC1B,QAAI/R,GAAS;AAEX,UAAIyK,EAAa,GAAE;AACjB,cAAMuH,KAAQ;AAAA,UACZ,MAAMD,EAAU,QAAQA,EAAU,SAAS;AAAA,UAC3C,eAAeA,EAAU,iBAAiB;AAAA,UAC1C,aAAaA,EAAU,eAAe;AAAA,UACtC,OAAOA,EAAU,SAAS;AAAA,UAC1B,QAAQA,EAAU,UAAU;AAAA,UAC5B,IAAIA,EAAU;AAAA,UACd,MAAMxC;AAAA;AAER,QAAA9E,IAAc,iBAAiB,SAASuH,EAAQ;AAAA,MAClD;AAEA,YAAM73C,KAAS,IAAI,gBAAe;AAClC,MAAIowC,EAAc,KAAEpwC,GAAO,IAAI,SAASowC,EAAc,CAAA,GAClD5J,EAAO,KAAExmC,GAAO,IAAI,WAAWwmC,EAAO,CAAA,GAE1CyJ,QAAiBpK,CAAO,IAAIuP,CAAS,IAAIp1C,GAAO,SAAQ,CAAA,EAAA;AAAA,IAC1D;AAAA,EACF;AAMA,WAAS83C,GAAuBC,GAAa;AAC3C,IAAAJ,GAAgB;AAAA,MACd,IAAII,EAAY;AAAA,MAChB,MAAMA,EAAY;AAAA,MAClB,MAAMA,EAAY;AAAA,MAClB,OAAOA,EAAY;AAAA,MACnB,MAAMA,EAAY;AAAA,MAClB,QAAQA,EAAY;AAAA,MACpB,eAAeA,EAAY;AAAA;EAE/B;;AAGD,EAAA14C,EAAA,KAAW,WAAA,CAAAub,MAAA;;;;;qBAEP,QAAK,GAAAvb,EAAA,IACF6Y,CAAM,EAAC,+BAAuB8/B,EAAW,MAAK9F,EAAK,OACjD7yC,EAAA,IAAA6Y,CAAM,EAAC,WACP8/B,EAAW,MAAK9F,EAAK,UACnB7yC,EAAA,IAAA6Y,CAAM,EAAC,cACP7Y,EAAA,IAAA6Y,CAAM,EAAC,iBAAY,EAAA;AAAA;;;QANvBo4B,EAAa,KAAA16B,GAAAC,CAAA;AAAA;;;;MAuBpBJ,KAAGpW,EAAA,YAAA0/B,EAAA,gBAAHtpB,EAAG;;;UAKCgB,IAAGgE,GAAA,eAAHhE,CAAG;;;cAEC+E,KAAM/b,GAAA,gBAAN+b,EAAM;AAMJ,UAAAy8B,GAAS7vB,IAAA,EAAA,OAAA,UAAA,eAAA,QAAA;cACTzS,KAAItW,EAAA,QAAA+oB,IAAA,CAAA,gBAAJzS,IAAI,EAAA;kBAAJA,EAAI,WAPN6F,EAAM;AAAN,YAAAnc,EAAA,cAAAmc,IAAM,cAAAnc,EAAA,IAIO6Y,CAAM,EAAC,oBAAoB,kBAAkB,wBAGlDA,CAAM,EAAC,UAAU,MAAM;AAAA,cAP/B7Y,EAAA,UAAA,SAAAmc,UAGgBw5B,GAAqB,CAAA,gBAHrCx5B,EAAM;AAAA;;iBADJu1B,CAAU,MAAK,YAAQ1xC,EAAA,IAAI0xC,CAAU,MAAK,gBAAY1xC,EAAA,IAAI0xC,CAAU,MAAK,cAASn7B,GAAAe,CAAA;AAAA;;;;;cAapF2M,KAAG5N,GAAA,gBAAH4N,EAAG;AACD,UAAA40B,GAAcva,IAAA,EAAA;cACdjjB,KAAIrb,EAAA,QAAAs+B,IAAA,CAAA,gBAAJjjB,IAAI,EAAA;kBAAJA,EAAI,WAFN4I,EAAG;4BAAHA,IAAG,cAAAjkB,EAAA,IAA2B6Y,CAAM,EAAC,aAAa,GAE1B7Y,EAAA,SAAAopB,IAAAppB,EAAA,IAAA6Y,CAAM,EAAC,iBAAiB;AAAA,2BAFhDoL,EAAG;AAAA;;;;;AASI,cAAAjkB,EAAA,IAAA84C,IAAA,MAAA94C,EAAA,IAAA2xC,CAAY,EAAC,IAAE,CAAAp2B,OAAA;;;AAClB,kBAAAw9B,GAAax9B,IAAA;AAAA;AACF,6BAAAvb,EAAA,IAAA2xC,CAAY,EAAC;AAAA;;AACd,6BAAA3xC,EAAA,IAAA2xC,CAAY,EAAC;AAAA;;AAChB,6BAAA3xC,EAAA,IAAA2xC,CAAY,EAAC;AAAA;;6BAClBZ,EAAc;AAAA;0CACO4E,GAAqB;AAAA,sCACzBqC;AAAA,mCACHgB,IAAOC,OACpBrB,KACE,MAAM,SACN,IAAIoB,IACJ,MAAMC,MAAW,IACjB,MAAM,KAAI,CAAA;AAAA;mCAEbpgC,CAAM;AAAA;;;;;kBAIVuL,KAAG/M,GAAA,gBAAH+M,EAAG;AACD,cAAAy0B,GAAc/zB,IAAA,EAAA,WADhBV,EAAG,2CAAHA,IAAG,cAAApkB,EAAA,IAA2B6Y,CAAM,EAAC,aAAa,CAAA,gBAAlDuL,EAAG;AAAA;;AAvBD,cAAApkB,EAAA,IAAA+xC,EAAa,WAAIJ,CAAY,IAAAp7B,GAAAwH,EAAA,IAAAxH,GAAAgB,IAAA,EAAA;AAAA;;;;;;;;;AA6B/B,gBAAA2hC,GAAc39B,IAAA;AAAA;AACL,2BAAAvb,EAAA,IAAA2xC,CAAY,EAAC;AAAA;0CACGyG;AAAA;;;kBAGzB5zB,KAAGnN,GAAA,gBAAHmN,EAAG;AACD,cAAAq0B,GAAc56B,IAAA,EAAA,WADhBuG,EAAG,2CAAHA,IAAG,cAAAxkB,EAAA,IAA2B6Y,CAAM,EAAC,aAAa,CAAA,gBAAlD2L,EAAG;AAAA;;AAND,cAAAxkB,EAAA,IAAAgyC,EAAc,WAAIL,CAAY,IAAAp7B,GAAAmF,EAAA,IAAAnF,GAAA0G,IAAA,EAAA;AAAA;;;;;;;;;AAYhC,gBAAAk8B,GAAkB59B,IAAA;AAAA;AACH,2BAAAvb,EAAA,IAAA2xC,CAAY,EAAC;AAAA;;2BAC1BZ,EAAc;AAAA;qCACIsH;AAAA;iCAClBx/B,CAAM;AAAA;;;;kBAGR6L,KAAGrN,GAAA,gBAAHqN,EAAG;AACD,cAAAm0B,GAAcjzB,IAAA,EAAA,WADhBlB,EAAG,2CAAHA,IAAG,cAAA1kB,EAAA,IAA2B6Y,CAAM,EAAC,aAAa,CAAA,gBAAlD6L,EAAG;AAAA;;AARD,cAAA1kB,EAAA,IAAAiyC,EAAkB,WAAIN,CAAY,IAAAp7B,GAAAqF,EAAA,IAAArF,GAAAuH,IAAA,EAAA;AAAA;;;;;;;;;;kBAgBjC,IAAE9d,EAAA,IAAE2xC,CAAY,EAAC;AAAA,kBACjB,MAAI3xC,EAAA,IAAE2xC,CAAY,EAAC;AAAA,kBACnB,OAAK3xC,EAAA,IAAE2xC,CAAY,EAAC;AAAA,gDAEbA,CAAY,EAAC,MAAM,WAAO3xC,EAAA,IACjC2xC,CAAY,EAAC,MAAM,WACnBxK,GAAO;;AARV,kBAAAiS,GAAY79B,IAAA;AAAA;;;;;;;6BASVw1B,EAAc;AAAA;yCACMmH;AAAA,oCACLC;AAAA;mCACft/B,CAAM;AAAA;;;;;;kBAGRuM,KAAG/N,GAAA,gBAAH+N,EAAG;AACD,cAAAyzB,GAAcQ,IAAA,EAAA,WADhBj0B,EAAG,2CAAHA,IAAG,cAAAplB,EAAA,IAA2B6Y,CAAM,EAAC,aAAa,CAAA,gBAAlDuM,EAAG;AAAA;;AAhBD,cAAAplB,EAAA,IAAAkyC,EAAY,WAAIP,CAAY,IAAAp7B,GAAAuF,EAAA,IAAAvF,GAAA+iC,IAAA,EAAA;AAAA;;;;;;;;;;kBAwB3B,IAAEt5C,EAAA,IAAE2xC,CAAY,GAAE;AAAA,kBAClB,MAAI3xC,EAAA,IAAE2xC,CAAY,GAAE;AAAA,kBACpB,OAAK3xC,EAAA,IAAE2xC,CAAY,GAAE;AAAA,kBACrB,SAAO3xC,EAAA,IAAE4xC,EAAc,GAAE;AAAA,kBACzB,WAAS5xC,EAAA,IAAE4xC,EAAc,GAAE;AAAA,kBAC3B,eAAa5xC,EAAA,IAAE4xC,EAAc,GAAE;AAAA,kBAC/B,aAAW5xC,EAAA,IAAE4xC,EAAc,GAAE;AAAA,6CAElB7N,KAAe,OAAO,MAAA/jC,EAAA,IAAM2xC,CAAY,GAAE,EAAE,IAAA3xC,EAAA,IAAI2xC,CAAY,GAAE,QAAQ,EAAE,EAAA;;AAVtF,kBAAA4H,GAAWh+B,IAAA;AAAA;;;;;;oBAWQ,WAAA,OAAA,SAAW,MACzB,OAAO,SAAS,SAAS,OAAO,SAAS,WACzC;AAAA;mCACH1C,CAAM;AAAA;;;;;;kBAGR2M,KAAGnO,GAAA,gBAAHmO,EAAG;AACD,cAAAqzB,GAAcW,IAAA,EAAA,WADhBh0B,EAAG,2CAAHA,IAAG,cAAAxlB,EAAA,IAA2B6Y,CAAM,EAAC,aAAa,CAAA,gBAAlD2M,EAAG;AAAA;;oBAlBD2sB,EAAW,IAAA57B,GAAA0F,EAAA,IAAA1F,GAAAkjC,IAAA,EAAA;AAAA;;;;;gBA/Eb/H,CAAU,MAAK,aAAS1xC,EAAA,IAAI6xC,EAAe,mBAKtCH,CAAU,MAAK,WAAQn7B,GAAAkF,IAAA,CAAA,IAAAzb,EAAA,IA4BvB0xC,CAAU,MAAK,WAAQn7B,GAAAyF,IAAA,CAAA,IAAAhc,EAAA,IAWvB0xC,CAAU,MAAK,eAAYn7B,GAAAsF,IAAA,CAAA,IAAA7b,EAAA,IAa3B0xC,CAAU,MAAK,aAAUn7B,GAAAwF,IAAA,CAAA,IAAA/b,EAAA,IAqBzB0xC,CAAU,MAAK,aAASn7B,GAAA2F,IAAA,CAAA;AAAA;;cA3FnC9E,CAAG,eAAHA,CAAG;AAAA;oBAsHHsiC,IAAE15C,EAAA,YAAA25C,CAAA,eAAFD,CAAE;cAAFA,CAAE;yBAAFA,GAAE,CAAA;;;;AAWe,gBAAAjjC,KAAAzW,EAAA,QAAA,MAAA,OAAO24C,EAAW,CAAA,CAAA;AAFjC,YAAAiB,GAAer+B,IAAA;AAAA;6BACDi5B,EAAa;AAAA;;;;4BAEZC;AAAA,wBACJ0C;AAAA;6BACTt+B,CAAM;AAAA;;;;;UANNg4B,GAAe,KAAAt6B,GAAAoP,EAAA;AAAA;;;;;cAWjBk0B,KAAGp8B,GAAA,gBAAHo8B,EAAG;AACD,UAAAC,GAAav8B,IAAA;AAAA;qBACCy2B,EAAK;AAAA;;qBACJH,EAAM;AAAA;wBACRQ;AAAA,wBACAC;AAAA,yBACCX;AAAA,mCACU;AAAA,sBAP1BkG,EAAG,2CAAHA,IAAG,cAAA75C,EAAA,IAA0B6Y,CAAM,EAAC,uBAAuB,CAAA,gBAA3DghC,EAAG;AAAA;;AADD,UAAA/I,GAAiB,KAAI6H,EAAW,MAAK9F,EAAK,YAAQt8B,GAAAgG,EAAA;AAAA;;UAatDw9B,KAAI/5C,EAAA,QAAAg6C,IAAA,CAAA,gBAAJD,EAAI;;;cAEAnc,KAAGvnB,GAAA,gBAAHunB,EAAG;;2CAEMmV,EAAW,MAAKF,EAAK,OACvB,SACA7yC,EAAA,IAAA+yC,EAAW,MAAKF,EAAK,WAAO7yC,EAAA,IAC1B+yC,EAAW,MAAKF,EAAK,YAAQ7yC,EAAA,IAC7B+yC,EAAW,MAAKF,EAAK,WACrB,YACA,EAAE;AAPT,YAAAgG,GAAcoB,IAAA;AAAA;;;;;cASdt+B,KAAI3b,EAAA,QAAAi6C,IAAA,CAAA,gBAAJt+B,IAAI,EAAA;kBAAJA,EAAI,WAVNiiB,EAAG;4BAAHA,IAAG,cAAA59B,EAAA,IAA2B6Y,CAAM,EAAC,aAAa,GAU1B7Y,EAAA,SAAAipB,IAAAjpB,EAAA,IAAA6Y,CAAM,EAAC,iBAAiB;AAAA,2BAVhD+kB,EAAG;AAAA;cAcHE,KAAGzgB,GAAA,gBAAHygB,IAAG,EAAA;kBAAHA,EAAG,GACD99B,EAAA,gBAAA,MAAAA,EAAA,SAAAk6C,IAAAl6C,EAAA,IAAA6Y,CAAM,EAAC,OAAO,CAAA,gBADhBilB,EAAG;AAAA;AAIH,UAAAqc,GAAU5+B,IAAA;AAAA;AACA,qBAAAvb,EAAA,IAAA6Y,CAAM,EAAC;AAAA;;AACP,qBAAA7Y,EAAA,IAAA6Y,CAAM,EAAC;AAAA;;;;YAGjBuhC,GAAQ7+B,IAAA;AAAA;;uBAGMy4B,EAAK;AAAA;;uBACJH,EAAM;AAAA;;6BACLwD,EAAY;AAAA;4BACboB;AAAA;6BACDtE,CAAmB;AAAA;;6BACnBC,CAAmB;AAAA;cACb,aAAA,MAAA;AAAA,cAAC;AAAA;6BACnBv7B,CAAM;AAAA;;uBACN9J,EAAM;AAAA;;0BAVI6jC,IAAWvuB,IAAA,EAAA;AAAA,wBAAXuuB,EAAW;AAAA;;;;;;;AAcrB,gBAAAyH,GAAqB9+B,IAAA;AAAA;2BACZ+7B,EAAe;AAAA;gCACTgB;AAAA;;;AAGf,cAAAgC,GAAQ/+B,IAAA;AAAA;+BACC87B,EAAY;AAAA;8BACNoB;AAAA;+BACb5/B,CAAM;AAAA;;;;AATN,cAAA7Y,EAAA,IAAAmwC,CAAS,WAAIE,CAAqB,IAAA95B,GAAAyG,EAAA,IAAAzG,GAAAgkC,IAAA,EAAA;AAAA;;;;;;;;;AAcpC,gBAAAC,GAAiBj/B,IAAA;AAAA;2BACR+7B,EAAe;AAAA;gCACTgB;AAAA;;;AAGf,cAAAmC,GAAWl/B,IAAA;AAAA;+BACF87B,EAAY;AAAA;8BACNoB;AAAA;+BACb5/B,CAAM;AAAA;;;;AATN,cAAA7Y,EAAA,IAAAmwC,CAAS,WAAIC,CAAiB,IAAA75B,GAAAsG,EAAA,IAAAtG,GAAAmkC,IAAA,EAAA;AAAA;;;;;;;;;AAchC,gBAAAC,GAAkBp/B,IAAA;AAAA;2BACT+7B,EAAe;AAAA;gCACTgB;AAAA;;;AAGf,cAAAsC,GAAYr/B,IAAA;AAAA;+BACH87B,EAAY;AAAA;8BACNoB;AAAA;+BACb5/B,CAAM;AAAA;;;;AATN,cAAA7Y,EAAA,IAAAmwC,CAAS,WAAIG,CAAkB,IAAA/5B,GAAAwG,EAAA,IAAAxG,GAAAskC,IAAA,EAAA;AAAA;;;;;;;;;AAcjC,gBAAAC,GAAkBv/B,IAAA;AAAA;2BACT+7B,EAAe;AAAA;;2BACtBtG,EAAY;AAAA;gCACCsH;AAAA;;;AAGf,cAAAyC,GAAYx/B,IAAA;AAAA;+BACH87B,EAAY;AAAA;;yBACnBrG,EAAY;AAAA;8BACCyH;AAAA;+BACb5/B,CAAM;AAAA;;;;AAXN,cAAA7Y,EAAA,IAAAmwC,CAAS,WAAII,CAAkB,IAAAh6B,GAAA4G,EAAA,IAAA5G,GAAAykC,IAAA,EAAA;AAAA;;;;;AA7EjC,UAAAh7C,EAAA,IAAA0yC,EAAkB,IAAAn8B,GAAAiG,EAAA,IAAAxc,EAAA,IAaZ2yC,EAAW,IAAA3yC,EAAA,IAKZu2C,EAAW,gBAKXoC,EAAW,MAAK9F,EAAK,WAAQt8B,GAAAmG,IAAA,CAAA,IAc7Bi8B,EAAW,MAAK9F,EAAK,OAAIt8B,GAAAqG,IAAA,CAAA,IAazB+7B,EAAW,MAAK9F,EAAK,sBAarB8F,EAAW,MAAK9F,EAAK,WAAQt8B,GAAA2G,IAAA,CAAA,IAa7By7B,EAAW,MAAK9F,EAAK,YAAQt8B,GAAAmH,IAAA,CAAA,IA/DjBnH,GAAA0kC,IAAA,CAAA;AAAA;;cAdvBlB,EAAI;AA9BF,QAAA/5C,EAAA,SAAAgkB,GAAA,GAAAhkB,EAAA,IAAA6Y,CAAM,EAAC,sBAAkB,EAAA,OAAK8/B,EAAW,MAAK9F,EAAK,OAChD7yC,EAAA,IAAA6Y,CAAM,EAAC,WACP8/B,EAAW,MAAK9F,EAAK,UACnB7yC,EAAA,IAAA6Y,CAAM,EAAC,cACP7Y,EAAA,IAAA6Y,CAAM,EAAC,iBAAY,EAAA,EAAA,GA0B1B7Y,EAAA,cAAA+5C,uBAA6BzI,CAAS,CAAA;AAAA;;;MAzJpCF,GAAiB,KAAApxC,EAAA,IAAI0xC,CAAU,MAAK,aAAUn7B,EAAAsH,EAAA,IAAAtH,EAAA2kC,IAAA,EAAA;AAAA;;;AAyPlD,EAAAC,GAAgBC,IAAA;AAAA;mBAAEviC,CAAM;AAAA;cA1P1BzC,EAAG,eAAHA,IAAG,CAAAiO,MAAArkB,EAAA,IAAuDgwC,GAAM3rB,CAAA,GAAA,MAAArkB,EAAA,IAANgwC,CAAM,CAAA;qBAAhE55B,IAAG,CAAA;AA8PH,EAAAilC,GAAiBC,IAAA;AAAA;mBACVlJ,EAAgB;AAAA;aACbmF;AAAA,aACAC;AAAA;mBACAnF,EAAoB;AAAA;;AACpB,aAAAryC,EAAA,IAAA6Y,CAAM,EAAC;AAAA;;mBACfA,CAAM;AAAA;;AA9RD;;AC/yCD,SAAS0iC,GACdrR,GACAja,GACe;AACf,MAAI,CAACia,EAAW,QAAO;AAEvB,QAAMrlC,IAAO,IAAI,KAAKqlC,CAAS;AAC/B,MAAI,MAAMrlC,EAAK,QAAA,CAAS,EAAG,QAAO;AAGlC,QAAM22C,IAAkD;AAAA,IACtD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,cAAc;AAAA,EAAA;AAGhB,MAAIjsC;AACJ,MAAI;AACF,IAAAA,IAAY,IAAI,KAAK,eAAe,SAAS,EAAE,GAAGisC,GAAqB,UAAUvrB,GAAI;AAAA,EACvF,QAAQ;AAKN,IAAA1gB,IAAY,IAAI,KAAK,eAAe,SAAS;AAAA,MAC3C,GAAGisC;AAAA,MACH,UAAUxrB,GAAA;AAAA,IAAmB,CAC9B;AAAA,EACH;AAEA,QAAMz8B,IAAQgc,EAAU,cAAc1K,CAAI,GACpCmnC,IAAM,CAACpyB,MAAiBrmB,EAAM,KAAK,OAAK2rB,EAAE,SAAStF,CAAI,GAAG,SAAS,IAEnEnU,IAAOumC,EAAI,MAAM,GACjBrgC,IAAQqgC,EAAI,OAAO,GACnB3mC,IAAM2mC,EAAI,KAAK,GACft7B,IAAOs7B,EAAI,MAAM,GACjBr7B,IAASq7B,EAAI,QAAQ,GACrBp7B,IAASo7B,EAAI,QAAQ,GACrByP,IAAWzP,EAAI,cAAc;AAGnC,MAAI5+B,IAAS;AACb,MAAIquC,GAAU;AACZ,UAAM/wC,IAAQ+wC,EAAS,MAAM,2BAA2B;AACxD,QAAI/wC,GAAO;AACT,YAAMa,IAAOb,EAAM,CAAC,GACdmC,IAAQnC,EAAM,CAAC,EAAE,SAAS,GAAG,GAAG,GAChCgxC,IAAOhxC,EAAM,CAAC,KAAK;AACzB,MAAA0C,IAAS,GAAG7B,CAAI,GAAGsB,CAAK,IAAI6uC,CAAI;AAAA,IAClC;AAAA,EACF;AAEA,SAAO,GAAGj2C,CAAI,IAAIkG,CAAK,IAAItG,CAAG,IAAIqL,CAAI,IAAIC,CAAM,IAAIC,CAAM,GAAGxD,CAAM;AACrE;AASO,SAASuuC,GACdC,GAC+B;AAC/B,MAAI,CAACA,EAAY,QAAO;AAExB,QAAMroD,IAAQqoD,EAAW,MAAM,GAAG,EAAE,IAAI,CAAA18B,MAAKA,EAAE,MAAM;AAErD,MAAI3rB,EAAM,SAAS;AACjB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,eAAeqoD;AAAA,MACf,gBAAgB;AAAA,IAAA;AAMpB,QAAMC,IADWtoD,EAAMA,EAAM,SAAS,CAAC,EACR,MAAM,mCAAmC;AAExE,SAAIsoD,KAAiBtoD,EAAM,UAAU,IAE5B;AAAA,IACL,SAAS;AAAA,IACT,eAAeA,EAAM,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI;AAAA,IAC3C,iBAAiBA,EAAMA,EAAM,SAAS,CAAC;AAAA,IACvC,eAAesoD,EAAc,CAAC;AAAA,IAC9B,YAAYA,EAAc,CAAC;AAAA,IAC3B,gBAAgB;AAAA,EAAA,IAKb;AAAA,IACL,SAAS;AAAA,IACT,eAAetoD,EAAM,CAAC;AAAA,IACtB,iBAAiBA,EAAM,MAAM,CAAC,EAAE,KAAK,IAAI;AAAA,IACzC,gBAAgB;AAAA,EAAA;AAEpB;AAyBO,SAASuoD,GACdvoD,GACAqjB,GAC+B;AAC/B,MAAIrjB,MAAUA,EAAM,QAAQA,EAAM,SAASA,EAAM,aAAa;AAC5D,UAAM2lC,IAA8B,EAAE,SAAS,gBAAA;AAC/C,WAAI3lC,EAAM,YAAS2lC,EAAI,gBAAgB3lC,EAAM,UACzCA,EAAM,SAAM2lC,EAAI,kBAAkB3lC,EAAM,OACxCA,EAAM,UAAO2lC,EAAI,gBAAgB3lC,EAAM,QACvCA,EAAM,eAAY2lC,EAAI,aAAa3lC,EAAM,aAC7C2lC,EAAI,iBAAiB3lC,EAAM,WAAW,MAC/B2lC;AAAA,EACT;AAIA,SAAOyiB,GAAsBpoD,KAASA,EAAM,WAAYqjB,KAAY,IAAI;AAC1E;AAOO,SAASmlC,GAAeC,GAA8C;AAC3E,MAAI,CAACA,EAAW,QAAO;AAEvB,QAAMxlB,IAASwlB,EAAU,YAAA;AAEzB,SAAIxlB,MAAW,eAAeA,MAAW,aAChC,sCAELA,MAAW,cACN,sCAELA,MAAW,gBACN,wCAGF;AACT;AAOO,SAASylB,GAAsBttB,GAAkC;AAItE,OAFEA,EAAO,qBAAqBA,EAAO,qBAAqBA,EAAO,cAE/C,KAAKA,EAAO;AAC5B,WAAO;AAGT,QAAMI,wBAAU,KAAA,GACVG,IACJP,EAAO,cACPA,EAAO,cACPA,EAAO,aACPA,EAAO,aACHQ,IAAWR,EAAO,YAAYA,EAAO,WAAWA,EAAO;AAE7D,SAAIO,KAAc,IAAI,KAAKA,CAAU,IAAIH,IAChC,gCAGLI,KAAY,IAAI,KAAKA,CAAQ,IAAIJ,IAC5B,+BAGF;AACT;AAOO,SAASmtB,GACd5sB,GACAqB,GACgC;AAChC,MAAI,CAACrB,KAAWA,EAAQ,WAAW,EAAG,QAAO;AAG7C,QAAM4b,IAAgB5b,EAAQ,OAAO,CAAAzwB,MAAK;AACxC,UAAMonB,IAAapnB,EAAE,cAAc,GAC7BkZ,IAAYkO,MAAe,KAAKA,MAAe,GAC/Ck2B,IAAWt9C,EAAE,iBAAiB;AACpC,WAAOkZ,KAAaokC;AAAA,EACtB,CAAC;AAED,MAAIjR,EAAc,WAAW,EAAG,QAAO;AAGvC,QAAMtb,IAASsb,EACZ,IAAI,CAAArsC,MAAK,WAAW,OAAOA,EAAE,SAAS,CAAC,CAAC,CAAC,EACzC,OAAO,OAAK,CAAC,MAAMqgB,CAAC,CAAC;AAExB,MAAI0Q,EAAO,WAAW,EAAG,QAAO;AAEhC,QAAMwsB,IAAW,KAAK,IAAI,GAAGxsB,CAAM,GAC7BysB,IAAY,KAAK,IAAI,GAAGzsB,CAAM;AAGpC,MAAIwsB,MAAaC;AACf,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAAD;AAAA,MACA,WAAAC;AAAA,MACA,eAAe;AAAA,MACf,cAAcJ,GAAsB/Q,EAAc,CAAC,CAAC;AAAA,MACpD,KAAKva,KAAO;AAAA,MACZ,WACEua,EAAc,CAAC,GAAG,cAClBA,EAAc,CAAC,GAAG,cAClB;AAAA,IAAA;AAKN,QAAMvc,IAASuc,EAAc,CAAC;AAC9B,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAOkR;AAAA,IACP,eAAe;AAAA,IACf,cAAcH,GAAsBttB,CAAM;AAAA,IAC1C,KAAKgC,KAAO;AAAA,IACZ,WAAWhC,GAAQ,cAAcA,GAAQ,cAAc;AAAA,EAAA;AAE3D;AAOO,SAAS2tB,GACdC,GACsC;AACtC,MAAI,CAACA,KAAcA,EAAW,WAAW,EAAG,QAAO;AAGnD,QAAMC,IAAYD,EAAW,OAAO,CAAAr9B,MAAK;AACvC,UAAMu9B,IAAcv9B,EAAE,kBAAkB,GAClCw9B,IAAc,CAACx9B,EAAE,gBACjBy9B,IAAUz9B,EAAE,iBAAiB,MAAM,kBACnC09B,IACJD,GAAS,aAAaA,GAAS,YAAYA,GAAS;AACtD,WAAOF,KAAeC,KAAeE;AAAA,EACvC,CAAC;AAED,SAAIJ,EAAU,WAAW,IAAU,OAE5BA,EAAU,IAAI,CAAAt9B,MAAK;AACxB,UAAMy9B,IAAUz9B,EAAE,iBAAiB,MAAM;AAKzC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MALAy9B,GAAS,eACT,CAACA,GAAS,WAAWA,GAAS,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAIhE;AAAA,EAEJ,CAAC;AACH;AC1TO,SAASE,GACdr9C,GACgC;AAChC,QAAM;AAAA,IACJ,OAAA0Y;AAAA,IACA,OAAA++B;AAAA,IACA,eAAAlzC,IAAgBisB,GAAA;AAAA,IAChB,UAAA8sB;AAAA,IACA,WAAAC;AAAA,EAAA,IACEv9C;AAEJ,MAAI,CAAC0Y,EAAO,QAAO;AAEnB,QAAM8yB,IAAYuQ;AAAA,IAChBrjC,EAAM;AAAA,IACNnU;AAAA,EAAA;AAIF,MAAI,CAACmU,EAAM,QAAQ,CAAC8yB,KAAa,CAACiM,GAAO;AACvC,WAAO;AAST,QAAM+F,IAAgBlB;AAAA,IACpB7E;AAAA,IACAA,GAAO;AAAA,EAAA,GAEHgG,IAAoC;AAAA,IACxC,SAAS;AAAA,IACT,MAAMhG,EAAM;AAAA,EAAA;AAEd,EAAI+F,MACFC,EAAS,UAAUD;AAGrB,QAAMjnB,IAAgC;AAAA,IACpC,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,MAAM7d,EAAM;AAAA,IACZ,WAAA8yB;AAAA,IACA,aAAa+Q,GAAe7jC,EAAM,MAAM;AAAA,IACxC,qBAAqB;AAAA,IACrB,UAAA+kC;AAAA,EAAA,GAIIC,IAAU3B,GAAyBrjC,EAAM,aAAanU,CAAa;AACzE,EAAIm5C,MACFnnB,EAAK,UAAUmnB;AAIjB,QAAM1yB,IAActS,EAAM,eAAeA,EAAM;AAC/C,EAAIsS,MACFuL,EAAK,cAAcvL;AAIrB,QAAMoB,IAAW1T,EAAM,SAASA,EAAM,cAAcA,EAAM;AAC1D,EAAI0T,MACFmK,EAAK,QAAQ,CAACnK,CAAQ;AAIxB,QAAMuxB,IAASjB,GAAYhkC,EAAM,kBAAkB4kC,CAAQ;AAC3D,EAAIK,MACFpnB,EAAK,SAASonB;AAIhB,QAAMZ,IAAaD,GAAgBpkC,EAAM,UAAU;AAMnD,MALIqkC,KAAcA,EAAW,SAAS,MACpCxmB,EAAK,YAAYwmB,IAIfQ,GAAW,MAAM;AACnB,UAAMK,IAA8B;AAAA,MAClC,SAAS;AAAA,MACT,MAAML,EAAU;AAAA,IAAA;AAElB,IAAIA,EAAU,QACZK,EAAI,MAAML,EAAU,MAEtBhnB,EAAK,YAAYqnB;AAAA,EACnB;AAGA,SAAIN,MACF/mB,EAAK,MAAM+mB,IAGN/mB;AACT;AC7FA,SAASsnB,GAA4B7mB,GAAwB;AAC3D,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAQA,SAAS8mB,GACPhuB,GACAiuB,GACgC;AAChC,MAAI,CAACjuB,KAAWA,EAAQ,WAAW,EAAG,QAAO;AAG7C,QAAMkuB,IAAgBluB,EAAQ;AAAA,IAC5B,CAAAzwB,MAAKA,EAAE,WAAW,cAAcA,EAAE,WAAW;AAAA,EAAA;AAI/C,MAAI2+C,EAAc,WAAW,GAAG;AAC9B,UAAM5tB,IAASN,EAAQ,IAAI,CAAAzwB,MAAKA,EAAE,KAAK,EAAE,OAAO,CAAAqgB,MAAK,CAAC,MAAMA,CAAC,CAAC;AAC9D,QAAI0Q,EAAO,WAAW,EAAG,QAAO;AAEhC,UAAMwsB,IAAW,KAAK,IAAI,GAAGxsB,CAAM,GAC7BysB,IAAY,KAAK,IAAI,GAAGzsB,CAAM;AAEpC,WAAIwsB,MAAaC,IACR;AAAA,MACL,SAAS;AAAA,MACT,UAAAD;AAAAA,MACA,WAAAC;AAAAA,MACA,eAAe;AAAA,MACf,cAAc;AAAA,IAAA,IAIX;AAAA,MACL,SAAS;AAAA,MACT,OAAOD;AAAAA,MACP,eAAe;AAAA,MACf,cAAc;AAAA,IAAA;AAAA,EAElB;AAEA,QAAMxsB,IAAS4tB,EAAc,IAAI,CAAA3+C,MAAKA,EAAE,KAAK,EAAE,OAAO,CAAAqgB,MAAK,CAAC,MAAMA,CAAC,CAAC;AACpE,MAAI0Q,EAAO,WAAW,EAAG,QAAO;AAEhC,QAAMwsB,IAAW,KAAK,IAAI,GAAGxsB,CAAM,GAC7BysB,IAAY,KAAK,IAAI,GAAGzsB,CAAM;AAEpC,SAAIwsB,MAAaC,IACR;AAAA,IACL,SAAS;AAAA,IACT,UAAAD;AAAA,IACA,WAAAC;AAAA,IACA,eAAe;AAAA,IACf,cAAcgB,GAA4BG,EAAc,CAAC,EAAE,MAAM;AAAA,EAAA,IAI9D;AAAA,IACL,SAAS;AAAA,IACT,OAAOpB;AAAA,IACP,eAAe;AAAA,IACf,cAAciB,GAA4BG,EAAc,CAAC,EAAE,MAAM;AAAA,EAAA;AAErE;AAEO,SAASC,GACdj+C,GACgC;AAChC,QAAM,EAAE,QAAAk+C,GAAQ,cAAAC,EAAA,IAAiBn+C;AAKjC,MAFI,CAACk+C,EAAO,SACR,CAACA,EAAO,eAAeA,EAAO,YAAY,WAAW,KACrD,CAACA,EAAO,OAAO,KAAM,QAAO;AAIhC,QAAME,IAAU9B;AAAA,IACd4B,EAAO;AAAA,IACPA,EAAO,MAAM;AAAA,EAAA,GAETT,IAAoC;AAAA,IACxC,SAAS;AAAA,IACT,MAAMS,EAAO,MAAM;AAAA,EAAA;AAErB,EAAIE,MACFX,EAAS,UAAUW;AAIrB,QAAM7nB,IAAgC;AAAA,IACpC,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,MAAM2nB,EAAO;AAAA,IACb,UAAAT;AAAA,EAAA,GAIIzyB,IAAckzB,EAAO,eAAeA,EAAO;AACjD,EAAIlzB,MACFuL,EAAK,cAAcvL,IAIjBkzB,EAAO,UACT3nB,EAAK,QAAQ,CAAC2nB,EAAO,KAAK;AAI5B,QAAMnB,IAAamB,EAAO,YAAY,OAAO,CAAAx+B,MAAKA,EAAE,WAAW;AAC/D,EAAIq9B,KAAcA,EAAW,SAAS,MACpCxmB,EAAK,YAAYwmB,EAAW,IAAI,CAAAr9B,OAAM;AAAA,IACpC,SAAS;AAAA,IACT,MAAMA,EAAE;AAAA,EAAA,EACR;AAIJ,QAAM2+B,IAAuC,CAAA;AAE7C,aAAWC,KAAOJ,EAAO,aAAa;AACpC,UAAM1S,IAAYuQ;AAAA,MAChBuC,EAAI;AAAA,MACJJ,EAAO;AAAA,IAAA;AAET,QAAI,CAAC1S,EAAW;AAEhB,UAAM+S,IAAoC;AAAA,MACxC,SAAS;AAAA,MACT,MAAMD,EAAI;AAAA,MACV,WAAA9S;AAAA,MACA,aAAa+Q,GAAe+B,EAAI,MAAM;AAAA,MACtC,UAAAb;AAAA,IAAA;AAIF,IAAIU,MACFI,EAAS,KAAK,IAAI,GAAGJ,CAAY,IAAIG,EAAI,EAAE,IAAIA,EAAI,IAAI;AAIzD,UAAMZ,IAAU3B,GAAyBuC,EAAI,aAAaJ,EAAO,QAAQ;AACzE,IAAIR,MACFa,EAAS,UAAUb;AAIrB,UAAMC,IAASG,GAA4BQ,EAAI,SAASA,EAAI,MAAM;AAClE,IAAIX,MACFY,EAAS,SAASZ,IAGpBU,EAAU,KAAKE,CAAQ;AAAA,EACzB;AAGA,SAAIF,EAAU,WAAW,IAAU,QAEnC9nB,EAAK,WAAW8nB,GAET9nB;AACT;ACvLO,SAASioB,GACdx+C,GACgC;AAChC,QAAM,EAAE,YAAAy+C,GAAY,cAAAN,EAAA,IAAiBn+C;AAIrC,MADI,CAACy+C,EAAW,mBACZ,CAACA,EAAW,UAAUA,EAAW,OAAO,WAAW,EAAG,QAAO;AAKjE,QAAMC,IAA6C,CAAA;AAEnD,aAAWhmC,KAAS+lC,EAAW,QAAQ;AACrC,QAAI,CAAC/lC,EAAM,MAAO;AAElB,UAAMimC,IAAoC;AAAA,MACxC,SAAS;AAAA,MACT,UAAUD,EAAgB,SAAS;AAAA,MACnC,MAAMhmC,EAAM;AAAA,IAAA;AAGd,IAAIylC,MACFQ,EAAS,MAAMjmC,EAAM,OACjB,GAAGylC,CAAY,IAAIzlC,EAAM,EAAE,IAAIA,EAAM,IAAI,KACzC,GAAGylC,CAAY,IAAIzlC,EAAM,EAAE,KAGjCgmC,EAAgB,KAAKC,CAAQ;AAAA,EAC/B;AAGA,MAAID,EAAgB,WAAW,EAAG,QAAO;AAEzC,QAAMnoB,IAAgC;AAAA,IACpC,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,MAAMkoB,EAAW;AAAA,EAAA,GAIbzzB,IAAcyzB,EAAW,eAAeA,EAAW;AACzD,SAAIzzB,MACFuL,EAAK,cAAcvL,IAIjByzB,EAAW,eACbloB,EAAK,QAAQ,CAACkoB,EAAW,UAAU,IAGrCloB,EAAK,aAAa;AAAA,IAChB,SAAS;AAAA,IACT,eAAemoB,EAAgB;AAAA,IAC/B,iBAAAA;AAAA,EAAA,GAGKnoB;AACT;AClCO,MAAMqoB,KAAN,MAAMA,GAAkB;AAAA,EAqB7B,YAAY5+C,GAAmC;AAE7C,IAXF,KAAQ,SAA0B,QAKlC,KAAQ,aAAoC,MAC5C,KAAQ,kBAAkB,IAC1B,KAAQ,UAA0B,CAAA,GAI5B,SAAO,WAAa,SAItB4+C,GAAkB,mBAClBA,GAAkB,oBAAoB,QAEtCA,GAAkB,gBAAgB,QAAA,GAGpC,KAAK,aAAa5+C,EAAQ,WAC1B,KAAK,gBAAgBA,EAAQ,cAC7B,KAAK,iBAAiBA,EAAQ,iBAAiBwwB,GAAA,GAC/C,KAAK,WACHxwB,EAAQ,WAAW,OAAO,SAAS,SAAS,OAAO,SAAS,UAE9D,KAAK,eAAA,GAEL4+C,GAAkB,kBAAkB;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAuB;AAC7B,QAAI,KAAK,gBAAiB;AAE1B,UAAMC,IAAY,SAAS,cAAc,uBAAuB,GAC1DC,IAAU,SAAS,cAAc,2BAA2B,GAC5DC,IAAgB,SAAS,cAAc,iCAAiC,GACxEC,IAAU,SAAS,cAAc,2BAA2B,GAC5DC,IAAQ,SAAS,cAAc,yBAAyB,GACxDC,IAAS,SAAS,cAAc,0BAA0B,GAC1DC,IAAkB,SAAS,cAAc,0BAA0B;AAEzE,SAAK,aAAa;AAAA,MAChB,OAAO,SAAS;AAAA,MAChB,eAAeN,GAAW,aAAa,MAAM,KAAK;AAAA,MAClD,SAASC,GAAS,aAAa,SAAS,KAAK;AAAA,MAC7C,eAAeC,GAAe,aAAa,SAAS,KAAK;AAAA,MACzD,SAASC,GAAS,aAAa,SAAS,KAAK;AAAA,MAC7C,OAAOC,GAAO,aAAa,SAAS,KAAK;AAAA,MACzC,QAAQC,GAAQ,aAAa,SAAS,KAAK;AAAA,MAC3C,iBAAiBC,GAAiB,aAAa,SAAS,KAAK;AAAA,IAAA,GAG/D,KAAK,kBAAkB;AAAA,EACzB;AAAA,EAEQ,cAAc5oB,GAAqC;AACzD,QAAI,OAAO,WAAa,IAAa;AAGrC,aAAS,iBAAiB,+BAA+B,EAAE,QAAQ,CAACje,MAAOA,EAAG,QAAQ;AAEtF,UAAM8mC,IAAS,SAAS,cAAc,QAAQ;AAC9C,IAAAA,EAAO,aAAa,QAAQ,qBAAqB,GACjDA,EAAO,aAAa,gBAAgB,QAAQ,GAE5CA,EAAO,cAAc,KAAK,UAAU7oB,CAAI,GACxC,SAAS,KAAK,YAAY6oB,CAAM;AAAA,EAClC;AAAA,EAEQ,SAAS1sD,GAAkBF,GAAuB;AACxD,QAAI,SAAO,WAAa;AAExB,UAAIE,EAAS,WAAW,KAAK,GAAG;AAE9B,YAAI4lB,IAAK,SAAS,cAAc,kBAAkB5lB,CAAQ,IAAI;AAC9D,QAAI4lB,IACFA,EAAG,aAAa,WAAW9lB,CAAO,KAElC8lB,IAAK,SAAS,cAAc,MAAM,GAClCA,EAAG,aAAa,YAAY5lB,CAAQ,GACpC4lB,EAAG,aAAa,WAAW9lB,CAAO,GAClC8lB,EAAG,aAAa,gBAAgB,IAAI,GACpC,SAAS,KAAK,YAAYA,CAAE;AAAA,MAEhC,OAAO;AAEL,YAAIA,IAAK,SAAS,cAAc,cAAc5lB,CAAQ,IAAI;AAC1D,QAAI4lB,IACFA,EAAG,aAAa,WAAW9lB,CAAO,KAElC8lB,IAAK,SAAS,cAAc,MAAM,GAClCA,EAAG,aAAa,QAAQ5lB,CAAQ,GAChC4lB,EAAG,aAAa,WAAW9lB,CAAO,GAClC8lB,EAAG,aAAa,gBAAgB,MAAM,GACtC,SAAS,KAAK,YAAYA,CAAE;AAAA,MAEhC;AAAA,EACF;AAAA,EAEQ,cAAc6Y,GAAmB;AACvC,QAAI,OAAO,WAAa,IAAa;AAErC,QAAI7Y,IAAK,SAAS,cAAc,uBAAuB;AACvD,IAAIA,IACFA,EAAG,aAAa,QAAQ6Y,CAAG,KAE3B7Y,IAAK,SAAS,cAAc,MAAM,GAClCA,EAAG,aAAa,OAAO,WAAW,GAClCA,EAAG,aAAa,QAAQ6Y,CAAG,GAC3B7Y,EAAG,aAAa,gBAAgB,WAAW,GAC3C,SAAS,KAAK,YAAYA,CAAE;AAAA,EAEhC;AAAA,EAEQ,qBAA2B;AACjC,IAAI,OAAO,WAAa,OACxB,SAAS,iBAAiB,gBAAgB,EAAE,QAAQ,CAACA,MAAOA,EAAG,QAAQ;AAAA,EACzE;AAAA,EAEQ,oBAA0B;AAChC,QAAI,SAAO,WAAa,OAAe,CAAC,KAAK,aAM7C;AAAA,UAHA,SAAS,QAAQ,KAAK,WAAW,OAG7B,KAAK,WAAW,kBAAkB,MAAM;AAC1C,cAAMumC,IAAY,SAAS,cAAc,uBAAuB;AAChE,QAAIA,KACFA,EAAU,aAAa,QAAQ,KAAK,WAAW,aAAa;AAAA,MAEhE;AAGA,WAAK,qBAAqB,YAAY,KAAK,WAAW,OAAO,GAC7D,KAAK,qBAAqB,kBAAkB,KAAK,WAAW,aAAa,GACzE,KAAK,qBAAqB,YAAY,KAAK,WAAW,OAAO,GAC7D,KAAK,qBAAqB,UAAU,KAAK,WAAW,KAAK,GACzD,KAAK,qBAAqB,WAAW,KAAK,WAAW,MAAM,GAG3D,KAAK,iBAAiB,eAAe,KAAK,WAAW,eAAe,GAEpE,KAAK,kBAAkB;AAAA;AAAA,EACzB;AAAA,EAEQ,qBAAqBnsD,GAAkB2sD,GAAsC;AACnF,UAAM/mC,IAAK,SAAS,cAAc,kBAAkB5lB,CAAQ,IAAI;AAChE,IAAI2sD,MAAoB,QAAQ/mC,IAE9BA,EAAG,aAAa,WAAW+mC,CAAe,IACjCA,MAAoB,QAAQ/mC,GAAI,aAAa,cAAc,KAEpEA,EAAG,OAAA;AAAA,EAEP;AAAA,EAEQ,iBAAiB2I,GAAco+B,GAAsC;AAC3E,UAAM/mC,IAAK,SAAS,cAAc,cAAc2I,CAAI,IAAI;AACxD,IAAIo+B,MAAoB,QAAQ/mC,IAC9BA,EAAG,aAAa,WAAW+mC,CAAe,IACjCA,MAAoB,QAAQ/mC,GAAI,aAAa,cAAc,KACpEA,EAAG,OAAA;AAAA,EAEP;AAAA,EAEQ,eAAeka,GAAiD;AACtE,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,iBAAiBA,EAAO,IAAI,CAAC9Z,GAAOjoB,MAAM;AACxC,cAAMqgC,IAAOpY,EAAM,QAAQgY,GAAahY,EAAM,IAAI;AAClD,eAAO;AAAA,UACL,SAAS;AAAA,UACT,UAAUjoB,IAAI;AAAA,UACd,KAAK,GAAG,KAAK,QAAQ,MAAMioB,EAAM,EAAE,IAAIoY,CAAI;AAAA,QAAA;AAAA,MAE/C,CAAC;AAAA,IAAA;AAAA,EAEL;AAAA,EAEQ,gBAAgB1W,GAAc4G,GAAqB8P,GAAsB;AAC/E,UAAM37B,IAASilB,MAAS,UAAU,MAAMA,MAAS,WAAW,MAAM;AAClE,WAAO,GAAG,KAAK,QAAQ,IAAIjlB,CAAM,IAAI6rB,CAAE,IAAI8P,CAAI;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,eACE0B,GACAilB,GACM;AAEN,QADI,OAAO,WAAa,OACpB,KAAK,WAAW,YAAa;AAGjC,QAAIA,GAAO;AACT,WAAK,aAAaA,EAAM,QAAQ,KAAK,YACrC,KAAK,gBAAgBA,EAAM,WAAWA,EAAM,2BAA2B,KAAK;AAC5E,YAAM6H,IAAU7H,EAAM,YAAYA,EAAM;AACxC,MAAI6H,MACF,KAAK,iBAAiBA;AAAA,IAE1B;AAGA,SAAK,UAAU9sB;AAGf,UAAM+sB,IAAW,KAAK,eAAe/sB,CAAM;AAC3C,SAAK,cAAc+sB,CAAQ,GAE3B,KAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBACEnlC,GACAmc,GACAkhB,GACM;AAEN,QADI,OAAO,WAAa,OACpB,KAAK,WAAW,YAAa;AAMjC,QAHA,KAAK,eAAA,GAGDA,GAAO;AACT,WAAK,aAAaA,EAAM,QAAQ,KAAK,YACrC,KAAK,gBAAgBA,EAAM,WAAWA,EAAM,2BAA2B,KAAK;AAC5E,YAAM6H,IAAU7H,EAAM,YAAYA,EAAM;AACxC,MAAI6H,MACF,KAAK,iBAAiBA;AAAA,IAE1B;AAEA,QAAIE,IAAyC,MACzCC,IAAa,IACbC,IAAoB,IACpBC,IAAc,IACdC,IAAY;AAEhB,QAAIxlC,MAAS,SAAS;AACpB,YAAM0W,IAAOyF,EAAK,QAAQ7F,GAAa6F,EAAK,QAAQ,EAAE;AACtD,MAAAqpB,IAAY,KAAK,gBAAgB,SAASrpB,EAAK,MAAMA,EAAK,WAAW,IAAIzF,CAAI,GAE7E0uB,IAASnC,GAAiB;AAAA,QACxB,OAAO9mB;AAAA,QACP,OAAO;AAAA,UACL,MAAM,KAAK;AAAA,UACX,yBAAyB,KAAK;AAAA,QAAA;AAAA,QAEhC,eAAe,KAAK;AAAA,QACpB,UAAUqpB;AAAA,MAAA,CACX,GAEDH,IAAalpB,EAAK,QAAQ,IAC1BmpB,IAAoBnpB,EAAK,eAAeA,EAAK,gBAAgB,IAC7DopB,IAAcppB,EAAK,SAASA,EAAK,cAAcA,EAAK,aAAa;AAAA,IACnE,WAAWnc,MAAS,UAAU;AAC5B,YAAM0W,IAAOyF,EAAK,QAAQ7F,GAAa6F,EAAK,SAAS,EAAE;AACvD,MAAAqpB,IAAY,KAAK,gBAAgB,UAAUrpB,EAAK,MAAM,IAAIzF,CAAI,GAE9D0uB,IAASvB,GAAkB;AAAA,QACzB,QAAQ;AAAA,UACN,GAAG1nB;AAAA,UACH,OAAO;AAAA,YACL,MAAM,KAAK;AAAA,YACX,yBAAyB,KAAK;AAAA,UAAA;AAAA,UAEhC,UAAU,KAAK;AAAA,QAAA;AAAA,QAEjB,cAAcqpB;AAAA,MAAA,CACf,GAEDH,IAAalpB,EAAK,SAAS,IAC3BmpB,IAAoBnpB,EAAK,eAAeA,EAAK,gBAAgB,IAC7DopB,IAAcppB,EAAK,SAAS;AAAA,IAC9B,WAAWnc,MAAS,cAAc;AAChC,YAAM0W,IAAOyF,EAAK,QAAQ7F,GAAa6F,EAAK,mBAAmB,EAAE;AACjE,MAAAqpB,IAAY,KAAK,gBAAgB,cAAcrpB,EAAK,MAAM,IAAIzF,CAAI,GAElE0uB,IAAShB,GAAsB;AAAA,QAC7B,YAAYjoB;AAAA,QACZ,cAAcqpB;AAAA,QACd,iBAAiB,KAAK;AAAA,MAAA,CACvB,GAEDH,IAAalpB,EAAK,mBAAmB,IACrCmpB,IAAoBnpB,EAAK,eAAeA,EAAK,WAAW,IACxDopB,IAAcppB,EAAK,cAAc;AAAA,IACnC;AAGA,IAAIipB,KACF,KAAK,cAAcA,CAAM,GAIvBI,KACF,KAAK,cAAcA,CAAS,GAI1BH,KACF,KAAK,SAAS,YAAYA,CAAU,GAElCC,KACF,KAAK,SAAS,kBAAkBA,CAAiB,GAE/CC,KACF,KAAK,SAAS,YAAYA,CAAW,GAEnCC,KACF,KAAK,SAAS,UAAUA,CAAS,GAEnC,KAAK,SAAS,WAAW,SAAS,GAGlC,KAAK,SAAS,gBAAgB,qBAAqB,GAG/CF,KACF,KAAK,SAAS,eAAeA,CAAiB,GAI5CD,MACF,SAAS,QAAQ,GAAGA,CAAU,MAAM,KAAK,UAAU,KAGrD,KAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAwB;AACtB,QAAI,SAAO,WAAa,QACpB,KAAK,WAAW,aASpB;AAAA,UANA,KAAK,kBAAA,GAGL,KAAK,mBAAA,GAGD,KAAK,QAAQ,SAAS,GAAG;AAC3B,cAAMF,IAAW,KAAK,eAAe,KAAK,OAAO;AACjD,aAAK,cAAcA,CAAQ;AAAA,MAC7B;AAGA,WAAK,eAAA,GAEL,KAAK,SAAS;AAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAgB;AACd,IAAI,OAAO,WAAa,OACpB,KAAK,WAAW,gBAEpB,KAAK,mBAAA,GACL,KAAK,kBAAA,GAEDX,GAAkB,oBAAoB,SACxCA,GAAkB,kBAAkB,OAGtC,KAAK,SAAS;AAAA,EAChB;AACF;AA5YEA,GAAO,kBAA4C;AAV9C,IAAMiB,KAANjB;ACnDP,MAAAkB,KAAe,mzGCAfC,KAAe,ynECAfC,KAAe,o+CCyBFC,KAAa;AAAA;AAAA,EAExB,cAAc;AAAA;AAAA;AAAA,EAGd,aAAa;AAAA;AAAA,EACb,eAAe;AAAA;AAAA,EACf,cAAc;AAAA;AAAA;AAAA,EAGd,WAAW;AAAA;AAAA,EACX,aAAa;AAAA;AAAA,EACb,cAAc;AAAA;AAAA;AAAA,EAGd,eAAe;AAAA;AAAA,EACf,iBAAiB;AAAA;AAAA;AAAA,EAGjB,cAAc;AAAA;AAAA,EACd,mBAAmB;AAAA;AAAA,EACnB,eAAe;AAAA;AAAA;AAAA,EAGf,SAAS;AAAA;AAAA,EACT,WAAW;AAAA;AAAA,EACX,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA;AAAA,EAGjB,SAAS;AAAA,EACT,WAAW;AACb,GAGaC,KAAY;AAAA;AAAA,EAEvB,cAAc;AAAA;AAAA;AAAA,EAGd,aAAa;AAAA;AAAA,EACb,eAAe;AAAA;AAAA,EACf,cAAc;AAAA;AAAA;AAAA,EAGd,WAAW;AAAA;AAAA,EACX,aAAa;AAAA;AAAA,EACb,cAAc;AAAA;AAAA;AAAA,EAGd,eAAe;AAAA,EACf,iBAAiB;AAAA;AAAA,EAGjB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,eAAe;AAAA;AAAA,EAGf,SAAS;AAAA,EACT,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA;AAAA,EAGjB,SAAS;AAAA,EACT,WAAW;AACb,GAGaC,KAAoB;AAAA,EAC/B,cAAc;AAAA,EACd,aAAa;AAAA,EACb,eAAe;AAAA,EACf,cAAc;AAAA,EACd,WAAW;AAAA,EACX,aAAa;AAAA,EACb,cAAc;AAAA,EACd,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,SAAS;AAAA,EACT,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,WAAW;AACb,GAGaC,KAAS;AAAA,EACpB,OAAOH;AAAA,EACP,MAAMC;AAAA,EACN,cAAcC;AAChB;AAOO,SAASE,GAAW1tD,GAAO2tD,IAAY,SAAS,iBAAiB;AACtE,QAAMC,IAAY;AAAA,IAChB,cAAc;AAAA,IACd,aAAa;AAAA,IACb,eAAe;AAAA,IACf,cAAc;AAAA,IACd,WAAW;AAAA,IACX,aAAa;AAAA,IACb,cAAc;AAAA,IACd,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,SAAS;AAAA,IACT,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,WAAW;AAAA,EACf;AAEE,SAAO,QAAQ5tD,CAAK,EAAE,QAAQ,CAAC,CAACgB,GAAKC,CAAK,MAAM;AAC9C,UAAM4sD,IAASD,EAAU5sD,CAAG;AAC5B,IAAI6sD,KACFF,EAAU,MAAM,YAAYE,GAAQ5sD,CAAK;AAAA,EAE7C,CAAC,GAOG0sD,EAAU,iBACR3tD,MAAUutD,KACZI,EAAU,aAAa,cAAc,MAAM,KAClC3tD,MAAUstD,MAActtD,MAAUwtD,OAC3CG,EAAU,aAAa,cAAc,OAAO;AAGlD;AAOO,SAASG,GAAiB9tD,GAAO;AACtC,QAAM4tD,IAAY;AAAA,IAChB,cAAc;AAAA,IACd,aAAa;AAAA,IACb,eAAe;AAAA,IACf,cAAc;AAAA,IACd,WAAW;AAAA,IACX,aAAa;AAAA,IACb,cAAc;AAAA,IACd,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,SAAS;AAAA,IACT,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,WAAW;AAAA,EACf,GAEQG,IAAQ,CAAA;AACd,gBAAO,QAAQ/tD,CAAK,EAAE,QAAQ,CAAC,CAACgB,GAAKC,CAAK,MAAM;AAC9C,UAAM4sD,IAASD,EAAU5sD,CAAG;AAC5B,IAAI6sD,KACFE,EAAM,KAAK,KAAKF,CAAM,KAAK5sD,CAAK,GAAG;AAAA,EAEvC,CAAC,GAEM;AAAA,EAAY8sD,EAAM,KAAK;AAAA,CAAI,CAAC;AAAA;AACrC;AC3JA,IAAIC,KAAc;AAAA,EAChB,sBAAsB;AAAA,EACtB,yBAAyB;AAC3B;AAWO,SAASC,GAAeC,IAAU,IAAI;AAC3C,EAAAF,KAAc,EAAE,GAAGA,IAAa,GAAGE,EAAA;AACrC;AAWO,SAASC,KAAiB;AAC/B,SAAO,EAAE,GAAGH,GAAA;AACd;ACtEA,SAASI,GAAcC,GAAK;AAC1B,QAAM5uD,IAAS,4CAA4C,KAAK4uD,KAAO,EAAE;AACzE,MAAI,CAAC5uD,EAAQ,QAAO;AAEpB,QAAM+M,IAAI,SAAS/M,EAAO,CAAC,GAAG,EAAE,IAAI,KAC9B6rC,IAAI,SAAS7rC,EAAO,CAAC,GAAG,EAAE,IAAI,KAC9BwkC,IAAI,SAASxkC,EAAO,CAAC,GAAG,EAAE,IAAI,KAE9B6uD,IAAM,KAAK,IAAI9hD,GAAG8+B,GAAGrH,CAAC,GACtBsqB,IAAM,KAAK,IAAI/hD,GAAG8+B,GAAGrH,CAAC;AAC5B,MAAIX,IAAI,GACJtzB,IAAI;AACR,QAAMw+C,KAAKF,IAAMC,KAAO;AAExB,MAAID,MAAQC,GAAK;AACf,UAAM,IAAID,IAAMC;AAEhB,YADAv+C,IAAIw+C,IAAI,MAAM,KAAK,IAAIF,IAAMC,KAAO,KAAKD,IAAMC,IACvCD,GAAG;AAAA,MACT,KAAK9hD;AACH,QAAA82B,MAAMgI,IAAIrH,KAAK,KAAKqH,IAAIrH,IAAI,IAAI,MAAM;AACtC;AAAA,MACF,KAAKqH;AACH,QAAAhI,MAAMW,IAAIz3B,KAAK,IAAI,KAAK;AACxB;AAAA,MACF,KAAKy3B;AACH,QAAAX,MAAM92B,IAAI8+B,KAAK,IAAI,KAAK;AACxB;AAAA,IACR;AAAA,EACE;AAEA,SAAO;AAAA,IACL,GAAG,KAAK,MAAMhI,IAAI,GAAG;AAAA,IACrB,GAAG,KAAK,MAAMtzB,IAAI,GAAG;AAAA,IACrB,GAAG,KAAK,MAAMw+C,IAAI,GAAG;AAAA,EACzB;AACA;AAGO,SAASC,GAAeJ,GAAK;AAClC,QAAMjtD,IAAQgtD,GAAcC,CAAG;AAC/B,SAAOjtD,IAAQ,GAAGA,EAAM,CAAC,IAAIA,EAAM,CAAC,KAAKA,EAAM,CAAC,MAAM;AACxD;AASO,SAASstD,GAAsBC,GAAQ;AAC5C,MAAI,CAACA,KAAU,OAAOA,KAAW,SAAU,QAAO,CAAA;AAClD,QAAMC,IAAM,CAAAP,MAAOI,GAAeJ,CAAG,GAG/BtmB,IAAM;AAAA,IACV,mBAAmB4mB,EAAO;AAAA,IAC1B,qBAAqBA,EAAO;AAAA,IAC5B,gBAAgBA,EAAO;AAAA,IACvB,kBAAkBA,EAAO;AAAA,IACzB,kBAAkBA,EAAO;AAAA,IACzB,oBAAoBA,EAAO;AAAA,IAC3B,mBAAmBA,EAAO;AAAA,IAC1B,YAAYA,EAAO;AAAA,IACnB,oBAAoBA,EAAO;AAAA,IAC3B,sBAAsBA,EAAO;AAAA,IAC7B,mBAAmBA,EAAO;AAAA,IAC1B,sBAAsBA,EAAO;AAAA,IAC7B,oBAAoBA,EAAO;AAAA,IAC3B,mBAAmBA,EAAO;AAAA,IAC1B,oBAAoBA,EAAO;AAAA,IAE3B,mBAAmBA,EAAO;AAAA,IAC1B,wBAAwBA,EAAO;AAAA,IAC/B,oBAAoBA,EAAO;AAAA,IAE3B,oBAAoBA,EAAO;AAAA,IAC3B,uBAAuBA,EAAO;AAAA,IAC9B,iBAAiBA,EAAO;AAAA,IACxB,qBAAqBA,EAAO;AAAA,IAC5B,mBAAmBA,EAAO;AAAA,IAC1B,mBAAmBA,EAAO;AAAA,IAC1B,kBAAkBA,EAAO;AAAA,IACzB,kBAAkBA,EAAO;AAAA,IACzB,gBAAgBA,EAAO;AAAA,IAEvB,gBAAgBA,EAAO;AAAA,IACvB,oBAAoBA,EAAO;AAAA,IAC3B,cAAcA,EAAO;AAAA,IACrB,aAAaA,EAAO;AAAA,IACpB,cAAcA,EAAO;AAAA,IACrB,iBAAiBA,EAAO;AAAA,IAExB,cAAcA,EAAO;AAAA,IACrB,uBAAuBA,EAAO;AAAA,IAC9B,kBAAkBA,EAAO;AAAA,IACzB,cAAcA,EAAO;AAAA,IACrB,aAAaA,EAAO;AAAA,IACpB,gBAAgBA,EAAO;AAAA,IACvB,oBAAoBA,EAAO;AAAA,IAC3B,mBAAmBA,EAAO;AAAA,IAC1B,uBAAuBA,EAAO;AAAA,IAC9B,sBAAsBA,EAAO;AAAA,IAC7B,sBAAsBA,EAAO;AAAA,IAC7B,eAAeA,EAAO;AAAA,IACtB,iBAAiBA,EAAO;AAAA,IACxB,cAAcA,EAAO;AAAA,IAErB,kBAAkBA,EAAO;AAAA,IACzB,sBAAsBA,EAAO;AAAA,IAC7B,qBAAqBA,EAAO;AAAA,IAC5B,oBAAoBA,EAAO;AAAA,IAC3B,gBAAgBA,EAAO;AAAA,IACvB,oBAAoBA,EAAO;AAAA,IAC3B,0BAA0BA,EAAO;AAAA,IACjC,oBAAoBA,EAAO;AAAA,IAC3B,oBAAoBA,EAAO;AAAA,IAC3B,qBAAqBA,EAAO;AAAA,IAC5B,mBAAmBA,EAAO;AAAA,IAC1B,iBAAiBA,EAAO;AAAA,IACxB,qBAAqBA,EAAO;AAAA,IAC5B,mBAAmBA,EAAO;AAAA,IAC1B,kBAAkBA,EAAO;AAAA,IACzB,mBAAmBA,EAAO;AAAA,IAC1B,mBAAmBA,EAAO;AAAA,IAC1B,uBAAuBA,EAAO;AAAA,IAC9B,sBAAsBA,EAAO;AAAA,IAC7B,oBAAoBA,EAAO;AAAA,IAC3B,sBAAsBA,EAAO;AAAA,IAC7B,oBAAoBA,EAAO;AAAA,IAC3B,sBAAsBA,EAAO;AAAA,IAE7B,kBAAkBA,EAAO;AAAA,IACzB,sBAAsBA,EAAO;AAAA,IAC7B,cAAcA,EAAO;AAAA,IACrB,cAAcA,EAAO;AAAA,IACrB,cAAcA,EAAO;AAAA,IACrB,gBAAgBA,EAAO;AAAA,IACvB,oBAAoBA,EAAO;AAAA,IAC3B,sBAAsBA,EAAO;AAAA,IAC7B,uBAAuBA,EAAO;AAAA,IAC9B,mBAAmBA,EAAO;AAAA,IAC1B,iBAAiBA,EAAO;AAAA,IACxB,qBAAqBA,EAAO;AAAA,IAC5B,oBAAoBA,EAAO;AAAA,IAC3B,mBAAmBA,EAAO;AAAA,IAC1B,oBAAoBA,EAAO;AAAA,IAC3B,wBAAwBA,EAAO;AAAA,IAC/B,qBAAqBA,EAAO;AAAA,IAC5B,iBAAiBA,EAAO;AAAA,IACxB,mBAAmBA,EAAO;AAAA,IAC1B,cAAcA,EAAO;AAAA,IAErB,cAAcA,EAAO;AAAA,IACrB,gBAAgBA,EAAO;AAAA,EAC3B,GAGQ5nB,IAAM,CAAA;AACZ,aAAW,CAAC8mB,GAAQgB,CAAM,KAAK,OAAO,QAAQ9mB,CAAG,GAAG;AAClD,UAAMrJ,IAAIkwB,EAAIC,CAAM;AACpB,IAAInwB,MAAGqI,EAAI8mB,CAAM,IAAInvB,IAEjBmvB,MAAW,oBAAoBnvB,MAAGqI,EAAI,kBAAkB,IAAI;AAAA,EAClE;AACA,SAAOA;AACT;AASO,SAAS+nB,GAAkBH,GAAQhB,GAAW;AACnD,MAAI,CAACA,KAAa,CAACA,EAAU,MAAO;AACpC,QAAMoB,IAAOL,GAAsBC,CAAM;AACzC,aAAW,CAACd,GAAQ5sD,CAAK,KAAK,OAAO,QAAQ8tD,CAAI;AAC/C,IAAApB,EAAU,MAAM,YAAYE,GAAQ5sD,CAAK;AAE7C;ACxLA,IAAI+tD,KAAkB;AAOtB,eAAeC,GAAkBC,GAAU;AACzC,MAAI;AACF,UAAMC,IAAM,MAAM;AAAA,MAChB,GAAGtd,GAAgB,CAAE,YAAY,mBAAmBqd,CAAQ,CAAC;AAAA,IACnE;AACI,WAAKC,EAAI,KACF,MAAMA,EAAI,SADG;AAAA,EAEtB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAUA,MAAMC,KAAWr3B;AAAA,EAAS,MACxB,QAAA,QAAA,EAAA,KAAA,MAAAs3B,EAAA,EAA6B,KAAK,CAACn/C,MAAMA,EAAE,iBAAiB;AAC9D;AAQA,IAAI,OAAO,SAAW,OAAe,OAAO,cAAgB,KAAa;AAIvE,QAAMo/C,IAAW;AAAA,IACf,YAAY;AAAA,IACZ,mBAAmB;AAAA;AAAA;AAAA,IAGnB,aAAa;AAAA,IACb,MAAQ;AAAA,IACR,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,YAAY;AAAA,IACZ,QAAU;AAAA,EACd,GAEQC,IAAc,CAAC5pC,MAAO;AAC1B,UAAMjY,IAAO,EAAE,QAAQiY,GAAI,QAAQ,CAAA,EAAE;AACrC,eAAW,CAAC6pC,GAAMxuD,CAAG,KAAK,OAAO,QAAQsuD,CAAQ,GAAG;AAClD,YAAM5wB,IAAI/Y,EAAG,aAAa6pC,CAAI;AAC9B,MAAI9wB,MAAM,SACN19B,MAAQ,qBAAqBA,MAAQ,sBACvC0M,EAAK1M,CAAG,IAAI09B,MAAM,UAElBhxB,EAAK1M,CAAG,IAAI09B;AAAA,IAEhB;AACA,WAAOhxB;AAAA,EACT;AAEA,EAAAshD,KAAkB,cAAc,YAAY;AAAA,IAC1C,cAAc;AACZ,eACA,KAAK,YAAY,MACjB,KAAK,cAAc;AAAA,IACrB;AAAA,IAEA,oBAAoB;AAClB,YAAM95C,IAAQ,EAAE,KAAK;AACrB,MAAAk6C,GAAQ,EACL,KAAK,OAAOK,MAAsB;AAIjC,YAAIv6C,MAAU,KAAK,YAAa;AAChC,cAAMxH,IAAO6hD,EAAY,IAAI;AAM7B,YAAI7hD,EAAK,UAAU;AACjB,gBAAMjP,IAAS,MAAMwwD,GAAkBvhD,EAAK,QAAQ;AACpD,cAAIwH,MAAU,KAAK,YAAa;AAChC,UAAIzW,MACEA,EAAO,UAAQqwD,GAAkBrwD,EAAO,QAAQ,IAAI,GACpDA,EAAO,gBAAaiP,EAAK,OAAOjP,EAAO,cACvCA,EAAO,iBAAciP,EAAK,eAAejP,EAAO;AAAA,QAExD;AAEA,aAAK,YAAYgxD,EAAkB/hD,CAAI;AAAA,MACzC,CAAC,EACA,MAAM,CAACyqB,MAAQ;AAMd,gBAAQ,MAAM,qDAAqDA,CAAG;AAAA,MACxE,CAAC;AAAA,IACL;AAAA,IAEA,uBAAuB;AAGrB,UADA,KAAK,eACD,KAAK,WAAW;AAClB,YAAI;AACF,UAAAu3B,GAAQ,KAAK,SAAS;AAAA,QACxB,QAAQ;AAAA,QAER;AACA,aAAK,YAAY;AAAA,MACnB;AAAA,IACF;AAAA,IAEA,WAAW,qBAAqB;AAC9B,aAAO,OAAO,KAAKJ,CAAQ;AAAA,IAC7B;AAAA,IAEA,yBAAyBK,GAAOC,GAAUC,GAAU;AAClD,MAAID,MAAaC,MAEb,KAAK,aAAa,KAAK,cAAc,OACvC,KAAK,qBAAoB,GACzB,KAAK,kBAAiB;AAAA,IAE1B;AAAA,EACJ,GAEO,eAAe,IAAI,kBAAkB,KACxC,eAAe,OAAO,oBAAoBb,EAAe;AAE7D;AC5HA,MAAMc,KACoC,UAIpCniD,KAASP,GAAa,eAAe;AAK3C,IAAI2iD,KAAiB;AAqBd,SAASC,GAAuB3iD,IAAU,IAAI;AACnD,EAAI,OAAOA,EAAQ,WAAY,eAC7B0iD,KAAiB1iD,EAAQ,SAGzBskC,GAAa;AAAA,IACX,SAAS,CAAAxZ,MAAO;AACd,UAAI;AACF,QAAA9qB,EAAQ,QAAQ8qB,GAAK,EAAE,QAAQ,OAAO;AAAA,MACxC,SAAS83B,GAAe;AACtB,QAAAtiD,GAAO,MAAM,0BAA0BsiD,CAAa;AAAA,MACtD;AAAA,IACF;AAAA,EAAA,CACD,IAEC,OAAO5iD,EAAQ,cAAe,YAChCskC,GAAa,EAAE,SAAStkC,EAAQ,WAAA,CAAY,GAE1C,OAAOA,EAAQ,cAAe,YAChCskC,GAAa,EAAE,SAAStkC,EAAQ,WAAA,CAAY,GAE1C,OAAOA,EAAQ,cAAe,YAChCskC,GAAa,EAAE,SAAStkC,EAAQ,WAAA,CAAY,GAE1CA,EAAQ,SAAS,OAAOA,EAAQ,SAAU,YAC5C4gD,GAAe5gD,EAAQ,KAAK;AAEhC;AASO,SAAS6iD,GAAY/3B,GAAKmhB,IAAS,WAAW;AACnD,MAAKyW;AACL,QAAI;AACF,YAAM/xC,IAAQma,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC;AAChE,MAAA43B,GAAe/xC,GAAO,EAAE,QAAAs7B,GAAQ;AAAA,IAClC,SAAS2W,GAAe;AACtB,MAAAtiD,GAAO,MAAM,0BAA0BsiD,CAAa;AAAA,IACtD;AACF;AAKA,IAAI,OAAO,SAAW,KAAa;AAEjC,QAAM1tB,IAAI;AACV,EAAAA,EAAE,uBAAuBA,EAAE,wBAAwB,CAAA,GACnDA,EAAE,qBAAqB,UAAUutB,IACjCvtB,EAAE,qBAAqB,YAAYytB;AACrC;AAKA,MAAMG,yBAAiB,IAAA;AACvB,SAASC,GAAUpvD,GAAKg3B,GAAQ;AAC9B,SAAKm4B,GAAW,IAAInvD,CAAG,KAAGmvD,GAAW,IAAInvD,GAAKg3B,GAAQ,GAC/Cm4B,GAAW,IAAInvD,CAAG;AAC3B;AACA,MAAMqvD,KAAQ;AAAA;AAAA;AAAA;AAAA,EAIZ,WAAW,MACTD;AAAA,IAAU;AAAA,IAAa,MACrB,OAAO,yBAAsC,EAAA,KAAA,CAAAxjD,MAAAA,EAAA,CAAA,EAAE,KAAK,CAAAsD,MAAKA,EAAE,OAAO;AAAA,EAAA;AAAA,EAEtE,UAAU,MACRkgD;AAAA,IAAU;AAAA,IAAY,MACpB,OAAO,wBAAqC,EAAA,KAAA,CAAAxjD,MAAAA,EAAA,CAAA,EAAE,KAAK,CAAAsD,MAAKA,EAAE,OAAO;AAAA,EAAA;AAAA,EAErE,SAAS,MACPkgD;AAAA,IAAU;AAAA,IAAW,MACnB,OAAO,uBAAoC,EAAE,KAAK,CAAAlgD,MAAKA,EAAE,OAAO;AAAA,EAAA;AAAA,EAEpE,UAAU,MACRkgD;AAAA,IAAU;AAAA,IAAY,MACpB,OAAO,wBAAqC,EAAE,KAAK,CAAAlgD,MAAKA,EAAE,OAAO;AAAA,EAAA;AAAA,EAErE,kBAAkB,MAChBkgD;AAAA,IAAU;AAAA,IAAoB,MAC5B,OAAO,gCAA6C,EAAE,KAAK,CAAAlgD,MAAKA,EAAE,OAAO;AAAA,EAAA;AAAA,EAE7E,cAAc,MACZkgD;AAAA,IAAU;AAAA,IAAgB,MACxB,OAAO,wBAAwC,EAAA,KAAA,CAAAxjD,MAAAA,EAAA,CAAA,EAAE,KAAK,CAAAsD,MAAKA,EAAE,OAAO;AAAA,EAAA;AAAA,EAExE,YAAY,MACVkgD;AAAA,IAAU;AAAA,IAAc,MACtB,OAAO,0BAAuC,EAAE,KAAK,CAAAlgD,MAAKA,EAAE,OAAO;AAAA,EAAA;AAAA,EAEvE,gBAAgB,MACdkgD;AAAA,IAAU;AAAA,IAAkB,MAC1B,OAAO,8BAA2C,EAAA,KAAA,CAAAxjD,MAAAA,EAAA,CAAA,EAAE,KAAK,CAAAsD,MAAKA,EAAE,OAAO;AAAA,EAAA;AAE7E;AAEA,SAASogD,GAAex/B,GAAQxC,GAAM;AACpC,MAAI3I;AACJ,SAAI,OAAOmL,KAAW,WAAUnL,IAAK,SAAS,cAAcmL,CAAM,IACzDA,aAAkB,gBAAanL,IAAKmL,IACxCnL,KAAIhY,GAAO,MAAM,GAAG2gB,CAAI,4BAA4B,GAKrD3I,KAAM,CAACA,EAAG,UAAU,SAAS,SAAS,KAAGA,EAAG,UAAU,IAAI,SAAS,GAChEA;AACT;AAYO,SAAS8pC,GAAkBpiD,IAAU,IAAI;AAC9C,QAAM;AAAA,IACJ,QAAAyjB;AAAA,IACA,SAAAkkB,IAAU;AAAA,IACV,gBAAA4J,IAAiB;AAAA,IACjB,MAAA2R,IAAO;AAAA,IACP,QAAA1wB,IAAS,CAAA;AAAA,IACT,iBAAA6e,IAAkB;AAAA,IAClB,mBAAAC,IAAoB;AAAA,IACpB,cAAA7jB;AAAA,IACA,aAAAD;AAAA,IACA,YAAAE;AAAA,IACA,YAAAC;AAAA,IACA,cAAAw1B;AAAA,IACA,cAAA3R;AAAA,IACA,QAAAn4B;AAAA,IACA,eAAAo4B;AAAA,IACA,SAAAE;AAAA;AAAA;AAAA;AAAA,IAIA,mBAAAC,IAAoB;AAAA;AAAA,IAEpB,cAAAF,IAAe;AAAA,EAAA,IACb1xC,GAEEojD,IAAgBH,GAAex/B,GAAQ,eAAe;AAC5D,MAAI,CAAC2/B,EAAe,QAAO;AASX,GAPC;AAAA,IACf,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EAAA,GAEaF,EAAK,YAAA,CAAa;AAE3C,QAAM9jB,IAAciS,IAChB;AAAA,IACE,EAAE,IAAI,GAAG,MAAMh4B,GAAQ,YAAY,QAAQ,MAAM0mC,GAAA;AAAA,IACjD,EAAE,IAAI,GAAG,MAAM1mC,GAAQ,eAAe,WAAW,MAAM2mC,GAAA;AAAA,IACvD,EAAE,IAAI,GAAG,MAAM3mC,GAAQ,gBAAgB,YAAY,MAAMymC,GAAA;AAAA,EAAa,IAExE,MAEEuD,IAAenT,IAAS,oBAAI,KAAA,GAAO,aAAa,GAChDoT,IAAcpT,IAAS,oBAAI,KAAA,GAAO,gBAAgB,GAsBlDqT,IAAQ;AAAA,IACZ,mBAAAjS;AAAA,IACA,iBAAiBlS,KAAe;AAAA,IAChC,QAAQ5M,KAAU,CAAA;AAAA,IAClB,SAASmV,KAAW;AAAA,IACpB,gBAAgB4J,KAAkB;AAAA,IAClC,cAAc9jB,KAAgB41B;AAAA,IAC9B,aAAa71B,KAAe81B;AAAA,IAC5B,YAAY51B,MA5BY,MAAM;AAC9B,MAAA21B,EAAa,OAAO,CAAAxgD,MACdA,MAAM,MACRygD,EAAY,OAAO,CAAA1gD,MAAKA,IAAI,CAAC,GACtB,KAEFC,IAAI,CACZ;AAAA,IACH;AAAA,IAqBE,YAAY8qB,MAnBY,MAAM;AAC9B,MAAA01B,EAAa,OAAO,CAAAxgD,MACdA,MAAM,KACRygD,EAAY,OAAO,CAAA1gD,MAAKA,IAAI,CAAC,GACtB,MAEFC,IAAI,CACZ;AAAA,IACH;AAAA,IAYE,cAAAsgD;AAAA,IACA,cAAc3R,KAAgB;AAAA,IAC9B,eAAeC,KAAiB;AAAA,IAChC,mBAAAG;AAAA,IACA,GAAIF,IAAe,EAAE,cAAAA,EAAA,IAAiB,CAAA;AAAA,IACtC,GAAIC,IAAU,EAAE,SAAAA,EAAA,IAAY,CAAA;AAAA,IAC5B,GAAIt4B,IAAS,EAAE,QAAAA,MAAW,CAAA;AAAA,EAAC;AAG7B,SAAOmqC,GAAMC,IAAmB,EAAE,QAAQL,GAAe,OAAAG,GAAO;AAClE;AAMA,SAASG,KAAgB;AACvB,MAAI,OAAO,SAAW,IAAa,QAAO;AAC1C,MAAI;AACF,UAAMh/C,KAAO,OAAO,SAAS,QAAQ,IAAI,QAAQ,MAAM,EAAE;AACzD,QAAI,CAACA,EAAK,QAAO;AACjB,UAAMksB,IAAYlsB,EAAI,QAAQ,GAAG,GAC3Bsc,IAAK4P,MAAc,KAAKlsB,IAAMA,EAAI,UAAU,GAAGksB,CAAS,GACxDE,IAAOF,MAAc,KAAK,KAAKlsB,EAAI,UAAUksB,IAAY,CAAC;AAGhE,WAAK,QAAQ,KAAK5P,CAAE,IACb,EAAE,IAAAA,GAAI,MAAA8P,EAAA,IADiB;AAAA,EAEhC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS6yB,KAAY;AAC1B,MAAI,OAAO,SAAW,IAAa;AAEnC,QAAMC,IAAiB,MAAM;AAC3B,UAAMC,IAAa,SAAS,iBAAiB,6BAA6B,GACpEC,IAAWJ,GAAA;AAEjB,IAAAG,EAAW;AAAA;AAAA,MAC6B,CAAAvD,MAAa;AACjD,YAAIA,EAAU,QAAQ,mBAAoB;AAE1C,cAAM3Y,IACJ2Y,EAAU,QAAQ,WAClBA,EAAU,aAAa,eAAe,KACtC,IACI/O,IACJ+O,EAAU,QAAQ,kBAClBA,EAAU,aAAa,sBAAsB,KAC7C,IACI4C,IACJ5C,EAAU,QAAQ,QAClBA,EAAU,aAAa,WAAW,KAClC,YACIjP,IAAkBiP,EAAU,QAAQ,oBAAoB,SACxDhP,IACJgP,EAAU,QAAQ,sBAAsB,SAGpC/wC,IACJ+wC,EAAU,QAAQ,UAClBA,EAAU,aAAa,aAAa,KACpC,QAEIyD,IAAYzD,EAAU,QAAQ,cAAc,SAC5C3O,IACJ2O,EAAU,QAAQ,WAClBA,EAAU,aAAa,eAAe,KACtC;AAEF,YAAI7O,IAAgB;AACpB,QAAIsS,MACFtS,IAAgB,IAAIoO,GAAkB;AAAA,UACpC,WAAW;AAAA,UACX,eAAervB,GAAA;AAAA,QAAmB,CACnC;AAOH,cAAMwzB,IAAW5B,GAAkB;AAAA,UACjC,QAAQ9B;AAAA,UACR,SAAA3Y;AAAA,UACA,gBAAA4J;AAAA,UACA,MAAA2R;AAAA,UACA,QAAQ,CAAA;AAAA,UACR,iBAAA7R;AAAA,UACA,mBAAAC;AAAA,UACA,eAAAG;AAAA,UACA,SAAAE;AAAA,UACA,GAAIpiC,IAAS,EAAE,QAAAA,MAAW,CAAA;AAAA,QAAC,CAC5B;AAED,QAAIy0C,KAAYF,KACdxD,EAAU;AAAA,UACR,IAAI,YAAY,qBAAqB;AAAA,YACnC,QAAQ,EAAE,SAASwD,EAAS,IAAI,MAAMA,EAAS,KAAA;AAAA,YAC/C,SAAS;AAAA,UAAA,CACV;AAAA,QAAA,GAIDrS,MACkB6O,EAAW,wBAAwB7O,IACrDuS,MAAU1D,EAAU,QAAQ,qBAAqB;AAAA,MACvD;AAAA,IAAA;AAAA,EAEJ;AAEA,EAAI,SAAS,eAAe,YAC1B,SAAS,iBAAiB,oBAAoBsD,CAAc,IAE5DA,EAAA;AAEJ;AA2BO,MAAMK,KAAYjB,GAAM,WAClBkB,KAAWlB,GAAM,UACjBmB,KAAUnB,GAAM,SAChBoB,KAAWpB,GAAM,UACjBqB,KAAmBrB,GAAM,kBACzBsB,KAAetB,GAAM,cACrBuB,KAAavB,GAAM,YACnBwB,KAAiBxB,GAAM;AAOpC,eAAsByB,GAAczkD,IAAU,IAAI;AAChD,QAAM;AAAA,IACJ,QAAAyjB;AAAA,IACA,SAAAujB;AAAA,IACA,UAAA0d,IAAW;AAAA,IACX,MAAA5zB,IAAO;AAAA,IACP,gBAAAygB,IAAiB;AAAA,IACjB,gBAAAoT;AAAA,IACA,kBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,QAAAxrC;AAAA,EAAA,IACErZ,GAEEojD,IAAgBH,GAAex/B,GAAQ,WAAW;AACxD,MAAI,CAAC2/B,EAAe,QAAO;AAC3B,MAAI,CAACpc,KAAW,CAAC0d;AACf,WAAApkD,GAAO,MAAM,4CAA4C,GAClD;AAGT,QAAMwkD,IAAY,MAAM9B,GAAM,UAAA;AAC9B,SAAOQ,GAAMsB,GAAW;AAAA,IACtB,QAAQ1B;AAAA,IACR,OAAO;AAAA,MACL,GAAIsB,IAAW,EAAE,UAAAA,EAAA,IAAa,CAAA;AAAA,MAC9B,SAAA1d;AAAA,MACA,MAAAlW;AAAA,MACA,gBAAAygB;AAAA,MACA,gBAAAoT;AAAA,MACA,kBAAAC;AAAA,MACA,cAAAC;AAAA,MACA,GAAIxrC,IAAS,EAAE,QAAAA,MAAW,CAAA;AAAA,IAAC;AAAA,EAC7B,CACD;AACH;AAKA,eAAsB0rC,GAAiB/kD,IAAU,IAAI;AACnD,QAAM;AAAA,IACJ,QAAAyjB;AAAA,IACA,SAAAujB;AAAA,IACA,MAAAlW,IAAO;AAAA,IACP,SAAA6W,IAAU;AAAA,IACV,gBAAA4J,IAAiB;AAAA,IACjB,kBAAAyT,IAAmB,CAAA;AAAA,IACnB,WAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,QAAA9rC;AAAA,EAAA,IACErZ,GAIEojD,IAAgBH,GAAex/B,GAAQ,UAAU;AACvD,MAAI,CAAC2/B,EAAe,QAAO;AAC3B,MAAI,CAACpc;AACH,WAAA1mC,GAAO,MAAM,gCAAgC,GACtC;AAGT,QAAMwkD,IAAY,MAAM9B,GAAM,SAAA,GACxBoC,IAAY5B,GAAMsB,GAAW;AAAA,IACjC,QAAQ1B;AAAA,IACR,OAAO;AAAA,MACL,MAAM,EAAE,IAAIpc,GAAS,MAAAlW,GAAM,OAAO,KAAA;AAAA,MAClC,kBAAAk0B;AAAA,MACA,SAAArd;AAAA,MACA,gBAAA4J;AAAA,MACA,qBAAA2T;AAAA,MACA,WAAAD;AAAA,MACA,GAAI5rC,IAAS,EAAE,QAAAA,MAAW,CAAA;AAAA,IAAC;AAAA,EAC7B,CACD;AAED,MAAI4rC,KAAa,OAAOA,KAAc,YAAY;AAChD,UAAMI,IAAgB,CAAA3sC,MAAS;AAC7B,MAAIA,KAASA,EAAM,UAAQusC,EAAUvsC,EAAM,MAAM;AAAA,IACnD;AACA,IAAA0qC,EAAc,iBAAiB,WAAWiC,GAAe,EAAI,GAG7DD,EAAU,kBAAkB,MAAM;AAChC,MAAAhC,EAAc,oBAAoB,WAAWiC,GAAe,EAAI;AAAA,IAClE;AAAA,EACF;AAEA,SAAOD;AACT;AAEO,MAAME,KAAeP;AAK5B,eAAsBQ,GAAgBvlD,IAAU,IAAI;AAClD,QAAM;AAAA,IACJ,QAAAyjB;AAAA,IACA,SAAAujB,IAAU;AAAA,IACV,MAAAlW,IAAO;AAAA,IACP,SAAA6W,IAAU;AAAA,IACV,gBAAA4J,IAAiB;AAAA,IACjB,SAAA/C,IAAU;AAAA,IACV,QAAAn1B;AAAA,EAAA,IACErZ,GAEEojD,IAAgBH,GAAex/B,GAAQ,SAAS;AACtD,MAAI,CAAC2/B,EAAe,QAAO;AAE3B,QAAM0B,IAAY,MAAM9B,GAAM,QAAA;AAC9B,SAAOQ,GAAMsB,GAAW;AAAA,IACtB,QAAQ1B;AAAA,IACR,OAAO;AAAA,MACL,MAAM;AAAA,QACJ,IAAIpc;AAAA,QACJ,MAAAlW;AAAA,QACA,OAAO;AAAA,QACP,SAAA0d;AAAA,QACA,SAAA7G;AAAA,QACA,gBAAA4J;AAAA,QACA,SAAS5J;AAAA,QACT,gBAAgB4J;AAAA,MAAA;AAAA,MAElB,GAAIl4B,IAAS,EAAE,QAAAA,MAAW,CAAA;AAAA,IAAC;AAAA,EAC7B,CACD;AACH;AAEO,MAAMmsC,KAAcD;AAK3B,eAAsBE,GAAazlD,IAAU,IAAI;AAC/C,QAAM;AAAA,IACJ,QAAAyjB;AAAA,IACA,SAAAujB;AAAA,IACA,SAAAW,IAAU;AAAA,IACV,gBAAA4J,IAAiB;AAAA,IACjB,gBAAAoT;AAAA,IACA,sBAAAe;AAAA,EAAA,IACE1lD,GAEEojD,IAAgBH,GAAex/B,GAAQ,UAAU;AACvD,MAAI,CAAC2/B,EAAe,QAAO;AAC3B,MAAI,CAACpc;AACH,WAAA1mC,GAAO,MAAM,gCAAgC,GACtC;AAGT,QAAMwkD,IAAY,MAAM9B,GAAM,SAAA;AAC9B,SAAOQ,GAAMsB,GAAW;AAAA,IACtB,QAAQ1B;AAAA,IACR,OAAO;AAAA,MACL,SAAApc;AAAA,MACA,SAAAW;AAAA,MACA,gBAAA4J;AAAA,MACA,gBAAAoT;AAAA,MACA,sBAAAe;AAAA,IAAA;AAAA,EACF,CACD;AACH;AAEO,MAAMC,KAAWF;AAWtB,OAAO,SAAW,OAClB;AAAsB,OAAQ,sCAE9B9B,GAAA;AAIF,MAAAiC,KAAe;AAAA,EACb,mBAAAxD;AAAA,EACA,eAAAqC;AAAA,EACA,kBAAAM;AAAA,EACA,cAAAO;AAAA,EACA,iBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAE;AAAA,EACA,WAAAhC;AAAA,EACA,SAAAtB;AAAA,EACA,eAAeoB;AAAA,EACf,QAAArD;AAAA,EACA,YAAAH;AAAA,EACA,WAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,YAAAE;AAAA,EACA,kBAAAI;AAAA;AAAA,EAEA,WAAWuC,GAAM;AAAA,EACjB,UAAUA,GAAM;AAAA,EAChB,cAAcA,GAAM;AAAA,EACpB,SAASA,GAAM;AAAA;AAAA;AAAA,EAGf,QAAQ,OACN1iD,GAAO;AAAA,IACL;AAAA,EAAA,GAEK0iD,GAAM,QAAA;AAAA,EAEf,UAAUA,GAAM;AAAA,EAChB,kBAAkBA,GAAM;AAAA,EACxB,YAAYA,GAAM;AAAA,EAClB,gBAAgBA,GAAM;AAAA,EACtB,cAAcA,GAAM;AACtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,101,102,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,155]}
|