{"version":3,"file":"wheel-gestures.esm.js","sources":["../src/utils/projection.ts","../src/utils/index.ts","../src/events/EventBus.ts","../src/events/WheelTargetObserver.ts","../src/wheel-normalizer/wheel-normalizer.ts","../src/wheel-gestures/constants.ts","../src/wheel-gestures/options.ts","../src/wheel-gestures/state.ts","../src/wheel-gestures/wheel-gestures.ts"],"sourcesContent":["const DECAY = 0.996\n\n/**\n * movement projection based on velocity\n * @param velocityPxMs\n * @param decay\n */\nexport const projection = (velocityPxMs: number, decay = DECAY) => (velocityPxMs * decay) / (1 - decay)\n","export * from './projection'\n\nexport function lastOf(array: T[]) {\n return array[array.length - 1]\n}\n\nexport function average(numbers: number[]) {\n return numbers.reduce((a, b) => a + b) / numbers.length\n}\n\nexport const clamp = (value: number, min: number, max: number) => Math.min(Math.max(min, value), max)\n\nexport function addVectors(v1: T, v2: T): T {\n if (v1.length !== v2.length) {\n throw new Error('vectors must be same length')\n }\n return v1.map((val, i) => val + v2[i]) as T\n}\n\nexport function absMax(numbers: number[]) {\n return Math.max(...numbers.map(Math.abs))\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function deepFreeze(o: T): Readonly {\n Object.freeze(o)\n Object.values(o).forEach((value) => {\n if (value !== null && typeof value === 'object' && !Object.isFrozen(value)) {\n deepFreeze(value)\n }\n })\n return o\n}\n","import { deepFreeze } from '../utils'\n\nexport type EventMapEmpty = Record\nexport type EventListener = (data: D) => void\nexport type Off = () => void\n\nexport default function EventBus() {\n const listeners = {} as Record[]>\n\n function on(type: EK, listener: EventListener): Off {\n listeners[type] = (listeners[type] || []).concat(listener)\n return () => off(type, listener)\n }\n\n function off(type: EK, listener: EventListener) {\n listeners[type] = (listeners[type] || []).filter((l) => l !== listener)\n }\n\n function dispatch(type: EK, data: EventMap[EK]) {\n if (!(type in listeners)) return\n ;(listeners[type] as EventListener[]).forEach((l) => l(data))\n }\n\n return deepFreeze({\n on,\n off,\n dispatch,\n })\n}\n","import { WheelEventData } from '../types'\nimport { deepFreeze } from '../utils'\n\ntype UnobserveTarget = () => void\n\nexport function WheelTargetObserver(eventListener: (wheelEvent: WheelEventData) => void) {\n let targets: EventTarget[] = []\n\n // add event listener to target element\n const observe = (target: EventTarget): UnobserveTarget => {\n target.addEventListener('wheel', eventListener as EventListener, { passive: false })\n targets.push(target)\n\n return () => unobserve(target)\n }\n\n /// remove event listener from target element\n const unobserve = (target: EventTarget) => {\n target.removeEventListener('wheel', eventListener as EventListener)\n targets = targets.filter((t) => t !== target)\n }\n\n // stops watching all of its target elements for visibility changes.\n const disconnect = () => {\n targets.forEach(unobserve)\n }\n\n return deepFreeze({\n observe,\n unobserve,\n disconnect,\n })\n}\n","import { ReverseSign, VectorXYZ, WheelEventData } from '../types'\nimport { clamp } from '../utils'\n\nexport interface NormalizedWheel {\n axisDelta: VectorXYZ\n timeStamp: number\n}\n\nconst LINE_HEIGHT = 16 * 1.125\nconst PAGE_HEIGHT = (typeof window !== 'undefined' && window.innerHeight) || 800\nconst DELTA_MODE_UNIT = [1, LINE_HEIGHT, PAGE_HEIGHT]\n\nexport function normalizeWheel(e: WheelEventData): NormalizedWheel {\n const deltaX = e.deltaX * DELTA_MODE_UNIT[e.deltaMode]\n const deltaY = e.deltaY * DELTA_MODE_UNIT[e.deltaMode]\n const deltaZ = (e.deltaZ || 0) * DELTA_MODE_UNIT[e.deltaMode]\n\n return {\n timeStamp: e.timeStamp,\n axisDelta: [deltaX, deltaY, deltaZ],\n }\n}\n\nconst reverseAll = [-1, -1, -1]\n\nexport function reverseAxisDeltaSign>(\n wheel: T,\n reverseSign: ReverseSign\n): T {\n if (!reverseSign) {\n return wheel\n }\n\n const multipliers = reverseSign === true ? reverseAll : reverseSign.map((shouldReverse) => (shouldReverse ? -1 : 1))\n\n return {\n ...wheel,\n axisDelta: wheel.axisDelta.map((delta, i) => delta * multipliers[i]),\n }\n}\n\nconst DELTA_MAX_ABS = 700\n\nexport const clampAxisDelta = >(wheel: T) => {\n return {\n ...wheel,\n axisDelta: wheel.axisDelta.map((delta) => clamp(delta, -DELTA_MAX_ABS, DELTA_MAX_ABS)),\n }\n}\n","export const __DEV__ = process.env.NODE_ENV !== 'production'\nexport const ACC_FACTOR_MIN = 0.6\nexport const ACC_FACTOR_MAX = 0.96\nexport const WHEELEVENTS_TO_MERGE = 2\nexport const WHEELEVENTS_TO_ANALAZE = 5\n","import { WheelGesturesConfig } from '../types'\nimport { deepFreeze } from '../utils'\n\nexport const configDefaults: WheelGesturesConfig = deepFreeze({\n preventWheelAction: true,\n reverseSign: [true, true, false],\n})\n","/**\n * the timeout is automatically adjusted during a gesture\n * the initial timeout period is pretty long, so even old mouses, which emit wheel events less often, can produce a continuous gesture\n */\nimport { WheelGesturesInternalState } from './internal-types'\n\nconst WILL_END_TIMEOUT_DEFAULT = 400\n\nexport function createWheelGesturesState(): WheelGesturesInternalState {\n return {\n isStarted: false,\n isStartPublished: false,\n isMomentum: false,\n startTime: 0,\n lastAbsDelta: Infinity,\n axisMovement: [0, 0, 0],\n axisVelocity: [0, 0, 0],\n accelerationFactors: [],\n scrollPoints: [],\n scrollPointsToMerge: [],\n willEndTimeout: WILL_END_TIMEOUT_DEFAULT,\n }\n}\n","import EventBus from '../events/EventBus'\nimport { WheelTargetObserver } from '../events/WheelTargetObserver'\nimport {\n VectorXYZ,\n WheelEventData,\n WheelEventState,\n WheelGesturesConfig,\n WheelGesturesEventMap,\n WheelGesturesOptions,\n} from '../types'\nimport { absMax, addVectors, average, deepFreeze, lastOf, projection } from '../utils'\nimport { clampAxisDelta, normalizeWheel, reverseAxisDeltaSign } from '../wheel-normalizer/wheel-normalizer'\nimport { __DEV__, ACC_FACTOR_MAX, ACC_FACTOR_MIN, WHEELEVENTS_TO_ANALAZE, WHEELEVENTS_TO_MERGE } from './constants'\nimport { configDefaults } from './options'\nimport { createWheelGesturesState } from './state'\n\nexport function WheelGestures(optionsParam: WheelGesturesOptions = {}) {\n const { on, off, dispatch } = EventBus()\n let config = configDefaults\n let state = createWheelGesturesState()\n let currentEvent: WheelEventData\n let negativeZeroFingerUpSpecialEvent = false\n let prevWheelEventState: WheelEventState | undefined\n\n const feedWheel = (wheelEvents: WheelEventData | WheelEventData[]) => {\n if (Array.isArray(wheelEvents)) {\n wheelEvents.forEach((wheelEvent) => processWheelEventData(wheelEvent))\n } else {\n processWheelEventData(wheelEvents)\n }\n }\n\n const updateOptions = (newOptions: WheelGesturesOptions = {}): WheelGesturesConfig => {\n if (Object.values(newOptions).some((option) => option === undefined || option === null)) {\n __DEV__ && console.error('updateOptions ignored! undefined & null options not allowed')\n return config\n }\n return (config = deepFreeze({ ...configDefaults, ...config, ...newOptions }))\n }\n\n const publishWheel = (additionalData?: Partial) => {\n const wheelEventState: WheelEventState = {\n event: currentEvent,\n isStart: false,\n isEnding: false,\n isMomentumCancel: false,\n isMomentum: state.isMomentum,\n axisDelta: [0, 0, 0],\n axisVelocity: state.axisVelocity,\n axisMovement: state.axisMovement,\n get axisMovementProjection() {\n return addVectors(\n wheelEventState.axisMovement,\n wheelEventState.axisVelocity.map((velocity) => projection(velocity)) as VectorXYZ\n )\n },\n ...additionalData,\n }\n\n dispatch('wheel', {\n ...wheelEventState,\n previous: prevWheelEventState,\n })\n\n // keep reference without previous, otherwise we would create a long chain\n prevWheelEventState = wheelEventState\n }\n\n // should prevent when there is mainly movement on the desired axis\n const shouldPreventDefault = (deltaMaxAbs: number, axisDelta: VectorXYZ): boolean => {\n const { preventWheelAction } = config\n const [deltaX, deltaY, deltaZ] = axisDelta\n\n if (typeof preventWheelAction === 'boolean') return preventWheelAction\n\n switch (preventWheelAction) {\n case 'x':\n return Math.abs(deltaX) >= deltaMaxAbs\n case 'y':\n return Math.abs(deltaY) >= deltaMaxAbs\n case 'z':\n return Math.abs(deltaZ) >= deltaMaxAbs\n default:\n __DEV__ && console.warn('unsupported preventWheelAction value: ' + preventWheelAction, 'warn')\n return false\n }\n }\n\n const processWheelEventData = (wheelEvent: WheelEventData) => {\n const { axisDelta, timeStamp } = clampAxisDelta(\n reverseAxisDeltaSign(normalizeWheel(wheelEvent), config.reverseSign)\n )\n const deltaMaxAbs = absMax(axisDelta)\n\n if (wheelEvent.preventDefault && shouldPreventDefault(deltaMaxAbs, axisDelta)) {\n wheelEvent.preventDefault()\n }\n\n if (!state.isStarted) {\n start()\n }\n // check if user started scrolling again -> cancel\n else if (state.isMomentum && deltaMaxAbs > Math.max(2, state.lastAbsDelta * 2)) {\n end(true)\n start()\n }\n\n // special finger up event on windows + blink\n if (deltaMaxAbs === 0 && Object.is && Object.is(wheelEvent.deltaX, -0)) {\n negativeZeroFingerUpSpecialEvent = true\n // return -> zero delta event should not influence velocity\n return\n }\n\n currentEvent = wheelEvent\n state.axisMovement = addVectors(state.axisMovement, axisDelta)\n state.lastAbsDelta = deltaMaxAbs\n state.scrollPointsToMerge.push({\n axisDelta,\n timeStamp,\n })\n\n mergeScrollPointsCalcVelocity()\n\n // only wheel event (move) and not start/end get the delta values\n publishWheel({ axisDelta, isStart: !state.isStartPublished }) // state.isMomentum ? MOMENTUM_WHEEL : WHEEL, { axisDelta })\n\n // publish start after velocity etc. have been updated\n state.isStartPublished = true\n\n // calc debounced end function, to recognize end of wheel event stream\n willEnd()\n }\n\n const mergeScrollPointsCalcVelocity = () => {\n if (state.scrollPointsToMerge.length === WHEELEVENTS_TO_MERGE) {\n state.scrollPoints.unshift({\n axisDeltaSum: state.scrollPointsToMerge.map((b) => b.axisDelta).reduce(addVectors),\n timeStamp: average(state.scrollPointsToMerge.map((b) => b.timeStamp)),\n })\n\n // only update velocity after a merged scrollpoint was generated\n updateVelocity()\n\n // reset toMerge array\n state.scrollPointsToMerge.length = 0\n\n // after calculation of velocity only keep the most recent merged scrollPoint\n state.scrollPoints.length = 1\n\n if (!state.isMomentum) {\n detectMomentum()\n }\n } else if (!state.isStartPublished) {\n updateStartVelocity()\n }\n }\n\n const updateStartVelocity = () => {\n state.axisVelocity = lastOf(state.scrollPointsToMerge).axisDelta.map((d) => d / state.willEndTimeout) as VectorXYZ\n }\n\n const updateVelocity = () => {\n // need to have two recent points to calc velocity\n const [latestScrollPoint, prevScrollPoint] = state.scrollPoints\n\n if (!prevScrollPoint || !latestScrollPoint) {\n return\n }\n\n // time delta\n const deltaTime = latestScrollPoint.timeStamp - prevScrollPoint.timeStamp\n\n if (deltaTime <= 0) {\n __DEV__ && console.warn('invalid deltaTime')\n return\n }\n\n // calc the velocity per axes\n const velocity = latestScrollPoint.axisDeltaSum.map((d) => d / deltaTime) as VectorXYZ\n\n // calc the acceleration factor per axis\n const accelerationFactor = velocity.map((v, i) => v / (state.axisVelocity[i] || 1))\n\n state.axisVelocity = velocity\n state.accelerationFactors.push(accelerationFactor)\n\n updateWillEndTimeout(deltaTime)\n }\n\n const updateWillEndTimeout = (deltaTime: number) => {\n // use current time between events rounded up and increased by a bit as timeout\n let newTimeout = Math.ceil(deltaTime / 10) * 10 * 1.2\n\n // double the timeout, when momentum was not detected yet\n if (!state.isMomentum) {\n newTimeout = Math.max(100, newTimeout * 2)\n }\n\n state.willEndTimeout = Math.min(1000, Math.round(newTimeout))\n }\n\n const accelerationFactorInMomentumRange = (accFactor: number) => {\n // when main axis is the the other one and there is no movement/change on the current one\n if (accFactor === 0) return true\n return accFactor <= ACC_FACTOR_MAX && accFactor >= ACC_FACTOR_MIN\n }\n\n const detectMomentum = () => {\n if (state.accelerationFactors.length >= WHEELEVENTS_TO_ANALAZE) {\n if (negativeZeroFingerUpSpecialEvent) {\n negativeZeroFingerUpSpecialEvent = false\n\n if (absMax(state.axisVelocity) >= 0.2) {\n recognizedMomentum()\n return\n }\n }\n\n const recentAccelerationFactors = state.accelerationFactors.slice(WHEELEVENTS_TO_ANALAZE * -1)\n\n // check recent acceleration / deceleration factors\n // all recent need to match, if any did not match\n const detectedMomentum = recentAccelerationFactors.every((accFac) => {\n // when both axis decelerate exactly in the same rate it is very likely caused by momentum\n const sameAccFac = !!accFac.reduce((f1, f2) => (f1 && f1 < 1 && f1 === f2 ? 1 : 0))\n\n // check if acceleration factor is within momentum range\n const bothAreInRangeOrZero = accFac.filter(accelerationFactorInMomentumRange).length === accFac.length\n\n // one the requirements must be fulfilled\n return sameAccFac || bothAreInRangeOrZero\n })\n\n if (detectedMomentum) {\n recognizedMomentum()\n }\n\n // only keep the most recent events\n state.accelerationFactors = recentAccelerationFactors\n }\n }\n\n const recognizedMomentum = () => {\n state.isMomentum = true\n }\n\n const start = () => {\n state = createWheelGesturesState()\n state.isStarted = true\n state.startTime = Date.now()\n prevWheelEventState = undefined\n negativeZeroFingerUpSpecialEvent = false\n }\n\n const willEnd = (() => {\n let willEndId: number\n return () => {\n clearTimeout(willEndId)\n willEndId = setTimeout(end, state.willEndTimeout)\n }\n })()\n\n const end = (isMomentumCancel = false) => {\n if (!state.isStarted) return\n\n if (state.isMomentum && isMomentumCancel) {\n publishWheel({ isEnding: true, isMomentumCancel: true })\n } else {\n publishWheel({ isEnding: true })\n }\n\n state.isMomentum = false\n state.isStarted = false\n }\n\n const { observe, unobserve, disconnect } = WheelTargetObserver(feedWheel)\n\n updateOptions(optionsParam)\n\n return deepFreeze({\n on,\n off,\n observe,\n unobserve,\n disconnect,\n feedWheel,\n updateOptions,\n })\n}\n"],"names":["DECAY","projection","velocityPxMs","decay","lastOf","array","length","average","numbers","reduce","a","b","clamp","value","min","max","Math","addVectors","v1","v2","Error","map","val","i","absMax","abs","deepFreeze","o","Object","freeze","values","forEach","isFrozen","EventBus","listeners","on","type","listener","concat","off","filter","l","dispatch","data","WheelTargetObserver","eventListener","targets","observe","target","addEventListener","passive","push","unobserve","removeEventListener","t","disconnect","LINE_HEIGHT","PAGE_HEIGHT","window","innerHeight","DELTA_MODE_UNIT","normalizeWheel","e","deltaX","deltaMode","deltaY","deltaZ","timeStamp","axisDelta","reverseAll","reverseAxisDeltaSign","wheel","reverseSign","multipliers","shouldReverse","delta","DELTA_MAX_ABS","clampAxisDelta","__DEV__","process","env","NODE_ENV","ACC_FACTOR_MIN","ACC_FACTOR_MAX","WHEELEVENTS_TO_MERGE","WHEELEVENTS_TO_ANALAZE","configDefaults","preventWheelAction","WILL_END_TIMEOUT_DEFAULT","createWheelGesturesState","isStarted","isStartPublished","isMomentum","startTime","lastAbsDelta","Infinity","axisMovement","axisVelocity","accelerationFactors","scrollPoints","scrollPointsToMerge","willEndTimeout","WheelGestures","optionsParam","config","state","currentEvent","negativeZeroFingerUpSpecialEvent","prevWheelEventState","feedWheel","wheelEvents","Array","isArray","wheelEvent","processWheelEventData","updateOptions","newOptions","some","option","undefined","console","error","publishWheel","additionalData","wheelEventState","event","isStart","isEnding","isMomentumCancel","axisMovementProjection","velocity","previous","shouldPreventDefault","deltaMaxAbs","warn","preventDefault","start","end","is","mergeScrollPointsCalcVelocity","willEnd","unshift","axisDeltaSum","updateVelocity","detectMomentum","updateStartVelocity","d","latestScrollPoint","prevScrollPoint","deltaTime","accelerationFactor","v","updateWillEndTimeout","newTimeout","ceil","round","accelerationFactorInMomentumRange","accFactor","recognizedMomentum","recentAccelerationFactors","slice","detectedMomentum","every","accFac","sameAccFac","f1","f2","bothAreInRangeOrZero","Date","now","willEndId","clearTimeout","setTimeout"],"mappings":";;;;;;;;;;;;;;;;;;AAAA,IAAMA,KAAK,GAAG,KAAd;AAEA;;;;;;IAKaC,UAAU,GAAG,SAAbA,UAAa,CAACC,YAAD,EAAuBC,KAAvB;AAAA,MAAuBA,KAAvB;AAAuBA,IAAAA,KAAvB,GAA+BH,KAA/B;AAAA;;AAAA,SAA0CE,YAAY,GAAGC,KAAhB,IAA0B,IAAIA,KAA9B,CAAzC;AAAA;;SCLVC,OAAUC;AACxB,SAAOA,KAAK,CAACA,KAAK,CAACC,MAAN,GAAe,CAAhB,CAAZ;AACD;AAED,SAAgBC,QAAQC;AACtB,SAAOA,OAAO,CAACC,MAAR,CAAe,UAACC,CAAD,EAAIC,CAAJ;AAAA,WAAUD,CAAC,GAAGC,CAAd;AAAA,GAAf,IAAkCH,OAAO,CAACF,MAAjD;AACD;AAED,IAAaM,KAAK,GAAG,SAARA,KAAQ,CAACC,KAAD,EAAgBC,GAAhB,EAA6BC,GAA7B;AAAA,SAA6CC,IAAI,CAACF,GAAL,CAASE,IAAI,CAACD,GAAL,CAASD,GAAT,EAAcD,KAAd,CAAT,EAA+BE,GAA/B,CAA7C;AAAA,CAAd;AAEP,SAAgBE,WAA+BC,IAAOC;AACpD,MAAID,EAAE,CAACZ,MAAH,KAAca,EAAE,CAACb,MAArB,EAA6B;AAC3B,UAAM,IAAIc,KAAJ,CAAU,6BAAV,CAAN;AACD;;AACD,SAAOF,EAAE,CAACG,GAAH,CAAO,UAACC,GAAD,EAAMC,CAAN;AAAA,WAAYD,GAAG,GAAGH,EAAE,CAACI,CAAD,CAApB;AAAA,GAAP,CAAP;AACD;AAED,SAAgBC,OAAOhB;AACrB,SAAOQ,IAAI,CAACD,GAAL,OAAAC,IAAI,EAAQR,OAAO,CAACa,GAAR,CAAYL,IAAI,CAACS,GAAjB,CAAR,CAAX;AACD;;AAGD,SAAgBC,WAA6BC;AAC3CC,EAAAA,MAAM,CAACC,MAAP,CAAcF,CAAd;AACAC,EAAAA,MAAM,CAACE,MAAP,CAAcH,CAAd,EAAiBI,OAAjB,CAAyB,UAAClB,KAAD;AACvB,QAAIA,KAAK,KAAK,IAAV,IAAkB,OAAOA,KAAP,KAAiB,QAAnC,IAA+C,CAACe,MAAM,CAACI,QAAP,CAAgBnB,KAAhB,CAApD,EAA4E;AAC1Ea,MAAAA,UAAU,CAACb,KAAD,CAAV;AACD;AACF,GAJD;AAKA,SAAOc,CAAP;AACD;;SC1BuBM;AACtB,MAAMC,SAAS,GAAG,EAAlB;;AAEA,WAASC,EAAT,CAAuCC,IAAvC,EAAiDC,QAAjD;AACEH,IAAAA,SAAS,CAACE,IAAD,CAAT,GAAkB,CAACF,SAAS,CAACE,IAAD,CAAT,IAAmB,EAApB,EAAwBE,MAAxB,CAA+BD,QAA/B,CAAlB;AACA,WAAO;AAAA,aAAME,GAAG,CAACH,IAAD,EAAOC,QAAP,CAAT;AAAA,KAAP;AACD;;AAED,WAASE,GAAT,CAAwCH,IAAxC,EAAkDC,QAAlD;AACEH,IAAAA,SAAS,CAACE,IAAD,CAAT,GAAkB,CAACF,SAAS,CAACE,IAAD,CAAT,IAAmB,EAApB,EAAwBI,MAAxB,CAA+B,UAACC,CAAD;AAAA,aAAOA,CAAC,KAAKJ,QAAb;AAAA,KAA/B,CAAlB;AACD;;AAED,WAASK,QAAT,CAA6CN,IAA7C,EAAuDO,IAAvD;AACE,QAAI,EAAEP,IAAI,IAAIF,SAAV,CAAJ,EAA0B;AACxBA,IAAAA,SAAS,CAACE,IAAD,CAAT,CAAkDL,OAAlD,CAA0D,UAACU,CAAD;AAAA,aAAOA,CAAC,CAACE,IAAD,CAAR;AAAA,KAA1D;AACH;;AAED,SAAOjB,UAAU,CAAC;AAChBS,IAAAA,EAAE,EAAFA,EADgB;AAEhBI,IAAAA,GAAG,EAAHA,GAFgB;AAGhBG,IAAAA,QAAQ,EAARA;AAHgB,GAAD,CAAjB;AAKD;;SCvBeE,oBAAoBC;AAClC,MAAIC,OAAO,GAAkB,EAA7B;;AAGA,MAAMC,OAAO,GAAG,SAAVA,OAAU,CAACC,MAAD;AACdA,IAAAA,MAAM,CAACC,gBAAP,CAAwB,OAAxB,EAAiCJ,aAAjC,EAAiE;AAAEK,MAAAA,OAAO,EAAE;AAAX,KAAjE;AACAJ,IAAAA,OAAO,CAACK,IAAR,CAAaH,MAAb;AAEA,WAAO;AAAA,aAAMI,SAAS,CAACJ,MAAD,CAAf;AAAA,KAAP;AACD,GALD;;;AAQA,MAAMI,SAAS,GAAG,SAAZA,SAAY,CAACJ,MAAD;AAChBA,IAAAA,MAAM,CAACK,mBAAP,CAA2B,OAA3B,EAAoCR,aAApC;AACAC,IAAAA,OAAO,GAAGA,OAAO,CAACN,MAAR,CAAe,UAACc,CAAD;AAAA,aAAOA,CAAC,KAAKN,MAAb;AAAA,KAAf,CAAV;AACD,GAHD;;;AAMA,MAAMO,UAAU,GAAG,SAAbA,UAAa;AACjBT,IAAAA,OAAO,CAACf,OAAR,CAAgBqB,SAAhB;AACD,GAFD;;AAIA,SAAO1B,UAAU,CAAC;AAChBqB,IAAAA,OAAO,EAAPA,OADgB;AAEhBK,IAAAA,SAAS,EAATA,SAFgB;AAGhBG,IAAAA,UAAU,EAAVA;AAHgB,GAAD,CAAjB;AAKD;;ACxBD,IAAMC,WAAW,GAAG,KAAK,KAAzB;AACA,IAAMC,WAAW,GAAI,OAAOC,MAAP,KAAkB,WAAlB,IAAiCA,MAAM,CAACC,WAAzC,IAAyD,GAA7E;AACA,IAAMC,eAAe,GAAG,CAAC,CAAD,EAAIJ,WAAJ,EAAiBC,WAAjB,CAAxB;AAEA,SAAgBI,eAAeC;AAC7B,MAAMC,MAAM,GAAGD,CAAC,CAACC,MAAF,GAAWH,eAAe,CAACE,CAAC,CAACE,SAAH,CAAzC;AACA,MAAMC,MAAM,GAAGH,CAAC,CAACG,MAAF,GAAWL,eAAe,CAACE,CAAC,CAACE,SAAH,CAAzC;AACA,MAAME,MAAM,GAAG,CAACJ,CAAC,CAACI,MAAF,IAAY,CAAb,IAAkBN,eAAe,CAACE,CAAC,CAACE,SAAH,CAAhD;AAEA,SAAO;AACLG,IAAAA,SAAS,EAAEL,CAAC,CAACK,SADR;AAELC,IAAAA,SAAS,EAAE,CAACL,MAAD,EAASE,MAAT,EAAiBC,MAAjB;AAFN,GAAP;AAID;AAED,IAAMG,UAAU,GAAG,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,CAAnB;AAEA,SAAgBC,qBACdC,OACAC;AAEA,MAAI,CAACA,WAAL,EAAkB;AAChB,WAAOD,KAAP;AACD;;AAED,MAAME,WAAW,GAAGD,WAAW,KAAK,IAAhB,GAAuBH,UAAvB,GAAoCG,WAAW,CAACnD,GAAZ,CAAgB,UAACqD,aAAD;AAAA,WAAoBA,aAAa,GAAG,CAAC,CAAJ,GAAQ,CAAzC;AAAA,GAAhB,CAAxD;AAEA,sBACKH,KADL;AAEEH,IAAAA,SAAS,EAAEG,KAAK,CAACH,SAAN,CAAgB/C,GAAhB,CAAoB,UAACsD,KAAD,EAAQpD,CAAR;AAAA,aAAcoD,KAAK,GAAGF,WAAW,CAAClD,CAAD,CAAjC;AAAA,KAApB;AAFb;AAID;AAED,IAAMqD,aAAa,GAAG,GAAtB;AAEA,AAAO,IAAMC,cAAc,GAAG,SAAjBA,cAAiB,CAA+CN,KAA/C;AAC5B,sBACKA,KADL;AAEEH,IAAAA,SAAS,EAAEG,KAAK,CAACH,SAAN,CAAgB/C,GAAhB,CAAoB,UAACsD,KAAD;AAAA,aAAW/D,KAAK,CAAC+D,KAAD,EAAQ,CAACC,aAAT,EAAwBA,aAAxB,CAAhB;AAAA,KAApB;AAFb;AAID,CALM;;AC3CA,IAAME,OAAO,GAAGC,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,YAAzC;AACP,AAAO,IAAMC,cAAc,GAAG,GAAvB;AACP,AAAO,IAAMC,cAAc,GAAG,IAAvB;AACP,AAAO,IAAMC,oBAAoB,GAAG,CAA7B;AACP,AAAO,IAAMC,sBAAsB,GAAG,CAA/B;;ICDMC,cAAc,gBAAwB5D,UAAU,CAAC;AAC5D6D,EAAAA,kBAAkB,EAAE,IADwC;AAE5Df,EAAAA,WAAW,EAAE,CAAC,IAAD,EAAO,IAAP,EAAa,KAAb;AAF+C,CAAD,CAAtD;;ACGP,IAAMgB,wBAAwB,GAAG,GAAjC;AAEA,SAAgBC;AACd,SAAO;AACLC,IAAAA,SAAS,EAAE,KADN;AAELC,IAAAA,gBAAgB,EAAE,KAFb;AAGLC,IAAAA,UAAU,EAAE,KAHP;AAILC,IAAAA,SAAS,EAAE,CAJN;AAKLC,IAAAA,YAAY,EAAEC,QALT;AAMLC,IAAAA,YAAY,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CANT;AAOLC,IAAAA,YAAY,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAPT;AAQLC,IAAAA,mBAAmB,EAAE,EARhB;AASLC,IAAAA,YAAY,EAAE,EATT;AAULC,IAAAA,mBAAmB,EAAE,EAVhB;AAWLC,IAAAA,cAAc,EAAEb;AAXX,GAAP;AAaD;;SCNec,cAAcC;MAAAA;AAAAA,IAAAA,eAAqC;;;kBACnCtE,QAAQ;MAA9BE,eAAAA;MAAII,gBAAAA;MAAKG,qBAAAA;;AACjB,MAAI8D,MAAM,GAAGlB,cAAb;AACA,MAAImB,KAAK,GAAGhB,wBAAwB,EAApC;AACA,MAAIiB,YAAJ;AACA,MAAIC,gCAAgC,GAAG,KAAvC;AACA,MAAIC,mBAAJ;;AAEA,MAAMC,SAAS,GAAG,SAAZA,SAAY,CAACC,WAAD;AAChB,QAAIC,KAAK,CAACC,OAAN,CAAcF,WAAd,CAAJ,EAAgC;AAC9BA,MAAAA,WAAW,CAAC/E,OAAZ,CAAoB,UAACkF,UAAD;AAAA,eAAgBC,qBAAqB,CAACD,UAAD,CAArC;AAAA,OAApB;AACD,KAFD,MAEO;AACLC,MAAAA,qBAAqB,CAACJ,WAAD,CAArB;AACD;AACF,GAND;;AAQA,MAAMK,aAAa,GAAG,SAAhBA,aAAgB,CAACC,UAAD;QAACA;AAAAA,MAAAA,aAAmC;;;AACxD,QAAIxF,MAAM,CAACE,MAAP,CAAcsF,UAAd,EAA0BC,IAA1B,CAA+B,UAACC,MAAD;AAAA,aAAYA,MAAM,KAAKC,SAAX,IAAwBD,MAAM,KAAK,IAA/C;AAAA,KAA/B,CAAJ,EAAyF;AACvFxC,MAAAA,OAAO,IAAI0C,OAAO,CAACC,KAAR,CAAc,6DAAd,CAAX;AACA,aAAOjB,MAAP;AACD;;AACD,WAAQA,MAAM,GAAG9E,UAAU,cAAM4D,cAAN,EAAyBkB,MAAzB,EAAoCY,UAApC,EAA3B;AACD,GAND;;AAQA,MAAMM,YAAY,GAAG,SAAfA,YAAe,CAACC,cAAD;AACnB,QAAMC,eAAe;AACnBC,MAAAA,KAAK,EAAEnB,YADY;AAEnBoB,MAAAA,OAAO,EAAE,KAFU;AAGnBC,MAAAA,QAAQ,EAAE,KAHS;AAInBC,MAAAA,gBAAgB,EAAE,KAJC;AAKnBpC,MAAAA,UAAU,EAAEa,KAAK,CAACb,UALC;AAMnBxB,MAAAA,SAAS,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CANQ;AAOnB6B,MAAAA,YAAY,EAAEQ,KAAK,CAACR,YAPD;AAQnBD,MAAAA,YAAY,EAAES,KAAK,CAACT,YARD;;AASnB,UAAIiC,sBAAJ;AACE,eAAOhH,UAAU,CACf2G,eAAe,CAAC5B,YADD,EAEf4B,eAAe,CAAC3B,YAAhB,CAA6B5E,GAA7B,CAAiC,UAAC6G,QAAD;AAAA,iBAAcjI,UAAU,CAACiI,QAAD,CAAxB;AAAA,SAAjC,CAFe,CAAjB;AAID;;AAdkB,OAehBP,cAfgB,CAArB;;AAkBAjF,IAAAA,QAAQ,CAAC,OAAD,eACHkF,eADG;AAENO,MAAAA,QAAQ,EAAEvB;AAFJ,OAAR;;AAMAA,IAAAA,mBAAmB,GAAGgB,eAAtB;AACD,GA1BD;;;AA6BA,MAAMQ,oBAAoB,GAAG,SAAvBA,oBAAuB,CAACC,WAAD,EAAsBjE,SAAtB;kBACIoC;QAAvBjB,6BAAAA;QACDxB,SAA0BK;QAAlBH,SAAkBG;QAAVF,SAAUE;AAEjC,QAAI,OAAOmB,kBAAP,KAA8B,SAAlC,EAA6C,OAAOA,kBAAP;;AAE7C,YAAQA,kBAAR;AACE,WAAK,GAAL;AACE,eAAOvE,IAAI,CAACS,GAAL,CAASsC,MAAT,KAAoBsE,WAA3B;;AACF,WAAK,GAAL;AACE,eAAOrH,IAAI,CAACS,GAAL,CAASwC,MAAT,KAAoBoE,WAA3B;;AACF,WAAK,GAAL;AACE,eAAOrH,IAAI,CAACS,GAAL,CAASyC,MAAT,KAAoBmE,WAA3B;;AACF;AACEvD,QAAAA,OAAO,IAAI0C,OAAO,CAACc,IAAR,CAAa,2CAA2C/C,kBAAxD,EAA4E,MAA5E,CAAX;AACA,eAAO,KAAP;AATJ;AAWD,GAjBD;;AAmBA,MAAM2B,qBAAqB,GAAG,SAAxBA,qBAAwB,CAACD,UAAD;0BACKpC,cAAc,CAC7CP,oBAAoB,CAACT,cAAc,CAACoD,UAAD,CAAf,EAA6BT,MAAM,CAAChC,WAApC,CADyB;QAAvCJ,4BAAAA;QAAWD,4BAAAA;;AAGnB,QAAMkE,WAAW,GAAG7G,MAAM,CAAC4C,SAAD,CAA1B;;AAEA,QAAI6C,UAAU,CAACsB,cAAX,IAA6BH,oBAAoB,CAACC,WAAD,EAAcjE,SAAd,CAArD,EAA+E;AAC7E6C,MAAAA,UAAU,CAACsB,cAAX;AACD;;AAED,QAAI,CAAC9B,KAAK,CAACf,SAAX,EAAsB;AACpB8C,MAAAA,KAAK;AACN,KAFD;AAAA,SAIK,IAAI/B,KAAK,CAACb,UAAN,IAAoByC,WAAW,GAAGrH,IAAI,CAACD,GAAL,CAAS,CAAT,EAAY0F,KAAK,CAACX,YAAN,GAAqB,CAAjC,CAAtC,EAA2E;AAC9E2C,QAAAA,GAAG,CAAC,IAAD,CAAH;AACAD,QAAAA,KAAK;AACN;;;AAGD,QAAIH,WAAW,KAAK,CAAhB,IAAqBzG,MAAM,CAAC8G,EAA5B,IAAkC9G,MAAM,CAAC8G,EAAP,CAAUzB,UAAU,CAAClD,MAArB,EAA6B,CAAC,CAA9B,CAAtC,EAAwE;AACtE4C,MAAAA,gCAAgC,GAAG,IAAnC,CADsE;;AAGtE;AACD;;AAEDD,IAAAA,YAAY,GAAGO,UAAf;AACAR,IAAAA,KAAK,CAACT,YAAN,GAAqB/E,UAAU,CAACwF,KAAK,CAACT,YAAP,EAAqB5B,SAArB,CAA/B;AACAqC,IAAAA,KAAK,CAACX,YAAN,GAAqBuC,WAArB;AACA5B,IAAAA,KAAK,CAACL,mBAAN,CAA0BjD,IAA1B,CAA+B;AAC7BiB,MAAAA,SAAS,EAATA,SAD6B;AAE7BD,MAAAA,SAAS,EAATA;AAF6B,KAA/B;AAKAwE,IAAAA,6BAA6B;;AAG7BjB,IAAAA,YAAY,CAAC;AAAEtD,MAAAA,SAAS,EAATA,SAAF;AAAa0D,MAAAA,OAAO,EAAE,CAACrB,KAAK,CAACd;AAA7B,KAAD,CAAZ;AAEA;;AACAc,IAAAA,KAAK,CAACd,gBAAN,GAAyB,IAAzB;;AAGAiD,IAAAA,OAAO;AACR,GA5CD;;AA8CA,MAAMD,6BAA6B,GAAG,SAAhCA,6BAAgC;AACpC,QAAIlC,KAAK,CAACL,mBAAN,CAA0B9F,MAA1B,KAAqC8E,oBAAzC,EAA+D;AAC7DqB,MAAAA,KAAK,CAACN,YAAN,CAAmB0C,OAAnB,CAA2B;AACzBC,QAAAA,YAAY,EAAErC,KAAK,CAACL,mBAAN,CAA0B/E,GAA1B,CAA8B,UAACV,CAAD;AAAA,iBAAOA,CAAC,CAACyD,SAAT;AAAA,SAA9B,EAAkD3D,MAAlD,CAAyDQ,UAAzD,CADW;AAEzBkD,QAAAA,SAAS,EAAE5D,OAAO,CAACkG,KAAK,CAACL,mBAAN,CAA0B/E,GAA1B,CAA8B,UAACV,CAAD;AAAA,iBAAOA,CAAC,CAACwD,SAAT;AAAA,SAA9B,CAAD;AAFO,OAA3B,EAD6D;;AAO7D4E,MAAAA,cAAc,GAP+C;;AAU7DtC,MAAAA,KAAK,CAACL,mBAAN,CAA0B9F,MAA1B,GAAmC,CAAnC,CAV6D;;AAa7DmG,MAAAA,KAAK,CAACN,YAAN,CAAmB7F,MAAnB,GAA4B,CAA5B;;AAEA,UAAI,CAACmG,KAAK,CAACb,UAAX,EAAuB;AACrBoD,QAAAA,cAAc;AACf;AACF,KAlBD,MAkBO,IAAI,CAACvC,KAAK,CAACd,gBAAX,EAA6B;AAClCsD,MAAAA,mBAAmB;AACpB;AACF,GAtBD;;AAwBA,MAAMA,mBAAmB,GAAG,SAAtBA,mBAAsB;AAC1BxC,IAAAA,KAAK,CAACR,YAAN,GAAqB7F,MAAM,CAACqG,KAAK,CAACL,mBAAP,CAAN,CAAkChC,SAAlC,CAA4C/C,GAA5C,CAAgD,UAAC6H,CAAD;AAAA,aAAOA,CAAC,GAAGzC,KAAK,CAACJ,cAAjB;AAAA,KAAhD,CAArB;AACD,GAFD;;AAIA,MAAM0C,cAAc,GAAG,SAAjBA,cAAiB;AACrB;8BAC6CtC,KAAK,CAACN;QAA5CgD;QAAmBC;;AAE1B,QAAI,CAACA,eAAD,IAAoB,CAACD,iBAAzB,EAA4C;AAC1C;AACD;;;AAGD,QAAME,SAAS,GAAGF,iBAAiB,CAAChF,SAAlB,GAA8BiF,eAAe,CAACjF,SAAhE;;AAEA,QAAIkF,SAAS,IAAI,CAAjB,EAAoB;AAClBvE,MAAAA,OAAO,IAAI0C,OAAO,CAACc,IAAR,CAAa,mBAAb,CAAX;AACA;AACD;;;AAGD,QAAMJ,QAAQ,GAAGiB,iBAAiB,CAACL,YAAlB,CAA+BzH,GAA/B,CAAmC,UAAC6H,CAAD;AAAA,aAAOA,CAAC,GAAGG,SAAX;AAAA,KAAnC,CAAjB;;AAGA,QAAMC,kBAAkB,GAAGpB,QAAQ,CAAC7G,GAAT,CAAa,UAACkI,CAAD,EAAIhI,CAAJ;AAAA,aAAUgI,CAAC,IAAI9C,KAAK,CAACR,YAAN,CAAmB1E,CAAnB,KAAyB,CAA7B,CAAX;AAAA,KAAb,CAA3B;AAEAkF,IAAAA,KAAK,CAACR,YAAN,GAAqBiC,QAArB;AACAzB,IAAAA,KAAK,CAACP,mBAAN,CAA0B/C,IAA1B,CAA+BmG,kBAA/B;AAEAE,IAAAA,oBAAoB,CAACH,SAAD,CAApB;AACD,GA1BD;;AA4BA,MAAMG,oBAAoB,GAAG,SAAvBA,oBAAuB,CAACH,SAAD;AAC3B;AACA,QAAII,UAAU,GAAGzI,IAAI,CAAC0I,IAAL,CAAUL,SAAS,GAAG,EAAtB,IAA4B,EAA5B,GAAiC,GAAlD;;AAGA,QAAI,CAAC5C,KAAK,CAACb,UAAX,EAAuB;AACrB6D,MAAAA,UAAU,GAAGzI,IAAI,CAACD,GAAL,CAAS,GAAT,EAAc0I,UAAU,GAAG,CAA3B,CAAb;AACD;;AAEDhD,IAAAA,KAAK,CAACJ,cAAN,GAAuBrF,IAAI,CAACF,GAAL,CAAS,IAAT,EAAeE,IAAI,CAAC2I,KAAL,CAAWF,UAAX,CAAf,CAAvB;AACD,GAVD;;AAYA,MAAMG,iCAAiC,GAAG,SAApCA,iCAAoC,CAACC,SAAD;AACxC;AACA,QAAIA,SAAS,KAAK,CAAlB,EAAqB,OAAO,IAAP;AACrB,WAAOA,SAAS,IAAI1E,cAAb,IAA+B0E,SAAS,IAAI3E,cAAnD;AACD,GAJD;;AAMA,MAAM8D,cAAc,GAAG,SAAjBA,cAAiB;AACrB,QAAIvC,KAAK,CAACP,mBAAN,CAA0B5F,MAA1B,IAAoC+E,sBAAxC,EAAgE;AAC9D,UAAIsB,gCAAJ,EAAsC;AACpCA,QAAAA,gCAAgC,GAAG,KAAnC;;AAEA,YAAInF,MAAM,CAACiF,KAAK,CAACR,YAAP,CAAN,IAA8B,GAAlC,EAAuC;AACrC6D,UAAAA,kBAAkB;AAClB;AACD;AACF;;AAED,UAAMC,yBAAyB,GAAGtD,KAAK,CAACP,mBAAN,CAA0B8D,KAA1B,CAAgC3E,sBAAsB,GAAG,CAAC,CAA1D,CAAlC,CAV8D;AAa9D;;AACA,UAAM4E,gBAAgB,GAAGF,yBAAyB,CAACG,KAA1B,CAAgC,UAACC,MAAD;AACvD;AACA,YAAMC,UAAU,GAAG,CAAC,CAACD,MAAM,CAAC1J,MAAP,CAAc,UAAC4J,EAAD,EAAKC,EAAL;AAAA,iBAAaD,EAAE,IAAIA,EAAE,GAAG,CAAX,IAAgBA,EAAE,KAAKC,EAAvB,GAA4B,CAA5B,GAAgC,CAA7C;AAAA,SAAd,CAArB;;AAGA,YAAMC,oBAAoB,GAAGJ,MAAM,CAAC3H,MAAP,CAAcoH,iCAAd,EAAiDtJ,MAAjD,KAA4D6J,MAAM,CAAC7J,MAAhG;;AAGA,eAAO8J,UAAU,IAAIG,oBAArB;AACD,OATwB,CAAzB;;AAWA,UAAIN,gBAAJ,EAAsB;AACpBH,QAAAA,kBAAkB;AACnB,OA3B6D;;;AA8B9DrD,MAAAA,KAAK,CAACP,mBAAN,GAA4B6D,yBAA5B;AACD;AACF,GAjCD;;AAmCA,MAAMD,kBAAkB,GAAG,SAArBA,kBAAqB;AACzBrD,IAAAA,KAAK,CAACb,UAAN,GAAmB,IAAnB;AACD,GAFD;;AAIA,MAAM4C,KAAK,GAAG,SAARA,KAAQ;AACZ/B,IAAAA,KAAK,GAAGhB,wBAAwB,EAAhC;AACAgB,IAAAA,KAAK,CAACf,SAAN,GAAkB,IAAlB;AACAe,IAAAA,KAAK,CAACZ,SAAN,GAAkB2E,IAAI,CAACC,GAAL,EAAlB;AACA7D,IAAAA,mBAAmB,GAAGW,SAAtB;AACAZ,IAAAA,gCAAgC,GAAG,KAAnC;AACD,GAND;;AAQA,MAAMiC,OAAO,GAAI;AACf,QAAI8B,SAAJ;AACA,WAAO;AACLC,MAAAA,YAAY,CAACD,SAAD,CAAZ;AACAA,MAAAA,SAAS,GAAGE,UAAU,CAACnC,GAAD,EAAMhC,KAAK,CAACJ,cAAZ,CAAtB;AACD,KAHD;AAID,GANe,EAAhB;;AAQA,MAAMoC,GAAG,GAAG,SAANA,GAAM,CAACT,gBAAD;QAACA;AAAAA,MAAAA,mBAAmB;;;AAC9B,QAAI,CAACvB,KAAK,CAACf,SAAX,EAAsB;;AAEtB,QAAIe,KAAK,CAACb,UAAN,IAAoBoC,gBAAxB,EAA0C;AACxCN,MAAAA,YAAY,CAAC;AAAEK,QAAAA,QAAQ,EAAE,IAAZ;AAAkBC,QAAAA,gBAAgB,EAAE;AAApC,OAAD,CAAZ;AACD,KAFD,MAEO;AACLN,MAAAA,YAAY,CAAC;AAAEK,QAAAA,QAAQ,EAAE;AAAZ,OAAD,CAAZ;AACD;;AAEDtB,IAAAA,KAAK,CAACb,UAAN,GAAmB,KAAnB;AACAa,IAAAA,KAAK,CAACf,SAAN,GAAkB,KAAlB;AACD,GAXD;;6BAa2C9C,mBAAmB,CAACiE,SAAD;MAAtD9D,+BAAAA;MAASK,iCAAAA;MAAWG,kCAAAA;;AAE5B4D,EAAAA,aAAa,CAACZ,YAAD,CAAb;AAEA,SAAO7E,UAAU,CAAC;AAChBS,IAAAA,EAAE,EAAFA,EADgB;AAEhBI,IAAAA,GAAG,EAAHA,GAFgB;AAGhBQ,IAAAA,OAAO,EAAPA,OAHgB;AAIhBK,IAAAA,SAAS,EAATA,SAJgB;AAKhBG,IAAAA,UAAU,EAAVA,UALgB;AAMhBsD,IAAAA,SAAS,EAATA,SANgB;AAOhBM,IAAAA,aAAa,EAAbA;AAPgB,GAAD,CAAjB;AASD;;;;;"}