UNPKG

lisn.js

Version:

Simply handle user gestures and actions. Includes widgets.

1 lines 31.3 kB
{"version":3,"file":"smooth-scroll.cjs","names":["MC","_interopRequireWildcard","require","MH","_animations","_browser","_cssAlter","_domAlter","_domOptimize","_log","_misc","_scroll","_text","_validation","_scrollWatcher","_sizeWatcher","_widget","_debug","_interopRequireDefault","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","SmoothScroll","Widget","scrollable","mainWidget","getDocElement","getBody","instance","DUMMY_ID","isInstanceOf","enableMain","config","ScrollWatcher","fetchMainScrollableElement","widget","onDestroy","register","registerWidget","WIDGET_NAME","element","isHTMLElement","logError","usageError","configValidator","constructor","_SmoothScroll$get","destroyPromise","destroy","id","promiseResolve","then","isDestroyed","init","exports","PREFIXED_NAME","prefixName","PREFIX_ROOT","PREFIX_DUMMY","PREFIX_OUTER_WRAPPER","PREFIX_INNER_WRAPPER","PREFIX_HAS_H_SCROLL","PREFIX_HAS_V_SCROLL","PREFIX_USES_STICKY","validateString","className","validateStrList","lag","validateNumber","createWrappers","classNamesEntries","wrapContentNow","classNames","tryWrapContentNow","_classNames","_required","_requiredBy","lastWrapper","result","createdByUs","unwrapFn","wrapper","unwrapContentNow","key","allClassNames","PREFIX_WRAPPER","getContentWrapper","push","wrappers","docEl","body","defaultScrollable","getDefaultScrollingElement","needsSticky","root","logger","debug","Logger","name","formatAsString","logAtCreation","supportsSticky","scrollWatcher","reuse","S_DEBOUNCE_WINDOW","sizeWatcher","SizeWatcher","waitForMeasureTime","initialContentWidth","S_SCROLL_WIDTH","initialContentHeight","S_SCROLL_HEIGHT","debug5","clientWidth","clientHeight","scrollWidth","scrollHeight","hasHScroll","isScrollable","axis","hasVScroll","setSizeVars","width","height","now","setNumericStyleJsVarsNow","setNumericStyleJsVars","_units","_numDecimal","updatePropsOnScroll","target","scrollData","updateTargetPosition","innerWrapper","S_CLIENT_WIDTH","NaN","S_CLIENT_HEIGHT","updatePropsOnResize","sizeData","dummy","border","S_WIDTH","S_HEIGHT","currentPositions","x","y","targetPositions","copyObject","d","current","newTarget","S_SCROLL_LEFT","S_SCROLL_TOP","isOngoing","animateTransforms","_config$lag","debug10","iterator","newCriticallyDampedAnimationIterator","l","lTarget","next","value","_prefix","console","log","JSON","stringify","addWatchers","trackScroll","threshold","onResize","removeWatchers","noTrackScroll","offResize","waitForMutateTime","addClassesNow","outerWrapper","setBooleanDataNow","toArrayIfSingle","createElement","moveElementNow","to","ignoreMove","onDisable","onEnable","removeClassesNow","delDataNow"],"sources":["../../../src/ts/widgets/smooth-scroll.ts"],"sourcesContent":["/**\n * @module Widgets\n */\n\nimport * as MC from \"@lisn/globals/minification-constants\";\nimport * as MH from \"@lisn/globals/minification-helpers\";\n\nimport { newCriticallyDampedAnimationIterator } from \"@lisn/utils/animations\";\nimport { supportsSticky } from \"@lisn/utils/browser\";\nimport {\n addClassesNow,\n removeClassesNow,\n setBooleanDataNow,\n delDataNow,\n setNumericStyleJsVars,\n setNumericStyleJsVarsNow,\n} from \"@lisn/utils/css-alter\";\nimport {\n moveElementNow,\n getContentWrapper,\n tryWrapContentNow,\n unwrapContentNow,\n} from \"@lisn/utils/dom-alter\";\nimport {\n waitForMeasureTime,\n waitForMutateTime,\n} from \"@lisn/utils/dom-optimize\";\nimport { logError } from \"@lisn/utils/log\";\nimport { toArrayIfSingle } from \"@lisn/utils/misc\";\nimport { isScrollable, getDefaultScrollingElement } from \"@lisn/utils/scroll\";\nimport { formatAsString } from \"@lisn/utils/text\";\nimport {\n validateStrList,\n validateNumber,\n validateString,\n} from \"@lisn/utils/validation\";\n\nimport { ScrollWatcher, ScrollData } from \"@lisn/watchers/scroll-watcher\";\nimport { SizeWatcher, SizeData } from \"@lisn/watchers/size-watcher\";\n\nimport {\n Widget,\n WidgetConfigValidatorObject,\n registerWidget,\n} from \"@lisn/widgets/widget\";\n\nimport debug from \"@lisn/debug/debug\";\n\n/**\n * Configures the given element as a {@link SmoothScroll} widget.\n *\n * The SmoothScroll widget creates a configurable smooth scrolling\n * experience, including support for lag and parallax depth, and using a custom\n * element that only takes up part of the page, all while preserving native\n * scrolling behaviour (i.e. it does not disable native scroll and does not use\n * fake scrollbars).\n *\n * **IMPORTANT:** The scrollable element you pass must have its children\n * wrapped. This will be done automatically unless you create these wrappers\n * yourself by ensuring your structure is as follows:\n *\n * ```html\n * <!-- If using the document as the scrollable -->\n * <body><!-- Element you instantiate as SmoothScroll, or you can pass documentElement -->\n * <div class=\"lisn-smooth-scroll__content\"><!-- Required wrapper; will be created if missing -->\n * <div class=\"lisn-smooth-scroll__inner\"><!-- Required inner wrapper; will be created if missing -->\n * <!-- YOUR CONTENT -->\n * </div>\n * </div>\n * </body>\n * ```\n *\n * ```html\n * <!-- If using a custom scrollable -->\n * <div class=\"scrollable\"><!-- Element you instantiate as SmoothScroll -->\n * <div class=\"lisn-smooth-scroll__content\"><!-- Required outer wrapper; will be created if missing -->\n * <div class=\"lisn-smooth-scroll__inner\"><!-- Required inner wrapper; will be created if missing -->\n * <!-- YOUR CONTENT -->\n * </div>\n * </div>\n * </div>\n * ```\n *\n * **IMPORTANT:** If the scrollable element you pass is other than\n * `document.documentElement` or `document.body`, SmoothScroll will then rely on\n * position: sticky. XXX TODO\n *\n * **IMPORTANT:** You should not instantiate more than one\n * {@link SmoothScroll} widget on a given element. Use\n * {@link SmoothScroll.get} to get an existing instance if any. If there is\n * already a widget instance, it will be destroyed!\n *\n * -----\n *\n * To use with auto-widgets (HTML API) (see\n * {@link Settings.settings.autoWidgets | settings.autoWidgets}), the following\n * CSS classes or data attributes are recognized:\n * - `lisn-smooth-scroll` class or `data-lisn-smooth-scroll` attribute set\n * on the container element that constitutes the scrollable container\n *\n * See below examples for what values you can use set for the data attribute\n * in order to modify the configuration of the automatically created widget.\n *\n * @example\n * This will create a smooth scroller for\n * {@link settings.mainScrollableElementSelector | the main scrolling element}.\n *\n * This will work even if {@link settings.autoWidgets}) is false\n *\n * ```html\n * <!-- LISN should be loaded beforehand -->\n * <script>\n * // You can also just customise global default settings:\n * // LISN.settings.smoothScroll = \"TODO\";\n *\n * LISN.widgets.SmoothScroll.enableMain({\n * XXX: \"TODO\",\n * });\n * </script>\n * ```\n *\n * @example\n * This will create a smooth scroller for a custom scrolling element (i.e. one\n * with overflow \"auto\" or \"scroll\").\n *\n * ```html\n * <div class=\"scrolling lisn-smooth-scroll\">\n * <!-- content here... -->\n * </div>\n * ```\n *\n * @example\n * As above but with custom settings.\n *\n * ```html\n * <div\n * class=\"scrolling\"\n * data-lisn-smooth-scroll=\"XXX=TODO\n * | XXX=TODO\n * \">\n * <!-- content here... -->\n * </div>\n * ```\n */\nexport class SmoothScroll extends Widget {\n // XXX TODO getScrollable ?\n\n /**\n * If element is omitted, returns the instance created by {@link enableMain}\n * if any.\n */\n static get(scrollable?: Element): SmoothScroll | null {\n if (!scrollable) {\n return mainWidget;\n }\n\n if (scrollable === MH.getDocElement()) {\n scrollable = MH.getBody();\n }\n\n const instance = super.get(scrollable, DUMMY_ID);\n if (MH.isInstanceOf(instance, SmoothScroll)) {\n return instance;\n }\n return null;\n }\n\n /**\n * Creates a smooth scroller for the\n * {@link settings.mainScrollableElementSelector | the main scrolling element}.\n *\n * **NOTE:** It returns a Promise to a widget because it will wait for the\n * main scrollable element to be present in the DOM if not already.\n */\n static async enableMain(config?: SmoothScrollConfig) {\n const scrollable = await ScrollWatcher.fetchMainScrollableElement();\n const widget = new SmoothScroll(scrollable, config);\n widget.onDestroy(() => {\n if (mainWidget === widget) {\n mainWidget = null;\n }\n });\n\n mainWidget = widget;\n return widget;\n }\n\n static register() {\n registerWidget(\n WIDGET_NAME,\n (element, config) => {\n if (MH.isHTMLElement(element)) {\n if (!SmoothScroll.get(element)) {\n return new SmoothScroll(element, config);\n }\n } else {\n logError(\n MH.usageError(\n \"Only HTMLElement is supported for SmoothScroll widget\",\n ),\n );\n }\n return null;\n },\n configValidator,\n );\n }\n\n /**\n * Note that passing `document.body` is considered equivalent to\n * `document.documentElement`.\n */\n constructor(scrollable: HTMLElement, config?: SmoothScrollConfig) {\n if (scrollable === MH.getDocElement()) {\n scrollable = MH.getBody();\n }\n\n const destroyPromise = SmoothScroll.get(scrollable)?.destroy();\n super(scrollable, { id: DUMMY_ID });\n\n // const props = getScrollableProps(scrollable); // XXX\n // const ourScrollable = props.scrollable; // XXX\n\n (destroyPromise || MH.promiseResolve()).then(async () => {\n if (this.isDestroyed()) {\n return;\n }\n\n init(this, scrollable, config);\n // XXX init(this, scrollable, props, config);\n });\n }\n}\n\n/**\n * @interface\n */\nexport type SmoothScrollConfig = {\n /**\n * The DOM ID to set on the outer content wrapper. Will result in the content\n * wrapper element that's created by us getting this ID.\n *\n * @defaultValue undefined\n */\n id?: string;\n\n /**\n * A class name or a list of class names to set on the outer content wrapper.\n * Will result in the content wrapper element that's created by us getting\n * these classes.\n *\n * @defaultValue undefined\n */\n className?: string[] | string;\n\n /**\n * XXX TODO\n *\n * @defaultValue {@link settings.smoothScrollLag}\n */\n lag?: number;\n\n /**\n * XXX TODO\n *\n * @defaultValue {@link settings.smoothScrollDepth}\n */\n depth?: number;\n};\n\n// --------------------\n\nconst WIDGET_NAME = \"smooth-scroll\";\nconst PREFIXED_NAME = MH.prefixName(WIDGET_NAME);\n// Only one SmoothScroll widget per element is allowed, but Widget requires a\n// non-blank ID.\nconst DUMMY_ID = PREFIXED_NAME;\nconst PREFIX_ROOT = `${PREFIXED_NAME}__root`;\nconst PREFIX_DUMMY = `${PREFIXED_NAME}__dummy`;\nconst PREFIX_OUTER_WRAPPER = `${PREFIXED_NAME}__content`;\nconst PREFIX_INNER_WRAPPER = `${PREFIXED_NAME}__inner`;\nconst PREFIX_HAS_H_SCROLL = MH.prefixName(\"has-h-scroll\");\nconst PREFIX_HAS_V_SCROLL = MH.prefixName(\"has-v-scroll\");\nconst PREFIX_USES_STICKY = MH.prefixName(\"uses-sticky\");\n\nlet mainWidget: SmoothScroll | null = null;\n\nconst configValidator: WidgetConfigValidatorObject<SmoothScrollConfig> = {\n id: validateString,\n className: validateStrList,\n lag: validateNumber,\n};\n\ntype WrappersFor<K extends string> = {\n [key in K]: HTMLElement;\n};\n\nconst createWrappers = <K extends string>(\n element: HTMLElement,\n // from outer-most to inner-most:\n // [\n // key to use in the returned object,\n // classNames to add,\n // ]\n classNamesEntries: readonly [K, string[]][],\n): { wrappers: WrappersFor<K>; unwrapFn: () => void } => {\n const wrapContentNow = (element: HTMLElement, classNames: string[]) =>\n tryWrapContentNow(element, {\n _classNames: classNames,\n _required: true,\n _requiredBy: \"SmoothScroll\",\n });\n\n let lastWrapper = element;\n const result = {} as WrappersFor<K>;\n let createdByUs: [HTMLElement, string[]][] = [];\n\n const unwrapFn = () => {\n for (const [wrapper, classNames] of createdByUs) {\n unwrapContentNow(wrapper, classNames);\n }\n createdByUs = [];\n };\n\n for (const [key, classNames] of classNamesEntries) {\n // Add generic lisn-wrapper class to allow ScrollWatcher to reuse it\n const allClassNames = [...classNames, MC.PREFIX_WRAPPER];\n let wrapper = getContentWrapper(lastWrapper, {\n _classNames: allClassNames,\n });\n\n if (!wrapper) {\n wrapper = wrapContentNow(lastWrapper, allClassNames);\n createdByUs.push([wrapper, classNames]); // only remove the specific classes\n }\n\n lastWrapper = wrapper;\n result[key] = wrapper;\n }\n\n return { wrappers: result, unwrapFn };\n};\n\n// XXX TODO children can use unique lag factor\nconst init = async (\n widget: SmoothScroll,\n scrollable: HTMLElement,\n // props: ReturnType<typeof getScrollableProps>, XXX\n config: SmoothScrollConfig | undefined,\n) => {\n const docEl = MH.getDocElement();\n const body = MH.getBody();\n const defaultScrollable = getDefaultScrollingElement();\n let needsSticky = true;\n let root = scrollable;\n\n if (scrollable === docEl || scrollable === body) {\n scrollable = defaultScrollable;\n root = body;\n needsSticky = false;\n }\n\n const logger = debug\n ? new debug.Logger({\n name: `SmoothScroll-${formatAsString(scrollable)}`,\n logAtCreation: { config, needsSticky },\n })\n : null;\n\n if (needsSticky && !supportsSticky()) {\n logError(\n \"SmoothScroll on elements other than the document relies on \" +\n \"position: sticky, but this browser does not support sticky.\",\n );\n return;\n }\n\n const scrollWatcher = ScrollWatcher.reuse({ [MC.S_DEBOUNCE_WINDOW]: 0 });\n const sizeWatcher = SizeWatcher.reuse({ [MC.S_DEBOUNCE_WINDOW]: 0 });\n\n await waitForMeasureTime();\n const initialContentWidth = scrollable[MC.S_SCROLL_WIDTH];\n const initialContentHeight = scrollable[MC.S_SCROLL_HEIGHT];\n debug: logger?.debug5({\n clientWidth: scrollable.clientWidth,\n clientHeight: scrollable.clientHeight,\n scrollWidth: initialContentWidth,\n scrollHeight: initialContentHeight,\n });\n\n // We only care if it has horizontal/vertical scroll if we're using a custom\n // scrollable, so no need to check otherwise.\n const hasHScroll = needsSticky\n ? isScrollable(scrollable, { axis: \"x\" })\n : false;\n const hasVScroll = needsSticky\n ? isScrollable(scrollable, { axis: \"y\" })\n : false;\n\n // ----------\n\n const setSizeVars = (\n element: Element,\n width: number,\n height: number,\n now = false,\n ) => {\n (now ? setNumericStyleJsVarsNow : setNumericStyleJsVars)(\n element,\n { width, height },\n { _units: \"px\", _numDecimal: 2 },\n );\n };\n\n // If there's a scroll or size change for the scrollable container, update the\n // transforms and possibly the width/height of the content (if it uses sticky)\n // .\n const updatePropsOnScroll = (target: Element, scrollData: ScrollData) => {\n updateTargetPosition(scrollData);\n\n // If the scrollable scrolls horizontally we need to set a fixed width on\n // the inner wrapper, and if it scrolls vertically we need to set a fixed\n // height.\n if (needsSticky) {\n setSizeVars(\n innerWrapper,\n hasHScroll ? scrollData[MC.S_CLIENT_WIDTH] : NaN,\n hasVScroll ? scrollData[MC.S_CLIENT_HEIGHT] : NaN,\n );\n }\n };\n\n // If content is resized, update the dummy overflow to match its size\n const updatePropsOnResize = (target: Element, sizeData: SizeData) => {\n setSizeVars(\n dummy,\n sizeData.border[MC.S_WIDTH],\n sizeData.border[MC.S_HEIGHT],\n );\n };\n\n // ----------\n\n const currentPositions = { x: 0, y: 0 };\n const targetPositions = MH.copyObject(currentPositions);\n\n const updateTargetPosition = (scrollData: ScrollData) => {\n for (const d of [\"x\", \"y\"] as const) {\n const current = currentPositions[d];\n const target = targetPositions[d];\n const newTarget =\n scrollData[d === \"x\" ? MC.S_SCROLL_LEFT : MC.S_SCROLL_TOP];\n\n const isOngoing = current !== target;\n targetPositions[d] = newTarget;\n\n if (!isOngoing) {\n animateTransforms(d);\n }\n }\n };\n\n const animateTransforms = async (d: \"x\" | \"y\"): Promise<void> => {\n const lag = config?.lag ?? 1000; // XXX\n debug: logger?.debug10(\n `Starting animating ${d} transforms with lag ${lag}`,\n );\n\n let target = targetPositions[d];\n let current = currentPositions[d];\n const iterator = newCriticallyDampedAnimationIterator({\n l: current,\n lTarget: target,\n lag,\n });\n\n while (({ l: current } = (await iterator.next(target)).value)) {\n currentPositions[d] = current;\n target = targetPositions[d];\n\n setNumericStyleJsVars(\n innerWrapper,\n { [d]: -current },\n { _prefix: \"offset-\", _units: \"px\", _numDecimal: 2 },\n );\n\n console.log(\n \"XXX\",\n JSON.stringify({\n d,\n current,\n target,\n }),\n );\n\n if (current === target) {\n debug: logger?.debug10(`Done animating ${d} transforms`, target);\n return;\n }\n }\n };\n\n // ----------\n\n const addWatchers = () => {\n // Track scroll in any direction as well as changes in border or content size\n // of the element and its contents.\n scrollWatcher.trackScroll(updatePropsOnScroll, {\n threshold: 0,\n scrollable,\n });\n\n // Track changes in content or border size of the inner content wrapper.\n sizeWatcher.onResize(updatePropsOnResize, {\n target: innerWrapper,\n threshold: 0,\n });\n };\n\n const removeWatchers = () => {\n scrollWatcher.noTrackScroll(updatePropsOnScroll, scrollable);\n sizeWatcher.offResize(updatePropsOnResize, innerWrapper);\n };\n\n // SETUP ------------------------------\n\n await waitForMutateTime();\n addClassesNow(root, PREFIX_ROOT);\n\n // Wrap the contents in a fixed/sticky positioned wrapper and insert a dummy\n // overflow element of the same size.\n // [TODO v2]: Better way to centrally manage wrapping and wrapping of elements\n const { wrappers, unwrapFn } = createWrappers(root, [\n [\"o\", [PREFIX_OUTER_WRAPPER]],\n [\"i\", [PREFIX_INNER_WRAPPER]],\n ]);\n\n const outerWrapper = wrappers.o;\n const innerWrapper = wrappers.i;\n\n if (needsSticky) {\n setBooleanDataNow(root, PREFIX_HAS_H_SCROLL, hasHScroll);\n setBooleanDataNow(root, PREFIX_HAS_V_SCROLL, hasVScroll);\n setBooleanDataNow(root, PREFIX_USES_STICKY);\n }\n\n if (config?.id) {\n outerWrapper.id = config.id;\n }\n\n if (config?.className) {\n addClassesNow(outerWrapper, ...toArrayIfSingle(config.className));\n }\n\n const dummy = MH.createElement(\"div\");\n addClassesNow(dummy, PREFIX_DUMMY);\n // set its size now to prevent initial layout shifts\n setSizeVars(dummy, initialContentWidth, initialContentHeight, true);\n moveElementNow(dummy, { to: root, ignoreMove: true });\n\n addWatchers();\n\n widget.onDisable(() => {\n removeWatchers();\n // XXX TODO re-enable regular scrolling\n });\n\n widget.onEnable(() => {\n addWatchers();\n // XXX TODO re-enable smooth scrolling\n });\n\n widget.onDestroy(async () => {\n await waitForMutateTime();\n\n unwrapFn();\n moveElementNow(dummy); // remove\n\n removeClassesNow(root, PREFIX_ROOT);\n delDataNow(root, PREFIX_HAS_H_SCROLL);\n delDataNow(root, PREFIX_HAS_V_SCROLL);\n delDataNow(root, PREFIX_USES_STICKY);\n });\n};\n"],"mappings":";;;;;;AAIA,IAAAA,EAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,EAAA,GAAAF,uBAAA,CAAAC,OAAA;AAEA,IAAAE,WAAA,GAAAF,OAAA;AACA,IAAAG,QAAA,GAAAH,OAAA;AACA,IAAAI,SAAA,GAAAJ,OAAA;AAQA,IAAAK,SAAA,GAAAL,OAAA;AAMA,IAAAM,YAAA,GAAAN,OAAA;AAIA,IAAAO,IAAA,GAAAP,OAAA;AACA,IAAAQ,KAAA,GAAAR,OAAA;AACA,IAAAS,OAAA,GAAAT,OAAA;AACA,IAAAU,KAAA,GAAAV,OAAA;AACA,IAAAW,WAAA,GAAAX,OAAA;AAMA,IAAAY,cAAA,GAAAZ,OAAA;AACA,IAAAa,YAAA,GAAAb,OAAA;AAEA,IAAAc,OAAA,GAAAd,OAAA;AAMA,IAAAe,MAAA,GAAAC,sBAAA,CAAAhB,OAAA;AAAsC,SAAAgB,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAlB,wBAAAkB,CAAA,EAAAG,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAtB,uBAAA,YAAAA,CAAAkB,CAAA,EAAAG,CAAA,SAAAA,CAAA,IAAAH,CAAA,IAAAA,CAAA,CAAAC,UAAA,SAAAD,CAAA,MAAAO,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAR,OAAA,EAAAF,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAS,CAAA,MAAAF,CAAA,GAAAJ,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAE,CAAA,CAAAI,GAAA,CAAAX,CAAA,UAAAO,CAAA,CAAAK,GAAA,CAAAZ,CAAA,GAAAO,CAAA,CAAAM,GAAA,CAAAb,CAAA,EAAAS,CAAA,gBAAAN,CAAA,IAAAH,CAAA,gBAAAG,CAAA,OAAAW,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAG,CAAA,OAAAK,CAAA,IAAAD,CAAA,GAAAS,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAG,CAAA,OAAAK,CAAA,CAAAI,GAAA,IAAAJ,CAAA,CAAAK,GAAA,IAAAN,CAAA,CAAAE,CAAA,EAAAN,CAAA,EAAAK,CAAA,IAAAC,CAAA,CAAAN,CAAA,IAAAH,CAAA,CAAAG,CAAA,WAAAM,CAAA,KAAAT,CAAA,EAAAG,CAAA;AA9CtC;AACA;AACA;;AA8CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMgB,YAAY,SAASC,cAAM,CAAC;EACvC;;EAEA;AACF;AACA;AACA;EACE,OAAOR,GAAGA,CAACS,UAAoB,EAAuB;IACpD,IAAI,CAACA,UAAU,EAAE;MACf,OAAOC,UAAU;IACnB;IAEA,IAAID,UAAU,KAAKrC,EAAE,CAACuC,aAAa,CAAC,CAAC,EAAE;MACrCF,UAAU,GAAGrC,EAAE,CAACwC,OAAO,CAAC,CAAC;IAC3B;IAEA,MAAMC,QAAQ,GAAG,KAAK,CAACb,GAAG,CAACS,UAAU,EAAEK,QAAQ,CAAC;IAChD,IAAI1C,EAAE,CAAC2C,YAAY,CAACF,QAAQ,EAAEN,YAAY,CAAC,EAAE;MAC3C,OAAOM,QAAQ;IACjB;IACA,OAAO,IAAI;EACb;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACE,aAAaG,UAAUA,CAACC,MAA2B,EAAE;IACnD,MAAMR,UAAU,GAAG,MAAMS,4BAAa,CAACC,0BAA0B,CAAC,CAA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","ignoreList":[]}