@givefreely/adunit 1.18.0-dev.0 → 1.18.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"GiveFreely-content.cjs.js","sources":["../../node_modules/.pnpm/solid-js@1.9.4/node_modules/solid-js/dist/solid.js","../../node_modules/.pnpm/solid-js@1.9.4/node_modules/solid-js/web/dist/web.js","../../src/content/CheckoutPopup/CheckoutPopup.styles.ts","../../src/content/lib/calculateMaxRate.ts","../../src/shared/vendors/wildfire/formatOffer.ts","../../src/content/CheckoutPopup/components/OfferTitle.tsx","../../src/content/lib/utils/parseRate.ts","../../src/content/context/translation/translationContext.ts","../../src/content/lib/hooks/useT.ts","../../src/shared/utils/string-utils.ts","../../src/content/CheckoutPopup/components/OfferDetails.tsx","../../node_modules/.pnpm/webextension-polyfill@0.12.0/node_modules/webextension-polyfill/dist/browser-polyfill.js","../../src/shared/analytics/types.ts","../../src/shared/utils/logger/transports/console.transport.ts","../../src/shared/utils/logger/logger.ts","../../src/shared/utils/retry.ts","../../src/shared/browser.ts","../../src/shared/constants.ts","../../src/shared/utils/storage.ts","../../src/shared/utils/current-version.ts","../../src/shared/analytics/index.ts","../../src/shared/utils/add-time.ts","../../src/shared/utils.ts","../../src/content/CheckoutPopup/components/MainScreen.tsx","../../src/content/lib/hooks/useCharities.ts","../../src/content/CheckoutPopup/components/GoodbyeScreen.tsx","../../src/content/CheckoutPopup/components/DonateScreen.tsx","../../src/content/CheckoutPopup/CheckoutPopup.tsx","../../src/content/lib/visibility/rules/cartOrCheckoutUrlRule.ts","../../src/content/lib/visibility/rules/bookingRule.ts","../../src/content/services/retrieveShopPayDomain.ts","../../src/content/lib/visibility/rules/shopPayRule.ts","../../src/content/lib/visibility/rules/merchantRegexRule.ts","../../src/content/language/index.ts","../../src/content/lib/visibility/rules/languageMatchRule.ts","../../src/content/lib/visibility/checkoutRulesTest.ts","../../src/content/lib/utils/getAdUnitInstalledExtensions.ts","../../src/content/context/translation/TranslationProvider.tsx","../../src/shared/services/geolocation.ts","../../src/content/GfAdUnit.tsx","../../src/content/services/checkSiteMatches.ts","../../src/background/utils/regexMatch.ts","../../src/shared/utils/compare-version.ts","../../src/content/services/getActiveDomain.ts","../../src/content/services/sendShopPayId.ts","../../src/content/services/getIsAdUnitMuted.ts","../../src/content/services/shouldStandDown.ts","../../src/content/services/activateOffer.ts","../../src/content/services/hideAd.ts","../../src/content/services/getLanguageContent.ts","../../src/content/index.tsx","../../src/content/services/getPopupConfig.ts","../../src/content/services/logAffilliatedmerchantsSearchResults.ts","../../src/shared/utils/serp.ts"],"sourcesContent":["let taskIdCounter = 1,\n isCallbackScheduled = false,\n isPerformingWork = false,\n taskQueue = [],\n currentTask = null,\n shouldYieldToHost = null,\n yieldInterval = 5,\n deadline = 0,\n maxYieldInterval = 300,\n scheduleCallback = null,\n scheduledCallback = null;\nconst maxSigned31BitInt = 1073741823;\nfunction setupScheduler() {\n const channel = new MessageChannel(),\n port = channel.port2;\n scheduleCallback = () => port.postMessage(null);\n channel.port1.onmessage = () => {\n if (scheduledCallback !== null) {\n const currentTime = performance.now();\n deadline = currentTime + yieldInterval;\n const hasTimeRemaining = true;\n try {\n const hasMoreWork = scheduledCallback(hasTimeRemaining, currentTime);\n if (!hasMoreWork) {\n scheduledCallback = null;\n } else port.postMessage(null);\n } catch (error) {\n port.postMessage(null);\n throw error;\n }\n }\n };\n if (navigator && navigator.scheduling && navigator.scheduling.isInputPending) {\n const scheduling = navigator.scheduling;\n shouldYieldToHost = () => {\n const currentTime = performance.now();\n if (currentTime >= deadline) {\n if (scheduling.isInputPending()) {\n return true;\n }\n return currentTime >= maxYieldInterval;\n } else {\n return false;\n }\n };\n } else {\n shouldYieldToHost = () => performance.now() >= deadline;\n }\n}\nfunction enqueue(taskQueue, task) {\n function findIndex() {\n let m = 0;\n let n = taskQueue.length - 1;\n while (m <= n) {\n const k = (n + m) >> 1;\n const cmp = task.expirationTime - taskQueue[k].expirationTime;\n if (cmp > 0) m = k + 1;\n else if (cmp < 0) n = k - 1;\n else return k;\n }\n return m;\n }\n taskQueue.splice(findIndex(), 0, task);\n}\nfunction requestCallback(fn, options) {\n if (!scheduleCallback) setupScheduler();\n let startTime = performance.now(),\n timeout = maxSigned31BitInt;\n if (options && options.timeout) timeout = options.timeout;\n const newTask = {\n id: taskIdCounter++,\n fn,\n startTime,\n expirationTime: startTime + timeout\n };\n enqueue(taskQueue, newTask);\n if (!isCallbackScheduled && !isPerformingWork) {\n isCallbackScheduled = true;\n scheduledCallback = flushWork;\n scheduleCallback();\n }\n return newTask;\n}\nfunction cancelCallback(task) {\n task.fn = null;\n}\nfunction flushWork(hasTimeRemaining, initialTime) {\n isCallbackScheduled = false;\n isPerformingWork = true;\n try {\n return workLoop(hasTimeRemaining, initialTime);\n } finally {\n currentTask = null;\n isPerformingWork = false;\n }\n}\nfunction workLoop(hasTimeRemaining, initialTime) {\n let currentTime = initialTime;\n currentTask = taskQueue[0] || null;\n while (currentTask !== null) {\n if (currentTask.expirationTime > currentTime && (!hasTimeRemaining || shouldYieldToHost())) {\n break;\n }\n const callback = currentTask.fn;\n if (callback !== null) {\n currentTask.fn = null;\n const didUserCallbackTimeout = currentTask.expirationTime <= currentTime;\n callback(didUserCallbackTimeout);\n currentTime = performance.now();\n if (currentTask === taskQueue[0]) {\n taskQueue.shift();\n }\n } else taskQueue.shift();\n currentTask = taskQueue[0] || null;\n }\n return currentTask !== null;\n}\n\nconst sharedConfig = {\n context: undefined,\n registry: undefined,\n effects: undefined,\n done: false,\n getContextId() {\n return getContextId(this.context.count);\n },\n getNextContextId() {\n return getContextId(this.context.count++);\n }\n};\nfunction getContextId(count) {\n const num = String(count),\n len = num.length - 1;\n return sharedConfig.context.id + (len ? String.fromCharCode(96 + len) : \"\") + num;\n}\nfunction setHydrateContext(context) {\n sharedConfig.context = context;\n}\nfunction nextHydrateContext() {\n return {\n ...sharedConfig.context,\n id: sharedConfig.getNextContextId(),\n count: 0\n };\n}\n\nconst equalFn = (a, b) => a === b;\nconst $PROXY = Symbol(\"solid-proxy\");\nconst SUPPORTS_PROXY = typeof Proxy === \"function\";\nconst $TRACK = Symbol(\"solid-track\");\nconst $DEVCOMP = Symbol(\"solid-dev-component\");\nconst signalOptions = {\n equals: equalFn\n};\nlet ERROR = null;\nlet runEffects = runQueue;\nconst STALE = 1;\nconst PENDING = 2;\nconst UNOWNED = {\n owned: null,\n cleanups: null,\n context: null,\n owner: null\n};\nconst NO_INIT = {};\nvar Owner = null;\nlet Transition = null;\nlet Scheduler = null;\nlet ExternalSourceConfig = null;\nlet Listener = null;\nlet Updates = null;\nlet Effects = null;\nlet ExecCount = 0;\nfunction createRoot(fn, detachedOwner) {\n const listener = Listener,\n owner = Owner,\n unowned = fn.length === 0,\n current = detachedOwner === undefined ? owner : detachedOwner,\n root = unowned\n ? UNOWNED\n : {\n owned: null,\n cleanups: null,\n context: current ? current.context : null,\n owner: current\n },\n updateFn = unowned ? fn : () => fn(() => untrack(() => cleanNode(root)));\n Owner = root;\n Listener = null;\n try {\n return runUpdates(updateFn, true);\n } finally {\n Listener = listener;\n Owner = owner;\n }\n}\nfunction createSignal(value, options) {\n options = options ? Object.assign({}, signalOptions, options) : signalOptions;\n const s = {\n value,\n observers: null,\n observerSlots: null,\n comparator: options.equals || undefined\n };\n const setter = value => {\n if (typeof value === \"function\") {\n if (Transition && Transition.running && Transition.sources.has(s)) value = value(s.tValue);\n else value = value(s.value);\n }\n return writeSignal(s, value);\n };\n return [readSignal.bind(s), setter];\n}\nfunction createComputed(fn, value, options) {\n const c = createComputation(fn, value, true, STALE);\n if (Scheduler && Transition && Transition.running) Updates.push(c);\n else updateComputation(c);\n}\nfunction createRenderEffect(fn, value, options) {\n const c = createComputation(fn, value, false, STALE);\n if (Scheduler && Transition && Transition.running) Updates.push(c);\n else updateComputation(c);\n}\nfunction createEffect(fn, value, options) {\n runEffects = runUserEffects;\n const c = createComputation(fn, value, false, STALE),\n s = SuspenseContext && useContext(SuspenseContext);\n if (s) c.suspense = s;\n if (!options || !options.render) c.user = true;\n Effects ? Effects.push(c) : updateComputation(c);\n}\nfunction createReaction(onInvalidate, options) {\n let fn;\n const c = createComputation(\n () => {\n fn ? fn() : untrack(onInvalidate);\n fn = undefined;\n },\n undefined,\n false,\n 0\n ),\n s = SuspenseContext && useContext(SuspenseContext);\n if (s) c.suspense = s;\n c.user = true;\n return tracking => {\n fn = tracking;\n updateComputation(c);\n };\n}\nfunction createMemo(fn, value, options) {\n options = options ? Object.assign({}, signalOptions, options) : signalOptions;\n const c = createComputation(fn, value, true, 0);\n c.observers = null;\n c.observerSlots = null;\n c.comparator = options.equals || undefined;\n if (Scheduler && Transition && Transition.running) {\n c.tState = STALE;\n Updates.push(c);\n } else updateComputation(c);\n return readSignal.bind(c);\n}\nfunction isPromise(v) {\n return v && typeof v === \"object\" && \"then\" in v;\n}\nfunction createResource(pSource, pFetcher, pOptions) {\n let source;\n let fetcher;\n let options;\n if (typeof pFetcher === \"function\") {\n source = pSource;\n fetcher = pFetcher;\n options = pOptions || {};\n } else {\n source = true;\n fetcher = pSource;\n options = pFetcher || {};\n }\n let pr = null,\n initP = NO_INIT,\n id = null,\n loadedUnderTransition = false,\n scheduled = false,\n resolved = \"initialValue\" in options,\n dynamic = typeof source === \"function\" && createMemo(source);\n const contexts = new Set(),\n [value, setValue] = (options.storage || createSignal)(options.initialValue),\n [error, setError] = createSignal(undefined),\n [track, trigger] = createSignal(undefined, {\n equals: false\n }),\n [state, setState] = createSignal(resolved ? \"ready\" : \"unresolved\");\n if (sharedConfig.context) {\n id = sharedConfig.getNextContextId();\n if (options.ssrLoadFrom === \"initial\") initP = options.initialValue;\n else if (sharedConfig.load && sharedConfig.has(id)) initP = sharedConfig.load(id);\n }\n function loadEnd(p, v, error, key) {\n if (pr === p) {\n pr = null;\n key !== undefined && (resolved = true);\n if ((p === initP || v === initP) && options.onHydrated)\n queueMicrotask(() =>\n options.onHydrated(key, {\n value: v\n })\n );\n initP = NO_INIT;\n if (Transition && p && loadedUnderTransition) {\n Transition.promises.delete(p);\n loadedUnderTransition = false;\n runUpdates(() => {\n Transition.running = true;\n completeLoad(v, error);\n }, false);\n } else completeLoad(v, error);\n }\n return v;\n }\n function completeLoad(v, err) {\n runUpdates(() => {\n if (err === undefined) setValue(() => v);\n setState(err !== undefined ? \"errored\" : resolved ? \"ready\" : \"unresolved\");\n setError(err);\n for (const c of contexts.keys()) c.decrement();\n contexts.clear();\n }, false);\n }\n function read() {\n const c = SuspenseContext && useContext(SuspenseContext),\n v = value(),\n err = error();\n if (err !== undefined && !pr) throw err;\n if (Listener && !Listener.user && c) {\n createComputed(() => {\n track();\n if (pr) {\n if (c.resolved && Transition && loadedUnderTransition) Transition.promises.add(pr);\n else if (!contexts.has(c)) {\n c.increment();\n contexts.add(c);\n }\n }\n });\n }\n return v;\n }\n function load(refetching = true) {\n if (refetching !== false && scheduled) return;\n scheduled = false;\n const lookup = dynamic ? dynamic() : source;\n loadedUnderTransition = Transition && Transition.running;\n if (lookup == null || lookup === false) {\n loadEnd(pr, untrack(value));\n return;\n }\n if (Transition && pr) Transition.promises.delete(pr);\n const p =\n initP !== NO_INIT\n ? initP\n : untrack(() =>\n fetcher(lookup, {\n value: value(),\n refetching\n })\n );\n if (!isPromise(p)) {\n loadEnd(pr, p, undefined, lookup);\n return p;\n }\n pr = p;\n if (\"value\" in p) {\n if (p.status === \"success\") loadEnd(pr, p.value, undefined, lookup);\n else loadEnd(pr, undefined, castError(p.value), lookup);\n return p;\n }\n scheduled = true;\n queueMicrotask(() => (scheduled = false));\n runUpdates(() => {\n setState(resolved ? \"refreshing\" : \"pending\");\n trigger();\n }, false);\n return p.then(\n v => loadEnd(p, v, undefined, lookup),\n e => loadEnd(p, undefined, castError(e), lookup)\n );\n }\n Object.defineProperties(read, {\n state: {\n get: () => state()\n },\n error: {\n get: () => error()\n },\n loading: {\n get() {\n const s = state();\n return s === \"pending\" || s === \"refreshing\";\n }\n },\n latest: {\n get() {\n if (!resolved) return read();\n const err = error();\n if (err && !pr) throw err;\n return value();\n }\n }\n });\n if (dynamic) createComputed(() => load(false));\n else load(false);\n return [\n read,\n {\n refetch: load,\n mutate: setValue\n }\n ];\n}\nfunction createDeferred(source, options) {\n let t,\n timeout = options ? options.timeoutMs : undefined;\n const node = createComputation(\n () => {\n if (!t || !t.fn)\n t = requestCallback(\n () => setDeferred(() => node.value),\n timeout !== undefined\n ? {\n timeout\n }\n : undefined\n );\n return source();\n },\n undefined,\n true\n );\n const [deferred, setDeferred] = createSignal(\n Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value,\n options\n );\n updateComputation(node);\n setDeferred(() =>\n Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value\n );\n return deferred;\n}\nfunction createSelector(source, fn = equalFn, options) {\n const subs = new Map();\n const node = createComputation(\n p => {\n const v = source();\n for (const [key, val] of subs.entries())\n if (fn(key, v) !== fn(key, p)) {\n for (const c of val.values()) {\n c.state = STALE;\n if (c.pure) Updates.push(c);\n else Effects.push(c);\n }\n }\n return v;\n },\n undefined,\n true,\n STALE\n );\n updateComputation(node);\n return key => {\n const listener = Listener;\n if (listener) {\n let l;\n if ((l = subs.get(key))) l.add(listener);\n else subs.set(key, (l = new Set([listener])));\n onCleanup(() => {\n l.delete(listener);\n !l.size && subs.delete(key);\n });\n }\n return fn(\n key,\n Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value\n );\n };\n}\nfunction batch(fn) {\n return runUpdates(fn, false);\n}\nfunction untrack(fn) {\n if (!ExternalSourceConfig && Listener === null) return fn();\n const listener = Listener;\n Listener = null;\n try {\n if (ExternalSourceConfig) return ExternalSourceConfig.untrack(fn);\n return fn();\n } finally {\n Listener = listener;\n }\n}\nfunction on(deps, fn, options) {\n const isArray = Array.isArray(deps);\n let prevInput;\n let defer = options && options.defer;\n return prevValue => {\n let input;\n if (isArray) {\n input = Array(deps.length);\n for (let i = 0; i < deps.length; i++) input[i] = deps[i]();\n } else input = deps();\n if (defer) {\n defer = false;\n return prevValue;\n }\n const result = untrack(() => fn(input, prevInput, prevValue));\n prevInput = input;\n return result;\n };\n}\nfunction onMount(fn) {\n createEffect(() => untrack(fn));\n}\nfunction onCleanup(fn) {\n if (Owner === null);\n else if (Owner.cleanups === null) Owner.cleanups = [fn];\n else Owner.cleanups.push(fn);\n return fn;\n}\nfunction catchError(fn, handler) {\n ERROR || (ERROR = Symbol(\"error\"));\n Owner = createComputation(undefined, undefined, true);\n Owner.context = {\n ...Owner.context,\n [ERROR]: [handler]\n };\n if (Transition && Transition.running) Transition.sources.add(Owner);\n try {\n return fn();\n } catch (err) {\n handleError(err);\n } finally {\n Owner = Owner.owner;\n }\n}\nfunction getListener() {\n return Listener;\n}\nfunction getOwner() {\n return Owner;\n}\nfunction runWithOwner(o, fn) {\n const prev = Owner;\n const prevListener = Listener;\n Owner = o;\n Listener = null;\n try {\n return runUpdates(fn, true);\n } catch (err) {\n handleError(err);\n } finally {\n Owner = prev;\n Listener = prevListener;\n }\n}\nfunction enableScheduling(scheduler = requestCallback) {\n Scheduler = scheduler;\n}\nfunction startTransition(fn) {\n if (Transition && Transition.running) {\n fn();\n return Transition.done;\n }\n const l = Listener;\n const o = Owner;\n return Promise.resolve().then(() => {\n Listener = l;\n Owner = o;\n let t;\n if (Scheduler || SuspenseContext) {\n t =\n Transition ||\n (Transition = {\n sources: new Set(),\n effects: [],\n promises: new Set(),\n disposed: new Set(),\n queue: new Set(),\n running: true\n });\n t.done || (t.done = new Promise(res => (t.resolve = res)));\n t.running = true;\n }\n runUpdates(fn, false);\n Listener = Owner = null;\n return t ? t.done : undefined;\n });\n}\nconst [transPending, setTransPending] = /*@__PURE__*/ createSignal(false);\nfunction useTransition() {\n return [transPending, startTransition];\n}\nfunction resumeEffects(e) {\n Effects.push.apply(Effects, e);\n e.length = 0;\n}\nfunction createContext(defaultValue, options) {\n const id = Symbol(\"context\");\n return {\n id,\n Provider: createProvider(id),\n defaultValue\n };\n}\nfunction useContext(context) {\n let value;\n return Owner && Owner.context && (value = Owner.context[context.id]) !== undefined\n ? value\n : context.defaultValue;\n}\nfunction children(fn) {\n const children = createMemo(fn);\n const memo = createMemo(() => resolveChildren(children()));\n memo.toArray = () => {\n const c = memo();\n return Array.isArray(c) ? c : c != null ? [c] : [];\n };\n return memo;\n}\nlet SuspenseContext;\nfunction getSuspenseContext() {\n return SuspenseContext || (SuspenseContext = createContext());\n}\nfunction enableExternalSource(factory, untrack = fn => fn()) {\n if (ExternalSourceConfig) {\n const { factory: oldFactory, untrack: oldUntrack } = ExternalSourceConfig;\n ExternalSourceConfig = {\n factory: (fn, trigger) => {\n const oldSource = oldFactory(fn, trigger);\n const source = factory(x => oldSource.track(x), trigger);\n return {\n track: x => source.track(x),\n dispose() {\n source.dispose();\n oldSource.dispose();\n }\n };\n },\n untrack: fn => oldUntrack(() => untrack(fn))\n };\n } else {\n ExternalSourceConfig = {\n factory,\n untrack\n };\n }\n}\nfunction readSignal() {\n const runningTransition = Transition && Transition.running;\n if (this.sources && (runningTransition ? this.tState : this.state)) {\n if ((runningTransition ? this.tState : this.state) === STALE) updateComputation(this);\n else {\n const updates = Updates;\n Updates = null;\n runUpdates(() => lookUpstream(this), false);\n Updates = updates;\n }\n }\n if (Listener) {\n const sSlot = this.observers ? this.observers.length : 0;\n if (!Listener.sources) {\n Listener.sources = [this];\n Listener.sourceSlots = [sSlot];\n } else {\n Listener.sources.push(this);\n Listener.sourceSlots.push(sSlot);\n }\n if (!this.observers) {\n this.observers = [Listener];\n this.observerSlots = [Listener.sources.length - 1];\n } else {\n this.observers.push(Listener);\n this.observerSlots.push(Listener.sources.length - 1);\n }\n }\n if (runningTransition && Transition.sources.has(this)) return this.tValue;\n return this.value;\n}\nfunction writeSignal(node, value, isComp) {\n let current =\n Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value;\n if (!node.comparator || !node.comparator(current, value)) {\n if (Transition) {\n const TransitionRunning = Transition.running;\n if (TransitionRunning || (!isComp && Transition.sources.has(node))) {\n Transition.sources.add(node);\n node.tValue = value;\n }\n if (!TransitionRunning) node.value = value;\n } else node.value = value;\n if (node.observers && node.observers.length) {\n runUpdates(() => {\n for (let i = 0; i < node.observers.length; i += 1) {\n const o = node.observers[i];\n const TransitionRunning = Transition && Transition.running;\n if (TransitionRunning && Transition.disposed.has(o)) continue;\n if (TransitionRunning ? !o.tState : !o.state) {\n if (o.pure) Updates.push(o);\n else Effects.push(o);\n if (o.observers) markDownstream(o);\n }\n if (!TransitionRunning) o.state = STALE;\n else o.tState = STALE;\n }\n if (Updates.length > 10e5) {\n Updates = [];\n if (false);\n throw new Error();\n }\n }, false);\n }\n }\n return value;\n}\nfunction updateComputation(node) {\n if (!node.fn) return;\n cleanNode(node);\n const time = ExecCount;\n runComputation(\n node,\n Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value,\n time\n );\n if (Transition && !Transition.running && Transition.sources.has(node)) {\n queueMicrotask(() => {\n runUpdates(() => {\n Transition && (Transition.running = true);\n Listener = Owner = node;\n runComputation(node, node.tValue, time);\n Listener = Owner = null;\n }, false);\n });\n }\n}\nfunction runComputation(node, value, time) {\n let nextValue;\n const owner = Owner,\n listener = Listener;\n Listener = Owner = node;\n try {\n nextValue = node.fn(value);\n } catch (err) {\n if (node.pure) {\n if (Transition && Transition.running) {\n node.tState = STALE;\n node.tOwned && node.tOwned.forEach(cleanNode);\n node.tOwned = undefined;\n } else {\n node.state = STALE;\n node.owned && node.owned.forEach(cleanNode);\n node.owned = null;\n }\n }\n node.updatedAt = time + 1;\n return handleError(err);\n } finally {\n Listener = listener;\n Owner = owner;\n }\n if (!node.updatedAt || node.updatedAt <= time) {\n if (node.updatedAt != null && \"observers\" in node) {\n writeSignal(node, nextValue, true);\n } else if (Transition && Transition.running && node.pure) {\n Transition.sources.add(node);\n node.tValue = nextValue;\n } else node.value = nextValue;\n node.updatedAt = time;\n }\n}\nfunction createComputation(fn, init, pure, state = STALE, options) {\n const c = {\n fn,\n state: state,\n updatedAt: null,\n owned: null,\n sources: null,\n sourceSlots: null,\n cleanups: null,\n value: init,\n owner: Owner,\n context: Owner ? Owner.context : null,\n pure\n };\n if (Transition && Transition.running) {\n c.state = 0;\n c.tState = state;\n }\n if (Owner === null);\n else if (Owner !== UNOWNED) {\n if (Transition && Transition.running && Owner.pure) {\n if (!Owner.tOwned) Owner.tOwned = [c];\n else Owner.tOwned.push(c);\n } else {\n if (!Owner.owned) Owner.owned = [c];\n else Owner.owned.push(c);\n }\n }\n if (ExternalSourceConfig && c.fn) {\n const [track, trigger] = createSignal(undefined, {\n equals: false\n });\n const ordinary = ExternalSourceConfig.factory(c.fn, trigger);\n onCleanup(() => ordinary.dispose());\n const triggerInTransition = () => startTransition(trigger).then(() => inTransition.dispose());\n const inTransition = ExternalSourceConfig.factory(c.fn, triggerInTransition);\n c.fn = x => {\n track();\n return Transition && Transition.running ? inTransition.track(x) : ordinary.track(x);\n };\n }\n return c;\n}\nfunction runTop(node) {\n const runningTransition = Transition && Transition.running;\n if ((runningTransition ? node.tState : node.state) === 0) return;\n if ((runningTransition ? node.tState : node.state) === PENDING) return lookUpstream(node);\n if (node.suspense && untrack(node.suspense.inFallback)) return node.suspense.effects.push(node);\n const ancestors = [node];\n while ((node = node.owner) && (!node.updatedAt || node.updatedAt < ExecCount)) {\n if (runningTransition && Transition.disposed.has(node)) return;\n if (runningTransition ? node.tState : node.state) ancestors.push(node);\n }\n for (let i = ancestors.length - 1; i >= 0; i--) {\n node = ancestors[i];\n if (runningTransition) {\n let top = node,\n prev = ancestors[i + 1];\n while ((top = top.owner) && top !== prev) {\n if (Transition.disposed.has(top)) return;\n }\n }\n if ((runningTransition ? node.tState : node.state) === STALE) {\n updateComputation(node);\n } else if ((runningTransition ? node.tState : node.state) === PENDING) {\n const updates = Updates;\n Updates = null;\n runUpdates(() => lookUpstream(node, ancestors[0]), false);\n Updates = updates;\n }\n }\n}\nfunction runUpdates(fn, init) {\n if (Updates) return fn();\n let wait = false;\n if (!init) Updates = [];\n if (Effects) wait = true;\n else Effects = [];\n ExecCount++;\n try {\n const res = fn();\n completeUpdates(wait);\n return res;\n } catch (err) {\n if (!wait) Effects = null;\n Updates = null;\n handleError(err);\n }\n}\nfunction completeUpdates(wait) {\n if (Updates) {\n if (Scheduler && Transition && Transition.running) scheduleQueue(Updates);\n else runQueue(Updates);\n Updates = null;\n }\n if (wait) return;\n let res;\n if (Transition) {\n if (!Transition.promises.size && !Transition.queue.size) {\n const sources = Transition.sources;\n const disposed = Transition.disposed;\n Effects.push.apply(Effects, Transition.effects);\n res = Transition.resolve;\n for (const e of Effects) {\n \"tState\" in e && (e.state = e.tState);\n delete e.tState;\n }\n Transition = null;\n runUpdates(() => {\n for (const d of disposed) cleanNode(d);\n for (const v of sources) {\n v.value = v.tValue;\n if (v.owned) {\n for (let i = 0, len = v.owned.length; i < len; i++) cleanNode(v.owned[i]);\n }\n if (v.tOwned) v.owned = v.tOwned;\n delete v.tValue;\n delete v.tOwned;\n v.tState = 0;\n }\n setTransPending(false);\n }, false);\n } else if (Transition.running) {\n Transition.running = false;\n Transition.effects.push.apply(Transition.effects, Effects);\n Effects = null;\n setTransPending(true);\n return;\n }\n }\n const e = Effects;\n Effects = null;\n if (e.length) runUpdates(() => runEffects(e), false);\n if (res) res();\n}\nfunction runQueue(queue) {\n for (let i = 0; i < queue.length; i++) runTop(queue[i]);\n}\nfunction scheduleQueue(queue) {\n for (let i = 0; i < queue.length; i++) {\n const item = queue[i];\n const tasks = Transition.queue;\n if (!tasks.has(item)) {\n tasks.add(item);\n Scheduler(() => {\n tasks.delete(item);\n runUpdates(() => {\n Transition.running = true;\n runTop(item);\n }, false);\n Transition && (Transition.running = false);\n });\n }\n }\n}\nfunction runUserEffects(queue) {\n let i,\n userLength = 0;\n for (i = 0; i < queue.length; i++) {\n const e = queue[i];\n if (!e.user) runTop(e);\n else queue[userLength++] = e;\n }\n if (sharedConfig.context) {\n if (sharedConfig.count) {\n sharedConfig.effects || (sharedConfig.effects = []);\n sharedConfig.effects.push(...queue.slice(0, userLength));\n return;\n }\n setHydrateContext();\n }\n if (sharedConfig.effects && (sharedConfig.done || !sharedConfig.count)) {\n queue = [...sharedConfig.effects, ...queue];\n userLength += sharedConfig.effects.length;\n delete sharedConfig.effects;\n }\n for (i = 0; i < userLength; i++) runTop(queue[i]);\n}\nfunction lookUpstream(node, ignore) {\n const runningTransition = Transition && Transition.running;\n if (runningTransition) node.tState = 0;\n else node.state = 0;\n for (let i = 0; i < node.sources.length; i += 1) {\n const source = node.sources[i];\n if (source.sources) {\n const state = runningTransition ? source.tState : source.state;\n if (state === STALE) {\n if (source !== ignore && (!source.updatedAt || source.updatedAt < ExecCount))\n runTop(source);\n } else if (state === PENDING) lookUpstream(source, ignore);\n }\n }\n}\nfunction markDownstream(node) {\n const runningTransition = Transition && Transition.running;\n for (let i = 0; i < node.observers.length; i += 1) {\n const o = node.observers[i];\n if (runningTransition ? !o.tState : !o.state) {\n if (runningTransition) o.tState = PENDING;\n else o.state = PENDING;\n if (o.pure) Updates.push(o);\n else Effects.push(o);\n o.observers && markDownstream(o);\n }\n }\n}\nfunction cleanNode(node) {\n let i;\n if (node.sources) {\n while (node.sources.length) {\n const source = node.sources.pop(),\n index = node.sourceSlots.pop(),\n obs = source.observers;\n if (obs && obs.length) {\n const n = obs.pop(),\n s = source.observerSlots.pop();\n if (index < obs.length) {\n n.sourceSlots[s] = index;\n obs[index] = n;\n source.observerSlots[index] = s;\n }\n }\n }\n }\n if (node.tOwned) {\n for (i = node.tOwned.length - 1; i >= 0; i--) cleanNode(node.tOwned[i]);\n delete node.tOwned;\n }\n if (Transition && Transition.running && node.pure) {\n reset(node, true);\n } else if (node.owned) {\n for (i = node.owned.length - 1; i >= 0; i--) cleanNode(node.owned[i]);\n node.owned = null;\n }\n if (node.cleanups) {\n for (i = node.cleanups.length - 1; i >= 0; i--) node.cleanups[i]();\n node.cleanups = null;\n }\n if (Transition && Transition.running) node.tState = 0;\n else node.state = 0;\n}\nfunction reset(node, top) {\n if (!top) {\n node.tState = 0;\n Transition.disposed.add(node);\n }\n if (node.owned) {\n for (let i = 0; i < node.owned.length; i++) reset(node.owned[i]);\n }\n}\nfunction castError(err) {\n if (err instanceof Error) return err;\n return new Error(typeof err === \"string\" ? err : \"Unknown error\", {\n cause: err\n });\n}\nfunction runErrors(err, fns, owner) {\n try {\n for (const f of fns) f(err);\n } catch (e) {\n handleError(e, (owner && owner.owner) || null);\n }\n}\nfunction handleError(err, owner = Owner) {\n const fns = ERROR && owner && owner.context && owner.context[ERROR];\n const error = castError(err);\n if (!fns) throw error;\n if (Effects)\n Effects.push({\n fn() {\n runErrors(error, fns, owner);\n },\n state: STALE\n });\n else runErrors(error, fns, owner);\n}\nfunction resolveChildren(children) {\n if (typeof children === \"function\" && !children.length) return resolveChildren(children());\n if (Array.isArray(children)) {\n const results = [];\n for (let i = 0; i < children.length; i++) {\n const result = resolveChildren(children[i]);\n Array.isArray(result) ? results.push.apply(results, result) : results.push(result);\n }\n return results;\n }\n return children;\n}\nfunction createProvider(id, options) {\n return function provider(props) {\n let res;\n createRenderEffect(\n () =>\n (res = untrack(() => {\n Owner.context = {\n ...Owner.context,\n [id]: props.value\n };\n return children(() => props.children);\n })),\n undefined\n );\n return res;\n };\n}\nfunction onError(fn) {\n ERROR || (ERROR = Symbol(\"error\"));\n if (Owner === null);\n else if (Owner.context === null || !Owner.context[ERROR]) {\n Owner.context = {\n ...Owner.context,\n [ERROR]: [fn]\n };\n mutateContext(Owner, ERROR, [fn]);\n } else Owner.context[ERROR].push(fn);\n}\nfunction mutateContext(o, key, value) {\n if (o.owned) {\n for (let i = 0; i < o.owned.length; i++) {\n if (o.owned[i].context === o.context) mutateContext(o.owned[i], key, value);\n if (!o.owned[i].context) {\n o.owned[i].context = o.context;\n mutateContext(o.owned[i], key, value);\n } else if (!o.owned[i].context[key]) {\n o.owned[i].context[key] = value;\n mutateContext(o.owned[i], key, value);\n }\n }\n }\n}\n\nfunction observable(input) {\n return {\n subscribe(observer) {\n if (!(observer instanceof Object) || observer == null) {\n throw new TypeError(\"Expected the observer to be an object.\");\n }\n const handler =\n typeof observer === \"function\" ? observer : observer.next && observer.next.bind(observer);\n if (!handler) {\n return {\n unsubscribe() {}\n };\n }\n const dispose = createRoot(disposer => {\n createEffect(() => {\n const v = input();\n untrack(() => handler(v));\n });\n return disposer;\n });\n if (getOwner()) onCleanup(dispose);\n return {\n unsubscribe() {\n dispose();\n }\n };\n },\n [Symbol.observable || \"@@observable\"]() {\n return this;\n }\n };\n}\nfunction from(producer) {\n const [s, set] = createSignal(undefined, {\n equals: false\n });\n if (\"subscribe\" in producer) {\n const unsub = producer.subscribe(v => set(() => v));\n onCleanup(() => (\"unsubscribe\" in unsub ? unsub.unsubscribe() : unsub()));\n } else {\n const clean = producer(set);\n onCleanup(clean);\n }\n return s;\n}\n\nconst FALLBACK = Symbol(\"fallback\");\nfunction dispose(d) {\n for (let i = 0; i < d.length; i++) d[i]();\n}\nfunction mapArray(list, mapFn, options = {}) {\n let items = [],\n mapped = [],\n disposers = [],\n len = 0,\n indexes = mapFn.length > 1 ? [] : null;\n onCleanup(() => dispose(disposers));\n return () => {\n let newItems = list() || [],\n newLen = newItems.length,\n i,\n j;\n newItems[$TRACK];\n return untrack(() => {\n let newIndices, newIndicesNext, temp, tempdisposers, tempIndexes, start, end, newEnd, item;\n if (newLen === 0) {\n if (len !== 0) {\n dispose(disposers);\n disposers = [];\n items = [];\n mapped = [];\n len = 0;\n indexes && (indexes = []);\n }\n if (options.fallback) {\n items = [FALLBACK];\n mapped[0] = createRoot(disposer => {\n disposers[0] = disposer;\n return options.fallback();\n });\n len = 1;\n }\n } else if (len === 0) {\n mapped = new Array(newLen);\n for (j = 0; j < newLen; j++) {\n items[j] = newItems[j];\n mapped[j] = createRoot(mapper);\n }\n len = newLen;\n } else {\n temp = new Array(newLen);\n tempdisposers = new Array(newLen);\n indexes && (tempIndexes = new Array(newLen));\n for (\n start = 0, end = Math.min(len, newLen);\n start < end && items[start] === newItems[start];\n start++\n );\n for (\n end = len - 1, newEnd = newLen - 1;\n end >= start && newEnd >= start && items[end] === newItems[newEnd];\n end--, newEnd--\n ) {\n temp[newEnd] = mapped[end];\n tempdisposers[newEnd] = disposers[end];\n indexes && (tempIndexes[newEnd] = indexes[end]);\n }\n newIndices = new Map();\n newIndicesNext = new Array(newEnd + 1);\n for (j = newEnd; j >= start; j--) {\n item = newItems[j];\n i = newIndices.get(item);\n newIndicesNext[j] = i === undefined ? -1 : i;\n newIndices.set(item, j);\n }\n for (i = start; i <= end; i++) {\n item = items[i];\n j = newIndices.get(item);\n if (j !== undefined && j !== -1) {\n temp[j] = mapped[i];\n tempdisposers[j] = disposers[i];\n indexes && (tempIndexes[j] = indexes[i]);\n j = newIndicesNext[j];\n newIndices.set(item, j);\n } else disposers[i]();\n }\n for (j = start; j < newLen; j++) {\n if (j in temp) {\n mapped[j] = temp[j];\n disposers[j] = tempdisposers[j];\n if (indexes) {\n indexes[j] = tempIndexes[j];\n indexes[j](j);\n }\n } else mapped[j] = createRoot(mapper);\n }\n mapped = mapped.slice(0, (len = newLen));\n items = newItems.slice(0);\n }\n return mapped;\n });\n function mapper(disposer) {\n disposers[j] = disposer;\n if (indexes) {\n const [s, set] = createSignal(j);\n indexes[j] = set;\n return mapFn(newItems[j], s);\n }\n return mapFn(newItems[j]);\n }\n };\n}\nfunction indexArray(list, mapFn, options = {}) {\n let items = [],\n mapped = [],\n disposers = [],\n signals = [],\n len = 0,\n i;\n onCleanup(() => dispose(disposers));\n return () => {\n const newItems = list() || [],\n newLen = newItems.length;\n newItems[$TRACK];\n return untrack(() => {\n if (newLen === 0) {\n if (len !== 0) {\n dispose(disposers);\n disposers = [];\n items = [];\n mapped = [];\n len = 0;\n signals = [];\n }\n if (options.fallback) {\n items = [FALLBACK];\n mapped[0] = createRoot(disposer => {\n disposers[0] = disposer;\n return options.fallback();\n });\n len = 1;\n }\n return mapped;\n }\n if (items[0] === FALLBACK) {\n disposers[0]();\n disposers = [];\n items = [];\n mapped = [];\n len = 0;\n }\n for (i = 0; i < newLen; i++) {\n if (i < items.length && items[i] !== newItems[i]) {\n signals[i](() => newItems[i]);\n } else if (i >= items.length) {\n mapped[i] = createRoot(mapper);\n }\n }\n for (; i < items.length; i++) {\n disposers[i]();\n }\n len = signals.length = disposers.length = newLen;\n items = newItems.slice(0);\n return (mapped = mapped.slice(0, len));\n });\n function mapper(disposer) {\n disposers[i] = disposer;\n const [s, set] = createSignal(newItems[i]);\n signals[i] = set;\n return mapFn(s, i);\n }\n };\n}\n\nlet hydrationEnabled = false;\nfunction enableHydration() {\n hydrationEnabled = true;\n}\nfunction createComponent(Comp, props) {\n if (hydrationEnabled) {\n if (sharedConfig.context) {\n const c = sharedConfig.context;\n setHydrateContext(nextHydrateContext());\n const r = untrack(() => Comp(props || {}));\n setHydrateContext(c);\n return r;\n }\n }\n return untrack(() => Comp(props || {}));\n}\nfunction trueFn() {\n return true;\n}\nconst propTraps = {\n get(_, property, receiver) {\n if (property === $PROXY) return receiver;\n return _.get(property);\n },\n has(_, property) {\n if (property === $PROXY) return true;\n return _.has(property);\n },\n set: trueFn,\n deleteProperty: trueFn,\n getOwnPropertyDescriptor(_, property) {\n return {\n configurable: true,\n enumerable: true,\n get() {\n return _.get(property);\n },\n set: trueFn,\n deleteProperty: trueFn\n };\n },\n ownKeys(_) {\n return _.keys();\n }\n};\nfunction resolveSource(s) {\n return !(s = typeof s === \"function\" ? s() : s) ? {} : s;\n}\nfunction resolveSources() {\n for (let i = 0, length = this.length; i < length; ++i) {\n const v = this[i]();\n if (v !== undefined) return v;\n }\n}\nfunction mergeProps(...sources) {\n let proxy = false;\n for (let i = 0; i < sources.length; i++) {\n const s = sources[i];\n proxy = proxy || (!!s && $PROXY in s);\n sources[i] = typeof s === \"function\" ? ((proxy = true), createMemo(s)) : s;\n }\n if (SUPPORTS_PROXY && proxy) {\n return new Proxy(\n {\n get(property) {\n for (let i = sources.length - 1; i >= 0; i--) {\n const v = resolveSource(sources[i])[property];\n if (v !== undefined) return v;\n }\n },\n has(property) {\n for (let i = sources.length - 1; i >= 0; i--) {\n if (property in resolveSource(sources[i])) return true;\n }\n return false;\n },\n keys() {\n const keys = [];\n for (let i = 0; i < sources.length; i++)\n keys.push(...Object.keys(resolveSource(sources[i])));\n return [...new Set(keys)];\n }\n },\n propTraps\n );\n }\n const sourcesMap = {};\n const defined = Object.create(null);\n for (let i = sources.length - 1; i >= 0; i--) {\n const source = sources[i];\n if (!source) continue;\n const sourceKeys = Object.getOwnPropertyNames(source);\n for (let i = sourceKeys.length - 1; i >= 0; i--) {\n const key = sourceKeys[i];\n if (key === \"__proto__\" || key === \"constructor\") continue;\n const desc = Object.getOwnPropertyDescriptor(source, key);\n if (!defined[key]) {\n defined[key] = desc.get\n ? {\n enumerable: true,\n configurable: true,\n get: resolveSources.bind((sourcesMap[key] = [desc.get.bind(source)]))\n }\n : desc.value !== undefined\n ? desc\n : undefined;\n } else {\n const sources = sourcesMap[key];\n if (sources) {\n if (desc.get) sources.push(desc.get.bind(source));\n else if (desc.value !== undefined) sources.push(() => desc.value);\n }\n }\n }\n }\n const target = {};\n const definedKeys = Object.keys(defined);\n for (let i = definedKeys.length - 1; i >= 0; i--) {\n const key = definedKeys[i],\n desc = defined[key];\n if (desc && desc.get) Object.defineProperty(target, key, desc);\n else target[key] = desc ? desc.value : undefined;\n }\n return target;\n}\nfunction splitProps(props, ...keys) {\n if (SUPPORTS_PROXY && $PROXY in props) {\n const blocked = new Set(keys.length > 1 ? keys.flat() : keys[0]);\n const res = keys.map(k => {\n return new Proxy(\n {\n get(property) {\n return k.includes(property) ? props[property] : undefined;\n },\n has(property) {\n return k.includes(property) && property in props;\n },\n keys() {\n return k.filter(property => property in props);\n }\n },\n propTraps\n );\n });\n res.push(\n new Proxy(\n {\n get(property) {\n return blocked.has(property) ? undefined : props[property];\n },\n has(property) {\n return blocked.has(property) ? false : property in props;\n },\n keys() {\n return Object.keys(props).filter(k => !blocked.has(k));\n }\n },\n propTraps\n )\n );\n return res;\n }\n const otherObject = {};\n const objects = keys.map(() => ({}));\n for (const propName of Object.getOwnPropertyNames(props)) {\n const desc = Object.getOwnPropertyDescriptor(props, propName);\n const isDefaultDesc =\n !desc.get && !desc.set && desc.enumerable && desc.writable && desc.configurable;\n let blocked = false;\n let objectIndex = 0;\n for (const k of keys) {\n if (k.includes(propName)) {\n blocked = true;\n isDefaultDesc\n ? (objects[objectIndex][propName] = desc.value)\n : Object.defineProperty(objects[objectIndex], propName, desc);\n }\n ++objectIndex;\n }\n if (!blocked) {\n isDefaultDesc\n ? (otherObject[propName] = desc.value)\n : Object.defineProperty(otherObject, propName, desc);\n }\n }\n return [...objects, otherObject];\n}\nfunction lazy(fn) {\n let comp;\n let p;\n const wrap = props => {\n const ctx = sharedConfig.context;\n if (ctx) {\n const [s, set] = createSignal();\n sharedConfig.count || (sharedConfig.count = 0);\n sharedConfig.count++;\n (p || (p = fn())).then(mod => {\n !sharedConfig.done && setHydrateContext(ctx);\n sharedConfig.count--;\n set(() => mod.default);\n setHydrateContext();\n });\n comp = s;\n } else if (!comp) {\n const [s] = createResource(() => (p || (p = fn())).then(mod => mod.default));\n comp = s;\n }\n let Comp;\n return createMemo(() =>\n (Comp = comp())\n ? untrack(() => {\n if (false);\n if (!ctx || sharedConfig.done) return Comp(props);\n const c = sharedConfig.context;\n setHydrateContext(ctx);\n const r = Comp(props);\n setHydrateContext(c);\n return r;\n })\n : \"\"\n );\n };\n wrap.preload = () => p || ((p = fn()).then(mod => (comp = () => mod.default)), p);\n return wrap;\n}\nlet counter = 0;\nfunction createUniqueId() {\n const ctx = sharedConfig.context;\n return ctx ? sharedConfig.getNextContextId() : `cl-${counter++}`;\n}\n\nconst narrowedError = name => `Stale read from <${name}>.`;\nfunction For(props) {\n const fallback = \"fallback\" in props && {\n fallback: () => props.fallback\n };\n return createMemo(mapArray(() => props.each, props.children, fallback || undefined));\n}\nfunction Index(props) {\n const fallback = \"fallback\" in props && {\n fallback: () => props.fallback\n };\n return createMemo(indexArray(() => props.each, props.children, fallback || undefined));\n}\nfunction Show(props) {\n const keyed = props.keyed;\n const condition = createMemo(() => props.when, undefined, {\n equals: (a, b) => (keyed ? a === b : !a === !b)\n });\n return createMemo(\n () => {\n const c = condition();\n if (c) {\n const child = props.children;\n const fn = typeof child === \"function\" && child.length > 0;\n return fn\n ? untrack(() =>\n child(\n keyed\n ? c\n : () => {\n if (!untrack(condition)) throw narrowedError(\"Show\");\n return props.when;\n }\n )\n )\n : child;\n }\n return props.fallback;\n },\n undefined,\n undefined\n );\n}\nfunction Switch(props) {\n let keyed = false;\n const equals = (a, b) => (keyed ? a[1] === b[1] : !a[1] === !b[1]) && a[2] === b[2];\n const conditions = children(() => props.children),\n evalConditions = createMemo(\n () => {\n let conds = conditions();\n if (!Array.isArray(conds)) conds = [conds];\n for (let i = 0; i < conds.length; i++) {\n const c = conds[i].when;\n if (c) {\n keyed = !!conds[i].keyed;\n return [i, c, conds[i]];\n }\n }\n return [-1];\n },\n undefined,\n {\n equals\n }\n );\n return createMemo(\n () => {\n const [index, when, cond] = evalConditions();\n if (index < 0) return props.fallback;\n const c = cond.children;\n const fn = typeof c === \"function\" && c.length > 0;\n return fn\n ? untrack(() =>\n c(\n keyed\n ? when\n : () => {\n if (untrack(evalConditions)[0] !== index) throw narrowedError(\"Match\");\n return cond.when;\n }\n )\n )\n : c;\n },\n undefined,\n undefined\n );\n}\nfunction Match(props) {\n return props;\n}\nlet Errors;\nfunction resetErrorBoundaries() {\n Errors && [...Errors].forEach(fn => fn());\n}\nfunction ErrorBoundary(props) {\n let err;\n if (sharedConfig.context && sharedConfig.load)\n err = sharedConfig.load(sharedConfig.getContextId());\n const [errored, setErrored] = createSignal(err, undefined);\n Errors || (Errors = new Set());\n Errors.add(setErrored);\n onCleanup(() => Errors.delete(setErrored));\n return createMemo(\n () => {\n let e;\n if ((e = errored())) {\n const f = props.fallback;\n return typeof f === \"function\" && f.length ? untrack(() => f(e, () => setErrored())) : f;\n }\n return catchError(() => props.children, setErrored);\n },\n undefined,\n undefined\n );\n}\n\nconst suspenseListEquals = (a, b) =>\n a.showContent === b.showContent && a.showFallback === b.showFallback;\nconst SuspenseListContext = /* #__PURE__ */ createContext();\nfunction SuspenseList(props) {\n let [wrapper, setWrapper] = createSignal(() => ({\n inFallback: false\n })),\n show;\n const listContext = useContext(SuspenseListContext);\n const [registry, setRegistry] = createSignal([]);\n if (listContext) {\n show = listContext.register(createMemo(() => wrapper()().inFallback));\n }\n const resolved = createMemo(\n prev => {\n const reveal = props.revealOrder,\n tail = props.tail,\n { showContent = true, showFallback = true } = show ? show() : {},\n reg = registry(),\n reverse = reveal === \"backwards\";\n if (reveal === \"together\") {\n const all = reg.every(inFallback => !inFallback());\n const res = reg.map(() => ({\n showContent: all && showContent,\n showFallback\n }));\n res.inFallback = !all;\n return res;\n }\n let stop = false;\n let inFallback = prev.inFallback;\n const res = [];\n for (let i = 0, len = reg.length; i < len; i++) {\n const n = reverse ? len - i - 1 : i,\n s = reg[n]();\n if (!stop && !s) {\n res[n] = {\n showContent,\n showFallback\n };\n } else {\n const next = !stop;\n if (next) inFallback = true;\n res[n] = {\n showContent: next,\n showFallback: !tail || (next && tail === \"collapsed\") ? showFallback : false\n };\n stop = true;\n }\n }\n if (!stop) inFallback = false;\n res.inFallback = inFallback;\n return res;\n },\n {\n inFallback: false\n }\n );\n setWrapper(() => resolved);\n return createComponent(SuspenseListContext.Provider, {\n value: {\n register: inFallback => {\n let index;\n setRegistry(registry => {\n index = registry.length;\n return [...registry, inFallback];\n });\n return createMemo(() => resolved()[index], undefined, {\n equals: suspenseListEquals\n });\n }\n },\n get children() {\n return props.children;\n }\n });\n}\nfunction Suspense(props) {\n let counter = 0,\n show,\n ctx,\n p,\n flicker,\n error;\n const [inFallback, setFallback] = createSignal(false),\n SuspenseContext = getSuspenseContext(),\n store = {\n increment: () => {\n if (++counter === 1) setFallback(true);\n },\n decrement: () => {\n if (--counter === 0) setFallback(false);\n },\n inFallback,\n effects: [],\n resolved: false\n },\n owner = getOwner();\n if (sharedConfig.context && sharedConfig.load) {\n const key = sharedConfig.getContextId();\n let ref = sharedConfig.load(key);\n if (ref) {\n if (typeof ref !== \"object\" || ref.status !== \"success\") p = ref;\n else sharedConfig.gather(key);\n }\n if (p && p !== \"$$f\") {\n const [s, set] = createSignal(undefined, {\n equals: false\n });\n flicker = s;\n p.then(\n () => {\n if (sharedConfig.done) return set();\n sharedConfig.gather(key);\n setHydrateContext(ctx);\n set();\n setHydrateContext();\n },\n err => {\n error = err;\n set();\n }\n );\n }\n }\n const listContext = useContext(SuspenseListContext);\n if (listContext) show = listContext.register(store.inFallback);\n let dispose;\n onCleanup(() => dispose && dispose());\n return createComponent(SuspenseContext.Provider, {\n value: store,\n get children() {\n return createMemo(() => {\n if (error) throw error;\n ctx = sharedConfig.context;\n if (flicker) {\n flicker();\n return (flicker = undefined);\n }\n if (ctx && p === \"$$f\") setHydrateContext();\n const rendered = createMemo(() => props.children);\n return createMemo(prev => {\n const inFallback = store.inFallback(),\n { showContent = true, showFallback = true } = show ? show() : {};\n if ((!inFallback || (p && p !== \"$$f\")) && showContent) {\n store.resolved = true;\n dispose && dispose();\n dispose = ctx = p = undefined;\n resumeEffects(store.effects);\n return rendered();\n }\n if (!showFallback) return;\n if (dispose) return prev;\n return createRoot(disposer => {\n dispose = disposer;\n if (ctx) {\n setHydrateContext({\n id: ctx.id + \"F\",\n count: 0\n });\n ctx = undefined;\n }\n return props.fallback;\n }, owner);\n });\n });\n }\n });\n}\n\nconst DEV = undefined;\n\nexport {\n $DEVCOMP,\n $PROXY,\n $TRACK,\n DEV,\n ErrorBoundary,\n For,\n Index,\n Match,\n Show,\n Suspense,\n SuspenseList,\n Switch,\n batch,\n cancelCallback,\n catchError,\n children,\n createComponent,\n createComputed,\n createContext,\n createDeferred,\n createEffect,\n createMemo,\n createReaction,\n createRenderEffect,\n createResource,\n createRoot,\n createSelector,\n createSignal,\n createUniqueId,\n enableExternalSource,\n enableHydration,\n enableScheduling,\n equalFn,\n from,\n getListener,\n getOwner,\n indexArray,\n lazy,\n mapArray,\n mergeProps,\n observable,\n on,\n onCleanup,\n onError,\n onMount,\n requestCallback,\n resetErrorBoundaries,\n runWithOwner,\n sharedConfig,\n splitProps,\n startTransition,\n untrack,\n useContext,\n useTransition\n};\n","import {\n createRoot,\n createRenderEffect,\n untrack,\n sharedConfig,\n enableHydration,\n getOwner,\n createEffect,\n runWithOwner,\n createMemo,\n createSignal,\n onCleanup,\n splitProps\n} from \"solid-js\";\nexport {\n ErrorBoundary,\n For,\n Index,\n Match,\n Show,\n Suspense,\n SuspenseList,\n Switch,\n createComponent,\n createRenderEffect as effect,\n getOwner,\n createMemo as memo,\n mergeProps,\n untrack\n} from \"solid-js\";\n\nconst booleans = [\n \"allowfullscreen\",\n \"async\",\n \"autofocus\",\n \"autoplay\",\n \"checked\",\n \"controls\",\n \"default\",\n \"disabled\",\n \"formnovalidate\",\n \"hidden\",\n \"indeterminate\",\n \"inert\",\n \"ismap\",\n \"loop\",\n \"multiple\",\n \"muted\",\n \"nomodule\",\n \"novalidate\",\n \"open\",\n \"playsinline\",\n \"readonly\",\n \"required\",\n \"reversed\",\n \"seamless\",\n \"selected\"\n];\nconst Properties = /*#__PURE__*/ new Set([\n \"className\",\n \"value\",\n \"readOnly\",\n \"formNoValidate\",\n \"isMap\",\n \"noModule\",\n \"playsInline\",\n ...booleans\n]);\nconst ChildProperties = /*#__PURE__*/ new Set([\n \"innerHTML\",\n \"textContent\",\n \"innerText\",\n \"children\"\n]);\nconst Aliases = /*#__PURE__*/ Object.assign(Object.create(null), {\n className: \"class\",\n htmlFor: \"for\"\n});\nconst PropAliases = /*#__PURE__*/ Object.assign(Object.create(null), {\n class: \"className\",\n formnovalidate: {\n $: \"formNoValidate\",\n BUTTON: 1,\n INPUT: 1\n },\n ismap: {\n $: \"isMap\",\n IMG: 1\n },\n nomodule: {\n $: \"noModule\",\n SCRIPT: 1\n },\n playsinline: {\n $: \"playsInline\",\n VIDEO: 1\n },\n readonly: {\n $: \"readOnly\",\n INPUT: 1,\n TEXTAREA: 1\n }\n});\nfunction getPropAlias(prop, tagName) {\n const a = PropAliases[prop];\n return typeof a === \"object\" ? (a[tagName] ? a[\"$\"] : undefined) : a;\n}\nconst DelegatedEvents = /*#__PURE__*/ new Set([\n \"beforeinput\",\n \"click\",\n \"dblclick\",\n \"contextmenu\",\n \"focusin\",\n \"focusout\",\n \"input\",\n \"keydown\",\n \"keyup\",\n \"mousedown\",\n \"mousemove\",\n \"mouseout\",\n \"mouseover\",\n \"mouseup\",\n \"pointerdown\",\n \"pointermove\",\n \"pointerout\",\n \"pointerover\",\n \"pointerup\",\n \"touchend\",\n \"touchmove\",\n \"touchstart\"\n]);\nconst SVGElements = /*#__PURE__*/ new Set([\n \"altGlyph\",\n \"altGlyphDef\",\n \"altGlyphItem\",\n \"animate\",\n \"animateColor\",\n \"animateMotion\",\n \"animateTransform\",\n \"circle\",\n \"clipPath\",\n \"color-profile\",\n \"cursor\",\n \"defs\",\n \"desc\",\n \"ellipse\",\n \"feBlend\",\n \"feColorMatrix\",\n \"feComponentTransfer\",\n \"feComposite\",\n \"feConvolveMatrix\",\n \"feDiffuseLighting\",\n \"feDisplacementMap\",\n \"feDistantLight\",\n \"feDropShadow\",\n \"feFlood\",\n \"feFuncA\",\n \"feFuncB\",\n \"feFuncG\",\n \"feFuncR\",\n \"feGaussianBlur\",\n \"feImage\",\n \"feMerge\",\n \"feMergeNode\",\n \"feMorphology\",\n \"feOffset\",\n \"fePointLight\",\n \"feSpecularLighting\",\n \"feSpotLight\",\n \"feTile\",\n \"feTurbulence\",\n \"filter\",\n \"font\",\n \"font-face\",\n \"font-face-format\",\n \"font-face-name\",\n \"font-face-src\",\n \"font-face-uri\",\n \"foreignObject\",\n \"g\",\n \"glyph\",\n \"glyphRef\",\n \"hkern\",\n \"image\",\n \"line\",\n \"linearGradient\",\n \"marker\",\n \"mask\",\n \"metadata\",\n \"missing-glyph\",\n \"mpath\",\n \"path\",\n \"pattern\",\n \"polygon\",\n \"polyline\",\n \"radialGradient\",\n \"rect\",\n \"set\",\n \"stop\",\n \"svg\",\n \"switch\",\n \"symbol\",\n \"text\",\n \"textPath\",\n \"tref\",\n \"tspan\",\n \"use\",\n \"view\",\n \"vkern\"\n]);\nconst SVGNamespace = {\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\"\n};\nconst DOMElements = /*#__PURE__*/ new Set([\n \"html\",\n \"base\",\n \"head\",\n \"link\",\n \"meta\",\n \"style\",\n \"title\",\n \"body\",\n \"address\",\n \"article\",\n \"aside\",\n \"footer\",\n \"header\",\n \"main\",\n \"nav\",\n \"section\",\n \"body\",\n \"blockquote\",\n \"dd\",\n \"div\",\n \"dl\",\n \"dt\",\n \"figcaption\",\n \"figure\",\n \"hr\",\n \"li\",\n \"ol\",\n \"p\",\n \"pre\",\n \"ul\",\n \"a\",\n \"abbr\",\n \"b\",\n \"bdi\",\n \"bdo\",\n \"br\",\n \"cite\",\n \"code\",\n \"data\",\n \"dfn\",\n \"em\",\n \"i\",\n \"kbd\",\n \"mark\",\n \"q\",\n \"rp\",\n \"rt\",\n \"ruby\",\n \"s\",\n \"samp\",\n \"small\",\n \"span\",\n \"strong\",\n \"sub\",\n \"sup\",\n \"time\",\n \"u\",\n \"var\",\n \"wbr\",\n \"area\",\n \"audio\",\n \"img\",\n \"map\",\n \"track\",\n \"video\",\n \"embed\",\n \"iframe\",\n \"object\",\n \"param\",\n \"picture\",\n \"portal\",\n \"source\",\n \"svg\",\n \"math\",\n \"canvas\",\n \"noscript\",\n \"script\",\n \"del\",\n \"ins\",\n \"caption\",\n \"col\",\n \"colgroup\",\n \"table\",\n \"tbody\",\n \"td\",\n \"tfoot\",\n \"th\",\n \"thead\",\n \"tr\",\n \"button\",\n \"datalist\",\n \"fieldset\",\n \"form\",\n \"input\",\n \"label\",\n \"legend\",\n \"meter\",\n \"optgroup\",\n \"option\",\n \"output\",\n \"progress\",\n \"select\",\n \"textarea\",\n \"details\",\n \"dialog\",\n \"menu\",\n \"summary\",\n \"details\",\n \"slot\",\n \"template\",\n \"acronym\",\n \"applet\",\n \"basefont\",\n \"bgsound\",\n \"big\",\n \"blink\",\n \"center\",\n \"content\",\n \"dir\",\n \"font\",\n \"frame\",\n \"frameset\",\n \"hgroup\",\n \"image\",\n \"keygen\",\n \"marquee\",\n \"menuitem\",\n \"nobr\",\n \"noembed\",\n \"noframes\",\n \"plaintext\",\n \"rb\",\n \"rtc\",\n \"shadow\",\n \"spacer\",\n \"strike\",\n \"tt\",\n \"xmp\",\n \"a\",\n \"abbr\",\n \"acronym\",\n \"address\",\n \"applet\",\n \"area\",\n \"article\",\n \"aside\",\n \"audio\",\n \"b\",\n \"base\",\n \"basefont\",\n \"bdi\",\n \"bdo\",\n \"bgsound\",\n \"big\",\n \"blink\",\n \"blockquote\",\n \"body\",\n \"br\",\n \"button\",\n \"canvas\",\n \"caption\",\n \"center\",\n \"cite\",\n \"code\",\n \"col\",\n \"colgroup\",\n \"content\",\n \"data\",\n \"datalist\",\n \"dd\",\n \"del\",\n \"details\",\n \"dfn\",\n \"dialog\",\n \"dir\",\n \"div\",\n \"dl\",\n \"dt\",\n \"em\",\n \"embed\",\n \"fieldset\",\n \"figcaption\",\n \"figure\",\n \"font\",\n \"footer\",\n \"form\",\n \"frame\",\n \"frameset\",\n \"head\",\n \"header\",\n \"hgroup\",\n \"hr\",\n \"html\",\n \"i\",\n \"iframe\",\n \"image\",\n \"img\",\n \"input\",\n \"ins\",\n \"kbd\",\n \"keygen\",\n \"label\",\n \"legend\",\n \"li\",\n \"link\",\n \"main\",\n \"map\",\n \"mark\",\n \"marquee\",\n \"menu\",\n \"menuitem\",\n \"meta\",\n \"meter\",\n \"nav\",\n \"nobr\",\n \"noembed\",\n \"noframes\",\n \"noscript\",\n \"object\",\n \"ol\",\n \"optgroup\",\n \"option\",\n \"output\",\n \"p\",\n \"param\",\n \"picture\",\n \"plaintext\",\n \"portal\",\n \"pre\",\n \"progress\",\n \"q\",\n \"rb\",\n \"rp\",\n \"rt\",\n \"rtc\",\n \"ruby\",\n \"s\",\n \"samp\",\n \"script\",\n \"section\",\n \"select\",\n \"shadow\",\n \"slot\",\n \"small\",\n \"source\",\n \"spacer\",\n \"span\",\n \"strike\",\n \"strong\",\n \"style\",\n \"sub\",\n \"summary\",\n \"sup\",\n \"table\",\n \"tbody\",\n \"td\",\n \"template\",\n \"textarea\",\n \"tfoot\",\n \"th\",\n \"thead\",\n \"time\",\n \"title\",\n \"tr\",\n \"track\",\n \"tt\",\n \"u\",\n \"ul\",\n \"var\",\n \"video\",\n \"wbr\",\n \"xmp\",\n \"input\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\"\n]);\n\nfunction reconcileArrays(parentNode, a, b) {\n let bLength = b.length,\n aEnd = a.length,\n bEnd = bLength,\n aStart = 0,\n bStart = 0,\n after = a[aEnd - 1].nextSibling,\n map = null;\n while (aStart < aEnd || bStart < bEnd) {\n if (a[aStart] === b[bStart]) {\n aStart++;\n bStart++;\n continue;\n }\n while (a[aEnd - 1] === b[bEnd - 1]) {\n aEnd--;\n bEnd--;\n }\n if (aEnd === aStart) {\n const node = bEnd < bLength ? (bStart ? b[bStart - 1].nextSibling : b[bEnd - bStart]) : after;\n while (bStart < bEnd) parentNode.insertBefore(b[bStart++], node);\n } else if (bEnd === bStart) {\n while (aStart < aEnd) {\n if (!map || !map.has(a[aStart])) a[aStart].remove();\n aStart++;\n }\n } else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) {\n const node = a[--aEnd].nextSibling;\n parentNode.insertBefore(b[bStart++], a[aStart++].nextSibling);\n parentNode.insertBefore(b[--bEnd], node);\n a[aEnd] = b[bEnd];\n } else {\n if (!map) {\n map = new Map();\n let i = bStart;\n while (i < bEnd) map.set(b[i], i++);\n }\n const index = map.get(a[aStart]);\n if (index != null) {\n if (bStart < index && index < bEnd) {\n let i = aStart,\n sequence = 1,\n t;\n while (++i < aEnd && i < bEnd) {\n if ((t = map.get(a[i])) == null || t !== index + sequence) break;\n sequence++;\n }\n if (sequence > index - bStart) {\n const node = a[aStart];\n while (bStart < index) parentNode.insertBefore(b[bStart++], node);\n } else parentNode.replaceChild(b[bStart++], a[aStart++]);\n } else aStart++;\n } else a[aStart++].remove();\n }\n }\n}\n\nconst $$EVENTS = \"_$DX_DELEGATE\";\nfunction render(code, element, init, options = {}) {\n let disposer;\n createRoot(dispose => {\n disposer = dispose;\n element === document\n ? code()\n : insert(element, code(), element.firstChild ? null : undefined, init);\n }, options.owner);\n return () => {\n disposer();\n element.textContent = \"\";\n };\n}\nfunction template(html, isImportNode, isSVG) {\n let node;\n const create = () => {\n const t = document.createElement(\"template\");\n t.innerHTML = html;\n return isSVG ? t.content.firstChild.firstChild : t.content.firstChild;\n };\n const fn = isImportNode\n ? () => untrack(() => document.importNode(node || (node = create()), true))\n : () => (node || (node = create())).cloneNode(true);\n fn.cloneNode = fn;\n return fn;\n}\nfunction delegateEvents(eventNames, document = window.document) {\n const e = document[$$EVENTS] || (document[$$EVENTS] = new Set());\n for (let i = 0, l = eventNames.length; i < l; i++) {\n const name = eventNames[i];\n if (!e.has(name)) {\n e.add(name);\n document.addEventListener(name, eventHandler);\n }\n }\n}\nfunction clearDelegatedEvents(document = window.document) {\n if (document[$$EVENTS]) {\n for (let name of document[$$EVENTS].keys()) document.removeEventListener(name, eventHandler);\n delete document[$$EVENTS];\n }\n}\nfunction setProperty(node, name, value) {\n if (isHydrating(node)) return;\n node[name] = value;\n}\nfunction setAttribute(node, name, value) {\n if (isHydrating(node)) return;\n if (value == null) node.removeAttribute(name);\n else node.setAttribute(name, value);\n}\nfunction setAttributeNS(node, namespace, name, value) {\n if (isHydrating(node)) return;\n if (value == null) node.removeAttributeNS(namespace, name);\n else node.setAttributeNS(namespace, name, value);\n}\nfunction setBoolAttribute(node, name, value) {\n if (isHydrating(node)) return;\n value ? node.setAttribute(name, \"\") : node.removeAttribute(name);\n}\nfunction className(node, value) {\n if (isHydrating(node)) return;\n if (value == null) node.removeAttribute(\"class\");\n else node.className = value;\n}\nfunction addEventListener(node, name, handler, delegate) {\n if (delegate) {\n if (Array.isArray(handler)) {\n node[`$$${name}`] = handler[0];\n node[`$$${name}Data`] = handler[1];\n } else node[`$$${name}`] = handler;\n } else if (Array.isArray(handler)) {\n const handlerFn = handler[0];\n node.addEventListener(name, (handler[0] = e => handlerFn.call(node, handler[1], e)));\n } else node.addEventListener(name, handler, typeof handler !== \"function\" && handler);\n}\nfunction classList(node, value, prev = {}) {\n const classKeys = Object.keys(value || {}),\n prevKeys = Object.keys(prev);\n let i, len;\n for (i = 0, len = prevKeys.length; i < len; i++) {\n const key = prevKeys[i];\n if (!key || key === \"undefined\" || value[key]) continue;\n toggleClassKey(node, key, false);\n delete prev[key];\n }\n for (i = 0, len = classKeys.length; i < len; i++) {\n const key = classKeys[i],\n classValue = !!value[key];\n if (!key || key === \"undefined\" || prev[key] === classValue || !classValue) continue;\n toggleClassKey(node, key, true);\n prev[key] = classValue;\n }\n return prev;\n}\nfunction style(node, value, prev) {\n if (!value) return prev ? setAttribute(node, \"style\") : value;\n const nodeStyle = node.style;\n if (typeof value === \"string\") return (nodeStyle.cssText = value);\n typeof prev === \"string\" && (nodeStyle.cssText = prev = undefined);\n prev || (prev = {});\n value || (value = {});\n let v, s;\n for (s in prev) {\n value[s] == null && nodeStyle.removeProperty(s);\n delete prev[s];\n }\n for (s in value) {\n v = value[s];\n if (v !== prev[s]) {\n nodeStyle.setProperty(s, v);\n prev[s] = v;\n }\n }\n return prev;\n}\nfunction spread(node, props = {}, isSVG, skipChildren) {\n const prevProps = {};\n if (!skipChildren) {\n createRenderEffect(\n () => (prevProps.children = insertExpression(node, props.children, prevProps.children))\n );\n }\n createRenderEffect(() => typeof props.ref === \"function\" && use(props.ref, node));\n createRenderEffect(() => assign(node, props, isSVG, true, prevProps, true));\n return prevProps;\n}\nfunction dynamicProperty(props, key) {\n const src = props[key];\n Object.defineProperty(props, key, {\n get() {\n return src();\n },\n enumerable: true\n });\n return props;\n}\nfunction use(fn, element, arg) {\n return untrack(() => fn(element, arg));\n}\nfunction insert(parent, accessor, marker, initial) {\n if (marker !== undefined && !initial) initial = [];\n if (typeof accessor !== \"function\") return insertExpression(parent, accessor, initial, marker);\n createRenderEffect(current => insertExpression(parent, accessor(), current, marker), initial);\n}\nfunction assign(node, props, isSVG, skipChildren, prevProps = {}, skipRef = false) {\n props || (props = {});\n for (const prop in prevProps) {\n if (!(prop in props)) {\n if (prop === \"children\") continue;\n prevProps[prop] = assignProp(node, prop, null, prevProps[prop], isSVG, skipRef, props);\n }\n }\n for (const prop in props) {\n if (prop === \"children\") {\n if (!skipChildren) insertExpression(node, props.children);\n continue;\n }\n const value = props[prop];\n prevProps[prop] = assignProp(node, prop, value, prevProps[prop], isSVG, skipRef, props);\n }\n}\nfunction hydrate$1(code, element, options = {}) {\n if (globalThis._$HY.done) return render(code, element, [...element.childNodes], options);\n sharedConfig.completed = globalThis._$HY.completed;\n sharedConfig.events = globalThis._$HY.events;\n sharedConfig.load = id => globalThis._$HY.r[id];\n sharedConfig.has = id => id in globalThis._$HY.r;\n sharedConfig.gather = root => gatherHydratable(element, root);\n sharedConfig.registry = new Map();\n sharedConfig.context = {\n id: options.renderId || \"\",\n count: 0\n };\n try {\n gatherHydratable(element, options.renderId);\n return render(code, element, [...element.childNodes], options);\n } finally {\n sharedConfig.context = null;\n }\n}\nfunction getNextElement(template) {\n let node,\n key,\n hydrating = isHydrating();\n if (!hydrating || !(node = sharedConfig.registry.get((key = getHydrationKey())))) {\n return template();\n }\n if (sharedConfig.completed) sharedConfig.completed.add(node);\n sharedConfig.registry.delete(key);\n return node;\n}\nfunction getNextMatch(el, nodeName) {\n while (el && el.localName !== nodeName) el = el.nextSibling;\n return el;\n}\nfunction getNextMarker(start) {\n let end = start,\n count = 0,\n current = [];\n if (isHydrating(start)) {\n while (end) {\n if (end.nodeType === 8) {\n const v = end.nodeValue;\n if (v === \"$\") count++;\n else if (v === \"/\") {\n if (count === 0) return [end, current];\n count--;\n }\n }\n current.push(end);\n end = end.nextSibling;\n }\n }\n return [end, current];\n}\nfunction runHydrationEvents() {\n if (sharedConfig.events && !sharedConfig.events.queued) {\n queueMicrotask(() => {\n const { completed, events } = sharedConfig;\n if (!events) return;\n events.queued = false;\n while (events.length) {\n const [el, e] = events[0];\n if (!completed.has(el)) return;\n events.shift();\n eventHandler(e);\n }\n if (sharedConfig.done) {\n sharedConfig.events = _$HY.events = null;\n sharedConfig.completed = _$HY.completed = null;\n }\n });\n sharedConfig.events.queued = true;\n }\n}\nfunction isHydrating(node) {\n return !!sharedConfig.context && !sharedConfig.done && (!node || node.isConnected);\n}\nfunction toPropertyName(name) {\n return name.toLowerCase().replace(/-([a-z])/g, (_, w) => w.toUpperCase());\n}\nfunction toggleClassKey(node, key, value) {\n const classNames = key.trim().split(/\\s+/);\n for (let i = 0, nameLen = classNames.length; i < nameLen; i++)\n node.classList.toggle(classNames[i], value);\n}\nfunction assignProp(node, prop, value, prev, isSVG, skipRef, props) {\n let isCE, isProp, isChildProp, propAlias, forceProp;\n if (prop === \"style\") return style(node, value, prev);\n if (prop === \"classList\") return classList(node, value, prev);\n if (value === prev) return prev;\n if (prop === \"ref\") {\n if (!skipRef) value(node);\n } else if (prop.slice(0, 3) === \"on:\") {\n const e = prop.slice(3);\n prev && node.removeEventListener(e, prev, typeof prev !== \"function\" && prev);\n value && node.addEventListener(e, value, typeof value !== \"function\" && value);\n } else if (prop.slice(0, 10) === \"oncapture:\") {\n const e = prop.slice(10);\n prev && node.removeEventListener(e, prev, true);\n value && node.addEventListener(e, value, true);\n } else if (prop.slice(0, 2) === \"on\") {\n const name = prop.slice(2).toLowerCase();\n const delegate = DelegatedEvents.has(name);\n if (!delegate && prev) {\n const h = Array.isArray(prev) ? prev[0] : prev;\n node.removeEventListener(name, h);\n }\n if (delegate || value) {\n addEventListener(node, name, value, delegate);\n delegate && delegateEvents([name]);\n }\n } else if (prop.slice(0, 5) === \"attr:\") {\n setAttribute(node, prop.slice(5), value);\n } else if (prop.slice(0, 5) === \"bool:\") {\n setBoolAttribute(node, prop.slice(5), value);\n } else if (\n (forceProp = prop.slice(0, 5) === \"prop:\") ||\n (isChildProp = ChildProperties.has(prop)) ||\n (!isSVG &&\n ((propAlias = getPropAlias(prop, node.tagName)) || (isProp = Properties.has(prop)))) ||\n (isCE = node.nodeName.includes(\"-\") || \"is\" in props)\n ) {\n if (forceProp) {\n prop = prop.slice(5);\n isProp = true;\n } else if (isHydrating(node)) return value;\n if (prop === \"class\" || prop === \"className\") className(node, value);\n else if (isCE && !isProp && !isChildProp) node[toPropertyName(prop)] = value;\n else node[propAlias || prop] = value;\n } else {\n const ns = isSVG && prop.indexOf(\":\") > -1 && SVGNamespace[prop.split(\":\")[0]];\n if (ns) setAttributeNS(node, ns, prop, value);\n else setAttribute(node, Aliases[prop] || prop, value);\n }\n return value;\n}\nfunction eventHandler(e) {\n if (sharedConfig.registry && sharedConfig.events) {\n if (sharedConfig.events.find(([el, ev]) => ev === e)) return;\n }\n let node = e.target;\n const key = `$$${e.type}`;\n const oriTarget = e.target;\n const oriCurrentTarget = e.currentTarget;\n const retarget = value =>\n Object.defineProperty(e, \"target\", {\n configurable: true,\n value\n });\n const handleNode = () => {\n const handler = node[key];\n if (handler && !node.disabled) {\n const data = node[`${key}Data`];\n data !== undefined ? handler.call(node, data, e) : handler.call(node, e);\n if (e.cancelBubble) return;\n }\n node.host &&\n typeof node.host !== \"string\" &&\n !node.host._$host &&\n node.contains(e.target) &&\n retarget(node.host);\n return true;\n };\n const walkUpTree = () => {\n while (handleNode() && (node = node._$host || node.parentNode || node.host));\n };\n Object.defineProperty(e, \"currentTarget\", {\n configurable: true,\n get() {\n return node || document;\n }\n });\n if (sharedConfig.registry && !sharedConfig.done) sharedConfig.done = _$HY.done = true;\n if (e.composedPath) {\n const path = e.composedPath();\n retarget(path[0]);\n for (let i = 0; i < path.length - 2; i++) {\n node = path[i];\n if (!handleNode()) break;\n if (node._$host) {\n node = node._$host;\n walkUpTree();\n break;\n }\n if (node.parentNode === oriCurrentTarget) {\n break;\n }\n }\n } else walkUpTree();\n retarget(oriTarget);\n}\nfunction insertExpression(parent, value, current, marker, unwrapArray) {\n const hydrating = isHydrating(parent);\n if (hydrating) {\n !current && (current = [...parent.childNodes]);\n let cleaned = [];\n for (let i = 0; i < current.length; i++) {\n const node = current[i];\n if (node.nodeType === 8 && node.data.slice(0, 2) === \"!$\") node.remove();\n else cleaned.push(node);\n }\n current = cleaned;\n }\n while (typeof current === \"function\") current = current();\n if (value === current) return current;\n const t = typeof value,\n multi = marker !== undefined;\n parent = (multi && current[0] && current[0].parentNode) || parent;\n if (t === \"string\" || t === \"number\") {\n if (hydrating) return current;\n if (t === \"number\") {\n value = value.toString();\n if (value === current) return current;\n }\n if (multi) {\n let node = current[0];\n if (node && node.nodeType === 3) {\n node.data !== value && (node.data = value);\n } else node = document.createTextNode(value);\n current = cleanChildren(parent, current, marker, node);\n } else {\n if (current !== \"\" && typeof current === \"string\") {\n current = parent.firstChild.data = value;\n } else current = parent.textContent = value;\n }\n } else if (value == null || t === \"boolean\") {\n if (hydrating) return current;\n current = cleanChildren(parent, current, marker);\n } else if (t === \"function\") {\n createRenderEffect(() => {\n let v = value();\n while (typeof v === \"function\") v = v();\n current = insertExpression(parent, v, current, marker);\n });\n return () => current;\n } else if (Array.isArray(value)) {\n const array = [];\n const currentArray = current && Array.isArray(current);\n if (normalizeIncomingArray(array, value, current, unwrapArray)) {\n createRenderEffect(() => (current = insertExpression(parent, array, current, marker, true)));\n return () => current;\n }\n if (hydrating) {\n if (!array.length) return current;\n if (marker === undefined) return (current = [...parent.childNodes]);\n let node = array[0];\n if (node.parentNode !== parent) return current;\n const nodes = [node];\n while ((node = node.nextSibling) !== marker) nodes.push(node);\n return (current = nodes);\n }\n if (array.length === 0) {\n current = cleanChildren(parent, current, marker);\n if (multi) return current;\n } else if (currentArray) {\n if (current.length === 0) {\n appendNodes(parent, array, marker);\n } else reconcileArrays(parent, current, array);\n } else {\n current && cleanChildren(parent);\n appendNodes(parent, array);\n }\n current = array;\n } else if (value.nodeType) {\n if (hydrating && value.parentNode) return (current = multi ? [value] : value);\n if (Array.isArray(current)) {\n if (multi) return (current = cleanChildren(parent, current, marker, value));\n cleanChildren(parent, current, null, value);\n } else if (current == null || current === \"\" || !parent.firstChild) {\n parent.appendChild(value);\n } else parent.replaceChild(value, parent.firstChild);\n current = value;\n } else;\n return current;\n}\nfunction normalizeIncomingArray(normalized, array, current, unwrap) {\n let dynamic = false;\n for (let i = 0, len = array.length; i < len; i++) {\n let item = array[i],\n prev = current && current[normalized.length],\n t;\n if (item == null || item === true || item === false);\n else if ((t = typeof item) === \"object\" && item.nodeType) {\n normalized.push(item);\n } else if (Array.isArray(item)) {\n dynamic = normalizeIncomingArray(normalized, item, prev) || dynamic;\n } else if (t === \"function\") {\n if (unwrap) {\n while (typeof item === \"function\") item = item();\n dynamic =\n normalizeIncomingArray(\n normalized,\n Array.isArray(item) ? item : [item],\n Array.isArray(prev) ? prev : [prev]\n ) || dynamic;\n } else {\n normalized.push(item);\n dynamic = true;\n }\n } else {\n const value = String(item);\n if (prev && prev.nodeType === 3 && prev.data === value) normalized.push(prev);\n else normalized.push(document.createTextNode(value));\n }\n }\n return dynamic;\n}\nfunction appendNodes(parent, array, marker = null) {\n for (let i = 0, len = array.length; i < len; i++) parent.insertBefore(array[i], marker);\n}\nfunction cleanChildren(parent, current, marker, replacement) {\n if (marker === undefined) return (parent.textContent = \"\");\n const node = replacement || document.createTextNode(\"\");\n if (current.length) {\n let inserted = false;\n for (let i = current.length - 1; i >= 0; i--) {\n const el = current[i];\n if (node !== el) {\n const isParent = el.parentNode === parent;\n if (!inserted && !i)\n isParent ? parent.replaceChild(node, el) : parent.insertBefore(node, marker);\n else isParent && el.remove();\n } else inserted = true;\n }\n } else parent.insertBefore(node, marker);\n return [node];\n}\nfunction gatherHydratable(element, root) {\n const templates = element.querySelectorAll(`*[data-hk]`);\n for (let i = 0; i < templates.length; i++) {\n const node = templates[i];\n const key = node.getAttribute(\"data-hk\");\n if ((!root || key.startsWith(root)) && !sharedConfig.registry.has(key))\n sharedConfig.registry.set(key, node);\n }\n}\nfunction getHydrationKey() {\n return sharedConfig.getNextContextId();\n}\nfunction NoHydration(props) {\n return sharedConfig.context ? undefined : props.children;\n}\nfunction Hydration(props) {\n return props.children;\n}\nconst voidFn = () => undefined;\nconst RequestContext = Symbol();\nfunction innerHTML(parent, content) {\n !sharedConfig.context && (parent.innerHTML = content);\n}\n\nfunction throwInBrowser(func) {\n const err = new Error(`${func.name} is not supported in the browser, returning undefined`);\n console.error(err);\n}\nfunction renderToString(fn, options) {\n throwInBrowser(renderToString);\n}\nfunction renderToStringAsync(fn, options) {\n throwInBrowser(renderToStringAsync);\n}\nfunction renderToStream(fn, options) {\n throwInBrowser(renderToStream);\n}\nfunction ssr(template, ...nodes) {}\nfunction ssrElement(name, props, children, needsId) {}\nfunction ssrClassList(value) {}\nfunction ssrStyle(value) {}\nfunction ssrAttribute(key, value) {}\nfunction ssrHydrationKey() {}\nfunction resolveSSRNode(node) {}\nfunction escape(html) {}\nfunction ssrSpread(props, isSVG, skipChildren) {}\n\nconst isServer = false;\nconst isDev = false;\nconst SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\nfunction createElement(tagName, isSVG = false) {\n return isSVG ? document.createElementNS(SVG_NAMESPACE, tagName) : document.createElement(tagName);\n}\nconst hydrate = (...args) => {\n enableHydration();\n return hydrate$1(...args);\n};\nfunction Portal(props) {\n const { useShadow } = props,\n marker = document.createTextNode(\"\"),\n mount = () => props.mount || document.body,\n owner = getOwner();\n let content;\n let hydrating = !!sharedConfig.context;\n createEffect(\n () => {\n if (hydrating) getOwner().user = hydrating = false;\n content || (content = runWithOwner(owner, () => createMemo(() => props.children)));\n const el = mount();\n if (el instanceof HTMLHeadElement) {\n const [clean, setClean] = createSignal(false);\n const cleanup = () => setClean(true);\n createRoot(dispose => insert(el, () => (!clean() ? content() : dispose()), null));\n onCleanup(cleanup);\n } else {\n const container = createElement(props.isSVG ? \"g\" : \"div\", props.isSVG),\n renderRoot =\n useShadow && container.attachShadow\n ? container.attachShadow({\n mode: \"open\"\n })\n : container;\n Object.defineProperty(container, \"_$host\", {\n get() {\n return marker.parentNode;\n },\n configurable: true\n });\n insert(renderRoot, content);\n el.appendChild(container);\n props.ref && props.ref(container);\n onCleanup(() => el.removeChild(container));\n }\n },\n undefined,\n {\n render: !hydrating\n }\n );\n return marker;\n}\nfunction Dynamic(props) {\n const [p, others] = splitProps(props, [\"component\"]);\n const cached = createMemo(() => p.component);\n return createMemo(() => {\n const component = cached();\n switch (typeof component) {\n case \"function\":\n return untrack(() => component(others));\n case \"string\":\n const isSvg = SVGElements.has(component);\n const el = sharedConfig.context ? getNextElement() : createElement(component, isSvg);\n spread(el, others, isSvg);\n return el;\n }\n });\n}\n\nexport {\n Aliases,\n voidFn as Assets,\n ChildProperties,\n DOMElements,\n DelegatedEvents,\n Dynamic,\n Hydration,\n voidFn as HydrationScript,\n NoHydration,\n Portal,\n Properties,\n RequestContext,\n SVGElements,\n SVGNamespace,\n addEventListener,\n assign,\n classList,\n className,\n clearDelegatedEvents,\n delegateEvents,\n dynamicProperty,\n escape,\n voidFn as generateHydrationScript,\n voidFn as getAssets,\n getHydrationKey,\n getNextElement,\n getNextMarker,\n getNextMatch,\n getPropAlias,\n voidFn as getRequestEvent,\n hydrate,\n innerHTML,\n insert,\n isDev,\n isServer,\n render,\n renderToStream,\n renderToString,\n renderToStringAsync,\n resolveSSRNode,\n runHydrationEvents,\n setAttribute,\n setAttributeNS,\n setBoolAttribute,\n setProperty,\n spread,\n ssr,\n ssrAttribute,\n ssrClassList,\n ssrElement,\n ssrHydrationKey,\n ssrSpread,\n ssrStyle,\n style,\n template,\n use,\n voidFn as useAssets\n};\n","export const CheckoutPopupStyles = {\n container: {\n top: '50px',\n left: 'calc(100% - 700px)',\n margin: '0',\n width: '640px',\n 'max-height': '80vh',\n padding: '2px 5px 10px 5px',\n 'background-color': 'white',\n border: 'none',\n 'border-radius': '24px',\n 'box-shadow': '0px 4px 44px rgba(0, 0, 0, 0.25)',\n 'font-family': 'Arial',\n 'line-height': '1',\n 'vertical-align': 'baseline',\n 'box-sizing': 'border-box',\n color: 'rgb(34, 34, 34)',\n '@media (max-width: 600px), (max-height: 480px)': {\n display: 'none !important',\n },\n } as const,\n\n scroller: {\n height: '100%',\n 'overflow-x': 'hidden',\n 'overlfow-y': 'auto',\n position: 'relative',\n padding: '0px 15px',\n } as const,\n\n mainContainer: {\n } as const,\n\n header: {\n display: 'flex',\n 'flex-direction': 'column-reverse',\n 'align-items': 'center',\n 'margin-bottom': '10px',\n } as const,\n\n headingGrow: {\n flex: '1',\n 'font-size': '24px',\n 'font-weight': '700',\n 'margin-top': '5px',\n 'margin-bottom': '0px',\n } as const,\n\n closeButton: {\n background: 'none',\n border: 'none',\n padding: '4px 8px',\n color: '#666464',\n 'font-size': '38px',\n cursor: 'pointer',\n 'line-height': '1',\n } as const,\n\n activateAndCloseLink: {\n color: '#707070',\n 'align-self': 'flex-end',\n 'margin-top': '5px',\n 'max-width': '40%',\n } as const,\n\n activateAndCloseLinkSelected: {\n color: '#707070',\n cursor: 'default',\n 'pointer-events': 'none',\n 'text-decoration': 'none',\n } as const,\n\n subheading: {\n 'font-size': '18px',\n 'font-weight': '400',\n 'margin-top': '0px',\n 'margin-bottom': '0px',\n } as const,\n\n charityGrid: {\n display: 'flex',\n gap: '10px',\n width: '100%',\n 'margin-top': '20px',\n 'margin-bottom': '20px',\n 'flex-wrap': 'wrap',\n 'justify-content': 'space-between',\n } as const,\n\n charityButton: {\n width: '30%',\n position: 'relative',\n display: 'flex',\n 'flex-direction': 'column',\n 'align-items': 'center',\n 'justify-content': 'space-between',\n background: 'none',\n border: '1px solid #ccc',\n 'border-radius': '5px',\n padding: '5px',\n gap: '5px',\n 'text-align': 'center',\n 'font-size': '14px',\n cursor: 'pointer',\n transition: 'background-color 0.2s ease',\n } as const,\n\n charityButtonDisabled: {\n\n color: 'white',\n 'background-color': 'lightgray',\n cursor: 'default',\n 'pointer-events': 'none',\n\n } as const,\n\n charityLogo: {\n 'max-width': '120px',\n 'max-height': '70px',\n 'margin-bottom': '5px',\n 'object-fit': 'contain',\n } as const,\n\n selectButton: {\n 'background-color': '#0052FF',\n cursor: 'pointer',\n 'border-radius': '32px',\n padding: '8px',\n color: 'white',\n 'min-width': '100px',\n border: '0',\n 'font-weight': '600',\n width: '120px',\n } as const,\n\n goodbyeOptions: {\n display: 'flex',\n 'flex-direction': 'column',\n gap: '10px',\n width: '100%',\n 'color-scheme': 'light',\n } as const,\n\n goodbyeItem: {\n display: 'flex',\n 'align-items': 'center',\n gap: '5px',\n border: '1px solid #ddd',\n padding: '15px',\n 'border-radius': '5px',\n 'font-weight': '600',\n cursor: 'pointer',\n 'margin-bottom': '8px',\n } as const,\n\n autoClosingLabel: {\n 'text-align': 'right',\n } as const,\n\n backButton: {\n background: 'none',\n border: 'none',\n color: 'blue',\n 'text-decoration': 'underline',\n padding: '0',\n cursor: 'pointer',\n 'margin-bottom': '15px',\n } as const,\n\n footerLinks: {\n display: 'flex',\n 'justify-content': 'space-between',\n margin: '20px 0px 10px 0px',\n 'font-size': '14px',\n } as const,\n\n supportedBy: {\n margin: '5px 0px 5px 0px',\n 'font-size': '14px',\n 'text-align': 'center',\n } as const,\n\n footerLink: {\n color: '#666464',\n 'text-decoration': 'underline',\n } as const,\n\n openDetailsButton: {\n color: 'rgb(102, 100, 100)',\n 'text-decoration': 'underline',\n margin: '0',\n cursor: 'pointer',\n },\n offerDetailsContainer: {\n width: '100%',\n 'background-color': '#f2f2f2',\n border: '1px solid black',\n 'border-radius': '10px',\n 'border-top': '1px solid #bbb7b7',\n 'margin-top': '10px',\n 'margin-bottom': '20px',\n 'box-sizing': 'border-box',\n } as const,\n\n offerDetailsContent: {\n padding: '0 5px 0 10px',\n width: '100%',\n 'font-size': '12px',\n 'box-sizing': 'border-box',\n } as const,\n\n rateItem: {\n display: 'grid',\n 'grid-template-columns': '4fr 1fr',\n 'padding-right': '15px',\n 'padding-bottom': '5px',\n } as const,\n rateName: {\n color: '#000',\n 'margin-bottom': '4px',\n } as const,\n rate: {\n 'font-size': '14px',\n color: '#555',\n 'text-align': 'right',\n } as const,\n};\n","import { formatOffer } from '../../shared/vendors/wildfire/formatOffer';\r\n\r\n/**\r\n * MaxRate calculation logic for user display only\r\n *\r\n * @param kind 'PERCENTAGE' | 'FLAT'\r\n * @param amountStr\r\n * @returns\r\n */\r\nexport const calculateMaxRate = (kind: string | undefined, amountStr: string) => {\r\n let num = parseFloat(amountStr);\r\n if (kind === 'FLAT') num *= 0.75;\r\n return formatOffer(kind, num.toString());\r\n};\r\n","/**\n * Generic logic for formatting offer amounts\n * @param kind 'PERCENTAGE' | 'FLAT'\n * @param amountStr\n * @returns\n */\nexport const formatOffer = (kind: string | undefined, amountStr: string) => {\n let num = parseFloat(amountStr);\n if (num < 1) num = 1;\n num = Math.floor(num);\n const result = kind === 'PERCENTAGE' ? `${num}%` : `$${num}`;\n\n return result;\n};\n","import { WildfireActiveDomain } from '../../../shared/vendors/wildfire/types';\nimport { calculateMaxRate } from '../../lib/calculateMaxRate';\n\nconst formatTitle = (title: string, activeDomain: WildfireActiveDomain) => {\n const formatted = title.replace('{0}', calculateMaxRate(\n activeDomain.Merchant.MaxRate?.Kind,\n activeDomain.Merchant.MaxRate?.Amount ?? '0',\n ));\n\n return formatted;\n};\n\nexport function OfferTitle(props: { title: string, activeDomain: WildfireActiveDomain }) {\n return <span innerHTML={formatTitle(props.title, props.activeDomain)} />;\n}\n","import { RateKindMap, BoostedOffer, WildfireRate } from '../../../shared/vendors/wildfire/types';\r\n\r\nexport const parseRate = (\r\n commissionRate: WildfireRate<keyof RateKindMap>,\r\n displaySplit = 1,\r\n maximumFractionDigits = 1,\r\n customAmount?: string,\r\n): string => {\r\n const boostedOffer: BoostedOffer | null = commissionRate.BoostedOffer ?? null;\r\n let amount = parseFloat(commissionRate?.Amount ?? '');\r\n if (customAmount) {\r\n amount = parseFloat(customAmount);\r\n } else if (boostedOffer?.EndDate && new Date(boostedOffer.EndDate) < new Date()) {\r\n amount = parseFloat(boostedOffer.OriginalMaxRate);\r\n }\r\n if (Number.isNaN(amount)) return '';\r\n const splitAmount = amount * displaySplit;\r\n if (commissionRate?.Kind === 'PERCENTAGE') {\r\n // TODO: Change this when going international\r\n return `${splitAmount.toLocaleString('en-US', {\r\n minimumFractionDigits: 0,\r\n maximumFractionDigits,\r\n })}%`;\r\n }\r\n if (commissionRate?.Kind === 'FLAT') {\r\n // TODO: Change this when going international\r\n return splitAmount.toLocaleString('en-US', {\r\n style: 'currency',\r\n currency: commissionRate.Currency,\r\n });\r\n }\r\n return '';\r\n};\r\n","import { createContext, Accessor } from 'solid-js';\n\nexport interface Charity {\n ein: string;\n tpi: string;\n title: string;\n order: number;\n logo: string;\n decorator?: string;\n decoratorLeftStyle?: string;\n decoratorRightStyle?: string;\n}\n\nexport type TranslationProviderInterface = (key: string) => string;\nexport type CharityProviderInterface = () => Charity[];\n\nexport interface ContentProviderInterface {\n translate: TranslationProviderInterface;\n getAllCharities: CharityProviderInterface;\n}\n\nexport const ContentContext = createContext<Accessor<ContentProviderInterface | undefined>>(\n () => ({\n translate: (_: string) => '',\n getAllCharities: () => [],\n }),\n);\n\n// Keep the old context for backward compatibility\nexport const TranslationContext = ContentContext;\n","// src/context/translation/useT.ts\r\nimport { useContext } from 'solid-js';\r\nimport { TranslationContext } from '../../context/translation/translationContext';\r\n\r\nexport const useT = () => {\r\n const getContentAccessor = useContext(TranslationContext);\r\n const contentProvider = getContentAccessor();\r\n\r\n if (!contentProvider) {\r\n throw new Error('Content provider context is undefined');\r\n }\r\n\r\n // Access the translate method from the ContentProviderInterface\r\n return (key: string) => contentProvider.translate(key);\r\n};\n","export class StringUtils {\n /**\n * Allows formating a template string with args\n * @param template the temlate string. i.e: 'My name is {0}. Good {1}.'\n * @param args the args to be replaced\n * @returns a string with the args replaced. i.e: 'My name is John. Good morning.'\n */\n static formatMessage(template: string, ...args: (string | number | boolean | null | undefined)[]): string {\n return template.replace(/{(\\d+)}/g, (_, index) => {\n const i = Number(index);\n return args[i] !== undefined ? String(args[i]) : `{${i}}`;\n });\n }\n}\n","import { Show } from 'solid-js';\r\nimport { WildfireMerchantRateDetail, RateKindMap } from '../../../shared/vendors/wildfire/types';\r\nimport { CheckoutPopupStyles as styles } from '../CheckoutPopup.styles';\r\nimport { parseRate } from '../../lib/utils/parseRate';\r\nimport { useT } from '../../lib/hooks/useT';\r\nimport { StringUtils } from '../../../shared/utils/string-utils';\r\n\r\ninterface OfferDetailsProps {\r\n merchantName: string;\r\n extensionName: string;\r\n parsedMaxRate: string | null;\r\n termsUrl: string;\r\n merchantRateDetail: WildfireMerchantRateDetail<keyof RateKindMap>[] | null;\r\n onClose: () => void;\r\n}\r\n\r\nexport const OfferDetails = (props: OfferDetailsProps) => {\r\n const t = useT();\r\n return (\r\n <div style={styles.offerDetailsContainer}>\r\n <div class=\"gf-offer-details\" style={styles.offerDetailsContent} >\r\n <p><span innerHTML={t('offerDetails.intro')} /></p>\r\n <p><span innerHTML={t('offerDetails.eligible')} /></p>\r\n <p><span innerHTML={props.parsedMaxRate ? StringUtils.formatMessage(t('offerDetails.donationRatesWithValue'), props.parsedMaxRate) : StringUtils.formatMessage(t('offerDetails.donationRates'))} /></p>\r\n <Show when={!!props.merchantRateDetail?.length}>\r\n <div >\r\n {props.merchantRateDetail?.map((detail) => (\r\n <div class='gf-offer-details-rate-item' style={styles.rateItem}>\r\n <div style={styles.rateName}>{detail.Name || ''}</div>\r\n <div style={styles.rate}>{parseRate(detail)}</div>\r\n </div>\r\n ))}\r\n </div>\r\n </Show>\r\n <p><span innerHTML={t('offerDetails.donationAmounts')} /></p>\r\n <p><span innerHTML={t('offerDetails.donationTiming')} /></p>\r\n <p>\r\n <a style={styles.footerLink} href={props.termsUrl} target=\"_blank\" rel=\"noreferrer\">\r\n <span innerHTML={t('offerDetails.termsAndConditions')} />\r\n </a>\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n};\r\n","(function (global, factory) {\n if (typeof define === \"function\" && define.amd) {\n define(\"webextension-polyfill\", [\"module\"], factory);\n } else if (typeof exports !== \"undefined\") {\n factory(module);\n } else {\n var mod = {\n exports: {}\n };\n factory(mod);\n global.browser = mod.exports;\n }\n})(typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : this, function (module) {\n /* webextension-polyfill - v0.12.0 - Tue May 14 2024 18:01:29 */\n /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */\n /* vim: set sts=2 sw=2 et tw=80: */\n /* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n \"use strict\";\n\n if (!(globalThis.chrome && globalThis.chrome.runtime && globalThis.chrome.runtime.id)) {\n throw new Error(\"This script should only be loaded in a browser extension.\");\n }\n if (!(globalThis.browser && globalThis.browser.runtime && globalThis.browser.runtime.id)) {\n const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = \"The message port closed before a response was received.\";\n\n // Wrapping the bulk of this polyfill in a one-time-use function is a minor\n // optimization for Firefox. Since Spidermonkey does not fully parse the\n // contents of a function until the first time it's called, and since it will\n // never actually need to be called, this allows the polyfill to be included\n // in Firefox nearly for free.\n const wrapAPIs = extensionAPIs => {\n // NOTE: apiMetadata is associated to the content of the api-metadata.json file\n // at build time by replacing the following \"include\" with the content of the\n // JSON file.\n const apiMetadata = {\n \"alarms\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"clearAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"bookmarks\": {\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getChildren\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getRecent\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getSubTree\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTree\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"move\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeTree\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"browserAction\": {\n \"disable\": {\n \"minArgs\": 0,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"enable\": {\n \"minArgs\": 0,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"getBadgeBackgroundColor\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getBadgeText\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"openPopup\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"setBadgeBackgroundColor\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setBadgeText\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"setPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"browsingData\": {\n \"remove\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"removeCache\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeCookies\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeDownloads\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeFormData\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeHistory\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeLocalStorage\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removePasswords\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removePluginData\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"settings\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"commands\": {\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"contextMenus\": {\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"cookies\": {\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAllCookieStores\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"devtools\": {\n \"inspectedWindow\": {\n \"eval\": {\n \"minArgs\": 1,\n \"maxArgs\": 2,\n \"singleCallbackArg\": false\n }\n },\n \"panels\": {\n \"create\": {\n \"minArgs\": 3,\n \"maxArgs\": 3,\n \"singleCallbackArg\": true\n },\n \"elements\": {\n \"createSidebarPane\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n }\n }\n },\n \"downloads\": {\n \"cancel\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"download\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"erase\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getFileIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"open\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"pause\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeFile\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"resume\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"show\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"extension\": {\n \"isAllowedFileSchemeAccess\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"isAllowedIncognitoAccess\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"history\": {\n \"addUrl\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"deleteAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"deleteRange\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"deleteUrl\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getVisits\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"i18n\": {\n \"detectLanguage\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAcceptLanguages\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"identity\": {\n \"launchWebAuthFlow\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"idle\": {\n \"queryState\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"management\": {\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getSelf\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"setEnabled\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"uninstallSelf\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"notifications\": {\n \"clear\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getPermissionLevel\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"pageAction\": {\n \"getPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"hide\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"setPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"show\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"permissions\": {\n \"contains\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"request\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"runtime\": {\n \"getBackgroundPage\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getPlatformInfo\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"openOptionsPage\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"requestUpdateCheck\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"sendMessage\": {\n \"minArgs\": 1,\n \"maxArgs\": 3\n },\n \"sendNativeMessage\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"setUninstallURL\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"sessions\": {\n \"getDevices\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getRecentlyClosed\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"restore\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"storage\": {\n \"local\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"managed\": {\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"sync\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n }\n },\n \"tabs\": {\n \"captureVisibleTab\": {\n \"minArgs\": 0,\n \"maxArgs\": 2\n },\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"detectLanguage\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"discard\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"duplicate\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"executeScript\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getCurrent\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getZoom\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getZoomSettings\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"goBack\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"goForward\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"highlight\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"insertCSS\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"move\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"query\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"reload\": {\n \"minArgs\": 0,\n \"maxArgs\": 2\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeCSS\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"sendMessage\": {\n \"minArgs\": 2,\n \"maxArgs\": 3\n },\n \"setZoom\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"setZoomSettings\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"update\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n }\n },\n \"topSites\": {\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"webNavigation\": {\n \"getAllFrames\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getFrame\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"webRequest\": {\n \"handlerBehaviorChanged\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"windows\": {\n \"create\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getCurrent\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getLastFocused\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n }\n };\n if (Object.keys(apiMetadata).length === 0) {\n throw new Error(\"api-metadata.json has not been included in browser-polyfill\");\n }\n\n /**\n * A WeakMap subclass which creates and stores a value for any key which does\n * not exist when accessed, but behaves exactly as an ordinary WeakMap\n * otherwise.\n *\n * @param {function} createItem\n * A function which will be called in order to create the value for any\n * key which does not exist, the first time it is accessed. The\n * function receives, as its only argument, the key being created.\n */\n class DefaultWeakMap extends WeakMap {\n constructor(createItem, items = undefined) {\n super(items);\n this.createItem = createItem;\n }\n get(key) {\n if (!this.has(key)) {\n this.set(key, this.createItem(key));\n }\n return super.get(key);\n }\n }\n\n /**\n * Returns true if the given object is an object with a `then` method, and can\n * therefore be assumed to behave as a Promise.\n *\n * @param {*} value The value to test.\n * @returns {boolean} True if the value is thenable.\n */\n const isThenable = value => {\n return value && typeof value === \"object\" && typeof value.then === \"function\";\n };\n\n /**\n * Creates and returns a function which, when called, will resolve or reject\n * the given promise based on how it is called:\n *\n * - If, when called, `chrome.runtime.lastError` contains a non-null object,\n * the promise is rejected with that value.\n * - If the function is called with exactly one argument, the promise is\n * resolved to that value.\n * - Otherwise, the promise is resolved to an array containing all of the\n * function's arguments.\n *\n * @param {object} promise\n * An object containing the resolution and rejection functions of a\n * promise.\n * @param {function} promise.resolve\n * The promise's resolution function.\n * @param {function} promise.reject\n * The promise's rejection function.\n * @param {object} metadata\n * Metadata about the wrapped method which has created the callback.\n * @param {boolean} metadata.singleCallbackArg\n * Whether or not the promise is resolved with only the first\n * argument of the callback, alternatively an array of all the\n * callback arguments is resolved. By default, if the callback\n * function is invoked with only a single argument, that will be\n * resolved to the promise, while all arguments will be resolved as\n * an array if multiple are given.\n *\n * @returns {function}\n * The generated callback function.\n */\n const makeCallback = (promise, metadata) => {\n return (...callbackArgs) => {\n if (extensionAPIs.runtime.lastError) {\n promise.reject(new Error(extensionAPIs.runtime.lastError.message));\n } else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) {\n promise.resolve(callbackArgs[0]);\n } else {\n promise.resolve(callbackArgs);\n }\n };\n };\n const pluralizeArguments = numArgs => numArgs == 1 ? \"argument\" : \"arguments\";\n\n /**\n * Creates a wrapper function for a method with the given name and metadata.\n *\n * @param {string} name\n * The name of the method which is being wrapped.\n * @param {object} metadata\n * Metadata about the method being wrapped.\n * @param {integer} metadata.minArgs\n * The minimum number of arguments which must be passed to the\n * function. If called with fewer than this number of arguments, the\n * wrapper will raise an exception.\n * @param {integer} metadata.maxArgs\n * The maximum number of arguments which may be passed to the\n * function. If called with more than this number of arguments, the\n * wrapper will raise an exception.\n * @param {boolean} metadata.singleCallbackArg\n * Whether or not the promise is resolved with only the first\n * argument of the callback, alternatively an array of all the\n * callback arguments is resolved. By default, if the callback\n * function is invoked with only a single argument, that will be\n * resolved to the promise, while all arguments will be resolved as\n * an array if multiple are given.\n *\n * @returns {function(object, ...*)}\n * The generated wrapper function.\n */\n const wrapAsyncFunction = (name, metadata) => {\n return function asyncFunctionWrapper(target, ...args) {\n if (args.length < metadata.minArgs) {\n throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);\n }\n if (args.length > metadata.maxArgs) {\n throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);\n }\n return new Promise((resolve, reject) => {\n if (metadata.fallbackToNoCallback) {\n // This API method has currently no callback on Chrome, but it return a promise on Firefox,\n // and so the polyfill will try to call it with a callback first, and it will fallback\n // to not passing the callback if the first call fails.\n try {\n target[name](...args, makeCallback({\n resolve,\n reject\n }, metadata));\n } catch (cbError) {\n console.warn(`${name} API method doesn't seem to support the callback parameter, ` + \"falling back to call it without a callback: \", cbError);\n target[name](...args);\n\n // Update the API method metadata, so that the next API calls will not try to\n // use the unsupported callback anymore.\n metadata.fallbackToNoCallback = false;\n metadata.noCallback = true;\n resolve();\n }\n } else if (metadata.noCallback) {\n target[name](...args);\n resolve();\n } else {\n target[name](...args, makeCallback({\n resolve,\n reject\n }, metadata));\n }\n });\n };\n };\n\n /**\n * Wraps an existing method of the target object, so that calls to it are\n * intercepted by the given wrapper function. The wrapper function receives,\n * as its first argument, the original `target` object, followed by each of\n * the arguments passed to the original method.\n *\n * @param {object} target\n * The original target object that the wrapped method belongs to.\n * @param {function} method\n * The method being wrapped. This is used as the target of the Proxy\n * object which is created to wrap the method.\n * @param {function} wrapper\n * The wrapper function which is called in place of a direct invocation\n * of the wrapped method.\n *\n * @returns {Proxy<function>}\n * A Proxy object for the given method, which invokes the given wrapper\n * method in its place.\n */\n const wrapMethod = (target, method, wrapper) => {\n return new Proxy(method, {\n apply(targetMethod, thisObj, args) {\n return wrapper.call(thisObj, target, ...args);\n }\n });\n };\n let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);\n\n /**\n * Wraps an object in a Proxy which intercepts and wraps certain methods\n * based on the given `wrappers` and `metadata` objects.\n *\n * @param {object} target\n * The target object to wrap.\n *\n * @param {object} [wrappers = {}]\n * An object tree containing wrapper functions for special cases. Any\n * function present in this object tree is called in place of the\n * method in the same location in the `target` object tree. These\n * wrapper methods are invoked as described in {@see wrapMethod}.\n *\n * @param {object} [metadata = {}]\n * An object tree containing metadata used to automatically generate\n * Promise-based wrapper functions for asynchronous. Any function in\n * the `target` object tree which has a corresponding metadata object\n * in the same location in the `metadata` tree is replaced with an\n * automatically-generated wrapper function, as described in\n * {@see wrapAsyncFunction}\n *\n * @returns {Proxy<object>}\n */\n const wrapObject = (target, wrappers = {}, metadata = {}) => {\n let cache = Object.create(null);\n let handlers = {\n has(proxyTarget, prop) {\n return prop in target || prop in cache;\n },\n get(proxyTarget, prop, receiver) {\n if (prop in cache) {\n return cache[prop];\n }\n if (!(prop in target)) {\n return undefined;\n }\n let value = target[prop];\n if (typeof value === \"function\") {\n // This is a method on the underlying object. Check if we need to do\n // any wrapping.\n\n if (typeof wrappers[prop] === \"function\") {\n // We have a special-case wrapper for this method.\n value = wrapMethod(target, target[prop], wrappers[prop]);\n } else if (hasOwnProperty(metadata, prop)) {\n // This is an async method that we have metadata for. Create a\n // Promise wrapper for it.\n let wrapper = wrapAsyncFunction(prop, metadata[prop]);\n value = wrapMethod(target, target[prop], wrapper);\n } else {\n // This is a method that we don't know or care about. Return the\n // original method, bound to the underlying object.\n value = value.bind(target);\n }\n } else if (typeof value === \"object\" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) {\n // This is an object that we need to do some wrapping for the children\n // of. Create a sub-object wrapper for it with the appropriate child\n // metadata.\n value = wrapObject(value, wrappers[prop], metadata[prop]);\n } else if (hasOwnProperty(metadata, \"*\")) {\n // Wrap all properties in * namespace.\n value = wrapObject(value, wrappers[prop], metadata[\"*\"]);\n } else {\n // We don't need to do any wrapping for this property,\n // so just forward all access to the underlying object.\n Object.defineProperty(cache, prop, {\n configurable: true,\n enumerable: true,\n get() {\n return target[prop];\n },\n set(value) {\n target[prop] = value;\n }\n });\n return value;\n }\n cache[prop] = value;\n return value;\n },\n set(proxyTarget, prop, value, receiver) {\n if (prop in cache) {\n cache[prop] = value;\n } else {\n target[prop] = value;\n }\n return true;\n },\n defineProperty(proxyTarget, prop, desc) {\n return Reflect.defineProperty(cache, prop, desc);\n },\n deleteProperty(proxyTarget, prop) {\n return Reflect.deleteProperty(cache, prop);\n }\n };\n\n // Per contract of the Proxy API, the \"get\" proxy handler must return the\n // original value of the target if that value is declared read-only and\n // non-configurable. For this reason, we create an object with the\n // prototype set to `target` instead of using `target` directly.\n // Otherwise we cannot return a custom object for APIs that\n // are declared read-only and non-configurable, such as `chrome.devtools`.\n //\n // The proxy handlers themselves will still use the original `target`\n // instead of the `proxyTarget`, so that the methods and properties are\n // dereferenced via the original targets.\n let proxyTarget = Object.create(target);\n return new Proxy(proxyTarget, handlers);\n };\n\n /**\n * Creates a set of wrapper functions for an event object, which handles\n * wrapping of listener functions that those messages are passed.\n *\n * A single wrapper is created for each listener function, and stored in a\n * map. Subsequent calls to `addListener`, `hasListener`, or `removeListener`\n * retrieve the original wrapper, so that attempts to remove a\n * previously-added listener work as expected.\n *\n * @param {DefaultWeakMap<function, function>} wrapperMap\n * A DefaultWeakMap object which will create the appropriate wrapper\n * for a given listener function when one does not exist, and retrieve\n * an existing one when it does.\n *\n * @returns {object}\n */\n const wrapEvent = wrapperMap => ({\n addListener(target, listener, ...args) {\n target.addListener(wrapperMap.get(listener), ...args);\n },\n hasListener(target, listener) {\n return target.hasListener(wrapperMap.get(listener));\n },\n removeListener(target, listener) {\n target.removeListener(wrapperMap.get(listener));\n }\n });\n const onRequestFinishedWrappers = new DefaultWeakMap(listener => {\n if (typeof listener !== \"function\") {\n return listener;\n }\n\n /**\n * Wraps an onRequestFinished listener function so that it will return a\n * `getContent()` property which returns a `Promise` rather than using a\n * callback API.\n *\n * @param {object} req\n * The HAR entry object representing the network request.\n */\n return function onRequestFinished(req) {\n const wrappedReq = wrapObject(req, {} /* wrappers */, {\n getContent: {\n minArgs: 0,\n maxArgs: 0\n }\n });\n listener(wrappedReq);\n };\n });\n const onMessageWrappers = new DefaultWeakMap(listener => {\n if (typeof listener !== \"function\") {\n return listener;\n }\n\n /**\n * Wraps a message listener function so that it may send responses based on\n * its return value, rather than by returning a sentinel value and calling a\n * callback. If the listener function returns a Promise, the response is\n * sent when the promise either resolves or rejects.\n *\n * @param {*} message\n * The message sent by the other end of the channel.\n * @param {object} sender\n * Details about the sender of the message.\n * @param {function(*)} sendResponse\n * A callback which, when called with an arbitrary argument, sends\n * that value as a response.\n * @returns {boolean}\n * True if the wrapped listener returned a Promise, which will later\n * yield a response. False otherwise.\n */\n return function onMessage(message, sender, sendResponse) {\n let didCallSendResponse = false;\n let wrappedSendResponse;\n let sendResponsePromise = new Promise(resolve => {\n wrappedSendResponse = function (response) {\n didCallSendResponse = true;\n resolve(response);\n };\n });\n let result;\n try {\n result = listener(message, sender, wrappedSendResponse);\n } catch (err) {\n result = Promise.reject(err);\n }\n const isResultThenable = result !== true && isThenable(result);\n\n // If the listener didn't returned true or a Promise, or called\n // wrappedSendResponse synchronously, we can exit earlier\n // because there will be no response sent from this listener.\n if (result !== true && !isResultThenable && !didCallSendResponse) {\n return false;\n }\n\n // A small helper to send the message if the promise resolves\n // and an error if the promise rejects (a wrapped sendMessage has\n // to translate the message into a resolved promise or a rejected\n // promise).\n const sendPromisedResult = promise => {\n promise.then(msg => {\n // send the message value.\n sendResponse(msg);\n }, error => {\n // Send a JSON representation of the error if the rejected value\n // is an instance of error, or the object itself otherwise.\n let message;\n if (error && (error instanceof Error || typeof error.message === \"string\")) {\n message = error.message;\n } else {\n message = \"An unexpected error occurred\";\n }\n sendResponse({\n __mozWebExtensionPolyfillReject__: true,\n message\n });\n }).catch(err => {\n // Print an error on the console if unable to send the response.\n console.error(\"Failed to send onMessage rejected reply\", err);\n });\n };\n\n // If the listener returned a Promise, send the resolved value as a\n // result, otherwise wait the promise related to the wrappedSendResponse\n // callback to resolve and send it as a response.\n if (isResultThenable) {\n sendPromisedResult(result);\n } else {\n sendPromisedResult(sendResponsePromise);\n }\n\n // Let Chrome know that the listener is replying.\n return true;\n };\n });\n const wrappedSendMessageCallback = ({\n reject,\n resolve\n }, reply) => {\n if (extensionAPIs.runtime.lastError) {\n // Detect when none of the listeners replied to the sendMessage call and resolve\n // the promise to undefined as in Firefox.\n // See https://github.com/mozilla/webextension-polyfill/issues/130\n if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) {\n resolve();\n } else {\n reject(new Error(extensionAPIs.runtime.lastError.message));\n }\n } else if (reply && reply.__mozWebExtensionPolyfillReject__) {\n // Convert back the JSON representation of the error into\n // an Error instance.\n reject(new Error(reply.message));\n } else {\n resolve(reply);\n }\n };\n const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => {\n if (args.length < metadata.minArgs) {\n throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);\n }\n if (args.length > metadata.maxArgs) {\n throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);\n }\n return new Promise((resolve, reject) => {\n const wrappedCb = wrappedSendMessageCallback.bind(null, {\n resolve,\n reject\n });\n args.push(wrappedCb);\n apiNamespaceObj.sendMessage(...args);\n });\n };\n const staticWrappers = {\n devtools: {\n network: {\n onRequestFinished: wrapEvent(onRequestFinishedWrappers)\n }\n },\n runtime: {\n onMessage: wrapEvent(onMessageWrappers),\n onMessageExternal: wrapEvent(onMessageWrappers),\n sendMessage: wrappedSendMessage.bind(null, \"sendMessage\", {\n minArgs: 1,\n maxArgs: 3\n })\n },\n tabs: {\n sendMessage: wrappedSendMessage.bind(null, \"sendMessage\", {\n minArgs: 2,\n maxArgs: 3\n })\n }\n };\n const settingMetadata = {\n clear: {\n minArgs: 1,\n maxArgs: 1\n },\n get: {\n minArgs: 1,\n maxArgs: 1\n },\n set: {\n minArgs: 1,\n maxArgs: 1\n }\n };\n apiMetadata.privacy = {\n network: {\n \"*\": settingMetadata\n },\n services: {\n \"*\": settingMetadata\n },\n websites: {\n \"*\": settingMetadata\n }\n };\n return wrapObject(extensionAPIs, staticWrappers, apiMetadata);\n };\n\n // The build process adds a UMD wrapper around this file, which makes the\n // `module` variable available.\n module.exports = wrapAPIs(chrome);\n } else {\n module.exports = globalThis.browser;\n }\n});\n//# sourceMappingURL=browser-polyfill.js.map\n","export type EventHistoryEntry = {\n\n createdAt: number,\n payload: string\n}\n\nexport enum PopupEvent {\n checkoutPopupShown = 'CHECKOUT-POPUP-SHOWN',\n checkoutPopupNotShown = 'CHECKOUT-POPUP-NOT-SHOWN',\n checkoutPopupSupressed = 'CHECKOUT-POPUP-SUPRESSED',\n checkoutPopupDonation = 'CHECKOUT-POPUP-DONATION',\n checkoutPopupFailedActivation = 'CHECKOUT-POPUP-FAILED-ACTIVATION',\n checkoutPopupPurchaseConfirmed = 'CHECKOUT-POPUP-PURCHASE-CONFIRMED',\n checkoutPopupHealthCheck = 'CHECKOUT-POPUP-HEALTH-CHECK',\n checkouPopupActivationFailed = 'CHECKOUT-POPUP-ACTIVATION-FAILED',\n checkoutPopupOfferDetailsClicked = 'CHECKOUT-POPUP-OFFER-DETAILS-CLICKED',\n checkoutPopupWhyAmISeeingThisClicked = 'CHECKOUT-POPUP-WHY-AM-I-SEEING-THIS-CLICKED',\n checkoutPopupLooserExtension = 'CHECKOUT-POPUP-LOOSER-EXTENSION',\n checkoutPopupActiveDomain = 'CHECKOUT-POPUP-ACTIVE-DOMAIN',\n checkoutPopupSiteMatches = 'CHECKOUT-POPUP-SITE-MATCHES',\n checkoutPopupMerchantInResultsFound = 'CHECKOUT-MERCHANT-IN-RESULTS-FOUND',\n checkoutPopupNotShownPerViewportSize = 'CHECKOUT-POPUP-NOT-SHOWN-PER-VIEWPORT-SIZE',\n checkoutPopupHiddenProgrammatically = 'CHECKOUT-POPUP-HIDDEN-PROGRAMMATICALLY',\n}\n\nexport enum LoggingEvent {\n adUnitLog = 'ADUNIT-LOG'\n}\n\nexport type EventType = PopupEvent | LoggingEvent; // Unionize any event types here.\n\nexport type GfEvent<T extends EventType> = {\n partner: string,\n eventType: T,\n eventData?: unknown\n}\n","import { LogMessage, LoggerTransport } from '../types';\n\nexport class ConsoleTransport implements LoggerTransport {\n private static LOGGER_PREFIX = '[GFAdUnit] -';\n\n isLocal = true;\n\n log({\n level, message, timestamp, data, title,\n }: LogMessage): void {\n // Map log levels to available console methods\n let consoleMethod: 'log' | 'info' | 'warn' | 'error';\n switch (level) {\n case 'debug':\n consoleMethod = 'log';\n break;\n case 'info':\n consoleMethod = 'info';\n break;\n case 'warn':\n consoleMethod = 'warn';\n break;\n case 'error':\n case 'critical':\n case 'fatal':\n consoleMethod = 'error';\n break;\n default:\n consoleMethod = 'log';\n }\n const titlePrefix = title ? `[${title}]` : '';\n\n if (data !== undefined) {\n // eslint-disable-next-line no-console\n console[consoleMethod](`[${timestamp}] - ${ConsoleTransport.LOGGER_PREFIX} ${titlePrefix} ${message}`, data);\n } else {\n // eslint-disable-next-line no-console\n console[consoleMethod](`[${timestamp}] - ${ConsoleTransport.LOGGER_PREFIX} ${titlePrefix} ${message}`);\n }\n }\n}\n","import {\n LogLevel, LogMessage, LoggerConfig, LoggerTransport,\n} from './types';\nimport { ConsoleTransport } from './transports';\n\nconst LOG_LEVELS: LogLevel[] = ['debug', 'info', 'warn', 'error', 'critical', 'fatal'];\n\nexport class Logger {\n private config: Required<LoggerConfig>;\n private static instance: Logger;\n\n private constructor(config?: LoggerConfig) {\n this.config = {\n minLevel: config?.minLevel ?? 'debug',\n enabled: config?.enabled ?? false,\n transports: config?.transports ?? [new ConsoleTransport()],\n title: config?.title ?? '',\n };\n }\n\n static getInstance(config?: LoggerConfig): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger(config);\n }\n return Logger.instance;\n }\n\n configure(config: Partial<LoggerConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n private shouldLog(level: LogLevel): boolean {\n if (!this.config.enabled) return false;\n return LOG_LEVELS.indexOf(level) >= LOG_LEVELS.indexOf(this.config.minLevel);\n }\n\n private createLogMessage(level: LogLevel, message: string, data?: unknown): LogMessage {\n return {\n level,\n // @ts-expect-error global variable\n version: LIB_VERSION ?? 'unknown',\n message,\n timestamp: new Date().toISOString(),\n data,\n title: this.config.title,\n };\n }\n\n private log(level: LogLevel, message: string, onlyLocal: boolean, data?: unknown): void {\n if (!this.shouldLog(level)) return;\n\n const logMessage = this.createLogMessage(level, message, data);\n this.config.transports\n .filter((transport) => !onlyLocal || transport.isLocal)\n .forEach((transport) => transport.log(logMessage));\n }\n\n debug(message: string, data?: unknown, onlyLocal = false): void {\n this.log('debug', message, onlyLocal, data);\n }\n\n info(message: string, data?: unknown, onlyLocal = false): void {\n this.log('info', message, onlyLocal, data);\n }\n\n warn(message: string, data?: unknown, onlyLocal = false): void {\n this.log('warn', message, onlyLocal, data);\n }\n\n error(message: string, data?: unknown, onlyLocal = false): void {\n this.log('error', message, onlyLocal, data);\n }\n\n critical(message: string, data?: unknown, onlyLocal = false): void {\n this.log('critical', message, onlyLocal, data);\n }\n\n fatal(message: string, data?: unknown, onlyLocal = false): void {\n this.log('fatal', message, onlyLocal, data);\n }\n\n addTransport(transport: LoggerTransport): void {\n this.config.transports.push(transport);\n }\n\n clearTransports(): void {\n this.config.transports = [];\n }\n\n disable(): void {\n this.config.enabled = false;\n }\n\n enable(): void {\n this.config.enabled = true;\n }\n}\n","import { Logger } from './logger';\n\nexport const MAX_RETRY_ATTEMPTS = 3;\nexport const DEFAULT_RETRY_DELAY = 1000; // 1 second\n\nexport type DelayFunction = (attempt: number) => number;\n\nexport const defaultDelay: DelayFunction = (attempt: number) => DEFAULT_RETRY_DELAY * attempt;\n\nexport interface RetryOptions {\n maxAttempts?: number;\n delayFn?: DelayFunction;\n logger?: Logger;\n operationName?: string;\n}\n\nexport async function retryOperation<T>(\n operation: () => Promise<T>,\n options: RetryOptions = {},\n // If the operation fails after the specified attempts, return this value instead of throwing\n returnOnFailure?: T,\n): Promise<T> {\n const {\n maxAttempts = MAX_RETRY_ATTEMPTS,\n delayFn = defaultDelay,\n } = options;\n\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n try {\n // eslint-disable-next-line no-await-in-loop\n return await operation();\n } catch (error) {\n lastError = error as Error;\n if (attempt < maxAttempts) {\n // eslint-disable-next-line no-await-in-loop\n await new Promise((resolve) => {\n setTimeout(resolve, delayFn(attempt));\n });\n }\n }\n }\n\n if (lastError && options.logger && options.operationName) {\n // Prevent logging this remotely to avoid further network errors and enter in an infinite loop\n options.logger.error(`Operation ${options.operationName} failed after ${maxAttempts} attempts.`, lastError, true);\n }\n\n if (returnOnFailure !== undefined) {\n return returnOnFailure;\n }\n\n throw lastError || new Error('Operation failed after multiple attempts');\n}\n","import browser from 'webextension-polyfill';\nimport {\n AnyRequestMessage, AnyResponseMessage, RequestMessage, RequestResponseMap, ResponseMessage,\n} from './requestResponse';\nimport { Logger } from './utils/logger';\nimport {\n defaultDelay, MAX_RETRY_ATTEMPTS, retryOperation, RetryOptions,\n} from './utils/retry';\n\n// Use webextension-polyfill API\nconst api = browser;\n\n// Re-export the browser object\nexport { browser };\n\ninterface SendOptions {\n tabId?: number;\n}\n\n/**\n * Type-safe wrapper for sending messages\n * @param message\n * @param options\n * @returns\n */\nexport async function sendMessage<K extends keyof RequestResponseMap>(\n message: RequestMessage<K>,\n options?: SendOptions,\n): Promise<ResponseMessage<K>> {\n if (options?.tabId) {\n return await api.tabs.sendMessage(options.tabId, message) as ResponseMessage<K>;\n }\n return await api.runtime.sendMessage(message) as ResponseMessage<K>;\n}\n\n/**\n * Type-safe wrapper for sending messages, with retry attempts\n * @param message\n * @param options\n * @param retryOptions\n * @returns\n */\nexport async function sendMessageWithRetry<K extends keyof RequestResponseMap>(\n message: RequestMessage<K>,\n options?: SendOptions,\n retryOptions?: RetryOptions,\n): Promise<ResponseMessage<K>> {\n const finalRetryOptions: RetryOptions = {\n maxAttempts: retryOptions?.maxAttempts ?? MAX_RETRY_ATTEMPTS,\n delayFn: retryOptions?.delayFn ?? defaultDelay,\n };\n\n return retryOperation<ResponseMessage<K>>(\n () => sendMessage(message, options),\n finalRetryOptions,\n );\n}\n\n/**\n * Type-safe wrapper for adding message listeners in an \"RPC style\".\n *\n * @param callback A function that takes:\n * - message: one of the possible request messages (AnyRequestMessage)\n * - sender: the sender details\n * - sendResponse: a function to call with a typed response (AnyResponseMessage)\n *\n * The callback can:\n * - return `void` (if it synchronously calls `sendResponse`),\n * - return `boolean` (to indicate if it will handle async),\n * - or return a `Promise<AnyResponseMessage>` (in which case we handle sendResponse automatically).\n */\nexport function addMessageListener(\n callback: (\n message: AnyRequestMessage,\n sender: browser.Runtime.MessageSender,\n sendResponse: (response: AnyResponseMessage) => void\n ) => void | boolean | Promise<AnyResponseMessage | void>,\n) {\n const logger = Logger.getInstance();\n\n // Attach a single runtime listener\n const messageListener = (message: unknown, sender: browser.Runtime.MessageSender, sendResponse: (response?: unknown) => void) => {\n // We'll provide a typed sendResponse function to the callback\n function typedSendResponse(resp: AnyResponseMessage) {\n sendResponse(resp);\n }\n\n const maybePromise = callback(message as AnyRequestMessage, sender, typedSendResponse);\n\n // If the callback returns a promise, we handle it asynchronously\n if (maybePromise instanceof Promise) {\n maybePromise.then((resp) => {\n if (resp) typedSendResponse(resp);\n }).catch((err) => {\n logger.warn('Async message callback error:', err);\n // You could also send an error response or handle differently\n });\n // Must return true so the message channel stays open\n return true;\n }\n\n // If the callback explicitly returned true, it means it will handle the response asynchronously\n // For webextension-polyfill, we can only return true or undefined (not false)\n if (maybePromise === true) {\n return true;\n }\n\n // Return undefined for synchronous operations (equivalent to not returning anything)\n return undefined;\n };\n\n api.runtime.onMessage.addListener(messageListener);\n\n return messageListener;\n}\n\n// Storage utilities with type safety\nexport const storage = {\n async get<T = unknown>(keys: string | string[] | null): Promise<T> {\n const result = await api.storage.local.get(keys);\n return result as T;\n },\n\n async set(items: Record<string, unknown>): Promise<void> {\n await api.storage.local.set(items);\n },\n\n async remove(keys: string | string[]): Promise<void> {\n await api.storage.local.remove(keys);\n },\n};\n\nexport const createTab = async (url: string) => {\n const currentTab = api.tabs.getCurrent();\n const tab = await currentTab;\n const newTab = await api.tabs.create({\n url,\n openerTabId: tab?.id,\n active: false,\n pinned: true,\n });\n const wasNewTabLoaded = await waitForTabToLoad(newTab.id!);\n if (!wasNewTabLoaded) {\n // TODO: Log activation error\n return;\n }\n\n setTimeout(() => {\n // Autoclose the new tab after 30 seconds\n if (newTab?.id) {\n api.tabs.remove(newTab.id);\n }\n }, 30000);\n};\n\nconst waitForTabToLoad = async (tabId: number): Promise<boolean> => new Promise<boolean>((resolve) => {\n api.tabs.onUpdated.addListener(async function listener(updatedTabId, changeInfo) {\n if (updatedTabId === tabId && changeInfo.status === 'complete') {\n api.tabs.onUpdated.removeListener(listener);\n const tab = await api.tabs.get(tabId);\n if (!tab.url) { // TODO: Evaluate url integrity\n resolve(false);\n return;\n }\n\n resolve(true);\n }\n });\n});\n","// Shared constants between content and background scripts\nconst POPUP_MESSAGE_TYPES = {\n HIDE_POPUP: 'GF_HIDE_POPUP',\n GET_POPUP_CONFIG: 'GF_GET_POPUP_CONFIG',\n IS_ACTIVE_DOMAIN: 'GF_IS_ACTIVE_DOMAIN',\n LOG_MERCHANTS_IN_SEARCH_RESULTS: 'GF_LOG_MERCHANTS_IN_SEARCH_RESULTS',\n SHOULD_STAND_DOWN: 'GF_SHOULD_STAND_DOWN',\n ACTIVATE_OFFER: 'GF_ACTIVATE_OFFER',\n STORE_SHOPIFY_SHOP_ID: 'GF_STORE_SHOPIFY_SHOP_ID', // Added new message type for Shopify ID\n GET_DOMAIN_BY_SHOP_ID: 'GF_GET_DOMAIN_BY_SHOP_ID', // Get domain information for a shop ID\n GET_LANGUAGE_CONTENT: 'GF_GET_LANGUAGE_CONTENT', // Get localized strings for a language + charities\n} as const;\n\nexport const MESSAGE_TYPES = {\n TRACK_EVENT: 'GF_TRACK_EVENT',\n ...POPUP_MESSAGE_TYPES,\n} as const;\n\n// Initial state\nexport const INITIAL_STATE = {\n isInitialized: false,\n data: {},\n settings: {\n enabled: true,\n theme: 'light',\n },\n} as const;\n\n// Storage Keys\nexport const SHOPIFY_SHOP_IDS_STORAGE_KEY = 'shopify_shop_ids' as const;\nexport const LAST_HEALTH_CHECK_STORAGE_KEY = 'gf_last_health_check' as const;\nexport const VISITED_WEBSITE_PREFIX_STORAGE_KEY = 'gfhv-' as const;\nexport const POPUP_HIDDEN_STORAGE_KEY = 'popup_hide' as const;\nexport const PARTNER_CONFIG_STORAGE_KEY = 'gf_partner_config' as const;\nexport const GLOBAL_CONFIG_STORAGE_KEY = 'gf_global_config' as const;\nexport const COUNTRY_CODE_STORAGE_KEY = 'countryCode' as const;\nexport const VERSION_STORAGE_KEY = 'version' as const;\nexport const ANONYMOUS_USER_STORAGE_KEY = 'gf_anonymous_user_info' as const;\nexport const ANONYMOUS_ENCRYPTED_TOKEN_STORAGE_KEY = 'gf_anonymous_encrypted_token' as const;\nexport const GF_AD_EVENT_HISTORY_STORAGE_KEY = 'gf_ad_event_history' as const;\nexport const WILDFIRE_STORAGE_KEYS = {\n DEVICE: 'wfDevice',\n DOMAINS: 'wfDomains',\n STANDDOWN_POLICY: 'wfStanddownPolicy',\n STANDDOWN_HISTORY: 'wfStanddownHistory',\n LAST_CACHE_REFRESH: 'wfLastCacheRefresh',\n MERCHANT_RATES: 'wfMerchantRates',\n} as const;\n\nexport const UNKNOWN_CHARITY = {\n ein: '0',\n tpi: '0',\n};\n\nexport const DEFAULT_LANGUAGE = 'en' as const;\nexport const DEFAULT_COUNTRY = 'us' as const;\n\nexport const DEFAULT_CACHE_RETENTION = 60 * 10; // 10 minutes\n","import browser from 'webextension-polyfill';\n\n// we want to ensure that we don't conflict with any other storage from the host extensions\nconst storagePrefix = 'GIVE_FREELY_';\n\nexport const storage = {\n async get<T>(key: string): Promise<T | null> {\n const prefixedKey = `${storagePrefix}${key}`;\n const result = await browser.storage.local.get(prefixedKey);\n return result[prefixedKey] as T || null;\n },\n\n async set<T>(key: string, value: T): Promise<void> {\n const prefixedKey = `${storagePrefix}${key}`;\n await browser.storage.local.set({ [prefixedKey]: value });\n },\n\n async remove(keys: string | string[]): Promise<void> {\n const prefixedKeys = Array.isArray(keys)\n ? keys.map((key) => `${storagePrefix}${key}`)\n : `${storagePrefix}${keys}`;\n await browser.storage.local.remove(prefixedKeys);\n },\n};\n","import { VERSION_STORAGE_KEY } from '../constants';\nimport { storage } from './storage';\n\n// @ts-expect-error global variable\nexport const getCurrentVersion = () => String(LIB_VERSION);\n\nconst updateVersion = (newVersion: string): Promise<void> => storage.set(VERSION_STORAGE_KEY, newVersion);\n\n/**\n *Determines if the current version is different than the one persisted in the storage\n *If updateStorageIfNew is true, it will update the current version in storage\n */\nexport const isNewVersion = async (updateStorageIfNew: boolean = true): Promise<boolean> => {\n const storedVersion = await storage.get<string>(VERSION_STORAGE_KEY);\n const currentVersion = await getCurrentVersion();\n const isANewVersion = storedVersion !== currentVersion;\n\n if (updateStorageIfNew && isANewVersion) {\n await updateVersion(currentVersion);\n }\n\n return isANewVersion;\n};\n\n/**\n * Updates the current version in storage\n */\nexport const updateCurrentVersion = async () => updateVersion(await getCurrentVersion());\n","import { sendMessage } from '../browser';\r\nimport { GiveFreelyConfigService } from '../config/giveFreelyConfig';\r\nimport { GF_AD_EVENT_HISTORY_STORAGE_KEY, MESSAGE_TYPES } from '../constants';\r\nimport { addMinutes } from '../utils/add-time';\r\nimport { getCurrentVersion } from '../utils/current-version';\r\nimport { Logger } from '../utils/logger';\r\nimport { storage } from '../utils/storage';\r\nimport { GiveFreelyUserService } from '../vendors/givefreely/giveFreelyUserService';\r\nimport { EventHistoryEntry, EventType, GfEvent } from './types';\r\n\r\nexport class Analytics {\r\n private _partnerApiKey: string;\r\n private readonly _configService: GiveFreelyConfigService;\r\n private _debounceWindowInMinutes: number;\r\n private readonly _userService: GiveFreelyUserService;\r\n private readonly _logger: Logger;\r\n\r\n /**\r\n * @param partnerApiKey The partner key\r\n * @param debounceWindowInMinutes Number of minutes after which the same event can be broadcasted again. Default is 60 minutes.\r\n */\r\n constructor(partnerApiKey: string, userService: GiveFreelyUserService, configService: GiveFreelyConfigService, debounceWindowInMinutes = 60) {\r\n this._partnerApiKey = partnerApiKey;\r\n this._userService = userService;\r\n this._debounceWindowInMinutes = debounceWindowInMinutes;\r\n this._logger = Logger.getInstance({ title: 'Analytics' });\r\n this._configService = configService;\r\n }\r\n\r\n /**\r\n * Sends a request for broadcasting an event in the background.\r\n * Call this method from content scripts only\r\n */\r\n static trackEvent = async<T extends EventType>(eventType: T, eventData: unknown, anonymous: boolean = false, skipThrottling: boolean = false) => {\r\n await sendMessage({\r\n type: MESSAGE_TYPES.TRACK_EVENT,\r\n payload: {\r\n eventType, eventData, anonymous, skipThrottling,\r\n },\r\n\r\n });\r\n };\r\n\r\n track = async<T extends EventType>\r\n (eventType: T, wfDeviceId?: number, payload?: unknown, anonymous: boolean = false, skipThrottling: boolean = false): Promise<boolean> => {\r\n const event: GfEvent<T> = {\r\n partner: `adUnit_${this._partnerApiKey}`,\r\n eventType,\r\n eventData: {\r\n userId: anonymous ? undefined : this._userService?.user?.id,\r\n libVersion: getCurrentVersion(),\r\n wfDeviceId,\r\n ...payload!,\r\n },\r\n };\r\n\r\n try {\r\n const serializedEvent = JSON.stringify(event, (_key, value) => {\r\n if (value instanceof Error) {\r\n return {\r\n name: value.name,\r\n message: value.message,\r\n stack: value.stack,\r\n };\r\n }\r\n return value;\r\n });\r\n\r\n const eventsUrl = await this.getEventsUrl();\r\n if (eventsUrl) {\n const result = await this.BroadcastEvent(eventsUrl, serializedEvent, event, skipThrottling);\n return result;\n }\r\n\r\n this._logger.info('Cant broadcast event. eventsUrl cant be retrieved from config', event, true);\r\n return false;\n } catch (error) {\r\n // Prevent logging this remotely to avoid further network errors and enter in an infinite loop\r\n this._logger.error('Something unexpected happened when dispatching a gf event', { error, event }, true);\r\n return false;\r\n }\r\n };\r\n\r\n private async BroadcastEvent(eventsUrl: string, serializedEvent: string,\r event: GfEvent<EventType>, skipThrottling: boolean): Promise<boolean> {\r\n if (await this.shouldBroadcastEvent(serializedEvent, skipThrottling)) {\r\n const result = await fetch(eventsUrl, {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n body: serializedEvent,\r\n cache: 'no-store',\r\n });\r\n\r\n if (!result.ok) {\r\n this._logger.error('Something unexpected happened when dispatching an event', {\r\n status: result.status,\r\n statusText: result.statusText,\r\n event,\r\n }, true);\r\n\r\n return false;\r\n }\r\n await this.pushEventToHistory(serializedEvent);\r\n return true;\r\n }\r\n\r\n this._logger.info('This event has already been broadcasted during the past hour', event, true);\r\n return false;\r\n }\r\n\r\n private async getEventsUrl(): Promise<string | undefined> {\r\n // Warning: Always get the cached config here to avoid infinite loops\r\n const config = await this._configService.getCachedConfig();\r\n return config?.eventsUrl;\r\n }\r\n\r\n private getEventsHistory = async (): Promise<EventHistoryEntry[]> => {\r\n const history = await storage.get<EventHistoryEntry[]>(GF_AD_EVENT_HISTORY_STORAGE_KEY);\r\n\r\n // Old entries cleanup (We remove any entry older than x minutes ago)\r\n const lastHourDate = addMinutes(-this._debounceWindowInMinutes);\r\n\r\n const typedHistory = ((history || []) as EventHistoryEntry[])\r\n .filter((x) => x.createdAt > lastHourDate);\r\n\r\n await storage.set(GF_AD_EVENT_HISTORY_STORAGE_KEY, typedHistory);\r\n\r\n return typedHistory;\r\n };\r\n\r\n private shouldBroadcastEvent = async (serializedEvent: string, skipThrottling: boolean): Promise<boolean> => {\r\n if (skipThrottling) return true;\r\n\r\n const history = await this.getEventsHistory();\r\n\r\n return !history.some((entry) => entry.payload === serializedEvent);\r\n };\r\n\r\n private pushEventToHistory = async (serializedEvent: string): Promise<void> => {\r\n const history = await this.getEventsHistory();\r\n\r\n history.push({\r\n createdAt: Date.now(),\r\n payload: serializedEvent,\r\n });\r\n\r\n await storage.set(GF_AD_EVENT_HISTORY_STORAGE_KEY, history);\r\n };\r\n}\r\n","/**\n * Adds the provided hours to the current date and returns it as a unix-like epoch\n */\nexport const addHours = (h: number): number => {\n const now = new Date();\n now.setTime(now.getTime() + (h * 60 * 60 * 1000));\n\n return now.getTime();\n};\n\n/**\n * Adds the provided minutes to the current date and returns it as a unix-like epoch\n */\nexport const addMinutes = (m: number): number => {\n const now = new Date();\n now.setTime(now.getTime() + (m * 60 * 1000));\n\n return now.getTime();\n};\n","// Utility functions shared between content and background scripts\nexport function isValidMessage<T>(message: unknown): message is { type: string; payload: T } {\n return (\n typeof message === 'object'\n && message !== null\n && 'type' in message\n && 'payload' in message\n && typeof message.type === 'string'\n );\n}\n\n/**\n * /\n * Merges two objects if a condition is met. Otherwise, returns the first object.\n */\nexport function mergeIf<T>(condition: boolean, left: T, right: T): T {\n return condition ? { ...left, ...right } : left;\n}\n\n// Add more shared utility functions as needed\n","/** @jsxImportSource solid-js */\nimport {\n createEffect, createSignal, JSX, onCleanup, Setter, Show,\n} from 'solid-js';\nimport { CheckoutPopupStyles as styles } from '../CheckoutPopup.styles';\nimport { PartnerGiveFreelyConfig } from '../../../shared/config/types';\nimport { RateKindMap, WildfireActiveDomain, WildfireMerchantRateDetail } from '../../../shared/vendors/wildfire/types';\nimport { OfferTitle } from './OfferTitle';\nimport { OfferDetails } from './OfferDetails';\nimport { calculateMaxRate } from '../../lib/calculateMaxRate';\nimport { Analytics } from '../../../shared/analytics';\nimport { PopupEvent } from '../../../shared/analytics/types';\nimport { mergeIf, UNKNOWN_CHARITY } from '../../../shared';\nimport { useT } from '../../lib/hooks/useT';\nimport { useCharities } from '../../lib/hooks/useCharities';\nimport { GfCheckoutPopupCharity } from '../../GfAdUnit';\nimport { Logger } from '../../../shared/utils/logger';\n\nconst getPopupBehavior = (config: PartnerGiveFreelyConfig): {\n hasBackdrop: boolean,\n clickAction: 'hide-opacity' | 'ignore' | 'donate'\n} => {\n const hasBackdrop = !!config.containerStyle?.backdropColor || !!config.containerStyle?.showAsModal;\n const clickAction = config.containerStyle?.clickAction ?? 'hide-opacity';\n\n return { hasBackdrop, clickAction };\n};\n\ninterface MainScreenProps {\n setBackdropHidden: Setter<boolean>;\n checkoutPopupConf: PartnerGiveFreelyConfig;\n activeDomain: WildfireActiveDomain;\n merchantRates: WildfireMerchantRateDetail<keyof RateKindMap>[];\n onClose: () => void;\n onCharitySelect: (charity: GfCheckoutPopupCharity, skipSuccess?: boolean) => void;\n onSuppress: () => void;\n onOfferDetailsClick: (toggleState: boolean) => Promise<void>;\n mainContainerRef: HTMLDivElement | undefined;\n dialogRef: HTMLDialogElement | undefined;\n logger: Logger;\n}\n\nexport function MainScreen(props: MainScreenProps) {\n const [detailsDisplayed, setDetailsDisplayed] = createSignal(false);\n const [selectedCharity, setSelectedCharity] = createSignal<\n { charity: GfCheckoutPopupCharity, closeOnDonation?: boolean } | null>(null);\n\n const handleDialogClick = (e: MouseEvent) => {\n const { hasBackdrop, clickAction } = getPopupBehavior(props.checkoutPopupConf);\n if (hasBackdrop && clickAction === 'donate') {\n e.stopPropagation();\n }\n };\n\n const handleWindowClick = () => {\n const { hasBackdrop, clickAction } = getPopupBehavior(props.checkoutPopupConf);\n if (hasBackdrop && clickAction !== 'ignore') {\n if (clickAction === 'donate') {\n selectCharity(UNKNOWN_CHARITY, true);\n } else {\n props.setBackdropHidden(true);\n }\n }\n };\n\n createEffect(() => {\n window.addEventListener('click', handleWindowClick);\n props.mainContainerRef?.addEventListener('click', handleDialogClick);\n\n onCleanup(() => {\n // We need this timeout in case the click event also unmounts the component.\n setTimeout(() => {\n window.removeEventListener('click', handleWindowClick);\n props.mainContainerRef?.removeEventListener('click', handleDialogClick);\n }, 500);\n });\n });\n\n const t = useT();\n const getCharities = useCharities();\n\n createEffect(() => {\n if (detailsDisplayed() && props.dialogRef) {\n props.dialogRef\n .scroll({ top: props.dialogRef.offsetHeight, behavior: 'smooth' });\n }\n });\n\n createEffect(() => {\n const charitySelection = selectedCharity();\n\n if (charitySelection) {\n props.onCharitySelect(charitySelection.charity, charitySelection.closeOnDonation\n ? props.checkoutPopupConf.checkoutPopupActivateAndCloseSkipSuccess : undefined);\n }\n });\n\n const handleWhyAmISeeingThisClick = () => void Analytics.trackEvent(PopupEvent.checkoutPopupWhyAmISeeingThisClicked, {\n domain: globalThis.window.location.hostname,\n });\n\n const selectCharity = (charity: GfCheckoutPopupCharity, closeOnDonation?: boolean) => setSelectedCharity({ charity, closeOnDonation });\n\n const isCharitySelected = () => !!selectedCharity()?.charity;\n\n return (\n <>\n <div style={styles.mainContainer}>\n <div style={styles.header}>\n <div\n style={{ ...styles.headingGrow, 'font-weight': 800 }}\n innerHTML={t('main.title.v2')}\n />\n <Show when={props.checkoutPopupConf.checkoutPopupActivateAndClose}>\n <a\n href=\"#!\"\n style={mergeIf<JSX.CSSProperties>(isCharitySelected(), styles.activateAndCloseLink, styles.activateAndCloseLinkSelected)}\n onClick={() => selectCharity(UNKNOWN_CHARITY, true)}\n innerHTML={t('main.activateAndClose.v2')}\n />\n </Show>\n <Show when={props.checkoutPopupConf.checkoutPopupMainCloseButtonVisible && !props.checkoutPopupConf.checkoutPopupActivateAndClose}>\n <button\n class=\"give-freely-close-button\"\n style={styles.closeButton}\n onClick={() => props.onClose()}\n aria-label=\"Close\"\n >\n ×\n </button>\n </Show>\n </div>\n <div style={styles.subheading}>\n <OfferTitle title={t('main.subTitle.v2')} activeDomain={props.activeDomain} />\n </div>\n <div style={styles.charityGrid}>\n {\n getCharities().reduce<JSX.Element[]>((result, charity) => {\n if (charity?.title && charity?.title !== '') {\n result.push(\n <div\n style={mergeIf<JSX.CSSProperties>(isCharitySelected(), styles.charityButton, { cursor: 'default' })}\n onClick={() => !isCharitySelected() && selectCharity(charity)}\n >\n {\n charity.decorator && charity.decoratorLeftStyle && charity.decoratorRightStyle\n && <>\n <div style={charity.decoratorLeftStyle} innerHTML={charity.decorator} />\n <div style={charity.decoratorRightStyle} innerHTML={charity.decorator} />\n </>\n }\n\n <div style={{\n 'text-align': 'center', display: 'flex', 'flex-direction': 'column', 'align-items': 'center', gap: '7px',\n }}>\n <img src={charity.logo} style={styles.charityLogo} alt={charity.title} />\n <span innerHTML={charity.title}/>\n </div>\n <button\n style={\n mergeIf<JSX.CSSProperties>(isCharitySelected(), {\n ...styles.selectButton,\n 'background-color': props.checkoutPopupConf?.checkoutPopupSelectCharityButtonBgColor || '#0052FF',\n }, styles.charityButtonDisabled)}\n disabled={isCharitySelected()}\n aria-label={`Select charity: ${charity.title}`}\n >\n <span innerHTML={t('main.charitySelect')} />\n </button>\n </div>,\n );\n } else {\n props.logger.error(`Translation was not found for EIN ${charity?.ein}`);\n }\n return result;\n }, [])\n }\n <div style={mergeIf<JSX.CSSProperties>(isCharitySelected(), styles.charityButton, { cursor: 'default', 'justify-content': 'flex-end' })}\n onClick={() => !isCharitySelected() && props.onSuppress()}>\n <div style={{\n 'text-align': 'center', display: 'flex', 'align-items': 'center', height: '100%',\n }}>\n <span innerHTML={t('main.sixthBox')} />\n </div>\n <button\n style={\n mergeIf<JSX.CSSProperties>(isCharitySelected(), {\n ...styles.selectButton,\n 'background-color': props.checkoutPopupConf.checkoutPopupSelectCharityButtonBgColor || '#0052FF',\n }, styles.charityButtonDisabled)}\n disabled={isCharitySelected()}\n aria-label=\"Don't show again\"\n >\n <span innerHTML={t('main.settings.v2')} />\n </button>\n </div>\n </div>\n <div style={styles.footerLinks}>\n <p\n onClick={() => {\n props.onOfferDetailsClick(!detailsDisplayed());\n setDetailsDisplayed(!detailsDisplayed());\n }}\n style={styles.openDetailsButton}\n >\n <span innerHTML={t('main.offerDetails')} />\n </p>\n <a\n class=\"give-freely-footer-link\"\n onClick={handleWhyAmISeeingThisClick}\n style={styles.footerLink}\n href={props.checkoutPopupConf.externalUrls.giveFreelyWhyAmISeeingThis}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <span innerHTML={t('main.whyAmISeeingThis')} />\n </a>\n </div>\n {props.checkoutPopupConf.checkoutPopupDisplayNameInFooter\n && <div style={styles.supportedBy}>\n <span innerHTML={t('main.footer')} />\n </div>\n }\n </div>\n <Show when={detailsDisplayed()} >\n <OfferDetails\n merchantName={props.activeDomain.Merchant.Name}\n extensionName={props.checkoutPopupConf.displayName}\n termsUrl={props.checkoutPopupConf.externalUrls.giveFreelyTermsAndConditions}\n parsedMaxRate={\n props.activeDomain.Merchant.MaxRate\n ? calculateMaxRate(\n props.activeDomain.Merchant.MaxRate.Kind,\n props.activeDomain.Merchant.MaxRate?.Amount,\n )\n : null\n }\n merchantRateDetail={props.merchantRates}\n onClose={() => setDetailsDisplayed(false)}\n />\n </Show>\n </>\n );\n}\n","// src/content/lib/hooks/useCharities.ts\nimport { useContext } from 'solid-js';\nimport { ContentContext } from '../../context/translation/translationContext';\n\nexport const useCharities = () => {\n const getContentAccessor = useContext(ContentContext);\n const contentProvider = getContentAccessor();\n\n if (!contentProvider) {\n throw new Error('Content provider context is undefined');\n }\n\n return () => contentProvider.getAllCharities();\n};\n","/** @jsxImportSource solid-js */\nimport { createSignal, Show } from 'solid-js';\nimport { CheckoutPopupStyles as styles } from '../CheckoutPopup.styles';\nimport { PartnerGiveFreelyConfig } from '../../../shared/config/types';\nimport { useT } from '../../lib/hooks/useT';\n\ninterface GoodbyeScreenProps {\n checkoutPopupConf: PartnerGiveFreelyConfig;\n onClose: () => void;\n onBack: () => void;\n onGoodbye: (days: number) => void;\n setScreen: (screen: 'main' | 'goodbye' | 'donate') => void;\n}\n\nexport function GoodbyeScreen(props: GoodbyeScreenProps) {\n const [days, setDays] = createSignal(0);\n const t = useT();\n\n return (\n <div style={{ 'font-size': '14px' }}>\n <div style={{ ...styles.header, 'flex-direction': 'row' }}>\n <div style={{ ...styles.headingGrow, 'margin-top': '20px' }}>\n <span innerHTML={t('suppress.title')} />\n </div>\n <Show when={props.checkoutPopupConf.checkoutPopupSupressCloseButtonVisible}>\n <button\n class=\"give-freely-close-button\"\n style={styles.closeButton}\n onClick={() => props.onGoodbye(0)}\n aria-label=\"Close\"\n >\n ×\n </button>\n </Show>\n </div>\n <button\n class=\"give-freely-back-button\"\n style={styles.backButton}\n onClick={() => props.onBack()}\n aria-label=\"Back to charity selection\"\n >\n <span innerHTML={t('suppress.backButton')} />\n </button>\n <hr />\n <div id=\"give-freely-goodbye-screen-options\" style={styles.goodbyeOptions}>\n <label class=\"give-freely-radio-option\" style={styles.goodbyeItem}>\n <input\n type=\"radio\"\n name=\"gf-rad-goodbye\"\n value=\"1\"\n onChange={() => setDays(1)}\n />\n <span innerHTML={t('suppress.suppressionPeriod').replace('{0}', '1')} />\n </label>\n <label class=\"give-freely-radio-option\" style={styles.goodbyeItem}>\n <input\n type=\"radio\"\n name=\"gf-rad-goodbye\"\n value=\"7\"\n onChange={() => setDays(7)}\n />\n <span innerHTML={t('suppress.suppressionPeriodPlural').replace('{0}', '7')} />\n </label>\n <label class=\"give-freely-radio-option\" style={styles.goodbyeItem}>\n <input\n type=\"radio\"\n name=\"gf-rad-goodbye\"\n value=\"30\"\n onChange={() => setDays(30)}\n />\n <span innerHTML={t('suppress.suppressionPeriodPlural').replace('{0}', '30')} />\n </label>\n <label class=\"give-freely-radio-option\" style={styles.goodbyeItem}>\n <input\n type=\"radio\"\n name=\"gf-rad-goodbye\"\n value=\"90\"\n onChange={() => setDays(90)}\n />\n <span innerHTML=\n {t('suppress.suppressionPeriodPlural').replace('{0}', '90')}\n />\n </label>\n <Show when={props.checkoutPopupConf.checkoutPopupNeverSuppressionAllowed}>\n <label class=\"give-freely-radio-option\" style={styles.goodbyeItem}>\n <input\n type=\"radio\"\n name=\"gf-rad-goodbye\"\n value=\"18250\"\n onChange={() => setDays(18250)/* 50 years */}\n />\n <span innerHTML=\n {t('suppress.suppressionPeriodNever')}\n />\n </label>\n </Show>\n </div>\n <button\n class=\"give-freely-submit-button\"\n style={{\n ...styles.selectButton,\n 'font-weight': '700',\n 'margin-top': '10px',\n 'margin-bottom': '0px',\n 'background-color': props.checkoutPopupConf.checkoutPopupSelectCharityButtonBgColor || '#0052FF',\n width: '100px',\n }}\n onClick={() => {\n const radio = days();\n if (radio) {\n props.onGoodbye(radio);\n props.setScreen('main');\n }\n }}\n >\n <span innerHTML={t('suppress.submitButton')} />\n </button>\n </div>\n );\n}\n","/** @jsxImportSource solid-js */\nimport {\n createSignal, onCleanup, onMount, Show,\n} from 'solid-js';\nimport { CheckoutPopupStyles as styles } from '../CheckoutPopup.styles';\nimport { PartnerGiveFreelyConfig } from '../../../shared/config/types';\nimport { StringUtils } from '../../../shared/utils/string-utils';\nimport { useT } from '../../lib/hooks/useT';\nimport { GfCheckoutPopupCharity } from '../../GfAdUnit';\n\ninterface DonateScreenProps {\n checkoutPopupConf: PartnerGiveFreelyConfig;\n selectedCharity: GfCheckoutPopupCharity | undefined;\n failedDonation: boolean;\n onClose: () => void;\n setScreen: (screen: 'main' | 'goodbye' | 'donate') => void;\n}\n\nexport function DonateScreen(props: DonateScreenProps) {\n const [closingSecondsLeft, setClosingSecondsLeft] = createSignal<number | null>(null);\n const t = useT();\n let closingIntervalId: NodeJS.Timeout;\n\n const startClosingCountdown = () => {\n const checkoutPopupDonationSuccessAutoCloseInSeconds = props.checkoutPopupConf.checkoutPopupDonationSuccessAutoCloseInSeconds ?? 3;\n setClosingSecondsLeft(checkoutPopupDonationSuccessAutoCloseInSeconds);\n\n closingIntervalId = setInterval(() => {\n setClosingSecondsLeft((prev) => {\n if (prev === null || prev <= 1) {\n clearInterval(closingIntervalId);\n props.onClose();\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n };\n\n onCleanup(() => clearInterval(closingIntervalId));\n\n onMount(() => {\n if (!props.failedDonation) {\n startClosingCountdown();\n }\n });\n\n return (\n <div style={{ 'font-size': '14px' }}>\n <div style={{ ...styles.header, 'flex-direction': 'row' }}>\n <div style={{ ...styles.headingGrow, 'margin-top': '20px' }}>\n <span innerHTML={props.failedDonation ? t('donate.failTitle') : t('donate.title')} />\n </div>\n <button\n class=\"give-freely-close-button\"\n style={styles.closeButton}\n onClick={() => props.onClose()}\n aria-label=\"Close\"\n >\n ×\n </button>\n </div>\n <hr />\n <div style={{ padding: '30px', height: '150px', 'font-size': '14px' }}>\n <span innerHTML={props.failedDonation ? t('donate.failContent') : t('donate.content')} />\n </div>\n <Show when={!props.failedDonation} >\n <div>\n <p style={styles.autoClosingLabel}>\n <span innerHTML={StringUtils.formatMessage(t('donate.autoClosing'), closingSecondsLeft() ?? 0)} />\n </p>\n </div>\n </Show>\n </div>\n );\n}\n","/** @jsxImportSource solid-js */\nimport {\n createEffect, createSignal, Show,\n} from 'solid-js';\nimport { RateKindMap, WildfireActiveDomain, WildfireMerchantRateDetail } from '../../shared/vendors/wildfire/types';\nimport { PartnerGiveFreelyConfig } from '../../shared/config/types';\nimport { Logger } from '../../shared/utils/logger';\nimport { CheckoutPopupStyles as styles } from './CheckoutPopup.styles';\nimport { MainScreen } from './components/MainScreen';\nimport { GoodbyeScreen } from './components/GoodbyeScreen';\nimport { DonateScreen } from './components/DonateScreen';\nimport { GfCheckoutPopupCharity } from '../GfAdUnit';\n\ninterface CheckoutPopupProps {\n checkoutPopupConf: PartnerGiveFreelyConfig;\n elementId: string;\n activeDomain: WildfireActiveDomain;\n merchantRates: WildfireMerchantRateDetail<keyof RateKindMap>[];\n onClose: (days?: number) => void;\n onDonate: (\n charity: GfCheckoutPopupCharity,\n activeDomain: WildfireActiveDomain\n ) => Promise<boolean>;\n onOfferDetailsClick: (toggleState: boolean) => Promise<void>;\n logger: Logger;\n}\n\nexport function CheckoutPopup(props: CheckoutPopupProps) {\n const [screen, setScreen] = createSignal<'main' | 'goodbye' | 'donate'>('main');\n const [selectedCharity, setSelectedCharity] = createSignal<GfCheckoutPopupCharity | undefined>();\n const [failedDonation, setFailedDonation] = createSignal<boolean>(false);\n const [backdropHidden, setBackdropHidden] = createSignal<boolean>(false);\n\n let dialogRef: HTMLDialogElement | undefined;\n\n createEffect(() => {\n if (dialogRef) {\n if (props.checkoutPopupConf.containerStyle?.showAsModal) dialogRef.showModal();\n else dialogRef.showPopover();\n\n dialogRef.focus();\n dialogRef.blur();\n }\n });\n\n const closeAdClick = () => {\n props.logger.debug('Close button clicked');\n props.onClose();\n };\n\n const charityClick = async (charity: GfCheckoutPopupCharity, skipSuccess: boolean = false) => {\n // We close the popup as soon as a charity is selected\n if (skipSuccess) {\n props.onClose();\n }\n\n props.logger.info('Charity selected', {\n charity,\n domain: props.activeDomain.Domain,\n });\n setSelectedCharity(charity);\n const success = await props.onDonate(charity, props.activeDomain);\n\n if (skipSuccess) {\n props.onClose();\n return;\n }\n\n setFailedDonation(!success);\n setScreen('donate');\n };\n\n const suppressClick = () => {\n props.logger.debug('Suppress button clicked');\n setScreen('goodbye');\n };\n\n const back = () => {\n props.logger.debug('Navigating back to main screen');\n setScreen('main');\n };\n\n const handleGoodbye = (days: number) => {\n props.logger.info('User chose to hide popup', { days });\n props.onClose(days);\n };\n\n let containerRef: HTMLDivElement | undefined;\n\n return (\n <dialog popover=\"manual\" ref={dialogRef}\n class={backdropHidden() ? 'backdrop-hidden' : ''}\n style={{\n ...styles.container,\n ...(props.checkoutPopupConf.containerStyle?.customStyle ?? {}),\n }} id={props.elementId}>\n <div ref={containerRef} style={styles.scroller}>\n <Show when={screen() === 'main'}>\n <MainScreen\n setBackdropHidden={setBackdropHidden}\n mainContainerRef={containerRef}\n dialogRef={dialogRef}\n checkoutPopupConf={props.checkoutPopupConf}\n activeDomain={props.activeDomain}\n merchantRates={props.merchantRates}\n onClose={closeAdClick}\n onCharitySelect={charityClick}\n onSuppress={suppressClick}\n onOfferDetailsClick={props.onOfferDetailsClick}\n logger={props.logger}\n />\n </Show>\n\n <Show when={screen() === 'goodbye'}>\n <GoodbyeScreen\n checkoutPopupConf={props.checkoutPopupConf}\n onClose={() => props.onClose()}\n onBack={back}\n onGoodbye={handleGoodbye}\n setScreen={setScreen}\n />\n </Show>\n\n <Show when={screen() === 'donate'}>\n <DonateScreen\n checkoutPopupConf={props.checkoutPopupConf}\n selectedCharity={selectedCharity()}\n onClose={() => props.onClose()}\n failedDonation={failedDonation()}\n setScreen={setScreen}\n />\n </Show>\n </div>\n </dialog>\n );\n}\n","export function cartOrCheckoutRule(url: string): boolean {\n const keywords = ['cart', 'checkout', 'shopping-bag', 'shopping-basket', 'shopping-cart', 'basket'];\n const combines = ['', '.asp', '.aspx', '.php', '.js', '.htm', '.html'];\n const final = keywords.flatMap((keyword) => combines.map((combine) => keyword + combine))\n .filter((x) => x !== 'basket');\n\n const exclusions = ['tote-cart', 'tote.cart'];\n\n const path = url;\n const absoluteMatches = final.filter((x) => path.includes(x));\n const segments = path.split('/');\n\n const result = !segments.some((x) => exclusions.some((ex) => x.includes(ex)))\n && (segments.some((segment) => final.some((keyword) => segment.startsWith(keyword)\n || segment.endsWith(keyword),\n )) || segments[segments.length - 1].toLowerCase() === 'basket'\n\n || absoluteMatches.length > 1\n || (absoluteMatches.length === 1 && path.includes('shopping')));\n\n return result;\n}\n","export function bookingRule(url: string, documentRef: Document): boolean {\n // TODO: This rule is incomplete. Won't track sites like https://www.hrs.com/ checkout. We need to pull in more rules from GF.\n const keywords = ['book'];\n const segments = url.split('/');\n return segments.some((segment) => keywords.some((keyword) => segment.startsWith(keyword)\n || segment.endsWith(keyword),\n )) && documentRef.evaluate(\"//*[self::h1 or self::h2 or self::h3 or self::h4 or self::h5 or self::h6][contains(., 'Your Reservation') or contains(., 'Your reservation')]\", documentRef, null, XPathResult.ANY_TYPE, null)?.iterateNext() != null;\n}\n","import { MESSAGE_TYPES, sendMessage } from '../../shared';\r\nimport { WildfireActiveDomain } from '../../shared/vendors/wildfire/types';\r\n\r\n/**\r\n * Retrieve the shop domain from the background service using the shop ID\r\n * @param shopId The Shopify shop ID to look up\r\n * @returns Promise that resolves to true if a matching domain was found in storage\r\n */\r\nexport async function retrieveShopDomain(shopId: number): Promise<WildfireActiveDomain | null> {\r\n try {\r\n // Send message to background service to get domain by shop ID\r\n const response = await sendMessage<typeof MESSAGE_TYPES.GET_DOMAIN_BY_SHOP_ID>({\r\n type: MESSAGE_TYPES.GET_DOMAIN_BY_SHOP_ID,\r\n payload: { shopId },\r\n });\r\n\r\n if (response.payload.found && response.payload.domain) {\r\n return response.payload.domain;\r\n }\r\n return null;\n } catch {\r\n return null;\r\n }\r\n}\n","import { Logger } from '../../../../shared/utils/logger';\nimport { WildfireActiveDomain } from '../../../../shared/vendors/wildfire/types';\nimport { retrieveShopDomain } from '../../../services/retrieveShopPayDomain';\nimport { sendShopPayId } from '../../../services/sendShopPayId';\n\nexport function shopPayIdentify(activeDomain: WildfireActiveDomain, logger: Logger): number {\n const shopId = getShopIdFromWindow(logger) || getShopIdFromStoreMetaTag();\n if (shopId > 0) {\n sendShopPayId(shopId, activeDomain, logger);\n }\n return shopId;\n}\n\n/**\n * returns true or false depending on whether the current page is a Shopify/Shop Pay checkout page and the domain is found\n * @returns\n */\nexport async function shopPayRule(logger: Logger): Promise<boolean> {\n const shopId = getShopIdFromWindow(logger) || getShopIdFromStoreMetaTag();\n // For shop.app, attempt to retrieve the store domain using the shop ID\n if (window.location.hostname === 'shop.app' || window.location.hostname.endsWith('.shop.app')) {\n if (shopId > 0) {\n // For shop.app we attempt to look up the actual store domain\n const domain = await retrieveShopDomain(shopId);\n if (!domain) return false;\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Attempt to get the Shopify shop ID from the window object\n * Uses a more direct approach to extract the shop ID from the page\n */\nexport function getShopIdFromWindow(logger: Logger): number {\n try {\n // We'll use a more direct approach to extract the shop ID from the page\n\n // Method 1: Check if shop ID is in a script tag\n const scripts = Array.from(document.querySelectorAll('script'));\n for (const script of scripts) {\n if (script.dataset?.shopId && (script.dataset?.shopId?.startsWith('gid') || script.src.includes('shopify'))) {\n const parsedId = parseInt(script.dataset.shopId.replace('gid://shopify/Shop/', ''));\n if (!Number.isNaN(parsedId) && parsedId > 0) {\n return parsedId;\n }\n }\n\n // Look for inline scripts that might contain ShopifyAnalytics config\n const content = script.textContent || '';\n if (content.includes('ShopifyAnalytics') && content.includes('shopId')) {\n // Extract shopId using regex\n const match = content.match(/shopId['\"]*:\\s*['\"]*(\\d+)['\"]*[,}]/);\n if (match && match[1]) {\n const parsedId = parseInt(match[1]);\n if (!Number.isNaN(parsedId) && parsedId > 0) {\n return parsedId;\n }\n }\n }\n }\n\n // Method 2: Look for Shopify data in the DOM\n const shopifyElement = document.querySelector('[data-shop-id]');\n if (shopifyElement instanceof HTMLElement) {\n const { shopId } = shopifyElement.dataset;\n if (shopId) {\n const parsedId = parseInt(shopId);\n if (!Number.isNaN(parsedId) && parsedId > 0) {\n return parsedId;\n }\n }\n }\n\n // Method 3: Check for Shopify object in global context (less reliable in content scripts)\n // We'll still try the original approach as a fallback\n // @ts-expect-error - Accessing global window properties that might not be typed\n const possibleShopId = window?.ShopifyAnalytics?.lib?.trekkie?.defaultAttributes?.shopId;\n if (possibleShopId) {\n return parseInt(possibleShopId) || 0;\n }\n\n return 0;\n } catch (error) {\n logger.error('Error accessing ShopifyAnalytics:', error);\n return 0;\n }\n}\n\n/**\n * Attempt to get the Shopify shop ID from meta tags (for shop.app pages)\n */\nexport function getShopIdFromStoreMetaTag(): number {\n try {\n if (!window.location.href.startsWith('https://shop.app')) return 0;\n\n const meta = document?.head?.querySelector<HTMLMetaElement>('meta[name=\"store\"][content]');\n if (!meta) return 0;\n\n try {\n const content = JSON.parse(meta.content);\n return content?.id || 0;\n } catch {\n return 0;\n }\n } catch {\n return 0;\n }\n}\n","import { PartnerGiveFreelyConfig } from '../../../../shared/config/types';\nimport { Logger } from '../../../../shared/utils/logger';\n\nconst logger = Logger.getInstance();\n\n/**\n * Rule to detect cart/checkout pages based on merchant-specific regex patterns\n * Simplified from the original CartWorker implementation\n * @param currentUrl The URL to check against the merchant regex rules\n * @param hostname The hostname from the URL\n */\nexport function merchantRegexRule(config: PartnerGiveFreelyConfig, currentUrl: string, hostname: string): boolean {\n try {\n logger.debug('Checking merchant regex rules', { currentUrl });\n\n // Find matching merchant rules using secure domain matching\n // Allows exact match OR proper subdomain (e.g., shop.example.com matches example.com)\n // Prevents partial matches (e.g., fakeamazon.com won't match amazon.com)\n const matchingMerchants = config.merchantPopupRules.filter(\n (merchant) => hostname === merchant.domain || hostname.endsWith(`.${merchant.domain}`),\n );\n\n if (matchingMerchants.length === 0) {\n logger.debug('No matching merchant rules found for domain', { currentUrl });\n return false;\n }\n\n // Check if any of the merchant's regex rules match the current URL\n for (const merchant of matchingMerchants) {\n for (const ruleObj of merchant.rules) {\n try {\n const regex = new RegExp(ruleObj.rule);\n if (regex.test(currentUrl)) {\n logger.debug('Merchant regex rule matched', {\n merchant: merchant.name,\n rule: ruleObj.rule,\n currentUrl,\n });\n return true;\n }\n } catch (regexError) {\n logger.error('Invalid regex in merchant rule', {\n merchant: merchant.name,\n rule: ruleObj.rule,\n error: regexError,\n });\n }\n }\n }\n\n logger.debug('No matching regex rules found', { currentUrl });\n return false;\n } catch (error) {\n logger.error('Error in merchantRegexRule', error);\n return false;\n }\n}\n","import { PartnerGiveFreelyConfig } from '../../shared/config/types';\nimport { Logger } from '../../shared/utils/logger';\n\nexport function detectPageLanguage(config?: PartnerGiveFreelyConfig): string {\n // Method 0: Custom language detection based on configuration\n if (config?.customLanguageDetection && config.customLanguageDetection.length > 0) {\n const currentUrl = window.location.href;\n const pageText = document.body.textContent?.toLowerCase() || '';\n\n for (const rule of config.customLanguageDetection) {\n try {\n // Test if current URL matches the regex pattern\n const urlRegex = new RegExp(rule.urlPattern);\n if (urlRegex.test(currentUrl)) {\n // Search for keywords in page content\n for (const [keyword, language] of Object.entries(rule.keywords)) {\n if (pageText.includes(keyword.toLowerCase())) {\n return language;\n }\n }\n }\n } catch (error) {\n // If regex is invalid, skip this rule and continue\n Logger.getInstance().warn(`Invalid regex pattern in customLanguageDetection: ${rule.urlPattern}`, error);\n }\n }\n }\n\n // Method 1: Check HTML lang attribute (most reliable for page content)\n const htmlLang = document.documentElement.lang;\n\n // Method 2: Check Content-Language meta tag\n const metaLanguage = (document.querySelector('meta[http-equiv=\"Content-Language\"]') as HTMLMetaElement | null)?.content;\n\n // Method 3: Check hreflang link elements\n const hrefLang = (document.querySelector('link[rel=\"alternate\"][hreflang]') as HTMLLinkElement | null)?.getAttribute('hreflang');\n\n // Method 4: Use navigator.language (user's browser setting)\n const browserLanguage = navigator.language;\n\n // Get the detected language\n const detectedLanguage = htmlLang || metaLanguage || hrefLang || browserLanguage || 'en';\n\n // Normalize the language code by removing any country code (convert \"en-US\" to \"en\")\n const normalizedLanguage = typeof detectedLanguage === 'string' ? detectedLanguage.split('-')[0] : 'en';\n\n return normalizedLanguage;\n}\n","import { PartnerGiveFreelyConfig } from '../../../../shared/config/types';\nimport { detectPageLanguage } from '../../../language';\n\n/**\n * Rule to check if the current page language matches English\n * @param config The configuration object containing the checkoutPopupOnlyShowLanguageMatch property\n * @returns True if the property doesn't exist or is false, or if the page language matches English\n */\nexport function languageMatchRule(config: PartnerGiveFreelyConfig): boolean {\n // If the property doesn't exist or is false, return true\n if (config.checkoutPopupOnlyShowLanguageMatch !== true) {\n return true;\n }\n\n // If checkoutPopupOnlyShowLanguageMatch is true, we need to check the language\n const detectedLanguage = detectPageLanguage(config);\n\n // If language setting is enabled and page language matches english\n return detectedLanguage === 'en';\n}\n","import { PartnerGiveFreelyConfig } from '../../../shared/config/types';\nimport { Logger } from '../../../shared/utils/logger';\nimport {\n bookingRule, cartOrCheckoutRule, shopPayRule, merchantRegexRule, languageMatchRule,\n} from './rules';\n\nexport const checkoutRulesTest = async (config: PartnerGiveFreelyConfig) => {\n const logger = Logger.getInstance();\n logger.configure({ enabled: true, title: 'Content - checkoutRulesTest' });\n\n const locationUrl = new URL(globalThis.location.href);\n const currentUrl = locationUrl.href;\n const { hostname } = locationUrl;\n\n logger.debug('Checking if popup should be shown', {\n currentUrl,\n });\n\n const shopPayResult = await shopPayRule(logger);\n const shouldShow = languageMatchRule(config) // We want to show the popup only if the language matches\n && (cartOrCheckoutRule(locationUrl.pathname.toLowerCase())\n || bookingRule(currentUrl, document)\n || merchantRegexRule(config, currentUrl, hostname)\n || shopPayResult);\n\n logger.debug('Popup show decision based on rules', {\n shouldShow,\n matchesCartRule: cartOrCheckoutRule(locationUrl.pathname.toLowerCase()),\n matchesBookingRule: bookingRule(currentUrl, document),\n matchesShopPayRule: shopPayResult,\n matchesMerchantRegexRule: merchantRegexRule(config, currentUrl, hostname),\n matchesLanguageRule: languageMatchRule(config),\n });\n\n return shouldShow;\n};\n","import { browser } from '../../../shared';\n\n/**\n * Retrieves all installed ad unit extensions as a csv string optionally skipping the current one\n * @param roots All ad unit root elements (divs) identified\n * @returns csv list of other ad unit extensions\n */\nconst getAdUnitInstalledExtensions = (roots: HTMLCollectionOf<Element>, skipCurrentExtension = false): string | null => {\n if (roots.length < 2 && skipCurrentExtension) return null;\n\n return Array.from(roots)\n .filter((root) => !skipCurrentExtension || (root as HTMLDivElement).dataset.extensionId !== browser.runtime.id)\n .map((root) => (root as HTMLDivElement).dataset.extensionName)\n .join(',');\n};\n\nexport default getAdUnitInstalledExtensions;\n","import { JSX, Accessor, createMemo } from 'solid-js';\r\nimport {\r\n ContentContext, TranslationProviderInterface, ContentProviderInterface, CharityProviderInterface,\r\n} from './translationContext';\r\n\r\ninterface ContentProviderProps {\r\n children: JSX.Element | JSX.Element[];\r\n translate: Accessor<TranslationProviderInterface | undefined>;\r\n charities: Accessor<CharityProviderInterface | undefined>;\r\n}\r\n\r\nexport const TranslationProvider = (props: ContentProviderProps) => {\r\n const contentProvider = createMemo(() => {\r\n const translateFn = props.translate() || ((_: string) => '');\r\n const getAllCharitiesFn = props.charities() || (() => []);\r\n\r\n return {\r\n translate: translateFn,\r\n getAllCharities: getAllCharitiesFn,\r\n } as ContentProviderInterface;\r\n });\r\n\r\n return (\r\n <ContentContext.Provider value={contentProvider}>\r\n {props.children}\r\n </ContentContext.Provider>\r\n );\r\n};\r\n","import { storage } from '../utils/storage';\nimport { Logger } from '../utils/logger';\nimport { COUNTRY_CODE_STORAGE_KEY } from '../constants';\n\nconst logger = Logger.getInstance();\n\ninterface ILookUp {\n country: {\n 'iso_code': string\n }\n}\n\nconst detectUsersCountry = async (): Promise<string | undefined> => {\n logger.debug('detecting country');\n const requestOptions = {\n method: 'GET',\n headers:\n {\n 'Content-Type': 'application/json',\n Authorization: 'Basic OTEzOTkxOnFlYmpaWF9DOGNRY0lxSHA4WTVjNGxzU1pRSlM2VW9MMExzTF9tbWs=',\n },\n };\n\n try {\n // Make the fetch call to the geolocation API\n const response = await fetch('https://geoip.maxmind.com/geoip/v2.1/country/me', requestOptions);\n logger.debug('Received geolocation response', { status: response.status });\n if (!response.ok) {\n logger.error('Failed to get geolocation data', { status: response.status, statusText: response.statusText });\n return undefined;\n }\n const data = await response.json() as ILookUp;\n if (!data) {\n throw new Error('There was an error fetching geoip look up');\n }\n await storage.set(COUNTRY_CODE_STORAGE_KEY, data.country.iso_code);\n return data.country.iso_code;\n } catch (err) {\n // Prevent logging this remotely to avoid further network errors and enter in an infinite loop\n logger.error('Failed to get geolocation data', { error: err }, true);\n return undefined;\n }\n};\n\nexport const hydrateUserCountry = async (): Promise<void> => {\n try {\n await detectUsersCountry();\n } catch (error) {\n // Intentionally swallow errors to ensure this always resolves\n logger.error('Error in hydrateUserCountry', { error });\n }\n return undefined;\n};\n\nexport const getCountryCode = async (): Promise<string | undefined> => {\n const countryCode = await storage.get<string>(COUNTRY_CODE_STORAGE_KEY);\n if (countryCode) return countryCode;\n return detectUsersCountry();\n};\n","/** @jsxImportSource solid-js */\nimport { createSignal, onCleanup, onMount } from 'solid-js';\nimport { CheckoutPopup } from './CheckoutPopup/CheckoutPopup';\nimport { RateKindMap, WildfireActiveDomain, WildfireMerchantRateDetail } from '../shared/vendors/wildfire/types';\nimport { PartnerGiveFreelyConfig } from '../shared/config/types';\nimport { PopupEvent } from '../shared/analytics/types';\nimport { Analytics } from '../shared/analytics';\nimport { getIsAdUnitMuted } from './services/getIsAdUnitMuted';\nimport { shouldStandDown } from './services/shouldStandDown';\nimport { getActiveDomain } from './services/getActiveDomain';\nimport { hideAd } from './services/hideAd';\nimport { getLanguageContent } from './services/getLanguageContent';\nimport { checkoutRulesTest } from './lib/visibility';\nimport { activateOffer } from './services/activateOffer';\nimport { shopPayIdentify } from './lib/visibility/rules/shopPayRule';\nimport { retrieveShopDomain } from './services/retrieveShopPayDomain';\nimport { compareVersion } from '../shared/utils/compare-version';\nimport { getCurrentVersion } from '../shared/utils/current-version';\nimport { detectPageLanguage } from './language';\nimport { browser, DEFAULT_COUNTRY, VISITED_WEBSITE_PREFIX_STORAGE_KEY } from '../shared';\nimport getAdUnitInstalledExtensions from './lib/utils/getAdUnitInstalledExtensions';\nimport { checkSiteMatches } from './services/checkSiteMatches';\nimport { TranslationProvider } from './context/translation/TranslationProvider';\nimport { ContentProviderInterface } from './context/translation/translationContext';\nimport { getCountryCode } from '../shared/services/geolocation';\nimport { Logger } from '../shared/utils/logger';\n\nfunction hasVisitedWebsiteAlready(website: string) {\n const key = `${VISITED_WEBSITE_PREFIX_STORAGE_KEY}${website}`;\n const hasVisited = sessionStorage.getItem(key);\n if (hasVisited) {\n return true;\n }\n sessionStorage.setItem(key, 'true');\n return false;\n}\n\nexport interface GfCheckoutPopupCharity {\n ein: string;\n tpi: string;\n}\n\nexport interface CharitiesList {\n [order: string]: {\n ein: string;\n decorator?: string;\n decoratorLeftStyle?: string;\n decoratorRightStyle?: string;\n };\n}\n\nconst visibilityMediaQueryString = '(max-width: 600px), (max-height: 480px)';\nexport function GfAdUnit(props: { popupConfig: PartnerGiveFreelyConfig, logger: Logger }) {\n const [activeDomain, setActiveDomain] = createSignal<WildfireActiveDomain | undefined>(undefined);\n const [showPopup, setShowPopup] = createSignal(false);\n const [merchantRates, setMerchantRates] = createSignal<\n WildfireMerchantRateDetail<keyof RateKindMap>[]\n >([]);\n const [translationProvider, setTranslationProvider] = createSignal<ContentProviderInterface | undefined>();\n const [selectedCharities, setSelectedCharities] = createSignal<CharitiesList>({});\n let checkoutRulesWatcherInterval: number | undefined;\n\n onMount(async () => {\n props.logger.info('Mounting GfApp component');\n try {\n // check to see if site matches is on, and run the regex check against all regex in the config for site matches, then log analytics anonymously if it does match with the url\n checkSiteMatches(props.popupConfig);\n\n // We need to get translations ASAP to avoid flickering. We can't wait for the interval to start\n const languageCode = detectPageLanguage(props.popupConfig);\n void getTranslationProvider(languageCode);\n\n const currentVersion = getCurrentVersion();\n\n if (\n props.popupConfig.minVersion\n && compareVersion(currentVersion, props.popupConfig.minVersion)\n ) {\n props.logger.debug(`Current version: ${currentVersion}. Minimum version ${props.popupConfig.minVersion} not met`);\n return;\n }\n\n const currentCountry = (await getCountryCode()) ?? DEFAULT_COUNTRY;\n // We get the charities based on the current country or default to 'EN' if not found\n const charities = props.popupConfig.charities[currentCountry.toLowerCase()] ?? props.popupConfig.charities[DEFAULT_COUNTRY];\n setSelectedCharities(charities || {});\n props.logger.debug('Charities for current country', { currentCountry, charities });\n\n if (props.popupConfig.checkoutPopupMasterSwitch === false) {\n props.logger.debug('Checkout popup master switch is disabled');\n return;\n }\n\n // 2. Check for other gf extensions installed\n const gfContainerRoots = document.getElementsByClassName('give-freely-root');\n let looserExtension = false;\n if (gfContainerRoots.length > 1) {\n props.logger.debug('There is more than one gf extension installed');\n if ((gfContainerRoots.item(0) as HTMLDivElement).dataset.extensionId\n !== browser.runtime.id) {\n props.logger.debug('Giving preference to the first gf extension injected in the DOM');\n looserExtension = true;\n }\n\n props.logger.debug('Providing this extension preference over the other installed extensions');\n }\n\n // 3. Get active domain\n const { domain, rates } = await getActiveDomain(props.logger);\n setMerchantRates(rates);\n setActiveDomain(domain);\n if (!domain) {\n if (window.location.hostname !== 'shop.app' && !window.location.hostname.endsWith('.shop.app')) {\n // If it's not a shop domain, and it wasn't an active domain, we don't show the popup\n setShowPopup(false);\n return;\n }\n\n // If it's a shop app domain, we try to get the shop ID\n const shopId = window.location.pathname.split('/')[2];\n if (!shopId) {\n props.logger.error('Shop ID not found');\n setShowPopup(false);\n return;\n }\n const shopDomain = await retrieveShopDomain(parseInt(shopId));\n if (!shopDomain) {\n props.logger.error('Shop domain not found');\n setShowPopup(false);\n return;\n }\n props.logger.debug('Shop domain found', { shopDomain });\n setActiveDomain(shopDomain);\n } else {\n // If we know it's an active domain, we attempt to identify the shop pay id and store it.\n await shopPayIdentify(domain, props.logger);\n }\n\n // 4. Evaluate if it's globally muted or suppressed\n const isMutedFromStorage = await getIsAdUnitMuted(props.logger);\n if (isMutedFromStorage) {\n /* void Analytics.trackEvent(PopupEvent.checkoutPopupNotShown,\n {\n reason: `Ad prevented to be shown since it's muted/suppressed}`,\n url: globalThis.window.location.href\n }); */\n\n return;\n }\n\n // 5. Stand Down evaluation\n if (!activeDomain()) {\n // If at this point we don't have an active domain, we don't show the popup\n setShowPopup(false);\n return;\n }\n\n const isStandDown = await shouldStandDown(props.logger, activeDomain()!);\n if (isStandDown) {\n setShowPopup(false);\n\n /* void Analytics.trackEvent(PopupEvent.checkoutPopupNotShown,\n {\n reason: \"Stand-down policy\",\n url: globalThis.window.location.href\n }); */\n\n return;\n }\n // Log the active domain visited if it hasn't been visited in this session as an analytics event, if configured\n const anonymousActiveDomainLoggingConfig = props.popupConfig?.anonymousActiveDomainLogging ?? false;\n const currentActiveDomain = activeDomain() ?? undefined;\n const shouldLogActiveDomain = currentActiveDomain && anonymousActiveDomainLoggingConfig && !hasVisitedWebsiteAlready(currentActiveDomain.Domain);\n\n if (shouldLogActiveDomain) {\n void Analytics.trackEvent(PopupEvent.checkoutPopupActiveDomain,\n {\n url: currentActiveDomain.Domain,\n });\n }\n\n // 6. Start Popup Watcher\n checkoutRulesWatcherInterval = window.setInterval(async () => {\n props.logger.debug('Checking checkout rules');\n const shouldShowResult = await checkoutRulesTest(props.popupConfig);\n props.logger.debug('Should show popup based on checkout rules', { shouldShowResult });\n\n if (shouldShowResult && looserExtension) {\n void Analytics.trackEvent(PopupEvent.checkoutPopupLooserExtension,\n {\n url: globalThis.window.location.href,\n winner: (gfContainerRoots.item(0) as HTMLDivElement).dataset.extensionName,\n });\n\n props.logger.debug('Standing down because, another ad-unit extension will pop');\n\n clearInterval(checkoutRulesWatcherInterval);\n return;\n }\n\n // Check viewport size before showing popup\n if (shouldShowResult && globalThis.window.matchMedia(visibilityMediaQueryString).matches) {\n props.logger.debug('Viewport too small for displaying the popup');\n\n // Fire analytics when TRANSITIONING from shown to hidden due to viewport size\n if (showPopup()) {\n void Analytics.trackEvent(PopupEvent.checkoutPopupHiddenProgrammatically,\n {\n url: globalThis.window.location.href,\n merchantId: currentActiveDomain?.Merchant?.ID,\n reason: 'Viewport size became too small',\n });\n }\n\n setShowPopup(false);\n void Analytics.trackEvent(PopupEvent.checkoutPopupNotShownPerViewportSize,\n {\n url: globalThis.window.location.href,\n pageLanguage: languageCode,\n merchantId: currentActiveDomain?.Merchant?.ID,\n viewPortSize: { height: globalThis.window.innerHeight, width: globalThis.window.innerWidth },\n });\n return;\n }\n\n // Only fire analytics when TRANSITIONING from hidden to shown\n if (shouldShowResult && !showPopup()) {\n void Analytics.trackEvent(PopupEvent.checkoutPopupShown,\n {\n url: globalThis.window.location.href,\n pageLanguage: languageCode,\n merchantId: currentActiveDomain?.Merchant?.ID,\n domainId: currentActiveDomain?.ID,\n /*\n This might not report the full list of looser extensions (There is a small chance that some of them\n might not have been injected by the time of the evaluation)\n */\n looserCompetingExtensions: getAdUnitInstalledExtensions(gfContainerRoots, true),\n });\n }\n\n // Fire analytics when TRANSITIONING from shown to hidden programmatically\n if (!shouldShowResult && showPopup()) {\n void Analytics.trackEvent(PopupEvent.checkoutPopupHiddenProgrammatically,\n {\n url: globalThis.window.location.href,\n merchantId: currentActiveDomain?.Merchant?.ID,\n reason: 'Checkout rules no longer matched',\n });\n }\n\n setShowPopup(shouldShowResult);\n }, 2000);\n } catch (error) {\n setShowPopup(false);\n props.logger.error('An error occurred in GfApp', { error });\n }\n });\n\n onCleanup(() => {\n if (checkoutRulesWatcherInterval) {\n window.clearInterval(checkoutRulesWatcherInterval);\n }\n });\n\n const handleDonate = async (\n charity: GfCheckoutPopupCharity,\n currentActiveDomain: WildfireActiveDomain,\n ): Promise<boolean> => {\n props.logger.info('Processing donation', {\n charity,\n domain: currentActiveDomain.Domain,\n });\n\n const gfCommissionUniqueId = crypto.randomUUID();\n\n const activationResponse = await activateOffer(\n props.logger,\n currentActiveDomain,\n window.location.href,\n {\n ein: charity.ein,\n thirdPartyId: charity.tpi,\n },\n gfCommissionUniqueId,\n );\n\n props.logger.debug('Activate offer response', { activationResponse });\n\n void Analytics.trackEvent(\n activationResponse.payload.response\n ? PopupEvent.checkoutPopupDonation : PopupEvent.checkoutPopupFailedActivation,\n {\n activeDomain: currentActiveDomain.Domain,\n url: globalThis.window.location.href,\n merchantId: currentActiveDomain?.Merchant?.ID,\n domainId: currentActiveDomain?.ID,\n charity: {\n ein: charity.ein,\n tpi: charity.tpi,\n },\n rate: currentActiveDomain.Merchant.MaxRate,\n gfCommissionUniqueId,\n });\n\n return activationResponse.payload.response;\n };\n\n const handleHideAd = async (days?: number) => {\n setShowPopup(await hideAd(props.logger, days));\n if (checkoutRulesWatcherInterval) window.clearInterval(checkoutRulesWatcherInterval);\n };\n\n const handleTrackOfferDetailsDisplay = async (toggleState: boolean) => {\n void Analytics.trackEvent(PopupEvent.checkoutPopupOfferDetailsClicked,\n {\n action: toggleState ? 'opened' : 'closed',\n });\n };\n\n /**\n * Asynchronously sets the content provider with translations and charity functionality\n * @param currentLanguage\n */\n const getTranslationProvider = async (currentLanguage: string) => {\n props.logger.debug('Getting translation provider', { currentLanguage });\n\n // Use the dedicated service to get language content\n const { translations, charities } = await getLanguageContent(currentLanguage, props.logger);\n\n // Create a content provider that implements the ContentProviderInterface\n const contentProvider: ContentProviderInterface = {\n translate: (key: string): string => {\n if (translations && translations[key]) {\n return translations[key];\n }\n return '';\n },\n getAllCharities: () => {\n // Convert all charities to the Charity interface format\n const charitiesList = selectedCharities();\n return Object.entries(charitiesList).map(([order, charity]) => {\n const { ein } = charity;\n try {\n // Get charity metadata or null if not found\n const charityMetadata = charities?.[ein];\n\n if (!charityMetadata) {\n throw new Error(`Failed to find charity metadata for ein ${ein}`);\n }\n\n // Return charity with metadata, using optional chaining for cleaner code\n return {\n ein,\n tpi: charityMetadata.tpi,\n title: charityMetadata.title,\n order: parseInt(order, 10),\n logo: charityMetadata.logo,\n decorator: charity.decorator,\n decoratorLeftStyle: charity.decoratorLeftStyle,\n decoratorRightStyle: charity.decoratorRightStyle,\n };\n } catch {\n // If there's a problem with the charity we just skip it\n return {\n ein,\n tpi: '',\n title: '',\n order: 9,\n logo: '',\n };\n }\n });\n },\n };\n\n props.logger.debug('Setting content provider with translations and charity functions');\n setTranslationProvider(() => contentProvider);\n };\n\n // Create an accessor function that returns the translate function for backward compatibility\n const translateAccessor = () => translationProvider()?.translate;\n const getCharitiesAccessor = () => translationProvider()?.getAllCharities;\n\n return (\n <TranslationProvider\n translate={translateAccessor}\n charities={getCharitiesAccessor}\n >\n <div class=\"gf-app\">\n {activeDomain() && showPopup() && (\n <CheckoutPopup\n checkoutPopupConf={props.popupConfig!}\n elementId=\"give-freely-checkout-popup\"\n activeDomain={activeDomain()!}\n merchantRates={merchantRates()}\n onClose={handleHideAd}\n onDonate={handleDonate}\n onOfferDetailsClick={handleTrackOfferDetailsDisplay}\n logger={props.logger}\n />\n )}\n </div>\n </TranslationProvider>\n );\n}\n","import { PartnerGiveFreelyConfig } from '../../shared/config/types';\nimport { PopupEvent } from '../../shared/analytics/types';\nimport { Analytics } from '../../shared/analytics';\nimport { regexMatch } from '../../background/utils/regexMatch';\n\n/**\n * Checks if the current site matches any of the regex patterns in the config\n * and logs an analytics event if it does.\n *\n * @param config The partner configuration\n * @returns void\n */\nexport function checkSiteMatches(config: PartnerGiveFreelyConfig): void {\n const shouldCheckSiteMatches = config?.shouldCheckSiteMatches ?? false;\n if (!shouldCheckSiteMatches) {\n return;\n }\n const siteMatchesRegex = config?.siteMatchesRegex ?? [];\n let matchingRegex: string | undefined;\n\n const siteMatches = siteMatchesRegex.some((regex) => {\n const matches = regexMatch(window.location.href, regex);\n if (matches) {\n matchingRegex = regex;\n return true;\n }\n return false;\n });\n\n if (siteMatches && matchingRegex) {\n void Analytics.trackEvent(PopupEvent.checkoutPopupSiteMatches,\n {\n url: window.location.href,\n matchedRule: matchingRegex,\n uts: Date.now(),\n },\n true);\n }\n}\n","export function regexMatch(url: string, regexString: string): boolean {\n const regex = new RegExp(regexString);\n return regex.test(url);\n}\n","/**\n *\n * @param version1\n * @param version2\n * @returns true if version2 is greater than version1\n */\nexport const compareVersion = (version1: string, version2: string) => {\n if (version1 === version2) return false;\n\n const version1Segments = version1.split('.').map((segment) => parseInt(segment, 10));\n const version2Segments = version2.split('.').map((segment) => parseInt(segment, 10));\n\n for (let i = 0; i < version1Segments.length; i++) {\n if (version1Segments[i] < version2Segments[i]) return true;\n\n if (version1Segments[i] > version2Segments[i]) return false;\n }\n\n return false;\n};\n","import { sendMessage, MESSAGE_TYPES } from '../../shared';\r\nimport { Logger } from '../../shared/utils/logger';\r\nimport { RateKindMap, WildfireActiveDomain, WildfireMerchantRateDetail } from '../../shared/vendors/wildfire/types';\r\n\r\nexport interface GetActiveDomainResponse {\r\n isActive: boolean;\r\n domain: WildfireActiveDomain | undefined;\r\n rates: WildfireMerchantRateDetail<keyof RateKindMap>[];\r\n}\r\n\r\n/**\r\n * Checks if the current domain is active and retrieves the associated rates.\r\n *\r\n * @param logger\r\n * @returns\r\n */\r\nexport const getActiveDomain = async (\r\n logger: Logger,\r\n): Promise<GetActiveDomainResponse> => {\r\n const { hostname } = window.location;\r\n logger.debug('Checking if domain is active', { hostname });\r\n\r\n const domainResponse = await sendMessage({\r\n type: MESSAGE_TYPES.IS_ACTIVE_DOMAIN,\r\n payload: { hostname },\r\n });\r\n\r\n if (!domainResponse.payload.isActive) return { isActive: false, domain: undefined, rates: [] };\r\n\r\n logger.debug('Active domain', { domain: domainResponse.payload.domain });\r\n logger.debug('Merchant rates', { rates: domainResponse.payload.rates });\r\n\r\n logger.info('Domain and rates processed successfully.');\r\n\r\n return {\r\n isActive: true,\r\n domain: domainResponse.payload.domain,\r\n rates: domainResponse.payload.rates,\r\n };\r\n};\r\n","import { ShopifyShopInfo } from '../../background/strategies/StoreShopifyShopIdStrategy';\r\nimport { sendMessage, MESSAGE_TYPES } from '../../shared';\r\nimport { Logger } from '../../shared/utils/logger';\r\nimport { WildfireActiveDomain } from '../../shared/vendors/wildfire/types';\r\n\r\n/**\r\n * Sends the Shopify shop ID to the background service for storage\r\n * @param shopId The Shopify shop ID to store\r\n * @param domain The domain where the shop ID was found\r\n */\r\nexport function sendShopPayId(shopId: number, domain: WildfireActiveDomain, logger: Logger): void {\r\n if (!shopId || shopId <= 0) return;\r\n\r\n try {\r\n // Prepare shop ID info for sending to background\r\n const shopInfo: ShopifyShopInfo = {\r\n shopId,\r\n domain,\r\n };\r\n\r\n // Send message to background to store the shop ID\r\n sendMessage({\r\n type: MESSAGE_TYPES.STORE_SHOPIFY_SHOP_ID,\r\n payload: shopInfo,\r\n }).catch((error) => {\r\n logger.error('Error sending shop ID to background:', error);\r\n });\n } catch (error) {\r\n logger.error('Error sending Shopify shop ID:', error);\r\n }\r\n}\n","import { POPUP_HIDDEN_STORAGE_KEY } from '../../shared';\r\nimport { Logger } from '../../shared/utils/logger';\r\nimport { storage } from '../../shared/utils/storage';\r\n\r\ninterface StorageEntry {\r\n popupHide: number;\r\n}\r\n\r\nexport const getIsAdUnitMuted = async (logger: Logger) => {\r\n const storageExpiry = await storage.get<StorageEntry>(POPUP_HIDDEN_STORAGE_KEY);\r\n if (!storageExpiry) {\r\n logger.debug('No expiry found in storage');\r\n return false;\r\n }\r\n\r\n const { popupHide: expiry } = storageExpiry;\r\n const isMuted = expiry ? Date.now() < expiry : false;\r\n logger.debug('Is AdUnit Muted?', { isMuted, expiry });\r\n return isMuted;\r\n};\r\n","import { sendMessage, MESSAGE_TYPES } from '../../shared';\r\nimport { Logger } from '../../shared/utils/logger';\r\nimport { WildfireActiveDomain } from '../../shared/vendors/wildfire/types';\r\n\r\nexport const shouldStandDown = async (logger: Logger, wildfireActiveDomain: WildfireActiveDomain): Promise<boolean> => {\r\n const { Domain } = wildfireActiveDomain;\r\n const url = window.location.href;\r\n\r\n const { payload: shouldStandDownResult } = await sendMessage({\r\n type: MESSAGE_TYPES.SHOULD_STAND_DOWN,\r\n payload: {\r\n activeDomain: Domain,\r\n url,\r\n },\r\n });\r\n\r\n if (shouldStandDownResult.result) {\r\n logger.info('Stand Down detected');\r\n return true;\r\n }\r\n return false;\r\n};\n","import { MESSAGE_TYPES, sendMessageWithRetry } from '../../shared';\r\nimport { Logger } from '../../shared/utils/logger';\r\nimport { GiveFreelyCharity } from '../../shared/vendors/givefreely/types';\r\nimport { WildfireActiveDomain } from '../../shared/vendors/wildfire/types';\r\n\r\nexport const activateOffer = async (logger: Logger, activeDomain: WildfireActiveDomain, originalUrl: string, selectedCharity: GiveFreelyCharity, gfCommissionUniqueId: string) => {\r\n logger.debug('Activating offer', { activeDomain, selectedCharity });\r\n\r\n const response = await sendMessageWithRetry({\r\n type: MESSAGE_TYPES.ACTIVATE_OFFER,\r\n payload: {\r\n activeDomain,\r\n originalUrl,\r\n selectedCharity,\r\n gfCommissionUniqueId,\r\n },\r\n });\r\n\r\n logger.debug('Activate offer response', { response });\r\n return response;\r\n};\r\n","import { MESSAGE_TYPES, sendMessageWithRetry } from '../../shared';\r\nimport { Analytics } from '../../shared/analytics';\r\nimport { PopupEvent } from '../../shared/analytics/types';\r\nimport { Logger } from '../../shared/utils/logger';\r\n\r\nexport const hideAd = async (logger: Logger, days?: number) => {\r\n try {\r\n logger.info('Hiding ad', { days });\r\n\r\n const hideResponse = await sendMessageWithRetry({\r\n type: MESSAGE_TYPES.HIDE_POPUP,\r\n payload: { days: days ?? 0 },\r\n });\r\n\r\n if (days !== undefined) {\r\n void Analytics.trackEvent(PopupEvent.checkoutPopupSupressed,\r\n {\r\n url: globalThis.window.location.href,\r\n days,\r\n });\r\n }\r\n\r\n logger.info('Hiding ad response', { hideResponse });\r\n if (hideResponse.payload.ack) {\r\n logger.debug('Ad hidden successfully');\r\n return false;\r\n }\r\n\r\n logger.warn('Failed to hide ad');\r\n return true;\r\n } catch {\r\n return false; // whatever happens we always endup closing the popup\r\n }\r\n};\n","import { Logger } from '../../shared/utils/logger';\nimport { SelectedCharity, Translation } from '../../shared/i18n/types';\nimport { MESSAGE_TYPES, sendMessage } from '../../shared';\n\n/**\n * Fetches translations and charity data for the specified language\n * @param languageCode The language code to get content for\n * @param logger Optional logger instance\n * @returns Object containing translations and charities data\n */\nexport async function getLanguageContent(\n languageCode: string,\n logger?: Logger,\n): Promise<{\n translations: Translation | null;\n charities: SelectedCharity | null;\n}> {\n try {\n if (logger) {\n logger.debug('Getting language content', { languageCode });\n }\n\n const response = await sendMessage({\n type: MESSAGE_TYPES.GET_LANGUAGE_CONTENT,\n payload: {\n lang: languageCode,\n },\n });\n\n return {\n translations: response.payload.translations,\n charities: response.payload.charities,\n };\n } catch (error) {\n if (logger) {\n logger.error('Error getting language content', { error, languageCode });\n }\n\n return {\n translations: null,\n charities: null,\n };\n }\n}\n","/// <reference lib=\"dom\" />\n/// <reference lib=\"dom.iterable\" />\n\n/** @jsxImportSource solid-js */\nimport { render } from 'solid-js/web';\nimport { GfAdUnit } from './GfAdUnit';\nimport { getPopupConfig } from './services/getPopupConfig';\nimport { Logger } from '../shared/utils/logger';\nimport { browser } from '../shared';\nimport { logAffilliatedMerchantsSearchResults } from './services/logAffilliatedmerchantsSearchResults';\n\nconst baseStyles = (backdropColor: string | undefined) => `\n :host {\n all: initial;\n }\n\n .gf-scroll-remove::-webkit-scrollbar {\n border-radius-bottom-right: 15px;\n }\n\n button {\n cursor: pointer;\n transition: transform 0.1s ease;\n }\n\n button:active {\n transform: scale(0.98);\n }\n\n .give-freely-close-button:hover {\n opacity: 0.7;\n }\n\n input[type=\"radio\"] {\n margin-right: 8px;\n }\n\n hr {\n border: none;\n border-top: 1px solid #e5e5e5;\n margin: 1em 0;\n }\n\n dialog::backdrop {\n background-color: ${backdropColor || 'revert'};\n }\n\n dialog.backdrop-hidden::backdrop {\n background-color: transparent;\n }\n`;\n\n/**\n * Initializes the GiveFreely AdUnit UI by creating a\n * shadow DOM and rendering the main app component.\n * @returns The store instance\n */\nexport async function initializeAdUnit() {\n const containerId = `give-freely-root-${browser.runtime.id}`;\n\n // Check if the container already exists\n if (document.getElementById(containerId)) return;\n\n // Create container and shadow DOM\n const container = document.createElement('div');\n\n // Make sure the container has a unique id\n container.id = containerId;\n\n container.className = 'give-freely-root';\n container.style.display = 'block';\n container.dataset.extensionId = browser.runtime.id;\n container.dataset.extensionName = browser.runtime.getManifest().name || browser.runtime.id;\n\n document.body.appendChild(container);\n\n const shadow = container.attachShadow({ mode: 'open' });\n const innerContainer = document.createElement('div');\n\n const logger = Logger.getInstance();\n const popupConfig = await getPopupConfig();\n if (!popupConfig) {\n logger.error('No ad unit config found');\n return;\n }\n\n logger.configure({\n enabled: popupConfig.checkoutPopupLoggerEnabled ?? true,\n title: 'Content - GfAdUnit',\n minLevel: popupConfig.checkoutPopupMinLogLevel ?? 'error',\n });\n\n const contentStyle = baseStyles(popupConfig.containerStyle?.backdropColor);\n\n // Add base styles\n const style = document.createElement('style');\n style.textContent = contentStyle;\n\n shadow.appendChild(style);\n shadow.appendChild(innerContainer);\n\n if (popupConfig.countAppearances) void logAffilliatedMerchantsSearchResults(logger);\n\n // Render the Solid component\n render(() => <GfAdUnit popupConfig={popupConfig} logger={logger} />, innerContainer);\n}\n\n// Export everything that should be available in the UMD build\nexport {\n browser,\n};\n","import { sendMessage, MESSAGE_TYPES } from '../../shared';\r\n\r\nexport const getPopupConfig = async () => {\r\n const configResponse = await sendMessage({\r\n type: MESSAGE_TYPES.GET_POPUP_CONFIG,\r\n payload: {},\r\n });\r\n if (!configResponse.payload.config) {\r\n throw new Error('No checkout popup config found');\r\n }\r\n\r\n return configResponse.payload.config;\r\n};\n","import { MESSAGE_TYPES, sendMessage } from '../../shared';\nimport { Logger } from '../../shared/utils/logger';\nimport { extractGoogleResultUrls, isGoogleSearchResultUrl } from '../../shared/utils/serp';\n\n/**\n * Identifies the search results and sends a background message for logging those belonging to affiliated merchants\n * @returns Promise that resolves to true if the process was successful\n */\nexport async function logAffilliatedMerchantsSearchResults(logger: Logger): Promise<boolean> {\n try {\n const currentUrl = globalThis.window.location.href;\n const isGoogleSearchResult = isGoogleSearchResultUrl(currentUrl);\n logger.debug('Is a Google search result page?', isGoogleSearchResult);\n if (!isGoogleSearchResult) return false;\n\n // Extract search urls\n const searchResults = extractGoogleResultUrls();\n logger.info('The following search results were identified', searchResults);\n\n if (!searchResults || searchResults.length === 0) return false;\n\n // Send message to background service\n const response = await sendMessage<typeof MESSAGE_TYPES.LOG_MERCHANTS_IN_SEARCH_RESULTS>({\n type: MESSAGE_TYPES.LOG_MERCHANTS_IN_SEARCH_RESULTS,\n payload: {\n currentUrl,\n searchResults,\n source: 'google',\n },\n });\n\n return response?.payload?.result ?? false;\n } catch (ex) {\n logger.error('Error while identifying search results', ex);\n return false;\n }\n}\n","export const isGoogleSearchResultUrl = (url: string): boolean => {\n const googleSearchRegex = /^https?:\\/\\/(?:www\\.)?google\\.[a-z]{2,}(\\.[a-z]{2})?\\/search\\?(?:.*&)?q=[^&]+(?:&.*)?$/;\n return googleSearchRegex.test(url);\n};\n\nconst isResultSponsored = (container: HTMLElement): boolean => {\n // Marker A: A common, dedicated HTML attribute for ad blocks.\n const hasAdAttribute = container.querySelector('[data-text-ad=\"1\"]') !== null;\n\n // Marker B: The presence of visible \"Sponsored\" or \"Ad\" text.\n // We look for a common text container and check its content.\n const hasAdTextContainer = container.querySelector('span:not(.a-no-hover-link):is(:where(*, [role=\"text\"]))');\n\n const hasAdText = hasAdTextContainer\n && (hasAdTextContainer.textContent?.includes('Sponsored')\n || hasAdTextContainer.textContent?.includes('Ad'));\n\n // A result is sponsored if it satisfies either detection marker.\n return hasAdAttribute || (hasAdText ?? false);\n};\n\n/**\n * Identifies all result links on the current Google Search page and flags them\n * as organic or sponsored.\n */\nexport const extractGoogleResultUrls = (): {\n url: string;\n isSponsored: boolean;\n}[] => {\n // Selector for all major blocks on the search results page (organic and sponsored).\n // #rso is a common ID for the main results container.\n const allResultContainers = globalThis.window.document.querySelectorAll<HTMLElement>('#rso > div, #tads > div');\n\n const results: {\n url: string;\n isSponsored: boolean;\n }[] = [];\n\n // Common selectors Google uses for the main clickable link within a result block\n const linkSelectors = '.yuRUbf a, .MjjYud a, a[jsname=\"UWckNb\"], a[data-pcu]';\n\n allResultContainers.forEach((container) => {\n // 1. Sponsored Check\n const isSponsored = isResultSponsored(container);\n const mainLink = container.querySelector<HTMLAnchorElement>(linkSelectors);\n\n if (mainLink) {\n let url = mainLink.href;\n\n // 3. Clean up Google's Redirect URL\n // If the link is a Google redirect (e.g., /url?q=...), extract the clean URL from the 'q' parameter.\n if (url && url.includes('/url?q=')) {\n try {\n const urlParams = new URLSearchParams(new URL(url).search);\n const rawUrl = urlParams.get('q');\n if (rawUrl) {\n url = rawUrl;\n }\n } catch { /* empty */ }\n }\n\n // 4. Final Validation and Push\n // Ensure we only push valid, external URLs.\n if (url && url.startsWith('http')) {\n results.push({\n url,\n isSponsored: isSponsored ?? false,\n });\n }\n }\n });\n\n return results;\n};\n"],"names":["signalOptions","equals","equalFn","a","b","runEffects","runQueue","STALE","PENDING","UNOWNED","owned","cleanups","context","owner","Owner","Transition","Listener","Updates","Effects","ExecCount","createSignal","value","options","s","observers","observerSlots","comparator","Object","assign","undefined","readSignal","bind","writeSignal","createRenderEffect","fn","updateComputation","createComputation","createEffect","runUserEffects","c","user","push","createMemo","untrack","listener","onMount","onCleanup","useContext","id","defaultValue","children","memo","resolveChildren","toArray","Array","isArray","this","sources","updates","runUpdates","lookUpstream","sSlot","length","sourceSlots","node","isComp","current","i","o","TransitionRunning","running","disposed","has","tState","state","pure","markDownstream","Error","cleanNode","time","nextValue","err","forEach","updatedAt","handleError","runComputation","init","runTop","suspense","inFallback","effects","ancestors","wait","res","e","completeUpdates","queue","userLength","ignore","source","pop","index","obs","n","tOwned","error","cause","castError","results","result","apply","createProvider","props","createComponent","Comp","Show","keyed","condition","when","child","fallback","$$EVENTS","template","html","isImportNode","isSVG","create","t","document","createElement","innerHTML","content","firstChild","cloneNode","delegateEvents","eventNames","window","Set","l","name","add","addEventListener","eventHandler","setAttribute","removeAttribute","style","prev","nodeStyle","cssText","v","removeProperty","setProperty","use","element","arg","insert","parent","accessor","marker","initial","insertExpression","target","key","type","oriTarget","oriCurrentTarget","currentTarget","retarget","defineProperty","configurable","handleNode","handler","disabled","data","call","cancelBubble","host","_$host","contains","walkUpTree","parentNode","get","composedPath","path","unwrapArray","multi","toString","nodeType","createTextNode","cleanChildren","textContent","array","currentArray","normalizeIncomingArray","appendNodes","bLength","aEnd","bEnd","aStart","bStart","after","nextSibling","map","insertBefore","remove","Map","set","sequence","replaceChild","reconcileArrays","appendChild","normalized","unwrap","dynamic","len","item","String","replacement","inserted","el","isParent","CheckoutPopupStyles","top","left","margin","width","padding","border","color","display","height","position","flex","background","cursor","gap","transition","calculateMaxRate","kind","amountStr","num","parseFloat","formatOffer","Math","floor","OfferTitle","_el$","_tmpl$","_$effect","title","activeDomain","replace","Merchant","MaxRate","Kind","Amount","formatTitle","ContentContext","Symbol","Provider","translate","_","getAllCharities","createContext","TranslationContext","useT","contentProvider","getContentAccessor","StringUtils","formatMessage","args","Number","OfferDetails","_tmpl$2","_el$3","_el$2","_el$4","_el$5","_el$6","_el$7","_el$8","_el$10","_el$11","_el$12","_el$13","_el$15","_el$16","_$insert","_$createComponent","merchantRateDetail","_el$9","detail","_el$17","_tmpl$3","_el$18","_el$19","Name","parseRate","commissionRate","displaySplit","maximumFractionDigits","boostedOffer","BoostedOffer","amount","EndDate","Date","OriginalMaxRate","isNaN","splitAmount","toLocaleString","minimumFractionDigits","currency","Currency","_p$","_v$11","styles","_v$12","_v$13","_$style","_v$","_v$2","_v$3","_v$4","_v$5","parsedMaxRate","_v$6","_v$7","_v$8","_v$9","termsUrl","_v$10","h","r","_$setAttribute","d","globalThis","chrome","runtime","browser","module","exports","CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE","wrapAPIs","extensionAPIs","apiMetadata","alarms","clear","minArgs","maxArgs","clearAll","getAll","bookmarks","getChildren","getRecent","getSubTree","getTree","move","removeTree","search","update","browserAction","disable","fallbackToNoCallback","enable","getBadgeBackgroundColor","getBadgeText","getPopup","getTitle","openPopup","setBadgeBackgroundColor","setBadgeText","setIcon","setPopup","setTitle","browsingData","removeCache","removeCookies","removeDownloads","removeFormData","removeHistory","removeLocalStorage","removePasswords","removePluginData","settings","commands","contextMenus","removeAll","cookies","getAllCookieStores","devtools","inspectedWindow","eval","singleCallbackArg","panels","elements","createSidebarPane","downloads","cancel","download","erase","getFileIcon","open","pause","removeFile","resume","show","extension","isAllowedFileSchemeAccess","isAllowedIncognitoAccess","history","addUrl","deleteAll","deleteRange","deleteUrl","getVisits","i18n","detectLanguage","getAcceptLanguages","identity","launchWebAuthFlow","idle","queryState","management","getSelf","setEnabled","uninstallSelf","notifications","getPermissionLevel","pageAction","hide","permissions","request","getBackgroundPage","getPlatformInfo","openOptionsPage","requestUpdateCheck","sendMessage","sendNativeMessage","setUninstallURL","sessions","getDevices","getRecentlyClosed","restore","storage","local","getBytesInUse","managed","sync","tabs","captureVisibleTab","discard","duplicate","executeScript","getCurrent","getZoom","getZoomSettings","goBack","goForward","highlight","insertCSS","query","reload","removeCSS","setZoom","setZoomSettings","topSites","webNavigation","getAllFrames","getFrame","webRequest","handlerBehaviorChanged","windows","getLastFocused","keys","DefaultWeakMap","WeakMap","constructor","createItem","items","super","makeCallback","promise","metadata","callbackArgs","lastError","reject","message","resolve","pluralizeArguments","numArgs","wrapMethod","method","wrapper","Proxy","targetMethod","thisObj","hasOwnProperty","Function","prototype","wrapObject","wrappers","cache","handlers","proxyTarget","prop","receiver","wrapAsyncFunction","Promise","cbError","console","warn","noCallback","enumerable","desc","Reflect","deleteProperty","wrapEvent","wrapperMap","addListener","hasListener","removeListener","onRequestFinishedWrappers","req","wrappedReq","getContent","onMessageWrappers","sender","sendResponse","wrappedSendResponse","didCallSendResponse","sendResponsePromise","response","isResultThenable","then","msg","__mozWebExtensionPolyfillReject__","catch","wrappedSendMessageCallback","reply","wrappedSendMessage","apiNamespaceObj","wrappedCb","staticWrappers","network","onRequestFinished","onMessage","onMessageExternal","settingMetadata","privacy","services","websites","PopupEvent","LoggingEvent","ConsoleTransport","isLocal","log","level","timestamp","consoleMethod","titlePrefix","LOGGER_PREFIX","LOG_LEVELS","Logger","config","minLevel","enabled","transports","getInstance","instance","configure","shouldLog","indexOf","createLogMessage","version","LIB_VERSION","toISOString","onlyLocal","logMessage","filter","transport","debug","info","critical","fatal","addTransport","clearTransports","MAX_RETRY_ATTEMPTS","defaultDelay","attempt","api","async","sendMessageWithRetry","retryOptions","operation","maxAttempts","delayFn","setTimeout","logger","operationName","retryOperation","MESSAGE_TYPES","COUNTRY_CODE_STORAGE_KEY","GF_AD_EVENT_HISTORY_STORAGE_KEY","UNKNOWN_CHARITY","ein","tpi","storagePrefix","prefixedKey","prefixedKeys","getCurrentVersion","Analytics","partnerApiKey","userService","configService","debounceWindowInMinutes","track","eventType","wfDeviceId","payload","anonymous","skipThrottling","event","partner","_partnerApiKey","eventData","userId","_userService","libVersion","serializedEvent","JSON","stringify","_key","stack","eventsUrl","getEventsUrl","BroadcastEvent","_logger","getEventsHistory","lastHourDate","m","now","setTime","getTime","addMinutes","_debounceWindowInMinutes","typedHistory","x","createdAt","shouldBroadcastEvent","some","entry","pushEventToHistory","_configService","fetch","headers","body","ok","status","statusText","getCachedConfig","mergeIf","right","trackEvent","getPopupBehavior","hasBackdrop","containerStyle","backdropColor","showAsModal","clickAction","MainScreen","detailsDisplayed","setDetailsDisplayed","selectedCharity","setSelectedCharity","handleDialogClick","checkoutPopupConf","stopPropagation","handleWindowClick","selectCharity","setBackdropHidden","mainContainerRef","removeEventListener","getCharities","useCharities","dialogRef","scroll","offsetHeight","behavior","charitySelection","onCharitySelect","charity","closeOnDonation","checkoutPopupActivateAndCloseSkipSuccess","isCharitySelected","_el$14","checkoutPopupActivateAndClose","$$click","checkoutPopupMainCloseButtonVisible","onClose","_$p","reduce","_c$2","_el$20","_el$21","_el$22","_el$23","_tmpl$4","_$memo","decorator","decoratorLeftStyle","decoratorRightStyle","_el$24","_tmpl$5","_v$29","_v$30","_el$25","_v$31","_v$32","_v$20","_v$21","logo","_v$22","_v$23","_v$24","_v$25","checkoutPopupSelectCharityButtonBgColor","_v$26","_v$27","_v$28","onSuppress","onOfferDetailsClick","handleWhyAmISeeingThisClick","checkoutPopupWhyAmISeeingThisClicked","domain","location","hostname","_c$","checkoutPopupDisplayNameInFooter","_el$26","_tmpl$6","_el$27","_v$33","_v$34","_v$14","_v$15","_v$16","_v$17","_v$18","externalUrls","giveFreelyWhyAmISeeingThis","_v$19","u","w","f","y","merchantName","extensionName","displayName","giveFreelyTermsAndConditions","merchantRates","_$delegateEvents","GoodbyeScreen","days","setDays","checkoutPopupSupressCloseButtonVisible","onGoodbye","onBack","checkoutPopupNeverSuppressionAllowed","radio","setScreen","DonateScreen","closingSecondsLeft","setClosingSecondsLeft","closingIntervalId","clearInterval","failedDonation","startClosingCountdown","checkoutPopupDonationSuccessAutoCloseInSeconds","setInterval","CheckoutPopup","screen","setFailedDonation","backdropHidden","showModal","showPopover","focus","blur","closeAdClick","charityClick","skipSuccess","Domain","success","onDonate","suppressClick","back","handleGoodbye","containerRef","_$use","customStyle","elementId","className","cartOrCheckoutRule","url","combines","final","flatMap","keyword","combine","exclusions","absoluteMatches","includes","segments","split","ex","segment","startsWith","endsWith","toLowerCase","bookingRule","documentRef","keywords","evaluate","XPathResult","ANY_TYPE","iterateNext","retrieveShopDomain","shopId","found","getShopIdFromWindow","scripts","from","querySelectorAll","script","dataset","src","parsedId","parseInt","match","shopifyElement","querySelector","HTMLElement","possibleShopId","ShopifyAnalytics","lib","trekkie","defaultAttributes","getShopIdFromStoreMetaTag","href","meta","head","parse","merchantRegexRule","currentUrl","matchingMerchants","merchantPopupRules","merchant","ruleObj","rules","RegExp","rule","test","regexError","detectPageLanguage","customLanguageDetection","pageText","urlPattern","language","entries","htmlLang","documentElement","lang","metaLanguage","hrefLang","getAttribute","browserLanguage","navigator","detectedLanguage","languageMatchRule","checkoutPopupOnlyShowLanguageMatch","getAdUnitInstalledExtensions","roots","skipCurrentExtension","root","extensionId","join","TranslationProvider","charities","GfAdUnit","setActiveDomain","showPopup","setShowPopup","setMerchantRates","translationProvider","setTranslationProvider","selectedCharities","setSelectedCharities","checkoutRulesWatcherInterval","shouldCheckSiteMatches","matchingRegex","siteMatchesRegex","regex","checkoutPopupSiteMatches","matchedRule","uts","checkSiteMatches","popupConfig","languageCode","getTranslationProvider","currentVersion","minVersion","compareVersion","version1","version2","version1Segments","version2Segments","currentCountry","requestOptions","Authorization","json","country","iso_code","detectUsersCountry","getCountryCode","checkoutPopupMasterSwitch","gfContainerRoots","getElementsByClassName","looserExtension","rates","domainResponse","isActive","getActiveDomain","sendShopPayId","shopPayIdentify","pathname","shopDomain","isMutedFromStorage","storageExpiry","popupHide","expiry","isMuted","getIsAdUnitMuted","isStandDown","wildfireActiveDomain","shouldStandDownResult","shouldStandDown","anonymousActiveDomainLoggingConfig","anonymousActiveDomainLogging","currentActiveDomain","website","sessionStorage","getItem","setItem","hasVisitedWebsiteAlready","checkoutPopupActiveDomain","shouldShowResult","locationUrl","URL","shopPayResult","shopPayRule","shouldShow","matchesCartRule","matchesBookingRule","matchesShopPayRule","matchesMerchantRegexRule","matchesLanguageRule","checkoutRulesTest","checkoutPopupLooserExtension","winner","matchMedia","matches","checkoutPopupHiddenProgrammatically","merchantId","ID","reason","checkoutPopupNotShownPerViewportSize","pageLanguage","viewPortSize","innerHeight","innerWidth","checkoutPopupShown","domainId","looserCompetingExtensions","handleDonate","gfCommissionUniqueId","crypto","randomUUID","activationResponse","originalUrl","activateOffer","thirdPartyId","checkoutPopupDonation","checkoutPopupFailedActivation","rate","handleHideAd","hideResponse","checkoutPopupSupressed","ack","hideAd","handleTrackOfferDetailsDisplay","checkoutPopupOfferDetailsClicked","action","toggleState","currentLanguage","translations","getLanguageContent","charitiesList","order","charityMetadata","translateAccessor","getCharitiesAccessor","containerId","getElementById","container","getManifest","shadow","attachShadow","mode","innerContainer","configResponse","getPopupConfig","checkoutPopupLoggerEnabled","checkoutPopupMinLogLevel","contentStyle","countAppearances","isGoogleSearchResult","searchResults","extractGoogleResultUrls","allResultContainers","isSponsored","hasAdAttribute","hasAdTextContainer","hasAdText","isResultSponsored","mainLink","rawUrl","URLSearchParams","logAffilliatedMerchantsSearchResults","code","disposer","detachedOwner","unowned","updateFn","createRoot","dispose","render"],"mappings":"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","x_google_ignoreList":[0,1,11]}
1
+ {"version":3,"file":"GiveFreely-content.cjs.js","sources":["../../node_modules/.pnpm/solid-js@1.9.4/node_modules/solid-js/dist/solid.js","../../node_modules/.pnpm/solid-js@1.9.4/node_modules/solid-js/web/dist/web.js","../../src/content/CheckoutPopup/CheckoutPopup.styles.ts","../../src/content/lib/calculateMaxRate.ts","../../src/shared/vendors/wildfire/formatOffer.ts","../../src/content/CheckoutPopup/components/OfferTitle.tsx","../../src/content/lib/utils/parseRate.ts","../../src/content/context/translation/translationContext.ts","../../src/content/lib/hooks/useT.ts","../../src/shared/utils/string-utils.ts","../../src/content/CheckoutPopup/components/OfferDetails.tsx","../../node_modules/.pnpm/webextension-polyfill@0.12.0/node_modules/webextension-polyfill/dist/browser-polyfill.js","../../src/shared/analytics/types.ts","../../src/shared/utils/logger/transports/console.transport.ts","../../src/shared/utils/logger/logger.ts","../../src/shared/utils/retry.ts","../../src/shared/browser.ts","../../src/shared/constants.ts","../../src/shared/utils/storage.ts","../../src/shared/utils/current-version.ts","../../src/shared/analytics/index.ts","../../src/shared/utils/add-time.ts","../../src/shared/utils.ts","../../src/content/CheckoutPopup/components/MainScreen.tsx","../../src/content/lib/hooks/useCharities.ts","../../src/content/CheckoutPopup/components/GoodbyeScreen.tsx","../../src/content/CheckoutPopup/components/DonateScreen.tsx","../../src/content/CheckoutPopup/CheckoutPopup.tsx","../../src/content/lib/visibility/rules/cartOrCheckoutUrlRule.ts","../../src/content/lib/visibility/rules/bookingRule.ts","../../src/content/services/retrieveShopPayDomain.ts","../../src/content/lib/visibility/rules/shopPayRule.ts","../../src/content/lib/visibility/rules/merchantRegexRule.ts","../../src/content/language/index.ts","../../src/content/lib/visibility/rules/languageMatchRule.ts","../../src/content/lib/visibility/checkoutRulesTest.ts","../../src/content/lib/utils/getAdUnitInstalledExtensions.ts","../../src/content/context/translation/TranslationProvider.tsx","../../src/shared/services/geolocation.ts","../../src/content/GfAdUnit.tsx","../../src/content/services/checkSiteMatches.ts","../../src/background/utils/regexMatch.ts","../../src/shared/utils/compare-version.ts","../../src/content/services/getActiveDomain.ts","../../src/content/services/sendShopPayId.ts","../../src/content/services/getIsAdUnitMuted.ts","../../src/content/services/shouldStandDown.ts","../../src/content/services/activateOffer.ts","../../src/content/services/hideAd.ts","../../src/content/services/getLanguageContent.ts","../../src/content/index.tsx","../../src/content/services/getPopupConfig.ts","../../src/content/services/logAffilliatedmerchantsSearchResults.ts","../../src/shared/utils/serp.ts"],"sourcesContent":["let taskIdCounter = 1,\n isCallbackScheduled = false,\n isPerformingWork = false,\n taskQueue = [],\n currentTask = null,\n shouldYieldToHost = null,\n yieldInterval = 5,\n deadline = 0,\n maxYieldInterval = 300,\n scheduleCallback = null,\n scheduledCallback = null;\nconst maxSigned31BitInt = 1073741823;\nfunction setupScheduler() {\n const channel = new MessageChannel(),\n port = channel.port2;\n scheduleCallback = () => port.postMessage(null);\n channel.port1.onmessage = () => {\n if (scheduledCallback !== null) {\n const currentTime = performance.now();\n deadline = currentTime + yieldInterval;\n const hasTimeRemaining = true;\n try {\n const hasMoreWork = scheduledCallback(hasTimeRemaining, currentTime);\n if (!hasMoreWork) {\n scheduledCallback = null;\n } else port.postMessage(null);\n } catch (error) {\n port.postMessage(null);\n throw error;\n }\n }\n };\n if (navigator && navigator.scheduling && navigator.scheduling.isInputPending) {\n const scheduling = navigator.scheduling;\n shouldYieldToHost = () => {\n const currentTime = performance.now();\n if (currentTime >= deadline) {\n if (scheduling.isInputPending()) {\n return true;\n }\n return currentTime >= maxYieldInterval;\n } else {\n return false;\n }\n };\n } else {\n shouldYieldToHost = () => performance.now() >= deadline;\n }\n}\nfunction enqueue(taskQueue, task) {\n function findIndex() {\n let m = 0;\n let n = taskQueue.length - 1;\n while (m <= n) {\n const k = (n + m) >> 1;\n const cmp = task.expirationTime - taskQueue[k].expirationTime;\n if (cmp > 0) m = k + 1;\n else if (cmp < 0) n = k - 1;\n else return k;\n }\n return m;\n }\n taskQueue.splice(findIndex(), 0, task);\n}\nfunction requestCallback(fn, options) {\n if (!scheduleCallback) setupScheduler();\n let startTime = performance.now(),\n timeout = maxSigned31BitInt;\n if (options && options.timeout) timeout = options.timeout;\n const newTask = {\n id: taskIdCounter++,\n fn,\n startTime,\n expirationTime: startTime + timeout\n };\n enqueue(taskQueue, newTask);\n if (!isCallbackScheduled && !isPerformingWork) {\n isCallbackScheduled = true;\n scheduledCallback = flushWork;\n scheduleCallback();\n }\n return newTask;\n}\nfunction cancelCallback(task) {\n task.fn = null;\n}\nfunction flushWork(hasTimeRemaining, initialTime) {\n isCallbackScheduled = false;\n isPerformingWork = true;\n try {\n return workLoop(hasTimeRemaining, initialTime);\n } finally {\n currentTask = null;\n isPerformingWork = false;\n }\n}\nfunction workLoop(hasTimeRemaining, initialTime) {\n let currentTime = initialTime;\n currentTask = taskQueue[0] || null;\n while (currentTask !== null) {\n if (currentTask.expirationTime > currentTime && (!hasTimeRemaining || shouldYieldToHost())) {\n break;\n }\n const callback = currentTask.fn;\n if (callback !== null) {\n currentTask.fn = null;\n const didUserCallbackTimeout = currentTask.expirationTime <= currentTime;\n callback(didUserCallbackTimeout);\n currentTime = performance.now();\n if (currentTask === taskQueue[0]) {\n taskQueue.shift();\n }\n } else taskQueue.shift();\n currentTask = taskQueue[0] || null;\n }\n return currentTask !== null;\n}\n\nconst sharedConfig = {\n context: undefined,\n registry: undefined,\n effects: undefined,\n done: false,\n getContextId() {\n return getContextId(this.context.count);\n },\n getNextContextId() {\n return getContextId(this.context.count++);\n }\n};\nfunction getContextId(count) {\n const num = String(count),\n len = num.length - 1;\n return sharedConfig.context.id + (len ? String.fromCharCode(96 + len) : \"\") + num;\n}\nfunction setHydrateContext(context) {\n sharedConfig.context = context;\n}\nfunction nextHydrateContext() {\n return {\n ...sharedConfig.context,\n id: sharedConfig.getNextContextId(),\n count: 0\n };\n}\n\nconst equalFn = (a, b) => a === b;\nconst $PROXY = Symbol(\"solid-proxy\");\nconst SUPPORTS_PROXY = typeof Proxy === \"function\";\nconst $TRACK = Symbol(\"solid-track\");\nconst $DEVCOMP = Symbol(\"solid-dev-component\");\nconst signalOptions = {\n equals: equalFn\n};\nlet ERROR = null;\nlet runEffects = runQueue;\nconst STALE = 1;\nconst PENDING = 2;\nconst UNOWNED = {\n owned: null,\n cleanups: null,\n context: null,\n owner: null\n};\nconst NO_INIT = {};\nvar Owner = null;\nlet Transition = null;\nlet Scheduler = null;\nlet ExternalSourceConfig = null;\nlet Listener = null;\nlet Updates = null;\nlet Effects = null;\nlet ExecCount = 0;\nfunction createRoot(fn, detachedOwner) {\n const listener = Listener,\n owner = Owner,\n unowned = fn.length === 0,\n current = detachedOwner === undefined ? owner : detachedOwner,\n root = unowned\n ? UNOWNED\n : {\n owned: null,\n cleanups: null,\n context: current ? current.context : null,\n owner: current\n },\n updateFn = unowned ? fn : () => fn(() => untrack(() => cleanNode(root)));\n Owner = root;\n Listener = null;\n try {\n return runUpdates(updateFn, true);\n } finally {\n Listener = listener;\n Owner = owner;\n }\n}\nfunction createSignal(value, options) {\n options = options ? Object.assign({}, signalOptions, options) : signalOptions;\n const s = {\n value,\n observers: null,\n observerSlots: null,\n comparator: options.equals || undefined\n };\n const setter = value => {\n if (typeof value === \"function\") {\n if (Transition && Transition.running && Transition.sources.has(s)) value = value(s.tValue);\n else value = value(s.value);\n }\n return writeSignal(s, value);\n };\n return [readSignal.bind(s), setter];\n}\nfunction createComputed(fn, value, options) {\n const c = createComputation(fn, value, true, STALE);\n if (Scheduler && Transition && Transition.running) Updates.push(c);\n else updateComputation(c);\n}\nfunction createRenderEffect(fn, value, options) {\n const c = createComputation(fn, value, false, STALE);\n if (Scheduler && Transition && Transition.running) Updates.push(c);\n else updateComputation(c);\n}\nfunction createEffect(fn, value, options) {\n runEffects = runUserEffects;\n const c = createComputation(fn, value, false, STALE),\n s = SuspenseContext && useContext(SuspenseContext);\n if (s) c.suspense = s;\n if (!options || !options.render) c.user = true;\n Effects ? Effects.push(c) : updateComputation(c);\n}\nfunction createReaction(onInvalidate, options) {\n let fn;\n const c = createComputation(\n () => {\n fn ? fn() : untrack(onInvalidate);\n fn = undefined;\n },\n undefined,\n false,\n 0\n ),\n s = SuspenseContext && useContext(SuspenseContext);\n if (s) c.suspense = s;\n c.user = true;\n return tracking => {\n fn = tracking;\n updateComputation(c);\n };\n}\nfunction createMemo(fn, value, options) {\n options = options ? Object.assign({}, signalOptions, options) : signalOptions;\n const c = createComputation(fn, value, true, 0);\n c.observers = null;\n c.observerSlots = null;\n c.comparator = options.equals || undefined;\n if (Scheduler && Transition && Transition.running) {\n c.tState = STALE;\n Updates.push(c);\n } else updateComputation(c);\n return readSignal.bind(c);\n}\nfunction isPromise(v) {\n return v && typeof v === \"object\" && \"then\" in v;\n}\nfunction createResource(pSource, pFetcher, pOptions) {\n let source;\n let fetcher;\n let options;\n if (typeof pFetcher === \"function\") {\n source = pSource;\n fetcher = pFetcher;\n options = pOptions || {};\n } else {\n source = true;\n fetcher = pSource;\n options = pFetcher || {};\n }\n let pr = null,\n initP = NO_INIT,\n id = null,\n loadedUnderTransition = false,\n scheduled = false,\n resolved = \"initialValue\" in options,\n dynamic = typeof source === \"function\" && createMemo(source);\n const contexts = new Set(),\n [value, setValue] = (options.storage || createSignal)(options.initialValue),\n [error, setError] = createSignal(undefined),\n [track, trigger] = createSignal(undefined, {\n equals: false\n }),\n [state, setState] = createSignal(resolved ? \"ready\" : \"unresolved\");\n if (sharedConfig.context) {\n id = sharedConfig.getNextContextId();\n if (options.ssrLoadFrom === \"initial\") initP = options.initialValue;\n else if (sharedConfig.load && sharedConfig.has(id)) initP = sharedConfig.load(id);\n }\n function loadEnd(p, v, error, key) {\n if (pr === p) {\n pr = null;\n key !== undefined && (resolved = true);\n if ((p === initP || v === initP) && options.onHydrated)\n queueMicrotask(() =>\n options.onHydrated(key, {\n value: v\n })\n );\n initP = NO_INIT;\n if (Transition && p && loadedUnderTransition) {\n Transition.promises.delete(p);\n loadedUnderTransition = false;\n runUpdates(() => {\n Transition.running = true;\n completeLoad(v, error);\n }, false);\n } else completeLoad(v, error);\n }\n return v;\n }\n function completeLoad(v, err) {\n runUpdates(() => {\n if (err === undefined) setValue(() => v);\n setState(err !== undefined ? \"errored\" : resolved ? \"ready\" : \"unresolved\");\n setError(err);\n for (const c of contexts.keys()) c.decrement();\n contexts.clear();\n }, false);\n }\n function read() {\n const c = SuspenseContext && useContext(SuspenseContext),\n v = value(),\n err = error();\n if (err !== undefined && !pr) throw err;\n if (Listener && !Listener.user && c) {\n createComputed(() => {\n track();\n if (pr) {\n if (c.resolved && Transition && loadedUnderTransition) Transition.promises.add(pr);\n else if (!contexts.has(c)) {\n c.increment();\n contexts.add(c);\n }\n }\n });\n }\n return v;\n }\n function load(refetching = true) {\n if (refetching !== false && scheduled) return;\n scheduled = false;\n const lookup = dynamic ? dynamic() : source;\n loadedUnderTransition = Transition && Transition.running;\n if (lookup == null || lookup === false) {\n loadEnd(pr, untrack(value));\n return;\n }\n if (Transition && pr) Transition.promises.delete(pr);\n const p =\n initP !== NO_INIT\n ? initP\n : untrack(() =>\n fetcher(lookup, {\n value: value(),\n refetching\n })\n );\n if (!isPromise(p)) {\n loadEnd(pr, p, undefined, lookup);\n return p;\n }\n pr = p;\n if (\"value\" in p) {\n if (p.status === \"success\") loadEnd(pr, p.value, undefined, lookup);\n else loadEnd(pr, undefined, castError(p.value), lookup);\n return p;\n }\n scheduled = true;\n queueMicrotask(() => (scheduled = false));\n runUpdates(() => {\n setState(resolved ? \"refreshing\" : \"pending\");\n trigger();\n }, false);\n return p.then(\n v => loadEnd(p, v, undefined, lookup),\n e => loadEnd(p, undefined, castError(e), lookup)\n );\n }\n Object.defineProperties(read, {\n state: {\n get: () => state()\n },\n error: {\n get: () => error()\n },\n loading: {\n get() {\n const s = state();\n return s === \"pending\" || s === \"refreshing\";\n }\n },\n latest: {\n get() {\n if (!resolved) return read();\n const err = error();\n if (err && !pr) throw err;\n return value();\n }\n }\n });\n if (dynamic) createComputed(() => load(false));\n else load(false);\n return [\n read,\n {\n refetch: load,\n mutate: setValue\n }\n ];\n}\nfunction createDeferred(source, options) {\n let t,\n timeout = options ? options.timeoutMs : undefined;\n const node = createComputation(\n () => {\n if (!t || !t.fn)\n t = requestCallback(\n () => setDeferred(() => node.value),\n timeout !== undefined\n ? {\n timeout\n }\n : undefined\n );\n return source();\n },\n undefined,\n true\n );\n const [deferred, setDeferred] = createSignal(\n Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value,\n options\n );\n updateComputation(node);\n setDeferred(() =>\n Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value\n );\n return deferred;\n}\nfunction createSelector(source, fn = equalFn, options) {\n const subs = new Map();\n const node = createComputation(\n p => {\n const v = source();\n for (const [key, val] of subs.entries())\n if (fn(key, v) !== fn(key, p)) {\n for (const c of val.values()) {\n c.state = STALE;\n if (c.pure) Updates.push(c);\n else Effects.push(c);\n }\n }\n return v;\n },\n undefined,\n true,\n STALE\n );\n updateComputation(node);\n return key => {\n const listener = Listener;\n if (listener) {\n let l;\n if ((l = subs.get(key))) l.add(listener);\n else subs.set(key, (l = new Set([listener])));\n onCleanup(() => {\n l.delete(listener);\n !l.size && subs.delete(key);\n });\n }\n return fn(\n key,\n Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value\n );\n };\n}\nfunction batch(fn) {\n return runUpdates(fn, false);\n}\nfunction untrack(fn) {\n if (!ExternalSourceConfig && Listener === null) return fn();\n const listener = Listener;\n Listener = null;\n try {\n if (ExternalSourceConfig) return ExternalSourceConfig.untrack(fn);\n return fn();\n } finally {\n Listener = listener;\n }\n}\nfunction on(deps, fn, options) {\n const isArray = Array.isArray(deps);\n let prevInput;\n let defer = options && options.defer;\n return prevValue => {\n let input;\n if (isArray) {\n input = Array(deps.length);\n for (let i = 0; i < deps.length; i++) input[i] = deps[i]();\n } else input = deps();\n if (defer) {\n defer = false;\n return prevValue;\n }\n const result = untrack(() => fn(input, prevInput, prevValue));\n prevInput = input;\n return result;\n };\n}\nfunction onMount(fn) {\n createEffect(() => untrack(fn));\n}\nfunction onCleanup(fn) {\n if (Owner === null);\n else if (Owner.cleanups === null) Owner.cleanups = [fn];\n else Owner.cleanups.push(fn);\n return fn;\n}\nfunction catchError(fn, handler) {\n ERROR || (ERROR = Symbol(\"error\"));\n Owner = createComputation(undefined, undefined, true);\n Owner.context = {\n ...Owner.context,\n [ERROR]: [handler]\n };\n if (Transition && Transition.running) Transition.sources.add(Owner);\n try {\n return fn();\n } catch (err) {\n handleError(err);\n } finally {\n Owner = Owner.owner;\n }\n}\nfunction getListener() {\n return Listener;\n}\nfunction getOwner() {\n return Owner;\n}\nfunction runWithOwner(o, fn) {\n const prev = Owner;\n const prevListener = Listener;\n Owner = o;\n Listener = null;\n try {\n return runUpdates(fn, true);\n } catch (err) {\n handleError(err);\n } finally {\n Owner = prev;\n Listener = prevListener;\n }\n}\nfunction enableScheduling(scheduler = requestCallback) {\n Scheduler = scheduler;\n}\nfunction startTransition(fn) {\n if (Transition && Transition.running) {\n fn();\n return Transition.done;\n }\n const l = Listener;\n const o = Owner;\n return Promise.resolve().then(() => {\n Listener = l;\n Owner = o;\n let t;\n if (Scheduler || SuspenseContext) {\n t =\n Transition ||\n (Transition = {\n sources: new Set(),\n effects: [],\n promises: new Set(),\n disposed: new Set(),\n queue: new Set(),\n running: true\n });\n t.done || (t.done = new Promise(res => (t.resolve = res)));\n t.running = true;\n }\n runUpdates(fn, false);\n Listener = Owner = null;\n return t ? t.done : undefined;\n });\n}\nconst [transPending, setTransPending] = /*@__PURE__*/ createSignal(false);\nfunction useTransition() {\n return [transPending, startTransition];\n}\nfunction resumeEffects(e) {\n Effects.push.apply(Effects, e);\n e.length = 0;\n}\nfunction createContext(defaultValue, options) {\n const id = Symbol(\"context\");\n return {\n id,\n Provider: createProvider(id),\n defaultValue\n };\n}\nfunction useContext(context) {\n let value;\n return Owner && Owner.context && (value = Owner.context[context.id]) !== undefined\n ? value\n : context.defaultValue;\n}\nfunction children(fn) {\n const children = createMemo(fn);\n const memo = createMemo(() => resolveChildren(children()));\n memo.toArray = () => {\n const c = memo();\n return Array.isArray(c) ? c : c != null ? [c] : [];\n };\n return memo;\n}\nlet SuspenseContext;\nfunction getSuspenseContext() {\n return SuspenseContext || (SuspenseContext = createContext());\n}\nfunction enableExternalSource(factory, untrack = fn => fn()) {\n if (ExternalSourceConfig) {\n const { factory: oldFactory, untrack: oldUntrack } = ExternalSourceConfig;\n ExternalSourceConfig = {\n factory: (fn, trigger) => {\n const oldSource = oldFactory(fn, trigger);\n const source = factory(x => oldSource.track(x), trigger);\n return {\n track: x => source.track(x),\n dispose() {\n source.dispose();\n oldSource.dispose();\n }\n };\n },\n untrack: fn => oldUntrack(() => untrack(fn))\n };\n } else {\n ExternalSourceConfig = {\n factory,\n untrack\n };\n }\n}\nfunction readSignal() {\n const runningTransition = Transition && Transition.running;\n if (this.sources && (runningTransition ? this.tState : this.state)) {\n if ((runningTransition ? this.tState : this.state) === STALE) updateComputation(this);\n else {\n const updates = Updates;\n Updates = null;\n runUpdates(() => lookUpstream(this), false);\n Updates = updates;\n }\n }\n if (Listener) {\n const sSlot = this.observers ? this.observers.length : 0;\n if (!Listener.sources) {\n Listener.sources = [this];\n Listener.sourceSlots = [sSlot];\n } else {\n Listener.sources.push(this);\n Listener.sourceSlots.push(sSlot);\n }\n if (!this.observers) {\n this.observers = [Listener];\n this.observerSlots = [Listener.sources.length - 1];\n } else {\n this.observers.push(Listener);\n this.observerSlots.push(Listener.sources.length - 1);\n }\n }\n if (runningTransition && Transition.sources.has(this)) return this.tValue;\n return this.value;\n}\nfunction writeSignal(node, value, isComp) {\n let current =\n Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value;\n if (!node.comparator || !node.comparator(current, value)) {\n if (Transition) {\n const TransitionRunning = Transition.running;\n if (TransitionRunning || (!isComp && Transition.sources.has(node))) {\n Transition.sources.add(node);\n node.tValue = value;\n }\n if (!TransitionRunning) node.value = value;\n } else node.value = value;\n if (node.observers && node.observers.length) {\n runUpdates(() => {\n for (let i = 0; i < node.observers.length; i += 1) {\n const o = node.observers[i];\n const TransitionRunning = Transition && Transition.running;\n if (TransitionRunning && Transition.disposed.has(o)) continue;\n if (TransitionRunning ? !o.tState : !o.state) {\n if (o.pure) Updates.push(o);\n else Effects.push(o);\n if (o.observers) markDownstream(o);\n }\n if (!TransitionRunning) o.state = STALE;\n else o.tState = STALE;\n }\n if (Updates.length > 10e5) {\n Updates = [];\n if (false);\n throw new Error();\n }\n }, false);\n }\n }\n return value;\n}\nfunction updateComputation(node) {\n if (!node.fn) return;\n cleanNode(node);\n const time = ExecCount;\n runComputation(\n node,\n Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value,\n time\n );\n if (Transition && !Transition.running && Transition.sources.has(node)) {\n queueMicrotask(() => {\n runUpdates(() => {\n Transition && (Transition.running = true);\n Listener = Owner = node;\n runComputation(node, node.tValue, time);\n Listener = Owner = null;\n }, false);\n });\n }\n}\nfunction runComputation(node, value, time) {\n let nextValue;\n const owner = Owner,\n listener = Listener;\n Listener = Owner = node;\n try {\n nextValue = node.fn(value);\n } catch (err) {\n if (node.pure) {\n if (Transition && Transition.running) {\n node.tState = STALE;\n node.tOwned && node.tOwned.forEach(cleanNode);\n node.tOwned = undefined;\n } else {\n node.state = STALE;\n node.owned && node.owned.forEach(cleanNode);\n node.owned = null;\n }\n }\n node.updatedAt = time + 1;\n return handleError(err);\n } finally {\n Listener = listener;\n Owner = owner;\n }\n if (!node.updatedAt || node.updatedAt <= time) {\n if (node.updatedAt != null && \"observers\" in node) {\n writeSignal(node, nextValue, true);\n } else if (Transition && Transition.running && node.pure) {\n Transition.sources.add(node);\n node.tValue = nextValue;\n } else node.value = nextValue;\n node.updatedAt = time;\n }\n}\nfunction createComputation(fn, init, pure, state = STALE, options) {\n const c = {\n fn,\n state: state,\n updatedAt: null,\n owned: null,\n sources: null,\n sourceSlots: null,\n cleanups: null,\n value: init,\n owner: Owner,\n context: Owner ? Owner.context : null,\n pure\n };\n if (Transition && Transition.running) {\n c.state = 0;\n c.tState = state;\n }\n if (Owner === null);\n else if (Owner !== UNOWNED) {\n if (Transition && Transition.running && Owner.pure) {\n if (!Owner.tOwned) Owner.tOwned = [c];\n else Owner.tOwned.push(c);\n } else {\n if (!Owner.owned) Owner.owned = [c];\n else Owner.owned.push(c);\n }\n }\n if (ExternalSourceConfig && c.fn) {\n const [track, trigger] = createSignal(undefined, {\n equals: false\n });\n const ordinary = ExternalSourceConfig.factory(c.fn, trigger);\n onCleanup(() => ordinary.dispose());\n const triggerInTransition = () => startTransition(trigger).then(() => inTransition.dispose());\n const inTransition = ExternalSourceConfig.factory(c.fn, triggerInTransition);\n c.fn = x => {\n track();\n return Transition && Transition.running ? inTransition.track(x) : ordinary.track(x);\n };\n }\n return c;\n}\nfunction runTop(node) {\n const runningTransition = Transition && Transition.running;\n if ((runningTransition ? node.tState : node.state) === 0) return;\n if ((runningTransition ? node.tState : node.state) === PENDING) return lookUpstream(node);\n if (node.suspense && untrack(node.suspense.inFallback)) return node.suspense.effects.push(node);\n const ancestors = [node];\n while ((node = node.owner) && (!node.updatedAt || node.updatedAt < ExecCount)) {\n if (runningTransition && Transition.disposed.has(node)) return;\n if (runningTransition ? node.tState : node.state) ancestors.push(node);\n }\n for (let i = ancestors.length - 1; i >= 0; i--) {\n node = ancestors[i];\n if (runningTransition) {\n let top = node,\n prev = ancestors[i + 1];\n while ((top = top.owner) && top !== prev) {\n if (Transition.disposed.has(top)) return;\n }\n }\n if ((runningTransition ? node.tState : node.state) === STALE) {\n updateComputation(node);\n } else if ((runningTransition ? node.tState : node.state) === PENDING) {\n const updates = Updates;\n Updates = null;\n runUpdates(() => lookUpstream(node, ancestors[0]), false);\n Updates = updates;\n }\n }\n}\nfunction runUpdates(fn, init) {\n if (Updates) return fn();\n let wait = false;\n if (!init) Updates = [];\n if (Effects) wait = true;\n else Effects = [];\n ExecCount++;\n try {\n const res = fn();\n completeUpdates(wait);\n return res;\n } catch (err) {\n if (!wait) Effects = null;\n Updates = null;\n handleError(err);\n }\n}\nfunction completeUpdates(wait) {\n if (Updates) {\n if (Scheduler && Transition && Transition.running) scheduleQueue(Updates);\n else runQueue(Updates);\n Updates = null;\n }\n if (wait) return;\n let res;\n if (Transition) {\n if (!Transition.promises.size && !Transition.queue.size) {\n const sources = Transition.sources;\n const disposed = Transition.disposed;\n Effects.push.apply(Effects, Transition.effects);\n res = Transition.resolve;\n for (const e of Effects) {\n \"tState\" in e && (e.state = e.tState);\n delete e.tState;\n }\n Transition = null;\n runUpdates(() => {\n for (const d of disposed) cleanNode(d);\n for (const v of sources) {\n v.value = v.tValue;\n if (v.owned) {\n for (let i = 0, len = v.owned.length; i < len; i++) cleanNode(v.owned[i]);\n }\n if (v.tOwned) v.owned = v.tOwned;\n delete v.tValue;\n delete v.tOwned;\n v.tState = 0;\n }\n setTransPending(false);\n }, false);\n } else if (Transition.running) {\n Transition.running = false;\n Transition.effects.push.apply(Transition.effects, Effects);\n Effects = null;\n setTransPending(true);\n return;\n }\n }\n const e = Effects;\n Effects = null;\n if (e.length) runUpdates(() => runEffects(e), false);\n if (res) res();\n}\nfunction runQueue(queue) {\n for (let i = 0; i < queue.length; i++) runTop(queue[i]);\n}\nfunction scheduleQueue(queue) {\n for (let i = 0; i < queue.length; i++) {\n const item = queue[i];\n const tasks = Transition.queue;\n if (!tasks.has(item)) {\n tasks.add(item);\n Scheduler(() => {\n tasks.delete(item);\n runUpdates(() => {\n Transition.running = true;\n runTop(item);\n }, false);\n Transition && (Transition.running = false);\n });\n }\n }\n}\nfunction runUserEffects(queue) {\n let i,\n userLength = 0;\n for (i = 0; i < queue.length; i++) {\n const e = queue[i];\n if (!e.user) runTop(e);\n else queue[userLength++] = e;\n }\n if (sharedConfig.context) {\n if (sharedConfig.count) {\n sharedConfig.effects || (sharedConfig.effects = []);\n sharedConfig.effects.push(...queue.slice(0, userLength));\n return;\n }\n setHydrateContext();\n }\n if (sharedConfig.effects && (sharedConfig.done || !sharedConfig.count)) {\n queue = [...sharedConfig.effects, ...queue];\n userLength += sharedConfig.effects.length;\n delete sharedConfig.effects;\n }\n for (i = 0; i < userLength; i++) runTop(queue[i]);\n}\nfunction lookUpstream(node, ignore) {\n const runningTransition = Transition && Transition.running;\n if (runningTransition) node.tState = 0;\n else node.state = 0;\n for (let i = 0; i < node.sources.length; i += 1) {\n const source = node.sources[i];\n if (source.sources) {\n const state = runningTransition ? source.tState : source.state;\n if (state === STALE) {\n if (source !== ignore && (!source.updatedAt || source.updatedAt < ExecCount))\n runTop(source);\n } else if (state === PENDING) lookUpstream(source, ignore);\n }\n }\n}\nfunction markDownstream(node) {\n const runningTransition = Transition && Transition.running;\n for (let i = 0; i < node.observers.length; i += 1) {\n const o = node.observers[i];\n if (runningTransition ? !o.tState : !o.state) {\n if (runningTransition) o.tState = PENDING;\n else o.state = PENDING;\n if (o.pure) Updates.push(o);\n else Effects.push(o);\n o.observers && markDownstream(o);\n }\n }\n}\nfunction cleanNode(node) {\n let i;\n if (node.sources) {\n while (node.sources.length) {\n const source = node.sources.pop(),\n index = node.sourceSlots.pop(),\n obs = source.observers;\n if (obs && obs.length) {\n const n = obs.pop(),\n s = source.observerSlots.pop();\n if (index < obs.length) {\n n.sourceSlots[s] = index;\n obs[index] = n;\n source.observerSlots[index] = s;\n }\n }\n }\n }\n if (node.tOwned) {\n for (i = node.tOwned.length - 1; i >= 0; i--) cleanNode(node.tOwned[i]);\n delete node.tOwned;\n }\n if (Transition && Transition.running && node.pure) {\n reset(node, true);\n } else if (node.owned) {\n for (i = node.owned.length - 1; i >= 0; i--) cleanNode(node.owned[i]);\n node.owned = null;\n }\n if (node.cleanups) {\n for (i = node.cleanups.length - 1; i >= 0; i--) node.cleanups[i]();\n node.cleanups = null;\n }\n if (Transition && Transition.running) node.tState = 0;\n else node.state = 0;\n}\nfunction reset(node, top) {\n if (!top) {\n node.tState = 0;\n Transition.disposed.add(node);\n }\n if (node.owned) {\n for (let i = 0; i < node.owned.length; i++) reset(node.owned[i]);\n }\n}\nfunction castError(err) {\n if (err instanceof Error) return err;\n return new Error(typeof err === \"string\" ? err : \"Unknown error\", {\n cause: err\n });\n}\nfunction runErrors(err, fns, owner) {\n try {\n for (const f of fns) f(err);\n } catch (e) {\n handleError(e, (owner && owner.owner) || null);\n }\n}\nfunction handleError(err, owner = Owner) {\n const fns = ERROR && owner && owner.context && owner.context[ERROR];\n const error = castError(err);\n if (!fns) throw error;\n if (Effects)\n Effects.push({\n fn() {\n runErrors(error, fns, owner);\n },\n state: STALE\n });\n else runErrors(error, fns, owner);\n}\nfunction resolveChildren(children) {\n if (typeof children === \"function\" && !children.length) return resolveChildren(children());\n if (Array.isArray(children)) {\n const results = [];\n for (let i = 0; i < children.length; i++) {\n const result = resolveChildren(children[i]);\n Array.isArray(result) ? results.push.apply(results, result) : results.push(result);\n }\n return results;\n }\n return children;\n}\nfunction createProvider(id, options) {\n return function provider(props) {\n let res;\n createRenderEffect(\n () =>\n (res = untrack(() => {\n Owner.context = {\n ...Owner.context,\n [id]: props.value\n };\n return children(() => props.children);\n })),\n undefined\n );\n return res;\n };\n}\nfunction onError(fn) {\n ERROR || (ERROR = Symbol(\"error\"));\n if (Owner === null);\n else if (Owner.context === null || !Owner.context[ERROR]) {\n Owner.context = {\n ...Owner.context,\n [ERROR]: [fn]\n };\n mutateContext(Owner, ERROR, [fn]);\n } else Owner.context[ERROR].push(fn);\n}\nfunction mutateContext(o, key, value) {\n if (o.owned) {\n for (let i = 0; i < o.owned.length; i++) {\n if (o.owned[i].context === o.context) mutateContext(o.owned[i], key, value);\n if (!o.owned[i].context) {\n o.owned[i].context = o.context;\n mutateContext(o.owned[i], key, value);\n } else if (!o.owned[i].context[key]) {\n o.owned[i].context[key] = value;\n mutateContext(o.owned[i], key, value);\n }\n }\n }\n}\n\nfunction observable(input) {\n return {\n subscribe(observer) {\n if (!(observer instanceof Object) || observer == null) {\n throw new TypeError(\"Expected the observer to be an object.\");\n }\n const handler =\n typeof observer === \"function\" ? observer : observer.next && observer.next.bind(observer);\n if (!handler) {\n return {\n unsubscribe() {}\n };\n }\n const dispose = createRoot(disposer => {\n createEffect(() => {\n const v = input();\n untrack(() => handler(v));\n });\n return disposer;\n });\n if (getOwner()) onCleanup(dispose);\n return {\n unsubscribe() {\n dispose();\n }\n };\n },\n [Symbol.observable || \"@@observable\"]() {\n return this;\n }\n };\n}\nfunction from(producer) {\n const [s, set] = createSignal(undefined, {\n equals: false\n });\n if (\"subscribe\" in producer) {\n const unsub = producer.subscribe(v => set(() => v));\n onCleanup(() => (\"unsubscribe\" in unsub ? unsub.unsubscribe() : unsub()));\n } else {\n const clean = producer(set);\n onCleanup(clean);\n }\n return s;\n}\n\nconst FALLBACK = Symbol(\"fallback\");\nfunction dispose(d) {\n for (let i = 0; i < d.length; i++) d[i]();\n}\nfunction mapArray(list, mapFn, options = {}) {\n let items = [],\n mapped = [],\n disposers = [],\n len = 0,\n indexes = mapFn.length > 1 ? [] : null;\n onCleanup(() => dispose(disposers));\n return () => {\n let newItems = list() || [],\n newLen = newItems.length,\n i,\n j;\n newItems[$TRACK];\n return untrack(() => {\n let newIndices, newIndicesNext, temp, tempdisposers, tempIndexes, start, end, newEnd, item;\n if (newLen === 0) {\n if (len !== 0) {\n dispose(disposers);\n disposers = [];\n items = [];\n mapped = [];\n len = 0;\n indexes && (indexes = []);\n }\n if (options.fallback) {\n items = [FALLBACK];\n mapped[0] = createRoot(disposer => {\n disposers[0] = disposer;\n return options.fallback();\n });\n len = 1;\n }\n } else if (len === 0) {\n mapped = new Array(newLen);\n for (j = 0; j < newLen; j++) {\n items[j] = newItems[j];\n mapped[j] = createRoot(mapper);\n }\n len = newLen;\n } else {\n temp = new Array(newLen);\n tempdisposers = new Array(newLen);\n indexes && (tempIndexes = new Array(newLen));\n for (\n start = 0, end = Math.min(len, newLen);\n start < end && items[start] === newItems[start];\n start++\n );\n for (\n end = len - 1, newEnd = newLen - 1;\n end >= start && newEnd >= start && items[end] === newItems[newEnd];\n end--, newEnd--\n ) {\n temp[newEnd] = mapped[end];\n tempdisposers[newEnd] = disposers[end];\n indexes && (tempIndexes[newEnd] = indexes[end]);\n }\n newIndices = new Map();\n newIndicesNext = new Array(newEnd + 1);\n for (j = newEnd; j >= start; j--) {\n item = newItems[j];\n i = newIndices.get(item);\n newIndicesNext[j] = i === undefined ? -1 : i;\n newIndices.set(item, j);\n }\n for (i = start; i <= end; i++) {\n item = items[i];\n j = newIndices.get(item);\n if (j !== undefined && j !== -1) {\n temp[j] = mapped[i];\n tempdisposers[j] = disposers[i];\n indexes && (tempIndexes[j] = indexes[i]);\n j = newIndicesNext[j];\n newIndices.set(item, j);\n } else disposers[i]();\n }\n for (j = start; j < newLen; j++) {\n if (j in temp) {\n mapped[j] = temp[j];\n disposers[j] = tempdisposers[j];\n if (indexes) {\n indexes[j] = tempIndexes[j];\n indexes[j](j);\n }\n } else mapped[j] = createRoot(mapper);\n }\n mapped = mapped.slice(0, (len = newLen));\n items = newItems.slice(0);\n }\n return mapped;\n });\n function mapper(disposer) {\n disposers[j] = disposer;\n if (indexes) {\n const [s, set] = createSignal(j);\n indexes[j] = set;\n return mapFn(newItems[j], s);\n }\n return mapFn(newItems[j]);\n }\n };\n}\nfunction indexArray(list, mapFn, options = {}) {\n let items = [],\n mapped = [],\n disposers = [],\n signals = [],\n len = 0,\n i;\n onCleanup(() => dispose(disposers));\n return () => {\n const newItems = list() || [],\n newLen = newItems.length;\n newItems[$TRACK];\n return untrack(() => {\n if (newLen === 0) {\n if (len !== 0) {\n dispose(disposers);\n disposers = [];\n items = [];\n mapped = [];\n len = 0;\n signals = [];\n }\n if (options.fallback) {\n items = [FALLBACK];\n mapped[0] = createRoot(disposer => {\n disposers[0] = disposer;\n return options.fallback();\n });\n len = 1;\n }\n return mapped;\n }\n if (items[0] === FALLBACK) {\n disposers[0]();\n disposers = [];\n items = [];\n mapped = [];\n len = 0;\n }\n for (i = 0; i < newLen; i++) {\n if (i < items.length && items[i] !== newItems[i]) {\n signals[i](() => newItems[i]);\n } else if (i >= items.length) {\n mapped[i] = createRoot(mapper);\n }\n }\n for (; i < items.length; i++) {\n disposers[i]();\n }\n len = signals.length = disposers.length = newLen;\n items = newItems.slice(0);\n return (mapped = mapped.slice(0, len));\n });\n function mapper(disposer) {\n disposers[i] = disposer;\n const [s, set] = createSignal(newItems[i]);\n signals[i] = set;\n return mapFn(s, i);\n }\n };\n}\n\nlet hydrationEnabled = false;\nfunction enableHydration() {\n hydrationEnabled = true;\n}\nfunction createComponent(Comp, props) {\n if (hydrationEnabled) {\n if (sharedConfig.context) {\n const c = sharedConfig.context;\n setHydrateContext(nextHydrateContext());\n const r = untrack(() => Comp(props || {}));\n setHydrateContext(c);\n return r;\n }\n }\n return untrack(() => Comp(props || {}));\n}\nfunction trueFn() {\n return true;\n}\nconst propTraps = {\n get(_, property, receiver) {\n if (property === $PROXY) return receiver;\n return _.get(property);\n },\n has(_, property) {\n if (property === $PROXY) return true;\n return _.has(property);\n },\n set: trueFn,\n deleteProperty: trueFn,\n getOwnPropertyDescriptor(_, property) {\n return {\n configurable: true,\n enumerable: true,\n get() {\n return _.get(property);\n },\n set: trueFn,\n deleteProperty: trueFn\n };\n },\n ownKeys(_) {\n return _.keys();\n }\n};\nfunction resolveSource(s) {\n return !(s = typeof s === \"function\" ? s() : s) ? {} : s;\n}\nfunction resolveSources() {\n for (let i = 0, length = this.length; i < length; ++i) {\n const v = this[i]();\n if (v !== undefined) return v;\n }\n}\nfunction mergeProps(...sources) {\n let proxy = false;\n for (let i = 0; i < sources.length; i++) {\n const s = sources[i];\n proxy = proxy || (!!s && $PROXY in s);\n sources[i] = typeof s === \"function\" ? ((proxy = true), createMemo(s)) : s;\n }\n if (SUPPORTS_PROXY && proxy) {\n return new Proxy(\n {\n get(property) {\n for (let i = sources.length - 1; i >= 0; i--) {\n const v = resolveSource(sources[i])[property];\n if (v !== undefined) return v;\n }\n },\n has(property) {\n for (let i = sources.length - 1; i >= 0; i--) {\n if (property in resolveSource(sources[i])) return true;\n }\n return false;\n },\n keys() {\n const keys = [];\n for (let i = 0; i < sources.length; i++)\n keys.push(...Object.keys(resolveSource(sources[i])));\n return [...new Set(keys)];\n }\n },\n propTraps\n );\n }\n const sourcesMap = {};\n const defined = Object.create(null);\n for (let i = sources.length - 1; i >= 0; i--) {\n const source = sources[i];\n if (!source) continue;\n const sourceKeys = Object.getOwnPropertyNames(source);\n for (let i = sourceKeys.length - 1; i >= 0; i--) {\n const key = sourceKeys[i];\n if (key === \"__proto__\" || key === \"constructor\") continue;\n const desc = Object.getOwnPropertyDescriptor(source, key);\n if (!defined[key]) {\n defined[key] = desc.get\n ? {\n enumerable: true,\n configurable: true,\n get: resolveSources.bind((sourcesMap[key] = [desc.get.bind(source)]))\n }\n : desc.value !== undefined\n ? desc\n : undefined;\n } else {\n const sources = sourcesMap[key];\n if (sources) {\n if (desc.get) sources.push(desc.get.bind(source));\n else if (desc.value !== undefined) sources.push(() => desc.value);\n }\n }\n }\n }\n const target = {};\n const definedKeys = Object.keys(defined);\n for (let i = definedKeys.length - 1; i >= 0; i--) {\n const key = definedKeys[i],\n desc = defined[key];\n if (desc && desc.get) Object.defineProperty(target, key, desc);\n else target[key] = desc ? desc.value : undefined;\n }\n return target;\n}\nfunction splitProps(props, ...keys) {\n if (SUPPORTS_PROXY && $PROXY in props) {\n const blocked = new Set(keys.length > 1 ? keys.flat() : keys[0]);\n const res = keys.map(k => {\n return new Proxy(\n {\n get(property) {\n return k.includes(property) ? props[property] : undefined;\n },\n has(property) {\n return k.includes(property) && property in props;\n },\n keys() {\n return k.filter(property => property in props);\n }\n },\n propTraps\n );\n });\n res.push(\n new Proxy(\n {\n get(property) {\n return blocked.has(property) ? undefined : props[property];\n },\n has(property) {\n return blocked.has(property) ? false : property in props;\n },\n keys() {\n return Object.keys(props).filter(k => !blocked.has(k));\n }\n },\n propTraps\n )\n );\n return res;\n }\n const otherObject = {};\n const objects = keys.map(() => ({}));\n for (const propName of Object.getOwnPropertyNames(props)) {\n const desc = Object.getOwnPropertyDescriptor(props, propName);\n const isDefaultDesc =\n !desc.get && !desc.set && desc.enumerable && desc.writable && desc.configurable;\n let blocked = false;\n let objectIndex = 0;\n for (const k of keys) {\n if (k.includes(propName)) {\n blocked = true;\n isDefaultDesc\n ? (objects[objectIndex][propName] = desc.value)\n : Object.defineProperty(objects[objectIndex], propName, desc);\n }\n ++objectIndex;\n }\n if (!blocked) {\n isDefaultDesc\n ? (otherObject[propName] = desc.value)\n : Object.defineProperty(otherObject, propName, desc);\n }\n }\n return [...objects, otherObject];\n}\nfunction lazy(fn) {\n let comp;\n let p;\n const wrap = props => {\n const ctx = sharedConfig.context;\n if (ctx) {\n const [s, set] = createSignal();\n sharedConfig.count || (sharedConfig.count = 0);\n sharedConfig.count++;\n (p || (p = fn())).then(mod => {\n !sharedConfig.done && setHydrateContext(ctx);\n sharedConfig.count--;\n set(() => mod.default);\n setHydrateContext();\n });\n comp = s;\n } else if (!comp) {\n const [s] = createResource(() => (p || (p = fn())).then(mod => mod.default));\n comp = s;\n }\n let Comp;\n return createMemo(() =>\n (Comp = comp())\n ? untrack(() => {\n if (false);\n if (!ctx || sharedConfig.done) return Comp(props);\n const c = sharedConfig.context;\n setHydrateContext(ctx);\n const r = Comp(props);\n setHydrateContext(c);\n return r;\n })\n : \"\"\n );\n };\n wrap.preload = () => p || ((p = fn()).then(mod => (comp = () => mod.default)), p);\n return wrap;\n}\nlet counter = 0;\nfunction createUniqueId() {\n const ctx = sharedConfig.context;\n return ctx ? sharedConfig.getNextContextId() : `cl-${counter++}`;\n}\n\nconst narrowedError = name => `Stale read from <${name}>.`;\nfunction For(props) {\n const fallback = \"fallback\" in props && {\n fallback: () => props.fallback\n };\n return createMemo(mapArray(() => props.each, props.children, fallback || undefined));\n}\nfunction Index(props) {\n const fallback = \"fallback\" in props && {\n fallback: () => props.fallback\n };\n return createMemo(indexArray(() => props.each, props.children, fallback || undefined));\n}\nfunction Show(props) {\n const keyed = props.keyed;\n const condition = createMemo(() => props.when, undefined, {\n equals: (a, b) => (keyed ? a === b : !a === !b)\n });\n return createMemo(\n () => {\n const c = condition();\n if (c) {\n const child = props.children;\n const fn = typeof child === \"function\" && child.length > 0;\n return fn\n ? untrack(() =>\n child(\n keyed\n ? c\n : () => {\n if (!untrack(condition)) throw narrowedError(\"Show\");\n return props.when;\n }\n )\n )\n : child;\n }\n return props.fallback;\n },\n undefined,\n undefined\n );\n}\nfunction Switch(props) {\n let keyed = false;\n const equals = (a, b) => (keyed ? a[1] === b[1] : !a[1] === !b[1]) && a[2] === b[2];\n const conditions = children(() => props.children),\n evalConditions = createMemo(\n () => {\n let conds = conditions();\n if (!Array.isArray(conds)) conds = [conds];\n for (let i = 0; i < conds.length; i++) {\n const c = conds[i].when;\n if (c) {\n keyed = !!conds[i].keyed;\n return [i, c, conds[i]];\n }\n }\n return [-1];\n },\n undefined,\n {\n equals\n }\n );\n return createMemo(\n () => {\n const [index, when, cond] = evalConditions();\n if (index < 0) return props.fallback;\n const c = cond.children;\n const fn = typeof c === \"function\" && c.length > 0;\n return fn\n ? untrack(() =>\n c(\n keyed\n ? when\n : () => {\n if (untrack(evalConditions)[0] !== index) throw narrowedError(\"Match\");\n return cond.when;\n }\n )\n )\n : c;\n },\n undefined,\n undefined\n );\n}\nfunction Match(props) {\n return props;\n}\nlet Errors;\nfunction resetErrorBoundaries() {\n Errors && [...Errors].forEach(fn => fn());\n}\nfunction ErrorBoundary(props) {\n let err;\n if (sharedConfig.context && sharedConfig.load)\n err = sharedConfig.load(sharedConfig.getContextId());\n const [errored, setErrored] = createSignal(err, undefined);\n Errors || (Errors = new Set());\n Errors.add(setErrored);\n onCleanup(() => Errors.delete(setErrored));\n return createMemo(\n () => {\n let e;\n if ((e = errored())) {\n const f = props.fallback;\n return typeof f === \"function\" && f.length ? untrack(() => f(e, () => setErrored())) : f;\n }\n return catchError(() => props.children, setErrored);\n },\n undefined,\n undefined\n );\n}\n\nconst suspenseListEquals = (a, b) =>\n a.showContent === b.showContent && a.showFallback === b.showFallback;\nconst SuspenseListContext = /* #__PURE__ */ createContext();\nfunction SuspenseList(props) {\n let [wrapper, setWrapper] = createSignal(() => ({\n inFallback: false\n })),\n show;\n const listContext = useContext(SuspenseListContext);\n const [registry, setRegistry] = createSignal([]);\n if (listContext) {\n show = listContext.register(createMemo(() => wrapper()().inFallback));\n }\n const resolved = createMemo(\n prev => {\n const reveal = props.revealOrder,\n tail = props.tail,\n { showContent = true, showFallback = true } = show ? show() : {},\n reg = registry(),\n reverse = reveal === \"backwards\";\n if (reveal === \"together\") {\n const all = reg.every(inFallback => !inFallback());\n const res = reg.map(() => ({\n showContent: all && showContent,\n showFallback\n }));\n res.inFallback = !all;\n return res;\n }\n let stop = false;\n let inFallback = prev.inFallback;\n const res = [];\n for (let i = 0, len = reg.length; i < len; i++) {\n const n = reverse ? len - i - 1 : i,\n s = reg[n]();\n if (!stop && !s) {\n res[n] = {\n showContent,\n showFallback\n };\n } else {\n const next = !stop;\n if (next) inFallback = true;\n res[n] = {\n showContent: next,\n showFallback: !tail || (next && tail === \"collapsed\") ? showFallback : false\n };\n stop = true;\n }\n }\n if (!stop) inFallback = false;\n res.inFallback = inFallback;\n return res;\n },\n {\n inFallback: false\n }\n );\n setWrapper(() => resolved);\n return createComponent(SuspenseListContext.Provider, {\n value: {\n register: inFallback => {\n let index;\n setRegistry(registry => {\n index = registry.length;\n return [...registry, inFallback];\n });\n return createMemo(() => resolved()[index], undefined, {\n equals: suspenseListEquals\n });\n }\n },\n get children() {\n return props.children;\n }\n });\n}\nfunction Suspense(props) {\n let counter = 0,\n show,\n ctx,\n p,\n flicker,\n error;\n const [inFallback, setFallback] = createSignal(false),\n SuspenseContext = getSuspenseContext(),\n store = {\n increment: () => {\n if (++counter === 1) setFallback(true);\n },\n decrement: () => {\n if (--counter === 0) setFallback(false);\n },\n inFallback,\n effects: [],\n resolved: false\n },\n owner = getOwner();\n if (sharedConfig.context && sharedConfig.load) {\n const key = sharedConfig.getContextId();\n let ref = sharedConfig.load(key);\n if (ref) {\n if (typeof ref !== \"object\" || ref.status !== \"success\") p = ref;\n else sharedConfig.gather(key);\n }\n if (p && p !== \"$$f\") {\n const [s, set] = createSignal(undefined, {\n equals: false\n });\n flicker = s;\n p.then(\n () => {\n if (sharedConfig.done) return set();\n sharedConfig.gather(key);\n setHydrateContext(ctx);\n set();\n setHydrateContext();\n },\n err => {\n error = err;\n set();\n }\n );\n }\n }\n const listContext = useContext(SuspenseListContext);\n if (listContext) show = listContext.register(store.inFallback);\n let dispose;\n onCleanup(() => dispose && dispose());\n return createComponent(SuspenseContext.Provider, {\n value: store,\n get children() {\n return createMemo(() => {\n if (error) throw error;\n ctx = sharedConfig.context;\n if (flicker) {\n flicker();\n return (flicker = undefined);\n }\n if (ctx && p === \"$$f\") setHydrateContext();\n const rendered = createMemo(() => props.children);\n return createMemo(prev => {\n const inFallback = store.inFallback(),\n { showContent = true, showFallback = true } = show ? show() : {};\n if ((!inFallback || (p && p !== \"$$f\")) && showContent) {\n store.resolved = true;\n dispose && dispose();\n dispose = ctx = p = undefined;\n resumeEffects(store.effects);\n return rendered();\n }\n if (!showFallback) return;\n if (dispose) return prev;\n return createRoot(disposer => {\n dispose = disposer;\n if (ctx) {\n setHydrateContext({\n id: ctx.id + \"F\",\n count: 0\n });\n ctx = undefined;\n }\n return props.fallback;\n }, owner);\n });\n });\n }\n });\n}\n\nconst DEV = undefined;\n\nexport {\n $DEVCOMP,\n $PROXY,\n $TRACK,\n DEV,\n ErrorBoundary,\n For,\n Index,\n Match,\n Show,\n Suspense,\n SuspenseList,\n Switch,\n batch,\n cancelCallback,\n catchError,\n children,\n createComponent,\n createComputed,\n createContext,\n createDeferred,\n createEffect,\n createMemo,\n createReaction,\n createRenderEffect,\n createResource,\n createRoot,\n createSelector,\n createSignal,\n createUniqueId,\n enableExternalSource,\n enableHydration,\n enableScheduling,\n equalFn,\n from,\n getListener,\n getOwner,\n indexArray,\n lazy,\n mapArray,\n mergeProps,\n observable,\n on,\n onCleanup,\n onError,\n onMount,\n requestCallback,\n resetErrorBoundaries,\n runWithOwner,\n sharedConfig,\n splitProps,\n startTransition,\n untrack,\n useContext,\n useTransition\n};\n","import {\n createRoot,\n createRenderEffect,\n untrack,\n sharedConfig,\n enableHydration,\n getOwner,\n createEffect,\n runWithOwner,\n createMemo,\n createSignal,\n onCleanup,\n splitProps\n} from \"solid-js\";\nexport {\n ErrorBoundary,\n For,\n Index,\n Match,\n Show,\n Suspense,\n SuspenseList,\n Switch,\n createComponent,\n createRenderEffect as effect,\n getOwner,\n createMemo as memo,\n mergeProps,\n untrack\n} from \"solid-js\";\n\nconst booleans = [\n \"allowfullscreen\",\n \"async\",\n \"autofocus\",\n \"autoplay\",\n \"checked\",\n \"controls\",\n \"default\",\n \"disabled\",\n \"formnovalidate\",\n \"hidden\",\n \"indeterminate\",\n \"inert\",\n \"ismap\",\n \"loop\",\n \"multiple\",\n \"muted\",\n \"nomodule\",\n \"novalidate\",\n \"open\",\n \"playsinline\",\n \"readonly\",\n \"required\",\n \"reversed\",\n \"seamless\",\n \"selected\"\n];\nconst Properties = /*#__PURE__*/ new Set([\n \"className\",\n \"value\",\n \"readOnly\",\n \"formNoValidate\",\n \"isMap\",\n \"noModule\",\n \"playsInline\",\n ...booleans\n]);\nconst ChildProperties = /*#__PURE__*/ new Set([\n \"innerHTML\",\n \"textContent\",\n \"innerText\",\n \"children\"\n]);\nconst Aliases = /*#__PURE__*/ Object.assign(Object.create(null), {\n className: \"class\",\n htmlFor: \"for\"\n});\nconst PropAliases = /*#__PURE__*/ Object.assign(Object.create(null), {\n class: \"className\",\n formnovalidate: {\n $: \"formNoValidate\",\n BUTTON: 1,\n INPUT: 1\n },\n ismap: {\n $: \"isMap\",\n IMG: 1\n },\n nomodule: {\n $: \"noModule\",\n SCRIPT: 1\n },\n playsinline: {\n $: \"playsInline\",\n VIDEO: 1\n },\n readonly: {\n $: \"readOnly\",\n INPUT: 1,\n TEXTAREA: 1\n }\n});\nfunction getPropAlias(prop, tagName) {\n const a = PropAliases[prop];\n return typeof a === \"object\" ? (a[tagName] ? a[\"$\"] : undefined) : a;\n}\nconst DelegatedEvents = /*#__PURE__*/ new Set([\n \"beforeinput\",\n \"click\",\n \"dblclick\",\n \"contextmenu\",\n \"focusin\",\n \"focusout\",\n \"input\",\n \"keydown\",\n \"keyup\",\n \"mousedown\",\n \"mousemove\",\n \"mouseout\",\n \"mouseover\",\n \"mouseup\",\n \"pointerdown\",\n \"pointermove\",\n \"pointerout\",\n \"pointerover\",\n \"pointerup\",\n \"touchend\",\n \"touchmove\",\n \"touchstart\"\n]);\nconst SVGElements = /*#__PURE__*/ new Set([\n \"altGlyph\",\n \"altGlyphDef\",\n \"altGlyphItem\",\n \"animate\",\n \"animateColor\",\n \"animateMotion\",\n \"animateTransform\",\n \"circle\",\n \"clipPath\",\n \"color-profile\",\n \"cursor\",\n \"defs\",\n \"desc\",\n \"ellipse\",\n \"feBlend\",\n \"feColorMatrix\",\n \"feComponentTransfer\",\n \"feComposite\",\n \"feConvolveMatrix\",\n \"feDiffuseLighting\",\n \"feDisplacementMap\",\n \"feDistantLight\",\n \"feDropShadow\",\n \"feFlood\",\n \"feFuncA\",\n \"feFuncB\",\n \"feFuncG\",\n \"feFuncR\",\n \"feGaussianBlur\",\n \"feImage\",\n \"feMerge\",\n \"feMergeNode\",\n \"feMorphology\",\n \"feOffset\",\n \"fePointLight\",\n \"feSpecularLighting\",\n \"feSpotLight\",\n \"feTile\",\n \"feTurbulence\",\n \"filter\",\n \"font\",\n \"font-face\",\n \"font-face-format\",\n \"font-face-name\",\n \"font-face-src\",\n \"font-face-uri\",\n \"foreignObject\",\n \"g\",\n \"glyph\",\n \"glyphRef\",\n \"hkern\",\n \"image\",\n \"line\",\n \"linearGradient\",\n \"marker\",\n \"mask\",\n \"metadata\",\n \"missing-glyph\",\n \"mpath\",\n \"path\",\n \"pattern\",\n \"polygon\",\n \"polyline\",\n \"radialGradient\",\n \"rect\",\n \"set\",\n \"stop\",\n \"svg\",\n \"switch\",\n \"symbol\",\n \"text\",\n \"textPath\",\n \"tref\",\n \"tspan\",\n \"use\",\n \"view\",\n \"vkern\"\n]);\nconst SVGNamespace = {\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\"\n};\nconst DOMElements = /*#__PURE__*/ new Set([\n \"html\",\n \"base\",\n \"head\",\n \"link\",\n \"meta\",\n \"style\",\n \"title\",\n \"body\",\n \"address\",\n \"article\",\n \"aside\",\n \"footer\",\n \"header\",\n \"main\",\n \"nav\",\n \"section\",\n \"body\",\n \"blockquote\",\n \"dd\",\n \"div\",\n \"dl\",\n \"dt\",\n \"figcaption\",\n \"figure\",\n \"hr\",\n \"li\",\n \"ol\",\n \"p\",\n \"pre\",\n \"ul\",\n \"a\",\n \"abbr\",\n \"b\",\n \"bdi\",\n \"bdo\",\n \"br\",\n \"cite\",\n \"code\",\n \"data\",\n \"dfn\",\n \"em\",\n \"i\",\n \"kbd\",\n \"mark\",\n \"q\",\n \"rp\",\n \"rt\",\n \"ruby\",\n \"s\",\n \"samp\",\n \"small\",\n \"span\",\n \"strong\",\n \"sub\",\n \"sup\",\n \"time\",\n \"u\",\n \"var\",\n \"wbr\",\n \"area\",\n \"audio\",\n \"img\",\n \"map\",\n \"track\",\n \"video\",\n \"embed\",\n \"iframe\",\n \"object\",\n \"param\",\n \"picture\",\n \"portal\",\n \"source\",\n \"svg\",\n \"math\",\n \"canvas\",\n \"noscript\",\n \"script\",\n \"del\",\n \"ins\",\n \"caption\",\n \"col\",\n \"colgroup\",\n \"table\",\n \"tbody\",\n \"td\",\n \"tfoot\",\n \"th\",\n \"thead\",\n \"tr\",\n \"button\",\n \"datalist\",\n \"fieldset\",\n \"form\",\n \"input\",\n \"label\",\n \"legend\",\n \"meter\",\n \"optgroup\",\n \"option\",\n \"output\",\n \"progress\",\n \"select\",\n \"textarea\",\n \"details\",\n \"dialog\",\n \"menu\",\n \"summary\",\n \"details\",\n \"slot\",\n \"template\",\n \"acronym\",\n \"applet\",\n \"basefont\",\n \"bgsound\",\n \"big\",\n \"blink\",\n \"center\",\n \"content\",\n \"dir\",\n \"font\",\n \"frame\",\n \"frameset\",\n \"hgroup\",\n \"image\",\n \"keygen\",\n \"marquee\",\n \"menuitem\",\n \"nobr\",\n \"noembed\",\n \"noframes\",\n \"plaintext\",\n \"rb\",\n \"rtc\",\n \"shadow\",\n \"spacer\",\n \"strike\",\n \"tt\",\n \"xmp\",\n \"a\",\n \"abbr\",\n \"acronym\",\n \"address\",\n \"applet\",\n \"area\",\n \"article\",\n \"aside\",\n \"audio\",\n \"b\",\n \"base\",\n \"basefont\",\n \"bdi\",\n \"bdo\",\n \"bgsound\",\n \"big\",\n \"blink\",\n \"blockquote\",\n \"body\",\n \"br\",\n \"button\",\n \"canvas\",\n \"caption\",\n \"center\",\n \"cite\",\n \"code\",\n \"col\",\n \"colgroup\",\n \"content\",\n \"data\",\n \"datalist\",\n \"dd\",\n \"del\",\n \"details\",\n \"dfn\",\n \"dialog\",\n \"dir\",\n \"div\",\n \"dl\",\n \"dt\",\n \"em\",\n \"embed\",\n \"fieldset\",\n \"figcaption\",\n \"figure\",\n \"font\",\n \"footer\",\n \"form\",\n \"frame\",\n \"frameset\",\n \"head\",\n \"header\",\n \"hgroup\",\n \"hr\",\n \"html\",\n \"i\",\n \"iframe\",\n \"image\",\n \"img\",\n \"input\",\n \"ins\",\n \"kbd\",\n \"keygen\",\n \"label\",\n \"legend\",\n \"li\",\n \"link\",\n \"main\",\n \"map\",\n \"mark\",\n \"marquee\",\n \"menu\",\n \"menuitem\",\n \"meta\",\n \"meter\",\n \"nav\",\n \"nobr\",\n \"noembed\",\n \"noframes\",\n \"noscript\",\n \"object\",\n \"ol\",\n \"optgroup\",\n \"option\",\n \"output\",\n \"p\",\n \"param\",\n \"picture\",\n \"plaintext\",\n \"portal\",\n \"pre\",\n \"progress\",\n \"q\",\n \"rb\",\n \"rp\",\n \"rt\",\n \"rtc\",\n \"ruby\",\n \"s\",\n \"samp\",\n \"script\",\n \"section\",\n \"select\",\n \"shadow\",\n \"slot\",\n \"small\",\n \"source\",\n \"spacer\",\n \"span\",\n \"strike\",\n \"strong\",\n \"style\",\n \"sub\",\n \"summary\",\n \"sup\",\n \"table\",\n \"tbody\",\n \"td\",\n \"template\",\n \"textarea\",\n \"tfoot\",\n \"th\",\n \"thead\",\n \"time\",\n \"title\",\n \"tr\",\n \"track\",\n \"tt\",\n \"u\",\n \"ul\",\n \"var\",\n \"video\",\n \"wbr\",\n \"xmp\",\n \"input\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\"\n]);\n\nfunction reconcileArrays(parentNode, a, b) {\n let bLength = b.length,\n aEnd = a.length,\n bEnd = bLength,\n aStart = 0,\n bStart = 0,\n after = a[aEnd - 1].nextSibling,\n map = null;\n while (aStart < aEnd || bStart < bEnd) {\n if (a[aStart] === b[bStart]) {\n aStart++;\n bStart++;\n continue;\n }\n while (a[aEnd - 1] === b[bEnd - 1]) {\n aEnd--;\n bEnd--;\n }\n if (aEnd === aStart) {\n const node = bEnd < bLength ? (bStart ? b[bStart - 1].nextSibling : b[bEnd - bStart]) : after;\n while (bStart < bEnd) parentNode.insertBefore(b[bStart++], node);\n } else if (bEnd === bStart) {\n while (aStart < aEnd) {\n if (!map || !map.has(a[aStart])) a[aStart].remove();\n aStart++;\n }\n } else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) {\n const node = a[--aEnd].nextSibling;\n parentNode.insertBefore(b[bStart++], a[aStart++].nextSibling);\n parentNode.insertBefore(b[--bEnd], node);\n a[aEnd] = b[bEnd];\n } else {\n if (!map) {\n map = new Map();\n let i = bStart;\n while (i < bEnd) map.set(b[i], i++);\n }\n const index = map.get(a[aStart]);\n if (index != null) {\n if (bStart < index && index < bEnd) {\n let i = aStart,\n sequence = 1,\n t;\n while (++i < aEnd && i < bEnd) {\n if ((t = map.get(a[i])) == null || t !== index + sequence) break;\n sequence++;\n }\n if (sequence > index - bStart) {\n const node = a[aStart];\n while (bStart < index) parentNode.insertBefore(b[bStart++], node);\n } else parentNode.replaceChild(b[bStart++], a[aStart++]);\n } else aStart++;\n } else a[aStart++].remove();\n }\n }\n}\n\nconst $$EVENTS = \"_$DX_DELEGATE\";\nfunction render(code, element, init, options = {}) {\n let disposer;\n createRoot(dispose => {\n disposer = dispose;\n element === document\n ? code()\n : insert(element, code(), element.firstChild ? null : undefined, init);\n }, options.owner);\n return () => {\n disposer();\n element.textContent = \"\";\n };\n}\nfunction template(html, isImportNode, isSVG) {\n let node;\n const create = () => {\n const t = document.createElement(\"template\");\n t.innerHTML = html;\n return isSVG ? t.content.firstChild.firstChild : t.content.firstChild;\n };\n const fn = isImportNode\n ? () => untrack(() => document.importNode(node || (node = create()), true))\n : () => (node || (node = create())).cloneNode(true);\n fn.cloneNode = fn;\n return fn;\n}\nfunction delegateEvents(eventNames, document = window.document) {\n const e = document[$$EVENTS] || (document[$$EVENTS] = new Set());\n for (let i = 0, l = eventNames.length; i < l; i++) {\n const name = eventNames[i];\n if (!e.has(name)) {\n e.add(name);\n document.addEventListener(name, eventHandler);\n }\n }\n}\nfunction clearDelegatedEvents(document = window.document) {\n if (document[$$EVENTS]) {\n for (let name of document[$$EVENTS].keys()) document.removeEventListener(name, eventHandler);\n delete document[$$EVENTS];\n }\n}\nfunction setProperty(node, name, value) {\n if (isHydrating(node)) return;\n node[name] = value;\n}\nfunction setAttribute(node, name, value) {\n if (isHydrating(node)) return;\n if (value == null) node.removeAttribute(name);\n else node.setAttribute(name, value);\n}\nfunction setAttributeNS(node, namespace, name, value) {\n if (isHydrating(node)) return;\n if (value == null) node.removeAttributeNS(namespace, name);\n else node.setAttributeNS(namespace, name, value);\n}\nfunction setBoolAttribute(node, name, value) {\n if (isHydrating(node)) return;\n value ? node.setAttribute(name, \"\") : node.removeAttribute(name);\n}\nfunction className(node, value) {\n if (isHydrating(node)) return;\n if (value == null) node.removeAttribute(\"class\");\n else node.className = value;\n}\nfunction addEventListener(node, name, handler, delegate) {\n if (delegate) {\n if (Array.isArray(handler)) {\n node[`$$${name}`] = handler[0];\n node[`$$${name}Data`] = handler[1];\n } else node[`$$${name}`] = handler;\n } else if (Array.isArray(handler)) {\n const handlerFn = handler[0];\n node.addEventListener(name, (handler[0] = e => handlerFn.call(node, handler[1], e)));\n } else node.addEventListener(name, handler, typeof handler !== \"function\" && handler);\n}\nfunction classList(node, value, prev = {}) {\n const classKeys = Object.keys(value || {}),\n prevKeys = Object.keys(prev);\n let i, len;\n for (i = 0, len = prevKeys.length; i < len; i++) {\n const key = prevKeys[i];\n if (!key || key === \"undefined\" || value[key]) continue;\n toggleClassKey(node, key, false);\n delete prev[key];\n }\n for (i = 0, len = classKeys.length; i < len; i++) {\n const key = classKeys[i],\n classValue = !!value[key];\n if (!key || key === \"undefined\" || prev[key] === classValue || !classValue) continue;\n toggleClassKey(node, key, true);\n prev[key] = classValue;\n }\n return prev;\n}\nfunction style(node, value, prev) {\n if (!value) return prev ? setAttribute(node, \"style\") : value;\n const nodeStyle = node.style;\n if (typeof value === \"string\") return (nodeStyle.cssText = value);\n typeof prev === \"string\" && (nodeStyle.cssText = prev = undefined);\n prev || (prev = {});\n value || (value = {});\n let v, s;\n for (s in prev) {\n value[s] == null && nodeStyle.removeProperty(s);\n delete prev[s];\n }\n for (s in value) {\n v = value[s];\n if (v !== prev[s]) {\n nodeStyle.setProperty(s, v);\n prev[s] = v;\n }\n }\n return prev;\n}\nfunction spread(node, props = {}, isSVG, skipChildren) {\n const prevProps = {};\n if (!skipChildren) {\n createRenderEffect(\n () => (prevProps.children = insertExpression(node, props.children, prevProps.children))\n );\n }\n createRenderEffect(() => typeof props.ref === \"function\" && use(props.ref, node));\n createRenderEffect(() => assign(node, props, isSVG, true, prevProps, true));\n return prevProps;\n}\nfunction dynamicProperty(props, key) {\n const src = props[key];\n Object.defineProperty(props, key, {\n get() {\n return src();\n },\n enumerable: true\n });\n return props;\n}\nfunction use(fn, element, arg) {\n return untrack(() => fn(element, arg));\n}\nfunction insert(parent, accessor, marker, initial) {\n if (marker !== undefined && !initial) initial = [];\n if (typeof accessor !== \"function\") return insertExpression(parent, accessor, initial, marker);\n createRenderEffect(current => insertExpression(parent, accessor(), current, marker), initial);\n}\nfunction assign(node, props, isSVG, skipChildren, prevProps = {}, skipRef = false) {\n props || (props = {});\n for (const prop in prevProps) {\n if (!(prop in props)) {\n if (prop === \"children\") continue;\n prevProps[prop] = assignProp(node, prop, null, prevProps[prop], isSVG, skipRef, props);\n }\n }\n for (const prop in props) {\n if (prop === \"children\") {\n if (!skipChildren) insertExpression(node, props.children);\n continue;\n }\n const value = props[prop];\n prevProps[prop] = assignProp(node, prop, value, prevProps[prop], isSVG, skipRef, props);\n }\n}\nfunction hydrate$1(code, element, options = {}) {\n if (globalThis._$HY.done) return render(code, element, [...element.childNodes], options);\n sharedConfig.completed = globalThis._$HY.completed;\n sharedConfig.events = globalThis._$HY.events;\n sharedConfig.load = id => globalThis._$HY.r[id];\n sharedConfig.has = id => id in globalThis._$HY.r;\n sharedConfig.gather = root => gatherHydratable(element, root);\n sharedConfig.registry = new Map();\n sharedConfig.context = {\n id: options.renderId || \"\",\n count: 0\n };\n try {\n gatherHydratable(element, options.renderId);\n return render(code, element, [...element.childNodes], options);\n } finally {\n sharedConfig.context = null;\n }\n}\nfunction getNextElement(template) {\n let node,\n key,\n hydrating = isHydrating();\n if (!hydrating || !(node = sharedConfig.registry.get((key = getHydrationKey())))) {\n return template();\n }\n if (sharedConfig.completed) sharedConfig.completed.add(node);\n sharedConfig.registry.delete(key);\n return node;\n}\nfunction getNextMatch(el, nodeName) {\n while (el && el.localName !== nodeName) el = el.nextSibling;\n return el;\n}\nfunction getNextMarker(start) {\n let end = start,\n count = 0,\n current = [];\n if (isHydrating(start)) {\n while (end) {\n if (end.nodeType === 8) {\n const v = end.nodeValue;\n if (v === \"$\") count++;\n else if (v === \"/\") {\n if (count === 0) return [end, current];\n count--;\n }\n }\n current.push(end);\n end = end.nextSibling;\n }\n }\n return [end, current];\n}\nfunction runHydrationEvents() {\n if (sharedConfig.events && !sharedConfig.events.queued) {\n queueMicrotask(() => {\n const { completed, events } = sharedConfig;\n if (!events) return;\n events.queued = false;\n while (events.length) {\n const [el, e] = events[0];\n if (!completed.has(el)) return;\n events.shift();\n eventHandler(e);\n }\n if (sharedConfig.done) {\n sharedConfig.events = _$HY.events = null;\n sharedConfig.completed = _$HY.completed = null;\n }\n });\n sharedConfig.events.queued = true;\n }\n}\nfunction isHydrating(node) {\n return !!sharedConfig.context && !sharedConfig.done && (!node || node.isConnected);\n}\nfunction toPropertyName(name) {\n return name.toLowerCase().replace(/-([a-z])/g, (_, w) => w.toUpperCase());\n}\nfunction toggleClassKey(node, key, value) {\n const classNames = key.trim().split(/\\s+/);\n for (let i = 0, nameLen = classNames.length; i < nameLen; i++)\n node.classList.toggle(classNames[i], value);\n}\nfunction assignProp(node, prop, value, prev, isSVG, skipRef, props) {\n let isCE, isProp, isChildProp, propAlias, forceProp;\n if (prop === \"style\") return style(node, value, prev);\n if (prop === \"classList\") return classList(node, value, prev);\n if (value === prev) return prev;\n if (prop === \"ref\") {\n if (!skipRef) value(node);\n } else if (prop.slice(0, 3) === \"on:\") {\n const e = prop.slice(3);\n prev && node.removeEventListener(e, prev, typeof prev !== \"function\" && prev);\n value && node.addEventListener(e, value, typeof value !== \"function\" && value);\n } else if (prop.slice(0, 10) === \"oncapture:\") {\n const e = prop.slice(10);\n prev && node.removeEventListener(e, prev, true);\n value && node.addEventListener(e, value, true);\n } else if (prop.slice(0, 2) === \"on\") {\n const name = prop.slice(2).toLowerCase();\n const delegate = DelegatedEvents.has(name);\n if (!delegate && prev) {\n const h = Array.isArray(prev) ? prev[0] : prev;\n node.removeEventListener(name, h);\n }\n if (delegate || value) {\n addEventListener(node, name, value, delegate);\n delegate && delegateEvents([name]);\n }\n } else if (prop.slice(0, 5) === \"attr:\") {\n setAttribute(node, prop.slice(5), value);\n } else if (prop.slice(0, 5) === \"bool:\") {\n setBoolAttribute(node, prop.slice(5), value);\n } else if (\n (forceProp = prop.slice(0, 5) === \"prop:\") ||\n (isChildProp = ChildProperties.has(prop)) ||\n (!isSVG &&\n ((propAlias = getPropAlias(prop, node.tagName)) || (isProp = Properties.has(prop)))) ||\n (isCE = node.nodeName.includes(\"-\") || \"is\" in props)\n ) {\n if (forceProp) {\n prop = prop.slice(5);\n isProp = true;\n } else if (isHydrating(node)) return value;\n if (prop === \"class\" || prop === \"className\") className(node, value);\n else if (isCE && !isProp && !isChildProp) node[toPropertyName(prop)] = value;\n else node[propAlias || prop] = value;\n } else {\n const ns = isSVG && prop.indexOf(\":\") > -1 && SVGNamespace[prop.split(\":\")[0]];\n if (ns) setAttributeNS(node, ns, prop, value);\n else setAttribute(node, Aliases[prop] || prop, value);\n }\n return value;\n}\nfunction eventHandler(e) {\n if (sharedConfig.registry && sharedConfig.events) {\n if (sharedConfig.events.find(([el, ev]) => ev === e)) return;\n }\n let node = e.target;\n const key = `$$${e.type}`;\n const oriTarget = e.target;\n const oriCurrentTarget = e.currentTarget;\n const retarget = value =>\n Object.defineProperty(e, \"target\", {\n configurable: true,\n value\n });\n const handleNode = () => {\n const handler = node[key];\n if (handler && !node.disabled) {\n const data = node[`${key}Data`];\n data !== undefined ? handler.call(node, data, e) : handler.call(node, e);\n if (e.cancelBubble) return;\n }\n node.host &&\n typeof node.host !== \"string\" &&\n !node.host._$host &&\n node.contains(e.target) &&\n retarget(node.host);\n return true;\n };\n const walkUpTree = () => {\n while (handleNode() && (node = node._$host || node.parentNode || node.host));\n };\n Object.defineProperty(e, \"currentTarget\", {\n configurable: true,\n get() {\n return node || document;\n }\n });\n if (sharedConfig.registry && !sharedConfig.done) sharedConfig.done = _$HY.done = true;\n if (e.composedPath) {\n const path = e.composedPath();\n retarget(path[0]);\n for (let i = 0; i < path.length - 2; i++) {\n node = path[i];\n if (!handleNode()) break;\n if (node._$host) {\n node = node._$host;\n walkUpTree();\n break;\n }\n if (node.parentNode === oriCurrentTarget) {\n break;\n }\n }\n } else walkUpTree();\n retarget(oriTarget);\n}\nfunction insertExpression(parent, value, current, marker, unwrapArray) {\n const hydrating = isHydrating(parent);\n if (hydrating) {\n !current && (current = [...parent.childNodes]);\n let cleaned = [];\n for (let i = 0; i < current.length; i++) {\n const node = current[i];\n if (node.nodeType === 8 && node.data.slice(0, 2) === \"!$\") node.remove();\n else cleaned.push(node);\n }\n current = cleaned;\n }\n while (typeof current === \"function\") current = current();\n if (value === current) return current;\n const t = typeof value,\n multi = marker !== undefined;\n parent = (multi && current[0] && current[0].parentNode) || parent;\n if (t === \"string\" || t === \"number\") {\n if (hydrating) return current;\n if (t === \"number\") {\n value = value.toString();\n if (value === current) return current;\n }\n if (multi) {\n let node = current[0];\n if (node && node.nodeType === 3) {\n node.data !== value && (node.data = value);\n } else node = document.createTextNode(value);\n current = cleanChildren(parent, current, marker, node);\n } else {\n if (current !== \"\" && typeof current === \"string\") {\n current = parent.firstChild.data = value;\n } else current = parent.textContent = value;\n }\n } else if (value == null || t === \"boolean\") {\n if (hydrating) return current;\n current = cleanChildren(parent, current, marker);\n } else if (t === \"function\") {\n createRenderEffect(() => {\n let v = value();\n while (typeof v === \"function\") v = v();\n current = insertExpression(parent, v, current, marker);\n });\n return () => current;\n } else if (Array.isArray(value)) {\n const array = [];\n const currentArray = current && Array.isArray(current);\n if (normalizeIncomingArray(array, value, current, unwrapArray)) {\n createRenderEffect(() => (current = insertExpression(parent, array, current, marker, true)));\n return () => current;\n }\n if (hydrating) {\n if (!array.length) return current;\n if (marker === undefined) return (current = [...parent.childNodes]);\n let node = array[0];\n if (node.parentNode !== parent) return current;\n const nodes = [node];\n while ((node = node.nextSibling) !== marker) nodes.push(node);\n return (current = nodes);\n }\n if (array.length === 0) {\n current = cleanChildren(parent, current, marker);\n if (multi) return current;\n } else if (currentArray) {\n if (current.length === 0) {\n appendNodes(parent, array, marker);\n } else reconcileArrays(parent, current, array);\n } else {\n current && cleanChildren(parent);\n appendNodes(parent, array);\n }\n current = array;\n } else if (value.nodeType) {\n if (hydrating && value.parentNode) return (current = multi ? [value] : value);\n if (Array.isArray(current)) {\n if (multi) return (current = cleanChildren(parent, current, marker, value));\n cleanChildren(parent, current, null, value);\n } else if (current == null || current === \"\" || !parent.firstChild) {\n parent.appendChild(value);\n } else parent.replaceChild(value, parent.firstChild);\n current = value;\n } else;\n return current;\n}\nfunction normalizeIncomingArray(normalized, array, current, unwrap) {\n let dynamic = false;\n for (let i = 0, len = array.length; i < len; i++) {\n let item = array[i],\n prev = current && current[normalized.length],\n t;\n if (item == null || item === true || item === false);\n else if ((t = typeof item) === \"object\" && item.nodeType) {\n normalized.push(item);\n } else if (Array.isArray(item)) {\n dynamic = normalizeIncomingArray(normalized, item, prev) || dynamic;\n } else if (t === \"function\") {\n if (unwrap) {\n while (typeof item === \"function\") item = item();\n dynamic =\n normalizeIncomingArray(\n normalized,\n Array.isArray(item) ? item : [item],\n Array.isArray(prev) ? prev : [prev]\n ) || dynamic;\n } else {\n normalized.push(item);\n dynamic = true;\n }\n } else {\n const value = String(item);\n if (prev && prev.nodeType === 3 && prev.data === value) normalized.push(prev);\n else normalized.push(document.createTextNode(value));\n }\n }\n return dynamic;\n}\nfunction appendNodes(parent, array, marker = null) {\n for (let i = 0, len = array.length; i < len; i++) parent.insertBefore(array[i], marker);\n}\nfunction cleanChildren(parent, current, marker, replacement) {\n if (marker === undefined) return (parent.textContent = \"\");\n const node = replacement || document.createTextNode(\"\");\n if (current.length) {\n let inserted = false;\n for (let i = current.length - 1; i >= 0; i--) {\n const el = current[i];\n if (node !== el) {\n const isParent = el.parentNode === parent;\n if (!inserted && !i)\n isParent ? parent.replaceChild(node, el) : parent.insertBefore(node, marker);\n else isParent && el.remove();\n } else inserted = true;\n }\n } else parent.insertBefore(node, marker);\n return [node];\n}\nfunction gatherHydratable(element, root) {\n const templates = element.querySelectorAll(`*[data-hk]`);\n for (let i = 0; i < templates.length; i++) {\n const node = templates[i];\n const key = node.getAttribute(\"data-hk\");\n if ((!root || key.startsWith(root)) && !sharedConfig.registry.has(key))\n sharedConfig.registry.set(key, node);\n }\n}\nfunction getHydrationKey() {\n return sharedConfig.getNextContextId();\n}\nfunction NoHydration(props) {\n return sharedConfig.context ? undefined : props.children;\n}\nfunction Hydration(props) {\n return props.children;\n}\nconst voidFn = () => undefined;\nconst RequestContext = Symbol();\nfunction innerHTML(parent, content) {\n !sharedConfig.context && (parent.innerHTML = content);\n}\n\nfunction throwInBrowser(func) {\n const err = new Error(`${func.name} is not supported in the browser, returning undefined`);\n console.error(err);\n}\nfunction renderToString(fn, options) {\n throwInBrowser(renderToString);\n}\nfunction renderToStringAsync(fn, options) {\n throwInBrowser(renderToStringAsync);\n}\nfunction renderToStream(fn, options) {\n throwInBrowser(renderToStream);\n}\nfunction ssr(template, ...nodes) {}\nfunction ssrElement(name, props, children, needsId) {}\nfunction ssrClassList(value) {}\nfunction ssrStyle(value) {}\nfunction ssrAttribute(key, value) {}\nfunction ssrHydrationKey() {}\nfunction resolveSSRNode(node) {}\nfunction escape(html) {}\nfunction ssrSpread(props, isSVG, skipChildren) {}\n\nconst isServer = false;\nconst isDev = false;\nconst SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\nfunction createElement(tagName, isSVG = false) {\n return isSVG ? document.createElementNS(SVG_NAMESPACE, tagName) : document.createElement(tagName);\n}\nconst hydrate = (...args) => {\n enableHydration();\n return hydrate$1(...args);\n};\nfunction Portal(props) {\n const { useShadow } = props,\n marker = document.createTextNode(\"\"),\n mount = () => props.mount || document.body,\n owner = getOwner();\n let content;\n let hydrating = !!sharedConfig.context;\n createEffect(\n () => {\n if (hydrating) getOwner().user = hydrating = false;\n content || (content = runWithOwner(owner, () => createMemo(() => props.children)));\n const el = mount();\n if (el instanceof HTMLHeadElement) {\n const [clean, setClean] = createSignal(false);\n const cleanup = () => setClean(true);\n createRoot(dispose => insert(el, () => (!clean() ? content() : dispose()), null));\n onCleanup(cleanup);\n } else {\n const container = createElement(props.isSVG ? \"g\" : \"div\", props.isSVG),\n renderRoot =\n useShadow && container.attachShadow\n ? container.attachShadow({\n mode: \"open\"\n })\n : container;\n Object.defineProperty(container, \"_$host\", {\n get() {\n return marker.parentNode;\n },\n configurable: true\n });\n insert(renderRoot, content);\n el.appendChild(container);\n props.ref && props.ref(container);\n onCleanup(() => el.removeChild(container));\n }\n },\n undefined,\n {\n render: !hydrating\n }\n );\n return marker;\n}\nfunction Dynamic(props) {\n const [p, others] = splitProps(props, [\"component\"]);\n const cached = createMemo(() => p.component);\n return createMemo(() => {\n const component = cached();\n switch (typeof component) {\n case \"function\":\n return untrack(() => component(others));\n case \"string\":\n const isSvg = SVGElements.has(component);\n const el = sharedConfig.context ? getNextElement() : createElement(component, isSvg);\n spread(el, others, isSvg);\n return el;\n }\n });\n}\n\nexport {\n Aliases,\n voidFn as Assets,\n ChildProperties,\n DOMElements,\n DelegatedEvents,\n Dynamic,\n Hydration,\n voidFn as HydrationScript,\n NoHydration,\n Portal,\n Properties,\n RequestContext,\n SVGElements,\n SVGNamespace,\n addEventListener,\n assign,\n classList,\n className,\n clearDelegatedEvents,\n delegateEvents,\n dynamicProperty,\n escape,\n voidFn as generateHydrationScript,\n voidFn as getAssets,\n getHydrationKey,\n getNextElement,\n getNextMarker,\n getNextMatch,\n getPropAlias,\n voidFn as getRequestEvent,\n hydrate,\n innerHTML,\n insert,\n isDev,\n isServer,\n render,\n renderToStream,\n renderToString,\n renderToStringAsync,\n resolveSSRNode,\n runHydrationEvents,\n setAttribute,\n setAttributeNS,\n setBoolAttribute,\n setProperty,\n spread,\n ssr,\n ssrAttribute,\n ssrClassList,\n ssrElement,\n ssrHydrationKey,\n ssrSpread,\n ssrStyle,\n style,\n template,\n use,\n voidFn as useAssets\n};\n","export const CheckoutPopupStyles = {\n container: {\n top: '50px',\n left: 'calc(100% - 700px)',\n margin: '0',\n width: '640px',\n 'max-height': '80vh',\n padding: '2px 5px 10px 5px',\n 'background-color': 'white',\n border: 'none',\n 'border-radius': '24px',\n 'box-shadow': '0px 4px 44px rgba(0, 0, 0, 0.25)',\n 'font-family': 'Arial',\n 'line-height': '1',\n 'vertical-align': 'baseline',\n 'box-sizing': 'border-box',\n color: 'rgb(34, 34, 34)',\n '@media (max-width: 600px), (max-height: 480px)': {\n display: 'none !important',\n },\n } as const,\n\n scroller: {\n height: '100%',\n 'overflow-x': 'hidden',\n 'overlfow-y': 'auto',\n position: 'relative',\n padding: '0px 15px',\n } as const,\n\n mainContainer: {\n } as const,\n\n header: {\n display: 'flex',\n 'flex-direction': 'column-reverse',\n 'align-items': 'center',\n 'margin-bottom': '10px',\n } as const,\n\n headingGrow: {\n flex: '1',\n 'font-size': '24px',\n 'font-weight': '700',\n 'margin-top': '5px',\n 'margin-bottom': '0px',\n } as const,\n\n closeButton: {\n background: 'none',\n border: 'none',\n padding: '4px 8px',\n 'align-self': 'flex-end',\n color: '#666464',\n 'font-size': '38px',\n cursor: 'pointer',\n 'line-height': '1',\n } as const,\n\n activateAndCloseLink: {\n color: '#707070',\n 'align-self': 'flex-end',\n 'margin-top': '5px',\n 'max-width': '40%',\n } as const,\n\n activateAndCloseLinkSelected: {\n color: '#707070',\n cursor: 'default',\n 'pointer-events': 'none',\n 'text-decoration': 'none',\n } as const,\n\n subheading: {\n 'font-size': '18px',\n 'font-weight': '400',\n 'margin-top': '0px',\n 'margin-bottom': '0px',\n } as const,\n\n charityGrid: {\n display: 'flex',\n gap: '10px',\n width: '100%',\n 'margin-top': '20px',\n 'margin-bottom': '20px',\n 'flex-wrap': 'wrap',\n 'justify-content': 'space-between',\n } as const,\n\n charityButton: {\n width: '30%',\n position: 'relative',\n display: 'flex',\n 'flex-direction': 'column',\n 'align-items': 'center',\n 'justify-content': 'space-between',\n background: 'none',\n border: '1px solid #ccc',\n 'border-radius': '5px',\n padding: '5px',\n gap: '5px',\n 'text-align': 'center',\n 'font-size': '14px',\n cursor: 'pointer',\n transition: 'background-color 0.2s ease',\n } as const,\n\n charityButtonDisabled: {\n\n color: 'white',\n 'background-color': 'lightgray',\n cursor: 'default',\n 'pointer-events': 'none',\n\n } as const,\n\n charityLogo: {\n 'max-width': '120px',\n 'max-height': '70px',\n 'margin-bottom': '5px',\n 'object-fit': 'contain',\n } as const,\n\n selectButton: {\n 'background-color': '#0052FF',\n cursor: 'pointer',\n 'border-radius': '32px',\n padding: '8px',\n color: 'white',\n 'min-width': '100px',\n border: '0',\n 'font-weight': '600',\n width: '120px',\n } as const,\n\n goodbyeOptions: {\n display: 'flex',\n 'flex-direction': 'column',\n gap: '10px',\n width: '100%',\n 'color-scheme': 'light',\n } as const,\n\n goodbyeItem: {\n display: 'flex',\n 'align-items': 'center',\n gap: '5px',\n border: '1px solid #ddd',\n padding: '15px',\n 'border-radius': '5px',\n 'font-weight': '600',\n cursor: 'pointer',\n 'margin-bottom': '8px',\n } as const,\n\n autoClosingLabel: {\n 'text-align': 'right',\n } as const,\n\n backButton: {\n background: 'none',\n border: 'none',\n color: 'blue',\n 'text-decoration': 'underline',\n padding: '0',\n cursor: 'pointer',\n 'margin-bottom': '15px',\n } as const,\n\n footerLinks: {\n display: 'flex',\n 'justify-content': 'space-between',\n margin: '20px 0px 10px 0px',\n 'font-size': '14px',\n } as const,\n\n supportedBy: {\n margin: '5px 0px 5px 0px',\n 'font-size': '14px',\n 'text-align': 'center',\n } as const,\n\n footerLink: {\n color: '#666464',\n 'text-decoration': 'underline',\n } as const,\n\n openDetailsButton: {\n color: 'rgb(102, 100, 100)',\n 'text-decoration': 'underline',\n margin: '0',\n cursor: 'pointer',\n },\n offerDetailsContainer: {\n width: '100%',\n 'background-color': '#f2f2f2',\n border: '1px solid black',\n 'border-radius': '10px',\n 'border-top': '1px solid #bbb7b7',\n 'margin-top': '10px',\n 'margin-bottom': '20px',\n 'box-sizing': 'border-box',\n } as const,\n\n offerDetailsContent: {\n padding: '0 5px 0 10px',\n width: '100%',\n 'font-size': '12px',\n 'box-sizing': 'border-box',\n } as const,\n\n rateItem: {\n display: 'grid',\n 'grid-template-columns': '4fr 1fr',\n 'padding-right': '15px',\n 'padding-bottom': '5px',\n } as const,\n rateName: {\n color: '#000',\n 'margin-bottom': '4px',\n } as const,\n rate: {\n 'font-size': '14px',\n color: '#555',\n 'text-align': 'right',\n } as const,\n};\n","import { formatOffer } from '../../shared/vendors/wildfire/formatOffer';\r\n\r\n/**\r\n * MaxRate calculation logic for user display only\r\n *\r\n * @param kind 'PERCENTAGE' | 'FLAT'\r\n * @param amountStr\r\n * @returns\r\n */\r\nexport const calculateMaxRate = (kind: string | undefined, amountStr: string) => {\r\n let num = parseFloat(amountStr);\r\n if (kind === 'FLAT') num *= 0.75;\r\n return formatOffer(kind, num.toString());\r\n};\r\n","/**\n * Generic logic for formatting offer amounts\n * @param kind 'PERCENTAGE' | 'FLAT'\n * @param amountStr\n * @returns\n */\nexport const formatOffer = (kind: string | undefined, amountStr: string) => {\n let num = parseFloat(amountStr);\n if (num < 1) num = 1;\n num = Math.floor(num);\n const result = kind === 'PERCENTAGE' ? `${num}%` : `$${num}`;\n\n return result;\n};\n","import { WildfireActiveDomain } from '../../../shared/vendors/wildfire/types';\nimport { calculateMaxRate } from '../../lib/calculateMaxRate';\n\nconst formatTitle = (title: string, activeDomain: WildfireActiveDomain) => {\n const formatted = title.replace('{0}', calculateMaxRate(\n activeDomain.Merchant.MaxRate?.Kind,\n activeDomain.Merchant.MaxRate?.Amount ?? '0',\n ));\n\n return formatted;\n};\n\nexport function OfferTitle(props: { title: string, activeDomain: WildfireActiveDomain }) {\n return <span innerHTML={formatTitle(props.title, props.activeDomain)} />;\n}\n","import { RateKindMap, BoostedOffer, WildfireRate } from '../../../shared/vendors/wildfire/types';\r\n\r\nexport const parseRate = (\r\n commissionRate: WildfireRate<keyof RateKindMap>,\r\n displaySplit = 1,\r\n maximumFractionDigits = 1,\r\n customAmount?: string,\r\n): string => {\r\n const boostedOffer: BoostedOffer | null = commissionRate.BoostedOffer ?? null;\r\n let amount = parseFloat(commissionRate?.Amount ?? '');\r\n if (customAmount) {\r\n amount = parseFloat(customAmount);\r\n } else if (boostedOffer?.EndDate && new Date(boostedOffer.EndDate) < new Date()) {\r\n amount = parseFloat(boostedOffer.OriginalMaxRate);\r\n }\r\n if (Number.isNaN(amount)) return '';\r\n const splitAmount = amount * displaySplit;\r\n if (commissionRate?.Kind === 'PERCENTAGE') {\r\n // TODO: Change this when going international\r\n return `${splitAmount.toLocaleString('en-US', {\r\n minimumFractionDigits: 0,\r\n maximumFractionDigits,\r\n })}%`;\r\n }\r\n if (commissionRate?.Kind === 'FLAT') {\r\n // TODO: Change this when going international\r\n return splitAmount.toLocaleString('en-US', {\r\n style: 'currency',\r\n currency: commissionRate.Currency,\r\n });\r\n }\r\n return '';\r\n};\r\n","import { createContext, Accessor } from 'solid-js';\n\nexport interface Charity {\n ein: string;\n tpi: string;\n title: string;\n order: number;\n logo: string;\n decorator?: string;\n decoratorLeftStyle?: string;\n decoratorRightStyle?: string;\n}\n\nexport type TranslationProviderInterface = (key: string) => string;\nexport type CharityProviderInterface = () => Charity[];\n\nexport interface ContentProviderInterface {\n translate: TranslationProviderInterface;\n getAllCharities: CharityProviderInterface;\n}\n\nexport const ContentContext = createContext<Accessor<ContentProviderInterface | undefined>>(\n () => ({\n translate: (_: string) => '',\n getAllCharities: () => [],\n }),\n);\n\n// Keep the old context for backward compatibility\nexport const TranslationContext = ContentContext;\n","// src/context/translation/useT.ts\r\nimport { useContext } from 'solid-js';\r\nimport { TranslationContext } from '../../context/translation/translationContext';\r\n\r\nexport const useT = () => {\r\n const getContentAccessor = useContext(TranslationContext);\r\n const contentProvider = getContentAccessor();\r\n\r\n if (!contentProvider) {\r\n throw new Error('Content provider context is undefined');\r\n }\r\n\r\n // Access the translate method from the ContentProviderInterface\r\n return (key: string) => contentProvider.translate(key);\r\n};\n","export class StringUtils {\n /**\n * Allows formating a template string with args\n * @param template the temlate string. i.e: 'My name is {0}. Good {1}.'\n * @param args the args to be replaced\n * @returns a string with the args replaced. i.e: 'My name is John. Good morning.'\n */\n static formatMessage(template: string, ...args: (string | number | boolean | null | undefined)[]): string {\n return template.replace(/{(\\d+)}/g, (_, index) => {\n const i = Number(index);\n return args[i] !== undefined ? String(args[i]) : `{${i}}`;\n });\n }\n}\n","import { Show } from 'solid-js';\r\nimport { WildfireMerchantRateDetail, RateKindMap } from '../../../shared/vendors/wildfire/types';\r\nimport { CheckoutPopupStyles as styles } from '../CheckoutPopup.styles';\r\nimport { parseRate } from '../../lib/utils/parseRate';\r\nimport { useT } from '../../lib/hooks/useT';\r\nimport { StringUtils } from '../../../shared/utils/string-utils';\r\n\r\ninterface OfferDetailsProps {\r\n merchantName: string;\r\n extensionName: string;\r\n parsedMaxRate: string | null;\r\n termsUrl: string;\r\n merchantRateDetail: WildfireMerchantRateDetail<keyof RateKindMap>[] | null;\r\n onClose: () => void;\r\n}\r\n\r\nexport const OfferDetails = (props: OfferDetailsProps) => {\r\n const t = useT();\r\n return (\r\n <div style={styles.offerDetailsContainer}>\r\n <div class=\"gf-offer-details\" style={styles.offerDetailsContent} >\r\n <p><span innerHTML={t('offerDetails.intro')} /></p>\r\n <p><span innerHTML={t('offerDetails.eligible')} /></p>\r\n <p><span innerHTML={props.parsedMaxRate ? StringUtils.formatMessage(t('offerDetails.donationRatesWithValue'), props.parsedMaxRate) : StringUtils.formatMessage(t('offerDetails.donationRates'))} /></p>\r\n <Show when={!!props.merchantRateDetail?.length}>\r\n <div >\r\n {props.merchantRateDetail?.map((detail) => (\r\n <div class='gf-offer-details-rate-item' style={styles.rateItem}>\r\n <div style={styles.rateName}>{detail.Name || ''}</div>\r\n <div style={styles.rate}>{parseRate(detail)}</div>\r\n </div>\r\n ))}\r\n </div>\r\n </Show>\r\n <p><span innerHTML={t('offerDetails.donationAmounts')} /></p>\r\n <p><span innerHTML={t('offerDetails.donationTiming')} /></p>\r\n <p>\r\n <a style={styles.footerLink} href={props.termsUrl} target=\"_blank\" rel=\"noreferrer\">\r\n <span innerHTML={t('offerDetails.termsAndConditions')} />\r\n </a>\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n};\r\n","(function (global, factory) {\n if (typeof define === \"function\" && define.amd) {\n define(\"webextension-polyfill\", [\"module\"], factory);\n } else if (typeof exports !== \"undefined\") {\n factory(module);\n } else {\n var mod = {\n exports: {}\n };\n factory(mod);\n global.browser = mod.exports;\n }\n})(typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : this, function (module) {\n /* webextension-polyfill - v0.12.0 - Tue May 14 2024 18:01:29 */\n /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */\n /* vim: set sts=2 sw=2 et tw=80: */\n /* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n \"use strict\";\n\n if (!(globalThis.chrome && globalThis.chrome.runtime && globalThis.chrome.runtime.id)) {\n throw new Error(\"This script should only be loaded in a browser extension.\");\n }\n if (!(globalThis.browser && globalThis.browser.runtime && globalThis.browser.runtime.id)) {\n const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = \"The message port closed before a response was received.\";\n\n // Wrapping the bulk of this polyfill in a one-time-use function is a minor\n // optimization for Firefox. Since Spidermonkey does not fully parse the\n // contents of a function until the first time it's called, and since it will\n // never actually need to be called, this allows the polyfill to be included\n // in Firefox nearly for free.\n const wrapAPIs = extensionAPIs => {\n // NOTE: apiMetadata is associated to the content of the api-metadata.json file\n // at build time by replacing the following \"include\" with the content of the\n // JSON file.\n const apiMetadata = {\n \"alarms\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"clearAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"bookmarks\": {\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getChildren\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getRecent\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getSubTree\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTree\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"move\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeTree\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"browserAction\": {\n \"disable\": {\n \"minArgs\": 0,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"enable\": {\n \"minArgs\": 0,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"getBadgeBackgroundColor\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getBadgeText\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"openPopup\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"setBadgeBackgroundColor\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setBadgeText\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"setPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"browsingData\": {\n \"remove\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"removeCache\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeCookies\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeDownloads\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeFormData\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeHistory\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeLocalStorage\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removePasswords\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removePluginData\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"settings\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"commands\": {\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"contextMenus\": {\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"cookies\": {\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAllCookieStores\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"devtools\": {\n \"inspectedWindow\": {\n \"eval\": {\n \"minArgs\": 1,\n \"maxArgs\": 2,\n \"singleCallbackArg\": false\n }\n },\n \"panels\": {\n \"create\": {\n \"minArgs\": 3,\n \"maxArgs\": 3,\n \"singleCallbackArg\": true\n },\n \"elements\": {\n \"createSidebarPane\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n }\n }\n },\n \"downloads\": {\n \"cancel\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"download\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"erase\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getFileIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"open\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"pause\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeFile\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"resume\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"show\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"extension\": {\n \"isAllowedFileSchemeAccess\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"isAllowedIncognitoAccess\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"history\": {\n \"addUrl\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"deleteAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"deleteRange\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"deleteUrl\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getVisits\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"i18n\": {\n \"detectLanguage\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAcceptLanguages\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"identity\": {\n \"launchWebAuthFlow\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"idle\": {\n \"queryState\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"management\": {\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getSelf\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"setEnabled\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"uninstallSelf\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"notifications\": {\n \"clear\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getPermissionLevel\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"pageAction\": {\n \"getPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"hide\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"setPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"show\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"permissions\": {\n \"contains\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"request\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"runtime\": {\n \"getBackgroundPage\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getPlatformInfo\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"openOptionsPage\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"requestUpdateCheck\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"sendMessage\": {\n \"minArgs\": 1,\n \"maxArgs\": 3\n },\n \"sendNativeMessage\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"setUninstallURL\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"sessions\": {\n \"getDevices\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getRecentlyClosed\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"restore\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"storage\": {\n \"local\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"managed\": {\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"sync\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n }\n },\n \"tabs\": {\n \"captureVisibleTab\": {\n \"minArgs\": 0,\n \"maxArgs\": 2\n },\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"detectLanguage\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"discard\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"duplicate\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"executeScript\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getCurrent\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getZoom\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getZoomSettings\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"goBack\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"goForward\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"highlight\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"insertCSS\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"move\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"query\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"reload\": {\n \"minArgs\": 0,\n \"maxArgs\": 2\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeCSS\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"sendMessage\": {\n \"minArgs\": 2,\n \"maxArgs\": 3\n },\n \"setZoom\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"setZoomSettings\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"update\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n }\n },\n \"topSites\": {\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"webNavigation\": {\n \"getAllFrames\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getFrame\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"webRequest\": {\n \"handlerBehaviorChanged\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"windows\": {\n \"create\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getCurrent\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getLastFocused\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n }\n };\n if (Object.keys(apiMetadata).length === 0) {\n throw new Error(\"api-metadata.json has not been included in browser-polyfill\");\n }\n\n /**\n * A WeakMap subclass which creates and stores a value for any key which does\n * not exist when accessed, but behaves exactly as an ordinary WeakMap\n * otherwise.\n *\n * @param {function} createItem\n * A function which will be called in order to create the value for any\n * key which does not exist, the first time it is accessed. The\n * function receives, as its only argument, the key being created.\n */\n class DefaultWeakMap extends WeakMap {\n constructor(createItem, items = undefined) {\n super(items);\n this.createItem = createItem;\n }\n get(key) {\n if (!this.has(key)) {\n this.set(key, this.createItem(key));\n }\n return super.get(key);\n }\n }\n\n /**\n * Returns true if the given object is an object with a `then` method, and can\n * therefore be assumed to behave as a Promise.\n *\n * @param {*} value The value to test.\n * @returns {boolean} True if the value is thenable.\n */\n const isThenable = value => {\n return value && typeof value === \"object\" && typeof value.then === \"function\";\n };\n\n /**\n * Creates and returns a function which, when called, will resolve or reject\n * the given promise based on how it is called:\n *\n * - If, when called, `chrome.runtime.lastError` contains a non-null object,\n * the promise is rejected with that value.\n * - If the function is called with exactly one argument, the promise is\n * resolved to that value.\n * - Otherwise, the promise is resolved to an array containing all of the\n * function's arguments.\n *\n * @param {object} promise\n * An object containing the resolution and rejection functions of a\n * promise.\n * @param {function} promise.resolve\n * The promise's resolution function.\n * @param {function} promise.reject\n * The promise's rejection function.\n * @param {object} metadata\n * Metadata about the wrapped method which has created the callback.\n * @param {boolean} metadata.singleCallbackArg\n * Whether or not the promise is resolved with only the first\n * argument of the callback, alternatively an array of all the\n * callback arguments is resolved. By default, if the callback\n * function is invoked with only a single argument, that will be\n * resolved to the promise, while all arguments will be resolved as\n * an array if multiple are given.\n *\n * @returns {function}\n * The generated callback function.\n */\n const makeCallback = (promise, metadata) => {\n return (...callbackArgs) => {\n if (extensionAPIs.runtime.lastError) {\n promise.reject(new Error(extensionAPIs.runtime.lastError.message));\n } else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) {\n promise.resolve(callbackArgs[0]);\n } else {\n promise.resolve(callbackArgs);\n }\n };\n };\n const pluralizeArguments = numArgs => numArgs == 1 ? \"argument\" : \"arguments\";\n\n /**\n * Creates a wrapper function for a method with the given name and metadata.\n *\n * @param {string} name\n * The name of the method which is being wrapped.\n * @param {object} metadata\n * Metadata about the method being wrapped.\n * @param {integer} metadata.minArgs\n * The minimum number of arguments which must be passed to the\n * function. If called with fewer than this number of arguments, the\n * wrapper will raise an exception.\n * @param {integer} metadata.maxArgs\n * The maximum number of arguments which may be passed to the\n * function. If called with more than this number of arguments, the\n * wrapper will raise an exception.\n * @param {boolean} metadata.singleCallbackArg\n * Whether or not the promise is resolved with only the first\n * argument of the callback, alternatively an array of all the\n * callback arguments is resolved. By default, if the callback\n * function is invoked with only a single argument, that will be\n * resolved to the promise, while all arguments will be resolved as\n * an array if multiple are given.\n *\n * @returns {function(object, ...*)}\n * The generated wrapper function.\n */\n const wrapAsyncFunction = (name, metadata) => {\n return function asyncFunctionWrapper(target, ...args) {\n if (args.length < metadata.minArgs) {\n throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);\n }\n if (args.length > metadata.maxArgs) {\n throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);\n }\n return new Promise((resolve, reject) => {\n if (metadata.fallbackToNoCallback) {\n // This API method has currently no callback on Chrome, but it return a promise on Firefox,\n // and so the polyfill will try to call it with a callback first, and it will fallback\n // to not passing the callback if the first call fails.\n try {\n target[name](...args, makeCallback({\n resolve,\n reject\n }, metadata));\n } catch (cbError) {\n console.warn(`${name} API method doesn't seem to support the callback parameter, ` + \"falling back to call it without a callback: \", cbError);\n target[name](...args);\n\n // Update the API method metadata, so that the next API calls will not try to\n // use the unsupported callback anymore.\n metadata.fallbackToNoCallback = false;\n metadata.noCallback = true;\n resolve();\n }\n } else if (metadata.noCallback) {\n target[name](...args);\n resolve();\n } else {\n target[name](...args, makeCallback({\n resolve,\n reject\n }, metadata));\n }\n });\n };\n };\n\n /**\n * Wraps an existing method of the target object, so that calls to it are\n * intercepted by the given wrapper function. The wrapper function receives,\n * as its first argument, the original `target` object, followed by each of\n * the arguments passed to the original method.\n *\n * @param {object} target\n * The original target object that the wrapped method belongs to.\n * @param {function} method\n * The method being wrapped. This is used as the target of the Proxy\n * object which is created to wrap the method.\n * @param {function} wrapper\n * The wrapper function which is called in place of a direct invocation\n * of the wrapped method.\n *\n * @returns {Proxy<function>}\n * A Proxy object for the given method, which invokes the given wrapper\n * method in its place.\n */\n const wrapMethod = (target, method, wrapper) => {\n return new Proxy(method, {\n apply(targetMethod, thisObj, args) {\n return wrapper.call(thisObj, target, ...args);\n }\n });\n };\n let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);\n\n /**\n * Wraps an object in a Proxy which intercepts and wraps certain methods\n * based on the given `wrappers` and `metadata` objects.\n *\n * @param {object} target\n * The target object to wrap.\n *\n * @param {object} [wrappers = {}]\n * An object tree containing wrapper functions for special cases. Any\n * function present in this object tree is called in place of the\n * method in the same location in the `target` object tree. These\n * wrapper methods are invoked as described in {@see wrapMethod}.\n *\n * @param {object} [metadata = {}]\n * An object tree containing metadata used to automatically generate\n * Promise-based wrapper functions for asynchronous. Any function in\n * the `target` object tree which has a corresponding metadata object\n * in the same location in the `metadata` tree is replaced with an\n * automatically-generated wrapper function, as described in\n * {@see wrapAsyncFunction}\n *\n * @returns {Proxy<object>}\n */\n const wrapObject = (target, wrappers = {}, metadata = {}) => {\n let cache = Object.create(null);\n let handlers = {\n has(proxyTarget, prop) {\n return prop in target || prop in cache;\n },\n get(proxyTarget, prop, receiver) {\n if (prop in cache) {\n return cache[prop];\n }\n if (!(prop in target)) {\n return undefined;\n }\n let value = target[prop];\n if (typeof value === \"function\") {\n // This is a method on the underlying object. Check if we need to do\n // any wrapping.\n\n if (typeof wrappers[prop] === \"function\") {\n // We have a special-case wrapper for this method.\n value = wrapMethod(target, target[prop], wrappers[prop]);\n } else if (hasOwnProperty(metadata, prop)) {\n // This is an async method that we have metadata for. Create a\n // Promise wrapper for it.\n let wrapper = wrapAsyncFunction(prop, metadata[prop]);\n value = wrapMethod(target, target[prop], wrapper);\n } else {\n // This is a method that we don't know or care about. Return the\n // original method, bound to the underlying object.\n value = value.bind(target);\n }\n } else if (typeof value === \"object\" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) {\n // This is an object that we need to do some wrapping for the children\n // of. Create a sub-object wrapper for it with the appropriate child\n // metadata.\n value = wrapObject(value, wrappers[prop], metadata[prop]);\n } else if (hasOwnProperty(metadata, \"*\")) {\n // Wrap all properties in * namespace.\n value = wrapObject(value, wrappers[prop], metadata[\"*\"]);\n } else {\n // We don't need to do any wrapping for this property,\n // so just forward all access to the underlying object.\n Object.defineProperty(cache, prop, {\n configurable: true,\n enumerable: true,\n get() {\n return target[prop];\n },\n set(value) {\n target[prop] = value;\n }\n });\n return value;\n }\n cache[prop] = value;\n return value;\n },\n set(proxyTarget, prop, value, receiver) {\n if (prop in cache) {\n cache[prop] = value;\n } else {\n target[prop] = value;\n }\n return true;\n },\n defineProperty(proxyTarget, prop, desc) {\n return Reflect.defineProperty(cache, prop, desc);\n },\n deleteProperty(proxyTarget, prop) {\n return Reflect.deleteProperty(cache, prop);\n }\n };\n\n // Per contract of the Proxy API, the \"get\" proxy handler must return the\n // original value of the target if that value is declared read-only and\n // non-configurable. For this reason, we create an object with the\n // prototype set to `target` instead of using `target` directly.\n // Otherwise we cannot return a custom object for APIs that\n // are declared read-only and non-configurable, such as `chrome.devtools`.\n //\n // The proxy handlers themselves will still use the original `target`\n // instead of the `proxyTarget`, so that the methods and properties are\n // dereferenced via the original targets.\n let proxyTarget = Object.create(target);\n return new Proxy(proxyTarget, handlers);\n };\n\n /**\n * Creates a set of wrapper functions for an event object, which handles\n * wrapping of listener functions that those messages are passed.\n *\n * A single wrapper is created for each listener function, and stored in a\n * map. Subsequent calls to `addListener`, `hasListener`, or `removeListener`\n * retrieve the original wrapper, so that attempts to remove a\n * previously-added listener work as expected.\n *\n * @param {DefaultWeakMap<function, function>} wrapperMap\n * A DefaultWeakMap object which will create the appropriate wrapper\n * for a given listener function when one does not exist, and retrieve\n * an existing one when it does.\n *\n * @returns {object}\n */\n const wrapEvent = wrapperMap => ({\n addListener(target, listener, ...args) {\n target.addListener(wrapperMap.get(listener), ...args);\n },\n hasListener(target, listener) {\n return target.hasListener(wrapperMap.get(listener));\n },\n removeListener(target, listener) {\n target.removeListener(wrapperMap.get(listener));\n }\n });\n const onRequestFinishedWrappers = new DefaultWeakMap(listener => {\n if (typeof listener !== \"function\") {\n return listener;\n }\n\n /**\n * Wraps an onRequestFinished listener function so that it will return a\n * `getContent()` property which returns a `Promise` rather than using a\n * callback API.\n *\n * @param {object} req\n * The HAR entry object representing the network request.\n */\n return function onRequestFinished(req) {\n const wrappedReq = wrapObject(req, {} /* wrappers */, {\n getContent: {\n minArgs: 0,\n maxArgs: 0\n }\n });\n listener(wrappedReq);\n };\n });\n const onMessageWrappers = new DefaultWeakMap(listener => {\n if (typeof listener !== \"function\") {\n return listener;\n }\n\n /**\n * Wraps a message listener function so that it may send responses based on\n * its return value, rather than by returning a sentinel value and calling a\n * callback. If the listener function returns a Promise, the response is\n * sent when the promise either resolves or rejects.\n *\n * @param {*} message\n * The message sent by the other end of the channel.\n * @param {object} sender\n * Details about the sender of the message.\n * @param {function(*)} sendResponse\n * A callback which, when called with an arbitrary argument, sends\n * that value as a response.\n * @returns {boolean}\n * True if the wrapped listener returned a Promise, which will later\n * yield a response. False otherwise.\n */\n return function onMessage(message, sender, sendResponse) {\n let didCallSendResponse = false;\n let wrappedSendResponse;\n let sendResponsePromise = new Promise(resolve => {\n wrappedSendResponse = function (response) {\n didCallSendResponse = true;\n resolve(response);\n };\n });\n let result;\n try {\n result = listener(message, sender, wrappedSendResponse);\n } catch (err) {\n result = Promise.reject(err);\n }\n const isResultThenable = result !== true && isThenable(result);\n\n // If the listener didn't returned true or a Promise, or called\n // wrappedSendResponse synchronously, we can exit earlier\n // because there will be no response sent from this listener.\n if (result !== true && !isResultThenable && !didCallSendResponse) {\n return false;\n }\n\n // A small helper to send the message if the promise resolves\n // and an error if the promise rejects (a wrapped sendMessage has\n // to translate the message into a resolved promise or a rejected\n // promise).\n const sendPromisedResult = promise => {\n promise.then(msg => {\n // send the message value.\n sendResponse(msg);\n }, error => {\n // Send a JSON representation of the error if the rejected value\n // is an instance of error, or the object itself otherwise.\n let message;\n if (error && (error instanceof Error || typeof error.message === \"string\")) {\n message = error.message;\n } else {\n message = \"An unexpected error occurred\";\n }\n sendResponse({\n __mozWebExtensionPolyfillReject__: true,\n message\n });\n }).catch(err => {\n // Print an error on the console if unable to send the response.\n console.error(\"Failed to send onMessage rejected reply\", err);\n });\n };\n\n // If the listener returned a Promise, send the resolved value as a\n // result, otherwise wait the promise related to the wrappedSendResponse\n // callback to resolve and send it as a response.\n if (isResultThenable) {\n sendPromisedResult(result);\n } else {\n sendPromisedResult(sendResponsePromise);\n }\n\n // Let Chrome know that the listener is replying.\n return true;\n };\n });\n const wrappedSendMessageCallback = ({\n reject,\n resolve\n }, reply) => {\n if (extensionAPIs.runtime.lastError) {\n // Detect when none of the listeners replied to the sendMessage call and resolve\n // the promise to undefined as in Firefox.\n // See https://github.com/mozilla/webextension-polyfill/issues/130\n if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) {\n resolve();\n } else {\n reject(new Error(extensionAPIs.runtime.lastError.message));\n }\n } else if (reply && reply.__mozWebExtensionPolyfillReject__) {\n // Convert back the JSON representation of the error into\n // an Error instance.\n reject(new Error(reply.message));\n } else {\n resolve(reply);\n }\n };\n const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => {\n if (args.length < metadata.minArgs) {\n throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);\n }\n if (args.length > metadata.maxArgs) {\n throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);\n }\n return new Promise((resolve, reject) => {\n const wrappedCb = wrappedSendMessageCallback.bind(null, {\n resolve,\n reject\n });\n args.push(wrappedCb);\n apiNamespaceObj.sendMessage(...args);\n });\n };\n const staticWrappers = {\n devtools: {\n network: {\n onRequestFinished: wrapEvent(onRequestFinishedWrappers)\n }\n },\n runtime: {\n onMessage: wrapEvent(onMessageWrappers),\n onMessageExternal: wrapEvent(onMessageWrappers),\n sendMessage: wrappedSendMessage.bind(null, \"sendMessage\", {\n minArgs: 1,\n maxArgs: 3\n })\n },\n tabs: {\n sendMessage: wrappedSendMessage.bind(null, \"sendMessage\", {\n minArgs: 2,\n maxArgs: 3\n })\n }\n };\n const settingMetadata = {\n clear: {\n minArgs: 1,\n maxArgs: 1\n },\n get: {\n minArgs: 1,\n maxArgs: 1\n },\n set: {\n minArgs: 1,\n maxArgs: 1\n }\n };\n apiMetadata.privacy = {\n network: {\n \"*\": settingMetadata\n },\n services: {\n \"*\": settingMetadata\n },\n websites: {\n \"*\": settingMetadata\n }\n };\n return wrapObject(extensionAPIs, staticWrappers, apiMetadata);\n };\n\n // The build process adds a UMD wrapper around this file, which makes the\n // `module` variable available.\n module.exports = wrapAPIs(chrome);\n } else {\n module.exports = globalThis.browser;\n }\n});\n//# sourceMappingURL=browser-polyfill.js.map\n","export type EventHistoryEntry = {\n\n createdAt: number,\n payload: string\n}\n\nexport enum PopupEvent {\n checkoutPopupShown = 'CHECKOUT-POPUP-SHOWN',\n checkoutPopupNotShown = 'CHECKOUT-POPUP-NOT-SHOWN',\n checkoutPopupSupressed = 'CHECKOUT-POPUP-SUPRESSED',\n checkoutPopupDonation = 'CHECKOUT-POPUP-DONATION',\n checkoutPopupFailedActivation = 'CHECKOUT-POPUP-FAILED-ACTIVATION',\n checkoutPopupPurchaseConfirmed = 'CHECKOUT-POPUP-PURCHASE-CONFIRMED',\n checkoutPopupHealthCheck = 'CHECKOUT-POPUP-HEALTH-CHECK',\n checkouPopupActivationFailed = 'CHECKOUT-POPUP-ACTIVATION-FAILED',\n checkoutPopupOfferDetailsClicked = 'CHECKOUT-POPUP-OFFER-DETAILS-CLICKED',\n checkoutPopupWhyAmISeeingThisClicked = 'CHECKOUT-POPUP-WHY-AM-I-SEEING-THIS-CLICKED',\n checkoutPopupLooserExtension = 'CHECKOUT-POPUP-LOOSER-EXTENSION',\n checkoutPopupActiveDomain = 'CHECKOUT-POPUP-ACTIVE-DOMAIN',\n checkoutPopupSiteMatches = 'CHECKOUT-POPUP-SITE-MATCHES',\n checkoutPopupMerchantInResultsFound = 'CHECKOUT-MERCHANT-IN-RESULTS-FOUND',\n checkoutPopupNotShownPerViewportSize = 'CHECKOUT-POPUP-NOT-SHOWN-PER-VIEWPORT-SIZE',\n checkoutPopupHiddenProgrammatically = 'CHECKOUT-POPUP-HIDDEN-PROGRAMMATICALLY',\n}\n\nexport enum LoggingEvent {\n adUnitLog = 'ADUNIT-LOG'\n}\n\nexport type EventType = PopupEvent | LoggingEvent; // Unionize any event types here.\n\nexport type GfEvent<T extends EventType> = {\n partner: string,\n eventType: T,\n eventData?: unknown\n}\n","import { LogMessage, LoggerTransport } from '../types';\n\nexport class ConsoleTransport implements LoggerTransport {\n private static LOGGER_PREFIX = '[GFAdUnit] -';\n\n isLocal = true;\n\n log({\n level, message, timestamp, data, title,\n }: LogMessage): void {\n // Map log levels to available console methods\n let consoleMethod: 'log' | 'info' | 'warn' | 'error';\n switch (level) {\n case 'debug':\n consoleMethod = 'log';\n break;\n case 'info':\n consoleMethod = 'info';\n break;\n case 'warn':\n consoleMethod = 'warn';\n break;\n case 'error':\n case 'critical':\n case 'fatal':\n consoleMethod = 'error';\n break;\n default:\n consoleMethod = 'log';\n }\n const titlePrefix = title ? `[${title}]` : '';\n\n if (data !== undefined) {\n // eslint-disable-next-line no-console\n console[consoleMethod](`[${timestamp}] - ${ConsoleTransport.LOGGER_PREFIX} ${titlePrefix} ${message}`, data);\n } else {\n // eslint-disable-next-line no-console\n console[consoleMethod](`[${timestamp}] - ${ConsoleTransport.LOGGER_PREFIX} ${titlePrefix} ${message}`);\n }\n }\n}\n","import {\n LogLevel, LogMessage, LoggerConfig, LoggerTransport,\n} from './types';\nimport { ConsoleTransport } from './transports';\n\nconst LOG_LEVELS: LogLevel[] = ['debug', 'info', 'warn', 'error', 'critical', 'fatal'];\n\nexport class Logger {\n private config: Required<LoggerConfig>;\n private static instance: Logger;\n\n private constructor(config?: LoggerConfig) {\n this.config = {\n minLevel: config?.minLevel ?? 'debug',\n enabled: config?.enabled ?? false,\n transports: config?.transports ?? [new ConsoleTransport()],\n title: config?.title ?? '',\n };\n }\n\n static getInstance(config?: LoggerConfig): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger(config);\n }\n return Logger.instance;\n }\n\n configure(config: Partial<LoggerConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n private shouldLog(level: LogLevel): boolean {\n if (!this.config.enabled) return false;\n return LOG_LEVELS.indexOf(level) >= LOG_LEVELS.indexOf(this.config.minLevel);\n }\n\n private createLogMessage(level: LogLevel, message: string, data?: unknown): LogMessage {\n return {\n level,\n // @ts-expect-error global variable\n version: LIB_VERSION ?? 'unknown',\n message,\n timestamp: new Date().toISOString(),\n data,\n title: this.config.title,\n };\n }\n\n private log(level: LogLevel, message: string, onlyLocal: boolean, data?: unknown): void {\n if (!this.shouldLog(level)) return;\n\n const logMessage = this.createLogMessage(level, message, data);\n this.config.transports\n .filter((transport) => !onlyLocal || transport.isLocal)\n .forEach((transport) => transport.log(logMessage));\n }\n\n debug(message: string, data?: unknown, onlyLocal = false): void {\n this.log('debug', message, onlyLocal, data);\n }\n\n info(message: string, data?: unknown, onlyLocal = false): void {\n this.log('info', message, onlyLocal, data);\n }\n\n warn(message: string, data?: unknown, onlyLocal = false): void {\n this.log('warn', message, onlyLocal, data);\n }\n\n error(message: string, data?: unknown, onlyLocal = false): void {\n this.log('error', message, onlyLocal, data);\n }\n\n critical(message: string, data?: unknown, onlyLocal = false): void {\n this.log('critical', message, onlyLocal, data);\n }\n\n fatal(message: string, data?: unknown, onlyLocal = false): void {\n this.log('fatal', message, onlyLocal, data);\n }\n\n addTransport(transport: LoggerTransport): void {\n this.config.transports.push(transport);\n }\n\n clearTransports(): void {\n this.config.transports = [];\n }\n\n disable(): void {\n this.config.enabled = false;\n }\n\n enable(): void {\n this.config.enabled = true;\n }\n}\n","import { Logger } from './logger';\n\nexport const MAX_RETRY_ATTEMPTS = 3;\nexport const DEFAULT_RETRY_DELAY = 1000; // 1 second\n\nexport type DelayFunction = (attempt: number) => number;\n\nexport const defaultDelay: DelayFunction = (attempt: number) => DEFAULT_RETRY_DELAY * attempt;\n\nexport interface RetryOptions {\n maxAttempts?: number;\n delayFn?: DelayFunction;\n logger?: Logger;\n operationName?: string;\n}\n\nexport async function retryOperation<T>(\n operation: () => Promise<T>,\n options: RetryOptions = {},\n // If the operation fails after the specified attempts, return this value instead of throwing\n returnOnFailure?: T,\n): Promise<T> {\n const {\n maxAttempts = MAX_RETRY_ATTEMPTS,\n delayFn = defaultDelay,\n } = options;\n\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n try {\n // eslint-disable-next-line no-await-in-loop\n return await operation();\n } catch (error) {\n lastError = error as Error;\n if (attempt < maxAttempts) {\n // eslint-disable-next-line no-await-in-loop\n await new Promise((resolve) => {\n setTimeout(resolve, delayFn(attempt));\n });\n }\n }\n }\n\n if (lastError && options.logger && options.operationName) {\n // Prevent logging this remotely to avoid further network errors and enter in an infinite loop\n options.logger.error(`Operation ${options.operationName} failed after ${maxAttempts} attempts.`, lastError, true);\n }\n\n if (returnOnFailure !== undefined) {\n return returnOnFailure;\n }\n\n throw lastError || new Error('Operation failed after multiple attempts');\n}\n","import browser from 'webextension-polyfill';\nimport {\n AnyRequestMessage, AnyResponseMessage, RequestMessage, RequestResponseMap, ResponseMessage,\n} from './requestResponse';\nimport { Logger } from './utils/logger';\nimport {\n defaultDelay, MAX_RETRY_ATTEMPTS, retryOperation, RetryOptions,\n} from './utils/retry';\n\n// Use webextension-polyfill API\nconst api = browser;\n\n// Re-export the browser object\nexport { browser };\n\ninterface SendOptions {\n tabId?: number;\n}\n\n/**\n * Type-safe wrapper for sending messages\n * @param message\n * @param options\n * @returns\n */\nexport async function sendMessage<K extends keyof RequestResponseMap>(\n message: RequestMessage<K>,\n options?: SendOptions,\n): Promise<ResponseMessage<K>> {\n if (options?.tabId) {\n return await api.tabs.sendMessage(options.tabId, message) as ResponseMessage<K>;\n }\n return await api.runtime.sendMessage(message) as ResponseMessage<K>;\n}\n\n/**\n * Type-safe wrapper for sending messages, with retry attempts\n * @param message\n * @param options\n * @param retryOptions\n * @returns\n */\nexport async function sendMessageWithRetry<K extends keyof RequestResponseMap>(\n message: RequestMessage<K>,\n options?: SendOptions,\n retryOptions?: RetryOptions,\n): Promise<ResponseMessage<K>> {\n const finalRetryOptions: RetryOptions = {\n maxAttempts: retryOptions?.maxAttempts ?? MAX_RETRY_ATTEMPTS,\n delayFn: retryOptions?.delayFn ?? defaultDelay,\n };\n\n return retryOperation<ResponseMessage<K>>(\n () => sendMessage(message, options),\n finalRetryOptions,\n );\n}\n\n/**\n * Type-safe wrapper for adding message listeners in an \"RPC style\".\n *\n * @param callback A function that takes:\n * - message: one of the possible request messages (AnyRequestMessage)\n * - sender: the sender details\n * - sendResponse: a function to call with a typed response (AnyResponseMessage)\n *\n * The callback can:\n * - return `void` (if it synchronously calls `sendResponse`),\n * - return `boolean` (to indicate if it will handle async),\n * - or return a `Promise<AnyResponseMessage>` (in which case we handle sendResponse automatically).\n */\nexport function addMessageListener(\n callback: (\n message: AnyRequestMessage,\n sender: browser.Runtime.MessageSender,\n sendResponse: (response: AnyResponseMessage) => void\n ) => void | boolean | Promise<AnyResponseMessage | void>,\n) {\n const logger = Logger.getInstance();\n\n // Attach a single runtime listener\n const messageListener = (message: unknown, sender: browser.Runtime.MessageSender, sendResponse: (response?: unknown) => void) => {\n // We'll provide a typed sendResponse function to the callback\n function typedSendResponse(resp: AnyResponseMessage) {\n sendResponse(resp);\n }\n\n const maybePromise = callback(message as AnyRequestMessage, sender, typedSendResponse);\n\n // If the callback returns a promise, we handle it asynchronously\n if (maybePromise instanceof Promise) {\n maybePromise.then((resp) => {\n if (resp) typedSendResponse(resp);\n }).catch((err) => {\n logger.warn('Async message callback error:', err);\n // You could also send an error response or handle differently\n });\n // Must return true so the message channel stays open\n return true;\n }\n\n // If the callback explicitly returned true, it means it will handle the response asynchronously\n // For webextension-polyfill, we can only return true or undefined (not false)\n if (maybePromise === true) {\n return true;\n }\n\n // Return undefined for synchronous operations (equivalent to not returning anything)\n return undefined;\n };\n\n api.runtime.onMessage.addListener(messageListener);\n\n return messageListener;\n}\n\n// Storage utilities with type safety\nexport const storage = {\n async get<T = unknown>(keys: string | string[] | null): Promise<T> {\n const result = await api.storage.local.get(keys);\n return result as T;\n },\n\n async set(items: Record<string, unknown>): Promise<void> {\n await api.storage.local.set(items);\n },\n\n async remove(keys: string | string[]): Promise<void> {\n await api.storage.local.remove(keys);\n },\n};\n\nexport const createTab = async (url: string) => {\n const currentTab = api.tabs.getCurrent();\n const tab = await currentTab;\n const newTab = await api.tabs.create({\n url,\n openerTabId: tab?.id,\n active: false,\n pinned: true,\n });\n const wasNewTabLoaded = await waitForTabToLoad(newTab.id!);\n if (!wasNewTabLoaded) {\n // TODO: Log activation error\n return;\n }\n\n setTimeout(() => {\n // Autoclose the new tab after 30 seconds\n if (newTab?.id) {\n api.tabs.remove(newTab.id);\n }\n }, 30000);\n};\n\nconst waitForTabToLoad = async (tabId: number): Promise<boolean> => new Promise<boolean>((resolve) => {\n api.tabs.onUpdated.addListener(async function listener(updatedTabId, changeInfo) {\n if (updatedTabId === tabId && changeInfo.status === 'complete') {\n api.tabs.onUpdated.removeListener(listener);\n const tab = await api.tabs.get(tabId);\n if (!tab.url) { // TODO: Evaluate url integrity\n resolve(false);\n return;\n }\n\n resolve(true);\n }\n });\n});\n","// Shared constants between content and background scripts\nconst POPUP_MESSAGE_TYPES = {\n HIDE_POPUP: 'GF_HIDE_POPUP',\n GET_POPUP_CONFIG: 'GF_GET_POPUP_CONFIG',\n IS_ACTIVE_DOMAIN: 'GF_IS_ACTIVE_DOMAIN',\n LOG_MERCHANTS_IN_SEARCH_RESULTS: 'GF_LOG_MERCHANTS_IN_SEARCH_RESULTS',\n SHOULD_STAND_DOWN: 'GF_SHOULD_STAND_DOWN',\n ACTIVATE_OFFER: 'GF_ACTIVATE_OFFER',\n STORE_SHOPIFY_SHOP_ID: 'GF_STORE_SHOPIFY_SHOP_ID', // Added new message type for Shopify ID\n GET_DOMAIN_BY_SHOP_ID: 'GF_GET_DOMAIN_BY_SHOP_ID', // Get domain information for a shop ID\n GET_LANGUAGE_CONTENT: 'GF_GET_LANGUAGE_CONTENT', // Get localized strings for a language + charities\n} as const;\n\nexport const MESSAGE_TYPES = {\n TRACK_EVENT: 'GF_TRACK_EVENT',\n ...POPUP_MESSAGE_TYPES,\n} as const;\n\n// Initial state\nexport const INITIAL_STATE = {\n isInitialized: false,\n data: {},\n settings: {\n enabled: true,\n theme: 'light',\n },\n} as const;\n\n// Storage Keys\nexport const SHOPIFY_SHOP_IDS_STORAGE_KEY = 'shopify_shop_ids' as const;\nexport const LAST_HEALTH_CHECK_STORAGE_KEY = 'gf_last_health_check' as const;\nexport const VISITED_WEBSITE_PREFIX_STORAGE_KEY = 'gfhv-' as const;\nexport const POPUP_HIDDEN_STORAGE_KEY = 'popup_hide' as const;\nexport const PARTNER_CONFIG_STORAGE_KEY = 'gf_partner_config' as const;\nexport const GLOBAL_CONFIG_STORAGE_KEY = 'gf_global_config' as const;\nexport const COUNTRY_CODE_STORAGE_KEY = 'countryCode' as const;\nexport const VERSION_STORAGE_KEY = 'version' as const;\nexport const ANONYMOUS_USER_STORAGE_KEY = 'gf_anonymous_user_info' as const;\nexport const ANONYMOUS_ENCRYPTED_TOKEN_STORAGE_KEY = 'gf_anonymous_encrypted_token' as const;\nexport const GF_AD_EVENT_HISTORY_STORAGE_KEY = 'gf_ad_event_history' as const;\nexport const WILDFIRE_STORAGE_KEYS = {\n DEVICE: 'wfDevice',\n DOMAINS: 'wfDomains',\n STANDDOWN_POLICY: 'wfStanddownPolicy',\n STANDDOWN_HISTORY: 'wfStanddownHistory',\n LAST_CACHE_REFRESH: 'wfLastCacheRefresh',\n MERCHANT_RATES: 'wfMerchantRates',\n} as const;\n\nexport const UNKNOWN_CHARITY = {\n ein: '0',\n tpi: '0',\n};\n\nexport const DEFAULT_LANGUAGE = 'en' as const;\nexport const DEFAULT_COUNTRY = 'us' as const;\n\nexport const DEFAULT_CACHE_RETENTION = 60 * 10; // 10 minutes\n","import browser from 'webextension-polyfill';\n\n// we want to ensure that we don't conflict with any other storage from the host extensions\nconst storagePrefix = 'GIVE_FREELY_';\n\nexport const storage = {\n async get<T>(key: string): Promise<T | null> {\n const prefixedKey = `${storagePrefix}${key}`;\n const result = await browser.storage.local.get(prefixedKey);\n return result[prefixedKey] as T || null;\n },\n\n async set<T>(key: string, value: T): Promise<void> {\n const prefixedKey = `${storagePrefix}${key}`;\n await browser.storage.local.set({ [prefixedKey]: value });\n },\n\n async remove(keys: string | string[]): Promise<void> {\n const prefixedKeys = Array.isArray(keys)\n ? keys.map((key) => `${storagePrefix}${key}`)\n : `${storagePrefix}${keys}`;\n await browser.storage.local.remove(prefixedKeys);\n },\n};\n","import { VERSION_STORAGE_KEY } from '../constants';\nimport { storage } from './storage';\n\n// @ts-expect-error global variable\nexport const getCurrentVersion = () => String(LIB_VERSION);\n\nconst updateVersion = (newVersion: string): Promise<void> => storage.set(VERSION_STORAGE_KEY, newVersion);\n\n/**\n *Determines if the current version is different than the one persisted in the storage\n *If updateStorageIfNew is true, it will update the current version in storage\n */\nexport const isNewVersion = async (updateStorageIfNew: boolean = true): Promise<boolean> => {\n const storedVersion = await storage.get<string>(VERSION_STORAGE_KEY);\n const currentVersion = await getCurrentVersion();\n const isANewVersion = storedVersion !== currentVersion;\n\n if (updateStorageIfNew && isANewVersion) {\n await updateVersion(currentVersion);\n }\n\n return isANewVersion;\n};\n\n/**\n * Updates the current version in storage\n */\nexport const updateCurrentVersion = async () => updateVersion(await getCurrentVersion());\n","import { sendMessage } from '../browser';\r\nimport { GiveFreelyConfigService } from '../config/giveFreelyConfig';\r\nimport { GF_AD_EVENT_HISTORY_STORAGE_KEY, MESSAGE_TYPES } from '../constants';\r\nimport { addMinutes } from '../utils/add-time';\r\nimport { getCurrentVersion } from '../utils/current-version';\r\nimport { Logger } from '../utils/logger';\r\nimport { storage } from '../utils/storage';\r\nimport { GiveFreelyUserService } from '../vendors/givefreely/giveFreelyUserService';\r\nimport { EventHistoryEntry, EventType, GfEvent } from './types';\r\n\r\nexport class Analytics {\r\n private _partnerApiKey: string;\r\n private readonly _configService: GiveFreelyConfigService;\r\n private _debounceWindowInMinutes: number;\r\n private readonly _userService: GiveFreelyUserService;\r\n private readonly _logger: Logger;\r\n\r\n /**\r\n * @param partnerApiKey The partner key\r\n * @param debounceWindowInMinutes Number of minutes after which the same event can be broadcasted again. Default is 60 minutes.\r\n */\r\n constructor(partnerApiKey: string, userService: GiveFreelyUserService, configService: GiveFreelyConfigService, debounceWindowInMinutes = 60) {\r\n this._partnerApiKey = partnerApiKey;\r\n this._userService = userService;\r\n this._debounceWindowInMinutes = debounceWindowInMinutes;\r\n this._logger = Logger.getInstance({ title: 'Analytics' });\r\n this._configService = configService;\r\n }\r\n\r\n /**\r\n * Sends a request for broadcasting an event in the background.\r\n * Call this method from content scripts only\r\n */\r\n static trackEvent = async<T extends EventType>(eventType: T, eventData: unknown, anonymous: boolean = false, skipThrottling: boolean = false) => {\r\n await sendMessage({\r\n type: MESSAGE_TYPES.TRACK_EVENT,\r\n payload: {\r\n eventType, eventData, anonymous, skipThrottling,\r\n },\r\n\r\n });\r\n };\r\n\r\n track = async<T extends EventType>\r\n (eventType: T, wfDeviceId?: number, payload?: unknown, anonymous: boolean = false, skipThrottling: boolean = false): Promise<boolean> => {\r\n const event: GfEvent<T> = {\r\n partner: `adUnit_${this._partnerApiKey}`,\r\n eventType,\r\n eventData: {\r\n userId: anonymous ? undefined : this._userService?.user?.id,\r\n libVersion: getCurrentVersion(),\r\n wfDeviceId,\r\n ...payload!,\r\n },\r\n };\r\n\r\n try {\r\n const serializedEvent = JSON.stringify(event, (_key, value) => {\r\n if (value instanceof Error) {\r\n return {\r\n name: value.name,\r\n message: value.message,\r\n stack: value.stack,\r\n };\r\n }\r\n return value;\r\n });\r\n\r\n const eventsUrl = await this.getEventsUrl();\r\n if (eventsUrl) {\n const result = await this.BroadcastEvent(eventsUrl, serializedEvent, event, skipThrottling);\n return result;\n }\r\n\r\n this._logger.info('Cant broadcast event. eventsUrl cant be retrieved from config', event, true);\r\n return false;\n } catch (error) {\r\n // Prevent logging this remotely to avoid further network errors and enter in an infinite loop\r\n this._logger.error('Something unexpected happened when dispatching a gf event', { error, event }, true);\r\n return false;\r\n }\r\n };\r\n\r\n private async BroadcastEvent(eventsUrl: string, serializedEvent: string,\r event: GfEvent<EventType>, skipThrottling: boolean): Promise<boolean> {\r\n if (await this.shouldBroadcastEvent(serializedEvent, skipThrottling)) {\r\n const result = await fetch(eventsUrl, {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n body: serializedEvent,\r\n cache: 'no-store',\r\n });\r\n\r\n if (!result.ok) {\r\n this._logger.error('Something unexpected happened when dispatching an event', {\r\n status: result.status,\r\n statusText: result.statusText,\r\n event,\r\n }, true);\r\n\r\n return false;\r\n }\r\n await this.pushEventToHistory(serializedEvent);\r\n return true;\r\n }\r\n\r\n this._logger.info('This event has already been broadcasted during the past hour', event, true);\r\n return false;\r\n }\r\n\r\n private async getEventsUrl(): Promise<string | undefined> {\r\n // Warning: Always get the cached config here to avoid infinite loops\r\n const config = await this._configService.getCachedConfig();\r\n return config?.eventsUrl;\r\n }\r\n\r\n private getEventsHistory = async (): Promise<EventHistoryEntry[]> => {\r\n const history = await storage.get<EventHistoryEntry[]>(GF_AD_EVENT_HISTORY_STORAGE_KEY);\r\n\r\n // Old entries cleanup (We remove any entry older than x minutes ago)\r\n const lastHourDate = addMinutes(-this._debounceWindowInMinutes);\r\n\r\n const typedHistory = ((history || []) as EventHistoryEntry[])\r\n .filter((x) => x.createdAt > lastHourDate);\r\n\r\n await storage.set(GF_AD_EVENT_HISTORY_STORAGE_KEY, typedHistory);\r\n\r\n return typedHistory;\r\n };\r\n\r\n private shouldBroadcastEvent = async (serializedEvent: string, skipThrottling: boolean): Promise<boolean> => {\r\n if (skipThrottling) return true;\r\n\r\n const history = await this.getEventsHistory();\r\n\r\n return !history.some((entry) => entry.payload === serializedEvent);\r\n };\r\n\r\n private pushEventToHistory = async (serializedEvent: string): Promise<void> => {\r\n const history = await this.getEventsHistory();\r\n\r\n history.push({\r\n createdAt: Date.now(),\r\n payload: serializedEvent,\r\n });\r\n\r\n await storage.set(GF_AD_EVENT_HISTORY_STORAGE_KEY, history);\r\n };\r\n}\r\n","/**\n * Adds the provided hours to the current date and returns it as a unix-like epoch\n */\nexport const addHours = (h: number): number => {\n const now = new Date();\n now.setTime(now.getTime() + (h * 60 * 60 * 1000));\n\n return now.getTime();\n};\n\n/**\n * Adds the provided minutes to the current date and returns it as a unix-like epoch\n */\nexport const addMinutes = (m: number): number => {\n const now = new Date();\n now.setTime(now.getTime() + (m * 60 * 1000));\n\n return now.getTime();\n};\n","// Utility functions shared between content and background scripts\nexport function isValidMessage<T>(message: unknown): message is { type: string; payload: T } {\n return (\n typeof message === 'object'\n && message !== null\n && 'type' in message\n && 'payload' in message\n && typeof message.type === 'string'\n );\n}\n\n/**\n * /\n * Merges two objects if a condition is met. Otherwise, returns the first object.\n */\nexport function mergeIf<T>(condition: boolean, left: T, right: T): T {\n return condition ? { ...left, ...right } : left;\n}\n\n// Add more shared utility functions as needed\n","/** @jsxImportSource solid-js */\nimport {\n createEffect, createSignal, JSX, onCleanup, Setter, Show,\n} from 'solid-js';\nimport { CheckoutPopupStyles as styles } from '../CheckoutPopup.styles';\nimport { PartnerGiveFreelyConfig } from '../../../shared/config/types';\nimport { RateKindMap, WildfireActiveDomain, WildfireMerchantRateDetail } from '../../../shared/vendors/wildfire/types';\nimport { OfferTitle } from './OfferTitle';\nimport { OfferDetails } from './OfferDetails';\nimport { calculateMaxRate } from '../../lib/calculateMaxRate';\nimport { Analytics } from '../../../shared/analytics';\nimport { PopupEvent } from '../../../shared/analytics/types';\nimport { mergeIf, UNKNOWN_CHARITY } from '../../../shared';\nimport { useT } from '../../lib/hooks/useT';\nimport { useCharities } from '../../lib/hooks/useCharities';\nimport { GfCheckoutPopupCharity } from '../../GfAdUnit';\nimport { Logger } from '../../../shared/utils/logger';\n\nconst getPopupBehavior = (config: PartnerGiveFreelyConfig): {\n hasBackdrop: boolean,\n clickAction: 'hide-opacity' | 'ignore' | 'donate'\n} => {\n const hasBackdrop = !!config.containerStyle?.backdropColor || !!config.containerStyle?.showAsModal;\n const clickAction = config.containerStyle?.clickAction ?? 'hide-opacity';\n\n return { hasBackdrop, clickAction };\n};\n\ninterface MainScreenProps {\n setBackdropHidden: Setter<boolean>;\n checkoutPopupConf: PartnerGiveFreelyConfig;\n activeDomain: WildfireActiveDomain;\n merchantRates: WildfireMerchantRateDetail<keyof RateKindMap>[];\n onClose: () => void;\n onCharitySelect: (charity: GfCheckoutPopupCharity, skipSuccess?: boolean) => void;\n onSuppress: () => void;\n onOfferDetailsClick: (toggleState: boolean) => Promise<void>;\n mainContainerRef: HTMLDivElement | undefined;\n dialogRef: HTMLDialogElement | undefined;\n logger: Logger;\n}\n\nexport function MainScreen(props: MainScreenProps) {\n const [detailsDisplayed, setDetailsDisplayed] = createSignal(false);\n const [selectedCharity, setSelectedCharity] = createSignal<\n { charity: GfCheckoutPopupCharity, closeOnDonation?: boolean } | null>(null);\n\n const handleDialogClick = (e: MouseEvent) => {\n const { hasBackdrop, clickAction } = getPopupBehavior(props.checkoutPopupConf);\n if (hasBackdrop && clickAction === 'donate') {\n e.stopPropagation();\n }\n };\n\n const handleWindowClick = () => {\n const { hasBackdrop, clickAction } = getPopupBehavior(props.checkoutPopupConf);\n if (hasBackdrop && clickAction !== 'ignore') {\n if (clickAction === 'donate') {\n selectCharity(UNKNOWN_CHARITY, true);\n } else {\n props.setBackdropHidden(true);\n }\n }\n };\n\n createEffect(() => {\n window.addEventListener('click', handleWindowClick);\n props.mainContainerRef?.addEventListener('click', handleDialogClick);\n\n onCleanup(() => {\n // We need this timeout in case the click event also unmounts the component.\n setTimeout(() => {\n window.removeEventListener('click', handleWindowClick);\n props.mainContainerRef?.removeEventListener('click', handleDialogClick);\n }, 500);\n });\n });\n\n const t = useT();\n const getCharities = useCharities();\n\n createEffect(() => {\n if (detailsDisplayed() && props.dialogRef) {\n props.dialogRef\n .scroll({ top: props.dialogRef.offsetHeight, behavior: 'smooth' });\n }\n });\n\n createEffect(() => {\n const charitySelection = selectedCharity();\n\n if (charitySelection) {\n props.onCharitySelect(charitySelection.charity, charitySelection.closeOnDonation\n ? props.checkoutPopupConf.checkoutPopupActivateAndCloseSkipSuccess : undefined);\n }\n });\n\n const handleWhyAmISeeingThisClick = () => void Analytics.trackEvent(PopupEvent.checkoutPopupWhyAmISeeingThisClicked, {\n domain: globalThis.window.location.hostname,\n });\n\n const selectCharity = (charity: GfCheckoutPopupCharity, closeOnDonation?: boolean) => setSelectedCharity({ charity, closeOnDonation });\n\n const isCharitySelected = () => !!selectedCharity()?.charity;\n\n return (\n <>\n <div style={styles.mainContainer}>\n <div style={styles.header}>\n <div\n style={{ ...styles.headingGrow, 'font-weight': 800 }}\n innerHTML={t('main.title.v2')}\n />\n <Show when={props.checkoutPopupConf.checkoutPopupActivateAndClose}>\n <a\n href=\"#!\"\n style={mergeIf<JSX.CSSProperties>(isCharitySelected(), styles.activateAndCloseLink, styles.activateAndCloseLinkSelected)}\n onClick={() => selectCharity(UNKNOWN_CHARITY, true)}\n innerHTML={t('main.activateAndClose.v2')}\n />\n </Show>\n <Show when={props.checkoutPopupConf.checkoutPopupMainCloseButtonVisible && !props.checkoutPopupConf.checkoutPopupActivateAndClose}>\n <button\n class=\"give-freely-close-button\"\n style={styles.closeButton}\n onClick={() => props.onClose()}\n aria-label=\"Close\"\n >\n ×\n </button>\n </Show>\n </div>\n <div style={styles.subheading}>\n <OfferTitle title={t('main.subTitle.v2')} activeDomain={props.activeDomain} />\n </div>\n <div style={styles.charityGrid}>\n {\n getCharities().reduce<JSX.Element[]>((result, charity) => {\n if (charity?.title && charity?.title !== '') {\n result.push(\n <div\n style={mergeIf<JSX.CSSProperties>(isCharitySelected(), styles.charityButton, { cursor: 'default' })}\n onClick={() => !isCharitySelected() && selectCharity(charity)}\n >\n {\n charity.decorator && charity.decoratorLeftStyle && charity.decoratorRightStyle\n && <>\n <div style={charity.decoratorLeftStyle} innerHTML={charity.decorator} />\n <div style={charity.decoratorRightStyle} innerHTML={charity.decorator} />\n </>\n }\n\n <div style={{\n 'text-align': 'center', display: 'flex', 'flex-direction': 'column', 'align-items': 'center', gap: '7px',\n }}>\n <img src={charity.logo} style={styles.charityLogo} alt={charity.title} />\n <span innerHTML={charity.title}/>\n </div>\n <button\n style={\n mergeIf<JSX.CSSProperties>(isCharitySelected(), {\n ...styles.selectButton,\n 'background-color': props.checkoutPopupConf?.checkoutPopupSelectCharityButtonBgColor || '#0052FF',\n }, styles.charityButtonDisabled)}\n disabled={isCharitySelected()}\n aria-label={`Select charity: ${charity.title}`}\n >\n <span innerHTML={t('main.charitySelect')} />\n </button>\n </div>,\n );\n } else {\n props.logger.error(`Translation was not found for EIN ${charity?.ein}`);\n }\n return result;\n }, [])\n }\n <div style={mergeIf<JSX.CSSProperties>(isCharitySelected(), styles.charityButton, { cursor: 'default', 'justify-content': 'flex-end' })}\n onClick={() => !isCharitySelected() && props.onSuppress()}>\n <div style={{\n 'text-align': 'center', display: 'flex', 'align-items': 'center', height: '100%',\n }}>\n <span innerHTML={t('main.sixthBox')} />\n </div>\n <button\n style={\n mergeIf<JSX.CSSProperties>(isCharitySelected(), {\n ...styles.selectButton,\n 'background-color': props.checkoutPopupConf.checkoutPopupSelectCharityButtonBgColor || '#0052FF',\n }, styles.charityButtonDisabled)}\n disabled={isCharitySelected()}\n aria-label=\"Don't show again\"\n >\n <span innerHTML={t('main.settings.v2')} />\n </button>\n </div>\n </div>\n <div style={styles.footerLinks}>\n <p\n onClick={() => {\n props.onOfferDetailsClick(!detailsDisplayed());\n setDetailsDisplayed(!detailsDisplayed());\n }}\n style={styles.openDetailsButton}\n >\n <span innerHTML={t('main.offerDetails')} />\n </p>\n <a\n class=\"give-freely-footer-link\"\n onClick={handleWhyAmISeeingThisClick}\n style={styles.footerLink}\n href={props.checkoutPopupConf.externalUrls.giveFreelyWhyAmISeeingThis}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <span innerHTML={t('main.whyAmISeeingThis')} />\n </a>\n </div>\n {props.checkoutPopupConf.checkoutPopupDisplayNameInFooter\n && <div style={styles.supportedBy}>\n <span innerHTML={t('main.footer')} />\n </div>\n }\n </div>\n <Show when={detailsDisplayed()} >\n <OfferDetails\n merchantName={props.activeDomain.Merchant.Name}\n extensionName={props.checkoutPopupConf.displayName}\n termsUrl={props.checkoutPopupConf.externalUrls.giveFreelyTermsAndConditions}\n parsedMaxRate={\n props.activeDomain.Merchant.MaxRate\n ? calculateMaxRate(\n props.activeDomain.Merchant.MaxRate.Kind,\n props.activeDomain.Merchant.MaxRate?.Amount,\n )\n : null\n }\n merchantRateDetail={props.merchantRates}\n onClose={() => setDetailsDisplayed(false)}\n />\n </Show>\n </>\n );\n}\n","// src/content/lib/hooks/useCharities.ts\nimport { useContext } from 'solid-js';\nimport { ContentContext } from '../../context/translation/translationContext';\n\nexport const useCharities = () => {\n const getContentAccessor = useContext(ContentContext);\n const contentProvider = getContentAccessor();\n\n if (!contentProvider) {\n throw new Error('Content provider context is undefined');\n }\n\n return () => contentProvider.getAllCharities();\n};\n","/** @jsxImportSource solid-js */\nimport { createSignal, Show } from 'solid-js';\nimport { CheckoutPopupStyles as styles } from '../CheckoutPopup.styles';\nimport { PartnerGiveFreelyConfig } from '../../../shared/config/types';\nimport { useT } from '../../lib/hooks/useT';\n\ninterface GoodbyeScreenProps {\n checkoutPopupConf: PartnerGiveFreelyConfig;\n onClose: () => void;\n onBack: () => void;\n onGoodbye: (days: number) => void;\n setScreen: (screen: 'main' | 'goodbye' | 'donate') => void;\n}\n\nexport function GoodbyeScreen(props: GoodbyeScreenProps) {\n const [days, setDays] = createSignal(0);\n const t = useT();\n\n return (\n <div style={{ 'font-size': '14px' }}>\n <div style={{ ...styles.header, 'flex-direction': 'row' }}>\n <div style={{ ...styles.headingGrow, 'margin-top': '20px' }}>\n <span innerHTML={t('suppress.title')} />\n </div>\n <Show when={props.checkoutPopupConf.checkoutPopupSupressCloseButtonVisible}>\n <button\n class=\"give-freely-close-button\"\n style={{ ...styles.closeButton, 'align-self': 'flex-start' }}\n onClick={() => props.onGoodbye(0)}\n aria-label=\"Close\"\n >\n ×\n </button>\n </Show>\n </div>\n <button\n class=\"give-freely-back-button\"\n style={styles.backButton}\n onClick={() => props.onBack()}\n aria-label=\"Back to charity selection\"\n >\n <span innerHTML={t('suppress.backButton')} />\n </button>\n <hr />\n <div id=\"give-freely-goodbye-screen-options\" style={styles.goodbyeOptions}>\n <label class=\"give-freely-radio-option\" style={styles.goodbyeItem}>\n <input\n type=\"radio\"\n name=\"gf-rad-goodbye\"\n value=\"1\"\n onChange={() => setDays(1)}\n />\n <span innerHTML={t('suppress.suppressionPeriod').replace('{0}', '1')} />\n </label>\n <label class=\"give-freely-radio-option\" style={styles.goodbyeItem}>\n <input\n type=\"radio\"\n name=\"gf-rad-goodbye\"\n value=\"7\"\n onChange={() => setDays(7)}\n />\n <span innerHTML={t('suppress.suppressionPeriodPlural').replace('{0}', '7')} />\n </label>\n <label class=\"give-freely-radio-option\" style={styles.goodbyeItem}>\n <input\n type=\"radio\"\n name=\"gf-rad-goodbye\"\n value=\"30\"\n onChange={() => setDays(30)}\n />\n <span innerHTML={t('suppress.suppressionPeriodPlural').replace('{0}', '30')} />\n </label>\n <label class=\"give-freely-radio-option\" style={styles.goodbyeItem}>\n <input\n type=\"radio\"\n name=\"gf-rad-goodbye\"\n value=\"90\"\n onChange={() => setDays(90)}\n />\n <span innerHTML=\n {t('suppress.suppressionPeriodPlural').replace('{0}', '90')}\n />\n </label>\n <Show when={props.checkoutPopupConf.checkoutPopupNeverSuppressionAllowed}>\n <label class=\"give-freely-radio-option\" style={styles.goodbyeItem}>\n <input\n type=\"radio\"\n name=\"gf-rad-goodbye\"\n value=\"18250\"\n onChange={() => setDays(18250)/* 50 years */}\n />\n <span innerHTML=\n {t('suppress.suppressionPeriodNever')}\n />\n </label>\n </Show>\n </div>\n <button\n class=\"give-freely-submit-button\"\n style={{\n ...styles.selectButton,\n 'font-weight': '700',\n 'margin-top': '10px',\n 'margin-bottom': '0px',\n 'background-color': props.checkoutPopupConf.checkoutPopupSelectCharityButtonBgColor || '#0052FF',\n width: '100px',\n }}\n onClick={() => {\n const radio = days();\n if (radio) {\n props.onGoodbye(radio);\n props.setScreen('main');\n }\n }}\n >\n <span innerHTML={t('suppress.submitButton')} />\n </button>\n </div>\n );\n}\n","/** @jsxImportSource solid-js */\nimport {\n createSignal, onCleanup, onMount, Show,\n} from 'solid-js';\nimport { CheckoutPopupStyles as styles } from '../CheckoutPopup.styles';\nimport { PartnerGiveFreelyConfig } from '../../../shared/config/types';\nimport { StringUtils } from '../../../shared/utils/string-utils';\nimport { useT } from '../../lib/hooks/useT';\nimport { GfCheckoutPopupCharity } from '../../GfAdUnit';\n\ninterface DonateScreenProps {\n checkoutPopupConf: PartnerGiveFreelyConfig;\n selectedCharity: GfCheckoutPopupCharity | undefined;\n failedDonation: boolean;\n onClose: () => void;\n setScreen: (screen: 'main' | 'goodbye' | 'donate') => void;\n}\n\nexport function DonateScreen(props: DonateScreenProps) {\n const [closingSecondsLeft, setClosingSecondsLeft] = createSignal<number | null>(null);\n const t = useT();\n let closingIntervalId: NodeJS.Timeout;\n\n const startClosingCountdown = () => {\n const checkoutPopupDonationSuccessAutoCloseInSeconds = props.checkoutPopupConf.checkoutPopupDonationSuccessAutoCloseInSeconds ?? 3;\n setClosingSecondsLeft(checkoutPopupDonationSuccessAutoCloseInSeconds);\n\n closingIntervalId = setInterval(() => {\n setClosingSecondsLeft((prev) => {\n if (prev === null || prev <= 1) {\n clearInterval(closingIntervalId);\n props.onClose();\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n };\n\n onCleanup(() => clearInterval(closingIntervalId));\n\n onMount(() => {\n if (!props.failedDonation) {\n startClosingCountdown();\n }\n });\n\n return (\n <div style={{ 'font-size': '14px' }}>\n <div style={{ ...styles.header, 'flex-direction': 'row' }}>\n <div style={{ ...styles.headingGrow, 'margin-top': '20px' }}>\n <span innerHTML={props.failedDonation ? t('donate.failTitle') : t('donate.title')} />\n </div>\n <button\n class=\"give-freely-close-button\"\n style={{ ...styles.closeButton, 'align-self': 'flex-start' }}\n onClick={() => props.onClose()}\n aria-label=\"Close\"\n >\n ×\n </button>\n </div>\n <hr />\n <div style={{ padding: '30px', height: '150px', 'font-size': '14px' }}>\n <span innerHTML={props.failedDonation ? t('donate.failContent') : t('donate.content')} />\n </div>\n <Show when={!props.failedDonation} >\n <div>\n <p style={styles.autoClosingLabel}>\n <span innerHTML={StringUtils.formatMessage(t('donate.autoClosing'), closingSecondsLeft() ?? 0)} />\n </p>\n </div>\n </Show>\n </div>\n );\n}\n","/** @jsxImportSource solid-js */\nimport {\n createEffect, createSignal, Show,\n} from 'solid-js';\nimport { RateKindMap, WildfireActiveDomain, WildfireMerchantRateDetail } from '../../shared/vendors/wildfire/types';\nimport { PartnerGiveFreelyConfig } from '../../shared/config/types';\nimport { Logger } from '../../shared/utils/logger';\nimport { CheckoutPopupStyles as styles } from './CheckoutPopup.styles';\nimport { MainScreen } from './components/MainScreen';\nimport { GoodbyeScreen } from './components/GoodbyeScreen';\nimport { DonateScreen } from './components/DonateScreen';\nimport { GfCheckoutPopupCharity } from '../GfAdUnit';\n\ninterface CheckoutPopupProps {\n checkoutPopupConf: PartnerGiveFreelyConfig;\n elementId: string;\n activeDomain: WildfireActiveDomain;\n merchantRates: WildfireMerchantRateDetail<keyof RateKindMap>[];\n onClose: (days?: number) => void;\n onDonate: (\n charity: GfCheckoutPopupCharity,\n activeDomain: WildfireActiveDomain\n ) => Promise<boolean>;\n onOfferDetailsClick: (toggleState: boolean) => Promise<void>;\n logger: Logger;\n}\n\nexport function CheckoutPopup(props: CheckoutPopupProps) {\n const [screen, setScreen] = createSignal<'main' | 'goodbye' | 'donate'>('main');\n const [selectedCharity, setSelectedCharity] = createSignal<GfCheckoutPopupCharity | undefined>();\n const [failedDonation, setFailedDonation] = createSignal<boolean>(false);\n const [backdropHidden, setBackdropHidden] = createSignal<boolean>(false);\n\n let dialogRef: HTMLDialogElement | undefined;\n\n createEffect(() => {\n if (dialogRef) {\n if (props.checkoutPopupConf.containerStyle?.showAsModal) dialogRef.showModal();\n else dialogRef.showPopover();\n\n dialogRef.focus();\n dialogRef.blur();\n }\n });\n\n const closeAdClick = () => {\n props.logger.debug('Close button clicked');\n props.onClose();\n };\n\n const charityClick = async (charity: GfCheckoutPopupCharity, skipSuccess: boolean = false) => {\n // We close the popup as soon as a charity is selected\n if (skipSuccess) {\n props.onClose();\n }\n\n props.logger.info('Charity selected', {\n charity,\n domain: props.activeDomain.Domain,\n });\n setSelectedCharity(charity);\n const success = await props.onDonate(charity, props.activeDomain);\n\n if (skipSuccess) {\n props.onClose();\n return;\n }\n\n setFailedDonation(!success);\n setScreen('donate');\n };\n\n const suppressClick = () => {\n props.logger.debug('Suppress button clicked');\n setScreen('goodbye');\n };\n\n const back = () => {\n props.logger.debug('Navigating back to main screen');\n setScreen('main');\n };\n\n const handleGoodbye = (days: number) => {\n props.logger.info('User chose to hide popup', { days });\n props.onClose(days);\n };\n\n let containerRef: HTMLDivElement | undefined;\n\n return (\n <dialog popover=\"manual\" ref={dialogRef}\n class={backdropHidden() ? 'backdrop-hidden' : ''}\n style={{\n ...styles.container,\n ...(props.checkoutPopupConf.containerStyle?.customStyle ?? {}),\n }} id={props.elementId}>\n <div ref={containerRef} style={styles.scroller}>\n <Show when={screen() === 'main'}>\n <MainScreen\n setBackdropHidden={setBackdropHidden}\n mainContainerRef={containerRef}\n dialogRef={dialogRef}\n checkoutPopupConf={props.checkoutPopupConf}\n activeDomain={props.activeDomain}\n merchantRates={props.merchantRates}\n onClose={closeAdClick}\n onCharitySelect={charityClick}\n onSuppress={suppressClick}\n onOfferDetailsClick={props.onOfferDetailsClick}\n logger={props.logger}\n />\n </Show>\n\n <Show when={screen() === 'goodbye'}>\n <GoodbyeScreen\n checkoutPopupConf={props.checkoutPopupConf}\n onClose={() => props.onClose()}\n onBack={back}\n onGoodbye={handleGoodbye}\n setScreen={setScreen}\n />\n </Show>\n\n <Show when={screen() === 'donate'}>\n <DonateScreen\n checkoutPopupConf={props.checkoutPopupConf}\n selectedCharity={selectedCharity()}\n onClose={() => props.onClose()}\n failedDonation={failedDonation()}\n setScreen={setScreen}\n />\n </Show>\n </div>\n </dialog>\n );\n}\n","export function cartOrCheckoutRule(url: string): boolean {\n const keywords = ['cart', 'checkout', 'shopping-bag', 'shopping-basket', 'shopping-cart', 'basket'];\n const combines = ['', '.asp', '.aspx', '.php', '.js', '.htm', '.html'];\n const final = keywords.flatMap((keyword) => combines.map((combine) => keyword + combine))\n .filter((x) => x !== 'basket');\n\n const exclusions = ['tote-cart', 'tote.cart'];\n\n const path = url;\n const absoluteMatches = final.filter((x) => path.includes(x));\n const segments = path.split('/');\n\n const result = !segments.some((x) => exclusions.some((ex) => x.includes(ex)))\n && (segments.some((segment) => final.some((keyword) => segment.startsWith(keyword)\n || segment.endsWith(keyword),\n )) || segments[segments.length - 1].toLowerCase() === 'basket'\n\n || absoluteMatches.length > 1\n || (absoluteMatches.length === 1 && path.includes('shopping')));\n\n return result;\n}\n","export function bookingRule(url: string, documentRef: Document): boolean {\n // TODO: This rule is incomplete. Won't track sites like https://www.hrs.com/ checkout. We need to pull in more rules from GF.\n const keywords = ['book'];\n const segments = url.split('/');\n return segments.some((segment) => keywords.some((keyword) => segment.startsWith(keyword)\n || segment.endsWith(keyword),\n )) && documentRef.evaluate(\"//*[self::h1 or self::h2 or self::h3 or self::h4 or self::h5 or self::h6][contains(., 'Your Reservation') or contains(., 'Your reservation')]\", documentRef, null, XPathResult.ANY_TYPE, null)?.iterateNext() != null;\n}\n","import { MESSAGE_TYPES, sendMessage } from '../../shared';\r\nimport { WildfireActiveDomain } from '../../shared/vendors/wildfire/types';\r\n\r\n/**\r\n * Retrieve the shop domain from the background service using the shop ID\r\n * @param shopId The Shopify shop ID to look up\r\n * @returns Promise that resolves to true if a matching domain was found in storage\r\n */\r\nexport async function retrieveShopDomain(shopId: number): Promise<WildfireActiveDomain | null> {\r\n try {\r\n // Send message to background service to get domain by shop ID\r\n const response = await sendMessage<typeof MESSAGE_TYPES.GET_DOMAIN_BY_SHOP_ID>({\r\n type: MESSAGE_TYPES.GET_DOMAIN_BY_SHOP_ID,\r\n payload: { shopId },\r\n });\r\n\r\n if (response.payload.found && response.payload.domain) {\r\n return response.payload.domain;\r\n }\r\n return null;\n } catch {\r\n return null;\r\n }\r\n}\n","import { Logger } from '../../../../shared/utils/logger';\nimport { WildfireActiveDomain } from '../../../../shared/vendors/wildfire/types';\nimport { retrieveShopDomain } from '../../../services/retrieveShopPayDomain';\nimport { sendShopPayId } from '../../../services/sendShopPayId';\n\nexport function shopPayIdentify(activeDomain: WildfireActiveDomain, logger: Logger): number {\n const shopId = getShopIdFromWindow(logger) || getShopIdFromStoreMetaTag();\n if (shopId > 0) {\n sendShopPayId(shopId, activeDomain, logger);\n }\n return shopId;\n}\n\n/**\n * returns true or false depending on whether the current page is a Shopify/Shop Pay checkout page and the domain is found\n * @returns\n */\nexport async function shopPayRule(logger: Logger): Promise<boolean> {\n const shopId = getShopIdFromWindow(logger) || getShopIdFromStoreMetaTag();\n // For shop.app, attempt to retrieve the store domain using the shop ID\n if (window.location.hostname === 'shop.app' || window.location.hostname.endsWith('.shop.app')) {\n if (shopId > 0) {\n // For shop.app we attempt to look up the actual store domain\n const domain = await retrieveShopDomain(shopId);\n if (!domain) return false;\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Attempt to get the Shopify shop ID from the window object\n * Uses a more direct approach to extract the shop ID from the page\n */\nexport function getShopIdFromWindow(logger: Logger): number {\n try {\n // We'll use a more direct approach to extract the shop ID from the page\n\n // Method 1: Check if shop ID is in a script tag\n const scripts = Array.from(document.querySelectorAll('script'));\n for (const script of scripts) {\n if (script.dataset?.shopId && (script.dataset?.shopId?.startsWith('gid') || script.src.includes('shopify'))) {\n const parsedId = parseInt(script.dataset.shopId.replace('gid://shopify/Shop/', ''));\n if (!Number.isNaN(parsedId) && parsedId > 0) {\n return parsedId;\n }\n }\n\n // Look for inline scripts that might contain ShopifyAnalytics config\n const content = script.textContent || '';\n if (content.includes('ShopifyAnalytics') && content.includes('shopId')) {\n // Extract shopId using regex\n const match = content.match(/shopId['\"]*:\\s*['\"]*(\\d+)['\"]*[,}]/);\n if (match && match[1]) {\n const parsedId = parseInt(match[1]);\n if (!Number.isNaN(parsedId) && parsedId > 0) {\n return parsedId;\n }\n }\n }\n }\n\n // Method 2: Look for Shopify data in the DOM\n const shopifyElement = document.querySelector('[data-shop-id]');\n if (shopifyElement instanceof HTMLElement) {\n const { shopId } = shopifyElement.dataset;\n if (shopId) {\n const parsedId = parseInt(shopId);\n if (!Number.isNaN(parsedId) && parsedId > 0) {\n return parsedId;\n }\n }\n }\n\n // Method 3: Check for Shopify object in global context (less reliable in content scripts)\n // We'll still try the original approach as a fallback\n // @ts-expect-error - Accessing global window properties that might not be typed\n const possibleShopId = window?.ShopifyAnalytics?.lib?.trekkie?.defaultAttributes?.shopId;\n if (possibleShopId) {\n return parseInt(possibleShopId) || 0;\n }\n\n return 0;\n } catch (error) {\n logger.error('Error accessing ShopifyAnalytics:', error);\n return 0;\n }\n}\n\n/**\n * Attempt to get the Shopify shop ID from meta tags (for shop.app pages)\n */\nexport function getShopIdFromStoreMetaTag(): number {\n try {\n if (!window.location.href.startsWith('https://shop.app')) return 0;\n\n const meta = document?.head?.querySelector<HTMLMetaElement>('meta[name=\"store\"][content]');\n if (!meta) return 0;\n\n try {\n const content = JSON.parse(meta.content);\n return content?.id || 0;\n } catch {\n return 0;\n }\n } catch {\n return 0;\n }\n}\n","import { PartnerGiveFreelyConfig } from '../../../../shared/config/types';\nimport { Logger } from '../../../../shared/utils/logger';\n\nconst logger = Logger.getInstance();\n\n/**\n * Rule to detect cart/checkout pages based on merchant-specific regex patterns\n * Simplified from the original CartWorker implementation\n * @param currentUrl The URL to check against the merchant regex rules\n * @param hostname The hostname from the URL\n */\nexport function merchantRegexRule(config: PartnerGiveFreelyConfig, currentUrl: string, hostname: string): boolean {\n try {\n logger.debug('Checking merchant regex rules', { currentUrl });\n\n // Find matching merchant rules using secure domain matching\n // Allows exact match OR proper subdomain (e.g., shop.example.com matches example.com)\n // Prevents partial matches (e.g., fakeamazon.com won't match amazon.com)\n const matchingMerchants = config.merchantPopupRules.filter(\n (merchant) => hostname === merchant.domain || hostname.endsWith(`.${merchant.domain}`),\n );\n\n if (matchingMerchants.length === 0) {\n logger.debug('No matching merchant rules found for domain', { currentUrl });\n return false;\n }\n\n // Check if any of the merchant's regex rules match the current URL\n for (const merchant of matchingMerchants) {\n for (const ruleObj of merchant.rules) {\n try {\n const regex = new RegExp(ruleObj.rule);\n if (regex.test(currentUrl)) {\n logger.debug('Merchant regex rule matched', {\n merchant: merchant.name,\n rule: ruleObj.rule,\n currentUrl,\n });\n return true;\n }\n } catch (regexError) {\n logger.error('Invalid regex in merchant rule', {\n merchant: merchant.name,\n rule: ruleObj.rule,\n error: regexError,\n });\n }\n }\n }\n\n logger.debug('No matching regex rules found', { currentUrl });\n return false;\n } catch (error) {\n logger.error('Error in merchantRegexRule', error);\n return false;\n }\n}\n","import { PartnerGiveFreelyConfig } from '../../shared/config/types';\nimport { Logger } from '../../shared/utils/logger';\n\nexport function detectPageLanguage(config?: PartnerGiveFreelyConfig): string {\n // Method 0: Custom language detection based on configuration\n if (config?.customLanguageDetection && config.customLanguageDetection.length > 0) {\n const currentUrl = window.location.href;\n const pageText = document.body.textContent?.toLowerCase() || '';\n\n for (const rule of config.customLanguageDetection) {\n try {\n // Test if current URL matches the regex pattern\n const urlRegex = new RegExp(rule.urlPattern);\n if (urlRegex.test(currentUrl)) {\n // Search for keywords in page content\n for (const [keyword, language] of Object.entries(rule.keywords)) {\n if (pageText.includes(keyword.toLowerCase())) {\n return language;\n }\n }\n }\n } catch (error) {\n // If regex is invalid, skip this rule and continue\n Logger.getInstance().warn(`Invalid regex pattern in customLanguageDetection: ${rule.urlPattern}`, error);\n }\n }\n }\n\n // Method 1: Check HTML lang attribute (most reliable for page content)\n const htmlLang = document.documentElement.lang;\n\n // Method 2: Check Content-Language meta tag\n const metaLanguage = (document.querySelector('meta[http-equiv=\"Content-Language\"]') as HTMLMetaElement | null)?.content;\n\n // Method 3: Check hreflang link elements\n const hrefLang = (document.querySelector('link[rel=\"alternate\"][hreflang]') as HTMLLinkElement | null)?.getAttribute('hreflang');\n\n // Method 4: Use navigator.language (user's browser setting)\n const browserLanguage = navigator.language;\n\n // Get the detected language\n const detectedLanguage = htmlLang || metaLanguage || hrefLang || browserLanguage || 'en';\n\n // Normalize the language code by removing any country code (convert \"en-US\" to \"en\")\n const normalizedLanguage = typeof detectedLanguage === 'string' ? detectedLanguage.split('-')[0] : 'en';\n\n return normalizedLanguage;\n}\n","import { PartnerGiveFreelyConfig } from '../../../../shared/config/types';\nimport { detectPageLanguage } from '../../../language';\n\n/**\n * Rule to check if the current page language matches English\n * @param config The configuration object containing the checkoutPopupOnlyShowLanguageMatch property\n * @returns True if the property doesn't exist or is false, or if the page language matches English\n */\nexport function languageMatchRule(config: PartnerGiveFreelyConfig): boolean {\n // If the property doesn't exist or is false, return true\n if (config.checkoutPopupOnlyShowLanguageMatch !== true) {\n return true;\n }\n\n // If checkoutPopupOnlyShowLanguageMatch is true, we need to check the language\n const detectedLanguage = detectPageLanguage(config);\n\n // If language setting is enabled and page language matches english\n return detectedLanguage === 'en';\n}\n","import { PartnerGiveFreelyConfig } from '../../../shared/config/types';\nimport { Logger } from '../../../shared/utils/logger';\nimport {\n bookingRule, cartOrCheckoutRule, shopPayRule, merchantRegexRule, languageMatchRule,\n} from './rules';\n\nexport const checkoutRulesTest = async (config: PartnerGiveFreelyConfig) => {\n const logger = Logger.getInstance();\n logger.configure({ enabled: true, title: 'Content - checkoutRulesTest' });\n\n const locationUrl = new URL(globalThis.location.href);\n const currentUrl = locationUrl.href;\n const { hostname } = locationUrl;\n\n logger.debug('Checking if popup should be shown', {\n currentUrl,\n });\n\n const shopPayResult = await shopPayRule(logger);\n const shouldShow = languageMatchRule(config) // We want to show the popup only if the language matches\n && (cartOrCheckoutRule(locationUrl.pathname.toLowerCase())\n || bookingRule(currentUrl, document)\n || merchantRegexRule(config, currentUrl, hostname)\n || shopPayResult);\n\n logger.debug('Popup show decision based on rules', {\n shouldShow,\n matchesCartRule: cartOrCheckoutRule(locationUrl.pathname.toLowerCase()),\n matchesBookingRule: bookingRule(currentUrl, document),\n matchesShopPayRule: shopPayResult,\n matchesMerchantRegexRule: merchantRegexRule(config, currentUrl, hostname),\n matchesLanguageRule: languageMatchRule(config),\n });\n\n return shouldShow;\n};\n","import { browser } from '../../../shared';\n\n/**\n * Retrieves all installed ad unit extensions as a csv string optionally skipping the current one\n * @param roots All ad unit root elements (divs) identified\n * @returns csv list of other ad unit extensions\n */\nconst getAdUnitInstalledExtensions = (roots: HTMLCollectionOf<Element>, skipCurrentExtension = false): string | null => {\n if (roots.length < 2 && skipCurrentExtension) return null;\n\n return Array.from(roots)\n .filter((root) => !skipCurrentExtension || (root as HTMLDivElement).dataset.extensionId !== browser.runtime.id)\n .map((root) => (root as HTMLDivElement).dataset.extensionName)\n .join(',');\n};\n\nexport default getAdUnitInstalledExtensions;\n","import { JSX, Accessor, createMemo } from 'solid-js';\r\nimport {\r\n ContentContext, TranslationProviderInterface, ContentProviderInterface, CharityProviderInterface,\r\n} from './translationContext';\r\n\r\ninterface ContentProviderProps {\r\n children: JSX.Element | JSX.Element[];\r\n translate: Accessor<TranslationProviderInterface | undefined>;\r\n charities: Accessor<CharityProviderInterface | undefined>;\r\n}\r\n\r\nexport const TranslationProvider = (props: ContentProviderProps) => {\r\n const contentProvider = createMemo(() => {\r\n const translateFn = props.translate() || ((_: string) => '');\r\n const getAllCharitiesFn = props.charities() || (() => []);\r\n\r\n return {\r\n translate: translateFn,\r\n getAllCharities: getAllCharitiesFn,\r\n } as ContentProviderInterface;\r\n });\r\n\r\n return (\r\n <ContentContext.Provider value={contentProvider}>\r\n {props.children}\r\n </ContentContext.Provider>\r\n );\r\n};\r\n","import { storage } from '../utils/storage';\nimport { Logger } from '../utils/logger';\nimport { COUNTRY_CODE_STORAGE_KEY } from '../constants';\n\nconst logger = Logger.getInstance();\n\ninterface ILookUp {\n country: {\n 'iso_code': string\n }\n}\n\nconst detectUsersCountry = async (): Promise<string | undefined> => {\n logger.debug('detecting country');\n const requestOptions = {\n method: 'GET',\n headers:\n {\n 'Content-Type': 'application/json',\n Authorization: 'Basic OTEzOTkxOnFlYmpaWF9DOGNRY0lxSHA4WTVjNGxzU1pRSlM2VW9MMExzTF9tbWs=',\n },\n };\n\n try {\n // Make the fetch call to the geolocation API\n const response = await fetch('https://geoip.maxmind.com/geoip/v2.1/country/me', requestOptions);\n logger.debug('Received geolocation response', { status: response.status });\n if (!response.ok) {\n logger.error('Failed to get geolocation data', { status: response.status, statusText: response.statusText });\n return undefined;\n }\n const data = await response.json() as ILookUp;\n if (!data) {\n throw new Error('There was an error fetching geoip look up');\n }\n await storage.set(COUNTRY_CODE_STORAGE_KEY, data.country.iso_code);\n return data.country.iso_code;\n } catch (err) {\n // Prevent logging this remotely to avoid further network errors and enter in an infinite loop\n logger.error('Failed to get geolocation data', { error: err }, true);\n return undefined;\n }\n};\n\nexport const hydrateUserCountry = async (): Promise<void> => {\n try {\n await detectUsersCountry();\n } catch (error) {\n // Intentionally swallow errors to ensure this always resolves\n logger.error('Error in hydrateUserCountry', { error });\n }\n return undefined;\n};\n\nexport const getCountryCode = async (): Promise<string | undefined> => {\n const countryCode = await storage.get<string>(COUNTRY_CODE_STORAGE_KEY);\n if (countryCode) return countryCode;\n return detectUsersCountry();\n};\n","/** @jsxImportSource solid-js */\nimport { createSignal, onCleanup, onMount } from 'solid-js';\nimport { CheckoutPopup } from './CheckoutPopup/CheckoutPopup';\nimport { RateKindMap, WildfireActiveDomain, WildfireMerchantRateDetail } from '../shared/vendors/wildfire/types';\nimport { PartnerGiveFreelyConfig } from '../shared/config/types';\nimport { PopupEvent } from '../shared/analytics/types';\nimport { Analytics } from '../shared/analytics';\nimport { getIsAdUnitMuted } from './services/getIsAdUnitMuted';\nimport { shouldStandDown } from './services/shouldStandDown';\nimport { getActiveDomain } from './services/getActiveDomain';\nimport { hideAd } from './services/hideAd';\nimport { getLanguageContent } from './services/getLanguageContent';\nimport { checkoutRulesTest } from './lib/visibility';\nimport { activateOffer } from './services/activateOffer';\nimport { shopPayIdentify } from './lib/visibility/rules/shopPayRule';\nimport { retrieveShopDomain } from './services/retrieveShopPayDomain';\nimport { compareVersion } from '../shared/utils/compare-version';\nimport { getCurrentVersion } from '../shared/utils/current-version';\nimport { detectPageLanguage } from './language';\nimport { browser, DEFAULT_COUNTRY, VISITED_WEBSITE_PREFIX_STORAGE_KEY } from '../shared';\nimport getAdUnitInstalledExtensions from './lib/utils/getAdUnitInstalledExtensions';\nimport { checkSiteMatches } from './services/checkSiteMatches';\nimport { TranslationProvider } from './context/translation/TranslationProvider';\nimport { ContentProviderInterface } from './context/translation/translationContext';\nimport { getCountryCode } from '../shared/services/geolocation';\nimport { Logger } from '../shared/utils/logger';\n\nfunction hasVisitedWebsiteAlready(website: string) {\n const key = `${VISITED_WEBSITE_PREFIX_STORAGE_KEY}${website}`;\n const hasVisited = sessionStorage.getItem(key);\n if (hasVisited) {\n return true;\n }\n sessionStorage.setItem(key, 'true');\n return false;\n}\n\nexport interface GfCheckoutPopupCharity {\n ein: string;\n tpi: string;\n}\n\nexport interface CharitiesList {\n [order: string]: {\n ein: string;\n decorator?: string;\n decoratorLeftStyle?: string;\n decoratorRightStyle?: string;\n };\n}\n\nconst visibilityMediaQueryString = '(max-width: 600px), (max-height: 480px)';\nexport function GfAdUnit(props: { popupConfig: PartnerGiveFreelyConfig, logger: Logger }) {\n const [activeDomain, setActiveDomain] = createSignal<WildfireActiveDomain | undefined>(undefined);\n const [showPopup, setShowPopup] = createSignal(false);\n const [merchantRates, setMerchantRates] = createSignal<\n WildfireMerchantRateDetail<keyof RateKindMap>[]\n >([]);\n const [translationProvider, setTranslationProvider] = createSignal<ContentProviderInterface | undefined>();\n const [selectedCharities, setSelectedCharities] = createSignal<CharitiesList>({});\n let checkoutRulesWatcherInterval: number | undefined;\n\n onMount(async () => {\n props.logger.info('Mounting GfApp component');\n try {\n // check to see if site matches is on, and run the regex check against all regex in the config for site matches, then log analytics anonymously if it does match with the url\n checkSiteMatches(props.popupConfig);\n\n // We need to get translations ASAP to avoid flickering. We can't wait for the interval to start\n const languageCode = detectPageLanguage(props.popupConfig);\n void getTranslationProvider(languageCode);\n\n const currentVersion = getCurrentVersion();\n\n if (\n props.popupConfig.minVersion\n && compareVersion(currentVersion, props.popupConfig.minVersion)\n ) {\n props.logger.debug(`Current version: ${currentVersion}. Minimum version ${props.popupConfig.minVersion} not met`);\n return;\n }\n\n const currentCountry = (await getCountryCode()) ?? DEFAULT_COUNTRY;\n // We get the charities based on the current country or default to 'EN' if not found\n const charities = props.popupConfig.charities[currentCountry.toLowerCase()] ?? props.popupConfig.charities[DEFAULT_COUNTRY];\n setSelectedCharities(charities || {});\n props.logger.debug('Charities for current country', { currentCountry, charities });\n\n if (props.popupConfig.checkoutPopupMasterSwitch === false) {\n props.logger.debug('Checkout popup master switch is disabled');\n return;\n }\n\n // 2. Check for other gf extensions installed\n const gfContainerRoots = document.getElementsByClassName('give-freely-root');\n let looserExtension = false;\n if (gfContainerRoots.length > 1) {\n props.logger.debug('There is more than one gf extension installed');\n if ((gfContainerRoots.item(0) as HTMLDivElement).dataset.extensionId\n !== browser.runtime.id) {\n props.logger.debug('Giving preference to the first gf extension injected in the DOM');\n looserExtension = true;\n }\n\n props.logger.debug('Providing this extension preference over the other installed extensions');\n }\n\n // 3. Get active domain\n const { domain, rates } = await getActiveDomain(props.logger);\n setMerchantRates(rates);\n setActiveDomain(domain);\n if (!domain) {\n if (window.location.hostname !== 'shop.app' && !window.location.hostname.endsWith('.shop.app')) {\n // If it's not a shop domain, and it wasn't an active domain, we don't show the popup\n setShowPopup(false);\n return;\n }\n\n // If it's a shop app domain, we try to get the shop ID\n const shopId = window.location.pathname.split('/')[2];\n if (!shopId) {\n props.logger.error('Shop ID not found');\n setShowPopup(false);\n return;\n }\n const shopDomain = await retrieveShopDomain(parseInt(shopId));\n if (!shopDomain) {\n props.logger.error('Shop domain not found');\n setShowPopup(false);\n return;\n }\n props.logger.debug('Shop domain found', { shopDomain });\n setActiveDomain(shopDomain);\n } else {\n // If we know it's an active domain, we attempt to identify the shop pay id and store it.\n await shopPayIdentify(domain, props.logger);\n }\n\n // 4. Evaluate if it's globally muted or suppressed\n const isMutedFromStorage = await getIsAdUnitMuted(props.logger);\n if (isMutedFromStorage) {\n /* void Analytics.trackEvent(PopupEvent.checkoutPopupNotShown,\n {\n reason: `Ad prevented to be shown since it's muted/suppressed}`,\n url: globalThis.window.location.href\n }); */\n\n return;\n }\n\n // 5. Stand Down evaluation\n if (!activeDomain()) {\n // If at this point we don't have an active domain, we don't show the popup\n setShowPopup(false);\n return;\n }\n\n const isStandDown = await shouldStandDown(props.logger, activeDomain()!);\n if (isStandDown) {\n setShowPopup(false);\n\n /* void Analytics.trackEvent(PopupEvent.checkoutPopupNotShown,\n {\n reason: \"Stand-down policy\",\n url: globalThis.window.location.href\n }); */\n\n return;\n }\n // Log the active domain visited if it hasn't been visited in this session as an analytics event, if configured\n const anonymousActiveDomainLoggingConfig = props.popupConfig?.anonymousActiveDomainLogging ?? false;\n const currentActiveDomain = activeDomain() ?? undefined;\n const shouldLogActiveDomain = currentActiveDomain && anonymousActiveDomainLoggingConfig && !hasVisitedWebsiteAlready(currentActiveDomain.Domain);\n\n if (shouldLogActiveDomain) {\n void Analytics.trackEvent(PopupEvent.checkoutPopupActiveDomain,\n {\n url: currentActiveDomain.Domain,\n });\n }\n\n // 6. Start Popup Watcher\n checkoutRulesWatcherInterval = window.setInterval(async () => {\n props.logger.debug('Checking checkout rules');\n const shouldShowResult = await checkoutRulesTest(props.popupConfig);\n props.logger.debug('Should show popup based on checkout rules', { shouldShowResult });\n\n if (shouldShowResult && looserExtension) {\n void Analytics.trackEvent(PopupEvent.checkoutPopupLooserExtension,\n {\n url: globalThis.window.location.href,\n winner: (gfContainerRoots.item(0) as HTMLDivElement).dataset.extensionName,\n });\n\n props.logger.debug('Standing down because, another ad-unit extension will pop');\n\n clearInterval(checkoutRulesWatcherInterval);\n return;\n }\n\n // Check viewport size before showing popup\n if (shouldShowResult && globalThis.window.matchMedia(visibilityMediaQueryString).matches) {\n props.logger.debug('Viewport too small for displaying the popup');\n\n // Fire analytics when TRANSITIONING from shown to hidden due to viewport size\n if (showPopup()) {\n void Analytics.trackEvent(PopupEvent.checkoutPopupHiddenProgrammatically,\n {\n url: globalThis.window.location.href,\n merchantId: currentActiveDomain?.Merchant?.ID,\n reason: 'Viewport size became too small',\n });\n }\n\n setShowPopup(false);\n void Analytics.trackEvent(PopupEvent.checkoutPopupNotShownPerViewportSize,\n {\n url: globalThis.window.location.href,\n pageLanguage: languageCode,\n merchantId: currentActiveDomain?.Merchant?.ID,\n viewPortSize: { height: globalThis.window.innerHeight, width: globalThis.window.innerWidth },\n });\n return;\n }\n\n // Only fire analytics when TRANSITIONING from hidden to shown\n if (shouldShowResult && !showPopup()) {\n void Analytics.trackEvent(PopupEvent.checkoutPopupShown,\n {\n url: globalThis.window.location.href,\n pageLanguage: languageCode,\n merchantId: currentActiveDomain?.Merchant?.ID,\n domainId: currentActiveDomain?.ID,\n /*\n This might not report the full list of looser extensions (There is a small chance that some of them\n might not have been injected by the time of the evaluation)\n */\n looserCompetingExtensions: getAdUnitInstalledExtensions(gfContainerRoots, true),\n });\n }\n\n // Fire analytics when TRANSITIONING from shown to hidden programmatically\n if (!shouldShowResult && showPopup()) {\n void Analytics.trackEvent(PopupEvent.checkoutPopupHiddenProgrammatically,\n {\n url: globalThis.window.location.href,\n merchantId: currentActiveDomain?.Merchant?.ID,\n reason: 'Checkout rules no longer matched',\n });\n }\n\n setShowPopup(shouldShowResult);\n }, 2000);\n } catch (error) {\n setShowPopup(false);\n props.logger.error('An error occurred in GfApp', { error });\n }\n });\n\n onCleanup(() => {\n if (checkoutRulesWatcherInterval) {\n window.clearInterval(checkoutRulesWatcherInterval);\n }\n });\n\n const handleDonate = async (\n charity: GfCheckoutPopupCharity,\n currentActiveDomain: WildfireActiveDomain,\n ): Promise<boolean> => {\n props.logger.info('Processing donation', {\n charity,\n domain: currentActiveDomain.Domain,\n });\n\n const gfCommissionUniqueId = crypto.randomUUID();\n\n const activationResponse = await activateOffer(\n props.logger,\n currentActiveDomain,\n window.location.href,\n {\n ein: charity.ein,\n thirdPartyId: charity.tpi,\n },\n gfCommissionUniqueId,\n );\n\n props.logger.debug('Activate offer response', { activationResponse });\n\n void Analytics.trackEvent(\n activationResponse.payload.response\n ? PopupEvent.checkoutPopupDonation : PopupEvent.checkoutPopupFailedActivation,\n {\n activeDomain: currentActiveDomain.Domain,\n url: globalThis.window.location.href,\n merchantId: currentActiveDomain?.Merchant?.ID,\n domainId: currentActiveDomain?.ID,\n charity: {\n ein: charity.ein,\n tpi: charity.tpi,\n },\n rate: currentActiveDomain.Merchant.MaxRate,\n gfCommissionUniqueId,\n });\n\n return activationResponse.payload.response;\n };\n\n const handleHideAd = async (days?: number) => {\n setShowPopup(await hideAd(props.logger, days));\n if (checkoutRulesWatcherInterval) window.clearInterval(checkoutRulesWatcherInterval);\n };\n\n const handleTrackOfferDetailsDisplay = async (toggleState: boolean) => {\n void Analytics.trackEvent(PopupEvent.checkoutPopupOfferDetailsClicked,\n {\n action: toggleState ? 'opened' : 'closed',\n });\n };\n\n /**\n * Asynchronously sets the content provider with translations and charity functionality\n * @param currentLanguage\n */\n const getTranslationProvider = async (currentLanguage: string) => {\n props.logger.debug('Getting translation provider', { currentLanguage });\n\n // Use the dedicated service to get language content\n const { translations, charities } = await getLanguageContent(currentLanguage, props.logger);\n\n // Create a content provider that implements the ContentProviderInterface\n const contentProvider: ContentProviderInterface = {\n translate: (key: string): string => {\n if (translations && translations[key]) {\n return translations[key];\n }\n return '';\n },\n getAllCharities: () => {\n // Convert all charities to the Charity interface format\n const charitiesList = selectedCharities();\n return Object.entries(charitiesList).map(([order, charity]) => {\n const { ein } = charity;\n try {\n // Get charity metadata or null if not found\n const charityMetadata = charities?.[ein];\n\n if (!charityMetadata) {\n throw new Error(`Failed to find charity metadata for ein ${ein}`);\n }\n\n // Return charity with metadata, using optional chaining for cleaner code\n return {\n ein,\n tpi: charityMetadata.tpi,\n title: charityMetadata.title,\n order: parseInt(order, 10),\n logo: charityMetadata.logo,\n decorator: charity.decorator,\n decoratorLeftStyle: charity.decoratorLeftStyle,\n decoratorRightStyle: charity.decoratorRightStyle,\n };\n } catch {\n // If there's a problem with the charity we just skip it\n return {\n ein,\n tpi: '',\n title: '',\n order: 9,\n logo: '',\n };\n }\n });\n },\n };\n\n props.logger.debug('Setting content provider with translations and charity functions');\n setTranslationProvider(() => contentProvider);\n };\n\n // Create an accessor function that returns the translate function for backward compatibility\n const translateAccessor = () => translationProvider()?.translate;\n const getCharitiesAccessor = () => translationProvider()?.getAllCharities;\n\n return (\n <TranslationProvider\n translate={translateAccessor}\n charities={getCharitiesAccessor}\n >\n <div class=\"gf-app\">\n {activeDomain() && showPopup() && (\n <CheckoutPopup\n checkoutPopupConf={props.popupConfig!}\n elementId=\"give-freely-checkout-popup\"\n activeDomain={activeDomain()!}\n merchantRates={merchantRates()}\n onClose={handleHideAd}\n onDonate={handleDonate}\n onOfferDetailsClick={handleTrackOfferDetailsDisplay}\n logger={props.logger}\n />\n )}\n </div>\n </TranslationProvider>\n );\n}\n","import { PartnerGiveFreelyConfig } from '../../shared/config/types';\nimport { PopupEvent } from '../../shared/analytics/types';\nimport { Analytics } from '../../shared/analytics';\nimport { regexMatch } from '../../background/utils/regexMatch';\n\n/**\n * Checks if the current site matches any of the regex patterns in the config\n * and logs an analytics event if it does.\n *\n * @param config The partner configuration\n * @returns void\n */\nexport function checkSiteMatches(config: PartnerGiveFreelyConfig): void {\n const shouldCheckSiteMatches = config?.shouldCheckSiteMatches ?? false;\n if (!shouldCheckSiteMatches) {\n return;\n }\n const siteMatchesRegex = config?.siteMatchesRegex ?? [];\n let matchingRegex: string | undefined;\n\n const siteMatches = siteMatchesRegex.some((regex) => {\n const matches = regexMatch(window.location.href, regex);\n if (matches) {\n matchingRegex = regex;\n return true;\n }\n return false;\n });\n\n if (siteMatches && matchingRegex) {\n void Analytics.trackEvent(PopupEvent.checkoutPopupSiteMatches,\n {\n url: window.location.href,\n matchedRule: matchingRegex,\n uts: Date.now(),\n },\n true);\n }\n}\n","export function regexMatch(url: string, regexString: string): boolean {\n const regex = new RegExp(regexString);\n return regex.test(url);\n}\n","/**\n *\n * @param version1\n * @param version2\n * @returns true if version2 is greater than version1\n */\nexport const compareVersion = (version1: string, version2: string) => {\n if (version1 === version2) return false;\n\n const version1Segments = version1.split('.').map((segment) => parseInt(segment, 10));\n const version2Segments = version2.split('.').map((segment) => parseInt(segment, 10));\n\n for (let i = 0; i < version1Segments.length; i++) {\n if (version1Segments[i] < version2Segments[i]) return true;\n\n if (version1Segments[i] > version2Segments[i]) return false;\n }\n\n return false;\n};\n","import { sendMessage, MESSAGE_TYPES } from '../../shared';\r\nimport { Logger } from '../../shared/utils/logger';\r\nimport { RateKindMap, WildfireActiveDomain, WildfireMerchantRateDetail } from '../../shared/vendors/wildfire/types';\r\n\r\nexport interface GetActiveDomainResponse {\r\n isActive: boolean;\r\n domain: WildfireActiveDomain | undefined;\r\n rates: WildfireMerchantRateDetail<keyof RateKindMap>[];\r\n}\r\n\r\n/**\r\n * Checks if the current domain is active and retrieves the associated rates.\r\n *\r\n * @param logger\r\n * @returns\r\n */\r\nexport const getActiveDomain = async (\r\n logger: Logger,\r\n): Promise<GetActiveDomainResponse> => {\r\n const { hostname } = window.location;\r\n logger.debug('Checking if domain is active', { hostname });\r\n\r\n const domainResponse = await sendMessage({\r\n type: MESSAGE_TYPES.IS_ACTIVE_DOMAIN,\r\n payload: { hostname },\r\n });\r\n\r\n if (!domainResponse.payload.isActive) return { isActive: false, domain: undefined, rates: [] };\r\n\r\n logger.debug('Active domain', { domain: domainResponse.payload.domain });\r\n logger.debug('Merchant rates', { rates: domainResponse.payload.rates });\r\n\r\n logger.info('Domain and rates processed successfully.');\r\n\r\n return {\r\n isActive: true,\r\n domain: domainResponse.payload.domain,\r\n rates: domainResponse.payload.rates,\r\n };\r\n};\r\n","import { ShopifyShopInfo } from '../../background/strategies/StoreShopifyShopIdStrategy';\r\nimport { sendMessage, MESSAGE_TYPES } from '../../shared';\r\nimport { Logger } from '../../shared/utils/logger';\r\nimport { WildfireActiveDomain } from '../../shared/vendors/wildfire/types';\r\n\r\n/**\r\n * Sends the Shopify shop ID to the background service for storage\r\n * @param shopId The Shopify shop ID to store\r\n * @param domain The domain where the shop ID was found\r\n */\r\nexport function sendShopPayId(shopId: number, domain: WildfireActiveDomain, logger: Logger): void {\r\n if (!shopId || shopId <= 0) return;\r\n\r\n try {\r\n // Prepare shop ID info for sending to background\r\n const shopInfo: ShopifyShopInfo = {\r\n shopId,\r\n domain,\r\n };\r\n\r\n // Send message to background to store the shop ID\r\n sendMessage({\r\n type: MESSAGE_TYPES.STORE_SHOPIFY_SHOP_ID,\r\n payload: shopInfo,\r\n }).catch((error) => {\r\n logger.error('Error sending shop ID to background:', error);\r\n });\n } catch (error) {\r\n logger.error('Error sending Shopify shop ID:', error);\r\n }\r\n}\n","import { POPUP_HIDDEN_STORAGE_KEY } from '../../shared';\r\nimport { Logger } from '../../shared/utils/logger';\r\nimport { storage } from '../../shared/utils/storage';\r\n\r\ninterface StorageEntry {\r\n popupHide: number;\r\n}\r\n\r\nexport const getIsAdUnitMuted = async (logger: Logger) => {\r\n const storageExpiry = await storage.get<StorageEntry>(POPUP_HIDDEN_STORAGE_KEY);\r\n if (!storageExpiry) {\r\n logger.debug('No expiry found in storage');\r\n return false;\r\n }\r\n\r\n const { popupHide: expiry } = storageExpiry;\r\n const isMuted = expiry ? Date.now() < expiry : false;\r\n logger.debug('Is AdUnit Muted?', { isMuted, expiry });\r\n return isMuted;\r\n};\r\n","import { sendMessage, MESSAGE_TYPES } from '../../shared';\r\nimport { Logger } from '../../shared/utils/logger';\r\nimport { WildfireActiveDomain } from '../../shared/vendors/wildfire/types';\r\n\r\nexport const shouldStandDown = async (logger: Logger, wildfireActiveDomain: WildfireActiveDomain): Promise<boolean> => {\r\n const { Domain } = wildfireActiveDomain;\r\n const url = window.location.href;\r\n\r\n const { payload: shouldStandDownResult } = await sendMessage({\r\n type: MESSAGE_TYPES.SHOULD_STAND_DOWN,\r\n payload: {\r\n activeDomain: Domain,\r\n url,\r\n },\r\n });\r\n\r\n if (shouldStandDownResult.result) {\r\n logger.info('Stand Down detected');\r\n return true;\r\n }\r\n return false;\r\n};\n","import { MESSAGE_TYPES, sendMessageWithRetry } from '../../shared';\r\nimport { Logger } from '../../shared/utils/logger';\r\nimport { GiveFreelyCharity } from '../../shared/vendors/givefreely/types';\r\nimport { WildfireActiveDomain } from '../../shared/vendors/wildfire/types';\r\n\r\nexport const activateOffer = async (logger: Logger, activeDomain: WildfireActiveDomain, originalUrl: string, selectedCharity: GiveFreelyCharity, gfCommissionUniqueId: string) => {\r\n logger.debug('Activating offer', { activeDomain, selectedCharity });\r\n\r\n const response = await sendMessageWithRetry({\r\n type: MESSAGE_TYPES.ACTIVATE_OFFER,\r\n payload: {\r\n activeDomain,\r\n originalUrl,\r\n selectedCharity,\r\n gfCommissionUniqueId,\r\n },\r\n });\r\n\r\n logger.debug('Activate offer response', { response });\r\n return response;\r\n};\r\n","import { MESSAGE_TYPES, sendMessageWithRetry } from '../../shared';\r\nimport { Analytics } from '../../shared/analytics';\r\nimport { PopupEvent } from '../../shared/analytics/types';\r\nimport { Logger } from '../../shared/utils/logger';\r\n\r\nexport const hideAd = async (logger: Logger, days?: number) => {\r\n try {\r\n logger.info('Hiding ad', { days });\r\n\r\n const hideResponse = await sendMessageWithRetry({\r\n type: MESSAGE_TYPES.HIDE_POPUP,\r\n payload: { days: days ?? 0 },\r\n });\r\n\r\n if (days !== undefined) {\r\n void Analytics.trackEvent(PopupEvent.checkoutPopupSupressed,\r\n {\r\n url: globalThis.window.location.href,\r\n days,\r\n });\r\n }\r\n\r\n logger.info('Hiding ad response', { hideResponse });\r\n if (hideResponse.payload.ack) {\r\n logger.debug('Ad hidden successfully');\r\n return false;\r\n }\r\n\r\n logger.warn('Failed to hide ad');\r\n return true;\r\n } catch {\r\n return false; // whatever happens we always endup closing the popup\r\n }\r\n};\n","import { Logger } from '../../shared/utils/logger';\nimport { SelectedCharity, Translation } from '../../shared/i18n/types';\nimport { MESSAGE_TYPES, sendMessage } from '../../shared';\n\n/**\n * Fetches translations and charity data for the specified language\n * @param languageCode The language code to get content for\n * @param logger Optional logger instance\n * @returns Object containing translations and charities data\n */\nexport async function getLanguageContent(\n languageCode: string,\n logger?: Logger,\n): Promise<{\n translations: Translation | null;\n charities: SelectedCharity | null;\n}> {\n try {\n if (logger) {\n logger.debug('Getting language content', { languageCode });\n }\n\n const response = await sendMessage({\n type: MESSAGE_TYPES.GET_LANGUAGE_CONTENT,\n payload: {\n lang: languageCode,\n },\n });\n\n return {\n translations: response.payload.translations,\n charities: response.payload.charities,\n };\n } catch (error) {\n if (logger) {\n logger.error('Error getting language content', { error, languageCode });\n }\n\n return {\n translations: null,\n charities: null,\n };\n }\n}\n","/// <reference lib=\"dom\" />\n/// <reference lib=\"dom.iterable\" />\n\n/** @jsxImportSource solid-js */\nimport { render } from 'solid-js/web';\nimport { GfAdUnit } from './GfAdUnit';\nimport { getPopupConfig } from './services/getPopupConfig';\nimport { Logger } from '../shared/utils/logger';\nimport { browser } from '../shared';\nimport { logAffilliatedMerchantsSearchResults } from './services/logAffilliatedmerchantsSearchResults';\n\nconst baseStyles = (backdropColor: string | undefined) => `\n :host {\n all: initial;\n }\n\n .gf-scroll-remove::-webkit-scrollbar {\n border-radius-bottom-right: 15px;\n }\n\n button {\n cursor: pointer;\n transition: transform 0.1s ease;\n }\n\n button:active {\n transform: scale(0.98);\n }\n\n .give-freely-close-button:hover {\n opacity: 0.7;\n }\n\n input[type=\"radio\"] {\n margin-right: 8px;\n }\n\n hr {\n border: none;\n border-top: 1px solid #e5e5e5;\n margin: 1em 0;\n }\n\n dialog::backdrop {\n background-color: ${backdropColor || 'revert'};\n }\n\n dialog.backdrop-hidden::backdrop {\n background-color: transparent;\n }\n`;\n\n/**\n * Initializes the GiveFreely AdUnit UI by creating a\n * shadow DOM and rendering the main app component.\n * @returns The store instance\n */\nexport async function initializeAdUnit() {\n const containerId = `give-freely-root-${browser.runtime.id}`;\n\n // Check if the container already exists\n if (document.getElementById(containerId)) return;\n\n // Create container and shadow DOM\n const container = document.createElement('div');\n\n // Make sure the container has a unique id\n container.id = containerId;\n\n container.className = 'give-freely-root';\n container.style.display = 'block';\n container.dataset.extensionId = browser.runtime.id;\n container.dataset.extensionName = browser.runtime.getManifest().name || browser.runtime.id;\n\n document.body.appendChild(container);\n\n const shadow = container.attachShadow({ mode: 'open' });\n const innerContainer = document.createElement('div');\n\n const logger = Logger.getInstance();\n const popupConfig = await getPopupConfig();\n if (!popupConfig) {\n logger.error('No ad unit config found');\n return;\n }\n\n logger.configure({\n enabled: popupConfig.checkoutPopupLoggerEnabled ?? true,\n title: 'Content - GfAdUnit',\n minLevel: popupConfig.checkoutPopupMinLogLevel ?? 'error',\n });\n\n const contentStyle = baseStyles(popupConfig.containerStyle?.backdropColor);\n\n // Add base styles\n const style = document.createElement('style');\n style.textContent = contentStyle;\n\n shadow.appendChild(style);\n shadow.appendChild(innerContainer);\n\n if (popupConfig.countAppearances) void logAffilliatedMerchantsSearchResults(logger);\n\n // Render the Solid component\n render(() => <GfAdUnit popupConfig={popupConfig} logger={logger} />, innerContainer);\n}\n\n// Export everything that should be available in the UMD build\nexport {\n browser,\n};\n","import { sendMessage, MESSAGE_TYPES } from '../../shared';\r\n\r\nexport const getPopupConfig = async () => {\r\n const configResponse = await sendMessage({\r\n type: MESSAGE_TYPES.GET_POPUP_CONFIG,\r\n payload: {},\r\n });\r\n if (!configResponse.payload.config) {\r\n throw new Error('No checkout popup config found');\r\n }\r\n\r\n return configResponse.payload.config;\r\n};\n","import { MESSAGE_TYPES, sendMessage } from '../../shared';\nimport { Logger } from '../../shared/utils/logger';\nimport { extractGoogleResultUrls, isGoogleSearchResultUrl } from '../../shared/utils/serp';\n\n/**\n * Identifies the search results and sends a background message for logging those belonging to affiliated merchants\n * @returns Promise that resolves to true if the process was successful\n */\nexport async function logAffilliatedMerchantsSearchResults(logger: Logger): Promise<boolean> {\n try {\n const currentUrl = globalThis.window.location.href;\n const isGoogleSearchResult = isGoogleSearchResultUrl(currentUrl);\n logger.debug('Is a Google search result page?', isGoogleSearchResult);\n if (!isGoogleSearchResult) return false;\n\n // Extract search urls\n const searchResults = extractGoogleResultUrls();\n logger.info('The following search results were identified', searchResults);\n\n if (!searchResults || searchResults.length === 0) return false;\n\n // Send message to background service\n const response = await sendMessage<typeof MESSAGE_TYPES.LOG_MERCHANTS_IN_SEARCH_RESULTS>({\n type: MESSAGE_TYPES.LOG_MERCHANTS_IN_SEARCH_RESULTS,\n payload: {\n currentUrl,\n searchResults,\n source: 'google',\n },\n });\n\n return response?.payload?.result ?? false;\n } catch (ex) {\n logger.error('Error while identifying search results', ex);\n return false;\n }\n}\n","export const isGoogleSearchResultUrl = (url: string): boolean => {\n const googleSearchRegex = /^https?:\\/\\/(?:www\\.)?google\\.[a-z]{2,}(\\.[a-z]{2})?\\/search\\?(?:.*&)?q=[^&]+(?:&.*)?$/;\n return googleSearchRegex.test(url);\n};\n\nconst isResultSponsored = (container: HTMLElement): boolean => {\n // Marker A: A common, dedicated HTML attribute for ad blocks.\n const hasAdAttribute = container.querySelector('[data-text-ad=\"1\"]') !== null;\n\n // Marker B: The presence of visible \"Sponsored\" or \"Ad\" text.\n // We look for a common text container and check its content.\n const hasAdTextContainer = container.querySelector('span:not(.a-no-hover-link):is(:where(*, [role=\"text\"]))');\n\n const hasAdText = hasAdTextContainer\n && (hasAdTextContainer.textContent?.includes('Sponsored')\n || hasAdTextContainer.textContent?.includes('Ad'));\n\n // A result is sponsored if it satisfies either detection marker.\n return hasAdAttribute || (hasAdText ?? false);\n};\n\n/**\n * Identifies all result links on the current Google Search page and flags them\n * as organic or sponsored.\n */\nexport const extractGoogleResultUrls = (): {\n url: string;\n isSponsored: boolean;\n}[] => {\n // Selector for all major blocks on the search results page (organic and sponsored).\n // #rso is a common ID for the main results container.\n const allResultContainers = globalThis.window.document.querySelectorAll<HTMLElement>('#rso > div, #tads > div');\n\n const results: {\n url: string;\n isSponsored: boolean;\n }[] = [];\n\n // Common selectors Google uses for the main clickable link within a result block\n const linkSelectors = '.yuRUbf a, .MjjYud a, a[jsname=\"UWckNb\"], a[data-pcu]';\n\n allResultContainers.forEach((container) => {\n // 1. Sponsored Check\n const isSponsored = isResultSponsored(container);\n const mainLink = container.querySelector<HTMLAnchorElement>(linkSelectors);\n\n if (mainLink) {\n let url = mainLink.href;\n\n // 3. Clean up Google's Redirect URL\n // If the link is a Google redirect (e.g., /url?q=...), extract the clean URL from the 'q' parameter.\n if (url && url.includes('/url?q=')) {\n try {\n const urlParams = new URLSearchParams(new URL(url).search);\n const rawUrl = urlParams.get('q');\n if (rawUrl) {\n url = rawUrl;\n }\n } catch { /* empty */ }\n }\n\n // 4. Final Validation and Push\n // Ensure we only push valid, external URLs.\n if (url && url.startsWith('http')) {\n results.push({\n url,\n isSponsored: isSponsored ?? false,\n });\n }\n }\n });\n\n return results;\n};\n"],"names":["signalOptions","equals","equalFn","a","b","runEffects","runQueue","STALE","PENDING","UNOWNED","owned","cleanups","context","owner","Owner","Transition","Listener","Updates","Effects","ExecCount","createSignal","value","options","s","observers","observerSlots","comparator","Object","assign","undefined","readSignal","bind","writeSignal","createRenderEffect","fn","updateComputation","createComputation","createEffect","runUserEffects","c","user","push","createMemo","untrack","listener","onMount","onCleanup","useContext","id","defaultValue","children","memo","resolveChildren","toArray","Array","isArray","this","sources","updates","runUpdates","lookUpstream","sSlot","length","sourceSlots","node","isComp","current","i","o","TransitionRunning","running","disposed","has","tState","state","pure","markDownstream","Error","cleanNode","time","nextValue","err","forEach","updatedAt","handleError","runComputation","init","runTop","suspense","inFallback","effects","ancestors","wait","res","e","completeUpdates","queue","userLength","ignore","source","pop","index","obs","n","tOwned","error","cause","castError","results","result","apply","createProvider","props","createComponent","Comp","Show","keyed","condition","when","child","fallback","$$EVENTS","template","html","isImportNode","isSVG","create","t","document","createElement","innerHTML","content","firstChild","cloneNode","delegateEvents","eventNames","window","Set","l","name","add","addEventListener","eventHandler","setAttribute","removeAttribute","style","prev","nodeStyle","cssText","v","removeProperty","setProperty","use","element","arg","insert","parent","accessor","marker","initial","insertExpression","target","key","type","oriTarget","oriCurrentTarget","currentTarget","retarget","defineProperty","configurable","handleNode","handler","disabled","data","call","cancelBubble","host","_$host","contains","walkUpTree","parentNode","get","composedPath","path","unwrapArray","multi","toString","nodeType","createTextNode","cleanChildren","textContent","array","currentArray","normalizeIncomingArray","appendNodes","bLength","aEnd","bEnd","aStart","bStart","after","nextSibling","map","insertBefore","remove","Map","set","sequence","replaceChild","reconcileArrays","appendChild","normalized","unwrap","dynamic","len","item","String","replacement","inserted","el","isParent","CheckoutPopupStyles","top","left","margin","width","padding","border","color","display","height","position","flex","background","cursor","gap","transition","calculateMaxRate","kind","amountStr","num","parseFloat","formatOffer","Math","floor","OfferTitle","_el$","_tmpl$","_$effect","title","activeDomain","replace","Merchant","MaxRate","Kind","Amount","formatTitle","ContentContext","Symbol","Provider","translate","_","getAllCharities","createContext","TranslationContext","useT","contentProvider","getContentAccessor","StringUtils","formatMessage","args","Number","OfferDetails","_tmpl$2","_el$3","_el$2","_el$4","_el$5","_el$6","_el$7","_el$8","_el$10","_el$11","_el$12","_el$13","_el$15","_el$16","_$insert","_$createComponent","merchantRateDetail","_el$9","detail","_el$17","_tmpl$3","_el$18","_el$19","Name","parseRate","commissionRate","displaySplit","maximumFractionDigits","boostedOffer","BoostedOffer","amount","EndDate","Date","OriginalMaxRate","isNaN","splitAmount","toLocaleString","minimumFractionDigits","currency","Currency","_p$","_v$11","styles","_v$12","_v$13","_$style","_v$","_v$2","_v$3","_v$4","_v$5","parsedMaxRate","_v$6","_v$7","_v$8","_v$9","termsUrl","_v$10","h","r","_$setAttribute","d","globalThis","chrome","runtime","browser","module","exports","CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE","wrapAPIs","extensionAPIs","apiMetadata","alarms","clear","minArgs","maxArgs","clearAll","getAll","bookmarks","getChildren","getRecent","getSubTree","getTree","move","removeTree","search","update","browserAction","disable","fallbackToNoCallback","enable","getBadgeBackgroundColor","getBadgeText","getPopup","getTitle","openPopup","setBadgeBackgroundColor","setBadgeText","setIcon","setPopup","setTitle","browsingData","removeCache","removeCookies","removeDownloads","removeFormData","removeHistory","removeLocalStorage","removePasswords","removePluginData","settings","commands","contextMenus","removeAll","cookies","getAllCookieStores","devtools","inspectedWindow","eval","singleCallbackArg","panels","elements","createSidebarPane","downloads","cancel","download","erase","getFileIcon","open","pause","removeFile","resume","show","extension","isAllowedFileSchemeAccess","isAllowedIncognitoAccess","history","addUrl","deleteAll","deleteRange","deleteUrl","getVisits","i18n","detectLanguage","getAcceptLanguages","identity","launchWebAuthFlow","idle","queryState","management","getSelf","setEnabled","uninstallSelf","notifications","getPermissionLevel","pageAction","hide","permissions","request","getBackgroundPage","getPlatformInfo","openOptionsPage","requestUpdateCheck","sendMessage","sendNativeMessage","setUninstallURL","sessions","getDevices","getRecentlyClosed","restore","storage","local","getBytesInUse","managed","sync","tabs","captureVisibleTab","discard","duplicate","executeScript","getCurrent","getZoom","getZoomSettings","goBack","goForward","highlight","insertCSS","query","reload","removeCSS","setZoom","setZoomSettings","topSites","webNavigation","getAllFrames","getFrame","webRequest","handlerBehaviorChanged","windows","getLastFocused","keys","DefaultWeakMap","WeakMap","constructor","createItem","items","super","makeCallback","promise","metadata","callbackArgs","lastError","reject","message","resolve","pluralizeArguments","numArgs","wrapMethod","method","wrapper","Proxy","targetMethod","thisObj","hasOwnProperty","Function","prototype","wrapObject","wrappers","cache","handlers","proxyTarget","prop","receiver","wrapAsyncFunction","Promise","cbError","console","warn","noCallback","enumerable","desc","Reflect","deleteProperty","wrapEvent","wrapperMap","addListener","hasListener","removeListener","onRequestFinishedWrappers","req","wrappedReq","getContent","onMessageWrappers","sender","sendResponse","wrappedSendResponse","didCallSendResponse","sendResponsePromise","response","isResultThenable","then","msg","__mozWebExtensionPolyfillReject__","catch","wrappedSendMessageCallback","reply","wrappedSendMessage","apiNamespaceObj","wrappedCb","staticWrappers","network","onRequestFinished","onMessage","onMessageExternal","settingMetadata","privacy","services","websites","PopupEvent","LoggingEvent","ConsoleTransport","isLocal","log","level","timestamp","consoleMethod","titlePrefix","LOGGER_PREFIX","LOG_LEVELS","Logger","config","minLevel","enabled","transports","getInstance","instance","configure","shouldLog","indexOf","createLogMessage","version","LIB_VERSION","toISOString","onlyLocal","logMessage","filter","transport","debug","info","critical","fatal","addTransport","clearTransports","MAX_RETRY_ATTEMPTS","defaultDelay","attempt","api","async","sendMessageWithRetry","retryOptions","operation","maxAttempts","delayFn","setTimeout","logger","operationName","retryOperation","MESSAGE_TYPES","COUNTRY_CODE_STORAGE_KEY","GF_AD_EVENT_HISTORY_STORAGE_KEY","UNKNOWN_CHARITY","ein","tpi","storagePrefix","prefixedKey","prefixedKeys","getCurrentVersion","Analytics","partnerApiKey","userService","configService","debounceWindowInMinutes","track","eventType","wfDeviceId","payload","anonymous","skipThrottling","event","partner","_partnerApiKey","eventData","userId","_userService","libVersion","serializedEvent","JSON","stringify","_key","stack","eventsUrl","getEventsUrl","BroadcastEvent","_logger","getEventsHistory","lastHourDate","m","now","setTime","getTime","addMinutes","_debounceWindowInMinutes","typedHistory","x","createdAt","shouldBroadcastEvent","some","entry","pushEventToHistory","_configService","fetch","headers","body","ok","status","statusText","getCachedConfig","mergeIf","right","trackEvent","getPopupBehavior","hasBackdrop","containerStyle","backdropColor","showAsModal","clickAction","MainScreen","detailsDisplayed","setDetailsDisplayed","selectedCharity","setSelectedCharity","handleDialogClick","checkoutPopupConf","stopPropagation","handleWindowClick","selectCharity","setBackdropHidden","mainContainerRef","removeEventListener","getCharities","useCharities","dialogRef","scroll","offsetHeight","behavior","charitySelection","onCharitySelect","charity","closeOnDonation","checkoutPopupActivateAndCloseSkipSuccess","isCharitySelected","_el$14","checkoutPopupActivateAndClose","$$click","checkoutPopupMainCloseButtonVisible","onClose","_$p","reduce","_c$2","_el$20","_el$21","_el$22","_el$23","_tmpl$4","_$memo","decorator","decoratorLeftStyle","decoratorRightStyle","_el$24","_tmpl$5","_v$29","_v$30","_el$25","_v$31","_v$32","_v$20","_v$21","logo","_v$22","_v$23","_v$24","_v$25","checkoutPopupSelectCharityButtonBgColor","_v$26","_v$27","_v$28","onSuppress","onOfferDetailsClick","handleWhyAmISeeingThisClick","checkoutPopupWhyAmISeeingThisClicked","domain","location","hostname","_c$","checkoutPopupDisplayNameInFooter","_el$26","_tmpl$6","_el$27","_v$33","_v$34","_v$14","_v$15","_v$16","_v$17","_v$18","externalUrls","giveFreelyWhyAmISeeingThis","_v$19","u","w","f","y","merchantName","extensionName","displayName","giveFreelyTermsAndConditions","merchantRates","_$delegateEvents","GoodbyeScreen","days","setDays","checkoutPopupSupressCloseButtonVisible","onGoodbye","onBack","checkoutPopupNeverSuppressionAllowed","radio","setScreen","DonateScreen","closingSecondsLeft","setClosingSecondsLeft","closingIntervalId","clearInterval","failedDonation","startClosingCountdown","checkoutPopupDonationSuccessAutoCloseInSeconds","setInterval","CheckoutPopup","screen","setFailedDonation","backdropHidden","showModal","showPopover","focus","blur","closeAdClick","charityClick","skipSuccess","Domain","success","onDonate","suppressClick","back","handleGoodbye","containerRef","_$use","customStyle","elementId","className","cartOrCheckoutRule","url","combines","final","flatMap","keyword","combine","exclusions","absoluteMatches","includes","segments","split","ex","segment","startsWith","endsWith","toLowerCase","bookingRule","documentRef","keywords","evaluate","XPathResult","ANY_TYPE","iterateNext","retrieveShopDomain","shopId","found","getShopIdFromWindow","scripts","from","querySelectorAll","script","dataset","src","parsedId","parseInt","match","shopifyElement","querySelector","HTMLElement","possibleShopId","ShopifyAnalytics","lib","trekkie","defaultAttributes","getShopIdFromStoreMetaTag","href","meta","head","parse","merchantRegexRule","currentUrl","matchingMerchants","merchantPopupRules","merchant","ruleObj","rules","RegExp","rule","test","regexError","detectPageLanguage","customLanguageDetection","pageText","urlPattern","language","entries","htmlLang","documentElement","lang","metaLanguage","hrefLang","getAttribute","browserLanguage","navigator","detectedLanguage","languageMatchRule","checkoutPopupOnlyShowLanguageMatch","getAdUnitInstalledExtensions","roots","skipCurrentExtension","root","extensionId","join","TranslationProvider","charities","GfAdUnit","setActiveDomain","showPopup","setShowPopup","setMerchantRates","translationProvider","setTranslationProvider","selectedCharities","setSelectedCharities","checkoutRulesWatcherInterval","shouldCheckSiteMatches","matchingRegex","siteMatchesRegex","regex","checkoutPopupSiteMatches","matchedRule","uts","checkSiteMatches","popupConfig","languageCode","getTranslationProvider","currentVersion","minVersion","compareVersion","version1","version2","version1Segments","version2Segments","currentCountry","requestOptions","Authorization","json","country","iso_code","detectUsersCountry","getCountryCode","checkoutPopupMasterSwitch","gfContainerRoots","getElementsByClassName","looserExtension","rates","domainResponse","isActive","getActiveDomain","sendShopPayId","shopPayIdentify","pathname","shopDomain","isMutedFromStorage","storageExpiry","popupHide","expiry","isMuted","getIsAdUnitMuted","isStandDown","wildfireActiveDomain","shouldStandDownResult","shouldStandDown","anonymousActiveDomainLoggingConfig","anonymousActiveDomainLogging","currentActiveDomain","website","sessionStorage","getItem","setItem","hasVisitedWebsiteAlready","checkoutPopupActiveDomain","shouldShowResult","locationUrl","URL","shopPayResult","shopPayRule","shouldShow","matchesCartRule","matchesBookingRule","matchesShopPayRule","matchesMerchantRegexRule","matchesLanguageRule","checkoutRulesTest","checkoutPopupLooserExtension","winner","matchMedia","matches","checkoutPopupHiddenProgrammatically","merchantId","ID","reason","checkoutPopupNotShownPerViewportSize","pageLanguage","viewPortSize","innerHeight","innerWidth","checkoutPopupShown","domainId","looserCompetingExtensions","handleDonate","gfCommissionUniqueId","crypto","randomUUID","activationResponse","originalUrl","activateOffer","thirdPartyId","checkoutPopupDonation","checkoutPopupFailedActivation","rate","handleHideAd","hideResponse","checkoutPopupSupressed","ack","hideAd","handleTrackOfferDetailsDisplay","checkoutPopupOfferDetailsClicked","action","toggleState","currentLanguage","translations","getLanguageContent","charitiesList","order","charityMetadata","translateAccessor","getCharitiesAccessor","containerId","getElementById","container","getManifest","shadow","attachShadow","mode","innerContainer","configResponse","getPopupConfig","checkoutPopupLoggerEnabled","checkoutPopupMinLogLevel","contentStyle","countAppearances","isGoogleSearchResult","searchResults","extractGoogleResultUrls","allResultContainers","isSponsored","hasAdAttribute","hasAdTextContainer","hasAdText","isResultSponsored","mainLink","rawUrl","URLSearchParams","logAffilliatedMerchantsSearchResults","code","disposer","detachedOwner","unowned","updateFn","createRoot","dispose","render"],"mappings":"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","x_google_ignoreList":[0,1,11]}