{"version":3,"file":"experiment-split.js","sources":["../../../w3t_front/utils/experiment/constants.ts","../../../node_modules/.pnpm/@growthbook+growthbook@0.31.0/node_modules/@growthbook/growthbook/dist/esm/feature-repository.js","../../../node_modules/.pnpm/dom-mutator@0.6.0/node_modules/dom-mutator/dist/dom-mutator.esm.js","../../../node_modules/.pnpm/@growthbook+growthbook@0.31.0/node_modules/@growthbook/growthbook/dist/esm/util.js","../../../node_modules/.pnpm/@growthbook+growthbook@0.31.0/node_modules/@growthbook/growthbook/dist/esm/mongrule.js","../../../node_modules/.pnpm/@growthbook+growthbook@0.31.0/node_modules/@growthbook/growthbook/dist/esm/GrowthBook.js","../../../node_modules/.pnpm/js-cookie@3.0.5/node_modules/js-cookie/dist/js.cookie.mjs","../../../w3t_front/utils/helpers/uuid.ts","../../../w3t_front/utils/experiment/storage.ts","../../../w3t_front/utils/experiment/index.ts","../../../w3t_front/utils/experiment/split-url.ts"],"sourcesContent":["// Setted 0 for anti flickering effect also this value fires for not targeting pages.\nexport const DEFAULT_FEATURE_VALUE = 0;\n// Feature value for Control variation of experiment\nexport const CONTROL_FEATURE_VALUE = 1;\n\nexport type ExperimentConfig = {\n targetPathname: string; // '/',\n featureId: string; // 'home-split',\n alternativeUrls: string[]; // ['/home.html'],\n};","// Config settings\nconst cacheSettings = {\n // Consider a fetch stale after 1 minute\n staleTTL: 1000 * 60,\n cacheKey: \"gbFeaturesCache\",\n backgroundSync: true,\n maxEntries: 10,\n disableIdleStreams: false,\n idleStreamInterval: 20000\n};\nconst polyfills = {\n fetch: globalThis.fetch ? globalThis.fetch.bind(globalThis) : undefined,\n SubtleCrypto: globalThis.crypto ? globalThis.crypto.subtle : undefined,\n EventSource: globalThis.EventSource\n};\nexport const helpers = {\n fetchFeaturesCall: _ref => {\n let {\n host,\n clientKey,\n headers\n } = _ref;\n return polyfills.fetch(\"\".concat(host, \"/api/features/\").concat(clientKey), {\n headers\n });\n },\n fetchRemoteEvalCall: _ref2 => {\n let {\n host,\n clientKey,\n payload,\n headers\n } = _ref2;\n const options = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n body: JSON.stringify(payload)\n };\n return polyfills.fetch(\"\".concat(host, \"/api/eval/\").concat(clientKey), options);\n },\n eventSourceCall: _ref3 => {\n let {\n host,\n clientKey,\n headers\n } = _ref3;\n if (headers) {\n return new polyfills.EventSource(\"\".concat(host, \"/sub/\").concat(clientKey), {\n headers\n });\n }\n return new polyfills.EventSource(\"\".concat(host, \"/sub/\").concat(clientKey));\n },\n startIdleListener: () => {\n let idleTimeout;\n const isBrowser = typeof window !== \"undefined\" && typeof document !== \"undefined\";\n if (!isBrowser) return;\n const onVisibilityChange = () => {\n if (document.visibilityState === \"visible\") {\n window.clearTimeout(idleTimeout);\n onVisible();\n } else if (document.visibilityState === \"hidden\") {\n idleTimeout = window.setTimeout(onHidden, cacheSettings.idleStreamInterval);\n }\n };\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n return () => document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n },\n stopIdleListener: () => {\n // No-op, replaced by startIdleListener\n }\n};\ntry {\n if (globalThis.localStorage) {\n polyfills.localStorage = globalThis.localStorage;\n }\n} catch (e) {\n // Ignore localStorage errors\n}\n\n// Global state\nconst subscribedInstances = new Map();\nlet cacheInitialized = false;\nconst cache = new Map();\nconst activeFetches = new Map();\nconst streams = new Map();\nconst supportsSSE = new Set();\n\n// Public functions\nexport function setPolyfills(overrides) {\n Object.assign(polyfills, overrides);\n}\nexport function configureCache(overrides) {\n Object.assign(cacheSettings, overrides);\n if (!cacheSettings.backgroundSync) {\n clearAutoRefresh();\n }\n}\nexport async function clearCache() {\n cache.clear();\n activeFetches.clear();\n clearAutoRefresh();\n cacheInitialized = false;\n await updatePersistentCache();\n}\nexport async function refreshFeatures(instance, timeout, skipCache, allowStale, updateInstance, backgroundSync) {\n if (!backgroundSync) {\n cacheSettings.backgroundSync = false;\n }\n const data = await fetchFeaturesWithCache(instance, allowStale, timeout, skipCache);\n updateInstance && data && (await refreshInstance(instance, data));\n}\n\n// Subscribe a GrowthBook instance to feature changes\nexport function subscribe(instance) {\n const key = getKey(instance);\n const subs = subscribedInstances.get(key) || new Set();\n subs.add(instance);\n subscribedInstances.set(key, subs);\n}\nexport function unsubscribe(instance) {\n subscribedInstances.forEach(s => s.delete(instance));\n}\nexport function onHidden() {\n streams.forEach(channel => {\n if (!channel) return;\n channel.state = \"idle\";\n disableChannel(channel);\n });\n}\nexport function onVisible() {\n streams.forEach(channel => {\n if (!channel) return;\n if (channel.state !== \"idle\") return;\n enableChannel(channel);\n });\n}\n\n// Private functions\n\nasync function updatePersistentCache() {\n try {\n if (!polyfills.localStorage) return;\n await polyfills.localStorage.setItem(cacheSettings.cacheKey, JSON.stringify(Array.from(cache.entries())));\n } catch (e) {\n // Ignore localStorage errors\n }\n}\nasync function fetchFeaturesWithCache(instance, allowStale, timeout, skipCache) {\n const key = getKey(instance);\n const cacheKey = getCacheKey(instance);\n const now = new Date();\n await initializeCache();\n const existing = cache.get(cacheKey);\n if (existing && !skipCache && (allowStale || existing.staleAt > now)) {\n // Restore from cache whether SSE is supported\n if (existing.sse) supportsSSE.add(key);\n\n // Reload features in the background if stale\n if (existing.staleAt < now) {\n fetchFeatures(instance);\n }\n // Otherwise, if we don't need to refresh now, start a background sync\n else {\n startAutoRefresh(instance);\n }\n return existing.data;\n } else {\n return await promiseTimeout(fetchFeatures(instance), timeout);\n }\n}\nfunction getKey(instance) {\n const [apiHost, clientKey] = instance.getApiInfo();\n return \"\".concat(apiHost, \"||\").concat(clientKey);\n}\nfunction getCacheKey(instance) {\n const baseKey = getKey(instance);\n if (!instance.isRemoteEval()) return baseKey;\n const attributes = instance.getAttributes();\n const cacheKeyAttributes = instance.getCacheKeyAttributes() || Object.keys(instance.getAttributes());\n const ca = {};\n cacheKeyAttributes.forEach(key => {\n ca[key] = attributes[key];\n });\n const fv = instance.getForcedVariations();\n const url = instance.getUrl();\n return \"\".concat(baseKey, \"||\").concat(JSON.stringify({\n ca,\n fv,\n url\n }));\n}\n\n// Guarantee the promise always resolves within {timeout} ms\n// Resolved value will be `null` when there's an error or it takes too long\n// Note: The promise will continue running in the background, even if the timeout is hit\nfunction promiseTimeout(promise, timeout) {\n return new Promise(resolve => {\n let resolved = false;\n let timer;\n const finish = data => {\n if (resolved) return;\n resolved = true;\n timer && clearTimeout(timer);\n resolve(data || null);\n };\n if (timeout) {\n timer = setTimeout(() => finish(), timeout);\n }\n promise.then(data => finish(data)).catch(() => finish());\n });\n}\n\n// Populate cache from localStorage (if available)\nasync function initializeCache() {\n if (cacheInitialized) return;\n cacheInitialized = true;\n try {\n if (polyfills.localStorage) {\n const value = await polyfills.localStorage.getItem(cacheSettings.cacheKey);\n if (value) {\n const parsed = JSON.parse(value);\n if (parsed && Array.isArray(parsed)) {\n parsed.forEach(_ref4 => {\n let [key, data] = _ref4;\n cache.set(key, {\n ...data,\n staleAt: new Date(data.staleAt)\n });\n });\n }\n cleanupCache();\n }\n }\n } catch (e) {\n // Ignore localStorage errors\n }\n if (!cacheSettings.disableIdleStreams) {\n const cleanupFn = helpers.startIdleListener();\n if (cleanupFn) {\n helpers.stopIdleListener = cleanupFn;\n }\n }\n}\n\n// Enforce the maxEntries limit\nfunction cleanupCache() {\n const entriesWithTimestamps = Array.from(cache.entries()).map(_ref5 => {\n let [key, value] = _ref5;\n return {\n key,\n staleAt: value.staleAt.getTime()\n };\n }).sort((a, b) => a.staleAt - b.staleAt);\n const entriesToRemoveCount = Math.min(Math.max(0, cache.size - cacheSettings.maxEntries), cache.size);\n for (let i = 0; i < entriesToRemoveCount; i++) {\n cache.delete(entriesWithTimestamps[i].key);\n }\n}\n\n// Called whenever new features are fetched from the API\nfunction onNewFeatureData(key, cacheKey, data) {\n // If contents haven't changed, ignore the update, extend the stale TTL\n const version = data.dateUpdated || \"\";\n const staleAt = new Date(Date.now() + cacheSettings.staleTTL);\n const existing = cache.get(cacheKey);\n if (existing && version && existing.version === version) {\n existing.staleAt = staleAt;\n updatePersistentCache();\n return;\n }\n\n // Update in-memory cache\n cache.set(cacheKey, {\n data,\n version,\n staleAt,\n sse: supportsSSE.has(key)\n });\n cleanupCache();\n // Update local storage (don't await this, just update asynchronously)\n updatePersistentCache();\n\n // Update features for all subscribed GrowthBook instances\n const instances = subscribedInstances.get(key);\n instances && instances.forEach(instance => refreshInstance(instance, data));\n}\nasync function refreshInstance(instance, data) {\n await (data.encryptedExperiments ? instance.setEncryptedExperiments(data.encryptedExperiments, undefined, polyfills.SubtleCrypto) : instance.setExperiments(data.experiments || instance.getExperiments()));\n await (data.encryptedFeatures ? instance.setEncryptedFeatures(data.encryptedFeatures, undefined, polyfills.SubtleCrypto) : instance.setFeatures(data.features || instance.getFeatures()));\n}\nasync function fetchFeatures(instance) {\n const {\n apiHost,\n apiRequestHeaders\n } = instance.getApiHosts();\n const clientKey = instance.getClientKey();\n const remoteEval = instance.isRemoteEval();\n const key = getKey(instance);\n const cacheKey = getCacheKey(instance);\n let promise = activeFetches.get(cacheKey);\n if (!promise) {\n const fetcher = remoteEval ? helpers.fetchRemoteEvalCall({\n host: apiHost,\n clientKey,\n payload: {\n attributes: instance.getAttributes(),\n forcedVariations: instance.getForcedVariations(),\n forcedFeatures: Array.from(instance.getForcedFeatures().entries()),\n url: instance.getUrl()\n },\n headers: apiRequestHeaders\n }) : helpers.fetchFeaturesCall({\n host: apiHost,\n clientKey,\n headers: apiRequestHeaders\n });\n\n // TODO: auto-retry if status code indicates a temporary error\n promise = fetcher.then(res => {\n if (res.headers.get(\"x-sse-support\") === \"enabled\") {\n supportsSSE.add(key);\n }\n return res.json();\n }).then(data => {\n onNewFeatureData(key, cacheKey, data);\n startAutoRefresh(instance);\n activeFetches.delete(cacheKey);\n return data;\n }).catch(e => {\n process.env.NODE_ENV !== \"production\" && instance.log(\"Error fetching features\", {\n apiHost,\n clientKey,\n error: e ? e.message : null\n });\n activeFetches.delete(cacheKey);\n return Promise.resolve({});\n });\n activeFetches.set(cacheKey, promise);\n }\n return await promise;\n}\n\n// Watch a feature endpoint for changes\n// Will prefer SSE if enabled, otherwise fall back to cron\nfunction startAutoRefresh(instance) {\n const key = getKey(instance);\n const cacheKey = getCacheKey(instance);\n const {\n streamingHost,\n streamingHostRequestHeaders\n } = instance.getApiHosts();\n const clientKey = instance.getClientKey();\n if (cacheSettings.backgroundSync && supportsSSE.has(key) && polyfills.EventSource) {\n if (streams.has(key)) return;\n const channel = {\n src: null,\n host: streamingHost,\n clientKey,\n headers: streamingHostRequestHeaders,\n cb: event => {\n try {\n if (event.type === \"features-updated\") {\n const instances = subscribedInstances.get(key);\n instances && instances.forEach(instance => {\n fetchFeatures(instance);\n });\n } else if (event.type === \"features\") {\n const json = JSON.parse(event.data);\n onNewFeatureData(key, cacheKey, json);\n }\n // Reset error count on success\n channel.errors = 0;\n } catch (e) {\n process.env.NODE_ENV !== \"production\" && instance.log(\"SSE Error\", {\n streamingHost,\n clientKey,\n error: e ? e.message : null\n });\n onSSEError(channel);\n }\n },\n errors: 0,\n state: \"active\"\n };\n streams.set(key, channel);\n enableChannel(channel);\n }\n}\nfunction onSSEError(channel) {\n if (channel.state === \"idle\") return;\n channel.errors++;\n if (channel.errors > 3 || channel.src && channel.src.readyState === 2) {\n // exponential backoff after 4 errors, with jitter\n const delay = Math.pow(3, channel.errors - 3) * (1000 + Math.random() * 1000);\n disableChannel(channel);\n setTimeout(() => {\n if ([\"idle\", \"active\"].includes(channel.state)) return;\n enableChannel(channel);\n }, Math.min(delay, 300000)); // 5 minutes max\n }\n}\n\nfunction disableChannel(channel) {\n if (!channel.src) return;\n channel.src.onopen = null;\n channel.src.onerror = null;\n channel.src.close();\n channel.src = null;\n if (channel.state === \"active\") {\n channel.state = \"disabled\";\n }\n}\nfunction enableChannel(channel) {\n channel.src = helpers.eventSourceCall({\n host: channel.host,\n clientKey: channel.clientKey,\n headers: channel.headers\n });\n channel.state = \"active\";\n channel.src.addEventListener(\"features\", channel.cb);\n channel.src.addEventListener(\"features-updated\", channel.cb);\n channel.src.onerror = () => onSSEError(channel);\n channel.src.onopen = () => {\n channel.errors = 0;\n };\n}\nfunction destroyChannel(channel, key) {\n disableChannel(channel);\n streams.delete(key);\n}\nfunction clearAutoRefresh() {\n // Clear list of which keys are auto-updated\n supportsSSE.clear();\n\n // Stop listening for any SSE events\n streams.forEach(destroyChannel);\n\n // Remove all references to GrowthBook instances\n subscribedInstances.clear();\n\n // Run the idle stream cleanup function\n helpers.stopIdleListener();\n}\n//# sourceMappingURL=feature-repository.js.map","var validAttributeName = /^[a-zA-Z:_][a-zA-Z0-9:_.-]*$/;\nvar nullController = {\n revert: function revert() {}\n};\nvar elements = /*#__PURE__*/new Map();\nvar mutations = /*#__PURE__*/new Set();\n\nfunction getObserverInit(attr) {\n return attr === 'html' ? {\n childList: true,\n subtree: true,\n attributes: true,\n characterData: true\n } : {\n childList: false,\n subtree: false,\n attributes: true,\n attributeFilter: [attr]\n };\n}\n\nfunction getElementRecord(element) {\n var record = elements.get(element);\n\n if (!record) {\n record = {\n element: element,\n attributes: {}\n };\n elements.set(element, record);\n }\n\n return record;\n}\n\nfunction createElementPropertyRecord(el, attr, getCurrentValue, setValue, mutationRunner) {\n var currentValue = getCurrentValue(el);\n var record = {\n isDirty: false,\n originalValue: currentValue,\n virtualValue: currentValue,\n mutations: [],\n el: el,\n _positionTimeout: null,\n observer: new MutationObserver(function () {\n // enact a 1 second timeout that blocks subsequent firing of the\n // observer until the timeout is complete. This will prevent multiple\n // mutations from firing in quick succession, which can cause the\n // mutation to be reverted before the DOM has a chance to update.\n if (attr === 'position' && record._positionTimeout) return;else if (attr === 'position') record._positionTimeout = setTimeout(function () {\n record._positionTimeout = null;\n }, 1000);\n var currentValue = getCurrentValue(el);\n if (attr === 'position' && currentValue.parentNode === record.virtualValue.parentNode && currentValue.insertBeforeNode === record.virtualValue.insertBeforeNode) return;\n if (currentValue === record.virtualValue) return;\n record.originalValue = currentValue;\n mutationRunner(record);\n }),\n mutationRunner: mutationRunner,\n setValue: setValue,\n getCurrentValue: getCurrentValue\n };\n\n if (attr === 'position' && el.parentNode) {\n record.observer.observe(el.parentNode, {\n childList: true,\n subtree: true,\n attributes: false,\n characterData: false\n });\n } else {\n record.observer.observe(el, getObserverInit(attr));\n }\n\n return record;\n}\n\nfunction queueIfNeeded(val, record) {\n var currentVal = record.getCurrentValue(record.el);\n record.virtualValue = val;\n\n if (val && typeof val !== 'string') {\n if (!currentVal || val.parentNode !== currentVal.parentNode || val.insertBeforeNode !== currentVal.insertBeforeNode) {\n record.isDirty = true;\n runDOMUpdates();\n }\n } else if (val !== currentVal) {\n record.isDirty = true;\n runDOMUpdates();\n }\n}\n\nfunction htmlMutationRunner(record) {\n var val = record.originalValue;\n record.mutations.forEach(function (m) {\n return val = m.mutate(val);\n });\n queueIfNeeded(getTransformedHTML(val), record);\n}\n\nfunction classMutationRunner(record) {\n var val = new Set(record.originalValue.split(/\\s+/).filter(Boolean));\n record.mutations.forEach(function (m) {\n return m.mutate(val);\n });\n queueIfNeeded(Array.from(val).filter(Boolean).join(' '), record);\n}\n\nfunction attrMutationRunner(record) {\n var val = record.originalValue;\n record.mutations.forEach(function (m) {\n return val = m.mutate(val);\n });\n queueIfNeeded(val, record);\n}\n\nfunction _loadDOMNodes(_ref) {\n var parentSelector = _ref.parentSelector,\n insertBeforeSelector = _ref.insertBeforeSelector;\n var parentNode = document.querySelector(parentSelector);\n if (!parentNode) return null;\n var insertBeforeNode = insertBeforeSelector ? document.querySelector(insertBeforeSelector) : null;\n if (insertBeforeSelector && !insertBeforeNode) return null;\n return {\n parentNode: parentNode,\n insertBeforeNode: insertBeforeNode\n };\n}\n\nfunction positionMutationRunner(record) {\n var val = record.originalValue;\n record.mutations.forEach(function (m) {\n var selectors = m.mutate();\n\n var newNodes = _loadDOMNodes(selectors);\n\n val = newNodes || val;\n });\n queueIfNeeded(val, record);\n}\n\nvar getHTMLValue = function getHTMLValue(el) {\n return el.innerHTML;\n};\n\nvar setHTMLValue = function setHTMLValue(el, value) {\n return el.innerHTML = value;\n};\n\nfunction getElementHTMLRecord(element) {\n var elementRecord = getElementRecord(element);\n\n if (!elementRecord.html) {\n elementRecord.html = createElementPropertyRecord(element, 'html', getHTMLValue, setHTMLValue, htmlMutationRunner);\n }\n\n return elementRecord.html;\n}\n\nvar getElementPosition = function getElementPosition(el) {\n return {\n parentNode: el.parentElement,\n insertBeforeNode: el.nextElementSibling\n };\n};\n\nvar setElementPosition = function setElementPosition(el, value) {\n if (value.insertBeforeNode && !value.parentNode.contains(value.insertBeforeNode)) {\n // skip position mutation - insertBeforeNode not a child of parent. happens\n // when mutation observer for indvidual element fires out of order\n return;\n }\n\n value.parentNode.insertBefore(el, value.insertBeforeNode);\n};\n\nfunction getElementPositionRecord(element) {\n var elementRecord = getElementRecord(element);\n\n if (!elementRecord.position) {\n elementRecord.position = createElementPropertyRecord(element, 'position', getElementPosition, setElementPosition, positionMutationRunner);\n }\n\n return elementRecord.position;\n}\n\nvar setClassValue = function setClassValue(el, val) {\n return val ? el.className = val : el.removeAttribute('class');\n};\n\nvar getClassValue = function getClassValue(el) {\n return el.className;\n};\n\nfunction getElementClassRecord(el) {\n var elementRecord = getElementRecord(el);\n\n if (!elementRecord.classes) {\n elementRecord.classes = createElementPropertyRecord(el, 'class', getClassValue, setClassValue, classMutationRunner);\n }\n\n return elementRecord.classes;\n}\n\nvar getAttrValue = function getAttrValue(attrName) {\n return function (el) {\n var _el$getAttribute;\n\n return (_el$getAttribute = el.getAttribute(attrName)) != null ? _el$getAttribute : null;\n };\n};\n\nvar setAttrValue = function setAttrValue(attrName) {\n return function (el, val) {\n return val !== null ? el.setAttribute(attrName, val) : el.removeAttribute(attrName);\n };\n};\n\nfunction getElementAttributeRecord(el, attr) {\n var elementRecord = getElementRecord(el);\n\n if (!elementRecord.attributes[attr]) {\n elementRecord.attributes[attr] = createElementPropertyRecord(el, attr, getAttrValue(attr), setAttrValue(attr), attrMutationRunner);\n }\n\n return elementRecord.attributes[attr];\n}\n\nfunction deleteElementPropertyRecord(el, attr) {\n var element = elements.get(el);\n if (!element) return;\n\n if (attr === 'html') {\n var _element$html, _element$html$observe;\n\n (_element$html = element.html) == null ? void 0 : (_element$html$observe = _element$html.observer) == null ? void 0 : _element$html$observe.disconnect();\n delete element.html;\n } else if (attr === 'class') {\n var _element$classes, _element$classes$obse;\n\n (_element$classes = element.classes) == null ? void 0 : (_element$classes$obse = _element$classes.observer) == null ? void 0 : _element$classes$obse.disconnect();\n delete element.classes;\n } else if (attr === 'position') {\n var _element$position, _element$position$obs;\n\n (_element$position = element.position) == null ? void 0 : (_element$position$obs = _element$position.observer) == null ? void 0 : _element$position$obs.disconnect();\n delete element.position;\n } else {\n var _element$attributes, _element$attributes$a, _element$attributes$a2;\n\n (_element$attributes = element.attributes) == null ? void 0 : (_element$attributes$a = _element$attributes[attr]) == null ? void 0 : (_element$attributes$a2 = _element$attributes$a.observer) == null ? void 0 : _element$attributes$a2.disconnect();\n delete element.attributes[attr];\n }\n}\n\nvar transformContainer;\n\nfunction getTransformedHTML(html) {\n if (!transformContainer) {\n transformContainer = document.createElement('div');\n }\n\n transformContainer.innerHTML = html;\n return transformContainer.innerHTML;\n}\n\nfunction setPropertyValue(el, attr, m) {\n if (!m.isDirty) return;\n m.isDirty = false;\n var val = m.virtualValue;\n\n if (!m.mutations.length) {\n deleteElementPropertyRecord(el, attr);\n }\n\n m.setValue(el, val);\n}\n\nfunction setValue(m, el) {\n m.html && setPropertyValue(el, 'html', m.html);\n m.classes && setPropertyValue(el, 'class', m.classes);\n m.position && setPropertyValue(el, 'position', m.position);\n Object.keys(m.attributes).forEach(function (attr) {\n setPropertyValue(el, attr, m.attributes[attr]);\n });\n}\n\nfunction runDOMUpdates() {\n elements.forEach(setValue);\n} // find or create ElementPropertyRecord, add mutation to it, then run\n\n\nfunction startMutating(mutation, element) {\n var record = null;\n\n if (mutation.kind === 'html') {\n record = getElementHTMLRecord(element);\n } else if (mutation.kind === 'class') {\n record = getElementClassRecord(element);\n } else if (mutation.kind === 'attribute') {\n record = getElementAttributeRecord(element, mutation.attribute);\n } else if (mutation.kind === 'position') {\n record = getElementPositionRecord(element);\n }\n\n if (!record) return;\n record.mutations.push(mutation);\n record.mutationRunner(record);\n} // get (existing) ElementPropertyRecord, remove mutation from it, then run\n\n\nfunction stopMutating(mutation, el) {\n var record = null;\n\n if (mutation.kind === 'html') {\n record = getElementHTMLRecord(el);\n } else if (mutation.kind === 'class') {\n record = getElementClassRecord(el);\n } else if (mutation.kind === 'attribute') {\n record = getElementAttributeRecord(el, mutation.attribute);\n } else if (mutation.kind === 'position') {\n record = getElementPositionRecord(el);\n }\n\n if (!record) return;\n var index = record.mutations.indexOf(mutation);\n if (index !== -1) record.mutations.splice(index, 1);\n record.mutationRunner(record);\n} // maintain list of elements associated with mutation\n\n\nfunction refreshElementsSet(mutation) {\n // if a position mutation has already found an element to move, don't move\n // any more elements\n if (mutation.kind === 'position' && mutation.elements.size === 1) return;\n var existingElements = new Set(mutation.elements);\n var matchingElements = document.querySelectorAll(mutation.selector);\n matchingElements.forEach(function (el) {\n if (!existingElements.has(el)) {\n mutation.elements.add(el);\n startMutating(mutation, el);\n }\n });\n}\n\nfunction revertMutation(mutation) {\n mutation.elements.forEach(function (el) {\n return stopMutating(mutation, el);\n });\n mutation.elements.clear();\n mutations[\"delete\"](mutation);\n}\n\nfunction refreshAllElementSets() {\n mutations.forEach(refreshElementsSet);\n} // Observer for elements that don't exist in the DOM yet\n\n\nvar observer;\nfunction disconnectGlobalObserver() {\n observer && observer.disconnect();\n}\nfunction connectGlobalObserver() {\n if (typeof document === 'undefined') return;\n\n if (!observer) {\n observer = new MutationObserver(function () {\n refreshAllElementSets();\n });\n }\n\n refreshAllElementSets();\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n attributes: false,\n characterData: false\n });\n} // run on init\n\nconnectGlobalObserver();\n\nfunction newMutation(m) {\n // Not in a browser\n if (typeof document === 'undefined') return nullController; // add to global index of mutations\n\n mutations.add(m); // run refresh on init to establish list of elements associated w/ mutation\n\n refreshElementsSet(m);\n return {\n revert: function revert() {\n revertMutation(m);\n }\n };\n}\n\nfunction html(selector, mutate) {\n return newMutation({\n kind: 'html',\n elements: new Set(),\n mutate: mutate,\n selector: selector\n });\n}\n\nfunction position(selector, mutate) {\n return newMutation({\n kind: 'position',\n elements: new Set(),\n mutate: mutate,\n selector: selector\n });\n}\n\nfunction classes(selector, mutate) {\n return newMutation({\n kind: 'class',\n elements: new Set(),\n mutate: mutate,\n selector: selector\n });\n}\n\nfunction attribute(selector, attribute, mutate) {\n if (!validAttributeName.test(attribute)) return nullController;\n\n if (attribute === 'class' || attribute === 'className') {\n return classes(selector, function (classnames) {\n var mutatedClassnames = mutate(Array.from(classnames).join(' '));\n classnames.clear();\n if (!mutatedClassnames) return;\n mutatedClassnames.split(/\\s+/g).filter(Boolean).forEach(function (c) {\n return classnames.add(c);\n });\n });\n }\n\n return newMutation({\n kind: 'attribute',\n attribute: attribute,\n elements: new Set(),\n mutate: mutate,\n selector: selector\n });\n}\n\nfunction declarative(_ref2) {\n var selector = _ref2.selector,\n action = _ref2.action,\n value = _ref2.value,\n attr = _ref2.attribute,\n parentSelector = _ref2.parentSelector,\n insertBeforeSelector = _ref2.insertBeforeSelector;\n\n if (attr === 'html') {\n if (action === 'append') {\n return html(selector, function (val) {\n return val + (value != null ? value : '');\n });\n } else if (action === 'set') {\n return html(selector, function () {\n return value != null ? value : '';\n });\n }\n } else if (attr === 'class') {\n if (action === 'append') {\n return classes(selector, function (val) {\n if (value) val.add(value);\n });\n } else if (action === 'remove') {\n return classes(selector, function (val) {\n if (value) val[\"delete\"](value);\n });\n } else if (action === 'set') {\n return classes(selector, function (val) {\n val.clear();\n if (value) val.add(value);\n });\n }\n } else if (attr === 'position') {\n if (action === 'set' && parentSelector) {\n return position(selector, function () {\n return {\n insertBeforeSelector: insertBeforeSelector,\n parentSelector: parentSelector\n };\n });\n }\n } else {\n if (action === 'append') {\n return attribute(selector, attr, function (val) {\n return val !== null ? val + (value != null ? value : '') : value != null ? value : '';\n });\n } else if (action === 'set') {\n return attribute(selector, attr, function () {\n return value != null ? value : '';\n });\n } else if (action === 'remove') {\n return attribute(selector, attr, function () {\n return null;\n });\n }\n }\n\n return nullController;\n}\n\nvar index = {\n html: html,\n classes: classes,\n attribute: attribute,\n position: position,\n declarative: declarative\n};\n\nexport default index;\nexport { connectGlobalObserver, disconnectGlobalObserver, validAttributeName };\n//# sourceMappingURL=dom-mutator.esm.js.map\n","function hashFnv32a(str) {\n let hval = 0x811c9dc5;\n const l = str.length;\n for (let i = 0; i < l; i++) {\n hval ^= str.charCodeAt(i);\n hval += (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24);\n }\n return hval >>> 0;\n}\nexport function hash(seed, value, version) {\n // New unbiased hashing algorithm\n if (version === 2) {\n return hashFnv32a(hashFnv32a(seed + value) + \"\") % 10000 / 10000;\n }\n // Original biased hashing algorithm (keep for backwards compatibility)\n if (version === 1) {\n return hashFnv32a(value + seed) % 1000 / 1000;\n }\n\n // Unknown hash version\n return null;\n}\nexport function getEqualWeights(n) {\n if (n <= 0) return [];\n return new Array(n).fill(1 / n);\n}\nexport function inRange(n, range) {\n return n >= range[0] && n < range[1];\n}\nexport function inNamespace(hashValue, namespace) {\n const n = hash(\"__\" + namespace[0], hashValue, 1);\n if (n === null) return false;\n return n >= namespace[1] && n < namespace[2];\n}\nexport function chooseVariation(n, ranges) {\n for (let i = 0; i < ranges.length; i++) {\n if (inRange(n, ranges[i])) {\n return i;\n }\n }\n return -1;\n}\nexport function getUrlRegExp(regexString) {\n try {\n const escaped = regexString.replace(/([^\\\\])\\//g, \"$1\\\\/\");\n return new RegExp(escaped);\n } catch (e) {\n console.error(e);\n return undefined;\n }\n}\nexport function isURLTargeted(url, targets) {\n if (!targets.length) return false;\n let hasIncludeRules = false;\n let isIncluded = false;\n for (let i = 0; i < targets.length; i++) {\n const match = _evalURLTarget(url, targets[i].type, targets[i].pattern);\n if (targets[i].include === false) {\n if (match) return false;\n } else {\n hasIncludeRules = true;\n if (match) isIncluded = true;\n }\n }\n return isIncluded || !hasIncludeRules;\n}\nfunction _evalSimpleUrlPart(actual, pattern, isPath) {\n try {\n // Escape special regex characters and change wildcard `_____` to `.*`\n let escaped = pattern.replace(/[*.+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/_____/g, \".*\");\n if (isPath) {\n // When matching pathname, make leading/trailing slashes optional\n escaped = \"\\\\/?\" + escaped.replace(/(^\\/|\\/$)/g, \"\") + \"\\\\/?\";\n }\n const regex = new RegExp(\"^\" + escaped + \"$\", \"i\");\n return regex.test(actual);\n } catch (e) {\n return false;\n }\n}\nfunction _evalSimpleUrlTarget(actual, pattern) {\n try {\n // If a protocol is missing, but a host is specified, add `https://` to the front\n // Use \"_____\" as the wildcard since `*` is not a valid hostname in some browsers\n const expected = new URL(pattern.replace(/^([^:/?]*)\\./i, \"https://$1.\").replace(/\\*/g, \"_____\"), \"https://_____\");\n\n // Compare each part of the URL separately\n const comps = [[actual.host, expected.host, false], [actual.pathname, expected.pathname, true]];\n // We only want to compare hashes if it's explicitly being targeted\n if (expected.hash) {\n comps.push([actual.hash, expected.hash, false]);\n }\n expected.searchParams.forEach((v, k) => {\n comps.push([actual.searchParams.get(k) || \"\", v, false]);\n });\n\n // If any comparisons fail, the whole thing fails\n return !comps.some(data => !_evalSimpleUrlPart(data[0], data[1], data[2]));\n } catch (e) {\n return false;\n }\n}\nfunction _evalURLTarget(url, type, pattern) {\n try {\n const parsed = new URL(url, \"https://_\");\n if (type === \"regex\") {\n const regex = getUrlRegExp(pattern);\n if (!regex) return false;\n return regex.test(parsed.href) || regex.test(parsed.href.substring(parsed.origin.length));\n } else if (type === \"simple\") {\n return _evalSimpleUrlTarget(parsed, pattern);\n }\n return false;\n } catch (e) {\n return false;\n }\n}\nexport function getBucketRanges(numVariations, coverage, weights) {\n coverage = coverage === undefined ? 1 : coverage;\n\n // Make sure coverage is within bounds\n if (coverage < 0) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"Experiment.coverage must be greater than or equal to 0\");\n }\n coverage = 0;\n } else if (coverage > 1) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"Experiment.coverage must be less than or equal to 1\");\n }\n coverage = 1;\n }\n\n // Default to equal weights if missing or invalid\n const equal = getEqualWeights(numVariations);\n weights = weights || equal;\n if (weights.length !== numVariations) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"Experiment.weights array must be the same length as Experiment.variations\");\n }\n weights = equal;\n }\n\n // If weights don't add up to 1 (or close to it), default to equal weights\n const totalWeight = weights.reduce((w, sum) => sum + w, 0);\n if (totalWeight < 0.99 || totalWeight > 1.01) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"Experiment.weights must add up to 1\");\n }\n weights = equal;\n }\n\n // Covert weights to ranges\n let cumulative = 0;\n return weights.map(w => {\n const start = cumulative;\n cumulative += w;\n return [start, start + coverage * w];\n });\n}\nexport function getQueryStringOverride(id, url, numVariations) {\n if (!url) {\n return null;\n }\n const search = url.split(\"?\")[1];\n if (!search) {\n return null;\n }\n const match = search.replace(/#.*/, \"\") // Get rid of anchor\n .split(\"&\") // Split into key/value pairs\n .map(kv => kv.split(\"=\", 2)).filter(_ref => {\n let [k] = _ref;\n return k === id;\n }) // Look for key that matches the experiment id\n .map(_ref2 => {\n let [, v] = _ref2;\n return parseInt(v);\n }); // Parse the value into an integer\n\n if (match.length > 0 && match[0] >= 0 && match[0] < numVariations) return match[0];\n return null;\n}\nexport function isIncluded(include) {\n try {\n return include();\n } catch (e) {\n console.error(e);\n return false;\n }\n}\nconst base64ToBuf = b => Uint8Array.from(atob(b), c => c.charCodeAt(0));\nexport async function decrypt(encryptedString, decryptionKey, subtle) {\n decryptionKey = decryptionKey || \"\";\n subtle = subtle || globalThis.crypto && globalThis.crypto.subtle;\n if (!subtle) {\n throw new Error(\"No SubtleCrypto implementation found\");\n }\n try {\n const key = await subtle.importKey(\"raw\", base64ToBuf(decryptionKey), {\n name: \"AES-CBC\",\n length: 128\n }, true, [\"encrypt\", \"decrypt\"]);\n const [iv, cipherText] = encryptedString.split(\".\");\n const plainTextBuffer = await subtle.decrypt({\n name: \"AES-CBC\",\n iv: base64ToBuf(iv)\n }, key, base64ToBuf(cipherText));\n return new TextDecoder().decode(plainTextBuffer);\n } catch (e) {\n throw new Error(\"Failed to decrypt\");\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function paddedVersionString(input) {\n if (typeof input === \"number\") {\n input = input + \"\";\n }\n if (!input || typeof input !== \"string\") {\n input = \"0\";\n }\n // Remove build info and leading `v` if any\n // Split version into parts (both core version numbers and pre-release tags)\n // \"v1.2.3-rc.1+build123\" -> [\"1\",\"2\",\"3\",\"rc\",\"1\"]\n const parts = input.replace(/(^v|\\+.*$)/g, \"\").split(/[-.]/);\n\n // If it's SemVer without a pre-release, add `~` to the end\n // [\"1\",\"0\",\"0\"] -> [\"1\",\"0\",\"0\",\"~\"]\n // \"~\" is the largest ASCII character, so this will make \"1.0.0\" greater than \"1.0.0-beta\" for example\n if (parts.length === 3) {\n parts.push(\"~\");\n }\n\n // Left pad each numeric part with spaces so string comparisons will work (\"9\">\"10\", but \" 9\"<\"10\")\n // Then, join back together into a single string\n return parts.map(v => v.match(/^[0-9]+$/) ? v.padStart(5, \" \") : v).join(\"-\");\n}\nexport function loadSDKVersion() {\n let version;\n try {\n // @ts-expect-error right-hand value to be replaced by build with string literal\n version = \"0.31.0\";\n } catch (e) {\n version = \"\";\n }\n return version;\n}\n//# sourceMappingURL=util.js.map","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { paddedVersionString } from \"./util\";\nconst _regexCache = {};\n\n// The top-level condition evaluation function\nexport function evalCondition(obj, condition) {\n // Recursive condition\n if (\"$or\" in condition) {\n return evalOr(obj, condition[\"$or\"]);\n }\n if (\"$nor\" in condition) {\n return !evalOr(obj, condition[\"$nor\"]);\n }\n if (\"$and\" in condition) {\n return evalAnd(obj, condition[\"$and\"]);\n }\n if (\"$not\" in condition) {\n return !evalCondition(obj, condition[\"$not\"]);\n }\n\n // Condition is an object, keys are object paths, values are the condition for that path\n for (const [k, v] of Object.entries(condition)) {\n if (!evalConditionValue(v, getPath(obj, k))) return false;\n }\n return true;\n}\n\n// Return value at dot-separated path of an object\nfunction getPath(obj, path) {\n const parts = path.split(\".\");\n let current = obj;\n for (let i = 0; i < parts.length; i++) {\n if (current && typeof current === \"object\" && parts[i] in current) {\n current = current[parts[i]];\n } else {\n return null;\n }\n }\n return current;\n}\n\n// Transform a regex string into a real RegExp object\nfunction getRegex(regex) {\n if (!_regexCache[regex]) {\n _regexCache[regex] = new RegExp(regex.replace(/([^\\\\])\\//g, \"$1\\\\/\"));\n }\n return _regexCache[regex];\n}\n\n// Evaluate a single value against a condition\nfunction evalConditionValue(condition, value) {\n // Simple equality comparisons\n if (typeof condition === \"string\") {\n return value + \"\" === condition;\n }\n if (typeof condition === \"number\") {\n return value * 1 === condition;\n }\n if (typeof condition === \"boolean\") {\n return !!value === condition;\n }\n if (condition === null) {\n return value === null;\n }\n if (Array.isArray(condition) || !isOperatorObject(condition)) {\n return JSON.stringify(value) === JSON.stringify(condition);\n }\n\n // This is a special operator condition and we should evaluate each one separately\n for (const op in condition) {\n if (!evalOperatorCondition(op, value, condition[op])) {\n return false;\n }\n }\n return true;\n}\n\n// If the object has only keys that start with '$'\nfunction isOperatorObject(obj) {\n const keys = Object.keys(obj);\n return keys.length > 0 && keys.filter(k => k[0] === \"$\").length === keys.length;\n}\n\n// Return the data type of a value\nfunction getType(v) {\n if (v === null) return \"null\";\n if (Array.isArray(v)) return \"array\";\n const t = typeof v;\n if ([\"string\", \"number\", \"boolean\", \"object\", \"undefined\"].includes(t)) {\n return t;\n }\n return \"unknown\";\n}\n\n// At least one element of actual must match the expected condition/value\nfunction elemMatch(actual, expected) {\n if (!Array.isArray(actual)) return false;\n const check = isOperatorObject(expected) ? v => evalConditionValue(expected, v) : v => evalCondition(v, expected);\n for (let i = 0; i < actual.length; i++) {\n if (actual[i] && check(actual[i])) {\n return true;\n }\n }\n return false;\n}\nfunction isIn(actual, expected) {\n // Do an intersection is attribute is an array\n if (Array.isArray(actual)) {\n return actual.some(el => expected.includes(el));\n }\n return expected.includes(actual);\n}\n\n// Evaluate a single operator condition\nfunction evalOperatorCondition(operator, actual, expected) {\n switch (operator) {\n case \"$veq\":\n return paddedVersionString(actual) === paddedVersionString(expected);\n case \"$vne\":\n return paddedVersionString(actual) !== paddedVersionString(expected);\n case \"$vgt\":\n return paddedVersionString(actual) > paddedVersionString(expected);\n case \"$vgte\":\n return paddedVersionString(actual) >= paddedVersionString(expected);\n case \"$vlt\":\n return paddedVersionString(actual) < paddedVersionString(expected);\n case \"$vlte\":\n return paddedVersionString(actual) <= paddedVersionString(expected);\n case \"$eq\":\n return actual === expected;\n case \"$ne\":\n return actual !== expected;\n case \"$lt\":\n return actual < expected;\n case \"$lte\":\n return actual <= expected;\n case \"$gt\":\n return actual > expected;\n case \"$gte\":\n return actual >= expected;\n case \"$exists\":\n // Using `!=` and `==` instead of strict checks so it also matches for undefined\n return expected ? actual != null : actual == null;\n case \"$in\":\n if (!Array.isArray(expected)) return false;\n return isIn(actual, expected);\n case \"$nin\":\n if (!Array.isArray(expected)) return false;\n return !isIn(actual, expected);\n case \"$not\":\n return !evalConditionValue(expected, actual);\n case \"$size\":\n if (!Array.isArray(actual)) return false;\n return evalConditionValue(expected, actual.length);\n case \"$elemMatch\":\n return elemMatch(actual, expected);\n case \"$all\":\n if (!Array.isArray(actual)) return false;\n for (let i = 0; i < expected.length; i++) {\n let passed = false;\n for (let j = 0; j < actual.length; j++) {\n if (evalConditionValue(expected[i], actual[j])) {\n passed = true;\n break;\n }\n }\n if (!passed) return false;\n }\n return true;\n case \"$regex\":\n try {\n return getRegex(expected).test(actual);\n } catch (e) {\n return false;\n }\n case \"$type\":\n return getType(actual) === expected;\n default:\n console.error(\"Unknown operator: \" + operator);\n return false;\n }\n}\n\n// Recursive $or rule\nfunction evalOr(obj, conditions) {\n if (!conditions.length) return true;\n for (let i = 0; i < conditions.length; i++) {\n if (evalCondition(obj, conditions[i])) {\n return true;\n }\n }\n return false;\n}\n\n// Recursive $and rule\nfunction evalAnd(obj, conditions) {\n for (let i = 0; i < conditions.length; i++) {\n if (!evalCondition(obj, conditions[i])) {\n return false;\n }\n }\n return true;\n}\n//# sourceMappingURL=mongrule.js.map","import mutate from \"dom-mutator\";\nimport { chooseVariation, decrypt, getBucketRanges, getQueryStringOverride, getUrlRegExp, hash, inNamespace, inRange, isIncluded, isURLTargeted, loadSDKVersion } from \"./util\";\nimport { evalCondition } from \"./mongrule\";\nimport { refreshFeatures, subscribe, unsubscribe } from \"./feature-repository\";\nconst isBrowser = typeof window !== \"undefined\" && typeof document !== \"undefined\";\nconst SDK_VERSION = loadSDKVersion();\nexport class GrowthBook {\n // context is technically private, but some tools depend on it so we can't mangle the name\n // _ctx below is a clone of this property that we use internally\n\n // Properties and methods that start with \"_\" are mangled by Terser (saves ~150 bytes)\n\n // eslint-disable-next-line\n\n constructor(context) {\n context = context || {};\n // These properties are all initialized in the constructor instead of above\n // This saves ~80 bytes in the final output\n this.version = SDK_VERSION;\n this._ctx = this.context = context;\n this._renderer = null;\n this._trackedExperiments = new Set();\n this._trackedFeatures = {};\n this.debug = false;\n this._subscriptions = new Set();\n this._rtQueue = [];\n this._rtTimer = 0;\n this.ready = false;\n this._assigned = new Map();\n this._forcedFeatureValues = new Map();\n this._attributeOverrides = {};\n this._activeAutoExperiments = new Map();\n this._triggeredExpKeys = new Set();\n this._loadFeaturesCalled = false;\n if (context.remoteEval) {\n if (context.decryptionKey) {\n throw new Error(\"Encryption is not available for remoteEval\");\n }\n if (!context.clientKey) {\n throw new Error(\"Missing clientKey\");\n }\n let isGbHost = false;\n try {\n isGbHost = !!new URL(context.apiHost || \"\").hostname.match(/growthbook\\.io$/i);\n } catch (e) {\n // ignore invalid URLs\n }\n if (isGbHost) {\n throw new Error(\"Cannot use remoteEval on GrowthBook Cloud\");\n }\n } else {\n if (context.cacheKeyAttributes) {\n throw new Error(\"cacheKeyAttributes are only used for remoteEval\");\n }\n }\n if (context.features) {\n this.ready = true;\n }\n if (isBrowser && context.enableDevMode) {\n window._growthbook = this;\n document.dispatchEvent(new Event(\"gbloaded\"));\n }\n if (context.experiments) {\n this.ready = true;\n this._updateAllAutoExperiments();\n }\n if (context.clientKey && !context.remoteEval) {\n this._refresh({}, true, false);\n }\n }\n async loadFeatures(options) {\n if (options && options.autoRefresh) {\n // interpret deprecated autoRefresh option as subscribeToChanges\n this._ctx.subscribeToChanges = true;\n }\n this._loadFeaturesCalled = true;\n await this._refresh(options, true, true);\n if (this._canSubscribe()) {\n subscribe(this);\n }\n }\n async refreshFeatures(options) {\n await this._refresh(options, false, true);\n }\n getApiInfo() {\n return [this.getApiHosts().apiHost, this.getClientKey()];\n }\n getApiHosts() {\n const defaultHost = this._ctx.apiHost || \"https://cdn.growthbook.io\";\n return {\n apiHost: defaultHost.replace(/\\/*$/, \"\"),\n streamingHost: (this._ctx.streamingHost || defaultHost).replace(/\\/*$/, \"\"),\n apiRequestHeaders: this._ctx.apiHostRequestHeaders,\n streamingHostRequestHeaders: this._ctx.streamingHostRequestHeaders\n };\n }\n getClientKey() {\n return this._ctx.clientKey || \"\";\n }\n isRemoteEval() {\n return this._ctx.remoteEval || false;\n }\n getCacheKeyAttributes() {\n return this._ctx.cacheKeyAttributes;\n }\n async _refresh(options, allowStale, updateInstance) {\n options = options || {};\n if (!this._ctx.clientKey) {\n throw new Error(\"Missing clientKey\");\n }\n await refreshFeatures(this, options.timeout, options.skipCache || this._ctx.enableDevMode, allowStale, updateInstance, this._ctx.backgroundSync !== false);\n }\n _render() {\n if (this._renderer) {\n this._renderer();\n }\n }\n setFeatures(features) {\n this._ctx.features = features;\n this.ready = true;\n this._render();\n }\n async setEncryptedFeatures(encryptedString, decryptionKey, subtle) {\n const featuresJSON = await decrypt(encryptedString, decryptionKey || this._ctx.decryptionKey, subtle);\n this.setFeatures(JSON.parse(featuresJSON));\n }\n setExperiments(experiments) {\n this._ctx.experiments = experiments;\n this.ready = true;\n this._updateAllAutoExperiments();\n }\n async setEncryptedExperiments(encryptedString, decryptionKey, subtle) {\n const experimentsJSON = await decrypt(encryptedString, decryptionKey || this._ctx.decryptionKey, subtle);\n this.setExperiments(JSON.parse(experimentsJSON));\n }\n setAttributes(attributes) {\n this._ctx.attributes = attributes;\n if (this._ctx.remoteEval) {\n this._refreshForRemoteEval();\n return;\n }\n this._render();\n this._updateAllAutoExperiments();\n }\n setAttributeOverrides(overrides) {\n this._attributeOverrides = overrides;\n if (this._ctx.remoteEval) {\n this._refreshForRemoteEval();\n return;\n }\n this._render();\n this._updateAllAutoExperiments();\n }\n setForcedVariations(vars) {\n this._ctx.forcedVariations = vars || {};\n if (this._ctx.remoteEval) {\n this._refreshForRemoteEval();\n return;\n }\n this._render();\n this._updateAllAutoExperiments();\n }\n\n // eslint-disable-next-line\n setForcedFeatures(map) {\n this._forcedFeatureValues = map;\n this._render();\n }\n setURL(url) {\n this._ctx.url = url;\n if (this._ctx.remoteEval) {\n this._refreshForRemoteEval().then(() => this._updateAllAutoExperiments(true));\n return;\n }\n this._updateAllAutoExperiments(true);\n }\n getAttributes() {\n return {\n ...this._ctx.attributes,\n ...this._attributeOverrides\n };\n }\n getForcedVariations() {\n return this._ctx.forcedVariations || {};\n }\n getForcedFeatures() {\n // eslint-disable-next-line\n return this._forcedFeatureValues || new Map();\n }\n getUrl() {\n return this._ctx.url || \"\";\n }\n getFeatures() {\n return this._ctx.features || {};\n }\n getExperiments() {\n return this._ctx.experiments || [];\n }\n subscribe(cb) {\n this._subscriptions.add(cb);\n return () => {\n this._subscriptions.delete(cb);\n };\n }\n _canSubscribe() {\n return this._ctx.backgroundSync !== false && this._ctx.subscribeToChanges;\n }\n async _refreshForRemoteEval() {\n if (!this._ctx.remoteEval) return;\n if (!this._loadFeaturesCalled) return;\n await this._refresh({}, false, true).catch(() => {\n // Ignore errors\n });\n }\n getAllResults() {\n return new Map(this._assigned);\n }\n destroy() {\n // Release references to save memory\n this._subscriptions.clear();\n this._assigned.clear();\n this._trackedExperiments.clear();\n this._trackedFeatures = {};\n this._rtQueue = [];\n if (this._rtTimer) {\n clearTimeout(this._rtTimer);\n }\n unsubscribe(this);\n if (isBrowser && window._growthbook === this) {\n delete window._growthbook;\n }\n\n // Undo any active auto experiments\n this._activeAutoExperiments.forEach(exp => {\n exp.undo();\n });\n this._activeAutoExperiments.clear();\n this._triggeredExpKeys.clear();\n }\n setRenderer(renderer) {\n this._renderer = renderer;\n }\n forceVariation(key, variation) {\n this._ctx.forcedVariations = this._ctx.forcedVariations || {};\n this._ctx.forcedVariations[key] = variation;\n if (this._ctx.remoteEval) {\n this._refreshForRemoteEval();\n return;\n }\n this._updateAllAutoExperiments();\n this._render();\n }\n run(experiment) {\n const result = this._run(experiment, null);\n this._fireSubscriptions(experiment, result);\n return result;\n }\n triggerExperiment(key) {\n this._triggeredExpKeys.add(key);\n if (!this._ctx.experiments) return null;\n const experiments = this._ctx.experiments.filter(exp => exp.key === key);\n experiments.forEach(exp => {\n if (!exp.manual) return null;\n this._runAutoExperiment(exp);\n });\n }\n _runAutoExperiment(experiment, forceRerun) {\n const existing = this._activeAutoExperiments.get(experiment);\n\n // If this is a manual experiment and it's not already running, skip\n if (experiment.manual && !this._triggeredExpKeys.has(experiment.key) && !existing) return null;\n\n // Run the experiment\n const result = this.run(experiment);\n\n // A hash to quickly tell if the assigned value changed\n const valueHash = JSON.stringify(result.value);\n\n // If the changes are already active, no need to re-apply them\n if (!forceRerun && result.inExperiment && existing && existing.valueHash === valueHash) {\n return result;\n }\n\n // Undo any existing changes\n if (existing) this._undoActiveAutoExperiment(experiment);\n\n // Apply new changes\n if (result.inExperiment) {\n const undo = this._applyDOMChanges(result.value);\n if (undo) {\n this._activeAutoExperiments.set(experiment, {\n undo,\n valueHash\n });\n }\n }\n return result;\n }\n _undoActiveAutoExperiment(exp) {\n const data = this._activeAutoExperiments.get(exp);\n if (data) {\n data.undo();\n this._activeAutoExperiments.delete(exp);\n }\n }\n _updateAllAutoExperiments(forceRerun) {\n const experiments = this._ctx.experiments || [];\n\n // Stop any experiments that are no longer defined\n const keys = new Set(experiments);\n this._activeAutoExperiments.forEach((v, k) => {\n if (!keys.has(k)) {\n v.undo();\n this._activeAutoExperiments.delete(k);\n }\n });\n\n // Re-run all new/updated experiments\n experiments.forEach(exp => {\n this._runAutoExperiment(exp, forceRerun);\n });\n }\n _fireSubscriptions(experiment, result) {\n const key = experiment.key;\n\n // If assigned variation has changed, fire subscriptions\n const prev = this._assigned.get(key);\n // TODO: what if the experiment definition has changed?\n if (!prev || prev.result.inExperiment !== result.inExperiment || prev.result.variationId !== result.variationId) {\n this._assigned.set(key, {\n experiment,\n result\n });\n this._subscriptions.forEach(cb => {\n try {\n cb(experiment, result);\n } catch (e) {\n console.error(e);\n }\n });\n }\n }\n _trackFeatureUsage(key, res) {\n // Don't track feature usage that was forced via an override\n if (res.source === \"override\") return;\n\n // Only track a feature once, unless the assigned value changed\n const stringifiedValue = JSON.stringify(res.value);\n if (this._trackedFeatures[key] === stringifiedValue) return;\n this._trackedFeatures[key] = stringifiedValue;\n\n // Fire user-supplied callback\n if (this._ctx.onFeatureUsage) {\n try {\n this._ctx.onFeatureUsage(key, res);\n } catch (e) {\n // Ignore feature usage callback errors\n }\n }\n\n // In browser environments, queue up feature usage to be tracked in batches\n if (!isBrowser || !window.fetch) return;\n this._rtQueue.push({\n key,\n on: res.on\n });\n if (!this._rtTimer) {\n this._rtTimer = window.setTimeout(() => {\n // Reset the queue\n this._rtTimer = 0;\n const q = [...this._rtQueue];\n this._rtQueue = [];\n\n // Skip logging if a real-time usage key is not configured\n if (!this._ctx.realtimeKey) return;\n window.fetch(\"https://rt.growthbook.io/?key=\".concat(this._ctx.realtimeKey, \"&events=\").concat(encodeURIComponent(JSON.stringify(q))), {\n cache: \"no-cache\",\n mode: \"no-cors\"\n }).catch(() => {\n // TODO: retry in case of network errors?\n });\n }, this._ctx.realtimeInterval || 2000);\n }\n }\n _getFeatureResult(key, value, source, ruleId, experiment, result) {\n const ret = {\n value,\n on: !!value,\n off: !value,\n source,\n ruleId: ruleId || \"\"\n };\n if (experiment) ret.experiment = experiment;\n if (result) ret.experimentResult = result;\n\n // Track the usage of this feature in real-time\n this._trackFeatureUsage(key, ret);\n return ret;\n }\n isOn(key) {\n return this.evalFeature(key).on;\n }\n isOff(key) {\n return this.evalFeature(key).off;\n }\n getFeatureValue(key, defaultValue) {\n const value = this.evalFeature(key).value;\n return value === null ? defaultValue : value;\n }\n\n /**\n * @deprecated Use {@link evalFeature}\n * @param id\n */\n // eslint-disable-next-line\n feature(id) {\n return this.evalFeature(id);\n }\n evalFeature(id) {\n // Global override\n if (this._forcedFeatureValues.has(id)) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Global override\", {\n id,\n value: this._forcedFeatureValues.get(id)\n });\n return this._getFeatureResult(id, this._forcedFeatureValues.get(id), \"override\");\n }\n\n // Unknown feature id\n if (!this._ctx.features || !this._ctx.features[id]) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Unknown feature\", {\n id\n });\n return this._getFeatureResult(id, null, \"unknownFeature\");\n }\n\n // Get the feature\n const feature = this._ctx.features[id];\n\n // Loop through the rules\n if (feature.rules) {\n for (const rule of feature.rules) {\n // If it's a conditional rule, skip if the condition doesn't pass\n if (rule.condition && !this._conditionPasses(rule.condition)) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Skip rule because of condition\", {\n id,\n rule\n });\n continue;\n }\n // If there are filters for who is included (e.g. namespaces)\n if (rule.filters && this._isFilteredOut(rule.filters)) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Skip rule because of filters\", {\n id,\n rule\n });\n continue;\n }\n\n // Feature value is being forced\n if (\"force\" in rule) {\n // If this is a percentage rollout, skip if not included\n if (!this._isIncludedInRollout(rule.seed || id, rule.hashAttribute, rule.range, rule.coverage, rule.hashVersion)) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Skip rule because user not included in rollout\", {\n id,\n rule\n });\n continue;\n }\n process.env.NODE_ENV !== \"production\" && this.log(\"Force value from rule\", {\n id,\n rule\n });\n\n // If this was a remotely evaluated experiment, fire the tracking callbacks\n if (rule.tracks) {\n rule.tracks.forEach(t => {\n this._track(t.experiment, t.result);\n });\n }\n return this._getFeatureResult(id, rule.force, \"force\", rule.id);\n }\n if (!rule.variations) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Skip invalid rule\", {\n id,\n rule\n });\n continue;\n }\n // For experiment rules, run an experiment\n const exp = {\n variations: rule.variations,\n key: rule.key || id\n };\n if (\"coverage\" in rule) exp.coverage = rule.coverage;\n if (rule.weights) exp.weights = rule.weights;\n if (rule.hashAttribute) exp.hashAttribute = rule.hashAttribute;\n if (rule.namespace) exp.namespace = rule.namespace;\n if (rule.meta) exp.meta = rule.meta;\n if (rule.ranges) exp.ranges = rule.ranges;\n if (rule.name) exp.name = rule.name;\n if (rule.phase) exp.phase = rule.phase;\n if (rule.seed) exp.seed = rule.seed;\n if (rule.hashVersion) exp.hashVersion = rule.hashVersion;\n if (rule.filters) exp.filters = rule.filters;\n\n // Only return a value if the user is part of the experiment\n const res = this._run(exp, id);\n this._fireSubscriptions(exp, res);\n if (res.inExperiment && !res.passthrough) {\n return this._getFeatureResult(id, res.value, \"experiment\", rule.id, exp, res);\n }\n }\n }\n process.env.NODE_ENV !== \"production\" && this.log(\"Use default value\", {\n id,\n value: feature.defaultValue\n });\n\n // Fall back to using the default value\n return this._getFeatureResult(id, feature.defaultValue === undefined ? null : feature.defaultValue, \"defaultValue\");\n }\n _isIncludedInRollout(seed, hashAttribute, range, coverage, hashVersion) {\n if (!range && coverage === undefined) return true;\n const {\n hashValue\n } = this._getHashAttribute(hashAttribute);\n if (!hashValue) {\n return false;\n }\n const n = hash(seed, hashValue, hashVersion || 1);\n if (n === null) return false;\n return range ? inRange(n, range) : coverage !== undefined ? n <= coverage : true;\n }\n _conditionPasses(condition) {\n return evalCondition(this.getAttributes(), condition);\n }\n _isFilteredOut(filters) {\n return filters.some(filter => {\n const {\n hashValue\n } = this._getHashAttribute(filter.attribute);\n if (!hashValue) return true;\n const n = hash(filter.seed, hashValue, filter.hashVersion || 2);\n if (n === null) return true;\n return !filter.ranges.some(r => inRange(n, r));\n });\n }\n _run(experiment, featureId) {\n const key = experiment.key;\n const numVariations = experiment.variations.length;\n\n // 1. If experiment has less than 2 variations, return immediately\n if (numVariations < 2) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Invalid experiment\", {\n id: key\n });\n return this._getResult(experiment, -1, false, featureId);\n }\n\n // 2. If the context is disabled, return immediately\n if (this._ctx.enabled === false) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Context disabled\", {\n id: key\n });\n return this._getResult(experiment, -1, false, featureId);\n }\n\n // 2.5. Merge in experiment overrides from the context\n experiment = this._mergeOverrides(experiment);\n\n // 3. If a variation is forced from a querystring, return the forced variation\n const qsOverride = getQueryStringOverride(key, this._getContextUrl(), numVariations);\n if (qsOverride !== null) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Force via querystring\", {\n id: key,\n variation: qsOverride\n });\n return this._getResult(experiment, qsOverride, false, featureId);\n }\n\n // 4. If a variation is forced in the context, return the forced variation\n if (this._ctx.forcedVariations && key in this._ctx.forcedVariations) {\n const variation = this._ctx.forcedVariations[key];\n process.env.NODE_ENV !== \"production\" && this.log(\"Force via dev tools\", {\n id: key,\n variation\n });\n return this._getResult(experiment, variation, false, featureId);\n }\n\n // 5. Exclude if a draft experiment or not active\n if (experiment.status === \"draft\" || experiment.active === false) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Skip because inactive\", {\n id: key\n });\n return this._getResult(experiment, -1, false, featureId);\n }\n\n // 6. Get the hash attribute and return if empty\n const {\n hashValue\n } = this._getHashAttribute(experiment.hashAttribute);\n if (!hashValue) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Skip because missing hashAttribute\", {\n id: key\n });\n return this._getResult(experiment, -1, false, featureId);\n }\n\n // 7. Exclude if user is filtered out (used to be called \"namespace\")\n if (experiment.filters) {\n if (this._isFilteredOut(experiment.filters)) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Skip because of filters\", {\n id: key\n });\n return this._getResult(experiment, -1, false, featureId);\n }\n } else if (experiment.namespace && !inNamespace(hashValue, experiment.namespace)) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Skip because of namespace\", {\n id: key\n });\n return this._getResult(experiment, -1, false, featureId);\n }\n\n // 7.5. Exclude if experiment.include returns false or throws\n if (experiment.include && !isIncluded(experiment.include)) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Skip because of include function\", {\n id: key\n });\n return this._getResult(experiment, -1, false, featureId);\n }\n\n // 8. Exclude if condition is false\n if (experiment.condition && !this._conditionPasses(experiment.condition)) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Skip because of condition\", {\n id: key\n });\n return this._getResult(experiment, -1, false, featureId);\n }\n\n // 8.1. Exclude if user is not in a required group\n if (experiment.groups && !this._hasGroupOverlap(experiment.groups)) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Skip because of groups\", {\n id: key\n });\n return this._getResult(experiment, -1, false, featureId);\n }\n\n // 8.2. Old style URL targeting\n if (experiment.url && !this._urlIsValid(experiment.url)) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Skip because of url\", {\n id: key\n });\n return this._getResult(experiment, -1, false, featureId);\n }\n\n // 8.3. New, more powerful URL targeting\n if (experiment.urlPatterns && !isURLTargeted(this._getContextUrl(), experiment.urlPatterns)) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Skip because of url targeting\", {\n id: key\n });\n return this._getResult(experiment, -1, false, featureId);\n }\n\n // 9. Get bucket ranges and choose variation\n const n = hash(experiment.seed || key, hashValue, experiment.hashVersion || 1);\n if (n === null) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Skip because of invalid hash version\", {\n id: key\n });\n return this._getResult(experiment, -1, false, featureId);\n }\n const ranges = experiment.ranges || getBucketRanges(numVariations, experiment.coverage === undefined ? 1 : experiment.coverage, experiment.weights);\n const assigned = chooseVariation(n, ranges);\n\n // 10. Return if not in experiment\n if (assigned < 0) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Skip because of coverage\", {\n id: key\n });\n return this._getResult(experiment, -1, false, featureId);\n }\n\n // 11. Experiment has a forced variation\n if (\"force\" in experiment) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Force variation\", {\n id: key,\n variation: experiment.force\n });\n return this._getResult(experiment, experiment.force === undefined ? -1 : experiment.force, false, featureId);\n }\n\n // 12. Exclude if in QA mode\n if (this._ctx.qaMode) {\n process.env.NODE_ENV !== \"production\" && this.log(\"Skip because QA mode\", {\n id: key\n });\n return this._getResult(experiment, -1, false, featureId);\n }\n\n // 12.5. Exclude if experiment is stopped\n if (experiment.status === \"stopped\") {\n process.env.NODE_ENV !== \"production\" && this.log(\"Skip because stopped\", {\n id: key\n });\n return this._getResult(experiment, -1, false, featureId);\n }\n\n // 13. Build the result object\n const result = this._getResult(experiment, assigned, true, featureId, n);\n\n // 14. Fire the tracking callback\n this._track(experiment, result);\n\n // 15. Return the result\n process.env.NODE_ENV !== \"production\" && this.log(\"In experiment\", {\n id: key,\n variation: result.variationId\n });\n return result;\n }\n log(msg, ctx) {\n if (!this.debug) return;\n if (this._ctx.log) this._ctx.log(msg, ctx);else console.log(msg, ctx);\n }\n _track(experiment, result) {\n if (!this._ctx.trackingCallback) return;\n const key = experiment.key;\n\n // Make sure a tracking callback is only fired once per unique experiment\n const k = result.hashAttribute + result.hashValue + key + result.variationId;\n if (this._trackedExperiments.has(k)) return;\n this._trackedExperiments.add(k);\n try {\n this._ctx.trackingCallback(experiment, result);\n } catch (e) {\n console.error(e);\n }\n }\n _mergeOverrides(experiment) {\n const key = experiment.key;\n const o = this._ctx.overrides;\n if (o && o[key]) {\n experiment = Object.assign({}, experiment, o[key]);\n if (typeof experiment.url === \"string\") {\n experiment.url = getUrlRegExp(\n // eslint-disable-next-line\n experiment.url);\n }\n }\n return experiment;\n }\n _getHashAttribute(attr) {\n const hashAttribute = attr || \"id\";\n let hashValue = \"\";\n if (this._attributeOverrides[hashAttribute]) {\n hashValue = this._attributeOverrides[hashAttribute];\n } else if (this._ctx.attributes) {\n hashValue = this._ctx.attributes[hashAttribute] || \"\";\n } else if (this._ctx.user) {\n hashValue = this._ctx.user[hashAttribute] || \"\";\n }\n return {\n hashAttribute,\n hashValue\n };\n }\n _getResult(experiment, variationIndex, hashUsed, featureId, bucket) {\n let inExperiment = true;\n // If assigned variation is not valid, use the baseline and mark the user as not in the experiment\n if (variationIndex < 0 || variationIndex >= experiment.variations.length) {\n variationIndex = 0;\n inExperiment = false;\n }\n const {\n hashAttribute,\n hashValue\n } = this._getHashAttribute(experiment.hashAttribute);\n const meta = experiment.meta ? experiment.meta[variationIndex] : {};\n const res = {\n key: meta.key || \"\" + variationIndex,\n featureId,\n inExperiment,\n hashUsed,\n variationId: variationIndex,\n value: experiment.variations[variationIndex],\n hashAttribute,\n hashValue\n };\n if (meta.name) res.name = meta.name;\n if (bucket !== undefined) res.bucket = bucket;\n if (meta.passthrough) res.passthrough = meta.passthrough;\n return res;\n }\n _getContextUrl() {\n return this._ctx.url || (isBrowser ? window.location.href : \"\");\n }\n _urlIsValid(urlRegex) {\n const url = this._getContextUrl();\n if (!url) return false;\n const pathOnly = url.replace(/^https?:\\/\\//, \"\").replace(/^[^/]*\\//, \"/\");\n if (urlRegex.test(url)) return true;\n if (urlRegex.test(pathOnly)) return true;\n return false;\n }\n _hasGroupOverlap(expGroups) {\n const groups = this._ctx.groups || {};\n for (let i = 0; i < expGroups.length; i++) {\n if (groups[expGroups[i]]) return true;\n }\n return false;\n }\n _applyDOMChanges(changes) {\n if (!isBrowser) return;\n const undo = [];\n if (changes.css) {\n const s = document.createElement(\"style\");\n s.innerHTML = changes.css;\n document.head.appendChild(s);\n undo.push(() => s.remove());\n }\n if (changes.js) {\n const script = document.createElement(\"script\");\n script.innerHTML = changes.js;\n document.body.appendChild(script);\n undo.push(() => script.remove());\n }\n if (changes.domMutations) {\n changes.domMutations.forEach(mutation => {\n undo.push(mutate.declarative(mutation).revert);\n });\n }\n return () => {\n undo.forEach(fn => fn());\n };\n }\n}\n//# sourceMappingURL=GrowthBook.js.map","/*! js-cookie v3.0.5 | MIT */\n/* eslint-disable no-var */\nfunction assign (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n target[key] = source[key];\n }\n }\n return target\n}\n/* eslint-enable no-var */\n\n/* eslint-disable no-var */\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/* eslint-enable no-var */\n\n/* eslint-disable no-var */\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 jar[found] = converter.read(value, found);\n\n if (name === found) {\n break\n }\n } catch (e) {}\n }\n\n return name ? jar[name] : jar\n }\n\n return Object.create(\n {\n set,\n 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/* eslint-enable no-var */\n\nexport { api as default };\n","import Cookie from 'js-cookie';\n\nexport function getPersistentUuid (cookieName = 'gb_uuid', expires = 400) {\n const persistedUuid = Cookie.get(cookieName);\n\n if (persistedUuid) {\n return persistedUuid;\n }\n\n const uuid = generateUuid();\n Cookie.set(cookieName, uuid, { expires });\n\n return uuid;\n}\n\nexport function generateUuid() {\n if (window?.crypto?.randomUUID) {\n return window.crypto.randomUUID();\n }\n\n return _uuidv4();\n}\n\nexport function _uuidv4() {\n return \"10000000-1000-4000-8000-100000000000\".replace(/[018]/g, c =>\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)\n );\n}\n","import Cookie from 'js-cookie';\n\nconst cookieName = (featureId) => `gb_${featureId}`;\n\nexport const saveFeatureValueToStorage = ({ featureId, variationValue, expires = 30 }) => {\n if (!featureId) {\n return;\n }\n\n Cookie.set(cookieName(featureId), variationValue, { expires });\n};\n\nexport const getFeatureValueFromStorage = (featureId) => {\n return Number(Cookie.get(cookieName(featureId))) || undefined;\n};\n","import { GrowthBook } from '@growthbook/growthbook';\n\nimport { getPersistentUuid } from '../helpers/uuid';\nimport { pushGtmEvent } from '..';\n\nimport { CONTROL_FEATURE_VALUE } from './constants';\nimport { getFeatureValueFromStorage, saveFeatureValueToStorage } from './storage';\n\nconst uuid = getPersistentUuid();\ntype GB = { growthbook: GrowthBook };\n\n\n/**\n * Growthbook.\n *\n * Usage:\n * import { _apipe } from 'utils';\n *\n * _apipe(\n * _initGrowthbook,\n * _getFeatureValue('test-feature-1'),\n * ({ featureValue }) => {\n * // your code based on {featureValue}\n * }\n * )();\n */\n\nexport const growthbook = new GrowthBook({\n apiHost: 'https://sb.uvo.tools',\n clientKey: 'sdk-IlH2sQzjWP6lGhlG',\n enableDevMode: false,\n subscribeToChanges: true,\n attributes: {\n id: uuid,\n url: window.location.href,\n },\n trackingCallback: (experiment, result) => {\n console.log('Viewed Experiment', {\n experimentId: experiment.key,\n variationId: result.value,\n });\n\n const featureValue = getFeatureValueFromStorage(result.featureId);\n\n if (featureValue === undefined) {\n // Explicit set value to storage if growthbook unexpectedly returns the wrong result\n saveFeatureValueToStorage({\n featureId: result.featureId,\n variationValue: result.value,\n });\n }\n\n pushGtmEvent('optimize_exp_number', {\n experimentId: experiment.key,\n uuid,\n value: featureValue || result.value,\n });\n },\n});\n\n/**\n * Load features\n */\nexport const _initGrowthbook = async (): Promise => {\n await growthbook.loadFeatures();\n return { growthbook };\n};\n\nexport const _getFeatureValue =\n (featureId, defaultDefaultValue = CONTROL_FEATURE_VALUE) =>\n async ({ growthbook }: GB) => {\n const featureValue = await growthbook.getFeatureValue(featureId, defaultDefaultValue);\n return { growthbook, featureValue: getFeatureValueFromStorage(featureId) || featureValue };\n };\n","import { _apipe, _when } from '..';\n\nimport type { ExperimentConfig } from './constants';\nimport { CONTROL_FEATURE_VALUE,DEFAULT_FEATURE_VALUE } from './constants';\nimport { _getFeatureValue, _initGrowthbook } from './index';\n\nconst currentPathname = window.location.pathname;\n\nfunction runSplitUrlExperiment({ featureId, alternativeUrls }) {\n const timeoutId = setTimeout(() => {\n removeAntiFlicker();\n }, 5000);\n\n const runExpriment = ({ featureValue }) => {\n /**\n * Є домовленість, що CONTROL_FEATURE_VALUE (основна сторінка) це завжди 1.\n * Отже альтернативні сторінки починається з 2.\n */\n const alternativeUrl = alternativeUrls[featureValue - 2];\n\n if (alternativeUrl === currentPathname) {\n removeAntiFlicker();\n clearTimeout(timeoutId);\n } else {\n window.location.assign(alternativeUrl);\n }\n };\n\n return _apipe(\n _initGrowthbook,\n _getFeatureValue(featureId, DEFAULT_FEATURE_VALUE),\n /**\n * Зайшов на сторінку на якій запускається експеримент і випала вона\n * Або не цільова сторінка (будь-яка інша)\n * Прибираємо antiflicker\n */\n _when(\n ({ featureValue }) =>\n featureValue === DEFAULT_FEATURE_VALUE || featureValue === CONTROL_FEATURE_VALUE,\n removeAntiFlicker,\n ),\n // Сторінка на якій запускається експеримент (alternativeUrls)\n _when(\n ({ featureValue }) =>\n featureValue !== DEFAULT_FEATURE_VALUE && featureValue !== CONTROL_FEATURE_VALUE,\n runExpriment,\n ),\n )();\n}\n\nif (window.SplitUrlExperiments && window.SplitUrlExperiments.length) {\n window.SplitUrlExperiments.forEach(experiment => {\n if (\n experiment.targetPathname === currentPathname ||\n // Щоб запустився експеримент на альтернативних сторінках і пушнувся івент\n experiment.alternativeUrls.includes(currentPathname)\n ) {\n runSplitUrlExperiment(experiment);\n }\n });\n}\n\nfunction removeAntiFlicker(state?: ExperimentConfig) {\n const antiFlickerStyle = document.getElementById('antiFlicker');\n\n if (antiFlickerStyle && antiFlickerStyle.parentNode) {\n antiFlickerStyle.parentNode.removeChild(antiFlickerStyle);\n }\n\n return state;\n}\n"],"names":["DEFAULT_FEATURE_VALUE","CONTROL_FEATURE_VALUE","cacheSettings","polyfills","helpers","_ref","host","clientKey","headers","_ref2","payload","options","_ref3","idleTimeout","onVisibilityChange","onVisible","onHidden","subscribedInstances","cacheInitialized","cache","activeFetches","streams","supportsSSE","refreshFeatures","instance","timeout","skipCache","allowStale","updateInstance","backgroundSync","data","fetchFeaturesWithCache","refreshInstance","subscribe","key","getKey","subs","unsubscribe","s","channel","disableChannel","enableChannel","updatePersistentCache","cacheKey","getCacheKey","now","initializeCache","existing","fetchFeatures","startAutoRefresh","promiseTimeout","apiHost","baseKey","attributes","cacheKeyAttributes","ca","fv","url","promise","resolve","resolved","timer","finish","value","parsed","_ref4","cleanupCache","cleanupFn","entriesWithTimestamps","_ref5","a","b","entriesToRemoveCount","i","onNewFeatureData","version","staleAt","instances","apiRequestHeaders","remoteEval","res","e","streamingHost","streamingHostRequestHeaders","event","json","onSSEError","delay","validAttributeName","nullController","elements","mutations","getObserverInit","attr","getElementRecord","element","record","createElementPropertyRecord","el","getCurrentValue","setValue","mutationRunner","currentValue","queueIfNeeded","val","currentVal","runDOMUpdates","htmlMutationRunner","m","getTransformedHTML","classMutationRunner","attrMutationRunner","_loadDOMNodes","parentSelector","insertBeforeSelector","parentNode","insertBeforeNode","positionMutationRunner","selectors","newNodes","getHTMLValue","setHTMLValue","getElementHTMLRecord","elementRecord","getElementPosition","setElementPosition","getElementPositionRecord","setClassValue","getClassValue","getElementClassRecord","getAttrValue","attrName","_el$getAttribute","setAttrValue","getElementAttributeRecord","deleteElementPropertyRecord","_element$html","_element$html$observe","_element$classes","_element$classes$obse","_element$position","_element$position$obs","_element$attributes","_element$attributes$a","_element$attributes$a2","transformContainer","html","setPropertyValue","startMutating","mutation","stopMutating","index","refreshElementsSet","existingElements","matchingElements","revertMutation","refreshAllElementSets","observer","connectGlobalObserver","newMutation","selector","mutate","position","classes","attribute","classnames","mutatedClassnames","c","declarative","action","hashFnv32a","str","hval","l","hash","seed","getEqualWeights","n","inRange","range","inNamespace","hashValue","namespace","chooseVariation","ranges","getUrlRegExp","regexString","escaped","isURLTargeted","targets","hasIncludeRules","isIncluded","match","_evalURLTarget","_evalSimpleUrlPart","actual","pattern","isPath","_evalSimpleUrlTarget","expected","comps","v","k","type","regex","getBucketRanges","numVariations","coverage","weights","equal","totalWeight","w","sum","cumulative","start","getQueryStringOverride","id","search","kv","include","base64ToBuf","decrypt","encryptedString","decryptionKey","subtle","iv","cipherText","plainTextBuffer","paddedVersionString","input","parts","loadSDKVersion","_regexCache","evalCondition","obj","condition","evalOr","evalAnd","evalConditionValue","getPath","path","current","getRegex","isOperatorObject","op","evalOperatorCondition","keys","getType","t","elemMatch","check","isIn","operator","passed","j","conditions","isBrowser","SDK_VERSION","GrowthBook","context","isGbHost","defaultHost","features","featuresJSON","experiments","experimentsJSON","overrides","vars","map","cb","exp","renderer","variation","experiment","result","forceRerun","valueHash","undo","prev","stringifiedValue","q","source","ruleId","ret","defaultValue","feature","rule","hashAttribute","hashVersion","filters","filter","r","featureId","qsOverride","assigned","msg","ctx","o","variationIndex","hashUsed","bucket","inExperiment","meta","urlRegex","pathOnly","expGroups","groups","changes","script","fn","assign","target","defaultConverter","init","converter","defaultAttributes","set","name","stringifiedAttributes","attributeName","get","cookies","jar","found","api","getPersistentUuid","cookieName","expires","persistedUuid","Cookie","uuid","generateUuid","_a","_uuidv4","saveFeatureValueToStorage","variationValue","getFeatureValueFromStorage","growthbook","featureValue","pushGtmEvent","_initGrowthbook","_getFeatureValue","defaultDefaultValue","currentPathname","runSplitUrlExperiment","alternativeUrls","timeoutId","removeAntiFlicker","runExpriment","alternativeUrl","_apipe","_when","state","antiFlickerStyle"],"mappings":"8DACO,MAAMA,EAAwB,EAExBC,EAAwB,ECF/BC,EAAgB,CAEpB,SAAU,IAAO,GACjB,SAAU,kBACV,eAAgB,GAChB,WAAY,GACZ,mBAAoB,GACpB,mBAAoB,GACtB,EACMC,EAAY,CAChB,MAAO,WAAW,MAAQ,WAAW,MAAM,KAAK,UAAU,EAAI,OAC9D,aAAc,WAAW,OAAS,WAAW,OAAO,OAAS,OAC7D,YAAa,WAAW,WAC1B,EACaC,EAAU,CACrB,kBAAmBC,GAAQ,CACzB,GAAI,CACF,KAAAC,EACA,UAAAC,EACA,QAAAC,CACD,EAAGH,EACJ,OAAOF,EAAU,MAAM,GAAG,OAAOG,EAAM,gBAAgB,EAAE,OAAOC,CAAS,EAAG,CAC1E,QAAAC,CACN,CAAK,CACF,EACD,oBAAqBC,GAAS,CAC5B,GAAI,CACF,KAAAH,EACA,UAAAC,EACA,QAAAG,EACA,QAAAF,CACD,EAAGC,EACJ,MAAME,EAAU,CACd,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,GAAGH,CACJ,EACD,KAAM,KAAK,UAAUE,CAAO,CAClC,EACI,OAAOP,EAAU,MAAM,GAAG,OAAOG,EAAM,YAAY,EAAE,OAAOC,CAAS,EAAGI,CAAO,CAChF,EACD,gBAAiBC,GAAS,CACxB,GAAI,CACF,KAAAN,EACA,UAAAC,EACA,QAAAC,CACD,EAAGI,EACJ,OAAIJ,EACK,IAAIL,EAAU,YAAY,GAAG,OAAOG,EAAM,OAAO,EAAE,OAAOC,CAAS,EAAG,CAC3E,QAAAC,CACR,CAAO,EAEI,IAAIL,EAAU,YAAY,GAAG,OAAOG,EAAM,OAAO,EAAE,OAAOC,CAAS,CAAC,CAC5E,EACD,kBAAmB,IAAM,CACvB,IAAIM,EAEJ,GAAI,EADc,OAAO,OAAW,KAAe,OAAO,SAAa,KACvD,OAChB,MAAMC,EAAqB,IAAM,CAC3B,SAAS,kBAAoB,WAC/B,OAAO,aAAaD,CAAW,EAC/BE,MACS,SAAS,kBAAoB,WACtCF,EAAc,OAAO,WAAWG,GAAUd,EAAc,kBAAkB,EAElF,EACI,gBAAS,iBAAiB,mBAAoBY,CAAkB,EACzD,IAAM,SAAS,oBAAoB,mBAAoBA,CAAkB,CACjF,EACD,iBAAkB,IAAM,CAEvB,CACH,EACA,GAAI,CACE,WAAW,eACbX,EAAU,aAAe,WAAW,aAExC,MAAY,CAEZ,CAGA,MAAMc,EAAsB,IAAI,IAChC,IAAIC,GAAmB,GACvB,MAAMC,EAAQ,IAAI,IACZC,EAAgB,IAAI,IACpBC,EAAU,IAAI,IACdC,EAAc,IAAI,IAmBjB,eAAeC,GAAgBC,EAAUC,EAASC,EAAWC,EAAYC,EAAgBC,EAAgB,CACzGA,IACH3B,EAAc,eAAiB,IAEjC,MAAM4B,EAAO,MAAMC,GAAuBP,EAAUG,EAAYF,EAASC,CAAS,EAClFE,GAAkBE,GAAS,MAAME,GAAgBR,EAAUM,CAAI,CACjE,CAGO,SAASG,GAAUT,EAAU,CAClC,MAAMU,EAAMC,EAAOX,CAAQ,EACrBY,EAAOnB,EAAoB,IAAIiB,CAAG,GAAK,IAAI,IACjDE,EAAK,IAAIZ,CAAQ,EACjBP,EAAoB,IAAIiB,EAAKE,CAAI,CACnC,CACO,SAASC,GAAYb,EAAU,CACpCP,EAAoB,QAAQqB,GAAKA,EAAE,OAAOd,CAAQ,CAAC,CACrD,CACO,SAASR,IAAW,CACzBK,EAAQ,QAAQkB,GAAW,CACpBA,IACLA,EAAQ,MAAQ,OAChBC,GAAeD,CAAO,EAC1B,CAAG,CACH,CACO,SAASxB,IAAY,CAC1BM,EAAQ,QAAQkB,GAAW,CACpBA,GACDA,EAAQ,QAAU,QACtBE,EAAcF,CAAO,CACzB,CAAG,CACH,CAIA,eAAeG,IAAwB,CACrC,GAAI,CACF,GAAI,CAACvC,EAAU,aAAc,OAC7B,MAAMA,EAAU,aAAa,QAAQD,EAAc,SAAU,KAAK,UAAU,MAAM,KAAKiB,EAAM,QAAS,CAAA,CAAC,CAAC,CACzG,MAAW,CAEX,CACH,CACA,eAAeY,GAAuBP,EAAUG,EAAYF,EAASC,EAAW,CAC9E,MAAMQ,EAAMC,EAAOX,CAAQ,EACrBmB,EAAWC,EAAYpB,CAAQ,EAC/BqB,EAAM,IAAI,KAChB,MAAMC,GAAe,EACrB,MAAMC,EAAW5B,EAAM,IAAIwB,CAAQ,EACnC,OAAII,GAAY,CAACrB,IAAcC,GAAcoB,EAAS,QAAUF,IAE1DE,EAAS,KAAKzB,EAAY,IAAIY,CAAG,EAGjCa,EAAS,QAAUF,EACrBG,EAAcxB,CAAQ,EAItByB,GAAiBzB,CAAQ,EAEpBuB,EAAS,MAET,MAAMG,GAAeF,EAAcxB,CAAQ,EAAGC,CAAO,CAEhE,CACA,SAASU,EAAOX,EAAU,CACxB,KAAM,CAAC2B,EAAS5C,CAAS,EAAIiB,EAAS,WAAU,EAChD,MAAO,GAAG,OAAO2B,EAAS,IAAI,EAAE,OAAO5C,CAAS,CAClD,CACA,SAASqC,EAAYpB,EAAU,CAC7B,MAAM4B,EAAUjB,EAAOX,CAAQ,EAC/B,GAAI,CAACA,EAAS,aAAc,EAAE,OAAO4B,EACrC,MAAMC,EAAa7B,EAAS,gBACtB8B,EAAqB9B,EAAS,sBAAuB,GAAI,OAAO,KAAKA,EAAS,cAAa,CAAE,EAC7F+B,EAAK,CAAA,EACXD,EAAmB,QAAQpB,GAAO,CAChCqB,EAAGrB,CAAG,EAAImB,EAAWnB,CAAG,CAC5B,CAAG,EACD,MAAMsB,EAAKhC,EAAS,sBACdiC,EAAMjC,EAAS,SACrB,MAAO,GAAG,OAAO4B,EAAS,IAAI,EAAE,OAAO,KAAK,UAAU,CACpD,GAAAG,EACA,GAAAC,EACA,IAAAC,CACD,CAAA,CAAC,CACJ,CAKA,SAASP,GAAeQ,EAASjC,EAAS,CACxC,OAAO,IAAI,QAAQkC,GAAW,CAC5B,IAAIC,EAAW,GACXC,EACJ,MAAMC,EAAShC,GAAQ,CACjB8B,IACJA,EAAW,GACXC,GAAS,aAAaA,CAAK,EAC3BF,EAAQ7B,GAAQ,IAAI,EAC1B,EACQL,IACFoC,EAAQ,WAAW,IAAMC,EAAQ,EAAErC,CAAO,GAE5CiC,EAAQ,KAAK5B,GAAQgC,EAAOhC,CAAI,CAAC,EAAE,MAAM,IAAMgC,EAAM,CAAE,CAC3D,CAAG,CACH,CAGA,eAAehB,IAAkB,CAC/B,GAAI,CAAA5B,GACJ,CAAAA,GAAmB,GACnB,GAAI,CACF,GAAIf,EAAU,aAAc,CAC1B,MAAM4D,EAAQ,MAAM5D,EAAU,aAAa,QAAQD,EAAc,QAAQ,EACzE,GAAI6D,EAAO,CACT,MAAMC,EAAS,KAAK,MAAMD,CAAK,EAC3BC,GAAU,MAAM,QAAQA,CAAM,GAChCA,EAAO,QAAQC,GAAS,CACtB,GAAI,CAAC/B,EAAKJ,CAAI,EAAImC,EAClB9C,EAAM,IAAIe,EAAK,CACb,GAAGJ,EACH,QAAS,IAAI,KAAKA,EAAK,OAAO,CAC5C,CAAa,CACb,CAAW,EAEHoC,IACD,CACF,CACF,MAAW,CAEX,CACsC,CACrC,MAAMC,EAAY/D,EAAQ,oBACtB+D,IACF/D,EAAQ,iBAAmB+D,EAE9B,EACH,CAGA,SAASD,IAAe,CACtB,MAAME,EAAwB,MAAM,KAAKjD,EAAM,SAAS,EAAE,IAAIkD,GAAS,CACrE,GAAI,CAACnC,EAAK6B,CAAK,EAAIM,EACnB,MAAO,CACL,IAAAnC,EACA,QAAS6B,EAAM,QAAQ,QAAS,CACtC,CACA,CAAG,EAAE,KAAK,CAACO,EAAGC,IAAMD,EAAE,QAAUC,EAAE,OAAO,EACjCC,EAAuB,KAAK,IAAI,KAAK,IAAI,EAAGrD,EAAM,KAAOjB,EAAc,UAAU,EAAGiB,EAAM,IAAI,EACpG,QAASsD,EAAI,EAAGA,EAAID,EAAsBC,IACxCtD,EAAM,OAAOiD,EAAsBK,CAAC,EAAE,GAAG,CAE7C,CAGA,SAASC,GAAiBxC,EAAKS,EAAUb,EAAM,CAE7C,MAAM6C,EAAU7C,EAAK,aAAe,GAC9B8C,EAAU,IAAI,KAAK,KAAK,MAAQ1E,EAAc,QAAQ,EACtD6C,EAAW5B,EAAM,IAAIwB,CAAQ,EACnC,GAAII,GAAY4B,GAAW5B,EAAS,UAAY4B,EAAS,CACvD5B,EAAS,QAAU6B,EACnBlC,KACA,MACD,CAGDvB,EAAM,IAAIwB,EAAU,CAClB,KAAAb,EACA,QAAA6C,EACA,QAAAC,EACA,IAAKtD,EAAY,IAAIY,CAAG,CAC5B,CAAG,EACDgC,KAEAxB,KAGA,MAAMmC,EAAY5D,EAAoB,IAAIiB,CAAG,EAC7C2C,GAAaA,EAAU,QAAQrD,GAAYQ,GAAgBR,EAAUM,CAAI,CAAC,CAC5E,CACA,eAAeE,GAAgBR,EAAUM,EAAM,CAC7C,MAAOA,EAAK,qBAAuBN,EAAS,wBAAwBM,EAAK,qBAAsB,OAAW3B,EAAU,YAAY,EAAIqB,EAAS,eAAeM,EAAK,aAAeN,EAAS,eAAgB,CAAA,GACzM,MAAOM,EAAK,kBAAoBN,EAAS,qBAAqBM,EAAK,kBAAmB,OAAW3B,EAAU,YAAY,EAAIqB,EAAS,YAAYM,EAAK,UAAYN,EAAS,YAAa,CAAA,EACzL,CACA,eAAewB,EAAcxB,EAAU,CACrC,KAAM,CACJ,QAAA2B,EACA,kBAAA2B,CACJ,EAAMtD,EAAS,cACPjB,EAAYiB,EAAS,eACrBuD,EAAavD,EAAS,eACtBU,EAAMC,EAAOX,CAAQ,EACrBmB,EAAWC,EAAYpB,CAAQ,EACrC,IAAIkC,EAAUtC,EAAc,IAAIuB,CAAQ,EACxC,OAAKe,IAkBHA,GAjBgBqB,EAAa3E,EAAQ,oBAAoB,CACvD,KAAM+C,EACN,UAAA5C,EACA,QAAS,CACP,WAAYiB,EAAS,cAAe,EACpC,iBAAkBA,EAAS,oBAAqB,EAChD,eAAgB,MAAM,KAAKA,EAAS,kBAAiB,EAAG,SAAS,EACjE,IAAKA,EAAS,OAAQ,CACvB,EACD,QAASsD,CACf,CAAK,EAAI1E,EAAQ,kBAAkB,CAC7B,KAAM+C,EACN,UAAA5C,EACA,QAASuE,CACf,CAAK,GAGiB,KAAKE,IACjBA,EAAI,QAAQ,IAAI,eAAe,IAAM,WACvC1D,EAAY,IAAIY,CAAG,EAEd8C,EAAI,OACZ,EAAE,KAAKlD,IACN4C,GAAiBxC,EAAKS,EAAUb,CAAI,EACpCmB,GAAiBzB,CAAQ,EACzBJ,EAAc,OAAOuB,CAAQ,EACtBb,EACR,EAAE,MAAMmD,IAMP7D,EAAc,OAAOuB,CAAQ,EACtB,QAAQ,QAAQ,CAAA,CAAE,EAC1B,EACDvB,EAAc,IAAIuB,EAAUe,CAAO,GAE9B,MAAMA,CACf,CAIA,SAAST,GAAiBzB,EAAU,CAClC,MAAMU,EAAMC,EAAOX,CAAQ,EACrBmB,EAAWC,EAAYpB,CAAQ,EAC/B,CACJ,cAAA0D,EACA,4BAAAC,CACJ,EAAM3D,EAAS,cACPjB,EAAYiB,EAAS,eAC3B,GAAItB,EAAc,gBAAkBoB,EAAY,IAAIY,CAAG,GAAK/B,EAAU,YAAa,CACjF,GAAIkB,EAAQ,IAAIa,CAAG,EAAG,OACtB,MAAMK,EAAU,CACd,IAAK,KACL,KAAM2C,EACN,UAAA3E,EACA,QAAS4E,EACT,GAAIC,GAAS,CACX,GAAI,CACF,GAAIA,EAAM,OAAS,mBAAoB,CACrC,MAAMP,EAAY5D,EAAoB,IAAIiB,CAAG,EAC7C2C,GAAaA,EAAU,QAAQrD,GAAY,CACzCwB,EAAcxB,CAAQ,CACpC,CAAa,CACb,SAAqB4D,EAAM,OAAS,WAAY,CACpC,MAAMC,EAAO,KAAK,MAAMD,EAAM,IAAI,EAClCV,GAAiBxC,EAAKS,EAAU0C,CAAI,CACrC,CAED9C,EAAQ,OAAS,CAClB,MAAW,CAMV+C,GAAW/C,CAAO,CACnB,CACF,EACD,OAAQ,EACR,MAAO,QACb,EACIlB,EAAQ,IAAIa,EAAKK,CAAO,EACxBE,EAAcF,CAAO,CACtB,CACH,CACA,SAAS+C,GAAW/C,EAAS,CAC3B,GAAIA,EAAQ,QAAU,SACtBA,EAAQ,SACJA,EAAQ,OAAS,GAAKA,EAAQ,KAAOA,EAAQ,IAAI,aAAe,GAAG,CAErE,MAAMgD,EAAQ,KAAK,IAAI,EAAGhD,EAAQ,OAAS,CAAC,GAAK,IAAO,KAAK,OAAQ,EAAG,KACxEC,GAAeD,CAAO,EACtB,WAAW,IAAM,CACX,CAAC,OAAQ,QAAQ,EAAE,SAASA,EAAQ,KAAK,GAC7CE,EAAcF,CAAO,CACtB,EAAE,KAAK,IAAIgD,EAAO,GAAM,CAAC,CAC3B,CACH,CAEA,SAAS/C,GAAeD,EAAS,CAC1BA,EAAQ,MACbA,EAAQ,IAAI,OAAS,KACrBA,EAAQ,IAAI,QAAU,KACtBA,EAAQ,IAAI,QACZA,EAAQ,IAAM,KACVA,EAAQ,QAAU,WACpBA,EAAQ,MAAQ,YAEpB,CACA,SAASE,EAAcF,EAAS,CAC9BA,EAAQ,IAAMnC,EAAQ,gBAAgB,CACpC,KAAMmC,EAAQ,KACd,UAAWA,EAAQ,UACnB,QAASA,EAAQ,OACrB,CAAG,EACDA,EAAQ,MAAQ,SAChBA,EAAQ,IAAI,iBAAiB,WAAYA,EAAQ,EAAE,EACnDA,EAAQ,IAAI,iBAAiB,mBAAoBA,EAAQ,EAAE,EAC3DA,EAAQ,IAAI,QAAU,IAAM+C,GAAW/C,CAAO,EAC9CA,EAAQ,IAAI,OAAS,IAAM,CACzBA,EAAQ,OAAS,CACrB,CACA,CC7aA,IAAIiD,GAAqB,+BACrBC,EAAiB,CACnB,OAAQ,UAAkB,CAAE,CAC9B,EACIC,EAAwB,IAAI,IAC5BC,EAAyB,IAAI,IAEjC,SAASC,GAAgBC,EAAM,CAC7B,OAAOA,IAAS,OAAS,CACvB,UAAW,GACX,QAAS,GACT,WAAY,GACZ,cAAe,EACnB,EAAM,CACF,UAAW,GACX,QAAS,GACT,WAAY,GACZ,gBAAiB,CAACA,CAAI,CAC1B,CACA,CAEA,SAASC,EAAiBC,EAAS,CACjC,IAAIC,EAASN,EAAS,IAAIK,CAAO,EAEjC,OAAKC,IACHA,EAAS,CACP,QAASD,EACT,WAAY,CAAE,CACpB,EACIL,EAAS,IAAIK,EAASC,CAAM,GAGvBA,CACT,CAEA,SAASC,EAA4BC,EAAIL,EAAMM,EAAiBC,EAAUC,EAAgB,CACxF,IAAIC,EAAeH,EAAgBD,CAAE,EACjCF,EAAS,CACX,QAAS,GACT,cAAeM,EACf,aAAcA,EACd,UAAW,CAAE,EACb,GAAIJ,EACJ,iBAAkB,KAClB,SAAU,IAAI,iBAAiB,UAAY,CAKzC,GAAI,EAAAL,IAAS,YAAcG,EAAO,kBAA8B,CAAIH,IAAS,aAAYG,EAAO,iBAAmB,WAAW,UAAY,CACxIA,EAAO,iBAAmB,IAC3B,EAAE,GAAI,GACP,IAAIM,EAAeH,EAAgBD,CAAE,EACjCL,IAAS,YAAcS,EAAa,aAAeN,EAAO,aAAa,YAAcM,EAAa,mBAAqBN,EAAO,aAAa,kBAC3IM,IAAiBN,EAAO,eAC5BA,EAAO,cAAgBM,EACvBD,EAAeL,CAAM,GAC3B,CAAK,EACD,eAAgBK,EAChB,SAAUD,EACV,gBAAiBD,CACrB,EAEE,OAAIN,IAAS,YAAcK,EAAG,WAC5BF,EAAO,SAAS,QAAQE,EAAG,WAAY,CACrC,UAAW,GACX,QAAS,GACT,WAAY,GACZ,cAAe,EACrB,CAAK,EAEDF,EAAO,SAAS,QAAQE,EAAIN,GAAgBC,CAAI,CAAC,EAG5CG,CACT,CAEA,SAASO,EAAcC,EAAKR,EAAQ,CAClC,IAAIS,EAAaT,EAAO,gBAAgBA,EAAO,EAAE,EACjDA,EAAO,aAAeQ,EAElBA,GAAO,OAAOA,GAAQ,UACpB,CAACC,GAAcD,EAAI,aAAeC,EAAW,YAAcD,EAAI,mBAAqBC,EAAW,oBACjGT,EAAO,QAAU,GACjBU,MAEOF,IAAQC,IACjBT,EAAO,QAAU,GACjBU,KAEJ,CAEA,SAASC,GAAmBX,EAAQ,CAClC,IAAIQ,EAAMR,EAAO,cACjBA,EAAO,UAAU,QAAQ,SAAUY,EAAG,CACpC,OAAOJ,EAAMI,EAAE,OAAOJ,CAAG,CAC7B,CAAG,EACDD,EAAcM,GAAmBL,CAAG,EAAGR,CAAM,CAC/C,CAEA,SAASc,GAAoBd,EAAQ,CACnC,IAAIQ,EAAM,IAAI,IAAIR,EAAO,cAAc,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC,EACnEA,EAAO,UAAU,QAAQ,SAAUY,EAAG,CACpC,OAAOA,EAAE,OAAOJ,CAAG,CACvB,CAAG,EACDD,EAAc,MAAM,KAAKC,CAAG,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAAGR,CAAM,CACjE,CAEA,SAASe,GAAmBf,EAAQ,CAClC,IAAIQ,EAAMR,EAAO,cACjBA,EAAO,UAAU,QAAQ,SAAUY,EAAG,CACpC,OAAOJ,EAAMI,EAAE,OAAOJ,CAAG,CAC7B,CAAG,EACDD,EAAcC,EAAKR,CAAM,CAC3B,CAEA,SAASgB,GAAc3G,EAAM,CAC3B,IAAI4G,EAAiB5G,EAAK,eACtB6G,EAAuB7G,EAAK,qBAC5B8G,EAAa,SAAS,cAAcF,CAAc,EACtD,GAAI,CAACE,EAAY,OAAO,KACxB,IAAIC,EAAmBF,EAAuB,SAAS,cAAcA,CAAoB,EAAI,KAC7F,OAAIA,GAAwB,CAACE,EAAyB,KAC/C,CACL,WAAYD,EACZ,iBAAkBC,CACtB,CACA,CAEA,SAASC,GAAuBrB,EAAQ,CACtC,IAAIQ,EAAMR,EAAO,cACjBA,EAAO,UAAU,QAAQ,SAAUY,EAAG,CACpC,IAAIU,EAAYV,EAAE,SAEdW,EAAWP,GAAcM,CAAS,EAEtCd,EAAMe,GAAYf,CACtB,CAAG,EACDD,EAAcC,EAAKR,CAAM,CAC3B,CAEA,IAAIwB,GAAe,SAAsBtB,EAAI,CAC3C,OAAOA,EAAG,SACZ,EAEIuB,GAAe,SAAsBvB,EAAInC,EAAO,CAClD,OAAOmC,EAAG,UAAYnC,CACxB,EAEA,SAAS2D,GAAqB3B,EAAS,CACrC,IAAI4B,EAAgB7B,EAAiBC,CAAO,EAE5C,OAAK4B,EAAc,OACjBA,EAAc,KAAO1B,EAA4BF,EAAS,OAAQyB,GAAcC,GAAcd,EAAkB,GAG3GgB,EAAc,IACvB,CAEA,IAAIC,GAAqB,SAA4B1B,EAAI,CACvD,MAAO,CACL,WAAYA,EAAG,cACf,iBAAkBA,EAAG,kBACzB,CACA,EAEI2B,GAAqB,SAA4B3B,EAAInC,EAAO,CAC1DA,EAAM,kBAAoB,CAACA,EAAM,WAAW,SAASA,EAAM,gBAAgB,GAM/EA,EAAM,WAAW,aAAamC,EAAInC,EAAM,gBAAgB,CAC1D,EAEA,SAAS+D,GAAyB/B,EAAS,CACzC,IAAI4B,EAAgB7B,EAAiBC,CAAO,EAE5C,OAAK4B,EAAc,WACjBA,EAAc,SAAW1B,EAA4BF,EAAS,WAAY6B,GAAoBC,GAAoBR,EAAsB,GAGnIM,EAAc,QACvB,CAEA,IAAII,GAAgB,SAAuB7B,EAAIM,EAAK,CAClD,OAAOA,EAAMN,EAAG,UAAYM,EAAMN,EAAG,gBAAgB,OAAO,CAC9D,EAEI8B,GAAgB,SAAuB9B,EAAI,CAC7C,OAAOA,EAAG,SACZ,EAEA,SAAS+B,GAAsB/B,EAAI,CACjC,IAAIyB,EAAgB7B,EAAiBI,CAAE,EAEvC,OAAKyB,EAAc,UACjBA,EAAc,QAAU1B,EAA4BC,EAAI,QAAS8B,GAAeD,GAAejB,EAAmB,GAG7Ga,EAAc,OACvB,CAEA,IAAIO,GAAe,SAAsBC,EAAU,CACjD,OAAO,SAAUjC,EAAI,CACnB,IAAIkC,EAEJ,OAAQA,EAAmBlC,EAAG,aAAaiC,CAAQ,IAAM,KAAOC,EAAmB,IACvF,CACA,EAEIC,GAAe,SAAsBF,EAAU,CACjD,OAAO,SAAUjC,EAAIM,EAAK,CACxB,OAAOA,IAAQ,KAAON,EAAG,aAAaiC,EAAU3B,CAAG,EAAIN,EAAG,gBAAgBiC,CAAQ,CACtF,CACA,EAEA,SAASG,GAA0BpC,EAAIL,EAAM,CAC3C,IAAI8B,EAAgB7B,EAAiBI,CAAE,EAEvC,OAAKyB,EAAc,WAAW9B,CAAI,IAChC8B,EAAc,WAAW9B,CAAI,EAAII,EAA4BC,EAAIL,EAAMqC,GAAarC,CAAI,EAAGwC,GAAaxC,CAAI,EAAGkB,EAAkB,GAG5HY,EAAc,WAAW9B,CAAI,CACtC,CAEA,SAAS0C,GAA4BrC,EAAIL,EAAM,CAC7C,IAAIE,EAAUL,EAAS,IAAIQ,CAAE,EAC7B,GAAKH,EAEL,GAAIF,IAAS,OAAQ,CACnB,IAAI2C,EAAeC,GAElBD,EAAgBzC,EAAQ,OAAS,OAAiB0C,EAAwBD,EAAc,WAAa,MAAgBC,EAAsB,WAAU,EACtJ,OAAO1C,EAAQ,IACnB,SAAaF,IAAS,QAAS,CAC3B,IAAI6C,EAAkBC,GAErBD,EAAmB3C,EAAQ,UAAY,OAAiB4C,EAAwBD,EAAiB,WAAa,MAAgBC,EAAsB,WAAU,EAC/J,OAAO5C,EAAQ,OACnB,SAAaF,IAAS,WAAY,CAC9B,IAAI+C,EAAmBC,GAEtBD,EAAoB7C,EAAQ,WAAa,OAAiB8C,EAAwBD,EAAkB,WAAa,MAAgBC,EAAsB,WAAU,EAClK,OAAO9C,EAAQ,QACnB,KAAS,CACL,IAAI+C,EAAqBC,EAAuBC,GAE/CF,EAAsB/C,EAAQ,aAAe,OAAiBgD,EAAwBD,EAAoBjD,CAAI,IAAM,OAAiBmD,EAAyBD,EAAsB,WAAa,MAAgBC,EAAuB,aACzO,OAAOjD,EAAQ,WAAWF,CAAI,CAC/B,CACH,CAEA,IAAIoD,EAEJ,SAASpC,GAAmBqC,EAAM,CAChC,OAAKD,IACHA,EAAqB,SAAS,cAAc,KAAK,GAGnDA,EAAmB,UAAYC,EACxBD,EAAmB,SAC5B,CAEA,SAASE,EAAiBjD,EAAIL,EAAMe,EAAG,CACrC,GAAKA,EAAE,QACP,CAAAA,EAAE,QAAU,GACZ,IAAIJ,EAAMI,EAAE,aAEPA,EAAE,UAAU,QACf2B,GAA4BrC,EAAIL,CAAI,EAGtCe,EAAE,SAASV,EAAIM,CAAG,EACpB,CAEA,SAASJ,GAASQ,EAAGV,EAAI,CACvBU,EAAE,MAAQuC,EAAiBjD,EAAI,OAAQU,EAAE,IAAI,EAC7CA,EAAE,SAAWuC,EAAiBjD,EAAI,QAASU,EAAE,OAAO,EACpDA,EAAE,UAAYuC,EAAiBjD,EAAI,WAAYU,EAAE,QAAQ,EACzD,OAAO,KAAKA,EAAE,UAAU,EAAE,QAAQ,SAAUf,EAAM,CAChDsD,EAAiBjD,EAAIL,EAAMe,EAAE,WAAWf,CAAI,CAAC,CACjD,CAAG,CACH,CAEA,SAASa,IAAgB,CACvBhB,EAAS,QAAQU,EAAQ,CAC3B,CAGA,SAASgD,GAAcC,EAAUtD,EAAS,CACxC,IAAIC,EAAS,KAETqD,EAAS,OAAS,OACpBrD,EAAS0B,GAAqB3B,CAAO,EAC5BsD,EAAS,OAAS,QAC3BrD,EAASiC,GAAsBlC,CAAO,EAC7BsD,EAAS,OAAS,YAC3BrD,EAASsC,GAA0BvC,EAASsD,EAAS,SAAS,EACrDA,EAAS,OAAS,aAC3BrD,EAAS8B,GAAyB/B,CAAO,GAGtCC,IACLA,EAAO,UAAU,KAAKqD,CAAQ,EAC9BrD,EAAO,eAAeA,CAAM,EAC9B,CAGA,SAASsD,GAAaD,EAAUnD,EAAI,CAClC,IAAIF,EAAS,KAYb,GAVIqD,EAAS,OAAS,OACpBrD,EAAS0B,GAAqBxB,CAAE,EACvBmD,EAAS,OAAS,QAC3BrD,EAASiC,GAAsB/B,CAAE,EACxBmD,EAAS,OAAS,YAC3BrD,EAASsC,GAA0BpC,EAAImD,EAAS,SAAS,EAChDA,EAAS,OAAS,aAC3BrD,EAAS8B,GAAyB5B,CAAE,GAGlC,EAACF,EACL,KAAIuD,EAAQvD,EAAO,UAAU,QAAQqD,CAAQ,EACzCE,IAAU,IAAIvD,EAAO,UAAU,OAAOuD,EAAO,CAAC,EAClDvD,EAAO,eAAeA,CAAM,EAC9B,CAGA,SAASwD,GAAmBH,EAAU,CAGpC,GAAI,EAAAA,EAAS,OAAS,YAAcA,EAAS,SAAS,OAAS,GAC/D,KAAII,EAAmB,IAAI,IAAIJ,EAAS,QAAQ,EAC5CK,EAAmB,SAAS,iBAAiBL,EAAS,QAAQ,EAClEK,EAAiB,QAAQ,SAAUxD,EAAI,CAChCuD,EAAiB,IAAIvD,CAAE,IAC1BmD,EAAS,SAAS,IAAInD,CAAE,EACxBkD,GAAcC,EAAUnD,CAAE,EAEhC,CAAG,EACH,CAEA,SAASyD,GAAeN,EAAU,CAChCA,EAAS,SAAS,QAAQ,SAAUnD,EAAI,CACtC,OAAOoD,GAAaD,EAAUnD,CAAE,CACpC,CAAG,EACDmD,EAAS,SAAS,QAClB1D,EAAU,OAAU0D,CAAQ,CAC9B,CAEA,SAASO,IAAwB,CAC/BjE,EAAU,QAAQ6D,EAAkB,CACtC,CAGA,IAAIK,EAIJ,SAASC,IAAwB,CAC3B,OAAO,SAAa,MAEnBD,IACHA,EAAW,IAAI,iBAAiB,UAAY,CAC1CD,IACN,CAAK,GAGHA,KACAC,EAAS,QAAQ,SAAS,gBAAiB,CACzC,UAAW,GACX,QAAS,GACT,WAAY,GACZ,cAAe,EACnB,CAAG,EACH,CAEAC,KAEA,SAASC,EAAYnD,EAAG,CAEtB,OAAI,OAAO,SAAa,IAAoBnB,GAE5CE,EAAU,IAAIiB,CAAC,EAEf4C,GAAmB5C,CAAC,EACb,CACL,OAAQ,UAAkB,CACxB+C,GAAe/C,CAAC,CACjB,CACL,EACA,CAEA,SAASsC,EAAKc,EAAUC,EAAQ,CAC9B,OAAOF,EAAY,CACjB,KAAM,OACN,SAAU,IAAI,IACd,OAAQE,EACR,SAAUD,CACd,CAAG,CACH,CAEA,SAASE,GAASF,EAAUC,EAAQ,CAClC,OAAOF,EAAY,CACjB,KAAM,WACN,SAAU,IAAI,IACd,OAAQE,EACR,SAAUD,CACd,CAAG,CACH,CAEA,SAASG,EAAQH,EAAUC,EAAQ,CACjC,OAAOF,EAAY,CACjB,KAAM,QACN,SAAU,IAAI,IACd,OAAQE,EACR,SAAUD,CACd,CAAG,CACH,CAEA,SAASI,EAAUJ,EAAUI,EAAWH,EAAQ,CAC9C,OAAKzE,GAAmB,KAAK4E,CAAS,EAElCA,IAAc,SAAWA,IAAc,YAClCD,EAAQH,EAAU,SAAUK,EAAY,CAC7C,IAAIC,EAAoBL,EAAO,MAAM,KAAKI,CAAU,EAAE,KAAK,GAAG,CAAC,EAC/DA,EAAW,MAAK,EACXC,GACLA,EAAkB,MAAM,MAAM,EAAE,OAAO,OAAO,EAAE,QAAQ,SAAUC,EAAG,CACnE,OAAOF,EAAW,IAAIE,CAAC,CAC/B,CAAO,CACP,CAAK,EAGIR,EAAY,CACjB,KAAM,YACN,UAAWK,EACX,SAAU,IAAI,IACd,OAAQH,EACR,SAAUD,CACd,CAAG,EAnB+CvE,CAoBlD,CAEA,SAAS+E,GAAY/J,EAAO,CAC1B,IAAIuJ,EAAWvJ,EAAM,SACjBgK,EAAShK,EAAM,OACfsD,EAAQtD,EAAM,MACdoF,EAAOpF,EAAM,UACbwG,EAAiBxG,EAAM,eACvByG,EAAuBzG,EAAM,qBAEjC,GAAIoF,IAAS,OAAQ,CACnB,GAAI4E,IAAW,SACb,OAAOvB,EAAKc,EAAU,SAAUxD,EAAK,CACnC,OAAOA,GAAOzC,GAAwB,GAC9C,CAAO,EACI,GAAI0G,IAAW,MACpB,OAAOvB,EAAKc,EAAU,UAAY,CAChC,OAAOjG,GAAwB,EACvC,CAAO,CAEP,SAAa8B,IAAS,QAAS,CAC3B,GAAI4E,IAAW,SACb,OAAON,EAAQH,EAAU,SAAUxD,EAAK,CAClCzC,GAAOyC,EAAI,IAAIzC,CAAK,CAChC,CAAO,EACI,GAAI0G,IAAW,SACpB,OAAON,EAAQH,EAAU,SAAUxD,EAAK,CAClCzC,GAAOyC,EAAI,OAAUzC,CAAK,CACtC,CAAO,EACI,GAAI0G,IAAW,MACpB,OAAON,EAAQH,EAAU,SAAUxD,EAAK,CACtCA,EAAI,MAAK,EACLzC,GAAOyC,EAAI,IAAIzC,CAAK,CAChC,CAAO,CAEP,SAAa8B,IAAS,YAClB,GAAI4E,IAAW,OAASxD,EACtB,OAAOiD,GAASF,EAAU,UAAY,CACpC,MAAO,CACL,qBAAsB9C,EACtB,eAAgBD,CAC1B,CACA,CAAO,MAEE,CACL,GAAIwD,IAAW,SACb,OAAOL,EAAUJ,EAAUnE,EAAM,SAAUW,EAAK,CAC9C,OAAOA,IAAQ,KAAOA,GAAOzC,GAAwB,IAAMA,GAAwB,EAC3F,CAAO,EACI,GAAI0G,IAAW,MACpB,OAAOL,EAAUJ,EAAUnE,EAAM,UAAY,CAC3C,OAAO9B,GAAwB,EACvC,CAAO,EACI,GAAI0G,IAAW,SACpB,OAAOL,EAAUJ,EAAUnE,EAAM,UAAY,CAC3C,OAAO,IACf,CAAO,CAEJ,CAED,OAAOJ,CACT,CAEA,IAAI8D,GAAQ,CACV,KAAML,EACN,QAASiB,EACT,UAAWC,EACX,SAAUF,GACV,YAAaM,EACf,ECjgBA,SAASE,EAAWC,EAAK,CACvB,IAAIC,EAAO,WACX,MAAMC,EAAIF,EAAI,OACd,QAASlG,EAAI,EAAGA,EAAIoG,EAAGpG,IACrBmG,GAAQD,EAAI,WAAWlG,CAAC,EACxBmG,IAASA,GAAQ,IAAMA,GAAQ,IAAMA,GAAQ,IAAMA,GAAQ,IAAMA,GAAQ,IAE3E,OAAOA,IAAS,CAClB,CACO,SAASE,EAAKC,EAAMhH,EAAOY,EAAS,CAEzC,OAAIA,IAAY,EACP+F,EAAWA,EAAWK,EAAOhH,CAAK,EAAI,EAAE,EAAI,IAAQ,IAGzDY,IAAY,EACP+F,EAAW3G,EAAQgH,CAAI,EAAI,IAAO,IAIpC,IACT,CACO,SAASC,GAAgBC,EAAG,CACjC,OAAIA,GAAK,EAAU,GACZ,IAAI,MAAMA,CAAC,EAAE,KAAK,EAAIA,CAAC,CAChC,CACO,SAASC,EAAQD,EAAGE,EAAO,CAChC,OAAOF,GAAKE,EAAM,CAAC,GAAKF,EAAIE,EAAM,CAAC,CACrC,CACO,SAASC,GAAYC,EAAWC,EAAW,CAChD,MAAML,EAAIH,EAAK,KAAOQ,EAAU,CAAC,EAAGD,EAAW,CAAC,EAChD,OAAIJ,IAAM,KAAa,GAChBA,GAAKK,EAAU,CAAC,GAAKL,EAAIK,EAAU,CAAC,CAC7C,CACO,SAASC,GAAgBN,EAAGO,EAAQ,CACzC,QAAS/G,EAAI,EAAGA,EAAI+G,EAAO,OAAQ/G,IACjC,GAAIyG,EAAQD,EAAGO,EAAO/G,CAAC,CAAC,EACtB,OAAOA,EAGX,MAAO,EACT,CACO,SAASgH,GAAaC,EAAa,CACxC,GAAI,CACF,MAAMC,EAAUD,EAAY,QAAQ,aAAc,OAAO,EACzD,OAAO,IAAI,OAAOC,CAAO,CAC1B,OAAQ,EAAG,CACV,QAAQ,MAAM,CAAC,EACf,MACD,CACH,CACO,SAASC,GAAcnI,EAAKoI,EAAS,CAC1C,GAAI,CAACA,EAAQ,OAAQ,MAAO,GAC5B,IAAIC,EAAkB,GAClBC,EAAa,GACjB,QAAStH,EAAI,EAAGA,EAAIoH,EAAQ,OAAQpH,IAAK,CACvC,MAAMuH,EAAQC,GAAexI,EAAKoI,EAAQpH,CAAC,EAAE,KAAMoH,EAAQpH,CAAC,EAAE,OAAO,EACrE,GAAIoH,EAAQpH,CAAC,EAAE,UAAY,IACzB,GAAIuH,EAAO,MAAO,QAElBF,EAAkB,GACdE,IAAOD,EAAa,GAE3B,CACD,OAAOA,GAAc,CAACD,CACxB,CACA,SAASI,GAAmBC,EAAQC,EAASC,EAAQ,CACnD,GAAI,CAEF,IAAIV,EAAUS,EAAQ,QAAQ,sBAAuB,MAAM,EAAE,QAAQ,SAAU,IAAI,EACnF,OAAIC,IAEFV,EAAU,OAASA,EAAQ,QAAQ,aAAc,EAAE,EAAI,QAE3C,IAAI,OAAO,IAAMA,EAAU,IAAK,GAAG,EACpC,KAAKQ,CAAM,CACzB,MAAW,CACV,MAAO,EACR,CACH,CACA,SAASG,GAAqBH,EAAQC,EAAS,CAC7C,GAAI,CAGF,MAAMG,EAAW,IAAI,IAAIH,EAAQ,QAAQ,gBAAiB,aAAa,EAAE,QAAQ,MAAO,OAAO,EAAG,eAAe,EAG3GI,EAAQ,CAAC,CAACL,EAAO,KAAMI,EAAS,KAAM,EAAK,EAAG,CAACJ,EAAO,SAAUI,EAAS,SAAU,EAAI,CAAC,EAE9F,OAAIA,EAAS,MACXC,EAAM,KAAK,CAACL,EAAO,KAAMI,EAAS,KAAM,EAAK,CAAC,EAEhDA,EAAS,aAAa,QAAQ,CAACE,EAAGC,IAAM,CACtCF,EAAM,KAAK,CAACL,EAAO,aAAa,IAAIO,CAAC,GAAK,GAAID,EAAG,EAAK,CAAC,CAC7D,CAAK,EAGM,CAACD,EAAM,KAAK1K,GAAQ,CAACoK,GAAmBpK,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,CAAC,CAC1E,MAAW,CACV,MAAO,EACR,CACH,CACA,SAASmK,GAAexI,EAAKkJ,EAAMP,EAAS,CAC1C,GAAI,CACF,MAAMpI,EAAS,IAAI,IAAIP,EAAK,WAAW,EACvC,GAAIkJ,IAAS,QAAS,CACpB,MAAMC,EAAQnB,GAAaW,CAAO,EAClC,OAAKQ,EACEA,EAAM,KAAK5I,EAAO,IAAI,GAAK4I,EAAM,KAAK5I,EAAO,KAAK,UAAUA,EAAO,OAAO,MAAM,CAAC,EADrE,EAEzB,SAAe2I,IAAS,SAClB,OAAOL,GAAqBtI,EAAQoI,CAAO,EAE7C,MAAO,EACR,MAAW,CACV,MAAO,EACR,CACH,CACO,SAASS,GAAgBC,EAAeC,EAAUC,EAAS,CAChED,EAAWA,IAAa,OAAY,EAAIA,EAGpCA,EAAW,EAIbA,EAAW,EACFA,EAAW,IAIpBA,EAAW,GAIb,MAAME,EAAQjC,GAAgB8B,CAAa,EAC3CE,EAAUA,GAAWC,EACjBD,EAAQ,SAAWF,IAIrBE,EAAUC,GAIZ,MAAMC,EAAcF,EAAQ,OAAO,CAACG,EAAGC,IAAQA,EAAMD,EAAG,CAAC,GACrDD,EAAc,KAAQA,EAAc,QAItCF,EAAUC,GAIZ,IAAII,EAAa,EACjB,OAAOL,EAAQ,IAAIG,GAAK,CACtB,MAAMG,EAAQD,EACd,OAAAA,GAAcF,EACP,CAACG,EAAOA,EAAQP,EAAWI,CAAC,CACvC,CAAG,CACH,CACO,SAASI,GAAuBC,EAAI/J,EAAKqJ,EAAe,CAC7D,GAAI,CAACrJ,EACH,OAAO,KAET,MAAMgK,EAAShK,EAAI,MAAM,GAAG,EAAE,CAAC,EAC/B,GAAI,CAACgK,EACH,OAAO,KAET,MAAMzB,EAAQyB,EAAO,QAAQ,MAAO,EAAE,EACrC,MAAM,GAAG,EACT,IAAIC,GAAMA,EAAG,MAAM,IAAK,CAAC,CAAC,EAAE,OAAOrN,GAAQ,CAC1C,GAAI,CAACqM,CAAC,EAAIrM,EACV,OAAOqM,IAAMc,CACjB,CAAG,EACA,IAAI/M,GAAS,CACZ,GAAI,CAAG,CAAAgM,CAAC,EAAIhM,EACZ,OAAO,SAASgM,CAAC,CACrB,CAAG,EAED,OAAIT,EAAM,OAAS,GAAKA,EAAM,CAAC,GAAK,GAAKA,EAAM,CAAC,EAAIc,EAAsBd,EAAM,CAAC,EAC1E,IACT,CACO,SAASD,GAAW4B,EAAS,CAClC,GAAI,CACF,OAAOA,EAAO,CACf,OAAQ,EAAG,CACV,eAAQ,MAAM,CAAC,EACR,EACR,CACH,CACA,MAAMC,EAAcrJ,GAAK,WAAW,KAAK,KAAKA,CAAC,EAAGgG,GAAKA,EAAE,WAAW,CAAC,CAAC,EAC/D,eAAesD,GAAQC,EAAiBC,EAAeC,EAAQ,CAGpE,GAFAD,EAAgBA,GAAiB,GACjCC,EAASA,GAAU,WAAW,QAAU,WAAW,OAAO,OACtD,CAACA,EACH,MAAM,IAAI,MAAM,sCAAsC,EAExD,GAAI,CACF,MAAM9L,EAAM,MAAM8L,EAAO,UAAU,MAAOJ,EAAYG,CAAa,EAAG,CACpE,KAAM,UACN,OAAQ,GACT,EAAE,GAAM,CAAC,UAAW,SAAS,CAAC,EACzB,CAACE,EAAIC,CAAU,EAAIJ,EAAgB,MAAM,GAAG,EAC5CK,EAAkB,MAAMH,EAAO,QAAQ,CAC3C,KAAM,UACN,GAAIJ,EAAYK,CAAE,CACnB,EAAE/L,EAAK0L,EAAYM,CAAU,CAAC,EAC/B,OAAO,IAAI,YAAW,EAAG,OAAOC,CAAe,CAChD,MAAW,CACV,MAAM,IAAI,MAAM,mBAAmB,CACpC,CACH,CAGO,SAASC,EAAoBC,EAAO,CACrC,OAAOA,GAAU,WACnBA,EAAQA,EAAQ,KAEd,CAACA,GAAS,OAAOA,GAAU,YAC7BA,EAAQ,KAKV,MAAMC,EAAQD,EAAM,QAAQ,cAAe,EAAE,EAAE,MAAM,MAAM,EAK3D,OAAIC,EAAM,SAAW,GACnBA,EAAM,KAAK,GAAG,EAKTA,EAAM,IAAI7B,GAAKA,EAAE,MAAM,UAAU,EAAIA,EAAE,SAAS,EAAG,GAAG,EAAIA,CAAC,EAAE,KAAK,GAAG,CAC9E,CACO,SAAS8B,IAAiB,CAC/B,IAAI5J,EACJ,GAAI,CAEFA,EAAU,QACX,MAAW,CACVA,EAAU,EACX,CACD,OAAOA,CACT,CCnPA,MAAM6J,EAAc,CAAA,EAGb,SAASC,EAAcC,EAAKC,EAAW,CAE5C,GAAI,QAASA,EACX,OAAOC,GAAOF,EAAKC,EAAU,GAAM,EAErC,GAAI,SAAUA,EACZ,MAAO,CAACC,GAAOF,EAAKC,EAAU,IAAO,EAEvC,GAAI,SAAUA,EACZ,OAAOE,GAAQH,EAAKC,EAAU,IAAO,EAEvC,GAAI,SAAUA,EACZ,MAAO,CAACF,EAAcC,EAAKC,EAAU,IAAO,EAI9C,SAAW,CAACjC,EAAGD,CAAC,IAAK,OAAO,QAAQkC,CAAS,EAC3C,GAAI,CAACG,EAAmBrC,EAAGsC,GAAQL,EAAKhC,CAAC,CAAC,EAAG,MAAO,GAEtD,MAAO,EACT,CAGA,SAASqC,GAAQL,EAAKM,EAAM,CAC1B,MAAMV,EAAQU,EAAK,MAAM,GAAG,EAC5B,IAAIC,EAAUP,EACd,QAASjK,EAAI,EAAGA,EAAI6J,EAAM,OAAQ7J,IAChC,GAAIwK,GAAW,OAAOA,GAAY,UAAYX,EAAM7J,CAAC,IAAKwK,EACxDA,EAAUA,EAAQX,EAAM7J,CAAC,CAAC,MAE1B,QAAO,KAGX,OAAOwK,CACT,CAGA,SAASC,GAAStC,EAAO,CACvB,OAAK4B,EAAY5B,CAAK,IACpB4B,EAAY5B,CAAK,EAAI,IAAI,OAAOA,EAAM,QAAQ,aAAc,OAAO,CAAC,GAE/D4B,EAAY5B,CAAK,CAC1B,CAGA,SAASkC,EAAmBH,EAAW5K,EAAO,CAE5C,GAAI,OAAO4K,GAAc,SACvB,OAAO5K,EAAQ,KAAO4K,EAExB,GAAI,OAAOA,GAAc,SACvB,OAAO5K,EAAQ,IAAM4K,EAEvB,GAAI,OAAOA,GAAc,UACvB,MAAO,CAAC,CAAC5K,IAAU4K,EAErB,GAAIA,IAAc,KAChB,OAAO5K,IAAU,KAEnB,GAAI,MAAM,QAAQ4K,CAAS,GAAK,CAACQ,GAAiBR,CAAS,EACzD,OAAO,KAAK,UAAU5K,CAAK,IAAM,KAAK,UAAU4K,CAAS,EAI3D,UAAWS,KAAMT,EACf,GAAI,CAACU,GAAsBD,EAAIrL,EAAO4K,EAAUS,CAAE,CAAC,EACjD,MAAO,GAGX,MAAO,EACT,CAGA,SAASD,GAAiBT,EAAK,CAC7B,MAAMY,EAAO,OAAO,KAAKZ,CAAG,EAC5B,OAAOY,EAAK,OAAS,GAAKA,EAAK,OAAO5C,GAAKA,EAAE,CAAC,IAAM,GAAG,EAAE,SAAW4C,EAAK,MAC3E,CAGA,SAASC,GAAQ9C,EAAG,CAClB,GAAIA,IAAM,KAAM,MAAO,OACvB,GAAI,MAAM,QAAQA,CAAC,EAAG,MAAO,QAC7B,MAAM+C,EAAI,OAAO/C,EACjB,MAAI,CAAC,SAAU,SAAU,UAAW,SAAU,WAAW,EAAE,SAAS+C,CAAC,EAC5DA,EAEF,SACT,CAGA,SAASC,GAAUtD,EAAQI,EAAU,CACnC,GAAI,CAAC,MAAM,QAAQJ,CAAM,EAAG,MAAO,GACnC,MAAMuD,EAAQP,GAAiB5C,CAAQ,EAAIE,GAAKqC,EAAmBvC,EAAUE,CAAC,EAAIA,GAAKgC,EAAchC,EAAGF,CAAQ,EAChH,QAAS9H,EAAI,EAAGA,EAAI0H,EAAO,OAAQ1H,IACjC,GAAI0H,EAAO1H,CAAC,GAAKiL,EAAMvD,EAAO1H,CAAC,CAAC,EAC9B,MAAO,GAGX,MAAO,EACT,CACA,SAASkL,GAAKxD,EAAQI,EAAU,CAE9B,OAAI,MAAM,QAAQJ,CAAM,EACfA,EAAO,KAAKjG,GAAMqG,EAAS,SAASrG,CAAE,CAAC,EAEzCqG,EAAS,SAASJ,CAAM,CACjC,CAGA,SAASkD,GAAsBO,EAAUzD,EAAQI,EAAU,CACzD,OAAQqD,EAAQ,CACd,IAAK,OACH,OAAOxB,EAAoBjC,CAAM,IAAMiC,EAAoB7B,CAAQ,EACrE,IAAK,OACH,OAAO6B,EAAoBjC,CAAM,IAAMiC,EAAoB7B,CAAQ,EACrE,IAAK,OACH,OAAO6B,EAAoBjC,CAAM,EAAIiC,EAAoB7B,CAAQ,EACnE,IAAK,QACH,OAAO6B,EAAoBjC,CAAM,GAAKiC,EAAoB7B,CAAQ,EACpE,IAAK,OACH,OAAO6B,EAAoBjC,CAAM,EAAIiC,EAAoB7B,CAAQ,EACnE,IAAK,QACH,OAAO6B,EAAoBjC,CAAM,GAAKiC,EAAoB7B,CAAQ,EACpE,IAAK,MACH,OAAOJ,IAAWI,EACpB,IAAK,MACH,OAAOJ,IAAWI,EACpB,IAAK,MACH,OAAOJ,EAASI,EAClB,IAAK,OACH,OAAOJ,GAAUI,EACnB,IAAK,MACH,OAAOJ,EAASI,EAClB,IAAK,OACH,OAAOJ,GAAUI,EACnB,IAAK,UAEH,OAAOA,EAAWJ,GAAU,KAAOA,GAAU,KAC/C,IAAK,MACH,OAAK,MAAM,QAAQI,CAAQ,EACpBoD,GAAKxD,EAAQI,CAAQ,EADS,GAEvC,IAAK,OACH,OAAK,MAAM,QAAQA,CAAQ,EACpB,CAACoD,GAAKxD,EAAQI,CAAQ,EADQ,GAEvC,IAAK,OACH,MAAO,CAACuC,EAAmBvC,EAAUJ,CAAM,EAC7C,IAAK,QACH,OAAK,MAAM,QAAQA,CAAM,EAClB2C,EAAmBvC,EAAUJ,EAAO,MAAM,EADd,GAErC,IAAK,aACH,OAAOsD,GAAUtD,EAAQI,CAAQ,EACnC,IAAK,OACH,GAAI,CAAC,MAAM,QAAQJ,CAAM,EAAG,MAAO,GACnC,QAAS1H,EAAI,EAAGA,EAAI8H,EAAS,OAAQ9H,IAAK,CACxC,IAAIoL,EAAS,GACb,QAASC,EAAI,EAAGA,EAAI3D,EAAO,OAAQ2D,IACjC,GAAIhB,EAAmBvC,EAAS9H,CAAC,EAAG0H,EAAO2D,CAAC,CAAC,EAAG,CAC9CD,EAAS,GACT,KACD,CAEH,GAAI,CAACA,EAAQ,MAAO,EACrB,CACD,MAAO,GACT,IAAK,SACH,GAAI,CACF,OAAOX,GAAS3C,CAAQ,EAAE,KAAKJ,CAAM,CACtC,MAAW,CACV,MAAO,EACR,CACH,IAAK,QACH,OAAOoD,GAAQpD,CAAM,IAAMI,EAC7B,QACE,eAAQ,MAAM,qBAAuBqD,CAAQ,EACtC,EACV,CACH,CAGA,SAAShB,GAAOF,EAAKqB,EAAY,CAC/B,GAAI,CAACA,EAAW,OAAQ,MAAO,GAC/B,QAAStL,EAAI,EAAGA,EAAIsL,EAAW,OAAQtL,IACrC,GAAIgK,EAAcC,EAAKqB,EAAWtL,CAAC,CAAC,EAClC,MAAO,GAGX,MAAO,EACT,CAGA,SAASoK,GAAQH,EAAKqB,EAAY,CAChC,QAAStL,EAAI,EAAGA,EAAIsL,EAAW,OAAQtL,IACrC,GAAI,CAACgK,EAAcC,EAAKqB,EAAWtL,CAAC,CAAC,EACnC,MAAO,GAGX,MAAO,EACT,CCvMA,MAAMuL,EAAY,OAAO,OAAW,KAAe,OAAO,SAAa,IACjEC,GAAc1B,GAAc,EAC3B,MAAM2B,EAAW,CAQtB,YAAYC,EAAS,CAoBnB,GAnBAA,EAAUA,GAAW,GAGrB,KAAK,QAAUF,GACf,KAAK,KAAO,KAAK,QAAUE,EAC3B,KAAK,UAAY,KACjB,KAAK,oBAAsB,IAAI,IAC/B,KAAK,iBAAmB,GACxB,KAAK,MAAQ,GACb,KAAK,eAAiB,IAAI,IAC1B,KAAK,SAAW,GAChB,KAAK,SAAW,EAChB,KAAK,MAAQ,GACb,KAAK,UAAY,IAAI,IACrB,KAAK,qBAAuB,IAAI,IAChC,KAAK,oBAAsB,GAC3B,KAAK,uBAAyB,IAAI,IAClC,KAAK,kBAAoB,IAAI,IAC7B,KAAK,oBAAsB,GACvBA,EAAQ,WAAY,CACtB,GAAIA,EAAQ,cACV,MAAM,IAAI,MAAM,4CAA4C,EAE9D,GAAI,CAACA,EAAQ,UACX,MAAM,IAAI,MAAM,mBAAmB,EAErC,IAAIC,EAAW,GACf,GAAI,CACFA,EAAW,CAAC,CAAC,IAAI,IAAID,EAAQ,SAAW,EAAE,EAAE,SAAS,MAAM,kBAAkB,CAC9E,MAAW,CAEX,CACD,GAAIC,EACF,MAAM,IAAI,MAAM,2CAA2C,CAEnE,SACUD,EAAQ,mBACV,MAAM,IAAI,MAAM,iDAAiD,EAGjEA,EAAQ,WACV,KAAK,MAAQ,IAEXH,GAAaG,EAAQ,gBACvB,OAAO,YAAc,KACrB,SAAS,cAAc,IAAI,MAAM,UAAU,CAAC,GAE1CA,EAAQ,cACV,KAAK,MAAQ,GACb,KAAK,0BAAyB,GAE5BA,EAAQ,WAAa,CAACA,EAAQ,YAChC,KAAK,SAAS,CAAA,EAAI,GAAM,EAAK,CAEhC,CACD,MAAM,aAAaxP,EAAS,CACtBA,GAAWA,EAAQ,cAErB,KAAK,KAAK,mBAAqB,IAEjC,KAAK,oBAAsB,GAC3B,MAAM,KAAK,SAASA,EAAS,GAAM,EAAI,EACnC,KAAK,iBACPsB,GAAU,IAAI,CAEjB,CACD,MAAM,gBAAgBtB,EAAS,CAC7B,MAAM,KAAK,SAASA,EAAS,GAAO,EAAI,CACzC,CACD,YAAa,CACX,MAAO,CAAC,KAAK,YAAa,EAAC,QAAS,KAAK,aAAY,CAAE,CACxD,CACD,aAAc,CACZ,MAAM0P,EAAc,KAAK,KAAK,SAAW,4BACzC,MAAO,CACL,QAASA,EAAY,QAAQ,OAAQ,EAAE,EACvC,eAAgB,KAAK,KAAK,eAAiBA,GAAa,QAAQ,OAAQ,EAAE,EAC1E,kBAAmB,KAAK,KAAK,sBAC7B,4BAA6B,KAAK,KAAK,2BAC7C,CACG,CACD,cAAe,CACb,OAAO,KAAK,KAAK,WAAa,EAC/B,CACD,cAAe,CACb,OAAO,KAAK,KAAK,YAAc,EAChC,CACD,uBAAwB,CACtB,OAAO,KAAK,KAAK,kBAClB,CACD,MAAM,SAAS1P,EAASgB,EAAYC,EAAgB,CAElD,GADAjB,EAAUA,GAAW,GACjB,CAAC,KAAK,KAAK,UACb,MAAM,IAAI,MAAM,mBAAmB,EAErC,MAAMY,GAAgB,KAAMZ,EAAQ,QAASA,EAAQ,WAAa,KAAK,KAAK,cAAegB,EAAYC,EAAgB,KAAK,KAAK,iBAAmB,EAAK,CAC1J,CACD,SAAU,CACJ,KAAK,WACP,KAAK,UAAS,CAEjB,CACD,YAAY0O,EAAU,CACpB,KAAK,KAAK,SAAWA,EACrB,KAAK,MAAQ,GACb,KAAK,QAAO,CACb,CACD,MAAM,qBAAqBxC,EAAiBC,EAAeC,EAAQ,CACjE,MAAMuC,EAAe,MAAM1C,GAAQC,EAAiBC,GAAiB,KAAK,KAAK,cAAeC,CAAM,EACpG,KAAK,YAAY,KAAK,MAAMuC,CAAY,CAAC,CAC1C,CACD,eAAeC,EAAa,CAC1B,KAAK,KAAK,YAAcA,EACxB,KAAK,MAAQ,GACb,KAAK,0BAAyB,CAC/B,CACD,MAAM,wBAAwB1C,EAAiBC,EAAeC,EAAQ,CACpE,MAAMyC,EAAkB,MAAM5C,GAAQC,EAAiBC,GAAiB,KAAK,KAAK,cAAeC,CAAM,EACvG,KAAK,eAAe,KAAK,MAAMyC,CAAe,CAAC,CAChD,CACD,cAAcpN,EAAY,CAExB,GADA,KAAK,KAAK,WAAaA,EACnB,KAAK,KAAK,WAAY,CACxB,KAAK,sBAAqB,EAC1B,MACD,CACD,KAAK,QAAO,EACZ,KAAK,0BAAyB,CAC/B,CACD,sBAAsBqN,EAAW,CAE/B,GADA,KAAK,oBAAsBA,EACvB,KAAK,KAAK,WAAY,CACxB,KAAK,sBAAqB,EAC1B,MACD,CACD,KAAK,QAAO,EACZ,KAAK,0BAAyB,CAC/B,CACD,oBAAoBC,EAAM,CAExB,GADA,KAAK,KAAK,iBAAmBA,GAAQ,CAAA,EACjC,KAAK,KAAK,WAAY,CACxB,KAAK,sBAAqB,EAC1B,MACD,CACD,KAAK,QAAO,EACZ,KAAK,0BAAyB,CAC/B,CAGD,kBAAkBC,EAAK,CACrB,KAAK,qBAAuBA,EAC5B,KAAK,QAAO,CACb,CACD,OAAOnN,EAAK,CAEV,GADA,KAAK,KAAK,IAAMA,EACZ,KAAK,KAAK,WAAY,CACxB,KAAK,sBAAqB,EAAG,KAAK,IAAM,KAAK,0BAA0B,EAAI,CAAC,EAC5E,MACD,CACD,KAAK,0BAA0B,EAAI,CACpC,CACD,eAAgB,CACd,MAAO,CACL,GAAG,KAAK,KAAK,WACb,GAAG,KAAK,mBACd,CACG,CACD,qBAAsB,CACpB,OAAO,KAAK,KAAK,kBAAoB,EACtC,CACD,mBAAoB,CAElB,OAAO,KAAK,sBAAwB,IAAI,GACzC,CACD,QAAS,CACP,OAAO,KAAK,KAAK,KAAO,EACzB,CACD,aAAc,CACZ,OAAO,KAAK,KAAK,UAAY,EAC9B,CACD,gBAAiB,CACf,OAAO,KAAK,KAAK,aAAe,EACjC,CACD,UAAUoN,EAAI,CACZ,YAAK,eAAe,IAAIA,CAAE,EACnB,IAAM,CACX,KAAK,eAAe,OAAOA,CAAE,CACnC,CACG,CACD,eAAgB,CACd,OAAO,KAAK,KAAK,iBAAmB,IAAS,KAAK,KAAK,kBACxD,CACD,MAAM,uBAAwB,CACvB,KAAK,KAAK,YACV,KAAK,qBACV,MAAM,KAAK,SAAS,CAAE,EAAE,GAAO,EAAI,EAAE,MAAM,IAAM,CAErD,CAAK,CACF,CACD,eAAgB,CACd,OAAO,IAAI,IAAI,KAAK,SAAS,CAC9B,CACD,SAAU,CAER,KAAK,eAAe,QACpB,KAAK,UAAU,QACf,KAAK,oBAAoB,QACzB,KAAK,iBAAmB,GACxB,KAAK,SAAW,GACZ,KAAK,UACP,aAAa,KAAK,QAAQ,EAE5BxO,GAAY,IAAI,EACZ2N,GAAa,OAAO,cAAgB,MACtC,OAAO,OAAO,YAIhB,KAAK,uBAAuB,QAAQc,GAAO,CACzCA,EAAI,KAAI,CACd,CAAK,EACD,KAAK,uBAAuB,QAC5B,KAAK,kBAAkB,OACxB,CACD,YAAYC,EAAU,CACpB,KAAK,UAAYA,CAClB,CACD,eAAe7O,EAAK8O,EAAW,CAG7B,GAFA,KAAK,KAAK,iBAAmB,KAAK,KAAK,kBAAoB,GAC3D,KAAK,KAAK,iBAAiB9O,CAAG,EAAI8O,EAC9B,KAAK,KAAK,WAAY,CACxB,KAAK,sBAAqB,EAC1B,MACD,CACD,KAAK,0BAAyB,EAC9B,KAAK,QAAO,CACb,CACD,IAAIC,EAAY,CACd,MAAMC,EAAS,KAAK,KAAKD,EAAY,IAAI,EACzC,YAAK,mBAAmBA,EAAYC,CAAM,EACnCA,CACR,CACD,kBAAkBhP,EAAK,CAErB,GADA,KAAK,kBAAkB,IAAIA,CAAG,EAC1B,CAAC,KAAK,KAAK,YAAa,OAAO,KACf,KAAK,KAAK,YAAY,OAAO4O,GAAOA,EAAI,MAAQ5O,CAAG,EAC3D,QAAQ4O,GAAO,CACzB,GAAI,CAACA,EAAI,OAAQ,OAAO,KACxB,KAAK,mBAAmBA,CAAG,CACjC,CAAK,CACF,CACD,mBAAmBG,EAAYE,EAAY,CACzC,MAAMpO,EAAW,KAAK,uBAAuB,IAAIkO,CAAU,EAG3D,GAAIA,EAAW,QAAU,CAAC,KAAK,kBAAkB,IAAIA,EAAW,GAAG,GAAK,CAAClO,EAAU,OAAO,KAG1F,MAAMmO,EAAS,KAAK,IAAID,CAAU,EAG5BG,EAAY,KAAK,UAAUF,EAAO,KAAK,EAG7C,GAAI,CAACC,GAAcD,EAAO,cAAgBnO,GAAYA,EAAS,YAAcqO,EAC3E,OAAOF,EAOT,GAHInO,GAAU,KAAK,0BAA0BkO,CAAU,EAGnDC,EAAO,aAAc,CACvB,MAAMG,EAAO,KAAK,iBAAiBH,EAAO,KAAK,EAC3CG,GACF,KAAK,uBAAuB,IAAIJ,EAAY,CAC1C,KAAAI,EACA,UAAAD,CACV,CAAS,CAEJ,CACD,OAAOF,CACR,CACD,0BAA0BJ,EAAK,CAC7B,MAAMhP,EAAO,KAAK,uBAAuB,IAAIgP,CAAG,EAC5ChP,IACFA,EAAK,KAAI,EACT,KAAK,uBAAuB,OAAOgP,CAAG,EAEzC,CACD,0BAA0BK,EAAY,CACpC,MAAMX,EAAc,KAAK,KAAK,aAAe,CAAA,EAGvClB,EAAO,IAAI,IAAIkB,CAAW,EAChC,KAAK,uBAAuB,QAAQ,CAAC/D,EAAGC,IAAM,CACvC4C,EAAK,IAAI5C,CAAC,IACbD,EAAE,KAAI,EACN,KAAK,uBAAuB,OAAOC,CAAC,EAE5C,CAAK,EAGD8D,EAAY,QAAQM,GAAO,CACzB,KAAK,mBAAmBA,EAAKK,CAAU,CAC7C,CAAK,CACF,CACD,mBAAmBF,EAAYC,EAAQ,CACrC,MAAMhP,EAAM+O,EAAW,IAGjBK,EAAO,KAAK,UAAU,IAAIpP,CAAG,GAE/B,CAACoP,GAAQA,EAAK,OAAO,eAAiBJ,EAAO,cAAgBI,EAAK,OAAO,cAAgBJ,EAAO,eAClG,KAAK,UAAU,IAAIhP,EAAK,CACtB,WAAA+O,EACA,OAAAC,CACR,CAAO,EACD,KAAK,eAAe,QAAQL,GAAM,CAChC,GAAI,CACFA,EAAGI,EAAYC,CAAM,CACtB,OAAQjM,EAAG,CACV,QAAQ,MAAMA,CAAC,CAChB,CACT,CAAO,EAEJ,CACD,mBAAmB/C,EAAK8C,EAAK,CAE3B,GAAIA,EAAI,SAAW,WAAY,OAG/B,MAAMuM,EAAmB,KAAK,UAAUvM,EAAI,KAAK,EACjD,GAAI,KAAK,iBAAiB9C,CAAG,IAAMqP,EAInC,IAHA,KAAK,iBAAiBrP,CAAG,EAAIqP,EAGzB,KAAK,KAAK,eACZ,GAAI,CACF,KAAK,KAAK,eAAerP,EAAK8C,CAAG,CAClC,MAAW,CAEX,CAIC,CAACgL,GAAa,CAAC,OAAO,QAC1B,KAAK,SAAS,KAAK,CACjB,IAAA9N,EACA,GAAI8C,EAAI,EACd,CAAK,EACI,KAAK,WACR,KAAK,SAAW,OAAO,WAAW,IAAM,CAEtC,KAAK,SAAW,EAChB,MAAMwM,EAAI,CAAC,GAAG,KAAK,QAAQ,EAC3B,KAAK,SAAW,GAGX,KAAK,KAAK,aACf,OAAO,MAAM,iCAAiC,OAAO,KAAK,KAAK,YAAa,UAAU,EAAE,OAAO,mBAAmB,KAAK,UAAUA,CAAC,CAAC,CAAC,EAAG,CACrI,MAAO,WACP,KAAM,SAChB,CAAS,EAAE,MAAM,IAAM,CAEvB,CAAS,CACF,EAAE,KAAK,KAAK,kBAAoB,GAAI,IAExC,CACD,kBAAkBtP,EAAK6B,EAAO0N,EAAQC,EAAQT,EAAYC,EAAQ,CAChE,MAAMS,EAAM,CACV,MAAA5N,EACA,GAAI,CAAC,CAACA,EACN,IAAK,CAACA,EACN,OAAA0N,EACA,OAAQC,GAAU,EACxB,EACI,OAAIT,IAAYU,EAAI,WAAaV,GAC7BC,IAAQS,EAAI,iBAAmBT,GAGnC,KAAK,mBAAmBhP,EAAKyP,CAAG,EACzBA,CACR,CACD,KAAKzP,EAAK,CACR,OAAO,KAAK,YAAYA,CAAG,EAAE,EAC9B,CACD,MAAMA,EAAK,CACT,OAAO,KAAK,YAAYA,CAAG,EAAE,GAC9B,CACD,gBAAgBA,EAAK0P,EAAc,CACjC,MAAM7N,EAAQ,KAAK,YAAY7B,CAAG,EAAE,MACpC,OAAO6B,IAAU,KAAO6N,EAAe7N,CACxC,CAOD,QAAQyJ,EAAI,CACV,OAAO,KAAK,YAAYA,CAAE,CAC3B,CACD,YAAYA,EAAI,CAEd,GAAI,KAAK,qBAAqB,IAAIA,CAAE,EAKlC,OAAO,KAAK,kBAAkBA,EAAI,KAAK,qBAAqB,IAAIA,CAAE,EAAG,UAAU,EAIjF,GAAI,CAAC,KAAK,KAAK,UAAY,CAAC,KAAK,KAAK,SAASA,CAAE,EAI/C,OAAO,KAAK,kBAAkBA,EAAI,KAAM,gBAAgB,EAI1D,MAAMqE,EAAU,KAAK,KAAK,SAASrE,CAAE,EAGrC,GAAIqE,EAAQ,MACV,UAAWC,KAAQD,EAAQ,MAAO,CAUhC,GARIC,EAAK,WAAa,CAAC,KAAK,iBAAiBA,EAAK,SAAS,GAQvDA,EAAK,SAAW,KAAK,eAAeA,EAAK,OAAO,EAKlD,SAIF,GAAI,UAAWA,EAAM,CAEnB,GAAI,CAAC,KAAK,qBAAqBA,EAAK,MAAQtE,EAAIsE,EAAK,cAAeA,EAAK,MAAOA,EAAK,SAAUA,EAAK,WAAW,EAK7G,SAQF,OAAIA,EAAK,QACPA,EAAK,OAAO,QAAQtC,GAAK,CACvB,KAAK,OAAOA,EAAE,WAAYA,EAAE,MAAM,CAChD,CAAa,EAEI,KAAK,kBAAkBhC,EAAIsE,EAAK,MAAO,QAASA,EAAK,EAAE,CAC/D,CACD,GAAI,CAACA,EAAK,WAKR,SAGF,MAAMhB,EAAM,CACV,WAAYgB,EAAK,WACjB,IAAKA,EAAK,KAAOtE,CAC3B,EACY,aAAcsE,IAAMhB,EAAI,SAAWgB,EAAK,UACxCA,EAAK,UAAShB,EAAI,QAAUgB,EAAK,SACjCA,EAAK,gBAAehB,EAAI,cAAgBgB,EAAK,eAC7CA,EAAK,YAAWhB,EAAI,UAAYgB,EAAK,WACrCA,EAAK,OAAMhB,EAAI,KAAOgB,EAAK,MAC3BA,EAAK,SAAQhB,EAAI,OAASgB,EAAK,QAC/BA,EAAK,OAAMhB,EAAI,KAAOgB,EAAK,MAC3BA,EAAK,QAAOhB,EAAI,MAAQgB,EAAK,OAC7BA,EAAK,OAAMhB,EAAI,KAAOgB,EAAK,MAC3BA,EAAK,cAAahB,EAAI,YAAcgB,EAAK,aACzCA,EAAK,UAAShB,EAAI,QAAUgB,EAAK,SAGrC,MAAM9M,EAAM,KAAK,KAAK8L,EAAKtD,CAAE,EAE7B,GADA,KAAK,mBAAmBsD,EAAK9L,CAAG,EAC5BA,EAAI,cAAgB,CAACA,EAAI,YAC3B,OAAO,KAAK,kBAAkBwI,EAAIxI,EAAI,MAAO,aAAc8M,EAAK,GAAIhB,EAAK9L,CAAG,CAE/E,CAQH,OAAO,KAAK,kBAAkBwI,EAAIqE,EAAQ,eAAiB,OAAY,KAAOA,EAAQ,aAAc,cAAc,CACnH,CACD,qBAAqB9G,EAAMgH,EAAe5G,EAAO4B,EAAUiF,EAAa,CACtE,GAAI,CAAC7G,GAAS4B,IAAa,OAAW,MAAO,GAC7C,KAAM,CACJ,UAAA1B,CACN,EAAQ,KAAK,kBAAkB0G,CAAa,EACxC,GAAI,CAAC1G,EACH,MAAO,GAET,MAAMJ,EAAIH,EAAKC,EAAMM,EAAW2G,GAAe,CAAC,EAChD,OAAI/G,IAAM,KAAa,GAChBE,EAAQD,EAAQD,EAAGE,CAAK,EAAI4B,IAAa,OAAY9B,GAAK8B,EAAW,EAC7E,CACD,iBAAiB4B,EAAW,CAC1B,OAAOF,EAAc,KAAK,cAAe,EAAEE,CAAS,CACrD,CACD,eAAesD,EAAS,CACtB,OAAOA,EAAQ,KAAKC,GAAU,CAC5B,KAAM,CACJ,UAAA7G,CACD,EAAG,KAAK,kBAAkB6G,EAAO,SAAS,EAC3C,GAAI,CAAC7G,EAAW,MAAO,GACvB,MAAM,EAAIP,EAAKoH,EAAO,KAAM7G,EAAW6G,EAAO,aAAe,CAAC,EAC9D,OAAI,IAAM,KAAa,GAChB,CAACA,EAAO,OAAO,KAAKC,GAAKjH,EAAQ,EAAGiH,CAAC,CAAC,CACnD,CAAK,CACF,CACD,KAAKlB,EAAYmB,EAAW,CAC1B,MAAMlQ,EAAM+O,EAAW,IACjBnE,EAAgBmE,EAAW,WAAW,OAG5C,GAAInE,EAAgB,EAIlB,OAAO,KAAK,WAAWmE,EAAY,GAAI,GAAOmB,CAAS,EAIzD,GAAI,KAAK,KAAK,UAAY,GAIxB,OAAO,KAAK,WAAWnB,EAAY,GAAI,GAAOmB,CAAS,EAIzDnB,EAAa,KAAK,gBAAgBA,CAAU,EAG5C,MAAMoB,EAAa9E,GAAuBrL,EAAK,KAAK,eAAc,EAAI4K,CAAa,EACnF,GAAIuF,IAAe,KAKjB,OAAO,KAAK,WAAWpB,EAAYoB,EAAY,GAAOD,CAAS,EAIjE,GAAI,KAAK,KAAK,kBAAoBlQ,KAAO,KAAK,KAAK,iBAAkB,CACnE,MAAM8O,EAAY,KAAK,KAAK,iBAAiB9O,CAAG,EAKhD,OAAO,KAAK,WAAW+O,EAAYD,EAAW,GAAOoB,CAAS,CAC/D,CAGD,GAAInB,EAAW,SAAW,SAAWA,EAAW,SAAW,GAIzD,OAAO,KAAK,WAAWA,EAAY,GAAI,GAAOmB,CAAS,EAIzD,KAAM,CACJ,UAAA/G,CACD,EAAG,KAAK,kBAAkB4F,EAAW,aAAa,EACnD,GAAI,CAAC5F,EAIH,OAAO,KAAK,WAAW4F,EAAY,GAAI,GAAOmB,CAAS,EAIzD,GAAInB,EAAW,SACb,GAAI,KAAK,eAAeA,EAAW,OAAO,EAIxC,OAAO,KAAK,WAAWA,EAAY,GAAI,GAAOmB,CAAS,UAEhDnB,EAAW,WAAa,CAAC7F,GAAYC,EAAW4F,EAAW,SAAS,EAI7E,OAAO,KAAK,WAAWA,EAAY,GAAI,GAAOmB,CAAS,EAIzD,GAAInB,EAAW,SAAW,CAAClF,GAAWkF,EAAW,OAAO,EAItD,OAAO,KAAK,WAAWA,EAAY,GAAI,GAAOmB,CAAS,EAIzD,GAAInB,EAAW,WAAa,CAAC,KAAK,iBAAiBA,EAAW,SAAS,EAIrE,OAAO,KAAK,WAAWA,EAAY,GAAI,GAAOmB,CAAS,EAIzD,GAAInB,EAAW,QAAU,CAAC,KAAK,iBAAiBA,EAAW,MAAM,EAI/D,OAAO,KAAK,WAAWA,EAAY,GAAI,GAAOmB,CAAS,EAIzD,GAAInB,EAAW,KAAO,CAAC,KAAK,YAAYA,EAAW,GAAG,EAIpD,OAAO,KAAK,WAAWA,EAAY,GAAI,GAAOmB,CAAS,EAIzD,GAAInB,EAAW,aAAe,CAACrF,GAAc,KAAK,eAAgB,EAAEqF,EAAW,WAAW,EAIxF,OAAO,KAAK,WAAWA,EAAY,GAAI,GAAOmB,CAAS,EAIzD,MAAMnH,EAAIH,EAAKmG,EAAW,MAAQ/O,EAAKmJ,EAAW4F,EAAW,aAAe,CAAC,EAC7E,GAAIhG,IAAM,KAIR,OAAO,KAAK,WAAWgG,EAAY,GAAI,GAAOmB,CAAS,EAEzD,MAAM5G,EAASyF,EAAW,QAAUpE,GAAgBC,EAAemE,EAAW,WAAa,OAAY,EAAIA,EAAW,SAAUA,EAAW,OAAO,EAC5IqB,EAAW/G,GAAgBN,EAAGO,CAAM,EAG1C,GAAI8G,EAAW,EAIb,OAAO,KAAK,WAAWrB,EAAY,GAAI,GAAOmB,CAAS,EAIzD,GAAI,UAAWnB,EAKb,OAAO,KAAK,WAAWA,EAAYA,EAAW,QAAU,OAAY,GAAKA,EAAW,MAAO,GAAOmB,CAAS,EAI7G,GAAI,KAAK,KAAK,OAIZ,OAAO,KAAK,WAAWnB,EAAY,GAAI,GAAOmB,CAAS,EAIzD,GAAInB,EAAW,SAAW,UAIxB,OAAO,KAAK,WAAWA,EAAY,GAAI,GAAOmB,CAAS,EAIzD,MAAMlB,EAAS,KAAK,WAAWD,EAAYqB,EAAU,GAAMF,EAAWnH,CAAC,EAGvE,YAAK,OAAOgG,EAAYC,CAAM,EAOvBA,CACR,CACD,IAAIqB,EAAKC,EAAK,CACP,KAAK,QACN,KAAK,KAAK,IAAK,KAAK,KAAK,IAAID,EAAKC,CAAG,EAAO,QAAQ,IAAID,EAAKC,CAAG,EACrE,CACD,OAAOvB,EAAYC,EAAQ,CACzB,GAAI,CAAC,KAAK,KAAK,iBAAkB,OACjC,MAAMhP,EAAM+O,EAAW,IAGjBvE,EAAIwE,EAAO,cAAgBA,EAAO,UAAYhP,EAAMgP,EAAO,YACjE,GAAI,MAAK,oBAAoB,IAAIxE,CAAC,EAClC,MAAK,oBAAoB,IAAIA,CAAC,EAC9B,GAAI,CACF,KAAK,KAAK,iBAAiBuE,EAAYC,CAAM,CAC9C,OAAQjM,EAAG,CACV,QAAQ,MAAMA,CAAC,CAChB,EACF,CACD,gBAAgBgM,EAAY,CAC1B,MAAM/O,EAAM+O,EAAW,IACjBwB,EAAI,KAAK,KAAK,UACpB,OAAIA,GAAKA,EAAEvQ,CAAG,IACZ+O,EAAa,OAAO,OAAO,CAAA,EAAIA,EAAYwB,EAAEvQ,CAAG,CAAC,EAC7C,OAAO+O,EAAW,KAAQ,WAC5BA,EAAW,IAAMxF,GAEjBwF,EAAW,GAAG,IAGXA,CACR,CACD,kBAAkBpL,EAAM,CACtB,MAAMkM,EAAgBlM,GAAQ,KAC9B,IAAIwF,EAAY,GAChB,OAAI,KAAK,oBAAoB0G,CAAa,EACxC1G,EAAY,KAAK,oBAAoB0G,CAAa,EACzC,KAAK,KAAK,WACnB1G,EAAY,KAAK,KAAK,WAAW0G,CAAa,GAAK,GAC1C,KAAK,KAAK,OACnB1G,EAAY,KAAK,KAAK,KAAK0G,CAAa,GAAK,IAExC,CACL,cAAAA,EACA,UAAA1G,CACN,CACG,CACD,WAAW4F,EAAYyB,EAAgBC,EAAUP,EAAWQ,EAAQ,CAClE,IAAIC,EAAe,IAEfH,EAAiB,GAAKA,GAAkBzB,EAAW,WAAW,UAChEyB,EAAiB,EACjBG,EAAe,IAEjB,KAAM,CACJ,cAAAd,EACA,UAAA1G,CACD,EAAG,KAAK,kBAAkB4F,EAAW,aAAa,EAC7C6B,EAAO7B,EAAW,KAAOA,EAAW,KAAKyB,CAAc,EAAI,GAC3D1N,EAAM,CACV,IAAK8N,EAAK,KAAO,GAAKJ,EACtB,UAAAN,EACA,aAAAS,EACA,SAAAF,EACA,YAAaD,EACb,MAAOzB,EAAW,WAAWyB,CAAc,EAC3C,cAAAX,EACA,UAAA1G,CACN,EACI,OAAIyH,EAAK,OAAM9N,EAAI,KAAO8N,EAAK,MAC3BF,IAAW,SAAW5N,EAAI,OAAS4N,GACnCE,EAAK,cAAa9N,EAAI,YAAc8N,EAAK,aACtC9N,CACR,CACD,gBAAiB,CACf,OAAO,KAAK,KAAK,MAAQgL,EAAY,OAAO,SAAS,KAAO,GAC7D,CACD,YAAY+C,EAAU,CACpB,MAAMtP,EAAM,KAAK,iBACjB,GAAI,CAACA,EAAK,MAAO,GACjB,MAAMuP,EAAWvP,EAAI,QAAQ,eAAgB,EAAE,EAAE,QAAQ,WAAY,GAAG,EAExE,MADI,GAAAsP,EAAS,KAAKtP,CAAG,GACjBsP,EAAS,KAAKC,CAAQ,EAE3B,CACD,iBAAiBC,EAAW,CAC1B,MAAMC,EAAS,KAAK,KAAK,QAAU,CAAA,EACnC,QAASzO,EAAI,EAAGA,EAAIwO,EAAU,OAAQxO,IACpC,GAAIyO,EAAOD,EAAUxO,CAAC,CAAC,EAAG,MAAO,GAEnC,MAAO,EACR,CACD,iBAAiB0O,EAAS,CACxB,GAAI,CAACnD,EAAW,OAChB,MAAMqB,EAAO,CAAA,EACb,GAAI8B,EAAQ,IAAK,CACf,MAAM,EAAI,SAAS,cAAc,OAAO,EACxC,EAAE,UAAYA,EAAQ,IACtB,SAAS,KAAK,YAAY,CAAC,EAC3B9B,EAAK,KAAK,IAAM,EAAE,OAAQ,CAAA,CAC3B,CACD,GAAI8B,EAAQ,GAAI,CACd,MAAMC,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,UAAYD,EAAQ,GAC3B,SAAS,KAAK,YAAYC,CAAM,EAChC/B,EAAK,KAAK,IAAM+B,EAAO,OAAQ,CAAA,CAChC,CACD,OAAID,EAAQ,cACVA,EAAQ,aAAa,QAAQ9J,GAAY,CACvCgI,EAAK,KAAKpH,GAAO,YAAYZ,CAAQ,EAAE,MAAM,CACrD,CAAO,EAEI,IAAM,CACXgI,EAAK,QAAQgC,GAAMA,EAAI,CAAA,CAC7B,CACG,CACH,CCr0BA,6BAEA,SAASC,EAAQC,EAAQ,CACvB,QAAS9O,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAAK,CACzC,IAAIgN,EAAS,UAAUhN,CAAC,EACxB,QAASvC,KAAOuP,EACd8B,EAAOrR,CAAG,EAAIuP,EAAOvP,CAAG,CAE3B,CACD,OAAOqR,CACT,CAIA,IAAIC,GAAmB,CACrB,KAAM,SAAUzP,EAAO,CACrB,OAAIA,EAAM,CAAC,IAAM,MACfA,EAAQA,EAAM,MAAM,EAAG,EAAE,GAEpBA,EAAM,QAAQ,mBAAoB,kBAAkB,CAC5D,EACD,MAAO,SAAUA,EAAO,CACtB,OAAO,mBAAmBA,CAAK,EAAE,QAC/B,2CACA,kBACD,CACF,CACH,EAKA,SAAS0P,EAAMC,EAAWC,EAAmB,CAC3C,SAASC,EAAKC,EAAM9P,EAAOV,EAAY,CACrC,GAAI,SAAO,SAAa,KAIxB,CAAAA,EAAaiQ,EAAO,CAAA,EAAIK,EAAmBtQ,CAAU,EAEjD,OAAOA,EAAW,SAAY,WAChCA,EAAW,QAAU,IAAI,KAAK,KAAK,IAAG,EAAKA,EAAW,QAAU,KAAK,GAEnEA,EAAW,UACbA,EAAW,QAAUA,EAAW,QAAQ,YAAW,GAGrDwQ,EAAO,mBAAmBA,CAAI,EAC3B,QAAQ,uBAAwB,kBAAkB,EAClD,QAAQ,QAAS,MAAM,EAE1B,IAAIC,EAAwB,GAC5B,QAASC,KAAiB1Q,EACnBA,EAAW0Q,CAAa,IAI7BD,GAAyB,KAAOC,EAE5B1Q,EAAW0Q,CAAa,IAAM,KAWlCD,GAAyB,IAAMzQ,EAAW0Q,CAAa,EAAE,MAAM,GAAG,EAAE,CAAC,IAGvE,OAAQ,SAAS,OACfF,EAAO,IAAMH,EAAU,MAAM3P,EAAO8P,CAAI,EAAIC,EAC/C,CAED,SAASE,EAAKH,EAAM,CAClB,GAAI,SAAO,SAAa,KAAgB,UAAU,QAAU,CAACA,GAQ7D,SAFII,EAAU,SAAS,OAAS,SAAS,OAAO,MAAM,IAAI,EAAI,GAC1DC,EAAM,CAAA,EACDzP,EAAI,EAAGA,EAAIwP,EAAQ,OAAQxP,IAAK,CACvC,IAAI6J,EAAQ2F,EAAQxP,CAAC,EAAE,MAAM,GAAG,EAC5BV,EAAQuK,EAAM,MAAM,CAAC,EAAE,KAAK,GAAG,EAEnC,GAAI,CACF,IAAI6F,EAAQ,mBAAmB7F,EAAM,CAAC,CAAC,EAGvC,GAFA4F,EAAIC,CAAK,EAAIT,EAAU,KAAK3P,EAAOoQ,CAAK,EAEpCN,IAASM,EACX,KAEV,MAAkB,CAAE,CACf,CAED,OAAON,EAAOK,EAAIL,CAAI,EAAIK,EAC3B,CAED,OAAO,OAAO,OACZ,CACE,IAAAN,EACA,IAAAI,EACA,OAAQ,SAAUH,EAAMxQ,EAAY,CAClCuQ,EACEC,EACA,GACAP,EAAO,CAAE,EAAEjQ,EAAY,CACrB,QAAS,EACrB,CAAW,CACX,CACO,EACD,eAAgB,SAAUA,EAAY,CACpC,OAAOoQ,EAAK,KAAK,UAAWH,EAAO,CAAA,EAAI,KAAK,WAAYjQ,CAAU,CAAC,CACpE,EACD,cAAe,SAAUqQ,EAAW,CAClC,OAAOD,EAAKH,EAAO,GAAI,KAAK,UAAWI,CAAS,EAAG,KAAK,UAAU,CACnE,CACF,EACD,CACE,WAAY,CAAE,MAAO,OAAO,OAAOC,CAAiB,CAAG,EACvD,UAAW,CAAE,MAAO,OAAO,OAAOD,CAAS,CAAG,CAC/C,CACF,CACH,CAEA,IAAIU,EAAMX,EAAKD,GAAkB,CAAE,KAAM,GAAG,CAAE,EChIvC,SAASa,GAAmBC,EAAa,UAAWC,EAAU,IAAK,CAClE,MAAAC,EAAgBC,EAAO,IAAIH,CAAU,EAE3C,GAAIE,EACK,OAAAA,EAGT,MAAME,EAAOC,KACbF,OAAAA,EAAO,IAAIH,EAAYI,EAAM,CAAE,QAAAH,CAAS,CAAA,EAEjCG,CACT,CAEO,SAASC,IAAe,OACzB,OAAAC,EAAA,2BAAQ,SAAR,MAAAA,EAAgB,WACX,OAAO,OAAO,aAGhBC,GAAQ,CACjB,CAEO,SAASA,IAAU,CACxB,MAAO,uCAAuC,QAAQ,SAAUtK,IAG7DA,EAAI,OAAO,gBAAgB,IAAI,WAAW,CAAC,CAAC,EAAE,CAAC,EAAI,IAAMA,EAAI,GAAG,SAAS,EAAE,CAAA,CAEhF,CC3BA,MAAM+J,GAAclC,GAAc,MAAMA,CAAS,GAEpC0C,GAA4B,CAAC,CAAE,UAAA1C,EAAW,eAAA2C,EAAgB,QAAAR,EAAU,MAAS,CACnFnC,GAILqC,EAAO,IAAIH,GAAWlC,CAAS,EAAG2C,EAAgB,CAAE,QAAAR,EAAS,CAC/D,EAEaS,GAA8B5C,GAClC,OAAOqC,EAAO,IAAIH,GAAWlC,CAAS,CAAC,CAAC,GAAK,OCLhDsC,GAAOL,GAAkB,EAmBlBY,GAAa,IAAI/E,GAAW,CACvC,QAAS,uBACT,UAAW,uBACX,cAAe,GACf,mBAAoB,GACpB,WAAY,CACV,GAAIwE,GACJ,IAAK,OAAO,SAAS,IACvB,EACA,iBAAkB,CAACzD,EAAYC,IAAW,CACxC,QAAQ,IAAI,oBAAqB,CAC/B,aAAcD,EAAW,IACzB,YAAaC,EAAO,KAAA,CACrB,EAEK,MAAAgE,EAAeF,GAA2B9D,EAAO,SAAS,EAE5DgE,IAAiB,QAEOJ,GAAA,CACxB,UAAW5D,EAAO,UAClB,eAAgBA,EAAO,KAAA,CACxB,EAGHiE,GAAa,sBAAuB,CAClC,aAAclE,EAAW,IACzB,KAAAyD,GACA,MAAOQ,GAAgBhE,EAAO,KAAA,CAC/B,CACH,CACF,CAAC,EAKYkE,GAAkB,UAC7B,MAAMH,GAAW,eACV,CAAE,WAAAA,EAAW,GAGTI,GACX,CAACjD,EAAWkD,EAAsBrV,IAClC,MAAO,CAAE,WAAAgV,KAAqB,CAC5B,MAAMC,EAAe,MAAMD,EAAW,gBAAgB7C,EAAWkD,CAAmB,EACpF,MAAO,CAAE,WAAAL,EAAY,aAAcD,GAA2B5C,CAAS,GAAK8C,EAC9E,ECnEIK,EAAkB,OAAO,SAAS,SAExC,SAASC,GAAsB,CAAE,UAAApD,EAAW,gBAAAqD,GAAmB,CACvD,MAAAC,EAAY,WAAW,IAAM,CACfC,KACjB,GAAI,EAEDC,EAAe,CAAC,CAAE,aAAAV,KAAmB,CAKnC,MAAAW,EAAiBJ,EAAgBP,EAAe,CAAC,EAEnDW,IAAmBN,GACHI,IAClB,aAAaD,CAAS,GAEf,OAAA,SAAS,OAAOG,CAAc,CACvC,EAGK,OAAAC,GACLV,GACAC,GAAiBjD,EAAWpS,CAAqB,EAMjD+V,EACE,CAAC,CAAE,aAAAb,CACD,IAAAA,IAAiBlV,GAAyBkV,IAAiBjV,EAC7D0V,CACF,EAEAI,EACE,CAAC,CAAE,aAAAb,CACD,IAAAA,IAAiBlV,GAAyBkV,IAAiBjV,EAC7D2V,CACF,CAAA,GAEJ,CAEI,OAAO,qBAAuB,OAAO,oBAAoB,QACpD,OAAA,oBAAoB,QAAsB3E,GAAA,EAE7CA,EAAW,iBAAmBsE,GAE9BtE,EAAW,gBAAgB,SAASsE,CAAe,IAEnDC,GAAsBvE,CAAU,CAClC,CACD,EAGH,SAAS0E,EAAkBK,EAA0B,CAC7C,MAAAC,EAAmB,SAAS,eAAe,aAAa,EAE1D,OAAAA,GAAoBA,EAAiB,YACtBA,EAAA,WAAW,YAAYA,CAAgB,EAGnDD,CACT","x_google_ignoreList":[1,2,3,4,5,6]}