{"version":3,"file":"modal.cjs","sources":["../../src/components/modal.ts"],"sourcesContent":["/* Native JavaScript for Bootstrap 5 | Modal\n-------------------------------------------- */\nimport {\n addClass,\n ariaHidden,\n ariaModal,\n closest,\n createCustomEvent,\n CSS4Declaration,\n dispatchEvent,\n emulateTransitionEnd,\n focus,\n getDocument,\n getDocumentBody,\n getDocumentElement,\n getElementTransitionDuration,\n getInstance,\n hasClass,\n isRTL,\n KeyboardEvent,\n keydownEvent,\n keyEscape,\n mouseclickEvent,\n MouseEvent,\n querySelector,\n querySelectorAll,\n removeAttribute,\n removeClass,\n setAttribute,\n setElementStyle,\n Timer,\n toggleFocusTrap,\n} from \"@thednp/shorty\";\n\nimport { addListener, removeListener } from \"@thednp/event-listener\";\n\nimport dataBsToggle from \"~/strings/dataBsToggle\";\nimport dataBsDismiss from \"~/strings/dataBsDismiss\";\nimport fadeClass from \"~/strings/fadeClass\";\nimport showClass from \"~/strings/showClass\";\nimport modalString from \"~/strings/modalString\";\nimport modalComponent from \"~/strings/modalComponent\";\nimport offcanvasComponent from \"~/strings/offcanvasComponent\";\nimport getTargetElement from \"~/util/getTargetElement\";\nimport { measureScrollbar, setScrollbar } from \"~/util/scrollbar\";\nimport {\n appendOverlay,\n getCurrentOpen,\n hideOverlay,\n modalActiveSelector,\n overlay,\n removeOverlay,\n showOverlay,\n toggleOverlayType,\n} from \"~/util/backdrop\";\nimport isVisible from \"~/util/isVisible\";\nimport { hasPopup } from \"~/util/popupContainer\";\nimport isDisabled from \"~/util/isDisabled\";\nimport BaseComponent from \"./base-component\";\nimport { ModalEvent, ModalOptions } from \"~/interface/modal\";\n\n// MODAL PRIVATE GC\n// ================\nconst modalSelector = `.${modalString}`;\nconst modalToggleSelector = `[${dataBsToggle}=\"${modalString}\"]`;\nconst modalDismissSelector = `[${dataBsDismiss}=\"${modalString}\"]`;\nconst modalStaticClass = `${modalString}-static`;\n\nconst modalDefaults = {\n backdrop: true,\n keyboard: true,\n};\n\ntype ModalEventProps = {\n relatedTarget: Element & EventTarget | null;\n};\n\n/**\n * Static method which returns an existing `Modal` instance associated\n * to a target `Element`.\n */\nconst getModalInstance = (element: Element) =>\n getInstance(element, modalComponent);\n\n/**\n * A `Modal` initialization callback.\n */\nconst modalInitCallback = (element: Element) => new Modal(element);\n\n// MODAL CUSTOM EVENTS\n// ===================\nconst showModalEvent = createCustomEvent(\n `show.bs.${modalString}`,\n);\nconst shownModalEvent = createCustomEvent(\n `shown.bs.${modalString}`,\n);\nconst hideModalEvent = createCustomEvent(\n `hide.bs.${modalString}`,\n);\nconst hiddenModalEvent = createCustomEvent(\n `hidden.bs.${modalString}`,\n);\n\n// MODAL PRIVATE METHODS\n// =====================\n/**\n * Applies special style for the `` and fixed elements\n * when a modal instance is shown to the user.\n *\n * @param self the `Modal` instance\n */\nconst setModalScrollbar = (self: Modal) => {\n const { element } = self;\n const scrollbarWidth = measureScrollbar(element);\n const { clientHeight, scrollHeight } = getDocumentElement(element);\n const { clientHeight: modalHeight, scrollHeight: modalScrollHeight } =\n element;\n const modalOverflow = modalHeight !== modalScrollHeight;\n\n // istanbul ignore next @preserve: impossible to test?\n if (!modalOverflow && scrollbarWidth) {\n const pad = !isRTL(element)\n ? \"paddingRight\"\n // istanbul ignore next @preserve\n : \"paddingLeft\";\n const padStyle = { [pad]: `${scrollbarWidth}px` } as Partial<\n CSS4Declaration\n >;\n setElementStyle(element, padStyle);\n }\n setScrollbar(element, modalOverflow || clientHeight !== scrollHeight);\n};\n\n/**\n * Toggles on/off the listeners of events that close the modal.\n *\n * @param self the `Modal` instance\n * @param add when `true`, event listeners are added\n */\nconst toggleModalDismiss = (self: Modal, add?: boolean) => {\n const action = add ? addListener : removeListener;\n const { element } = self;\n action(element, mouseclickEvent, modalDismissHandler);\n action(getDocument(element), keydownEvent, modalKeyHandler);\n\n if (add) self._observer.observe(element);\n else self._observer.disconnect();\n};\n\n/**\n * Executes after a modal is hidden to the user.\n *\n * @param self the `Modal` instance\n */\nconst afterModalHide = (self: Modal) => {\n const { triggers, element, relatedTarget } = self;\n removeOverlay(element);\n setElementStyle(element, { paddingRight: \"\", display: \"\" });\n toggleModalDismiss(self);\n\n const focusElement = showModalEvent.relatedTarget || triggers.find(isVisible);\n // istanbul ignore else @preserve\n if (focusElement) focus(focusElement);\n\n hiddenModalEvent.relatedTarget = relatedTarget || undefined;\n dispatchEvent(element, hiddenModalEvent);\n toggleFocusTrap(element);\n};\n\n/**\n * Executes after a modal is shown to the user.\n *\n * @param self the `Modal` instance\n */\nconst afterModalShow = (self: Modal) => {\n const { element, relatedTarget } = self;\n focus(element as HTMLElement);\n toggleModalDismiss(self, true);\n\n shownModalEvent.relatedTarget = relatedTarget || undefined;\n dispatchEvent(element, shownModalEvent);\n toggleFocusTrap(element);\n};\n\n/**\n * Executes before a modal is shown to the user.\n *\n * @param self the `Modal` instance\n */\nconst beforeModalShow = (self: Modal) => {\n const { element, hasFade } = self;\n setElementStyle(element, { display: \"block\" });\n setModalScrollbar(self);\n // istanbul ignore else @preserve\n if (!getCurrentOpen(element)) {\n setElementStyle(getDocumentBody(element), { overflow: \"hidden\" });\n }\n\n addClass(element, showClass);\n removeAttribute(element, ariaHidden);\n setAttribute(element, ariaModal, \"true\");\n\n if (hasFade) emulateTransitionEnd(element, () => afterModalShow(self));\n else afterModalShow(self);\n};\n\n/**\n * Executes before a modal is hidden to the user.\n *\n * @param self the `Modal` instance\n */\nconst beforeModalHide = (self: Modal) => {\n const { element, options, hasFade } = self;\n\n // callback can also be the transitionEvent object, we wanna make sure it's not\n // call is not forced and overlay is visible\n if (\n options.backdrop && hasFade && hasClass(overlay, showClass) &&\n !getCurrentOpen(element)\n ) {\n // AND no modal is visible\n hideOverlay();\n emulateTransitionEnd(overlay, () => afterModalHide(self));\n } else {\n afterModalHide(self);\n }\n};\n\n// MODAL EVENT HANDLERS\n// ====================\n/**\n * Handles the `click` event listener for modal.\n *\n * @param e the `Event` object\n */\nfunction modalClickHandler(this: HTMLElement, e: MouseEvent) {\n const element = getTargetElement(this);\n const self = element && getModalInstance(element);\n\n // istanbul ignore if @preserve\n if (isDisabled(this)) return;\n\n // istanbul ignore if @preserve\n if (!self) return;\n\n // istanbul ignore else @preserve\n if (this.tagName === \"A\") e.preventDefault();\n self.relatedTarget = this;\n self.toggle();\n}\n\n/**\n * Handles the `keydown` event listener for modal\n * to hide the modal when user type the `ESC` key.\n *\n * @param e the `Event` object\n */\nconst modalKeyHandler = ({ code, target }: KeyboardEvent) => {\n const element = querySelector(modalActiveSelector, getDocument(target));\n const self = element && getModalInstance(element);\n\n // istanbul ignore if @preserve\n if (!self) return;\n\n const { options } = self;\n // istanbul ignore else @preserve\n if (\n options.keyboard &&\n code === keyEscape && // the keyboard option is enabled and the key is 27\n hasClass(element, showClass)\n ) {\n // the modal is not visible\n self.relatedTarget = null;\n self.hide();\n }\n};\n\n/**\n * Handles the `click` event listeners that hide the modal.\n *\n * @param e the `Event` object\n */\nconst modalDismissHandler = (e: MouseEvent) => {\n const { currentTarget } = e;\n const self = currentTarget && getModalInstance(currentTarget);\n\n // the timer is needed\n // istanbul ignore if @preserve\n if (!self || !currentTarget || Timer.get(currentTarget)) return;\n\n const { options, isStatic, modalDialog } = self;\n const { backdrop } = options;\n const { target } = e;\n\n const selectedText = getDocument(currentTarget)?.getSelection()?.toString()\n .length;\n const targetInsideDialog = modalDialog.contains(target);\n const dismiss = target && closest(target, modalDismissSelector);\n\n // istanbul ignore else @preserve\n if (isStatic && !targetInsideDialog) {\n Timer.set(\n currentTarget,\n () => {\n addClass(currentTarget, modalStaticClass);\n emulateTransitionEnd(modalDialog, () => staticTransitionEnd(self));\n },\n 17,\n );\n } else if (\n dismiss || (!selectedText && !isStatic && !targetInsideDialog && backdrop)\n ) {\n self.relatedTarget = dismiss || null;\n self.hide();\n e.preventDefault();\n }\n};\n\n/**\n * Handles the `transitionend` event listeners for `Modal`.\n *\n * @param self the `Modal` instance\n */\nconst staticTransitionEnd = (self: Modal) => {\n const { element, modalDialog } = self;\n const duration = (getElementTransitionDuration(modalDialog) || 0) + 17;\n removeClass(element, modalStaticClass);\n // user must wait for zoom out transition\n Timer.set(element, () => Timer.clear(element), duration);\n};\n\n// MODAL DEFINITION\n// ================\n/** Returns a new `Modal` instance. */\nexport default class Modal extends BaseComponent {\n static selector = modalSelector;\n static init = modalInitCallback;\n static getInstance = getModalInstance;\n declare element: HTMLElement;\n declare options: ModalOptions;\n declare modalDialog: HTMLElement;\n declare triggers: HTMLElement[];\n declare isStatic: boolean;\n declare hasFade: boolean;\n declare relatedTarget: EventTarget & HTMLElement | null;\n declare _observer: ResizeObserver;\n\n /**\n * @param target usually the `.modal` element\n * @param config instance options\n */\n constructor(target: Element | string, config?: Partial) {\n super(target, config);\n\n // the modal\n const { element } = this;\n\n // the modal-dialog\n const modalDialog = querySelector(\n `.${modalString}-dialog`,\n element,\n );\n\n // istanbul ignore if @preserve\n if (!modalDialog) return;\n\n this.modalDialog = modalDialog;\n // modal can have multiple triggering elements\n this.triggers = [\n ...querySelectorAll(\n modalToggleSelector,\n getDocument(element),\n ),\n ].filter(\n (btn) => getTargetElement(btn) === element,\n );\n\n // additional internals\n this.isStatic = this.options.backdrop === \"static\";\n this.hasFade = hasClass(element, fadeClass);\n this.relatedTarget = null;\n this._observer = new ResizeObserver(() => this.update());\n\n // attach event listeners\n this._toggleEventListeners(true);\n }\n\n /**\n * Returns component name string.\n */\n get name() {\n return modalComponent;\n }\n /**\n * Returns component default options.\n */\n get defaults() {\n return modalDefaults;\n }\n\n // MODAL PUBLIC METHODS\n // ====================\n /** Toggles the visibility of the modal. */\n toggle() {\n if (hasClass(this.element, showClass)) this.hide();\n else this.show();\n }\n\n /** Shows the modal to the user. */\n show() {\n const { element, options, hasFade, relatedTarget } = this;\n const { backdrop } = options;\n let overlayDelay = 0;\n\n // istanbul ignore if @preserve\n if (hasClass(element, showClass)) return;\n\n showModalEvent.relatedTarget = relatedTarget || undefined;\n dispatchEvent(element, showModalEvent);\n\n // allow the event to be prevented\n // istanbul ignore else @preserve\n if (showModalEvent.defaultPrevented) return;\n\n // we elegantly hide any opened modal/offcanvas\n const currentOpen = getCurrentOpen(element);\n\n // istanbul ignore else @preserve\n if (currentOpen && currentOpen !== element) {\n const that = getModalInstance(currentOpen) ||\n // istanbul ignore next @preserve\n getInstance void }>(\n currentOpen,\n offcanvasComponent,\n );\n // istanbul ignore else @preserve\n if (that) that.hide();\n }\n if (backdrop) {\n if (!hasPopup(overlay)) {\n appendOverlay(element, hasFade, true);\n } else {\n toggleOverlayType(true);\n }\n\n overlayDelay = getElementTransitionDuration(overlay);\n showOverlay();\n\n setTimeout(() => beforeModalShow(this), overlayDelay);\n } else {\n beforeModalShow(this);\n // istanbul ignore else @preserve\n if (currentOpen && hasClass(overlay, showClass)) {\n hideOverlay();\n }\n }\n }\n\n /** Hide the modal from the user. */\n hide() {\n const { element, hasFade, relatedTarget } = this;\n\n // istanbul ignore if @preserve\n if (!hasClass(element, showClass)) return;\n\n hideModalEvent.relatedTarget = relatedTarget || undefined;\n dispatchEvent(element, hideModalEvent);\n\n // istanbul ignore if @preserve\n if (hideModalEvent.defaultPrevented) return;\n\n removeClass(element, showClass);\n setAttribute(element, ariaHidden, \"true\");\n removeAttribute(element, ariaModal);\n\n if (hasFade) emulateTransitionEnd(element, () => beforeModalHide(this));\n else beforeModalHide(this);\n }\n\n /**\n * Updates the modal layout.\n */\n update = () => {\n // istanbul ignore else @preserve\n if (hasClass(this.element, showClass)) setModalScrollbar(this);\n };\n\n /**\n * Toggles on/off the `click` event listener of the `Modal` instance.\n *\n * @param add when `true`, event listener(s) is/are added\n */\n _toggleEventListeners = (add?: boolean) => {\n const action = add ? addListener : removeListener;\n const { triggers } = this;\n\n // istanbul ignore if @preserve\n if (!triggers.length) return;\n\n triggers.forEach((btn) => {\n // istanbul ignore else @preserve\n action(btn, mouseclickEvent, modalClickHandler);\n });\n };\n\n /** Removes the `Modal` component from target element. */\n dispose() {\n const clone = { ...this };\n const { modalDialog, hasFade } = clone;\n const callback = () => setTimeout(() => super.dispose(), 17);\n\n this.hide();\n this._toggleEventListeners();\n\n if (hasFade) {\n // use transitionend callback\n emulateTransitionEnd(modalDialog, callback);\n } else {\n callback();\n }\n }\n}\n"],"names":["modalSelector","modalString","modalToggleSelector","dataBsToggle","modalDismissSelector","dataBsDismiss","modalStaticClass","modalDefaults","getModalInstance","element","getInstance","modalComponent","modalInitCallback","Modal","showModalEvent","createCustomEvent","shownModalEvent","hideModalEvent","hiddenModalEvent","setModalScrollbar","self","scrollbarWidth","measureScrollbar","clientHeight","scrollHeight","getDocumentElement","modalHeight","modalScrollHeight","modalOverflow","padStyle","isRTL","setElementStyle","setScrollbar","toggleModalDismiss","add","action","addListener","removeListener","mouseclickEvent","modalDismissHandler","getDocument","keydownEvent","modalKeyHandler","afterModalHide","triggers","relatedTarget","removeOverlay","focusElement","isVisible","dispatchEvent","toggleFocusTrap","afterModalShow","focus","beforeModalShow","hasFade","getCurrentOpen","getDocumentBody","addClass","showClass","removeAttribute","ariaHidden","setAttribute","ariaModal","emulateTransitionEnd","beforeModalHide","options","hasClass","overlay","hideOverlay","modalClickHandler","e","getTargetElement","isDisabled","code","target","querySelector","modalActiveSelector","keyEscape","currentTarget","Timer","isStatic","modalDialog","backdrop","selectedText","targetInsideDialog","dismiss","closest","staticTransitionEnd","duration","getElementTransitionDuration","removeClass","BaseComponent","config","querySelectorAll","btn","fadeClass","overlayDelay","currentOpen","that","offcanvasComponent","hasPopup","toggleOverlayType","appendOverlay","showOverlay","clone","callback"],"mappings":"yXA8DMA,EAAgB,IAAIC,EAAAA,WAAW,GAC/BC,EAAsB,IAAIC,EAAAA,YAAY,KAAKF,EAAAA,WAAW,KACtDG,EAAuB,IAAIC,EAAAA,aAAa,KAAKJ,EAAAA,WAAW,KACxDK,EAAmB,GAAGL,EAAW,WAAA,UAEjCM,EAAgB,CACpB,SAAU,GACV,SAAU,EACZ,EAOMC,EAAoBC,GACxBC,KAAmBD,EAASE,EAAAA,cAAc,EAGtCC,EAAqBH,GAAqB,IAAII,EAAMJ,CAAO,EAI3DK,EAAiBC,EAAA,GACrB,WAAWd,EAAAA,WAAW,EACxB,EACMe,EAAkBD,EAAA,GACtB,YAAYd,EAAAA,WAAW,EACzB,EACMgB,EAAiBF,EAAA,GACrB,WAAWd,EAAAA,WAAW,EACxB,EACMiB,EAAmBH,EAAA,GACvB,aAAad,EAAAA,WAAW,EAC1B,EAKMkB,EAAqBC,GAAgB,CACnC,KAAA,CAAE,QAAAX,GAAYW,EACdC,EAAiBC,mBAAiBb,CAAO,EACzC,CAAE,aAAAc,EAAc,aAAAC,GAAiBC,EAAAA,EAAmBhB,CAAO,EAC3D,CAAE,aAAciB,EAAa,aAAcC,CAC/C,EAAAlB,EACImB,EAAgBF,IAAgBC,EAGlC,GAAA,CAACC,GAAiBP,EAAgB,CAKpC,MAAMQ,EAAW,CAAE,CAJNC,EAAAA,GAAMrB,CAAO,EAGtB,cAFA,cAGmB,EAAG,GAAGY,CAAc,IAAK,EAGhDU,EAAA,GAAgBtB,EAASoB,CAAQ,CAAA,CAEtBG,EAAAA,aAAAvB,EAASmB,GAAiBL,IAAiBC,CAAY,CACtE,EAGMS,EAAqB,CAACb,EAAac,IAAkB,CACnD,MAAAC,EAASD,EAAME,EAAAA,EAAcC,EAAA,EAC7B,CAAE,QAAA5B,GAAYW,EACbe,EAAA1B,EAAS6B,KAAiBC,CAAmB,EACpDJ,EAAOK,EAAAA,EAAY/B,CAAO,EAAGgC,EAAAA,GAAcC,CAAe,EAEtDR,EAAKd,EAAK,UAAU,QAAQX,CAAO,EAClCW,EAAK,UAAU,WAAW,CACjC,EAGMuB,EAAkBvB,GAAgB,CACtC,KAAM,CAAE,SAAAwB,EAAU,QAAAnC,EAAS,cAAAoC,CAAkB,EAAAzB,EAC7C0B,EAAAA,cAAcrC,CAAO,EACrBsB,EAAA,GAAgBtB,EAAS,CAAE,aAAc,GAAI,QAAS,GAAI,EAC1DwB,EAAmBb,CAAI,EAEvB,MAAM2B,EAAejC,EAAe,eAAiB8B,EAAS,KAAKI,EAAAA,SAAS,EAExED,QAAoBA,CAAY,EAEpC7B,EAAiB,cAAgB2B,GAAiB,OAClDI,EAAA,EAAcxC,EAASS,CAAgB,EACvCgC,EAAAA,GAAgBzC,CAAO,CACzB,EAGM0C,EAAkB/B,GAAgB,CAChC,KAAA,CAAE,QAAAX,EAAS,cAAAoC,CAAA,EAAkBzB,EACnCgC,EAAAA,GAAM3C,CAAsB,EAC5BwB,EAAmBb,EAAM,EAAI,EAE7BJ,EAAgB,cAAgB6B,GAAiB,OACjDI,EAAA,EAAcxC,EAASO,CAAe,EACtCkC,EAAAA,GAAgBzC,CAAO,CACzB,EAGM4C,EAAmBjC,GAAgB,CACjC,KAAA,CAAE,QAAAX,EAAS,QAAA6C,CAAA,EAAYlC,EAC7BW,EAAAA,GAAgBtB,EAAS,CAAE,QAAS,OAAA,CAAS,EAC7CU,EAAkBC,CAAI,EAEjBmC,EAAAA,eAAe9C,CAAO,GACzBsB,EAAA,GAAgByB,KAAgB/C,CAAO,EAAG,CAAE,SAAU,SAAU,EAGlEgD,EAAA,GAAShD,EAASiD,WAAS,EAC3BC,EAAA,GAAgBlD,EAASmD,GAAU,EACtBC,KAAApD,EAASqD,KAAW,MAAM,EAEnCR,EAA8BS,EAAAA,GAAAtD,EAAS,IAAM0C,EAAe/B,CAAI,CAAC,IACjDA,CAAI,CAC1B,EAGM4C,EAAmB5C,GAAgB,CACvC,KAAM,CAAE,QAAAX,EAAS,QAAAwD,EAAS,QAAAX,CAAY,EAAAlC,EAKpC6C,EAAQ,UAAYX,GAAWY,EAAS,GAAAC,UAAST,EAAAA,SAAS,GAC1D,CAACH,iBAAe9C,CAAO,GAGX2D,cAAA,EACZL,EAAAA,GAAqBI,EAAS,QAAA,IAAMxB,EAAevB,CAAI,CAAC,GAExDuB,EAAevB,CAAI,CAEvB,EAKA,SAASiD,EAAqCC,EAA4B,CAClE,MAAA7D,EAAU8D,mBAAiB,IAAI,EAC/BnD,EAAOX,GAAWD,EAAiBC,CAAO,EAG5C+D,EAAAA,WAAW,IAAI,GAGdpD,IAGD,KAAK,UAAY,KAAKkD,EAAE,eAAe,EAC3ClD,EAAK,cAAgB,KACrBA,EAAK,OAAO,EACd,CAGA,MAAMsB,EAAkB,CAAC,CAAE,KAAA+B,EAAM,OAAAC,KAAqC,CACpE,MAAMjE,EAAUkE,EAAA,GAAcC,EAAqB,oBAAApC,EAAA,EAAYkC,CAAM,CAAC,EAChEtD,EAAOX,GAAWD,EAAiBC,CAAO,EAGhD,GAAI,CAACW,EAAM,OAEL,KAAA,CAAE,QAAA6C,GAAY7C,EAGlB6C,EAAQ,UACRQ,IAASI,MACTX,KAASzD,EAASiD,EAAAA,SAAS,IAG3BtC,EAAK,cAAgB,KACrBA,EAAK,KAAK,EAEd,EAGMmB,EAAuB+B,GAA+B,CACpD,KAAA,CAAE,cAAAQ,GAAkBR,EACpBlD,EAAO0D,GAAiBtE,EAAiBsE,CAAa,EAI5D,GAAI,CAAC1D,GAAQ,CAAC0D,GAAiBC,EAAAA,GAAM,IAAID,CAAa,EAAG,OAEzD,KAAM,CAAE,QAAAb,EAAS,SAAAe,EAAU,YAAAC,CAAgB,EAAA7D,EACrC,CAAE,SAAA8D,GAAajB,EACf,CAAE,OAAAS,GAAWJ,EAEba,EAAe3C,EAAAA,EAAYsC,CAAa,GAAG,aAAa,GAAG,WAC9D,OACGM,EAAqBH,EAAY,SAASP,CAAM,EAChDW,EAAUX,GAAUY,KAAQZ,EAAQtE,CAAoB,EAG1D4E,GAAY,CAACI,EACTL,EAAAA,GAAA,IACJD,EACA,IAAM,CACJrB,EAAA,GAASqB,EAAexE,CAAgB,EACxCyD,EAAAA,GAAqBkB,EAAa,IAAMM,EAAoBnE,CAAI,CAAC,CACnE,EACA,EACF,GAEAiE,GAAY,CAACF,GAAgB,CAACH,GAAY,CAACI,GAAsBF,KAEjE9D,EAAK,cAAgBiE,GAAW,KAChCjE,EAAK,KAAK,EACVkD,EAAE,eAAe,EAErB,EAGMiB,EAAuBnE,GAAgB,CACrC,KAAA,CAAE,QAAAX,EAAS,YAAAwE,CAAA,EAAgB7D,EAC3BoE,GAAYC,EAAAA,GAA6BR,CAAW,GAAK,GAAK,GACpES,EAAA,GAAYjF,EAASH,CAAgB,EAErCyE,EAAA,GAAM,IAAItE,EAAS,IAAMsE,KAAM,MAAMtE,CAAO,EAAG+E,CAAQ,CACzD,EAKA,MAAqB3E,UAAc8E,EAAAA,aAAc,CAC/C,OAAO,SAAW3F,EAClB,OAAO,KAAOY,EACd,OAAO,YAAcJ,EAWrB,YAAYkE,EAA0BkB,EAAgC,CACpE,MAAMlB,EAAQkB,CAAM,EAGd,KAAA,CAAE,QAAAnF,GAAY,KAGdwE,EAAcN,EAAA,GAClB,IAAI1E,EAAW,WAAA,UACfQ,CACF,EAGKwE,IAEL,KAAK,YAAcA,EAEnB,KAAK,SAAW,CACd,GAAGY,EAAA,GACD3F,EACAsC,EAAAA,EAAY/B,CAAO,CAAA,CACrB,EACA,OACCqF,GAAQvB,mBAAiBuB,CAAG,IAAMrF,CACrC,EAGK,KAAA,SAAW,KAAK,QAAQ,WAAa,SACrC,KAAA,QAAUyD,KAASzD,EAASsF,EAAAA,SAAS,EAC1C,KAAK,cAAgB,KACrB,KAAK,UAAY,IAAI,eAAe,IAAM,KAAK,QAAQ,EAGvD,KAAK,sBAAsB,EAAI,EAAA,CAIjC,IAAI,MAAO,CACF,OAAApF,EAAA,cAAA,CAGT,IAAI,UAAW,CACN,OAAAJ,CAAA,CAMT,QAAS,CACH2D,EAAAA,GAAS,KAAK,QAASR,EAAAA,SAAS,OAAQ,KAAK,OACvC,KAAK,CAAA,CAIjB,MAAO,CACL,KAAM,CAAE,QAAAjD,EAAS,QAAAwD,EAAS,QAAAX,EAAS,cAAAT,CAAkB,EAAA,KAC/C,CAAE,SAAAqC,GAAajB,EACrB,IAAI+B,EAAe,EAUnB,GAPI9B,EAAA,GAASzD,EAASiD,EAAAA,SAAS,IAE/B5C,EAAe,cAAgB+B,GAAiB,OAChDI,EAAA,EAAcxC,EAASK,CAAc,EAIjCA,EAAe,kBAAkB,OAG/B,MAAAmF,EAAc1C,iBAAe9C,CAAO,EAGtC,GAAAwF,GAAeA,IAAgBxF,EAAS,CACpC,MAAAyF,EAAO1F,EAAiByF,CAAW,GAEvCvF,EAAA,GACEuF,EACAE,EAAAA,kBACF,EAEED,KAAW,KAAK,CAAA,CAElBhB,GACGkB,EAAAA,SAASjC,EAAAA,OAAO,EAGnBkC,EAAAA,kBAAkB,EAAI,EAFRC,gBAAA7F,EAAS6C,EAAS,EAAI,EAKtC0C,EAAeP,KAA6BtB,SAAO,EACvCoC,cAAA,EAEZ,WAAW,IAAMlD,EAAgB,IAAI,EAAG2C,CAAY,IAEpD3C,EAAgB,IAAI,EAEhB4C,GAAe/B,EAAAA,GAASC,EAAS,QAAAT,EAAS,SAAA,GAChCU,cAAA,EAEhB,CAIF,MAAO,CACL,KAAM,CAAE,QAAA3D,EAAS,QAAA6C,EAAS,cAAAT,CAAkB,EAAA,KAGvCqB,EAAA,GAASzD,EAASiD,EAAAA,SAAS,IAEhCzC,EAAe,cAAgB4B,GAAiB,OAChDI,EAAA,EAAcxC,EAASQ,CAAc,EAGjC,CAAAA,EAAe,mBAEnByE,EAAA,GAAYjF,EAASiD,WAAS,EACjBG,KAAApD,EAASmD,IAAY,MAAM,EACxCD,EAAA,GAAgBlD,EAASqD,IAAS,EAE9BR,EAA8BS,EAAAA,GAAAtD,EAAS,IAAMuD,EAAgB,IAAI,CAAC,IACjD,IAAI,GAAA,CAI3B,OAAS,IAAM,CAETE,EAAAA,GAAS,KAAK,QAASR,EAAAA,SAAS,KAAqB,IAAI,CAC/D,EAGA,sBAAyBxB,GAAkB,CACnC,MAAAC,EAASD,EAAME,EAAAA,EAAcC,EAAA,EAC7B,CAAE,SAAAO,GAAa,KAGhBA,EAAS,QAELA,EAAA,QAASkD,GAAQ,CAEjB3D,EAAA2D,EAAKxD,KAAiB+B,CAAiB,CAAA,CAC/C,CACH,EAGA,SAAU,CACF,MAAAmC,EAAQ,CAAE,GAAG,IAAK,EAClB,CAAE,YAAAvB,EAAa,QAAA3B,CAAA,EAAYkD,EAC3BC,EAAW,IAAM,WAAW,IAAM,MAAM,UAAW,EAAE,EAE3D,KAAK,KAAK,EACV,KAAK,sBAAsB,EAEvBnD,EAEFS,EAAA,GAAqBkB,EAAawB,CAAQ,EAEjCA,EAAA,CACX,CAEJ"}