@beyondwords/player 0.0.0-beta48 → 0.0.0-beta49

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.
package/dist/es.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"es.js","sources":["../node_modules/svelte/internal/index.mjs","../src/helpers/throwError.ts","../node_modules/uuid/dist/esm-browser/rng.js","../node_modules/uuid/dist/esm-browser/regex.js","../node_modules/uuid/dist/esm-browser/validate.js","../node_modules/uuid/dist/esm-browser/stringify.js","../node_modules/uuid/dist/esm-browser/native.js","../node_modules/uuid/dist/esm-browser/v4.js","../src/helpers/eventValidation.ts","../src/helpers/newEvent.ts","../src/helpers/withQueryParams.ts","../src/helpers/googleAdTagParams.ts","../src/helpers/elementIsVisible.ts","../src/components/VastContainer.svelte","../src/helpers/orderedMediaSources.ts","../src/helpers/loadMedia.ts","../src/translations/af.ts","../src/translations/ak.ts","../src/translations/am.ts","../src/translations/ar.ts","../src/translations/as.ts","../src/translations/az.ts","../src/translations/be.ts","../src/translations/bg.ts","../src/translations/bm.ts","../src/translations/bn.ts","../src/translations/bs.ts","../src/translations/ca.ts","../src/translations/ckb.ts","../src/translations/cs.ts","../src/translations/cy.ts","../src/translations/da.ts","../src/translations/de.ts","../src/translations/ee.ts","../src/translations/el.ts","../src/translations/en.ts","../src/translations/eo.ts","../src/translations/es.ts","../src/translations/et.ts","../src/translations/eu.ts","../src/translations/fa.ts","../src/translations/fi.ts","../src/translations/fil.ts","../src/translations/fr.ts","../src/translations/ga.ts","../src/translations/gd.ts","../src/translations/gl.ts","../src/translations/gu.ts","../src/translations/ha.ts","../src/translations/haw.ts","../src/translations/he.ts","../src/translations/hi.ts","../src/translations/hr.ts","../src/translations/hu.ts","../src/translations/hy.ts","../src/translations/id.ts","../src/translations/ig.ts","../src/translations/is.ts","../src/translations/it.ts","../src/translations/iw.ts","../src/translations/ja.ts","../src/translations/ka.ts","../src/translations/kk.ts","../src/translations/km.ts","../src/translations/kn.ts","../src/translations/ko.ts","../src/translations/ky.ts","../src/translations/lb.ts","../src/translations/lg.ts","../src/translations/ln.ts","../src/translations/lo.ts","../src/translations/lt.ts","../src/translations/lv.ts","../src/translations/mg.ts","../src/translations/mk.ts","../src/translations/ml.ts","../src/translations/mn.ts","../src/translations/mr.ts","../src/translations/ms.ts","../src/translations/mt.ts","../src/translations/my.ts","../src/translations/nb.ts","../src/translations/ne.ts","../src/translations/nl.ts","../src/translations/nn.ts","../src/translations/no.ts","../src/translations/om.ts","../src/translations/or.ts","../src/translations/pa.ts","../src/translations/pl.ts","../src/translations/ps.ts","../src/translations/pt.ts","../src/translations/qu.ts","../src/translations/ro.ts","../src/translations/ru.ts","../src/translations/rw.ts","../src/translations/si.ts","../src/translations/sk.ts","../src/translations/sl.ts","../src/translations/sn.ts","../src/translations/so.ts","../src/translations/sq.ts","../src/translations/sr.ts","../src/translations/sv.ts","../src/translations/sw.ts","../src/translations/ta.ts","../src/translations/te.ts","../src/translations/tg.ts","../src/translations/th.ts","../src/translations/ti.ts","../src/translations/tr.ts","../src/translations/tt.ts","../src/translations/ug.ts","../src/translations/uk.ts","../src/translations/ur.ts","../src/translations/uz.ts","../src/translations/vi.ts","../src/translations/yi.ts","../src/translations/yo.ts","../src/translations/zh-HK.ts","../src/translations/zh-MO.ts","../src/translations/zh-TW.ts","../src/translations/zh.ts","../src/translations/zu.ts","../src/helpers/basename.ts","../src/helpers/validateTranslations.ts","../src/helpers/translate.ts","../src/helpers/blurElement.ts","../src/helpers/findSegmentIndex.ts","../src/helpers/findLoadedMedia.ts","../src/components/MediaElement.svelte","../node_modules/svelte/easing/index.mjs","../node_modules/svelte/transition/index.mjs","../src/components/svg_icons/Play.svelte","../src/components/svg_icons/Pause.svelte","../src/components/buttons/PlayPauseButton.svelte","../src/components/buttons/PlaybackRateButton.svelte","../src/components/svg_icons/SeekBack.svelte","../src/components/svg_icons/PrevSegment.svelte","../src/components/svg_icons/PrevTrack.svelte","../src/components/buttons/PrevButton.svelte","../src/components/svg_icons/SeekAhead.svelte","../src/components/svg_icons/NextSegment.svelte","../src/components/svg_icons/NextTrack.svelte","../src/components/buttons/NextButton.svelte","../src/components/svg_icons/ShowPlaylist.svelte","../src/components/svg_icons/HidePlaylist.svelte","../src/components/buttons/PlaylistButton.svelte","../src/components/svg_icons/Maximize.svelte","../src/components/buttons/MaximizeButton.svelte","../src/components/svg_icons/Close.svelte","../src/components/buttons/CloseWidgetButton.svelte","../src/components/external_links/AdvertLink.svelte","../src/components/svg_icons/OpenNewTab.svelte","../src/components/external_links/AdvertButton.svelte","../src/components/svg_icons/Logo.svelte","../src/components/external_links/BeyondWords.svelte","../src/components/external_links/SourceUrlButton.svelte","../src/components/LargeImage.svelte","../src/components/titles/PlayerTitle.svelte","../src/components/titles/ContentTitle.svelte","../src/components/progress_bars/handleKeyDown.ts","../src/components/progress_bars/ProgressBar.svelte","../src/components/progress_bars/ProgressCircle.svelte","../src/helpers/formatTime.ts","../src/components/time_indicators/CountdownTime.svelte","../src/components/time_indicators/DurationInMins.svelte","../src/components/time_indicators/PlaybackTime.svelte","../src/components/time_indicators/TimeIndicator.svelte","../src/components/svg_icons/VolumeUp.svelte","../src/components/svg_icons/Download.svelte","../src/components/buttons/DownloadButton.svelte","../src/components/Playlist.svelte","../src/components/helpers/Hoverable.svelte","../src/components/helpers/Visibility.svelte","../src/helpers/belowBreakpoint.ts","../src/helpers/controlsOrder.ts","../src/helpers/playerStyles.ts","../src/helpers/fullScreen.ts","../src/components/UserInterface.svelte","../src/components/ExternalWidget.svelte","../src/components/ControlPanel.svelte","../src/helpers/blobForImageUrl.ts","../src/helpers/blobForSvgNode.ts","../src/components/MediaSession.svelte","../src/components/GoogleAnalytics.svelte","../src/helpers/ownershipMediator.ts","../src/helpers/sectionEnabled.ts","../src/helpers/segmentHighlights.ts","../src/helpers/segmentClickables.ts","../src/helpers/segmentContainers.ts","../src/helpers/identifiersEvent.ts","../src/helpers/fetchJson.ts","../src/api_clients/webSocketClient.ts","../src/helpers/onStatusChange.ts","../src/helpers/waitUntil.ts","../src/helpers/settableProps.ts","../src/helpers/diffObject.ts","../src/helpers/applyTransitions.ts","../src/helpers/resolveTarget.ts","../src/components/Player.svelte","../src/api_clients/playerApiClient.ts","../src/helpers/snakeCaseKeys.ts","../src/helpers/resolveTheme.ts","../src/helpers/setPropsFromApi.ts","../src/helpers/downloadFile.ts","../src/helpers/erroredAdverts.ts","../src/helpers/playedAdvertMedia.ts","../src/helpers/chooseAdvert.ts","../src/helpers/choosePersistentAdvert.ts","../src/helpers/erroredIntrosOutros.ts","../src/helpers/playedIntroOutroMedia.ts","../src/helpers/chooseIntroOutro.ts","../src/helpers/chooseMediaSession.ts","../src/helpers/chooseWidget.ts","../src/controllers/rootController.ts","../node_modules/stacktrace-parser/dist/stack-trace-parser.esm.js","../src/helpers/setErrorHandler.ts","../src/helpers/validateWebContext.ts","../src/helpers/listenToSegments.ts","../src/api_clients/analyticsClient.ts","../src/helpers/sendToAnalytics.ts","../src/helpers/relativeUrl.ts","../src/index.ts"],"sourcesContent":["function noop() { }\nconst identity = x => x;\nfunction assign(tar, src) {\n // @ts-ignore\n for (const k in src)\n tar[k] = src[k];\n return tar;\n}\n// Adapted from https://github.com/then/is-promise/blob/master/index.js\n// Distributed under MIT License https://github.com/then/is-promise/blob/master/LICENSE\nfunction is_promise(value) {\n return !!value && (typeof value === 'object' || typeof value === 'function') && typeof value.then === 'function';\n}\nfunction add_location(element, file, line, column, char) {\n element.__svelte_meta = {\n loc: { file, line, column, char }\n };\n}\nfunction run(fn) {\n return fn();\n}\nfunction blank_object() {\n return Object.create(null);\n}\nfunction run_all(fns) {\n fns.forEach(run);\n}\nfunction is_function(thing) {\n return typeof thing === 'function';\n}\nfunction safe_not_equal(a, b) {\n return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');\n}\nlet src_url_equal_anchor;\nfunction src_url_equal(element_src, url) {\n if (!src_url_equal_anchor) {\n src_url_equal_anchor = document.createElement('a');\n }\n src_url_equal_anchor.href = url;\n return element_src === src_url_equal_anchor.href;\n}\nfunction not_equal(a, b) {\n return a != a ? b == b : a !== b;\n}\nfunction is_empty(obj) {\n return Object.keys(obj).length === 0;\n}\nfunction validate_store(store, name) {\n if (store != null && typeof store.subscribe !== 'function') {\n throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n }\n}\nfunction subscribe(store, ...callbacks) {\n if (store == null) {\n return noop;\n }\n const unsub = store.subscribe(...callbacks);\n return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n let value;\n subscribe(store, _ => value = _)();\n return value;\n}\nfunction component_subscribe(component, store, callback) {\n component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n if (definition) {\n const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n return definition[0](slot_ctx);\n }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n return definition[1] && fn\n ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n if (definition[2] && fn) {\n const lets = definition[2](fn(dirty));\n if ($$scope.dirty === undefined) {\n return lets;\n }\n if (typeof lets === 'object') {\n const merged = [];\n const len = Math.max($$scope.dirty.length, lets.length);\n for (let i = 0; i < len; i += 1) {\n merged[i] = $$scope.dirty[i] | lets[i];\n }\n return merged;\n }\n return $$scope.dirty | lets;\n }\n return $$scope.dirty;\n}\nfunction update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) {\n if (slot_changes) {\n const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n slot.p(slot_context, slot_changes);\n }\n}\nfunction update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) {\n const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn);\n}\nfunction get_all_dirty_from_scope($$scope) {\n if ($$scope.ctx.length > 32) {\n const dirty = [];\n const length = $$scope.ctx.length / 32;\n for (let i = 0; i < length; i++) {\n dirty[i] = -1;\n }\n return dirty;\n }\n return -1;\n}\nfunction exclude_internal_props(props) {\n const result = {};\n for (const k in props)\n if (k[0] !== '$')\n result[k] = props[k];\n return result;\n}\nfunction compute_rest_props(props, keys) {\n const rest = {};\n keys = new Set(keys);\n for (const k in props)\n if (!keys.has(k) && k[0] !== '$')\n rest[k] = props[k];\n return rest;\n}\nfunction compute_slots(slots) {\n const result = {};\n for (const key in slots) {\n result[key] = true;\n }\n return result;\n}\nfunction once(fn) {\n let ran = false;\n return function (...args) {\n if (ran)\n return;\n ran = true;\n fn.call(this, ...args);\n };\n}\nfunction null_to_empty(value) {\n return value == null ? '' : value;\n}\nfunction set_store_value(store, ret, value) {\n store.set(value);\n return ret;\n}\nconst has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\nfunction action_destroyer(action_result) {\n return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\nfunction split_css_unit(value) {\n const split = typeof value === 'string' && value.match(/^\\s*(-?[\\d.]+)([^\\s]*)\\s*$/);\n return split ? [parseFloat(split[1]), split[2] || 'px'] : [value, 'px'];\n}\nconst contenteditable_truthy_values = ['', true, 1, 'true', 'contenteditable'];\n\nconst is_client = typeof window !== 'undefined';\nlet now = is_client\n ? () => window.performance.now()\n : () => Date.now();\nlet raf = is_client ? cb => requestAnimationFrame(cb) : noop;\n// used internally for testing\nfunction set_now(fn) {\n now = fn;\n}\nfunction set_raf(fn) {\n raf = fn;\n}\n\nconst tasks = new Set();\nfunction run_tasks(now) {\n tasks.forEach(task => {\n if (!task.c(now)) {\n tasks.delete(task);\n task.f();\n }\n });\n if (tasks.size !== 0)\n raf(run_tasks);\n}\n/**\n * For testing purposes only!\n */\nfunction clear_loops() {\n tasks.clear();\n}\n/**\n * Creates a new task that runs on each raf frame\n * until it returns a falsy value or is aborted\n */\nfunction loop(callback) {\n let task;\n if (tasks.size === 0)\n raf(run_tasks);\n return {\n promise: new Promise(fulfill => {\n tasks.add(task = { c: callback, f: fulfill });\n }),\n abort() {\n tasks.delete(task);\n }\n };\n}\n\nconst globals = (typeof window !== 'undefined'\n ? window\n : typeof globalThis !== 'undefined'\n ? globalThis\n : global);\n\n/**\n * Resize observer singleton.\n * One listener per element only!\n * https://groups.google.com/a/chromium.org/g/blink-dev/c/z6ienONUb5A/m/F5-VcUZtBAAJ\n */\nclass ResizeObserverSingleton {\n constructor(options) {\n this.options = options;\n this._listeners = 'WeakMap' in globals ? new WeakMap() : undefined;\n }\n observe(element, listener) {\n this._listeners.set(element, listener);\n this._getObserver().observe(element, this.options);\n return () => {\n this._listeners.delete(element);\n this._observer.unobserve(element); // this line can probably be removed\n };\n }\n _getObserver() {\n var _a;\n return (_a = this._observer) !== null && _a !== void 0 ? _a : (this._observer = new ResizeObserver((entries) => {\n var _a;\n for (const entry of entries) {\n ResizeObserverSingleton.entries.set(entry.target, entry);\n (_a = this._listeners.get(entry.target)) === null || _a === void 0 ? void 0 : _a(entry);\n }\n }));\n }\n}\n// Needs to be written like this to pass the tree-shake-test\nResizeObserverSingleton.entries = 'WeakMap' in globals ? new WeakMap() : undefined;\n\n// Track which nodes are claimed during hydration. Unclaimed nodes can then be removed from the DOM\n// at the end of hydration without touching the remaining nodes.\nlet is_hydrating = false;\nfunction start_hydrating() {\n is_hydrating = true;\n}\nfunction end_hydrating() {\n is_hydrating = false;\n}\nfunction upper_bound(low, high, key, value) {\n // Return first index of value larger than input value in the range [low, high)\n while (low < high) {\n const mid = low + ((high - low) >> 1);\n if (key(mid) <= value) {\n low = mid + 1;\n }\n else {\n high = mid;\n }\n }\n return low;\n}\nfunction init_hydrate(target) {\n if (target.hydrate_init)\n return;\n target.hydrate_init = true;\n // We know that all children have claim_order values since the unclaimed have been detached if target is not <head>\n let children = target.childNodes;\n // If target is <head>, there may be children without claim_order\n if (target.nodeName === 'HEAD') {\n const myChildren = [];\n for (let i = 0; i < children.length; i++) {\n const node = children[i];\n if (node.claim_order !== undefined) {\n myChildren.push(node);\n }\n }\n children = myChildren;\n }\n /*\n * Reorder claimed children optimally.\n * We can reorder claimed children optimally by finding the longest subsequence of\n * nodes that are already claimed in order and only moving the rest. The longest\n * subsequence of nodes that are claimed in order can be found by\n * computing the longest increasing subsequence of .claim_order values.\n *\n * This algorithm is optimal in generating the least amount of reorder operations\n * possible.\n *\n * Proof:\n * We know that, given a set of reordering operations, the nodes that do not move\n * always form an increasing subsequence, since they do not move among each other\n * meaning that they must be already ordered among each other. Thus, the maximal\n * set of nodes that do not move form a longest increasing subsequence.\n */\n // Compute longest increasing subsequence\n // m: subsequence length j => index k of smallest value that ends an increasing subsequence of length j\n const m = new Int32Array(children.length + 1);\n // Predecessor indices + 1\n const p = new Int32Array(children.length);\n m[0] = -1;\n let longest = 0;\n for (let i = 0; i < children.length; i++) {\n const current = children[i].claim_order;\n // Find the largest subsequence length such that it ends in a value less than our current value\n // upper_bound returns first greater value, so we subtract one\n // with fast path for when we are on the current longest subsequence\n const seqLen = ((longest > 0 && children[m[longest]].claim_order <= current) ? longest + 1 : upper_bound(1, longest, idx => children[m[idx]].claim_order, current)) - 1;\n p[i] = m[seqLen] + 1;\n const newLen = seqLen + 1;\n // We can guarantee that current is the smallest value. Otherwise, we would have generated a longer sequence.\n m[newLen] = i;\n longest = Math.max(newLen, longest);\n }\n // The longest increasing subsequence of nodes (initially reversed)\n const lis = [];\n // The rest of the nodes, nodes that will be moved\n const toMove = [];\n let last = children.length - 1;\n for (let cur = m[longest] + 1; cur != 0; cur = p[cur - 1]) {\n lis.push(children[cur - 1]);\n for (; last >= cur; last--) {\n toMove.push(children[last]);\n }\n last--;\n }\n for (; last >= 0; last--) {\n toMove.push(children[last]);\n }\n lis.reverse();\n // We sort the nodes being moved to guarantee that their insertion order matches the claim order\n toMove.sort((a, b) => a.claim_order - b.claim_order);\n // Finally, we move the nodes\n for (let i = 0, j = 0; i < toMove.length; i++) {\n while (j < lis.length && toMove[i].claim_order >= lis[j].claim_order) {\n j++;\n }\n const anchor = j < lis.length ? lis[j] : null;\n target.insertBefore(toMove[i], anchor);\n }\n}\nfunction append(target, node) {\n target.appendChild(node);\n}\nfunction append_styles(target, style_sheet_id, styles) {\n const append_styles_to = get_root_for_style(target);\n if (!append_styles_to.getElementById(style_sheet_id)) {\n const style = element('style');\n style.id = style_sheet_id;\n style.textContent = styles;\n append_stylesheet(append_styles_to, style);\n }\n}\nfunction get_root_for_style(node) {\n if (!node)\n return document;\n const root = node.getRootNode ? node.getRootNode() : node.ownerDocument;\n if (root && root.host) {\n return root;\n }\n return node.ownerDocument;\n}\nfunction append_empty_stylesheet(node) {\n const style_element = element('style');\n append_stylesheet(get_root_for_style(node), style_element);\n return style_element.sheet;\n}\nfunction append_stylesheet(node, style) {\n append(node.head || node, style);\n return style.sheet;\n}\nfunction append_hydration(target, node) {\n if (is_hydrating) {\n init_hydrate(target);\n if ((target.actual_end_child === undefined) || ((target.actual_end_child !== null) && (target.actual_end_child.parentNode !== target))) {\n target.actual_end_child = target.firstChild;\n }\n // Skip nodes of undefined ordering\n while ((target.actual_end_child !== null) && (target.actual_end_child.claim_order === undefined)) {\n target.actual_end_child = target.actual_end_child.nextSibling;\n }\n if (node !== target.actual_end_child) {\n // We only insert if the ordering of this node should be modified or the parent node is not target\n if (node.claim_order !== undefined || node.parentNode !== target) {\n target.insertBefore(node, target.actual_end_child);\n }\n }\n else {\n target.actual_end_child = node.nextSibling;\n }\n }\n else if (node.parentNode !== target || node.nextSibling !== null) {\n target.appendChild(node);\n }\n}\nfunction insert(target, node, anchor) {\n target.insertBefore(node, anchor || null);\n}\nfunction insert_hydration(target, node, anchor) {\n if (is_hydrating && !anchor) {\n append_hydration(target, node);\n }\n else if (node.parentNode !== target || node.nextSibling != anchor) {\n target.insertBefore(node, anchor || null);\n }\n}\nfunction detach(node) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n}\nfunction destroy_each(iterations, detaching) {\n for (let i = 0; i < iterations.length; i += 1) {\n if (iterations[i])\n iterations[i].d(detaching);\n }\n}\nfunction element(name) {\n return document.createElement(name);\n}\nfunction element_is(name, is) {\n return document.createElement(name, { is });\n}\nfunction object_without_properties(obj, exclude) {\n const target = {};\n for (const k in obj) {\n if (has_prop(obj, k)\n // @ts-ignore\n && exclude.indexOf(k) === -1) {\n // @ts-ignore\n target[k] = obj[k];\n }\n }\n return target;\n}\nfunction svg_element(name) {\n return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\nfunction text(data) {\n return document.createTextNode(data);\n}\nfunction space() {\n return text(' ');\n}\nfunction empty() {\n return text('');\n}\nfunction comment(content) {\n return document.createComment(content);\n}\nfunction listen(node, event, handler, options) {\n node.addEventListener(event, handler, options);\n return () => node.removeEventListener(event, handler, options);\n}\nfunction prevent_default(fn) {\n return function (event) {\n event.preventDefault();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_propagation(fn) {\n return function (event) {\n event.stopPropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_immediate_propagation(fn) {\n return function (event) {\n event.stopImmediatePropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction self(fn) {\n return function (event) {\n // @ts-ignore\n if (event.target === this)\n fn.call(this, event);\n };\n}\nfunction trusted(fn) {\n return function (event) {\n // @ts-ignore\n if (event.isTrusted)\n fn.call(this, event);\n };\n}\nfunction attr(node, attribute, value) {\n if (value == null)\n node.removeAttribute(attribute);\n else if (node.getAttribute(attribute) !== value)\n node.setAttribute(attribute, value);\n}\n/**\n * List of attributes that should always be set through the attr method,\n * because updating them through the property setter doesn't work reliably.\n * In the example of `width`/`height`, the problem is that the setter only\n * accepts numeric values, but the attribute can also be set to a string like `50%`.\n * If this list becomes too big, rethink this approach.\n */\nconst always_set_through_set_attribute = ['width', 'height'];\nfunction set_attributes(node, attributes) {\n // @ts-ignore\n const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n for (const key in attributes) {\n if (attributes[key] == null) {\n node.removeAttribute(key);\n }\n else if (key === 'style') {\n node.style.cssText = attributes[key];\n }\n else if (key === '__value') {\n node.value = node[key] = attributes[key];\n }\n else if (descriptors[key] && descriptors[key].set && always_set_through_set_attribute.indexOf(key) === -1) {\n node[key] = attributes[key];\n }\n else {\n attr(node, key, attributes[key]);\n }\n }\n}\nfunction set_svg_attributes(node, attributes) {\n for (const key in attributes) {\n attr(node, key, attributes[key]);\n }\n}\nfunction set_custom_element_data_map(node, data_map) {\n Object.keys(data_map).forEach((key) => {\n set_custom_element_data(node, key, data_map[key]);\n });\n}\nfunction set_custom_element_data(node, prop, value) {\n if (prop in node) {\n node[prop] = typeof node[prop] === 'boolean' && value === '' ? true : value;\n }\n else {\n attr(node, prop, value);\n }\n}\nfunction set_dynamic_element_data(tag) {\n return (/-/.test(tag)) ? set_custom_element_data_map : set_attributes;\n}\nfunction xlink_attr(node, attribute, value) {\n node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\nfunction get_binding_group_value(group, __value, checked) {\n const value = new Set();\n for (let i = 0; i < group.length; i += 1) {\n if (group[i].checked)\n value.add(group[i].__value);\n }\n if (!checked) {\n value.delete(__value);\n }\n return Array.from(value);\n}\nfunction init_binding_group(group) {\n let _inputs;\n return {\n /* push */ p(...inputs) {\n _inputs = inputs;\n _inputs.forEach(input => group.push(input));\n },\n /* remove */ r() {\n _inputs.forEach(input => group.splice(group.indexOf(input), 1));\n }\n };\n}\nfunction init_binding_group_dynamic(group, indexes) {\n let _group = get_binding_group(group);\n let _inputs;\n function get_binding_group(group) {\n for (let i = 0; i < indexes.length; i++) {\n group = group[indexes[i]] = group[indexes[i]] || [];\n }\n return group;\n }\n function push() {\n _inputs.forEach(input => _group.push(input));\n }\n function remove() {\n _inputs.forEach(input => _group.splice(_group.indexOf(input), 1));\n }\n return {\n /* update */ u(new_indexes) {\n indexes = new_indexes;\n const new_group = get_binding_group(group);\n if (new_group !== _group) {\n remove();\n _group = new_group;\n push();\n }\n },\n /* push */ p(...inputs) {\n _inputs = inputs;\n push();\n },\n /* remove */ r: remove\n };\n}\nfunction to_number(value) {\n return value === '' ? null : +value;\n}\nfunction time_ranges_to_array(ranges) {\n const array = [];\n for (let i = 0; i < ranges.length; i += 1) {\n array.push({ start: ranges.start(i), end: ranges.end(i) });\n }\n return array;\n}\nfunction children(element) {\n return Array.from(element.childNodes);\n}\nfunction init_claim_info(nodes) {\n if (nodes.claim_info === undefined) {\n nodes.claim_info = { last_index: 0, total_claimed: 0 };\n }\n}\nfunction claim_node(nodes, predicate, processNode, createNode, dontUpdateLastIndex = false) {\n // Try to find nodes in an order such that we lengthen the longest increasing subsequence\n init_claim_info(nodes);\n const resultNode = (() => {\n // We first try to find an element after the previous one\n for (let i = nodes.claim_info.last_index; i < nodes.length; i++) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n return node;\n }\n }\n // Otherwise, we try to find one before\n // We iterate in reverse so that we don't go too far back\n for (let i = nodes.claim_info.last_index - 1; i >= 0; i--) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n else if (replacement === undefined) {\n // Since we spliced before the last_index, we decrease it\n nodes.claim_info.last_index--;\n }\n return node;\n }\n }\n // If we can't find any matching node, we create a new one\n return createNode();\n })();\n resultNode.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n return resultNode;\n}\nfunction claim_element_base(nodes, name, attributes, create_element) {\n return claim_node(nodes, (node) => node.nodeName === name, (node) => {\n const remove = [];\n for (let j = 0; j < node.attributes.length; j++) {\n const attribute = node.attributes[j];\n if (!attributes[attribute.name]) {\n remove.push(attribute.name);\n }\n }\n remove.forEach(v => node.removeAttribute(v));\n return undefined;\n }, () => create_element(name));\n}\nfunction claim_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, element);\n}\nfunction claim_svg_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, svg_element);\n}\nfunction claim_text(nodes, data) {\n return claim_node(nodes, (node) => node.nodeType === 3, (node) => {\n const dataStr = '' + data;\n if (node.data.startsWith(dataStr)) {\n if (node.data.length !== dataStr.length) {\n return node.splitText(dataStr.length);\n }\n }\n else {\n node.data = dataStr;\n }\n }, () => text(data), true // Text nodes should not update last index since it is likely not worth it to eliminate an increasing subsequence of actual elements\n );\n}\nfunction claim_space(nodes) {\n return claim_text(nodes, ' ');\n}\nfunction claim_comment(nodes, data) {\n return claim_node(nodes, (node) => node.nodeType === 8, (node) => {\n node.data = '' + data;\n return undefined;\n }, () => comment(data), true);\n}\nfunction find_comment(nodes, text, start) {\n for (let i = start; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeType === 8 /* comment node */ && node.textContent.trim() === text) {\n return i;\n }\n }\n return nodes.length;\n}\nfunction claim_html_tag(nodes, is_svg) {\n // find html opening tag\n const start_index = find_comment(nodes, 'HTML_TAG_START', 0);\n const end_index = find_comment(nodes, 'HTML_TAG_END', start_index);\n if (start_index === end_index) {\n return new HtmlTagHydration(undefined, is_svg);\n }\n init_claim_info(nodes);\n const html_tag_nodes = nodes.splice(start_index, end_index - start_index + 1);\n detach(html_tag_nodes[0]);\n detach(html_tag_nodes[html_tag_nodes.length - 1]);\n const claimed_nodes = html_tag_nodes.slice(1, html_tag_nodes.length - 1);\n for (const n of claimed_nodes) {\n n.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n }\n return new HtmlTagHydration(claimed_nodes, is_svg);\n}\nfunction set_data(text, data) {\n data = '' + data;\n if (text.data === data)\n return;\n text.data = data;\n}\nfunction set_data_contenteditable(text, data) {\n data = '' + data;\n if (text.wholeText === data)\n return;\n text.data = data;\n}\nfunction set_data_maybe_contenteditable(text, data, attr_value) {\n if (~contenteditable_truthy_values.indexOf(attr_value)) {\n set_data_contenteditable(text, data);\n }\n else {\n set_data(text, data);\n }\n}\nfunction set_input_value(input, value) {\n input.value = value == null ? '' : value;\n}\nfunction set_input_type(input, type) {\n try {\n input.type = type;\n }\n catch (e) {\n // do nothing\n }\n}\nfunction set_style(node, key, value, important) {\n if (value == null) {\n node.style.removeProperty(key);\n }\n else {\n node.style.setProperty(key, value, important ? 'important' : '');\n }\n}\nfunction select_option(select, value, mounting) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n if (option.__value === value) {\n option.selected = true;\n return;\n }\n }\n if (!mounting || value !== undefined) {\n select.selectedIndex = -1; // no option should be selected\n }\n}\nfunction select_options(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n option.selected = ~value.indexOf(option.__value);\n }\n}\nfunction select_value(select) {\n const selected_option = select.querySelector(':checked');\n return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n if (crossorigin === undefined) {\n crossorigin = false;\n try {\n if (typeof window !== 'undefined' && window.parent) {\n void window.parent.document;\n }\n }\n catch (error) {\n crossorigin = true;\n }\n }\n return crossorigin;\n}\nfunction add_iframe_resize_listener(node, fn) {\n const computed_style = getComputedStyle(node);\n if (computed_style.position === 'static') {\n node.style.position = 'relative';\n }\n const iframe = element('iframe');\n iframe.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ' +\n 'overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: -1;');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.tabIndex = -1;\n const crossorigin = is_crossorigin();\n let unsubscribe;\n if (crossorigin) {\n iframe.src = \"data:text/html,<script>onresize=function(){parent.postMessage(0,'*')}</script>\";\n unsubscribe = listen(window, 'message', (event) => {\n if (event.source === iframe.contentWindow)\n fn();\n });\n }\n else {\n iframe.src = 'about:blank';\n iframe.onload = () => {\n unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n // make sure an initial resize event is fired _after_ the iframe is loaded (which is asynchronous)\n // see https://github.com/sveltejs/svelte/issues/4233\n fn();\n };\n }\n append(node, iframe);\n return () => {\n if (crossorigin) {\n unsubscribe();\n }\n else if (unsubscribe && iframe.contentWindow) {\n unsubscribe();\n }\n detach(iframe);\n };\n}\nconst resize_observer_content_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'content-box' });\nconst resize_observer_border_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'border-box' });\nconst resize_observer_device_pixel_content_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'device-pixel-content-box' });\nfunction toggle_class(element, name, toggle) {\n element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {\n const e = document.createEvent('CustomEvent');\n e.initCustomEvent(type, bubbles, cancelable, detail);\n return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n return Array.from(parent.querySelectorAll(selector));\n}\nfunction head_selector(nodeId, head) {\n const result = [];\n let started = 0;\n for (const node of head.childNodes) {\n if (node.nodeType === 8 /* comment node */) {\n const comment = node.textContent.trim();\n if (comment === `HEAD_${nodeId}_END`) {\n started -= 1;\n result.push(node);\n }\n else if (comment === `HEAD_${nodeId}_START`) {\n started += 1;\n result.push(node);\n }\n }\n else if (started > 0) {\n result.push(node);\n }\n }\n return result;\n}\nclass HtmlTag {\n constructor(is_svg = false) {\n this.is_svg = false;\n this.is_svg = is_svg;\n this.e = this.n = null;\n }\n c(html) {\n this.h(html);\n }\n m(html, target, anchor = null) {\n if (!this.e) {\n if (this.is_svg)\n this.e = svg_element(target.nodeName);\n /** #7364 target for <template> may be provided as #document-fragment(11) */\n else\n this.e = element((target.nodeType === 11 ? 'TEMPLATE' : target.nodeName));\n this.t = target.tagName !== 'TEMPLATE' ? target : target.content;\n this.c(html);\n }\n this.i(anchor);\n }\n h(html) {\n this.e.innerHTML = html;\n this.n = Array.from(this.e.nodeName === 'TEMPLATE' ? this.e.content.childNodes : this.e.childNodes);\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert(this.t, this.n[i], anchor);\n }\n }\n p(html) {\n this.d();\n this.h(html);\n this.i(this.a);\n }\n d() {\n this.n.forEach(detach);\n }\n}\nclass HtmlTagHydration extends HtmlTag {\n constructor(claimed_nodes, is_svg = false) {\n super(is_svg);\n this.e = this.n = null;\n this.l = claimed_nodes;\n }\n c(html) {\n if (this.l) {\n this.n = this.l;\n }\n else {\n super.c(html);\n }\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert_hydration(this.t, this.n[i], anchor);\n }\n }\n}\nfunction attribute_to_object(attributes) {\n const result = {};\n for (const attribute of attributes) {\n result[attribute.name] = attribute.value;\n }\n return result;\n}\nfunction get_custom_elements_slots(element) {\n const result = {};\n element.childNodes.forEach((node) => {\n result[node.slot || 'default'] = true;\n });\n return result;\n}\nfunction construct_svelte_component(component, props) {\n return new component(props);\n}\n\n// we need to store the information for multiple documents because a Svelte application could also contain iframes\n// https://github.com/sveltejs/svelte/issues/3624\nconst managed_styles = new Map();\nlet active = 0;\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n while (i--)\n hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n return hash >>> 0;\n}\nfunction create_style_information(doc, node) {\n const info = { stylesheet: append_empty_stylesheet(node), rules: {} };\n managed_styles.set(doc, info);\n return info;\n}\nfunction create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {\n const step = 16.666 / duration;\n let keyframes = '{\\n';\n for (let p = 0; p <= 1; p += step) {\n const t = a + (b - a) * ease(p);\n keyframes += p * 100 + `%{${fn(t, 1 - t)}}\\n`;\n }\n const rule = keyframes + `100% {${fn(b, 1 - b)}}\\n}`;\n const name = `__svelte_${hash(rule)}_${uid}`;\n const doc = get_root_for_style(node);\n const { stylesheet, rules } = managed_styles.get(doc) || create_style_information(doc, node);\n if (!rules[name]) {\n rules[name] = true;\n stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);\n }\n const animation = node.style.animation || '';\n node.style.animation = `${animation ? `${animation}, ` : ''}${name} ${duration}ms linear ${delay}ms 1 both`;\n active += 1;\n return name;\n}\nfunction delete_rule(node, name) {\n const previous = (node.style.animation || '').split(', ');\n const next = previous.filter(name\n ? anim => anim.indexOf(name) < 0 // remove specific animation\n : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations\n );\n const deleted = previous.length - next.length;\n if (deleted) {\n node.style.animation = next.join(', ');\n active -= deleted;\n if (!active)\n clear_rules();\n }\n}\nfunction clear_rules() {\n raf(() => {\n if (active)\n return;\n managed_styles.forEach(info => {\n const { ownerNode } = info.stylesheet;\n // there is no ownerNode if it runs on jsdom.\n if (ownerNode)\n detach(ownerNode);\n });\n managed_styles.clear();\n });\n}\n\nfunction create_animation(node, from, fn, params) {\n if (!from)\n return noop;\n const to = node.getBoundingClientRect();\n if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom)\n return noop;\n const { delay = 0, duration = 300, easing = identity, \n // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation?\n start: start_time = now() + delay, \n // @ts-ignore todo:\n end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params);\n let running = true;\n let started = false;\n let name;\n function start() {\n if (css) {\n name = create_rule(node, 0, 1, duration, delay, easing, css);\n }\n if (!delay) {\n started = true;\n }\n }\n function stop() {\n if (css)\n delete_rule(node, name);\n running = false;\n }\n loop(now => {\n if (!started && now >= start_time) {\n started = true;\n }\n if (started && now >= end) {\n tick(1, 0);\n stop();\n }\n if (!running) {\n return false;\n }\n if (started) {\n const p = now - start_time;\n const t = 0 + 1 * easing(p / duration);\n tick(t, 1 - t);\n }\n return true;\n });\n start();\n tick(0, 1);\n return stop;\n}\nfunction fix_position(node) {\n const style = getComputedStyle(node);\n if (style.position !== 'absolute' && style.position !== 'fixed') {\n const { width, height } = style;\n const a = node.getBoundingClientRect();\n node.style.position = 'absolute';\n node.style.width = width;\n node.style.height = height;\n add_transform(node, a);\n }\n}\nfunction add_transform(node, a) {\n const b = node.getBoundingClientRect();\n if (a.left !== b.left || a.top !== b.top) {\n const style = getComputedStyle(node);\n const transform = style.transform === 'none' ? '' : style.transform;\n node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;\n }\n}\n\nlet current_component;\nfunction set_current_component(component) {\n current_component = component;\n}\nfunction get_current_component() {\n if (!current_component)\n throw new Error('Function called outside component initialization');\n return current_component;\n}\n/**\n * Schedules a callback to run immediately before the component is updated after any state change.\n *\n * The first time the callback runs will be before the initial `onMount`\n *\n * https://svelte.dev/docs#run-time-svelte-beforeupdate\n */\nfunction beforeUpdate(fn) {\n get_current_component().$$.before_update.push(fn);\n}\n/**\n * The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM.\n * It must be called during the component's initialisation (but doesn't need to live *inside* the component;\n * it can be called from an external module).\n *\n * `onMount` does not run inside a [server-side component](/docs#run-time-server-side-component-api).\n *\n * https://svelte.dev/docs#run-time-svelte-onmount\n */\nfunction onMount(fn) {\n get_current_component().$$.on_mount.push(fn);\n}\n/**\n * Schedules a callback to run immediately after the component has been updated.\n *\n * The first time the callback runs will be after the initial `onMount`\n */\nfunction afterUpdate(fn) {\n get_current_component().$$.after_update.push(fn);\n}\n/**\n * Schedules a callback to run immediately before the component is unmounted.\n *\n * Out of `onMount`, `beforeUpdate`, `afterUpdate` and `onDestroy`, this is the\n * only one that runs inside a server-side component.\n *\n * https://svelte.dev/docs#run-time-svelte-ondestroy\n */\nfunction onDestroy(fn) {\n get_current_component().$$.on_destroy.push(fn);\n}\n/**\n * Creates an event dispatcher that can be used to dispatch [component events](/docs#template-syntax-component-directives-on-eventname).\n * Event dispatchers are functions that can take two arguments: `name` and `detail`.\n *\n * Component events created with `createEventDispatcher` create a\n * [CustomEvent](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent).\n * These events do not [bubble](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events#Event_bubbling_and_capture).\n * The `detail` argument corresponds to the [CustomEvent.detail](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/detail)\n * property and can contain any type of data.\n *\n * https://svelte.dev/docs#run-time-svelte-createeventdispatcher\n */\nfunction createEventDispatcher() {\n const component = get_current_component();\n return (type, detail, { cancelable = false } = {}) => {\n const callbacks = component.$$.callbacks[type];\n if (callbacks) {\n // TODO are there situations where events could be dispatched\n // in a server (non-DOM) environment?\n const event = custom_event(type, detail, { cancelable });\n callbacks.slice().forEach(fn => {\n fn.call(component, event);\n });\n return !event.defaultPrevented;\n }\n return true;\n };\n}\n/**\n * Associates an arbitrary `context` object with the current component and the specified `key`\n * and returns that object. The context is then available to children of the component\n * (including slotted content) with `getContext`.\n *\n * Like lifecycle functions, this must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-setcontext\n */\nfunction setContext(key, context) {\n get_current_component().$$.context.set(key, context);\n return context;\n}\n/**\n * Retrieves the context that belongs to the closest parent component with the specified `key`.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-getcontext\n */\nfunction getContext(key) {\n return get_current_component().$$.context.get(key);\n}\n/**\n * Retrieves the whole context map that belongs to the closest parent component.\n * Must be called during component initialisation. Useful, for example, if you\n * programmatically create a component and want to pass the existing context to it.\n *\n * https://svelte.dev/docs#run-time-svelte-getallcontexts\n */\nfunction getAllContexts() {\n return get_current_component().$$.context;\n}\n/**\n * Checks whether a given `key` has been set in the context of a parent component.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-hascontext\n */\nfunction hasContext(key) {\n return get_current_component().$$.context.has(key);\n}\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\nfunction bubble(component, event) {\n const callbacks = component.$$.callbacks[event.type];\n if (callbacks) {\n // @ts-ignore\n callbacks.slice().forEach(fn => fn.call(this, event));\n }\n}\n\nconst dirty_components = [];\nconst intros = { enabled: false };\nconst binding_callbacks = [];\nlet render_callbacks = [];\nconst flush_callbacks = [];\nconst resolved_promise = /* @__PURE__ */ Promise.resolve();\nlet update_scheduled = false;\nfunction schedule_update() {\n if (!update_scheduled) {\n update_scheduled = true;\n resolved_promise.then(flush);\n }\n}\nfunction tick() {\n schedule_update();\n return resolved_promise;\n}\nfunction add_render_callback(fn) {\n render_callbacks.push(fn);\n}\nfunction add_flush_callback(fn) {\n flush_callbacks.push(fn);\n}\n// flush() calls callbacks in this order:\n// 1. All beforeUpdate callbacks, in order: parents before children\n// 2. All bind:this callbacks, in reverse order: children before parents.\n// 3. All afterUpdate callbacks, in order: parents before children. EXCEPT\n// for afterUpdates called during the initial onMount, which are called in\n// reverse order: children before parents.\n// Since callbacks might update component values, which could trigger another\n// call to flush(), the following steps guard against this:\n// 1. During beforeUpdate, any updated components will be added to the\n// dirty_components array and will cause a reentrant call to flush(). Because\n// the flush index is kept outside the function, the reentrant call will pick\n// up where the earlier call left off and go through all dirty components. The\n// current_component value is saved and restored so that the reentrant call will\n// not interfere with the \"parent\" flush() call.\n// 2. bind:this callbacks cannot trigger new flush() calls.\n// 3. During afterUpdate, any updated components will NOT have their afterUpdate\n// callback called a second time; the seen_callbacks set, outside the flush()\n// function, guarantees this behavior.\nconst seen_callbacks = new Set();\nlet flushidx = 0; // Do *not* move this inside the flush() function\nfunction flush() {\n // Do not reenter flush while dirty components are updated, as this can\n // result in an infinite loop. Instead, let the inner flush handle it.\n // Reentrancy is ok afterwards for bindings etc.\n if (flushidx !== 0) {\n return;\n }\n const saved_component = current_component;\n do {\n // first, call beforeUpdate functions\n // and update components\n try {\n while (flushidx < dirty_components.length) {\n const component = dirty_components[flushidx];\n flushidx++;\n set_current_component(component);\n update(component.$$);\n }\n }\n catch (e) {\n // reset dirty state to not end up in a deadlocked state and then rethrow\n dirty_components.length = 0;\n flushidx = 0;\n throw e;\n }\n set_current_component(null);\n dirty_components.length = 0;\n flushidx = 0;\n while (binding_callbacks.length)\n binding_callbacks.pop()();\n // then, once components are updated, call\n // afterUpdate functions. This may cause\n // subsequent updates...\n for (let i = 0; i < render_callbacks.length; i += 1) {\n const callback = render_callbacks[i];\n if (!seen_callbacks.has(callback)) {\n // ...so guard against infinite loops\n seen_callbacks.add(callback);\n callback();\n }\n }\n render_callbacks.length = 0;\n } while (dirty_components.length);\n while (flush_callbacks.length) {\n flush_callbacks.pop()();\n }\n update_scheduled = false;\n seen_callbacks.clear();\n set_current_component(saved_component);\n}\nfunction update($$) {\n if ($$.fragment !== null) {\n $$.update();\n run_all($$.before_update);\n const dirty = $$.dirty;\n $$.dirty = [-1];\n $$.fragment && $$.fragment.p($$.ctx, dirty);\n $$.after_update.forEach(add_render_callback);\n }\n}\n/**\n * Useful for example to execute remaining `afterUpdate` callbacks before executing `destroy`.\n */\nfunction flush_render_callbacks(fns) {\n const filtered = [];\n const targets = [];\n render_callbacks.forEach((c) => fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c));\n targets.forEach((c) => c());\n render_callbacks = filtered;\n}\n\nlet promise;\nfunction wait() {\n if (!promise) {\n promise = Promise.resolve();\n promise.then(() => {\n promise = null;\n });\n }\n return promise;\n}\nfunction dispatch(node, direction, kind) {\n node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\nconst outroing = new Set();\nlet outros;\nfunction group_outros() {\n outros = {\n r: 0,\n c: [],\n p: outros // parent group\n };\n}\nfunction check_outros() {\n if (!outros.r) {\n run_all(outros.c);\n }\n outros = outros.p;\n}\nfunction transition_in(block, local) {\n if (block && block.i) {\n outroing.delete(block);\n block.i(local);\n }\n}\nfunction transition_out(block, local, detach, callback) {\n if (block && block.o) {\n if (outroing.has(block))\n return;\n outroing.add(block);\n outros.c.push(() => {\n outroing.delete(block);\n if (callback) {\n if (detach)\n block.d(1);\n callback();\n }\n });\n block.o(local);\n }\n else if (callback) {\n callback();\n }\n}\nconst null_transition = { duration: 0 };\nfunction create_in_transition(node, fn, params) {\n const options = { direction: 'in' };\n let config = fn(node, params, options);\n let running = false;\n let animation_name;\n let task;\n let uid = 0;\n function cleanup() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n tick(0, 1);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n if (task)\n task.abort();\n running = true;\n add_render_callback(() => dispatch(node, true, 'start'));\n task = loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(1, 0);\n dispatch(node, true, 'end');\n cleanup();\n return running = false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(t, 1 - t);\n }\n }\n return running;\n });\n }\n let started = false;\n return {\n start() {\n if (started)\n return;\n started = true;\n delete_rule(node);\n if (is_function(config)) {\n config = config(options);\n wait().then(go);\n }\n else {\n go();\n }\n },\n invalidate() {\n started = false;\n },\n end() {\n if (running) {\n cleanup();\n running = false;\n }\n }\n };\n}\nfunction create_out_transition(node, fn, params) {\n const options = { direction: 'out' };\n let config = fn(node, params, options);\n let running = true;\n let animation_name;\n const group = outros;\n group.r += 1;\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n add_render_callback(() => dispatch(node, false, 'start'));\n loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(0, 1);\n dispatch(node, false, 'end');\n if (!--group.r) {\n // this will result in `end()` being called,\n // so we don't need to clean up here\n run_all(group.c);\n }\n return false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(1 - t, t);\n }\n }\n return running;\n });\n }\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config(options);\n go();\n });\n }\n else {\n go();\n }\n return {\n end(reset) {\n if (reset && config.tick) {\n config.tick(1, 0);\n }\n if (running) {\n if (animation_name)\n delete_rule(node, animation_name);\n running = false;\n }\n }\n };\n}\nfunction create_bidirectional_transition(node, fn, params, intro) {\n const options = { direction: 'both' };\n let config = fn(node, params, options);\n let t = intro ? 0 : 1;\n let running_program = null;\n let pending_program = null;\n let animation_name = null;\n function clear_animation() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function init(program, duration) {\n const d = (program.b - t);\n duration *= Math.abs(d);\n return {\n a: t,\n b: program.b,\n d,\n duration,\n start: program.start,\n end: program.start + duration,\n group: program.group\n };\n }\n function go(b) {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n const program = {\n start: now() + delay,\n b\n };\n if (!b) {\n // @ts-ignore todo: improve typings\n program.group = outros;\n outros.r += 1;\n }\n if (running_program || pending_program) {\n pending_program = program;\n }\n else {\n // if this is an intro, and there's a delay, we need to do\n // an initial tick and/or apply CSS animation immediately\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, b, duration, delay, easing, css);\n }\n if (b)\n tick(0, 1);\n running_program = init(program, duration);\n add_render_callback(() => dispatch(node, b, 'start'));\n loop(now => {\n if (pending_program && now > pending_program.start) {\n running_program = init(pending_program, duration);\n pending_program = null;\n dispatch(node, running_program.b, 'start');\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, running_program.b, running_program.duration, 0, easing, config.css);\n }\n }\n if (running_program) {\n if (now >= running_program.end) {\n tick(t = running_program.b, 1 - t);\n dispatch(node, running_program.b, 'end');\n if (!pending_program) {\n // we're done\n if (running_program.b) {\n // intro — we can tidy up immediately\n clear_animation();\n }\n else {\n // outro — needs to be coordinated\n if (!--running_program.group.r)\n run_all(running_program.group.c);\n }\n }\n running_program = null;\n }\n else if (now >= running_program.start) {\n const p = now - running_program.start;\n t = running_program.a + running_program.d * easing(p / running_program.duration);\n tick(t, 1 - t);\n }\n }\n return !!(running_program || pending_program);\n });\n }\n }\n return {\n run(b) {\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config(options);\n go(b);\n });\n }\n else {\n go(b);\n }\n },\n end() {\n clear_animation();\n running_program = pending_program = null;\n }\n };\n}\n\nfunction handle_promise(promise, info) {\n const token = info.token = {};\n function update(type, index, key, value) {\n if (info.token !== token)\n return;\n info.resolved = value;\n let child_ctx = info.ctx;\n if (key !== undefined) {\n child_ctx = child_ctx.slice();\n child_ctx[key] = value;\n }\n const block = type && (info.current = type)(child_ctx);\n let needs_flush = false;\n if (info.block) {\n if (info.blocks) {\n info.blocks.forEach((block, i) => {\n if (i !== index && block) {\n group_outros();\n transition_out(block, 1, 1, () => {\n if (info.blocks[i] === block) {\n info.blocks[i] = null;\n }\n });\n check_outros();\n }\n });\n }\n else {\n info.block.d(1);\n }\n block.c();\n transition_in(block, 1);\n block.m(info.mount(), info.anchor);\n needs_flush = true;\n }\n info.block = block;\n if (info.blocks)\n info.blocks[index] = block;\n if (needs_flush) {\n flush();\n }\n }\n if (is_promise(promise)) {\n const current_component = get_current_component();\n promise.then(value => {\n set_current_component(current_component);\n update(info.then, 1, info.value, value);\n set_current_component(null);\n }, error => {\n set_current_component(current_component);\n update(info.catch, 2, info.error, error);\n set_current_component(null);\n if (!info.hasCatch) {\n throw error;\n }\n });\n // if we previously had a then/catch block, destroy it\n if (info.current !== info.pending) {\n update(info.pending, 0);\n return true;\n }\n }\n else {\n if (info.current !== info.then) {\n update(info.then, 1, info.value, promise);\n return true;\n }\n info.resolved = promise;\n }\n}\nfunction update_await_block_branch(info, ctx, dirty) {\n const child_ctx = ctx.slice();\n const { resolved } = info;\n if (info.current === info.then) {\n child_ctx[info.value] = resolved;\n }\n if (info.current === info.catch) {\n child_ctx[info.error] = resolved;\n }\n info.block.p(child_ctx, dirty);\n}\n\nfunction destroy_block(block, lookup) {\n block.d(1);\n lookup.delete(block.key);\n}\nfunction outro_and_destroy_block(block, lookup) {\n transition_out(block, 1, 1, () => {\n lookup.delete(block.key);\n });\n}\nfunction fix_and_destroy_block(block, lookup) {\n block.f();\n destroy_block(block, lookup);\n}\nfunction fix_and_outro_and_destroy_block(block, lookup) {\n block.f();\n outro_and_destroy_block(block, lookup);\n}\nfunction update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {\n let o = old_blocks.length;\n let n = list.length;\n let i = o;\n const old_indexes = {};\n while (i--)\n old_indexes[old_blocks[i].key] = i;\n const new_blocks = [];\n const new_lookup = new Map();\n const deltas = new Map();\n const updates = [];\n i = n;\n while (i--) {\n const child_ctx = get_context(ctx, list, i);\n const key = get_key(child_ctx);\n let block = lookup.get(key);\n if (!block) {\n block = create_each_block(key, child_ctx);\n block.c();\n }\n else if (dynamic) {\n // defer updates until all the DOM shuffling is done\n updates.push(() => block.p(child_ctx, dirty));\n }\n new_lookup.set(key, new_blocks[i] = block);\n if (key in old_indexes)\n deltas.set(key, Math.abs(i - old_indexes[key]));\n }\n const will_move = new Set();\n const did_move = new Set();\n function insert(block) {\n transition_in(block, 1);\n block.m(node, next);\n lookup.set(block.key, block);\n next = block.first;\n n--;\n }\n while (o && n) {\n const new_block = new_blocks[n - 1];\n const old_block = old_blocks[o - 1];\n const new_key = new_block.key;\n const old_key = old_block.key;\n if (new_block === old_block) {\n // do nothing\n next = new_block.first;\n o--;\n n--;\n }\n else if (!new_lookup.has(old_key)) {\n // remove old block\n destroy(old_block, lookup);\n o--;\n }\n else if (!lookup.has(new_key) || will_move.has(new_key)) {\n insert(new_block);\n }\n else if (did_move.has(old_key)) {\n o--;\n }\n else if (deltas.get(new_key) > deltas.get(old_key)) {\n did_move.add(new_key);\n insert(new_block);\n }\n else {\n will_move.add(old_key);\n o--;\n }\n }\n while (o--) {\n const old_block = old_blocks[o];\n if (!new_lookup.has(old_block.key))\n destroy(old_block, lookup);\n }\n while (n)\n insert(new_blocks[n - 1]);\n run_all(updates);\n return new_blocks;\n}\nfunction validate_each_keys(ctx, list, get_context, get_key) {\n const keys = new Set();\n for (let i = 0; i < list.length; i++) {\n const key = get_key(get_context(ctx, list, i));\n if (keys.has(key)) {\n throw new Error('Cannot have duplicate keys in a keyed each');\n }\n keys.add(key);\n }\n}\n\nfunction get_spread_update(levels, updates) {\n const update = {};\n const to_null_out = {};\n const accounted_for = { $$scope: 1 };\n let i = levels.length;\n while (i--) {\n const o = levels[i];\n const n = updates[i];\n if (n) {\n for (const key in o) {\n if (!(key in n))\n to_null_out[key] = 1;\n }\n for (const key in n) {\n if (!accounted_for[key]) {\n update[key] = n[key];\n accounted_for[key] = 1;\n }\n }\n levels[i] = n;\n }\n else {\n for (const key in o) {\n accounted_for[key] = 1;\n }\n }\n }\n for (const key in to_null_out) {\n if (!(key in update))\n update[key] = undefined;\n }\n return update;\n}\nfunction get_spread_object(spread_props) {\n return typeof spread_props === 'object' && spread_props !== null ? spread_props : {};\n}\n\nconst _boolean_attributes = [\n 'allowfullscreen',\n 'allowpaymentrequest',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formnovalidate',\n 'hidden',\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 'selected'\n];\n/**\n * List of HTML boolean attributes (e.g. `<input disabled>`).\n * Source: https://html.spec.whatwg.org/multipage/indices.html\n */\nconst boolean_attributes = new Set([..._boolean_attributes]);\n\n/** regex of all html void element names */\nconst void_element_names = /^(?:area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/;\nfunction is_void(name) {\n return void_element_names.test(name) || name.toLowerCase() === '!doctype';\n}\n\nconst invalid_attribute_name_character = /[\\s'\">/=\\u{FDD0}-\\u{FDEF}\\u{FFFE}\\u{FFFF}\\u{1FFFE}\\u{1FFFF}\\u{2FFFE}\\u{2FFFF}\\u{3FFFE}\\u{3FFFF}\\u{4FFFE}\\u{4FFFF}\\u{5FFFE}\\u{5FFFF}\\u{6FFFE}\\u{6FFFF}\\u{7FFFE}\\u{7FFFF}\\u{8FFFE}\\u{8FFFF}\\u{9FFFE}\\u{9FFFF}\\u{AFFFE}\\u{AFFFF}\\u{BFFFE}\\u{BFFFF}\\u{CFFFE}\\u{CFFFF}\\u{DFFFE}\\u{DFFFF}\\u{EFFFE}\\u{EFFFF}\\u{FFFFE}\\u{FFFFF}\\u{10FFFE}\\u{10FFFF}]/u;\n// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n// https://infra.spec.whatwg.org/#noncharacter\nfunction spread(args, attrs_to_add) {\n const attributes = Object.assign({}, ...args);\n if (attrs_to_add) {\n const classes_to_add = attrs_to_add.classes;\n const styles_to_add = attrs_to_add.styles;\n if (classes_to_add) {\n if (attributes.class == null) {\n attributes.class = classes_to_add;\n }\n else {\n attributes.class += ' ' + classes_to_add;\n }\n }\n if (styles_to_add) {\n if (attributes.style == null) {\n attributes.style = style_object_to_string(styles_to_add);\n }\n else {\n attributes.style = style_object_to_string(merge_ssr_styles(attributes.style, styles_to_add));\n }\n }\n }\n let str = '';\n Object.keys(attributes).forEach(name => {\n if (invalid_attribute_name_character.test(name))\n return;\n const value = attributes[name];\n if (value === true)\n str += ' ' + name;\n else if (boolean_attributes.has(name.toLowerCase())) {\n if (value)\n str += ' ' + name;\n }\n else if (value != null) {\n str += ` ${name}=\"${value}\"`;\n }\n });\n return str;\n}\nfunction merge_ssr_styles(style_attribute, style_directive) {\n const style_object = {};\n for (const individual_style of style_attribute.split(';')) {\n const colon_index = individual_style.indexOf(':');\n const name = individual_style.slice(0, colon_index).trim();\n const value = individual_style.slice(colon_index + 1).trim();\n if (!name)\n continue;\n style_object[name] = value;\n }\n for (const name in style_directive) {\n const value = style_directive[name];\n if (value) {\n style_object[name] = value;\n }\n else {\n delete style_object[name];\n }\n }\n return style_object;\n}\nconst ATTR_REGEX = /[&\"]/g;\nconst CONTENT_REGEX = /[&<]/g;\n/**\n * Note: this method is performance sensitive and has been optimized\n * https://github.com/sveltejs/svelte/pull/5701\n */\nfunction escape(value, is_attr = false) {\n const str = String(value);\n const pattern = is_attr ? ATTR_REGEX : CONTENT_REGEX;\n pattern.lastIndex = 0;\n let escaped = '';\n let last = 0;\n while (pattern.test(str)) {\n const i = pattern.lastIndex - 1;\n const ch = str[i];\n escaped += str.substring(last, i) + (ch === '&' ? '&amp;' : (ch === '\"' ? '&quot;' : '&lt;'));\n last = i + 1;\n }\n return escaped + str.substring(last);\n}\nfunction escape_attribute_value(value) {\n // keep booleans, null, and undefined for the sake of `spread`\n const should_escape = typeof value === 'string' || (value && typeof value === 'object');\n return should_escape ? escape(value, true) : value;\n}\nfunction escape_object(obj) {\n const result = {};\n for (const key in obj) {\n result[key] = escape_attribute_value(obj[key]);\n }\n return result;\n}\nfunction each(items, fn) {\n let str = '';\n for (let i = 0; i < items.length; i += 1) {\n str += fn(items[i], i);\n }\n return str;\n}\nconst missing_component = {\n $$render: () => ''\n};\nfunction validate_component(component, name) {\n if (!component || !component.$$render) {\n if (name === 'svelte:component')\n name += ' this={...}';\n throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules. Otherwise you may need to fix a <${name}>.`);\n }\n return component;\n}\nfunction debug(file, line, column, values) {\n console.log(`{@debug} ${file ? file + ' ' : ''}(${line}:${column})`); // eslint-disable-line no-console\n console.log(values); // eslint-disable-line no-console\n return '';\n}\nlet on_destroy;\nfunction create_ssr_component(fn) {\n function $$render(result, props, bindings, slots, context) {\n const parent_component = current_component;\n const $$ = {\n on_destroy,\n context: new Map(context || (parent_component ? parent_component.$$.context : [])),\n // these will be immediately discarded\n on_mount: [],\n before_update: [],\n after_update: [],\n callbacks: blank_object()\n };\n set_current_component({ $$ });\n const html = fn(result, props, bindings, slots);\n set_current_component(parent_component);\n return html;\n }\n return {\n render: (props = {}, { $$slots = {}, context = new Map() } = {}) => {\n on_destroy = [];\n const result = { title: '', head: '', css: new Set() };\n const html = $$render(result, props, {}, $$slots, context);\n run_all(on_destroy);\n return {\n html,\n css: {\n code: Array.from(result.css).map(css => css.code).join('\\n'),\n map: null // TODO\n },\n head: result.title + result.head\n };\n },\n $$render\n };\n}\nfunction add_attribute(name, value, boolean) {\n if (value == null || (boolean && !value))\n return '';\n const assignment = (boolean && value === true) ? '' : `=\"${escape(value, true)}\"`;\n return ` ${name}${assignment}`;\n}\nfunction add_classes(classes) {\n return classes ? ` class=\"${classes}\"` : '';\n}\nfunction style_object_to_string(style_object) {\n return Object.keys(style_object)\n .filter(key => style_object[key])\n .map(key => `${key}: ${escape_attribute_value(style_object[key])};`)\n .join(' ');\n}\nfunction add_styles(style_object) {\n const styles = style_object_to_string(style_object);\n return styles ? ` style=\"${styles}\"` : '';\n}\n\nfunction bind(component, name, callback) {\n const index = component.$$.props[name];\n if (index !== undefined) {\n component.$$.bound[index] = callback;\n callback(component.$$.ctx[index]);\n }\n}\nfunction create_component(block) {\n block && block.c();\n}\nfunction claim_component(block, parent_nodes) {\n block && block.l(parent_nodes);\n}\nfunction mount_component(component, target, anchor, customElement) {\n const { fragment, after_update } = component.$$;\n fragment && fragment.m(target, anchor);\n if (!customElement) {\n // onMount happens before the initial afterUpdate\n add_render_callback(() => {\n const new_on_destroy = component.$$.on_mount.map(run).filter(is_function);\n // if the component was destroyed immediately\n // it will update the `$$.on_destroy` reference to `null`.\n // the destructured on_destroy may still reference to the old array\n if (component.$$.on_destroy) {\n component.$$.on_destroy.push(...new_on_destroy);\n }\n else {\n // Edge case - component was destroyed immediately,\n // most likely as a result of a binding initialising\n run_all(new_on_destroy);\n }\n component.$$.on_mount = [];\n });\n }\n after_update.forEach(add_render_callback);\n}\nfunction destroy_component(component, detaching) {\n const $$ = component.$$;\n if ($$.fragment !== null) {\n flush_render_callbacks($$.after_update);\n run_all($$.on_destroy);\n $$.fragment && $$.fragment.d(detaching);\n // TODO null out other refs, including component.$$ (but need to\n // preserve final state?)\n $$.on_destroy = $$.fragment = null;\n $$.ctx = [];\n }\n}\nfunction make_dirty(component, i) {\n if (component.$$.dirty[0] === -1) {\n dirty_components.push(component);\n schedule_update();\n component.$$.dirty.fill(0);\n }\n component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));\n}\nfunction init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) {\n const parent_component = current_component;\n set_current_component(component);\n const $$ = component.$$ = {\n fragment: null,\n ctx: [],\n // state\n props,\n update: noop,\n not_equal,\n bound: blank_object(),\n // lifecycle\n on_mount: [],\n on_destroy: [],\n on_disconnect: [],\n before_update: [],\n after_update: [],\n context: new Map(options.context || (parent_component ? parent_component.$$.context : [])),\n // everything else\n callbacks: blank_object(),\n dirty,\n skip_bound: false,\n root: options.target || parent_component.$$.root\n };\n append_styles && append_styles($$.root);\n let ready = false;\n $$.ctx = instance\n ? instance(component, options.props || {}, (i, ret, ...rest) => {\n const value = rest.length ? rest[0] : ret;\n if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {\n if (!$$.skip_bound && $$.bound[i])\n $$.bound[i](value);\n if (ready)\n make_dirty(component, i);\n }\n return ret;\n })\n : [];\n $$.update();\n ready = true;\n run_all($$.before_update);\n // `false` as a special case of no DOM component\n $$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n if (options.target) {\n if (options.hydrate) {\n start_hydrating();\n const nodes = children(options.target);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.l(nodes);\n nodes.forEach(detach);\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.c();\n }\n if (options.intro)\n transition_in(component.$$.fragment);\n mount_component(component, options.target, options.anchor, options.customElement);\n end_hydrating();\n flush();\n }\n set_current_component(parent_component);\n}\nlet SvelteElement;\nif (typeof HTMLElement === 'function') {\n SvelteElement = class extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n connectedCallback() {\n const { on_mount } = this.$$;\n this.$$.on_disconnect = on_mount.map(run).filter(is_function);\n // @ts-ignore todo: improve typings\n for (const key in this.$$.slotted) {\n // @ts-ignore todo: improve typings\n this.appendChild(this.$$.slotted[key]);\n }\n }\n attributeChangedCallback(attr, _oldValue, newValue) {\n this[attr] = newValue;\n }\n disconnectedCallback() {\n run_all(this.$$.on_disconnect);\n }\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n // TODO should this delegate to addEventListener?\n if (!is_function(callback)) {\n return noop;\n }\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n };\n}\n/**\n * Base class for Svelte components. Used when dev=false.\n */\nclass SvelteComponent {\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n if (!is_function(callback)) {\n return noop;\n }\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n}\n\nfunction dispatch_dev(type, detail) {\n document.dispatchEvent(custom_event(type, Object.assign({ version: '3.59.2' }, detail), { bubbles: true }));\n}\nfunction append_dev(target, node) {\n dispatch_dev('SvelteDOMInsert', { target, node });\n append(target, node);\n}\nfunction append_hydration_dev(target, node) {\n dispatch_dev('SvelteDOMInsert', { target, node });\n append_hydration(target, node);\n}\nfunction insert_dev(target, node, anchor) {\n dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n insert(target, node, anchor);\n}\nfunction insert_hydration_dev(target, node, anchor) {\n dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n insert_hydration(target, node, anchor);\n}\nfunction detach_dev(node) {\n dispatch_dev('SvelteDOMRemove', { node });\n detach(node);\n}\nfunction detach_between_dev(before, after) {\n while (before.nextSibling && before.nextSibling !== after) {\n detach_dev(before.nextSibling);\n }\n}\nfunction detach_before_dev(after) {\n while (after.previousSibling) {\n detach_dev(after.previousSibling);\n }\n}\nfunction detach_after_dev(before) {\n while (before.nextSibling) {\n detach_dev(before.nextSibling);\n }\n}\nfunction listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation, has_stop_immediate_propagation) {\n const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : [];\n if (has_prevent_default)\n modifiers.push('preventDefault');\n if (has_stop_propagation)\n modifiers.push('stopPropagation');\n if (has_stop_immediate_propagation)\n modifiers.push('stopImmediatePropagation');\n dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers });\n const dispose = listen(node, event, handler, options);\n return () => {\n dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers });\n dispose();\n };\n}\nfunction attr_dev(node, attribute, value) {\n attr(node, attribute, value);\n if (value == null)\n dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute });\n else\n dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value });\n}\nfunction prop_dev(node, property, value) {\n node[property] = value;\n dispatch_dev('SvelteDOMSetProperty', { node, property, value });\n}\nfunction dataset_dev(node, property, value) {\n node.dataset[property] = value;\n dispatch_dev('SvelteDOMSetDataset', { node, property, value });\n}\nfunction set_data_dev(text, data) {\n data = '' + data;\n if (text.data === data)\n return;\n dispatch_dev('SvelteDOMSetData', { node: text, data });\n text.data = data;\n}\nfunction set_data_contenteditable_dev(text, data) {\n data = '' + data;\n if (text.wholeText === data)\n return;\n dispatch_dev('SvelteDOMSetData', { node: text, data });\n text.data = data;\n}\nfunction set_data_maybe_contenteditable_dev(text, data, attr_value) {\n if (~contenteditable_truthy_values.indexOf(attr_value)) {\n set_data_contenteditable_dev(text, data);\n }\n else {\n set_data_dev(text, data);\n }\n}\nfunction validate_each_argument(arg) {\n if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {\n let msg = '{#each} only iterates over array-like objects.';\n if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {\n msg += ' You can use a spread to convert this iterable into an array.';\n }\n throw new Error(msg);\n }\n}\nfunction validate_slots(name, slot, keys) {\n for (const slot_key of Object.keys(slot)) {\n if (!~keys.indexOf(slot_key)) {\n console.warn(`<${name}> received an unexpected slot \"${slot_key}\".`);\n }\n }\n}\nfunction validate_dynamic_element(tag) {\n const is_string = typeof tag === 'string';\n if (tag && !is_string) {\n throw new Error('<svelte:element> expects \"this\" attribute to be a string.');\n }\n}\nfunction validate_void_dynamic_element(tag) {\n if (tag && is_void(tag)) {\n console.warn(`<svelte:element this=\"${tag}\"> is self-closing and cannot have content.`);\n }\n}\nfunction construct_svelte_component_dev(component, props) {\n const error_message = 'this={...} of <svelte:component> should specify a Svelte component.';\n try {\n const instance = new component(props);\n if (!instance.$$ || !instance.$set || !instance.$on || !instance.$destroy) {\n throw new Error(error_message);\n }\n return instance;\n }\n catch (err) {\n const { message } = err;\n if (typeof message === 'string' && message.indexOf('is not a constructor') !== -1) {\n throw new Error(error_message);\n }\n else {\n throw err;\n }\n }\n}\n/**\n * Base class for Svelte components with some minor dev-enhancements. Used when dev=true.\n */\nclass SvelteComponentDev extends SvelteComponent {\n constructor(options) {\n if (!options || (!options.target && !options.$$inline)) {\n throw new Error(\"'target' is a required option\");\n }\n super();\n }\n $destroy() {\n super.$destroy();\n this.$destroy = () => {\n console.warn('Component was already destroyed'); // eslint-disable-line no-console\n };\n }\n $capture_state() { }\n $inject_state() { }\n}\n/**\n * Base class to create strongly typed Svelte components.\n * This only exists for typing purposes and should be used in `.d.ts` files.\n *\n * ### Example:\n *\n * You have component library on npm called `component-library`, from which\n * you export a component called `MyComponent`. For Svelte+TypeScript users,\n * you want to provide typings. Therefore you create a `index.d.ts`:\n * ```ts\n * import { SvelteComponentTyped } from \"svelte\";\n * export class MyComponent extends SvelteComponentTyped<{foo: string}> {}\n * ```\n * Typing this makes it possible for IDEs like VS Code with the Svelte extension\n * to provide intellisense and to use the component like this in a Svelte file\n * with TypeScript:\n * ```svelte\n * <script lang=\"ts\">\n * \timport { MyComponent } from \"component-library\";\n * </script>\n * <MyComponent foo={'bar'} />\n * ```\n *\n * #### Why not make this part of `SvelteComponent(Dev)`?\n * Because\n * ```ts\n * class ASubclassOfSvelteComponent extends SvelteComponent<{foo: string}> {}\n * const component: typeof SvelteComponent = ASubclassOfSvelteComponent;\n * ```\n * will throw a type error, so we need to separate the more strictly typed class.\n */\nclass SvelteComponentTyped extends SvelteComponentDev {\n constructor(options) {\n super(options);\n }\n}\nfunction loop_guard(timeout) {\n const start = Date.now();\n return () => {\n if (Date.now() - start > timeout) {\n throw new Error('Infinite loop detected');\n }\n };\n}\n\nexport { HtmlTag, HtmlTagHydration, ResizeObserverSingleton, SvelteComponent, SvelteComponentDev, SvelteComponentTyped, SvelteElement, action_destroyer, add_attribute, add_classes, add_flush_callback, add_iframe_resize_listener, add_location, add_render_callback, add_styles, add_transform, afterUpdate, append, append_dev, append_empty_stylesheet, append_hydration, append_hydration_dev, append_styles, assign, attr, attr_dev, attribute_to_object, beforeUpdate, bind, binding_callbacks, blank_object, bubble, check_outros, children, claim_comment, claim_component, claim_element, claim_html_tag, claim_space, claim_svg_element, claim_text, clear_loops, comment, component_subscribe, compute_rest_props, compute_slots, construct_svelte_component, construct_svelte_component_dev, contenteditable_truthy_values, createEventDispatcher, create_animation, create_bidirectional_transition, create_component, create_in_transition, create_out_transition, create_slot, create_ssr_component, current_component, custom_event, dataset_dev, debug, destroy_block, destroy_component, destroy_each, detach, detach_after_dev, detach_before_dev, detach_between_dev, detach_dev, dirty_components, dispatch_dev, each, element, element_is, empty, end_hydrating, escape, escape_attribute_value, escape_object, exclude_internal_props, fix_and_destroy_block, fix_and_outro_and_destroy_block, fix_position, flush, flush_render_callbacks, getAllContexts, getContext, get_all_dirty_from_scope, get_binding_group_value, get_current_component, get_custom_elements_slots, get_root_for_style, get_slot_changes, get_spread_object, get_spread_update, get_store_value, globals, group_outros, handle_promise, hasContext, has_prop, head_selector, identity, init, init_binding_group, init_binding_group_dynamic, insert, insert_dev, insert_hydration, insert_hydration_dev, intros, invalid_attribute_name_character, is_client, is_crossorigin, is_empty, is_function, is_promise, is_void, listen, listen_dev, loop, loop_guard, merge_ssr_styles, missing_component, mount_component, noop, not_equal, now, null_to_empty, object_without_properties, onDestroy, onMount, once, outro_and_destroy_block, prevent_default, prop_dev, query_selector_all, raf, resize_observer_border_box, resize_observer_content_box, resize_observer_device_pixel_content_box, run, run_all, safe_not_equal, schedule_update, select_multiple_value, select_option, select_options, select_value, self, setContext, set_attributes, set_current_component, set_custom_element_data, set_custom_element_data_map, set_data, set_data_contenteditable, set_data_contenteditable_dev, set_data_dev, set_data_maybe_contenteditable, set_data_maybe_contenteditable_dev, set_dynamic_element_data, set_input_type, set_input_value, set_now, set_raf, set_store_value, set_style, set_svg_attributes, space, split_css_unit, spread, src_url_equal, start_hydrating, stop_immediate_propagation, stop_propagation, subscribe, svg_element, text, tick, time_ranges_to_array, to_number, toggle_class, transition_in, transition_out, trusted, update_await_block_branch, update_keyed_each, update_slot, update_slot_base, validate_component, validate_dynamic_element, validate_each_argument, validate_each_keys, validate_slots, validate_store, validate_void_dynamic_element, xlink_attr };\n","import { name } from \"../../package.json\";\n\nconst throwError = (message, context) => {\n message = [message].flat().join(\"\\n\");\n\n let error = `${name}:\\n\\n${message}`;\n\n if (context) {\n error += \"\\nThis context may be helpful:\\n\\n\";\n\n for (const [key, value] of Object.entries(context)) {\n error += ` - ${key}: ${JSON.stringify(value)}\\n`;\n }\n } else {\n error += \"\\n\";\n }\n\n throw new Error(error);\n};\n\nexport default throwError;\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import throwError from \"./throwError\";\nimport { validate as isValidUuid } from \"uuid\";\n\nconst initiators = [\"user\", \"media\", \"browser\", \"media-session-api\", \"google-ima-sdk\", \"websocket\"];\nconst emitters = [\"inline-player\", \"bottom-widget\", \"segment\", \"segment-widget\"];\nconst postStatuses = [\"handled\", \"ignored-due-to-advert\", \"ignored-due-to-scrubbing\"];\nconst analyticsTypes = [\"load\", \"play\", \"play_progress\", \"ad_link_click\"];\nconst deviceTypes = [\"phone\", \"tablet\", \"desktop\"];\nconst mediaTypes = [\"content\", \"ad\"];\n\nexport const validateEventBeforeCreation = (props) => {\n validateProperty(props, \"type\", s => isTitleCase(s));\n validateProperty(props, \"description\", s => s.length > 0);\n validateProperty(props, \"initiatedBy\", s => initiators.includes(s));\n};\n\nexport const validateEventBeforeProcessing = (props) => {\n validateProperty(props, \"type\", s => isTitleCase(s));\n validateProperty(props, \"description\", s => s.length > 0);\n validateProperty(props, \"initiatedBy\", s => initiators.includes(s));\n validateProperty(props, \"emittedFrom\", s => emitters.includes(s));\n validateProperty(props, \"id\", s => isValidUuid(s));\n validateProperty(props, \"createdAt\", s => isIsoDateString(s));\n validateProperty(props, \"status\", s => s === \"pending\");\n};\n\nexport const validateEventAfterProcessing = (props) => {\n validateProperty(props, \"type\", s => isTitleCase(s));\n validateProperty(props, \"description\", s => s.length > 0);\n validateProperty(props, \"initiatedBy\", s => initiators.includes(s));\n validateProperty(props, \"emittedFrom\", s => emitters.includes(s));\n validateProperty(props, \"id\", s => isValidUuid(s));\n validateProperty(props, \"createdAt\", s => isIsoDateString(s));\n validateProperty(props, \"status\", s => postStatuses.includes(s));\n validateProperty(props, \"changedProps\", o => typeof o === \"object\");\n validateProperty(props, \"processedAt\", s => isIsoDateString(s));\n};\n\nexport const validateAnalyticsEvent = (props) => { // ClickHouse Types:\n validateProperty(props, \"event_type\", s => analyticsTypes.includes(s)); // Enum\n validateProperty(props, \"device_type\", s => deviceTypes.includes(s)); // Enum\n validateProperty(props, \"media_type\", s => mediaTypes.includes(s)); // Enum\n validateProperty(props, \"content_id\", s => !s || isValidUuid(s)); // String\n validateProperty(props, \"project_id\", n => !n || n > 0); // Int64\n validateProperty(props, \"analytics_id\", n => !n || n > 0); // Int64\n validateProperty(props, \"ad_id\", n => !n || n > 0); // Int64\n validateProperty(props, \"media_id\", n => !n || n > 0); // Int64\n validateProperty(props, \"local_storage_id\", s => !s || isValidUuid(s)); // String\n validateProperty(props, \"listen_session_id\", s => !s || isValidUuid(s)); // UUID\n validateProperty(props, \"session_created_at\", n => n >= 0); // DateTime\n validateProperty(props, \"duration\", n => n >= 0); // Int32\n validateProperty(props, \"listen_length_percent\", n => n >= 0 && n <= 100); // Int32\n validateProperty(props, \"listen_length_seconds\", n => n >= 0); // Int32\n validateProperty(props, \"speed\", n => n >= 0); // Int32\n validateProperty(props, \"location\", s => s.length > 0); // Not currently stored\n validateProperty(props, \"referrer\", s => typeof s === \"string\"); // Not currently stored\n validateProperty(props, \"player_version\", s => s.length > 0); // Not currently stored\n validateProperty(props, \"player_npm_version\", s => s.length > 0); // Not currently stored\n};\n\nconst isTitleCase = (string) => {\n string = string || \"<invalid>\";\n\n const startsWithCapital = string[0] === string[0].toUpperCase();\n const hasNonAlphabetic = string.match(/[^a-zA-Z]/);\n\n return startsWithCapital && !hasNonAlphabetic;\n};\n\nconst isIsoDateString = (string) => {\n try {\n const date = new Date(Date.parse(string));\n return date.toISOString() === string;\n } catch (error) {\n return false;\n }\n};\n\nconst validateProperty = (props, name, validationFn) => {\n if (!Object.prototype.hasOwnProperty.call(props, name)) {\n throwError(`Invalid event: missing a '${name}' property`, props);\n }\n\n if (!validationFn(props[name])) {\n throwError(`Invalid event: '${name}: ${props[name]}' is invalid`, props);\n }\n};\n","import { validateEventBeforeCreation } from \"./eventValidation\";\nimport { v4 as randomUuid } from \"uuid\";\n\nconst newEvent = (props) => {\n validateEventBeforeCreation(props);\n\n const id = randomUuid();\n const createdAt = new Date().toISOString();\n const status = \"pending\";\n\n return { id, createdAt, status, ...props };\n};\n\nexport default newEvent;\n","const withQueryParams = (src, params = {}) => {\n let url;\n\n try { url = new URL(src); } catch (e) { return src; }\n const search = new URLSearchParams(url.search);\n\n for (const [key, value] of Object.entries(params)) {\n search.set(key, value);\n }\n\n url.search = search.toString();\n return url.toString();\n};\n\nexport default withQueryParams;\n","// Returns Google Ad Tag params for the specified 'advertConsent' property.\n// https://developers.google.com/interactive-media-ads/docs/sdks/html5/client-side/consent\n\nconst googleAdTagParams = (advertConsent, showingVideo) => {\n const isLocahost = window.location.hostname === \"localhost\";\n const params = {};\n\n // The player only supports linear adverts that interrupt content.\n // Adverts that are \"non-linear\" show over the top of content that is playing.\n params.vad_type = \"linear\";\n\n // Set the non-personalized advert flag which limits the ads that can play.\n // This will be set for 'non-personalized' and 'under-the-age-of-consent'.\n params.npa = advertConsent !== \"personalized\" ? 1 : 0;\n\n // Set the 'Tag For Users under the Age of Consent in Europe' flag.\n // In this case, npa=1 is implied but we set it explicitly above, anyway.\n params.tfua = advertConsent === \"under-the-age-of-consent\" ? 1 : 0;\n\n // If video is showing in either the inline player or the widget, request\n // video or audio adverts. Otherwise, only request audio adverts.\n params.ad_type = showingVideo ? \"audio_video\" : \"audio\";\n\n // On localhost, the Google IMA SDK does not set the url parameter when it\n // requests adverts which can result in no adverts being returned. Therefore,\n // use the url query parameter from the VAST URL if it is available, otherwise\n // fall back to a URL that is known to work, i.e. for testing VAST tags.\n if (isLocahost) { params.url ||= \"https://googleads.github.io\"; }\n\n // On localhost, fall back to a URL that is known to work for description_url.\n // Usually, this will already be provided as a query param in the VAST tag.\n if (isLocahost) { params.description_url ||= \"https://googleads.github.io\"; }\n\n // Otherwise, always set the description_url to the current page's address. Do not\n // fall back since we don't want to incorrectly report where ads are served from.\n // https://support.google.com/admanager/answer/10678356?hl=en#description_url\n if (!isLocahost) { params.description_url = window.location.href; }\n\n return params;\n};\n\nexport default googleAdTagParams;\n","const elementIsVisible = (element) => {\n if (!element) { return false; }\n\n const height = window.innerHeight || document.documentElement.clientHeight;\n const width = window.innerWidth || document.documentElement.clientWidth;\n\n const { top, bottom, left, right } = element.getBoundingClientRect();\n return top < height && bottom > 0 && left < width && right > 0;\n};\n\nexport default elementIsVisible;\n","<script>\n import newEvent from \"../helpers/newEvent\";\n import withQueryParams from \"../helpers/withQueryParams\";\n import googleAdTagParams from \"../helpers/googleAdTagParams\";\n import elementIsVisible from \"../helpers/elementIsVisible\";\n\n export let vastUrl;\n export let advertConsent;\n export let video;\n export let playbackState;\n export let duration;\n export let currentTime;\n export let onEvent = () => {};\n\n let adContainer;\n let adDisplayContainer;\n let adsLoader;\n let adsRequest;\n let adsManager;\n let adsLoaded;\n let adData;\n\n $: adParams = googleAdTagParams(advertConsent, elementIsVisible(video));\n $: adTagUrl = withQueryParams(vastUrl, adParams);\n\n $: adsManager && playbackState === \"playing\" && loadAds();\n $: adsManager, playbackState === \"playing\" ? adsManager?.resume() : adsManager?.pause();\n\n const initializeIMA = () => {\n adDisplayContainer = new google.ima.AdDisplayContainer(adContainer, video);\n\n adsLoader = new google.ima.AdsLoader(adDisplayContainer);\n adsLoader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false);\n adsLoader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false);\n\n adsRequest = new google.ima.AdsRequest();\n adsRequest.adTagUrl = adTagUrl;\n adsRequest.linearAdSlotWidth = video.clientWidth;\n adsRequest.linearAdSlotHeight = video.clientHeight;\n\n adsLoader.requestAds(adsRequest);\n };\n\n const onAdsManagerLoaded = (adsManagerLoadedEvent) => {\n adsManager = adsManagerLoadedEvent.getAdsManager(video);\n\n adsManager.addEventListener(google.ima.AdEvent.Type.AD_PROGRESS, onAdProgress);\n adsManager.addEventListener(google.ima.AdEvent.Type.CLICK, onClick);\n adsManager.addEventListener(google.ima.AdEvent.Type.PAUSED, onPaused);\n adsManager.addEventListener(google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested);\n adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError);\n };\n\n const loadAds = () => {\n if (adsLoaded) { return; }\n adsLoaded = true;\n\n video.pause();\n video.load();\n adDisplayContainer.initialize();\n\n try {\n adsManager.init(video.clientWidth, video.clientHeight, google.ima.ViewMode.NORMAL);\n adsManager.start();\n makeStylesImportant();\n onAnimationFrame();\n } catch (adError) {\n onAdError(null, adError);\n }\n };\n\n const onAdProgress = (adEvent) => {\n adData = adEvent.getAdData();\n adData.updatedAt = Date.now();\n\n onEvent(newEvent({\n type: \"CurrentTimeUpdated\",\n description: \"The media's current time was updated.\",\n initiatedBy: \"media\",\n }));\n\n if (duration === adData.duration) { return; }\n duration = adData.duration;\n\n onEvent(newEvent({\n type: \"DurationUpdated\",\n description: \"The media's duration was updated.\",\n initiatedBy: \"google-ima-sdk\",\n }));\n };\n\n const onClick = () => {\n onEvent(newEvent({\n type: \"PressedAdvertVideo\",\n description: \"The video background was pressed to open the advert in a new tab.\",\n initiatedBy: \"user\",\n }));\n };\n\n const onPaused = () => {\n if (playbackState === \"paused\") { return; }\n playbackState = \"paused\";\n\n onEvent(newEvent({\n type: \"PlaybackPaused\",\n description: \"The media became paused at its current playback time.\",\n initiatedBy: \"google-ima-sdk\",\n }));\n };\n\n const onContentResumeRequested = () => {\n onEvent(newEvent({\n type: \"PlaybackEnded\",\n description: \"The media finished playing because it reached the end.\",\n initiatedBy: \"google-ima-sdk\",\n }));\n };\n\n const onAdError = (adEvent, adError) => {\n adError = adError || adEvent.getError();\n adsManager?.destroy();\n\n onEvent(newEvent({\n type: \"PlaybackErrored\",\n description: \"The media failed to play.\",\n initiatedBy: \"google-ima-sdk\",\n mediaType: \"VAST\",\n mediaUrl: adTagUrl,\n errorMessage: `${adError.getMessage()} (code=${adError.getErrorCode()})`,\n }));\n };\n\n const onScriptError = () => {\n onEvent(newEvent({\n type: \"PlaybackErrored\",\n description: \"The media failed to play.\",\n initiatedBy: \"browser\",\n mediaType: \"VAST\",\n mediaUrl: adTagUrl,\n errorMessage: \"The ima3.js script was blocked.\",\n }));\n };\n\n const makeStylesImportant = () => {\n const walker = document.createTreeWalker(adContainer);\n let node;\n\n while ((node = walker.nextNode())) {\n const cssRegex = /;(?!([^()]*\\([^()]*\\))*[^()]*\\))/; // Match semicolons not inside parentheses.\n\n const rules = node.style.cssText.split(cssRegex).filter(s => s);\n const styles = rules.map(s => s.includes(\"!important\") ? s : `${s} !important`);\n\n node.style.cssText = styles.join(\";\");\n }\n };\n\n const onAnimationFrame = () => {\n if (!adContainer) { return; }\n\n currentTime = smoothedCurrentTime();\n adsManager.resize(video.clientWidth, video.clientHeight, google.ima.ViewMode.NORMAL);\n requestAnimationFrame(onAnimationFrame);\n };\n\n const smoothedCurrentTime = () => {\n if (!adData) { return 0; }\n\n if (playbackState === \"playing\") {\n const elapsed = (Date.now() - adData.updatedAt) / 1000;\n return adData.currentTime + elapsed;\n } else {\n adData.updatedAt = Date.now();\n return currentTime;\n }\n };\n</script>\n\n<svelte:head>\n <script on:load={initializeIMA} on:error={onScriptError} src=\"https://imasdk.googleapis.com/js/sdkloader/ima3.js\"></script>\n</svelte:head>\n\n<div class=\"vast-container\" bind:this={adContainer}></div>\n","import elementIsVisible from \"./elementIsVisible\";\n\nconst orderedMediaSources = (mediaObject, videoElement) => {\n if (!mediaObject) { return []; }\n\n const audio = (mediaObject.audio || []).map(s => ({ ...s, format: \"audio\" }));\n const video = (mediaObject.video || []).map(s => ({ ...s, format: \"video\" }));\n\n if (elementIsVisible(videoElement)) {\n return [...video, ...audio];\n } else {\n return [...audio, ...video];\n }\n};\n\nexport default orderedMediaSources;\n","const loadMedia = async (source, video, hls, onError, play, startPosition) => {\n if (!video) { return; }\n\n const prevPaused = video.paused;\n const prevRate = video.playbackRate;\n\n (await hls)?.detachMedia();\n (await hls)?.destroy();\n\n const isHls = (source || {}).contentType === \"application/x-mpegURL\";\n const nativeSupport = video.canPlayType(\"application/vnd.apple.mpegurl\");\n\n const Hls = isHls && !nativeSupport && (await loadHlsLibrary());\n const useLibraryHls = Hls?.isSupported?.();\n\n if (useLibraryHls) {\n hls = new Hls({ enableWorker: false, ...{ startPosition } });\n\n hls.on(Hls.Events.ERROR, onError);\n\n hls.loadSource(source.url);\n hls.attachMedia(video);\n } else {\n video.removeAttribute(\"src\");\n video.load();\n }\n\n if (!prevPaused) { play(); }\n video.playbackRate = prevRate;\n\n return hls;\n};\n\nlet Hls;\nconst loadHlsLibrary = async () => {\n if (Hls) { return Hls; }\n const previous = window.Hls;\n\n Hls ||= (await import(\"hls.js/dist/hls.light.min.js\")).default;\n Hls ||= window.Hls;\n\n window.Hls = previous;\n return Hls;\n};\n\nexport default loadMedia;\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Luister na hierdie artikel\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Tie asɛm yi\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"ይህን ጽሑፍ ያዳምጡ\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"استمع إلى هذا المقال\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"এই লেখাটো শুনক\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Bu məqaləyə qulaq asın\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Слухайце гэты артыкул\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Чуйте тази статия\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Aw ye nin barokun lamɛn\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"এই নিবন্ধটি শুনুন\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Poslušajte ovaj članak\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Escolta aquest article\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"گوێ لەم بابەتە بگرن\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Poslechněte si tento článek\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Gwrandewch ar yr erthygl hon\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Lyt til denne artikel\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Hören Sie sich diesen Artikel an\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Se nyati sia ɖa\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Ακούστε αυτό το άρθρο\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Listen to this article\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Aŭskultu ĉi tiun artikolon\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Escucha este artículo\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Kuulake seda artiklit\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Entzun artikulu hau\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"به این مقاله گوش دهید\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Kuuntele tämä artikkeli\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Makinig sa artikulong ito\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Écoutez cet article\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Éist leis an alt seo\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Èist ris an artaigil seo\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Escoita este artigo\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"આ લેખ સાંભળો\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Saurari wannan labarin\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"E hoʻolohe i kēia ʻatikala\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"האזינו למאמר הזה\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"इस लेख को सुनें\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Poslušajte ovaj članak\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Hallgassa meg ezt a cikket\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Լսեք այս հոդվածը\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Dengarkan artikel ini\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Gee akụkọ a\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Hlustaðu á þessa grein\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Ascolta questo articolo\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"האזינו למאמר הזה\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"この記事を聞く\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"მოუსმინეთ ამ სტატიას\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Бұл мақаланы тыңдаңыз\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"សូមស្តាប់អត្ថបទនេះ។\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"ಈ ಲೇಖನವನ್ನು ಆಲಿಸಿ\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"이 기사를 들어라\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Бул макаланы уккула\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Lauschtert dësen Artikel\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Wuliriza ekitundu kino\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Yoká lisolo oyo\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"ຟັງບົດຄວາມນີ້\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Klausykite šio straipsnio\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Klausieties šo rakstu\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Henoy ity lahatsoratra ity\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Слушајте ја оваа статија\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"ഈ ലേഖനം ശ്രദ്ധിക്കുക\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Энэ нийтлэлийг сонсоорой\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"हा लेख ऐका\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Dengar artikel ini\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Isma' dan l-artiklu\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"ဒီဆောင်းပါးကို နားထောင်ပါ။\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Hør denne artikkelen\",\n\n // These translations are used by aria-label.\n playAudio: \"Spill av lyd\",\n pauseAudio: \"Sett lyden på pause\",\n scrubProgressBar: \"Scrub fremdriftslinje\",\n visitAdvert: \"Besøk annonsen\",\n visitBeyondWords: \"Besøk BeyondWords\",\n closeWidget: \"Lukk widget\",\n seekBack: \"Søk tilbake\",\n seekAhead: \"Søk fremover\",\n previousSegment: \"Forrige segment\",\n nextSegment: \"Neste segment\",\n previousTrack: \"Forrige spor\",\n nextTrack: \"Neste spor\",\n togglePlaylist: \"Bytt spilleliste\",\n visitSourceArticle: \"Besøk kildeartikkelen\",\n maximizeVideo: \"Maksimer videoen\",\n changePlaybackRate: \"Endre avspillingshastighet\",\n downloadAudio: \"Last ned lyd\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"यो लेख सुन्नुहोस्\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Luister naar dit artikel\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Hør denne artikkelen\",\n\n // These translations are used by aria-label.\n playAudio: \"Spill av lyd\",\n pauseAudio: \"Sett lyden på pause\",\n scrubProgressBar: \"Scrub fremdriftslinje\",\n visitAdvert: \"Besøk annonsen\",\n visitBeyondWords: \"Besøk BeyondWords\",\n closeWidget: \"Lukk widget\",\n seekBack: \"Søk tilbake\",\n seekAhead: \"Søk fremover\",\n previousSegment: \"Forrige segment\",\n nextSegment: \"Neste segment\",\n previousTrack: \"Forrige spor\",\n nextTrack: \"Neste spor\",\n togglePlaylist: \"Bytt spilleliste\",\n visitSourceArticle: \"Besøk kildeartikkelen\",\n maximizeVideo: \"Maksimer videoen\",\n changePlaybackRate: \"Endre avspillingshastighet\",\n downloadAudio: \"Last ned lyd\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Hør denne artikkelen\",\n\n // These translations are used by aria-label.\n playAudio: \"Spill av lyd\",\n pauseAudio: \"Sett lyden på pause\",\n scrubProgressBar: \"Scrub fremdriftslinje\",\n visitAdvert: \"Besøk annonsen\",\n visitBeyondWords: \"Besøk BeyondWords\",\n closeWidget: \"Lukk widget\",\n seekBack: \"Søk tilbake\",\n seekAhead: \"Søk fremover\",\n previousSegment: \"Forrige segment\",\n nextSegment: \"Neste segment\",\n previousTrack: \"Forrige spor\",\n nextTrack: \"Neste spor\",\n togglePlaylist: \"Bytt spilleliste\",\n visitSourceArticle: \"Besøk kildeartikkelen\",\n maximizeVideo: \"Maksimer videoen\",\n changePlaybackRate: \"Endre avspillingshastighet\",\n downloadAudio: \"Last ned lyd\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Barreeffama kana dhaggeeffadhaa\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"ଏହି ଲେଖା ଶୁଣ |\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"ਇਸ ਲੇਖ ਨੂੰ ਸੁਣੋ\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Posłuchaj tego artykułu\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"دا لیکنه واورئ\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Ouça este artigo\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Kay qillqasqata uyariy\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Ascultă acest articol\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Прослушать эту статью\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Umva iyi ngingo\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"මෙම ලිපියට සවන් දෙන්න\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Vypočujte si tento článok\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Poslušajte ta članek\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Teerera kuchinyorwa ichi\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Dhageyso maqaalkan\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Dëgjoni këtë artikull\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Слушајте овај чланак\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Lyssna på den här artikeln\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Sikiliza makala hii\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"இந்தக் கட்டுரையைக் கேளுங்கள்\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"ఈ కథనాన్ని వినండి\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Ин мақоларо гӯш кунед\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"ฟังบทความนี้\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"ነዚ ጽሑፍ ስምዑዎ።\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Bu makaleyi dinle\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Бу мәкаләне тыңлагыз\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"بۇ ماقالىنى ئاڭلاڭ\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Послухайте цю статтю\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"اس مضمون کو سنیں۔\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Ushbu maqolani tinglang\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Nghe bài viết này\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"הערן צו דעם אַרטיקל\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Gbọ nkan yii\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n listenToThisArticle: \"聽這篇文章\",\n playAudio: \"Play audio\",\n\n // These translations are used by aria-label.\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n listenToThisArticle: \"聽這篇文章\",\n playAudio: \"Play audio\",\n\n // These translations are used by aria-label.\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n listenToThisArticle: \"聽這篇文章\",\n playAudio: \"Play audio\",\n\n // These translations are used by aria-label.\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"听这篇文章\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Lalela lesi sihloko\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","const basename = (path) => {\n const filename = path.split(\"/\").pop();\n const basename = filename.split(\".\")[0];\n\n return basename;\n};\n\nexport default basename;\n","import throwError from \"./throwError\";\n\nconst validateTranslations = (locales, languages) => {\n validateAtLeastOneDefault(locales, languages);\n validateAtMostOneDefault(locales);\n validateTranslationKeys(locales, languages);\n};\n\nconst validateAtLeastOneDefault = (locales, languages) => {\n for (const locale of Object.keys(locales)) {\n const language = locale.split(\"-\")[0];\n if (languages[language]) { continue; }\n\n throwError([\n `The language '${language}' has no default locale set. Should it be '${locale}' ?`,\n `If so, please set 'isDefaultForLanguage: true' in src/translations/${locale}.ts`\n ]);\n }\n};\n\nconst validateAtMostOneDefault = (locales) => {\n const defaults = {};\n\n for (const [locale, translations] of Object.entries(locales)) {\n const language = locale.split(\"-\")[0];\n if (!translations.isDefaultForLanguage) { continue; }\n\n defaults[language] ||= [];\n defaults[language].push(locale);\n }\n\n for (const [language, locales] of Object.entries(defaults)) {\n if (locales.length === 1) { continue; }\n\n throwError([\n `The language '${language}' has more than one default locale: ${locales.map(s => `'${s}'`).join(\", \")}`,\n \"Please ensure 'isDefaultForLanguage: true' is set in exactly one file.\",\n ]);\n }\n};\n\nconst validateTranslationKeys = (locales) => {\n const allKeys = Object.values(locales).map(Object.keys).flat();\n const uniqKeys = new Set(allKeys.filter(k => k !== \"isDefaultForLanguage\"));\n\n for (const [locale, translations] of Object.entries(locales)) {\n for (const key of uniqKeys) {\n if (translations[key]) { continue; }\n\n throwError([\n `The locale '${locale}' is missing the translation key '${key}'.`,\n `Please set '${key}: \"something\"' in src/translations/${locale}.ts`,\n ]);\n }\n }\n};\n\nexport default validateTranslations;\n","import basename from \"./basename\";\nimport validateTranslations from \"./validateTranslations\";\nimport throwError from \"./throwError\";\n\nconst modules = import.meta.glob(\"../translations/*\", { eager: true });\nconst pairs = Object.entries(modules).map(([k, v]) => [basename(k), v.default]);\n\nconst locales = Object.fromEntries(pairs.filter(([k, _]) => k.includes(\"-\")));\nconst languages = Object.fromEntries(pairs.filter(([_, v]) => v.isDefaultForLanguage).map(([k, v]) => [k.split(\"-\")[0], v]));\n\nvalidateTranslations(locales, languages);\n\nconst translate = (key, { locale } = {}) => {\n const translations = translationsForBrowserPreference(locale);\n\n if (!translations[key]) {\n throwError([\n `No translations found for the '${key}' translation key.`,\n `Please ensure '${key}: \"something\"' is set in src/translations/`,\n ]);\n }\n\n return translations[key];\n};\n\nconst translationsForBrowserPreference = (locale = null) => {\n const localesToTry = [locale, ...navigator.languages, \"en\"].filter(s => s);\n\n for (const locale of localesToTry) {\n const language = locale.split(\"-\")[0];\n\n // navigator.languages can return both locales (en-GB) and languages (en).\n // It doesn't mattter in this case because locales[\"en\"] will be undefined\n // and we're explicitly fetching the language translations separately below.\n\n if (locales[locale]) { return locales[locale]; }\n if (languages[language]) { return languages[language]; }\n }\n};\n\nexport default translate;\n","const blurElement = (event) => event.currentTarget.blur();\n\nexport default blurElement;\n","const findSegmentIndex = (segments, time) => {\n const nextIndex = segments.findIndex(s => s.startTime > time);\n const afterTheEnd = nextIndex === -1;\n\n const thisIndex = nextIndex - 1;\n const beforeTheStart = thisIndex === -1;\n\n if (beforeTheStart) {\n return 0;\n } else if (afterTheEnd) {\n return segments.length - 1;\n } else {\n return thisIndex;\n }\n};\n\nexport default findSegmentIndex;\n","const findLoadedMedia = (sources, videoElement) => {\n const source = sources.find(source => {\n const matchesUrl = source.url && videoElement?.currentSrc?.startsWith(source.url);\n const matchesHls = source.url?.endsWith(\".m3u8\") && videoElement?.currentSrc?.startsWith(\"blob:\");\n\n return matchesUrl || matchesHls;\n });\n\n if (!source) { console.warn(\"BeyondWords.Player: media was loaded but failed to set loadedMedia\"); }\n return source;\n};\n\nexport default findLoadedMedia;\n","<script>\n import { onMount } from \"svelte\";\n import VastContainer from \"./VastContainer.svelte\";\n import orderedMediaSources from \"../helpers/orderedMediaSources\";\n import loadMedia from \"../helpers/loadMedia\";\n import newEvent from \"../helpers/newEvent\";\n import translate from \"../helpers/translate\";\n import blurElement from \"../helpers/blurElement\";\n import findSegmentIndex from \"../helpers/findSegmentIndex\";\n import findLoadedMedia from \"../helpers/findLoadedMedia\";\n\n export let content;\n export let contentIndex;\n export let introOrOutro;\n export let activeAdvert;\n export let advertConsent;\n export let playbackState;\n export let duration;\n export let currentTime;\n export let playbackRate;\n export let prevPercentage;\n export let videoBehindWidget;\n export let videoBehindStatic;\n export let widgetPosition;\n export let widgetWidth;\n export let onEvent = () => {};\n export let video;\n\n let hls = null;\n let timeout;\n let time = 0;\n let loadCount = 0;\n let initialTime = currentTime;\n\n const setTime = (t) => time = t;\n const play = () => video?.play()?.catch(handlePlayError);\n\n $: !activeAdvert && setTime(currentTime);\n $: currentTime = time;\n\n $: contentItem = content[contentIndex];\n $: segments = contentItem?.segments || [];\n\n $: contentIndex, introOrOutro, activeAdvert, loadCount += 1;\n $: isFirstLoad = loadCount === 1;\n $: timeFragment = isFirstLoad ? `#t=${initialTime}` : \"\";\n\n $: mediaObject = introOrOutro;\n $: !introOrOutro && (mediaObject = activeAdvert);\n $: !introOrOutro && !activeAdvert && (mediaObject = contentItem);\n\n $: sources = orderedMediaSources(mediaObject, video);\n $: hls = loadMedia(sources[0], video, hls, handleHlsError, play, isFirstLoad && initialTime);\n\n $: vastUrl = activeAdvert?.vastUrl;\n $: customUrl = activeAdvert?.clickThroughUrl;\n\n $: sources, !vastUrl && (playbackState === \"playing\" ? play() : video?.pause());\n $: sources, prevPercentage = 0;\n\n $: position = videoBehindWidget && widgetPosition !== \"auto\" ? `fixed-${widgetPosition}` : \"\";\n $: style = videoBehindWidget ? `width: ${widgetWidth}` : \"\";\n\n $: atTheStart = playbackState === \"stopped\" && currentTime === 0;\n\n $: segmentIndex = introOrOutro || activeAdvert || atTheStart ? -1 : findSegmentIndex(segments, currentTime);\n $: segmentIndex, handleSegmentUpdate();\n\n $: videoBehindWidget && animate();\n\n const animate = () => {\n if (timeout) { clearTimeout(timeout); }\n timeout = setTimeout(() => timeout = null, 500);\n };\n\n const handlePlay = () => {\n onEvent(newEvent({\n type: \"PlaybackPlaying\",\n description: \"The media began playing from its current playback time.\",\n initiatedBy: \"media\",\n }));\n };\n\n const handlePause = () => {\n onEvent(newEvent({\n type: \"PlaybackPaused\",\n description: \"The media became paused at its current playback time.\",\n initiatedBy: \"media\",\n }));\n };\n\n const handleEnded = () => {\n onEvent(newEvent({\n type: \"PlaybackEnded\",\n description: \"The media finished playing because it reached the end.\",\n initiatedBy: \"media\",\n }));\n };\n\n const handleDurationChange = () => {\n onEvent(newEvent({\n type: \"DurationUpdated\",\n description: \"The media's duration was updated.\",\n initiatedBy: \"media\",\n }));\n };\n\n const handleLoadedData = () => {\n const loadedMedia = findLoadedMedia(sources, video);\n\n onEvent(newEvent({\n type: \"MediaLoaded\",\n description: \"The media finished loading its first frame of data.\",\n initiatedBy: \"media\",\n loadedMedia,\n }));\n };\n\n const handleTimeUpdate = () => {\n // Ensure the correct duration is sent to analytics for vast ads.\n if (vastUrl) { return; }\n\n onEvent(newEvent({\n type: \"CurrentTimeUpdated\",\n description: \"The media's current time was updated.\",\n initiatedBy: \"media\",\n }));\n };\n\n const handleSegmentUpdate = () => {\n onEvent(newEvent({\n type: \"CurrentSegmentUpdated\",\n description: \"The media's current segment was updated.\",\n initiatedBy: \"media\",\n segment: segments[segmentIndex],\n contentIndex,\n segmentIndex,\n }));\n };\n\n const handleRateChange = () => {\n onEvent(newEvent({\n type: \"PlaybackRateUpdated\",\n description: \"The media's playback rate was updated.\",\n initiatedBy: \"media\",\n }));\n };\n\n const handlePlayError = (error) => {\n if (error?.name !== \"NotAllowedError\") { throw error; }\n\n onEvent(newEvent({\n type: \"PlaybackNotAllowed\",\n description: \"The media cannot play because there was no user event.\",\n initiatedBy: \"media\",\n }));\n };\n\n const handleSourceError = (sourceIndex) => () => {\n const isLastSource = sourceIndex === sources.length - 1;\n if (!isLastSource) { return; }\n\n onEvent(newEvent({\n type: \"PlaybackErrored\",\n description: \"The media failed to play.\",\n initiatedBy: \"media\",\n mediaType: \"native\",\n mediaUrl: sources[0].url,\n errorMessage: \"The video tag contains sources but none are playable.\",\n }));\n };\n\n const handleHlsError = async (event, data) => {\n if (!data.fatal) { return; }\n\n (await hls)?.destroy();\n hls = null;\n\n onEvent(newEvent({\n type: \"PlaybackErrored\",\n description: \"The media failed to play.\",\n initiatedBy: \"media\",\n mediaType: \"HLS\",\n mediaUrl: sources[0].url,\n errorMessage: `${data.type} ${data.details}`,\n }));\n };\n\n const handleFullScreenChange = () => {\n onEvent(newEvent({\n type: \"FullScreenModeUpdated\",\n description: \"The browser entered or exited full screen mode.\",\n initiatedBy: \"browser\",\n }));\n };\n\n onMount(() => {\n const listener1 = addEventListener(\"fullscreenchange\", handleFullScreenChange);\n const listener2 = addEventListener(\"webkitfullscreenchange\", handleFullScreenChange);\n\n return () => {\n removeEventListener(\"fullscreenchange\", listener1);\n removeEventListener(\"fullscreenchange\", listener2);\n };\n });\n</script>\n\n<div class=\"media-element {position}\" class:animating={timeout} class:behind-static={videoBehindStatic} class:behind-widget={videoBehindWidget} {style}>\n <div class=\"inner\">\n <!-- svelte-ignore a11y-media-has-caption -->\n <video bind:this={video}\n bind:duration\n bind:currentTime={time}\n bind:playbackRate\n preload=\"metadata\"\n playsinline\n disablepictureinpicture\n on:play={handlePlay}\n on:pause={handlePause}\n on:ended={handleEnded}\n on:durationchange={handleDurationChange}\n on:loadeddata={handleLoadedData}\n on:timeupdate={handleTimeUpdate}\n on:ratechange={handleRateChange}>\n\n {#each sources as { url, contentType }, i}\n <source src={`${url}${timeFragment}`} type={contentType} on:error={handleSourceError(i)}>\n {/each}\n </video>\n\n {#if vastUrl}\n <VastContainer {onEvent} {vastUrl} {advertConsent} {video} bind:playbackState bind:duration bind:currentTime />\n {/if}\n\n {#if customUrl}\n <a class=\"custom-advert-link\" href={customUrl} target=\"_blank\" on:mouseup={blurElement} aria-label={translate(\"visitAdvert\")}>&nbsp;</a>\n {/if}\n </div>\n</div>\n\n<style>\n :global(.beyondwords-player) {\n position: relative;\n }\n\n .media-element {\n display: none;\n align-items: center;\n justify-content: center;\n background: black;\n border-radius: 8px;\n overflow: hidden;\n min-width: 300px;\n max-width: 720px;\n }\n\n .inner {\n width: 100%;\n height: 0;\n padding-bottom: 56.25%;\n position: relative;\n }\n\n .inner video {\n position: absolute;\n width: 100%;\n height: 100%;\n object-fit: contain;\n }\n\n .behind-static {\n display: flex;\n position: absolute;\n width: 100%;\n }\n\n .behind-widget {\n display: flex;\n position: fixed;\n width: 0;\n bottom: -100px /* ~!important */;\n right: 0;\n margin: 16px;\n animation: fly-widget 0.33s forwards;\n opacity: 0 /* ~!important */;\n z-index: 999;\n }\n\n .behind-widget:not(.animating) {\n bottom: 0;\n opacity: 1;\n }\n\n .fixed-left {\n right: auto;\n left: 0;\n }\n\n .fixed-center {\n left: 0;\n margin-left: auto;\n margin-right: auto;\n max-width: min(720px, 100% - 32px);\n }\n\n .custom-advert-link {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n text-decoration: none;\n }\n\n @keyframes fly-widget {\n from { bottom: -100px; opacity: 0; }\n to { bottom: 0; opacity: 1; }\n }\n\n :global(.beyondwords-player.maximized) {\n display: flex;\n align-items: center;\n background: black;\n }\n\n :global(.beyondwords-player.maximized) .media-element {\n max-width: none;\n border-radius: 0;\n }\n</style>\n","export { identity as linear } from '../internal/index.mjs';\n\n/*\nAdapted from https://github.com/mattdesl\nDistributed under MIT License https://github.com/mattdesl/eases/blob/master/LICENSE.md\n*/\nfunction backInOut(t) {\n const s = 1.70158 * 1.525;\n if ((t *= 2) < 1)\n return 0.5 * (t * t * ((s + 1) * t - s));\n return 0.5 * ((t -= 2) * t * ((s + 1) * t + s) + 2);\n}\nfunction backIn(t) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n}\nfunction backOut(t) {\n const s = 1.70158;\n return --t * t * ((s + 1) * t + s) + 1;\n}\nfunction bounceOut(t) {\n const a = 4.0 / 11.0;\n const b = 8.0 / 11.0;\n const c = 9.0 / 10.0;\n const ca = 4356.0 / 361.0;\n const cb = 35442.0 / 1805.0;\n const cc = 16061.0 / 1805.0;\n const t2 = t * t;\n return t < a\n ? 7.5625 * t2\n : t < b\n ? 9.075 * t2 - 9.9 * t + 3.4\n : t < c\n ? ca * t2 - cb * t + cc\n : 10.8 * t * t - 20.52 * t + 10.72;\n}\nfunction bounceInOut(t) {\n return t < 0.5\n ? 0.5 * (1.0 - bounceOut(1.0 - t * 2.0))\n : 0.5 * bounceOut(t * 2.0 - 1.0) + 0.5;\n}\nfunction bounceIn(t) {\n return 1.0 - bounceOut(1.0 - t);\n}\nfunction circInOut(t) {\n if ((t *= 2) < 1)\n return -0.5 * (Math.sqrt(1 - t * t) - 1);\n return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);\n}\nfunction circIn(t) {\n return 1.0 - Math.sqrt(1.0 - t * t);\n}\nfunction circOut(t) {\n return Math.sqrt(1 - --t * t);\n}\nfunction cubicInOut(t) {\n return t < 0.5 ? 4.0 * t * t * t : 0.5 * Math.pow(2.0 * t - 2.0, 3.0) + 1.0;\n}\nfunction cubicIn(t) {\n return t * t * t;\n}\nfunction cubicOut(t) {\n const f = t - 1.0;\n return f * f * f + 1.0;\n}\nfunction elasticInOut(t) {\n return t < 0.5\n ? 0.5 *\n Math.sin(((+13.0 * Math.PI) / 2) * 2.0 * t) *\n Math.pow(2.0, 10.0 * (2.0 * t - 1.0))\n : 0.5 *\n Math.sin(((-13.0 * Math.PI) / 2) * (2.0 * t - 1.0 + 1.0)) *\n Math.pow(2.0, -10.0 * (2.0 * t - 1.0)) +\n 1.0;\n}\nfunction elasticIn(t) {\n return Math.sin((13.0 * t * Math.PI) / 2) * Math.pow(2.0, 10.0 * (t - 1.0));\n}\nfunction elasticOut(t) {\n return (Math.sin((-13.0 * (t + 1.0) * Math.PI) / 2) * Math.pow(2.0, -10.0 * t) + 1.0);\n}\nfunction expoInOut(t) {\n return t === 0.0 || t === 1.0\n ? t\n : t < 0.5\n ? +0.5 * Math.pow(2.0, 20.0 * t - 10.0)\n : -0.5 * Math.pow(2.0, 10.0 - t * 20.0) + 1.0;\n}\nfunction expoIn(t) {\n return t === 0.0 ? t : Math.pow(2.0, 10.0 * (t - 1.0));\n}\nfunction expoOut(t) {\n return t === 1.0 ? t : 1.0 - Math.pow(2.0, -10.0 * t);\n}\nfunction quadInOut(t) {\n t /= 0.5;\n if (t < 1)\n return 0.5 * t * t;\n t--;\n return -0.5 * (t * (t - 2) - 1);\n}\nfunction quadIn(t) {\n return t * t;\n}\nfunction quadOut(t) {\n return -t * (t - 2.0);\n}\nfunction quartInOut(t) {\n return t < 0.5\n ? +8.0 * Math.pow(t, 4.0)\n : -8.0 * Math.pow(t - 1.0, 4.0) + 1.0;\n}\nfunction quartIn(t) {\n return Math.pow(t, 4.0);\n}\nfunction quartOut(t) {\n return Math.pow(t - 1.0, 3.0) * (1.0 - t) + 1.0;\n}\nfunction quintInOut(t) {\n if ((t *= 2) < 1)\n return 0.5 * t * t * t * t * t;\n return 0.5 * ((t -= 2) * t * t * t * t + 2);\n}\nfunction quintIn(t) {\n return t * t * t * t * t;\n}\nfunction quintOut(t) {\n return --t * t * t * t * t + 1;\n}\nfunction sineInOut(t) {\n return -0.5 * (Math.cos(Math.PI * t) - 1);\n}\nfunction sineIn(t) {\n const v = Math.cos(t * Math.PI * 0.5);\n if (Math.abs(v) < 1e-14)\n return 1;\n else\n return 1 - v;\n}\nfunction sineOut(t) {\n return Math.sin((t * Math.PI) / 2);\n}\n\nexport { backIn, backInOut, backOut, bounceIn, bounceInOut, bounceOut, circIn, circInOut, circOut, cubicIn, cubicInOut, cubicOut, elasticIn, elasticInOut, elasticOut, expoIn, expoInOut, expoOut, quadIn, quadInOut, quadOut, quartIn, quartInOut, quartOut, quintIn, quintInOut, quintOut, sineIn, sineInOut, sineOut };\n","import { cubicInOut, linear, cubicOut } from '../easing/index.mjs';\nimport { split_css_unit, is_function, assign } from '../internal/index.mjs';\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\nfunction __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\n\nfunction blur(node, { delay = 0, duration = 400, easing = cubicInOut, amount = 5, opacity = 0 } = {}) {\n const style = getComputedStyle(node);\n const target_opacity = +style.opacity;\n const f = style.filter === 'none' ? '' : style.filter;\n const od = target_opacity * (1 - opacity);\n const [value, unit] = split_css_unit(amount);\n return {\n delay,\n duration,\n easing,\n css: (_t, u) => `opacity: ${target_opacity - (od * u)}; filter: ${f} blur(${u * value}${unit});`\n };\n}\nfunction fade(node, { delay = 0, duration = 400, easing = linear } = {}) {\n const o = +getComputedStyle(node).opacity;\n return {\n delay,\n duration,\n easing,\n css: t => `opacity: ${t * o}`\n };\n}\nfunction fly(node, { delay = 0, duration = 400, easing = cubicOut, x = 0, y = 0, opacity = 0 } = {}) {\n const style = getComputedStyle(node);\n const target_opacity = +style.opacity;\n const transform = style.transform === 'none' ? '' : style.transform;\n const od = target_opacity * (1 - opacity);\n const [xValue, xUnit] = split_css_unit(x);\n const [yValue, yUnit] = split_css_unit(y);\n return {\n delay,\n duration,\n easing,\n css: (t, u) => `\n\t\t\ttransform: ${transform} translate(${(1 - t) * xValue}${xUnit}, ${(1 - t) * yValue}${yUnit});\n\t\t\topacity: ${target_opacity - (od * u)}`\n };\n}\nfunction slide(node, { delay = 0, duration = 400, easing = cubicOut, axis = 'y' } = {}) {\n const style = getComputedStyle(node);\n const opacity = +style.opacity;\n const primary_property = axis === 'y' ? 'height' : 'width';\n const primary_property_value = parseFloat(style[primary_property]);\n const secondary_properties = axis === 'y' ? ['top', 'bottom'] : ['left', 'right'];\n const capitalized_secondary_properties = secondary_properties.map((e) => `${e[0].toUpperCase()}${e.slice(1)}`);\n const padding_start_value = parseFloat(style[`padding${capitalized_secondary_properties[0]}`]);\n const padding_end_value = parseFloat(style[`padding${capitalized_secondary_properties[1]}`]);\n const margin_start_value = parseFloat(style[`margin${capitalized_secondary_properties[0]}`]);\n const margin_end_value = parseFloat(style[`margin${capitalized_secondary_properties[1]}`]);\n const border_width_start_value = parseFloat(style[`border${capitalized_secondary_properties[0]}Width`]);\n const border_width_end_value = parseFloat(style[`border${capitalized_secondary_properties[1]}Width`]);\n return {\n delay,\n duration,\n easing,\n css: t => 'overflow: hidden;' +\n `opacity: ${Math.min(t * 20, 1) * opacity};` +\n `${primary_property}: ${t * primary_property_value}px;` +\n `padding-${secondary_properties[0]}: ${t * padding_start_value}px;` +\n `padding-${secondary_properties[1]}: ${t * padding_end_value}px;` +\n `margin-${secondary_properties[0]}: ${t * margin_start_value}px;` +\n `margin-${secondary_properties[1]}: ${t * margin_end_value}px;` +\n `border-${secondary_properties[0]}-width: ${t * border_width_start_value}px;` +\n `border-${secondary_properties[1]}-width: ${t * border_width_end_value}px;`\n };\n}\nfunction scale(node, { delay = 0, duration = 400, easing = cubicOut, start = 0, opacity = 0 } = {}) {\n const style = getComputedStyle(node);\n const target_opacity = +style.opacity;\n const transform = style.transform === 'none' ? '' : style.transform;\n const sd = 1 - start;\n const od = target_opacity * (1 - opacity);\n return {\n delay,\n duration,\n easing,\n css: (_t, u) => `\n\t\t\ttransform: ${transform} scale(${1 - (sd * u)});\n\t\t\topacity: ${target_opacity - (od * u)}\n\t\t`\n };\n}\nfunction draw(node, { delay = 0, speed, duration, easing = cubicInOut } = {}) {\n let len = node.getTotalLength();\n const style = getComputedStyle(node);\n if (style.strokeLinecap !== 'butt') {\n len += parseInt(style.strokeWidth);\n }\n if (duration === undefined) {\n if (speed === undefined) {\n duration = 800;\n }\n else {\n duration = len / speed;\n }\n }\n else if (typeof duration === 'function') {\n duration = duration(len);\n }\n return {\n delay,\n duration,\n easing,\n css: (_, u) => `\n\t\t\tstroke-dasharray: ${len};\n\t\t\tstroke-dashoffset: ${u * len};\n\t\t`\n };\n}\nfunction crossfade(_a) {\n var { fallback } = _a, defaults = __rest(_a, [\"fallback\"]);\n const to_receive = new Map();\n const to_send = new Map();\n function crossfade(from_node, node, params) {\n const { delay = 0, duration = d => Math.sqrt(d) * 30, easing = cubicOut } = assign(assign({}, defaults), params);\n const from = from_node.getBoundingClientRect();\n const to = node.getBoundingClientRect();\n const dx = from.left - to.left;\n const dy = from.top - to.top;\n const dw = from.width / to.width;\n const dh = from.height / to.height;\n const d = Math.sqrt(dx * dx + dy * dy);\n const style = getComputedStyle(node);\n const transform = style.transform === 'none' ? '' : style.transform;\n const opacity = +style.opacity;\n return {\n delay,\n duration: is_function(duration) ? duration(d) : duration,\n easing,\n css: (t, u) => `\n\t\t\t\topacity: ${t * opacity};\n\t\t\t\ttransform-origin: top left;\n\t\t\t\ttransform: ${transform} translate(${u * dx}px,${u * dy}px) scale(${t + (1 - t) * dw}, ${t + (1 - t) * dh});\n\t\t\t`\n };\n }\n function transition(items, counterparts, intro) {\n return (node, params) => {\n items.set(params.key, node);\n return () => {\n if (counterparts.has(params.key)) {\n const other_node = counterparts.get(params.key);\n counterparts.delete(params.key);\n return crossfade(other_node, node, params);\n }\n // if the node is disappearing altogether\n // (i.e. wasn't claimed by the other list)\n // then we need to supply an outro\n items.delete(params.key);\n return fallback && fallback(node, params, intro);\n };\n };\n }\n return [\n transition(to_send, to_receive, false),\n transition(to_receive, to_send, true)\n ];\n}\n\nexport { blur, crossfade, draw, fade, fly, scale, slide };\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={40 * scale} height={40 * scale} viewBox=\"0.6667 0.6667 26.6667 26.6667\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M14 0.666748C6.63996 0.666748 0.666626 6.64008 0.666626 14.0001C0.666626 21.3601 6.63996 27.3334 14 27.3334C21.36 27.3334 27.3333 21.3601 27.3333 14.0001C27.3333 6.64008 21.36 0.666748 14 0.666748ZM11.3333 18.6667V9.33341C11.3333 8.78675 11.96 8.46675 12.4 8.80008L18.6266 13.4667C18.9866 13.7334 18.9866 14.2667 18.6266 14.5334L12.4 19.2001C11.96 19.5334 11.3333 19.2134 11.3333 18.6667Z\" />\n</svg>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={40 * scale} height={40 * scale} viewBox=\"0.6667 0.6667 26.6667 26.6667\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M14 0.666748C6.63996 0.666748 0.666626 6.64008 0.666626 14.0001C0.666626 21.3601 6.63996 27.3334 14 27.3334C21.36 27.3334 27.3333 21.3601 27.3333 14.0001C27.3333 6.64008 21.36 0.666748 14 0.666748ZM11.3333 19.3334C10.6 19.3334 9.99996 18.7334 9.99996 18.0001V10.0001C9.99996 9.26675 10.6 8.66675 11.3333 8.66675C12.0666 8.66675 12.6666 9.26675 12.6666 10.0001V18.0001C12.6666 18.7334 12.0666 19.3334 11.3333 19.3334ZM16.6666 19.3334C15.9333 19.3334 15.3333 18.7334 15.3333 18.0001V10.0001C15.3333 9.26675 15.9333 8.66675 16.6666 8.66675C17.4 8.66675 18 9.26675 18 10.0001V18.0001C18 18.7334 17.4 19.3334 16.6666 19.3334Z\" />\n</svg>\n","<script>\n import Play from \"../svg_icons/Play.svelte\";\n import Pause from \"../svg_icons/Pause.svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import blurElement from \"../../helpers/blurElement\";\n import translate from \"../../helpers/translate\";\n\n export let isPlaying = false;\n export let tabindex = 0;\n export let scale = 1;\n export let color = \"#323232\";\n export let onEvent = () => {};\n\n $: ariaLabel = isPlaying ? translate(\"pauseAudio\") : translate(\"playAudio\");\n\n const handleClick = (event) => {\n event.preventDefault();\n const name = isPlaying ? \"Pause\" : \"Play\";\n\n onEvent(newEvent({\n type: `Pressed${name}`,\n description: `The ${name.toLowerCase()} button was pressed.`,\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n<button type=\"button\" class=\"play-pause-button\" {tabindex} on:click={handleClick} on:mouseup={blurElement} style=\"outline-offset: {3.2 * scale}px\" aria-label={ariaLabel}>\n {#if isPlaying}\n <Pause {scale} {color} />\n {:else}\n <Play {scale} {color} />\n {/if}\n</button>\n\n<style>\n .play-pause-button {\n display: flex;\n cursor: pointer;\n position: relative;\n\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .play-pause-button:hover {\n opacity: 0.8;\n }\n }\n</style>\n","<script>\n import newEvent from \"../../helpers/newEvent\";\n import blurElement from \"../../helpers/blurElement\";\n import translate from \"../../helpers/translate\";\n\n export let rate = 1;\n export let scale = 1;\n export let color = \"#323232\";\n export let onEvent = () => {};\n\n $: size = `${40 * scale}px`;\n $: fontSize = `${12 * scale}px`;\n\n const handleClick = () => {\n onEvent(newEvent({\n type: \"PressedChangeRate\",\n description: \"The change playback rate button was pressed.\",\n initiatedBy: \"user\",\n }));\n };\n\n const handleKeyDown = (event) => {\n let key;\n\n if (event.key === \"ArrowLeft\") { key = \"Left\"; }\n if (event.key === \"ArrowRight\") { key = \"Right\"; }\n if (event.key === \"ArrowDown\") { key = \"Down\"; }\n if (event.key === \"ArrowUp\") { key = \"Up\"; }\n if (event.key === \" \") { key = \"Space\"; }\n if (event.key === \"Enter\") { key = \"Enter\"; }\n\n if (!key) { return; }\n event.preventDefault();\n\n onEvent(newEvent({\n type: `Pressed${key}OnChangeRate`,\n description: `The ${key.toLowerCase()} key was pressed while change playback rate was focussed.`,\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n<button type=\"button\" class=\"playback-rate-button\" style=\"width: {size}; height: {size}\" on:click={handleClick} on:mouseup={blurElement} on:keydown={handleKeyDown} aria-label={translate(\"changePlaybackRate\")}>\n <span style=\"font-size: {fontSize}; color: {color}\">{rate}x</span>\n</button>\n\n<style>\n .playback-rate-button {\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 600;\n cursor: pointer;\n\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .playback-rate-button:hover span {\n opacity: 0.7;\n }\n }\n</style>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n export let seconds = 10;\n</script>\n\n<svg width={40 * scale} height={40 * scale} viewBox=\"-5 -5 35 39\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M12.3035 28.3333C9.12574 28.3333 6.39796 27.2778 4.12019 25.1667C1.84241 23.0556 0.581297 20.4444 0.336852 17.3333C0.31463 17.0667 0.397963 16.8333 0.586852 16.6333C0.775741 16.4333 1.01463 16.3333 1.30352 16.3333C1.57019 16.3333 1.79796 16.4278 1.98685 16.6167C2.17574 16.8056 2.29241 17.0444 2.33685 17.3333C2.5813 19.8889 3.64796 22.0278 5.53685 23.75C7.42574 25.4722 9.6813 26.3333 12.3035 26.3333C15.0813 26.3333 17.4424 25.3611 19.3869 23.4167C21.3313 21.4722 22.3035 19.1111 22.3035 16.3333C22.3035 13.5556 21.3591 11.1944 19.4702 9.25C17.5813 7.30555 15.248 6.33333 12.4702 6.33333H11.7369L13.4702 8.06666C13.6702 8.26666 13.7702 8.5 13.7702 8.76666C13.7702 9.03333 13.6702 9.26666 13.4702 9.46666C13.2702 9.66666 13.0369 9.76666 12.7702 9.76666C12.5035 9.76666 12.2702 9.66666 12.0702 9.46666L8.57019 5.96666C8.45907 5.85555 8.3813 5.74444 8.33685 5.63333C8.29241 5.52222 8.27019 5.4 8.27019 5.26666C8.27019 5.13333 8.29241 5.01111 8.33685 4.9C8.3813 4.78889 8.45907 4.67777 8.57019 4.56666L12.1035 1.03333C12.2813 0.855551 12.5035 0.766663 12.7702 0.766663C13.0369 0.766663 13.2702 0.855551 13.4702 1.03333C13.648 1.23333 13.7369 1.46666 13.7369 1.73333C13.7369 2 13.648 2.22222 13.4702 2.4L11.5369 4.33333H12.3035C13.9702 4.33333 15.5313 4.64444 16.9869 5.26666C18.4424 5.88889 19.7146 6.74444 20.8035 7.83333C21.8924 8.92222 22.748 10.1944 23.3702 11.65C23.9924 13.1056 24.3035 14.6667 24.3035 16.3333C24.3035 18 23.9924 19.5611 23.3702 21.0167C22.748 22.4722 21.8924 23.7444 20.8035 24.8333C19.7146 25.9222 18.4424 26.7778 16.9869 27.4C15.5313 28.0222 13.9702 28.3333 12.3035 28.3333Z\" />\n <text fill={color} x=\"36%\" y=\"46%\" dominant-baseline=\"middle\" text-anchor=\"middle\">{seconds}</text>\n</svg>\n\n<style>\n text {\n font-size: 11.2px;\n font-weight: 600;\n }\n</style>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={40 * scale} height={40 * scale} viewBox=\"-12 -12 35 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M1.25 7.29901C0.249999 6.72166 0.250001 5.27828 1.25 4.70093L8.75 0.370802C9.75 -0.206548 11 0.51514 11 1.66984V10.3301C11 11.4848 9.75 12.2065 8.75 11.6291L1.25 7.29901Z\" />\n</svg>\n\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={40 * scale} height={40 * scale} viewBox=\"-10 -10 37 34\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M0 1C0 0.447716 0.447715 0 1 0C1.55228 0 2 0.447715 2 1V13C2 13.5523 1.55228 14 1 14C0.447715 14 0 13.5523 0 13V1Z\" />\n <path fill={color} d=\"M7.25 8.29904C6.25 7.72169 6.25 6.27831 7.25 5.70096L14.75 1.37083C15.75 0.793484 17 1.51517 17 2.66987V11.3301C17 12.4848 15.75 13.2065 14.75 12.6292L7.25 8.29904Z\" />\n</svg>\n","<script>\n import SeekBack from \"../svg_icons/SeekBack.svelte\";\n import PrevSegment from \"../svg_icons/PrevSegment.svelte\";\n import PrevTrack from \"../svg_icons/PrevTrack.svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import blurElement from \"../../helpers/blurElement\";\n import translate from \"../../helpers/translate\";\n\n export let style = \"segments\";\n export let scale = 1;\n export let color = \"#323232\";\n export let onEvent = () => {};\n let ariaLabel;\n\n $: backwardsSeconds = style.split(\"-\")[1] || 10;\n $: forwardsSeconds = style.split(\"-\")[2] || backwardsSeconds;\n\n $: isSegments = style === \"segments\";\n $: isSeconds = style.startsWith(\"seconds\");\n $: isTracks = style === \"tracks\";\n\n $: {\n if (isSeconds) {\n ariaLabel = translate(\"seekBack\");\n } else if (isSegments) {\n ariaLabel = translate(\"previousSegment\");\n } else if (isTracks) {\n ariaLabel = translate(\"previousTrack\");\n }\n }\n\n const handleClick = () => {\n let type, description, props;\n\n if (isSegments) {\n type = \"PressedPrevSegment\";\n description = \"The previous segment button was pressed.\";\n } else if (isSeconds) {\n type = \"PressedSeekBack\";\n description = \"The seek backward button was pressed.\";\n props = { seconds: backwardsSeconds };\n } else if (isTracks) {\n type = \"PressedPrevTrack\";\n description = \"The previous track button was pressed.\";\n }\n\n onEvent(newEvent({ type, description, initiatedBy: \"user\", ...props }));\n };\n</script>\n\n<button type=\"button\" class=\"prev-button\" on:click={handleClick} on:mouseup={blurElement} aria-label={ariaLabel}>\n {#if isSeconds}\n <SeekBack seconds={backwardsSeconds} {scale} {color} />\n {:else if isSegments}\n <PrevSegment {scale} {color} />\n {:else if isTracks}\n <PrevTrack {scale} {color} />\n {/if}\n</button>\n\n<style>\n .prev-button {\n display: flex;\n cursor: pointer;\n\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .prev-button:hover :global(svg) {\n opacity: 0.8;\n }\n }\n</style>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n export let seconds = 10;\n</script>\n\n<svg width={40 * scale} height={40 * scale} viewBox=\"-5 -5 35 39\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M12.5 28.3333C10.8333 28.3333 9.27222 28.0167 7.81667 27.3833C6.36111 26.75 5.09444 25.8944 4.01667 24.8167C2.93889 23.7389 2.08333 22.4722 1.45 21.0167C0.816667 19.5611 0.5 18 0.5 16.3333C0.5 14.6667 0.816667 13.1056 1.45 11.65C2.08333 10.1944 2.93889 8.92777 4.01667 7.85C5.09444 6.77222 6.36111 5.91666 7.81667 5.28333C9.27222 4.65 10.8333 4.33333 12.5 4.33333H13.2667L11.3333 2.4C11.1556 2.22222 11.0722 1.99444 11.0833 1.71666C11.0944 1.43888 11.1889 1.21111 11.3667 1.03333C11.5444 0.855551 11.7722 0.766663 12.05 0.766663C12.3278 0.766663 12.5556 0.855551 12.7333 1.03333L16.2333 4.56666C16.4333 4.76666 16.5333 5 16.5333 5.26666C16.5333 5.53333 16.4333 5.76666 16.2333 5.96666L12.7333 9.46666C12.5333 9.66666 12.2944 9.76666 12.0167 9.76666C11.7389 9.76666 11.5111 9.66666 11.3333 9.46666C11.1333 9.26666 11.0389 9.03333 11.05 8.76666C11.0611 8.5 11.1667 8.26666 11.3667 8.06666L13.1 6.33333H12.3333C9.57778 6.33333 7.25 7.30555 5.35 9.25C3.45 11.1944 2.5 13.5556 2.5 16.3333C2.5 19.1111 3.47222 21.4722 5.41667 23.4167C7.36111 25.3611 9.72222 26.3333 12.5 26.3333C15.0778 26.3333 17.3222 25.4722 19.2333 23.75C21.1444 22.0278 22.2222 19.8889 22.4667 17.3333C22.5111 17.0444 22.6278 16.8056 22.8167 16.6167C23.0056 16.4278 23.2333 16.3333 23.5 16.3333C23.7889 16.3333 24.0278 16.4333 24.2167 16.6333C24.4056 16.8333 24.4889 17.0667 24.4667 17.3333C24.2222 20.4667 22.95 23.0833 20.65 25.1833C18.35 27.2833 15.6333 28.3333 12.5 28.3333Z\" />\n <text fill={color} x=\"36%\" y=\"46%\" dominant-baseline=\"middle\" text-anchor=\"middle\">{seconds}</text>\n</svg>\n\n<style>\n text {\n font-size: 11.2px;\n font-weight: 600;\n }\n</style>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={40 * scale} height={40 * scale} viewBox=\"-12 -12 35 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M9.75 4.70093C10.75 5.27828 10.75 6.72166 9.75 7.29901L2.25 11.6291C1.25 12.2065 0 11.4848 0 10.3301V1.66984C0 0.515139 1.25 -0.206548 2.25 0.370802L9.75 4.70093Z\" />\n</svg>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={40 * scale} height={40 * scale} viewBox=\"-10 -10 37 34\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M17 13C17 13.5523 16.5523 14 16 14C15.4477 14 15 13.5523 15 13V1C15 0.447716 15.4477 0 16 0C16.5523 0 17 0.447715 17 1V13Z\" />\n <path fill={color} d=\"M9.75 5.70096C10.75 6.27831 10.75 7.72169 9.75 8.29904L2.25 12.6292C1.25 13.2065 0 12.4848 0 11.3301V2.66987C0 1.51517 1.25 0.793485 2.25 1.37083L9.75 5.70096Z\" />\n</svg>\n","<script>\n import SeekAhead from \"../svg_icons/SeekAhead.svelte\";\n import NextSegment from \"../svg_icons/NextSegment.svelte\";\n import NextTrack from \"../svg_icons/NextTrack.svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import blurElement from \"../../helpers/blurElement\";\n import translate from \"../../helpers/translate\";\n\n export let style = \"segments\";\n export let scale = 1;\n export let color = \"#323232\";\n export let onEvent = () => {};\n let ariaLabel;\n\n $: backwardsSeconds = parseFloat(style.split(\"-\")[1] || 10);\n $: forwardsSeconds = parseFloat(style.split(\"-\")[2] || backwardsSeconds);\n\n $: isSegments = style === \"segments\";\n $: isSeconds = style.startsWith(\"seconds\");\n $: isTracks = style === \"tracks\";\n\n $: {\n if (isSeconds) {\n ariaLabel = translate(\"seekAhead\");\n } else if (isSegments) {\n ariaLabel = translate(\"nextSegment\");\n } else if (isTracks) {\n ariaLabel = translate(\"nextTrack\");\n }\n }\n\n const handleClick = () => {\n let type, description, props;\n\n if (isSegments) {\n type = \"PressedNextSegment\";\n description = \"The next segment button was pressed.\";\n } else if (isSeconds) {\n type = \"PressedSeekAhead\";\n description = \"The seek ahead button was pressed.\";\n props = { seconds: forwardsSeconds };\n } else if (isTracks) {\n type = \"PressedNextTrack\";\n description = \"The next track button was pressed.\";\n }\n\n onEvent(newEvent({ type, description, initiatedBy: \"user\", ...props }));\n };\n</script>\n\n<button type=\"button\" class=\"next-button\" on:click={handleClick} on:mouseup={blurElement} aria-label={ariaLabel}>\n {#if isSeconds}\n <SeekAhead seconds={forwardsSeconds} {scale} {color} />\n {:else if isSegments}\n <NextSegment {scale} {color} />\n {:else if isTracks}\n <NextTrack {scale} {color} />\n {/if}\n</button>\n\n<style>\n .next-button {\n display: flex;\n cursor: pointer;\n\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .next-button:hover :global(svg) {\n opacity: 0.8;\n }\n }\n</style>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={20 * scale} height={20 * scale} viewBox=\"-0.6 -0.3 12 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M1.33332 1.33333C1.14443 1.33333 0.986101 1.26944 0.858323 1.14167C0.730545 1.01389 0.666656 0.855556 0.666656 0.666667C0.666656 0.477778 0.730545 0.319444 0.858323 0.191667C0.986101 0.0638889 1.14443 0 1.33332 0H7.99999C8.18888 0 8.34721 0.0638889 8.47499 0.191667C8.60277 0.319444 8.66666 0.477778 8.66666 0.666667C8.66666 0.855556 8.60277 1.01389 8.47499 1.14167C8.34721 1.26944 8.18888 1.33333 7.99999 1.33333H1.33332ZM1.33332 4C1.14443 4 0.986101 3.93611 0.858323 3.80833C0.730545 3.68056 0.666656 3.52222 0.666656 3.33333C0.666656 3.14444 0.730545 2.98611 0.858323 2.85833C0.986101 2.73056 1.14443 2.66667 1.33332 2.66667H7.99999C8.18888 2.66667 8.34721 2.73056 8.47499 2.85833C8.60277 2.98611 8.66666 3.14444 8.66666 3.33333C8.66666 3.52222 8.60277 3.68056 8.47499 3.80833C8.34721 3.93611 8.18888 4 7.99999 4H1.33332ZM1.33332 6.66667C1.14443 6.66667 0.986101 6.60278 0.858323 6.475C0.730545 6.34722 0.666656 6.18889 0.666656 6C0.666656 5.81111 0.730545 5.65278 0.858323 5.525C0.986101 5.39722 1.14443 5.33333 1.33332 5.33333H5.33332C5.52221 5.33333 5.68055 5.39722 5.80832 5.525C5.9361 5.65278 5.99999 5.81111 5.99999 6C5.99999 6.18889 5.9361 6.34722 5.80832 6.475C5.68055 6.60278 5.52221 6.66667 5.33332 6.66667H1.33332Z\" />\n\n <g transform=\"scale(1.05) translate(-1.7 0)\">\n <path fill={color} d=\"M10.3667 9.31667C10.1444 9.47222 9.91666 9.48333 9.68332 9.35C9.44999 9.21667 9.33332 9.01667 9.33332 8.75V5.91667C9.33332 5.65 9.44999 5.45 9.68332 5.31667C9.91666 5.18333 10.1444 5.19444 10.3667 5.35L12.5 6.78333C12.7 6.91667 12.8 7.1 12.8 7.33333C12.8 7.56667 12.7 7.75 12.5 7.88333L10.3667 9.31667Z\" />\n </g>\n</svg>\n\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={20 * scale} height={20 * scale} viewBox=\"-0.6 -0.3 12 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M1.33332 1.33333C1.14443 1.33333 0.986101 1.26944 0.858323 1.14167C0.730545 1.01389 0.666656 0.855556 0.666656 0.666667C0.666656 0.477778 0.730545 0.319444 0.858323 0.191667C0.986101 0.0638889 1.14443 0 1.33332 0H7.99999C8.18888 0 8.34721 0.0638889 8.47499 0.191667C8.60277 0.319444 8.66666 0.477778 8.66666 0.666667C8.66666 0.855556 8.60277 1.01389 8.47499 1.14167C8.34721 1.26944 8.18888 1.33333 7.99999 1.33333H1.33332ZM1.33332 4C1.14443 4 0.986101 3.93611 0.858323 3.80833C0.730545 3.68056 0.666656 3.52222 0.666656 3.33333C0.666656 3.14444 0.730545 2.98611 0.858323 2.85833C0.986101 2.73056 1.14443 2.66667 1.33332 2.66667H7.99999C8.18888 2.66667 8.34721 2.73056 8.47499 2.85833C8.60277 2.98611 8.66666 3.14444 8.66666 3.33333C8.66666 3.52222 8.60277 3.68056 8.47499 3.80833C8.34721 3.93611 8.18888 4 7.99999 4H1.33332ZM1.33332 6.66667C1.14443 6.66667 0.986101 6.60278 0.858323 6.475C0.730545 6.34722 0.666656 6.18889 0.666656 6C0.666656 5.81111 0.730545 5.65278 0.858323 5.525C0.986101 5.39722 1.14443 5.33333 1.33332 5.33333H5.33332C5.52221 5.33333 5.68055 5.39722 5.80832 5.525C5.9361 5.65278 5.99999 5.81111 5.99999 6C5.99999 6.18889 5.9361 6.34722 5.80832 6.475C5.68055 6.60278 5.52221 6.66667 5.33332 6.66667H1.33332Z\" />\n\n <g transform=\"translate(0.3 0)\">\n <path fill={color} d=\"M7.13333 10.2C7.01111 10.0778 6.95 9.92222 6.95 9.73333C6.95 9.54444 7.01111 9.38889 7.13333 9.26667L8.4 8L7.13333 6.73333C7.01111 6.61111 6.95 6.45555 6.95 6.26667C6.95 6.07778 7.01111 5.92222 7.13333 5.8C7.25556 5.67778 7.41111 5.61667 7.6 5.61667C7.78889 5.61667 7.94444 5.67778 8.06667 5.8L9.33333 7.06667L10.6 5.8C10.7222 5.67778 10.8778 5.61667 11.0667 5.61667C11.2556 5.61667 11.4111 5.67778 11.5333 5.8C11.6556 5.92222 11.7167 6.07778 11.7167 6.26667C11.7167 6.45555 11.6556 6.61111 11.5333 6.73333L10.2667 8L11.5333 9.26667C11.6556 9.38889 11.7167 9.54444 11.7167 9.73333C11.7167 9.92222 11.6556 10.0778 11.5333 10.2C11.4111 10.3222 11.2556 10.3833 11.0667 10.3833C10.8778 10.3833 10.7222 10.3222 10.6 10.2L9.33333 8.93333L8.06667 10.2C7.94444 10.3222 7.78889 10.3833 7.6 10.3833C7.41111 10.3833 7.25556 10.3222 7.13333 10.2Z\" />\n </g>\n</svg>\n","<script>\n import ShowPlaylist from \"../svg_icons/ShowPlaylist.svelte\";\n import HidePlaylist from \"../svg_icons/HidePlaylist.svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import blurElement from \"../../helpers/blurElement\";\n import translate from \"../../helpers/translate\";\n\n export let playlistShowing;\n export let playerStyle;\n export let scale = 1;\n export let color = \"#323232\";\n export let onEvent = () => {};\n\n const handleClick = () => {\n onEvent(newEvent({\n type: \"PressedTogglePlaylist\",\n description: \"The toggle playlist button was pressed.\",\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n<button type=\"button\" class=\"playlist-button {playerStyle}\" on:click={handleClick} on:mouseup={blurElement} style=\"outline-offset: {5 * scale}px\" aria-label={translate(\"togglePlaylist\")}>\n {#if playlistShowing}\n <HidePlaylist {scale} {color} />\n {:else}\n <ShowPlaylist {scale} {color} />\n {/if}\n</button>\n\n<style>\n .playlist-button {\n display: flex;\n cursor: pointer;\n\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n }\n\n .playlist-button.large {\n position: relative;\n left: 2px;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .playlist-button:hover {\n opacity: 0.7;\n }\n }\n</style>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={24 * scale} height={24 * scale} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M1.28571 24C0.914286 24 0.607143 23.8786 0.364286 23.6357C0.121429 23.3929 0 23.0857 0 22.7143V17.0143C0 16.6429 0.121429 16.3357 0.364286 16.0929C0.607143 15.85 0.914286 15.7286 1.28571 15.7286C1.65714 15.7286 1.96429 15.85 2.20714 16.0929C2.45 16.3357 2.57143 16.6429 2.57143 17.0143V21.4286H6.98571C7.35714 21.4286 7.66429 21.55 7.90714 21.7929C8.15 22.0357 8.27143 22.3429 8.27143 22.7143C8.27143 23.0857 8.15 23.3929 7.90714 23.6357C7.66429 23.8786 7.35714 24 6.98571 24H1.28571ZM1.28571 8.27143C0.914286 8.27143 0.607143 8.15 0.364286 7.90714C0.121429 7.66429 0 7.35714 0 6.98571V1.28571C0 0.914286 0.121429 0.607143 0.364286 0.364286C0.607143 0.121429 0.914286 0 1.28571 0H6.98571C7.35714 0 7.66429 0.121429 7.90714 0.364286C8.15 0.607143 8.27143 0.914286 8.27143 1.28571C8.27143 1.65714 8.15 1.96429 7.90714 2.20714C7.66429 2.45 7.35714 2.57143 6.98571 2.57143H2.57143V6.98571C2.57143 7.35714 2.45 7.66429 2.20714 7.90714C1.96429 8.15 1.65714 8.27143 1.28571 8.27143ZM17.0143 24C16.6429 24 16.3357 23.8786 16.0929 23.6357C15.85 23.3929 15.7286 23.0857 15.7286 22.7143C15.7286 22.3429 15.85 22.0357 16.0929 21.7929C16.3357 21.55 16.6429 21.4286 17.0143 21.4286H21.4286V17.0143C21.4286 16.6429 21.55 16.3357 21.7929 16.0929C22.0357 15.85 22.3429 15.7286 22.7143 15.7286C23.0857 15.7286 23.3929 15.85 23.6357 16.0929C23.8786 16.3357 24 16.6429 24 17.0143V22.7143C24 23.0857 23.8786 23.3929 23.6357 23.6357C23.3929 23.8786 23.0857 24 22.7143 24H17.0143ZM22.7143 8.27143C22.3429 8.27143 22.0357 8.15 21.7929 7.90714C21.55 7.66429 21.4286 7.35714 21.4286 6.98571V2.57143H17.0143C16.6429 2.57143 16.3357 2.45 16.0929 2.20714C15.85 1.96429 15.7286 1.65714 15.7286 1.28571C15.7286 0.914286 15.85 0.607143 16.0929 0.364286C16.3357 0.121429 16.6429 0 17.0143 0H22.7143C23.0857 0 23.3929 0.121429 23.6357 0.364286C23.8786 0.607143 24 0.914286 24 1.28571V6.98571C24 7.35714 23.8786 7.66429 23.6357 7.90714C23.3929 8.15 23.0857 8.27143 22.7143 8.27143Z\" />\n</svg>\n","<script>\n import Maximize from \"../svg_icons/Maximize.svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import blurElement from \"../../helpers/blurElement\";\n import translate from \"../../helpers/translate\";\n\n export let scale = 1;\n export let color = \"#323232\";\n export let onEvent = () => {};\n\n const handleClick = () => {\n onEvent(newEvent({\n type: \"PressedMaximize\",\n description: \"The maximize button was pressed.\",\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n<button type=\"button\" class=\"maximize-button\" on:click={handleClick} on:mouseup={blurElement} style=\"outline-offset: {6.4 * scale}px\" aria-label={translate(\"maximizeVideo\")}>\n <Maximize {scale} {color} />\n</button>\n\n<style>\n .maximize-button {\n display: flex;\n cursor: pointer;\n\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .maximize-button:hover {\n opacity: 0.8;\n }\n }\n</style>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={12 * scale} height={12 * scale} viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M1.66873 11.1188L0.881226 10.3313L5.21248 6.00001L0.881226 1.66876L1.66873 0.881256L5.99998 5.21251L10.3312 0.881256L11.1187 1.66876L6.78748 6.00001L11.1187 10.3313L10.3312 11.1188L5.99998 6.78751L1.66873 11.1188Z\" />\n</svg>\n","<script>\n import Close from \"../svg_icons/Close.svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import blurElement from \"../../helpers/blurElement\";\n import translate from \"../../helpers/translate\";\n\n export let scale = 1;\n export let color = \"#323232\";\n export let margin = \"auto\";\n export let onEvent = () => {};\n\n const handleClick = () => {\n onEvent(newEvent({\n type: \"PressedCloseWidget\",\n description: \"The close widget button was pressed.\",\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n<button type=\"button\" class=\"close-widget-button\" style=\"margin: {margin}; outline-offset: {4.8 * scale}px\" on:click={handleClick} on:mouseup={blurElement} aria-label={translate(\"closeWidget\")}>\n <Close {scale} {color} />\n</button>\n\n<style>\n .close-widget-button {\n display: flex;\n cursor: pointer;\n\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .close-widget-button:hover {\n opacity: 0.8;\n }\n }\n</style>\n","<script>\n import newEvent from \"../../helpers/newEvent\";\n import blurElement from \"../../helpers/blurElement\";\n\n export let href;\n export let scale = 1;\n export let color = \"#323232\";\n export let playerStyle;\n export let controlsOrder;\n export let largeImage;\n export let isMobile;\n export let onEvent = () => {};\n\n $: text = href && new URL(href).hostname;\n $: style = `font-size: ${12 * scale}px; color: ${color}; border-color: ${color}`;\n\n const handleClick = () => {\n onEvent(newEvent({\n type: \"PressedAdvertLink\",\n description: \"The advert link was pressed to open the click-through URL in a new tab.\",\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n<a class=\"advert-link {playerStyle} {controlsOrder}\" href={href} {style} class:no-image={!largeImage} class:mobile={isMobile} target=\"_blank\" on:click={handleClick} on:mouseup={blurElement}>\n {text || \"\"}\n</a>\n\n<style>\n a.advert-link {\n font-weight: 500;\n text-decoration: none;\n border-bottom-width: 1px;\n border-bottom-style: solid;\n white-space: nowrap;\n }\n\n .small {\n position: absolute;\n top: 4px;\n left: 44px;\n }\n\n .large {\n position: absolute;\n left: 96px;\n top: 8px;\n }\n\n .large.no-image {\n left: auto;\n }\n\n .screen {\n position: absolute;\n top: 236px;\n }\n\n .screen.no-image {\n top: 52px;\n }\n\n .screen.no-image.mobile {\n top: 100px;\n }\n\n a.video {\n margin-left: auto;\n margin-right: 0;\n }\n\n a.video.right-to-left {\n margin-left: 0;\n margin-right: auto;\n }\n</style>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n export let circular = true;\n</script>\n\n{#if circular}\n <svg width={40 * scale} height={40 * scale} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M20 0C8.96 0 0 8.96 0 20C0 31.04 8.96 40 20 40C31.04 40 40 31.04 40 20C40 8.96 31.04 0 20 0ZM23.76 19.08L15.26 27.58C14.48 28.36 13.22 28.36 12.44 27.58C11.66 26.8 11.66 25.54 12.44 24.76L20.94 16.26L18.4 13.72C17.76 13.08 18.22 12 19.1 12H26.98C27.54 12 27.98 12.44 27.98 13V20.88C27.98 21.78 26.9 22.22 26.28 21.58L23.76 19.08Z\" />\n </svg>\n{:else}\n <svg width={14 * scale} height={14 * scale} viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M30 32H6C4.9 32 4 31.1 4 30V6C4 4.9 4.9 4 6 4H16C17.1 4 18 3.1 18 2C18 0.9 17.1 0 16 0H4C1.78 0 0 1.8 0 4V32C0 34.2 1.8 36 4 36H32C34.2 36 36 34.2 36 32V20C36 18.9 35.1 18 34 18C32.9 18 32 18.9 32 20V30C32 31.1 31.1 32 30 32ZM22 2C22 3.1 22.9 4 24 4H29.18L10.92 22.26C10.14 23.04 10.14 24.3 10.92 25.08C11.7 25.86 12.96 25.86 13.74 25.08L32 6.82V12C32 13.1 32.9 14 34 14C35.1 14 36 13.1 36 12V2C36 0.9 35.1 0 34 0H24C22.9 0 22 0.9 22 2Z\" />\n </svg>\n{/if}\n","<script>\n import OpenNewTab from \"../svg_icons/OpenNewTab.svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import translate from \"../../helpers/translate\";\n import blurElement from \"../../helpers/blurElement\";\n\n export let href;\n export let scale = 1;\n export let color = \"#323232\";\n export let playerStyle;\n export let controlsOrder;\n export let onEvent = () => {};\n\n const handleClick = () => {\n if (!href) { return; }\n\n onEvent(newEvent({\n type: \"PressedAdvertButton\",\n description: \"The advert button was pressed to open the click-through URL in a new tab.\",\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n{#if href}\n <a class=\"advert-button {playerStyle} {controlsOrder}\" {href} target=\"_blank\" on:click={handleClick} style=\"outline-offset: {3.2 * scale}px\" on:mouseup={blurElement} aria-label={translate(\"visitAdvert\")}>\n <OpenNewTab {color} {scale} />\n </a>\n{:else}\n <div></div>\n{/if}\n\n<style>\n .advert-button {\n display: flex;\n }\n\n .screen {\n position: absolute;\n bottom: 40px;\n }\n\n .video {\n margin-left: auto;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .advert-button:hover :global(svg) {\n opacity: 0.8;\n }\n }\n</style>\n","<script>\n export let scale = 1;\n export let color1 = \"#933afb\";\n export let color2 = \"#fb3a41\";\n</script>\n\n<svg width={16 * scale} height={16 * scale} viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill=\"url(#gradient)\" d=\"M4.51819 0C3.20323 0.00414605 2.06058 0.402167 1.23154 1.23171C0.401171 2.06225 0.00315099 3.20622 0 4.52301V4.55435C0.00613614 7.21612 1.61729 10.5771 4.523 13.4826C6.55223 15.5125 8.90619 16.989 11.1512 17.6401C11.9816 17.8809 12.7653 18 13.4871 18C14.8315 18 15.9609 17.5859 16.7732 16.7738C18.0215 15.5255 18.3298 13.5286 17.6401 11.1512C16.9891 8.90638 15.5126 6.55259 13.4826 4.52284C10.5769 1.61679 7.2161 0.00597031 4.55417 0H4.51819ZM11.5084 16.4099C9.46706 15.818 7.30764 14.4566 5.42849 12.577C1.70684 8.85563 0.199673 4.07507 2.13703 2.13737C2.7125 1.56207 3.53856 1.29058 4.51354 1.29058C6.82123 1.29058 9.9611 2.81235 12.5771 5.42851C14.4569 7.308 15.8176 9.46709 16.41 11.5083C16.9634 13.4166 16.7709 14.9649 15.8677 15.8681C15.302 16.4331 14.4843 16.72 13.4841 16.72C12.8859 16.72 12.222 16.6172 11.5084 16.4099Z\" />\n <path fill=\"url(#gradient)\" d=\"M11.1483 0.360687C8.90517 1.01235 6.55252 2.48946 4.52328 4.5188C0.166276 8.87725 -1.28019 14.2587 1.23026 16.7697C2.06293 17.6026 3.21138 18 4.5339 18C7.19718 18 10.5655 16.3873 13.4767 13.4752C17.8334 9.11694 19.28 3.73601 16.7702 1.22481C15.9583 0.413305 14.8303 0 13.4865 0C12.7642 0 11.9795 0.11951 11.1483 0.360687ZM2.14341 15.856C1.24354 14.9563 1.05288 13.4115 1.60627 11.5066C2.19817 9.468 3.55852 7.31101 5.43692 5.43222C7.31433 3.55376 9.47084 2.19334 11.5085 1.60093C12.2231 1.39362 12.8867 1.29071 13.4845 1.29071C14.4808 1.29071 15.2947 1.57604 15.8566 2.13856C16.7563 3.0382 16.947 4.5832 16.3937 6.48756C15.8018 8.52586 14.4415 10.683 12.5632 12.562C9.94941 15.1771 6.8127 16.6998 4.50967 16.6998C3.53911 16.6998 2.71639 16.4293 2.14341 15.856Z\" />\n\n <defs>\n <linearGradient id=\"gradient\" x1=\"0\" y1=\"9\" x2=\"18\" y2=\"9\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color={color1} />\n <stop offset=\"1\" stop-color={color2} />\n </linearGradient>\n </defs>\n</svg>\n","<script>\n import Logo from \"../svg_icons/Logo.svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import translate from \"../../helpers/translate\";\n import blurElement from \"../../helpers/blurElement\";\n\n export let scale = 1;\n export let visible = true;\n export let onEvent = () => {};\n\n const handleClick = () => {\n onEvent(newEvent({\n type: \"PressedBeyondWords\",\n description: \"The BeyondWords logo was pressed to open the BeyondWords website in a new tab.\",\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n<a class=\"beyondwords\" href=\"https://beyondwords.io/\" target=\"_blank\" on:click={handleClick} class:visible style=\"outline-offset: {6.4 * scale}px\" on:mouseup={blurElement} aria-label={translate(\"visitBeyondWords\")}>\n <Logo {scale} />\n</a>\n\n<style>\n .beyondwords {\n display: flex;\n transition: opacity 0.5s;\n opacity: 0;\n }\n\n .visible {\n opacity: 1;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .beyondwords:hover {\n opacity: 0.8;\n transition: none;\n }\n }\n</style>\n","<script>\n import OpenNewTab from \"../svg_icons/OpenNewTab.svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import translate from \"../../helpers/translate\";\n import blurElement from \"../../helpers/blurElement\";\n\n export let href;\n export let scale = 1;\n export let color = \"#323232\";\n export let onEvent = () => {};\n\n const handleClick = () => {\n onEvent(newEvent({\n type: \"PressedSourceUrl\",\n description: \"The source URL button was pressed to open the source article in a new tab.\",\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n<a class=\"source-url-button\" href={href} target=\"_blank\" on:click={handleClick} on:mouseup={blurElement} aria-label={translate(\"visitSourceArticle\")}>\n <OpenNewTab {scale} {color} circular={false} />\n</a>\n\n<style>\n .source-url-button {\n display: flex;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .source-url-button:hover {\n opacity: 0.8;\n }\n }\n</style>\n","<script>\n import newEvent from \"../helpers/newEvent\";\n import translate from \"../helpers/translate\";\n import blurElement from \"../helpers/blurElement\";\n\n export let src;\n export let href;\n export let alt = \"Player Image\";\n export let scale = 1;\n export let onEvent = () => {};\n\n $: size = `${scale * 80}px`;\n\n const handleClick = () => {\n if (!href) { return; }\n\n onEvent(newEvent({\n type: \"PressedAdvertImage\",\n description: \"The advert image was pressed to open the click-through URL in a new tab.\",\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n<a class=\"large-image\" href={href ? href : null} target=\"_blank\" style=\"width: {size}; height: {size}\" on:click={handleClick} on:mouseup={blurElement} aria-label={translate(\"visitAdvert\")}>\n <img src={src} alt={alt} style=\"width: {size}; height: {size}\" />\n</a>\n\n<style>\n .large-image {\n background: rgba(0, 0, 0, 0.5);\n border-radius: 6px;\n overflow: hidden;\n grid-row: 1 / span 2;\n }\n</style>\n","<script>\n export let title;\n export let playerStyle;\n export let scale = 1;\n export let visible = true;\n export let collapsible = false;\n export let collapsed = false;\n export let color = \"#111\";\n\n let element;\n\n $: width = collapsed ? 0 : collapsible && element ? `${element.scrollWidth}px` : \"auto\";\n $: style = `font-size: ${12 * scale}px; visibility: ${visible ? \"visible\" : \"hidden\"}; width: ${width}; opacity: ${collapsed ? 0 : 1}; color: ${color}`;\n</script>\n\n<div class=\"player-title {playerStyle}\" {style} bind:this={element}>\n {@html title?.replaceAll(/<[^>]+>/gi, \"\") || \"\"}\n</div>\n\n<style>\n .player-title {\n font-weight: 500;\n line-height: 1.25;\n\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n\n transition: width 0.5s, opacity 0.25s;\n }\n\n .large {\n height: 15px;\n margin-bottom: 5px;\n }\n\n .standard,\n .small {\n flex-grow: 1;\n height: 32px;\n display: flex;\n }\n\n .screen {\n height: 30px;\n position: relative;\n bottom: 20px;\n }\n</style>\n","<script>\n export let title;\n export let maxLines = 1;\n export let maxWidth = undefined;\n\n export let center = false;\n export let bold = false;\n export let flex = \"0 1 auto\";\n export let scale = 1;\n export let color = \"#111\";\n\n $: fontSize = `${10 * scale}px`;\n $: maxHeight = `${10 * scale * 1.2 * maxLines}px`;\n $: maxWidthCss = maxWidth ? `max-width: ${maxWidth}px` : \"\";\n\n $: style = `--n: ${maxLines}; font-size: ${fontSize}; max-height: ${maxHeight}; flex: ${flex}; ${maxWidthCss}; color: ${color}`;\n</script>\n\n<div class=\"content-title\" class:bold class:one-line={maxLines === 1} class:center class:n-lines={maxLines > 1} {style}>\n {@html title?.replaceAll(/<[^>]+>/gi, \"\") || \"\"}\n</div>\n\n<style>\n .content-title {\n font-weight: 300;\n line-height: 1.2;\n text-overflow: ellipsis;\n overflow: hidden;\n min-width: 0;\n max-width: fit-content;\n }\n\n .one-line {\n white-space: nowrap;\n }\n\n .n-lines {\n display: -webkit-box;\n\n line-clamp: var(--n);\n -webkit-line-clamp: var(--n);\n -webkit-box-orient: vertical;\n }\n\n .bold {\n font-weight: 500;\n }\n\n .center {\n text-align: center;\n }\n</style>\n","import newEvent from \"../../helpers/newEvent\";\n\nconst handleKeyDown = (onEvent, kind) => (event) => {\n let key;\n\n if (event.key === \"ArrowLeft\") { key = \"Left\"; }\n if (event.key === \"ArrowRight\") { key = \"Right\"; }\n if (event.key === \" \") { key = \"Space\"; }\n if (event.key === \"Enter\") { key = \"Enter\"; }\n\n if (!key) { return; }\n event.preventDefault();\n\n onEvent(newEvent({\n type: `Pressed${key}OnProgress${kind}`,\n description: `The ${key.toLowerCase()} key was pressed while the progress ${kind.toLowerCase()} was focussed.`,\n initiatedBy: \"user\",\n }));\n};\n\nexport default handleKeyDown;\n","<script>\n import { onMount } from \"svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import blurElement from \"../../helpers/blurElement\";\n import translate from \"../../helpers/translate\";\n import handleKeyDown from \"./handleKeyDown\";\n\n export let progress = 0;\n export let fullWidth = false;\n export let readonly = false;\n export let color = \"#323232\";\n export let onEvent = () => {};\n\n $: backgroundStyle = fullWidth ? \"\" : `background: ${color}`;\n\n let progressBar;\n let mouseDown;\n\n const handleMouseDown = (event) => {\n mouseDown = true;\n\n onEvent(newEvent({\n type: \"PressedProgressBar\",\n description: \"The progress bar was pressed at some ratio.\",\n initiatedBy: \"user\",\n ratio: getMouseRatio(event),\n }));\n };\n\n const handleMouseMove = (event) => {\n if (!mouseDown) { return; }\n if (!progressBar) { handleMouseUp(); return; }\n\n onEvent(newEvent({\n type: \"ScrubbedProgressBar\",\n description: \"The user pressed on the progress bar then dragged.\",\n initiatedBy: \"user\",\n ratio: getMouseRatio(event),\n }));\n };\n\n const handleMouseUp = () => {\n if (!mouseDown) { return; }\n mouseDown = false;\n\n onEvent(newEvent({\n type: \"FinishedScrubbingProgressBar\",\n description: \"The user let go after scrubbing the progress bar.\",\n initiatedBy: \"user\",\n }));\n };\n\n const getMouseRatio = (event) => {\n const clientX = event.clientX || event.touches?.[0]?.clientX || 0;\n\n const { x, width } = progressBar.getBoundingClientRect();\n const mouseRatio = (clientX - x) / width;\n\n return Math.max(0, Math.min(1, mouseRatio));\n };\n\n onMount(() => {\n const mouseup = addEventListener(\"mouseup\", handleMouseUp);\n const mousemove = addEventListener(\"mousemove\", handleMouseMove);\n const touchend = addEventListener(\"touchend\", handleMouseUp);\n const touchmove = addEventListener(\"touchmove\", handleMouseMove);\n\n return () => {\n removeEventListener(\"mouseup\", mouseup);\n removeEventListener(\"mousemove\", mousemove);\n removeEventListener(\"touchend\", touchend);\n removeEventListener(\"touchmove\", touchmove);\n };\n });\n</script>\n\n<button type=\"button\" bind:this={progressBar} class=\"progress-bar\" class:full-width={fullWidth} class:readonly class:mouse-down={mouseDown} on:mousedown={handleMouseDown} on:touchstart={handleMouseDown} on:keydown={handleKeyDown(onEvent, \"Bar\")} on:mouseup={blurElement} aria-label={translate(\"scrubProgressBar\")}>\n <div class=\"background\" style=\"{backgroundStyle}\"></div>\n <div class=\"progress\" style=\"{backgroundStyle}; width: {progress * 100}%\"></div>\n</button>\n\n<style>\n .progress-bar {\n flex-grow: 1;\n height: 8px;\n border-radius: 4px;\n display: flex;\n cursor: pointer;\n overflow: hidden;\n outline-offset: 3.2px;\n\n border: none;\n margin: 0;\n padding: 0;\n position: relative;\n }\n\n .readonly,\n .readonly * {\n cursor: auto;\n }\n\n .background {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n opacity: 0.15;\n }\n\n .progress {\n height: 8px;\n border-radius: 4px;\n pointer-events: none;\n }\n\n .full-width {\n position: absolute;\n width: 100%;\n height: 4px;\n left: 0;\n right: 0;\n top: -4px;\n border-radius: 0;\n background: rgb(239, 239, 239);\n }\n\n .full-width:hover,\n .full-width.mouse-down {\n height: 8px;\n top: -6px;\n }\n\n .full-width .progress {\n border-radius: 0;\n background: linear-gradient(to right, #943bfc, #fc3a41);\n }\n</style>\n","<script>\n import handleKeyDown from \"./handleKeyDown\";\n\n export let progress = 0;\n export let enabled = false;\n export let bold;\n export let scale = 1;\n export let color = \"#323232\";\n export let onEvent = () => {};\n\n $: strokeWidth = scale * (bold ? 2.5 : 1.667);\n\n $: radius = 20 * scale + strokeWidth * (bold ? 1 : 1.5);\n $: size = 2 * radius + strokeWidth;\n\n $: circumference = radius * 2 * Math.PI;\n $: clamped = Math.max(0, Math.min(1, progress));\n $: dashOffset = circumference * (1 - clamped);\n</script>\n\n{#if enabled && progress}\n <div class=\"progress-circle\" role=\"none\" style=\"width: {scale * 40}px; height: {scale * 40}px\" on:keydown={handleKeyDown(onEvent, \"Circle\")}>\n <svg fill=\"none\" width={size} height={size} xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"50%\"\n cy=\"50%\"\n r={radius}\n stroke={color}\n stroke-width={strokeWidth}\n stroke-dasharray=\"{circumference} {circumference}\"\n stroke-dashoffset={dashOffset} />\n </svg>\n\n <slot></slot>\n </div>\n{:else}\n <slot></slot>\n{/if}\n\n<style>\n .progress-circle {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n }\n\n .progress-circle svg {\n position: absolute;\n transform: rotate(-90deg);\n transform-origin: 50% 50%,\n }\n</style>\n","const formatTime = (time) => {\n if (time < 0) { time = Math.max(0, time); }\n\n const hours = Math.floor(time / 3600).toString();\n let minutes = Math.floor((time % 3600) / 60).toString();\n let seconds = Math.floor(time % 60).toString();\n\n if (seconds.length < 2) { seconds = `0${seconds}`; }\n\n if (time < 3600) {\n return `${minutes}:${seconds}`;\n } else {\n if (minutes.length < 2) { minutes = `0${minutes}`; }\n return `${hours}:${minutes}:${seconds}`;\n }\n};\n\nexport default formatTime;\n","<script>\n import formatTime from \"../../helpers/formatTime\";\n\n export let text;\n export let remaining;\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<span class=\"countdown-time\" style=\"font-size: {10 * scale}px; color: {color}\">\n {text} • {formatTime(remaining)}\n</span>\n\n<style>\n .countdown-time {\n font-weight: 300;\n white-space: nowrap;\n }\n</style>\n","<script>\n export let duration = 0;\n export let bold = false;\n export let scale = 1;\n export let color = \"#323232\";\n\n $: minutes = Math.max(1, Math.round((duration || 0) / 60));\n</script>\n\n<div class=\"duration-in-mins\" class:bold={bold} style=\"font-size: {10 * scale}px; color: {color}\">\n {minutes} min\n</div>\n\n<style>\n .duration-in-mins {\n font-weight: 300;\n white-space: nowrap;\n }\n\n .bold {\n font-weight: 700;\n }\n</style>\n","<script>\n import formatTime from \"../../helpers/formatTime\";\n\n export let currentTime = 0;\n export let duration = 0;\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<span class=\"playback-time\" style=\"font-size: {10 * scale}px; color: {color}\">\n {formatTime(currentTime)} / {formatTime(duration)}\n</span>\n\n<style>\n .playback-time {\n font-weight: 300;\n white-space: nowrap;\n }\n</style>\n","<script>\n import CountdownTime from \"./CountdownTime.svelte\";\n import DurationInMins from \"./DurationInMins.svelte\";\n import PlaybackTime from \"./PlaybackTime.svelte\";\n\n export let duration = 0;\n export let currentTime = 0;\n $: remaining = Math.max(0, duration - currentTime);\n\n export let playerStyle;\n export let positionClasses;\n export let isMobile;\n export let isAdvert;\n export let isStopped;\n export let collapsed;\n export let largeImage;\n export let color = \"323232\";\n\n $: isScreen = playerStyle === \"screen\";\n $: scale = isScreen && !isMobile ? 3 : isScreen ? 2 : 1;\n $: opacityCss = collapsed ? \"opacity: 0\" : \"\";\n $: noTransition = !isAdvert && currentTime < 0.1;\n</script>\n\n<div class=\"time-indicator {playerStyle} {positionClasses}\" class:mobile={isMobile} class:advert_={isAdvert} class:stopped={isStopped} class:no-image={!largeImage} class:no-transition={noTransition} style={opacityCss}>\n <div class=\"inner\">\n {#if isAdvert && currentTime === 0}\n <!-- -->\n {:else if isAdvert}\n <CountdownTime text=\"Ad\" remaining={remaining} {scale} {color} />\n {:else if isStopped}\n <DurationInMins {duration} {scale} {color} />\n {:else}\n <PlaybackTime {duration} {currentTime} {scale} {color} />\n {/if}\n </div>\n</div>\n\n<style>\n .time-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n transition: opacity 0.25s;\n }\n\n /* When next to skip buttons */\n .standard:nth-child(5),\n .video:nth-child(5) {\n margin-left: 8px;\n }\n\n .standard.mobile:nth-child(5) {\n margin-left: 0;\n }\n\n .inner {\n display: flex;\n white-space: nowrap;\n }\n\n .mobile {\n flex-grow: 1;\n }\n\n .large {\n height: 40px;\n position: relative;\n }\n\n .large.stopped,\n .large.advert_ {\n flex-grow: 0;\n margin-left: -8px;\n }\n\n .standard.advert_ {\n justify-content: flex-end;\n }\n\n .standard.fixed-left.advert_ {\n justify-content: flex-start;\n }\n\n .stopped .inner {\n position: absolute;\n left: 52px;\n top: 28px;\n }\n\n .small.stopped.mobile .inner,\n .standard.stopped.mobile .inner {\n position: absolute;\n left: 40px;\n top: 28px;\n }\n\n .standard.stopped.fixed-right .inner {\n position: absolute;\n left: 36px;\n top: 28px;\n }\n\n .standard.stopped.fixed-left .inner {\n position: absolute;\n left: 52px;\n top: 28px;\n }\n\n .large .inner {\n position: absolute;\n left: 8px;\n bottom: 0;\n }\n\n .large.mobile {\n position: absolute;\n left: 96px;\n top: 62px;\n margin-left: 0;\n }\n\n .large.mobile.no-image {\n left: auto;\n }\n\n .large.mobile .inner {\n position: static;\n }\n\n .small .inner {\n position: absolute;\n left: 44px;\n top: 24px;\n }\n\n .small.fixed-right .inner {\n position: absolute;\n left: 16px;\n top: 24px;\n }\n\n .small.fixed-right.advert_ .inner {\n position: absolute;\n left: 44px;\n top: 24px;\n }\n\n .screen {\n position: absolute;\n bottom: 54px;\n display: flex;\n }\n\n .screen.advert_ {\n bottom: 196px;\n }\n\n .screen.mobile {\n bottom: 40px;\n }\n\n .screen.mobile.advert_ {\n bottom: 128px;\n }\n\n .screen .inner {\n position: static;\n }\n\n .video.advert_ {\n flex-grow: 0;\n }\n\n .video.mobile {\n justify-content: flex-start;\n }\n\n .video.stopped {\n display: none;\n }\n\n .video.time-indicator.no-transition {\n transition: none;\n }\n</style>\n","<script>\n export let scale = 1;\n export let zoom = 1;\n export let color = \"#323232\";\n export let fill = \"transparent\";\n</script>\n\n<svg width={18 * scale} height={18 * scale} viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect {fill} width=\"100%\" height=\"100%\" />\n <path fill={color} transform=\"scale({zoom})\" transform-origin=\"50% 50%\" d=\"M0 6.99996V11C0 11.55 0.45 12 1 12H4L7.29 15.29C7.92 15.92 9 15.47 9 14.58V3.40996C9 2.51996 7.92 2.06996 7.29 2.69996L4 5.99996H1C0.45 5.99996 0 6.44996 0 6.99996ZM13.5 8.99996C13.5 7.22996 12.48 5.70996 11 4.96996V13.02C12.48 12.29 13.5 10.77 13.5 8.99996ZM11 1.44996V1.64996C11 2.02996 11.25 2.35996 11.6 2.49996C14.18 3.52996 16 6.05996 16 8.99996C16 11.94 14.18 14.47 11.6 15.5C11.24 15.64 11 15.97 11 16.35V16.55C11 17.18 11.63 17.62 12.21 17.4C15.6 16.11 18 12.84 18 8.99996C18 5.15996 15.6 1.88996 12.21 0.599963C11.63 0.369963 11 0.819963 11 1.44996V1.44996Z\" />\n</svg>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={16 * scale} height={16 * scale} viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M6.33334 5.76668L5.73334 5.18334C5.60001 5.06112 5.44168 5.00279 5.25834 5.00834C5.07501 5.0139 4.92223 5.07779 4.80001 5.20001C4.67779 5.32223 4.61668 5.47779 4.61668 5.66668C4.61668 5.85557 4.67779 6.01112 4.80001 6.13334L6.53334 7.86668C6.65557 7.9889 6.81112 8.05001 7.00001 8.05001C7.1889 8.05001 7.34445 7.9889 7.46668 7.86668L9.21668 6.11668C9.3389 5.99445 9.39723 5.84168 9.39168 5.65834C9.38612 5.47501 9.32223 5.32223 9.20001 5.20001C9.07779 5.07779 8.92223 5.0139 8.73334 5.00834C8.54445 5.00279 8.3889 5.06668 8.26668 5.20001L7.66668 5.76668V3.65001C7.66668 3.46112 7.60279 3.30557 7.47501 3.18334C7.34723 3.06112 7.1889 3.00001 7.00001 3.00001C6.81112 3.00001 6.65279 3.0639 6.52501 3.19168C6.39723 3.31945 6.33334 3.47779 6.33334 3.66668V5.76668ZM4.33334 10.3333H9.68334C9.87223 10.3333 10.0278 10.2695 10.15 10.1417C10.2722 10.0139 10.3333 9.85557 10.3333 9.66668C10.3333 9.47779 10.2695 9.31945 10.1417 9.19168C10.0139 9.0639 9.85557 9.00001 9.66668 9.00001H4.31668C4.12779 9.00001 3.97223 9.0639 3.85001 9.19168C3.72779 9.31945 3.66668 9.47779 3.66668 9.66668C3.66668 9.85557 3.73057 10.0139 3.85834 10.1417C3.98612 10.2695 4.14445 10.3333 4.33334 10.3333ZM7.00001 13.6667C6.07779 13.6667 5.21112 13.4917 4.40001 13.1417C3.5889 12.7917 2.88334 12.3167 2.28334 11.7167C1.68334 11.1167 1.20834 10.4111 0.858343 9.60001C0.508343 8.7889 0.333344 7.92223 0.333344 7.00001C0.333344 6.07779 0.508343 5.21112 0.858343 4.40001C1.20834 3.5889 1.68334 2.88334 2.28334 2.28334C2.88334 1.68334 3.5889 1.20834 4.40001 0.858343C5.21112 0.508343 6.07779 0.333344 7.00001 0.333344C7.92223 0.333344 8.7889 0.508343 9.60001 0.858343C10.4111 1.20834 11.1167 1.68334 11.7167 2.28334C12.3167 2.88334 12.7917 3.5889 13.1417 4.40001C13.4917 5.21112 13.6667 6.07779 13.6667 7.00001C13.6667 7.92223 13.4917 8.7889 13.1417 9.60001C12.7917 10.4111 12.3167 11.1167 11.7167 11.7167C11.1167 12.3167 10.4111 12.7917 9.60001 13.1417C8.7889 13.4917 7.92223 13.6667 7.00001 13.6667Z\" />\n</svg>\n","<script>\n import Download from \"../svg_icons/Download.svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import blurElement from \"../../helpers/blurElement\";\n import translate from \"../../helpers/translate\";\n\n export let contentIndex;\n export let audioIndex;\n export let videoIndex;\n export let scale = 1;\n export let color = \"#323232\";\n export let onEvent = () => {};\n\n const handleClick = (event) => {\n event.stopPropagation();\n\n onEvent(newEvent({\n type: \"PressedDownload\",\n description: \"The download button next to a playlist item was pressed.\",\n initiatedBy: \"user\",\n contentIndex,\n audioIndex,\n videoIndex\n }));\n };\n</script>\n\n<button type=\"button\" class=\"download-button\" style=\"outline-offset: {4.8 * scale}px\" on:click={handleClick} on:mouseup={blurElement} aria-label={translate(\"downloadAudio\")}>\n <Download {scale} {color} />\n</button>\n\n<style>\n .download-button {\n display: flex;\n cursor: pointer;\n\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .download-button:hover {\n opacity: 0.8;\n }\n }\n</style>\n","<script>\n import VolumeUp from \"./svg_icons/VolumeUp.svelte\";\n import ContentTitle from \"./titles/ContentTitle.svelte\";\n import DownloadButton from \"./buttons/DownloadButton.svelte\";\n import DurationInMins from \"./time_indicators/DurationInMins.svelte\";\n import newEvent from \"../helpers/newEvent\";\n import blurElement from \"../helpers/blurElement\";\n\n export let style = \"auto\";\n export let downloadFormats = [];\n export let larger = false;\n export let textColor = \"#111\";\n export let backgroundColor = \"#f5f5f5\";\n export let iconColor = \"#000\";\n export let content = [];\n export let index = 0;\n export let isMobile;\n export let onEvent;\n\n $: [mode, desktopRows, mobileRows] = style.split(\"-\");\n\n $: mobileRows = mobileRows || desktopRows || 4;\n $: desktopRows = desktopRows || 5;\n\n $: scale = larger ? 1.25 : 1;\n\n const handleClick = (i) => () => {\n onEvent(newEvent({\n type: \"PressedPlaylistItem\",\n description: \"A playlist item was pressed.\",\n initiatedBy: \"user\",\n index: i,\n }));\n };\n\n const handleKeydown = (event) => {\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n const prevItem = event.target.previousElementSibling;\n\n if (prevItem) { prevItem.focus(); }\n }\n\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n const nextItem = event.target.nextElementSibling;\n\n if (nextItem) { nextItem.focus(); }\n }\n };\n\n const handleFocus = (event) => {\n const scrollable = event.target.parentNode;\n const nearestTen = Math.round(scrollable.scrollTop / 10) * 10;\n\n scrollable.scrollTop = nearestTen;\n };\n\n const mediaToDownload = (audio, video) => {\n for (const format of downloadFormats) {\n for (const [i, item] of (audio || []).entries()) {\n if (item.url?.endsWith(`.${format}`)) { return [i, -1]; }\n }\n\n for (const [i, item] of (video || []).entries()) {\n if (item.url?.endsWith(`.${format}`)) { return [-1, i]; }\n }\n }\n\n return [-1, -1];\n };\n</script>\n\n<div class=\"playlist\" class:mobile={isMobile} class:larger style=\"--desktop-rows: {desktopRows}; --mobile-rows: {mobileRows}; background: {backgroundColor}\">\n <div class=\"scrollable\" tabindex=\"-1\">\n {#each content as { title, duration, audio, video }, i}\n {@const [audioIndex, videoIndex] = mediaToDownload(audio, video)}\n\n <button type=\"button\" class=\"item\" class:active={i === index} on:click={handleClick(i)} on:keydown={handleKeydown} on:focus={handleFocus} on:mouseup={blurElement} aria-label={title}>\n {#if i === index}\n <span class=\"speaker\"><VolumeUp color={iconColor} {scale} /></span>\n {:else}\n <span class=\"number\" style=\"color: {textColor}\" aria-hidden=\"true\">{i + 1}</span>\n {/if}\n\n <span class=\"title\">\n <ContentTitle {title} {scale} maxLines={isMobile ? 3 : 2} bold={i === index} color={textColor} />\n </span>\n\n <span class=\"download\">\n {#if audioIndex !== -1 || videoIndex !== -1}\n <DownloadButton {onEvent} color={iconColor} contentIndex={i} {audioIndex} {videoIndex} />\n {/if}\n </span>\n\n <span class=\"duration\">\n <DurationInMins {duration} {scale} bold={i === index} color={textColor} />\n </span>\n </button>\n {/each}\n </div>\n</div>\n\n<style>\n .playlist {\n margin-top: 16px;\n border-radius: 8px;\n }\n\n .scrollable {\n padding: 3.2px 0;\n padding-left: 4px;\n overflow-x: hidden;\n overflow-y: scroll;\n max-height: calc(40px * var(--desktop-rows));\n }\n\n .larger .scrollable {\n padding-top: 4px;\n padding-bottom: 4px;\n padding-left: 8px;\n max-height: calc(50px * var(--desktop-rows));\n }\n\n .mobile .scrollable {\n padding-left: 0;\n max-height: calc(80px * var(--mobile-rows));\n }\n\n .scrollable::-webkit-scrollbar {\n width: 8px;\n }\n\n .scrollable::-webkit-scrollbar-thumb {\n background: #323232;\n border-radius: 16px;\n border: 2px solid #fafafa;\n }\n\n .item {\n width: 100%;\n height: 40px;\n\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto 30px;\n grid-template-rows: auto;\n align-items: center;\n column-gap: 8px;\n\n font-size: 10px;\n font-weight: 300;\n line-height: 1.2;\n\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n padding-right: 10px;\n box-sizing: border-box;\n text-align: left;\n cursor: pointer;\n }\n\n .larger .item {\n height: 50px;\n }\n\n .item:hover :global(.content-title) {\n font-weight: 500;\n }\n\n .item:hover :global(.duration-in-mins) {\n font-weight: 700;\n }\n\n .mobile .item {\n height: 80px;\n grid-template-rows: auto auto;\n padding-right: 16px;\n }\n\n .number,\n .speaker {\n width: 40px;\n text-align: center;\n font-size: 10px;\n font-weight: 700;\n flex-shrink: 0;\n }\n\n .larger .number,\n .larger .speaker {\n font-size: 12.5px;\n }\n\n .mobile .number,\n .mobile .speaker {\n grid-row: 1 / span 2;\n }\n\n .mobile .title {\n grid-column: 2 / span 2;\n }\n\n .active .title {\n font-weight: 700;\n }\n\n .title {\n flex-grow: 1;\n }\n\n .mobile .title {\n align-self: flex-end;\n }\n\n .duration {\n margin: 4px 0;\n white-space: nowrap;\n display: flex;\n justify-content: flex-end;\n }\n\n .larger .duration {\n margin: 8px 0;\n }\n\n .mobile .duration {\n grid-row: 2;\n grid-column: 2;\n justify-content: flex-start;\n align-self: flex-start;\n }\n\n .mobile .download {\n grid-row: 1 / span 2;\n grid-column: 4;\n justify-self: flex-end;\n align-self: center;\n position: relative;\n top: -2px;\n }\n\n :global(.beyondwords-player.maximized) .playlist {\n display: none;\n }\n</style>\n","<script>\n import { onDestroy } from \"svelte\";\n\n export let exitDelay = 0;\n export let idleDelay = Infinity;\n export let isHovering = false;\n\n let isExit = true;\n let isIdle = true;\n let exitTimeout;\n let idleTimeout;\n\n $: isHovering = !isExit && !isIdle;\n\n const onEnter = () => {\n if (exitTimeout) { clearTimeout(exitTimeout); }\n if (idleTimeout) { clearTimeout(idleTimeout); }\n\n isExit = false;\n isIdle = false;\n };\n\n const onLeave = () => {\n if (exitTimeout) { clearTimeout(exitTimeout); }\n\n isExit = false;\n exitTimeout = setTimeout(() => isExit = true, exitDelay);\n };\n\n const onMove = () => {\n if (idleTimeout) { clearTimeout(idleTimeout); }\n\n isIdle = false;\n idleTimeout = setTimeout(() => isIdle = true, idleDelay);\n };\n\n onDestroy(() => {\n if (exitTimeout) { clearTimeout(exitTimeout); }\n if (idleTimeout) { clearTimeout(idleTimeout); }\n });\n</script>\n\n<div class=\"hoverable\"\n role=\"none\"\n on:mouseenter={onEnter}\n on:mouseleave={onLeave}\n on:mousemove={idleDelay !== Infinity && onMove}>\n <slot></slot>\n</div>\n","<script>\n import { onMount } from \"svelte\";\n import newEvent from \"../../helpers/newEvent\";\n\n let element;\n\n export let enabled = false;\n export let relativeY = undefined;\n export let absoluteY = undefined;\n export let isVisible = undefined;\n export let onEvent = () => {};\n\n const callback = ([entry]) => {\n relativeY = entry.boundingClientRect.y;\n absoluteY = relativeY + window.scrollY;\n\n if (isVisible === entry.isIntersecting) { return; }\n isVisible = entry.isIntersecting;\n\n onEvent(newEvent({\n type: \"VisibilityChanged\",\n description: \"The player was scrolled into or out of view.\",\n initiatedBy: \"user\",\n isVisible,\n }));\n };\n\n onMount(() => {\n if (!enabled || typeof IntersectionObserver === \"undefined\") { return; }\n\n const observer = new IntersectionObserver(callback, { threshold: 0.5 });\n observer.observe(element);\n\n return () => {\n observer.unobserve(element);\n callback([{ isIntersecting: true, boundingClientRect: { y: Infinity } }]);\n };\n });\n</script>\n\n<div class=\"visibility\" bind:this={element}>\n <slot></slot>\n</div>\n\n<style>\n .visibility {\n display: flex;\n }\n</style>\n","/* eslint-disable indent */\n\nconst belowBreakpoint = ({ playerStyle, width }) => (\n playerStyle === \"standard\" && width < 380 ||\n playerStyle === \"large\" && width < 380 ||\n playerStyle === \"video\" && width < 480 ||\n playerStyle === \"screen\" && width < 640\n);\n\nexport default belowBreakpoint;\n","/* eslint-disable indent */\n\nconst controlsOrder = ({ playerStyle, position, isMobile, isAdvert }) => (\n playerStyle === \"screen\" ? \"symmetrical\"\n : playerStyle === \"large\" && isMobile ? \"symmetrical\"\n : playerStyle === \"standard\" && position === \"left\" ? \"left-to-right\"\n : playerStyle === \"standard\" && isMobile ? \"right-to-left\"\n : playerStyle === \"standard\" && position === \"right\" && isAdvert ? \"right-to-left\"\n : playerStyle === \"standard\" && position === \"right\" ? \"left-to-right-but-swap-ends\"\n : playerStyle === \"small\" && position === \"left\" ? \"left-to-right\"\n : playerStyle === \"small\" && position === \"right\" ? \"right-to-left\"\n : playerStyle === \"video\" && position === \"left\" ? \"left-to-right\"\n : playerStyle === \"video\" && isMobile ? \"right-to-left\"\n : playerStyle === \"video\" && position === \"right\" ? \"right-to-left\"\n : \"left-to-right\"\n);\n\nexport default controlsOrder;\n","const playerStyles = [\"small\", \"standard\", \"large\", \"screen\", \"video\"];\n\nconst knownPlayerStyle = (style) => playerStyles.indexOf(style) !== -1;\n\nexport default playerStyles;\nexport { knownPlayerStyle };\n","const canFullScreen = () => (\n document.fullscreenEnabled || document.webkitFullscreenEnabled\n);\n\nconst requestFullScreen = (element) => {\n if (element.requestFullscreen) {\n element.requestFullscreen();\n } else if (element.webkitRequestFullscreen) {\n element.webkitRequestFullscreen();\n }\n};\n\nconst exitFullScreen = () => {\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n }\n};\n\nconst fullScreenElement = () => (\n document.fullscreenElement || document.webkitCurrentFullScreenElement\n);\n\n\nexport { canFullScreen, requestFullScreen, exitFullScreen, fullScreenElement };\n","<script>\n import(\"../helpers/loadTheStyles.ts\");\n import \"@fontsource/inter/variable.css\";\n import { fly } from \"svelte/transition\";\n import PlayPauseButton from \"./buttons/PlayPauseButton.svelte\";\n import PlaybackRateButton from \"./buttons/PlaybackRateButton.svelte\";\n import PrevButton from \"./buttons/PrevButton.svelte\";\n import NextButton from \"./buttons/NextButton.svelte\";\n import PlaylistButton from \"./buttons/PlaylistButton.svelte\";\n import SecondaryButton from \"./buttons/SecondaryButton.svelte\";\n import MaximizeButton from \"./buttons/MaximizeButton.svelte\";\n import CloseWidgetButton from \"./buttons/CloseWidgetButton.svelte\";\n import AdvertLink from \"./external_links/AdvertLink.svelte\";\n import AdvertButton from \"./external_links/AdvertButton.svelte\";\n import BeyondWords from \"./external_links/BeyondWords.svelte\";\n import SourceUrlButton from \"./external_links/SourceUrlButton.svelte\";\n import LargeImage from \"./LargeImage.svelte\";\n import PlayerTitle from \"./titles/PlayerTitle.svelte\";\n import ContentTitle from \"./titles/ContentTitle.svelte\";\n import ProgressBar from \"./progress_bars/ProgressBar.svelte\";\n import ProgressCircle from \"./progress_bars/ProgressCircle.svelte\";\n import TimeIndicator from \"./time_indicators/TimeIndicator.svelte\";\n import Playlist from \"./Playlist.svelte\";\n import Hoverable from \"./helpers/Hoverable.svelte\";\n import Visibility from \"./helpers/Visibility.svelte\";\n import belowBreakpoint from \"../helpers/belowBreakpoint\";\n import controlsOrderFn from \"../helpers/controlsOrder\";\n import { knownPlayerStyle } from \"../helpers/playerStyles\";\n import newEvent from \"../helpers/newEvent\";\n import translate from \"../helpers/translate\";\n import { canFullScreen } from \"../helpers/fullScreen\";\n\n export let playerStyle = \"standard\";\n export let callToAction = undefined;\n export let skipButtonStyle = \"auto\";\n export let playlistStyle = \"auto-5-4\";\n export let playlistToggle = \"auto\";\n export let downloadFormats = [];\n export let playerTitle = undefined;\n export let fixedPosition = undefined;\n export let fixedWidth = \"auto\";\n export let content = [];\n export let contentIndex = 0;\n export let duration = 0;\n export let currentTime = 0;\n export let playbackState = \"stopped\";\n export let playbackRate = 1;\n export let activeAdvert = undefined;\n export let persistentAdvert = undefined;\n export let textColor = \"#111\";\n export let backgroundColor = \"#f5f5f5\";\n export let iconColor = \"black\";\n export let logoIconEnabled = true;\n export let onEvent = () => {};\n\n // These are set automatically.\n export let videoIsBehind = false;\n export let isVisible = undefined;\n export let relativeY = undefined;\n export let absoluteY = undefined;\n let width, isHovering, timeout;\n\n $: isSmall = playerStyle === \"small\";\n $: isStandard = playerStyle === \"standard\";\n $: isLarge = playerStyle === \"large\";\n $: isScreen = playerStyle === \"screen\";\n $: isVideo = playerStyle === \"video\";\n $: isPlaying = playbackState === \"playing\";\n $: isPaused = playbackState === \"paused\";\n $: isStopped = playbackState === \"stopped\";\n $: isAdvert = activeAdvert && !isStopped;\n $: isPlaylist = content.length > 1;\n $: isMobile = belowBreakpoint({ playerStyle, width });\n\n $: contentItem = content[contentIndex] || {};\n $: progress = currentTime / duration;\n\n $: activeTextColor = isAdvert && activeAdvert?.textColor || textColor;\n $: activeBackgroundColor = isAdvert && activeAdvert?.backgroundColor || backgroundColor;\n $: activeIconColor = isAdvert && activeAdvert?.iconColor || iconColor;\n\n $: skipStyle = skipButtonStyle === \"auto\" ? (isPlaylist ? \"tracks\" : \"segments\") : skipButtonStyle;\n $: skipDisabled = skipStyle === \"segments\";\n $: buttonColor = isVideo ? \"rgba(250, 250, 250, 0.8)\" : activeIconColor;\n\n $: buttonScale = isSmall || isVideo && fixedPosition ? 0.8 : isScreen && !isMobile ? 2 : 1;\n $: playPauseScale = buttonScale * (isScreen ? 1.5 : isVideo && isStopped ? 1.6 : 1);\n $: logoScale = isScreen && !isMobile ? 3 : isScreen ? 2 : isVideo && !isMobile ? 1.5 : 1;\n $: closeScale = isScreen && !isMobile ? 2.5 : isScreen ? 1.75 : isVideo && !isMobile ? 2 : isVideo ? 1.5 : 1;\n $: closeMargin = isScreen && !isMobile ? \"12px 0\" : isScreen ? \"4px 0\" : \"auto\";\n\n $: widthStyle = fixedWidth === \"auto\" ? (isSmall ? \"fit-content\" : \"\") : fixedWidth;\n $: position = fixedPosition === \"auto\" ? (isStandard ? \"center\" : \"right\") : fixedPosition;\n $: positionClasses = fixedPosition ? `fixed fixed-${position}` : \"\";\n $: flyWidget = (e) => fixedPosition && fly(e, { y: isSmall || isStandard ? 40 : 100 });\n\n $: controlsOrder = controlsOrderFn({ playerStyle, position, isMobile, isAdvert });\n\n $: largeImage = isAdvert && activeAdvert.imageUrl || !isStopped && persistentAdvert?.imageUrl || contentItem.imageUrl;\n $: largeImageHref = isAdvert && activeAdvert.clickThroughUrl || !isStopped && persistentAdvert?.clickThroughUrl;\n\n $: collapsible = isSmall && fixedPosition && fixedWidth === \"auto\";\n $: forcedCollapsed = isSmall && (fixedWidth === 0 || fixedWidth === \"0\");\n $: collapsed = forcedCollapsed || collapsible && !isAdvert && !isStopped && !isHovering;\n\n $: showCloseWidget = fixedPosition && !isSmall && !(isStandard && isAdvert);\n $: showBeyondWords = logoIconEnabled && !isVideo && (!isAdvert || isScreen) && !(fixedPosition && isSmall) && !forcedCollapsed;\n\n $: playlistParts = playlistStyle.split(\"-\");\n\n $: showPlaylist = (playlistParts[0] === \"show\" || playlistParts[0] === \"auto\" && isPlaylist) && !isSmall;\n $: showPlaylistToggle = (playlistToggle === \"show\" || playlistToggle === \"auto\" && isPlaylist) && !isSmall;\n\n $: classes = `user-interface ${playerStyle} ${playbackState} ${positionClasses} ${controlsOrder}`;\n $: fixedPosition && animate();\n\n const animate = () => { // TODO: extract?\n if (timeout) { clearTimeout(timeout); }\n timeout = setTimeout(() => timeout = null, 500);\n };\n\n const handleMouseDown = (event) => {\n if (!isVideo) { return; }\n\n const isLeftClick = event.button === 0;\n if (!isLeftClick) { return; }\n\n const clickedOnMain = event.target.classList.contains(\"main\");\n if (!clickedOnMain) { return; }\n\n onEvent(newEvent({\n type: \"PressedVideoBackground\",\n description: \"The video background was pressed.\",\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n{#if knownPlayerStyle(playerStyle) && content.length > 0}\n <div class={classes} style=\"width: {widthStyle}\" class:mobile={isMobile} class:advert_={isAdvert} class:hovering={isHovering} class:collapsed bind:clientWidth={width} class:animating={timeout} transition:flyWidget on:outrostart={animate}>\n <Hoverable bind:isHovering exitDelay={collapsible ? 500 : 0} idleDelay={isVideo ? 3000 : Infinity}>\n {#if isVideo && !videoIsBehind}\n <div class=\"video-placeholder\" />\n {/if}\n\n <div class=\"main\" role=\"none\" class:no-image={!largeImage} on:mousedown={handleMouseDown} on:keyup={null} style=\"background: {isVideo ? \"transparent\" : activeBackgroundColor}\">\n {#if largeImage && (isLarge || isScreen)}\n <LargeImage {onEvent} src={largeImage} href={largeImageHref} scale={isScreen && !isMobile ? 1.5 : 1} />\n {/if}\n\n {#if isLarge || isScreen}\n <div class=\"summary\">\n <PlayerTitle title={playerTitle} visible={!isAdvert} {playerStyle} scale={isScreen ? 2 : 1} color={activeTextColor} />\n <ContentTitle title={contentItem.title} maxLines={isMobile || isScreen ? 3 : 1} center={isScreen} scale={isScreen ? 2 : 1} maxWidth={isScreen && !isMobile ? 640 : isScreen ? 320 : null} color={activeTextColor} />\n </div>\n {/if}\n\n <div class=\"controls\">\n <Visibility {onEvent} enabled={!fixedPosition} bind:isVisible bind:relativeY bind:absoluteY>\n <ProgressCircle {onEvent} {progress} enabled={isScreen || isSmall} bold={isSmall} scale={playPauseScale} color={activeIconColor}>\n <PlayPauseButton {onEvent} {isPlaying} scale={playPauseScale} color={buttonColor} />\n </ProgressCircle>\n </Visibility>\n\n {#if isStandard && isStopped || isSmall}\n <PlayerTitle title={callToAction || translate(\"listenToThisArticle\")} visible={!isAdvert} {playerStyle} {collapsible} {collapsed} color={activeTextColor} />\n {/if}\n\n {#if !isSmall && !isStopped && !isAdvert || (isScreen && isAdvert)}\n <PlaybackRateButton {onEvent} rate={playbackRate} scale={buttonScale} color={isVideo ? buttonColor : activeTextColor} />\n <PrevButton {onEvent} style={skipStyle} scale={buttonScale} color={buttonColor} />\n <NextButton {onEvent} style={skipStyle} scale={buttonScale} color={buttonColor} />\n {/if}\n\n {#if isStandard && fixedPosition && !isStopped && !isAdvert && width > 720 && controlsOrder !== \"left-to-right-but-swap-ends\"}\n <ContentTitle title={contentItem.title} maxLines={1} bold={true} scale={1.2} flex={0.52} color={activeTextColor} />\n {/if}\n\n <TimeIndicator {currentTime} {duration} {playerStyle} {isAdvert} {isMobile} {isStopped} {positionClasses} {collapsed} {largeImage} color={isVideo ? buttonColor : activeTextColor} />\n\n {#if (isStandard && !isMobile && !isStopped) || (isLarge && !isMobile) || (isVideo && !isStopped)}\n <ProgressBar {onEvent} {progress} fullWidth={isVideo} readonly={isAdvert} color={activeIconColor} />\n {/if}\n\n {#if isAdvert && !forcedCollapsed}\n <AdvertLink {onEvent} href={activeAdvert.clickThroughUrl} {playerStyle} scale={isScreen && !isMobile ? 2 : isScreen ? 1.6 : 1} {controlsOrder} color={isVideo ? \"rgba(250, 250, 250, 0.8)\" : activeTextColor} {largeImage} {isMobile} />\n <AdvertButton {onEvent} href={activeAdvert.clickThroughUrl} {playerStyle} scale={buttonScale} {controlsOrder} color={buttonColor} />\n {/if}\n\n {#if !isStopped}\n <SecondaryButton {playerStyle} {isMobile} {isAdvert} scale={buttonScale}>\n {#if isVideo && canFullScreen()}\n <MaximizeButton {onEvent} scale={buttonScale} color={buttonColor} />\n {:else if isScreen && contentItem.sourceUrl}\n <SourceUrlButton {onEvent} scale={buttonScale} href={contentItem.sourceUrl} color={buttonColor} />\n {:else if showPlaylistToggle}\n <PlaylistButton {onEvent} scale={buttonScale} color={buttonColor} playlistShowing={showPlaylist} {playerStyle} />\n {/if}\n </SecondaryButton>\n {/if}\n </div>\n\n {#if showCloseWidget || showBeyondWords}\n <div class=\"end\">\n {#if showCloseWidget}\n <CloseWidgetButton {onEvent} scale={closeScale} margin={closeMargin} color={buttonColor} />\n {:else}\n <BeyondWords {onEvent} scale={logoScale} visible={isScreen || isHovering || isPlaying} />\n {/if}\n </div>\n {/if}\n </div>\n </Hoverable>\n\n {#if showPlaylist}\n <Playlist\n {onEvent}\n style={playlistStyle}\n {downloadFormats}\n larger={isScreen && !isMobile}\n {content}\n index={contentIndex}\n isMobile={isMobile}\n textColor={activeTextColor}\n backgroundColor={activeBackgroundColor}\n iconColor={activeIconColor} />\n {/if}\n </div>\n{/if}\n\n<style>\n .user-interface {\n overflow: hidden;\n }\n\n .user-interface :global(*) {\n font-family: \"InterVariable\", sans-serif;\n }\n\n .fixed {\n position: fixed;\n bottom: 0;\n margin: 16px;\n max-width: calc(100% - 32px);\n z-index: 1000;\n }\n\n .fixed-left {\n left: 0;\n }\n\n .fixed-center {\n left: 0;\n right: 0;\n margin-left: auto;\n margin-right: auto;\n }\n\n .fixed-right {\n right: 0;\n }\n\n .main {\n box-sizing: border-box;\n column-gap: 8px;\n transition: padding 0.5s;\n position: relative;\n }\n\n .summary {\n max-width: 100%;\n }\n\n .controls {\n flex-grow: 1;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n column-gap: 8px;\n grid-row: 2;\n grid-column: 2 / span 2;\n min-width: 0;\n }\n\n .end {\n grid-row: 1;\n grid-column: 3;\n }\n\n .collapsed .controls {\n column-gap: 0;\n transition: column-gap 1.25s;\n }\n\n .right-to-left .controls :global(.advert-button) { order: 1; }\n .right-to-left .controls :global(.advert-link) { order: 2; }\n .right-to-left .controls :global(.progress-bar) { order: 3; }\n .right-to-left .controls :global(.player-title) { order: 4; }\n .right-to-left .controls :global(.time-indicator) { order: 5; }\n .right-to-left .controls :global(.prev-button) { order: 6; }\n .right-to-left .controls :global(.next-button) { order: 7; }\n .right-to-left .controls :global(.playback-rate-button) { order: 8; }\n .right-to-left .controls :global(.visibility) { order: 9; }\n\n .symmetrical .controls :global(.prev-button) { order: 1; }\n .symmetrical .controls :global(.playback-rate-button) { order: 2; }\n .symmetrical .controls :global(.visibility) { order: 3; }\n .symmetrical .controls :global(.secondary-button) { order: 4; }\n .symmetrical .controls :global(.next-button) { order: 5; }\n\n .left-to-right-but-swap-ends .controls :global(.visibility) { order: 1; }\n\n .advert_ .controls {\n justify-content: space-between;\n }\n\n .symmetrical .controls {\n justify-content: center;\n }\n\n .standard {\n min-width: 300px;\n }\n\n .standard .main {\n height: 48px;\n padding: 4px;\n border-radius: 25px;\n display: flex;\n align-items: center;\n }\n\n .standard.right-to-left .main,\n .standard.left-to-right-but-swap-ends .main {\n flex-direction: row-reverse;\n }\n\n .standard .end {\n margin-right: 12px;\n }\n\n .standard.right-to-left .end,\n .standard.left-to-right-but-swap-ends .end {\n margin-left: 12px;\n margin-right: 0;\n }\n\n .large {\n min-width: 300px;\n }\n\n .large .main {\n height: 96px;\n padding: 8px;\n border-radius: 8px;\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n grid-template-rows: auto minmax(0, 1fr) auto;\n }\n\n .large.advert_ .controls {\n justify-content: space-between;\n }\n\n .large .controls {\n align-self: flex-end;\n }\n\n .large.mobile .main {\n height: 144px;\n }\n\n .large .no-image .summary {\n grid-column: 1 / span 2;\n }\n\n .large .no-image .controls {\n grid-column: 1 / span 3;\n }\n\n .large.mobile .controls {\n grid-row: 3;\n grid-column: 1 / span 3;\n }\n\n .small {\n min-width: 40px;\n }\n\n .small .main {\n height: 40px;\n padding: 4px;\n border-radius: 20px;\n display: flex;\n align-items: center;\n }\n\n .small .end {\n margin-right: 4px;\n }\n\n .small.left-to-right .main {\n padding-right: 8px;\n }\n\n .small.collapsed.left-to-right .main {\n padding-right: 0;\n }\n\n .small.right-to-left .main {\n padding-left: 16px;\n }\n\n .small.left-to-right.advert_ .main {\n padding-right: 4px;\n }\n\n .small.right-to-left.advert_ .main {\n padding-left: 4px;\n }\n\n .small.collapsed.right-to-left .main {\n padding-left: 0;\n }\n\n .screen {\n min-width: 300px;\n }\n\n .screen .main {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n row-gap: 40px;\n padding: 40px;\n border-radius: 8px;\n }\n\n .screen.mobile .main {\n padding: 32px;\n }\n\n .screen .summary {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n .screen .controls {\n flex-grow: 0;\n column-gap: 40px;\n margin-bottom: 90px;\n }\n\n .screen.advert_ .controls {\n margin-bottom: 232px;\n }\n\n .screen.mobile .controls {\n column-gap: 8px;\n margin-top: -8px;\n margin-bottom: 60px;\n }\n\n .screen.mobile.advert_ .controls {\n margin-bottom: 148px;\n }\n\n .screen .end {\n order: -1;\n align-self: flex-end;\n margin-bottom: -32px;\n }\n\n .screen.mobile .end {\n margin-bottom: 32px;\n }\n\n .video {\n min-width: 300px;\n max-width: 720px;\n border-radius: 8px;\n transition: background-color 0.25s;\n }\n\n .video.advert_.playing,\n .video.advert_.playing :global(*) {\n pointer-events: none;\n }\n\n .video.advert_.playing .controls,\n .video.advert_.playing .controls :global(*),\n .video.advert_.playing .end,\n .video.advert_.playing .end :global(*),\n .video.advert_.playing :global(.playlist),\n .video.advert_.playing :global(.playlist *) {\n pointer-events: auto;\n }\n\n .video.fixed {\n max-width: min(720px, 100% - 32px);\n }\n\n .video :global(.hoverable) {\n position: relative;\n padding-bottom: 56.25%;\n border-radius: 8px;\n overflow: hidden;\n transition: background-color 0.25s;\n }\n\n .video .video-placeholder {\n position: absolute;\n width: 100%;\n height: 100%;\n border-radius: 8px;\n background: #323232;\n background-color: black;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n }\n\n .video .main {\n position: absolute;\n width: 100%;\n height: 100%;\n background: transparent;\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n grid-template-rows: auto minmax(0, 1fr) auto;\n cursor: none;\n }\n\n .video.stopped .main,\n .video.hovering .main {\n cursor: default;\n }\n\n .video .summary {\n margin: 16px;\n cursor: auto;\n display: flex;\n }\n\n .video .end {\n margin: 16px;\n margin-left: auto;\n }\n\n .video .controls {\n grid-row: 3;\n grid-column: 1 / span 3;\n padding-bottom: 8px;\n position: relative;\n padding: 8px 16px;\n cursor: auto;\n }\n\n .video .controls > :global(*) {\n opacity: 0;\n transition: opacity 0.25s;\n pointer-events: none;\n }\n\n .video .controls > :global(.progress-bar.full-width) {\n transition: opacity 0.25s, height 0.1s, top 0.1s;\n }\n\n :global(.video .hoverable):focus-within .controls > :global(*),\n :global(.video .hoverable):focus-within .end > :global(.beyondwords),\n .video.stopped .controls > :global(*),\n .video.hovering .controls > :global(*),\n .video.advert_ .controls > :global(.time-indicator),\n .video.advert_ .controls > :global(.advert-link) {\n opacity: 1;\n pointer-events: auto;\n }\n\n .video.advert_ .controls > :global(.time-indicator) {\n position: absolute;\n left: 16px;\n bottom: 16px;\n transition: bottom 0.5s;\n }\n\n .video.advert_ .controls > :global(.advert-link) {\n position: absolute;\n right: 16px;\n bottom: 16px;\n transition: bottom 0.5s;\n }\n\n :global(.video.advert_ .hoverable):focus-within .controls > :global(.time-indicator),\n .video.advert_.stopped .controls > :global(.time-indicator),\n .video.advert_.hovering .controls > :global(.time-indicator),\n :global(.video.advert_ .hoverable):focus-within .controls > :global(.advert-link),\n .video.advert_.stopped .controls > :global(.advert-link),\n .video.advert_.hovering .controls > :global(.advert-link) {\n bottom: 76px;\n }\n\n .video.advert_.mobile .controls > :global(.time-indicator) {\n left: 8px;\n margin-bottom: -4px;\n }\n\n .video.advert_.mobile .controls > :global(.advert-link) {\n right: 8px;\n margin-bottom: -4px;\n }\n\n .video.advert_.fixed .controls > :global(.time-indicator) {\n left: 12px;\n }\n\n .video.advert_.fixed .controls > :global(.advert-link) {\n right: 12px;\n }\n\n .video :global(.next-button) {\n margin-left: 8px;\n }\n\n .video.advert_ .controls {\n column-gap: 16px;\n }\n\n .video.stopped .controls {\n pointer-events: none;\n padding: 16px;\n }\n\n .video.stopped.right-to-left .controls {\n flex-direction: row-reverse;\n }\n\n .video :global(.hoverable):focus-within,\n .video.hovering :global(.hoverable) {\n background: linear-gradient(\n rgba(0, 0, 0, 0) 50.0%,\n rgba(0, 0, 0, 0.083) 63.6%,\n rgba(0, 0, 0, 0.14) 67.55%,\n rgba(0, 0, 0, 0.207) 71.3%,\n rgba(0, 0, 0, 0.282) 74.8%,\n rgba(0, 0, 0, 0.36) 78.1%,\n rgba(0, 0, 0, 0.44) 81.25%,\n rgba(0, 0, 0, 0.518) 84.2%,\n rgba(0, 0, 0, 0.593) 87.05%,\n rgba(0, 0, 0, 0.66) 89.75%,\n rgba(0, 0, 0, 0.717) 92.4%,\n rgba(0, 0, 0, 0.761) 94.95%,\n rgba(0, 0, 0, 0.79) 97.5%,\n rgba(0, 0, 0, 0.8) 100.0%\n );\n }\n\n .video.fixed :global(.hoverable):focus-within,\n .video.fixed.hovering :global(.hoverable) {\n background: linear-gradient(\n rgba(0, 0, 0, 0) 25.0%,\n rgba(0, 0, 0, 0.083) 45.4%,\n rgba(0, 0, 0, 0.14) 51.325%,\n rgba(0, 0, 0, 0.207) 56.95%,\n rgba(0, 0, 0, 0.282) 62.2%,\n rgba(0, 0, 0, 0.36) 67.15%,\n rgba(0, 0, 0, 0.44) 71.875%,\n rgba(0, 0, 0, 0.518) 76.3%,\n rgba(0, 0, 0, 0.593) 80.575%,\n rgba(0, 0, 0, 0.66) 84.625%,\n rgba(0, 0, 0, 0.717) 88.6%,\n rgba(0, 0, 0, 0.761) 92.425%,\n rgba(0, 0, 0, 0.79) 96.25%,\n rgba(0, 0, 0, 0.8) 100.0%\n );\n }\n\n .video.mobile .controls {\n padding: 8px;\n }\n\n .video.mobile .summary,\n .video.mobile .end {\n margin: 8px;\n }\n\n .video.fixed .end {\n margin: 16px;\n }\n\n .video.fixed.mobile .end {\n margin: 12px;\n }\n\n .video.fixed .controls {\n padding-left: 12px;\n padding-right: 12px;\n }\n\n :global(.beyondwords-player.maximized) .fixed {\n display: none;\n }\n\n :global(.beyondwords-player.maximized) .video {\n max-width: none;\n width: 100%;\n height: 100%;\n }\n\n :global(.beyondwords-player.maximized) .video :global(.hoverable) {\n padding: 0;\n height: 100%;\n background: none;\n }\n</style>\n","<script>\n export let root = undefined;\n\n let element;\n\n $: target = typeof root === \"string\" ? null : root;\n $: target && element && target.appendChild(element);\n\n // Ensure the styles apply when widgetTarget is set.\n $: target?.classList?.add(\"beyondwords-widget\", \"bwp\");\n</script>\n\n<div bind:this={element} class=\"external-widget\">\n <slot></slot>\n</div>\n\n<style>\n .external-widget {\n position: relative;\n }\n\n :global(.beyondwords-widget.position-11-oclock > *) { margin-left: 3px; margin-bottom: 10px }\n :global(.beyondwords-widget.position-12-oclock > *) { margin: auto; margin-bottom: 10px; width: fit-content }\n :global(.beyondwords-widget.position-1-oclock > *) { margin-left: auto; margin-bottom: 10px; width: fit-content }\n\n :global(.beyondwords-widget.position-2-oclock) { position: absolute; right: -55px; top: 0 }\n :global(.beyondwords-widget.position-3-oclock) { position: absolute; right: -55px; top: 50%; transform: translateY(-50%); }\n :global(.beyondwords-widget.position-4-oclock) { position: absolute; right: -55px; bottom: 0 }\n\n :global(.beyondwords-widget.position-5-oclock > *) { margin-left: auto; margin-top: 10px; width: fit-content }\n :global(.beyondwords-widget.position-6-oclock > *) { margin: auto; margin-top: 10px; width: fit-content }\n :global(.beyondwords-widget.position-7-oclock > *) { margin-left: 3px; margin-top: 10px }\n\n :global(.beyondwords-widget.position-8-oclock) { position: absolute; left: -55px; bottom: 0 }\n :global(.beyondwords-widget.position-9-oclock) { position: absolute; left: -55px; top: 50%; transform: translateY(-50%); }\n :global(.beyondwords-widget.position-10-oclock) { position: absolute; left: -55px; top: 0 }\n\n :global(.beyondwords-widget.position-7-oclock.for-small-player > *),\n :global(.beyondwords-widget.position-11-oclock.for-small-player > *) { margin-left: 0 }\n\n :global(.beyondwords-widget.position-7-oclock.for-large-player > *),\n :global(.beyondwords-widget.position-11-oclock.for-large-player > *) { margin-left: 7px }\n\n :global(.beyondwords-widget.position-7-oclock.for-video-player > *),\n :global(.beyondwords-widget.position-11-oclock.for-video-player > *) { margin-left: 15px }\n</style>\n","<script>\n import(\"../helpers/loadTheStyles.ts\");\n\n export let projectId;\n export let contentId;\n export let playlistId;\n export let sourceId;\n export let sourceUrl;\n export let showUserInterface;\n export let playerStyle;\n export let playerTitle;\n export let callToAction;\n export let skipButtonStyle;\n export let playlistStyle;\n export let playlistToggle;\n export let mediaSession;\n export let content;\n export let contentIndex;\n export let introsOutros;\n export let introsOutrosIndex;\n export let adverts;\n export let advertIndex;\n export let persistentAdImage;\n export let persistentIndex;\n export let duration;\n export let currentTime;\n export let playbackState;\n export let playbackRate;\n export let widgetStyle;\n export let widgetPosition;\n export let widgetWidth;\n export let widgetTarget;\n export let textColor;\n export let backgroundColor;\n export let iconColor;\n export let highlightColor;\n export let logoIconEnabled;\n export let highlightSections;\n export let clickableSections;\n export let segmentWidgetSections;\n export let segmentWidgetPosition;\n export let advertConsent;\n export let analyticsConsent;\n export let analyticsCustomUrl;\n export let analyticsTag;\n\n let showAdvancedSettings = false;\n</script>\n\n<div class=\"control-panel\">\n <div class=\"heading\">\n <strong>Player settings:</strong>\n\n <a tabindex={-1} target=\"_blank\" class=\"docs\" href=\"https://github.com/beyondwords-io/player/blob/main/doc/player-settings.md\">\n view docs\n </a>\n </div>\n\n <br/>\n\n <div class=\"control\">\n playerStyle:\n <select tabindex={-1} bind:value={playerStyle}>\n <option>small</option>\n <option>standard</option>\n <option>large</option>\n <option>video</option>\n </select>\n </div>\n\n <div class=\"control\">\n playbackState:\n <select tabindex={-1} bind:value={playbackState}>\n <option>stopped</option>\n <option>playing</option>\n <option>paused</option>\n </select>\n </div>\n\n <div class=\"control\">\n playerTitle:\n <input tabindex={-1} type=\"text\" bind:value={playerTitle}>\n </div>\n\n <div class=\"control\">\n callToAction:\n <input tabindex={-1} type=\"text\" bind:value={callToAction}>\n </div>\n\n <div class=\"control\">\n skipButtonStyle:\n <select tabindex={-1} bind:value={skipButtonStyle}>\n <option>auto</option>\n <option>segments</option>\n <option>seconds</option>\n <option>seconds-15</option>\n <option>seconds-15-30</option>\n <option>tracks</option>\n </select>\n </div>\n\n <div class=\"control\">\n playlistStyle:\n <select tabindex={-1} bind:value={playlistStyle}>\n <option>auto</option>\n <option>show</option>\n <option>show-3</option>\n <option>show-999</option>\n <option>hide</option>\n </select>\n </div>\n\n <div class=\"control\">\n playlistToggle:\n <select tabindex={-1} bind:value={playlistToggle}>\n <option>auto</option>\n <option>show</option>\n <option>hide</option>\n </select>\n </div>\n\n <div class=\"control\">\n advertIndex:\n <select tabindex={-1} bind:value={advertIndex}>\n <option value={-1}>-1 (none)</option>\n {#each adverts as item, i}\n <option value={i}>{i} ({item.placement})</option>\n {/each}\n </select>\n </div>\n\n <div class=\"control\">\n widgetStyle:\n <select tabindex={-1} bind:value={widgetStyle}>\n <option>small</option>\n <option>standard</option>\n <option>large</option>\n <option>video</option>\n </select>\n </div>\n\n <div class=\"control\">\n widgetPosition:\n <select tabindex={-1} bind:value={widgetPosition}>\n <option>auto</option>\n <option>left</option>\n <option>center</option>\n <option>right</option>\n </select>\n </div>\n\n <div class=\"control\">\n widgetWidth:\n <select tabindex={-1} bind:value={widgetWidth}>\n <option>auto</option>\n <option>400px</option>\n <option>30rem</option>\n <option>fit-content</option>\n <option>initial</option>\n <option>0</option>\n </select>\n </div>\n\n <div class=\"control\">\n textColor:\n <input tabindex={-1} type=\"text\" bind:value={textColor}>\n </div>\n\n <div class=\"control\">\n backgroundColor:\n <input tabindex={-1} type=\"text\" bind:value={backgroundColor}>\n </div>\n\n <div class=\"control\">\n iconColor:\n <input tabindex={-1} type=\"text\" bind:value={iconColor}>\n </div>\n\n <div class=\"control\">\n highlightColor:\n <input tabindex={-1} type=\"text\" bind:value={highlightColor}>\n </div>\n\n <div class=\"control\">\n highlightSections:\n <select tabindex={-1} bind:value={highlightSections}>\n <option>all</option>\n <option>body</option>\n <option>none</option>\n <option>all-none</option>\n <option>none-all</option>\n </select>\n </div>\n\n <div class=\"control\">\n clickableSections:\n <select tabindex={-1} bind:value={clickableSections}>\n <option>all</option>\n <option>body</option>\n <option>none</option>\n <option>all-none</option>\n <option>none-all</option>\n </select>\n </div>\n\n <div class=\"control\">\n segmentWidgetSections:\n <select tabindex={-1} bind:value={segmentWidgetSections}>\n <option>all</option>\n <option>body</option>\n <option>none</option>\n <option>all-none</option>\n <option>none-all</option>\n </select>\n </div>\n\n <div class=\"control\">\n segmentWidgetPosition:\n <select tabindex={-1} bind:value={segmentWidgetPosition}>\n {#each [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] as hour}\n <option>{hour}-oclock</option>\n {/each}\n </select>\n </div>\n\n {#if showAdvancedSettings}\n <br/>\n <strong>Advanced settings:</strong>\n <br/><br/>\n\n <div class=\"control\">\n projectId:\n <input tabindex={-1} type=\"text\" bind:value={projectId}>\n </div>\n\n <div class=\"control\">\n contentId:\n <input tabindex={-1} type=\"text\" bind:value={contentId}>\n </div>\n\n <div class=\"control\">\n playlistId:\n <input tabindex={-1} type=\"text\" bind:value={playlistId}>\n </div>\n\n <div class=\"control\">\n sourceId:\n <input tabindex={-1} type=\"text\" bind:value={sourceId}>\n </div>\n\n <div class=\"control\">\n sourceUrl:\n <input tabindex={-1} type=\"text\" bind:value={sourceUrl}>\n </div>\n\n <div class=\"control\">\n showUserInterface:\n <select tabindex={-1} bind:value={showUserInterface}>\n <option>{false}</option>\n <option>{true}</option>\n </select>\n </div>\n\n <div class=\"control\">\n mediaSession:\n <select tabindex={-1} bind:value={mediaSession}>\n <option>auto</option>\n <option>override</option>\n <option>none</option>\n </select>\n </div>\n\n <div class=\"control\">\n contentIndex:\n <select tabindex={-1} bind:value={contentIndex}>\n {#each content as item, i}\n <option value={i}>{i} ({item.title})</option>\n {/each}\n </select>\n </div>\n\n <div class=\"control\">\n introsOutrosIndex:\n <select tabindex={-1} bind:value={introsOutrosIndex}>\n <option value={-1}>-1 (none)</option>\n {#each introsOutros as item, i}\n <option value={i}>{i}: {item.placement}</option>\n {/each}\n </select>\n </div>\n\n <div class=\"control\">\n persistentAdImage:\n <select tabindex={-1} bind:value={persistentAdImage}>\n <option>{false}</option>\n <option>{true}</option>\n </select>\n </div>\n\n <div class=\"control\">\n persistentIndex:\n <select tabindex={-1} bind:value={persistentIndex}>\n <option value={-1}>-1 (none)</option>\n {#each adverts as item, i}\n <option value={i}>{i}: {item.placement}</option>\n {/each}\n </select>\n </div>\n\n <div class=\"control\">\n duration:\n <input tabindex={-1} type=\"text\" bind:value={duration}>\n </div>\n\n <div class=\"control\">\n currentTime:\n <input tabindex={-1} type=\"text\" bind:value={currentTime}>\n </div>\n\n <div class=\"control\">\n playbackRate:\n <input tabindex={-1} type=\"text\" bind:value={playbackRate}>\n </div>\n\n <div class=\"control\">\n widgetTarget:\n <input tabindex={-1} type=\"text\" bind:value={widgetTarget}>\n </div>\n\n <div class=\"control\">\n logoIconEnabled:\n <select tabindex={-1} bind:value={logoIconEnabled}>\n <option>{false}</option>\n <option>{true}</option>\n </select>\n </div>\n\n <div class=\"control\">\n advertConsent:\n <select tabindex={-1} bind:value={advertConsent}>\n <option>personalized</option>\n <option>non-personalized</option>\n <option>under-the-age-of-consent</option>\n </select>\n </div>\n\n <div class=\"control\">\n analyticsConsent:\n <select tabindex={-1} bind:value={analyticsConsent}>\n <option>allowed</option>\n <option>without-local-storage</option>\n <option>none</option>\n </select>\n </div>\n\n <div class=\"control\">\n analyticsCustomUrl:\n <input tabindex={-1} type=\"text\" bind:value={analyticsCustomUrl}>\n </div>\n\n <div class=\"control\">\n analyticsTag:\n <input tabindex={-1} type=\"text\" bind:value={analyticsTag}>\n </div>\n {/if}\n\n <br/>\n\n {#if showAdvancedSettings}\n <a tabindex={-1} href=\"#_\" on:click={() => showAdvancedSettings = false}>hide advanced settings</a>\n {:else}\n <a tabindex={-1} href=\"#_\" on:click={() => showAdvancedSettings = true}>show advanced settings</a>\n {/if}\n</div>\n\n<style>\n .heading {\n display: flex;\n }\n\n .docs {\n text-align: right;\n }\n\n .control {\n display: flex;\n column-gap: 8px;\n margin: 10px 0;\n }\n\n input[type=\"text\"] {\n border: 1px solid grey;\n border-radius: 2px;\n }\n\n .control, input[type=\"text\"], select, strong, a {\n font-family: \"InterVariable\", sans-serif;\n font-size: 14px;\n width: 100%;\n }\n\n strong {\n font-weight: bold;\n }\n\n a {\n text-decoration: underline;\n }\n</style>\n","const blobForImageUrl = (imageUrl, width, height) => {\n revokePreviousUrls(imageUrl);\n\n const image = new Image();\n image.setAttribute(\"crossorigin\", \"anonymous\");\n\n return new Promise((resolve, reject) => {\n image.addEventListener(\"load\", handleLoad(image, width, height, resolve, reject));\n image.addEventListener(\"error\", reject);\n\n image.src = imageUrl;\n });\n};\n\nconst handleLoad = (image, width, height, resolve, reject) => () => {\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n\n canvas.width = width;\n canvas.height = height;\n\n // TODO: get image dimensions and preserve aspect ratio?\n\n context.drawImage(image, 0, 0, width, height);\n canvas.toBlob(handleToBlob(image, width, height, resolve, reject)); // png by default.\n};\n\nconst objectUrls = {};\n\nconst handleToBlob = (image, width, height, resolve, reject) => (blob) => {\n if (!blob) { reject(); }\n\n const src = URL.createObjectURL(blob);\n\n objectUrls[image.src] ||= [];\n objectUrls[image.src].push(src);\n\n resolve({ src, sizes: `${width}x${height}`, type: \"image/png\" });\n};\n\nconst revokePreviousUrls = (currentUrl) => {\n const previousImageUrls = Object.keys(objectUrls).filter(url => url !== currentUrl);\n const previousObjectUrls = previousImageUrls.map(url => objectUrls[url]).flat();\n\n previousObjectUrls.forEach(url => URL.revokeObjectURL(url));\n};\n\nexport default blobForImageUrl;\n","const blobForSvgNode = async (svgElement, width, height) => {\n svgElement = await svgElement;\n\n const html = svgElement.innerHTML;\n const src = `data:image/svg+xml,${encodeURIComponent(html)}`;\n\n return { src, sizes: `${width}x${height}`, type: \"image/svg+xml\" };\n};\n\nexport default blobForSvgNode;\n","<script>\n import { tick } from \"svelte\";\n import VolumeUp from \"./svg_icons/VolumeUp.svelte\";\n import blobForImageUrl from \"../helpers/blobForImageUrl\";\n import blobForSvgNode from \"../helpers/blobForSvgNode\";\n import newEvent from \"../helpers/newEvent\";\n\n // Use these sizes: https://developer.mozilla.org/en-US/docs/Web/API/MediaMetadata\n const imageSizes = [96, 128, 192, 256, 384, 512];\n\n // https://developer.mozilla.org/en-US/docs/Web/API/MediaSession/setActionHandler\n const actionTypes = [\"hangup\", \"nextslide\", \"nexttrack\", \"pause\", \"play\", \"previousslide\", \"previoustrack\", \"seekbackward\", \"seekforward\", \"seekto\", \"skipad\", \"stop\", \"togglecamera\", \"togglemicrophone\"];\n\n export let content = [];\n export let contentIndex = 0;\n export let activeAdvert = undefined;\n export let persistentAdvert = undefined;\n export let duration = 0;\n export let playbackState = \"stopped\";\n export let skipButtonStyle = \"auto\";\n export let backgroundColor = \"#f5f5f5\";\n export let iconColor = \"black\";\n export let onEvent = () => {};\n\n let artwork = [];\n let failedUrls = new Set();\n\n let fallbackSvgs = imageSizes.map(() => undefined);\n let renderedSvgs = imageSizes.map(() => undefined);\n\n $: isStopped = playbackState === \"stopped\";\n $: isAdvert = activeAdvert && !isStopped;\n $: isPlaylist = content.length > 1;\n\n $: contentItem = content[contentIndex];\n $: skipStyle = skipButtonStyle === \"auto\" ? (isPlaylist ? \"tracks\" : \"segments\") : skipButtonStyle;\n\n $: backwardsSeconds = parseFloat(skipStyle.split(\"-\")[1] || 10);\n $: forwardsSeconds = parseFloat(skipStyle.split(\"-\")[2] || backwardsSeconds);\n\n $: showSeekButtons = !isAdvert && skipStyle !== \"tracks\";\n $: showTrackButtons = !isAdvert && skipStyle === \"tracks\";\n $: allowScrubbing = !isAdvert;\n\n $: background = isAdvert && activeAdvert?.backgroundColor || backgroundColor;\n $: foreground = isAdvert && activeAdvert?.iconColor || iconColor;\n $: background, foreground, renderedSvgs = imageSizes.map((_, i) => tick().then(() => fallbackSvgs[i]));\n\n $: imageUrl_ = isAdvert && activeAdvert.imageUrl || !isStopped && persistentAdvert?.imageUrl || contentItem?.imageUrl;\n $: imageUrl = failedUrls.has(imageUrl_) ? null : imageUrl_;\n\n $: pngArtworks = imageUrl ? imageSizes.map(s => blobForImageUrl(imageUrl, s, s)) : [];\n $: urlArtworks = imageUrl ? [{ src: imageUrl, sizes: \"any\" }] : [];\n $: svgArtworks = imageUrl ? [] : imageSizes.map((s, i) => blobForSvgNode(renderedSvgs[i], s, s));\n\n $: artworks = Promise.all([...pngArtworks, ...urlArtworks, ...svgArtworks]);\n const onReject = () => failedUrls = failedUrls.add(imageUrl);\n\n $: title = contentItem?.title || \"\";\n $: artworks.then(arr => artwork = arr).catch(onReject);\n $: artist = \"\"; // TODO: maybe set to projectTitle\n $: album = \"\"; // TODO: maybe set to playlistTitle\n\n $: navigator.mediaSession.metadata = new MediaMetadata({ title, artist, album, artwork });\n $: navigator.mediaSession.setByPlayer = true;\n\n // Remove existing handlers, e.g. set by the user's website or other players.\n $: actionTypes.forEach(type => {\n // Chrome doesn't support the 'skipad' action type and throws an error.\n try { navigator.mediaSession.setActionHandler(type, null); } catch (e) { /* Ignore */ }\n });\n\n $: navigator.mediaSession.setActionHandler(\"play\", () => {\n onEvent(newEvent({\n type: \"PressedPlay\",\n description: \"The play button was pressed.\",\n initiatedBy: \"media-session-api\",\n }));\n });\n\n $: navigator.mediaSession.setActionHandler(\"pause\", () => {\n onEvent(newEvent({\n type: \"PressedPause\",\n description: \"The pause button was pressed.\",\n initiatedBy: \"media-session-api\",\n }));\n });\n\n $: navigator.mediaSession.setActionHandler(\"seekto\", allowScrubbing ? ({ seekTime }) => {\n onEvent(newEvent({\n type: \"ScrubbedProgressBar\",\n description: \"The user pressed on the progress bar then dragged.\",\n initiatedBy: \"media-session-api\",\n ratio: Math.max(0, Math.min(1, seekTime / duration)),\n }));\n } : null);\n\n $: navigator.mediaSession.setActionHandler(\"seekbackward\", showSeekButtons ? ({ seekOffset }) => {\n if (skipStyle === \"seconds\" || seekOffset) {\n onEvent(newEvent({\n type: \"PressedSeekBack\",\n description: \"The seek backward button was pressed.\",\n initiatedBy: \"media-session-api\",\n seconds: seekOffset || backwardsSeconds,\n }));\n } else {\n onEvent(newEvent({\n type: \"PressedPrevSegment\",\n description: \"The previous segment button was pressed.\",\n initiatedBy: \"media-session-api\",\n }));\n }\n } : null);\n\n $: navigator.mediaSession.setActionHandler(\"seekforward\", showSeekButtons ? ({ seekOffset }) => {\n if (skipStyle === \"seconds\" || seekOffset) {\n onEvent(newEvent({\n type: \"PressedSeekAhead\",\n description: \"The seek ahead button was pressed.\",\n initiatedBy: \"media-session-api\",\n seconds: seekOffset || forwardsSeconds,\n }));\n } else {\n onEvent(newEvent({\n type: \"PressedNextSegment\",\n description: \"The next segment button was pressed.\",\n initiatedBy: \"media-session-api\",\n }));\n }\n } : null);\n\n $: navigator.mediaSession.setActionHandler(\"previoustrack\", showTrackButtons ? () => {\n onEvent(newEvent({\n type: \"PressedPrevTrack\",\n description: \"The previous track button was pressed.\",\n initiatedBy: \"media-session-api\",\n }));\n } : null);\n\n $: navigator.mediaSession.setActionHandler(\"nexttrack\", showTrackButtons ? () => {\n onEvent(newEvent({\n type: \"PressedNextTrack\",\n description: \"The next track button was pressed.\",\n initiatedBy: \"media-session-api\",\n }));\n } : null);\n\n // TODO: maybe set playbackState/positionState if it isn't working for VAST ads.\n // TODO: if skipButtonStyle is tracks but there's only one track, should we change it?\n</script>\n\n<div class=\"media-session\">\n {#each imageSizes as size, i}\n <div bind:this={fallbackSvgs[i]} style=\"display: none\">\n <VolumeUp fill={background} color={foreground} scale={size / 18} zoom={0.65} />\n </div>\n {/each}\n</div>\n","<script>\n export let analyticsTag;\n\n $: alreadyLoaded = window.gtag;\n</script>\n\n<svelte:head>\n {#if !alreadyLoaded}\n <script async src=\"https://www.googletagmanager.com/gtag/js?id={analyticsTag}\"></script>\n\n <script>\n window.dataLayer = window.dataLayer || [];\n function gtag() { dataLayer.push(arguments); }\n gtag(\"js\", new Date());\n </script>\n {/if}\n</svelte:head>\n","// This class is responsible for selecting which consumer is the current owner\n// of a resource. It uses a simple strategy that grants ownership to the\n// consumer that most recently added interest. When a consumer removes interest\n// ownership reverts to the next-most-recent consumer, and so on.\n//\n// If two owners call onSelected with exactly the same arguments then the\n// OwnershipMediator avoids calling onSelected unnecessarily. The current owner\n// of a resource is always the last element in the this.consumers array.\n\nclass OwnershipMediator {\n constructor(onSelected, onDeselected) {\n this.onSelected = onSelected;\n this.onDeselected = onDeselected;\n this.consumers = {};\n }\n\n addInterest(resourceId, consumerId, ...args) {\n this.consumers[resourceId] ||= [];\n const last = this.consumers[resourceId].slice(-1)[0];\n\n this.consumers[resourceId].push({ consumerId, args });\n\n if (last && this.#arraysEqual(args, last.args)) { return; }\n\n if (last) { this.onDeselected(resourceId, ...last.args); }\n this.onSelected(resourceId, ...args);\n }\n\n removeInterest(resourceId, consumerId) {\n this.consumers[resourceId] ||= [];\n const last = this.consumers[resourceId].slice(-1)[0];\n\n this.#removeLast(this.consumers[resourceId], o => o.consumerId === consumerId);\n\n const wasSelected = last && consumerId === last.consumerId;\n if (!wasSelected) { return; }\n\n const nextLast = this.consumers[resourceId].slice(-1)[0];\n if (nextLast && this.#arraysEqual(last.args, nextLast.args)) { return; }\n\n this.onDeselected(resourceId, ...last.args);\n if (nextLast) { this.onSelected(resourceId, ...nextLast.args); }\n }\n\n // private\n\n #arraysEqual(arr1, arr2) {\n return arr1.length === arr2.length && arr1.every((e, i) => e === arr2[i]);\n }\n\n #removeLast(array, conditionFn) {\n for (let i = array.length - 1; i >= 0; i -= 1) {\n if (!conditionFn(array[i])) { continue; }\n\n array.splice(i, 1);\n return;\n }\n }\n}\n\nexport default OwnershipMediator;\n","const sectionEnabled = (type, segment, sections) => {\n let [currentSections, hoveredSections] = sections.split(\"-\");\n\n currentSections ||= \"none\";\n hoveredSections ||= currentSections;\n\n const typeSections = type === \"current\" ? currentSections : hoveredSections;\n return typeSections === \"all\" || typeSections === \"body\" && segment?.section === \"body\";\n};\n\nexport default sectionEnabled;\n","import OwnershipMediator from \"./ownershipMediator\";\nimport sectionEnabled from \"./sectionEnabled\";\n\nconst dataAttribute = \"data-beyondwords-marker\";\nconst markClasses = (m) => [\"beyondwords-highlight\", \"bwp\", `marker-${m}`];\n\nclass SegmentHighlights {\n static #mediator = new OwnershipMediator(this.#addHighlights, this.#removeHighlights);\n\n update(type, segment, sections, background) {\n const enabled = sectionEnabled(type, segment, sections);\n\n const previous = this[`prev${type}`];\n const current = enabled ? segment?.marker : null;\n\n if (current) { SegmentHighlights.#mediator.addInterest(current, this, background); }\n if (previous) { SegmentHighlights.#mediator.removeInterest(previous, this); }\n\n this[`prev${type}`] = current;\n }\n\n static #addHighlights(marker, background) {\n const markerElements = document.querySelectorAll(`[${dataAttribute}=\"${marker}\"]`);\n\n for (const element of markerElements) {\n const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT, null, false);\n let node;\n\n while ((node = walker.nextNode())) {\n const isEmpty = /^\\s*$/.test(node.nodeValue);\n if (isEmpty) { continue; }\n\n const isLink = node.parentNode.nodeName.toLowerCase() === \"a\";\n if (isLink) { node = node.parentNode; }\n\n const mark = document.createElement(\"mark\");\n\n mark.classList.add(...markClasses(marker));\n mark.style.background = background;\n\n node.parentNode.insertBefore(mark, node);\n mark.appendChild(node);\n }\n }\n }\n\n static #removeHighlights(marker) {\n const markerElements = document.querySelectorAll(`[${dataAttribute}=\"${marker}\"]`);\n\n for (const element of markerElements) {\n const markElements = element.querySelectorAll(`mark.${markClasses(marker)}`);\n\n for (const mark of markElements) {\n for (const child of mark.childNodes) {\n mark.parentNode.insertBefore(child, mark);\n mark.remove();\n }\n }\n }\n }\n}\n\nexport default SegmentHighlights;\nexport { dataAttribute };\n","import OwnershipMediator from \"./ownershipMediator\";\nimport sectionEnabled from \"./sectionEnabled\";\nimport { dataAttribute } from \"./segmentHighlights\";\n\nconst markerClasses = [\"beyondwords-clickable\", \"bwp\"]; // Also set by SegmentContainers.\n\n// This class only adds/removes a className to show 'cursor: pointer' when hovering.\n// An event is always emitted when you click on a segment and RootController\n// decides whether to act on it by checking if its section is in clickableSections.\n//\n// We don't add 'cursor: pointer' to all data-beyondwords-marker elements becuase\n// some might not be clickable if the marker isn't in the content's segments. It\n// would be confusing if the pointer icon showed but nothing happened when clicking.\n\nclass SegmentClickables {\n static #mediator = new OwnershipMediator(this.#addClasses, this.#removeClasses);\n\n update(segment, sections) {\n const enabled = sectionEnabled(\"hovered\", segment, sections);\n\n const previous = this.previous;\n const current = enabled ? segment?.marker : null;\n\n if (current) { SegmentClickables.#mediator.addInterest(current, this); }\n if (previous) { SegmentClickables.#mediator.removeInterest(previous, this); }\n\n this.previous = current;\n }\n\n static #addClasses(marker) {\n const markerElements = document.querySelectorAll(`[${dataAttribute}=\"${marker}\"]`);\n\n for (const element of markerElements) {\n element.classList.add(...markerClasses);\n }\n }\n\n static #removeClasses(marker) {\n const markerElements = document.querySelectorAll(`[${dataAttribute}=\"${marker}\"]`);\n\n for (const element of markerElements) {\n safelyRemoveClasses(element, markerClasses);\n }\n }\n}\n\n// Remove all classes but leave the .bwp in place if there are other .beyondwords-* classes.\n// This ensures the prefixed CSS rules continue to target the element from the other updaters.\nconst safelyRemoveClasses = (element, classes) => {\n if (!element) { return; }\n\n const otherClasses = [...element.classList].filter(c => !classes.includes(c));\n const hasOtherClass = otherClasses.some(c => c.startsWith(\"beyondwords-\"));\n\n const classesToRemove = hasOtherClass ? classes.filter(c => c !== \"bwp\") : classes;\n element.classList.remove(...classesToRemove);\n};\n\nexport default SegmentClickables;\nexport { safelyRemoveClasses };\n","import OwnershipMediator from \"./ownershipMediator\";\nimport { dataAttribute } from \"./segmentHighlights\";\nimport { safelyRemoveClasses } from \"./segmentClickables\";\n\nconst containerClasses = (m, p, s) => [\"beyondwords-widget\", \"bwp\", `marker-${m}`, `position-${p}`, `for-${s}-player`];\nconst markerClasses = [\"beyondwords-relative\", \"bwp\"]; // Also set by SegmentClickables.\n\nclass SegmentContainers {\n static #mediator = new OwnershipMediator(this.#addContainers, this.#removeContainers);\n\n constructor(onUpdate) {\n this.onUpdate = onUpdate;\n this.containers = [];\n }\n\n update(segment, sections, position, playerStyle) {\n const sticky = sections.includes(\"all\") || sections.includes(\"body\");\n\n const previous = this.previous;\n const current = segment?.marker || (sticky && previous?.marker);\n\n if (current) { SegmentContainers.#mediator.addInterest(current, this, this, position, playerStyle); }\n if (previous) { SegmentContainers.#mediator.removeInterest(previous, this); }\n\n this.previous = current;\n }\n\n reset() {\n this.update(null, \"none\");\n }\n\n static #addContainers(marker, self, position, playerStyle) {\n const element = document.querySelector(`[${dataAttribute}=\"${marker}\"]`);\n const container = document.createElement(\"div\");\n\n // Don't add 'position: relative' to the data-beyondwords-marker element\n // if we can help it to reduce interference on the publisher's webpage.\n const needsRelative = [\"2-oclock\", \"3-oclock\", \"4-oclock\", \"8-oclock\", \"9-oclock\", \"10-oclock\"].includes(position);\n\n if (needsRelative) { element.classList.add(...markerClasses); }\n container.classList.add(...containerClasses(marker, position, playerStyle));\n\n const insertBefore = [\"11-oclock\", \"12-oclock\", \"1-oclock\"].includes(position);\n\n if (insertBefore) {\n element.insertBefore(container, element.firstChild);\n } else {\n element.appendChild(container);\n }\n\n self.containers.push(container);\n self.onUpdate(self.containers);\n }\n\n static #removeContainers(marker, self, position, playerStyle) {\n const classes = containerClasses(marker, position, playerStyle);\n\n for (let i = 0; i < self.containers.length; i += 1) {\n const isMatch = classes.every(c => self.containers[i].classList.contains(c));\n if (!isMatch) { continue; }\n\n const element = self.containers[i].parentNode;\n safelyRemoveClasses(element, markerClasses);\n\n self.containers[i].remove();\n self.containers.splice(i, 1);\n\n i -= 1;\n }\n\n self.onUpdate(self.containers);\n }\n}\n\nexport default SegmentContainers;\n","import newEvent from \"./newEvent\";\n\nconst identifiersEvent = () => (\n newEvent({\n type: \"IdentifiersChanged\",\n description: \"The Player's content identifiers changed.\",\n initiatedBy: \"browser\",\n })\n);\n\nexport default identifiersEvent;\n","import throwError from \"../helpers/throwError\";\n\nconst fetchJson = async (url, fetchOptions = {}) => {\n const response = await fetch(url, fetchOptions).catch(() => {});\n const json = await response?.json().catch(() => {});\n\n if (response?.status !== 200) {\n throwError(`Failed to fetch ${url}`, {\n ...fetchOptions,\n responseStatus: response?.status,\n responseJson: json,\n });\n }\n\n return json;\n};\n\nconst postJson = (url, data) => (\n fetchJson(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(data, (_, v) => v === undefined ? null : v),\n })\n);\n\nexport default fetchJson;\nexport { postJson };\n","import fetchJson from \"../helpers/fetchJson\";\n\nclass WebSocketClient {\n constructor(playerApiUrl, projectId, writeToken) {\n this.baseUrl = this.#resolveBaseUrl(playerApiUrl);\n this.projectId = projectId;\n this.writeToken = writeToken;\n }\n\n async getWebSocketToken() {\n const headers = { Authorization: `Token token=${this.writeToken}` };\n const { token } = await fetchJson(`https://${this.baseUrl}/api/v4/token/ws`, { headers });\n this.webSocketToken = token;\n }\n\n async establishConnection(onMessage, onError) {\n const webSocketUrl = `wss://${this.baseUrl}/cable?token=${this.webSocketToken}`;\n const protocol = \"actioncable-v1-json\";\n\n this.webSocket = new WebSocket(webSocketUrl, protocol);\n this.webSocket.onmessage = e => onMessage(JSON.parse(e.data));\n this.webSocket.onerror = onError;\n\n await new Promise(resolve => this.webSocket.onopen = resolve);\n }\n\n subscribeToStatusChanges() {\n const identifier = JSON.stringify({ channel: \"Api::V1::ProjectChannel\", id: this.projectId });\n const jsonData = JSON.stringify({ command: \"subscribe\", identifier });\n\n this.webSocket.send(jsonData);\n }\n\n destroy() {\n this.webSocketToken = null;\n if (!this.webSocket) { return; }\n\n this.webSocket.onmessage = () => {};\n this.webSocket.onerror = () => {};\n this.webSocket.close();\n this.webSocket = null;\n }\n\n // private\n\n #resolveBaseUrl(playerApiUrl) {\n if (playerApiUrl.includes(\"staging\")) {\n return \"app.staging-beyondwords.io\";\n } else {\n return \"app.beyondwords.io\";\n }\n }\n}\n\nexport default WebSocketClient;\n","import WebSocketClient from \"../api_clients/webSocketClient\";\nimport newEvent from \"../helpers/newEvent\";\nimport throwError from \"../helpers/throwError\";\n\nlet client;\n\nconst onStatusChange = async (playerApiUrl, projectId, writeToken, onEvent) => {\n if (!playerApiUrl || !projectId || !writeToken) { return; }\n\n client?.destroy();\n client = new WebSocketClient(playerApiUrl, projectId, writeToken);\n\n await client.getWebSocketToken();\n await client.establishConnection(handleMessage(onEvent), handleError);\n await client.subscribeToStatusChanges();\n};\n\nconst handleMessage = (onEvent) => (webSocketEvent) => {\n const isStatusChange = webSocketEvent?.message?.result?.action === \"podcast_state_updated\";\n if (isStatusChange) { handleStatusChange(webSocketEvent, onEvent); }\n\n const isRejection = webSocketEvent.type === \"reject_subscription\";\n if (isRejection) { handleRejection(webSocketEvent); }\n};\n\nconst handleStatusChange = (webSocketEvent, onEvent) => {\n const result = webSocketEvent.message.result;\n\n onEvent(newEvent({\n type: \"ContentStatusChanged\",\n description: \"The processing status of a content item within the project changed.\",\n initiatedBy: \"websocket\",\n contentId: result.content_id,\n legacyId: result.legacy_id,\n sourceId: result.source_id,\n sourceUrl: result.source_url,\n contentStatus: result.state,\n }));\n};\n\nconst handleRejection = (webSocketEvent) => {\n throwError(\"The WebSocket status change subscription was rejected.\", { webSocketEvent });\n};\n\nconst handleError = (error) => {\n throwError(\"Unexpected WebSocket error.\", { error });\n};\n\nexport default onStatusChange;\n","const waitUntil = (conditionFn) => {\n if (conditionFn()) { return; }\n\n return new Promise(resolve => {\n setInterval(() => conditionFn() && resolve(), 10);\n });\n};\n\nexport default waitUntil;\n","const settableProps = (object) => {\n // TODO: make this better - perhaps by adding player.props()\n const propNames = Object.keys(object.$$.props).filter(k => !ignoreList.has(k));\n const keyValues = propNames.map(name => [name, object[name]]);\n\n return Object.fromEntries(keyValues);\n};\n\nconst ignoreList = new Set([\n \"addEventListener\",\n \"removeEventListener\",\n \"mediaElement\",\n \"userInterface\",\n \"widgetInterface\",\n \"controller\",\n]);\n\nexport default settableProps;\n","const diffObject = (objBefore, objAfter) => {\n const keys = new Set([...Object.keys(objBefore), ...Object.keys(objAfter)]);\n const diff = {};\n\n for (const key of keys) {\n const valueBefore = objBefore[key];\n const valueAfter = objAfter[key];\n\n if (valueBefore !== valueAfter) {\n diff[key] = { previousValue: valueBefore, currentValue: valueAfter };\n }\n }\n\n return diff;\n};\n\nexport default diffObject;\n","import waitUntil from \"./waitUntil\";\nimport settableProps from \"./settableProps\";\nimport diffObject from \"./diffObject\";\n\n// TODO: move state onto player (or into controller?) so that you can use transitions with multiple player instances.\nlet previousIndex = -1;\nconst changedProps = [];\n\nconst applyTransitions = async (transitions, controller, currentTime) => {\n await waitUntil(() => controller.player);\n const player = controller.player;\n\n const currentIndex = transitionIndexAtTime(player.contentIndex, currentTime, transitions);\n\n if (currentIndex > previousIndex) { callTransitions(player, previousIndex, currentIndex, transitions); }\n if (currentIndex < previousIndex) { undoTransitions(player, previousIndex, currentIndex); }\n\n previousIndex = currentIndex;\n};\n\nconst transitionIndexAtTime = (i, time, transitions) => {\n const nextIndex = transitions.findIndex(t => t[0] === i && t[1] > time || t[0] > i);\n const afterTheEnd = nextIndex === -1;\n\n if (afterTheEnd) {\n return transitions.length - 1;\n } else {\n return nextIndex - 1;\n }\n};\n\nconst callTransitions = (player, previousIndex, currentIndex, transitions) => {\n for (let i = previousIndex + 1; i <= currentIndex; i += 1) {\n const before = settableProps(player);\n\n transitions[i][2](player);\n const after = settableProps(player);\n\n const diff = diffObject(before, after);\n changedProps.push(diff);\n }\n};\n\nconst undoTransitions = (player, previousIndex, currentIndex) => {\n for (let i = previousIndex; i > currentIndex; i -= 1) {\n const diff = changedProps.pop();\n\n for (const [key, delta] of Object.entries(diff)) {\n player[key] = delta.previousValue;\n }\n }\n};\n\nexport default applyTransitions;\n","import throwError from \"./throwError\";\n\nconst resolveTarget = (target) => {\n if (!target) {\n return { newTarget: appendDivToBody(), showUserInterface: false };\n }\n\n if (isScriptTag(target)) {\n return { newTarget: addDivAfter(target), showUserInterface: true };\n }\n\n if (typeof target === \"string\") {\n return { newTarget: findByQuery(target), showUserInterface: true };\n }\n\n return { newTarget: target, showUserInterface: true };\n};\n\n// private\n\nconst isScriptTag = (target) => {\n return typeof target === \"object\" && target.nodeName.toLowerCase() === \"script\";\n};\n\nconst appendDivToBody = () => {\n const div = document.createElement(\"div\");\n document.body.appendChild(div);\n\n return div;\n};\n\nconst addDivAfter = (target) => {\n const div = document.createElement(\"div\");\n target.parentNode.insertBefore(div, target.nextSibling);\n\n return div;\n};\n\nconst findByQuery = (target, type = \"player\") => {\n if (typeof target !== \"string\") { return target; }\n\n const elements = document.querySelectorAll(target);\n\n if (elements.length === 0) {\n throwError(`Failed to initialize ${type} because the target could not be found.`, { target, elements });\n }\n\n if (elements.length > 1) {\n throwError(`Failed to initialize ${type} because the target is ambiguous. (${elements.length} elements match)`, { target, elements });\n }\n\n return elements[0];\n};\n\nexport default resolveTarget;\nexport { findByQuery };\n","<!-- svelte-ignore unused-export-let -->\n<script>\n import MediaElement from \"./MediaElement.svelte\";\n import UserInterface from \"./UserInterface.svelte\";\n import ExternalWidget from \"./ExternalWidget.svelte\";\n import ControlPanel from \"./ControlPanel.svelte\";\n import MediaSession from \"./MediaSession.svelte\";\n import GoogleAnalytics from \"./GoogleAnalytics.svelte\";\n import StyleReset from \"./StyleReset.svelte\";\n import SegmentContainers from \"../helpers/segmentContainers\";\n import SegmentClickables from \"../helpers/segmentClickables\";\n import SegmentHighlights from \"../helpers/segmentHighlights\";\n import identifiersEvent from \"../helpers/identifiersEvent\";\n import onStatusChange from \"../helpers/onStatusChange\";\n import sectionEnabled from \"../helpers/sectionEnabled\";\n import applyTransitions from \"../helpers/applyTransitions\";\n import { findByQuery } from \"../helpers/resolveTarget\";\n\n // Please document all settings and keep in-sync with /doc/player-settings.md\n export let playerApiUrl = \"https://api.beyondwords.io/v1/projects/{id}/player\";\n export let projectId = undefined;\n export let contentId = undefined;\n export let playlistId = undefined;\n export let sourceId = undefined;\n export let sourceUrl = undefined;\n export let playlist = [];\n export let showUserInterface = true;\n export let playerStyle = \"standard\";\n export let playerTitle = undefined;\n export let callToAction = undefined;\n export let skipButtonStyle = \"auto\";\n export let playlistStyle = \"auto-5-4\";\n export let playlistToggle = \"auto\";\n export let downloadFormats = [];\n export let mediaSession = \"auto\";\n export let content = [];\n export let contentIndex = 0;\n export let introsOutros = [];\n export let introsOutrosIndex = -1;\n export let adverts = [];\n export let advertIndex = -1;\n export let persistentAdImage = false;\n export let persistentIndex = -1;\n export let duration = 0;\n export let currentTime = 0;\n export let playbackState = \"stopped\";\n export let playbackRate = 1;\n export let playbackRates = [0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 2, 2.5, 3];\n export let widgetStyle = \"standard\";\n export let widgetPosition = \"auto\";\n export let widgetWidth = \"auto\";\n export let widgetTarget = undefined;\n export let textColor = \"#111\";\n export let backgroundColor = \"#f5f5f5\";\n export let iconColor = \"rgba(0, 0, 0, 0.8)\";\n export let highlightColor = \"#eee\";\n export let logoIconEnabled = true;\n export let highlightSections = \"all\";\n export let clickableSections = \"all\";\n export let segmentWidgetSections = \"body\";\n export let segmentWidgetPosition = \"7-oclock\";\n export let currentSegment = undefined;\n export let hoveredSegment = undefined;\n export let loadedMedia = undefined;\n export let advertConsent = \"personalized\";\n export let analyticsConsent = \"allowed\";\n export let analyticsCustomUrl = undefined;\n export let analyticsTag = undefined;\n export let writeToken = undefined;\n export let captureErrors = true;\n export let onError = () => {};\n export let transitions = [];\n export let controlPanel = undefined;\n export const addEventListener = (...args) => controller.addEventListener(...args);\n export const removeEventListener = (...args) => controller.removeEventListener(...args);\n\n // These are set automatically.\n export let initialProps = {};\n export let showBottomWidget = false;\n export let showMediaSession = false;\n export let isFullScreen = false;\n export let mediaElement = undefined;\n export let userInterface = undefined;\n export let widgetInterface = undefined;\n export let controller = undefined;\n export let analyticsUrl = undefined;\n export let analyticsId = undefined;\n export let listenSessionId = undefined;\n export let sessionCreatedAt = undefined;\n export let isNewListen = false;\n export let prevPercentage = 0;\n export let segmentWidgets = [];\n export let segmentContainers = new SegmentContainers(arr => segmentWidgets = arr);\n export let segmentClickables = new SegmentClickables();\n export let segmentHighlights = new SegmentHighlights();\n export const onEvent = e => controller.processEvent({ emittedFrom, ...e });\n\n $: introOrOutro = introsOutros[introsOutrosIndex];\n $: activeAdvert = adverts[advertIndex];\n $: persistentAdvert = adverts[persistentIndex];\n $: contentItem = content[contentIndex];\n\n $: interfaceStyle = isFullScreen ? \"video\" : playerStyle;\n $: emittedFrom = videoBehindWidget ? \"bottom-widget\" : \"inline-player\";\n\n $: widgetTarget = findByQuery(widgetTarget, \"widget\");\n $: controlPanel = findByQuery(controlPanel, \"control panel\");\n\n $: videoBehindWidget = showBottomWidget && widgetStyle === \"video\" && !isFullScreen;\n $: videoBehindStatic = showUserInterface && interfaceStyle === \"video\" && !videoBehindWidget;\n\n $: projectId, contentId, playlistId, sourceId, sourceUrl, playlist, onEvent(identifiersEvent());\n $: onStatusChange(playerApiUrl, projectId, writeToken, (statusEvent) => onEvent(statusEvent));\n\n $: lastHovered = hoveredSegment || lastHovered;\n $: currentSegment, currentAllowedInWidget && resetHovered();\n\n const resetHovered = () => lastHovered = hoveredSegment;\n\n $: currentAllowedInWidget = sectionEnabled(\"current\", currentSegment, segmentWidgetSections);\n $: hoveredAllowedInWidget = sectionEnabled(\"hovered\", lastHovered, segmentWidgetSections);\n\n $: widgetSegment = (hoveredAllowedInWidget && lastHovered) || (currentAllowedInWidget && currentSegment);\n\n $: widgetIsCurrent = widgetSegment?.marker === currentSegment?.marker;\n $: showRealTimeInWidget = widgetIsCurrent || activeAdvert || introOrOutro;\n\n $: segmentContainers.update(widgetSegment, segmentWidgetSections, segmentWidgetPosition, playerStyle);\n $: segmentClickables.update(hoveredSegment, clickableSections);\n\n $: segmentHighlights.update(\"current\", currentSegment, highlightSections, highlightColor);\n $: segmentHighlights.update(\"hovered\", hoveredSegment, highlightSections, highlightColor);\n\n // TODO: if timedTransitions changes then re-apply all transitions.\n $: applyTransitions(transitions, controller, currentTime);\n</script>\n\n<MediaElement\n bind:this={mediaElement}\n {onEvent}\n {content}\n {contentIndex}\n {introOrOutro}\n {activeAdvert}\n {advertConsent}\n bind:playbackState\n bind:duration\n bind:currentTime\n bind:playbackRate\n bind:prevPercentage\n {videoBehindWidget}\n {videoBehindStatic}\n {widgetPosition}\n {widgetWidth} />\n\n{#if showUserInterface}\n <UserInterface\n bind:this={userInterface}\n {onEvent}\n playerStyle={interfaceStyle}\n {callToAction}\n {skipButtonStyle}\n {playlistStyle}\n {playlistToggle}\n {downloadFormats}\n {playerTitle}\n {content}\n {contentIndex}\n {duration}\n {currentTime}\n {playbackState}\n {playbackRate}\n {activeAdvert}\n {persistentAdvert}\n {textColor}\n {backgroundColor}\n {iconColor}\n {logoIconEnabled}\n videoIsBehind={videoBehindStatic} />\n{/if}\n\n{#if showBottomWidget || widgetTarget}\n <ExternalWidget root={widgetTarget}>\n <UserInterface\n bind:this={widgetInterface}\n {onEvent}\n playerStyle={widgetStyle}\n {callToAction}\n {skipButtonStyle}\n playlistStyle=\"hide\"\n playlistToggle=\"hide\"\n {downloadFormats}\n {playerTitle}\n fixedPosition={!widgetTarget && widgetPosition}\n fixedWidth={widgetWidth}\n {content}\n {contentIndex}\n {duration}\n {currentTime}\n {playbackState}\n {playbackRate}\n {activeAdvert}\n {persistentAdvert}\n {textColor}\n {backgroundColor}\n {iconColor}\n {logoIconEnabled}\n videoIsBehind={videoBehindWidget} />\n </ExternalWidget>\n{/if}\n\n{#each segmentWidgets as root (root)}\n <ExternalWidget {root}>\n <UserInterface\n onEvent={e => onEvent({...e, emittedFrom: \"segment-widget\", widgetSegment, widgetIsCurrent })}\n playerStyle=\"small\"\n fixedWidth={0}\n logoIconEnabled={false}\n {content}\n {contentIndex}\n {duration}\n currentTime={showRealTimeInWidget ? currentTime : widgetSegment.startTime}\n playbackState={showRealTimeInWidget ? playbackState : \"paused\"}\n {activeAdvert}\n {persistentAdvert}\n {textColor}\n {backgroundColor}\n {iconColor} />\n </ExternalWidget>\n{/each}\n\n{#if controlPanel}\n <ExternalWidget root={controlPanel}>\n <ControlPanel\n bind:projectId\n bind:contentId\n bind:playlistId\n bind:sourceId\n bind:sourceUrl\n bind:showUserInterface\n bind:playerStyle\n bind:playerTitle\n bind:callToAction\n bind:skipButtonStyle\n bind:playlistStyle\n bind:playlistToggle\n bind:mediaSession\n {content}\n bind:contentIndex\n {introsOutros}\n bind:introsOutrosIndex\n {adverts}\n bind:advertIndex\n bind:persistentAdImage\n bind:persistentIndex\n bind:duration\n bind:currentTime\n bind:playbackState\n bind:playbackRate\n bind:widgetStyle\n bind:widgetPosition\n bind:widgetWidth\n bind:widgetTarget\n bind:textColor\n bind:backgroundColor\n bind:iconColor\n bind:highlightColor\n bind:logoIconEnabled\n bind:highlightSections\n bind:clickableSections\n bind:segmentWidgetSections\n bind:segmentWidgetPosition\n bind:currentSegment\n bind:hoveredSegment\n bind:advertConsent\n bind:analyticsConsent\n bind:analyticsCustomUrl\n bind:analyticsTag />\n </ExternalWidget>\n{/if}\n\n{#if showMediaSession}\n <MediaSession\n {onEvent}\n {content}\n {contentIndex}\n {activeAdvert}\n {persistentAdvert}\n {duration}\n {playbackState}\n {skipButtonStyle}\n {backgroundColor}\n {iconColor}\n />\n{/if}\n\n{#if analyticsTag}\n <GoogleAnalytics {analyticsTag} />\n{/if}\n\n<StyleReset />\n","import fetchJson from \"../helpers/fetchJson\";\n\nclass PlayerApiClient {\n constructor(playerApiUrl, projectId) {\n this.baseUrl = playerApiUrl?.replace(\"{id}\", projectId);\n }\n\n byContentId(id) {\n return fetchJson(`${this.baseUrl}/by_content_id/${id}`);\n }\n\n byPlaylistId(id) {\n return fetchJson(`${this.baseUrl}/by_playlist_id/${id}`);\n }\n\n bySourceId(id) {\n return fetchJson(`${this.baseUrl}/by_source_id/${id}`);\n }\n\n bySourceUrl(url) {\n return fetchJson(`${this.baseUrl}/by_source_url/${url}`);\n }\n\n byIdentifiers(array) {\n return fetchJson(`${this.baseUrl}/by_identifiers/${encodeURIComponent(JSON.stringify(array))}`);\n }\n}\n\nexport default PlayerApiClient;\n","const snakeCaseKeys = (value) => {\n if (typeof value !== \"object\" || value === null) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(snakeCaseKeys);\n }\n\n return Object.fromEntries(Object.entries(value).map(([k, v]) => (\n [k.replace(/([A-Z])/g, c => `_${c.toLowerCase()}`), snakeCaseKeys(v)]\n )));\n};\n\nexport default snakeCaseKeys;\n","const resolveTheme = (theme) => {\n if (theme === \"dark\") {\n return \"dark\";\n } else if (theme === \"auto\" && isBrowserDarkMode()) {\n return \"dark\";\n } else {\n return \"light\";\n }\n};\n\nconst isBrowserDarkMode = () => (\n window.matchMedia && window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n);\n\nexport default resolveTheme;\n","import PlayerApiClient from \"../api_clients/playerApiClient\";\nimport snakeCaseKeys from \"./snakeCaseKeys\";\nimport resolveTheme from \"./resolveTheme\";\nimport newEvent from \"./newEvent\";\n\nconst setPropsFromApi = async (player) => {\n const client = new PlayerApiClient(player.playerApiUrl, player.projectId);\n if (!player.playerApiUrl || !player.projectId) { return; }\n\n const identifiers = identifiersArray(player);\n if (identifiers.length === 0) { return; }\n\n const data = await fetchData(client, identifiers).catch(() => {});\n if (!data?.content) { handleNoContent(player); return; }\n\n // The player allows you to override props from the API by adding them in the script tag.\n // For example, you could add { backgroundCollor: \"yellow\" } to set a different color.\n //\n // If player.backgroundColor is changed again later and a new API request is made, this\n // change will only persist if it was initially overridden in the script tag.\n setProps(player, data);\n};\n\nconst identifiersArray = (player) => {\n const identifiers = [];\n\n if (player.contentId) { identifiers.push({ content_id: player.contentId }); }\n if (player.playlistId) { identifiers.push({ playlist_id: player.playlistId }); }\n if (player.sourceId) { identifiers.push({ source_id: player.sourceId }); }\n if (player.sourceUrl) { identifiers.push({ source_url: player.sourceUrl }); }\n if (player.playlist) { identifiers.push(...snakeCaseKeys(player.playlist)); }\n\n return [...new Set(identifiers.map(JSON.stringify))].map(JSON.parse);\n};\n\nconst fetchData = (client, identifiers) => {\n const identifier = identifiers[0];\n\n if (identifiers.length > 1) { return client.byIdentifiers(identifiers); }\n if (identifier.content_id) { return client.byContentId(identifier.content_id); }\n if (identifier.playlist_id) { return client.byPlaylistId(identifier.playlist_id); }\n if (identifier.source_id) { return client.bySourceId(identifier.source_id); }\n if (identifier.source_url) { return client.bySourceUrl(identifier.source_url); }\n};\n\nconst handleNoContent = (player) => {\n resetSomeProps(player);\n setContentProp(player);\n setAdvertsProp(player);\n\n player.onEvent(newEvent({\n type: \"NoContentAvailable\",\n description: \"No published and processed content is available for the identifiers.\",\n initiatedBy: \"browser\",\n }));\n};\n\nconst setProps = (player, data) => {\n const theme = resolveTheme(data.settings.theme);\n const colors = data.settings[`${theme}_theme`];\n\n resetSomeProps(player);\n setContentProp(player, data);\n setAdvertsProp(player, data);\n\n set(player, \"playerStyle\", data.settings.player_style);\n set(player, \"playerTitle\", data.playlist?.title || data.settings.player_title);\n set(player, \"callToAction\", data.settings.call_to_action === \"Listen to this article\" ? null : data.settings.call_to_action);\n set(player, \"skipButtonStyle\", data.settings.skip_button_style);\n set(player, \"downloadFormats\", data.settings.download_button_enabled ? [\"mp3\"] : []);\n set(player, \"introsOutros\", introsOutrosArray(data.settings));\n set(player, \"persistentAdImage\", data.settings.persistent_ad_image);\n set(player, \"widgetStyle\", data.settings.widget_style);\n set(player, \"widgetPosition\", data.settings.widget_position);\n set(player, \"textColor\", colors.text_color);\n set(player, \"backgroundColor\", colors.background_color);\n set(player, \"iconColor\", colors.icon_color);\n set(player, \"highlightColor\", colors.highlight_color);\n set(player, \"logoIconEnabled\", data.settings.logo_icon_enabled);\n set(player, \"highlightSections\", data.settings.segment_playback_enabled ? \"all\" : \"none\");\n set(player, \"clickableSections\", data.settings.segment_playback_enabled ? \"all\" : \"none\");\n set(player, \"segmentWidgetSections\", data.settings.segment_playback_enabled ? \"none\" : \"none\"); // TODO: default to body?\n set(player, \"analyticsConsent\", analyticsConsent(data.settings));\n set(player, \"analyticsCustomUrl\", data.settings.analytics_custom_url);\n set(player, \"analyticsTag\", data.settings.analytics_tag);\n set(player, \"analyticsUrl\", data.settings.analytics_url);\n set(player, \"analyticsId\", data.settings.analytics_id);\n // TODO: add support for title_enabled\n // TODO: add support for paywall_type\n // TODO: add support for paywall_url\n // TODO: add support for share_button_enabled\n // TODO: add support for voice_icon_enabled\n};\n\nconst resetSomeProps = (player) => {\n set(player, \"contentIndex\", 0);\n set(player, \"introsOutrosIndex\", -1);\n set(player, \"advertIndex\", -1);\n set(player, \"persistentIndex\", -1);\n set(player, \"duration\", 0);\n set(player, \"currentTime\", 0);\n set(player, \"playbackState\", \"stopped\");\n set(player, \"currentSegment\", undefined);\n set(player, \"hoveredSegment\", undefined);\n};\n\nconst setContentProp = (player, data) => {\n const imageEnabled = data?.settings?.image_enabled;\n const contentArray = data?.content || [];\n\n set(player, \"content\", contentArray.map((item) => ({\n id: item.id,\n title: item.title,\n imageUrl: imageEnabled && (data.playlist?.image_url || data.settings.image_url || item.image_url),\n sourceId: item.source_id,\n sourceUrl: item.source_url,\n adsEnabled: item.ads_enabled,\n duration: item.audio[0] ? item.audio[0].duration / 1000 : 0,\n audio: item.audio.map((audio) => ({\n id: audio.id,\n url: audio.url,\n contentType: audio.content_type,\n duration: audio.duration ? audio.duration / 1000 : 0,\n })),\n video: item.video.map((video) => ({\n id: video.id,\n url: video.url,\n contentType: video.content_type,\n duration: video.duration ? video.duration / 1000 : 0,\n })),\n segments: item.segments.map((segment) => ({\n marker: segment.marker,\n section: segment.section,\n startTime: segment.start_time ? segment.start_time / 1000 : 0,\n duration: segment.duration ? segment.duration / 1000 : 0,\n })),\n })));\n};\n\nconst setAdvertsProp = (player, data) => {\n const imageEnabled = data?.settings?.image_enabled;\n const advertsArray = data?.ads || [];\n\n set(player, \"adverts\", advertsArray.map((item) => {\n const isVast = item.type === \"vast\";\n\n const theme = resolveTheme(item.theme);\n const colors = item[`${theme}_theme`];\n\n return {\n id: item.id,\n type: item.type,\n placement: item.placement,\n vastUrl: isVast ? item.vast_url : null,\n clickThroughUrl: !isVast ? item.click_through_url : null,\n imageUrl: imageEnabled && item.image_url,\n textColor: colors?.text_color,\n backgroundColor: colors?.background_color,\n iconColor: colors?.icon_color,\n audio: isVast ? [] : (item.audio || item.media).map((audio) => ({\n id: audio.id,\n url: audio.url,\n contentType: audio.content_type,\n duration: audio.duration ? audio.duration / 1000 : 0,\n })),\n video: isVast ? [] : (item.video || []).map((video) => ({\n id: video.id,\n url: video.url,\n contentType: video.content_type,\n duration: video.duration ? video.duration / 1000 : 0,\n })),\n };\n }));\n};\n\nconst set = (player, propName, value) => {\n const overridden = typeof player.initialProps[propName] !== \"undefined\";\n if (!overridden) { player[propName] = value; }\n};\n\nconst introsOutrosArray = ({ intro_outro_enabled, intro_url, outro_url }) => {\n if (!intro_outro_enabled) { return []; }\n const array = [];\n\n if (intro_url) { array.push({ placement: \"pre-roll\", audio: [{ url: intro_url }], video: [] }); }\n if (outro_url) { array.push({ placement: \"post-roll\", audio: [{ url: outro_url }], video: [] }); }\n\n return array;\n};\n\nconst analyticsConsent = ({ analytics_enabled, analytics_uuid_enabled }) => {\n if (!analytics_enabled) { return \"none\"; }\n if (!analytics_uuid_enabled) { return \"without-local-storage\"; }\n\n return \"allowed\";\n};\n\nexport default setPropsFromApi;\nexport { identifiersArray, fetchData };\n","const downloadFile = async (url, filename) => {\n const response = await fetch(url);\n const blob = await response.blob();\n const href = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n\n document.body.append(anchor);\n\n anchor.href = href;\n anchor.setAttribute(\"download\", filename);\n anchor.setAttribute(\"target\", \"_blank\");\n anchor.click();\n anchor.remove();\n};\n\nexport default downloadFile;\n","const erroredAdverts = { vastUrls: new Set(), mediaSources: new Set() };\n\nconst updateErroredAdverts = (advert) => {\n if (advert.vastUrl) {\n erroredAdverts.vastUrls.add(advert.vastUrl);\n }\n\n for (const media of [...(advert.audio || []), ...(advert.video || [])]) {\n erroredAdverts.mediaSources.add(media.url);\n }\n};\n\nconst resultedInAPlaybackError = (advert) => {\n if (advert.vastUrl) {\n if (erroredAdverts.vastUrls.has(advert.vastUrl)) { return true; }\n }\n\n for (const media of [...(advert.audio || []), ...(advert.video || [])]) {\n if (erroredAdverts.mediaSources.has(media.url)) { return true; }\n }\n\n return false;\n};\n\nexport default erroredAdverts;\nexport { updateErroredAdverts, resultedInAPlaybackError };\n","// This state is shared across all player instances so that the same advert\n// doesn't play again in any player. This does not affect VAST ads because they\n// are fetched programmatically and might return a different advert each time.\n\nconst playedAdvertMedia = new Set();\n\nconst updatePlayedAdvertMedia = (advert) => {\n const media = [...(advert.audio || []), ...(advert.video || [])];\n media.forEach(m => playedAdvertMedia.add(m.url));\n};\n\nconst alreadyPlayedAdvertMedia = (advert) => {\n const media = [...(advert.audio || []), ...(advert.video || [])];\n return media.some(m => playedAdvertMedia.has(m.url));\n};\n\nexport default playedAdvertMedia;\nexport { updatePlayedAdvertMedia, alreadyPlayedAdvertMedia };\n","import findSegmentIndex from \"./findSegmentIndex\";\nimport { updateErroredAdverts, resultedInAPlaybackError } from \"./erroredAdverts\";\nimport { updatePlayedAdvertMedia, alreadyPlayedAdvertMedia } from \"./playedAdvertMedia\";\n\nconst chooseAdvert = ({ introsOutrosIndex, adverts, advertIndex, content = [], contentIndex, currentTime, atTheStart, atTheEnd, errored } = {}) => {\n const currentAdvert = adverts && adverts[advertIndex];\n\n x: if (currentAdvert) {\n if (errored) { updateErroredAdverts(currentAdvert); break x; } // Choose another advert.\n if (atTheEnd) { updatePlayedAdvertMedia(currentAdvert); return -1; } // Play the content.\n if (!atTheEnd) { return advertIndex; } // Keep playing the current advert until it ends.\n }\n\n if (!content[contentIndex]?.adsEnabled) { return -1; }\n if (introsOutrosIndex !== -1) { return -1; } // Wait until the intro/outro has finished.\n\n const placements = placementsThatCanPlay({ content, contentIndex, currentTime, atTheStart, atTheEnd });\n\n let bestSoFar = -1;\n let bestType = -Infinity;\n let bestRandom = -Infinity;\n\n for (const [thisIndex, advert] of adverts.entries()) {\n if (alreadyPlayedAdvertMedia(advert)) { continue; }\n if (resultedInAPlaybackError(advert)) { continue; }\n if (!placements.has(advert.placement)) { continue; }\n\n const thisType = typeScores[advert.type] || 0;\n if (thisType < bestType) { continue; }\n\n const thisRandom = Math.random();\n if (thisType === bestType && thisRandom < bestRandom) { continue; }\n\n bestSoFar = thisIndex;\n bestType = thisType;\n bestRandom = thisRandom;\n }\n\n return bestSoFar;\n};\n\nconst typeScores = { vast: 1, custom: 0 };\n\nconst placementsThatCanPlay = ({ content, contentIndex, currentTime, atTheStart, atTheEnd }) => {\n const isFirstItem = contentIndex === 0;\n const isLastItem = contentIndex === content.length - 1;\n\n const isPlaylist = content.length > 1;\n const isBetweenPlaylistItems = isPlaylist && atTheStart && !isFirstItem;\n\n const segments = content[contentIndex].segments;\n const lastSegment = segments[segments.length - 1];\n\n const midrollIndex = isPlaylist ? null : midrollSegmentIndex(segments);\n const midrollSegment = segments[midrollIndex];\n\n const isAfterMidroll = midrollSegment && currentTime > midrollSegment.startTime;\n const duration = lastSegment ? lastSegment.startTime + lastSegment.duration : 0;\n const closeToEnd = currentTime > duration - minimumTimeUntilEndForMidrollToPlay;\n\n const eligiblePlacements = new Set();\n\n if (atTheStart) { eligiblePlacements.add(\"pre-roll\"); }\n\n if (isAfterMidroll && !closeToEnd) { eligiblePlacements.add(\"mid-roll\"); }\n if (isBetweenPlaylistItems) { eligiblePlacements.add(\"mid-roll\"); }\n\n if (atTheEnd && isLastItem) { eligiblePlacements.add(\"post-roll\"); }\n if (isBetweenPlaylistItems) { eligiblePlacements.add(\"post-roll\"); }\n\n return eligiblePlacements;\n};\n\n// Don't play mid-roll adverts if the content duration is less than two minutes.\nconst minimumDurationForMidrollToPlay = 2 * 60;\n\n// Don't play mid-roll adverts if seeked to the last 10 seconds of content.\nconst minimumTimeUntilEndForMidrollToPlay = 10;\n\n// Play mid-roll adverts from segments starting after half-way time minus 0.5 seconds.\nconst halfWayTimeToleranceForMidroll = 0.5;\n\nconst midrollSegmentIndex = (segments) => {\n const lastSegment = segments[segments.length - 1];\n if (!lastSegment) { return; }\n\n const duration = lastSegment.startTime + lastSegment.duration;\n if (duration < minimumDurationForMidrollToPlay) { return; }\n\n const halfWayTime = duration / 2;\n const halfWayIndex = findSegmentIndex(segments, duration / 2);\n\n const startTime = segments[halfWayIndex].startTime;\n const isHalfWay = startTime >= halfWayTime - halfWayTimeToleranceForMidroll;\n\n const midrollIndex = isHalfWay ? halfWayIndex : halfWayIndex + 1;\n if (midrollIndex === segments.length) { return; }\n\n return midrollIndex;\n};\n\nexport default chooseAdvert;\n","import { resultedInAPlaybackError } from \"./erroredAdverts\";\n\nconst choosePersistentAdvert = (persistentAdImage, persistentIndex, advertIndex, adverts) => {\n let bestSoFar = -1;\n let bestMatch = -Infinity;\n let bestPlacement = -Infinity;\n\n for (const [thisIndex, advert] of (adverts || []).entries()) {\n if (!persistentAdImage) { continue; }\n if (resultedInAPlaybackError(advert)) { continue; }\n if (advert.type === \"vast\") { continue; }\n\n const thisMatch = matchScore(thisIndex, persistentIndex, advertIndex);\n if (thisMatch < bestMatch) { continue; }\n\n const thisPlacement = placementScores[advert.placement] || 0;\n if (thisMatch === bestMatch && thisPlacement < bestPlacement) { continue; }\n\n bestSoFar = thisIndex;\n bestMatch = thisMatch;\n bestPlacement = thisPlacement;\n }\n\n return bestSoFar;\n};\n\nconst placementScores = { \"pre-roll\": 2, \"mid-roll\": 1 };\n\nconst matchScore = (thisIndex, persistentIndex, advertIndex) => {\n if (thisIndex === advertIndex) { return 2; }\n if (thisIndex === persistentIndex) { return 1; }\n\n return 0;\n};\n\nexport default choosePersistentAdvert;\n","const erroredIntrosOutros = { mediaSources: new Set() };\n\nconst updateErroredIntrosOutros = (introOutro) => {\n for (const media of [...(introOutro.audio || []), (introOutro.video || [])]) {\n erroredIntrosOutros.mediaSources.add(media.url);\n }\n};\n\nconst resultedInAPlaybackError = (introOutro) => {\n for (const media of [...(introOutro.audio || []), (introOutro.video || [])]) {\n if (erroredIntrosOutros.mediaSources.has(media.url)) { return true; }\n }\n\n return false;\n};\n\nexport default erroredIntrosOutros;\nexport { updateErroredIntrosOutros, resultedInAPlaybackError };\n","// This state is shared across all player instances so that the same intro/outro\n// plays again in any player to keep the experience consistent.\n\nconst playedIntroOutroMedia = new Set();\n\nconst updatePlayedIntroOutroMedia = (introOutro) => {\n const media = [...(introOutro.audio || []), ...(introOutro.video || [])];\n media.forEach(m => playedIntroOutroMedia.add(m.url));\n};\n\nconst alreadyPlayedIntroOutroMedia = (introOutro) => {\n const media = [...(introOutro.audio || []), ...(introOutro.video || [])];\n return media.some(m => playedIntroOutroMedia.has(m.url));\n};\n\nexport default playedIntroOutroMedia;\nexport { updatePlayedIntroOutroMedia, alreadyPlayedIntroOutroMedia };\n","import { updateErroredIntrosOutros, resultedInAPlaybackError } from \"./erroredIntrosOutros\";\nimport { updatePlayedIntroOutroMedia, alreadyPlayedIntroOutroMedia } from \"./playedIntroOutroMedia\";\n\nconst chooseIntroOutro = ({ introsOutros = [], introsOutrosIndex, advertIndex, content, contentIndex, currentTime, atTheStart, atTheEnd, errored }) => {\n const currentIntroOutro = introsOutros[introsOutrosIndex];\n\n x: if (currentIntroOutro) {\n if (errored) { updateErroredIntrosOutros(currentIntroOutro); break x; } // Choose another intro/outro.\n if (atTheEnd) { updatePlayedIntroOutroMedia(currentIntroOutro); return -1; } // Play the advert/content.\n if (!atTheEnd) { return introsOutrosIndex; } // Keep playing the current intro/outro until it ends.\n }\n\n if (advertIndex !== -1) { return -1; } // Wait until the advert has finished.\n\n const placements = placementsThatCanPlay({ content, contentIndex, currentTime, atTheStart, atTheEnd });\n\n let bestSoFar = -1;\n let bestPlayed = -Infinity;\n let bestRandom = -Infinity;\n\n for (const [thisIndex, introOutro] of introsOutros.entries()) {\n if (resultedInAPlaybackError(introOutro)) { continue; }\n if (!placements.has(introOutro.placement)) { continue; }\n\n const thisPlayed = alreadyPlayedIntroOutroMedia(introOutro) ? 1 : 0;\n if (thisPlayed < bestPlayed) { continue; }\n\n const thisRandom = Math.random();\n if (thisPlayed === bestPlayed && thisRandom < bestRandom) { continue; }\n\n bestSoFar = thisIndex;\n bestPlayed = thisPlayed;\n bestRandom = thisRandom;\n }\n\n return bestSoFar;\n};\n\nconst placementsThatCanPlay = ({ content, contentIndex, currentTime, atTheStart, atTheEnd }) => {\n const eligiblePlacements = new Set();\n\n const atTheStartOfAllContent = atTheStart && contentIndex === 0 && currentTime === 0;\n const atTheEndOfAllContent = atTheEnd && contentIndex === content.length - 1;\n\n if (atTheStartOfAllContent) { eligiblePlacements.add(\"pre-roll\"); }\n if (atTheEndOfAllContent) { eligiblePlacements.add(\"post-roll\"); }\n\n return eligiblePlacements;\n};\n\nexport default chooseIntroOutro;\n","const chooseMediaSession = (Player) => {\n if (!navigator.mediaSession) { return; }\n\n const allowOverride = Player.instances().some(p => p.mediaSession === \"override\");\n if (websiteHasSetTheMediaSession() && !allowOverride) { return; }\n\n let bestSoFar;\n let bestState = -Infinity;\n let bestShowing = -Infinity;\n\n for (const player of Player.instances()) {\n if (player.mediaSession === \"none\") { continue; }\n\n const thisState = stateScores[player.playbackState] || 0;\n if (thisState < bestState) { continue; }\n\n const thisShowing = showingScores[player.showMediaSession] || 0;\n if (thisState === bestState && thisShowing < bestShowing) { continue; }\n\n bestSoFar = player;\n bestState = thisState;\n bestShowing = thisShowing;\n }\n\n for (const player of Player.instances()) {\n player.showMediaSession = player === bestSoFar;\n }\n\n return bestSoFar;\n};\n\nconst stateScores = { playing: 1, paused: 0, stopped: 0 };\nconst showingScores = { true: 1, false: 0 };\n\nconst websiteHasSetTheMediaSession = () => {\n const metadata = navigator.mediaSession.metadata;\n if (!metadata || navigator.mediaSession.setByPlayer) { return false; }\n\n const { title, artist, album, artwork } = metadata;\n return title || artist || album || artwork?.length;\n};\n\nexport default chooseMediaSession;\n","import { knownPlayerStyle } from \"./playerStyles\";\n\nconst chooseWidget = (Player) => {\n let somePlayerIsVisible = false;\n\n let bestSoFar;\n let bestState = -Infinity;\n let bestY = -Infinity;\n\n for (const player of Player.instances()) {\n if (!player.userInterface) { continue; }\n if (player.widgetTarget) { continue; }\n\n const knownStyle = knownPlayerStyle(player.widgetStyle);\n if (!knownStyle) { continue; }\n\n const withinViewport = player.userInterface.isVisible;\n if (withinViewport) { somePlayerIsVisible = true; continue; }\n\n const aboveViewport = player.userInterface.relativeY < 0;\n if (!aboveViewport) { continue; }\n\n const thisState = stateScores[player.playbackState] || 0;\n if (thisState < bestState) { continue; }\n\n const thisY = player.userInterface.absoluteY;\n if (thisState === bestState && thisY < bestY) { continue; }\n\n bestSoFar = player;\n bestState = thisState;\n bestY = thisY;\n }\n\n if (somePlayerIsVisible && bestState === 0) {\n bestSoFar = null;\n }\n\n for (const player of Player.instances()) {\n player.showBottomWidget = player === bestSoFar;\n }\n};\n\nconst stateScores = { playing: 2, paused: 1, stopped: 0 };\n\nexport default chooseWidget;\n","import { validateEventBeforeProcessing, validateEventAfterProcessing } from \"../helpers/eventValidation\";\nimport { requestFullScreen, exitFullScreen, fullScreenElement } from \"../helpers/fullScreen\";\nimport { v4 as randomUuid } from \"uuid\";\nimport waitUntil from \"../helpers/waitUntil\";\nimport throwError from \"../helpers/throwError\";\nimport setPropsFromApi from \"../helpers/setPropsFromApi\";\nimport findSegmentIndex from \"../helpers/findSegmentIndex\";\nimport settableProps from \"../helpers/settableProps\";\nimport diffObject from \"../helpers/diffObject\";\nimport sectionEnabled from \"../helpers/sectionEnabled\";\nimport downloadFile from \"../helpers/downloadFile\";\nimport chooseAdvert from \"../helpers/chooseAdvert\";\nimport choosePersistentAdvert from \"../helpers/choosePersistentAdvert\";\nimport chooseIntroOutro from \"../helpers/chooseIntroOutro\";\nimport chooseMediaSession from \"../helpers/chooseMediaSession\";\nimport chooseWidget from \"../helpers/chooseWidget\";\n\nclass RootController {\n constructor(player, PlayerClass) {\n this.player = player;\n this.PlayerClass = PlayerClass;\n this.eventListeners = { \"<any>\": {} };\n }\n\n addEventListener(eventType, callback) {\n const knownType = eventType === \"<any>\" || this[`handle${eventType}`];\n if (!knownType) { throwError(`Cannot add listener for unknown event type '${eventType}'.`); }\n\n const listenerHandle = `listener-handle-${randomUuid()}`;\n\n this.eventListeners[eventType] = this.eventListeners[eventType] || {};\n this.eventListeners[eventType][listenerHandle] = callback;\n\n return listenerHandle;\n }\n\n removeEventListener(eventType, listenerHandle) {\n this.eventListeners[eventType] = this.eventListeners[eventType] || {};\n delete this.eventListeners[eventType][listenerHandle];\n }\n\n async processEvent(event) {\n await waitUntil(() => this.player);\n validateEventBeforeProcessing(event);\n\n const handler = this[`handle${event.type}`];\n const propsBefore = settableProps(this.player);\n\n if (this.#ignoreDueToAdvert(event)) {\n event.status = \"ignored-due-to-advert\";\n } else if (this.#ignoreDueToScrubbing(event)) {\n event.status = \"ignored-due-to-scrubbing\";\n } else if (handler) {\n await handler.call(this, event);\n\n // Defer playback of intros/outros/adverts until the user presses play so\n // that the user interface shows the content rather than the interstitial.\n this.#playDeferredIntroOutro();\n this.#playDeferredAdvert();\n\n event.status = \"handled\";\n } else {\n throwError(\"No handler function for event.\", event);\n }\n\n const propsAfter = settableProps(this.player);\n\n event.changedProps = diffObject(propsBefore, propsAfter);\n event.processedAt = new Date().toISOString();\n\n validateEventAfterProcessing(event);\n\n this.#sendEventToListeners(event.type, event);\n this.#sendEventToListeners(\"<any>\", event);\n }\n\n // Please document all events and keep in-sync with /doc/player-events.md\n\n handlePressedChangeSpeed() { this.#setSpeed(i => i + 1, { cycle: true }); }\n handlePressedEnterOnChangeSpeed() { this.#setSpeed(i => i + 1, { cycle: true }); }\n handlePressedSpaceOnChangeSpeed() { this.#setSpeed(i => i + 1, { cycle: true }); }\n handlePressedUpOnChangeSpeed() { this.#setSpeed(i => i + 1); }\n handlePressedRightOnChangeSpeed() { this.#setSpeed(i => i + 1); }\n handlePressedDownOnChangeSpeed() { this.#setSpeed(i => i - 1); }\n handlePressedLeftOnChangeSpeed() { this.#setSpeed(i => i - 1); }\n\n handlePressedPrevSegment() { this.#setSegment(i => i - 1); }\n handlePressedNextSegment() { this.#setSegment(i => i + 1); }\n\n handlePressedSeekBack({ seconds }) { this.#setTime(t => t - seconds); }\n handlePressedSeekAhead({ seconds }) { this.#setTime(t => t + seconds); }\n handlePressedPrevTrack() { this.#setTrack(i => i - 1); }\n handlePressedNextTrack() { this.#setTrack(i => i + 1); }\n\n handlePressedAdvertLink() { /* Do nothing */ }\n handlePressedAdvertButton() { /* Do nothing */ }\n handlePressedAdvertImage() { /* Do nothing */ }\n handlePressedAdvertVideo() { /* Do nothing */ }\n handlePressedBeyondWords() { /* Do nothing */ }\n handlePressedSourceUrl() { /* Do nothing */ }\n\n handleDurationUpdated() { /* Do nothing */ }\n handleMediaLoaded({ loadedMedia }) { this.player.loadedMedia = loadedMedia; }\n handlePlaybackRateUpdated() { /* Do nothing */ }\n\n handleVisibilityChanged() { chooseWidget(this.PlayerClass); }\n\n handlePressedVideoBackground() { this.#playOrPause(); }\n handlePressedEnterOnProgressBar() { this.#playOrPause(); }\n handlePressedSpaceOnProgressBar() { this.#playOrPause(); }\n handlePressedEnterOnProgressCircle() { this.#playOrPause(); }\n handlePressedSpaceOnProgressCircle() { this.#playOrPause(); }\n\n handlePressedLeftOnProgressBar() { this.#setTime(t => t - 5); }\n handlePressedRightOnProgressBar() { this.#setTime(t => t + 5); }\n handlePressedLeftOnProgressCircle() { this.#setTime(t => t - 5); }\n handlePressedRightOnProgressCircle() { this.#setTime(t => t + 5); }\n\n handlePressedProgressBar({ ratio }) {\n this.preScrubState = this.player.playbackState;\n this.#pauseIfPlaying();\n this.#setTime((_, duration) => ratio * duration);\n if (ratio !== 0) { this.segmentPlayed = true; }\n }\n\n handleScrubbedProgressBar({ ratio }) {\n this.#setTime((_, duration) => ratio * duration);\n if (ratio !== 0) { this.segmentPlayed = true; }\n }\n\n handleFinishedScrubbingProgressBar() {\n this.player.playbackState = this.preScrubState;\n setTimeout(() => delete this.preScrubState, 500);\n }\n\n handleIdentifiersChanged() {\n setPropsFromApi(this.player).then(() => {\n this.#chooseAndSetIntroOutro({ atTheStart: true });\n this.#chooseAndSetAdvert({ atTheStart: true });\n });\n }\n\n handleNoContentAvailable({ description }) {\n console.warn(`BeyondWords.Player: ${description}`);\n }\n\n handlePressedPlay({ emittedFrom, widgetSegment, widgetIsCurrent }) {\n if (emittedFrom === \"segment-widget\" && !widgetIsCurrent) {\n this.#playFromSegment(widgetSegment);\n } else {\n this.player.playbackState = \"playing\";\n }\n }\n\n handlePressedPause() {\n this.player.playbackState = \"paused\";\n }\n\n handlePlaybackPlaying() {\n const otherPlayers = this.PlayerClass.instances().filter(p => p !== this.player);\n const playingPlayers = otherPlayers.filter(p => p.playbackState === \"playing\");\n\n playingPlayers.forEach(p => p.playbackState = \"paused\");\n chooseMediaSession(this.PlayerClass);\n }\n\n handlePlaybackPaused() {\n const isPlaying = this.player.playbackState === \"playing\";\n const atTheEnd = this.player.currentTime >= this.player.duration;\n\n // If you bypass the player SDK and call video.pause() on the HTML element,\n // update the state so the UI is correct. This can happen when a phone call.\n if (isPlaying && !atTheEnd && !this.preScrubState) { this.player.playbackState = \"paused\"; }\n }\n\n handleCurrentTimeUpdated() {\n if (!this.midrollPlayed) { this.#chooseAndSetAdvert(); }\n\n const atTheStart = this.player.currentTime <= 0;\n const atTheEnd = this.player.currentTime >= this.player.duration;\n const videoPaused = this.player.mediaElement.video.paused;\n\n if (!atTheStart && !atTheEnd && !videoPaused) { this.player.playbackState = \"playing\"; }\n }\n\n handlePlaybackEnded() {\n if (this.#isMidrollAdvert()) { this.midrollPlayed = true; }\n this.segmentPlayed = false;\n\n const wasIntro = this.#isIntro();\n const wasAdvert = this.#isAdvert();\n\n this.#chooseAndSetAdvert({ atTheEnd: true, wasIntro });\n if (wasAdvert) { return; } // Don't skip track because the content hasn't played yet.\n\n this.#chooseAndSetIntroOutro({ atTheEnd: true });\n if (wasIntro) { return; } // Don't skip track because the content/advert hasn't played yet.\n\n if (this.#isOutro() || this.#isAdvert()) { return; } // Don't skip track until post-roll has played.\n\n this.#setTrack(i => i + 1);\n }\n\n handlePlaybackNotAllowed({ description }) {\n console.warn(`BeyondWords.Player: ${description}`);\n\n const atTheStart = this.player.contentIndex <= 0 && this.player.currentTime <= 0;\n this.player.playbackState = atTheStart ? \"stopped\" : \"paused\";\n }\n\n handlePlaybackErrored({ mediaType, errorMessage }) {\n console.warn(`BeyondWords.Player: ${mediaType} playback error: ${errorMessage}`);\n\n if (this.#isIntro() || this.#isOutro()) {\n this.#chooseAndSetIntroOutro({ errored: true }); // TODO: how to pass atTheStart, atTheEnd?\n } else if (this.#isAdvert()) {\n this.#chooseAndSetAdvert({ errored: true }); // TODO: how to pass atTheStart, atTheEnd?\n } else {\n this.handlePlaybackEnded();\n }\n }\n\n handlePressedMaximize() {\n if (fullScreenElement()) {\n exitFullScreen();\n } else {\n requestFullScreen(this.player.target);\n }\n }\n\n handleFullScreenModeUpdated() {\n const isFullScreen = fullScreenElement() === this.player.target;\n const addOrRemove = isFullScreen ? \"add\" : \"remove\";\n\n this.player.isFullScreen = isFullScreen;\n this.player.target.classList[addOrRemove](\"maximized\");\n }\n\n handlePressedPlaylistItem({ index }) {\n this.#setTrack(() => index);\n this.player.playbackState = \"playing\";\n }\n\n handlePressedTogglePlaylist() {\n const parts = this.player.playlistStyle.split(\"-\");\n\n const isPlaylist = this.player.content.length > 1;\n const isShowing = parts[0] === \"show\" || parts[0] === \"auto\" && isPlaylist;\n\n parts[0] = isShowing ? \"hide\" : \"show\";\n this.player.playlistStyle = parts.join(\"-\");\n }\n\n handlePressedDownload({ contentIndex, audioIndex, videoIndex }) {\n const contentItem = this.player.content[contentIndex];\n\n const audioItem = contentItem.audio?.[audioIndex];\n const videoItem = contentItem.video?.[videoIndex];\n\n const mediaUrl = (audioItem || videoItem).url;\n\n const extension = mediaUrl.split(\".\").pop();\n const filename = `${contentItem.title}.${extension}`;\n\n return downloadFile(mediaUrl, filename);\n }\n\n handlePressedCloseWidget() {\n for (const player of this.PlayerClass.instances()) {\n player.playbackState = \"paused\";\n player.widgetStyle = \"closed-by-user\";\n }\n }\n\n handleContentStatusChanged({ contentId, legacyId, sourceId, sourceUrl, contentStatus }) {\n if (contentStatus !== \"processed\") { return; }\n\n // Only reload if listening hasn't started yet so that audio isn't interrupted.\n if (this.player.playbackState !== \"stopped\") { return; }\n if (this.player.contentIndex !== 0) { return; }\n if (this.player.currentTime !== 0) { return; }\n\n // The websocket sends status changes for all content in the project so check\n // that this event is for a content item that is one of the player's identifiers.\n if (!this.#matchesIdentifiers({ contentId, legacyId, sourceId, sourceUrl })) { return; }\n\n setPropsFromApi(this.player).then(() => {\n this.#chooseAndSetIntroOutro({ atTheStart: true });\n this.#chooseAndSetAdvert({ atTheStart: true });\n });\n }\n\n handleCurrentSegmentUpdated({ segment, segmentIndex, contentIndex }) {\n if (this.#isContent()) {\n this.player.currentSegment = { ...segment, segmentIndex, contentIndex };\n } else if (!this.segmentPlayed) {\n this.player.segmentContainers?.reset();\n this.player.currentSegment = null;\n }\n }\n\n handleHoveredSegmentUpdated({ segment, segmentIndex, contentIndex }) {\n if (segment) {\n this.player.hoveredSegment = { ...segment, segmentIndex, contentIndex };\n } else {\n this.player.hoveredSegment = null;\n }\n }\n\n handlePressedSegment({ segment, segmentIndex, contentIndex }) {\n const enabled = sectionEnabled(\"hovered\", segment, this.player.clickableSections);\n if (!enabled) { return; }\n\n const hasChanged = this.#currentSegmentChanged({ contentIndex, segmentIndex });\n if (!hasChanged && !this.#isAdvert()) { this.#playOrPause(); return; }\n\n const changeTrack = contentIndex !== this.player.contentIndex;\n if (changeTrack) { this.#setTrack(() => contentIndex); }\n\n this.#playFromSegment({ segmentIndex, contentIndex, ...segment });\n }\n\n // private\n\n #ignoreDueToAdvert({ type }) {\n return this.#isAdvert() && (\n type.includes(\"ChangeSpeed\") ||\n type.includes(\"PrevSegment\") ||\n type.includes(\"NextSegment\") ||\n type.includes(\"SeekBack\") ||\n type.includes(\"SeekAhead\") ||\n type.includes(\"Progress\") && !type.includes(\"Space\") && !type.includes(\"Enter\")\n );\n }\n\n #ignoreDueToScrubbing({ type }) {\n return this.preScrubState && (\n type.includes(\"CurrentTimeUpdated\") ||\n type.includes(\"PlaybackEnded\")\n );\n }\n\n #sendEventToListeners(eventType, event) {\n const typeListeners = this.eventListeners[eventType] || {};\n Object.values(typeListeners).forEach(f => f(event));\n }\n\n #hasIntro() {\n return this.player.introsOutros.some(o => o.placement === \"pre-roll\");\n }\n\n #hasOutro() {\n return this.player.introsOutros.some(o => o.placement === \"post-roll\");\n }\n\n #isIntro(index = this.player.introsOutrosIndex) {\n return this.player?.introsOutros?.[index]?.placement === \"pre-roll\";\n }\n\n #isOutro(index = this.player.introsOutrosIndex) {\n return this.player?.introsOutros?.[index]?.placement === \"post-roll\";\n }\n\n #isAdvert() {\n return this.player.advertIndex !== -1;\n }\n\n #isMidrollAdvert() {\n return this.player.adverts[this.player.advertIndex]?.placement === \"mid-roll\";\n }\n\n #isContent() {\n return !this.#isIntro() && !this.#isOutro() && !this.#isAdvert();\n }\n\n #playOrPause() {\n if (this.player.playbackState === \"playing\") {\n this.player.playbackState = \"paused\";\n } else {\n this.player.playbackState = \"playing\";\n }\n }\n\n #pauseIfPlaying() {\n if (this.player.playbackState === \"playing\") {\n this.player.playbackState = \"paused\";\n }\n }\n\n #playFromSegment({ segmentIndex, contentIndex, ...segment }) {\n this.#setTime(() => segment.startTime, contentIndex);\n this.player.currentSegment = { segmentIndex, contentIndex, ...segment };\n this.player.playbackState = \"playing\";\n this.segmentPlayed = true;\n }\n\n #setSpeed(indexFn, { cycle } = {}) {\n const playbackRates = this.player.playbackRates;\n const maxIndex = playbackRates.length - 1;\n\n const currentIndex = playbackRates.indexOf(this.player.playbackRate);\n const tryIndex = indexFn(currentIndex);\n\n let updatedIndex;\n\n if (cycle) {\n updatedIndex = tryIndex % playbackRates.length;\n } else {\n updatedIndex = Math.max(0, Math.min(maxIndex, tryIndex));\n }\n\n this.player.playbackRate = playbackRates[updatedIndex] || 1;\n }\n\n #setSegment(indexFn) {\n const segments = this.player.content[this.player.contentIndex].segments;\n\n const currentIndex = findSegmentIndex(segments, this.player.currentTime);\n const tryIndex = indexFn(currentIndex);\n\n // If the user clicks next during the intro, skip to the content.\n if (this.#isIntro() && tryIndex >= 0) {\n this.handlePlaybackEnded();\n\n // If the user clicks previous during the outro, skip back to the last segment.\n // Set 0.01 to ensure the intro doesn't play again if there are no segments.\n } else if (this.#isOutro() && tryIndex < 0) {\n this.#setIntroOutro(-1);\n this.#setTime(() => segments[segments.length - 1]?.startTime || 0.01);\n this.player.playbackState = \"playing\";\n\n // If the user clicks previous on the first segment, skip back to the intro.\n } else if (this.#isContent() && tryIndex < 0 && this.#hasIntro()) {\n this.#setTime(() => 0);\n this.#chooseAndSetIntroOutro({ atTheStart: true });\n\n // If the user clicks next on the last segment, play the outro.\n } else if (this.#isContent() && tryIndex === segments.length && this.#hasOutro()) {\n this.#setTime(() => this.player.duration - 0.01);\n\n // Otherwise, set the time to the startTime of the segment.\n } else if (this.#isContent() && tryIndex >= 0 && tryIndex < segments.length) {\n this.#setTime(() => segments[tryIndex].startTime);\n }\n }\n\n #setTrack(indexFn) {\n const tryIndex = indexFn(this.player.contentIndex);\n const outOfBounds = tryIndex < 0 || tryIndex >= this.player.content.length;\n\n if (outOfBounds) {\n this.player.playbackState = \"stopped\";\n this.#setTime(() => 0);\n } else {\n this.player.contentIndex = tryIndex;\n\n if (!this.#isAdvert()) {\n this.#setTime(() => 0);\n this.midrollPlayed = false;\n }\n }\n\n this.#setIntroOutro(-1);\n this.#chooseAndSetIntroOutro({ atTheStart: true });\n\n // Avoid playing back-to-back adverts: post-roll at the end of content\n // followed by pre-roll at the start when content is replayed by the user.\n if (!outOfBounds) {\n this.#chooseAndSetAdvert({ atTheStart: true });\n }\n }\n\n #setTime(timeFn, contentIndex) {\n if (this.#isAdvert()) {\n this.prevTime = timeFn();\n this.prevContent = contentIndex;\n } else {\n const duration = this.player.duration || 0;\n this.player.currentTime = timeFn(this.player.currentTime, duration);\n }\n }\n\n #chooseAndSetIntroOutro({ atTheStart, atTheEnd, errored } = {}) {\n const { content, introsOutros, currentTime } = this.player;\n\n const introsOutrosIndex = typeof this.nextIntroOutro !== \"undefined\" ? this.nextIntroOutro : this.player.introsOutrosIndex;\n const advertIndex = typeof this.nextAdvert !== \"undefined\" ? this.nextAdvert : this.player.advertIndex;\n const contentIndex = typeof this.prevContent !== \"undefined\" ? this.prevContent : this.player.contentIndex;\n\n this.#setIntroOutro(chooseIntroOutro({ introsOutros, introsOutrosIndex, advertIndex, content, contentIndex, currentTime, atTheStart, atTheEnd, errored }));\n }\n\n #chooseAndSetAdvert({ atTheStart, atTheEnd, wasIntro, errored } = {}) {\n const { adverts, content, currentTime } = this.player;\n\n let introsOutrosIndex = typeof this.nextIntroOutro !== \"undefined\" ? this.nextIntroOutro : this.player.introsOutrosIndex;\n const advertIndex = typeof this.nextAdvert !== \"undefined\" ? this.nextAdvert : this.player.advertIndex;\n const contentIndex = typeof this.prevContent !== \"undefined\" ? this.prevContent : this.player.contentIndex;\n\n if (wasIntro) { atTheStart = true; atTheEnd = false; introsOutrosIndex = -1; } // Choose from pre-roll advert placements after the intro.\n this.#setAdvert(chooseAdvert({ introsOutrosIndex, adverts, advertIndex, content, contentIndex, currentTime, atTheStart, atTheEnd, errored }));\n\n const persistentAdImage = this.player.persistentAdImage;\n const persistentIndex = this.player.persistentIndex;\n\n this.player.persistentIndex = choosePersistentAdvert(persistentAdImage, persistentIndex, advertIndex, adverts);\n }\n\n #playDeferredIntroOutro() {\n if (this.player.playbackState !== \"playing\") { return; }\n if (typeof this.nextIntroOutro === \"undefined\") { return; }\n\n this.#setIntroOutro(this.nextIntroOutro);\n delete this.nextIntroOutro;\n }\n\n #playDeferredAdvert() {\n if (this.player.playbackState !== \"playing\") { return; }\n if (typeof this.nextAdvert === \"undefined\") { return; }\n\n this.#setAdvert(this.nextAdvert);\n delete this.nextAdvert;\n }\n\n #setIntroOutro(index) {\n const defer = this.player.playbackState !== \"playing\" && index !== -1;\n if (defer) { this.nextIntroOutro = index; return; } else { delete this.nextIntroOutro; }\n\n const atTheStart = this.player.contentIndex <= 0 && this.player.currentTime <= 0;\n const skippedIntro = !atTheStart && this.#isIntro(index);\n\n // We were at the start and were going to play an intro but the user skipped\n // past it so clear the index and check if an advert should now play.\n if (skippedIntro) {\n this.player.introsOutrosIndex = -1;\n this.#chooseAndSetAdvert({ atTheStart: true });\n return;\n }\n\n const wasIntro = this.#isIntro();\n const wasOutro = this.#isOutro();\n\n this.player.introsOutrosIndex = index;\n\n const introFinished = wasIntro && !this.#isIntro();\n const outroFinished = wasOutro && !this.#isOutro();\n\n if (introFinished) { this.player.currentTime = 0; }\n if (outroFinished) { this.#setTrack(() => Infinity); }\n }\n\n #setAdvert(index) {\n const defer = this.player.playbackState !== \"playing\" && index !== -1;\n if (defer) { this.nextAdvert = index; return; } else { delete this.nextAdvert; }\n\n const wasAdvert = this.#isAdvert();\n this.player.advertIndex = index;\n\n const advertsStarted = !wasAdvert && this.#isAdvert();\n const advertsFinished = wasAdvert && !this.#isAdvert();\n\n if (advertsStarted) { this.#overridePlayerState(); }\n if (advertsFinished) { this.#restorePlayerState(); }\n }\n\n #overridePlayerState() {\n if (!this.#isIntro()) { this.prevTime = this.player.currentTime; }\n\n this.prevRate = this.player.playbackRate;\n this.prevContent = this.player.contentIndex;\n\n this.player.currentTime = 0;\n this.player.playbackRate = 1;\n }\n\n #restorePlayerState() {\n this.player.playbackRate = this.prevRate || 1;\n\n const trackChanged = this.player.contentIndex !== this.prevContent;\n if (!trackChanged) { this.player.currentTime = this.prevTime; }\n\n delete this.prevTime;\n delete this.prevRate;\n delete this.prevContent;\n }\n\n #matchesIdentifiers({ contentId, legacyId, sourceId, sourceUrl }) {\n return this.player.contentId === contentId ||\n this.player.contentId === legacyId ||\n this.player.sourceId === sourceId ||\n this.player.sourceUrl === sourceUrl ||\n this.player.playlist?.some(o => o.contentId === contentId) ||\n this.player.playlist?.some(o => o.contentId === legacyId) ||\n this.player.playlist?.some(o => o.sourceId === sourceId) ||\n this.player.playlist?.some(o => o.sourceUrl === sourceUrl);\n }\n\n #currentSegmentChanged({ contentIndex, segmentIndex }) {\n return (\n this.player.currentSegment?.contentIndex !== contentIndex ||\n this.player.currentSegment?.segmentIndex !== segmentIndex\n );\n }\n}\n\nexport default RootController;\n","var UNKNOWN_FUNCTION = '<unknown>';\n/**\n * This parses the different stack traces and puts them into one format\n * This borrows heavily from TraceKit (https://github.com/csnover/TraceKit)\n */\n\nfunction parse(stackString) {\n var lines = stackString.split('\\n');\n return lines.reduce(function (stack, line) {\n var parseResult = parseChrome(line) || parseWinjs(line) || parseGecko(line) || parseNode(line) || parseJSC(line);\n\n if (parseResult) {\n stack.push(parseResult);\n }\n\n return stack;\n }, []);\n}\nvar chromeRe = /^\\s*at (.*?) ?\\(((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|\\/|[a-z]:\\\\|\\\\\\\\).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\nvar chromeEvalRe = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n\nfunction parseChrome(line) {\n var parts = chromeRe.exec(line);\n\n if (!parts) {\n return null;\n }\n\n var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n\n var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n\n var submatch = chromeEvalRe.exec(parts[2]);\n\n if (isEval && submatch != null) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = submatch[1]; // url\n\n parts[3] = submatch[2]; // line\n\n parts[4] = submatch[3]; // column\n }\n\n return {\n file: !isNative ? parts[2] : null,\n methodName: parts[1] || UNKNOWN_FUNCTION,\n arguments: isNative ? [parts[2]] : [],\n lineNumber: parts[3] ? +parts[3] : null,\n column: parts[4] ? +parts[4] : null\n };\n}\n\nvar winjsRe = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\nfunction parseWinjs(line) {\n var parts = winjsRe.exec(line);\n\n if (!parts) {\n return null;\n }\n\n return {\n file: parts[2],\n methodName: parts[1] || UNKNOWN_FUNCTION,\n arguments: [],\n lineNumber: +parts[3],\n column: parts[4] ? +parts[4] : null\n };\n}\n\nvar geckoRe = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\\[native).*?|[^@]*bundle)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nvar geckoEvalRe = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n\nfunction parseGecko(line) {\n var parts = geckoRe.exec(line);\n\n if (!parts) {\n return null;\n }\n\n var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n var submatch = geckoEvalRe.exec(parts[3]);\n\n if (isEval && submatch != null) {\n // throw out eval line/column and use top-most line number\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = null; // no column when eval\n }\n\n return {\n file: parts[3],\n methodName: parts[1] || UNKNOWN_FUNCTION,\n arguments: parts[2] ? parts[2].split(',') : [],\n lineNumber: parts[4] ? +parts[4] : null,\n column: parts[5] ? +parts[5] : null\n };\n}\n\nvar javaScriptCoreRe = /^\\s*(?:([^@]*)(?:\\((.*?)\\))?@)?(\\S.*?):(\\d+)(?::(\\d+))?\\s*$/i;\n\nfunction parseJSC(line) {\n var parts = javaScriptCoreRe.exec(line);\n\n if (!parts) {\n return null;\n }\n\n return {\n file: parts[3],\n methodName: parts[1] || UNKNOWN_FUNCTION,\n arguments: [],\n lineNumber: +parts[4],\n column: parts[5] ? +parts[5] : null\n };\n}\n\nvar nodeRe = /^\\s*at (?:((?:\\[object object\\])?[^\\\\/]+(?: \\[as \\S+\\])?) )?\\(?(.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\nfunction parseNode(line) {\n var parts = nodeRe.exec(line);\n\n if (!parts) {\n return null;\n }\n\n return {\n file: parts[2],\n methodName: parts[1] || UNKNOWN_FUNCTION,\n arguments: [],\n lineNumber: +parts[3],\n column: parts[4] ? +parts[4] : null\n };\n}\n\nexport { parse };\n","import * as stackTraceParser from \"stacktrace-parser\";\n\nlet called = false;\nlet prevOnError, prevOnReject;\n\nconst setErrorHandler = ({ onError }) => {\n if (!onError || called) { return; }\n called = true;\n\n const thisFilename = originFilename(new Error());\n const isDevelopment = thisFilename?.match(/setErrorHandler/); // Not minified.\n\n prevOnError = window.onerror;\n prevOnReject = window.onunhandledrejection;\n\n window.onerror = (message, errorFilename, lineNumber, columnNumber, error) => {\n const originatedFromPlayer = errorFilename === thisFilename;\n const isPlaybackError = error?.message?.match(/request was interrupted/);\n\n const handleError = isDevelopment || originatedFromPlayer || isPlaybackError;\n if (handleError) { if (onError(error)) { return true; } }\n\n prevOnError && prevOnError(message, errorFilename, lineNumber, columnNumber, error);\n };\n\n window.onunhandledrejection = (event) => {\n const error = event.reason;\n\n const originatedFromPlayer = originFilename(error) === thisFilename;\n const isPlaybackError = error?.message?.match(/request was interrupted/);\n\n const handleError = isDevelopment || originatedFromPlayer || isPlaybackError;\n if (handleError) { if (onError(error)) { event.preventDefault(); return; } }\n\n prevOnReject && prevOnReject(event);\n };\n};\n\nconst originFilename = (error) => (\n stackTraceParser.parse(error?.stack || \"\")[0]?.file\n);\n\nexport default setErrorHandler;\n","import throwError from \"./throwError\";\n\nconst validateWebContext = () => {\n if (typeof window !== \"undefined\") { return; }\n\n throwError([\n \"Trying to initialize BeyondWords.Player in a server context but this is unsupported.\",\n \"Please only initialize the player in a context where the global window object is available.\",\n \"For example, by initializing the player inside a useEffect hook in a React application.\",\n ]);\n};\n\nexport default validateWebContext;\n","import { dataAttribute } from \"./segmentHighlights\";\nimport newEvent from \"./newEvent\";\n\nlet called = false;\n\nconst listenToSegments = () => {\n if (called) { return; }\n called = true;\n\n addEventListener(\"mousedown\", handleMouseDown);\n addEventListener(\"click\", handleMouseUp);\n addEventListener(\"mousemove\", handleMouseMove);\n};\n\nconst handleMouseDown = (event) => {\n startX = event.pageX;\n startY = event.pageY;\n};\n\nconst handleMouseUp = (event) => {\n if (event.defaultPrevented) { return; }\n if (draggedMouse(event)) { return; }\n if (event.button !== 0) { return; }\n\n const marker = markerElement(event.target)?.getAttribute(dataAttribute);\n if (!marker) { return; }\n\n for (const player of BeyondWords.Player.instances()) {\n const { segment, contentIndex, segmentIndex } = chooseSegment(player, marker);\n if (!segment) { continue; }\n\n // TODO: if multiple players then prefer the one that's playing?\n\n player.onEvent(newEvent({\n type: \"PressedSegment\",\n description: \"The user pressed on a segment in the article.\",\n initiatedBy: \"user\",\n emittedFrom: \"segment\",\n segment,\n contentIndex,\n segmentIndex,\n }));\n }\n};\n\nconst handleMouseMove = (event) => {\n const target = document.elementFromPoint(event.clientX, event.clientY);\n const marker = markerElement(target)?.getAttribute(dataAttribute);\n\n // TODO: if multiple players?\n\n for (const [i, player] of BeyondWords.Player.instances().entries()) {\n const { segment, contentIndex, segmentIndex } = chooseSegment(player, marker);\n\n if (changed(i, contentIndex, segmentIndex)) {\n player.onEvent(newEvent({\n type: \"HoveredSegmentUpdated\",\n description: \"The user hovered over a different segment in the article.\",\n initiatedBy: \"user\",\n emittedFrom: \"segment\",\n segment,\n contentIndex,\n segmentIndex,\n }));\n }\n }\n};\n\nconst markerElement = (target) => {\n while (target && target.hasAttribute) {\n if (target.hasAttribute(dataAttribute)) { return target; }\n\n if (target.onclick || target.onmousedown) { return; }\n if (target.nodeName.toLowerCase() === \"a\") { return; }\n\n target = target.parentNode;\n }\n};\n\nconst chooseSegment = (player, marker) => {\n if (!marker) { return {}; }\n\n let bestSoFar = {};\n let bestContent = -Infinity;\n\n for (const [i, content] of (player.content || []).entries()) {\n for (const [j, segment] of (content.segments || []).entries()) {\n if (marker !== segment.marker) { continue; }\n\n // If the segment appears in the content more than once then choose the first\n // segment that matches the player's contentIndex to avoid changing tracks.\n const thisContent = player.contentIndex === i ? 1 : 0;\n if (thisContent < bestContent) { continue; }\n\n // If the marker appears in the segments more than once then choose the first\n // segment so that playback starts from the earliest segment.\n if (thisContent === bestContent && bestSoFar?.segment) { continue; }\n\n bestSoFar = { contentIndex: i, segmentIndex: j, segment };\n bestContent = thisContent;\n }\n }\n\n return bestSoFar;\n};\n\nlet startX, startY;\n\nconst draggedMouse = (event) => {\n const movedX = event.pageX - startX;\n const movedY = event.pageY - startY;\n\n const moved = Math.sqrt(movedX * movedX + movedY * movedY);\n return moved > 5;\n};\n\nconst previousIndexes = {};\n\nconst changed = (playerIndex, contentIndex, segmentIndex) => {\n previousIndexes[playerIndex] ||= {};\n const previous = previousIndexes[playerIndex];\n\n if (previous.contentIndex === contentIndex && previous.segmentIndex === segmentIndex) {\n return false;\n } else {\n previous.contentIndex = contentIndex;\n previous.segmentIndex = segmentIndex;\n return true;\n }\n};\n\nexport default listenToSegments;\n","import { postJson } from \"../helpers/fetchJson\";\n\nclass AnalyticsClient {\n constructor(analyticsSink) {\n this.analyticsSink = analyticsSink;\n }\n\n sendToCustomAnalytics(data) {\n return postJson(this.analyticsSink, data);\n }\n\n sendToGoogleAnalytics(eventName, data) {\n window.gtag(\"event\", eventName, { ...data, send_to: this.analyticsSink });\n }\n}\n\nexport default AnalyticsClient;\n","import AnalyticsClient from \"../api_clients/analyticsClient\";\nimport { validateAnalyticsEvent } from \"../helpers/eventValidation\";\nimport { v4 as randomUuid } from \"uuid\";\nimport { version } from \"../../package.json\";\n\nconst sendToAnalytics = (player, playerEvent) => {\n const eventType = analyticsEventType(player, playerEvent.type);\n if (!eventType) { return; }\n\n const analyticsEvent = eventFromProps(player, eventType);\n validateAnalyticsEvent(analyticsEvent);\n\n if (player.analyticsUrl && player.analyticsConsent !== \"none\") {\n const client = new AnalyticsClient(player.analyticsUrl);\n client.sendToCustomAnalytics(analyticsEvent);\n }\n\n if (player.analyticsCustomUrl && player.analyticsConsent !== \"none\") {\n const client = new AnalyticsClient(player.analyticsCustomUrl);\n client.sendToCustomAnalytics(analyticsEvent);\n }\n\n if (player.analyticsTag) {\n const client = new AnalyticsClient(player.analyticsTag);\n client.sendToGoogleAnalytics(gaEventName(analyticsEvent), analyticsEvent);\n }\n};\n\nconst analyticsEventType = (player, playerEventType) => {\n // Emit a 'load' event once only, even if the media changes.\n if (playerEventType === \"MediaLoaded\" && !player.listenSessionId) { return \"load\"; }\n\n // Emit a 'play' event after 'PlaybackPlaying' followed by 'CurrentTimeUpdated'.\n // Only emit for new listens, i.e. if the content/advert changed from what it was previously.\n if (playerEventType === \"PlaybackPlaying\" && isNewListen(player)) { player.isNewListen = true; }\n if (playerEventType === \"CurrentTimeUpdated\" && player.isNewListen) { player.isNewListen = false; return \"play\"; }\n\n // Emit a 'play_progress' event for each 10%, 20%, ..., 100% of playback reached.\n if (playerEventType === \"CurrentTimeUpdated\" && isNextPercentage(player)) { return \"play_progress\"; }\n\n // Emit an 'ad_link_click' event when you press on an advert link/button/image/video.\n if (playerEventType.startsWith(\"PressedAdvert\")) { return \"ad_link_click\"; }\n};\n\nconst eventFromProps = (player, analyticsEventType) => {\n player.listenSessionId ||= randomUuid();\n player.sessionCreatedAt ||= Date.now();\n\n const withoutStorage = [\"without-local-storage\", \"none\"].includes(player.analyticsConsent);\n if (!withoutStorage) { localStorage.beyondwords ||= JSON.stringify(randomUuid()); }\n\n const activeAdvert = player.adverts[player.advertIndex];\n const contentItem = player.content[player.contentIndex];\n const percentage = player.duration ? (player.currentTime / player.duration) * 100 : 0;\n\n return {\n event_type: analyticsEventType,\n device_type: deviceType(),\n media_type: activeAdvert ? \"ad\" : \"content\",\n project_id: player.projectId,\n content_id: contentItem?.id,\n source_id: contentItem?.sourceId,\n analytics_id: player.analyticsId,\n ad_id: activeAdvert?.id,\n media_id: player.loadedMedia?.id,\n media_format: player.loadedMedia?.format,\n local_storage_id: withoutStorage ? null : JSON.parse(localStorage.beyondwords),\n listen_session_id: player.listenSessionId,\n session_created_at: player.sessionCreatedAt,\n duration: player.duration,\n listen_length_seconds: player.currentTime,\n listen_length_percent: Math.max(0, Math.min(100, percentage)),\n speed: player.playbackRate,\n location: window.location.href,\n referrer: document.referrer,\n player_version: \"1\",\n player_npm_version: version,\n };\n};\n\nconst gaEventName = ({ event_type, listen_length_percent }) => {\n const percentage = Math.floor(listen_length_percent / 10) * 10;\n\n if (event_type === \"load\") { return \"Load\"; }\n if (event_type === \"play\") { return \"Play\"; }\n if (event_type === \"play_progress\" && percentage === 100) { return \"Complete\"; }\n if (event_type === \"play_progress\") { return `${percentage}% listened`; }\n if (event_type === \"ad_link_click\") { return \"Advert Click\"; }\n};\n\nconst isNewListen = (player) => {\n let changed = false;\n\n // Handle content/adverts separately so that we don't consider it a new listen\n // after mid-roll adverts, or if the same advert is played twice in a row.\n const isAdvert = player.advertIndex !== -1;\n\n if (isAdvert) {\n const advertId = player.adverts[player.advertIndex]?.id || player.advertIndex;\n changed = advertId !== player.prevAdvertId;\n player.prevAdvertId = advertId;\n } else {\n const contentId = player.content[player.contentIndex]?.id || player.contentIndex;\n changed = contentId !== player.prevContentId;\n player.prevContentId = contentId;\n }\n\n return changed;\n};\n\nconst isNextPercentage = (player) => {\n // We send 'play' events with media_type: 'content' when the intro is played\n // but we should not send 'play_progress' events during the intro/outro.\n if (player.introsOutrosIndex !== -1) { return; }\n\n const nextPercentage = player.prevPercentage + 10;\n const currentPercentage = (player.currentTime / player.duration) * 100;\n\n if (currentPercentage >= nextPercentage) {\n player.prevPercentage = Math.floor(currentPercentage / 10) * 10;\n return true;\n }\n};\n\nconst deviceType = () => {\n if (maxDeviceWidth(499)) { return \"phone\"; } // Return 'phone' for 0 <= width < 499\n if (maxDeviceWidth(999)) { return \"tablet\"; } // Return 'tablet' for 500 <= width < 1000\n\n return \"desktop\"; // Return 'desktop' for 1000 <= width\n};\n\nconst maxDeviceWidth = (pixels) => (\n window.matchMedia && window.matchMedia(`only screen and (max-device-width: ${pixels}px)`).matches\n);\n\nexport default sendToAnalytics;\n","import * as stackTraceParser from \"stacktrace-parser\";\nimport { version } from \"../../package.json\";\n\nconst relativeUrl = (filename) => {\n const error = new Error();\n const url = stackTraceParser.parse(error.stack || \"\")[0]?.file;\n\n if (!url) { console.warn(\"BeyondWords.Player: unable to load dependencies\"); return \"\"; }\n if (!filename) { return url; }\n\n const pinnedUrl = url.replaceAll(\"player@latest\", `player@${version}`);\n const relativeUrl = replaceFilename(pinnedUrl, filename);\n\n return relativeUrl;\n};\n\nconst replaceFilename = (url, filename) => {\n const parts = url.split(\"/\");\n parts[parts.length - 1] = filename;\n return parts.join(\"/\");\n};\n\nexport default relativeUrl;\n","import PlayerComponent from \"./components/Player.svelte\";\nimport RootController from \"./controllers/rootController\";\nimport setErrorHandler from \"./helpers/setErrorHandler\";\nimport validateWebContext from \"./helpers/validateWebContext\";\nimport listenToSegments from \"./helpers/listenToSegments\";\nimport resolveTarget from \"./helpers/resolveTarget\";\nimport sendToAnalytics from \"./helpers/sendToAnalytics\";\nimport throwError from \"./helpers/throwError\";\nimport relativeUrl from \"./helpers/relativeUrl\";\nimport { version } from \"../package.json\";\n\nclass Player extends PlayerComponent {\n static #instances = [];\n\n constructor({ target, ...props }) {\n validateWebContext();\n setErrorHandler(props);\n listenToSegments();\n\n const { newTarget, showUserInterface } = resolveTarget(target);\n newTarget.classList.add(\"beyondwords-player\", \"bwp\");\n\n const controller = new RootController(null, Player);\n controller.addEventListener(\"<any>\", e => sendToAnalytics(this, e));\n\n const initialProps = { showUserInterface, ...props };\n super({ target: newTarget, props: { controller, ...initialProps, initialProps } });\n\n controller.player = this;\n Player.#instances.push(this);\n }\n\n static get version() {\n return version;\n }\n\n static get scriptSrc() {\n return relativeUrl();\n }\n\n static get styleSrc() {\n return relativeUrl(\"style.js\");\n }\n\n static get hlsSrc() {\n return relativeUrl(\"hls.light.min.js\");\n }\n\n static instances() {\n return [...Player.#instances];\n }\n\n static destroyAll() {\n Player.#instances.forEach(p => p.destroy());\n }\n\n destroy() {\n this.$destroy();\n Player.#instances = Player.#instances.filter(p => p !== this);\n }\n\n get target() {\n return this.$$.root;\n }\n\n set target(target) {\n throwError([\n \"Unable to change the player's target after initialization.\",\n \"Call player.destroy() and initialize a new player, instead.\",\n \"\",\n \"Alternatively, you can show or hide the player with:\",\n \"player.showUserInterface = <bool>\",\n ]);\n }\n}\n\nif (typeof window !== \"undefined\") {\n window.BeyondWords ||= {};\n window.BeyondWords.Player ||= Player;\n}\n\nexport default { Player };\n"],"names":["noop","identity","x","assign","tar","src","k","run","fn","blank_object","run_all","fns","is_function","thing","safe_not_equal","a","b","src_url_equal_anchor","src_url_equal","element_src","url","is_empty","obj","create_slot","definition","ctx","$$scope","slot_ctx","get_slot_context","get_slot_changes","dirty","lets","merged","len","i","update_slot_base","slot","slot_definition","slot_changes","get_slot_context_fn","slot_context","get_all_dirty_from_scope","length","null_to_empty","value","split_css_unit","split","is_client","now","raf","cb","tasks","run_tasks","task","loop","callback","fulfill","globals","append","target","node","get_root_for_style","root","append_empty_stylesheet","style_element","element","append_stylesheet","style","insert","anchor","detach","destroy_each","iterations","detaching","name","svg_element","text","data","space","empty","listen","event","handler","options","attr","attribute","children","set_data","set_input_value","input","set_style","key","important","select_option","select","mounting","option","select_value","selected_option","crossorigin","is_crossorigin","error","add_iframe_resize_listener","iframe","unsubscribe","toggle_class","toggle","custom_event","type","detail","bubbles","cancelable","e","managed_styles","active","hash","str","create_style_information","doc","info","create_rule","duration","delay","ease","uid","step","keyframes","p","t","rule","stylesheet","rules","animation","delete_rule","previous","next","anim","deleted","clear_rules","ownerNode","current_component","set_current_component","component","get_current_component","onMount","onDestroy","dirty_components","binding_callbacks","render_callbacks","flush_callbacks","resolved_promise","update_scheduled","schedule_update","flush","tick","add_render_callback","add_flush_callback","seen_callbacks","flushidx","saved_component","update","$$","flush_render_callbacks","filtered","targets","c","promise","wait","dispatch","direction","kind","outroing","outros","group_outros","check_outros","transition_in","block","local","transition_out","null_transition","create_bidirectional_transition","params","intro","config","running_program","pending_program","animation_name","clear_animation","init","program","d","go","easing","css","outro_and_destroy_block","lookup","update_keyed_each","old_blocks","get_key","dynamic","list","destroy","create_each_block","get_context","o","n","old_indexes","new_blocks","new_lookup","deltas","updates","child_ctx","will_move","did_move","new_block","old_block","new_key","old_key","bind","index","create_component","mount_component","customElement","fragment","after_update","new_on_destroy","destroy_component","make_dirty","instance","create_fragment","not_equal","props","append_styles","parent_component","ready","ret","rest","nodes","SvelteComponent","callbacks","$$props","throwError","message","context","getRandomValues","rnds8","rng","REGEX","validate","uuid","byteToHex","unsafeStringify","arr","offset","randomUUID","native","v4","buf","rnds","initiators","emitters","postStatuses","analyticsTypes","deviceTypes","mediaTypes","validateEventBeforeCreation","validateProperty","s","isTitleCase","validateEventBeforeProcessing","isValidUuid","isIsoDateString","validateEventAfterProcessing","validateAnalyticsEvent","string","startsWithCapital","hasNonAlphabetic","validationFn","newEvent","id","randomUuid","createdAt","__spreadValues","withQueryParams","search","googleAdTagParams","advertConsent","showingVideo","isLocahost","elementIsVisible","height","width","top","bottom","left","right","adsLoader","adDisplayContainer","onAdsManagerLoaded","onAdError","adsRequest","video","adsManagerLoadedEvent","$$invalidate","adsManager","onAdProgress","onClick","onPaused","onContentResumeRequested","adsLoaded","adEvent","adData","onEvent","playbackState","adError","adTagUrl","walker","adContainer","cssRegex","styles","currentTime","smoothedCurrentTime","onAnimationFrame","vastUrl","adParams","loadAds","orderedMediaSources","mediaObject","videoElement","audio","__spreadProps","loadMedia","source","hls","onError","play","startPosition","__async","_a","_b","_c","prevPaused","prevRate","isHls","nativeSupport","Hls","loadHlsLibrary","af","ak","am","ar","as","az","be","bg","bm","bn","bs","ca","ckb","cs","cy","da","de","ee","el","en","eo","es","et","eu","fa","fi","fil","fr","ga","gd","gl","gu","ha","haw","he","hi","hr","hu","hy","ig","is","it","iw","ja","ka","kk","km","kn","ko","ky","lb","lg","ln","lo","lt","lv","mg","mk","ml","mn","mr","ms","mt","my","nb","ne","nl","nn","no","om","or","pa","pl","ps","pt","qu","ro","ru","rw","si","sk","sl","sn","so","sq","sr","sv","sw","ta","te","tg","th","ti","tr","tt","ug","uk","ur","uz","vi","yi","yo","zhHK","zhMO","zhTW","zh","zu","basename","path","validateTranslations","locales","languages","validateAtLeastOneDefault","validateAtMostOneDefault","validateTranslationKeys","locale","language","defaults","translations","allKeys","uniqKeys","modules","pairs","v","_","translate","translationsForBrowserPreference","localesToTry","blurElement","findSegmentIndex","segments","time","nextIndex","afterTheEnd","thisIndex","findLoadedMedia","sources","matchesUrl","matchesHls","source_src_value","_attr","dispose","loadCount","initialTime","setTime","handlePlayError","timeout","loadedMedia","handleSourceError","sourceIndex","listener1","handleFullScreenChange","listener2","activeAdvert","contentItem","content","contentIndex","isFirstLoad","timeFragment","introOrOutro","handleHlsError","customUrl","prevPercentage","position","videoBehindWidget","widgetPosition","widgetWidth","segmentIndex","atTheStart","cubicOut","f","fly","y","opacity","target_opacity","transform","od","xValue","xUnit","yValue","yUnit","u","svg","svg_width_value","svg_height_value","scale","color","_set_style","button","isPlaying","tabindex","handleClick","rate","handleKeyDown","size","fontSize","seconds","description","isSegments","isSeconds","isTracks","backwardsSeconds","forwardsSeconds","margin","t_value","a_class_value","circular","current","color1","color2","visible","img","img_src_value","alt","raw_value","div","collapsible","collapsed","maxLines","maxWidth","center","bold","flex","maxWidthCss","maxHeight","progress","fullWidth","readonly","handleMouseDown","mouseDown","handleMouseMove","getMouseRatio","clientX","progressBar","mouseRatio","mouseup","handleMouseUp","mousemove","touchend","touchmove","backgroundStyle","circle","circle_stroke_dasharray_value","enabled","radius","strokeWidth","clamped","dashOffset","circumference","formatTime","hours","minutes","t2_value","span","t2","t0_value","t0","div1","div1_class_value","isScreen","playerStyle","isMobile","opacityCss","noTransition","isAdvert","zoom","fill","if_block1","create_if_block","contenttitle_changes","durationinmins_changes","larger","textColor","backgroundColor","iconColor","handleKeydown","prevItem","nextItem","handleFocus","scrollable","format","downloadFormats","item","desktopRows","mobileRows","exitDelay","idleDelay","isHovering","isExit","isIdle","exitTimeout","idleTimeout","relativeY","absoluteY","isVisible","entry","observer","belowBreakpoint","controlsOrder","playerStyles","knownPlayerStyle","canFullScreen","requestFullScreen","exitFullScreen","fullScreenElement","largeimage_changes","progresscircle_changes","advertlink_changes","advertbutton_changes","sourceurlbutton_changes","show_if","if_block0","create_if_block_15","if_block2","create_if_block_13","if_block4","create_if_block_11","if_block5","create_if_block_10","if_block7","create_if_block_8","if_block9","create_if_block_2","playlist_changes","callToAction","skipButtonStyle","playlistStyle","playlistToggle","playerTitle","fixedPosition","fixedWidth","playbackRate","persistentAdvert","logoIconEnabled","videoIsBehind","isSmall","isStandard","isLarge","isVideo","isStopped","isPlaylist","skipStyle","buttonColor","activeIconColor","buttonScale","playPauseScale","logoScale","closeScale","closeMargin","widthStyle","positionClasses","flyWidget","largeImage","largeImageHref","showBeyondWords","forcedCollapsed","playlistParts","showPlaylist","showPlaylistToggle","showAdvancedSettings","click_handler","click_handler_1","blobForImageUrl","imageUrl","revokePreviousUrls","image","resolve","reject","handleLoad","canvas","handleToBlob","objectUrls","blob","currentUrl","blobForSvgNode","svgElement","html","failedUrls","fallbackSvgs","imageSizes","renderedSvgs","onReject","$$value","showSeekButtons","showTrackButtons","imageUrl_","title","artworks","artwork","artist","album","seekTime","actionTypes","script0","script0_src_value","alreadyLoaded","_arraysEqual","arraysEqual_fn","_removeLast","removeLast_fn","OwnershipMediator","onSelected","onDeselected","__privateAdd","resourceId","consumerId","args","last","__privateMethod","nextLast","arr1","arr2","array","conditionFn","sectionEnabled","segment","sections","currentSections","hoveredSections","typeSections","dataAttribute","markClasses","m","_mediator","_addHighlights","addHighlights_fn","_removeHighlights","removeHighlights_fn","_SegmentHighlights","background","__privateGet","marker","markerElements","mark","markElements","child","SegmentHighlights","markerClasses","_addClasses","addClasses_fn","_removeClasses","removeClasses_fn","_SegmentClickables","safelyRemoveClasses","SegmentClickables","classes","classesToRemove","containerClasses","_addContainers","addContainers_fn","_removeContainers","removeContainers_fn","_SegmentContainers","onUpdate","sticky","self","container","SegmentContainers","identifiersEvent","fetchJson","_0","_1","fetchOptions","response","json","postJson","_resolveBaseUrl","resolveBaseUrl_fn","WebSocketClient","playerApiUrl","projectId","writeToken","headers","token","onMessage","webSocketUrl","protocol","identifier","jsonData","client","onStatusChange","handleMessage","handleError","webSocketEvent","handleStatusChange","handleRejection","result","waitUntil","settableProps","object","keyValues","ignoreList","diffObject","objBefore","objAfter","keys","diff","valueBefore","valueAfter","previousIndex","changedProps","applyTransitions","transitions","controller","player","currentIndex","transitionIndexAtTime","callTransitions","undoTransitions","before","after","delta","resolveTarget","isScriptTag","addDivAfter","findByQuery","appendDivToBody","elements","userinterface_changes","create_if_block_3","contentId","playlistId","sourceId","sourceUrl","showUserInterface","mediaSession","introsOutrosIndex","advertIndex","persistentAdImage","persistentIndex","widgetStyle","widgetTarget","highlightColor","highlightSections","clickableSections","segmentWidgetSections","segmentWidgetPosition","currentSegment","hoveredSegment","analyticsConsent","analyticsCustomUrl","analyticsTag","captureErrors","controlPanel","addEventListener","removeEventListener","showBottomWidget","showMediaSession","isFullScreen","mediaElement","userInterface","widgetInterface","analyticsUrl","analyticsId","listenSessionId","sessionCreatedAt","isNewListen","segmentContainers","segmentWidgets","segmentClickables","segmentHighlights","func","introsOutros","adverts","interfaceStyle","emittedFrom","statusEvent","lastHovered","currentAllowedInWidget","resetHovered","showRealTimeInWidget","widgetIsCurrent","PlayerApiClient","snakeCaseKeys","resolveTheme","theme","isBrowserDarkMode","setPropsFromApi","identifiers","identifiersArray","fetchData","handleNoContent","setProps","resetSomeProps","setContentProp","setAdvertsProp","colors","set","introsOutrosArray","imageEnabled","contentArray","advertsArray","isVast","propName","intro_outro_enabled","intro_url","outro_url","analytics_enabled","analytics_uuid_enabled","downloadFile","filename","href","erroredAdverts","updateErroredAdverts","advert","media","resultedInAPlaybackError","playedAdvertMedia","updatePlayedAdvertMedia","alreadyPlayedAdvertMedia","chooseAdvert","atTheEnd","errored","currentAdvert","placements","placementsThatCanPlay","bestSoFar","bestType","bestRandom","thisType","typeScores","thisRandom","isFirstItem","isLastItem","isBetweenPlaylistItems","lastSegment","midrollIndex","midrollSegmentIndex","midrollSegment","isAfterMidroll","closeToEnd","minimumTimeUntilEndForMidrollToPlay","eligiblePlacements","minimumDurationForMidrollToPlay","halfWayTimeToleranceForMidroll","halfWayTime","halfWayIndex","choosePersistentAdvert","bestMatch","bestPlacement","thisMatch","matchScore","thisPlacement","placementScores","erroredIntrosOutros","updateErroredIntrosOutros","introOutro","playedIntroOutroMedia","updatePlayedIntroOutroMedia","alreadyPlayedIntroOutroMedia","chooseIntroOutro","currentIntroOutro","bestPlayed","thisPlayed","atTheStartOfAllContent","atTheEndOfAllContent","chooseMediaSession","Player","allowOverride","websiteHasSetTheMediaSession","bestState","bestShowing","thisState","stateScores","thisShowing","showingScores","metadata","chooseWidget","somePlayerIsVisible","bestY","thisY","_ignoreDueToAdvert","ignoreDueToAdvert_fn","_ignoreDueToScrubbing","ignoreDueToScrubbing_fn","_sendEventToListeners","sendEventToListeners_fn","_hasIntro","hasIntro_fn","_hasOutro","hasOutro_fn","_isIntro","isIntro_fn","_isOutro","isOutro_fn","_isAdvert","isAdvert_fn","_isMidrollAdvert","isMidrollAdvert_fn","_isContent","isContent_fn","_playOrPause","playOrPause_fn","_pauseIfPlaying","pauseIfPlaying_fn","_playFromSegment","playFromSegment_fn","_setSpeed","setSpeed_fn","_setSegment","setSegment_fn","_setTrack","setTrack_fn","_setTime","setTime_fn","_chooseAndSetIntroOutro","chooseAndSetIntroOutro_fn","_chooseAndSetAdvert","chooseAndSetAdvert_fn","_playDeferredIntroOutro","playDeferredIntroOutro_fn","_playDeferredAdvert","playDeferredAdvert_fn","_setIntroOutro","setIntroOutro_fn","_setAdvert","setAdvert_fn","_overridePlayerState","overridePlayerState_fn","_restorePlayerState","restorePlayerState_fn","_matchesIdentifiers","matchesIdentifiers_fn","_currentSegmentChanged","currentSegmentChanged_fn","RootController","PlayerClass","eventType","listenerHandle","propsBefore","propsAfter","ratio","widgetSegment","videoPaused","wasIntro","wasAdvert","mediaType","errorMessage","addOrRemove","parts","isShowing","audioIndex","videoIndex","audioItem","videoItem","mediaUrl","extension","legacyId","contentStatus","typeListeners","__objRest","indexFn","cycle","playbackRates","maxIndex","tryIndex","updatedIndex","outOfBounds","timeFn","wasOutro","introFinished","outroFinished","advertsStarted","advertsFinished","_d","UNKNOWN_FUNCTION","parse","stackString","lines","stack","line","parseResult","parseChrome","parseWinjs","parseGecko","parseNode","parseJSC","chromeRe","chromeEvalRe","isNative","isEval","submatch","winjsRe","geckoRe","geckoEvalRe","javaScriptCoreRe","nodeRe","called","prevOnError","prevOnReject","setErrorHandler","thisFilename","originFilename","isDevelopment","errorFilename","lineNumber","columnNumber","originatedFromPlayer","isPlaybackError","stackTraceParser.parse","validateWebContext","listenToSegments","startX","startY","draggedMouse","markerElement","chooseSegment","changed","bestContent","j","thisContent","movedX","movedY","previousIndexes","playerIndex","AnalyticsClient","analyticsSink","eventName","sendToAnalytics","playerEvent","analyticsEventType","analyticsEvent","eventFromProps","gaEventName","playerEventType","isNextPercentage","withoutStorage","percentage","deviceType","version","event_type","listen_length_percent","advertId","nextPercentage","currentPercentage","maxDeviceWidth","pixels","relativeUrl","pinnedUrl","replaceFilename","_instances","_Player","PlayerComponent","newTarget","initialProps","__privateSet"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAASA,IAAO;AAAG;AACnB,MAAMC,KAAW,CAAAC,MAAKA;AACtB,SAASC,GAAOC,GAAKC,GAAK;AAEtB,aAAWC,KAAKD;AACZ,IAAAD,EAAIE,CAAC,IAAID,EAAIC,CAAC;AAClB,SAAOF;AACX;AAWA,SAASG,GAAIC,GAAI;AACb,SAAOA,EAAE;AACb;AACA,SAASC,KAAe;AACpB,SAAO,uBAAO,OAAO,IAAI;AAC7B;AACA,SAASC,GAAQC,GAAK;AAClB,EAAAA,EAAI,QAAQJ,EAAG;AACnB;AACA,SAASK,GAAYC,GAAO;AACxB,SAAO,OAAOA,KAAU;AAC5B;AACA,SAASC,GAAeC,GAAGC,GAAG;AAC1B,SAAOD,KAAKA,IAAIC,KAAKA,IAAID,MAAMC,KAAOD,KAAK,OAAOA,KAAM,YAAa,OAAOA,KAAM;AACtF;AACA,IAAIE;AACJ,SAASC,GAAcC,GAAaC,GAAK;AACrC,SAAKH,OACDA,KAAuB,SAAS,cAAc,GAAG,IAErDA,GAAqB,OAAOG,GACrBD,MAAgBF,GAAqB;AAChD;AAIA,SAASI,GAASC,GAAK;AACnB,SAAO,OAAO,KAAKA,CAAG,EAAE,WAAW;AACvC;AAqBA,SAASC,GAAYC,GAAYC,GAAKC,GAASlB,GAAI;AAC/C,MAAIgB,GAAY;AACZ,UAAMG,IAAWC,GAAiBJ,GAAYC,GAAKC,GAASlB,CAAE;AAC9D,WAAOgB,EAAW,CAAC,EAAEG,CAAQ;AAAA,EAChC;AACL;AACA,SAASC,GAAiBJ,GAAYC,GAAKC,GAASlB,GAAI;AACpD,SAAOgB,EAAW,CAAC,KAAKhB,IAClBL,GAAOuB,EAAQ,IAAI,MAAO,GAAEF,EAAW,CAAC,EAAEhB,EAAGiB,CAAG,CAAC,CAAC,IAClDC,EAAQ;AAClB;AACA,SAASG,GAAiBL,GAAYE,GAASI,GAAOtB,GAAI;AACtD,MAAIgB,EAAW,CAAC,KAAKhB,GAAI;AACrB,UAAMuB,IAAOP,EAAW,CAAC,EAAEhB,EAAGsB,CAAK,CAAC;AACpC,QAAIJ,EAAQ,UAAU;AAClB,aAAOK;AAEX,QAAI,OAAOA,KAAS,UAAU;AAC1B,YAAMC,IAAS,CAAA,GACTC,IAAM,KAAK,IAAIP,EAAQ,MAAM,QAAQK,EAAK,MAAM;AACtD,eAASG,IAAI,GAAGA,IAAID,GAAKC,KAAK;AAC1B,QAAAF,EAAOE,CAAC,IAAIR,EAAQ,MAAMQ,CAAC,IAAIH,EAAKG,CAAC;AAEzC,aAAOF;AAAA,IACV;AACD,WAAON,EAAQ,QAAQK;AAAA,EAC1B;AACD,SAAOL,EAAQ;AACnB;AACA,SAASS,GAAiBC,GAAMC,GAAiBZ,GAAKC,GAASY,GAAcC,GAAqB;AAC9F,MAAID,GAAc;AACd,UAAME,IAAeZ,GAAiBS,GAAiBZ,GAAKC,GAASa,CAAmB;AACxF,IAAAH,EAAK,EAAEI,GAAcF,CAAY;AAAA,EACpC;AACL;AAKA,SAASG,GAAyBf,GAAS;AACvC,MAAIA,EAAQ,IAAI,SAAS,IAAI;AACzB,UAAMI,IAAQ,CAAA,GACRY,IAAShB,EAAQ,IAAI,SAAS;AACpC,aAASQ,IAAI,GAAGA,IAAIQ,GAAQR;AACxB,MAAAJ,EAAMI,CAAC,IAAI;AAEf,WAAOJ;AAAA,EACV;AACD,SAAO;AACX;AAgCA,SAASa,GAAcC,GAAO;AAC1B,SAAOA,KAAS,OAAO,KAAKA;AAChC;AASA,SAASC,GAAeD,GAAO;AAC3B,QAAME,IAAQ,OAAOF,KAAU,YAAYA,EAAM,MAAM,4BAA4B;AACnF,SAAOE,IAAQ,CAAC,WAAWA,EAAM,CAAC,CAAC,GAAGA,EAAM,CAAC,KAAK,IAAI,IAAI,CAACF,GAAO,IAAI;AAC1E;AAGA,MAAMG,KAAY,OAAO,UAAW;AACpC,IAAIC,KAAMD,KACJ,MAAM,OAAO,YAAY,IAAK,IAC9B,MAAM,KAAK,OACbE,KAAMF,KAAY,CAAAG,MAAM,sBAAsBA,CAAE,IAAIlD;AASxD,MAAMmD,KAAQ,oBAAI;AAClB,SAASC,GAAUJ,GAAK;AACpB,EAAAG,GAAM,QAAQ,CAAAE,MAAQ;AAClB,IAAKA,EAAK,EAAEL,CAAG,MACXG,GAAM,OAAOE,CAAI,GACjBA,EAAK,EAAC;AAAA,EAElB,CAAK,GACGF,GAAM,SAAS,KACfF,GAAIG,EAAS;AACrB;AAWA,SAASE,GAAKC,GAAU;AACpB,MAAIF;AACJ,SAAIF,GAAM,SAAS,KACfF,GAAIG,EAAS,GACV;AAAA,IACH,SAAS,IAAI,QAAQ,CAAAI,MAAW;AAC5B,MAAAL,GAAM,IAAIE,IAAO,EAAE,GAAGE,GAAU,GAAGC,EAAO,CAAE;AAAA,IACxD,CAAS;AAAA,IACD,QAAQ;AACJ,MAAAL,GAAM,OAAOE,CAAI;AAAA,IACpB;AAAA,EACT;AACA;AAEA,MAAMI,KAAW,OAAO,UAAW,cAC7B,SACA,OAAO,cAAe,cAClB,aACA;AAuIV,SAASC,EAAOC,GAAQC,GAAM;AAC1B,EAAAD,EAAO,YAAYC,CAAI;AAC3B;AAUA,SAASC,GAAmBD,GAAM;AAC9B,MAAI,CAACA;AACD,WAAO;AACX,QAAME,IAAOF,EAAK,cAAcA,EAAK,YAAa,IAAGA,EAAK;AAC1D,SAAIE,KAAQA,EAAK,OACNA,IAEJF,EAAK;AAChB;AACA,SAASG,GAAwBH,GAAM;AACnC,QAAMI,IAAgBC,EAAQ,OAAO;AACrC,SAAAC,GAAkBL,GAAmBD,CAAI,GAAGI,CAAa,GAClDA,EAAc;AACzB;AACA,SAASE,GAAkBN,GAAMO,GAAO;AACpC,SAAAT,EAAOE,EAAK,QAAQA,GAAMO,CAAK,GACxBA,EAAM;AACjB;AAyBA,SAASC,EAAOT,GAAQC,GAAMS,GAAQ;AAClC,EAAAV,EAAO,aAAaC,GAAMS,KAAU,IAAI;AAC5C;AASA,SAASC,EAAOV,GAAM;AAClB,EAAIA,EAAK,cACLA,EAAK,WAAW,YAAYA,CAAI;AAExC;AACA,SAASW,GAAaC,GAAYC,GAAW;AACzC,WAAS,IAAI,GAAG,IAAID,EAAW,QAAQ,KAAK;AACxC,IAAIA,EAAW,CAAC,KACZA,EAAW,CAAC,EAAE,EAAEC,CAAS;AAErC;AACA,SAASR,EAAQS,GAAM;AACnB,SAAO,SAAS,cAAcA,CAAI;AACtC;AAgBA,SAASC,GAAYD,GAAM;AACvB,SAAO,SAAS,gBAAgB,8BAA8BA,CAAI;AACtE;AACA,SAASE,EAAKC,GAAM;AAChB,SAAO,SAAS,eAAeA,CAAI;AACvC;AACA,SAASC,IAAQ;AACb,SAAOF,EAAK,GAAG;AACnB;AACA,SAASG,KAAQ;AACb,SAAOH,EAAK,EAAE;AAClB;AAIA,SAASI,EAAOpB,GAAMqB,GAAOC,GAASC,GAAS;AAC3C,SAAAvB,EAAK,iBAAiBqB,GAAOC,GAASC,CAAO,GACtC,MAAMvB,EAAK,oBAAoBqB,GAAOC,GAASC,CAAO;AACjE;AAoCA,SAASC,GAAKxB,GAAMyB,GAAWzC,GAAO;AAClC,EAAIA,KAAS,OACTgB,EAAK,gBAAgByB,CAAS,IACzBzB,EAAK,aAAayB,CAAS,MAAMzC,KACtCgB,EAAK,aAAayB,GAAWzC,CAAK;AAC1C;AAuHA,SAAS0C,GAASrB,GAAS;AACvB,SAAO,MAAM,KAAKA,EAAQ,UAAU;AACxC;AA6HA,SAASsB,GAASX,GAAMC,GAAM;AAE1B,EADAA,IAAO,KAAKA,GACRD,EAAK,SAASC,MAElBD,EAAK,OAAOC;AAChB;AAeA,SAASW,GAAgBC,GAAO7C,GAAO;AACnC,EAAA6C,EAAM,QAAQ7C,KAAS,OAAO,KAAKA;AACvC;AASA,SAAS8C,GAAU9B,GAAM+B,GAAK/C,GAAOgD,GAAW;AAC5C,EAAIhD,KAAS,OACTgB,EAAK,MAAM,eAAe+B,CAAG,IAG7B/B,EAAK,MAAM,YAAY+B,GAAK/C,GAAOgD,IAAY,cAAc,EAAE;AAEvE;AACA,SAASC,GAAcC,GAAQlD,GAAOmD,GAAU;AAC5C,WAAS7D,IAAI,GAAGA,IAAI4D,EAAO,QAAQ,QAAQ5D,KAAK,GAAG;AAC/C,UAAM8D,IAASF,EAAO,QAAQ5D,CAAC;AAC/B,QAAI8D,EAAO,YAAYpD,GAAO;AAC1B,MAAAoD,EAAO,WAAW;AAClB;AAAA,IACH;AAAA,EACJ;AACD,GAAI,CAACD,KAAYnD,MAAU,YACvBkD,EAAO,gBAAgB;AAE/B;AAOA,SAASG,GAAaH,GAAQ;AAC1B,QAAMI,IAAkBJ,EAAO,cAAc,UAAU;AACvD,SAAOI,KAAmBA,EAAgB;AAC9C;AAMA,IAAIC;AACJ,SAASC,KAAiB;AACtB,MAAID,OAAgB,QAAW;AAC3B,IAAAA,KAAc;AACd,QAAI;AACA,MAAI,OAAO,UAAW,eAAe,OAAO,UACnC,OAAO,OAAO;AAAA,IAE1B,SACME,GAAO;AACV,MAAAF,KAAc;AAAA,IACjB;AAAA,EACJ;AACD,SAAOA;AACX;AACA,SAASG,GAA2B1C,GAAMpD,GAAI;AAE1C,EADuB,iBAAiBoD,CAAI,EACzB,aAAa,aAC5BA,EAAK,MAAM,WAAW;AAE1B,QAAM2C,IAAStC,EAAQ,QAAQ;AAC/B,EAAAsC,EAAO,aAAa,SAAS,6JACoD,GACjFA,EAAO,aAAa,eAAe,MAAM,GACzCA,EAAO,WAAW;AAClB,QAAMJ,IAAcC;AACpB,MAAII;AACJ,SAAIL,KACAI,EAAO,MAAM,mFACbC,IAAcxB,EAAO,QAAQ,WAAW,CAACC,MAAU;AAC/C,IAAIA,EAAM,WAAWsB,EAAO,iBACxB/F;EAChB,CAAS,MAGD+F,EAAO,MAAM,eACbA,EAAO,SAAS,MAAM;AAClB,IAAAC,IAAcxB,EAAOuB,EAAO,eAAe,UAAU/F,CAAE,GAGvDA;EACZ,IAEIkD,EAAOE,GAAM2C,CAAM,GACZ,MAAM;AACT,KAAIJ,KAGKK,KAAeD,EAAO,kBAC3BC,KAEJlC,EAAOiC,CAAM;AAAA,EACrB;AACA;AAIA,SAASE,GAAaxC,GAASS,GAAMgC,GAAQ;AACzC,EAAAzC,EAAQ,UAAUyC,IAAS,QAAQ,QAAQ,EAAEhC,CAAI;AACrD;AACA,SAASiC,GAAaC,GAAMC,GAAQ,EAAE,SAAAC,IAAU,IAAO,YAAAC,IAAa,GAAO,IAAG,IAAI;AAC9E,QAAMC,IAAI,SAAS,YAAY,aAAa;AAC5C,SAAAA,EAAE,gBAAgBJ,GAAME,GAASC,GAAYF,CAAM,GAC5CG;AACX;AAwGA,MAAMC,KAAiB,oBAAI;AAC3B,IAAIC,KAAS;AAEb,SAASC,GAAKC,GAAK;AACf,MAAID,IAAO,MACP,IAAIC,EAAI;AACZ,SAAO;AACH,IAAAD,KAASA,KAAQ,KAAKA,IAAQC,EAAI,WAAW,CAAC;AAClD,SAAOD,MAAS;AACpB;AACA,SAASE,GAAyBC,GAAK1D,GAAM;AACzC,QAAM2D,IAAO,EAAE,YAAYxD,GAAwBH,CAAI,GAAG,OAAO,CAAA;AACjE,SAAAqD,GAAe,IAAIK,GAAKC,CAAI,GACrBA;AACX;AACA,SAASC,GAAY5D,GAAM7C,GAAGC,GAAGyG,GAAUC,GAAOC,GAAMnH,GAAIoH,IAAM,GAAG;AACjE,QAAMC,IAAO,SAASJ;AACtB,MAAIK,IAAY;AAAA;AAChB,WAASC,IAAI,GAAGA,KAAK,GAAGA,KAAKF,GAAM;AAC/B,UAAMG,IAAIjH,KAAKC,IAAID,KAAK4G,EAAKI,CAAC;AAC9B,IAAAD,KAAaC,IAAI,MAAM,KAAKvH,EAAGwH,GAAG,IAAIA,CAAC,CAAC;AAAA;AAAA,EAC3C;AACD,QAAMC,IAAOH,IAAY,SAAStH,EAAGQ,GAAG,IAAIA,CAAC,CAAC;AAAA,IACxC0D,IAAO,YAAYyC,GAAKc,CAAI,CAAC,IAAIL,CAAG,IACpCN,IAAMzD,GAAmBD,CAAI,GAC7B,EAAE,YAAAsE,GAAY,OAAAC,EAAO,IAAGlB,GAAe,IAAIK,CAAG,KAAKD,GAAyBC,GAAK1D,CAAI;AAC3F,EAAKuE,EAAMzD,CAAI,MACXyD,EAAMzD,CAAI,IAAI,IACdwD,EAAW,WAAW,cAAcxD,CAAI,IAAIuD,CAAI,IAAIC,EAAW,SAAS,MAAM;AAElF,QAAME,IAAYxE,EAAK,MAAM,aAAa;AAC1C,SAAAA,EAAK,MAAM,YAAY,GAAGwE,IAAY,GAAGA,CAAS,OAAO,EAAE,GAAG1D,CAAI,IAAI+C,CAAQ,aAAaC,CAAK,aAChGR,MAAU,GACHxC;AACX;AACA,SAAS2D,GAAYzE,GAAMc,GAAM;AAC7B,QAAM4D,KAAY1E,EAAK,MAAM,aAAa,IAAI,MAAM,IAAI,GAClD2E,IAAOD,EAAS;AAAA,IAAO5D,IACvB,CAAA8D,MAAQA,EAAK,QAAQ9D,CAAI,IAAI,IAC7B,CAAA8D,MAAQA,EAAK,QAAQ,UAAU,MAAM;AAAA;AAAA,EAC/C,GACUC,IAAUH,EAAS,SAASC,EAAK;AACvC,EAAIE,MACA7E,EAAK,MAAM,YAAY2E,EAAK,KAAK,IAAI,GACrCrB,MAAUuB,GACLvB,MACDwB;AAEZ;AACA,SAASA,KAAc;AACnB,EAAAzF,GAAI,MAAM;AACN,IAAIiE,OAEJD,GAAe,QAAQ,CAAAM,MAAQ;AAC3B,YAAM,EAAE,WAAAoB,EAAS,IAAKpB,EAAK;AAE3B,MAAIoB,KACArE,EAAOqE,CAAS;AAAA,IAChC,CAAS,GACD1B,GAAe,MAAK;AAAA,EAC5B,CAAK;AACL;AAuEA,IAAI2B;AACJ,SAASC,GAAsBC,GAAW;AACtC,EAAAF,KAAoBE;AACxB;AACA,SAASC,KAAwB;AAC7B,MAAI,CAACH;AACD,UAAM,IAAI,MAAM,kDAAkD;AACtE,SAAOA;AACX;AAoBA,SAASI,GAAQxI,GAAI;AACjB,EAAAuI,GAAuB,EAAC,GAAG,SAAS,KAAKvI,CAAE;AAC/C;AAiBA,SAASyI,GAAUzI,GAAI;AACnB,EAAAuI,GAAuB,EAAC,GAAG,WAAW,KAAKvI,CAAE;AACjD;AAiFA,MAAM0I,KAAmB,CAAA,GAEnBC,KAAoB,CAAA;AAC1B,IAAIC,KAAmB,CAAA;AACvB,MAAMC,KAAkB,CAAA,GAClBC,KAAmC,wBAAQ;AACjD,IAAIC,KAAmB;AACvB,SAASC,KAAkB;AACvB,EAAKD,OACDA,KAAmB,IACnBD,GAAiB,KAAKG,CAAK;AAEnC;AACA,SAASC,KAAO;AACZ,SAAAF,MACOF;AACX;AACA,SAASK,GAAoBnJ,GAAI;AAC7B,EAAA4I,GAAiB,KAAK5I,CAAE;AAC5B;AACA,SAASoJ,GAAmBpJ,GAAI;AAC5B,EAAA6I,GAAgB,KAAK7I,CAAE;AAC3B;AAmBA,MAAMqJ,KAAiB,oBAAI;AAC3B,IAAIC,KAAW;AACf,SAASL,IAAQ;AAIb,MAAIK,OAAa;AACb;AAEJ,QAAMC,IAAkBnB;AACxB,KAAG;AAGC,QAAI;AACA,aAAOkB,KAAWZ,GAAiB,UAAQ;AACvC,cAAMJ,IAAYI,GAAiBY,EAAQ;AAC3C,QAAAA,MACAjB,GAAsBC,CAAS,GAC/BkB,GAAOlB,EAAU,EAAE;AAAA,MACtB;AAAA,IACJ,SACM,GAAG;AAEN,YAAAI,GAAiB,SAAS,GAC1BY,KAAW,GACL;AAAA,IACT;AAID,SAHAjB,GAAsB,IAAI,GAC1BK,GAAiB,SAAS,GAC1BY,KAAW,GACJX,GAAkB;AACrB,MAAAA,GAAkB,IAAG;AAIzB,aAASjH,IAAI,GAAGA,IAAIkH,GAAiB,QAAQlH,KAAK,GAAG;AACjD,YAAMqB,IAAW6F,GAAiBlH,CAAC;AACnC,MAAK2H,GAAe,IAAItG,CAAQ,MAE5BsG,GAAe,IAAItG,CAAQ,GAC3BA;IAEP;AACD,IAAA6F,GAAiB,SAAS;AAAA,EAClC,SAAaF,GAAiB;AAC1B,SAAOG,GAAgB;AACnB,IAAAA,GAAgB,IAAG;AAEvB,EAAAE,KAAmB,IACnBM,GAAe,MAAK,GACpBhB,GAAsBkB,CAAe;AACzC;AACA,SAASC,GAAOC,GAAI;AAChB,MAAIA,EAAG,aAAa,MAAM;AACtB,IAAAA,EAAG,OAAM,GACTvJ,GAAQuJ,EAAG,aAAa;AACxB,UAAMnI,IAAQmI,EAAG;AACjB,IAAAA,EAAG,QAAQ,CAAC,EAAE,GACdA,EAAG,YAAYA,EAAG,SAAS,EAAEA,EAAG,KAAKnI,CAAK,GAC1CmI,EAAG,aAAa,QAAQN,EAAmB;AAAA,EAC9C;AACL;AAIA,SAASO,GAAuBvJ,GAAK;AACjC,QAAMwJ,IAAW,CAAA,GACXC,IAAU,CAAA;AAChB,EAAAhB,GAAiB,QAAQ,CAACiB,MAAM1J,EAAI,QAAQ0J,CAAC,MAAM,KAAKF,EAAS,KAAKE,CAAC,IAAID,EAAQ,KAAKC,CAAC,CAAC,GAC1FD,EAAQ,QAAQ,CAACC,MAAMA,EAAG,CAAA,GAC1BjB,KAAmBe;AACvB;AAEA,IAAIG;AACJ,SAASC,KAAO;AACZ,SAAKD,OACDA,KAAU,QAAQ,WAClBA,GAAQ,KAAK,MAAM;AACf,IAAAA,KAAU;AAAA,EACtB,CAAS,IAEEA;AACX;AACA,SAASE,GAAS5G,GAAM6G,GAAWC,GAAM;AACrC,EAAA9G,EAAK,cAAc+C,GAAa,GAAG8D,IAAY,UAAU,OAAO,GAAGC,CAAI,EAAE,CAAC;AAC9E;AACA,MAAMC,KAAW,oBAAI;AACrB,IAAIC;AACJ,SAASC,KAAe;AACpB,EAAAD,KAAS;AAAA,IACL,GAAG;AAAA,IACH,GAAG,CAAE;AAAA,IACL,GAAGA;AAAA;AAAA,EACX;AACA;AACA,SAASE,KAAe;AACpB,EAAKF,GAAO,KACRlK,GAAQkK,GAAO,CAAC,GAEpBA,KAASA,GAAO;AACpB;AACA,SAASG,EAAcC,GAAOC,GAAO;AACjC,EAAID,KAASA,EAAM,MACfL,GAAS,OAAOK,CAAK,GACrBA,EAAM,EAAEC,CAAK;AAErB;AACA,SAASC,EAAeF,GAAOC,GAAO3G,GAAQf,GAAU;AACpD,MAAIyH,KAASA,EAAM,GAAG;AAClB,QAAIL,GAAS,IAAIK,CAAK;AAClB;AACJ,IAAAL,GAAS,IAAIK,CAAK,GAClBJ,GAAO,EAAE,KAAK,MAAM;AAChB,MAAAD,GAAS,OAAOK,CAAK,GACjBzH,MACIe,KACA0G,EAAM,EAAE,CAAC,GACbzH;IAEhB,CAAS,GACDyH,EAAM,EAAEC,CAAK;AAAA,EAChB;AACI,IAAI1H,KACLA;AAER;AACA,MAAM4H,KAAkB,EAAE,UAAU;AA0HpC,SAASC,GAAgCxH,GAAMpD,GAAI6K,GAAQC,GAAO;AAC9D,QAAMnG,IAAU,EAAE,WAAW;AAC7B,MAAIoG,IAAS/K,EAAGoD,GAAMyH,GAAQlG,CAAO,GACjC6C,IAAIsD,IAAQ,IAAI,GAChBE,IAAkB,MAClBC,IAAkB,MAClBC,IAAiB;AACrB,WAASC,IAAkB;AACvB,IAAID,KACArD,GAAYzE,GAAM8H,CAAc;AAAA,EACvC;AACD,WAASE,EAAKC,GAASpE,GAAU;AAC7B,UAAMqE,IAAKD,EAAQ,IAAI7D;AACvB,WAAAP,KAAY,KAAK,IAAIqE,CAAC,GACf;AAAA,MACH,GAAG9D;AAAA,MACH,GAAG6D,EAAQ;AAAA,MACX,GAAAC;AAAA,MACA,UAAArE;AAAA,MACA,OAAOoE,EAAQ;AAAA,MACf,KAAKA,EAAQ,QAAQpE;AAAA,MACrB,OAAOoE,EAAQ;AAAA,IAC3B;AAAA,EACK;AACD,WAASE,EAAG/K,GAAG;AACX,UAAM,EAAE,OAAA0G,IAAQ,GAAG,UAAAD,IAAW,KAAK,QAAAuE,IAAS/L,IAAU,MAAAyJ,IAAO1J,GAAM,KAAAiM,MAAQV,KAAUJ,IAC/EU,IAAU;AAAA,MACZ,OAAO7I,GAAG,IAAK0E;AAAA,MACf,GAAA1G;AAAA,IACZ;AACQ,IAAKA,MAED6K,EAAQ,QAAQjB,IAChBA,GAAO,KAAK,IAEZY,KAAmBC,IACnBA,IAAkBI,KAKdI,MACAN,KACAD,IAAiBlE,GAAY5D,GAAMoE,GAAGhH,GAAGyG,GAAUC,GAAOsE,GAAQC,CAAG,IAErEjL,KACA0I,EAAK,GAAG,CAAC,GACb8B,IAAkBI,EAAKC,GAASpE,CAAQ,GACxCkC,GAAoB,MAAMa,GAAS5G,GAAM5C,GAAG,OAAO,CAAC,GACpDsC,GAAK,CAAAN,MAAO;AAUR,UATIyI,KAAmBzI,IAAMyI,EAAgB,UACzCD,IAAkBI,EAAKH,GAAiBhE,CAAQ,GAChDgE,IAAkB,MAClBjB,GAAS5G,GAAM4H,EAAgB,GAAG,OAAO,GACrCS,MACAN,KACAD,IAAiBlE,GAAY5D,GAAMoE,GAAGwD,EAAgB,GAAGA,EAAgB,UAAU,GAAGQ,GAAQT,EAAO,GAAG,KAG5GC;AACA,YAAIxI,KAAOwI,EAAgB;AACvB,UAAA9B,EAAK1B,IAAIwD,EAAgB,GAAG,IAAIxD,CAAC,GACjCwC,GAAS5G,GAAM4H,EAAgB,GAAG,KAAK,GAClCC,MAEGD,EAAgB,IAEhBG,MAIK,EAAEH,EAAgB,MAAM,KACzB9K,GAAQ8K,EAAgB,MAAM,CAAC,IAG3CA,IAAkB;AAAA,iBAEbxI,KAAOwI,EAAgB,OAAO;AACnC,gBAAMzD,IAAI/E,IAAMwI,EAAgB;AAChC,UAAAxD,IAAIwD,EAAgB,IAAIA,EAAgB,IAAIQ,EAAOjE,IAAIyD,EAAgB,QAAQ,GAC/E9B,EAAK1B,GAAG,IAAIA,CAAC;AAAA,QAChB;AAAA;AAEL,aAAO,CAAC,EAAEwD,KAAmBC;AAAA,IAC7C,CAAa;AAAA,EAER;AACD,SAAO;AAAA,IACH,IAAIzK,GAAG;AACH,MAAIJ,GAAY2K,CAAM,IAClBhB,GAAI,EAAG,KAAK,MAAM;AAEd,QAAAgB,IAASA,EAAOpG,CAAO,GACvB4G,EAAG/K,CAAC;AAAA,MACxB,CAAiB,IAGD+K,EAAG/K,CAAC;AAAA,IAEX;AAAA,IACD,MAAM;AACF,MAAA2K,KACAH,IAAkBC,IAAkB;AAAA,IACvC;AAAA,EACT;AACA;AAwFA,SAASS,GAAwBlB,GAAOmB,GAAQ;AAC5C,EAAAjB,EAAeF,GAAO,GAAG,GAAG,MAAM;AAC9B,IAAAmB,EAAO,OAAOnB,EAAM,GAAG;AAAA,EAC/B,CAAK;AACL;AASA,SAASoB,GAAkBC,GAAYvK,GAAOwK,GAASC,GAAS9K,GAAK+K,GAAML,GAAQvI,GAAM6I,GAASC,GAAmBnE,GAAMoE,GAAa;AACpI,MAAIC,IAAIP,EAAW,QACfQ,IAAIL,EAAK,QACTtK,IAAI0K;AACR,QAAME,IAAc,CAAA;AACpB,SAAO5K;AACH,IAAA4K,EAAYT,EAAWnK,CAAC,EAAE,GAAG,IAAIA;AACrC,QAAM6K,IAAa,CAAA,GACbC,IAAa,oBAAI,OACjBC,IAAS,oBAAI,OACbC,IAAU,CAAA;AAEhB,OADAhL,IAAI2K,GACG3K,OAAK;AACR,UAAMiL,IAAYR,EAAYlL,GAAK+K,GAAMtK,CAAC,GACpCyD,IAAM2G,EAAQa,CAAS;AAC7B,QAAInC,IAAQmB,EAAO,IAAIxG,CAAG;AAC1B,IAAKqF,IAIIuB,KAELW,EAAQ,KAAK,MAAMlC,EAAM,EAAEmC,GAAWrL,CAAK,CAAC,KAL5CkJ,IAAQ0B,EAAkB/G,GAAKwH,CAAS,GACxCnC,EAAM,EAAC,IAMXgC,EAAW,IAAIrH,GAAKoH,EAAW7K,CAAC,IAAI8I,CAAK,GACrCrF,KAAOmH,KACPG,EAAO,IAAItH,GAAK,KAAK,IAAIzD,IAAI4K,EAAYnH,CAAG,CAAC,CAAC;AAAA,EACrD;AACD,QAAMyH,IAAY,oBAAI,OAChBC,IAAW,oBAAI;AACrB,WAASjJ,EAAO4G,GAAO;AACnB,IAAAD,EAAcC,GAAO,CAAC,GACtBA,EAAM,EAAEpH,GAAM2E,CAAI,GAClB4D,EAAO,IAAInB,EAAM,KAAKA,CAAK,GAC3BzC,IAAOyC,EAAM,OACb6B;AAAA,EACH;AACD,SAAOD,KAAKC,KAAG;AACX,UAAMS,IAAYP,EAAWF,IAAI,CAAC,GAC5BU,IAAYlB,EAAWO,IAAI,CAAC,GAC5BY,IAAUF,EAAU,KACpBG,KAAUF,EAAU;AAC1B,IAAID,MAAcC,KAEdhF,IAAO+E,EAAU,OACjBV,KACAC,OAEMG,EAAW,IAAIS,EAAO,IAKvB,CAACtB,EAAO,IAAIqB,CAAO,KAAKJ,EAAU,IAAII,CAAO,IAClDpJ,EAAOkJ,CAAS,IAEXD,EAAS,IAAII,EAAO,IACzBb,MAEKK,EAAO,IAAIO,CAAO,IAAIP,EAAO,IAAIQ,EAAO,KAC7CJ,EAAS,IAAIG,CAAO,GACpBpJ,EAAOkJ,CAAS,MAGhBF,EAAU,IAAIK,EAAO,GACrBb,QAfAH,EAAQc,GAAWpB,CAAM,GACzBS;AAAA,EAgBP;AACD,SAAOA,OAAK;AACR,UAAMW,IAAYlB,EAAWO,CAAC;AAC9B,IAAKI,EAAW,IAAIO,EAAU,GAAG,KAC7Bd,EAAQc,GAAWpB,CAAM;AAAA,EAChC;AACD,SAAOU;AACH,IAAAzI,EAAO2I,EAAWF,IAAI,CAAC,CAAC;AAC5B,SAAAnM,GAAQwM,CAAO,GACRH;AACX;AAsQA,SAASW,GAAK5E,GAAWpE,GAAMnB,GAAU;AACrC,QAAMoK,IAAQ7E,EAAU,GAAG,MAAMpE,CAAI;AACrC,EAAIiJ,MAAU,WACV7E,EAAU,GAAG,MAAM6E,CAAK,IAAIpK,GAC5BA,EAASuF,EAAU,GAAG,IAAI6E,CAAK,CAAC;AAExC;AACA,SAASC,GAAiB5C,GAAO;AAC7B,EAAAA,KAASA,EAAM;AACnB;AAIA,SAAS6C,GAAgB/E,GAAWnF,GAAQU,GAAQyJ,GAAe;AAC/D,QAAM,EAAE,UAAAC,GAAU,cAAAC,MAAiBlF,EAAU;AAC7C,EAAAiF,KAAYA,EAAS,EAAEpK,GAAQU,CAAM,GAChCyJ,KAEDnE,GAAoB,MAAM;AACtB,UAAMsE,IAAiBnF,EAAU,GAAG,SAAS,IAAIvI,EAAG,EAAE,OAAOK,EAAW;AAIxE,IAAIkI,EAAU,GAAG,aACbA,EAAU,GAAG,WAAW,KAAK,GAAGmF,CAAc,IAK9CvN,GAAQuN,CAAc,GAE1BnF,EAAU,GAAG,WAAW;EACpC,CAAS,GAELkF,EAAa,QAAQrE,EAAmB;AAC5C;AACA,SAASuE,GAAkBpF,GAAWrE,GAAW;AAC7C,QAAMwF,IAAKnB,EAAU;AACrB,EAAImB,EAAG,aAAa,SAChBC,GAAuBD,EAAG,YAAY,GACtCvJ,GAAQuJ,EAAG,UAAU,GACrBA,EAAG,YAAYA,EAAG,SAAS,EAAExF,CAAS,GAGtCwF,EAAG,aAAaA,EAAG,WAAW,MAC9BA,EAAG,MAAM;AAEjB;AACA,SAASkE,GAAWrF,GAAW5G,GAAG;AAC9B,EAAI4G,EAAU,GAAG,MAAM,CAAC,MAAM,OAC1BI,GAAiB,KAAKJ,CAAS,GAC/BU,MACAV,EAAU,GAAG,MAAM,KAAK,CAAC,IAE7BA,EAAU,GAAG,MAAO5G,IAAI,KAAM,CAAC,KAAM,KAAMA,IAAI;AACnD;AACA,SAAS0J,GAAK9C,GAAW3D,GAASiJ,GAAUC,GAAiBC,GAAWC,GAAOC,GAAe1M,IAAQ,CAAC,EAAE,GAAG;AACxG,QAAM2M,IAAmB7F;AACzB,EAAAC,GAAsBC,CAAS;AAC/B,QAAMmB,IAAKnB,EAAU,KAAK;AAAA,IACtB,UAAU;AAAA,IACV,KAAK,CAAE;AAAA;AAAA,IAEP,OAAAyF;AAAA,IACA,QAAQvO;AAAA,IACR,WAAAsO;AAAA,IACA,OAAO7N,GAAc;AAAA;AAAA,IAErB,UAAU,CAAE;AAAA,IACZ,YAAY,CAAE;AAAA,IACd,eAAe,CAAE;AAAA,IACjB,eAAe,CAAE;AAAA,IACjB,cAAc,CAAE;AAAA,IAChB,SAAS,IAAI,IAAI0E,EAAQ,YAAYsJ,IAAmBA,EAAiB,GAAG,UAAU,CAAA,EAAG;AAAA;AAAA,IAEzF,WAAWhO,GAAc;AAAA,IACzB,OAAAqB;AAAA,IACA,YAAY;AAAA,IACZ,MAAMqD,EAAQ,UAAUsJ,EAAiB,GAAG;AAAA,EACpD;AACI,EAAAD,KAAiBA,EAAcvE,EAAG,IAAI;AACtC,MAAIyE,IAAQ;AAkBZ,MAjBAzE,EAAG,MAAMmE,IACHA,EAAStF,GAAW3D,EAAQ,SAAS,CAAE,GAAE,CAACjD,GAAGyM,MAAQC,MAAS;AAC5D,UAAMhM,IAAQgM,EAAK,SAASA,EAAK,CAAC,IAAID;AACtC,WAAI1E,EAAG,OAAOqE,EAAUrE,EAAG,IAAI/H,CAAC,GAAG+H,EAAG,IAAI/H,CAAC,IAAIU,CAAK,MAC5C,CAACqH,EAAG,cAAcA,EAAG,MAAM/H,CAAC,KAC5B+H,EAAG,MAAM/H,CAAC,EAAEU,CAAK,GACjB8L,KACAP,GAAWrF,GAAW5G,CAAC,IAExByM;AAAA,EACnB,CAAS,IACC,IACN1E,EAAG,OAAM,GACTyE,IAAQ,IACRhO,GAAQuJ,EAAG,aAAa,GAExBA,EAAG,WAAWoE,IAAkBA,EAAgBpE,EAAG,GAAG,IAAI,IACtD9E,EAAQ,QAAQ;AAChB,QAAIA,EAAQ,SAAS;AAEjB,YAAM0J,IAAQvJ,GAASH,EAAQ,MAAM;AAErC,MAAA8E,EAAG,YAAYA,EAAG,SAAS,EAAE4E,CAAK,GAClCA,EAAM,QAAQvK,CAAM;AAAA,IACvB;AAGG,MAAA2F,EAAG,YAAYA,EAAG,SAAS,EAAC;AAEhC,IAAI9E,EAAQ,SACR4F,EAAcjC,EAAU,GAAG,QAAQ,GACvC+E,GAAgB/E,GAAW3D,EAAQ,QAAQA,EAAQ,QAAQA,EAAQ,aAAa,GAEhFsE;EACH;AACD,EAAAZ,GAAsB4F,CAAgB;AAC1C;AAoDA,MAAMK,GAAgB;AAAA,EAClB,WAAW;AACP,IAAAZ,GAAkB,MAAM,CAAC,GACzB,KAAK,WAAWlO;AAAA,EACnB;AAAA,EACD,IAAI4G,GAAMrD,GAAU;AAChB,QAAI,CAAC3C,GAAY2C,CAAQ;AACrB,aAAOvD;AAEX,UAAM+O,IAAa,KAAK,GAAG,UAAUnI,CAAI,MAAM,KAAK,GAAG,UAAUA,CAAI,IAAI,CAAA;AACzE,WAAAmI,EAAU,KAAKxL,CAAQ,GAChB,MAAM;AACT,YAAMoK,IAAQoB,EAAU,QAAQxL,CAAQ;AACxC,MAAIoK,MAAU,MACVoB,EAAU,OAAOpB,GAAO,CAAC;AAAA,IACzC;AAAA,EACK;AAAA,EACD,KAAKqB,GAAS;AACV,IAAI,KAAK,SAAS,CAAC3N,GAAS2N,CAAO,MAC/B,KAAK,GAAG,aAAa,IACrB,KAAK,MAAMA,CAAO,GAClB,KAAK,GAAG,aAAa;AAAA,EAE5B;AACL;uDCjuEMC,KAAa,CAACC,GAASC,MAAY;AACvC,EAAAD,IAAU,CAACA,CAAO,EAAE,KAAK,EAAE,KAAK;AAAA,CAAI;AAEhC,MAAA7I,IAAQ,GAAG3B,EAAI;AAAA;AAAA,EAAQwK,CAAO;AAElC,MAAIC,GAAS;AACF,IAAA9I,KAAA;AAAA;AAAA;AAAA;AAET,eAAW,CAACV,GAAK/C,CAAK,KAAK,OAAO,QAAQuM,CAAO;AAC/C,MAAA9I,KAAS,OAAOV,CAAG,KAAK,KAAK,UAAU/C,CAAK,CAAC;AAAA;AAAA,EAC/C;AAES,IAAAyD,KAAA;AAAA;AAGL,QAAA,IAAI,MAAMA,CAAK;AACvB;ACfA,IAAI+I;AACJ,MAAMC,KAAQ,IAAI,WAAW,EAAE;AAChB,SAASC,KAAM;AAE5B,MAAI,CAACF,OAEHA,KAAkB,OAAO,UAAW,eAAe,OAAO,mBAAmB,OAAO,gBAAgB,KAAK,MAAM,GAE3G,CAACA;AACH,UAAM,IAAI,MAAM,0GAA0G;AAI9H,SAAOA,GAAgBC,EAAK;AAC9B;ACjBA,MAAAE,KAAe;ACEf,SAASC,GAASC,GAAM;AACtB,SAAO,OAAOA,KAAS,YAAYF,GAAM,KAAKE,CAAI;AACpD;ACEA,MAAMC,KAAY,CAAA;AAElB,SAASxN,IAAI,GAAGA,IAAI,KAAK,EAAEA;AACzB,EAAAwN,GAAU,MAAMxN,IAAI,KAAO,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAG3C,SAASyN,GAAgBC,GAAKC,IAAS,GAAG;AAG/C,UAAQH,GAAUE,EAAIC,IAAS,CAAC,CAAC,IAAIH,GAAUE,EAAIC,IAAS,CAAC,CAAC,IAAIH,GAAUE,EAAIC,IAAS,CAAC,CAAC,IAAIH,GAAUE,EAAIC,IAAS,CAAC,CAAC,IAAI,MAAMH,GAAUE,EAAIC,IAAS,CAAC,CAAC,IAAIH,GAAUE,EAAIC,IAAS,CAAC,CAAC,IAAI,MAAMH,GAAUE,EAAIC,IAAS,CAAC,CAAC,IAAIH,GAAUE,EAAIC,IAAS,CAAC,CAAC,IAAI,MAAMH,GAAUE,EAAIC,IAAS,CAAC,CAAC,IAAIH,GAAUE,EAAIC,IAAS,CAAC,CAAC,IAAI,MAAMH,GAAUE,EAAIC,IAAS,EAAE,CAAC,IAAIH,GAAUE,EAAIC,IAAS,EAAE,CAAC,IAAIH,GAAUE,EAAIC,IAAS,EAAE,CAAC,IAAIH,GAAUE,EAAIC,IAAS,EAAE,CAAC,IAAIH,GAAUE,EAAIC,IAAS,EAAE,CAAC,IAAIH,GAAUE,EAAIC,IAAS,EAAE,CAAC,GAAG;AACvf;AChBA,MAAMC,KAAa,OAAO,UAAW,eAAe,OAAO,cAAc,OAAO,WAAW,KAAK,MAAM,GACvFC,KAAA;AAAA,EACb,YAAAD;AACF;ACCA,SAASE,GAAG7K,GAAS8K,GAAKJ,GAAQ;AAChC,MAAIE,GAAO,cAAc,CAACE,KAAO,CAAC9K;AAChC,WAAO4K,GAAO;AAGhB,EAAA5K,IAAUA,KAAW;AACrB,QAAM+K,IAAO/K,EAAQ,WAAWA,EAAQ,OAAOmK;AAK/C,MAHAY,EAAK,CAAC,IAAIA,EAAK,CAAC,IAAI,KAAO,IAC3BA,EAAK,CAAC,IAAIA,EAAK,CAAC,IAAI,KAAO,KAEvBD,GAAK;AACP,IAAAJ,IAASA,KAAU;AAEnB,aAAS3N,IAAI,GAAGA,IAAI,IAAI,EAAEA;AACxB,MAAA+N,EAAIJ,IAAS3N,CAAC,IAAIgO,EAAKhO,CAAC;AAG1B,WAAO+N;AAAA,EACR;AAED,SAAON,GAAgBO,CAAI;AAC7B;ACvBA,MAAMC,KAAa,CAAC,QAAQ,SAAS,WAAW,qBAAqB,kBAAkB,WAAW,GAC5FC,KAAW,CAAC,iBAAiB,iBAAiB,WAAW,gBAAgB,GACzEC,KAAe,CAAC,WAAW,yBAAyB,0BAA0B,GAC9EC,KAAiB,CAAC,QAAQ,QAAQ,iBAAiB,eAAe,GAClEC,KAAc,CAAC,SAAS,UAAU,SAAS,GAC3CC,KAAa,CAAC,WAAW,IAAI,GAEtBC,KAA8B,CAAClC,MAAU;AACpD,EAAAmC,GAAiBnC,GAAO,QAAe,CAAKoC,MAAAC,GAAYD,CAAC,CAAC,GAC1DD,GAAiBnC,GAAO,eAAe,CAAKoC,MAAAA,EAAE,SAAS,CAAC,GACxDD,GAAiBnC,GAAO,eAAe,CAAAoC,MAAKR,GAAW,SAASQ,CAAC,CAAC;AACpE,GAEaE,KAAgC,CAACtC,MAAU;AACtD,EAAAmC,GAAiBnC,GAAO,QAAe,CAAKoC,MAAAC,GAAYD,CAAC,CAAC,GAC1DD,GAAiBnC,GAAO,eAAe,CAAKoC,MAAAA,EAAE,SAAS,CAAC,GACxDD,GAAiBnC,GAAO,eAAe,CAAAoC,MAAKR,GAAW,SAASQ,CAAC,CAAC,GAClED,GAAiBnC,GAAO,eAAe,CAAAoC,MAAKP,GAAS,SAASO,CAAC,CAAC,GAChED,GAAiBnC,GAAO,MAAe,CAAKoC,MAAAG,GAAYH,CAAC,CAAC,GAC1DD,GAAiBnC,GAAO,aAAe,CAAKoC,MAAAI,GAAgBJ,CAAC,CAAC,GAC9DD,GAAiBnC,GAAO,UAAe,CAAKoC,MAAAA,MAAM,SAAS;AAC7D,GAEaK,KAA+B,CAACzC,MAAU;AACrD,EAAAmC,GAAiBnC,GAAO,QAAgB,CAAKoC,MAAAC,GAAYD,CAAC,CAAC,GAC3DD,GAAiBnC,GAAO,eAAgB,CAAKoC,MAAAA,EAAE,SAAS,CAAC,GACzDD,GAAiBnC,GAAO,eAAgB,CAAAoC,MAAKR,GAAW,SAASQ,CAAC,CAAC,GACnED,GAAiBnC,GAAO,eAAgB,CAAAoC,MAAKP,GAAS,SAASO,CAAC,CAAC,GACjED,GAAiBnC,GAAO,MAAgB,CAAKoC,MAAAG,GAAYH,CAAC,CAAC,GAC3DD,GAAiBnC,GAAO,aAAgB,CAAKoC,MAAAI,GAAgBJ,CAAC,CAAC,GAC/DD,GAAiBnC,GAAO,UAAgB,CAAAoC,MAAKN,GAAa,SAASM,CAAC,CAAC,GACrED,GAAiBnC,GAAO,gBAAgB,CAAK3B,MAAA,OAAOA,KAAM,QAAQ,GAClE8D,GAAiBnC,GAAO,eAAgB,CAAKoC,MAAAI,GAAgBJ,CAAC,CAAC;AACjE,GAEaM,KAAyB,CAAC1C,MAAU;AAC/C,EAAAmC,GAAiBnC,GAAO,cAAyB,CAAAoC,MAAKL,GAAe,SAASK,CAAC,CAAC,GAChFD,GAAiBnC,GAAO,eAAyB,CAAAoC,MAAKJ,GAAY,SAASI,CAAC,CAAC,GAC7ED,GAAiBnC,GAAO,cAAyB,CAAAoC,MAAKH,GAAW,SAASG,CAAC,CAAC,GAC5ED,GAAiBnC,GAAO,cAAyB,CAAAoC,MAAK,CAACA,KAAKG,GAAYH,CAAC,CAAC,GAC1ED,GAAiBnC,GAAO,cAAyB,CAAA1B,MAAK,CAACA,KAAKA,IAAI,CAAC,GACjE6D,GAAiBnC,GAAO,gBAAyB,CAAA1B,MAAK,CAACA,KAAKA,IAAI,CAAC,GACjE6D,GAAiBnC,GAAO,SAAyB,CAAA1B,MAAK,CAACA,KAAKA,IAAI,CAAC,GACjE6D,GAAiBnC,GAAO,YAAyB,CAAA1B,MAAK,CAACA,KAAKA,IAAI,CAAC,GACjE6D,GAAiBnC,GAAO,oBAAyB,CAAAoC,MAAK,CAACA,KAAKG,GAAYH,CAAC,CAAC,GAC1ED,GAAiBnC,GAAO,qBAAyB,CAAAoC,MAAK,CAACA,KAAKG,GAAYH,CAAC,CAAC,GAC1ED,GAAiBnC,GAAO,sBAAyB,CAAK1B,MAAAA,KAAK,CAAC,GAC5D6D,GAAiBnC,GAAO,YAAyB,CAAK1B,MAAAA,KAAK,CAAC,GAC5D6D,GAAiBnC,GAAO,yBAAyB,CAAA1B,MAAKA,KAAK,KAAKA,KAAK,GAAG,GACxE6D,GAAiBnC,GAAO,yBAAyB,CAAK1B,MAAAA,KAAK,CAAC,GAC5D6D,GAAiBnC,GAAO,SAAyB,CAAK1B,MAAAA,KAAK,CAAC,GAC5D6D,GAAiBnC,GAAO,YAAyB,CAAKoC,MAAAA,EAAE,SAAS,CAAC,GAClED,GAAiBnC,GAAO,YAAyB,CAAKoC,MAAA,OAAOA,KAAM,QAAQ,GAC3ED,GAAiBnC,GAAO,kBAAyB,CAAKoC,MAAAA,EAAE,SAAS,CAAC,GAClED,GAAiBnC,GAAO,sBAAyB,CAAKoC,MAAAA,EAAE,SAAS,CAAC;AACpE,GAEMC,KAAc,CAACM,MAAW;AAC9B,EAAAA,IAASA,KAAU;AAEnB,QAAMC,IAAoBD,EAAO,CAAC,MAAMA,EAAO,CAAC,EAAE,eAC5CE,IAAmBF,EAAO,MAAM,WAAW;AAEjD,SAAOC,KAAqB,CAACC;AAC/B,GAEML,KAAkB,CAACG,MAAW;AAC9B,MAAA;AAEK,WADM,IAAI,KAAK,KAAK,MAAMA,CAAM,CAAC,EAC5B,YAAkB,MAAAA;AAAA,WACvB7K,GAAO;AACP,WAAA;AAAA,EACT;AACF,GAEMqK,KAAmB,CAACnC,GAAO7J,GAAM2M,MAAiB;AACtD,EAAK,OAAO,UAAU,eAAe,KAAK9C,GAAO7J,CAAI,KACxCuK,GAAA,6BAA6BvK,CAAI,cAAc6J,CAAK,GAG5D8C,EAAa9C,EAAM7J,CAAI,CAAC,KAC3BuK,GAAW,mBAAmBvK,CAAI,KAAK6J,EAAM7J,CAAI,CAAC,gBAAgB6J,CAAK;AAE3E,GCnFM+C,KAAW,CAAC/C,MAAU;AAC1B,EAAAkC,GAA4BlC,CAAK;AAEjC,QAAMgD,IAAKC,MACLC,KAAY,oBAAI,KAAK,GAAE,YAAY;AAGzC,SAAOC,GAAA,EAAE,IAAAH,GAAI,WAAAE,GAAW,QAFT,aAEoBlD;AACrC,GCXMoD,KAAkB,CAACtR,GAAKgL,IAAS,OAAO;AACxC,MAAAjK;AAEA,MAAA;AAAQ,IAAAA,IAAA,IAAI,IAAIf,CAAG;AAAA,WAAY2G,GAAG;AAAS,WAAA3G;AAAA,EAAK;AACpD,QAAMuR,IAAS,IAAI,gBAAgBxQ,EAAI,MAAM;AAE7C,aAAW,CAACuE,GAAK/C,CAAK,KAAK,OAAO,QAAQyI,CAAM;AACvC,IAAAuG,EAAA,IAAIjM,GAAK/C,CAAK;AAGnB,SAAAxB,EAAA,SAASwQ,EAAO,YACbxQ,EAAI;AACb,GCTMyQ,KAAoB,CAACC,GAAeC,MAAiB;AACnD,QAAAC,IAAa,OAAO,SAAS,aAAa,aAC1C3G,IAAS,CAAA;AAIf,SAAAA,EAAO,WAAW,UAIXA,EAAA,MAAMyG,MAAkB,iBAAiB,IAAI,GAI7CzG,EAAA,OAAOyG,MAAkB,6BAA6B,IAAI,GAI1DzG,EAAA,UAAU0G,IAAe,gBAAgB,SAM5CC,MAAc3G,EAAO,QAAPA,EAAO,MAAQ,iCAI7B2G,MAAc3G,EAAO,oBAAPA,EAAO,kBAAoB,iCAKxC2G,MAAqB3G,EAAA,kBAAkB,OAAO,SAAS,OAErDA;AACT,GCvCM4G,KAAmB,CAAChO,MAAY;AACpC,MAAI,CAACA;AAAkB,WAAA;AAEvB,QAAMiO,IAAS,OAAO,eAAe,SAAS,gBAAgB,cACxDC,IAAQ,OAAO,cAAc,SAAS,gBAAgB,aAEtD,EAAE,KAAAC,GAAK,QAAAC,GAAQ,MAAAC,GAAM,OAAAC,MAAUtO,EAAQ;AAC7C,SAAOmO,IAAMF,KAAUG,IAAS,KAAKC,IAAOH,KAASI,IAAQ;AAC/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iDCuBIC,IAAA,IAAA,OAAA,IAAA,UAAAC,CAAA,GACAD,EAAA,iBAAA,OAAA,IAAA,sBAAA,KAAA,oBAAAE,GAAA,EAAA,GACAF,EAAA,iBAAA,OAAA,IAAA,aAAA,KAAA,UAAAG,IAAA,EAAA,GAEAC,IAAA,IAAA,OAAA,IAAA,WAAA,mBAEAA,EAAA,oBAAAC,EAAA,aACAD,EAAA,qBAAAC,EAAA;KAKIH,IAAA,CAAAI,MAAA;AACJ,IAAAC,EAAA,IAAAC,IAAAF,EAAA,cAAAD,CAAA,CAAA,GAEAG,EAAA,iBAAA,OAAA,IAAA,QAAA,KAAA,aAAAC,CAAA,GACAD,EAAA,iBAAA,OAAA,IAAA,QAAA,KAAA,OAAAE,CAAA,GACAF,EAAA,iBAAA,OAAA,IAAA,QAAA,KAAA,QAAAG,CAAA,GACAH,EAAA,iBAAA,OAAA,IAAA,QAAA,KAAA,0BAAAI,CAAA,GACAJ,EAAA,iBAAA,OAAA,IAAA,aAAA,KAAA,UAAAL,EAAA;AAAA;YAKA;AAAA,MAAAU,IAAA,IAEAR,EAAA,MAAA,GACAA,EAAA,KAAA,GACAJ,EAAA,WAAA;;AAGE,QAAAO,EAAA,KAAAH,EAAA,aAAAA,EAAA,cAAA,OAAA,IAAA,SAAA,MAAA,GACAG,EAAA,MAAA;;;;;KAQEC,IAAA,CAAAK,MAAA;uBAEJC,EAAA,YAAA,KAAA,OAEAC,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,oDAMFkC,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;AAKF,IAAAkC,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;AAKE,IAAAmC,MAAA,aACJV,EAAA,GAAAU,IAAA,QAAA,GAEAD,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;AAKF,IAAAkC,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;AAKF,IAAAoC,IAAAA,KAAAJ,EAAA,YACAN,KAAA,QAAAA,EAAA,WAEAQ,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAAqC;AAAA,MACA,cAAA,GAAAD,EAAA,WAAA,CAAA,UAAAA,EAAA,aAAA,CAAA;AAAA;;AAKF,IAAAF,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAAqC;AAAA,MACA,cAAA;AAAA;;AAKI,UAAAC,IAAA,SAAA,iBAAAC,CAAA;;;AAIE,YAAAC,KAAA,oCAGAC,IADAnQ,EAAA,MAAA,QAAA,MAAAkQ,EAAA,EAAA,OAAA,CAAAnD,MAAAA,CAAA,EACA,IAAA,CAAAA,MAAAA,EAAA,SAAA,YAAA,IAAAA,IAAA,GAAAA,CAAA,aAAA;;;;UASRoC,EAAA,GAAAiB,IAAAC,EAAA,CAAA,GACAjB,EAAA,OAAAH,EAAA,aAAAA,EAAA,cAAA,OAAA,IAAA,SAAA,MAAA,GACA,sBAAAqB,CAAA;AAAA;;;AAMI,QAAAT,MAAA,WAAA;;;;AAIF,aAAAF,EAAA,YAAA,KAAA;;;;;;;;;;;;aArJJI,IAAAhC,GAAAwC,GAAAC,CAAA;YAEApB,KAAAS,MAAA,aAAAY;aACAZ,MAAA,YAA6CT,KAAA,QAAAA,EAAA,WAAuBA,KAAA,QAAAA,EAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxBtE,MAAMsB,KAAsB,CAACC,GAAaC,MAAiB;AACzD,MAAI,CAACD;AAAe,WAAO;AAE3B,QAAME,KAASF,EAAY,SAAS,CAAI,GAAA,IAAI,CAAM,MAAAG,GAAAhD,GAAA,IAAK,IAAL,EAAQ,QAAQ,QAAA,EAAU,GACtEmB,KAAS0B,EAAY,SAAS,CAAI,GAAA,IAAI,CAAM,MAAAG,GAAAhD,GAAA,IAAK,IAAL,EAAQ,QAAQ,QAAA,EAAU;AAExE,SAAAO,GAAiBuC,CAAY,IACxB,CAAC,GAAG3B,GAAO,GAAG4B,CAAK,IAEnB,CAAC,GAAGA,GAAO,GAAG5B,CAAK;AAE9B,GCbM8B,KAAY,CAAOC,GAAQ/B,GAAOgC,GAAKC,GAASC,GAAMC,MAAkBC,GAAA;AfA9E,MAAAC,GAAAC,GAAAC;AeCE,MAAI,CAACvC;AAAS;AAEd,QAAMwC,IAAaxC,EAAM,QACnByC,IAAWzC,EAAM;AAEtB,GAAAqC,IAAA,MAAML,MAAN,QAAAK,EAAY,gBACZC,IAAA,MAAMN,MAAN,QAAAM,EAAY;AAEb,QAAMI,KAASX,KAAU,CAAA,GAAI,gBAAgB,yBACvCY,IAAgB3C,EAAM,YAAY,+BAA+B,GAEjE4C,IAAMF,KAAS,CAACC,MAAkB,MAAME,GAAe;AAG7D,WAFsBD,IAAAA,KAAAA,gBAAAA,EAAK,gBAALA,gBAAAA,EAAAA,KAAAA,OAGdZ,IAAA,IAAIY,EAAI,EAAE,cAAc,IAAY,eAAAT,EAAc,CAAG,GAE3DH,EAAI,GAAGY,EAAI,OAAO,OAAOX,CAAO,GAE5BD,EAAA,WAAWD,EAAO,GAAG,GACzBC,EAAI,YAAYhC,CAAK,MAErBA,EAAM,gBAAgB,KAAK,GAC3BA,EAAM,KAAK,IAGRwC,KAAmBN,KACxBlC,EAAM,eAAeyC,GAEdT;AACT;AAEA,IAAIY;AACJ,MAAMC,KAAiB,MAAYT,GAAA;AACjC,MAAIQ;AAAc,WAAAA;AAClB,QAAMnN,IAAW,OAAO;AAEf,SAAAmN,aAAA,MAAM,OAAO,8BAA8B,GAAG,UACvDA,YAAQ,OAAO,MAEf,OAAO,MAAMnN,GACNmN;AACT,IC3CeE,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBe1G,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBe2G,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,qBAAqB;AAAA,EACrB,WAAW;AAAA;AAAA,EAGX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCrBeC,KAAA;AAAA,EACb,qBAAqB;AAAA,EACrB,WAAW;AAAA;AAAA,EAGX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCrBeC,KAAA;AAAA,EACb,qBAAqB;AAAA,EACrB,WAAW;AAAA;AAAA,EAGX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCrBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBeC,KAAA;AAAA,EACb,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAGrB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,eAAe;AACjB;;;8CCtBMC,KAAW,CAACC,MACCA,EAAK,MAAM,GAAG,EAAE,IAAI,EACX,MAAM,GAAG,EAAE,CAAC,GCAlCC,KAAuB,CAACC,GAASC,MAAc;AACnD,EAAAC,GAA0BF,GAASC,CAAS,GAC5CE,GAAyBH,CAAO,GAChCI,GAAwBJ,CAAkB;AAC5C,GAEME,KAA4B,CAACF,GAASC,MAAc;AACxD,aAAWI,KAAU,OAAO,KAAKL,CAAO,GAAG;AACzC,UAAMM,IAAWD,EAAO,MAAM,GAAG,EAAE,CAAC;AAChC,IAAAJ,EAAUK,CAAQ,KAEX9N,GAAA;AAAA,MACT,iBAAiB8N,CAAQ,8CAA8CD,CAAM;AAAA,MAC7E,sEAAsEA,CAAM;AAAA,IAAA,CAC7E;AAAA,EACH;AACF,GAEMF,KAA2B,CAACH,MAAY;AAC5C,QAAMO,IAAW,CAAA;AAEjB,aAAW,CAACF,GAAQG,CAAY,KAAK,OAAO,QAAQR,CAAO,GAAG;AAC5D,UAAMM,IAAWD,EAAO,MAAM,GAAG,EAAE,CAAC;AAChC,IAACG,EAAa,yBAETD,EAAAD,OAAAC,EAAAD,KAAc,KACdC,EAAAD,CAAQ,EAAE,KAAKD,CAAM;AAAA,EAChC;AAEA,aAAW,CAACC,GAAUN,CAAO,KAAK,OAAO,QAAQO,CAAQ;AACnDP,IAAAA,EAAQ,WAAW,KAEZxN,GAAA;AAAA,MACT,iBAAiB8N,CAAQ,uCAAuCN,EAAQ,IAAI,CAAA,MAAK,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,MACrG;AAAA,IAAA,CACD;AAEL,GAEMI,KAA0B,CAACJ,MAAY;AACrC,QAAAS,IAAU,OAAO,OAAOT,CAAO,EAAE,IAAI,OAAO,IAAI,EAAE,QAClDU,IAAW,IAAI,IAAID,EAAQ,OAAO,CAAK5c,MAAAA,MAAM,sBAAsB,CAAC;AAE1E,aAAW,CAACwc,GAAQG,CAAY,KAAK,OAAO,QAAQR,CAAO;AACzD,eAAW9W,KAAOwX;AACZ,MAAAF,EAAatX,CAAG,KAETsJ,GAAA;AAAA,QACT,eAAe6N,CAAM,qCAAqCnX,CAAG;AAAA,QAC7D,eAAeA,CAAG,sCAAsCmX,CAAM;AAAA,MAAA,CAC/D;AAGP,GCnDMM,gnGACAC,KAAQ,OAAO,QAAQD,EAAO,EAAE,IAAI,CAAC,CAAC9c,GAAGgd,CAAC,MAAM,CAAChB,GAAShc,CAAC,GAAGgd,EAAE,OAAO,CAAC,GAExEb,KAAU,OAAO,YAAYY,GAAM,OAAO,CAAC,CAAC/c,GAAGid,CAAC,MAAMjd,EAAE,SAAS,GAAG,CAAC,CAAC,GACtEoc,KAAY,OAAO,YAAYW,GAAM,OAAO,CAAC,CAACE,GAAGD,CAAC,MAAMA,EAAE,oBAAoB,EAAE,IAAI,CAAC,CAAChd,GAAGgd,CAAC,MAAM,CAAChd,EAAE,MAAM,GAAG,EAAE,CAAC,GAAGgd,CAAC,CAAC,CAAC;AAE3Hd,GAAqBC,IAASC,EAAS;AAEvC,MAAMc,KAAY,CAAC7X,GAAK,EAAE,QAAAmX,EAAO,IAAI,CAAA,MAAO;AACpC,QAAAG,IAAeQ,GAAiCX,CAAM;AAExD,SAACG,EAAatX,CAAG,KACRsJ,GAAA;AAAA,IACT,kCAAkCtJ,CAAG;AAAA,IACrC,kBAAkBA,CAAG;AAAA,EAAA,CACtB,GAGIsX,EAAatX,CAAG;AACzB,GAEM8X,KAAmC,CAACX,IAAS,SAAS;AACpD,QAAAY,IAAe,CAACZ,GAAQ,GAAG,UAAU,WAAW,IAAI,EAAE,OAAO,CAAAnM,MAAKA,CAAC;AAEzE,aAAWmM,KAAUY,GAAc;AACjC,UAAMX,IAAWD,EAAO,MAAM,GAAG,EAAE,CAAC;AAMhC,QAAAL,GAAQK,CAAM;AAAK,aAAOL,GAAQK,CAAM;AACxC,QAAAJ,GAAUK,CAAQ;AAAK,aAAOL,GAAUK,CAAQ;AAAA,EACtD;AACF,GCtCMY,KAAc,CAAC1Y,MAAUA,EAAM,cAAc,KAAK,GCAlD2Y,KAAmB,CAACC,GAAUC,MAAS;AAC3C,QAAMC,IAAYF,EAAS,UAAU,CAAKlN,MAAAA,EAAE,YAAYmN,CAAI,GACtDE,IAAcD,MAAc,IAE5BE,IAAYF,IAAY;AAG9B,SAFuBE,MAAc,KAG5B,IACED,IACFH,EAAS,SAAS,IAElBI;AAEX,GCdMC,KAAkB,CAACC,GAAS3J,MAAiB;AACjD,QAAMI,IAASuJ,EAAQ,KAAK,CAAAvJ,MAAU;AjIDxC,QAAAM,GAAAC,GAAAC;AiIEI,UAAMgJ,IAAaxJ,EAAO,SAAOM,IAAAV,KAAA,gBAAAA,EAAc,eAAd,gBAAAU,EAA0B,WAAWN,EAAO,OACvEyJ,MAAazJ,IAAAA,EAAO,QAAPA,gBAAAA,EAAY,SAAS,eAAYQ,IAAAZ,KAAA,gBAAAA,EAAc,eAAd,gBAAAY,EAA0B,WAAW;AAEzF,WAAOgJ,KAAcC;AAAA,EAAA,CACtB;AAED,SAAKzJ,KAAU,QAAQ,KAAK,oEAAoE,GACzFA;AACT;;;;;;;;;;uBCwNwB1T,GAAA0T,EAAA,KAAA0J,IAAA;AAAA,MAAA7c,EAAA,EAAA,CAAA;AAAA,MAAAA,EAAA,EAAA,CAAA,EAAA,KAAkB8c,GAAA3J,GAAA,OAAA0J,CAAA;;;;wBAAiCE,IAAAxZ;AAAA,QAAA4P;AAAA,QAAA;AAAA;AAAA,QAAAnT,EAAA,EAAA;AAAA;AAAA,UAAAA,EAAA,EAAA;AAAA,QAAA;AAAA,MAAA;;;aAAnDK,EAAA,CAAA;AAAA,MAAA,SAAA,CAAAZ,GAAA0T,EAAA,KAAA0J,IAAA;AAAA,MAAA7c,EAAA,EAAA,CAAA;AAAA,MAAAA,EAAA,EAAA,CAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCASkF8c,GAAAxd,GAAA,cAAAyc,GAAA,aAAA,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BA/MpG3I,IAAA,SAEAiJ,IAAA,GACAW,KAAA,GACAC,KAAA1K;AAEE,QAAA2K,IAAA,CAAA3W,MAAA+K,EAAA,GAAA+K,IAAA9V,CAAA,GACA+M,IAAA,MAAA;AlInCR,QAAAG;AkImCQ,YAAAA,IAAArC,KAAA,gBAAAA,EAAA,WAAA,gBAAAqC,EAAA,MAAA0J;AAAA;SAoCW,aAAAC,CAAA,GACf9L,EAAA,IAAA8L,IAAA,WAAA,MAAA9L,EAAA,IAAA8L,IAAA,IAAA,GAAA,GAAA,CAAA;AAAA;AAIA,IAAArL,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;AAKF,IAAAkC,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;AAKF,IAAAkC,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;AAKF,IAAAkC,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;AAKI,UAAAwN,IAAAZ,GAAAC,GAAAtL,CAAA;AAEN,IAAAW,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;;SASFkC,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;AAKF,IAAAkC,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;;;;AAQF,IAAAkC,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;KAIEsN,KAAA,CAAAvY,MAAA;;;AAGJ,IAAAmN,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;KAIEyN,KAAA,CAAAC,MAAA,MAAA;IACEA,MAAAb,EAAA,SAAA,KAGN3K,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA6M,EAAA,CAAA,EAAA;AAAA,MACA,cAAA;AAAA;;AlIxKN,QAAAjJ;AkI6KS,IAAArQ,GAAA,WAEEqQ,KAAA,MAAAL,MAAA,QAAAK,GAAA,WACPnC,EAAA,IAAA8B,IAAA,IAAA,GAEArB,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA6M,EAAA,CAAA,EAAA;AAAA,MACA,cAAA,GAAAtZ,GAAA,IAAA,IAAAA,GAAA,OAAA;AAAA;;AAKF,IAAA2O,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;;AAKI,UAAA2N,IAAA,iBAAA,oBAAAC,EAAA,GACAC,KAAA,iBAAA,0BAAAD,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAjKR,CAAAE,KAAAT,EAAA3K,CAAA;iBAGAjB,EAAA,IAAAsM,IAAAC,EAAAC,CAAA,CAAA;WACAxM,EAAA,IAAA8K,KAAAwB,KAAA,gBAAAA,EAAA,aAAA,CAAA,CAAA;;;SAGAtM,EAAA,IAAAyM,IAAAf,OAAA,CAAA;UACA1L,EAAA,IAAA0M,IAAAD,IAAA,MAAAd,EAAA,KAAA,EAAA;;iBAGA,CAAAgB,KAAA3M,EAAA,IAAAwB,IAAA6K,CAAA;;WACA,CAAAM,KAAA,CAAAN,KAAArM,EAAA,IAAAwB,IAAA8K,CAAA;;WAEAtM,EAAA,IAAAoL,IAAA7J,GAAAC,GAAA1B,CAAA,CAAA;;UACAE,EAAA,IAAA8B,IAAAF,GAAAwJ,EAAA,CAAA,GAAAtL,GAAAgC,GAAA8K,IAAA5K,GAAAyK,KAAAd,EAAA,CAAA;iBAEA3L,EAAA,IAAAoB,IAAAiL,KAAA,gBAAAA,EAAA,OAAA;iBACArM,EAAA,IAAA6M,IAAAR,KAAA,gBAAAA,EAAA,eAAA;YAEA,CAAAjL,MAAAV,MAAA,YAAAsB,EAAA,IAAAlC,KAAA,QAAAA,EAAA;YACAE,EAAA,IAAA8M,IAAA,CAAA;kBAEA9M,EAAA,IAAA+M,IAAAC,KAAAC,OAAA;;SACAjN,EAAA,IAAA5O,IAAA4b,IAAA,UAAAE,EAAA,KAAA,EAAA;;;UAIAlN,EAAA,IAAAmN,IAAAR,KAAAN,KAAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACJF,SAASC,GAAS,GAAG;AACjB,QAAMC,IAAI,IAAI;AACd,SAAOA,IAAIA,IAAIA,IAAI;AACvB;ACZA,SAASC,GAAI1c,GAAM,EAAE,OAAA8D,IAAQ,GAAG,UAAAD,IAAW,KAAK,QAAAuE,IAASoU,IAAU,GAAAlgB,IAAI,GAAG,GAAAqgB,IAAI,GAAG,SAAAC,IAAU,EAAG,IAAG,IAAI;AACjG,QAAMrc,IAAQ,iBAAiBP,CAAI,GAC7B6c,IAAiB,CAACtc,EAAM,SACxBuc,IAAYvc,EAAM,cAAc,SAAS,KAAKA,EAAM,WACpDwc,IAAKF,KAAkB,IAAID,IAC3B,CAACI,GAAQC,CAAK,IAAIhe,GAAe3C,CAAC,GAClC,CAAC4gB,GAAQC,CAAK,IAAIle,GAAe0d,CAAC;AACxC,SAAO;AAAA,IACH,OAAA7Y;AAAA,IACA,UAAAD;AAAA,IACA,QAAAuE;AAAA,IACA,KAAK,CAAChE,GAAGgZ,MAAM;AAAA,gBACPN,CAAS,eAAe,IAAI1Y,KAAK4Y,CAAM,GAAGC,CAAK,MAAM,IAAI7Y,KAAK8Y,CAAM,GAAGC,CAAK;AAAA,cAC9EN,IAAkBE,IAAKK,CAAE;AAAA,EACvC;AACA;;;;;;;;;;;6ZC9DYzC,GAAA0C,GAAA,SAAAC,IAAA;AAAA,MAAAzf,EAAA,CAAA,CAAA,GAAoB8c,GAAA0C,GAAA,UAAAE,IAAA;AAAA,MAAA1f,EAAA,CAAA,CAAA;;;;;;;;;;;;SAApBK;AAAA,MAAA,KAAAof,OAAAA,IAAA;AAAA,MAAAzf,EAAA,CAAA,yBAAoBK;AAAA,MAAA,KAAAqf,OAAAA,IAAA;AAAA,MAAA1f,EAAA,CAAA;;;;;;;;;;AAJnB,MAAA,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qoBCGDuP,GAAA0C,GAAA,SAAAC,IAAA;AAAA,MAAAzf,EAAA,CAAA,CAAA,GAAoB8c,GAAA0C,GAAA,UAAAE,IAAA;AAAA,MAAA1f,EAAA,CAAA,CAAA;;;;;;;;;;;;SAApBK;AAAA,MAAA,KAAAof,OAAAA,IAAA;AAAA,MAAAzf,EAAA,CAAA,yBAAoBK;AAAA,MAAA,KAAAqf,OAAAA,IAAA;AAAA,MAAA1f,EAAA,CAAA;;;;;;;;;;AAJnB,MAAA,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SCyBsHsS,GAAAC,GAAA,kBAAA;AAAA,MAAA9f,EAAA,CAAA,IAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAAA6f,GAAAC,GAAA,kBAAA;AAAA,MAAA9f,EAAA,CAAA,IAAA,IAAA;;;;;;;;;;;;;;;;;;;;SApBtH,EAAA,WAAA+f,IAAA,GAAA,IAAAxS,GACA,EAAA,UAAAyS,IAAA,EAAA,IAAAzS,GACA,EAAA,OAAAoS,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;AAKL,QAAA0S,IAAA,CAAAzc,MAAA;AACJ,IAAAA,EAAA,eAAA;AACM,UAAAP,IAAA8c,IAAA,UAAA;AAEN,IAAAhO,EAAAlC,GAAA;AAAA,MACE,MAAA,UAAA5M,CAAA;AAAA;MAEA,aAAA;AAAA;;;;;;kBATuB8Y,OAAA,eAA0B,WAA1B,CAA0B;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SC6ByHe,GAAAgD,GAAA,cAAA/D,GAAA,oBAAA,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YArCnK,EAAA,MAAAmE,IAAA,EAAA,IAAA3S,GACA,EAAA,OAAAoS,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;AAOT,IAAAwE,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;KAIEsQ,IAAA,CAAA3c,MAAA;;8BAG8BU,IAAA,oCACAA,IAAA,oCACAA,IAAA,iCACAA,IAAA,yBACAA,IAAA,gCACAA,IAAA,gBAGlCV,EAAA,eAAA,GAEAuO,EAAAlC,GAAA;AAAA,MACE,MAAA,UAAA3L,CAAA;AAAA;MAEA,aAAA;AAAA;;;;;;UA3BJoN,EAAA,GAAA8O,IAAA,GAAA,KAAAT,CAAA,IAAA;UACArO,EAAA,GAAA+O,IAAA,GAAA,KAAAV,CAAA,IAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uJCLU7C,GAAA0C,GAAA,SAAAC,IAAA;AAAA,MAAAzf,EAAA,CAAA,CAAA,GAAoB8c,GAAA0C,GAAA,UAAAE,IAAA;AAAA,MAAA1f,EAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;SAApBK;AAAA,MAAA,KAAAof,OAAAA,IAAA;AAAA,MAAAzf,EAAA,CAAA,yBAAoBK;AAAA,MAAA,KAAAqf,OAAAA,IAAA;AAAA,MAAA1f,EAAA,CAAA;;;;;;;;;;AALnB,MAAA,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS,GACA,EAAA,SAAA+S,IAAA,GAAA,IAAA/S;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mMCEDuP,GAAA0C,GAAA,SAAAC,IAAA;AAAA,MAAAzf,EAAA,CAAA,CAAA,GAAoB8c,GAAA0C,GAAA,UAAAE,IAAA;AAAA,MAAA1f,EAAA,CAAA,CAAA;;;;;;;;;;;;SAApBK;AAAA,MAAA,KAAAof,OAAAA,IAAA;AAAA,MAAAzf,EAAA,CAAA,yBAAoBK;AAAA,MAAA,KAAAqf,OAAAA,IAAA;AAAA,MAAA1f,EAAA,CAAA;;;;;;;;;;AAJnB,MAAA,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6LCGDuP,GAAA0C,GAAA,SAAAC,IAAA;AAAA,MAAAzf,EAAA,CAAA,CAAA,GAAoB8c,GAAA0C,GAAA,UAAAE,IAAA;AAAA,MAAA1f,EAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;SAApBK;AAAA,MAAA,KAAAof,OAAAA,IAAA;AAAA,MAAAzf,EAAA,CAAA,yBAAoBK;AAAA,MAAA,KAAAqf,OAAAA,IAAA;AAAA,MAAA1f,EAAA,CAAA;;;;;;;;;;AAJnB,MAAA,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBCMA,EAAA,OAAA7K,IAAA,WAAA,IAAA6K,GACA,EAAA,OAAAoS,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;;SAyBPpI,IAAA,sBACAob,IAAA,mDAEApb,IAAA,mBACAob,IAAA,qEAGApb,IAAA,oBACAob,IAAA,2CAGFxO,EAAAlC,GAAAI,GAAA;AAAA;;MAAsC,aAAA;AAAA;;;;;;;;WA7BxCqB,EAAA,GAAAkP,IAAA9d,MAAA,UAAA;WACA4O,EAAA,GAAAmP,IAAA/d,EAAA,WAAA,SAAA,CAAA;WACA4O,EAAA,GAAAoP,IAAAhe,MAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uJCbUoa,GAAA0C,GAAA,SAAAC,IAAA;AAAA,MAAAzf,EAAA,CAAA,CAAA,GAAoB8c,GAAA0C,GAAA,UAAAE,IAAA;AAAA,MAAA1f,EAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;SAApBK;AAAA,MAAA,KAAAof,OAAAA,IAAA;AAAA,MAAAzf,EAAA,CAAA,yBAAoBK;AAAA,MAAA,KAAAqf,OAAAA,IAAA;AAAA,MAAA1f,EAAA,CAAA;;;;;;;;;;AALnB,MAAA,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS,GACA,EAAA,SAAA+S,IAAA,GAAA,IAAA/S;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2LCEDuP,GAAA0C,GAAA,SAAAC,IAAA;AAAA,MAAAzf,EAAA,CAAA,CAAA,GAAoB8c,GAAA0C,GAAA,UAAAE,IAAA;AAAA,MAAA1f,EAAA,CAAA,CAAA;;;;;;;;;;;;SAApBK;AAAA,MAAA,KAAAof,OAAAA,IAAA;AAAA,MAAAzf,EAAA,CAAA,yBAAoBK;AAAA,MAAA,KAAAqf,OAAAA,IAAA;AAAA,MAAA1f,EAAA,CAAA;;;;;;;;;;AAJnB,MAAA,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wLCGDuP,GAAA0C,GAAA,SAAAC,IAAA;AAAA,MAAAzf,EAAA,CAAA,CAAA,GAAoB8c,GAAA0C,GAAA,UAAAE,IAAA;AAAA,MAAA1f,EAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;SAApBK;AAAA,MAAA,KAAAof,OAAAA,IAAA;AAAA,MAAAzf,EAAA,CAAA,yBAAoBK;AAAA,MAAA,KAAAqf,OAAAA,IAAA;AAAA,MAAA1f,EAAA,CAAA;;;;;;;;;;AAJnB,MAAA,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBCMA,EAAA,OAAA7K,IAAA,WAAA,IAAA6K,GACA,EAAA,OAAAoS,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;;SAyBPpI,IAAA,sBACAob,IAAA,+CAEApb,IAAA,oBACAob,IAAA,kEAGApb,IAAA,oBACAob,IAAA,uCAGFxO,EAAAlC,GAAAI,GAAA;AAAA;;MAAsC,aAAA;AAAA;;;;;;WAhCxCqB,EAAA,IAAAqP,IAAA,WAAAje,EAAA,MAAA,GAAA,EAAA,CAAA,KAAA,EAAA,CAAA;YACA4O,EAAA,GAAAsP,IAAA,WAAAle,EAAA,MAAA,GAAA,EAAA,CAAA,KAAAie,CAAA,CAAA;WAEArP,EAAA,GAAAkP,IAAA9d,MAAA,UAAA;WACA4O,EAAA,GAAAmP,IAAA/d,EAAA,WAAA,SAAA,CAAA;WACA4O,EAAA,GAAAoP,IAAAhe,MAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4XCdUoa,GAAA0C,GAAA,SAAAC,IAAA;AAAA,MAAAzf,EAAA,CAAA,CAAA,GAAoB8c,GAAA0C,GAAA,UAAAE,IAAA;AAAA,MAAA1f,EAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;SAApBK;AAAA,MAAA,KAAAof,OAAAA,IAAA;AAAA,MAAAzf,EAAA,CAAA,yBAAoBK;AAAA,MAAA,KAAAqf,OAAAA,IAAA;AAAA,MAAA1f,EAAA,CAAA;;;;;;;;;;AAJnB,MAAA,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;m4BCGDuP,GAAA0C,GAAA,SAAAC,IAAA;AAAA,MAAAzf,EAAA,CAAA,CAAA,GAAoB8c,GAAA0C,GAAA,UAAAE,IAAA;AAAA,MAAA1f,EAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;SAApBK;AAAA,MAAA,KAAAof,OAAAA,IAAA;AAAA,MAAAzf,EAAA,CAAA,yBAAoBK;AAAA,MAAA,KAAAqf,OAAAA,IAAA;AAAA,MAAA1f,EAAA,CAAA;;;;;;;;;;AAJnB,MAAA,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCCoBuHsS,GAAAC,GAAA,kBAAA;AAAA,MAAA9f,EAAA,CAAA,IAAA,IAAA,GAA0B8c,GAAAgD,GAAA,cAAA/D,GAAA,gBAAA,CAAA;AAAA;;;;;;;;;;;;;;;;;;;YAA1B8D,GAAAC,GAAA,kBAAA;AAAA,MAAA9f,EAAA,CAAA,IAAA,IAAA;AAAA;;;;;;;;;;;;;0DAbvH,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;AAIT,IAAAwE,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;m7DCZMiN,GAAA0C,GAAA,SAAAC,IAAA;AAAA,MAAAzf,EAAA,CAAA,CAAA,GAAoB8c,GAAA0C,GAAA,UAAAE,IAAA;AAAA,MAAA1f,EAAA,CAAA,CAAA;;;;;;;;;;;;SAApBK;AAAA,MAAA,KAAAof,OAAAA,IAAA;AAAA,MAAAzf,EAAA,CAAA,yBAAoBK;AAAA,MAAA,KAAAqf,OAAAA,IAAA;AAAA,MAAA1f,EAAA,CAAA;;;;;;;;;;AAJnB,MAAA,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oHCiByGsS,GAAAC,GAAA,kBAAA;AAAA,MAAA9f,EAAA,CAAA,IAAA,IAAA,GAA4B8c,GAAAgD,GAAA,cAAA/D,GAAA,eAAA,CAAA;AAAA;;;;;;;;;;;;;;;;;;;YAA5B8D,GAAAC,GAAA,kBAAA;AAAA,MAAA9f,EAAA,CAAA,IAAA,IAAA;AAAA;;;;;;;;;;;;;AAbzG,MAAA,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;AAIT,IAAAwE,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8OCTMiN,GAAA0C,GAAA,SAAAC,IAAA;AAAA,MAAAzf,EAAA,CAAA,CAAA,GAAoB8c,GAAA0C,GAAA,UAAAE,IAAA;AAAA,MAAA1f,EAAA,CAAA,CAAA;;;;;;;;;;;;SAApBK;AAAA,MAAA,KAAAof,OAAAA,IAAA;AAAA,MAAAzf,EAAA,CAAA,yBAAoBK;AAAA,MAAA,KAAAqf,OAAAA,IAAA;AAAA,MAAA1f,EAAA,CAAA;;;;;;;;;;AAJnB,MAAA,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SCkB+EsS,GAAAC,GAAA,kBAAA;AAAA,MAAA9f,EAAA,CAAA,IAAA,IAAA,GAA4E8c,GAAAgD,GAAA,cAAA/D,GAAA,aAAA,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;YAA5E8D,GAAAC,GAAA,kBAAA;AAAA,MAAA9f,EAAA,CAAA,IAAA,IAAA;AAAA;;;;;;;;;;;;;AAd/E,MAAA,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS,GACA,EAAA,QAAAsT,IAAA,OAAA,IAAAtT;;;AAIT,IAAAwE,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SCWHiR;AAAA;AAAA,KAAA9gB,EAAA,CAAA,KAAA,MAAA;AAAA;;;4BADoB8c,GAAAxd,GAAA,SAAAyhB,IAAA;AAAA,MAAA/gB,EAAA,CAAA,IAAA;AAAA,MAAAA,EAAA,CAAA,IAAA,iBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACpB,MAAAK;AAAA,MAAA,MAAAygB,OAAAA;AAAA,OAAA9gB,EAAA,CAAA,KAAA,MAAA,OAAA8D,GAAAyC,GAAAua,CAAA,GADoBzgB;AAAA,MAAA,KAAA0gB,OAAAA,IAAA;AAAA,MAAA/gB,EAAA,CAAA,IAAA;AAAA,MAAAA,EAAA,CAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BApBV,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;AAWT,IAAAwE,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6cCTQiN,GAAA0C,GAAA,SAAAC,IAAA;AAAA,MAAAzf,EAAA,CAAA,CAAA,GAAoB8c,GAAA0C,GAAA,UAAAE,IAAA;AAAA,MAAA1f,EAAA,CAAA,CAAA;;;;;;;;;;;;SAApBK;AAAA,MAAA,KAAAof,OAAAA,IAAA;AAAA,MAAAzf,EAAA,CAAA,yBAAoBK;AAAA,MAAA,KAAAqf,OAAAA,IAAA;AAAA,MAAA1f,EAAA,CAAA;;;;;;;;;;;;;;;;kWAJpB8c,GAAA0C,GAAA,SAAAC,IAAA;AAAA,MAAAzf,EAAA,CAAA,CAAA,GAAoB8c,GAAA0C,GAAA,UAAAE,IAAA;AAAA,MAAA1f,EAAA,CAAA,CAAA;;;;;;;;;;;;SAApBK;AAAA,MAAA,KAAAof,OAAAA,IAAA;AAAA,MAAAzf,EAAA,CAAA,yBAAoBK;AAAA,MAAA,KAAAqf,OAAAA,IAAA;AAAA,MAAA1f,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AANrB,MAAA,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS,GACA,EAAA,UAAAyT,IAAA,GAAA,IAAAzT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCCsBcuP,GAAAxd,GAAA,SAAAyhB,IAAA;AAAA,MAAA/gB,EAAA,CAAA,IAAA;AAAA,MAAAA,EAAA,CAAA,IAAA,iBAAA;;;;;oCAAoG6f,GAAAvgB,GAAA,kBAAA;AAAA,MAAAU,EAAA,CAAA,IAAA,IAAA,GAAqD8c,GAAAxd,GAAA,cAAAyc,GAAA,aAAA,CAAA;AAAA;;;;;;;;;;;;;;;;;;yBAAzJ,CAAAkF,KAAA5gB;AAAA,MAAA,MAAA0gB,OAAAA,IAAA;AAAA,MAAA/gB,EAAA,CAAA,IAAA;AAAA,MAAAA,EAAA,CAAA,IAAA;;;;;;;YAAoG6f,GAAAvgB,GAAA,kBAAA;AAAA,MAAAU,EAAA,CAAA,IAAA,IAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAlBlH,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;SAQTwE,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qJCbMiN,GAAA0C,GAAA,SAAAC,IAAA;AAAA,MAAAzf,EAAA,CAAA,CAAA,GAAoB8c,GAAA0C,GAAA,UAAAE,IAAA;AAAA,MAAA1f,EAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;SAApBK;AAAA,MAAA,KAAAof,OAAAA,IAAA;AAAA,MAAAzf,EAAA,CAAA,yBAAoBK;AAAA,MAAA,KAAAqf,OAAAA,IAAA;AAAA,MAAA1f,EAAA,CAAA;;;;;;;;;;AALnB,MAAA,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,QAAA2T,IAAA,UAAA,IAAA3T,GACA,EAAA,QAAA4T,IAAA,UAAA,IAAA5T;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uJCgBsHsS,GAAAvgB,GAAA,kBAAA;AAAA,MAAAU,EAAA,CAAA,IAAA,IAAA,GAAqD8c,GAAAxd,GAAA,cAAAyc,GAAA,kBAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;YAArD8D,GAAAvgB,GAAA,kBAAA;AAAA,MAAAU,EAAA,CAAA,IAAA,IAAA;;;;;;;;;;;;;;;;;;;;AAbtH,MAAA,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,SAAA6T,IAAA,GAAA,IAAA7T;;;AAIT,IAAAwE,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCCM+GiN,GAAAxd,GAAA,cAAAyc,GAAA,oBAAA,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAbxG,EAAA,OAAA4D,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;AAIT,IAAAwE,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eCUSiN,GAAAuE,GAAA,OAAAC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SADoJxE,GAAAxd,GAAA,cAAAyc,GAAA,aAAA,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0CAjBtJ,EAAA,KAAAwF,IAAA,eAAA,IAAAhU,GACA,EAAA,OAAAoS,IAAA,EAAA,IAAApS;;;SAQTwE,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;;;;;UARJyB,EAAA,GAAA8O,IAAA,GAAAT,IAAA,EAAA,IAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;A9JXF,MAAAlM;S+JgBS+N;AAAA;AAAA,OAAA/N,IAAAzT,EAAA,CAAA,MAAA,gBAAAyT,EAAA,WAAA,aAAA,QAAA,MAAA;AAAA;;;;;;;;;;;;;;;A/JhBT,UAAAA;A+JgBS,MAAApT;AAAA,MAAA,KAAAmhB,OAAAA;AAAA,SAAA/N,IAAAzT,EAAA,CAAA,MAAA,gBAAAyT,EAAA,WAAA,aAAA,QAAA,MAAA,QAAAgO,EAAA,YAAAD;;;;;;;;;;;;;;;;;;sDAbI,EAAA,OAAA7B,IAAA,EAAA,IAAApS,GACA,EAAA,SAAA6T,IAAA,GAAA,IAAA7T,GACA,EAAA,aAAAmU,IAAA,GAAA,IAAAnU,GACA,EAAA,WAAAoU,IAAA,GAAA,IAAApU,GACA,EAAA,OAAAqS,IAAA,OAAA,IAAArS;;;;;;;;;;4BAIgBmU,KAAAlf,IAA4B,GAAAA,EAAA,WAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;A/JXzD,MAAAiR;SgKmBS+N;AAAA;AAAA,OAAA/N,IAAAzT,EAAA,CAAA,MAAA,gBAAAyT,EAAA,WAAA,aAAA,QAAA,MAAA;AAAA;;;;;;;;;;;;;SAD6CzO;AAAA,QAAAyc;AAAA,QAAA;AAAA;AAAA,QAAAzhB,EAAA,CAAA,MAAA;AAAA,MAAA;;;;;SAA4CgF;AAAA,QAAAyc;AAAA,QAAA;AAAA;AAAA,QAAAzhB,EAAA,CAAA,IAAA;AAAA,MAAA;AAAA;;;;;AhKlBlG,UAAAyT;AgKmBS,MAAApT;AAAA,MAAA,KAAAmhB,OAAAA;AAAA,SAAA/N,IAAAzT,EAAA,CAAA,MAAA,gBAAAyT,EAAA,WAAA,aAAA,QAAA,MAAA,QAAAgO,EAAA,YAAAD;;;;;;;;;;;;;WAD6Cxc;AAAA,QAAAyc;AAAA,QAAA;AAAA;AAAA,QAAAzhB,EAAA,CAAA,MAAA;AAAA,MAAA;;;;;;;WAA4CgF;AAAA,QAAAyc;AAAA,QAAA;AAAA;AAAA,QAAAzhB,EAAA,CAAA,IAAA;AAAA,MAAA;AAAA;;;;;;;;;oCAhBrF,EAAA,UAAA4hB,IAAA,EAAA,IAAArU,GACA,EAAA,UAAAsU,IAAA,OAAA,IAAAtU,GAEA,EAAA,QAAAuU,IAAA,GAAA,IAAAvU,GACA,EAAA,MAAAwU,IAAA,GAAA,IAAAxU,GACA,EAAA,MAAAyU,IAAA,WAAA,IAAAzU,GACA,EAAA,OAAAoS,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,OAAA,IAAArS;;;;;WAEX+D,EAAA,IAAA+O,IAAA,GAAA,KAAAV,CAAA,IAAA;;UAEArO,EAAA,GAAA2Q,IAAAJ,IAAA,cAAAA,CAAA,OAAA,EAAA;YAEAvQ,EAAA,GAAA5O,IAAA,QAAAkf,CAAA,gBAAAvB,CAAA,iBAAA6B,CAAA,WAAAF,CAAA,KAAAC,CAAA,YAAArC,CAAA,EAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACbF,MAAMO,KAAgB,CAACpO,GAAS9I,MAAS,CAACzF,MAAU;AAC9C,MAAAU;AAOJ,EALIV,EAAM,QAAQ,gBAAsBU,IAAA,SACpCV,EAAM,QAAQ,iBAAsBU,IAAA,UACpCV,EAAM,QAAQ,QAAsBU,IAAA,UACpCV,EAAM,QAAQ,YAAsBU,IAAA,UAEnCA,MACLV,EAAM,eAAe,GAErBuO,EAAQlC,GAAS;AAAA,IACf,MAAM,UAAU3L,CAAG,aAAa+E,CAAI;AAAA,IACpC,aAAa,OAAO/E,EAAI,YAAA,CAAa,uCAAuC+E,EAAK,YAAa,CAAA;AAAA,IAC9F,aAAa;AAAA,EACd,CAAA,CAAC;AACJ;;;;;;;;;;;;;gGC0D2R6T,GAAAgD,GAAA,cAAA/D,GAAA,kBAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SArE9Q,EAAA,UAAAoG,IAAA,EAAA,IAAA5U,GACA,EAAA,WAAA6U,IAAA,GAAA,IAAA7U,GACA,EAAA,UAAA8U,IAAA,GAAA,IAAA9U,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;AAQL,QAAA+U,IAAA,CAAA9e,MAAA;AACJ,IAAA8N,EAAA,GAAAiR,IAAA,EAAA,GAEAxQ,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;KAKE2S,IAAA,CAAAhf,MAAA;;;;;;AAIJ,MAAAuO,EAAAlC,GAAA;AAAA,QACE,MAAA;AAAA,QACA,aAAA;AAAA,QACA,aAAA;AAAA;;;;UAOFyB,EAAA,GAAAiR,IAAA,EAAA,GAEAxQ,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;KAIE4S,IAAA,CAAAjf,MAAA;AlKpDR,QAAAiQ,GAAAC;AkKqDU,UAAAgP,IAAAlf,EAAA,aAAAkQ,KAAAD,IAAAjQ,EAAA,YAAA,gBAAAiQ,EAAA,OAAA,gBAAAC,EAAA,YAAA,GAEE,EAAA,GAAAjV,GAAA,OAAAiS,EAAA,IAAAiS,EAAA,sBAAA,GACFC,KAAAF,IAAAjkB,KAAAiS;;;;AAMA,UAAAmS,IAAA,iBAAA,WAAAC,CAAA,GACAC,IAAA,iBAAA,aAAAP,CAAA,GACAQ,IAAA,iBAAA,YAAAF,CAAA,GACAG,IAAA,iBAAA,aAAAT,CAAA;;;;;;;;;;;;;;WApDRlR,EAAA,GAAA4R,IAAAd,IAAA,KAAA,eAAAxC,CAAA,EAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SCe+B9C,GAAAqG,GAAA,oBAAAC;AAAA,MAAApjB,EAAA,CAAA,IAAA;AAAA,MAAAA,EAAA,CAAA,CAAA;;;;;;;;;;;;;;;gKAPyB6f;AAAAA,QAAA4B;AAAA,QAAA;AAAA;AAAA,QAAAzhB,EAAA,CAAA,IAAA,KAAA;AAAA,MAAA,GAAwB6f;AAAAA,QAAA4B;AAAA,QAAA;AAAA;AAAA,QAAAzhB,EAAA,CAAA,IAAA,KAAA;AAAA,MAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAOjD,CAAAihB,KAAA5gB;AAAA,MAAA,MAAA+iB,OAAAA;AAAA,MAAApjB,EAAA,CAAA,IAAA;AAAA,MAAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAPyB6f;AAAAA,QAAA4B;AAAA,QAAA;AAAA;AAAA,QAAAzhB,EAAA,CAAA,IAAA,KAAA;AAAA,MAAA;YAAwB6f;AAAAA,QAAA4B;AAAA,QAAA;AAAA;AAAA,QAAAzhB,EAAA,CAAA,IAAA,KAAA;AAAA,MAAA;AAAA;;;;;;;;;;;;;;;;AAD7E;AAAA;AAAA,MAAAA,EAAA,CAAA;AAAA,MAAAA,EAAA,CAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;6DAjBQ,EAAA,UAAAmiB,IAAA,EAAA,IAAA5U,GACA,EAAA,SAAA8V,IAAA,GAAA,IAAA9V,oBAEA,EAAA,OAAAoS,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;;;;;YAKX+D,EAAA,GAAAgS,IAAA,KAAA3D,IAAA4D,KAAAxB,IAAA,IAAA,IAAA;WACAzQ,EAAA,GAAA8O,IAAA,IAAAkD,IAAAC,CAAA;;SAGAjS,EAAA,IAAAkS,IAAA,KAAA,IAAA,GAAA,KAAA,IAAA,GAAArB,CAAA,CAAA,CAAA;YACA7Q,EAAA,GAAAmS,IAAAC,KAAA,IAAAF,EAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjBF,MAAMG,KAAa,CAACtH,MAAS;AAC3B,EAAIA,IAAO,MAAYA,IAAA,KAAK,IAAI,GAAGA,CAAI;AAEvC,QAAMuH,IAAQ,KAAK,MAAMvH,IAAO,IAAI,EAAE;AACtC,MAAIwH,IAAU,KAAK,MAAOxH,IAAO,OAAQ,EAAE,EAAE,YACzCiE,IAAU,KAAK,MAAMjE,IAAO,EAAE,EAAE;AAIpC,SAFIiE,EAAQ,SAAS,MAAKA,IAAU,IAAIA,CAAO,KAE3CjE,IAAO,OACF,GAAGwH,CAAO,IAAIvD,CAAO,MAExBuD,EAAQ,SAAS,MAAKA,IAAU,IAAIA,CAAO,KACxC,GAAGD,CAAK,IAAIC,CAAO,IAAIvD,CAAO;AAEzC;;;eCLYwD,IAAAH;AAAA;AAAA,IAAA3jB,EAAA,CAAA;AAAA,EAAA,IAAA;;;;;;iFADoC6f,GAAAkE,GAAA,aAAA;AAAA,MAAA/jB,EAAA,CAAA,IAAA,IAAA;;;;;;;;;;;;;;;;SACpCK;AAAA,MAAA,KAAAyjB,OAAAA,IAAAH;AAAA;AAAA,QAAA3jB,EAAA,CAAA;AAAA,MAAA,IAAA,OAAA8D,GAAAkgB,GAAAF,CAAA;WADoCjE,GAAAkE,GAAA,aAAA;AAAA,MAAA/jB,EAAA,CAAA,IAAA,IAAA;;;;;;;;;;;;;;;;6CAJnC,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2ECGsDsS,GAAA4B,GAAA,aAAA;AAAA,MAAAzhB,EAAA,CAAA,IAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;WAAA6f,GAAA4B,GAAA,aAAA;AAAA,MAAAzhB,EAAA,CAAA,IAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;SARtD,EAAA,UAAAgG,IAAA,EAAA,IAAAuH,GACA,EAAA,MAAAwU,IAAA,GAAA,IAAAxU,GACA,EAAA,OAAAoS,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;;;UAEX+D,EAAA,GAAAuS,IAAA,KAAA,IAAA,GAAA,KAAA,OAAA7d,KAAA,KAAA,EAAA,CAAA,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SCICie,IAAAN;AAAA;AAAA,IAAA3jB,EAAA,CAAA;AAAA,EAAA,IAAA,UAA4B8jB,IAAAH;AAAA;AAAA,IAAA3jB,EAAA,CAAA;AAAA,EAAA,IAAA;;;uGADgB6f,GAAAkE,GAAA,aAAA;AAAA,MAAA/jB,EAAA,CAAA,IAAA,IAAA;;;;;;;;;;;AAC5C,MAAAK;AAAA,MAAA,KAAA4jB,OAAAA,IAAAN;AAAA;AAAA,QAAA3jB,EAAA,CAAA;AAAA,MAAA,IAAA,OAAA8D,GAAAogB,GAAAD,CAAA,GAA4B5jB;AAAA,MAAA,KAAAyjB,OAAAA,IAAAH;AAAA;AAAA,QAAA3jB,EAAA,CAAA;AAAA,MAAA,IAAA,OAAA8D,GAAAkgB,GAAAF,CAAA;WADgBjE,GAAAkE,GAAA,aAAA;AAAA,MAAA/jB,EAAA,CAAA,IAAA,IAAA;;;;;;;;;;;;;;;;AANlC,MAAA,EAAA,aAAAuS,IAAA,EAAA,IAAAhF,GACA,EAAA,UAAAvH,IAAA,EAAA,IAAAuH,GACA,EAAA,OAAAoS,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iFCkBeuP,GAAAqH,GAAA,SAAAC,IAAA;AAAA,MAAApkB,EAAA,CAAA,IAAA;AAAA,MAAAA,EAAA,CAAA,IAAA,iBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gGAAA,CAAAihB,KAAA5gB;AAAA,MAAA,MAAA+jB,OAAAA,IAAA;AAAA,MAAApkB,EAAA,CAAA,IAAA;AAAA,MAAAA,EAAA,CAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAnBf,EAAA,UAAAgG,IAAA,EAAA,IAAAuH,GACA,EAAA,aAAAgF,IAAA,EAAA,IAAAhF,oKAUA,EAAA,OAAAqS,IAAA,SAAA,IAAArS;;;;;;SAEX+D,EAAA,IAAA+S,IAAAC,MAAA,QAAA;aACAhT,EAAA,IAAAqO,IAAA0E,KAAA,CAAAE,IAAA,IAAAF,IAAA,IAAA,CAAA;YACA/S,EAAA,IAAAkT,IAAA7C,IAAA,eAAA,EAAA;UACArQ,EAAA,GAAAmT,IAAA,CAAAC,KAAAnS,IAAA,GAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;goBCdUuK,GAAA0C,GAAA,SAAAC,IAAA;AAAA,MAAAzf,EAAA,CAAA,CAAA,GAAoB8c,GAAA0C,GAAA,UAAAE,IAAA;AAAA,MAAA1f,EAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;4CAApBK;AAAA,MAAA,KAAAof,OAAAA,IAAA;AAAA,MAAAzf,EAAA,CAAA,yBAAoBK;AAAA,MAAA,KAAAqf,OAAAA,IAAA;AAAA,MAAA1f,EAAA,CAAA;;;;;;;;;;AANnB,MAAA,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,MAAAoX,IAAA,EAAA,IAAApX,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS,GACA,EAAA,MAAAqX,IAAA,cAAA,IAAArX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;q8DCCDuP,GAAA0C,GAAA,SAAAC,IAAA;AAAA,MAAAzf,EAAA,CAAA,CAAA,GAAoB8c,GAAA0C,GAAA,UAAAE,IAAA;AAAA,MAAA1f,EAAA,CAAA,CAAA;;;;;;;;;;;;SAApBK;AAAA,MAAA,KAAAof,OAAAA,IAAA;AAAA,MAAAzf,EAAA,CAAA,yBAAoBK;AAAA,MAAA,KAAAqf,OAAAA,IAAA;AAAA,MAAA1f,EAAA,CAAA;;;;;;;;;;AAJnB,MAAA,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qHCyByDsS,GAAAC,GAAA,kBAAA;AAAA,MAAA9f,EAAA,CAAA,IAAA,IAAA,GAA4E8c,GAAAgD,GAAA,cAAA/D,GAAA,eAAA,CAAA;AAAA;;;;;;;;;;;;;;;;;;;YAA5E8D,GAAAC,GAAA,kBAAA;AAAA,MAAA9f,EAAA,CAAA,IAAA,IAAA;AAAA;;;;;;;;;;;;;6EAlBzD,EAAA,OAAA2f,IAAA,EAAA,IAAApS,GACA,EAAA,OAAAqS,IAAA,UAAA,IAAArS;;AAGL,QAAA0S,IAAA,CAAAzc,MAAA;AACJ,IAAAA,EAAA,gBAAA,GAEAuO,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SC+DwEiR;AAAA;AAAA,IAAA9gB,EAAA,EAAA,IAAA,IAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAHjE;AAAA;AAAA,MAAAA,EAAA,EAAA;AAAA,MAAAA,EAAA,CAAA,IAAA;;;;;;;;;;;;;;;;;MAO6D;AAAA;AAAA,QAAAA,EAAA,EAAA;AAAA,QAAAA,EAAA,CAAA;AAAA;AAAA;;;;;;AAI3D,MAAA6kB;AAAA;AAAA,KAAA7kB,EAAA,EAAA,MAAA;AAAA,IAAAA,EAAA,EAAA,MAAA,OAAA8kB,GAAA9kB,CAAA;AAAA;;;;;;;;;;;MAMoC;AAAA;AAAA,QAAAA,EAAA,EAAA;AAAA,QAAAA,EAAA,CAAA;AAAA;AAAA;;;;;;;;cAlBIgF;AAAA,QAAA8a;AAAA,QAAA;AAAA;AAAA,QAAA9f,EAAA,EAAA;AAAA,QAAAA,EAAA,CAAA;AAAA,MAAA;AAAA;;;QAAuBuD;AAAA,UAAAuc;AAAA,UAAA;AAAA;AAAA,UAAA9f,EAAA,EAAA;AAAA;AAAA,YAAAA,EAAA,EAAA;AAAA,UAAA;AAAA,QAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAQJK;AAAA,MAAA,OAAA0kB,EAAA;AAAA,MAAA/kB,EAAA,EAAA;AAAA,MAAAA,EAAA,CAAA;;;MAI3DA,EAAA,EAAA,MAAA;AAAA,MAAAA,EAAA,EAAA,MAAA;;;;;;;;;cAMoCK;AAAA,MAAA,OAAA2kB,EAAA;AAAA,MAAAhlB,EAAA,EAAA;AAAA,MAAAA,EAAA,CAAA;;;;;aAlBIgF;AAAA,QAAA8a;AAAA,QAAA;AAAA;AAAA,QAAA9f,EAAA,EAAA;AAAA,QAAAA,EAAA,CAAA;AAAA,MAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAtE1C,EAAA,OAAA0C,IAAA,OAAA,IAAA6K,oCAEA,EAAA,QAAA0X,IAAA,GAAA,IAAA1X,GACA,EAAA,WAAA2X,IAAA,OAAA,IAAA3X,GACA,EAAA,iBAAA4X,IAAA,UAAA,IAAA5X,GACA,EAAA,WAAA6X,IAAA,OAAA,IAAA7X,4BAEA,EAAA,OAAArB,IAAA,EAAA,IAAAqB;AAWL,QAAA0S,IAAA,CAAAxf,MAAA,MAAA;AACJ,IAAAsR,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,OAAApP;AAAA;KAIE4kB,IAAA,CAAA7hB,MAAA;;AAEF,MAAAA,EAAA,eAAA;AACM,YAAA8hB,IAAA9hB,EAAA,OAAA;WAEU8hB,EAAA,MAAA;AAAA;;AAIhB,MAAA9hB,EAAA,eAAA;AACM,YAAA+hB,IAAA/hB,EAAA,OAAA;WAEU+hB,EAAA,MAAA;AAAA;KAIdC,IAAA,CAAAhiB,MAAA;AACE,UAAAiiB,IAAAjiB,EAAA,OAAA;;;A5KpDV,QAAAiQ,GAAAC;A4K2De,eAAAgS,KAAAC,GAAA;AACG,iBAAA,CAAAllB,IAAAmlB,EAAA,MAAA5S,KAAA,CAAA,GAAA;AACN,aAAAS,IAAAmS,GAAA,QAAA,QAAAnS,EAAA,SAAA,IAAAiS,CAAA;AAA4C,iBAAA,CAAAjlB,IAAA,EAAA;AAGtC,iBAAA,CAAAA,IAAAmlB,EAAA,MAAAxU,KAAA,CAAA,GAAA;AACN,aAAAsC,IAAAkS,GAAA,QAAA,QAAAlS,EAAA,SAAA,IAAAgS,CAAA;AAA6C,iBAAA,CAAA,IAAAjlB,EAAA;AAAA;AAI5C,WAAA,CAAA,IAAA,EAAA;AAAA;;;;;;WA/CX6Q,EAAA,GAAAuU,IAAAA,KAAA,CAAA;WADAvU,EAAA,GAAAwU,IAAAA,KAAAD,KAAA,CAAA;SAGAvU,EAAA,IAAAqO,IAAAsF,IAAA,OAAA,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CCrBW,EAAA,WAAAc,IAAA,EAAA,IAAAxY,GACA,EAAA,WAAAyY,IAAA,MAAA,IAAAzY,GACA,EAAA,YAAA0Y,IAAA,GAAA,IAAA1Y,GAEP2Y,IAAA,IACAC,IAAA;;SAOiB,aAAAC,CAAA,QACA,aAAAC,CAAA,GAEnB/U,EAAA,GAAA4U,IAAA,EAAA,GACA5U,EAAA,GAAA6U,IAAA,EAAA;AAAA;SAImB,aAAAC,CAAA,GAEnB9U,EAAA,GAAA4U,IAAA,EAAA,GACAE,IAAA,WAAA,MAAA9U,EAAA,GAAA4U,IAAA,EAAA,GAAAH,CAAA;AAAA;SAImB,aAAAM,CAAA,GAEnB/U,EAAA,GAAA6U,IAAA,EAAA,GACAE,IAAA,WAAA,MAAA/U,EAAA,GAAA6U,IAAA,EAAA,GAAAH,CAAA;AAAA;;SAImB,aAAAI,CAAA,QACA,aAAAC,CAAA;AAAA;;;;WA1BrB/U,EAAA,GAAA2U,IAAA,CAAAC,KAAA,CAAAC,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8CCNW,EAAA,SAAA9C,IAAA,GAAA,IAAA9V,GACA,EAAA,WAAA+Y,IAAA,OAAA,IAAA/Y,GACA,EAAA,WAAAgZ,IAAA,OAAA,IAAAhZ,GACA,EAAA,WAAAiZ,IAAA,OAAA,IAAAjZ;;AAGL,QAAAzL,IAAA,CAAA,CAAA2kB,CAAA,MAAA;IACJnV,EAAA,GAAAgV,IAAAG,EAAA,mBAAA,CAAA,GACAnV,EAAA,GAAAiV,IAAAD,IAAA,OAAA,OAAA,0DAKAvU,EAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;;;;;AAQI,UAAA6W,IAAA,IAAA,qBAAA5kB,GAAA,EAAA,WAAA,IAAA,CAAA;;;;UAKQ,gBAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjClB,MAAM6kB,KAAkB,CAAC,EAAE,aAAArC,GAAa,OAAA5T,QACtC4T,MAAgB,cAAc5T,IAAQ,OACtC4T,MAAgB,WAAc5T,IAAQ,OACtC4T,MAAgB,WAAc5T,IAAQ,OACtC4T,MAAgB,YAAc5T,IAAQ,KCJlCkW,KAAgB,CAAC,EAAE,aAAAtC,GAAa,UAAAjG,GAAU,UAAAkG,GAAU,UAAAG,EAAA,MACtDJ,MAAgB,YAChBA,MAAgB,WAAcC,IADmC,gBAEjED,MAAgB,cAAcjG,MAAa,SAAsB,kBACjEiG,MAAgB,cAAcC,KAC9BD,MAAgB,cAAcjG,MAAa,WAAWqG,IADW,kBAEjEJ,MAAgB,cAAcjG,MAAa,UAAsB,gCACjEiG,MAAgB,WAAcjG,MAAa,SAAsB,kBACjEiG,MAAgB,WAAcjG,MAAa,UAAsB,kBACjEiG,MAAgB,WAAcjG,MAAa,SAAsB,kBACjEiG,MAAgB,WAAcC,KAC9BD,MAAgB,WAAcjG,MAAa,UADsB,kBAEA,iBCd/DwI,KAAe,CAAC,SAAS,YAAY,SAAS,UAAU,OAAO,GAE/DC,KAAmB,CAACpkB,MAAUmkB,GAAa,QAAQnkB,CAAK,MAAM,ICF9DqkB,KAAgB,MACpB,SAAS,qBAAqB,SAAS,yBAGnCC,KAAoB,CAACxkB,MAAY;AACrC,EAAIA,EAAQ,oBACVA,EAAQ,kBAAkB,IACjBA,EAAQ,2BACjBA,EAAQ,wBAAwB;AAEpC,GAEMykB,KAAiB,MAAM;AAC3B,EAAI,SAAS,iBACX,SAAS,eAAe,IACf,SAAS,wBAClB,SAAS,qBAAqB;AAElC,GAEMC,KAAoB,MACxB,SAAS,qBAAqB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MC8HqC;AAAA;AAAA,QAAAlnB,EAAA,EAAA,KAAA;AAAA,QAAAA,EAAA,EAAA,IAAA,MAAA;AAAA;AAAA;;;;;;;;;;;;;;;;cAAAK,EAAA,CAAA;AAAA,MAAA,eAAA8mB,EAAA;AAAA,MAAAnnB,EAAA,EAAA,KAAA;AAAA,MAAAA,EAAA,EAAA,IAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAM7C;AAAA;AAAA,QAAAA,EAAA,EAAA,EAAA;AAAA;AAAA,MAA6B;AAAA;AAAA,QAAAA,EAAA,EAAA;AAAA,QAAAA,EAAA,EAAA,IAAA,IAAA;AAAA;AAAA;;;;;;;;MAAmF;AAAA;AAAA,QAAAA,EAAA,EAAA,KAAA;AAAA,QAAAA,EAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAhH,MAAAK,EAAA,CAAA;AAAA,MAAA,cAAA0kB,EAAA;AAAA,MAAA/kB,EAAA,EAAA,EAAA,QAA6BK,EAAA,CAAA;AAAA,MAAA,eAAA0kB,EAAA;AAAA,MAAA/kB,EAAA,EAAA;AAAA,MAAAA,EAAA,EAAA,IAAA,IAAA;;;;sBAAmFK,EAAA,CAAA;AAAA,MAAA,eAAA0kB,EAAA;AAAA,MAAA/kB,EAAA,EAAA,KAAA;AAAA,MAAAA,EAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAMvF;AAAA;AAAA,QAAAA,EAAA,EAAA;AAAA,QAAAA,EAAA,EAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAAK,EAAA,CAAA;AAAA,MAAA,aAAA+mB,EAAA;AAAA,MAAApnB,EAAA,EAAA;AAAA,MAAAA,EAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAgBzB;AAAA;AAAA,QAAAA,EAAA,EAAA,EAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;AAAA,MAAAK,EAAA,CAAA;AAAA,MAAA,cAAA0kB,EAAA;AAAA,MAAA/kB,EAAA,EAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAUO;AAAA;AAAA,QAAAA,EAAA,EAAA,EAAA;AAAA;AAAA;;;;MAAmD;AAAA;AAAA,QAAAA,EAAA,EAAA,KAAA;AAAA,QAAAA,EAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MACjD;AAAA;AAAA,QAAAA,EAAA,EAAA,EAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;cADFK,EAAA,CAAA;AAAA,MAAA,UAAAgnB,EAAA;AAAA,MAAArnB,EAAA,EAAA,EAAA;;aAAmDK,EAAA,CAAA;AAAA,MAAA,eAAAgnB,EAAA;AAAA,MAAArnB,EAAA,EAAA,KAAA;AAAA,MAAAA,EAAA,EAAA;;;;;;;;;;;;;;;;;;;cACjDK,EAAA,CAAA;AAAA,MAAA,UAAAinB,EAAA;AAAA,MAAAtnB,EAAA,EAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAQ2B;AAAA;AAAA,QAAAA,EAAA,EAAA,EAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;cAAAK,EAAA,CAAA;AAAA,MAAA,cAAAknB,EAAA;AAAA,MAAAvnB,EAAA,EAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAHlDwnB,KAAA,SAAAA,IAAA,CAAA;AAAA,KAAAxnB,EAAA,EAAA,KAAA+mB,GAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qEAlDRU;AAAA;AAAA,IAAAznB,EAAA,EAAA,KAAA;AAAA,IAAAA,EAAA,EAAA,KAAA0nB,GAAA;AAAA;;;;;KASEC;AAAA;AAAA,KAAA3nB,EAAA,EAAA;AAAA,IAAAA,EAAA,EAAA,MAAA4nB,GAAA5nB,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkBG6nB,KAAA;AAAA,EAAA7nB,EAAA,EAAA,KAAA;AAAA,EAAAA,EAAA,EAAA,KAAA;AAAA,EAAAA,EAAA,EAAA;AAAA,EAAAA,EAAA,EAAA;AAAA,EAAAA,EAAA,EAAA,MAAA8nB,GAAA9nB,CAAA,GAMD+nB;AAAA;AAAA,IAAA/nB,EAAA,EAAA;AAAA,IAAAA,EAAA,CAAA,KAAA;AAAA,IAAAA,EAAA,EAAA,KAAA;AAAA,IAAAA,EAAA,EAAA;AAAA,IAAAA,EAAA,EAAA,IAAA;AAAA,IAAAA,EAAA,EAAA,MAAA,iCAAAgoB,GAAAhoB,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAUAioB;AAAA;AAAA,IAAAjoB,EAAA,EAAA,KAAA;AAAA,IAAAA,EAAA,EAAA,KAAAkoB,GAAAloB,CAAA;AAAA;kBAkBFmoB;AAAA;AAAA,KAAAnoB,EAAA,EAAA;AAAA,IAAAA,EAAA,EAAA,MAAAooB,GAAApoB,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;AA7DF;AAAA,MAAAA,EAAA,EAAA,KAAA;AAAA,MAAAA,EAAA,EAAA;;;;;;;;MASEA,EAAA,EAAA;AAAA,MAAAA,EAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;iBAkBG;AAAA,MAAAA,EAAA,EAAA,KAAA;AAAA,MAAAA,EAAA,EAAA,KAAA;AAAA,MAAAA,EAAA,EAAA;AAAA,MAAAA,EAAA,EAAA;AAAA,MAAAA,EAAA,EAAA;;;;MAMDA,EAAA,EAAA;AAAA,MAAAA,EAAA,CAAA,KAAA;AAAA,MAAAA,EAAA,EAAA,KAAA;AAAA,MAAAA,EAAA,EAAA;AAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,MAAAA,EAAA,EAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAUAA,EAAA,EAAA,KAAA;AAAA,MAAAA,EAAA,EAAA;;;;;;;;MAkBFA,EAAA,EAAA;AAAA,MAAAA,EAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAiBG;AAAA;AAAA,QAAAA,EAAA,EAAA,KAAA;AAAA,QAAAA,EAAA,EAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAAAK,EAAA,CAAA;AAAA,MAAA,eAAAgoB,EAAA;AAAA,MAAAroB,EAAA,EAAA,KAAA;AAAA,MAAAA,EAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;AAjFX,MAAAwnB,IAAAV;AAAA;AAAA,IAAA9mB,EAAA,CAAA;AAAA,EAAA;AAAA,EAAAA,EAAA,CAAA,EAAA,SAAA;;;;;;;;;AAAA,MAAAK,EAAA,CAAA;AAAA,MAAA,QAAAmnB,IAAAV;AAAA;AAAA,QAAA9mB,EAAA,CAAA;AAAA,MAAA;AAAA,MAAAA,EAAA,CAAA,EAAA,SAAA;;;;;;;;;;;;;;;;;;;AA1GQ,MAAA,EAAA,aAAAskB,KAAA,WAAA,IAAA/W,GACA,EAAA,cAAA+a,IAAA,OAAA,IAAA/a,GACA,EAAA,iBAAAgb,KAAA,OAAA,IAAAhb,GACA,EAAA,eAAAib,KAAA,WAAA,IAAAjb,GACA,EAAA,gBAAAkb,KAAA,OAAA,IAAAlb,qCAEA,EAAA,aAAAmb,KAAA,OAAA,IAAAnb,GACA,EAAA,eAAAob,KAAA,OAAA,IAAApb,GACA,EAAA,YAAAqb,KAAA,OAAA,IAAArb,6BAEA,EAAA,cAAAuQ,KAAA,EAAA,IAAAvQ,GACA,EAAA,UAAAvH,KAAA,EAAA,IAAAuH,GACA,EAAA,aAAAgF,KAAA,EAAA,IAAAhF,GACA,EAAA,eAAAyE,KAAA,UAAA,IAAAzE,GACA,EAAA,cAAAsb,KAAA,EAAA,IAAAtb,GACA,EAAA,cAAAoQ,KAAA,OAAA,IAAApQ,GACA,EAAA,kBAAAub,KAAA,OAAA,IAAAvb,GACA,EAAA,WAAA2X,IAAA,OAAA,IAAA3X,GACA,EAAA,iBAAA4X,KAAA,UAAA,IAAA5X,GACA,EAAA,WAAA6X,KAAA,QAAA,IAAA7X,GACA,EAAA,iBAAAwb,KAAA,GAAA,IAAAxb;WAIA,EAAA,eAAAyb,KAAA,GAAA,IAAAzb,GACA,EAAA,WAAAiZ,KAAA,OAAA,IAAAjZ,GACA,EAAA,WAAA+Y,KAAA,OAAA,IAAA/Y,GACA,EAAA,WAAAgZ,KAAA,OAAA,IAAAhZ;;UA0DM,aAAA6P,EAAA,GACf9L,EAAA,IAAA8L,KAAA,WAAA,MAAA9L,EAAA,IAAA8L,KAAA,IAAA,GAAA,GAAA,CAAA;AAAA,KAGIkF,KAAA,CAAA9e,MAAA;YAGEA,EAAA,WAAA,8CAMNuO,GAAAlC,GAAA;AAAA,MACE,MAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA;;;;;;;;;;;;;;;;;;;;;SAvEJyB,EAAA,IAAA2X,IAAA3E,OAAA,OAAA;SACAhT,EAAA,IAAA4X,IAAA5E,OAAA,UAAA;SACAhT,EAAA,IAAA6X,IAAA7E,OAAA,OAAA;SACAhT,EAAA,IAAA+S,IAAAC,OAAA,QAAA;SACAhT,EAAA,IAAA8X,IAAA9E,OAAA,OAAA;iBACAhT,EAAA,IAAAyO,IAAA/N,OAAA,SAAA;;iBAEAV,EAAA,IAAA+X,IAAArX,OAAA,SAAA;iBACAV,EAAA,IAAAoT,IAAA/G,MAAA,CAAA0L,CAAA;WACA/X,EAAA,IAAAgY,IAAAzL,GAAA,SAAA,CAAA;cACAvM,EAAA,IAAAiT,IAAAoC,GAAA,EAAA,aAAArC,IAAA,OAAA5T,GAAA,CAAA,CAAA;YAEAY,EAAA,IAAAsM,IAAAC,GAAAC,EAAA,KAAA,CAAA,CAAA;YACAxM,EAAA,IAAA6Q,IAAA5P,KAAAvM,EAAA;;;;;;;;UAMAsL,EAAA,IAAAiY,IAAAhB,OAAA;;;SAEAjX,EAAA,IAAAkY,IAAAJ,IAAA,6BAAAK,CAAA;kBAEAnY,EAAA,IAAAoY,IAAAT,KAAAG,KAAAT,WAA6DtE,KAAA,CAAAE,IAAA,IAAA,CAAA;;SAC7DjT,EAAA,IAAAqY,IAAAD,KAAArF,IAAA,MAAA+E,KAAAC,IAAA,MAAA,EAAA;kBACA/X,EAAA,IAAAsY,IAAAvF,KAAA,CAAAE;kBACAjT,EAAA,IAAAuY,IAAAxF,KAAA,CAAAE;kBACAjT,EAAA,IAAAwY,IAAAzF,KAAA,CAAAE;;iBAEAjT,EAAA,IAAAyY,IAAAnB,OAAA;gBACAtX,EAAA,IAAA+M,KAAAsK,OAAA;;UACArX,EAAA,IAAA0Y,KAAArB,KAAA,eAAAtK,EAAA,KAAA,EAAA;gBACA/M,EAAA,IAAA2Y,KAAA,CAAA1kB,MAAAojB,MAAA9J,GAAAtZ,GAAA,EAAA,GAAA0jB,KAAAC,IAAA,KAAA,IAAA,CAAA,CAAA;;;;;;;;;kBAIA5X,EAAA,IAAA4Y,IAAAxF,KAAA/G,GAAA,YAAA,CAAA0L,MAAAP,MAAA,gBAAAA,GAAA,aAAAlL,EAAA,QAAA;;kBACAtM,EAAA,IAAA6Y,IAAAzF,KAAA/G,GAAA,mBAAA,CAAA0L,MAAAP,MAAA,gBAAAA,GAAA,gBAAA;;;;;;;;SAOAxX,EAAA,IAAA8Y,IAAArB,MAAA,CAAAK,MAAA,CAAA1E,KAAAL,MAAA,EAAAsE,MAAAM,MAAA,CAAAoB,CAAA;UAEA/Y,EAAA,IAAAgZ,IAAA9B,GAAA,MAAA,GAAA,CAAA;;UAEAlX,EAAA,IAAAiZ,MAAAD,EAAA,CAAA,MAAA,UAAAA,EAAA,CAAA,MAAA,UAAAhB,MAAA,CAAAL,CAAA;;;UACA3X,EAAA,IAAAkZ,MAAA/B,OAAA,UAAAA,OAAA,UAAAa,MAAA,CAAAL,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8CC9GW,EAAA,MAAA5mB,IAAA,OAAA,IAAAkL;;;;;;;;;ApLDb,QAAAkG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eqL8HgCqQ;AAAA;AAAA,IAAA9jB,EAAA,EAAA,EAAA,YAAA;AAAA;;;;;;;;;;;;;AAAA,MAAAK,EAAA,CAAA;AAAA,MAAA,QAAAyjB,OAAAA;AAAA,MAAA9jB,EAAA,EAAA,EAAA,YAAA,OAAA8D,GAAAkgB,GAAAF,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAsJEA;AAAA;AAAA,IAAA9jB,EAAA,EAAA,EAAA,QAAA;AAAA;;;;;;;;;;;;;AAAA,MAAAK,EAAA,CAAA;AAAA,MAAA,OAAAyjB,OAAAA;AAAA,MAAA9jB,EAAA,EAAA,EAAA,QAAA,OAAA8D,GAAAkgB,GAAAF,CAAA;AAAA;;;;;;;eAUAA;AAAA;AAAA,IAAA9jB,EAAA,EAAA,EAAA,YAAA;AAAA;;;;;;;;;;;;;AAAA,MAAAK,EAAA,CAAA;AAAA,MAAA,OAAAyjB,OAAAA;AAAA,MAAA9jB,EAAA,EAAA,EAAA,YAAA,OAAA8D,GAAAkgB,GAAAF,CAAA;AAAA;;;;;;;eAkBAA;AAAA;AAAA,IAAA9jB,EAAA,EAAA,EAAA,YAAA;AAAA;;;;;;;;;;;;;AAAA,MAAAK,EAAA,CAAA;AAAA,MAAA,QAAAyjB,OAAAA;AAAA,MAAA9jB,EAAA,EAAA,EAAA,YAAA,OAAA8D,GAAAkgB,GAAAF,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4kCAlQ5B2G,KAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmUyC,QAAAC,KAAA,MAAApZ,EAAA,IAAAmZ,KAAA,EAAA,GAEAE,IAAA,MAAArZ,EAAA,IAAAmZ,KAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnX/C,MAAMG,KAAkB,CAACC,GAAUna,GAAOD,MAAW;AACnD,EAAAqa,GAAmBD,CAAQ;AAErB,QAAAE,IAAQ,IAAI;AACZ,SAAAA,EAAA,aAAa,eAAe,WAAW,GAEtC,IAAI,QAAQ,CAACC,GAASC,MAAW;AAChC,IAAAF,EAAA,iBAAiB,QAAQG,GAAWH,GAAOra,GAAOD,GAAQua,GAASC,CAAM,CAAC,GAC1EF,EAAA,iBAAiB,SAASE,CAAM,GAEtCF,EAAM,MAAMF;AAAA,EAAA,CACb;AACH,GAEMK,KAAa,CAACH,GAAOra,GAAOD,GAAQua,GAASC,MAAW,MAAM;AAC5D,QAAAE,IAAS,SAAS,cAAc,QAAQ,GACxCzd,IAAUyd,EAAO,WAAW,IAAI;AAEtC,EAAAA,EAAO,QAAQza,GACfya,EAAO,SAAS1a,GAIhB/C,EAAQ,UAAUqd,GAAO,GAAG,GAAGra,GAAOD,CAAM,GAC5C0a,EAAO,OAAOC,GAAaL,GAAOra,GAAOD,GAAQua,GAASC,CAAM,CAAC;AACnE,GAEMI,KAAa,CAAA,GAEbD,KAAe,CAACL,GAAOra,GAAOD,GAAQua,GAASC,MAAW,CAACK,MAAS;AtL7B1E,MAAA7X;AsL8BE,EAAK6X,KAAeL;AAEd,QAAArsB,IAAM,IAAI,gBAAgB0sB,CAAI;AAEzB,EAAAD,GAAA5X,IAAAsX,EAAM,SAANM,GAAA5X,KAAe,KAC1B4X,GAAWN,EAAM,GAAG,EAAE,KAAKnsB,CAAG,GAEtBosB,EAAA,EAAE,KAAApsB,GAAK,OAAO,GAAG8R,CAAK,IAAID,CAAM,IAAI,MAAM,YAAa,CAAA;AACjE,GAEMqa,KAAqB,CAACS,MAAe;AAIzC,EAH0B,OAAO,KAAKF,EAAU,EAAE,OAAO,CAAA1rB,MAAOA,MAAQ4rB,CAAU,EACrC,IAAI,CAAA5rB,MAAO0rB,GAAW1rB,CAAG,CAAC,EAAE,OAEtD,QAAQ,CAAAA,MAAO,IAAI,gBAAgBA,CAAG,CAAC;AAC5D,GC7CM6rB,KAAiB,CAAOC,GAAY/a,GAAOD,MAAW+C,GAAA;AAC1D,EAAAiY,IAAa,MAAMA;AAEnB,QAAMC,IAAOD,EAAW;AAGjB,SAAA,EAAE,KAFG,sBAAsB,mBAAmBC,CAAI,CAAC,IAE5C,OAAO,GAAGhb,CAAK,IAAID,CAAM,IAAI,MAAM;AACnD;;;;;;;;;;;;;;;;;;;;MCmJ4D;AAAA;AAAA,QAAAzQ,EAAA,EAAA,IAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCA5I/C,EAAA,cAAA8d,KAAA,EAAA,IAAAvQ,GACA,EAAA,cAAAoQ,KAAA,OAAA,IAAApQ,GACA,EAAA,kBAAAub,IAAA,OAAA,IAAAvb,GACA,EAAA,UAAAvH,IAAA,EAAA,IAAAuH,GACA,EAAA,eAAAyE,IAAA,UAAA,IAAAzE,GACA,EAAA,iBAAAgb,IAAA,OAAA,IAAAhb,GACA,EAAA,iBAAA4X,IAAA,UAAA,IAAA5X,GACA,EAAA,WAAA6X,KAAA,QAAA,IAAA7X;mBAIPoe,IAAA,oBAAA,OAEAC,KAAAC,EAAA,IAAA,MAAA;AAAA,GAAA,GACAC,KAAAD,EAAA,IAAA,MAAA;AAAA,GAAA;AA4BE,QAAAE,KAAA,MAAAza,EAAA,IAAAqa,IAAAA,EAAA,IAAAd,CAAA,CAAA;;;AAiGY,MAAAe,GAAAnrB,EAAA,IAAAurB;;;;;;;WA3HlB1a,EAAA,IAAA+X,IAAArX,MAAA,SAAA;;SACAV,EAAA,IAAAoT,IAAA/G,MAAA,CAAA0L,CAAA;UACA/X,EAAA,IAAAgY,IAAAzL,GAAA,SAAA,CAAA;UAEAvM,EAAA,IAAAsM,IAAAC,GAAAC,EAAA,CAAA;;UACAxM,EAAA,IAAAiY,IAAAhB,MAAA;cAEAjX,EAAA,IAAAqP,IAAA,WAAA4I,EAAA,MAAA,GAAA,EAAA,CAAA,KAAA,EAAA,CAAA;eACAjY,EAAA,IAAAsP,IAAA,WAAA2I,EAAA,MAAA,GAAA,EAAA,CAAA,KAAA5I,CAAA,CAAA;;SAEArP,EAAA,IAAA2a,IAAA,CAAAvH,KAAA6E,MAAA,QAAA;;SACAjY,EAAA,IAAA4a,IAAA,CAAAxH,KAAA6E,MAAA,QAAA;;;;;;;;UAOAjY,EAAA,IAAA6a,IAAAzH,KAAA/G,GAAA,YAAA,CAAA0L,MAAAP,KAAA,gBAAAA,EAAA,cAAAlL,KAAA,gBAAAA,EAAA,SAAA;;;;;oCAKiCiO,EAAA,IAAA,CAAA3c,GAAAzO,OAAA+qB,GAAAM,GAAArrB,EAAA,GAAAyO,GAAAA,CAAA,CAAA,CAAA;;;iBAKjCoC,EAAA,IAAA8a,KAAAxO,KAAA,gBAAAA,EAAA,UAAA,EAAA;gBACAyO,EAAA,KAAA,CAAAle,MAAAmD,EAAA,IAAAgb,IAAAne,CAAA,CAAA,EAAA,MAAA4d,EAAA;iBAIA,UAAA,aAAA,WAAA,IAAA,cAAA,EAAA,OAAAK,GAAA,QAAAG,GAAA,OAAAC,GAAA,SAAAF,EAAA,CAAA;YASA,UAAA,aAAA,iBAAA,QAAA,MAAA;AACE,MAAAva,GAAAlC,GAAA;AAAA,QACE,MAAA;AAAA,QACA,aAAA;AAAA,QACA,aAAA;AAAA;;YAIJ,UAAA,aAAA,iBAAA,SAAA,MAAA;AACE,MAAAkC,GAAAlC,GAAA;AAAA,QACE,MAAA;AAAA,QACA,aAAA;AAAA,QACA,aAAA;AAAA;;;AAKF,MAAAkC,GAAAlC,GAAA;AAAA,QACE,MAAA;AAAA,QACA,aAAA;AAAA,QACA,aAAA;AAAA,QACA,OAAA,KAAA,IAAA,GAAA,KAAA,IAAA,GAAA4c,IAAAzmB,CAAA,CAAA;AAAA;;;MAMA+L,GAAAlC,0BAAA;AAAA,QACE,MAAA;AAAA,QACA,aAAA;AAAA,QACA,aAAA;AAAA;UAIF;AAAA,QACE,MAAA;AAAA,QACA,aAAA;AAAA,QACA,aAAA;AAAA;;;MAOFkC,GAAAlC,0BAAA;AAAA,QACE,MAAA;AAAA,QACA,aAAA;AAAA,QACA,aAAA;AAAA;UAIF;AAAA,QACE,MAAA;AAAA,QACA,aAAA;AAAA,QACA,aAAA;AAAA;;;AAMJ,MAAAkC,GAAAlC,GAAA;AAAA,QACE,MAAA;AAAA,QACA,aAAA;AAAA,QACA,aAAA;AAAA;;;AAKF,MAAAkC,GAAAlC,GAAA;AAAA,QACE,MAAA;AAAA,QACA,aAAA;AAAA,QACA,aAAA;AAAA;;mCA/EJ,UAAA,aAAA,cAAA,IAGA6c,EAAA,QAAA,CAAAvnB,MAAA;;AAEQ,gBAAA,aAAA,iBAAAA,GAAA,IAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eC7DsE2X,GAAA6P,GAAA,OAAAC,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAL9Etb,EAAA,GAAAub,IAAA,OAAA,IAAA;;;;;;;;;;;;;;;;;;AzLHF,IAAAC,IAAAC,IAAAC,IAAAC;A0LSA,MAAMC,GAAkB;AAAA,EACtB,YAAYC,GAAYC,GAAc;AAoCtC;AAAA,IAAAC,GAAA,MAAAP;AAIA,IAAAO,GAAA,MAAAL;AAvCE,SAAK,aAAaG,GAClB,KAAK,eAAeC,GACpB,KAAK,YAAY;EACnB;AAAA,EAEA,YAAYE,GAAYC,MAAeC,GAAM;A1LhB/C,QAAA/Z;A0LiBS,KAAAA,IAAA,KAAA,WAAA6Z,OAAA7Z,EAAA6Z,KAA0B;AACzB,UAAAG,IAAO,KAAK,UAAUH,CAAU,EAAE,MAAM,EAAE,EAAE,CAAC;AAInD,IAFA,KAAK,UAAUA,CAAU,EAAE,KAAK,EAAE,YAAAC,GAAY,MAAAC,GAAM,GAEhD,EAAAC,KAAQC,EAAA,MAAKZ,IAAAC,IAAL,WAAkBS,GAAMC,EAAK,WAErCA,KAAQ,KAAK,aAAaH,GAAY,GAAGG,EAAK,IAAI,GACjD,KAAA,WAAWH,GAAY,GAAGE,CAAI;AAAA,EACrC;AAAA,EAEA,eAAeF,GAAYC,GAAY;A1L5BzC,QAAA9Z;A0L6BS,KAAAA,IAAA,KAAA,WAAA6Z,OAAA7Z,EAAA6Z,KAA0B;AACzB,UAAAG,IAAO,KAAK,UAAUH,CAAU,EAAE,MAAM,EAAE,EAAE,CAAC;AAKnD,QAHKI,EAAA,MAAAV,IAAAC,IAAA,WAAY,KAAK,UAAUK,CAAU,GAAG,CAAKniB,MAAAA,EAAE,eAAeoiB,IAG/D,EADgBE,KAAQF,MAAeE,EAAK;AAC5B;AAEd,UAAAE,IAAW,KAAK,UAAUL,CAAU,EAAE,MAAM,EAAE,EAAE,CAAC;AACvD,IAAIK,KAAYD,EAAA,MAAKZ,IAAAC,IAAL,WAAkBU,EAAK,MAAME,EAAS,UAEtD,KAAK,aAAaL,GAAY,GAAGG,EAAK,IAAI,GACtCE,KAAY,KAAK,WAAWL,GAAY,GAAGK,EAAS,IAAI;AAAA,EAC9D;AAgBF;AAZEb,KAAA,eAAAC,KAAA,SAAaa,GAAMC,GAAM;AACvB,SAAOD,EAAK,WAAWC,EAAK,UAAUD,EAAK,MAAM,CAACroB,GAAG9E,MAAM8E,MAAMsoB,EAAKptB,CAAC,CAAC;AAC1E,GAEAusB,KAAA,eAAAC,KAAA,SAAYa,GAAOC,GAAa;AAC9B,WAASttB,IAAIqtB,EAAM,SAAS,GAAGrtB,KAAK,GAAGA,KAAK;AAC1C,QAAKstB,EAAYD,EAAMrtB,CAAC,CAAC,GAEnB;AAAA,MAAAqtB,EAAA,OAAOrtB,GAAG,CAAC;AACjB;AAAA;AAEJ;ACzDF,MAAMutB,KAAiB,CAAC7oB,GAAM8oB,GAASC,MAAa;AAClD,MAAI,CAACC,GAAiBC,CAAe,IAAIF,EAAS,MAAM,GAAG;AAEvC,EAAAC,UAAA,SACAC,UAAAD;AAEd,QAAAE,IAAelpB,MAAS,YAAYgpB,IAAkBC;AAC5D,SAAOC,MAAiB,SAASA,MAAiB,WAAUJ,KAAA,gBAAAA,EAAS,aAAY;AACnF,GCLMK,KAAgB,2BAChBC,KAAc,CAACC,MAAM,CAAC,yBAAyB,OAAO,UAAUA,CAAC,EAAE;A5LJzE,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC;A4LMA,MAAMC,KAAN,MAAMA,GAAkB;AAAA,EAGtB,OAAO3pB,GAAM8oB,GAASC,GAAUa,GAAY;AAC1C,UAAM1L,IAAU2K,GAAe7oB,GAAM8oB,GAASC,CAAQ,GAEhDrnB,IAAW,KAAK,OAAO1B,CAAI,EAAE,GAC7B8b,IAAUoC,IAAU4K,KAAA,gBAAAA,EAAS,SAAS;AAE5C,IAAIhN,KAAW+N,GAAAF,IAAkBL,IAAU,YAAYxN,GAAS,MAAM8N,CAAU,GAC5EloB,KAA8BmoB,GAAAF,IAAAL,IAAU,eAAe5nB,GAAU,IAAI,GAEpE,KAAA,OAAO1B,CAAI,EAAE,IAAI8b;AAAA,EACxB;AAyCF;AArDSwN,KAAA,eAcAC,KAAA,eAAAC,KAAe,SAAAM,GAAQF,GAAY;AACxC,QAAMG,IAAiB,SAAS,iBAAiB,IAAIZ,EAAa,KAAKW,CAAM,IAAI;AAEjF,aAAWzsB,KAAW0sB,GAAgB;AACpC,UAAM/c,IAAS,SAAS,iBAAiB3P,GAAS,WAAW,WAAW,MAAM,EAAK;AAC/E,QAAAL;AAEI,WAAAA,IAAOgQ,EAAO,cAAa;AAEjC,UADgB,QAAQ,KAAKhQ,EAAK,SAAS;AAC5B;AAGf,MADeA,EAAK,WAAW,SAAS,YAAkB,MAAA,QAC5CA,IAAOA,EAAK;AAEpB,YAAAgtB,IAAO,SAAS,cAAc,MAAM;AAE1C,MAAAA,EAAK,UAAU,IAAI,GAAGZ,GAAYU,CAAM,CAAC,GACzCE,EAAK,MAAM,aAAaJ,GAEnB5sB,EAAA,WAAW,aAAagtB,GAAMhtB,CAAI,GACvCgtB,EAAK,YAAYhtB,CAAI;AAAA,IACvB;AAAA,EACF;AACF,GAEOysB,KAAA,eAAAC,cAAkBI,GAAQ;AAC/B,QAAMC,IAAiB,SAAS,iBAAiB,IAAIZ,EAAa,KAAKW,CAAM,IAAI;AAEjF,aAAWzsB,KAAW0sB,GAAgB;AACpC,UAAME,IAAe5sB,EAAQ,iBAAiB,QAAQ+rB,GAAYU,CAAM,CAAC,EAAE;AAE3E,eAAWE,KAAQC;AACN,iBAAAC,KAASF,EAAK;AAClB,QAAAA,EAAA,WAAW,aAAaE,GAAOF,CAAI,GACxCA,EAAK,OAAO;AAAA,EAGlB;AACF,GAtCA9B,GAfIyB,IAeGJ,KAyBPrB,GAxCIyB,IAwCGF,KAvCPvB,GADIyB,IACGL,IAAY,IAAIvB,GAAkBQ,EAAAoB,IAAKJ,IAAAC,KAAgBjB,EAAAoB,IAAKF,IAAAC,GAAiB;AADtF,IAAMS,KAANR;ACFA,MAAMS,KAAgB,CAAC,yBAAyB,KAAK;A7LJrD,IAAAd,IAAAe,IAAAC,IAAAC,IAAAC;A6LcA,MAAMC,KAAN,MAAMA,GAAkB;AAAA,EAGtB,OAAO3B,GAASC,GAAU;AACxB,UAAM7K,IAAU2K,GAAe,WAAWC,GAASC,CAAQ,GAErDrnB,IAAW,KAAK,UAChBoa,IAAUoC,IAAU4K,KAAA,gBAAAA,EAAS,SAAS;AAE5C,IAAIhN,KAA6B+N,GAAAY,IAAAnB,IAAU,YAAYxN,GAAS,IAAI,GAChEpa,KAA8BmoB,GAAAY,IAAAnB,IAAU,eAAe5nB,GAAU,IAAI,GAEzE,KAAK,WAAWoa;AAAA,EAClB;AAiBF;AA7BSwN,KAAA,eAcAe,KAAA,eAAAC,cAAYR,GAAQ;AACzB,QAAMC,IAAiB,SAAS,iBAAiB,IAAIZ,EAAa,KAAKW,CAAM,IAAI;AAEjF,aAAWzsB,KAAW0sB;AACZ,IAAA1sB,EAAA,UAAU,IAAI,GAAG+sB,EAAa;AAE1C,GAEOG,KAAA,eAAAC,cAAeV,GAAQ;AAC5B,QAAMC,IAAiB,SAAS,iBAAiB,IAAIZ,EAAa,KAAKW,CAAM,IAAI;AAEjF,aAAWzsB,KAAW0sB;AACpB,IAAAW,GAAoBrtB,GAAS+sB,EAAa;AAE9C,GAdAlC,GAfIuC,IAeGJ,KAQPnC,GAvBIuC,IAuBGF,KAtBPrC,GADIuC,IACGnB,IAAY,IAAIvB,GAAkBQ,EAAAkC,IAAKJ,IAAAC,KAAa/B,EAAAkC,IAAKF,IAAAC,GAAc;AADhF,IAAMG,KAANF;AAkCA,MAAMC,KAAsB,CAACrtB,GAASutB,MAAY;AAChD,MAAI,CAACvtB;AAAW;AAKhB,QAAMwtB,IAHe,CAAC,GAAGxtB,EAAQ,SAAS,EAAE,OAAO,CAAAoG,MAAK,CAACmnB,EAAQ,SAASnnB,CAAC,CAAC,EACzC,KAAK,OAAKA,EAAE,WAAW,cAAc,CAAC,IAEjCmnB,EAAQ,OAAO,CAAKnnB,MAAAA,MAAM,KAAK,IAAImnB;AACnE,EAAAvtB,EAAA,UAAU,OAAO,GAAGwtB,CAAe;AAC7C,GCpDMC,KAAmB,CAACzB,GAAGloB,GAAG4I,MAAM,CAAC,sBAAsB,OAAO,UAAUsf,CAAC,IAAI,YAAYloB,CAAC,IAAI,OAAO4I,CAAC,SAAS,GAC/GqgB,KAAgB,CAAC,wBAAwB,KAAK;A9LLpD,IAAAd,IAAAyB,IAAAC,IAAAC,IAAAC;A8LOA,MAAMC,KAAN,MAAMA,GAAkB;AAAA,EAGtB,YAAYC,GAAU;AACpB,SAAK,WAAWA,GAChB,KAAK,aAAa;EACpB;AAAA,EAEA,OAAOtC,GAASC,GAAU7P,GAAUiG,GAAa;AAC/C,UAAMkM,IAAStC,EAAS,SAAS,KAAK,KAAKA,EAAS,SAAS,MAAM,GAE7DrnB,IAAW,KAAK,UAChBoa,KAAUgN,KAAA,gBAAAA,EAAS,WAAWuC,MAAU3pB,KAAA,gBAAAA,EAAU;AAExD,IAAIoa,KAAW+N,GAAAsB,IAAkB7B,IAAU,YAAYxN,GAAS,MAAM,MAAM5C,GAAUiG,CAAW,GAC7Fzd,KAA8BmoB,GAAAsB,IAAA7B,IAAU,eAAe5nB,GAAU,IAAI,GAEzE,KAAK,WAAWoa;AAAA,EAClB;AAAA,EAEA,QAAQ;AACD,SAAA,OAAO,MAAM,MAAM;AAAA,EAC1B;AA2CF;AAhESwN,KAAA,eAuBAyB,KAAA,eAAAC,KAAA,SAAelB,GAAQwB,GAAMpS,GAAUiG,GAAa;AACzD,QAAM9hB,IAAU,SAAS,cAAc,IAAI8rB,EAAa,KAAKW,CAAM,IAAI,GACjEyB,IAAY,SAAS,cAAc,KAAK;AAM9C,EAFsB,CAAC,YAAY,YAAY,YAAY,YAAY,YAAY,WAAW,EAAE,SAASrS,CAAQ,KAEpF7b,EAAA,UAAU,IAAI,GAAG+sB,EAAa,GAC3DmB,EAAU,UAAU,IAAI,GAAGT,GAAiBhB,GAAQ5Q,GAAUiG,CAAW,CAAC,GAErD,CAAC,aAAa,aAAa,UAAU,EAAE,SAASjG,CAAQ,IAGnE7b,EAAA,aAAakuB,GAAWluB,EAAQ,UAAU,IAElDA,EAAQ,YAAYkuB,CAAS,GAG1BD,EAAA,WAAW,KAAKC,CAAS,GACzBD,EAAA,SAASA,EAAK,UAAU;AAC/B,GAEOL,KAAA,eAAAC,KAAA,SAAkBpB,GAAQwB,GAAMpS,GAAUiG,GAAa;AAC5D,QAAMyL,IAAUE,GAAiBhB,GAAQ5Q,GAAUiG,CAAW;AAE9D,WAAS7jB,IAAI,GAAGA,IAAIgwB,EAAK,WAAW,QAAQhwB,KAAK,GAAG;AAElD,QAAI,CADYsvB,EAAQ,MAAM,CAAK,MAAAU,EAAK,WAAWhwB,CAAC,EAAE,UAAU,SAAS,CAAC,CAAC;AAC3D;AAEhB,UAAM+B,IAAUiuB,EAAK,WAAWhwB,CAAC,EAAE;AACnC,IAAAovB,GAAoBrtB,GAAS+sB,EAAa,GAErCkB,EAAA,WAAWhwB,CAAC,EAAE,OAAO,GACrBgwB,EAAA,WAAW,OAAOhwB,GAAG,CAAC,GAEtBA,KAAA;AAAA,EACP;AAEK,EAAAgwB,EAAA,SAASA,EAAK,UAAU;AAC/B,GAxCApD,GAxBIiD,IAwBGJ,KAuBP7C,GA/CIiD,IA+CGF,KA9CP/C,GADIiD,IACG7B,IAAY,IAAIvB,GAAkBQ,EAAA4C,IAAKJ,IAAAC,KAAgBzC,EAAA4C,IAAKF,IAAAC,GAAiB;AADtF,IAAMM,KAANL;ACLA,MAAMM,KAAmB,MACvB/gB,GAAS;AAAA,EACP,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AACf,CAAC,GCLGghB,KAAY,CAAOC,MAA2BC,MAAAvd,GAAA,SAA3Bsd,GAA2B,GAAAC,IAAA,WAA3BpxB,GAAKqxB,IAAe,IAAO;AAClD,QAAMC,IAAW,MAAM,MAAMtxB,GAAKqxB,CAAY,EAAE,MAAM,MAAM;AAAA,EAAA,CAAE,GACxDE,IAAO,MAAMD,KAAA,gBAAAA,EAAU,OAAO,MAAM,MAAM;AAAA,EAAA;AAE5C,UAAAA,KAAA,gBAAAA,EAAU,YAAW,OACZzjB,GAAA,mBAAmB7N,CAAG,IAAIsT,GAAAhD,GAAA,IAChC+gB,IADgC;AAAA,IAEnC,gBAAgBC,KAAA,gBAAAA,EAAU;AAAA,IAC1B,cAAcC;AAAA,EAAA,EACf,GAGIA;AACT,IAEMC,KAAW,CAACxxB,GAAKyD,MACrBytB,GAAUlxB,GAAK;AAAA,EACb,QAAQ;AAAA,EACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,EAC9C,MAAM,KAAK,UAAUyD,GAAM,CAAC0Y,GAAGD,MAAMA,MAAM,SAAY,OAAOA,CAAC;AACjE,CAAC;AhMtBH,IAAAuV,IAAAC;AiMEA,MAAMC,GAAgB;AAAA,EACpB,YAAYC,GAAcC,GAAWC,GAAY;AA0CjD;AAAA,IAAApE,GAAA,MAAA+D;AAzCO,SAAA,UAAU1D,EAAA,MAAK0D,IAAAC,IAAL,WAAqBE,IACpC,KAAK,YAAYC,GACjB,KAAK,aAAaC;AAAA,EACpB;AAAA,EAEM,oBAAoB;AAAA,WAAAje,GAAA;AACxB,YAAMke,IAAU,EAAE,eAAe,eAAe,KAAK,UAAU,MACzD,EAAE,OAAAC,EAAM,IAAI,MAAMd,GAAU,WAAW,KAAK,OAAO,oBAAoB,EAAE,SAAAa,EAAS,CAAA;AACxF,WAAK,iBAAiBC;AAAA,IACxB;AAAA;AAAA,EAEM,oBAAoBC,GAAWve,GAAS;AAAA,WAAAG,GAAA;AAC5C,YAAMqe,IAAe,SAAS,KAAK,OAAO,gBAAgB,KAAK,cAAc,IACvEC,IAAW;AAEjB,WAAK,YAAY,IAAI,UAAUD,GAAcC,CAAQ,GAChD,KAAA,UAAU,YAAY,CAAKvsB,MAAAqsB,EAAU,KAAK,MAAMrsB,EAAE,IAAI,CAAC,GAC5D,KAAK,UAAU,UAAU8N,GAEzB,MAAM,IAAI,QAAQ,CAAA2X,MAAW,KAAK,UAAU,SAASA,CAAO;AAAA,IAC9D;AAAA;AAAA,EAEA,2BAA2B;AACnB,UAAA+G,IAAa,KAAK,UAAU,EAAE,SAAS,2BAA2B,IAAI,KAAK,UAAA,CAAW,GACtFC,IAAW,KAAK,UAAU,EAAE,SAAS,aAAa,YAAAD,GAAY;AAE/D,SAAA,UAAU,KAAKC,CAAQ;AAAA,EAC9B;AAAA,EAEA,UAAU;AAEJ,IADJ,KAAK,iBAAiB,MACjB,KAAK,cAEL,KAAA,UAAU,YAAY,MAAM;AAAA,IAAA,GAC5B,KAAA,UAAU,UAAU,MAAM;AAAA,IAAA,GAC/B,KAAK,UAAU,SACf,KAAK,YAAY;AAAA,EACnB;AAWF;AAPEZ,KAAA,eAAAC,cAAgBE,GAAc;AACxB,SAAAA,EAAa,SAAS,SAAS,IAC1B,+BAEA;AAEX;AC/CF,IAAIU;AAEJ,MAAMC,KAAiB,CAAOX,GAAcC,GAAWC,GAAY1f,MAAYyB,GAAA;AAC7E,EAAI,CAAC+d,KAAgB,CAACC,KAAa,CAACC,MAEpCQ,MAAA,QAAAA,GAAQ,WACRA,KAAS,IAAIX,GAAgBC,GAAcC,GAAWC,CAAU,GAEhE,MAAMQ,GAAO,qBACb,MAAMA,GAAO,oBAAoBE,GAAcpgB,CAAO,GAAGqgB,EAAW,GACpE,MAAMH,GAAO;AACf,IAEME,KAAgB,CAACpgB,MAAY,CAACsgB,MAAmB;AlMjBvD,MAAA5e,GAAAC;AkMmBE,IADuBA,KAAAD,IAAA4e,KAAA,gBAAAA,EAAgB,YAAhB,gBAAA5e,EAAyB,WAAzB,gBAAAC,EAAiC,YAAW,2BAC7C4e,GAAmBD,GAAgBtgB,CAAO,GAE5CsgB,EAAe,SAAS,yBACzBE,GAAgBF,CAAc;AACnD,GAEMC,KAAqB,CAACD,GAAgBtgB,MAAY;AAChD,QAAAygB,IAASH,EAAe,QAAQ;AAEtC,EAAAtgB,EAAQlC,GAAS;AAAA,IACf,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,WAAW2iB,EAAO;AAAA,IAClB,UAAUA,EAAO;AAAA,IACjB,UAAUA,EAAO;AAAA,IACjB,WAAWA,EAAO;AAAA,IAClB,eAAeA,EAAO;AAAA,EACvB,CAAA,CAAC;AACJ,GAEMD,KAAkB,CAACF,MAAmB;AAC/B,EAAA7kB,GAAA,0DAA0D,EAAE,gBAAA6kB,EAAA,CAAgB;AACzF,GAEMD,KAAc,CAACxtB,MAAU;AAClB,EAAA4I,GAAA,+BAA+B,EAAE,OAAA5I,EAAA,CAAO;AACrD,GC9CM6tB,KAAY,CAAC1E,MAAgB;AACjC,MAAI,CAAAA;AAEG,WAAA,IAAI,QAAQ,CAAW/C,MAAA;AAC5B,kBAAY,MAAM+C,EAAA,KAAiB/C,KAAW,EAAE;AAAA,IAAA,CACjD;AACH,GCNM0H,KAAgB,CAACC,MAAW;AAG1B,QAAAC,IADY,OAAO,KAAKD,EAAO,GAAG,KAAK,EAAE,OAAO,CAAK9zB,MAAA,CAACg0B,GAAW,IAAIh0B,CAAC,CAAC,EACjD,IAAI,CAAAoE,MAAQ,CAACA,GAAM0vB,EAAO1vB,CAAI,CAAC,CAAC;AAErD,SAAA,OAAO,YAAY2vB,CAAS;AACrC,GAEMC,yBAAiB,IAAI;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC,GCfKC,KAAa,CAACC,GAAWC,MAAa;AAC1C,QAAMC,IAAO,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAKF,CAAS,GAAG,GAAG,OAAO,KAAKC,CAAQ,CAAC,CAAC,GACpEE,IAAO,CAAA;AAEb,aAAWhvB,KAAO+uB,GAAM;AAChB,UAAAE,IAAcJ,EAAU7uB,CAAG,GAC3BkvB,IAAaJ,EAAS9uB,CAAG;AAE/B,IAAIivB,MAAgBC,MAClBF,EAAKhvB,CAAG,IAAI,EAAE,eAAeivB,GAAa,cAAcC;EAE5D;AAEO,SAAAF;AACT;ACTA,IAAIG,KAAgB;AACpB,MAAMC,KAAe,CAAA,GAEfC,KAAmB,CAAOC,GAAaC,GAAYlhB,MAAgBiB,GAAA;AACjE,QAAAif,GAAU,MAAMgB,EAAW,MAAM;AACvC,QAAMC,IAASD,EAAW,QAEpBE,IAAeC,GAAsBF,EAAO,cAAcnhB,GAAaihB,CAAW;AAExF,EAAIG,IAAeN,MAAiCQ,GAAAH,GAAQL,IAAeM,GAAcH,CAAW,GAChGG,IAAeN,MAAiCS,GAAAJ,GAAQL,IAAeM,CAAY,GAEvEN,KAAAM;AAClB,IAEMC,KAAwB,CAACnzB,GAAG4b,GAAMmX,MAAgB;AACtD,QAAMlX,IAAYkX,EAAY,UAAU,CAAAjtB,MAAKA,EAAE,CAAC,MAAM9F,KAAK8F,EAAE,CAAC,IAAI8V,KAAQ9V,EAAE,CAAC,IAAI9F,CAAC;AAGlF,SAFoB6b,MAAc,KAGzBkX,EAAY,SAAS,IAErBlX,IAAY;AAEvB,GAEMuX,KAAkB,CAACH,GAAQL,GAAeM,GAAcH,MAAgB;AAC5E,WAAS/yB,IAAI4yB,IAAgB,GAAG5yB,KAAKkzB,GAAclzB,KAAK,GAAG;AACnD,UAAAszB,IAASrB,GAAcgB,CAAM;AAEnC,IAAAF,EAAY/yB,CAAC,EAAE,CAAC,EAAEizB,CAAM;AAClB,UAAAM,IAAQtB,GAAcgB,CAAM,GAE5BR,IAAOJ,GAAWiB,GAAQC,CAAK;AACrC,IAAAV,GAAa,KAAKJ,CAAI;AAAA,EACxB;AACF,GAEMY,KAAkB,CAACJ,GAAQL,GAAeM,MAAiB;AAC/D,WAASlzB,IAAI4yB,GAAe5yB,IAAIkzB,GAAclzB,KAAK,GAAG;AAC9C,UAAAyyB,IAAOI,GAAa;AAE1B,eAAW,CAACpvB,GAAK+vB,CAAK,KAAK,OAAO,QAAQf,CAAI;AACrC,MAAAQ,EAAAxvB,CAAG,IAAI+vB,EAAM;AAAA,EAExB;AACF,GCjDMC,KAAgB,CAAChyB,MAChBA,IAIDiyB,GAAYjyB,CAAM,IACb,EAAE,WAAWkyB,GAAYlyB,CAAM,GAAG,mBAAmB,OAG1D,OAAOA,KAAW,WACb,EAAE,WAAWmyB,GAAYnyB,CAAM,GAAG,mBAAmB,OAGvD,EAAE,WAAWA,GAAQ,mBAAmB,GAAK,IAX3C,EAAE,WAAWoyB,GAAgB,GAAG,mBAAmB,GAAM,GAgB9DH,KAAc,CAACjyB,MACZ,OAAOA,KAAW,YAAYA,EAAO,SAAS,YAAkB,MAAA,UAGnEoyB,KAAkB,MAAM;AACtB,QAAA7S,IAAM,SAAS,cAAc,KAAK;AAC/B,kBAAA,KAAK,YAAYA,CAAG,GAEtBA;AACT,GAEM2S,KAAc,CAAClyB,MAAW;AACxB,QAAAuf,IAAM,SAAS,cAAc,KAAK;AACxC,SAAAvf,EAAO,WAAW,aAAauf,GAAKvf,EAAO,WAAW,GAE/Cuf;AACT,GAEM4S,KAAc,CAACnyB,GAAQiD,IAAO,aAAa;AAC3C,MAAA,OAAOjD,KAAW;AAAmB,WAAAA;AAEnC,QAAAqyB,IAAW,SAAS,iBAAiBryB,CAAM;AAE7C,SAAAqyB,EAAS,WAAW,KACtB/mB,GAAW,wBAAwBrI,CAAI,2CAA2C,EAAE,QAAAjD,GAAQ,UAAAqyB,GAAU,GAGpGA,EAAS,SAAS,KACT/mB,GAAA,wBAAwBrI,CAAI,sCAAsCovB,EAAS,MAAM,oBAAoB,EAAE,QAAAryB,GAAQ,UAAAqyB,EAAU,CAAA,GAG/HA,EAAS,CAAC;AACnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IC6IsB,eAAA;AAAA,IAAAv0B,EAAA,EAAA;AAAA,IAAAA,EAAA,EAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAAK,EAAA,CAAA;AAAA,MAAA,OAAAA,EAAA,CAAA;AAAA,MAAA,MAAAm0B,EAAA,gBAAA;AAAA,MAAAx0B,EAAA,EAAA;AAAA,MAAAA,EAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA4BkCA,EAAA,EAAA,EAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAAA,EAAA,EAAA,EAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAxCnD6kB;AAAA;AAAA,KAAA7kB,EAAA,EAAA;AAAA,IAAAA,EAAA,EAAA,MAAAy0B,GAAAz0B,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAAAA,EAAA,EAAA;AAAA,MAAAA,EAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6CAlKQ,EAAA,cAAAuxB,IAAA,qDAAA,IAAAhkB,GACA,EAAA,WAAAikB,IAAA,OAAA,IAAAjkB,GACA,EAAA,WAAAmnB,IAAA,OAAA,IAAAnnB,GACA,EAAA,YAAAonB,IAAA,OAAA,IAAApnB,GACA,EAAA,UAAAqnB,IAAA,OAAA,IAAArnB,GACA,EAAA,WAAAsnB,IAAA,OAAA,IAAAtnB,6BAEA,EAAA,mBAAAunB,IAAA,GAAA,IAAAvnB,GACA,EAAA,aAAA+W,IAAA,WAAA,IAAA/W,GACA,EAAA,aAAAmb,IAAA,OAAA,IAAAnb,GACA,EAAA,cAAA+a,KAAA,OAAA,IAAA/a,GACA,EAAA,iBAAAgb,KAAA,OAAA,IAAAhb,GACA,EAAA,eAAAib,KAAA,WAAA,IAAAjb,GACA,EAAA,gBAAAkb,IAAA,OAAA,IAAAlb,oCAEA,EAAA,cAAAwnB,IAAA,OAAA,IAAAxnB,4BAEA,EAAA,cAAAuQ,IAAA,EAAA,IAAAvQ,kCAEA,EAAA,mBAAAynB,KAAA,GAAA,IAAAznB,4BAEA,EAAA,aAAA0nB,IAAA,GAAA,IAAA1nB,GACA,EAAA,mBAAA2nB,KAAA,GAAA,IAAA3nB,GACA,EAAA,iBAAA4nB,KAAA,GAAA,IAAA5nB,GACA,EAAA,UAAAvH,KAAA,EAAA,IAAAuH,GACA,EAAA,aAAAgF,KAAA,EAAA,IAAAhF,GACA,EAAA,eAAAyE,IAAA,UAAA,IAAAzE,GACA,EAAA,cAAAsb,KAAA,EAAA,IAAAtb,iGAEA,EAAA,aAAA6nB,KAAA,WAAA,IAAA7nB,GACA,EAAA,gBAAAgR,KAAA,OAAA,IAAAhR,GACA,EAAA,aAAAiR,KAAA,OAAA,IAAAjR,GACA,EAAA,cAAA8nB,KAAA,OAAA,IAAA9nB,GACA,EAAA,WAAA2X,KAAA,OAAA,IAAA3X,GACA,EAAA,iBAAA4X,KAAA,UAAA,IAAA5X,GACA,EAAA,WAAA6X,KAAA,qBAAA,IAAA7X,GACA,EAAA,gBAAA+nB,KAAA,OAAA,IAAA/nB,GACA,EAAA,iBAAAwb,KAAA,GAAA,IAAAxb,GACA,EAAA,mBAAAgoB,KAAA,MAAA,IAAAhoB,GACA,EAAA,mBAAAioB,KAAA,MAAA,IAAAjoB,GACA,EAAA,uBAAAkoB,KAAA,OAAA,IAAAloB,GACA,EAAA,uBAAAmoB,KAAA,WAAA,IAAAnoB,GACA,EAAA,gBAAAooB,IAAA,OAAA,IAAApoB,GACA,EAAA,gBAAAqoB,KAAA,OAAA,IAAAroB,GACA,EAAA,aAAA8P,KAAA,OAAA,IAAA9P,GACA,EAAA,eAAA8C,KAAA,eAAA,IAAA9C,GACA,EAAA,kBAAAsoB,KAAA,UAAA,IAAAtoB,GACA,EAAA,oBAAAuoB,KAAA,OAAA,IAAAvoB,GACA,EAAA,cAAAwoB,KAAA,OAAA,IAAAxoB,GACA,EAAA,YAAAkkB,KAAA,OAAA,IAAAlkB,GACA,EAAA,eAAAyoB,KAAA,GAAA,IAAAzoB;yCAGA,EAAA,cAAA0oB,KAAA,OAAA,IAAA1oB;AACE,QAAA2oB,KAAA,IAAA1I,MAAAiG,GAAA,iBAAA,GAAAjG,CAAA,GACA2I,KAAA,IAAA3I,MAAAiG,GAAA,oBAAA,GAAAjG,CAAA;qCAIF,EAAA,kBAAA4I,KAAA,GAAA,IAAA7oB,GACA,EAAA,kBAAA8oB,KAAA,GAAA,IAAA9oB,GACA,EAAA,cAAA+oB,KAAA,GAAA,IAAA/oB,GACA,EAAA,cAAAgpB,KAAA,OAAA,IAAAhpB,GACA,EAAA,eAAAipB,IAAA,OAAA,IAAAjpB,GACA,EAAA,iBAAAkpB,KAAA,OAAA,IAAAlpB,GACA,EAAA,YAAAkmB,KAAA,OAAA,IAAAlmB,GACA,EAAA,cAAAmpB,KAAA,OAAA,IAAAnpB,GACA,EAAA,aAAAopB,KAAA,OAAA,IAAAppB,GACA,EAAA,iBAAAqpB,KAAA,OAAA,IAAArpB,GACA,EAAA,kBAAAspB,KAAA,OAAA,IAAAtpB,GACA,EAAA,aAAAupB,KAAA,GAAA,IAAAvpB,GACA,EAAA,gBAAA6Q,KAAA,EAAA,IAAA7Q,mCAEA,EAAA,mBAAAwpB,IAAA,IAAApG,GAAA,CAAAxiB,MAAAmD,EAAA,IAAA0lB,IAAA7oB,CAAA,CAAA,EAAA,IAAAZ,GACA,EAAA,mBAAA0pB,KAAA,IAAAnH,GAAA,EAAA,IAAAviB,GACA,EAAA,mBAAA2pB,KAAA,IAAA5H,GAAA,EAAA,IAAA/hB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwHE,QAAA4pB,KAAA,CAAA5xB,MAAAwM,GAAAkB,GAAAhD,GAAA,QAAA;AAAA,IAAoB,aAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cArHjCqB,EAAA,IAAA2M,IAAAmZ,GAAApC,EAAA,CAAA;;cACA1jB,EAAA,IAAAqM,IAAA0Z,EAAApC,CAAA,CAAA;;cACA3jB,EAAA,IAAAwX,IAAAuO,EAAAlC,EAAA,CAAA;;cACAtX,EAAAC,CAAA;;YAEAxM,EAAA,IAAAgmB,IAAAhB,KAAA,UAAAhS,CAAA;;;;kBACAiT,IAAAjZ,IAAA,kBAAA;YAEAhN,EAAA,IAAA+jB,KAAAhB,GAAAgB,IAAA,QAAA,CAAA;eACA/jB,EAAA,IAAA2kB,KAAA5B,GAAA4B,IAAA,eAAA,CAAA;;;;SAKAlkB,GAAA6e,GAAA,CAAA;;UACAsB,GAAAX,GAAAC,GAAAC,IAAA,CAAA+F,MAAAzlB,GAAAylB,CAAA,CAAA;;eAEAlmB,EAAA,IAAAmmB,IAAA7B,MAAA6B,CAAA;;;eACAC,KAAAC;;;;;;;iBAUArmB,EAAA,IAAAsmB,IAAAC,KAAAla,KAAAM,CAAA;;;;;eAGAgZ,GAAA,OAAArB,IAAAJ,EAAA;;;;;;YAMAjC,GAAAC,IAAAC,IAAAlhB,EAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpIF,MAAMulB,GAAgB;AAAA,EACpB,YAAYvG,GAAcC,GAAW;AACnC,SAAK,UAAUD,KAAA,gBAAAA,EAAc,QAAQ,QAAQC;AAAA,EAC/C;AAAA,EAEA,YAAY1hB,GAAI;AACd,WAAO+gB,GAAU,GAAG,KAAK,OAAO,kBAAkB/gB,CAAE,EAAE;AAAA,EACxD;AAAA,EAEA,aAAaA,GAAI;AACf,WAAO+gB,GAAU,GAAG,KAAK,OAAO,mBAAmB/gB,CAAE,EAAE;AAAA,EACzD;AAAA,EAEA,WAAWA,GAAI;AACb,WAAO+gB,GAAU,GAAG,KAAK,OAAO,iBAAiB/gB,CAAE,EAAE;AAAA,EACvD;AAAA,EAEA,YAAYnQ,GAAK;AACf,WAAOkxB,GAAU,GAAG,KAAK,OAAO,kBAAkBlxB,CAAG,EAAE;AAAA,EACzD;AAAA,EAEA,cAAcmuB,GAAO;AACZ,WAAA+C,GAAU,GAAG,KAAK,OAAO,mBAAmB,mBAAmB,KAAK,UAAU/C,CAAK,CAAC,CAAC,EAAE;AAAA,EAChG;AACF;AC1BA,MAAMiK,KAAgB,CAAC52B,MACjB,OAAOA,KAAU,YAAYA,MAAU,OAClCA,IAGL,MAAM,QAAQA,CAAK,IACdA,EAAM,IAAI42B,EAAa,IAGzB,OAAO,YAAY,OAAO,QAAQ52B,CAAK,EAAE,IAAI,CAAC,CAACtC,GAAGgd,CAAC,MACxD,CAAChd,EAAE,QAAQ,YAAY,CAAA+J,MAAK,IAAIA,EAAE,aAAa,EAAE,GAAGmvB,GAAclc,CAAC,CAAC,CACrE,CAAC,GCXEmc,KAAe,CAACC,MAChBA,MAAU,UAEHA,MAAU,UAAUC,OADtB,SAIA,SAILA,KAAoB,MACxB,OAAO,cAAc,OAAO,WAAW,8BAA8B,EAAE,SCNnEC,KAAkB,CAAOzE,MAAWlgB,GAAA;AACxC,QAAMye,IAAS,IAAI6F,GAAgBpE,EAAO,cAAcA,EAAO,SAAS;AACxE,MAAI,CAACA,EAAO,gBAAgB,CAACA,EAAO;AAAa;AAE3C,QAAA0E,IAAcC,GAAiB3E,CAAM;AACvC,MAAA0E,EAAY,WAAW;AAAK;AAEhC,QAAMh1B,IAAO,MAAMk1B,GAAUrG,GAAQmG,CAAW,EAAE,MAAM,MAAM;AAAA,EAAA,CAAE;AAC5D,MAAA,EAACh1B,KAAA,QAAAA,EAAM,UAAS;AAAE,IAAAm1B,GAAgB7E,CAAM;AAAG;AAAA,EAAQ;AAOvD,EAAA8E,GAAS9E,GAAQtwB,CAAI;AACvB,IAEMi1B,KAAmB,CAAC3E,MAAW;AACnC,QAAM0E,IAAc,CAAA;AAEpB,SAAI1E,EAAO,aAAc0E,EAAY,KAAK,EAAE,YAAY1E,EAAO,UAAW,CAAA,GACtEA,EAAO,cAAc0E,EAAY,KAAK,EAAE,aAAa1E,EAAO,WAAY,CAAA,GACxEA,EAAO,YAAc0E,EAAY,KAAK,EAAE,WAAW1E,EAAO,SAAU,CAAA,GACpEA,EAAO,aAAc0E,EAAY,KAAK,EAAE,YAAY1E,EAAO,UAAW,CAAA,GACtEA,EAAO,YAAc0E,EAAY,KAAK,GAAGL,GAAcrE,EAAO,QAAQ,CAAC,GAEpE,CAAC,GAAG,IAAI,IAAI0E,EAAY,IAAI,KAAK,SAAS,CAAC,CAAC,EAAE,IAAI,KAAK,KAAK;AACrE,GAEME,KAAY,CAACrG,GAAQmG,MAAgB;AACnC,QAAArG,IAAaqG,EAAY,CAAC;AAE5B,MAAAA,EAAY,SAAS;AAAY,WAAAnG,EAAO,cAAcmG,CAAW;AACrE,MAAIrG,EAAW;AAAsB,WAAAE,EAAO,YAAYF,EAAW,UAAU;AAC7E,MAAIA,EAAW;AAAsB,WAAAE,EAAO,aAAaF,EAAW,WAAW;AAC/E,MAAIA,EAAW;AAAsB,WAAAE,EAAO,WAAWF,EAAW,SAAS;AAC3E,MAAIA,EAAW;AAAsB,WAAAE,EAAO,YAAYF,EAAW,UAAU;AAC/E,GAEMwG,KAAkB,CAAC7E,MAAW;AAClC,EAAA+E,GAAe/E,CAAM,GACrBgF,GAAehF,CAAM,GACrBiF,GAAejF,CAAM,GAErBA,EAAO,QAAQ7jB,GAAS;AAAA,IACtB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,EACd,CAAA,CAAC;AACJ,GAEM2oB,KAAW,CAAC9E,GAAQtwB,MAAS;A5MzDnC,MAAAqQ;A4M0DE,QAAMwkB,IAAQD,GAAa50B,EAAK,SAAS,KAAK,GACxCw1B,IAASx1B,EAAK,SAAS,GAAG60B,CAAK,QAAQ;AAE7C,EAAAQ,GAAe/E,CAAM,GACrBgF,GAAehF,GAAQtwB,CAAI,GAC3Bu1B,GAAejF,GAAQtwB,CAAI,GAE3By1B,GAAInF,GAAQ,eAAetwB,EAAK,SAAS,YAAY,GACrDy1B,GAAInF,GAAQ,iBAAejgB,IAAArQ,EAAK,aAAL,gBAAAqQ,EAAe,UAASrQ,EAAK,SAAS,YAAY,GACzEy1B,GAAAnF,GAAQ,gBAAgBtwB,EAAK,SAAS,mBAAmB,2BAA2B,OAAOA,EAAK,SAAS,cAAc,GAC3Hy1B,GAAInF,GAAQ,mBAAmBtwB,EAAK,SAAS,iBAAiB,GAC1Dy1B,GAAAnF,GAAQ,mBAAmBtwB,EAAK,SAAS,0BAA0B,CAAC,KAAK,IAAI,CAAA,CAAE,GACnFy1B,GAAInF,GAAQ,gBAAgBoF,GAAkB11B,EAAK,QAAQ,CAAC,GAC5Dy1B,GAAInF,GAAQ,qBAAqBtwB,EAAK,SAAS,mBAAmB,GAClEy1B,GAAInF,GAAQ,eAAetwB,EAAK,SAAS,YAAY,GACrDy1B,GAAInF,GAAQ,kBAAkBtwB,EAAK,SAAS,eAAe,GACvDy1B,GAAAnF,GAAQ,aAAakF,EAAO,UAAU,GACtCC,GAAAnF,GAAQ,mBAAmBkF,EAAO,gBAAgB,GAClDC,GAAAnF,GAAQ,aAAakF,EAAO,UAAU,GACtCC,GAAAnF,GAAQ,kBAAkBkF,EAAO,eAAe,GACpDC,GAAInF,GAAQ,mBAAmBtwB,EAAK,SAAS,iBAAiB,GAC9Dy1B,GAAInF,GAAQ,qBAAqBtwB,EAAK,SAAS,2BAA2B,QAAQ,MAAM,GACxFy1B,GAAInF,GAAQ,qBAAqBtwB,EAAK,SAAS,2BAA2B,QAAQ,MAAM,GACxFy1B,GAAInF,GAAQ,0BAAyBtwB,EAAK,SAAS,0BAA2B,OAAe,GAC7Fy1B,GAAInF,GAAQ,oBAAoBmC,GAAiBzyB,EAAK,QAAQ,CAAC,GAC/Dy1B,GAAInF,GAAQ,sBAAsBtwB,EAAK,SAAS,oBAAoB,GACpEy1B,GAAInF,GAAQ,gBAAgBtwB,EAAK,SAAS,aAAa,GACvDy1B,GAAInF,GAAQ,gBAAgBtwB,EAAK,SAAS,aAAa,GACvDy1B,GAAInF,GAAQ,eAAetwB,EAAK,SAAS,YAAY;AAMvD,GAEMq1B,KAAiB,CAAC/E,MAAW;AAC7B,EAAAmF,GAAAnF,GAAQ,gBAAgB,CAAC,GACzBmF,GAAAnF,GAAQ,qBAAqB,EAAE,GAC/BmF,GAAAnF,GAAQ,eAAe,EAAE,GACzBmF,GAAAnF,GAAQ,mBAAmB,EAAE,GAC7BmF,GAAAnF,GAAQ,YAAY,CAAC,GACrBmF,GAAAnF,GAAQ,eAAe,CAAC,GACxBmF,GAAAnF,GAAQ,iBAAiB,SAAS,GAClCmF,GAAAnF,GAAQ,kBAAkB,MAAS,GACnCmF,GAAAnF,GAAQ,kBAAkB,MAAS;AACzC,GAEMgF,KAAiB,CAAChF,GAAQtwB,MAAS;A5M1GzC,MAAAqQ;A4M2GQ,QAAAslB,KAAetlB,IAAArQ,KAAA,gBAAAA,EAAM,aAAN,gBAAAqQ,EAAgB,eAC/BulB,KAAe51B,KAAA,gBAAAA,EAAM,YAAW;AAEtC,EAAAy1B,GAAInF,GAAQ,WAAWsF,EAAa,IAAI,CAACpT,MAAU;A5M9GrD,QAAAnS;A4M8GqD;AAAA,MACjD,IAAImS,EAAK;AAAA,MACT,OAAOA,EAAK;AAAA,MACZ,UAAUmT,QAAiBtlB,IAAArQ,EAAK,aAAL,gBAAAqQ,EAAe,cAAarQ,EAAK,SAAS,aAAawiB,EAAK;AAAA,MACvF,UAAUA,EAAK;AAAA,MACf,WAAWA,EAAK;AAAA,MAChB,YAAYA,EAAK;AAAA,MACjB,UAAUA,EAAK,MAAM,CAAC,IAAIA,EAAK,MAAM,CAAC,EAAE,WAAW,MAAO;AAAA,MAC1D,OAAOA,EAAK,MAAM,IAAI,CAAC5S,OAAW;AAAA,QAChC,IAAIA,EAAM;AAAA,QACV,KAAKA,EAAM;AAAA,QACX,aAAaA,EAAM;AAAA,QACnB,UAAUA,EAAM,WAAWA,EAAM,WAAW,MAAO;AAAA,MAAA,EACnD;AAAA,MACF,OAAO4S,EAAK,MAAM,IAAI,CAACxU,OAAW;AAAA,QAChC,IAAIA,EAAM;AAAA,QACV,KAAKA,EAAM;AAAA,QACX,aAAaA,EAAM;AAAA,QACnB,UAAUA,EAAM,WAAWA,EAAM,WAAW,MAAO;AAAA,MAAA,EACnD;AAAA,MACF,UAAUwU,EAAK,SAAS,IAAI,CAACqI,OAAa;AAAA,QACxC,QAAQA,EAAQ;AAAA,QAChB,SAASA,EAAQ;AAAA,QACjB,WAAWA,EAAQ,aAAaA,EAAQ,aAAa,MAAO;AAAA,QAC5D,UAAUA,EAAQ,WAAWA,EAAQ,WAAW,MAAO;AAAA,MAAA,EACvD;AAAA;GACF,CAAC;AACL,GAEM0K,KAAiB,CAACjF,GAAQtwB,MAAS;A5M3IzC,MAAAqQ;A4M4IQ,QAAAslB,KAAetlB,IAAArQ,KAAA,gBAAAA,EAAM,aAAN,gBAAAqQ,EAAgB,eAC/BwlB,KAAe71B,KAAA,gBAAAA,EAAM,QAAO;AAElC,EAAAy1B,GAAInF,GAAQ,WAAWuF,EAAa,IAAI,CAACrT,MAAS;AAC1C,UAAAsT,IAAStT,EAAK,SAAS,QAEvBqS,IAAQD,GAAapS,EAAK,KAAK,GAC/BgT,IAAShT,EAAK,GAAGqS,CAAK,QAAQ;AAE7B,WAAA;AAAA,MACL,IAAIrS,EAAK;AAAA,MACT,MAAMA,EAAK;AAAA,MACX,WAAWA,EAAK;AAAA,MAChB,SAASsT,IAAStT,EAAK,WAAW;AAAA,MAClC,iBAAkBsT,IAAkC,OAAzBtT,EAAK;AAAA,MAChC,UAAUmT,KAAgBnT,EAAK;AAAA,MAC/B,WAAWgT,KAAA,gBAAAA,EAAQ;AAAA,MACnB,iBAAiBA,KAAA,gBAAAA,EAAQ;AAAA,MACzB,WAAWA,KAAA,gBAAAA,EAAQ;AAAA,MACnB,OAAOM,IAAS,CAAM,KAAAtT,EAAK,SAASA,EAAK,OAAO,IAAI,CAAC5S,OAAW;AAAA,QAC9D,IAAIA,EAAM;AAAA,QACV,KAAKA,EAAM;AAAA,QACX,aAAaA,EAAM;AAAA,QACnB,UAAUA,EAAM,WAAWA,EAAM,WAAW,MAAO;AAAA,MAAA,EACnD;AAAA,MACF,OAAOkmB,IAAS,CAAA,KAAMtT,EAAK,SAAS,CAAC,GAAG,IAAI,CAACxU,OAAW;AAAA,QACtD,IAAIA,EAAM;AAAA,QACV,KAAKA,EAAM;AAAA,QACX,aAAaA,EAAM;AAAA,QACnB,UAAUA,EAAM,WAAWA,EAAM,WAAW,MAAO;AAAA,MAAA,EACnD;AAAA,IAAA;AAAA,EAEL,CAAA,CAAC;AACJ,GAEMynB,KAAM,CAACnF,GAAQyF,GAAUh4B,MAAU;AAEvC,EADmB,OAAOuyB,EAAO,aAAayF,CAAQ,KAAM,gBACzCzF,EAAOyF,CAAQ,IAAIh4B;AACxC,GAEM23B,KAAoB,CAAC,EAAE,qBAAAM,GAAqB,WAAAC,GAAW,WAAAC,QAAgB;AAC3E,MAAI,CAACF;AAAuB,WAAO;AACnC,QAAMtL,IAAQ,CAAA;AAEd,SAAIuL,KAAavL,EAAM,KAAK,EAAE,WAAW,YAAY,OAAO,CAAC,EAAE,KAAKuL,EAAA,CAAW,GAAG,OAAO,CAAA,EAAI,CAAA,GACzFC,KAAaxL,EAAM,KAAK,EAAE,WAAW,aAAa,OAAO,CAAC,EAAE,KAAKwL,EAAA,CAAW,GAAG,OAAO,CAAA,EAAI,CAAA,GAEvFxL;AACT,GAEM+H,KAAmB,CAAC,EAAE,mBAAA0D,GAAmB,wBAAAC,QACxCD,IACAC,IAEE,YAF+B,0BADA,QC/LlCC,KAAe,CAAO95B,GAAK+5B,MAAalmB,GAAA;AAEtC,QAAA8X,IAAO,OADI,MAAM,MAAM3rB,CAAG,GACJ,QACtBg6B,IAAO,IAAI,gBAAgBrO,CAAI,GAC/B1oB,IAAS,SAAS,cAAc,GAAG;AAEhC,WAAA,KAAK,OAAOA,CAAM,GAE3BA,EAAO,OAAO+2B,GACP/2B,EAAA,aAAa,YAAY82B,CAAQ,GACjC92B,EAAA,aAAa,UAAU,QAAQ,GACtCA,EAAO,MAAM,GACbA,EAAO,OAAO;AAChB,ICbMg3B,KAAiB,EAAE,UAAU,oBAAI,IAAO,GAAA,cAAkB,oBAAA,IAAA,KAE1DC,KAAuB,CAACC,MAAW;AACvC,EAAIA,EAAO,WACMF,GAAA,SAAS,IAAIE,EAAO,OAAO;AAG5C,aAAWC,KAAS,CAAC,GAAID,EAAO,SAAS,CAAK,GAAA,GAAIA,EAAO,SAAS,CAAA,CAAG;AACpD,IAAAF,GAAA,aAAa,IAAIG,EAAM,GAAG;AAE7C,GAEMC,KAA2B,CAACF,MAAW;AAC3C,MAAIA,EAAO,WACLF,GAAe,SAAS,IAAIE,EAAO,OAAO;AAAY,WAAA;AAG5D,aAAWC,KAAS,CAAC,GAAID,EAAO,SAAS,CAAK,GAAA,GAAIA,EAAO,SAAS,CAAA,CAAG;AACnE,QAAIF,GAAe,aAAa,IAAIG,EAAM,GAAG;AAAY,aAAA;AAGpD,SAAA;AACT,GClBME,yBAAwB,OAExBC,KAA0B,CAACJ,MAAW;AAE1C,EADc,CAAC,GAAIA,EAAO,SAAS,CAAC,GAAI,GAAIA,EAAO,SAAS,CAAA,CAAG,EACzD,QAAQ,CAAKtL,MAAAyL,GAAkB,IAAIzL,EAAE,GAAG,CAAC;AACjD,GAEM2L,KAA2B,CAACL,MAClB,CAAC,GAAIA,EAAO,SAAS,CAAC,GAAI,GAAIA,EAAO,SAAS,CAAA,CAAG,EAClD,KAAK,CAAAtL,MAAKyL,GAAkB,IAAIzL,EAAE,GAAG,CAAC,GCT/C4L,KAAe,CAAC,EAAE,mBAAApF,GAAmB,SAAAqC,GAAS,aAAApC,GAAa,SAAApX,IAAU,CAAA,GAAI,cAAAC,GAAc,aAAAvL,GAAa,YAAAmM,GAAY,UAAA2b,GAAU,SAAAC,EAAQ,IAAI,CAAA,MAAO;AhNJnJ,MAAA7mB;AgNKQ,QAAA8mB,IAAgBlD,KAAWA,EAAQpC,CAAW;AAEpD,EAAAx2B;AAAG,QAAI87B,GAAe;AACpB,UAAID,GAAS;AAAE,QAAAT,GAAqBU,CAAa;AAAS,cAAA97B;AAAA,MAAG;AAC7D,UAAI47B;AAAY,eAAAH,GAAwBK,CAAa,GAAU;AAC/D,UAAI,CAACF;AAAmB,eAAApF;AAAA,IAC1B;AAGA,MADI,GAACxhB,IAAAoK,EAAQC,CAAY,MAApB,QAAArK,EAAuB,eACxBuhB,MAAsB;AAAa,WAAA;AAEjC,QAAAwF,IAAaC,GAAsB,EAAE,SAAA5c,GAAS,cAAAC,GAAc,aAAAvL,GAAa,YAAAmM,GAAY,UAAA2b,GAAU;AAErG,MAAIK,IAAY,IACZC,IAAW,QACXC,IAAa;AAEjB,aAAW,CAACpe,GAAWsd,CAAM,KAAKzC,EAAQ,WAAW;AAGnD,QAFI8C,GAAyBL,CAAM,KAC/BE,GAAyBF,CAAM,KAC/B,CAACU,EAAW,IAAIV,EAAO,SAAS;AAAK;AAEzC,UAAMe,IAAWC,GAAWhB,EAAO,IAAI,KAAK;AAC5C,QAAIe,IAAWF;AAAY;AAErB,UAAAI,IAAa,KAAK;AACpB,IAAAF,MAAaF,KAAYI,IAAaH,MAE9BF,IAAAle,GACDme,IAAAE,GACED,IAAAG;AAAA,EACf;AAEO,SAAAL;AACT,GAEMI,KAAa,EAAE,MAAM,GAAG,QAAQ,EAAE,GAElCL,KAAwB,CAAC,EAAE,SAAA5c,GAAS,cAAAC,GAAc,aAAAvL,GAAa,YAAAmM,GAAY,UAAA2b,QAAe;AAC9F,QAAMW,IAAcld,MAAiB,GAC/Bmd,IAAand,MAAiBD,EAAQ,SAAS,GAE/CyL,IAAazL,EAAQ,SAAS,GAC9Bqd,IAAyB5R,KAAc5K,KAAc,CAACsc,GAEtD5e,IAAWyB,EAAQC,CAAY,EAAE,UACjCqd,IAAc/e,EAASA,EAAS,SAAS,CAAC,GAE1Cgf,IAAe9R,IAAa,OAAO+R,GAAoBjf,CAAQ,GAC/Dkf,IAAiBlf,EAASgf,CAAY,GAEtCG,IAAiBD,KAAkB/oB,IAAc+oB,EAAe,WAChEt1B,IAAWm1B,IAAcA,EAAY,YAAYA,EAAY,WAAW,GACxEK,IAAajpB,IAAcvM,IAAWy1B,IAEtCC,wBAAyB;AAE/B,SAAIhd,KAAiCgd,EAAmB,IAAI,UAAU,GAElEH,KAAkB,CAACC,KAAcE,EAAmB,IAAI,UAAU,GAClER,KAAiCQ,EAAmB,IAAI,UAAU,GAElErB,KAAYY,KAAqBS,EAAmB,IAAI,WAAW,GACnER,KAAiCQ,EAAmB,IAAI,WAAW,GAEhEA;AACT,GAGMC,KAAkC,IAAI,IAGtCF,KAAsC,IAGtCG,KAAiC,KAEjCP,KAAsB,CAACjf,MAAa;AACxC,QAAM+e,IAAc/e,EAASA,EAAS,SAAS,CAAC;AAChD,MAAI,CAAC+e;AAAe;AAEd,QAAAn1B,IAAWm1B,EAAY,YAAYA,EAAY;AACrD,MAAIn1B,IAAW21B;AAAmC;AAElD,QAAME,IAAc71B,IAAW,GACzB81B,IAAe3f,GAAiBC,GAAUpW,IAAW,CAAC,GAKtDo1B,IAHYhf,EAAS0f,CAAY,EAAE,aACVD,IAAcD,KAEZE,IAAeA,IAAe;AAC3D,MAAAV,MAAiBhf,EAAS;AAEvB,WAAAgf;AACT,GCjGMW,KAAyB,CAAC7G,GAAmBC,GAAiBF,GAAaoC,MAAY;AAC3F,MAAIqD,IAAY,IACZsB,IAAY,QACZC,IAAgB;AAET,aAAA,CAACzf,GAAWsd,CAAM,MAAMzC,KAAW,CAAA,GAAI,WAAW;AAGvD,QAFA,CAACnC,KACD8E,GAAyBF,CAAM,KAC/BA,EAAO,SAAS;AAAU;AAE9B,UAAMoC,IAAYC,GAAW3f,GAAW2Y,GAAiBF,CAAW;AACpE,QAAIiH,IAAYF;AAAa;AAE7B,UAAMI,IAAgBC,GAAgBvC,EAAO,SAAS,KAAK;AACvD,IAAAoC,MAAcF,KAAaI,IAAgBH,MAEnCvB,IAAAle,GACAwf,IAAAE,GACID,IAAAG;AAAA,EAClB;AAEO,SAAA1B;AACT,GAEM2B,KAAkB,EAAE,YAAY,GAAG,YAAY,EAAE,GAEjDF,KAAa,CAAC3f,GAAW2Y,GAAiBF,MAC1CzY,MAAcyY,IAAsB,IACpCzY,MAAc2Y,IAA0B,IAErC,GChCHmH,KAAsB,EAAE,cAAc,oBAAI,IAAM,EAAA,GAEhDC,KAA4B,CAACC,MAAe;AACrC,aAAAzC,KAAS,CAAC,GAAIyC,EAAW,SAAS,CAAA,GAAMA,EAAW,SAAS,CAAA,CAAG;AACpD,IAAAF,GAAA,aAAa,IAAIvC,EAAM,GAAG;AAElD,GAEMC,KAA2B,CAACwC,MAAe;AACpC,aAAAzC,KAAS,CAAC,GAAIyC,EAAW,SAAS,CAAA,GAAMA,EAAW,SAAS,CAAA,CAAG;AACxE,QAAIF,GAAoB,aAAa,IAAIvC,EAAM,GAAG;AAAY,aAAA;AAGzD,SAAA;AACT,GCXM0C,yBAA4B,OAE5BC,KAA8B,CAACF,MAAe;AAElD,EADc,CAAC,GAAIA,EAAW,SAAS,CAAC,GAAI,GAAIA,EAAW,SAAS,CAAA,CAAG,EACjE,QAAQ,CAAKhO,MAAAiO,GAAsB,IAAIjO,EAAE,GAAG,CAAC;AACrD,GAEMmO,KAA+B,CAACH,MACtB,CAAC,GAAIA,EAAW,SAAS,CAAC,GAAI,GAAIA,EAAW,SAAS,CAAA,CAAG,EAC1D,KAAK,CAAAhO,MAAKiO,GAAsB,IAAIjO,EAAE,GAAG,CAAC,GCTnDoO,KAAmB,CAAC,EAAE,cAAAxF,IAAe,CAAI,GAAA,mBAAApC,GAAmB,aAAAC,GAAa,SAAApX,GAAS,cAAAC,GAAc,aAAAvL,GAAa,YAAAmM,GAAY,UAAA2b,GAAU,SAAAC,QAAc;AAC/I,QAAAuC,IAAoBzF,EAAapC,CAAiB;AAExD,EAAAv2B;AAAG,QAAIo+B,GAAmB;AACxB,UAAIvC,GAAS;AAAE,QAAAiC,GAA0BM,CAAiB;AAAS,cAAAp+B;AAAA,MAAG;AACtE,UAAI47B;AAAY,eAAAqC,GAA4BG,CAAiB,GAAU;AACvE,UAAI,CAACxC;AAAmB,eAAArF;AAAA,IAC1B;AAEA,MAAIC,MAAgB;AAAa,WAAA;AAE3B,QAAAuF,IAAaC,GAAsB,EAAE,SAAA5c,GAAS,cAAAC,GAAc,aAAAvL,GAAa,YAAAmM,GAAY,UAAA2b,GAAU;AAErG,MAAIK,IAAY,IACZoC,IAAa,QACblC,IAAa;AAEjB,aAAW,CAACpe,GAAWggB,CAAU,KAAKpF,EAAa,WAAW;AAE5D,QADI4C,GAAyBwC,CAAU,KACnC,CAAChC,EAAW,IAAIgC,EAAW,SAAS;AAAK;AAE7C,UAAMO,IAAaJ,GAA6BH,CAAU,IAAI,IAAI;AAClE,QAAIO,IAAaD;AAAc;AAEzB,UAAA/B,IAAa,KAAK;AACpB,IAAAgC,MAAeD,KAAc/B,IAAaH,MAElCF,IAAAle,GACCsgB,IAAAC,GACAnC,IAAAG;AAAA,EACf;AAEO,SAAAL;AACT,GAEMD,KAAwB,CAAC,EAAE,SAAA5c,GAAS,cAAAC,GAAc,aAAAvL,GAAa,YAAAmM,GAAY,UAAA2b,QAAe;AACxF,QAAAqB,wBAAyB,OAEzBsB,IAAyBte,KAAcZ,MAAiB,KAAKvL,MAAgB,GAC7E0qB,IAAuB5C,KAAYvc,MAAiBD,EAAQ,SAAS;AAE3E,SAAImf,KAA0BtB,EAAmB,IAAI,UAAU,GAC3DuB,KAAwBvB,EAAmB,IAAI,WAAW,GAEvDA;AACT,GChDMwB,KAAqB,CAACC,MAAW;AACjC,MAAA,CAAC,UAAU;AAAgB;AAEzB,QAAAC,IAAgBD,EAAO,YAAY,KAAK,CAAK72B,MAAAA,EAAE,iBAAiB,UAAU;AAC5E,MAAA+2B,GAAA,KAAkC,CAACD;AAAiB;AAEpD,MAAA1C,GACA4C,IAAY,QACZC,IAAc;AAEP,aAAA7J,KAAUyJ,EAAO,aAAa;AACnC,QAAAzJ,EAAO,iBAAiB;AAAU;AAEtC,UAAM8J,IAAYC,GAAY/J,EAAO,aAAa,KAAK;AACvD,QAAI8J,IAAYF;AAAa;AAE7B,UAAMI,IAAcC,GAAcjK,EAAO,gBAAgB,KAAK;AAC1D,IAAA8J,MAAcF,KAAaI,IAAcH,MAEjC7C,IAAAhH,GACA4J,IAAAE,GACED,IAAAG;AAAA,EAChB;AAEW,aAAAhK,KAAUyJ,EAAO;AAC1B,IAAAzJ,EAAO,mBAAmBA,MAAWgH;AAGhC,SAAAA;AACT,GAEM+C,KAAc,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,KAChDE,KAAgB,EAAE,MAAM,GAAG,OAAO,EAAE,GAEpCN,KAA+B,MAAM;AACnC,QAAAO,IAAW,UAAU,aAAa;AACxC,MAAI,CAACA,KAAY,UAAU,aAAa;AAAsB,WAAA;AAE9D,QAAM,EAAE,OAAAxR,GAAO,QAAAG,GAAQ,OAAAC,GAAO,SAAAF,MAAYsR;AACnC,SAAAxR,KAASG,KAAUC,MAASF,KAAA,gBAAAA,EAAS;AAC9C,GCtCMuR,KAAe,CAACV,MAAW;AAC/B,MAAIW,IAAsB,IAEtBpD,GACA4C,IAAY,QACZS,IAAQ;AAED,aAAArK,KAAUyJ,EAAO,aAAa;AAKvC,QAJI,CAACzJ,EAAO,iBACRA,EAAO,gBAGP,CADe5M,GAAiB4M,EAAO,WAAW;AACnC;AAGnB,QADuBA,EAAO,cAAc,WACxB;AAAwB,MAAAoK,IAAA;AAAM;AAAA,IAAU;AAG5D,QAAI,EADkBpK,EAAO,cAAc,YAAY;AACjC;AAEtB,UAAM8J,IAAYC,GAAY/J,EAAO,aAAa,KAAK;AACvD,QAAI8J,IAAYF;AAAa;AAEvB,UAAAU,IAAQtK,EAAO,cAAc;AAC/B,IAAA8J,MAAcF,KAAaU,IAAQD,MAE3BrD,IAAAhH,GACA4J,IAAAE,GACJO,IAAAC;AAAA,EACV;AAEI,EAAAF,KAAuBR,MAAc,MAC3B5C,IAAA;AAGH,aAAAhH,KAAUyJ,EAAO;AAC1B,IAAAzJ,EAAO,mBAAmBA,MAAWgH;AAEzC,GAEM+C,KAAc,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,EAAE;AtN1CxD,IAAAQ,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC;AuNiBA,MAAMC,GAAe;AAAA,EACnB,YAAY7N,GAAQ8N,GAAa;AAkTjC;AAAA,IAAAnU,GAAA,MAAA4Q;AAWA,IAAA5Q,GAAA,MAAA8Q;AAOA,IAAA9Q,GAAA,MAAAgR;AAKA,IAAAhR,GAAA,MAAAkR;AAIA,IAAAlR,GAAA,MAAAoR;AAIA,IAAApR,GAAA,MAAAsR;AAIA,IAAAtR,GAAA,MAAAwR;AAIA,IAAAxR,GAAA,MAAA0R;AAIA,IAAA1R,GAAA,MAAA4R;AAIA,IAAA5R,GAAA,MAAA8R;AAIA,IAAA9R,GAAA,MAAAgS;AAQA,IAAAhS,GAAA,MAAAkS;AAMA,IAAAlS,GAAA,MAAAoS;AAOA,IAAApS,GAAA,MAAAsS;AAkBA,IAAAtS,GAAA,MAAAwS;AAgCA,IAAAxS,GAAA,MAAA0S;AA0BA,IAAA1S,GAAA,MAAA4S;AAUA,IAAA5S,GAAA,MAAA8S;AAUA,IAAA9S,GAAA,MAAAgT;AAgBA,IAAAhT,GAAA,MAAAkT;AAQA,IAAAlT,GAAA,MAAAoT;AAQA,IAAApT,GAAA,MAAAsT;AA2BA,IAAAtT,GAAA,MAAAwT;AAcA,IAAAxT,GAAA,MAAA0T;AAUA,IAAA1T,GAAA,MAAA4T;AAWA,IAAA5T,GAAA,MAAA8T;AAWA,IAAA9T,GAAA,MAAAgU;AAlkBE,SAAK,SAAS3N,GACd,KAAK,cAAc8N,GACnB,KAAK,iBAAiB,EAAE,SAAS,CAAG,EAAA;AAAA,EACtC;AAAA,EAEA,iBAAiBC,GAAW3/B,GAAU;AAEpC,IADkB2/B,MAAc,WAAW,KAAK,SAASA,CAAS,EAAE,KACvCj0B,GAAA,+CAA+Ci0B,CAAS,IAAI;AAEnF,UAAAC,IAAiB,mBAAmB3xB,GAAA,CAAY;AAEtD,gBAAK,eAAe0xB,CAAS,IAAI,KAAK,eAAeA,CAAS,KAAK,IACnE,KAAK,eAAeA,CAAS,EAAEC,CAAc,IAAI5/B,GAE1C4/B;AAAA,EACT;AAAA,EAEA,oBAAoBD,GAAWC,GAAgB;AAC7C,SAAK,eAAeD,CAAS,IAAI,KAAK,eAAeA,CAAS,KAAK,IACnE,OAAO,KAAK,eAAeA,CAAS,EAAEC,CAAc;AAAA,EACtD;AAAA,EAEM,aAAal+B,GAAO;AAAA,WAAAgQ,GAAA;AAClB,YAAAif,GAAU,MAAM,KAAK,MAAM,GACjCrjB,GAA8B5L,CAAK;AAEnC,YAAMC,IAAU,KAAK,SAASD,EAAM,IAAI,EAAE,GACpCm+B,IAAcjP,GAAc,KAAK,MAAM;AAEzC,MAAAhF,EAAA,MAAKuQ,IAAAC,IAAL,WAAwB16B,KAC1BA,EAAM,SAAS,0BACNkqB,EAAA,MAAKyQ,IAAAC,IAAL,WAA2B56B,KACpCA,EAAM,SAAS,6BACNC,KACH,MAAAA,EAAQ,KAAK,MAAMD,CAAK,GAI9BkqB,EAAA,MAAK6S,IAAAC,IAAL,YACA9S,EAAA,MAAK+S,IAAAC,IAAL,YAEAl9B,EAAM,SAAS,aAEfgK,GAAW,kCAAkChK,CAAK;AAG9C,YAAAo+B,IAAalP,GAAc,KAAK,MAAM;AAEtC,MAAAlvB,EAAA,eAAesvB,GAAW6O,GAAaC,CAAU,GACvDp+B,EAAM,eAAc,oBAAI,KAAK,GAAE,YAAY,GAE3C+L,GAA6B/L,CAAK,GAE7BkqB,EAAA,MAAA2Q,IAAAC,IAAA,WAAsB96B,EAAM,MAAMA,IAClCkqB,EAAA,MAAA2Q,IAAAC,IAAA,WAAsB,SAAS96B;AAAA,IACtC;AAAA;AAAA;AAAA,EAIA,2BAAqC;AAAE,IAAAkqB,EAAA,MAAKiS,IAAAC,IAAL,WAAe,CAAKn/B,MAAAA,IAAI,GAAG,EAAE,OAAO;EAAS;AAAA,EACpF,kCAAqC;AAAE,IAAAitB,EAAA,MAAKiS,IAAAC,IAAL,WAAe,CAAKn/B,MAAAA,IAAI,GAAG,EAAE,OAAO;EAAS;AAAA,EACpF,kCAAqC;AAAE,IAAAitB,EAAA,MAAKiS,IAAAC,IAAL,WAAe,CAAKn/B,MAAAA,IAAI,GAAG,EAAE,OAAO;EAAS;AAAA,EACpF,+BAAqC;AAAO,IAAAitB,EAAA,MAAAiS,IAAAC,IAAA,WAAU,CAAKn/B,MAAAA,IAAI;AAAA,EAAI;AAAA,EACnE,kCAAqC;AAAO,IAAAitB,EAAA,MAAAiS,IAAAC,IAAA,WAAU,CAAKn/B,MAAAA,IAAI;AAAA,EAAI;AAAA,EACnE,iCAAqC;AAAO,IAAAitB,EAAA,MAAAiS,IAAAC,IAAA,WAAU,CAAKn/B,MAAAA,IAAI;AAAA,EAAI;AAAA,EACnE,iCAAqC;AAAO,IAAAitB,EAAA,MAAAiS,IAAAC,IAAA,WAAU,CAAKn/B,MAAAA,IAAI;AAAA,EAAI;AAAA,EAEnE,2BAAqC;AAAO,IAAAitB,EAAA,MAAAmS,IAAAC,IAAA,WAAY,CAAKr/B,MAAAA,IAAI;AAAA,EAAI;AAAA,EACrE,2BAAqC;AAAO,IAAAitB,EAAA,MAAAmS,IAAAC,IAAA,WAAY,CAAKr/B,MAAAA,IAAI;AAAA,EAAI;AAAA,EAErE,sBAAsB,EAAE,SAAA6f,KAAa;AAAO,IAAAoN,EAAA,MAAAuS,IAAAC,IAAA,WAAS,CAAK35B,MAAAA,IAAI+Z;AAAA,EAAU;AAAA,EACxE,uBAAuB,EAAE,SAAAA,KAAY;AAAO,IAAAoN,EAAA,MAAAuS,IAAAC,IAAA,WAAS,CAAK35B,MAAAA,IAAI+Z;AAAA,EAAU;AAAA,EACxE,yBAAqC;AAAO,IAAAoN,EAAA,MAAAqS,IAAAC,IAAA,WAAU,CAAKv/B,MAAAA,IAAI;AAAA,EAAI;AAAA,EACnE,yBAAqC;AAAO,IAAAitB,EAAA,MAAAqS,IAAAC,IAAA,WAAU,CAAKv/B,MAAAA,IAAI;AAAA,EAAI;AAAA,EAEnE,0BAAqC;AAAA,EAAmB;AAAA,EACxD,4BAAqC;AAAA,EAAmB;AAAA,EACxD,2BAAqC;AAAA,EAAmB;AAAA,EACxD,2BAAqC;AAAA,EAAmB;AAAA,EACxD,2BAAqC;AAAA,EAAmB;AAAA,EACxD,yBAAqC;AAAA,EAAmB;AAAA,EAExD,wBAAqC;AAAA,EAAmB;AAAA,EACxD,kBAAkB,EAAE,aAAA4c,KAAiB;AAAE,SAAK,OAAO,cAAcA;AAAA,EAAa;AAAA,EAC9E,4BAAqC;AAAA,EAAmB;AAAA,EAExD,0BAAqC;AAAE,IAAAwgB,GAAa,KAAK,WAAW;AAAA,EAAG;AAAA,EAEvE,+BAAqC;AAAE,IAAAnQ,EAAA,MAAK2R,IAAAC,IAAL;AAAA,EAAqB;AAAA,EAC5D,kCAAqC;AAAE,IAAA5R,EAAA,MAAK2R,IAAAC,IAAL;AAAA,EAAqB;AAAA,EAC5D,kCAAqC;AAAE,IAAA5R,EAAA,MAAK2R,IAAAC,IAAL;AAAA,EAAqB;AAAA,EAC5D,qCAAqC;AAAE,IAAA5R,EAAA,MAAK2R,IAAAC,IAAL;AAAA,EAAqB;AAAA,EAC5D,qCAAqC;AAAE,IAAA5R,EAAA,MAAK2R,IAAAC,IAAL;AAAA,EAAqB;AAAA,EAE5D,iCAAqC;AAAO,IAAA5R,EAAA,MAAAuS,IAAAC,IAAA,WAAS,CAAK35B,MAAAA,IAAI;AAAA,EAAI;AAAA,EAClE,kCAAqC;AAAO,IAAAmnB,EAAA,MAAAuS,IAAAC,IAAA,WAAS,CAAK35B,MAAAA,IAAI;AAAA,EAAI;AAAA,EAClE,oCAAqC;AAAO,IAAAmnB,EAAA,MAAAuS,IAAAC,IAAA,WAAS,CAAK35B,MAAAA,IAAI;AAAA,EAAI;AAAA,EAClE,qCAAqC;AAAO,IAAAmnB,EAAA,MAAAuS,IAAAC,IAAA,WAAS,CAAK35B,MAAAA,IAAI;AAAA,EAAI;AAAA,EAElE,yBAAyB,EAAE,OAAAs7B,KAAS;AAC7B,SAAA,gBAAgB,KAAK,OAAO,eACjCnU,EAAA,MAAK6R,IAAAC,IAAL,YACA9R,EAAA,MAAKuS,IAAAC,IAAL,WAAc,CAACpkB,GAAG9V,MAAa67B,IAAQ77B,IACnC67B,MAAU,MAAK,KAAK,gBAAgB;AAAA,EAC1C;AAAA,EAEA,0BAA0B,EAAE,OAAAA,KAAS;AACnC,IAAAnU,EAAA,MAAKuS,IAAAC,IAAL,WAAc,CAACpkB,GAAG9V,MAAa67B,IAAQ77B,IACnC67B,MAAU,MAAK,KAAK,gBAAgB;AAAA,EAC1C;AAAA,EAEA,qCAAqC;AAC9B,SAAA,OAAO,gBAAgB,KAAK,eACjC,WAAW,MAAM,OAAO,KAAK,eAAe,GAAG;AAAA,EACjD;AAAA,EAEA,2BAA2B;AACzB,IAAA1J,GAAgB,KAAK,MAAM,EAAE,KAAK,MAAM;AACtC,MAAAzK,EAAA,MAAKyS,IAAAC,IAAL,WAA6B,EAAE,YAAY,GAAM,IACjD1S,EAAA,MAAK2S,IAAAC,IAAL,WAAyB,EAAE,YAAY,GAAM;AAAA,IAAA,CAC9C;AAAA,EACH;AAAA,EAEA,yBAAyB,EAAE,aAAA/f,KAAe;AAChC,YAAA,KAAK,uBAAuBA,CAAW,EAAE;AAAA,EACnD;AAAA,EAEA,kBAAkB,EAAE,aAAAgX,GAAa,eAAAuK,GAAe,iBAAAjK,KAAmB;AAC7D,IAAAN,MAAgB,oBAAoB,CAACM,IACvCnK,EAAA,MAAK+R,IAAAC,IAAL,WAAsBoC,KAEtB,KAAK,OAAO,gBAAgB;AAAA,EAEhC;AAAA,EAEA,qBAAqB;AACnB,SAAK,OAAO,gBAAgB;AAAA,EAC9B;AAAA,EAEA,wBAAwB;AAItB,IAHqB,KAAK,YAAY,YAAY,OAAO,CAAAx7B,MAAKA,MAAM,KAAK,MAAM,EAC3C,OAAO,CAAKA,MAAAA,EAAE,kBAAkB,SAAS,EAE9D,QAAQ,CAAAA,MAAKA,EAAE,gBAAgB,QAAQ,GACtD42B,GAAmB,KAAK,WAAW;AAAA,EACrC;AAAA,EAEA,uBAAuB;AACf,UAAAnd,IAAY,KAAK,OAAO,kBAAkB,WAC1Csa,IAAW,KAAK,OAAO,eAAe,KAAK,OAAO;AAIxD,IAAIta,KAAa,CAACsa,KAAY,CAAC,KAAK,kBAAiB,KAAK,OAAO,gBAAgB;AAAA,EACnF;AAAA,EAEA,2BAA2B;AACrB,IAAC,KAAK,iBAAiB3M,EAAA,MAAK2S,IAAAC,IAAL;AAErB,UAAA5hB,IAAa,KAAK,OAAO,eAAe,GACxC2b,IAAW,KAAK,OAAO,eAAe,KAAK,OAAO,UAClD0H,IAAc,KAAK,OAAO,aAAa,MAAM;AAEnD,IAAI,CAACrjB,KAAc,CAAC2b,KAAY,CAAC0H,MAAe,KAAK,OAAO,gBAAgB;AAAA,EAC9E;AAAA,EAEA,sBAAsB;AAChB,IAAArU,EAAA,MAAKuR,IAAAC,IAAL,eAA2B,KAAK,gBAAgB,KACpD,KAAK,gBAAgB;AAEf,UAAA8C,IAAWtU,EAAA,MAAKiR,IAAAC,IAAL,YACXqD,IAAYvU,EAAA,MAAKqR,IAAAC,IAAL;AAGlB,IADAtR,EAAA,MAAK2S,IAAAC,IAAL,WAAyB,EAAE,UAAU,IAAM,UAAA0B,EAAU,IACjD,CAAAC,MAEJvU,EAAA,MAAKyS,IAAAC,IAAL,WAA6B,EAAE,UAAU,GAAM,IAC3C,CAAA4B,MAEAtU,EAAA,MAAKmR,IAAAC,IAAL,cAAmBpR,EAAA,MAAKqR,IAAAC,IAAL,cAElBtR,EAAA,MAAAqS,IAAAC,IAAA,WAAU,CAAKv/B,MAAAA,IAAI;AAAA,EAC1B;AAAA,EAEA,yBAAyB,EAAE,aAAA8f,KAAe;AAChC,YAAA,KAAK,uBAAuBA,CAAW,EAAE;AAEjD,UAAM7B,IAAa,KAAK,OAAO,gBAAgB,KAAK,KAAK,OAAO,eAAe;AAC1E,SAAA,OAAO,gBAAgBA,IAAa,YAAY;AAAA,EACvD;AAAA,EAEA,sBAAsB,EAAE,WAAAwjB,GAAW,cAAAC,KAAgB;AACjD,YAAQ,KAAK,uBAAuBD,CAAS,oBAAoBC,CAAY,EAAE,GAE3EzU,EAAA,MAAKiR,IAAAC,IAAL,cAAmBlR,EAAA,MAAKmR,IAAAC,IAAL,aACrBpR,EAAA,MAAKyS,IAAAC,IAAL,WAA6B,EAAE,SAAS,GAAM,KACrC1S,EAAA,MAAKqR,IAAAC,IAAL,aACTtR,EAAA,MAAK2S,IAAAC,IAAL,WAAyB,EAAE,SAAS,GAAM,KAE1C,KAAK,oBAAoB;AAAA,EAE7B;AAAA,EAEA,wBAAwB;AACtB,IAAIpZ,OACaD,OAEGD,GAAA,KAAK,OAAO,MAAM;AAAA,EAExC;AAAA,EAEA,8BAA8B;AAC5B,UAAMsP,IAAepP,GAAA,MAAwB,KAAK,OAAO,QACnDkb,IAAc9L,IAAe,QAAQ;AAE3C,SAAK,OAAO,eAAeA,GAC3B,KAAK,OAAO,OAAO,UAAU8L,CAAW,EAAE,WAAW;AAAA,EACvD;AAAA,EAEA,0BAA0B,EAAE,OAAAl2B,KAAS;AAC9B,IAAAwhB,EAAA,MAAAqS,IAAAC,IAAA,WAAU,MAAM9zB,IACrB,KAAK,OAAO,gBAAgB;AAAA,EAC9B;AAAA,EAEA,8BAA8B;AAC5B,UAAMm2B,IAAQ,KAAK,OAAO,cAAc,MAAM,GAAG,GAE3C/Y,IAAa,KAAK,OAAO,QAAQ,SAAS,GAC1CgZ,IAAYD,EAAM,CAAC,MAAM,UAAUA,EAAM,CAAC,MAAM,UAAU/Y;AAE1D,IAAA+Y,EAAA,CAAC,IAAIC,IAAY,SAAS,QAChC,KAAK,OAAO,gBAAgBD,EAAM,KAAK,GAAG;AAAA,EAC5C;AAAA,EAEA,sBAAsB,EAAE,cAAAvkB,GAAc,YAAAykB,GAAY,YAAAC,KAAc;AvN7PlE,QAAA/uB,GAAAC;AuN8PI,UAAMkK,IAAc,KAAK,OAAO,QAAQE,CAAY,GAE9C2kB,KAAYhvB,IAAAmK,EAAY,UAAZ,gBAAAnK,EAAoB8uB,IAChCG,KAAYhvB,IAAAkK,EAAY,UAAZ,gBAAAlK,EAAoB8uB,IAEhCG,KAAYF,KAAaC,GAAW,KAEpCE,IAAYD,EAAS,MAAM,GAAG,EAAE,IAAI,GACpCjJ,IAAW,GAAG9b,EAAY,KAAK,IAAIglB,CAAS;AAE3C,WAAAnJ,GAAakJ,GAAUjJ,CAAQ;AAAA,EACxC;AAAA,EAEA,2BAA2B;AACzB,eAAWhG,KAAU,KAAK,YAAY,UAAA;AACpC,MAAAA,EAAO,gBAAgB,UACvBA,EAAO,cAAc;AAAA,EAEzB;AAAA,EAEA,2BAA2B,EAAE,WAAAgB,GAAW,UAAAmO,GAAU,UAAAjO,GAAU,WAAAC,GAAW,eAAAiO,KAAiB;AACtF,IAAIA,MAAkB,eAGlB,KAAK,OAAO,kBAAkB,aAC9B,KAAK,OAAO,iBAAiB,KAC7B,KAAK,OAAO,gBAAgB,KAI3BpV,EAAA,MAAKyT,IAAAC,IAAL,WAAyB,EAAE,WAAA1M,GAAW,UAAAmO,GAAU,UAAAjO,GAAU,WAAAC,EAAU,MAEzEsD,GAAgB,KAAK,MAAM,EAAE,KAAK,MAAM;AACtC,MAAAzK,EAAA,MAAKyS,IAAAC,IAAL,WAA6B,EAAE,YAAY,GAAM,IACjD1S,EAAA,MAAK2S,IAAAC,IAAL,WAAyB,EAAE,YAAY,GAAM;AAAA,IAAA,CAC9C;AAAA,EACH;AAAA,EAEA,4BAA4B,EAAE,SAAArS,GAAS,cAAAxP,GAAc,cAAAX,KAAgB;AvNpSvE,QAAArK;AuNqSQ,IAAAia,EAAA,MAAKyR,IAAAC,IAAL,aACF,KAAK,OAAO,iBAAiBnsB,GAAAhD,GAAA,IAAKge,IAAL,EAAc,cAAAxP,GAAc,cAAAX,OAC/C,KAAK,mBACVrK,IAAA,KAAA,OAAO,sBAAP,QAAAA,EAA0B,SAC/B,KAAK,OAAO,iBAAiB;AAAA,EAEjC;AAAA,EAEA,4BAA4B,EAAE,SAAAwa,GAAS,cAAAxP,GAAc,cAAAX,KAAgB;AACnE,IAAImQ,IACF,KAAK,OAAO,iBAAiBhb,GAAAhD,GAAA,IAAKge,IAAL,EAAc,cAAAxP,GAAc,cAAAX,OAEzD,KAAK,OAAO,iBAAiB;AAAA,EAEjC;AAAA,EAEA,qBAAqB,EAAE,SAAAmQ,GAAS,cAAAxP,GAAc,cAAAX,KAAgB;AAE5D,QAAI,CADYkQ,GAAe,WAAWC,GAAS,KAAK,OAAO,iBAAiB;AAChE;AAGhB,QAAI,CADeP,EAAA,MAAK2T,IAAAC,IAAL,WAA4B,EAAE,cAAAxjB,GAAc,cAAAW,QAC5C,CAACiP,EAAA,MAAKqR,IAAAC,IAAL,YAAkB;AAAE,MAAAtR,EAAA,MAAK2R,IAAAC,IAAL;AAAqB;AAAA,IAAQ;AAGrE,IADoBxhB,MAAiB,KAAK,OAAO,gBACzB4P,EAAA,MAAAqS,IAAAC,IAAA,WAAU,MAAMliB,IAExC4P,EAAA,MAAK+R,IAAAC,IAAL,WAAsBzvB,GAAA,EAAE,cAAAwO,GAAc,cAAAX,KAAiBmQ;AAAA,EACzD;AA2RF;AAvREgQ,KAAA,eAAAC,KAAA,SAAmB,EAAE,MAAA/4B,KAAQ;AAC3B,SAAOuoB,EAAA,MAAKqR,IAAAC,IAAL,eACL75B,EAAK,SAAS,aAAa,KAC3BA,EAAK,SAAS,aAAa,KAC3BA,EAAK,SAAS,aAAa,KAC3BA,EAAK,SAAS,UAAU,KACxBA,EAAK,SAAS,WAAW,KACzBA,EAAK,SAAS,UAAU,KAAK,CAACA,EAAK,SAAS,OAAO,KAAK,CAACA,EAAK,SAAS,OAAO;AAElF,GAEAg5B,KAAA,eAAAC,KAAA,SAAsB,EAAE,MAAAj5B,KAAQ;AACvB,SAAA,KAAK,kBACVA,EAAK,SAAS,oBAAoB,KAClCA,EAAK,SAAS,eAAe;AAEjC,GAEAk5B,KAAA,eAAAC,KAAA,SAAsBmD,GAAWj+B,GAAO;AACtC,QAAMu/B,IAAgB,KAAK,eAAetB,CAAS,KAAK,CAAA;AACxD,SAAO,OAAOsB,CAAa,EAAE,QAAQ,CAAKnkB,MAAAA,EAAEpb,CAAK,CAAC;AACpD,GAEA+6B,KAAA,eAAAC,KAAY,WAAA;AACV,SAAO,KAAK,OAAO,aAAa,KAAK,CAAKrzB,MAAAA,EAAE,cAAc,UAAU;AACtE,GAEAszB,KAAA,eAAAC,KAAY,WAAA;AACV,SAAO,KAAK,OAAO,aAAa,KAAK,CAAKvzB,MAAAA,EAAE,cAAc,WAAW;AACvE,GAEAwzB,KAAA,eAAAC,KAAS,SAAA1yB,IAAQ,KAAK,OAAO,mBAAmB;AvNnWlD,MAAAuH,GAAAC,GAAAC;AuNoWI,WAAOA,KAAAD,KAAAD,IAAA,KAAK,WAAL,gBAAAA,EAAa,iBAAb,gBAAAC,EAA4BxH,OAA5B,gBAAAyH,EAAoC,eAAc;AAC3D,GAEAkrB,KAAA,eAAAC,KAAS,SAAA5yB,IAAQ,KAAK,OAAO,mBAAmB;AvNvWlD,MAAAuH,GAAAC,GAAAC;AuNwWI,WAAOA,KAAAD,KAAAD,IAAA,KAAK,WAAL,gBAAAA,EAAa,iBAAb,gBAAAC,EAA4BxH,OAA5B,gBAAAyH,EAAoC,eAAc;AAC3D,GAEAorB,KAAA,eAAAC,KAAY,WAAA;AACH,SAAA,KAAK,OAAO,gBAAgB;AACrC,GAEAC,KAAA,eAAAC,KAAmB,WAAA;AvN/WrB,MAAAzrB;AuNgXI,WAAOA,IAAA,KAAK,OAAO,QAAQ,KAAK,OAAO,WAAW,MAA3C,gBAAAA,EAA8C,eAAc;AACrE,GAEA0rB,KAAA,eAAAC,KAAa,WAAA;AACJ,SAAA,CAAC1R,EAAA,MAAKiR,IAAAC,IAAL,cAAmB,CAAClR,EAAA,MAAKmR,IAAAC,IAAL,cAAmB,CAACpR,EAAA,MAAKqR,IAAAC,IAAL;AAClD,GAEAK,KAAA,eAAAC,KAAe,WAAA;AACT,EAAA,KAAK,OAAO,kBAAkB,YAChC,KAAK,OAAO,gBAAgB,WAE5B,KAAK,OAAO,gBAAgB;AAEhC,GAEAC,KAAA,eAAAC,KAAkB,WAAA;AACZ,EAAA,KAAK,OAAO,kBAAkB,cAChC,KAAK,OAAO,gBAAgB;AAEhC,GAEAC,KAAA,eAAAC,cAAiBjsB,GAA4C;AAA5C,MAAAC,IAAAD,GAAE,gBAAAgL,GAAc,cAAAX,EvNrYnC,IuNqYmBpK,GAAiCua,IAAA+U,GAAjCtvB,GAAiC,CAA/B,gBAAc;AAC/B,EAAAga,EAAA,MAAKuS,IAAAC,IAAL,WAAc,MAAMjS,EAAQ,WAAWnQ,IACvC,KAAK,OAAO,iBAAiB7N,GAAA,EAAE,cAAAwO,GAAc,cAAAX,KAAiBmQ,IAC9D,KAAK,OAAO,gBAAgB,WAC5B,KAAK,gBAAgB;AACvB,GAEA0R,KAAA,eAAAC,cAAUqD,GAAS,EAAE,OAAAC,EAAM,IAAI,CAAA,GAAI;AAC3B,QAAAC,IAAgB,KAAK,OAAO,eAC5BC,IAAWD,EAAc,SAAS,GAElCxP,IAAewP,EAAc,QAAQ,KAAK,OAAO,YAAY,GAC7DE,IAAWJ,EAAQtP,CAAY;AAEjC,MAAA2P;AAEJ,EAAIJ,IACFI,IAAeD,IAAWF,EAAc,SAExCG,IAAe,KAAK,IAAI,GAAG,KAAK,IAAIF,GAAUC,CAAQ,CAAC,GAGzD,KAAK,OAAO,eAAeF,EAAcG,CAAY,KAAK;AAC5D,GAEAzD,KAAA,eAAAC,cAAYmD,GAAS;AACnB,QAAM7mB,IAAW,KAAK,OAAO,QAAQ,KAAK,OAAO,YAAY,EAAE,UAEzDuX,IAAexX,GAAiBC,GAAU,KAAK,OAAO,WAAW,GACjEinB,IAAWJ,EAAQtP,CAAY;AAGrC,EAAIjG,EAAA,MAAKiR,IAAAC,IAAL,cAAmByE,KAAY,IACjC,KAAK,oBAAoB,IAIhB3V,EAAA,MAAKmR,IAAAC,IAAL,cAAmBuE,IAAW,KACvC3V,EAAA,MAAKiT,IAAAC,IAAL,WAAoB,KACflT,EAAA,MAAAuS,IAAAC,IAAA,WAAS,MAAM;AvN5a1B,QAAAzsB;AuN4a0B,aAAAA,IAAA2I,EAASA,EAAS,SAAS,CAAC,MAA5B,gBAAA3I,EAA+B,cAAa;AAAA,MAChE,KAAK,OAAO,gBAAgB,aAGnBia,EAAA,MAAKyR,IAAAC,IAAL,cAAqBiE,IAAW,KAAK3V,EAAA,MAAK6Q,IAAAC,IAAL,cACzC9Q,EAAA,MAAAuS,IAAAC,IAAA,WAAS,MAAM,IACpBxS,EAAA,MAAKyS,IAAAC,IAAL,WAA6B,EAAE,YAAY,GAAM,MAGxC1S,EAAA,MAAKyR,IAAAC,IAAL,cAAqBiE,MAAajnB,EAAS,UAAUsR,EAAA,MAAK+Q,IAAAC,IAAL,aAC9DhR,EAAA,MAAKuS,IAAAC,IAAL,WAAc,MAAM,KAAK,OAAO,WAAW,QAGlCxS,EAAA,MAAKyR,IAAAC,IAAL,cAAqBiE,KAAY,KAAKA,IAAWjnB,EAAS,UACnEsR,EAAA,MAAKuS,IAAAC,IAAL,WAAc,MAAM9jB,EAASinB,CAAQ,EAAE;AAE3C,GAEAtD,KAAA,eAAAC,cAAUiD,GAAS;AACjB,QAAMI,IAAWJ,EAAQ,KAAK,OAAO,YAAY,GAC3CM,IAAcF,IAAW,KAAKA,KAAY,KAAK,OAAO,QAAQ;AAEpE,EAAIE,KACF,KAAK,OAAO,gBAAgB,WACvB7V,EAAA,MAAAuS,IAAAC,IAAA,WAAS,MAAM,OAEpB,KAAK,OAAO,eAAemD,GAEtB3V,EAAA,MAAKqR,IAAAC,IAAL,eACEtR,EAAA,MAAAuS,IAAAC,IAAA,WAAS,MAAM,IACpB,KAAK,gBAAgB,MAIzBxS,EAAA,MAAKiT,IAAAC,IAAL,WAAoB,KACpBlT,EAAA,MAAKyS,IAAAC,IAAL,WAA6B,EAAE,YAAY,GAAM,IAI5CmD,KACH7V,EAAA,MAAK2S,IAAAC,IAAL,WAAyB,EAAE,YAAY,GAAM;AAEjD,GAEAL,KAAA,eAAAC,KAAA,SAASsD,GAAQ1lB,GAAc;AACzB,MAAA4P,EAAA,MAAKqR,IAAAC,IAAL;AACF,SAAK,WAAWwE,KAChB,KAAK,cAAc1lB;AAAA,OACd;AACC,UAAA9X,IAAW,KAAK,OAAO,YAAY;AACzC,SAAK,OAAO,cAAcw9B,EAAO,KAAK,OAAO,aAAax9B,CAAQ;AAAA,EACpE;AACF,GAEAm6B,KAAA,eAAAC,cAAwB,EAAE,YAAA1hB,GAAY,UAAA2b,GAAU,SAAAC,EAAQ,IAAI,CAAA,GAAI;AAC9D,QAAM,EAAE,SAAAzc,GAAS,cAAAuZ,GAAc,aAAA7kB,EAAA,IAAgB,KAAK,QAE9CyiB,IAAoB,OAAO,KAAK,kBAAmB,cAAc,KAAK,iBAAiB,KAAK,OAAO,mBACnGC,IAAc,OAAO,KAAK,cAAe,cAAc,KAAK,aAAa,KAAK,OAAO,aACrFnX,IAAe,OAAO,KAAK,eAAgB,cAAc,KAAK,cAAc,KAAK,OAAO;AAE9F,EAAA4P,EAAA,MAAKiT,IAAAC,IAAL,WAAoBhE,GAAiB,EAAE,cAAAxF,GAAc,mBAAApC,GAAmB,aAAAC,GAAa,SAAApX,GAAS,cAAAC,GAAc,aAAAvL,GAAa,YAAAmM,GAAY,UAAA2b,GAAU,SAAAC,EAAA,CAAS;AAC1J,GAEA+F,KAAA,eAAAC,KAAA,SAAoB,EAAE,YAAA5hB,GAAY,UAAA2b,GAAU,UAAA2H,GAAU,SAAA1H,EAAQ,IAAI,IAAI;AACpE,QAAM,EAAE,SAAAjD,GAAS,SAAAxZ,GAAS,aAAAtL,EAAA,IAAgB,KAAK;AAE3C,MAAAyiB,IAAoB,OAAO,KAAK,kBAAmB,cAAc,KAAK,iBAAiB,KAAK,OAAO;AACjG,QAAAC,IAAc,OAAO,KAAK,cAAe,cAAc,KAAK,aAAa,KAAK,OAAO,aACrFnX,IAAe,OAAO,KAAK,eAAgB,cAAc,KAAK,cAAc,KAAK,OAAO;AAE9F,EAAIkkB,MAAyBtjB,IAAA,IAAiB2b,IAAA,IAA2BrF,IAAA,KACzEtH,EAAA,MAAKmT,IAAAC,IAAL,WAAgB1G,GAAa,EAAE,mBAAApF,GAAmB,SAAAqC,GAAS,aAAApC,GAAa,SAAApX,GAAS,cAAAC,GAAc,aAAAvL,GAAa,YAAAmM,GAAY,UAAA2b,GAAU,SAAAC,EAAA,CAAS;AAErI,QAAApF,IAAoB,KAAK,OAAO,mBAChCC,IAAkB,KAAK,OAAO;AAEpC,OAAK,OAAO,kBAAkB4G,GAAuB7G,GAAmBC,GAAiBF,GAAaoC,CAAO;AAC/G,GAEAkJ,KAAA,eAAAC,KAA0B,WAAA;AACpB,EAAA,KAAK,OAAO,kBAAkB,aAC9B,OAAO,KAAK,kBAAmB,gBAE9B9S,EAAA,MAAAiT,IAAAC,IAAA,WAAe,KAAK,iBACzB,OAAO,KAAK;AACd,GAEAH,KAAA,eAAAC,KAAsB,WAAA;AAChB,EAAA,KAAK,OAAO,kBAAkB,aAC9B,OAAO,KAAK,cAAe,gBAE1BhT,EAAA,MAAAmT,IAAAC,IAAA,WAAW,KAAK,aACrB,OAAO,KAAK;AACd,GAEAH,KAAA,eAAAC,cAAe10B,GAAO;AAEpB,MADc,KAAK,OAAO,kBAAkB,aAAaA,MAAU,IACxD;AAAE,SAAK,iBAAiBA;AAAO;AAAA,EAAA;AAAiB,WAAO,KAAK;AAOvE,MAJqB,EADF,KAAK,OAAO,gBAAgB,KAAK,KAAK,OAAO,eAAe,MAC3CwhB,EAAA,MAAKiR,IAAAC,IAAL,WAAc1yB,IAIhC;AAChB,SAAK,OAAO,oBAAoB,IAChCwhB,EAAA,MAAK2S,IAAAC,IAAL,WAAyB,EAAE,YAAY,GAAM;AAC7C;AAAA,EACF;AAEM,QAAA0B,IAAWtU,EAAA,MAAKiR,IAAAC,IAAL,YACX6E,IAAW/V,EAAA,MAAKmR,IAAAC,IAAL;AAEjB,OAAK,OAAO,oBAAoB5yB;AAEhC,QAAMw3B,IAAgB1B,KAAY,CAACtU,EAAA,MAAKiR,IAAAC,IAAL,YAC7B+E,IAAgBF,KAAY,CAAC/V,EAAA,MAAKmR,IAAAC,IAAL;AAEnC,EAAI4E,MAAiB,KAAK,OAAO,cAAc,IAC3CC,KAAsBjW,EAAA,MAAAqS,IAAAC,IAAA,WAAU,MAAM;AAC5C,GAEAa,KAAA,eAAAC,cAAW50B,GAAO;AAEhB,MADc,KAAK,OAAO,kBAAkB,aAAaA,MAAU,IACxD;AAAE,SAAK,aAAaA;AAAO;AAAA,EAAA;AAAiB,WAAO,KAAK;AAE7D,QAAA+1B,IAAYvU,EAAA,MAAKqR,IAAAC,IAAL;AAClB,OAAK,OAAO,cAAc9yB;AAE1B,QAAM03B,IAAiB,CAAC3B,KAAavU,EAAA,MAAKqR,IAAAC,IAAL,YAC/B6E,IAAkB5B,KAAa,CAACvU,EAAA,MAAKqR,IAAAC,IAAL;AAEtC,EAAI4E,KAAoBlW,EAAA,MAAKqT,IAAAC,IAAL,YACpB6C,KAAoBnW,EAAA,MAAKuT,IAAAC,IAAL;AAC1B,GAEAH,KAAA,eAAAC,KAAuB,WAAA;AACjB,EAACtT,EAAA,MAAKiR,IAAAC,IAAL,eAAwB,KAAA,WAAW,KAAK,OAAO,cAE/C,KAAA,WAAW,KAAK,OAAO,cACvB,KAAA,cAAc,KAAK,OAAO,cAE/B,KAAK,OAAO,cAAc,GAC1B,KAAK,OAAO,eAAe;AAC7B,GAEAqC,KAAA,eAAAC,KAAsB,WAAA;AACf,OAAA,OAAO,eAAe,KAAK,YAAY,GAEvB,KAAK,OAAO,iBAAiB,KAAK,gBAC7B,KAAA,OAAO,cAAc,KAAK,WAEpD,OAAO,KAAK,UACZ,OAAO,KAAK,UACZ,OAAO,KAAK;AACd,GAEAC,KAAA,eAAAC,cAAoB,EAAE,WAAA1M,GAAW,UAAAmO,GAAU,UAAAjO,GAAU,WAAAC,KAAa;AvN1kBpE,MAAAphB,GAAAC,GAAAC,GAAAmwB;AuN2kBW,SAAA,KAAK,OAAO,cAAcpP,KAC/B,KAAK,OAAO,cAAcmO,KAC1B,KAAK,OAAO,aAAajO,KACzB,KAAK,OAAO,cAAcC,OAC1BphB,IAAA,KAAK,OAAO,aAAZ,gBAAAA,EAAsB,KAAK,CAAAtI,MAAKA,EAAE,cAAcupB,SAChDhhB,IAAA,KAAK,OAAO,aAAZ,gBAAAA,EAAsB,KAAK,CAAKvI,MAAAA,EAAE,cAAc03B,SAChDlvB,IAAA,KAAK,OAAO,aAAZ,gBAAAA,EAAsB,KAAK,OAAKxI,EAAE,aAAaypB,SAC/CkP,IAAA,KAAK,OAAO,aAAZ,gBAAAA,EAAsB,KAAK,CAAA34B,MAAKA,EAAE,cAAc0pB;AACpD,GAEAwM,KAAA,eAAAC,KAAuB,SAAA,EAAE,cAAAxjB,GAAc,cAAAW,KAAgB;AvNrlBzD,MAAAhL,GAAAC;AuNulBM,WAAAD,IAAA,KAAK,OAAO,mBAAZ,gBAAAA,EAA4B,kBAAiBqK,OAC7CpK,IAAA,KAAK,OAAO,mBAAZ,gBAAAA,EAA4B,kBAAiB+K;AAEjD;AC1lBF,IAAIslB,KAAmB;AAMvB,SAASC,GAAMC,GAAa;AAC1B,MAAIC,IAAQD,EAAY,MAAM;AAAA,CAAI;AAClC,SAAOC,EAAM,OAAO,SAAUC,GAAOC,GAAM;AACzC,QAAIC,IAAcC,GAAYF,CAAI,KAAKG,GAAWH,CAAI,KAAKI,GAAWJ,CAAI,KAAKK,GAAUL,CAAI,KAAKM,GAASN,CAAI;AAE/G,WAAIC,KACFF,EAAM,KAAKE,CAAW,GAGjBF;AAAA,EACR,GAAE,CAAE,CAAA;AACP;AACA,IAAIQ,KAAW,6IACXC,KAAe;AAEnB,SAASN,GAAYF,GAAM;AACzB,MAAI/B,IAAQsC,GAAS,KAAKP,CAAI;AAE9B,MAAI,CAAC/B;AACH,WAAO;AAGT,MAAIwC,IAAWxC,EAAM,CAAC,KAAKA,EAAM,CAAC,EAAE,QAAQ,QAAQ,MAAM,GAEtDyC,IAASzC,EAAM,CAAC,KAAKA,EAAM,CAAC,EAAE,QAAQ,MAAM,MAAM,GAElD0C,IAAWH,GAAa,KAAKvC,EAAM,CAAC,CAAC;AAEzC,SAAIyC,KAAUC,KAAY,SAExB1C,EAAM,CAAC,IAAI0C,EAAS,CAAC,GAErB1C,EAAM,CAAC,IAAI0C,EAAS,CAAC,GAErB1C,EAAM,CAAC,IAAI0C,EAAS,CAAC,IAGhB;AAAA,IACL,MAAOF,IAAsB,OAAXxC,EAAM,CAAC;AAAA,IACzB,YAAYA,EAAM,CAAC,KAAK0B;AAAA,IACxB,WAAWc,IAAW,CAACxC,EAAM,CAAC,CAAC,IAAI,CAAE;AAAA,IACrC,YAAYA,EAAM,CAAC,IAAI,CAACA,EAAM,CAAC,IAAI;AAAA,IACnC,QAAQA,EAAM,CAAC,IAAI,CAACA,EAAM,CAAC,IAAI;AAAA,EACnC;AACA;AAEA,IAAI2C,KAAU;AAEd,SAAST,GAAWH,GAAM;AACxB,MAAI/B,IAAQ2C,GAAQ,KAAKZ,CAAI;AAE7B,SAAK/B,IAIE;AAAA,IACL,MAAMA,EAAM,CAAC;AAAA,IACb,YAAYA,EAAM,CAAC,KAAK0B;AAAA,IACxB,WAAW,CAAE;AAAA,IACb,YAAY,CAAC1B,EAAM,CAAC;AAAA,IACpB,QAAQA,EAAM,CAAC,IAAI,CAACA,EAAM,CAAC,IAAI;AAAA,EACnC,IATW;AAUX;AAEA,IAAI4C,KAAU,mIACVC,KAAc;AAElB,SAASV,GAAWJ,GAAM;AACxB,MAAI/B,IAAQ4C,GAAQ,KAAKb,CAAI;AAE7B,MAAI,CAAC/B;AACH,WAAO;AAGT,MAAIyC,IAASzC,EAAM,CAAC,KAAKA,EAAM,CAAC,EAAE,QAAQ,SAAS,IAAI,IACnD0C,IAAWG,GAAY,KAAK7C,EAAM,CAAC,CAAC;AAExC,SAAIyC,KAAUC,KAAY,SAExB1C,EAAM,CAAC,IAAI0C,EAAS,CAAC,GACrB1C,EAAM,CAAC,IAAI0C,EAAS,CAAC,GACrB1C,EAAM,CAAC,IAAI,OAGN;AAAA,IACL,MAAMA,EAAM,CAAC;AAAA,IACb,YAAYA,EAAM,CAAC,KAAK0B;AAAA,IACxB,WAAW1B,EAAM,CAAC,IAAIA,EAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAE;AAAA,IAC9C,YAAYA,EAAM,CAAC,IAAI,CAACA,EAAM,CAAC,IAAI;AAAA,IACnC,QAAQA,EAAM,CAAC,IAAI,CAACA,EAAM,CAAC,IAAI;AAAA,EACnC;AACA;AAEA,IAAI8C,KAAmB;AAEvB,SAAST,GAASN,GAAM;AACtB,MAAI/B,IAAQ8C,GAAiB,KAAKf,CAAI;AAEtC,SAAK/B,IAIE;AAAA,IACL,MAAMA,EAAM,CAAC;AAAA,IACb,YAAYA,EAAM,CAAC,KAAK0B;AAAA,IACxB,WAAW,CAAE;AAAA,IACb,YAAY,CAAC1B,EAAM,CAAC;AAAA,IACpB,QAAQA,EAAM,CAAC,IAAI,CAACA,EAAM,CAAC,IAAI;AAAA,EACnC,IATW;AAUX;AAEA,IAAI+C,KAAS;AAEb,SAASX,GAAUL,GAAM;AACvB,MAAI/B,IAAQ+C,GAAO,KAAKhB,CAAI;AAE5B,SAAK/B,IAIE;AAAA,IACL,MAAMA,EAAM,CAAC;AAAA,IACb,YAAYA,EAAM,CAAC,KAAK0B;AAAA,IACxB,WAAW,CAAE;AAAA,IACb,YAAY,CAAC1B,EAAM,CAAC;AAAA,IACpB,QAAQA,EAAM,CAAC,IAAI,CAACA,EAAM,CAAC,IAAI;AAAA,EACnC,IATW;AAUX;ACnIA,IAAIgD,KAAS,IACTC,IAAaC;AAEjB,MAAMC,KAAkB,CAAC,EAAE,SAAAnyB,QAAc;AACnC,MAAA,CAACA,KAAWgyB;AAAU;AACjBA,EAAAA,KAAA;AAET,QAAMI,IAAeC,GAAe,IAAI,MAAO,CAAA,GACzCC,IAAgBF,KAAA,gBAAAA,EAAc,MAAM;AAE1C,EAAAH,KAAc,OAAO,SACrBC,KAAe,OAAO,sBAEtB,OAAO,UAAU,CAAC93B,GAASm4B,GAAeC,GAAYC,GAAclhC,MAAU;AzNfhF,QAAA6O;AyNgBI,UAAMsyB,IAAuBH,MAAkBH,GACzCO,KAAkBvyB,IAAA7O,KAAA,gBAAAA,EAAO,YAAP,gBAAA6O,EAAgB,MAAM;AAG9C,SADoBkyB,KAAiBI,KAAwBC,MACtC3yB,EAAQzO,CAAK;AAAY,aAAA;AAEhD,IAAA0gC,MAAeA,GAAY73B,GAASm4B,GAAeC,GAAYC,GAAclhC,CAAK;AAAA,EAAA,GAG7E,OAAA,uBAAuB,CAACpB,MAAU;AzNzB3C,QAAAiQ;AyN0BI,UAAM7O,IAAQpB,EAAM,QAEduiC,IAAuBL,GAAe9gC,CAAK,MAAM6gC,GACjDO,KAAkBvyB,IAAA7O,KAAA,gBAAAA,EAAO,YAAP,gBAAA6O,EAAgB,MAAM;AAG9C,SADoBkyB,KAAiBI,KAAwBC,MACtC3yB,EAAQzO,CAAK,GAAG;AAAE,MAAApB,EAAM,eAAe;AAAG;AAAA,IAAQ;AAEzE,IAAA+hC,MAAgBA,GAAa/hC,CAAK;AAAA,EAAA;AAEtC,GAEMkiC,KAAiB,CAAC9gC,MAAA;AzNtCxB,MAAA6O;AyNuCEwyB,UAAAA,IAAAA,IAAuBrhC,KAAA,gBAAAA,EAAO,UAAS,EAAE,EAAE,CAAC,MAA5CqhC,gBAAAA,EAA+C;AAAA,GCrC3CC,KAAqB,MAAM;AAC3B,EAAA,OAAO,UAAW,eAEX14B,GAAA;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AACH;ACPA,IAAI63B,KAAS;AAEb,MAAMc,KAAmB,MAAM;AAC7B,EAAId,OACKA,KAAA,IAET,iBAAiB,aAAa/iB,EAAe,GAC7C,iBAAiB,SAASQ,EAAa,GACvC,iBAAiB,aAAaN,EAAe;AAC/C,GAEMF,KAAkB,CAAC9e,MAAU;AACjC,EAAA4iC,KAAS5iC,EAAM,OACf6iC,KAAS7iC,EAAM;AACjB,GAEMsf,KAAgB,CAACtf,MAAU;A3NnBjC,MAAAiQ;A2NsBM,MAFAjQ,EAAM,oBACN8iC,GAAa9iC,CAAK,KAClBA,EAAM,WAAW;AAAK;AAE1B,QAAMyrB,KAASxb,IAAA8yB,GAAc/iC,EAAM,MAAM,MAA1B,gBAAAiQ,EAA6B,aAAa6a;AACzD,MAAKW;AAEL,eAAWyE,KAAU,YAAY,OAAO,UAAA,GAAa;AACnD,YAAM,EAAE,SAAAzF,GAAS,cAAAnQ,GAAc,cAAAW,EAAiB,IAAA+nB,GAAc9S,GAAQzE,CAAM;AAC5E,MAAKhB,KAILyF,EAAO,QAAQ7jB,GAAS;AAAA,QACtB,MAAM;AAAA,QACN,aAAa;AAAA,QACb,aAAa;AAAA,QACb,aAAa;AAAA,QACb,SAAAoe;AAAA,QACA,cAAAnQ;AAAA,QACA,cAAAW;AAAA,MACD,CAAA,CAAC;AAAA,IACJ;AACF,GAEM+D,KAAkB,CAAChf,MAAU;A3N7CnC,MAAAiQ;A2N8CE,QAAMvR,IAAS,SAAS,iBAAiBsB,EAAM,SAASA,EAAM,OAAO,GAC/DyrB,KAASxb,IAAA8yB,GAAcrkC,CAAM,MAApB,gBAAAuR,EAAuB,aAAa6a;AAIxC,aAAA,CAAC7tB,GAAGizB,CAAM,KAAK,YAAY,OAAO,YAAY,WAAW;AAClE,UAAM,EAAE,SAAAzF,GAAS,cAAAnQ,GAAc,cAAAW,EAAiB,IAAA+nB,GAAc9S,GAAQzE,CAAM;AAE5E,IAAIwX,GAAQhmC,GAAGqd,GAAcW,CAAY,KACvCiV,EAAO,QAAQ7jB,GAAS;AAAA,MACtB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,MACb,SAAAoe;AAAA,MACA,cAAAnQ;AAAA,MACA,cAAAW;AAAA,IACD,CAAA,CAAC;AAAA,EAEN;AACF,GAEM8nB,KAAgB,CAACrkC,MAAW;AACzB,SAAAA,KAAUA,EAAO,gBAAc;AAChC,QAAAA,EAAO,aAAaosB,EAAa;AAAY,aAAApsB;AAGjD,QADIA,EAAO,WAAWA,EAAO,eACzBA,EAAO,SAAS,YAAY,MAAM;AAAO;AAE7C,IAAAA,IAASA,EAAO;AAAA,EAClB;AACF,GAEMskC,KAAgB,CAAC9S,GAAQzE,MAAW;AACxC,MAAI,CAACA;AAAU,WAAO;AAEtB,MAAIyL,IAAY,CAAA,GACZgM,IAAc;AAEP,aAAA,CAACjmC,GAAGod,CAAO,MAAM6V,EAAO,WAAW,IAAI;AACrC,eAAA,CAACiT,GAAG1Y,CAAO,MAAMpQ,EAAQ,YAAY,IAAI,WAAW;AACzD,UAAAoR,MAAWhB,EAAQ;AAAU;AAIjC,YAAM2Y,IAAclT,EAAO,iBAAiBjzB,IAAI,IAAI;AACpD,MAAImmC,IAAcF,KAIdE,MAAgBF,MAAehM,KAAA,QAAAA,EAAW,aAE9CA,IAAY,EAAE,cAAcj6B,GAAG,cAAckmC,GAAG,SAAA1Y,KAClCyY,IAAAE;AAAA,IAChB;AAGK,SAAAlM;AACT;AAEA,IAAI0L,IAAQC;AAEZ,MAAMC,KAAe,CAAC9iC,MAAU;AACxB,QAAAqjC,IAASrjC,EAAM,QAAQ4iC,IACvBU,IAAStjC,EAAM,QAAQ6iC;AAG7B,SADc,KAAK,KAAKQ,IAASA,IAASC,IAASA,CAAM,IAC1C;AACjB,GAEMC,KAAkB,CAAA,GAElBN,KAAU,CAACO,GAAalpB,GAAcW,MAAiB;AAC3C,EAAAsoB,GAAAC,OAAAD,GAAAC,KAAiB;AAC3B,QAAAngC,IAAWkgC,GAAgBC,CAAW;AAE5C,SAAIngC,EAAS,iBAAiBiX,KAAgBjX,EAAS,iBAAiB4X,IAC/D,MAEP5X,EAAS,eAAeiX,GACxBjX,EAAS,eAAe4X,GACjB;AAEX;AC/HA,MAAMwoB,GAAgB;AAAA,EACpB,YAAYC,GAAe;AACzB,SAAK,gBAAgBA;AAAA,EACvB;AAAA,EAEA,sBAAsB9jC,GAAM;AACnB,WAAA+tB,GAAS,KAAK,eAAe/tB,CAAI;AAAA,EAC1C;AAAA,EAEA,sBAAsB+jC,GAAW/jC,GAAM;AAC9B,WAAA,KAAK,SAAS+jC,GAAWl0B,GAAAhD,GAAA,IAAK7M,IAAL,EAAW,SAAS,KAAK,cAAA,EAAe;AAAA,EAC1E;AACF;ACTA,MAAMgkC,KAAkB,CAAC1T,GAAQ2T,MAAgB;AAC/C,QAAM5F,IAAY6F,GAAmB5T,GAAQ2T,EAAY,IAAI;AAC7D,MAAI,CAAC5F;AAAa;AAEZ,QAAA8F,IAAiBC,GAAe9T,GAAQ+N,CAAS;AACvD,EAAAjyB,GAAuB+3B,CAAc,GAEjC7T,EAAO,gBAAgBA,EAAO,qBAAqB,UACtC,IAAIuT,GAAgBvT,EAAO,YAAY,EAC/C,sBAAsB6T,CAAc,GAGzC7T,EAAO,sBAAsBA,EAAO,qBAAqB,UAC5C,IAAIuT,GAAgBvT,EAAO,kBAAkB,EACrD,sBAAsB6T,CAAc,GAGzC7T,EAAO,gBACM,IAAIuT,GAAgBvT,EAAO,YAAY,EAC/C,sBAAsB+T,GAAYF,CAAc,GAAGA,CAAc;AAE5E,GAEMD,KAAqB,CAAC5T,GAAQgU,MAAoB;AAEtD,MAAIA,MAAoB,iBAAiB,CAAChU,EAAO;AAA0B,WAAA;AAKvE,MADAgU,MAAoB,qBAAqB5Q,GAAYpD,CAAM,MAAKA,EAAO,cAAc,KACrFgU,MAAoB,wBAAwBhU,EAAO;AAAe,WAAAA,EAAO,cAAc,IAAc;AAGzG,MAAIgU,MAAoB,wBAAwBC,GAAiBjU,CAAM;AAAY,WAAA;AAG/E,MAAAgU,EAAgB,WAAW,eAAe;AAAY,WAAA;AAC5D,GAEMF,KAAiB,CAAC9T,GAAQ4T,MAAuB;A7N5CvD,MAAA7zB,GAAAC;A6N6CE,EAAAggB,EAAO,oBAAPA,EAAO,kBAAoB3jB,OACpB2jB,EAAA,qBAAAA,EAAA,mBAAqB,KAAK;AAEjC,QAAMkU,IAAiB,CAAC,yBAAyB,MAAM,EAAE,SAASlU,EAAO,gBAAgB;AACzF,EAAKkU,KAAkB,aAAa,gBAAb,aAAa,cAAgB,KAAK,UAAU73B,GAAY,CAAA;AAE/E,QAAM4N,IAAe+V,EAAO,QAAQA,EAAO,WAAW,GAChD9V,IAAc8V,EAAO,QAAQA,EAAO,YAAY,GAChDmU,IAAanU,EAAO,WAAYA,EAAO,cAAcA,EAAO,WAAY,MAAM;AAE7E,SAAA;AAAA,IACL,YAAY4T;AAAAA,IACZ,aAAaQ,GAAW;AAAA,IACxB,YAAYnqB,IAAe,OAAO;AAAA,IAClC,YAAY+V,EAAO;AAAA,IACnB,YAAY9V,KAAA,gBAAAA,EAAa;AAAA,IACzB,WAAWA,KAAA,gBAAAA,EAAa;AAAA,IACxB,cAAc8V,EAAO;AAAA,IACrB,OAAO/V,KAAA,gBAAAA,EAAc;AAAA,IACrB,WAAUlK,IAAAigB,EAAO,gBAAP,gBAAAjgB,EAAoB;AAAA,IAC9B,eAAcC,IAAAggB,EAAO,gBAAP,gBAAAhgB,EAAoB;AAAA,IAClC,kBAAkBk0B,IAAiB,OAAO,KAAK,MAAM,aAAa,WAAW;AAAA,IAC7E,mBAAmBlU,EAAO;AAAA,IAC1B,oBAAoBA,EAAO;AAAA,IAC3B,UAAUA,EAAO;AAAA,IACjB,uBAAuBA,EAAO;AAAA,IAC9B,uBAAuB,KAAK,IAAI,GAAG,KAAK,IAAI,KAAKmU,CAAU,CAAC;AAAA,IAC5D,OAAOnU,EAAO;AAAA,IACd,UAAU,OAAO,SAAS;AAAA,IAC1B,UAAU,SAAS;AAAA,IACnB,gBAAgB;AAAA,IAChB,oBAAoBqU;AAAA,EAAA;AAExB,GAEMN,KAAc,CAAC,EAAE,YAAAO,GAAY,uBAAAC,QAA4B;AAC7D,QAAMJ,IAAa,KAAK,MAAMI,IAAwB,EAAE,IAAI;AAE5D,MAAID,MAAe;AAAiB,WAAA;AACpC,MAAIA,MAAe;AAAiB,WAAA;AAChC,MAAAA,MAAe,mBAAmBH,MAAe;AAAc,WAAA;AACnE,MAAIG,MAAe;AAAmB,WAAO,GAAGH,CAAU;AAC1D,MAAIG,MAAe;AAA0B,WAAA;AAC/C,GAEMlR,KAAc,CAACpD,MAAW;A7N1FhC,MAAAjgB,GAAAC;A6N2FE,MAAI+yB,IAAU;AAMd,MAFiB/S,EAAO,gBAAgB,IAE1B;AACZ,UAAMwU,MAAWz0B,IAAAigB,EAAO,QAAQA,EAAO,WAAW,MAAjC,gBAAAjgB,EAAoC,OAAMigB,EAAO;AAClE,IAAA+S,IAAUyB,MAAaxU,EAAO,cAC9BA,EAAO,eAAewU;AAAA,EAAA,OACjB;AACL,UAAMxT,MAAYhhB,IAAAggB,EAAO,QAAQA,EAAO,YAAY,MAAlC,gBAAAhgB,EAAqC,OAAMggB,EAAO;AACpE,IAAA+S,IAAU/R,MAAchB,EAAO,eAC/BA,EAAO,gBAAgBgB;AAAA,EACzB;AAEO,SAAA+R;AACT,GAEMkB,KAAmB,CAACjU,MAAW;AAG/B,MAAAA,EAAO,sBAAsB;AAAM;AAEjC,QAAAyU,IAAiBzU,EAAO,iBAAiB,IACzC0U,IAAqB1U,EAAO,cAAcA,EAAO,WAAY;AAEnE,MAAI0U,KAAqBD;AACvB,WAAAzU,EAAO,iBAAiB,KAAK,MAAM0U,IAAoB,EAAE,IAAI,IACtD;AAEX,GAEMN,KAAa,MACbO,GAAe,GAAG,IAAY,UAC9BA,GAAe,GAAG,IAAY,WAE3B,WAGHA,KAAiB,CAACC,MACtB,OAAO,cAAc,OAAO,WAAW,sCAAsCA,CAAM,KAAK,EAAE,SCjItFC,KAAc,CAAC7O,MAAa;A9NHlC,MAAAjmB;A8NIQ,QAAA7O,IAAQ,IAAI,SACZjF,KAAMsmC,IAAAA,GAAuBrhC,EAAM,SAAS,EAAE,EAAE,CAAC,MAA3CqhC,gBAAAA,EAA8C;AAE1D,MAAI,CAACtmC;AAAO,mBAAQ,KAAK,iDAAiD,GAAU;AACpF,MAAI,CAAC+5B;AAAmB,WAAA/5B;AAExB,QAAM6oC,IAAY7oC,EAAI,WAAW,iBAAiB,UAAUooC,EAAO,EAAE;AAG9DQ,SAFaE,GAAgBD,GAAW9O,CAAQ;AAGzD,GAEM+O,KAAkB,CAAC9oC,GAAK+5B,MAAa;AACnC,QAAA2I,IAAQ1iC,EAAI,MAAM,GAAG;AACrB,SAAA0iC,EAAAA,EAAM,SAAS,CAAC,IAAI3I,GACnB2I,EAAM,KAAK,GAAG;AACvB;A9NpBA,IAAAqG;A+NWA,MAAMC,KAAN,MAAMA,WAAeC,GAAgB;AAAA,EAGnC,YAAYn1B,GAAsB;AAAtB,QAAAC,IAAAD,GAAE,UAAAvR,E/NdhB,I+NccwR,GAAa5G,IAAAk2B,GAAbtvB,GAAa,CAAX;AACO,IAAAwyB,MACnBV,GAAgB14B,CAAK,GACJq5B;AAEjB,UAAM,EAAE,WAAA0C,GAAW,mBAAA/T,EAAkB,IAAIZ,GAAchyB,CAAM;AACnD,IAAA2mC,EAAA,UAAU,IAAI,sBAAsB,KAAK;AAEnD,UAAMpV,IAAa,IAAI8N,GAAe,MAAMoH,EAAM;AAClD,IAAAlV,EAAW,iBAAiB,SAAS,CAAAluB,MAAK6hC,GAAgB,MAAM7hC,CAAC,CAAC;AAElE,UAAMujC,IAAe74B,GAAA,EAAE,mBAAA6kB,KAAsBhoB;AACvC,UAAA,EAAE,QAAQ+7B,GAAW,OAAO51B,GAAAhD,GAAA,EAAE,YAAAwjB,KAAeqV,IAAjB,EAA+B,cAAAA,EAAa,GAAA,CAAG,GAEjFrV,EAAW,SAAS,MACbzE,GAAA2Z,IAAAD,IAAW,KAAK,IAAI;AAAA,EAC7B;AAAA,EAEA,WAAW,UAAU;AACZ,WAAAX;AAAA,EACT;AAAA,EAEA,WAAW,YAAY;AACrB,WAAOQ,GAAY;AAAA,EACrB;AAAA,EAEA,WAAW,WAAW;AACpB,WAAOA,GAAY,UAAU;AAAA,EAC/B;AAAA,EAEA,WAAW,SAAS;AAClB,WAAOA,GAAY,kBAAkB;AAAA,EACvC;AAAA,EAEA,OAAO,YAAY;AACV,WAAA,CAAC,GAAGvZ,GAAA2Z,IAAOD,GAAU;AAAA,EAC9B;AAAA,EAEA,OAAO,aAAa;AAClB,IAAA1Z,GAAA2Z,IAAOD,IAAW,QAAQ,CAAKpiC,MAAAA,EAAE,SAAS;AAAA,EAC5C;AAAA,EAEA,UAAU;AACR,SAAK,SAAS,GACdyiC,GAAAJ,IAAOD,IAAa1Z,GAAA2Z,IAAOD,IAAW,OAAO,CAAApiC,MAAKA,MAAM,IAAI;AAAA,EAC9D;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,GAAG;AAAA,EACjB;AAAA,EAEA,IAAI,OAAOpE,GAAQ;AACN,IAAAsL,GAAA;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EACH;AACF;AA9DSk7B,KAAA,eAAPrb,GADIsb,IACGD,IAAa,CAAA;AADtB,IAAMvL,KAANwL;A/NXA,IAAAl1B;A+N4EI,OAAO,UAAW,gBACpB,OAAO,gBAAP,OAAO,cAAgB,MACvBA,KAAA,OAAO,aAAY,WAAnBA,GAAmB,SAAW0pB;AAGhC,MAAejxB,KAAA,EAAE,QAAAixB,GAAO;","x_google_ignoreList":[0,2,3,4,5,6,7,131,132,216]}
1
+ {"version":3,"file":"es.js","sources":["../node_modules/svelte/internal/index.mjs","../src/helpers/throwError.ts","../node_modules/uuid/dist/esm-browser/rng.js","../node_modules/uuid/dist/esm-browser/regex.js","../node_modules/uuid/dist/esm-browser/validate.js","../node_modules/uuid/dist/esm-browser/stringify.js","../node_modules/uuid/dist/esm-browser/native.js","../node_modules/uuid/dist/esm-browser/v4.js","../src/helpers/eventValidation.ts","../src/helpers/newEvent.ts","../src/helpers/withQueryParams.ts","../src/helpers/googleAdTagParams.ts","../src/helpers/elementIsVisible.ts","../src/components/VastContainer.svelte","../src/helpers/orderedMediaSources.ts","../src/helpers/loadMedia.ts","../src/translations/af.ts","../src/translations/ak.ts","../src/translations/am.ts","../src/translations/ar.ts","../src/translations/as.ts","../src/translations/az.ts","../src/translations/be.ts","../src/translations/bg.ts","../src/translations/bm.ts","../src/translations/bn.ts","../src/translations/bs.ts","../src/translations/ca.ts","../src/translations/ckb.ts","../src/translations/cs.ts","../src/translations/cy.ts","../src/translations/da.ts","../src/translations/de.ts","../src/translations/ee.ts","../src/translations/el.ts","../src/translations/en.ts","../src/translations/eo.ts","../src/translations/es.ts","../src/translations/et.ts","../src/translations/eu.ts","../src/translations/fa.ts","../src/translations/fi.ts","../src/translations/fil.ts","../src/translations/fr.ts","../src/translations/ga.ts","../src/translations/gd.ts","../src/translations/gl.ts","../src/translations/gu.ts","../src/translations/ha.ts","../src/translations/haw.ts","../src/translations/he.ts","../src/translations/hi.ts","../src/translations/hr.ts","../src/translations/hu.ts","../src/translations/hy.ts","../src/translations/id.ts","../src/translations/ig.ts","../src/translations/is.ts","../src/translations/it.ts","../src/translations/iw.ts","../src/translations/ja.ts","../src/translations/ka.ts","../src/translations/kk.ts","../src/translations/km.ts","../src/translations/kn.ts","../src/translations/ko.ts","../src/translations/ky.ts","../src/translations/lb.ts","../src/translations/lg.ts","../src/translations/ln.ts","../src/translations/lo.ts","../src/translations/lt.ts","../src/translations/lv.ts","../src/translations/mg.ts","../src/translations/mk.ts","../src/translations/ml.ts","../src/translations/mn.ts","../src/translations/mr.ts","../src/translations/ms.ts","../src/translations/mt.ts","../src/translations/my.ts","../src/translations/nb.ts","../src/translations/ne.ts","../src/translations/nl.ts","../src/translations/nn.ts","../src/translations/no.ts","../src/translations/om.ts","../src/translations/or.ts","../src/translations/pa.ts","../src/translations/pl.ts","../src/translations/ps.ts","../src/translations/pt.ts","../src/translations/qu.ts","../src/translations/ro.ts","../src/translations/ru.ts","../src/translations/rw.ts","../src/translations/si.ts","../src/translations/sk.ts","../src/translations/sl.ts","../src/translations/sn.ts","../src/translations/so.ts","../src/translations/sq.ts","../src/translations/sr.ts","../src/translations/sv.ts","../src/translations/sw.ts","../src/translations/ta.ts","../src/translations/te.ts","../src/translations/tg.ts","../src/translations/th.ts","../src/translations/ti.ts","../src/translations/tr.ts","../src/translations/tt.ts","../src/translations/ug.ts","../src/translations/uk.ts","../src/translations/ur.ts","../src/translations/uz.ts","../src/translations/vi.ts","../src/translations/yi.ts","../src/translations/yo.ts","../src/translations/zh-HK.ts","../src/translations/zh-MO.ts","../src/translations/zh-TW.ts","../src/translations/zh.ts","../src/translations/zu.ts","../src/helpers/basename.ts","../src/helpers/validateTranslations.ts","../src/helpers/translate.ts","../src/helpers/blurElement.ts","../src/helpers/findSegmentIndex.ts","../src/helpers/findLoadedMedia.ts","../src/components/MediaElement.svelte","../node_modules/svelte/easing/index.mjs","../node_modules/svelte/transition/index.mjs","../src/components/svg_icons/Play.svelte","../src/components/svg_icons/Pause.svelte","../src/components/buttons/PlayPauseButton.svelte","../src/components/buttons/PlaybackRateButton.svelte","../src/components/svg_icons/SeekBack.svelte","../src/components/svg_icons/PrevSegment.svelte","../src/components/svg_icons/PrevTrack.svelte","../src/components/buttons/PrevButton.svelte","../src/components/svg_icons/SeekAhead.svelte","../src/components/svg_icons/NextSegment.svelte","../src/components/svg_icons/NextTrack.svelte","../src/components/buttons/NextButton.svelte","../src/components/svg_icons/ShowPlaylist.svelte","../src/components/svg_icons/HidePlaylist.svelte","../src/components/buttons/PlaylistButton.svelte","../src/components/svg_icons/Maximize.svelte","../src/components/buttons/MaximizeButton.svelte","../src/components/svg_icons/Close.svelte","../src/components/buttons/CloseWidgetButton.svelte","../src/components/external_links/AdvertLink.svelte","../src/components/svg_icons/OpenNewTab.svelte","../src/components/external_links/AdvertButton.svelte","../src/components/svg_icons/Logo.svelte","../src/components/external_links/BeyondWords.svelte","../src/components/external_links/SourceUrlButton.svelte","../src/components/LargeImage.svelte","../src/components/titles/PlayerTitle.svelte","../src/components/titles/ContentTitle.svelte","../src/components/progress_bars/handleKeyDown.ts","../src/components/progress_bars/ProgressBar.svelte","../src/components/progress_bars/ProgressCircle.svelte","../src/helpers/formatTime.ts","../src/components/time_indicators/CountdownTime.svelte","../src/components/time_indicators/DurationInMins.svelte","../src/components/time_indicators/PlaybackTime.svelte","../src/components/time_indicators/TimeIndicator.svelte","../src/components/svg_icons/VolumeUp.svelte","../src/components/svg_icons/Download.svelte","../src/components/buttons/DownloadButton.svelte","../src/components/Playlist.svelte","../src/components/helpers/Hoverable.svelte","../src/components/helpers/Visibility.svelte","../src/helpers/belowBreakpoint.ts","../src/helpers/controlsOrder.ts","../src/helpers/playerStyles.ts","../src/helpers/fullScreen.ts","../src/components/UserInterface.svelte","../src/components/ExternalWidget.svelte","../src/components/ControlPanel.svelte","../src/helpers/blobForImageUrl.ts","../src/helpers/blobForSvgNode.ts","../src/components/MediaSession.svelte","../src/components/GoogleAnalytics.svelte","../src/helpers/ownershipMediator.ts","../src/helpers/sectionEnabled.ts","../src/helpers/segmentHighlights.ts","../src/helpers/segmentClickables.ts","../src/helpers/segmentContainers.ts","../src/helpers/identifiersEvent.ts","../src/helpers/fetchJson.ts","../src/api_clients/webSocketClient.ts","../src/helpers/onStatusChange.ts","../src/helpers/waitUntil.ts","../src/helpers/settableProps.ts","../src/helpers/diffObject.ts","../src/helpers/applyTransitions.ts","../src/helpers/resolveTarget.ts","../src/components/Player.svelte","../src/api_clients/playerApiClient.ts","../src/helpers/snakeCaseKeys.ts","../src/helpers/resolveTheme.ts","../src/helpers/setPropsFromApi.ts","../src/helpers/downloadFile.ts","../src/helpers/erroredAdverts.ts","../src/helpers/playedAdvertMedia.ts","../src/helpers/chooseAdvert.ts","../src/helpers/choosePersistentAdvert.ts","../src/helpers/erroredIntrosOutros.ts","../src/helpers/playedIntroOutroMedia.ts","../src/helpers/chooseIntroOutro.ts","../src/helpers/chooseMediaSession.ts","../src/helpers/chooseWidget.ts","../src/controllers/rootController.ts","../node_modules/stacktrace-parser/dist/stack-trace-parser.esm.js","../src/helpers/setErrorHandler.ts","../src/helpers/validateWebContext.ts","../src/helpers/listenToSegments.ts","../src/api_clients/analyticsClient.ts","../src/helpers/sendToAnalytics.ts","../src/helpers/relativeUrl.ts","../src/index.ts"],"sourcesContent":["function noop() { }\nconst identity = x => x;\nfunction assign(tar, src) {\n // @ts-ignore\n for (const k in src)\n tar[k] = src[k];\n return tar;\n}\n// Adapted from https://github.com/then/is-promise/blob/master/index.js\n// Distributed under MIT License https://github.com/then/is-promise/blob/master/LICENSE\nfunction is_promise(value) {\n return !!value && (typeof value === 'object' || typeof value === 'function') && typeof value.then === 'function';\n}\nfunction add_location(element, file, line, column, char) {\n element.__svelte_meta = {\n loc: { file, line, column, char }\n };\n}\nfunction run(fn) {\n return fn();\n}\nfunction blank_object() {\n return Object.create(null);\n}\nfunction run_all(fns) {\n fns.forEach(run);\n}\nfunction is_function(thing) {\n return typeof thing === 'function';\n}\nfunction safe_not_equal(a, b) {\n return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');\n}\nlet src_url_equal_anchor;\nfunction src_url_equal(element_src, url) {\n if (!src_url_equal_anchor) {\n src_url_equal_anchor = document.createElement('a');\n }\n src_url_equal_anchor.href = url;\n return element_src === src_url_equal_anchor.href;\n}\nfunction not_equal(a, b) {\n return a != a ? b == b : a !== b;\n}\nfunction is_empty(obj) {\n return Object.keys(obj).length === 0;\n}\nfunction validate_store(store, name) {\n if (store != null && typeof store.subscribe !== 'function') {\n throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n }\n}\nfunction subscribe(store, ...callbacks) {\n if (store == null) {\n return noop;\n }\n const unsub = store.subscribe(...callbacks);\n return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n let value;\n subscribe(store, _ => value = _)();\n return value;\n}\nfunction component_subscribe(component, store, callback) {\n component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n if (definition) {\n const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n return definition[0](slot_ctx);\n }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n return definition[1] && fn\n ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n if (definition[2] && fn) {\n const lets = definition[2](fn(dirty));\n if ($$scope.dirty === undefined) {\n return lets;\n }\n if (typeof lets === 'object') {\n const merged = [];\n const len = Math.max($$scope.dirty.length, lets.length);\n for (let i = 0; i < len; i += 1) {\n merged[i] = $$scope.dirty[i] | lets[i];\n }\n return merged;\n }\n return $$scope.dirty | lets;\n }\n return $$scope.dirty;\n}\nfunction update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) {\n if (slot_changes) {\n const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n slot.p(slot_context, slot_changes);\n }\n}\nfunction update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) {\n const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn);\n}\nfunction get_all_dirty_from_scope($$scope) {\n if ($$scope.ctx.length > 32) {\n const dirty = [];\n const length = $$scope.ctx.length / 32;\n for (let i = 0; i < length; i++) {\n dirty[i] = -1;\n }\n return dirty;\n }\n return -1;\n}\nfunction exclude_internal_props(props) {\n const result = {};\n for (const k in props)\n if (k[0] !== '$')\n result[k] = props[k];\n return result;\n}\nfunction compute_rest_props(props, keys) {\n const rest = {};\n keys = new Set(keys);\n for (const k in props)\n if (!keys.has(k) && k[0] !== '$')\n rest[k] = props[k];\n return rest;\n}\nfunction compute_slots(slots) {\n const result = {};\n for (const key in slots) {\n result[key] = true;\n }\n return result;\n}\nfunction once(fn) {\n let ran = false;\n return function (...args) {\n if (ran)\n return;\n ran = true;\n fn.call(this, ...args);\n };\n}\nfunction null_to_empty(value) {\n return value == null ? '' : value;\n}\nfunction set_store_value(store, ret, value) {\n store.set(value);\n return ret;\n}\nconst has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\nfunction action_destroyer(action_result) {\n return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\nfunction split_css_unit(value) {\n const split = typeof value === 'string' && value.match(/^\\s*(-?[\\d.]+)([^\\s]*)\\s*$/);\n return split ? [parseFloat(split[1]), split[2] || 'px'] : [value, 'px'];\n}\nconst contenteditable_truthy_values = ['', true, 1, 'true', 'contenteditable'];\n\nconst is_client = typeof window !== 'undefined';\nlet now = is_client\n ? () => window.performance.now()\n : () => Date.now();\nlet raf = is_client ? cb => requestAnimationFrame(cb) : noop;\n// used internally for testing\nfunction set_now(fn) {\n now = fn;\n}\nfunction set_raf(fn) {\n raf = fn;\n}\n\nconst tasks = new Set();\nfunction run_tasks(now) {\n tasks.forEach(task => {\n if (!task.c(now)) {\n tasks.delete(task);\n task.f();\n }\n });\n if (tasks.size !== 0)\n raf(run_tasks);\n}\n/**\n * For testing purposes only!\n */\nfunction clear_loops() {\n tasks.clear();\n}\n/**\n * Creates a new task that runs on each raf frame\n * until it returns a falsy value or is aborted\n */\nfunction loop(callback) {\n let task;\n if (tasks.size === 0)\n raf(run_tasks);\n return {\n promise: new Promise(fulfill => {\n tasks.add(task = { c: callback, f: fulfill });\n }),\n abort() {\n tasks.delete(task);\n }\n };\n}\n\nconst globals = (typeof window !== 'undefined'\n ? window\n : typeof globalThis !== 'undefined'\n ? globalThis\n : global);\n\n/**\n * Resize observer singleton.\n * One listener per element only!\n * https://groups.google.com/a/chromium.org/g/blink-dev/c/z6ienONUb5A/m/F5-VcUZtBAAJ\n */\nclass ResizeObserverSingleton {\n constructor(options) {\n this.options = options;\n this._listeners = 'WeakMap' in globals ? new WeakMap() : undefined;\n }\n observe(element, listener) {\n this._listeners.set(element, listener);\n this._getObserver().observe(element, this.options);\n return () => {\n this._listeners.delete(element);\n this._observer.unobserve(element); // this line can probably be removed\n };\n }\n _getObserver() {\n var _a;\n return (_a = this._observer) !== null && _a !== void 0 ? _a : (this._observer = new ResizeObserver((entries) => {\n var _a;\n for (const entry of entries) {\n ResizeObserverSingleton.entries.set(entry.target, entry);\n (_a = this._listeners.get(entry.target)) === null || _a === void 0 ? void 0 : _a(entry);\n }\n }));\n }\n}\n// Needs to be written like this to pass the tree-shake-test\nResizeObserverSingleton.entries = 'WeakMap' in globals ? new WeakMap() : undefined;\n\n// Track which nodes are claimed during hydration. Unclaimed nodes can then be removed from the DOM\n// at the end of hydration without touching the remaining nodes.\nlet is_hydrating = false;\nfunction start_hydrating() {\n is_hydrating = true;\n}\nfunction end_hydrating() {\n is_hydrating = false;\n}\nfunction upper_bound(low, high, key, value) {\n // Return first index of value larger than input value in the range [low, high)\n while (low < high) {\n const mid = low + ((high - low) >> 1);\n if (key(mid) <= value) {\n low = mid + 1;\n }\n else {\n high = mid;\n }\n }\n return low;\n}\nfunction init_hydrate(target) {\n if (target.hydrate_init)\n return;\n target.hydrate_init = true;\n // We know that all children have claim_order values since the unclaimed have been detached if target is not <head>\n let children = target.childNodes;\n // If target is <head>, there may be children without claim_order\n if (target.nodeName === 'HEAD') {\n const myChildren = [];\n for (let i = 0; i < children.length; i++) {\n const node = children[i];\n if (node.claim_order !== undefined) {\n myChildren.push(node);\n }\n }\n children = myChildren;\n }\n /*\n * Reorder claimed children optimally.\n * We can reorder claimed children optimally by finding the longest subsequence of\n * nodes that are already claimed in order and only moving the rest. The longest\n * subsequence of nodes that are claimed in order can be found by\n * computing the longest increasing subsequence of .claim_order values.\n *\n * This algorithm is optimal in generating the least amount of reorder operations\n * possible.\n *\n * Proof:\n * We know that, given a set of reordering operations, the nodes that do not move\n * always form an increasing subsequence, since they do not move among each other\n * meaning that they must be already ordered among each other. Thus, the maximal\n * set of nodes that do not move form a longest increasing subsequence.\n */\n // Compute longest increasing subsequence\n // m: subsequence length j => index k of smallest value that ends an increasing subsequence of length j\n const m = new Int32Array(children.length + 1);\n // Predecessor indices + 1\n const p = new Int32Array(children.length);\n m[0] = -1;\n let longest = 0;\n for (let i = 0; i < children.length; i++) {\n const current = children[i].claim_order;\n // Find the largest subsequence length such that it ends in a value less than our current value\n // upper_bound returns first greater value, so we subtract one\n // with fast path for when we are on the current longest subsequence\n const seqLen = ((longest > 0 && children[m[longest]].claim_order <= current) ? longest + 1 : upper_bound(1, longest, idx => children[m[idx]].claim_order, current)) - 1;\n p[i] = m[seqLen] + 1;\n const newLen = seqLen + 1;\n // We can guarantee that current is the smallest value. Otherwise, we would have generated a longer sequence.\n m[newLen] = i;\n longest = Math.max(newLen, longest);\n }\n // The longest increasing subsequence of nodes (initially reversed)\n const lis = [];\n // The rest of the nodes, nodes that will be moved\n const toMove = [];\n let last = children.length - 1;\n for (let cur = m[longest] + 1; cur != 0; cur = p[cur - 1]) {\n lis.push(children[cur - 1]);\n for (; last >= cur; last--) {\n toMove.push(children[last]);\n }\n last--;\n }\n for (; last >= 0; last--) {\n toMove.push(children[last]);\n }\n lis.reverse();\n // We sort the nodes being moved to guarantee that their insertion order matches the claim order\n toMove.sort((a, b) => a.claim_order - b.claim_order);\n // Finally, we move the nodes\n for (let i = 0, j = 0; i < toMove.length; i++) {\n while (j < lis.length && toMove[i].claim_order >= lis[j].claim_order) {\n j++;\n }\n const anchor = j < lis.length ? lis[j] : null;\n target.insertBefore(toMove[i], anchor);\n }\n}\nfunction append(target, node) {\n target.appendChild(node);\n}\nfunction append_styles(target, style_sheet_id, styles) {\n const append_styles_to = get_root_for_style(target);\n if (!append_styles_to.getElementById(style_sheet_id)) {\n const style = element('style');\n style.id = style_sheet_id;\n style.textContent = styles;\n append_stylesheet(append_styles_to, style);\n }\n}\nfunction get_root_for_style(node) {\n if (!node)\n return document;\n const root = node.getRootNode ? node.getRootNode() : node.ownerDocument;\n if (root && root.host) {\n return root;\n }\n return node.ownerDocument;\n}\nfunction append_empty_stylesheet(node) {\n const style_element = element('style');\n append_stylesheet(get_root_for_style(node), style_element);\n return style_element.sheet;\n}\nfunction append_stylesheet(node, style) {\n append(node.head || node, style);\n return style.sheet;\n}\nfunction append_hydration(target, node) {\n if (is_hydrating) {\n init_hydrate(target);\n if ((target.actual_end_child === undefined) || ((target.actual_end_child !== null) && (target.actual_end_child.parentNode !== target))) {\n target.actual_end_child = target.firstChild;\n }\n // Skip nodes of undefined ordering\n while ((target.actual_end_child !== null) && (target.actual_end_child.claim_order === undefined)) {\n target.actual_end_child = target.actual_end_child.nextSibling;\n }\n if (node !== target.actual_end_child) {\n // We only insert if the ordering of this node should be modified or the parent node is not target\n if (node.claim_order !== undefined || node.parentNode !== target) {\n target.insertBefore(node, target.actual_end_child);\n }\n }\n else {\n target.actual_end_child = node.nextSibling;\n }\n }\n else if (node.parentNode !== target || node.nextSibling !== null) {\n target.appendChild(node);\n }\n}\nfunction insert(target, node, anchor) {\n target.insertBefore(node, anchor || null);\n}\nfunction insert_hydration(target, node, anchor) {\n if (is_hydrating && !anchor) {\n append_hydration(target, node);\n }\n else if (node.parentNode !== target || node.nextSibling != anchor) {\n target.insertBefore(node, anchor || null);\n }\n}\nfunction detach(node) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n}\nfunction destroy_each(iterations, detaching) {\n for (let i = 0; i < iterations.length; i += 1) {\n if (iterations[i])\n iterations[i].d(detaching);\n }\n}\nfunction element(name) {\n return document.createElement(name);\n}\nfunction element_is(name, is) {\n return document.createElement(name, { is });\n}\nfunction object_without_properties(obj, exclude) {\n const target = {};\n for (const k in obj) {\n if (has_prop(obj, k)\n // @ts-ignore\n && exclude.indexOf(k) === -1) {\n // @ts-ignore\n target[k] = obj[k];\n }\n }\n return target;\n}\nfunction svg_element(name) {\n return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\nfunction text(data) {\n return document.createTextNode(data);\n}\nfunction space() {\n return text(' ');\n}\nfunction empty() {\n return text('');\n}\nfunction comment(content) {\n return document.createComment(content);\n}\nfunction listen(node, event, handler, options) {\n node.addEventListener(event, handler, options);\n return () => node.removeEventListener(event, handler, options);\n}\nfunction prevent_default(fn) {\n return function (event) {\n event.preventDefault();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_propagation(fn) {\n return function (event) {\n event.stopPropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_immediate_propagation(fn) {\n return function (event) {\n event.stopImmediatePropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction self(fn) {\n return function (event) {\n // @ts-ignore\n if (event.target === this)\n fn.call(this, event);\n };\n}\nfunction trusted(fn) {\n return function (event) {\n // @ts-ignore\n if (event.isTrusted)\n fn.call(this, event);\n };\n}\nfunction attr(node, attribute, value) {\n if (value == null)\n node.removeAttribute(attribute);\n else if (node.getAttribute(attribute) !== value)\n node.setAttribute(attribute, value);\n}\n/**\n * List of attributes that should always be set through the attr method,\n * because updating them through the property setter doesn't work reliably.\n * In the example of `width`/`height`, the problem is that the setter only\n * accepts numeric values, but the attribute can also be set to a string like `50%`.\n * If this list becomes too big, rethink this approach.\n */\nconst always_set_through_set_attribute = ['width', 'height'];\nfunction set_attributes(node, attributes) {\n // @ts-ignore\n const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n for (const key in attributes) {\n if (attributes[key] == null) {\n node.removeAttribute(key);\n }\n else if (key === 'style') {\n node.style.cssText = attributes[key];\n }\n else if (key === '__value') {\n node.value = node[key] = attributes[key];\n }\n else if (descriptors[key] && descriptors[key].set && always_set_through_set_attribute.indexOf(key) === -1) {\n node[key] = attributes[key];\n }\n else {\n attr(node, key, attributes[key]);\n }\n }\n}\nfunction set_svg_attributes(node, attributes) {\n for (const key in attributes) {\n attr(node, key, attributes[key]);\n }\n}\nfunction set_custom_element_data_map(node, data_map) {\n Object.keys(data_map).forEach((key) => {\n set_custom_element_data(node, key, data_map[key]);\n });\n}\nfunction set_custom_element_data(node, prop, value) {\n if (prop in node) {\n node[prop] = typeof node[prop] === 'boolean' && value === '' ? true : value;\n }\n else {\n attr(node, prop, value);\n }\n}\nfunction set_dynamic_element_data(tag) {\n return (/-/.test(tag)) ? set_custom_element_data_map : set_attributes;\n}\nfunction xlink_attr(node, attribute, value) {\n node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\nfunction get_binding_group_value(group, __value, checked) {\n const value = new Set();\n for (let i = 0; i < group.length; i += 1) {\n if (group[i].checked)\n value.add(group[i].__value);\n }\n if (!checked) {\n value.delete(__value);\n }\n return Array.from(value);\n}\nfunction init_binding_group(group) {\n let _inputs;\n return {\n /* push */ p(...inputs) {\n _inputs = inputs;\n _inputs.forEach(input => group.push(input));\n },\n /* remove */ r() {\n _inputs.forEach(input => group.splice(group.indexOf(input), 1));\n }\n };\n}\nfunction init_binding_group_dynamic(group, indexes) {\n let _group = get_binding_group(group);\n let _inputs;\n function get_binding_group(group) {\n for (let i = 0; i < indexes.length; i++) {\n group = group[indexes[i]] = group[indexes[i]] || [];\n }\n return group;\n }\n function push() {\n _inputs.forEach(input => _group.push(input));\n }\n function remove() {\n _inputs.forEach(input => _group.splice(_group.indexOf(input), 1));\n }\n return {\n /* update */ u(new_indexes) {\n indexes = new_indexes;\n const new_group = get_binding_group(group);\n if (new_group !== _group) {\n remove();\n _group = new_group;\n push();\n }\n },\n /* push */ p(...inputs) {\n _inputs = inputs;\n push();\n },\n /* remove */ r: remove\n };\n}\nfunction to_number(value) {\n return value === '' ? null : +value;\n}\nfunction time_ranges_to_array(ranges) {\n const array = [];\n for (let i = 0; i < ranges.length; i += 1) {\n array.push({ start: ranges.start(i), end: ranges.end(i) });\n }\n return array;\n}\nfunction children(element) {\n return Array.from(element.childNodes);\n}\nfunction init_claim_info(nodes) {\n if (nodes.claim_info === undefined) {\n nodes.claim_info = { last_index: 0, total_claimed: 0 };\n }\n}\nfunction claim_node(nodes, predicate, processNode, createNode, dontUpdateLastIndex = false) {\n // Try to find nodes in an order such that we lengthen the longest increasing subsequence\n init_claim_info(nodes);\n const resultNode = (() => {\n // We first try to find an element after the previous one\n for (let i = nodes.claim_info.last_index; i < nodes.length; i++) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n return node;\n }\n }\n // Otherwise, we try to find one before\n // We iterate in reverse so that we don't go too far back\n for (let i = nodes.claim_info.last_index - 1; i >= 0; i--) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n else if (replacement === undefined) {\n // Since we spliced before the last_index, we decrease it\n nodes.claim_info.last_index--;\n }\n return node;\n }\n }\n // If we can't find any matching node, we create a new one\n return createNode();\n })();\n resultNode.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n return resultNode;\n}\nfunction claim_element_base(nodes, name, attributes, create_element) {\n return claim_node(nodes, (node) => node.nodeName === name, (node) => {\n const remove = [];\n for (let j = 0; j < node.attributes.length; j++) {\n const attribute = node.attributes[j];\n if (!attributes[attribute.name]) {\n remove.push(attribute.name);\n }\n }\n remove.forEach(v => node.removeAttribute(v));\n return undefined;\n }, () => create_element(name));\n}\nfunction claim_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, element);\n}\nfunction claim_svg_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, svg_element);\n}\nfunction claim_text(nodes, data) {\n return claim_node(nodes, (node) => node.nodeType === 3, (node) => {\n const dataStr = '' + data;\n if (node.data.startsWith(dataStr)) {\n if (node.data.length !== dataStr.length) {\n return node.splitText(dataStr.length);\n }\n }\n else {\n node.data = dataStr;\n }\n }, () => text(data), true // Text nodes should not update last index since it is likely not worth it to eliminate an increasing subsequence of actual elements\n );\n}\nfunction claim_space(nodes) {\n return claim_text(nodes, ' ');\n}\nfunction claim_comment(nodes, data) {\n return claim_node(nodes, (node) => node.nodeType === 8, (node) => {\n node.data = '' + data;\n return undefined;\n }, () => comment(data), true);\n}\nfunction find_comment(nodes, text, start) {\n for (let i = start; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeType === 8 /* comment node */ && node.textContent.trim() === text) {\n return i;\n }\n }\n return nodes.length;\n}\nfunction claim_html_tag(nodes, is_svg) {\n // find html opening tag\n const start_index = find_comment(nodes, 'HTML_TAG_START', 0);\n const end_index = find_comment(nodes, 'HTML_TAG_END', start_index);\n if (start_index === end_index) {\n return new HtmlTagHydration(undefined, is_svg);\n }\n init_claim_info(nodes);\n const html_tag_nodes = nodes.splice(start_index, end_index - start_index + 1);\n detach(html_tag_nodes[0]);\n detach(html_tag_nodes[html_tag_nodes.length - 1]);\n const claimed_nodes = html_tag_nodes.slice(1, html_tag_nodes.length - 1);\n for (const n of claimed_nodes) {\n n.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n }\n return new HtmlTagHydration(claimed_nodes, is_svg);\n}\nfunction set_data(text, data) {\n data = '' + data;\n if (text.data === data)\n return;\n text.data = data;\n}\nfunction set_data_contenteditable(text, data) {\n data = '' + data;\n if (text.wholeText === data)\n return;\n text.data = data;\n}\nfunction set_data_maybe_contenteditable(text, data, attr_value) {\n if (~contenteditable_truthy_values.indexOf(attr_value)) {\n set_data_contenteditable(text, data);\n }\n else {\n set_data(text, data);\n }\n}\nfunction set_input_value(input, value) {\n input.value = value == null ? '' : value;\n}\nfunction set_input_type(input, type) {\n try {\n input.type = type;\n }\n catch (e) {\n // do nothing\n }\n}\nfunction set_style(node, key, value, important) {\n if (value == null) {\n node.style.removeProperty(key);\n }\n else {\n node.style.setProperty(key, value, important ? 'important' : '');\n }\n}\nfunction select_option(select, value, mounting) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n if (option.__value === value) {\n option.selected = true;\n return;\n }\n }\n if (!mounting || value !== undefined) {\n select.selectedIndex = -1; // no option should be selected\n }\n}\nfunction select_options(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n option.selected = ~value.indexOf(option.__value);\n }\n}\nfunction select_value(select) {\n const selected_option = select.querySelector(':checked');\n return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n if (crossorigin === undefined) {\n crossorigin = false;\n try {\n if (typeof window !== 'undefined' && window.parent) {\n void window.parent.document;\n }\n }\n catch (error) {\n crossorigin = true;\n }\n }\n return crossorigin;\n}\nfunction add_iframe_resize_listener(node, fn) {\n const computed_style = getComputedStyle(node);\n if (computed_style.position === 'static') {\n node.style.position = 'relative';\n }\n const iframe = element('iframe');\n iframe.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ' +\n 'overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: -1;');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.tabIndex = -1;\n const crossorigin = is_crossorigin();\n let unsubscribe;\n if (crossorigin) {\n iframe.src = \"data:text/html,<script>onresize=function(){parent.postMessage(0,'*')}</script>\";\n unsubscribe = listen(window, 'message', (event) => {\n if (event.source === iframe.contentWindow)\n fn();\n });\n }\n else {\n iframe.src = 'about:blank';\n iframe.onload = () => {\n unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n // make sure an initial resize event is fired _after_ the iframe is loaded (which is asynchronous)\n // see https://github.com/sveltejs/svelte/issues/4233\n fn();\n };\n }\n append(node, iframe);\n return () => {\n if (crossorigin) {\n unsubscribe();\n }\n else if (unsubscribe && iframe.contentWindow) {\n unsubscribe();\n }\n detach(iframe);\n };\n}\nconst resize_observer_content_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'content-box' });\nconst resize_observer_border_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'border-box' });\nconst resize_observer_device_pixel_content_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'device-pixel-content-box' });\nfunction toggle_class(element, name, toggle) {\n element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {\n const e = document.createEvent('CustomEvent');\n e.initCustomEvent(type, bubbles, cancelable, detail);\n return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n return Array.from(parent.querySelectorAll(selector));\n}\nfunction head_selector(nodeId, head) {\n const result = [];\n let started = 0;\n for (const node of head.childNodes) {\n if (node.nodeType === 8 /* comment node */) {\n const comment = node.textContent.trim();\n if (comment === `HEAD_${nodeId}_END`) {\n started -= 1;\n result.push(node);\n }\n else if (comment === `HEAD_${nodeId}_START`) {\n started += 1;\n result.push(node);\n }\n }\n else if (started > 0) {\n result.push(node);\n }\n }\n return result;\n}\nclass HtmlTag {\n constructor(is_svg = false) {\n this.is_svg = false;\n this.is_svg = is_svg;\n this.e = this.n = null;\n }\n c(html) {\n this.h(html);\n }\n m(html, target, anchor = null) {\n if (!this.e) {\n if (this.is_svg)\n this.e = svg_element(target.nodeName);\n /** #7364 target for <template> may be provided as #document-fragment(11) */\n else\n this.e = element((target.nodeType === 11 ? 'TEMPLATE' : target.nodeName));\n this.t = target.tagName !== 'TEMPLATE' ? target : target.content;\n this.c(html);\n }\n this.i(anchor);\n }\n h(html) {\n this.e.innerHTML = html;\n this.n = Array.from(this.e.nodeName === 'TEMPLATE' ? this.e.content.childNodes : this.e.childNodes);\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert(this.t, this.n[i], anchor);\n }\n }\n p(html) {\n this.d();\n this.h(html);\n this.i(this.a);\n }\n d() {\n this.n.forEach(detach);\n }\n}\nclass HtmlTagHydration extends HtmlTag {\n constructor(claimed_nodes, is_svg = false) {\n super(is_svg);\n this.e = this.n = null;\n this.l = claimed_nodes;\n }\n c(html) {\n if (this.l) {\n this.n = this.l;\n }\n else {\n super.c(html);\n }\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert_hydration(this.t, this.n[i], anchor);\n }\n }\n}\nfunction attribute_to_object(attributes) {\n const result = {};\n for (const attribute of attributes) {\n result[attribute.name] = attribute.value;\n }\n return result;\n}\nfunction get_custom_elements_slots(element) {\n const result = {};\n element.childNodes.forEach((node) => {\n result[node.slot || 'default'] = true;\n });\n return result;\n}\nfunction construct_svelte_component(component, props) {\n return new component(props);\n}\n\n// we need to store the information for multiple documents because a Svelte application could also contain iframes\n// https://github.com/sveltejs/svelte/issues/3624\nconst managed_styles = new Map();\nlet active = 0;\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n while (i--)\n hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n return hash >>> 0;\n}\nfunction create_style_information(doc, node) {\n const info = { stylesheet: append_empty_stylesheet(node), rules: {} };\n managed_styles.set(doc, info);\n return info;\n}\nfunction create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {\n const step = 16.666 / duration;\n let keyframes = '{\\n';\n for (let p = 0; p <= 1; p += step) {\n const t = a + (b - a) * ease(p);\n keyframes += p * 100 + `%{${fn(t, 1 - t)}}\\n`;\n }\n const rule = keyframes + `100% {${fn(b, 1 - b)}}\\n}`;\n const name = `__svelte_${hash(rule)}_${uid}`;\n const doc = get_root_for_style(node);\n const { stylesheet, rules } = managed_styles.get(doc) || create_style_information(doc, node);\n if (!rules[name]) {\n rules[name] = true;\n stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);\n }\n const animation = node.style.animation || '';\n node.style.animation = `${animation ? `${animation}, ` : ''}${name} ${duration}ms linear ${delay}ms 1 both`;\n active += 1;\n return name;\n}\nfunction delete_rule(node, name) {\n const previous = (node.style.animation || '').split(', ');\n const next = previous.filter(name\n ? anim => anim.indexOf(name) < 0 // remove specific animation\n : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations\n );\n const deleted = previous.length - next.length;\n if (deleted) {\n node.style.animation = next.join(', ');\n active -= deleted;\n if (!active)\n clear_rules();\n }\n}\nfunction clear_rules() {\n raf(() => {\n if (active)\n return;\n managed_styles.forEach(info => {\n const { ownerNode } = info.stylesheet;\n // there is no ownerNode if it runs on jsdom.\n if (ownerNode)\n detach(ownerNode);\n });\n managed_styles.clear();\n });\n}\n\nfunction create_animation(node, from, fn, params) {\n if (!from)\n return noop;\n const to = node.getBoundingClientRect();\n if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom)\n return noop;\n const { delay = 0, duration = 300, easing = identity, \n // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation?\n start: start_time = now() + delay, \n // @ts-ignore todo:\n end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params);\n let running = true;\n let started = false;\n let name;\n function start() {\n if (css) {\n name = create_rule(node, 0, 1, duration, delay, easing, css);\n }\n if (!delay) {\n started = true;\n }\n }\n function stop() {\n if (css)\n delete_rule(node, name);\n running = false;\n }\n loop(now => {\n if (!started && now >= start_time) {\n started = true;\n }\n if (started && now >= end) {\n tick(1, 0);\n stop();\n }\n if (!running) {\n return false;\n }\n if (started) {\n const p = now - start_time;\n const t = 0 + 1 * easing(p / duration);\n tick(t, 1 - t);\n }\n return true;\n });\n start();\n tick(0, 1);\n return stop;\n}\nfunction fix_position(node) {\n const style = getComputedStyle(node);\n if (style.position !== 'absolute' && style.position !== 'fixed') {\n const { width, height } = style;\n const a = node.getBoundingClientRect();\n node.style.position = 'absolute';\n node.style.width = width;\n node.style.height = height;\n add_transform(node, a);\n }\n}\nfunction add_transform(node, a) {\n const b = node.getBoundingClientRect();\n if (a.left !== b.left || a.top !== b.top) {\n const style = getComputedStyle(node);\n const transform = style.transform === 'none' ? '' : style.transform;\n node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;\n }\n}\n\nlet current_component;\nfunction set_current_component(component) {\n current_component = component;\n}\nfunction get_current_component() {\n if (!current_component)\n throw new Error('Function called outside component initialization');\n return current_component;\n}\n/**\n * Schedules a callback to run immediately before the component is updated after any state change.\n *\n * The first time the callback runs will be before the initial `onMount`\n *\n * https://svelte.dev/docs#run-time-svelte-beforeupdate\n */\nfunction beforeUpdate(fn) {\n get_current_component().$$.before_update.push(fn);\n}\n/**\n * The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM.\n * It must be called during the component's initialisation (but doesn't need to live *inside* the component;\n * it can be called from an external module).\n *\n * `onMount` does not run inside a [server-side component](/docs#run-time-server-side-component-api).\n *\n * https://svelte.dev/docs#run-time-svelte-onmount\n */\nfunction onMount(fn) {\n get_current_component().$$.on_mount.push(fn);\n}\n/**\n * Schedules a callback to run immediately after the component has been updated.\n *\n * The first time the callback runs will be after the initial `onMount`\n */\nfunction afterUpdate(fn) {\n get_current_component().$$.after_update.push(fn);\n}\n/**\n * Schedules a callback to run immediately before the component is unmounted.\n *\n * Out of `onMount`, `beforeUpdate`, `afterUpdate` and `onDestroy`, this is the\n * only one that runs inside a server-side component.\n *\n * https://svelte.dev/docs#run-time-svelte-ondestroy\n */\nfunction onDestroy(fn) {\n get_current_component().$$.on_destroy.push(fn);\n}\n/**\n * Creates an event dispatcher that can be used to dispatch [component events](/docs#template-syntax-component-directives-on-eventname).\n * Event dispatchers are functions that can take two arguments: `name` and `detail`.\n *\n * Component events created with `createEventDispatcher` create a\n * [CustomEvent](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent).\n * These events do not [bubble](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events#Event_bubbling_and_capture).\n * The `detail` argument corresponds to the [CustomEvent.detail](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/detail)\n * property and can contain any type of data.\n *\n * https://svelte.dev/docs#run-time-svelte-createeventdispatcher\n */\nfunction createEventDispatcher() {\n const component = get_current_component();\n return (type, detail, { cancelable = false } = {}) => {\n const callbacks = component.$$.callbacks[type];\n if (callbacks) {\n // TODO are there situations where events could be dispatched\n // in a server (non-DOM) environment?\n const event = custom_event(type, detail, { cancelable });\n callbacks.slice().forEach(fn => {\n fn.call(component, event);\n });\n return !event.defaultPrevented;\n }\n return true;\n };\n}\n/**\n * Associates an arbitrary `context` object with the current component and the specified `key`\n * and returns that object. The context is then available to children of the component\n * (including slotted content) with `getContext`.\n *\n * Like lifecycle functions, this must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-setcontext\n */\nfunction setContext(key, context) {\n get_current_component().$$.context.set(key, context);\n return context;\n}\n/**\n * Retrieves the context that belongs to the closest parent component with the specified `key`.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-getcontext\n */\nfunction getContext(key) {\n return get_current_component().$$.context.get(key);\n}\n/**\n * Retrieves the whole context map that belongs to the closest parent component.\n * Must be called during component initialisation. Useful, for example, if you\n * programmatically create a component and want to pass the existing context to it.\n *\n * https://svelte.dev/docs#run-time-svelte-getallcontexts\n */\nfunction getAllContexts() {\n return get_current_component().$$.context;\n}\n/**\n * Checks whether a given `key` has been set in the context of a parent component.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-hascontext\n */\nfunction hasContext(key) {\n return get_current_component().$$.context.has(key);\n}\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\nfunction bubble(component, event) {\n const callbacks = component.$$.callbacks[event.type];\n if (callbacks) {\n // @ts-ignore\n callbacks.slice().forEach(fn => fn.call(this, event));\n }\n}\n\nconst dirty_components = [];\nconst intros = { enabled: false };\nconst binding_callbacks = [];\nlet render_callbacks = [];\nconst flush_callbacks = [];\nconst resolved_promise = /* @__PURE__ */ Promise.resolve();\nlet update_scheduled = false;\nfunction schedule_update() {\n if (!update_scheduled) {\n update_scheduled = true;\n resolved_promise.then(flush);\n }\n}\nfunction tick() {\n schedule_update();\n return resolved_promise;\n}\nfunction add_render_callback(fn) {\n render_callbacks.push(fn);\n}\nfunction add_flush_callback(fn) {\n flush_callbacks.push(fn);\n}\n// flush() calls callbacks in this order:\n// 1. All beforeUpdate callbacks, in order: parents before children\n// 2. All bind:this callbacks, in reverse order: children before parents.\n// 3. All afterUpdate callbacks, in order: parents before children. EXCEPT\n// for afterUpdates called during the initial onMount, which are called in\n// reverse order: children before parents.\n// Since callbacks might update component values, which could trigger another\n// call to flush(), the following steps guard against this:\n// 1. During beforeUpdate, any updated components will be added to the\n// dirty_components array and will cause a reentrant call to flush(). Because\n// the flush index is kept outside the function, the reentrant call will pick\n// up where the earlier call left off and go through all dirty components. The\n// current_component value is saved and restored so that the reentrant call will\n// not interfere with the \"parent\" flush() call.\n// 2. bind:this callbacks cannot trigger new flush() calls.\n// 3. During afterUpdate, any updated components will NOT have their afterUpdate\n// callback called a second time; the seen_callbacks set, outside the flush()\n// function, guarantees this behavior.\nconst seen_callbacks = new Set();\nlet flushidx = 0; // Do *not* move this inside the flush() function\nfunction flush() {\n // Do not reenter flush while dirty components are updated, as this can\n // result in an infinite loop. Instead, let the inner flush handle it.\n // Reentrancy is ok afterwards for bindings etc.\n if (flushidx !== 0) {\n return;\n }\n const saved_component = current_component;\n do {\n // first, call beforeUpdate functions\n // and update components\n try {\n while (flushidx < dirty_components.length) {\n const component = dirty_components[flushidx];\n flushidx++;\n set_current_component(component);\n update(component.$$);\n }\n }\n catch (e) {\n // reset dirty state to not end up in a deadlocked state and then rethrow\n dirty_components.length = 0;\n flushidx = 0;\n throw e;\n }\n set_current_component(null);\n dirty_components.length = 0;\n flushidx = 0;\n while (binding_callbacks.length)\n binding_callbacks.pop()();\n // then, once components are updated, call\n // afterUpdate functions. This may cause\n // subsequent updates...\n for (let i = 0; i < render_callbacks.length; i += 1) {\n const callback = render_callbacks[i];\n if (!seen_callbacks.has(callback)) {\n // ...so guard against infinite loops\n seen_callbacks.add(callback);\n callback();\n }\n }\n render_callbacks.length = 0;\n } while (dirty_components.length);\n while (flush_callbacks.length) {\n flush_callbacks.pop()();\n }\n update_scheduled = false;\n seen_callbacks.clear();\n set_current_component(saved_component);\n}\nfunction update($$) {\n if ($$.fragment !== null) {\n $$.update();\n run_all($$.before_update);\n const dirty = $$.dirty;\n $$.dirty = [-1];\n $$.fragment && $$.fragment.p($$.ctx, dirty);\n $$.after_update.forEach(add_render_callback);\n }\n}\n/**\n * Useful for example to execute remaining `afterUpdate` callbacks before executing `destroy`.\n */\nfunction flush_render_callbacks(fns) {\n const filtered = [];\n const targets = [];\n render_callbacks.forEach((c) => fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c));\n targets.forEach((c) => c());\n render_callbacks = filtered;\n}\n\nlet promise;\nfunction wait() {\n if (!promise) {\n promise = Promise.resolve();\n promise.then(() => {\n promise = null;\n });\n }\n return promise;\n}\nfunction dispatch(node, direction, kind) {\n node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\nconst outroing = new Set();\nlet outros;\nfunction group_outros() {\n outros = {\n r: 0,\n c: [],\n p: outros // parent group\n };\n}\nfunction check_outros() {\n if (!outros.r) {\n run_all(outros.c);\n }\n outros = outros.p;\n}\nfunction transition_in(block, local) {\n if (block && block.i) {\n outroing.delete(block);\n block.i(local);\n }\n}\nfunction transition_out(block, local, detach, callback) {\n if (block && block.o) {\n if (outroing.has(block))\n return;\n outroing.add(block);\n outros.c.push(() => {\n outroing.delete(block);\n if (callback) {\n if (detach)\n block.d(1);\n callback();\n }\n });\n block.o(local);\n }\n else if (callback) {\n callback();\n }\n}\nconst null_transition = { duration: 0 };\nfunction create_in_transition(node, fn, params) {\n const options = { direction: 'in' };\n let config = fn(node, params, options);\n let running = false;\n let animation_name;\n let task;\n let uid = 0;\n function cleanup() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n tick(0, 1);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n if (task)\n task.abort();\n running = true;\n add_render_callback(() => dispatch(node, true, 'start'));\n task = loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(1, 0);\n dispatch(node, true, 'end');\n cleanup();\n return running = false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(t, 1 - t);\n }\n }\n return running;\n });\n }\n let started = false;\n return {\n start() {\n if (started)\n return;\n started = true;\n delete_rule(node);\n if (is_function(config)) {\n config = config(options);\n wait().then(go);\n }\n else {\n go();\n }\n },\n invalidate() {\n started = false;\n },\n end() {\n if (running) {\n cleanup();\n running = false;\n }\n }\n };\n}\nfunction create_out_transition(node, fn, params) {\n const options = { direction: 'out' };\n let config = fn(node, params, options);\n let running = true;\n let animation_name;\n const group = outros;\n group.r += 1;\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n add_render_callback(() => dispatch(node, false, 'start'));\n loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(0, 1);\n dispatch(node, false, 'end');\n if (!--group.r) {\n // this will result in `end()` being called,\n // so we don't need to clean up here\n run_all(group.c);\n }\n return false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(1 - t, t);\n }\n }\n return running;\n });\n }\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config(options);\n go();\n });\n }\n else {\n go();\n }\n return {\n end(reset) {\n if (reset && config.tick) {\n config.tick(1, 0);\n }\n if (running) {\n if (animation_name)\n delete_rule(node, animation_name);\n running = false;\n }\n }\n };\n}\nfunction create_bidirectional_transition(node, fn, params, intro) {\n const options = { direction: 'both' };\n let config = fn(node, params, options);\n let t = intro ? 0 : 1;\n let running_program = null;\n let pending_program = null;\n let animation_name = null;\n function clear_animation() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function init(program, duration) {\n const d = (program.b - t);\n duration *= Math.abs(d);\n return {\n a: t,\n b: program.b,\n d,\n duration,\n start: program.start,\n end: program.start + duration,\n group: program.group\n };\n }\n function go(b) {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n const program = {\n start: now() + delay,\n b\n };\n if (!b) {\n // @ts-ignore todo: improve typings\n program.group = outros;\n outros.r += 1;\n }\n if (running_program || pending_program) {\n pending_program = program;\n }\n else {\n // if this is an intro, and there's a delay, we need to do\n // an initial tick and/or apply CSS animation immediately\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, b, duration, delay, easing, css);\n }\n if (b)\n tick(0, 1);\n running_program = init(program, duration);\n add_render_callback(() => dispatch(node, b, 'start'));\n loop(now => {\n if (pending_program && now > pending_program.start) {\n running_program = init(pending_program, duration);\n pending_program = null;\n dispatch(node, running_program.b, 'start');\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, running_program.b, running_program.duration, 0, easing, config.css);\n }\n }\n if (running_program) {\n if (now >= running_program.end) {\n tick(t = running_program.b, 1 - t);\n dispatch(node, running_program.b, 'end');\n if (!pending_program) {\n // we're done\n if (running_program.b) {\n // intro — we can tidy up immediately\n clear_animation();\n }\n else {\n // outro — needs to be coordinated\n if (!--running_program.group.r)\n run_all(running_program.group.c);\n }\n }\n running_program = null;\n }\n else if (now >= running_program.start) {\n const p = now - running_program.start;\n t = running_program.a + running_program.d * easing(p / running_program.duration);\n tick(t, 1 - t);\n }\n }\n return !!(running_program || pending_program);\n });\n }\n }\n return {\n run(b) {\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config(options);\n go(b);\n });\n }\n else {\n go(b);\n }\n },\n end() {\n clear_animation();\n running_program = pending_program = null;\n }\n };\n}\n\nfunction handle_promise(promise, info) {\n const token = info.token = {};\n function update(type, index, key, value) {\n if (info.token !== token)\n return;\n info.resolved = value;\n let child_ctx = info.ctx;\n if (key !== undefined) {\n child_ctx = child_ctx.slice();\n child_ctx[key] = value;\n }\n const block = type && (info.current = type)(child_ctx);\n let needs_flush = false;\n if (info.block) {\n if (info.blocks) {\n info.blocks.forEach((block, i) => {\n if (i !== index && block) {\n group_outros();\n transition_out(block, 1, 1, () => {\n if (info.blocks[i] === block) {\n info.blocks[i] = null;\n }\n });\n check_outros();\n }\n });\n }\n else {\n info.block.d(1);\n }\n block.c();\n transition_in(block, 1);\n block.m(info.mount(), info.anchor);\n needs_flush = true;\n }\n info.block = block;\n if (info.blocks)\n info.blocks[index] = block;\n if (needs_flush) {\n flush();\n }\n }\n if (is_promise(promise)) {\n const current_component = get_current_component();\n promise.then(value => {\n set_current_component(current_component);\n update(info.then, 1, info.value, value);\n set_current_component(null);\n }, error => {\n set_current_component(current_component);\n update(info.catch, 2, info.error, error);\n set_current_component(null);\n if (!info.hasCatch) {\n throw error;\n }\n });\n // if we previously had a then/catch block, destroy it\n if (info.current !== info.pending) {\n update(info.pending, 0);\n return true;\n }\n }\n else {\n if (info.current !== info.then) {\n update(info.then, 1, info.value, promise);\n return true;\n }\n info.resolved = promise;\n }\n}\nfunction update_await_block_branch(info, ctx, dirty) {\n const child_ctx = ctx.slice();\n const { resolved } = info;\n if (info.current === info.then) {\n child_ctx[info.value] = resolved;\n }\n if (info.current === info.catch) {\n child_ctx[info.error] = resolved;\n }\n info.block.p(child_ctx, dirty);\n}\n\nfunction destroy_block(block, lookup) {\n block.d(1);\n lookup.delete(block.key);\n}\nfunction outro_and_destroy_block(block, lookup) {\n transition_out(block, 1, 1, () => {\n lookup.delete(block.key);\n });\n}\nfunction fix_and_destroy_block(block, lookup) {\n block.f();\n destroy_block(block, lookup);\n}\nfunction fix_and_outro_and_destroy_block(block, lookup) {\n block.f();\n outro_and_destroy_block(block, lookup);\n}\nfunction update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {\n let o = old_blocks.length;\n let n = list.length;\n let i = o;\n const old_indexes = {};\n while (i--)\n old_indexes[old_blocks[i].key] = i;\n const new_blocks = [];\n const new_lookup = new Map();\n const deltas = new Map();\n const updates = [];\n i = n;\n while (i--) {\n const child_ctx = get_context(ctx, list, i);\n const key = get_key(child_ctx);\n let block = lookup.get(key);\n if (!block) {\n block = create_each_block(key, child_ctx);\n block.c();\n }\n else if (dynamic) {\n // defer updates until all the DOM shuffling is done\n updates.push(() => block.p(child_ctx, dirty));\n }\n new_lookup.set(key, new_blocks[i] = block);\n if (key in old_indexes)\n deltas.set(key, Math.abs(i - old_indexes[key]));\n }\n const will_move = new Set();\n const did_move = new Set();\n function insert(block) {\n transition_in(block, 1);\n block.m(node, next);\n lookup.set(block.key, block);\n next = block.first;\n n--;\n }\n while (o && n) {\n const new_block = new_blocks[n - 1];\n const old_block = old_blocks[o - 1];\n const new_key = new_block.key;\n const old_key = old_block.key;\n if (new_block === old_block) {\n // do nothing\n next = new_block.first;\n o--;\n n--;\n }\n else if (!new_lookup.has(old_key)) {\n // remove old block\n destroy(old_block, lookup);\n o--;\n }\n else if (!lookup.has(new_key) || will_move.has(new_key)) {\n insert(new_block);\n }\n else if (did_move.has(old_key)) {\n o--;\n }\n else if (deltas.get(new_key) > deltas.get(old_key)) {\n did_move.add(new_key);\n insert(new_block);\n }\n else {\n will_move.add(old_key);\n o--;\n }\n }\n while (o--) {\n const old_block = old_blocks[o];\n if (!new_lookup.has(old_block.key))\n destroy(old_block, lookup);\n }\n while (n)\n insert(new_blocks[n - 1]);\n run_all(updates);\n return new_blocks;\n}\nfunction validate_each_keys(ctx, list, get_context, get_key) {\n const keys = new Set();\n for (let i = 0; i < list.length; i++) {\n const key = get_key(get_context(ctx, list, i));\n if (keys.has(key)) {\n throw new Error('Cannot have duplicate keys in a keyed each');\n }\n keys.add(key);\n }\n}\n\nfunction get_spread_update(levels, updates) {\n const update = {};\n const to_null_out = {};\n const accounted_for = { $$scope: 1 };\n let i = levels.length;\n while (i--) {\n const o = levels[i];\n const n = updates[i];\n if (n) {\n for (const key in o) {\n if (!(key in n))\n to_null_out[key] = 1;\n }\n for (const key in n) {\n if (!accounted_for[key]) {\n update[key] = n[key];\n accounted_for[key] = 1;\n }\n }\n levels[i] = n;\n }\n else {\n for (const key in o) {\n accounted_for[key] = 1;\n }\n }\n }\n for (const key in to_null_out) {\n if (!(key in update))\n update[key] = undefined;\n }\n return update;\n}\nfunction get_spread_object(spread_props) {\n return typeof spread_props === 'object' && spread_props !== null ? spread_props : {};\n}\n\nconst _boolean_attributes = [\n 'allowfullscreen',\n 'allowpaymentrequest',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formnovalidate',\n 'hidden',\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 'selected'\n];\n/**\n * List of HTML boolean attributes (e.g. `<input disabled>`).\n * Source: https://html.spec.whatwg.org/multipage/indices.html\n */\nconst boolean_attributes = new Set([..._boolean_attributes]);\n\n/** regex of all html void element names */\nconst void_element_names = /^(?:area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/;\nfunction is_void(name) {\n return void_element_names.test(name) || name.toLowerCase() === '!doctype';\n}\n\nconst invalid_attribute_name_character = /[\\s'\">/=\\u{FDD0}-\\u{FDEF}\\u{FFFE}\\u{FFFF}\\u{1FFFE}\\u{1FFFF}\\u{2FFFE}\\u{2FFFF}\\u{3FFFE}\\u{3FFFF}\\u{4FFFE}\\u{4FFFF}\\u{5FFFE}\\u{5FFFF}\\u{6FFFE}\\u{6FFFF}\\u{7FFFE}\\u{7FFFF}\\u{8FFFE}\\u{8FFFF}\\u{9FFFE}\\u{9FFFF}\\u{AFFFE}\\u{AFFFF}\\u{BFFFE}\\u{BFFFF}\\u{CFFFE}\\u{CFFFF}\\u{DFFFE}\\u{DFFFF}\\u{EFFFE}\\u{EFFFF}\\u{FFFFE}\\u{FFFFF}\\u{10FFFE}\\u{10FFFF}]/u;\n// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n// https://infra.spec.whatwg.org/#noncharacter\nfunction spread(args, attrs_to_add) {\n const attributes = Object.assign({}, ...args);\n if (attrs_to_add) {\n const classes_to_add = attrs_to_add.classes;\n const styles_to_add = attrs_to_add.styles;\n if (classes_to_add) {\n if (attributes.class == null) {\n attributes.class = classes_to_add;\n }\n else {\n attributes.class += ' ' + classes_to_add;\n }\n }\n if (styles_to_add) {\n if (attributes.style == null) {\n attributes.style = style_object_to_string(styles_to_add);\n }\n else {\n attributes.style = style_object_to_string(merge_ssr_styles(attributes.style, styles_to_add));\n }\n }\n }\n let str = '';\n Object.keys(attributes).forEach(name => {\n if (invalid_attribute_name_character.test(name))\n return;\n const value = attributes[name];\n if (value === true)\n str += ' ' + name;\n else if (boolean_attributes.has(name.toLowerCase())) {\n if (value)\n str += ' ' + name;\n }\n else if (value != null) {\n str += ` ${name}=\"${value}\"`;\n }\n });\n return str;\n}\nfunction merge_ssr_styles(style_attribute, style_directive) {\n const style_object = {};\n for (const individual_style of style_attribute.split(';')) {\n const colon_index = individual_style.indexOf(':');\n const name = individual_style.slice(0, colon_index).trim();\n const value = individual_style.slice(colon_index + 1).trim();\n if (!name)\n continue;\n style_object[name] = value;\n }\n for (const name in style_directive) {\n const value = style_directive[name];\n if (value) {\n style_object[name] = value;\n }\n else {\n delete style_object[name];\n }\n }\n return style_object;\n}\nconst ATTR_REGEX = /[&\"]/g;\nconst CONTENT_REGEX = /[&<]/g;\n/**\n * Note: this method is performance sensitive and has been optimized\n * https://github.com/sveltejs/svelte/pull/5701\n */\nfunction escape(value, is_attr = false) {\n const str = String(value);\n const pattern = is_attr ? ATTR_REGEX : CONTENT_REGEX;\n pattern.lastIndex = 0;\n let escaped = '';\n let last = 0;\n while (pattern.test(str)) {\n const i = pattern.lastIndex - 1;\n const ch = str[i];\n escaped += str.substring(last, i) + (ch === '&' ? '&amp;' : (ch === '\"' ? '&quot;' : '&lt;'));\n last = i + 1;\n }\n return escaped + str.substring(last);\n}\nfunction escape_attribute_value(value) {\n // keep booleans, null, and undefined for the sake of `spread`\n const should_escape = typeof value === 'string' || (value && typeof value === 'object');\n return should_escape ? escape(value, true) : value;\n}\nfunction escape_object(obj) {\n const result = {};\n for (const key in obj) {\n result[key] = escape_attribute_value(obj[key]);\n }\n return result;\n}\nfunction each(items, fn) {\n let str = '';\n for (let i = 0; i < items.length; i += 1) {\n str += fn(items[i], i);\n }\n return str;\n}\nconst missing_component = {\n $$render: () => ''\n};\nfunction validate_component(component, name) {\n if (!component || !component.$$render) {\n if (name === 'svelte:component')\n name += ' this={...}';\n throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules. Otherwise you may need to fix a <${name}>.`);\n }\n return component;\n}\nfunction debug(file, line, column, values) {\n console.log(`{@debug} ${file ? file + ' ' : ''}(${line}:${column})`); // eslint-disable-line no-console\n console.log(values); // eslint-disable-line no-console\n return '';\n}\nlet on_destroy;\nfunction create_ssr_component(fn) {\n function $$render(result, props, bindings, slots, context) {\n const parent_component = current_component;\n const $$ = {\n on_destroy,\n context: new Map(context || (parent_component ? parent_component.$$.context : [])),\n // these will be immediately discarded\n on_mount: [],\n before_update: [],\n after_update: [],\n callbacks: blank_object()\n };\n set_current_component({ $$ });\n const html = fn(result, props, bindings, slots);\n set_current_component(parent_component);\n return html;\n }\n return {\n render: (props = {}, { $$slots = {}, context = new Map() } = {}) => {\n on_destroy = [];\n const result = { title: '', head: '', css: new Set() };\n const html = $$render(result, props, {}, $$slots, context);\n run_all(on_destroy);\n return {\n html,\n css: {\n code: Array.from(result.css).map(css => css.code).join('\\n'),\n map: null // TODO\n },\n head: result.title + result.head\n };\n },\n $$render\n };\n}\nfunction add_attribute(name, value, boolean) {\n if (value == null || (boolean && !value))\n return '';\n const assignment = (boolean && value === true) ? '' : `=\"${escape(value, true)}\"`;\n return ` ${name}${assignment}`;\n}\nfunction add_classes(classes) {\n return classes ? ` class=\"${classes}\"` : '';\n}\nfunction style_object_to_string(style_object) {\n return Object.keys(style_object)\n .filter(key => style_object[key])\n .map(key => `${key}: ${escape_attribute_value(style_object[key])};`)\n .join(' ');\n}\nfunction add_styles(style_object) {\n const styles = style_object_to_string(style_object);\n return styles ? ` style=\"${styles}\"` : '';\n}\n\nfunction bind(component, name, callback) {\n const index = component.$$.props[name];\n if (index !== undefined) {\n component.$$.bound[index] = callback;\n callback(component.$$.ctx[index]);\n }\n}\nfunction create_component(block) {\n block && block.c();\n}\nfunction claim_component(block, parent_nodes) {\n block && block.l(parent_nodes);\n}\nfunction mount_component(component, target, anchor, customElement) {\n const { fragment, after_update } = component.$$;\n fragment && fragment.m(target, anchor);\n if (!customElement) {\n // onMount happens before the initial afterUpdate\n add_render_callback(() => {\n const new_on_destroy = component.$$.on_mount.map(run).filter(is_function);\n // if the component was destroyed immediately\n // it will update the `$$.on_destroy` reference to `null`.\n // the destructured on_destroy may still reference to the old array\n if (component.$$.on_destroy) {\n component.$$.on_destroy.push(...new_on_destroy);\n }\n else {\n // Edge case - component was destroyed immediately,\n // most likely as a result of a binding initialising\n run_all(new_on_destroy);\n }\n component.$$.on_mount = [];\n });\n }\n after_update.forEach(add_render_callback);\n}\nfunction destroy_component(component, detaching) {\n const $$ = component.$$;\n if ($$.fragment !== null) {\n flush_render_callbacks($$.after_update);\n run_all($$.on_destroy);\n $$.fragment && $$.fragment.d(detaching);\n // TODO null out other refs, including component.$$ (but need to\n // preserve final state?)\n $$.on_destroy = $$.fragment = null;\n $$.ctx = [];\n }\n}\nfunction make_dirty(component, i) {\n if (component.$$.dirty[0] === -1) {\n dirty_components.push(component);\n schedule_update();\n component.$$.dirty.fill(0);\n }\n component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));\n}\nfunction init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) {\n const parent_component = current_component;\n set_current_component(component);\n const $$ = component.$$ = {\n fragment: null,\n ctx: [],\n // state\n props,\n update: noop,\n not_equal,\n bound: blank_object(),\n // lifecycle\n on_mount: [],\n on_destroy: [],\n on_disconnect: [],\n before_update: [],\n after_update: [],\n context: new Map(options.context || (parent_component ? parent_component.$$.context : [])),\n // everything else\n callbacks: blank_object(),\n dirty,\n skip_bound: false,\n root: options.target || parent_component.$$.root\n };\n append_styles && append_styles($$.root);\n let ready = false;\n $$.ctx = instance\n ? instance(component, options.props || {}, (i, ret, ...rest) => {\n const value = rest.length ? rest[0] : ret;\n if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {\n if (!$$.skip_bound && $$.bound[i])\n $$.bound[i](value);\n if (ready)\n make_dirty(component, i);\n }\n return ret;\n })\n : [];\n $$.update();\n ready = true;\n run_all($$.before_update);\n // `false` as a special case of no DOM component\n $$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n if (options.target) {\n if (options.hydrate) {\n start_hydrating();\n const nodes = children(options.target);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.l(nodes);\n nodes.forEach(detach);\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.c();\n }\n if (options.intro)\n transition_in(component.$$.fragment);\n mount_component(component, options.target, options.anchor, options.customElement);\n end_hydrating();\n flush();\n }\n set_current_component(parent_component);\n}\nlet SvelteElement;\nif (typeof HTMLElement === 'function') {\n SvelteElement = class extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n connectedCallback() {\n const { on_mount } = this.$$;\n this.$$.on_disconnect = on_mount.map(run).filter(is_function);\n // @ts-ignore todo: improve typings\n for (const key in this.$$.slotted) {\n // @ts-ignore todo: improve typings\n this.appendChild(this.$$.slotted[key]);\n }\n }\n attributeChangedCallback(attr, _oldValue, newValue) {\n this[attr] = newValue;\n }\n disconnectedCallback() {\n run_all(this.$$.on_disconnect);\n }\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n // TODO should this delegate to addEventListener?\n if (!is_function(callback)) {\n return noop;\n }\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n };\n}\n/**\n * Base class for Svelte components. Used when dev=false.\n */\nclass SvelteComponent {\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n if (!is_function(callback)) {\n return noop;\n }\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n}\n\nfunction dispatch_dev(type, detail) {\n document.dispatchEvent(custom_event(type, Object.assign({ version: '3.59.2' }, detail), { bubbles: true }));\n}\nfunction append_dev(target, node) {\n dispatch_dev('SvelteDOMInsert', { target, node });\n append(target, node);\n}\nfunction append_hydration_dev(target, node) {\n dispatch_dev('SvelteDOMInsert', { target, node });\n append_hydration(target, node);\n}\nfunction insert_dev(target, node, anchor) {\n dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n insert(target, node, anchor);\n}\nfunction insert_hydration_dev(target, node, anchor) {\n dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n insert_hydration(target, node, anchor);\n}\nfunction detach_dev(node) {\n dispatch_dev('SvelteDOMRemove', { node });\n detach(node);\n}\nfunction detach_between_dev(before, after) {\n while (before.nextSibling && before.nextSibling !== after) {\n detach_dev(before.nextSibling);\n }\n}\nfunction detach_before_dev(after) {\n while (after.previousSibling) {\n detach_dev(after.previousSibling);\n }\n}\nfunction detach_after_dev(before) {\n while (before.nextSibling) {\n detach_dev(before.nextSibling);\n }\n}\nfunction listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation, has_stop_immediate_propagation) {\n const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : [];\n if (has_prevent_default)\n modifiers.push('preventDefault');\n if (has_stop_propagation)\n modifiers.push('stopPropagation');\n if (has_stop_immediate_propagation)\n modifiers.push('stopImmediatePropagation');\n dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers });\n const dispose = listen(node, event, handler, options);\n return () => {\n dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers });\n dispose();\n };\n}\nfunction attr_dev(node, attribute, value) {\n attr(node, attribute, value);\n if (value == null)\n dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute });\n else\n dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value });\n}\nfunction prop_dev(node, property, value) {\n node[property] = value;\n dispatch_dev('SvelteDOMSetProperty', { node, property, value });\n}\nfunction dataset_dev(node, property, value) {\n node.dataset[property] = value;\n dispatch_dev('SvelteDOMSetDataset', { node, property, value });\n}\nfunction set_data_dev(text, data) {\n data = '' + data;\n if (text.data === data)\n return;\n dispatch_dev('SvelteDOMSetData', { node: text, data });\n text.data = data;\n}\nfunction set_data_contenteditable_dev(text, data) {\n data = '' + data;\n if (text.wholeText === data)\n return;\n dispatch_dev('SvelteDOMSetData', { node: text, data });\n text.data = data;\n}\nfunction set_data_maybe_contenteditable_dev(text, data, attr_value) {\n if (~contenteditable_truthy_values.indexOf(attr_value)) {\n set_data_contenteditable_dev(text, data);\n }\n else {\n set_data_dev(text, data);\n }\n}\nfunction validate_each_argument(arg) {\n if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {\n let msg = '{#each} only iterates over array-like objects.';\n if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {\n msg += ' You can use a spread to convert this iterable into an array.';\n }\n throw new Error(msg);\n }\n}\nfunction validate_slots(name, slot, keys) {\n for (const slot_key of Object.keys(slot)) {\n if (!~keys.indexOf(slot_key)) {\n console.warn(`<${name}> received an unexpected slot \"${slot_key}\".`);\n }\n }\n}\nfunction validate_dynamic_element(tag) {\n const is_string = typeof tag === 'string';\n if (tag && !is_string) {\n throw new Error('<svelte:element> expects \"this\" attribute to be a string.');\n }\n}\nfunction validate_void_dynamic_element(tag) {\n if (tag && is_void(tag)) {\n console.warn(`<svelte:element this=\"${tag}\"> is self-closing and cannot have content.`);\n }\n}\nfunction construct_svelte_component_dev(component, props) {\n const error_message = 'this={...} of <svelte:component> should specify a Svelte component.';\n try {\n const instance = new component(props);\n if (!instance.$$ || !instance.$set || !instance.$on || !instance.$destroy) {\n throw new Error(error_message);\n }\n return instance;\n }\n catch (err) {\n const { message } = err;\n if (typeof message === 'string' && message.indexOf('is not a constructor') !== -1) {\n throw new Error(error_message);\n }\n else {\n throw err;\n }\n }\n}\n/**\n * Base class for Svelte components with some minor dev-enhancements. Used when dev=true.\n */\nclass SvelteComponentDev extends SvelteComponent {\n constructor(options) {\n if (!options || (!options.target && !options.$$inline)) {\n throw new Error(\"'target' is a required option\");\n }\n super();\n }\n $destroy() {\n super.$destroy();\n this.$destroy = () => {\n console.warn('Component was already destroyed'); // eslint-disable-line no-console\n };\n }\n $capture_state() { }\n $inject_state() { }\n}\n/**\n * Base class to create strongly typed Svelte components.\n * This only exists for typing purposes and should be used in `.d.ts` files.\n *\n * ### Example:\n *\n * You have component library on npm called `component-library`, from which\n * you export a component called `MyComponent`. For Svelte+TypeScript users,\n * you want to provide typings. Therefore you create a `index.d.ts`:\n * ```ts\n * import { SvelteComponentTyped } from \"svelte\";\n * export class MyComponent extends SvelteComponentTyped<{foo: string}> {}\n * ```\n * Typing this makes it possible for IDEs like VS Code with the Svelte extension\n * to provide intellisense and to use the component like this in a Svelte file\n * with TypeScript:\n * ```svelte\n * <script lang=\"ts\">\n * \timport { MyComponent } from \"component-library\";\n * </script>\n * <MyComponent foo={'bar'} />\n * ```\n *\n * #### Why not make this part of `SvelteComponent(Dev)`?\n * Because\n * ```ts\n * class ASubclassOfSvelteComponent extends SvelteComponent<{foo: string}> {}\n * const component: typeof SvelteComponent = ASubclassOfSvelteComponent;\n * ```\n * will throw a type error, so we need to separate the more strictly typed class.\n */\nclass SvelteComponentTyped extends SvelteComponentDev {\n constructor(options) {\n super(options);\n }\n}\nfunction loop_guard(timeout) {\n const start = Date.now();\n return () => {\n if (Date.now() - start > timeout) {\n throw new Error('Infinite loop detected');\n }\n };\n}\n\nexport { HtmlTag, HtmlTagHydration, ResizeObserverSingleton, SvelteComponent, SvelteComponentDev, SvelteComponentTyped, SvelteElement, action_destroyer, add_attribute, add_classes, add_flush_callback, add_iframe_resize_listener, add_location, add_render_callback, add_styles, add_transform, afterUpdate, append, append_dev, append_empty_stylesheet, append_hydration, append_hydration_dev, append_styles, assign, attr, attr_dev, attribute_to_object, beforeUpdate, bind, binding_callbacks, blank_object, bubble, check_outros, children, claim_comment, claim_component, claim_element, claim_html_tag, claim_space, claim_svg_element, claim_text, clear_loops, comment, component_subscribe, compute_rest_props, compute_slots, construct_svelte_component, construct_svelte_component_dev, contenteditable_truthy_values, createEventDispatcher, create_animation, create_bidirectional_transition, create_component, create_in_transition, create_out_transition, create_slot, create_ssr_component, current_component, custom_event, dataset_dev, debug, destroy_block, destroy_component, destroy_each, detach, detach_after_dev, detach_before_dev, detach_between_dev, detach_dev, dirty_components, dispatch_dev, each, element, element_is, empty, end_hydrating, escape, escape_attribute_value, escape_object, exclude_internal_props, fix_and_destroy_block, fix_and_outro_and_destroy_block, fix_position, flush, flush_render_callbacks, getAllContexts, getContext, get_all_dirty_from_scope, get_binding_group_value, get_current_component, get_custom_elements_slots, get_root_for_style, get_slot_changes, get_spread_object, get_spread_update, get_store_value, globals, group_outros, handle_promise, hasContext, has_prop, head_selector, identity, init, init_binding_group, init_binding_group_dynamic, insert, insert_dev, insert_hydration, insert_hydration_dev, intros, invalid_attribute_name_character, is_client, is_crossorigin, is_empty, is_function, is_promise, is_void, listen, listen_dev, loop, loop_guard, merge_ssr_styles, missing_component, mount_component, noop, not_equal, now, null_to_empty, object_without_properties, onDestroy, onMount, once, outro_and_destroy_block, prevent_default, prop_dev, query_selector_all, raf, resize_observer_border_box, resize_observer_content_box, resize_observer_device_pixel_content_box, run, run_all, safe_not_equal, schedule_update, select_multiple_value, select_option, select_options, select_value, self, setContext, set_attributes, set_current_component, set_custom_element_data, set_custom_element_data_map, set_data, set_data_contenteditable, set_data_contenteditable_dev, set_data_dev, set_data_maybe_contenteditable, set_data_maybe_contenteditable_dev, set_dynamic_element_data, set_input_type, set_input_value, set_now, set_raf, set_store_value, set_style, set_svg_attributes, space, split_css_unit, spread, src_url_equal, start_hydrating, stop_immediate_propagation, stop_propagation, subscribe, svg_element, text, tick, time_ranges_to_array, to_number, toggle_class, transition_in, transition_out, trusted, update_await_block_branch, update_keyed_each, update_slot, update_slot_base, validate_component, validate_dynamic_element, validate_each_argument, validate_each_keys, validate_slots, validate_store, validate_void_dynamic_element, xlink_attr };\n","import { name } from \"../../package.json\";\n\nconst throwError = (message, context) => {\n message = [message].flat().join(\"\\n\");\n\n let error = `${name}:\\n\\n${message}`;\n\n if (context) {\n error += \"\\nThis context may be helpful:\\n\\n\";\n\n for (const [key, value] of Object.entries(context)) {\n error += ` - ${key}: ${JSON.stringify(value)}\\n`;\n }\n } else {\n error += \"\\n\";\n }\n\n throw new Error(error);\n};\n\nexport default throwError;\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import throwError from \"./throwError\";\nimport { validate as isValidUuid } from \"uuid\";\n\nconst initiators = [\"user\", \"media\", \"browser\", \"media-session-api\", \"google-ima-sdk\", \"websocket\"];\nconst emitters = [\"inline-player\", \"bottom-widget\", \"segment\", \"segment-widget\"];\nconst postStatuses = [\"handled\", \"ignored-due-to-advert\", \"ignored-due-to-scrubbing\"];\nconst analyticsTypes = [\"load\", \"play\", \"play_progress\", \"ad_link_click\"];\nconst deviceTypes = [\"phone\", \"tablet\", \"desktop\"];\nconst mediaTypes = [\"content\", \"ad\"];\n\nexport const validateEventBeforeCreation = (props) => {\n validateProperty(props, \"type\", s => isTitleCase(s));\n validateProperty(props, \"description\", s => s.length > 0);\n validateProperty(props, \"initiatedBy\", s => initiators.includes(s));\n};\n\nexport const validateEventBeforeProcessing = (props) => {\n validateProperty(props, \"type\", s => isTitleCase(s));\n validateProperty(props, \"description\", s => s.length > 0);\n validateProperty(props, \"initiatedBy\", s => initiators.includes(s));\n validateProperty(props, \"emittedFrom\", s => emitters.includes(s));\n validateProperty(props, \"id\", s => isValidUuid(s));\n validateProperty(props, \"createdAt\", s => isIsoDateString(s));\n validateProperty(props, \"status\", s => s === \"pending\");\n};\n\nexport const validateEventAfterProcessing = (props) => {\n validateProperty(props, \"type\", s => isTitleCase(s));\n validateProperty(props, \"description\", s => s.length > 0);\n validateProperty(props, \"initiatedBy\", s => initiators.includes(s));\n validateProperty(props, \"emittedFrom\", s => emitters.includes(s));\n validateProperty(props, \"id\", s => isValidUuid(s));\n validateProperty(props, \"createdAt\", s => isIsoDateString(s));\n validateProperty(props, \"status\", s => postStatuses.includes(s));\n validateProperty(props, \"changedProps\", o => typeof o === \"object\");\n validateProperty(props, \"processedAt\", s => isIsoDateString(s));\n};\n\nexport const validateAnalyticsEvent = (props) => { // ClickHouse Types:\n validateProperty(props, \"event_type\", s => analyticsTypes.includes(s)); // Enum\n validateProperty(props, \"device_type\", s => deviceTypes.includes(s)); // Enum\n validateProperty(props, \"media_type\", s => mediaTypes.includes(s)); // Enum\n validateProperty(props, \"content_id\", s => !s || isValidUuid(s)); // String\n validateProperty(props, \"project_id\", n => !n || n > 0); // Int64\n validateProperty(props, \"analytics_id\", n => !n || n > 0); // Int64\n validateProperty(props, \"ad_id\", n => !n || n > 0); // Int64\n validateProperty(props, \"media_id\", n => !n || n > 0); // Int64\n validateProperty(props, \"local_storage_id\", s => !s || isValidUuid(s)); // String\n validateProperty(props, \"listen_session_id\", s => !s || isValidUuid(s)); // UUID\n validateProperty(props, \"session_created_at\", n => n >= 0); // DateTime\n validateProperty(props, \"duration\", n => n >= 0); // Int32\n validateProperty(props, \"listen_length_percent\", n => n >= 0 && n <= 100); // Int32\n validateProperty(props, \"listen_length_seconds\", n => n >= 0); // Int32\n validateProperty(props, \"speed\", n => n >= 0); // Int32\n validateProperty(props, \"location\", s => s.length > 0); // Not currently stored\n validateProperty(props, \"referrer\", s => typeof s === \"string\"); // Not currently stored\n validateProperty(props, \"player_version\", s => s.length > 0); // Not currently stored\n validateProperty(props, \"player_npm_version\", s => s.length > 0); // Not currently stored\n};\n\nconst isTitleCase = (string) => {\n string = string || \"<invalid>\";\n\n const startsWithCapital = string[0] === string[0].toUpperCase();\n const hasNonAlphabetic = string.match(/[^a-zA-Z]/);\n\n return startsWithCapital && !hasNonAlphabetic;\n};\n\nconst isIsoDateString = (string) => {\n try {\n const date = new Date(Date.parse(string));\n return date.toISOString() === string;\n } catch (error) {\n return false;\n }\n};\n\nconst validateProperty = (props, name, validationFn) => {\n if (!Object.prototype.hasOwnProperty.call(props, name)) {\n throwError(`Invalid event: missing a '${name}' property`, props);\n }\n\n if (!validationFn(props[name])) {\n throwError(`Invalid event: '${name}: ${props[name]}' is invalid`, props);\n }\n};\n","import { validateEventBeforeCreation } from \"./eventValidation\";\nimport { v4 as randomUuid } from \"uuid\";\n\nconst newEvent = (props) => {\n validateEventBeforeCreation(props);\n\n const id = randomUuid();\n const createdAt = new Date().toISOString();\n const status = \"pending\";\n\n return { id, createdAt, status, ...props };\n};\n\nexport default newEvent;\n","const withQueryParams = (src, params = {}) => {\n let url;\n\n try { url = new URL(src); } catch (e) { return src; }\n const search = new URLSearchParams(url.search);\n\n for (const [key, value] of Object.entries(params)) {\n search.set(key, value);\n }\n\n url.search = search.toString();\n return url.toString();\n};\n\nexport default withQueryParams;\n","// Returns Google Ad Tag params for the specified 'advertConsent' property.\n// https://developers.google.com/interactive-media-ads/docs/sdks/html5/client-side/consent\n\nconst googleAdTagParams = (advertConsent, showingVideo) => {\n const isLocahost = window.location.hostname === \"localhost\";\n const params = {};\n\n // The player only supports linear adverts that interrupt content.\n // Adverts that are \"non-linear\" show over the top of content that is playing.\n params.vad_type = \"linear\";\n\n // Set the non-personalized advert flag which limits the ads that can play.\n // This will be set for 'non-personalized' and 'under-the-age-of-consent'.\n params.npa = advertConsent !== \"personalized\" ? 1 : 0;\n\n // Set the 'Tag For Users under the Age of Consent in Europe' flag.\n // In this case, npa=1 is implied but we set it explicitly above, anyway.\n params.tfua = advertConsent === \"under-the-age-of-consent\" ? 1 : 0;\n\n // If video is showing in either the inline player or the widget, request\n // video or audio adverts. Otherwise, only request audio adverts.\n params.ad_type = showingVideo ? \"audio_video\" : \"audio\";\n\n // On localhost, the Google IMA SDK does not set the url parameter when it\n // requests adverts which can result in no adverts being returned. Therefore,\n // use the url query parameter from the VAST URL if it is available, otherwise\n // fall back to a URL that is known to work, i.e. for testing VAST tags.\n if (isLocahost) { params.url ||= \"https://googleads.github.io\"; }\n\n // On localhost, fall back to a URL that is known to work for description_url.\n // Usually, this will already be provided as a query param in the VAST tag.\n if (isLocahost) { params.description_url ||= \"https://googleads.github.io\"; }\n\n // Otherwise, always set the description_url to the current page's address. Do not\n // fall back since we don't want to incorrectly report where ads are served from.\n // https://support.google.com/admanager/answer/10678356?hl=en#description_url\n if (!isLocahost) { params.description_url = window.location.href; }\n\n return params;\n};\n\nexport default googleAdTagParams;\n","const elementIsVisible = (element) => {\n if (!element) { return false; }\n\n const height = window.innerHeight || document.documentElement.clientHeight;\n const width = window.innerWidth || document.documentElement.clientWidth;\n\n const { top, bottom, left, right } = element.getBoundingClientRect();\n return top < height && bottom > 0 && left < width && right > 0;\n};\n\nexport default elementIsVisible;\n","<script>\n import newEvent from \"../helpers/newEvent\";\n import withQueryParams from \"../helpers/withQueryParams\";\n import googleAdTagParams from \"../helpers/googleAdTagParams\";\n import elementIsVisible from \"../helpers/elementIsVisible\";\n\n export let vastUrl;\n export let advertConsent;\n export let video;\n export let playbackState;\n export let duration;\n export let currentTime;\n export let onEvent = () => {};\n\n let adContainer;\n let adDisplayContainer;\n let adsLoader;\n let adsRequest;\n let adsManager;\n let adsLoaded;\n let adData;\n\n $: adParams = googleAdTagParams(advertConsent, elementIsVisible(video));\n $: adTagUrl = withQueryParams(vastUrl, adParams);\n\n $: adsManager && playbackState === \"playing\" && loadAds();\n $: adsManager, playbackState === \"playing\" ? adsManager?.resume() : adsManager?.pause();\n\n const initializeIMA = () => {\n adDisplayContainer = new google.ima.AdDisplayContainer(adContainer, video);\n\n adsLoader = new google.ima.AdsLoader(adDisplayContainer);\n adsLoader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false);\n adsLoader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false);\n\n adsRequest = new google.ima.AdsRequest();\n adsRequest.adTagUrl = adTagUrl;\n adsRequest.linearAdSlotWidth = video.clientWidth;\n adsRequest.linearAdSlotHeight = video.clientHeight;\n\n adsLoader.requestAds(adsRequest);\n };\n\n const onAdsManagerLoaded = (adsManagerLoadedEvent) => {\n adsManager = adsManagerLoadedEvent.getAdsManager(video);\n\n adsManager.addEventListener(google.ima.AdEvent.Type.AD_PROGRESS, onAdProgress);\n adsManager.addEventListener(google.ima.AdEvent.Type.CLICK, onClick);\n adsManager.addEventListener(google.ima.AdEvent.Type.PAUSED, onPaused);\n adsManager.addEventListener(google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested);\n adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError);\n };\n\n const loadAds = () => {\n if (adsLoaded) { return; }\n adsLoaded = true;\n\n video.pause();\n video.load();\n adDisplayContainer.initialize();\n\n try {\n adsManager.init(video.clientWidth, video.clientHeight, google.ima.ViewMode.NORMAL);\n adsManager.start();\n makeStylesImportant();\n onAnimationFrame();\n } catch (adError) {\n onAdError(null, adError);\n }\n };\n\n const onAdProgress = (adEvent) => {\n adData = adEvent.getAdData();\n adData.updatedAt = Date.now();\n\n onEvent(newEvent({\n type: \"CurrentTimeUpdated\",\n description: \"The media's current time was updated.\",\n initiatedBy: \"media\",\n }));\n\n if (duration === adData.duration) { return; }\n duration = adData.duration;\n\n onEvent(newEvent({\n type: \"DurationUpdated\",\n description: \"The media's duration was updated.\",\n initiatedBy: \"google-ima-sdk\",\n }));\n };\n\n const onClick = () => {\n onEvent(newEvent({\n type: \"PressedAdvertVideo\",\n description: \"The video background was pressed to open the advert in a new tab.\",\n initiatedBy: \"user\",\n }));\n };\n\n const onPaused = () => {\n if (playbackState === \"paused\") { return; }\n playbackState = \"paused\";\n\n onEvent(newEvent({\n type: \"PlaybackPaused\",\n description: \"The media became paused at its current playback time.\",\n initiatedBy: \"google-ima-sdk\",\n }));\n };\n\n const onContentResumeRequested = () => {\n onEvent(newEvent({\n type: \"PlaybackEnded\",\n description: \"The media finished playing because it reached the end.\",\n initiatedBy: \"google-ima-sdk\",\n }));\n };\n\n const onAdError = (adEvent, adError) => {\n adError = adError || adEvent.getError();\n adsManager?.destroy();\n\n onEvent(newEvent({\n type: \"PlaybackErrored\",\n description: \"The media failed to play.\",\n initiatedBy: \"google-ima-sdk\",\n mediaType: \"VAST\",\n mediaUrl: adTagUrl,\n errorMessage: `${adError.getMessage()} (code=${adError.getErrorCode()})`,\n }));\n };\n\n const onScriptError = () => {\n onEvent(newEvent({\n type: \"PlaybackErrored\",\n description: \"The media failed to play.\",\n initiatedBy: \"browser\",\n mediaType: \"VAST\",\n mediaUrl: adTagUrl,\n errorMessage: \"The ima3.js script was blocked.\",\n }));\n };\n\n const makeStylesImportant = () => {\n const walker = document.createTreeWalker(adContainer);\n let node;\n\n while ((node = walker.nextNode())) {\n const cssRegex = /;(?!([^()]*\\([^()]*\\))*[^()]*\\))/; // Match semicolons not inside parentheses.\n\n const rules = node.style.cssText.split(cssRegex).filter(s => s);\n const styles = rules.map(s => s.includes(\"!important\") ? s : `${s} !important`);\n\n node.style.cssText = styles.join(\";\");\n }\n };\n\n const onAnimationFrame = () => {\n if (!adContainer) { return; }\n\n currentTime = smoothedCurrentTime();\n adsManager.resize(video.clientWidth, video.clientHeight, google.ima.ViewMode.NORMAL);\n requestAnimationFrame(onAnimationFrame);\n };\n\n const smoothedCurrentTime = () => {\n if (!adData) { return 0; }\n\n if (playbackState === \"playing\") {\n const elapsed = (Date.now() - adData.updatedAt) / 1000;\n return adData.currentTime + elapsed;\n } else {\n adData.updatedAt = Date.now();\n return currentTime;\n }\n };\n</script>\n\n<svelte:head>\n <script on:load={initializeIMA} on:error={onScriptError} src=\"https://imasdk.googleapis.com/js/sdkloader/ima3.js\"></script>\n</svelte:head>\n\n<div class=\"vast-container\" bind:this={adContainer}></div>\n","import elementIsVisible from \"./elementIsVisible\";\n\nconst orderedMediaSources = (mediaObject, videoElement) => {\n if (!mediaObject) { return []; }\n\n const audio = (mediaObject.audio || []).map(s => ({ ...s, format: \"audio\" }));\n const video = (mediaObject.video || []).map(s => ({ ...s, format: \"video\" }));\n\n if (elementIsVisible(videoElement)) {\n return [...video, ...audio];\n } else {\n return [...audio, ...video];\n }\n};\n\nexport default orderedMediaSources;\n","const loadMedia = async (source, video, hls, onError, play, startPosition) => {\n if (!video) { return; }\n\n const prevPaused = video.paused;\n const prevRate = video.playbackRate;\n\n (await hls)?.detachMedia();\n (await hls)?.destroy();\n\n const isHls = (source || {}).contentType === \"application/x-mpegURL\";\n const nativeSupport = video.canPlayType(\"application/vnd.apple.mpegurl\");\n\n const Hls = isHls && !nativeSupport && (await loadHlsLibrary());\n const useLibraryHls = Hls?.isSupported?.();\n\n if (useLibraryHls) {\n hls = new Hls({ enableWorker: false, ...{ startPosition } });\n\n hls.on(Hls.Events.ERROR, onError);\n\n hls.loadSource(source.url);\n hls.attachMedia(video);\n } else {\n video.removeAttribute(\"src\");\n video.load();\n }\n\n if (!prevPaused) { play(); }\n video.playbackRate = prevRate;\n\n return hls;\n};\n\nlet Hls;\nconst loadHlsLibrary = async () => {\n if (Hls) { return Hls; }\n const previous = window.Hls;\n\n Hls ||= (await import(\"hls.js/dist/hls.light.min.js\")).default;\n Hls ||= window.Hls;\n\n window.Hls = previous;\n return Hls;\n};\n\nexport default loadMedia;\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Luister na hierdie artikel\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Tie asɛm yi\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"ይህን ጽሑፍ ያዳምጡ\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"استمع إلى هذا المقال\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"এই লেখাটো শুনক\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Bu məqaləyə qulaq asın\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Слухайце гэты артыкул\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Чуйте тази статия\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Aw ye nin barokun lamɛn\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"এই নিবন্ধটি শুনুন\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Poslušajte ovaj članak\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Escolta aquest article\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"گوێ لەم بابەتە بگرن\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Poslechněte si tento článek\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Gwrandewch ar yr erthygl hon\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Lyt til denne artikel\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Hören Sie sich diesen Artikel an\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Se nyati sia ɖa\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Ακούστε αυτό το άρθρο\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Listen to this article\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Aŭskultu ĉi tiun artikolon\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Escucha este artículo\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Kuulake seda artiklit\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Entzun artikulu hau\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"به این مقاله گوش دهید\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Kuuntele tämä artikkeli\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Makinig sa artikulong ito\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Écoutez cet article\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Éist leis an alt seo\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Èist ris an artaigil seo\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Escoita este artigo\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"આ લેખ સાંભળો\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Saurari wannan labarin\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"E hoʻolohe i kēia ʻatikala\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"האזינו למאמר הזה\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"इस लेख को सुनें\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Poslušajte ovaj članak\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Hallgassa meg ezt a cikket\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Լսեք այս հոդվածը\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Dengarkan artikel ini\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Gee akụkọ a\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Hlustaðu á þessa grein\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Ascolta questo articolo\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"האזינו למאמר הזה\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"この記事を聞く\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"მოუსმინეთ ამ სტატიას\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Бұл мақаланы тыңдаңыз\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"សូមស្តាប់អត្ថបទនេះ។\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"ಈ ಲೇಖನವನ್ನು ಆಲಿಸಿ\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"이 기사를 들어라\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Бул макаланы уккула\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Lauschtert dësen Artikel\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Wuliriza ekitundu kino\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Yoká lisolo oyo\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"ຟັງບົດຄວາມນີ້\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Klausykite šio straipsnio\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Klausieties šo rakstu\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Henoy ity lahatsoratra ity\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Слушајте ја оваа статија\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"ഈ ലേഖനം ശ്രദ്ധിക്കുക\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Энэ нийтлэлийг сонсоорой\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"हा लेख ऐका\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Dengar artikel ini\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Isma' dan l-artiklu\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"ဒီဆောင်းပါးကို နားထောင်ပါ။\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Hør denne artikkelen\",\n\n // These translations are used by aria-label.\n playAudio: \"Spill av lyd\",\n pauseAudio: \"Sett lyden på pause\",\n scrubProgressBar: \"Scrub fremdriftslinje\",\n visitAdvert: \"Besøk annonsen\",\n visitBeyondWords: \"Besøk BeyondWords\",\n closeWidget: \"Lukk widget\",\n seekBack: \"Søk tilbake\",\n seekAhead: \"Søk fremover\",\n previousSegment: \"Forrige segment\",\n nextSegment: \"Neste segment\",\n previousTrack: \"Forrige spor\",\n nextTrack: \"Neste spor\",\n togglePlaylist: \"Bytt spilleliste\",\n visitSourceArticle: \"Besøk kildeartikkelen\",\n maximizeVideo: \"Maksimer videoen\",\n changePlaybackRate: \"Endre avspillingshastighet\",\n downloadAudio: \"Last ned lyd\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"यो लेख सुन्नुहोस्\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Luister naar dit artikel\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Hør denne artikkelen\",\n\n // These translations are used by aria-label.\n playAudio: \"Spill av lyd\",\n pauseAudio: \"Sett lyden på pause\",\n scrubProgressBar: \"Scrub fremdriftslinje\",\n visitAdvert: \"Besøk annonsen\",\n visitBeyondWords: \"Besøk BeyondWords\",\n closeWidget: \"Lukk widget\",\n seekBack: \"Søk tilbake\",\n seekAhead: \"Søk fremover\",\n previousSegment: \"Forrige segment\",\n nextSegment: \"Neste segment\",\n previousTrack: \"Forrige spor\",\n nextTrack: \"Neste spor\",\n togglePlaylist: \"Bytt spilleliste\",\n visitSourceArticle: \"Besøk kildeartikkelen\",\n maximizeVideo: \"Maksimer videoen\",\n changePlaybackRate: \"Endre avspillingshastighet\",\n downloadAudio: \"Last ned lyd\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Hør denne artikkelen\",\n\n // These translations are used by aria-label.\n playAudio: \"Spill av lyd\",\n pauseAudio: \"Sett lyden på pause\",\n scrubProgressBar: \"Scrub fremdriftslinje\",\n visitAdvert: \"Besøk annonsen\",\n visitBeyondWords: \"Besøk BeyondWords\",\n closeWidget: \"Lukk widget\",\n seekBack: \"Søk tilbake\",\n seekAhead: \"Søk fremover\",\n previousSegment: \"Forrige segment\",\n nextSegment: \"Neste segment\",\n previousTrack: \"Forrige spor\",\n nextTrack: \"Neste spor\",\n togglePlaylist: \"Bytt spilleliste\",\n visitSourceArticle: \"Besøk kildeartikkelen\",\n maximizeVideo: \"Maksimer videoen\",\n changePlaybackRate: \"Endre avspillingshastighet\",\n downloadAudio: \"Last ned lyd\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Barreeffama kana dhaggeeffadhaa\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"ଏହି ଲେଖା ଶୁଣ |\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"ਇਸ ਲੇਖ ਨੂੰ ਸੁਣੋ\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Posłuchaj tego artykułu\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"دا لیکنه واورئ\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Ouça este artigo\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Kay qillqasqata uyariy\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Ascultă acest articol\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Прослушать эту статью\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Umva iyi ngingo\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"මෙම ලිපියට සවන් දෙන්න\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Vypočujte si tento článok\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Poslušajte ta članek\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Teerera kuchinyorwa ichi\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Dhageyso maqaalkan\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Dëgjoni këtë artikull\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Слушајте овај чланак\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Lyssna på den här artikeln\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Sikiliza makala hii\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"இந்தக் கட்டுரையைக் கேளுங்கள்\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"ఈ కథనాన్ని వినండి\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Ин мақоларо гӯш кунед\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"ฟังบทความนี้\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"ነዚ ጽሑፍ ስምዑዎ።\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Bu makaleyi dinle\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Бу мәкаләне тыңлагыз\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"بۇ ماقالىنى ئاڭلاڭ\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Послухайте цю статтю\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"اس مضمون کو سنیں۔\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Ushbu maqolani tinglang\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Nghe bài viết này\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"הערן צו דעם אַרטיקל\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Gbọ nkan yii\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n listenToThisArticle: \"聽這篇文章\",\n playAudio: \"Play audio\",\n\n // These translations are used by aria-label.\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n listenToThisArticle: \"聽這篇文章\",\n playAudio: \"Play audio\",\n\n // These translations are used by aria-label.\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n listenToThisArticle: \"聽這篇文章\",\n playAudio: \"Play audio\",\n\n // These translations are used by aria-label.\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"听这篇文章\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","export default {\n isDefaultForLanguage: true,\n listenToThisArticle: \"Lalela lesi sihloko\",\n\n // These translations are used by aria-label.\n playAudio: \"Play audio\",\n pauseAudio: \"Pause audio\",\n scrubProgressBar: \"Scrub progress bar\",\n visitAdvert: \"Visit advert\",\n visitBeyondWords: \"Visit BeyondWords\",\n closeWidget: \"Close widget\",\n seekBack: \"Seek back\",\n seekAhead: \"Seek ahead\",\n previousSegment: \"Previous segment\",\n nextSegment: \"Next segment\",\n previousTrack: \"Previous track\",\n nextTrack: \"Next track\",\n togglePlaylist: \"Toggle playlist\",\n visitSourceArticle: \"Visit source article\",\n maximizeVideo: \"Maximize video\",\n changePlaybackRate: \"Change playback rate\",\n downloadAudio: \"Download audio\",\n};\n","const basename = (path) => {\n const filename = path.split(\"/\").pop();\n const basename = filename.split(\".\")[0];\n\n return basename;\n};\n\nexport default basename;\n","import throwError from \"./throwError\";\n\nconst validateTranslations = (locales, languages) => {\n validateAtLeastOneDefault(locales, languages);\n validateAtMostOneDefault(locales);\n validateTranslationKeys(locales, languages);\n};\n\nconst validateAtLeastOneDefault = (locales, languages) => {\n for (const locale of Object.keys(locales)) {\n const language = locale.split(\"-\")[0];\n if (languages[language]) { continue; }\n\n throwError([\n `The language '${language}' has no default locale set. Should it be '${locale}' ?`,\n `If so, please set 'isDefaultForLanguage: true' in src/translations/${locale}.ts`\n ]);\n }\n};\n\nconst validateAtMostOneDefault = (locales) => {\n const defaults = {};\n\n for (const [locale, translations] of Object.entries(locales)) {\n const language = locale.split(\"-\")[0];\n if (!translations.isDefaultForLanguage) { continue; }\n\n defaults[language] ||= [];\n defaults[language].push(locale);\n }\n\n for (const [language, locales] of Object.entries(defaults)) {\n if (locales.length === 1) { continue; }\n\n throwError([\n `The language '${language}' has more than one default locale: ${locales.map(s => `'${s}'`).join(\", \")}`,\n \"Please ensure 'isDefaultForLanguage: true' is set in exactly one file.\",\n ]);\n }\n};\n\nconst validateTranslationKeys = (locales) => {\n const allKeys = Object.values(locales).map(Object.keys).flat();\n const uniqKeys = new Set(allKeys.filter(k => k !== \"isDefaultForLanguage\"));\n\n for (const [locale, translations] of Object.entries(locales)) {\n for (const key of uniqKeys) {\n if (translations[key]) { continue; }\n\n throwError([\n `The locale '${locale}' is missing the translation key '${key}'.`,\n `Please set '${key}: \"something\"' in src/translations/${locale}.ts`,\n ]);\n }\n }\n};\n\nexport default validateTranslations;\n","import basename from \"./basename\";\nimport validateTranslations from \"./validateTranslations\";\nimport throwError from \"./throwError\";\n\nconst modules = import.meta.glob(\"../translations/*\", { eager: true });\nconst pairs = Object.entries(modules).map(([k, v]) => [basename(k), v.default]);\n\nconst locales = Object.fromEntries(pairs.filter(([k, _]) => k.includes(\"-\")));\nconst languages = Object.fromEntries(pairs.filter(([_, v]) => v.isDefaultForLanguage).map(([k, v]) => [k.split(\"-\")[0], v]));\n\nvalidateTranslations(locales, languages);\n\nconst translate = (key, { locale } = {}) => {\n const translations = translationsForBrowserPreference(locale);\n\n if (!translations[key]) {\n throwError([\n `No translations found for the '${key}' translation key.`,\n `Please ensure '${key}: \"something\"' is set in src/translations/`,\n ]);\n }\n\n return translations[key];\n};\n\nconst translationsForBrowserPreference = (locale = null) => {\n const localesToTry = [locale, ...navigator.languages, \"en\"].filter(s => s);\n\n for (const locale of localesToTry) {\n const language = locale.split(\"-\")[0];\n\n // navigator.languages can return both locales (en-GB) and languages (en).\n // It doesn't mattter in this case because locales[\"en\"] will be undefined\n // and we're explicitly fetching the language translations separately below.\n\n if (locales[locale]) { return locales[locale]; }\n if (languages[language]) { return languages[language]; }\n }\n};\n\nexport default translate;\n","const blurElement = (event) => event.currentTarget.blur();\n\nexport default blurElement;\n","const findSegmentIndex = (segments, time) => {\n const nextIndex = segments.findIndex(s => s.startTime > time);\n const afterTheEnd = nextIndex === -1;\n\n const thisIndex = nextIndex - 1;\n const beforeTheStart = thisIndex === -1;\n\n if (beforeTheStart) {\n return 0;\n } else if (afterTheEnd) {\n return segments.length - 1;\n } else {\n return thisIndex;\n }\n};\n\nexport default findSegmentIndex;\n","const findLoadedMedia = (sources, videoElement) => {\n const source = sources.find(source => {\n const matchesUrl = source.url && videoElement?.currentSrc?.startsWith(source.url);\n const matchesHls = source.url?.endsWith(\".m3u8\") && videoElement?.currentSrc?.startsWith(\"blob:\");\n\n return matchesUrl || matchesHls;\n });\n\n if (!source) { console.warn(\"BeyondWords.Player: media was loaded but failed to set loadedMedia\"); }\n return source;\n};\n\nexport default findLoadedMedia;\n","<script>\n import { onMount } from \"svelte\";\n import VastContainer from \"./VastContainer.svelte\";\n import orderedMediaSources from \"../helpers/orderedMediaSources\";\n import loadMedia from \"../helpers/loadMedia\";\n import newEvent from \"../helpers/newEvent\";\n import translate from \"../helpers/translate\";\n import blurElement from \"../helpers/blurElement\";\n import findSegmentIndex from \"../helpers/findSegmentIndex\";\n import findLoadedMedia from \"../helpers/findLoadedMedia\";\n\n export let content;\n export let contentIndex;\n export let introOrOutro;\n export let activeAdvert;\n export let advertConsent;\n export let playbackState;\n export let duration;\n export let currentTime;\n export let playbackRate;\n export let prevPercentage;\n export let videoBehindWidget;\n export let videoBehindStatic;\n export let widgetPosition;\n export let widgetWidth;\n export let onEvent = () => {};\n export let video;\n\n let hls = null;\n let timeout;\n let time = 0;\n let loadCount = 0;\n let initialTime = currentTime;\n\n const setTime = (t) => time = t;\n const play = () => video?.play()?.catch(handlePlayError);\n\n $: !activeAdvert && setTime(currentTime);\n $: currentTime = time;\n\n $: contentItem = content[contentIndex];\n $: segments = contentItem?.segments || [];\n\n $: contentIndex, introOrOutro, activeAdvert, loadCount += 1;\n $: isFirstLoad = loadCount === 1;\n $: timeFragment = isFirstLoad ? `#t=${initialTime}` : \"\";\n\n $: mediaObject = introOrOutro;\n $: !introOrOutro && (mediaObject = activeAdvert);\n $: !introOrOutro && !activeAdvert && (mediaObject = contentItem);\n\n $: sources = orderedMediaSources(mediaObject, video);\n $: hls = loadMedia(sources[0], video, hls, handleHlsError, play, isFirstLoad && initialTime);\n\n $: vastUrl = activeAdvert?.vastUrl;\n $: customUrl = activeAdvert?.clickThroughUrl;\n\n $: sources, !vastUrl && (playbackState === \"playing\" ? play() : video?.pause());\n $: sources, prevPercentage = 0;\n\n $: position = videoBehindWidget && widgetPosition !== \"auto\" ? `fixed-${widgetPosition}` : \"\";\n $: style = videoBehindWidget ? `width: ${widgetWidth}` : \"\";\n\n $: atTheStart = playbackState === \"stopped\" && currentTime === 0;\n\n $: segmentIndex = introOrOutro || activeAdvert || atTheStart ? -1 : findSegmentIndex(segments, currentTime);\n $: segmentIndex, handleSegmentUpdate();\n\n $: videoBehindWidget && animate();\n\n const animate = () => {\n if (timeout) { clearTimeout(timeout); }\n timeout = setTimeout(() => timeout = null, 500);\n };\n\n const handlePlay = () => {\n onEvent(newEvent({\n type: \"PlaybackPlaying\",\n description: \"The media began playing from its current playback time.\",\n initiatedBy: \"media\",\n }));\n };\n\n const handlePause = () => {\n onEvent(newEvent({\n type: \"PlaybackPaused\",\n description: \"The media became paused at its current playback time.\",\n initiatedBy: \"media\",\n }));\n };\n\n const handleEnded = () => {\n onEvent(newEvent({\n type: \"PlaybackEnded\",\n description: \"The media finished playing because it reached the end.\",\n initiatedBy: \"media\",\n }));\n };\n\n const handleDurationChange = () => {\n onEvent(newEvent({\n type: \"DurationUpdated\",\n description: \"The media's duration was updated.\",\n initiatedBy: \"media\",\n }));\n };\n\n const handleLoadedData = () => {\n const loadedMedia = findLoadedMedia(sources, video);\n\n onEvent(newEvent({\n type: \"MediaLoaded\",\n description: \"The media finished loading its first frame of data.\",\n initiatedBy: \"media\",\n loadedMedia,\n }));\n };\n\n const handleTimeUpdate = () => {\n // Ensure the correct duration is sent to analytics for vast ads.\n if (vastUrl) { return; }\n\n onEvent(newEvent({\n type: \"CurrentTimeUpdated\",\n description: \"The media's current time was updated.\",\n initiatedBy: \"media\",\n }));\n };\n\n const handleSegmentUpdate = () => {\n onEvent(newEvent({\n type: \"CurrentSegmentUpdated\",\n description: \"The media's current segment was updated.\",\n initiatedBy: \"media\",\n segment: segments[segmentIndex],\n contentIndex,\n segmentIndex,\n }));\n };\n\n const handleRateChange = () => {\n onEvent(newEvent({\n type: \"PlaybackRateUpdated\",\n description: \"The media's playback rate was updated.\",\n initiatedBy: \"media\",\n }));\n };\n\n const handlePlayError = (error) => {\n if (error?.name !== \"NotAllowedError\") { throw error; }\n\n onEvent(newEvent({\n type: \"PlaybackNotAllowed\",\n description: \"The media cannot play because there was no user event.\",\n initiatedBy: \"media\",\n }));\n };\n\n const handleSourceError = (sourceIndex) => () => {\n const isLastSource = sourceIndex === sources.length - 1;\n if (!isLastSource) { return; }\n\n onEvent(newEvent({\n type: \"PlaybackErrored\",\n description: \"The media failed to play.\",\n initiatedBy: \"media\",\n mediaType: \"native\",\n mediaUrl: sources[0].url,\n errorMessage: \"The video tag contains sources but none are playable.\",\n }));\n };\n\n const handleHlsError = async (event, data) => {\n if (!data.fatal) { return; }\n\n (await hls)?.destroy();\n hls = null;\n\n onEvent(newEvent({\n type: \"PlaybackErrored\",\n description: \"The media failed to play.\",\n initiatedBy: \"media\",\n mediaType: \"HLS\",\n mediaUrl: sources[0].url,\n errorMessage: `${data.type} ${data.details}`,\n }));\n };\n\n const handleFullScreenChange = () => {\n onEvent(newEvent({\n type: \"FullScreenModeUpdated\",\n description: \"The browser entered or exited full screen mode.\",\n initiatedBy: \"browser\",\n }));\n };\n\n onMount(() => {\n const listener1 = addEventListener(\"fullscreenchange\", handleFullScreenChange);\n const listener2 = addEventListener(\"webkitfullscreenchange\", handleFullScreenChange);\n\n return () => {\n removeEventListener(\"fullscreenchange\", listener1);\n removeEventListener(\"fullscreenchange\", listener2);\n };\n });\n</script>\n\n<div class=\"media-element {position}\" class:animating={timeout} class:behind-static={videoBehindStatic} class:behind-widget={videoBehindWidget} {style}>\n <div class=\"inner\">\n <!-- svelte-ignore a11y-media-has-caption -->\n <video bind:this={video}\n bind:duration\n bind:currentTime={time}\n bind:playbackRate\n preload=\"metadata\"\n playsinline\n disablepictureinpicture\n on:play={handlePlay}\n on:pause={handlePause}\n on:ended={handleEnded}\n on:durationchange={handleDurationChange}\n on:loadeddata={handleLoadedData}\n on:timeupdate={handleTimeUpdate}\n on:ratechange={handleRateChange}>\n\n {#each sources as { url, contentType }, i}\n <source src={`${url}${timeFragment}`} type={contentType} on:error={handleSourceError(i)}>\n {/each}\n </video>\n\n {#if vastUrl}\n <VastContainer {onEvent} {vastUrl} {advertConsent} {video} bind:playbackState bind:duration bind:currentTime />\n {/if}\n\n {#if customUrl}\n <a class=\"custom-advert-link\" href={customUrl} target=\"_blank\" on:mouseup={blurElement} aria-label={translate(\"visitAdvert\")}>&nbsp;</a>\n {/if}\n </div>\n</div>\n\n<style>\n :global(.beyondwords-player) {\n position: relative;\n }\n\n .media-element {\n display: none;\n align-items: center;\n justify-content: center;\n background: black;\n border-radius: 8px;\n overflow: hidden;\n min-width: 300px;\n max-width: 720px;\n }\n\n .inner {\n width: 100%;\n height: 0;\n padding-bottom: 56.25%;\n position: relative;\n }\n\n .inner video {\n position: absolute;\n width: 100%;\n height: 100%;\n object-fit: contain;\n }\n\n .behind-static {\n display: flex;\n position: absolute;\n width: 100%;\n }\n\n .behind-widget {\n display: flex;\n position: fixed;\n width: 0;\n bottom: -100px /* ~!important */;\n right: 0;\n margin: 16px;\n animation: fly-widget 0.33s forwards;\n opacity: 0 /* ~!important */;\n z-index: 999;\n }\n\n .behind-widget:not(.animating) {\n bottom: 0;\n opacity: 1;\n }\n\n .fixed-left {\n right: auto;\n left: 0;\n }\n\n .fixed-center {\n left: 0;\n margin-left: auto;\n margin-right: auto;\n max-width: min(720px, 100% - 32px);\n }\n\n .custom-advert-link {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n text-decoration: none;\n }\n\n @keyframes fly-widget {\n from { bottom: -100px; opacity: 0; }\n to { bottom: 0; opacity: 1; }\n }\n\n :global(.beyondwords-player.maximized) {\n display: flex;\n align-items: center;\n background: black;\n }\n\n :global(.beyondwords-player.maximized) .media-element {\n max-width: none;\n border-radius: 0;\n }\n</style>\n","export { identity as linear } from '../internal/index.mjs';\n\n/*\nAdapted from https://github.com/mattdesl\nDistributed under MIT License https://github.com/mattdesl/eases/blob/master/LICENSE.md\n*/\nfunction backInOut(t) {\n const s = 1.70158 * 1.525;\n if ((t *= 2) < 1)\n return 0.5 * (t * t * ((s + 1) * t - s));\n return 0.5 * ((t -= 2) * t * ((s + 1) * t + s) + 2);\n}\nfunction backIn(t) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n}\nfunction backOut(t) {\n const s = 1.70158;\n return --t * t * ((s + 1) * t + s) + 1;\n}\nfunction bounceOut(t) {\n const a = 4.0 / 11.0;\n const b = 8.0 / 11.0;\n const c = 9.0 / 10.0;\n const ca = 4356.0 / 361.0;\n const cb = 35442.0 / 1805.0;\n const cc = 16061.0 / 1805.0;\n const t2 = t * t;\n return t < a\n ? 7.5625 * t2\n : t < b\n ? 9.075 * t2 - 9.9 * t + 3.4\n : t < c\n ? ca * t2 - cb * t + cc\n : 10.8 * t * t - 20.52 * t + 10.72;\n}\nfunction bounceInOut(t) {\n return t < 0.5\n ? 0.5 * (1.0 - bounceOut(1.0 - t * 2.0))\n : 0.5 * bounceOut(t * 2.0 - 1.0) + 0.5;\n}\nfunction bounceIn(t) {\n return 1.0 - bounceOut(1.0 - t);\n}\nfunction circInOut(t) {\n if ((t *= 2) < 1)\n return -0.5 * (Math.sqrt(1 - t * t) - 1);\n return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);\n}\nfunction circIn(t) {\n return 1.0 - Math.sqrt(1.0 - t * t);\n}\nfunction circOut(t) {\n return Math.sqrt(1 - --t * t);\n}\nfunction cubicInOut(t) {\n return t < 0.5 ? 4.0 * t * t * t : 0.5 * Math.pow(2.0 * t - 2.0, 3.0) + 1.0;\n}\nfunction cubicIn(t) {\n return t * t * t;\n}\nfunction cubicOut(t) {\n const f = t - 1.0;\n return f * f * f + 1.0;\n}\nfunction elasticInOut(t) {\n return t < 0.5\n ? 0.5 *\n Math.sin(((+13.0 * Math.PI) / 2) * 2.0 * t) *\n Math.pow(2.0, 10.0 * (2.0 * t - 1.0))\n : 0.5 *\n Math.sin(((-13.0 * Math.PI) / 2) * (2.0 * t - 1.0 + 1.0)) *\n Math.pow(2.0, -10.0 * (2.0 * t - 1.0)) +\n 1.0;\n}\nfunction elasticIn(t) {\n return Math.sin((13.0 * t * Math.PI) / 2) * Math.pow(2.0, 10.0 * (t - 1.0));\n}\nfunction elasticOut(t) {\n return (Math.sin((-13.0 * (t + 1.0) * Math.PI) / 2) * Math.pow(2.0, -10.0 * t) + 1.0);\n}\nfunction expoInOut(t) {\n return t === 0.0 || t === 1.0\n ? t\n : t < 0.5\n ? +0.5 * Math.pow(2.0, 20.0 * t - 10.0)\n : -0.5 * Math.pow(2.0, 10.0 - t * 20.0) + 1.0;\n}\nfunction expoIn(t) {\n return t === 0.0 ? t : Math.pow(2.0, 10.0 * (t - 1.0));\n}\nfunction expoOut(t) {\n return t === 1.0 ? t : 1.0 - Math.pow(2.0, -10.0 * t);\n}\nfunction quadInOut(t) {\n t /= 0.5;\n if (t < 1)\n return 0.5 * t * t;\n t--;\n return -0.5 * (t * (t - 2) - 1);\n}\nfunction quadIn(t) {\n return t * t;\n}\nfunction quadOut(t) {\n return -t * (t - 2.0);\n}\nfunction quartInOut(t) {\n return t < 0.5\n ? +8.0 * Math.pow(t, 4.0)\n : -8.0 * Math.pow(t - 1.0, 4.0) + 1.0;\n}\nfunction quartIn(t) {\n return Math.pow(t, 4.0);\n}\nfunction quartOut(t) {\n return Math.pow(t - 1.0, 3.0) * (1.0 - t) + 1.0;\n}\nfunction quintInOut(t) {\n if ((t *= 2) < 1)\n return 0.5 * t * t * t * t * t;\n return 0.5 * ((t -= 2) * t * t * t * t + 2);\n}\nfunction quintIn(t) {\n return t * t * t * t * t;\n}\nfunction quintOut(t) {\n return --t * t * t * t * t + 1;\n}\nfunction sineInOut(t) {\n return -0.5 * (Math.cos(Math.PI * t) - 1);\n}\nfunction sineIn(t) {\n const v = Math.cos(t * Math.PI * 0.5);\n if (Math.abs(v) < 1e-14)\n return 1;\n else\n return 1 - v;\n}\nfunction sineOut(t) {\n return Math.sin((t * Math.PI) / 2);\n}\n\nexport { backIn, backInOut, backOut, bounceIn, bounceInOut, bounceOut, circIn, circInOut, circOut, cubicIn, cubicInOut, cubicOut, elasticIn, elasticInOut, elasticOut, expoIn, expoInOut, expoOut, quadIn, quadInOut, quadOut, quartIn, quartInOut, quartOut, quintIn, quintInOut, quintOut, sineIn, sineInOut, sineOut };\n","import { cubicInOut, linear, cubicOut } from '../easing/index.mjs';\nimport { split_css_unit, is_function, assign } from '../internal/index.mjs';\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\nfunction __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\n\nfunction blur(node, { delay = 0, duration = 400, easing = cubicInOut, amount = 5, opacity = 0 } = {}) {\n const style = getComputedStyle(node);\n const target_opacity = +style.opacity;\n const f = style.filter === 'none' ? '' : style.filter;\n const od = target_opacity * (1 - opacity);\n const [value, unit] = split_css_unit(amount);\n return {\n delay,\n duration,\n easing,\n css: (_t, u) => `opacity: ${target_opacity - (od * u)}; filter: ${f} blur(${u * value}${unit});`\n };\n}\nfunction fade(node, { delay = 0, duration = 400, easing = linear } = {}) {\n const o = +getComputedStyle(node).opacity;\n return {\n delay,\n duration,\n easing,\n css: t => `opacity: ${t * o}`\n };\n}\nfunction fly(node, { delay = 0, duration = 400, easing = cubicOut, x = 0, y = 0, opacity = 0 } = {}) {\n const style = getComputedStyle(node);\n const target_opacity = +style.opacity;\n const transform = style.transform === 'none' ? '' : style.transform;\n const od = target_opacity * (1 - opacity);\n const [xValue, xUnit] = split_css_unit(x);\n const [yValue, yUnit] = split_css_unit(y);\n return {\n delay,\n duration,\n easing,\n css: (t, u) => `\n\t\t\ttransform: ${transform} translate(${(1 - t) * xValue}${xUnit}, ${(1 - t) * yValue}${yUnit});\n\t\t\topacity: ${target_opacity - (od * u)}`\n };\n}\nfunction slide(node, { delay = 0, duration = 400, easing = cubicOut, axis = 'y' } = {}) {\n const style = getComputedStyle(node);\n const opacity = +style.opacity;\n const primary_property = axis === 'y' ? 'height' : 'width';\n const primary_property_value = parseFloat(style[primary_property]);\n const secondary_properties = axis === 'y' ? ['top', 'bottom'] : ['left', 'right'];\n const capitalized_secondary_properties = secondary_properties.map((e) => `${e[0].toUpperCase()}${e.slice(1)}`);\n const padding_start_value = parseFloat(style[`padding${capitalized_secondary_properties[0]}`]);\n const padding_end_value = parseFloat(style[`padding${capitalized_secondary_properties[1]}`]);\n const margin_start_value = parseFloat(style[`margin${capitalized_secondary_properties[0]}`]);\n const margin_end_value = parseFloat(style[`margin${capitalized_secondary_properties[1]}`]);\n const border_width_start_value = parseFloat(style[`border${capitalized_secondary_properties[0]}Width`]);\n const border_width_end_value = parseFloat(style[`border${capitalized_secondary_properties[1]}Width`]);\n return {\n delay,\n duration,\n easing,\n css: t => 'overflow: hidden;' +\n `opacity: ${Math.min(t * 20, 1) * opacity};` +\n `${primary_property}: ${t * primary_property_value}px;` +\n `padding-${secondary_properties[0]}: ${t * padding_start_value}px;` +\n `padding-${secondary_properties[1]}: ${t * padding_end_value}px;` +\n `margin-${secondary_properties[0]}: ${t * margin_start_value}px;` +\n `margin-${secondary_properties[1]}: ${t * margin_end_value}px;` +\n `border-${secondary_properties[0]}-width: ${t * border_width_start_value}px;` +\n `border-${secondary_properties[1]}-width: ${t * border_width_end_value}px;`\n };\n}\nfunction scale(node, { delay = 0, duration = 400, easing = cubicOut, start = 0, opacity = 0 } = {}) {\n const style = getComputedStyle(node);\n const target_opacity = +style.opacity;\n const transform = style.transform === 'none' ? '' : style.transform;\n const sd = 1 - start;\n const od = target_opacity * (1 - opacity);\n return {\n delay,\n duration,\n easing,\n css: (_t, u) => `\n\t\t\ttransform: ${transform} scale(${1 - (sd * u)});\n\t\t\topacity: ${target_opacity - (od * u)}\n\t\t`\n };\n}\nfunction draw(node, { delay = 0, speed, duration, easing = cubicInOut } = {}) {\n let len = node.getTotalLength();\n const style = getComputedStyle(node);\n if (style.strokeLinecap !== 'butt') {\n len += parseInt(style.strokeWidth);\n }\n if (duration === undefined) {\n if (speed === undefined) {\n duration = 800;\n }\n else {\n duration = len / speed;\n }\n }\n else if (typeof duration === 'function') {\n duration = duration(len);\n }\n return {\n delay,\n duration,\n easing,\n css: (_, u) => `\n\t\t\tstroke-dasharray: ${len};\n\t\t\tstroke-dashoffset: ${u * len};\n\t\t`\n };\n}\nfunction crossfade(_a) {\n var { fallback } = _a, defaults = __rest(_a, [\"fallback\"]);\n const to_receive = new Map();\n const to_send = new Map();\n function crossfade(from_node, node, params) {\n const { delay = 0, duration = d => Math.sqrt(d) * 30, easing = cubicOut } = assign(assign({}, defaults), params);\n const from = from_node.getBoundingClientRect();\n const to = node.getBoundingClientRect();\n const dx = from.left - to.left;\n const dy = from.top - to.top;\n const dw = from.width / to.width;\n const dh = from.height / to.height;\n const d = Math.sqrt(dx * dx + dy * dy);\n const style = getComputedStyle(node);\n const transform = style.transform === 'none' ? '' : style.transform;\n const opacity = +style.opacity;\n return {\n delay,\n duration: is_function(duration) ? duration(d) : duration,\n easing,\n css: (t, u) => `\n\t\t\t\topacity: ${t * opacity};\n\t\t\t\ttransform-origin: top left;\n\t\t\t\ttransform: ${transform} translate(${u * dx}px,${u * dy}px) scale(${t + (1 - t) * dw}, ${t + (1 - t) * dh});\n\t\t\t`\n };\n }\n function transition(items, counterparts, intro) {\n return (node, params) => {\n items.set(params.key, node);\n return () => {\n if (counterparts.has(params.key)) {\n const other_node = counterparts.get(params.key);\n counterparts.delete(params.key);\n return crossfade(other_node, node, params);\n }\n // if the node is disappearing altogether\n // (i.e. wasn't claimed by the other list)\n // then we need to supply an outro\n items.delete(params.key);\n return fallback && fallback(node, params, intro);\n };\n };\n }\n return [\n transition(to_send, to_receive, false),\n transition(to_receive, to_send, true)\n ];\n}\n\nexport { blur, crossfade, draw, fade, fly, scale, slide };\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={40 * scale} height={40 * scale} viewBox=\"0.6667 0.6667 26.6667 26.6667\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M14 0.666748C6.63996 0.666748 0.666626 6.64008 0.666626 14.0001C0.666626 21.3601 6.63996 27.3334 14 27.3334C21.36 27.3334 27.3333 21.3601 27.3333 14.0001C27.3333 6.64008 21.36 0.666748 14 0.666748ZM11.3333 18.6667V9.33341C11.3333 8.78675 11.96 8.46675 12.4 8.80008L18.6266 13.4667C18.9866 13.7334 18.9866 14.2667 18.6266 14.5334L12.4 19.2001C11.96 19.5334 11.3333 19.2134 11.3333 18.6667Z\" />\n</svg>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={40 * scale} height={40 * scale} viewBox=\"0.6667 0.6667 26.6667 26.6667\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M14 0.666748C6.63996 0.666748 0.666626 6.64008 0.666626 14.0001C0.666626 21.3601 6.63996 27.3334 14 27.3334C21.36 27.3334 27.3333 21.3601 27.3333 14.0001C27.3333 6.64008 21.36 0.666748 14 0.666748ZM11.3333 19.3334C10.6 19.3334 9.99996 18.7334 9.99996 18.0001V10.0001C9.99996 9.26675 10.6 8.66675 11.3333 8.66675C12.0666 8.66675 12.6666 9.26675 12.6666 10.0001V18.0001C12.6666 18.7334 12.0666 19.3334 11.3333 19.3334ZM16.6666 19.3334C15.9333 19.3334 15.3333 18.7334 15.3333 18.0001V10.0001C15.3333 9.26675 15.9333 8.66675 16.6666 8.66675C17.4 8.66675 18 9.26675 18 10.0001V18.0001C18 18.7334 17.4 19.3334 16.6666 19.3334Z\" />\n</svg>\n","<script>\n import Play from \"../svg_icons/Play.svelte\";\n import Pause from \"../svg_icons/Pause.svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import blurElement from \"../../helpers/blurElement\";\n import translate from \"../../helpers/translate\";\n\n export let isPlaying = false;\n export let tabindex = 0;\n export let scale = 1;\n export let color = \"#323232\";\n export let onEvent = () => {};\n\n $: ariaLabel = isPlaying ? translate(\"pauseAudio\") : translate(\"playAudio\");\n\n const handleClick = (event) => {\n event.preventDefault();\n const name = isPlaying ? \"Pause\" : \"Play\";\n\n onEvent(newEvent({\n type: `Pressed${name}`,\n description: `The ${name.toLowerCase()} button was pressed.`,\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n<button type=\"button\" class=\"play-pause-button\" {tabindex} on:click={handleClick} on:mouseup={blurElement} style=\"outline-offset: {3.2 * scale}px\" aria-label={ariaLabel}>\n {#if isPlaying}\n <Pause {scale} {color} />\n {:else}\n <Play {scale} {color} />\n {/if}\n</button>\n\n<style>\n .play-pause-button {\n display: flex;\n cursor: pointer;\n position: relative;\n\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .play-pause-button:hover {\n opacity: 0.8;\n }\n }\n</style>\n","<script>\n import newEvent from \"../../helpers/newEvent\";\n import blurElement from \"../../helpers/blurElement\";\n import translate from \"../../helpers/translate\";\n\n export let rate = 1;\n export let scale = 1;\n export let color = \"#323232\";\n export let onEvent = () => {};\n\n $: size = `${40 * scale}px`;\n $: fontSize = `${12 * scale}px`;\n\n const handleClick = () => {\n onEvent(newEvent({\n type: \"PressedChangeRate\",\n description: \"The change playback rate button was pressed.\",\n initiatedBy: \"user\",\n }));\n };\n\n const handleKeyDown = (event) => {\n let key;\n\n if (event.key === \"ArrowLeft\") { key = \"Left\"; }\n if (event.key === \"ArrowRight\") { key = \"Right\"; }\n if (event.key === \"ArrowDown\") { key = \"Down\"; }\n if (event.key === \"ArrowUp\") { key = \"Up\"; }\n if (event.key === \" \") { key = \"Space\"; }\n if (event.key === \"Enter\") { key = \"Enter\"; }\n\n if (!key) { return; }\n event.preventDefault();\n\n onEvent(newEvent({\n type: `Pressed${key}OnChangeRate`,\n description: `The ${key.toLowerCase()} key was pressed while change playback rate was focussed.`,\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n<button type=\"button\" class=\"playback-rate-button\" style=\"width: {size}; height: {size}\" on:click={handleClick} on:mouseup={blurElement} on:keydown={handleKeyDown} aria-label={translate(\"changePlaybackRate\")}>\n <span style=\"font-size: {fontSize}; color: {color}\">{rate}x</span>\n</button>\n\n<style>\n .playback-rate-button {\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 600;\n cursor: pointer;\n\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .playback-rate-button:hover span {\n opacity: 0.7;\n }\n }\n</style>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n export let seconds = 10;\n</script>\n\n<svg width={40 * scale} height={40 * scale} viewBox=\"-5 -5 35 39\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M12.3035 28.3333C9.12574 28.3333 6.39796 27.2778 4.12019 25.1667C1.84241 23.0556 0.581297 20.4444 0.336852 17.3333C0.31463 17.0667 0.397963 16.8333 0.586852 16.6333C0.775741 16.4333 1.01463 16.3333 1.30352 16.3333C1.57019 16.3333 1.79796 16.4278 1.98685 16.6167C2.17574 16.8056 2.29241 17.0444 2.33685 17.3333C2.5813 19.8889 3.64796 22.0278 5.53685 23.75C7.42574 25.4722 9.6813 26.3333 12.3035 26.3333C15.0813 26.3333 17.4424 25.3611 19.3869 23.4167C21.3313 21.4722 22.3035 19.1111 22.3035 16.3333C22.3035 13.5556 21.3591 11.1944 19.4702 9.25C17.5813 7.30555 15.248 6.33333 12.4702 6.33333H11.7369L13.4702 8.06666C13.6702 8.26666 13.7702 8.5 13.7702 8.76666C13.7702 9.03333 13.6702 9.26666 13.4702 9.46666C13.2702 9.66666 13.0369 9.76666 12.7702 9.76666C12.5035 9.76666 12.2702 9.66666 12.0702 9.46666L8.57019 5.96666C8.45907 5.85555 8.3813 5.74444 8.33685 5.63333C8.29241 5.52222 8.27019 5.4 8.27019 5.26666C8.27019 5.13333 8.29241 5.01111 8.33685 4.9C8.3813 4.78889 8.45907 4.67777 8.57019 4.56666L12.1035 1.03333C12.2813 0.855551 12.5035 0.766663 12.7702 0.766663C13.0369 0.766663 13.2702 0.855551 13.4702 1.03333C13.648 1.23333 13.7369 1.46666 13.7369 1.73333C13.7369 2 13.648 2.22222 13.4702 2.4L11.5369 4.33333H12.3035C13.9702 4.33333 15.5313 4.64444 16.9869 5.26666C18.4424 5.88889 19.7146 6.74444 20.8035 7.83333C21.8924 8.92222 22.748 10.1944 23.3702 11.65C23.9924 13.1056 24.3035 14.6667 24.3035 16.3333C24.3035 18 23.9924 19.5611 23.3702 21.0167C22.748 22.4722 21.8924 23.7444 20.8035 24.8333C19.7146 25.9222 18.4424 26.7778 16.9869 27.4C15.5313 28.0222 13.9702 28.3333 12.3035 28.3333Z\" />\n <text fill={color} x=\"36%\" y=\"46%\" dominant-baseline=\"middle\" text-anchor=\"middle\">{seconds}</text>\n</svg>\n\n<style>\n text {\n font-size: 11.2px;\n font-weight: 600;\n }\n</style>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={40 * scale} height={40 * scale} viewBox=\"-12 -12 35 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M1.25 7.29901C0.249999 6.72166 0.250001 5.27828 1.25 4.70093L8.75 0.370802C9.75 -0.206548 11 0.51514 11 1.66984V10.3301C11 11.4848 9.75 12.2065 8.75 11.6291L1.25 7.29901Z\" />\n</svg>\n\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={40 * scale} height={40 * scale} viewBox=\"-10 -10 37 34\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M0 1C0 0.447716 0.447715 0 1 0C1.55228 0 2 0.447715 2 1V13C2 13.5523 1.55228 14 1 14C0.447715 14 0 13.5523 0 13V1Z\" />\n <path fill={color} d=\"M7.25 8.29904C6.25 7.72169 6.25 6.27831 7.25 5.70096L14.75 1.37083C15.75 0.793484 17 1.51517 17 2.66987V11.3301C17 12.4848 15.75 13.2065 14.75 12.6292L7.25 8.29904Z\" />\n</svg>\n","<script>\n import SeekBack from \"../svg_icons/SeekBack.svelte\";\n import PrevSegment from \"../svg_icons/PrevSegment.svelte\";\n import PrevTrack from \"../svg_icons/PrevTrack.svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import blurElement from \"../../helpers/blurElement\";\n import translate from \"../../helpers/translate\";\n\n export let style = \"segments\";\n export let scale = 1;\n export let color = \"#323232\";\n export let onEvent = () => {};\n let ariaLabel;\n\n $: backwardsSeconds = style.split(\"-\")[1] || 10;\n $: forwardsSeconds = style.split(\"-\")[2] || backwardsSeconds;\n\n $: isSegments = style === \"segments\";\n $: isSeconds = style.startsWith(\"seconds\");\n $: isTracks = style === \"tracks\";\n\n $: {\n if (isSeconds) {\n ariaLabel = translate(\"seekBack\");\n } else if (isSegments) {\n ariaLabel = translate(\"previousSegment\");\n } else if (isTracks) {\n ariaLabel = translate(\"previousTrack\");\n }\n }\n\n const handleClick = () => {\n let type, description, props;\n\n if (isSegments) {\n type = \"PressedPrevSegment\";\n description = \"The previous segment button was pressed.\";\n } else if (isSeconds) {\n type = \"PressedSeekBack\";\n description = \"The seek backward button was pressed.\";\n props = { seconds: backwardsSeconds };\n } else if (isTracks) {\n type = \"PressedPrevTrack\";\n description = \"The previous track button was pressed.\";\n }\n\n onEvent(newEvent({ type, description, initiatedBy: \"user\", ...props }));\n };\n</script>\n\n<button type=\"button\" class=\"prev-button\" on:click={handleClick} on:mouseup={blurElement} aria-label={ariaLabel}>\n {#if isSeconds}\n <SeekBack seconds={backwardsSeconds} {scale} {color} />\n {:else if isSegments}\n <PrevSegment {scale} {color} />\n {:else if isTracks}\n <PrevTrack {scale} {color} />\n {/if}\n</button>\n\n<style>\n .prev-button {\n display: flex;\n cursor: pointer;\n\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .prev-button:hover :global(svg) {\n opacity: 0.8;\n }\n }\n</style>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n export let seconds = 10;\n</script>\n\n<svg width={40 * scale} height={40 * scale} viewBox=\"-5 -5 35 39\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M12.5 28.3333C10.8333 28.3333 9.27222 28.0167 7.81667 27.3833C6.36111 26.75 5.09444 25.8944 4.01667 24.8167C2.93889 23.7389 2.08333 22.4722 1.45 21.0167C0.816667 19.5611 0.5 18 0.5 16.3333C0.5 14.6667 0.816667 13.1056 1.45 11.65C2.08333 10.1944 2.93889 8.92777 4.01667 7.85C5.09444 6.77222 6.36111 5.91666 7.81667 5.28333C9.27222 4.65 10.8333 4.33333 12.5 4.33333H13.2667L11.3333 2.4C11.1556 2.22222 11.0722 1.99444 11.0833 1.71666C11.0944 1.43888 11.1889 1.21111 11.3667 1.03333C11.5444 0.855551 11.7722 0.766663 12.05 0.766663C12.3278 0.766663 12.5556 0.855551 12.7333 1.03333L16.2333 4.56666C16.4333 4.76666 16.5333 5 16.5333 5.26666C16.5333 5.53333 16.4333 5.76666 16.2333 5.96666L12.7333 9.46666C12.5333 9.66666 12.2944 9.76666 12.0167 9.76666C11.7389 9.76666 11.5111 9.66666 11.3333 9.46666C11.1333 9.26666 11.0389 9.03333 11.05 8.76666C11.0611 8.5 11.1667 8.26666 11.3667 8.06666L13.1 6.33333H12.3333C9.57778 6.33333 7.25 7.30555 5.35 9.25C3.45 11.1944 2.5 13.5556 2.5 16.3333C2.5 19.1111 3.47222 21.4722 5.41667 23.4167C7.36111 25.3611 9.72222 26.3333 12.5 26.3333C15.0778 26.3333 17.3222 25.4722 19.2333 23.75C21.1444 22.0278 22.2222 19.8889 22.4667 17.3333C22.5111 17.0444 22.6278 16.8056 22.8167 16.6167C23.0056 16.4278 23.2333 16.3333 23.5 16.3333C23.7889 16.3333 24.0278 16.4333 24.2167 16.6333C24.4056 16.8333 24.4889 17.0667 24.4667 17.3333C24.2222 20.4667 22.95 23.0833 20.65 25.1833C18.35 27.2833 15.6333 28.3333 12.5 28.3333Z\" />\n <text fill={color} x=\"36%\" y=\"46%\" dominant-baseline=\"middle\" text-anchor=\"middle\">{seconds}</text>\n</svg>\n\n<style>\n text {\n font-size: 11.2px;\n font-weight: 600;\n }\n</style>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={40 * scale} height={40 * scale} viewBox=\"-12 -12 35 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M9.75 4.70093C10.75 5.27828 10.75 6.72166 9.75 7.29901L2.25 11.6291C1.25 12.2065 0 11.4848 0 10.3301V1.66984C0 0.515139 1.25 -0.206548 2.25 0.370802L9.75 4.70093Z\" />\n</svg>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={40 * scale} height={40 * scale} viewBox=\"-10 -10 37 34\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M17 13C17 13.5523 16.5523 14 16 14C15.4477 14 15 13.5523 15 13V1C15 0.447716 15.4477 0 16 0C16.5523 0 17 0.447715 17 1V13Z\" />\n <path fill={color} d=\"M9.75 5.70096C10.75 6.27831 10.75 7.72169 9.75 8.29904L2.25 12.6292C1.25 13.2065 0 12.4848 0 11.3301V2.66987C0 1.51517 1.25 0.793485 2.25 1.37083L9.75 5.70096Z\" />\n</svg>\n","<script>\n import SeekAhead from \"../svg_icons/SeekAhead.svelte\";\n import NextSegment from \"../svg_icons/NextSegment.svelte\";\n import NextTrack from \"../svg_icons/NextTrack.svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import blurElement from \"../../helpers/blurElement\";\n import translate from \"../../helpers/translate\";\n\n export let style = \"segments\";\n export let scale = 1;\n export let color = \"#323232\";\n export let onEvent = () => {};\n let ariaLabel;\n\n $: backwardsSeconds = parseFloat(style.split(\"-\")[1] || 10);\n $: forwardsSeconds = parseFloat(style.split(\"-\")[2] || backwardsSeconds);\n\n $: isSegments = style === \"segments\";\n $: isSeconds = style.startsWith(\"seconds\");\n $: isTracks = style === \"tracks\";\n\n $: {\n if (isSeconds) {\n ariaLabel = translate(\"seekAhead\");\n } else if (isSegments) {\n ariaLabel = translate(\"nextSegment\");\n } else if (isTracks) {\n ariaLabel = translate(\"nextTrack\");\n }\n }\n\n const handleClick = () => {\n let type, description, props;\n\n if (isSegments) {\n type = \"PressedNextSegment\";\n description = \"The next segment button was pressed.\";\n } else if (isSeconds) {\n type = \"PressedSeekAhead\";\n description = \"The seek ahead button was pressed.\";\n props = { seconds: forwardsSeconds };\n } else if (isTracks) {\n type = \"PressedNextTrack\";\n description = \"The next track button was pressed.\";\n }\n\n onEvent(newEvent({ type, description, initiatedBy: \"user\", ...props }));\n };\n</script>\n\n<button type=\"button\" class=\"next-button\" on:click={handleClick} on:mouseup={blurElement} aria-label={ariaLabel}>\n {#if isSeconds}\n <SeekAhead seconds={forwardsSeconds} {scale} {color} />\n {:else if isSegments}\n <NextSegment {scale} {color} />\n {:else if isTracks}\n <NextTrack {scale} {color} />\n {/if}\n</button>\n\n<style>\n .next-button {\n display: flex;\n cursor: pointer;\n\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .next-button:hover :global(svg) {\n opacity: 0.8;\n }\n }\n</style>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={20 * scale} height={20 * scale} viewBox=\"-0.6 -0.3 12 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M1.33332 1.33333C1.14443 1.33333 0.986101 1.26944 0.858323 1.14167C0.730545 1.01389 0.666656 0.855556 0.666656 0.666667C0.666656 0.477778 0.730545 0.319444 0.858323 0.191667C0.986101 0.0638889 1.14443 0 1.33332 0H7.99999C8.18888 0 8.34721 0.0638889 8.47499 0.191667C8.60277 0.319444 8.66666 0.477778 8.66666 0.666667C8.66666 0.855556 8.60277 1.01389 8.47499 1.14167C8.34721 1.26944 8.18888 1.33333 7.99999 1.33333H1.33332ZM1.33332 4C1.14443 4 0.986101 3.93611 0.858323 3.80833C0.730545 3.68056 0.666656 3.52222 0.666656 3.33333C0.666656 3.14444 0.730545 2.98611 0.858323 2.85833C0.986101 2.73056 1.14443 2.66667 1.33332 2.66667H7.99999C8.18888 2.66667 8.34721 2.73056 8.47499 2.85833C8.60277 2.98611 8.66666 3.14444 8.66666 3.33333C8.66666 3.52222 8.60277 3.68056 8.47499 3.80833C8.34721 3.93611 8.18888 4 7.99999 4H1.33332ZM1.33332 6.66667C1.14443 6.66667 0.986101 6.60278 0.858323 6.475C0.730545 6.34722 0.666656 6.18889 0.666656 6C0.666656 5.81111 0.730545 5.65278 0.858323 5.525C0.986101 5.39722 1.14443 5.33333 1.33332 5.33333H5.33332C5.52221 5.33333 5.68055 5.39722 5.80832 5.525C5.9361 5.65278 5.99999 5.81111 5.99999 6C5.99999 6.18889 5.9361 6.34722 5.80832 6.475C5.68055 6.60278 5.52221 6.66667 5.33332 6.66667H1.33332Z\" />\n\n <g transform=\"scale(1.05) translate(-1.7 0)\">\n <path fill={color} d=\"M10.3667 9.31667C10.1444 9.47222 9.91666 9.48333 9.68332 9.35C9.44999 9.21667 9.33332 9.01667 9.33332 8.75V5.91667C9.33332 5.65 9.44999 5.45 9.68332 5.31667C9.91666 5.18333 10.1444 5.19444 10.3667 5.35L12.5 6.78333C12.7 6.91667 12.8 7.1 12.8 7.33333C12.8 7.56667 12.7 7.75 12.5 7.88333L10.3667 9.31667Z\" />\n </g>\n</svg>\n\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={20 * scale} height={20 * scale} viewBox=\"-0.6 -0.3 12 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M1.33332 1.33333C1.14443 1.33333 0.986101 1.26944 0.858323 1.14167C0.730545 1.01389 0.666656 0.855556 0.666656 0.666667C0.666656 0.477778 0.730545 0.319444 0.858323 0.191667C0.986101 0.0638889 1.14443 0 1.33332 0H7.99999C8.18888 0 8.34721 0.0638889 8.47499 0.191667C8.60277 0.319444 8.66666 0.477778 8.66666 0.666667C8.66666 0.855556 8.60277 1.01389 8.47499 1.14167C8.34721 1.26944 8.18888 1.33333 7.99999 1.33333H1.33332ZM1.33332 4C1.14443 4 0.986101 3.93611 0.858323 3.80833C0.730545 3.68056 0.666656 3.52222 0.666656 3.33333C0.666656 3.14444 0.730545 2.98611 0.858323 2.85833C0.986101 2.73056 1.14443 2.66667 1.33332 2.66667H7.99999C8.18888 2.66667 8.34721 2.73056 8.47499 2.85833C8.60277 2.98611 8.66666 3.14444 8.66666 3.33333C8.66666 3.52222 8.60277 3.68056 8.47499 3.80833C8.34721 3.93611 8.18888 4 7.99999 4H1.33332ZM1.33332 6.66667C1.14443 6.66667 0.986101 6.60278 0.858323 6.475C0.730545 6.34722 0.666656 6.18889 0.666656 6C0.666656 5.81111 0.730545 5.65278 0.858323 5.525C0.986101 5.39722 1.14443 5.33333 1.33332 5.33333H5.33332C5.52221 5.33333 5.68055 5.39722 5.80832 5.525C5.9361 5.65278 5.99999 5.81111 5.99999 6C5.99999 6.18889 5.9361 6.34722 5.80832 6.475C5.68055 6.60278 5.52221 6.66667 5.33332 6.66667H1.33332Z\" />\n\n <g transform=\"translate(0.3 0)\">\n <path fill={color} d=\"M7.13333 10.2C7.01111 10.0778 6.95 9.92222 6.95 9.73333C6.95 9.54444 7.01111 9.38889 7.13333 9.26667L8.4 8L7.13333 6.73333C7.01111 6.61111 6.95 6.45555 6.95 6.26667C6.95 6.07778 7.01111 5.92222 7.13333 5.8C7.25556 5.67778 7.41111 5.61667 7.6 5.61667C7.78889 5.61667 7.94444 5.67778 8.06667 5.8L9.33333 7.06667L10.6 5.8C10.7222 5.67778 10.8778 5.61667 11.0667 5.61667C11.2556 5.61667 11.4111 5.67778 11.5333 5.8C11.6556 5.92222 11.7167 6.07778 11.7167 6.26667C11.7167 6.45555 11.6556 6.61111 11.5333 6.73333L10.2667 8L11.5333 9.26667C11.6556 9.38889 11.7167 9.54444 11.7167 9.73333C11.7167 9.92222 11.6556 10.0778 11.5333 10.2C11.4111 10.3222 11.2556 10.3833 11.0667 10.3833C10.8778 10.3833 10.7222 10.3222 10.6 10.2L9.33333 8.93333L8.06667 10.2C7.94444 10.3222 7.78889 10.3833 7.6 10.3833C7.41111 10.3833 7.25556 10.3222 7.13333 10.2Z\" />\n </g>\n</svg>\n","<script>\n import ShowPlaylist from \"../svg_icons/ShowPlaylist.svelte\";\n import HidePlaylist from \"../svg_icons/HidePlaylist.svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import blurElement from \"../../helpers/blurElement\";\n import translate from \"../../helpers/translate\";\n\n export let playlistShowing;\n export let playerStyle;\n export let scale = 1;\n export let color = \"#323232\";\n export let onEvent = () => {};\n\n const handleClick = () => {\n onEvent(newEvent({\n type: \"PressedTogglePlaylist\",\n description: \"The toggle playlist button was pressed.\",\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n<button type=\"button\" class=\"playlist-button {playerStyle}\" on:click={handleClick} on:mouseup={blurElement} style=\"outline-offset: {5 * scale}px\" aria-label={translate(\"togglePlaylist\")}>\n {#if playlistShowing}\n <HidePlaylist {scale} {color} />\n {:else}\n <ShowPlaylist {scale} {color} />\n {/if}\n</button>\n\n<style>\n .playlist-button {\n display: flex;\n cursor: pointer;\n\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n }\n\n .playlist-button.large {\n position: relative;\n left: 2px;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .playlist-button:hover {\n opacity: 0.7;\n }\n }\n</style>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={24 * scale} height={24 * scale} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M1.28571 24C0.914286 24 0.607143 23.8786 0.364286 23.6357C0.121429 23.3929 0 23.0857 0 22.7143V17.0143C0 16.6429 0.121429 16.3357 0.364286 16.0929C0.607143 15.85 0.914286 15.7286 1.28571 15.7286C1.65714 15.7286 1.96429 15.85 2.20714 16.0929C2.45 16.3357 2.57143 16.6429 2.57143 17.0143V21.4286H6.98571C7.35714 21.4286 7.66429 21.55 7.90714 21.7929C8.15 22.0357 8.27143 22.3429 8.27143 22.7143C8.27143 23.0857 8.15 23.3929 7.90714 23.6357C7.66429 23.8786 7.35714 24 6.98571 24H1.28571ZM1.28571 8.27143C0.914286 8.27143 0.607143 8.15 0.364286 7.90714C0.121429 7.66429 0 7.35714 0 6.98571V1.28571C0 0.914286 0.121429 0.607143 0.364286 0.364286C0.607143 0.121429 0.914286 0 1.28571 0H6.98571C7.35714 0 7.66429 0.121429 7.90714 0.364286C8.15 0.607143 8.27143 0.914286 8.27143 1.28571C8.27143 1.65714 8.15 1.96429 7.90714 2.20714C7.66429 2.45 7.35714 2.57143 6.98571 2.57143H2.57143V6.98571C2.57143 7.35714 2.45 7.66429 2.20714 7.90714C1.96429 8.15 1.65714 8.27143 1.28571 8.27143ZM17.0143 24C16.6429 24 16.3357 23.8786 16.0929 23.6357C15.85 23.3929 15.7286 23.0857 15.7286 22.7143C15.7286 22.3429 15.85 22.0357 16.0929 21.7929C16.3357 21.55 16.6429 21.4286 17.0143 21.4286H21.4286V17.0143C21.4286 16.6429 21.55 16.3357 21.7929 16.0929C22.0357 15.85 22.3429 15.7286 22.7143 15.7286C23.0857 15.7286 23.3929 15.85 23.6357 16.0929C23.8786 16.3357 24 16.6429 24 17.0143V22.7143C24 23.0857 23.8786 23.3929 23.6357 23.6357C23.3929 23.8786 23.0857 24 22.7143 24H17.0143ZM22.7143 8.27143C22.3429 8.27143 22.0357 8.15 21.7929 7.90714C21.55 7.66429 21.4286 7.35714 21.4286 6.98571V2.57143H17.0143C16.6429 2.57143 16.3357 2.45 16.0929 2.20714C15.85 1.96429 15.7286 1.65714 15.7286 1.28571C15.7286 0.914286 15.85 0.607143 16.0929 0.364286C16.3357 0.121429 16.6429 0 17.0143 0H22.7143C23.0857 0 23.3929 0.121429 23.6357 0.364286C23.8786 0.607143 24 0.914286 24 1.28571V6.98571C24 7.35714 23.8786 7.66429 23.6357 7.90714C23.3929 8.15 23.0857 8.27143 22.7143 8.27143Z\" />\n</svg>\n","<script>\n import Maximize from \"../svg_icons/Maximize.svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import blurElement from \"../../helpers/blurElement\";\n import translate from \"../../helpers/translate\";\n\n export let scale = 1;\n export let color = \"#323232\";\n export let onEvent = () => {};\n\n const handleClick = () => {\n onEvent(newEvent({\n type: \"PressedMaximize\",\n description: \"The maximize button was pressed.\",\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n<button type=\"button\" class=\"maximize-button\" on:click={handleClick} on:mouseup={blurElement} style=\"outline-offset: {6.4 * scale}px\" aria-label={translate(\"maximizeVideo\")}>\n <Maximize {scale} {color} />\n</button>\n\n<style>\n .maximize-button {\n display: flex;\n cursor: pointer;\n\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .maximize-button:hover {\n opacity: 0.8;\n }\n }\n</style>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={12 * scale} height={12 * scale} viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M1.66873 11.1188L0.881226 10.3313L5.21248 6.00001L0.881226 1.66876L1.66873 0.881256L5.99998 5.21251L10.3312 0.881256L11.1187 1.66876L6.78748 6.00001L11.1187 10.3313L10.3312 11.1188L5.99998 6.78751L1.66873 11.1188Z\" />\n</svg>\n","<script>\n import Close from \"../svg_icons/Close.svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import blurElement from \"../../helpers/blurElement\";\n import translate from \"../../helpers/translate\";\n\n export let scale = 1;\n export let color = \"#323232\";\n export let margin = \"auto\";\n export let onEvent = () => {};\n\n const handleClick = () => {\n onEvent(newEvent({\n type: \"PressedCloseWidget\",\n description: \"The close widget button was pressed.\",\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n<button type=\"button\" class=\"close-widget-button\" style=\"margin: {margin}; outline-offset: {4.8 * scale}px\" on:click={handleClick} on:mouseup={blurElement} aria-label={translate(\"closeWidget\")}>\n <Close {scale} {color} />\n</button>\n\n<style>\n .close-widget-button {\n display: flex;\n cursor: pointer;\n\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .close-widget-button:hover {\n opacity: 0.8;\n }\n }\n</style>\n","<script>\n import newEvent from \"../../helpers/newEvent\";\n import blurElement from \"../../helpers/blurElement\";\n\n export let href;\n export let scale = 1;\n export let color = \"#323232\";\n export let playerStyle;\n export let controlsOrder;\n export let largeImage;\n export let isMobile;\n export let onEvent = () => {};\n\n $: text = href && new URL(href).hostname;\n $: style = `font-size: ${12 * scale}px; color: ${color}; border-color: ${color}`;\n\n const handleClick = () => {\n onEvent(newEvent({\n type: \"PressedAdvertLink\",\n description: \"The advert link was pressed to open the click-through URL in a new tab.\",\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n<a class=\"advert-link {playerStyle} {controlsOrder}\" href={href} {style} class:no-image={!largeImage} class:mobile={isMobile} target=\"_blank\" on:click={handleClick} on:mouseup={blurElement}>\n {text || \"\"}\n</a>\n\n<style>\n a.advert-link {\n font-weight: 500;\n text-decoration: none;\n border-bottom-width: 1px;\n border-bottom-style: solid;\n white-space: nowrap;\n }\n\n .small {\n position: absolute;\n top: 4px;\n left: 44px;\n }\n\n .large {\n position: absolute;\n left: 96px;\n top: 8px;\n }\n\n .large.no-image {\n left: auto;\n }\n\n .screen {\n position: absolute;\n top: 236px;\n }\n\n .screen.no-image {\n top: 52px;\n }\n\n .screen.no-image.mobile {\n top: 100px;\n }\n\n a.video {\n margin-left: auto;\n margin-right: 0;\n }\n\n a.video.right-to-left {\n margin-left: 0;\n margin-right: auto;\n }\n</style>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n export let circular = true;\n</script>\n\n{#if circular}\n <svg width={40 * scale} height={40 * scale} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M20 0C8.96 0 0 8.96 0 20C0 31.04 8.96 40 20 40C31.04 40 40 31.04 40 20C40 8.96 31.04 0 20 0ZM23.76 19.08L15.26 27.58C14.48 28.36 13.22 28.36 12.44 27.58C11.66 26.8 11.66 25.54 12.44 24.76L20.94 16.26L18.4 13.72C17.76 13.08 18.22 12 19.1 12H26.98C27.54 12 27.98 12.44 27.98 13V20.88C27.98 21.78 26.9 22.22 26.28 21.58L23.76 19.08Z\" />\n </svg>\n{:else}\n <svg width={14 * scale} height={14 * scale} viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M30 32H6C4.9 32 4 31.1 4 30V6C4 4.9 4.9 4 6 4H16C17.1 4 18 3.1 18 2C18 0.9 17.1 0 16 0H4C1.78 0 0 1.8 0 4V32C0 34.2 1.8 36 4 36H32C34.2 36 36 34.2 36 32V20C36 18.9 35.1 18 34 18C32.9 18 32 18.9 32 20V30C32 31.1 31.1 32 30 32ZM22 2C22 3.1 22.9 4 24 4H29.18L10.92 22.26C10.14 23.04 10.14 24.3 10.92 25.08C11.7 25.86 12.96 25.86 13.74 25.08L32 6.82V12C32 13.1 32.9 14 34 14C35.1 14 36 13.1 36 12V2C36 0.9 35.1 0 34 0H24C22.9 0 22 0.9 22 2Z\" />\n </svg>\n{/if}\n","<script>\n import OpenNewTab from \"../svg_icons/OpenNewTab.svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import translate from \"../../helpers/translate\";\n import blurElement from \"../../helpers/blurElement\";\n\n export let href;\n export let scale = 1;\n export let color = \"#323232\";\n export let playerStyle;\n export let controlsOrder;\n export let onEvent = () => {};\n\n const handleClick = () => {\n if (!href) { return; }\n\n onEvent(newEvent({\n type: \"PressedAdvertButton\",\n description: \"The advert button was pressed to open the click-through URL in a new tab.\",\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n{#if href}\n <a class=\"advert-button {playerStyle} {controlsOrder}\" {href} target=\"_blank\" on:click={handleClick} style=\"outline-offset: {3.2 * scale}px\" on:mouseup={blurElement} aria-label={translate(\"visitAdvert\")}>\n <OpenNewTab {color} {scale} />\n </a>\n{:else}\n <div></div>\n{/if}\n\n<style>\n .advert-button {\n display: flex;\n }\n\n .screen {\n position: absolute;\n bottom: 40px;\n }\n\n .video {\n margin-left: auto;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .advert-button:hover :global(svg) {\n opacity: 0.8;\n }\n }\n</style>\n","<script>\n export let scale = 1;\n export let color1 = \"#933afb\";\n export let color2 = \"#fb3a41\";\n</script>\n\n<svg width={16 * scale} height={16 * scale} viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill=\"url(#gradient)\" d=\"M4.51819 0C3.20323 0.00414605 2.06058 0.402167 1.23154 1.23171C0.401171 2.06225 0.00315099 3.20622 0 4.52301V4.55435C0.00613614 7.21612 1.61729 10.5771 4.523 13.4826C6.55223 15.5125 8.90619 16.989 11.1512 17.6401C11.9816 17.8809 12.7653 18 13.4871 18C14.8315 18 15.9609 17.5859 16.7732 16.7738C18.0215 15.5255 18.3298 13.5286 17.6401 11.1512C16.9891 8.90638 15.5126 6.55259 13.4826 4.52284C10.5769 1.61679 7.2161 0.00597031 4.55417 0H4.51819ZM11.5084 16.4099C9.46706 15.818 7.30764 14.4566 5.42849 12.577C1.70684 8.85563 0.199673 4.07507 2.13703 2.13737C2.7125 1.56207 3.53856 1.29058 4.51354 1.29058C6.82123 1.29058 9.9611 2.81235 12.5771 5.42851C14.4569 7.308 15.8176 9.46709 16.41 11.5083C16.9634 13.4166 16.7709 14.9649 15.8677 15.8681C15.302 16.4331 14.4843 16.72 13.4841 16.72C12.8859 16.72 12.222 16.6172 11.5084 16.4099Z\" />\n <path fill=\"url(#gradient)\" d=\"M11.1483 0.360687C8.90517 1.01235 6.55252 2.48946 4.52328 4.5188C0.166276 8.87725 -1.28019 14.2587 1.23026 16.7697C2.06293 17.6026 3.21138 18 4.5339 18C7.19718 18 10.5655 16.3873 13.4767 13.4752C17.8334 9.11694 19.28 3.73601 16.7702 1.22481C15.9583 0.413305 14.8303 0 13.4865 0C12.7642 0 11.9795 0.11951 11.1483 0.360687ZM2.14341 15.856C1.24354 14.9563 1.05288 13.4115 1.60627 11.5066C2.19817 9.468 3.55852 7.31101 5.43692 5.43222C7.31433 3.55376 9.47084 2.19334 11.5085 1.60093C12.2231 1.39362 12.8867 1.29071 13.4845 1.29071C14.4808 1.29071 15.2947 1.57604 15.8566 2.13856C16.7563 3.0382 16.947 4.5832 16.3937 6.48756C15.8018 8.52586 14.4415 10.683 12.5632 12.562C9.94941 15.1771 6.8127 16.6998 4.50967 16.6998C3.53911 16.6998 2.71639 16.4293 2.14341 15.856Z\" />\n\n <defs>\n <linearGradient id=\"gradient\" x1=\"0\" y1=\"9\" x2=\"18\" y2=\"9\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color={color1} />\n <stop offset=\"1\" stop-color={color2} />\n </linearGradient>\n </defs>\n</svg>\n","<script>\n import Logo from \"../svg_icons/Logo.svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import translate from \"../../helpers/translate\";\n import blurElement from \"../../helpers/blurElement\";\n\n export let scale = 1;\n export let visible = true;\n export let onEvent = () => {};\n\n const handleClick = () => {\n onEvent(newEvent({\n type: \"PressedBeyondWords\",\n description: \"The BeyondWords logo was pressed to open the BeyondWords website in a new tab.\",\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n<a class=\"beyondwords\" href=\"https://beyondwords.io/\" target=\"_blank\" on:click={handleClick} class:visible style=\"outline-offset: {6.4 * scale}px\" on:mouseup={blurElement} aria-label={translate(\"visitBeyondWords\")}>\n <Logo {scale} />\n</a>\n\n<style>\n .beyondwords {\n display: flex;\n transition: opacity 0.5s;\n opacity: 0;\n }\n\n .visible {\n opacity: 1;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .beyondwords:hover {\n opacity: 0.8;\n transition: none;\n }\n }\n</style>\n","<script>\n import OpenNewTab from \"../svg_icons/OpenNewTab.svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import translate from \"../../helpers/translate\";\n import blurElement from \"../../helpers/blurElement\";\n\n export let href;\n export let scale = 1;\n export let color = \"#323232\";\n export let onEvent = () => {};\n\n const handleClick = () => {\n onEvent(newEvent({\n type: \"PressedSourceUrl\",\n description: \"The source URL button was pressed to open the source article in a new tab.\",\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n<a class=\"source-url-button\" href={href} target=\"_blank\" on:click={handleClick} on:mouseup={blurElement} aria-label={translate(\"visitSourceArticle\")}>\n <OpenNewTab {scale} {color} circular={false} />\n</a>\n\n<style>\n .source-url-button {\n display: flex;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .source-url-button:hover {\n opacity: 0.8;\n }\n }\n</style>\n","<script>\n import newEvent from \"../helpers/newEvent\";\n import translate from \"../helpers/translate\";\n import blurElement from \"../helpers/blurElement\";\n\n export let src;\n export let href;\n export let alt = \"Player Image\";\n export let scale = 1;\n export let onEvent = () => {};\n\n $: size = `${scale * 80}px`;\n\n const handleClick = () => {\n if (!href) { return; }\n\n onEvent(newEvent({\n type: \"PressedAdvertImage\",\n description: \"The advert image was pressed to open the click-through URL in a new tab.\",\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n<a class=\"large-image\" href={href ? href : null} target=\"_blank\" style=\"width: {size}; height: {size}\" on:click={handleClick} on:mouseup={blurElement} aria-label={translate(\"visitAdvert\")}>\n <img src={src} alt={alt} style=\"width: {size}; height: {size}\" />\n</a>\n\n<style>\n .large-image {\n background: rgba(0, 0, 0, 0.5);\n border-radius: 6px;\n overflow: hidden;\n grid-row: 1 / span 2;\n }\n</style>\n","<script>\n export let title;\n export let playerStyle;\n export let scale = 1;\n export let visible = true;\n export let collapsible = false;\n export let collapsed = false;\n export let color = \"#111\";\n\n let element;\n\n $: width = collapsed ? 0 : collapsible && element ? `${element.scrollWidth}px` : \"auto\";\n $: style = `font-size: ${12 * scale}px; visibility: ${visible ? \"visible\" : \"hidden\"}; width: ${width}; opacity: ${collapsed ? 0 : 1}; color: ${color}`;\n</script>\n\n<div class=\"player-title {playerStyle}\" {style} bind:this={element}>\n {@html title?.replaceAll(/<[^>]+>/gi, \"\") || \"\"}\n</div>\n\n<style>\n .player-title {\n font-weight: 500;\n line-height: 1.25;\n\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n\n transition: width 0.5s, opacity 0.25s;\n }\n\n .large {\n height: 15px;\n margin-bottom: 5px;\n }\n\n .standard,\n .small {\n flex-grow: 1;\n height: 32px;\n display: flex;\n }\n\n .screen {\n height: 30px;\n position: relative;\n bottom: 20px;\n }\n</style>\n","<script>\n export let title;\n export let maxLines = 1;\n export let maxWidth = undefined;\n\n export let center = false;\n export let bold = false;\n export let flex = \"0 1 auto\";\n export let scale = 1;\n export let color = \"#111\";\n\n $: fontSize = `${10 * scale}px`;\n $: maxHeight = `${10 * scale * 1.2 * maxLines}px`;\n $: maxWidthCss = maxWidth ? `max-width: ${maxWidth}px` : \"\";\n\n $: style = `--n: ${maxLines}; font-size: ${fontSize}; max-height: ${maxHeight}; flex: ${flex}; ${maxWidthCss}; color: ${color}`;\n</script>\n\n<div class=\"content-title\" class:bold class:one-line={maxLines === 1} class:center class:n-lines={maxLines > 1} {style}>\n {@html title?.replaceAll(/<[^>]+>/gi, \"\") || \"\"}\n</div>\n\n<style>\n .content-title {\n font-weight: 300;\n line-height: 1.2;\n text-overflow: ellipsis;\n overflow: hidden;\n min-width: 0;\n max-width: fit-content;\n }\n\n .one-line {\n white-space: nowrap;\n }\n\n .n-lines {\n display: -webkit-box;\n\n line-clamp: var(--n);\n -webkit-line-clamp: var(--n);\n -webkit-box-orient: vertical;\n }\n\n .bold {\n font-weight: 500;\n }\n\n .center {\n text-align: center;\n }\n</style>\n","import newEvent from \"../../helpers/newEvent\";\n\nconst handleKeyDown = (onEvent, kind) => (event) => {\n let key;\n\n if (event.key === \"ArrowLeft\") { key = \"Left\"; }\n if (event.key === \"ArrowRight\") { key = \"Right\"; }\n if (event.key === \" \") { key = \"Space\"; }\n if (event.key === \"Enter\") { key = \"Enter\"; }\n\n if (!key) { return; }\n event.preventDefault();\n\n onEvent(newEvent({\n type: `Pressed${key}OnProgress${kind}`,\n description: `The ${key.toLowerCase()} key was pressed while the progress ${kind.toLowerCase()} was focussed.`,\n initiatedBy: \"user\",\n }));\n};\n\nexport default handleKeyDown;\n","<script>\n import { onMount } from \"svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import blurElement from \"../../helpers/blurElement\";\n import translate from \"../../helpers/translate\";\n import handleKeyDown from \"./handleKeyDown\";\n\n export let progress = 0;\n export let fullWidth = false;\n export let readonly = false;\n export let color = \"#323232\";\n export let onEvent = () => {};\n\n $: backgroundStyle = fullWidth ? \"\" : `background: ${color}`;\n\n let progressBar;\n let mouseDown;\n\n const handleMouseDown = (event) => {\n mouseDown = true;\n\n onEvent(newEvent({\n type: \"PressedProgressBar\",\n description: \"The progress bar was pressed at some ratio.\",\n initiatedBy: \"user\",\n ratio: getMouseRatio(event),\n }));\n };\n\n const handleMouseMove = (event) => {\n if (!mouseDown) { return; }\n if (!progressBar) { handleMouseUp(); return; }\n\n onEvent(newEvent({\n type: \"ScrubbedProgressBar\",\n description: \"The user pressed on the progress bar then dragged.\",\n initiatedBy: \"user\",\n ratio: getMouseRatio(event),\n }));\n };\n\n const handleMouseUp = () => {\n if (!mouseDown) { return; }\n mouseDown = false;\n\n onEvent(newEvent({\n type: \"FinishedScrubbingProgressBar\",\n description: \"The user let go after scrubbing the progress bar.\",\n initiatedBy: \"user\",\n }));\n };\n\n const getMouseRatio = (event) => {\n const clientX = event.clientX || event.touches?.[0]?.clientX || 0;\n\n const { x, width } = progressBar.getBoundingClientRect();\n const mouseRatio = (clientX - x) / width;\n\n return Math.max(0, Math.min(1, mouseRatio));\n };\n\n onMount(() => {\n const mouseup = addEventListener(\"mouseup\", handleMouseUp);\n const mousemove = addEventListener(\"mousemove\", handleMouseMove);\n const touchend = addEventListener(\"touchend\", handleMouseUp);\n const touchmove = addEventListener(\"touchmove\", handleMouseMove);\n\n return () => {\n removeEventListener(\"mouseup\", mouseup);\n removeEventListener(\"mousemove\", mousemove);\n removeEventListener(\"touchend\", touchend);\n removeEventListener(\"touchmove\", touchmove);\n };\n });\n</script>\n\n<button type=\"button\" bind:this={progressBar} class=\"progress-bar\" class:full-width={fullWidth} class:readonly class:mouse-down={mouseDown} on:mousedown={handleMouseDown} on:touchstart={handleMouseDown} on:keydown={handleKeyDown(onEvent, \"Bar\")} on:mouseup={blurElement} aria-label={translate(\"scrubProgressBar\")}>\n <div class=\"background\" style=\"{backgroundStyle}\"></div>\n <div class=\"progress\" style=\"{backgroundStyle}; width: {progress * 100}%\"></div>\n</button>\n\n<style>\n .progress-bar {\n flex-grow: 1;\n height: 8px;\n border-radius: 4px;\n display: flex;\n cursor: pointer;\n overflow: hidden;\n outline-offset: 3.2px;\n\n border: none;\n margin: 0;\n padding: 0;\n position: relative;\n }\n\n .readonly,\n .readonly * {\n cursor: auto;\n }\n\n .background {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n opacity: 0.15;\n }\n\n .progress {\n height: 8px;\n border-radius: 4px;\n pointer-events: none;\n }\n\n .full-width {\n position: absolute;\n width: 100%;\n height: 4px;\n left: 0;\n right: 0;\n top: -4px;\n border-radius: 0;\n background: rgb(239, 239, 239);\n }\n\n .full-width:hover,\n .full-width.mouse-down {\n height: 8px;\n top: -6px;\n }\n\n .full-width .progress {\n border-radius: 0;\n background: linear-gradient(to right, #943bfc, #fc3a41);\n }\n</style>\n","<script>\n import handleKeyDown from \"./handleKeyDown\";\n\n export let progress = 0;\n export let enabled = false;\n export let bold;\n export let scale = 1;\n export let color = \"#323232\";\n export let onEvent = () => {};\n\n $: strokeWidth = scale * (bold ? 2.5 : 1.667);\n\n $: radius = 20 * scale + strokeWidth * (bold ? 1 : 1.5);\n $: size = 2 * radius + strokeWidth;\n\n $: circumference = radius * 2 * Math.PI;\n $: clamped = Math.max(0, Math.min(1, progress));\n $: dashOffset = circumference * (1 - clamped);\n</script>\n\n{#if enabled && progress}\n <div class=\"progress-circle\" role=\"none\" style=\"width: {scale * 40}px; height: {scale * 40}px\" on:keydown={handleKeyDown(onEvent, \"Circle\")}>\n <svg fill=\"none\" width={size} height={size} xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"50%\"\n cy=\"50%\"\n r={radius}\n stroke={color}\n stroke-width={strokeWidth}\n stroke-dasharray=\"{circumference} {circumference}\"\n stroke-dashoffset={dashOffset} />\n </svg>\n\n <slot></slot>\n </div>\n{:else}\n <slot></slot>\n{/if}\n\n<style>\n .progress-circle {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n }\n\n .progress-circle svg {\n position: absolute;\n transform: rotate(-90deg);\n transform-origin: 50% 50%,\n }\n</style>\n","const formatTime = (time) => {\n if (time < 0) { time = Math.max(0, time); }\n\n const hours = Math.floor(time / 3600).toString();\n let minutes = Math.floor((time % 3600) / 60).toString();\n let seconds = Math.floor(time % 60).toString();\n\n if (seconds.length < 2) { seconds = `0${seconds}`; }\n\n if (time < 3600) {\n return `${minutes}:${seconds}`;\n } else {\n if (minutes.length < 2) { minutes = `0${minutes}`; }\n return `${hours}:${minutes}:${seconds}`;\n }\n};\n\nexport default formatTime;\n","<script>\n import formatTime from \"../../helpers/formatTime\";\n\n export let text;\n export let remaining;\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<span class=\"countdown-time\" style=\"font-size: {10 * scale}px; color: {color}\">\n {text} • {formatTime(remaining)}\n</span>\n\n<style>\n .countdown-time {\n font-weight: 300;\n white-space: nowrap;\n }\n</style>\n","<script>\n export let duration = 0;\n export let bold = false;\n export let scale = 1;\n export let color = \"#323232\";\n\n $: minutes = Math.max(1, Math.round((duration || 0) / 60));\n</script>\n\n<div class=\"duration-in-mins\" class:bold={bold} style=\"font-size: {10 * scale}px; color: {color}\">\n {minutes} min\n</div>\n\n<style>\n .duration-in-mins {\n font-weight: 300;\n white-space: nowrap;\n }\n\n .bold {\n font-weight: 700;\n }\n</style>\n","<script>\n import formatTime from \"../../helpers/formatTime\";\n\n export let currentTime = 0;\n export let duration = 0;\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<span class=\"playback-time\" style=\"font-size: {10 * scale}px; color: {color}\">\n {formatTime(currentTime)} / {formatTime(duration)}\n</span>\n\n<style>\n .playback-time {\n font-weight: 300;\n white-space: nowrap;\n }\n</style>\n","<script>\n import CountdownTime from \"./CountdownTime.svelte\";\n import DurationInMins from \"./DurationInMins.svelte\";\n import PlaybackTime from \"./PlaybackTime.svelte\";\n\n export let duration = 0;\n export let currentTime = 0;\n $: remaining = Math.max(0, duration - currentTime);\n\n export let playerStyle;\n export let positionClasses;\n export let isMobile;\n export let isAdvert;\n export let isStopped;\n export let collapsed;\n export let largeImage;\n export let color = \"323232\";\n\n $: isScreen = playerStyle === \"screen\";\n $: scale = isScreen && !isMobile ? 3 : isScreen ? 2 : 1;\n $: opacityCss = collapsed ? \"opacity: 0\" : \"\";\n $: noTransition = !isAdvert && currentTime < 0.1;\n</script>\n\n<div class=\"time-indicator {playerStyle} {positionClasses}\" class:mobile={isMobile} class:advert_={isAdvert} class:stopped={isStopped} class:no-image={!largeImage} class:no-transition={noTransition} style={opacityCss}>\n <div class=\"inner\">\n {#if isAdvert && currentTime === 0}\n <!-- -->\n {:else if isAdvert}\n <CountdownTime text=\"Ad\" remaining={remaining} {scale} {color} />\n {:else if isStopped}\n <DurationInMins {duration} {scale} {color} />\n {:else}\n <PlaybackTime {duration} {currentTime} {scale} {color} />\n {/if}\n </div>\n</div>\n\n<style>\n .time-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n transition: opacity 0.25s;\n }\n\n /* When next to skip buttons */\n .standard:nth-child(5),\n .video:nth-child(5) {\n margin-left: 8px;\n }\n\n .standard.mobile:nth-child(5) {\n margin-left: 0;\n }\n\n .inner {\n display: flex;\n white-space: nowrap;\n }\n\n .mobile {\n flex-grow: 1;\n }\n\n .large {\n height: 40px;\n position: relative;\n }\n\n .large.stopped,\n .large.advert_ {\n flex-grow: 0;\n margin-left: -8px;\n }\n\n .standard.advert_ {\n justify-content: flex-end;\n }\n\n .standard.fixed-left.advert_ {\n justify-content: flex-start;\n }\n\n .stopped .inner {\n position: absolute;\n left: 52px;\n top: 28px;\n }\n\n .small.stopped.mobile .inner,\n .standard.stopped.mobile .inner {\n position: absolute;\n left: 40px;\n top: 28px;\n }\n\n .standard.stopped.fixed-right .inner {\n position: absolute;\n left: 36px;\n top: 28px;\n }\n\n .standard.stopped.fixed-left .inner {\n position: absolute;\n left: 52px;\n top: 28px;\n }\n\n .large .inner {\n position: absolute;\n left: 8px;\n bottom: 0;\n }\n\n .large.mobile {\n position: absolute;\n left: 96px;\n top: 62px;\n margin-left: 0;\n }\n\n .large.mobile.no-image {\n left: auto;\n }\n\n .large.mobile .inner {\n position: static;\n }\n\n .small .inner {\n position: absolute;\n left: 44px;\n top: 24px;\n }\n\n .small.fixed-right .inner {\n position: absolute;\n left: 16px;\n top: 24px;\n }\n\n .small.fixed-right.advert_ .inner {\n position: absolute;\n left: 44px;\n top: 24px;\n }\n\n .screen {\n position: absolute;\n bottom: 54px;\n display: flex;\n }\n\n .screen.advert_ {\n bottom: 196px;\n }\n\n .screen.mobile {\n bottom: 40px;\n }\n\n .screen.mobile.advert_ {\n bottom: 128px;\n }\n\n .screen .inner {\n position: static;\n }\n\n .video.advert_ {\n flex-grow: 0;\n }\n\n .video.mobile {\n justify-content: flex-start;\n }\n\n .video.stopped {\n display: none;\n }\n\n .video.time-indicator.no-transition {\n transition: none;\n }\n</style>\n","<script>\n export let scale = 1;\n export let zoom = 1;\n export let color = \"#323232\";\n export let fill = \"transparent\";\n</script>\n\n<svg width={18 * scale} height={18 * scale} viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect {fill} width=\"100%\" height=\"100%\" />\n <path fill={color} transform=\"scale({zoom})\" transform-origin=\"50% 50%\" d=\"M0 6.99996V11C0 11.55 0.45 12 1 12H4L7.29 15.29C7.92 15.92 9 15.47 9 14.58V3.40996C9 2.51996 7.92 2.06996 7.29 2.69996L4 5.99996H1C0.45 5.99996 0 6.44996 0 6.99996ZM13.5 8.99996C13.5 7.22996 12.48 5.70996 11 4.96996V13.02C12.48 12.29 13.5 10.77 13.5 8.99996ZM11 1.44996V1.64996C11 2.02996 11.25 2.35996 11.6 2.49996C14.18 3.52996 16 6.05996 16 8.99996C16 11.94 14.18 14.47 11.6 15.5C11.24 15.64 11 15.97 11 16.35V16.55C11 17.18 11.63 17.62 12.21 17.4C15.6 16.11 18 12.84 18 8.99996C18 5.15996 15.6 1.88996 12.21 0.599963C11.63 0.369963 11 0.819963 11 1.44996V1.44996Z\" />\n</svg>\n","<script>\n export let scale = 1;\n export let color = \"#323232\";\n</script>\n\n<svg width={16 * scale} height={16 * scale} viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill={color} d=\"M6.33334 5.76668L5.73334 5.18334C5.60001 5.06112 5.44168 5.00279 5.25834 5.00834C5.07501 5.0139 4.92223 5.07779 4.80001 5.20001C4.67779 5.32223 4.61668 5.47779 4.61668 5.66668C4.61668 5.85557 4.67779 6.01112 4.80001 6.13334L6.53334 7.86668C6.65557 7.9889 6.81112 8.05001 7.00001 8.05001C7.1889 8.05001 7.34445 7.9889 7.46668 7.86668L9.21668 6.11668C9.3389 5.99445 9.39723 5.84168 9.39168 5.65834C9.38612 5.47501 9.32223 5.32223 9.20001 5.20001C9.07779 5.07779 8.92223 5.0139 8.73334 5.00834C8.54445 5.00279 8.3889 5.06668 8.26668 5.20001L7.66668 5.76668V3.65001C7.66668 3.46112 7.60279 3.30557 7.47501 3.18334C7.34723 3.06112 7.1889 3.00001 7.00001 3.00001C6.81112 3.00001 6.65279 3.0639 6.52501 3.19168C6.39723 3.31945 6.33334 3.47779 6.33334 3.66668V5.76668ZM4.33334 10.3333H9.68334C9.87223 10.3333 10.0278 10.2695 10.15 10.1417C10.2722 10.0139 10.3333 9.85557 10.3333 9.66668C10.3333 9.47779 10.2695 9.31945 10.1417 9.19168C10.0139 9.0639 9.85557 9.00001 9.66668 9.00001H4.31668C4.12779 9.00001 3.97223 9.0639 3.85001 9.19168C3.72779 9.31945 3.66668 9.47779 3.66668 9.66668C3.66668 9.85557 3.73057 10.0139 3.85834 10.1417C3.98612 10.2695 4.14445 10.3333 4.33334 10.3333ZM7.00001 13.6667C6.07779 13.6667 5.21112 13.4917 4.40001 13.1417C3.5889 12.7917 2.88334 12.3167 2.28334 11.7167C1.68334 11.1167 1.20834 10.4111 0.858343 9.60001C0.508343 8.7889 0.333344 7.92223 0.333344 7.00001C0.333344 6.07779 0.508343 5.21112 0.858343 4.40001C1.20834 3.5889 1.68334 2.88334 2.28334 2.28334C2.88334 1.68334 3.5889 1.20834 4.40001 0.858343C5.21112 0.508343 6.07779 0.333344 7.00001 0.333344C7.92223 0.333344 8.7889 0.508343 9.60001 0.858343C10.4111 1.20834 11.1167 1.68334 11.7167 2.28334C12.3167 2.88334 12.7917 3.5889 13.1417 4.40001C13.4917 5.21112 13.6667 6.07779 13.6667 7.00001C13.6667 7.92223 13.4917 8.7889 13.1417 9.60001C12.7917 10.4111 12.3167 11.1167 11.7167 11.7167C11.1167 12.3167 10.4111 12.7917 9.60001 13.1417C8.7889 13.4917 7.92223 13.6667 7.00001 13.6667Z\" />\n</svg>\n","<script>\n import Download from \"../svg_icons/Download.svelte\";\n import newEvent from \"../../helpers/newEvent\";\n import blurElement from \"../../helpers/blurElement\";\n import translate from \"../../helpers/translate\";\n\n export let contentIndex;\n export let audioIndex;\n export let videoIndex;\n export let scale = 1;\n export let color = \"#323232\";\n export let onEvent = () => {};\n\n const handleClick = (event) => {\n event.stopPropagation();\n\n onEvent(newEvent({\n type: \"PressedDownload\",\n description: \"The download button next to a playlist item was pressed.\",\n initiatedBy: \"user\",\n contentIndex,\n audioIndex,\n videoIndex\n }));\n };\n</script>\n\n<button type=\"button\" class=\"download-button\" style=\"outline-offset: {4.8 * scale}px\" on:click={handleClick} on:mouseup={blurElement} aria-label={translate(\"downloadAudio\")}>\n <Download {scale} {color} />\n</button>\n\n<style>\n .download-button {\n display: flex;\n cursor: pointer;\n\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n }\n\n @media (hover: hover) and (pointer: fine) {\n .download-button:hover {\n opacity: 0.8;\n }\n }\n</style>\n","<script>\n import VolumeUp from \"./svg_icons/VolumeUp.svelte\";\n import ContentTitle from \"./titles/ContentTitle.svelte\";\n import DownloadButton from \"./buttons/DownloadButton.svelte\";\n import DurationInMins from \"./time_indicators/DurationInMins.svelte\";\n import newEvent from \"../helpers/newEvent\";\n import blurElement from \"../helpers/blurElement\";\n\n export let style = \"auto\";\n export let downloadFormats = [];\n export let larger = false;\n export let textColor = \"#111\";\n export let backgroundColor = \"#f5f5f5\";\n export let iconColor = \"#000\";\n export let content = [];\n export let index = 0;\n export let isMobile;\n export let onEvent;\n\n $: [mode, desktopRows, mobileRows] = style.split(\"-\");\n\n $: mobileRows = mobileRows || desktopRows || 4;\n $: desktopRows = desktopRows || 5;\n\n $: scale = larger ? 1.25 : 1;\n\n const handleClick = (i) => () => {\n onEvent(newEvent({\n type: \"PressedPlaylistItem\",\n description: \"A playlist item was pressed.\",\n initiatedBy: \"user\",\n index: i,\n }));\n };\n\n const handleKeydown = (event) => {\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n const prevItem = event.target.previousElementSibling;\n\n if (prevItem) { prevItem.focus(); }\n }\n\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n const nextItem = event.target.nextElementSibling;\n\n if (nextItem) { nextItem.focus(); }\n }\n };\n\n const handleFocus = (event) => {\n const scrollable = event.target.parentNode;\n const nearestTen = Math.round(scrollable.scrollTop / 10) * 10;\n\n scrollable.scrollTop = nearestTen;\n };\n\n const mediaToDownload = (audio, video) => {\n for (const format of downloadFormats) {\n for (const [i, item] of (audio || []).entries()) {\n if (item.url?.endsWith(`.${format}`)) { return [i, -1]; }\n }\n\n for (const [i, item] of (video || []).entries()) {\n if (item.url?.endsWith(`.${format}`)) { return [-1, i]; }\n }\n }\n\n return [-1, -1];\n };\n</script>\n\n<div class=\"playlist\" class:mobile={isMobile} class:larger style=\"--desktop-rows: {desktopRows}; --mobile-rows: {mobileRows}; background: {backgroundColor}\">\n <div class=\"scrollable\" tabindex=\"-1\">\n {#each content as { title, duration, audio, video }, i}\n {@const [audioIndex, videoIndex] = mediaToDownload(audio, video)}\n\n <button type=\"button\" class=\"item\" class:active={i === index} on:click={handleClick(i)} on:keydown={handleKeydown} on:focus={handleFocus} on:mouseup={blurElement} aria-label={title}>\n {#if i === index}\n <span class=\"speaker\"><VolumeUp color={iconColor} {scale} /></span>\n {:else}\n <span class=\"number\" style=\"color: {textColor}\" aria-hidden=\"true\">{i + 1}</span>\n {/if}\n\n <span class=\"title\">\n <ContentTitle {title} {scale} maxLines={isMobile ? 3 : 2} bold={i === index} color={textColor} />\n </span>\n\n <span class=\"download\">\n {#if audioIndex !== -1 || videoIndex !== -1}\n <DownloadButton {onEvent} color={iconColor} contentIndex={i} {audioIndex} {videoIndex} />\n {/if}\n </span>\n\n <span class=\"duration\">\n <DurationInMins {duration} {scale} bold={i === index} color={textColor} />\n </span>\n </button>\n {/each}\n </div>\n</div>\n\n<style>\n .playlist {\n margin-top: 16px;\n border-radius: 8px;\n }\n\n .scrollable {\n padding: 3.2px 0;\n padding-left: 4px;\n overflow-x: hidden;\n overflow-y: scroll;\n max-height: calc(40px * var(--desktop-rows));\n }\n\n .larger .scrollable {\n padding-top: 4px;\n padding-bottom: 4px;\n padding-left: 8px;\n max-height: calc(50px * var(--desktop-rows));\n }\n\n .mobile .scrollable {\n padding-left: 0;\n max-height: calc(80px * var(--mobile-rows));\n }\n\n .scrollable::-webkit-scrollbar {\n width: 8px;\n }\n\n .scrollable::-webkit-scrollbar-thumb {\n background: #323232;\n border-radius: 16px;\n border: 2px solid #fafafa;\n }\n\n .item {\n width: 100%;\n height: 40px;\n\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto 30px;\n grid-template-rows: auto;\n align-items: center;\n column-gap: 8px;\n\n font-size: 10px;\n font-weight: 300;\n line-height: 1.2;\n\n background: none;\n border: none;\n margin: 0;\n padding: 0;\n padding-right: 10px;\n box-sizing: border-box;\n text-align: left;\n cursor: pointer;\n }\n\n .larger .item {\n height: 50px;\n }\n\n .item:hover :global(.content-title) {\n font-weight: 500;\n }\n\n .item:hover :global(.duration-in-mins) {\n font-weight: 700;\n }\n\n .mobile .item {\n height: 80px;\n grid-template-rows: auto auto;\n padding-right: 16px;\n }\n\n .number,\n .speaker {\n width: 40px;\n text-align: center;\n font-size: 10px;\n font-weight: 700;\n flex-shrink: 0;\n }\n\n .larger .number,\n .larger .speaker {\n font-size: 12.5px;\n }\n\n .mobile .number,\n .mobile .speaker {\n grid-row: 1 / span 2;\n }\n\n .mobile .title {\n grid-column: 2 / span 2;\n }\n\n .active .title {\n font-weight: 700;\n }\n\n .title {\n flex-grow: 1;\n }\n\n .mobile .title {\n align-self: flex-end;\n }\n\n .duration {\n margin: 4px 0;\n white-space: nowrap;\n display: flex;\n justify-content: flex-end;\n }\n\n .larger .duration {\n margin: 8px 0;\n }\n\n .mobile .duration {\n grid-row: 2;\n grid-column: 2;\n justify-content: flex-start;\n align-self: flex-start;\n }\n\n .mobile .download {\n grid-row: 1 / span 2;\n grid-column: 4;\n justify-self: flex-end;\n align-self: center;\n position: relative;\n top: -2px;\n }\n\n :global(.beyondwords-player.maximized) .playlist {\n display: none;\n }\n</style>\n","<script>\n import { onDestroy } from \"svelte\";\n\n export let exitDelay = 0;\n export let idleDelay = Infinity;\n export let isHovering = false;\n\n let isExit = true;\n let isIdle = true;\n let exitTimeout;\n let idleTimeout;\n\n $: isHovering = !isExit && !isIdle;\n\n const onEnter = () => {\n if (exitTimeout) { clearTimeout(exitTimeout); }\n if (idleTimeout) { clearTimeout(idleTimeout); }\n\n isExit = false;\n isIdle = false;\n };\n\n const onLeave = () => {\n if (exitTimeout) { clearTimeout(exitTimeout); }\n\n isExit = false;\n exitTimeout = setTimeout(() => isExit = true, exitDelay);\n };\n\n const onMove = () => {\n if (idleTimeout) { clearTimeout(idleTimeout); }\n\n isIdle = false;\n idleTimeout = setTimeout(() => isIdle = true, idleDelay);\n };\n\n onDestroy(() => {\n if (exitTimeout) { clearTimeout(exitTimeout); }\n if (idleTimeout) { clearTimeout(idleTimeout); }\n });\n</script>\n\n<div class=\"hoverable\"\n role=\"none\"\n on:mouseenter={onEnter}\n on:mouseleave={onLeave}\n on:mousemove={idleDelay !== Infinity && onMove}>\n <slot></slot>\n</div>\n","<script>\n import { onMount } from \"svelte\";\n import newEvent from \"../../helpers/newEvent\";\n\n let element;\n\n export let enabled = false;\n export let relativeY = undefined;\n export let absoluteY = undefined;\n export let isVisible = undefined;\n export let onEvent = () => {};\n\n const callback = ([entry]) => {\n relativeY = entry.boundingClientRect.y;\n absoluteY = relativeY + window.scrollY;\n\n if (isVisible === entry.isIntersecting) { return; }\n isVisible = entry.isIntersecting;\n\n onEvent(newEvent({\n type: \"VisibilityChanged\",\n description: \"The player was scrolled into or out of view.\",\n initiatedBy: \"user\",\n isVisible,\n }));\n };\n\n onMount(() => {\n if (!enabled || typeof IntersectionObserver === \"undefined\") { return; }\n\n const observer = new IntersectionObserver(callback, { threshold: 0.5 });\n observer.observe(element);\n\n return () => {\n observer.unobserve(element);\n callback([{ isIntersecting: true, boundingClientRect: { y: Infinity } }]);\n };\n });\n</script>\n\n<div class=\"visibility\" bind:this={element}>\n <slot></slot>\n</div>\n\n<style>\n .visibility {\n display: flex;\n }\n</style>\n","/* eslint-disable indent */\n\nconst belowBreakpoint = ({ playerStyle, width }) => (\n playerStyle === \"standard\" && width < 380 ||\n playerStyle === \"large\" && width < 380 ||\n playerStyle === \"video\" && width < 480 ||\n playerStyle === \"screen\" && width < 640\n);\n\nexport default belowBreakpoint;\n","/* eslint-disable indent */\n\nconst controlsOrder = ({ playerStyle, position, isMobile, isAdvert }) => (\n playerStyle === \"screen\" ? \"symmetrical\"\n : playerStyle === \"large\" && isMobile ? \"symmetrical\"\n : playerStyle === \"standard\" && position === \"left\" ? \"left-to-right\"\n : playerStyle === \"standard\" && isMobile ? \"right-to-left\"\n : playerStyle === \"standard\" && position === \"right\" && isAdvert ? \"right-to-left\"\n : playerStyle === \"standard\" && position === \"right\" ? \"left-to-right-but-swap-ends\"\n : playerStyle === \"small\" && position === \"left\" ? \"left-to-right\"\n : playerStyle === \"small\" && position === \"right\" ? \"right-to-left\"\n : playerStyle === \"video\" && position === \"left\" ? \"left-to-right\"\n : playerStyle === \"video\" && isMobile ? \"right-to-left\"\n : playerStyle === \"video\" && position === \"right\" ? \"right-to-left\"\n : \"left-to-right\"\n);\n\nexport default controlsOrder;\n","const playerStyles = [\"small\", \"standard\", \"large\", \"screen\", \"video\"];\n\nconst knownPlayerStyle = (style) => playerStyles.indexOf(style) !== -1;\n\nexport default playerStyles;\nexport { knownPlayerStyle };\n","const canFullScreen = () => (\n document.fullscreenEnabled || document.webkitFullscreenEnabled\n);\n\nconst requestFullScreen = (element) => {\n if (element.requestFullscreen) {\n element.requestFullscreen();\n } else if (element.webkitRequestFullscreen) {\n element.webkitRequestFullscreen();\n }\n};\n\nconst exitFullScreen = () => {\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n }\n};\n\nconst fullScreenElement = () => (\n document.fullscreenElement || document.webkitCurrentFullScreenElement\n);\n\n\nexport { canFullScreen, requestFullScreen, exitFullScreen, fullScreenElement };\n","<script>\n import(\"../helpers/loadTheStyles.ts\");\n import \"@fontsource/inter/variable.css\";\n import { fly } from \"svelte/transition\";\n import PlayPauseButton from \"./buttons/PlayPauseButton.svelte\";\n import PlaybackRateButton from \"./buttons/PlaybackRateButton.svelte\";\n import PrevButton from \"./buttons/PrevButton.svelte\";\n import NextButton from \"./buttons/NextButton.svelte\";\n import PlaylistButton from \"./buttons/PlaylistButton.svelte\";\n import SecondaryButton from \"./buttons/SecondaryButton.svelte\";\n import MaximizeButton from \"./buttons/MaximizeButton.svelte\";\n import CloseWidgetButton from \"./buttons/CloseWidgetButton.svelte\";\n import AdvertLink from \"./external_links/AdvertLink.svelte\";\n import AdvertButton from \"./external_links/AdvertButton.svelte\";\n import BeyondWords from \"./external_links/BeyondWords.svelte\";\n import SourceUrlButton from \"./external_links/SourceUrlButton.svelte\";\n import LargeImage from \"./LargeImage.svelte\";\n import PlayerTitle from \"./titles/PlayerTitle.svelte\";\n import ContentTitle from \"./titles/ContentTitle.svelte\";\n import ProgressBar from \"./progress_bars/ProgressBar.svelte\";\n import ProgressCircle from \"./progress_bars/ProgressCircle.svelte\";\n import TimeIndicator from \"./time_indicators/TimeIndicator.svelte\";\n import Playlist from \"./Playlist.svelte\";\n import Hoverable from \"./helpers/Hoverable.svelte\";\n import Visibility from \"./helpers/Visibility.svelte\";\n import belowBreakpoint from \"../helpers/belowBreakpoint\";\n import controlsOrderFn from \"../helpers/controlsOrder\";\n import { knownPlayerStyle } from \"../helpers/playerStyles\";\n import newEvent from \"../helpers/newEvent\";\n import translate from \"../helpers/translate\";\n import { canFullScreen } from \"../helpers/fullScreen\";\n\n export let playerStyle = \"standard\";\n export let callToAction = undefined;\n export let skipButtonStyle = \"auto\";\n export let playlistStyle = \"auto-5-4\";\n export let playlistToggle = \"auto\";\n export let downloadFormats = [];\n export let playerTitle = undefined;\n export let fixedPosition = undefined;\n export let fixedWidth = \"auto\";\n export let content = [];\n export let contentIndex = 0;\n export let duration = 0;\n export let currentTime = 0;\n export let playbackState = \"stopped\";\n export let playbackRate = 1;\n export let activeAdvert = undefined;\n export let persistentAdvert = undefined;\n export let textColor = \"#111\";\n export let backgroundColor = \"#f5f5f5\";\n export let iconColor = \"black\";\n export let logoIconEnabled = true;\n export let onEvent = () => {};\n\n // These are set automatically.\n export let videoIsBehind = false;\n export let isVisible = undefined;\n export let relativeY = undefined;\n export let absoluteY = undefined;\n let width, isHovering, timeout;\n\n $: isSmall = playerStyle === \"small\";\n $: isStandard = playerStyle === \"standard\";\n $: isLarge = playerStyle === \"large\";\n $: isScreen = playerStyle === \"screen\";\n $: isVideo = playerStyle === \"video\";\n $: isPlaying = playbackState === \"playing\";\n $: isPaused = playbackState === \"paused\";\n $: isStopped = playbackState === \"stopped\";\n $: isAdvert = activeAdvert && !isStopped;\n $: isPlaylist = content.length > 1;\n $: isMobile = belowBreakpoint({ playerStyle, width });\n\n $: contentItem = content[contentIndex] || {};\n $: progress = currentTime / duration;\n\n $: activeTextColor = isAdvert && activeAdvert?.textColor || textColor;\n $: activeBackgroundColor = isAdvert && activeAdvert?.backgroundColor || backgroundColor;\n $: activeIconColor = isAdvert && activeAdvert?.iconColor || iconColor;\n\n $: skipStyle = skipButtonStyle === \"auto\" ? (isPlaylist ? \"tracks\" : \"segments\") : skipButtonStyle;\n $: skipDisabled = skipStyle === \"segments\";\n $: buttonColor = isVideo ? \"rgba(250, 250, 250, 0.8)\" : activeIconColor;\n\n $: buttonScale = isSmall || isVideo && fixedPosition ? 0.8 : isScreen && !isMobile ? 2 : 1;\n $: playPauseScale = buttonScale * (isScreen ? 1.5 : isVideo && isStopped ? 1.6 : 1);\n $: logoScale = isScreen && !isMobile ? 3 : isScreen ? 2 : isVideo && !isMobile ? 1.5 : 1;\n $: closeScale = isScreen && !isMobile ? 2.5 : isScreen ? 1.75 : isVideo && !isMobile ? 2 : isVideo ? 1.5 : 1;\n $: closeMargin = isScreen && !isMobile ? \"12px 0\" : isScreen ? \"4px 0\" : \"auto\";\n\n $: widthStyle = fixedWidth === \"auto\" ? (isSmall ? \"fit-content\" : \"\") : fixedWidth;\n $: position = fixedPosition === \"auto\" ? (isStandard ? \"center\" : \"right\") : fixedPosition;\n $: positionClasses = fixedPosition ? `fixed fixed-${position}` : \"\";\n $: flyWidget = (e) => fixedPosition && fly(e, { y: isSmall || isStandard ? 40 : 100 });\n\n $: controlsOrder = controlsOrderFn({ playerStyle, position, isMobile, isAdvert });\n\n $: largeImage = isAdvert && activeAdvert.imageUrl || !isStopped && persistentAdvert?.imageUrl || contentItem.imageUrl;\n $: largeImageHref = isAdvert && activeAdvert.clickThroughUrl || !isStopped && persistentAdvert?.clickThroughUrl;\n\n $: collapsible = isSmall && fixedPosition && fixedWidth === \"auto\";\n $: forcedCollapsed = isSmall && (fixedWidth === 0 || fixedWidth === \"0\");\n $: collapsed = forcedCollapsed || collapsible && !isAdvert && !isStopped && !isHovering;\n\n $: showCloseWidget = fixedPosition && !isSmall && !(isStandard && isAdvert);\n $: showBeyondWords = logoIconEnabled && !isVideo && (!isAdvert || isScreen) && !(fixedPosition && isSmall) && !forcedCollapsed;\n\n $: playlistParts = playlistStyle.split(\"-\");\n\n $: showPlaylist = (playlistParts[0] === \"show\" || playlistParts[0] === \"auto\" && isPlaylist) && !isSmall;\n $: showPlaylistToggle = (playlistToggle === \"show\" || playlistToggle === \"auto\" && isPlaylist) && !isSmall;\n\n $: classes = `user-interface ${playerStyle} ${playbackState} ${positionClasses} ${controlsOrder}`;\n $: fixedPosition && animate();\n\n const animate = () => { // TODO: extract?\n if (timeout) { clearTimeout(timeout); }\n timeout = setTimeout(() => timeout = null, 500);\n };\n\n const handleMouseDown = (event) => {\n if (!isVideo) { return; }\n\n const isLeftClick = event.button === 0;\n if (!isLeftClick) { return; }\n\n const clickedOnMain = event.target.classList.contains(\"main\");\n if (!clickedOnMain) { return; }\n\n onEvent(newEvent({\n type: \"PressedVideoBackground\",\n description: \"The video background was pressed.\",\n initiatedBy: \"user\",\n }));\n };\n</script>\n\n{#if knownPlayerStyle(playerStyle) && content.length > 0}\n <div class={classes} style=\"width: {widthStyle}\" class:mobile={isMobile} class:advert_={isAdvert} class:hovering={isHovering} class:collapsed bind:clientWidth={width} class:animating={timeout} transition:flyWidget on:outrostart={animate}>\n <Hoverable bind:isHovering exitDelay={collapsible ? 500 : 0} idleDelay={isVideo ? 3000 : Infinity}>\n {#if isVideo && !videoIsBehind}\n <div class=\"video-placeholder\" />\n {/if}\n\n <div class=\"main\" role=\"none\" class:no-image={!largeImage} on:mousedown={handleMouseDown} on:keyup={null} style=\"background: {isVideo ? \"transparent\" : activeBackgroundColor}\">\n {#if largeImage && (isLarge || isScreen)}\n <LargeImage {onEvent} src={largeImage} href={largeImageHref} scale={isScreen && !isMobile ? 1.5 : 1} />\n {/if}\n\n {#if isLarge || isScreen}\n <div class=\"summary\">\n <PlayerTitle title={playerTitle} visible={!isAdvert} {playerStyle} scale={isScreen ? 2 : 1} color={activeTextColor} />\n <ContentTitle title={contentItem.title} maxLines={isMobile || isScreen ? 3 : 1} center={isScreen} scale={isScreen ? 2 : 1} maxWidth={isScreen && !isMobile ? 640 : isScreen ? 320 : null} color={activeTextColor} />\n </div>\n {/if}\n\n <div class=\"controls\">\n <Visibility {onEvent} enabled={!fixedPosition} bind:isVisible bind:relativeY bind:absoluteY>\n <ProgressCircle {onEvent} {progress} enabled={isScreen || isSmall} bold={isSmall} scale={playPauseScale} color={activeIconColor}>\n <PlayPauseButton {onEvent} {isPlaying} scale={playPauseScale} color={buttonColor} />\n </ProgressCircle>\n </Visibility>\n\n {#if isStandard && isStopped || isSmall}\n <PlayerTitle title={callToAction || translate(\"listenToThisArticle\")} visible={!isAdvert} {playerStyle} {collapsible} {collapsed} color={activeTextColor} />\n {/if}\n\n {#if !isSmall && !isStopped && !isAdvert || (isScreen && isAdvert)}\n <PlaybackRateButton {onEvent} rate={playbackRate} scale={buttonScale} color={isVideo ? buttonColor : activeTextColor} />\n <PrevButton {onEvent} style={skipStyle} scale={buttonScale} color={buttonColor} />\n <NextButton {onEvent} style={skipStyle} scale={buttonScale} color={buttonColor} />\n {/if}\n\n {#if isStandard && fixedPosition && !isStopped && !isAdvert && width > 720 && controlsOrder !== \"left-to-right-but-swap-ends\"}\n <ContentTitle title={contentItem.title} maxLines={1} bold={true} scale={1.2} flex={0.52} color={activeTextColor} />\n {/if}\n\n <TimeIndicator {currentTime} {duration} {playerStyle} {isAdvert} {isMobile} {isStopped} {positionClasses} {collapsed} {largeImage} color={isVideo ? buttonColor : activeTextColor} />\n\n {#if (isStandard && !isMobile && !isStopped) || (isLarge && !isMobile) || (isVideo && !isStopped)}\n <ProgressBar {onEvent} {progress} fullWidth={isVideo} readonly={isAdvert} color={activeIconColor} />\n {/if}\n\n {#if isAdvert && !forcedCollapsed}\n <AdvertLink {onEvent} href={activeAdvert.clickThroughUrl} {playerStyle} scale={isScreen && !isMobile ? 2 : isScreen ? 1.6 : 1} {controlsOrder} color={isVideo ? \"rgba(250, 250, 250, 0.8)\" : activeTextColor} {largeImage} {isMobile} />\n <AdvertButton {onEvent} href={activeAdvert.clickThroughUrl} {playerStyle} scale={buttonScale} {controlsOrder} color={buttonColor} />\n {/if}\n\n {#if !isStopped}\n <SecondaryButton {playerStyle} {isMobile} {isAdvert} scale={buttonScale}>\n {#if isVideo && canFullScreen()}\n <MaximizeButton {onEvent} scale={buttonScale} color={buttonColor} />\n {:else if isScreen && contentItem.sourceUrl}\n <SourceUrlButton {onEvent} scale={buttonScale} href={contentItem.sourceUrl} color={buttonColor} />\n {:else if showPlaylistToggle}\n <PlaylistButton {onEvent} scale={buttonScale} color={buttonColor} playlistShowing={showPlaylist} {playerStyle} />\n {/if}\n </SecondaryButton>\n {/if}\n </div>\n\n {#if showCloseWidget || showBeyondWords}\n <div class=\"end\">\n {#if showCloseWidget}\n <CloseWidgetButton {onEvent} scale={closeScale} margin={closeMargin} color={buttonColor} />\n {:else}\n <BeyondWords {onEvent} scale={logoScale} visible={isScreen || isHovering || isPlaying} />\n {/if}\n </div>\n {/if}\n </div>\n </Hoverable>\n\n {#if showPlaylist}\n <Playlist\n {onEvent}\n style={playlistStyle}\n {downloadFormats}\n larger={isScreen && !isMobile}\n {content}\n index={contentIndex}\n isMobile={isMobile}\n textColor={activeTextColor}\n backgroundColor={activeBackgroundColor}\n iconColor={activeIconColor} />\n {/if}\n </div>\n{/if}\n\n<style>\n .user-interface {\n overflow: hidden;\n }\n\n .user-interface :global(*) {\n font-family: \"InterVariable\", sans-serif;\n }\n\n .fixed {\n position: fixed;\n bottom: 0;\n margin: 16px;\n max-width: calc(100% - 32px);\n z-index: 1000;\n }\n\n .fixed-left {\n left: 0;\n }\n\n .fixed-center {\n left: 0;\n right: 0;\n margin-left: auto;\n margin-right: auto;\n }\n\n .fixed-right {\n right: 0;\n }\n\n .main {\n box-sizing: border-box;\n column-gap: 8px;\n transition: padding 0.5s;\n position: relative;\n }\n\n .summary {\n max-width: 100%;\n }\n\n .controls {\n flex-grow: 1;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n column-gap: 8px;\n grid-row: 2;\n grid-column: 2 / span 2;\n min-width: 0;\n }\n\n .end {\n grid-row: 1;\n grid-column: 3;\n }\n\n .collapsed .controls {\n column-gap: 0;\n transition: column-gap 1.25s;\n }\n\n .right-to-left .controls :global(.advert-button) { order: 1; }\n .right-to-left .controls :global(.advert-link) { order: 2; }\n .right-to-left .controls :global(.progress-bar) { order: 3; }\n .right-to-left .controls :global(.player-title) { order: 4; }\n .right-to-left .controls :global(.time-indicator) { order: 5; }\n .right-to-left .controls :global(.prev-button) { order: 6; }\n .right-to-left .controls :global(.next-button) { order: 7; }\n .right-to-left .controls :global(.playback-rate-button) { order: 8; }\n .right-to-left .controls :global(.visibility) { order: 9; }\n\n .symmetrical .controls :global(.prev-button) { order: 1; }\n .symmetrical .controls :global(.playback-rate-button) { order: 2; }\n .symmetrical .controls :global(.visibility) { order: 3; }\n .symmetrical .controls :global(.secondary-button) { order: 4; }\n .symmetrical .controls :global(.next-button) { order: 5; }\n\n .left-to-right-but-swap-ends .controls :global(.visibility) { order: 1; }\n\n .advert_ .controls {\n justify-content: space-between;\n }\n\n .symmetrical .controls {\n justify-content: center;\n }\n\n .standard {\n min-width: 300px;\n }\n\n .standard .main {\n height: 48px;\n padding: 4px;\n border-radius: 25px;\n display: flex;\n align-items: center;\n }\n\n .standard.right-to-left .main,\n .standard.left-to-right-but-swap-ends .main {\n flex-direction: row-reverse;\n }\n\n .standard .end {\n margin-right: 12px;\n }\n\n .standard.right-to-left .end,\n .standard.left-to-right-but-swap-ends .end {\n margin-left: 12px;\n margin-right: 0;\n }\n\n .large {\n min-width: 300px;\n }\n\n .large .main {\n height: 96px;\n padding: 8px;\n border-radius: 8px;\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n grid-template-rows: auto minmax(0, 1fr) auto;\n }\n\n .large.advert_ .controls {\n justify-content: space-between;\n }\n\n .large .controls {\n align-self: flex-end;\n }\n\n .large.mobile .main {\n height: 144px;\n }\n\n .large .no-image .summary {\n grid-column: 1 / span 2;\n }\n\n .large .no-image .controls {\n grid-column: 1 / span 3;\n }\n\n .large.mobile .controls {\n grid-row: 3;\n grid-column: 1 / span 3;\n }\n\n .small {\n min-width: 40px;\n }\n\n .small .main {\n height: 40px;\n padding: 4px;\n border-radius: 20px;\n display: flex;\n align-items: center;\n }\n\n .small .end {\n margin-right: 4px;\n }\n\n .small.left-to-right .main {\n padding-right: 8px;\n }\n\n .small.collapsed.left-to-right .main {\n padding-right: 0;\n }\n\n .small.right-to-left .main {\n padding-left: 16px;\n }\n\n .small.left-to-right.advert_ .main {\n padding-right: 4px;\n }\n\n .small.right-to-left.advert_ .main {\n padding-left: 4px;\n }\n\n .small.collapsed.right-to-left .main {\n padding-left: 0;\n }\n\n .screen {\n min-width: 300px;\n }\n\n .screen .main {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n row-gap: 40px;\n padding: 40px;\n border-radius: 8px;\n }\n\n .screen.mobile .main {\n padding: 32px;\n }\n\n .screen .summary {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n .screen .controls {\n flex-grow: 0;\n column-gap: 40px;\n margin-bottom: 90px;\n }\n\n .screen.advert_ .controls {\n margin-bottom: 232px;\n }\n\n .screen.mobile .controls {\n column-gap: 8px;\n margin-top: -8px;\n margin-bottom: 60px;\n }\n\n .screen.mobile.advert_ .controls {\n margin-bottom: 148px;\n }\n\n .screen .end {\n order: -1;\n align-self: flex-end;\n margin-bottom: -32px;\n }\n\n .screen.mobile .end {\n margin-bottom: 32px;\n }\n\n .video {\n min-width: 300px;\n max-width: 720px;\n border-radius: 8px;\n transition: background-color 0.25s;\n }\n\n .video.advert_.playing,\n .video.advert_.playing :global(*) {\n pointer-events: none;\n }\n\n .video.advert_.playing .controls,\n .video.advert_.playing .controls :global(*),\n .video.advert_.playing .end,\n .video.advert_.playing .end :global(*),\n .video.advert_.playing :global(.playlist),\n .video.advert_.playing :global(.playlist *) {\n pointer-events: auto;\n }\n\n .video.fixed {\n max-width: min(720px, 100% - 32px);\n }\n\n .video :global(.hoverable) {\n position: relative;\n padding-bottom: 56.25%;\n border-radius: 8px;\n overflow: hidden;\n transition: background-color 0.25s;\n }\n\n .video .video-placeholder {\n position: absolute;\n width: 100%;\n height: 100%;\n border-radius: 8px;\n background: #323232;\n background-color: black;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n }\n\n .video .main {\n position: absolute;\n width: 100%;\n height: 100%;\n background: transparent;\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n grid-template-rows: auto minmax(0, 1fr) auto;\n cursor: none;\n }\n\n .video.stopped .main,\n .video.hovering .main {\n cursor: default;\n }\n\n .video .summary {\n margin: 16px;\n cursor: auto;\n display: flex;\n }\n\n .video .end {\n margin: 16px;\n margin-left: auto;\n }\n\n .video .controls {\n grid-row: 3;\n grid-column: 1 / span 3;\n padding-bottom: 8px;\n position: relative;\n padding: 8px 16px;\n cursor: auto;\n }\n\n .video .controls > :global(*) {\n opacity: 0;\n transition: opacity 0.25s;\n pointer-events: none;\n }\n\n .video .controls > :global(.progress-bar.full-width) {\n transition: opacity 0.25s, height 0.1s, top 0.1s;\n }\n\n :global(.video .hoverable):focus-within .controls > :global(*),\n :global(.video .hoverable):focus-within .end > :global(.beyondwords),\n .video.stopped .controls > :global(*),\n .video.hovering .controls > :global(*),\n .video.advert_ .controls > :global(.time-indicator),\n .video.advert_ .controls > :global(.advert-link) {\n opacity: 1;\n pointer-events: auto;\n }\n\n .video.advert_ .controls > :global(.time-indicator) {\n position: absolute;\n left: 16px;\n bottom: 16px;\n transition: bottom 0.5s;\n }\n\n .video.advert_ .controls > :global(.advert-link) {\n position: absolute;\n right: 16px;\n bottom: 16px;\n transition: bottom 0.5s;\n }\n\n :global(.video.advert_ .hoverable):focus-within .controls > :global(.time-indicator),\n .video.advert_.stopped .controls > :global(.time-indicator),\n .video.advert_.hovering .controls > :global(.time-indicator),\n :global(.video.advert_ .hoverable):focus-within .controls > :global(.advert-link),\n .video.advert_.stopped .controls > :global(.advert-link),\n .video.advert_.hovering .controls > :global(.advert-link) {\n bottom: 76px;\n }\n\n .video.advert_.mobile .controls > :global(.time-indicator) {\n left: 8px;\n margin-bottom: -4px;\n }\n\n .video.advert_.mobile .controls > :global(.advert-link) {\n right: 8px;\n margin-bottom: -4px;\n }\n\n .video.advert_.fixed .controls > :global(.time-indicator) {\n left: 12px;\n }\n\n .video.advert_.fixed .controls > :global(.advert-link) {\n right: 12px;\n }\n\n .video :global(.next-button) {\n margin-left: 8px;\n }\n\n .video.advert_ .controls {\n column-gap: 16px;\n }\n\n .video.stopped .controls {\n pointer-events: none;\n padding: 16px;\n }\n\n .video.stopped.right-to-left .controls {\n flex-direction: row-reverse;\n }\n\n .video :global(.hoverable):focus-within,\n .video.hovering :global(.hoverable) {\n background: linear-gradient(\n rgba(0, 0, 0, 0) 50.0%,\n rgba(0, 0, 0, 0.083) 63.6%,\n rgba(0, 0, 0, 0.14) 67.55%,\n rgba(0, 0, 0, 0.207) 71.3%,\n rgba(0, 0, 0, 0.282) 74.8%,\n rgba(0, 0, 0, 0.36) 78.1%,\n rgba(0, 0, 0, 0.44) 81.25%,\n rgba(0, 0, 0, 0.518) 84.2%,\n rgba(0, 0, 0, 0.593) 87.05%,\n rgba(0, 0, 0, 0.66) 89.75%,\n rgba(0, 0, 0, 0.717) 92.4%,\n rgba(0, 0, 0, 0.761) 94.95%,\n rgba(0, 0, 0, 0.79) 97.5%,\n rgba(0, 0, 0, 0.8) 100.0%\n );\n }\n\n .video.fixed :global(.hoverable):focus-within,\n .video.fixed.hovering :global(.hoverable) {\n background: linear-gradient(\n rgba(0, 0, 0, 0) 25.0%,\n rgba(0, 0, 0, 0.083) 45.4%,\n rgba(0, 0, 0, 0.14) 51.325%,\n rgba(0, 0, 0, 0.207) 56.95%,\n rgba(0, 0, 0, 0.282) 62.2%,\n rgba(0, 0, 0, 0.36) 67.15%,\n rgba(0, 0, 0, 0.44) 71.875%,\n rgba(0, 0, 0, 0.518) 76.3%,\n rgba(0, 0, 0, 0.593) 80.575%,\n rgba(0, 0, 0, 0.66) 84.625%,\n rgba(0, 0, 0, 0.717) 88.6%,\n rgba(0, 0, 0, 0.761) 92.425%,\n rgba(0, 0, 0, 0.79) 96.25%,\n rgba(0, 0, 0, 0.8) 100.0%\n );\n }\n\n .video.mobile .controls {\n padding: 8px;\n }\n\n .video.mobile .summary,\n .video.mobile .end {\n margin: 8px;\n }\n\n .video.fixed .end {\n margin: 16px;\n }\n\n .video.fixed.mobile .end {\n margin: 12px;\n }\n\n .video.fixed .controls {\n padding-left: 12px;\n padding-right: 12px;\n }\n\n :global(.beyondwords-player.maximized) .fixed {\n display: none;\n }\n\n :global(.beyondwords-player.maximized) .video {\n max-width: none;\n width: 100%;\n height: 100%;\n }\n\n :global(.beyondwords-player.maximized) .video :global(.hoverable) {\n padding: 0;\n height: 100%;\n background: none;\n }\n</style>\n","<script>\n export let root = undefined;\n\n let element;\n\n $: target = typeof root === \"string\" ? null : root;\n $: target && element && target.appendChild(element);\n\n // Ensure the styles apply when widgetTarget is set.\n $: target?.classList?.add(\"beyondwords-widget\", \"bwp\");\n</script>\n\n<div bind:this={element} class=\"external-widget\">\n <slot></slot>\n</div>\n\n<style>\n .external-widget {\n position: relative;\n }\n\n :global(.beyondwords-widget.position-11-oclock > *) { margin-left: 3px; margin-bottom: 10px }\n :global(.beyondwords-widget.position-12-oclock > *) { margin: auto; margin-bottom: 10px; width: fit-content }\n :global(.beyondwords-widget.position-1-oclock > *) { margin-left: auto; margin-bottom: 10px; width: fit-content }\n\n :global(.beyondwords-widget.position-2-oclock) { position: absolute; right: -55px; top: 0 }\n :global(.beyondwords-widget.position-3-oclock) { position: absolute; right: -55px; top: 50%; transform: translateY(-50%); }\n :global(.beyondwords-widget.position-4-oclock) { position: absolute; right: -55px; bottom: 0 }\n\n :global(.beyondwords-widget.position-5-oclock > *) { margin-left: auto; margin-top: 10px; width: fit-content }\n :global(.beyondwords-widget.position-6-oclock > *) { margin: auto; margin-top: 10px; width: fit-content }\n :global(.beyondwords-widget.position-7-oclock > *) { margin-left: 3px; margin-top: 10px }\n\n :global(.beyondwords-widget.position-8-oclock) { position: absolute; left: -55px; bottom: 0 }\n :global(.beyondwords-widget.position-9-oclock) { position: absolute; left: -55px; top: 50%; transform: translateY(-50%); }\n :global(.beyondwords-widget.position-10-oclock) { position: absolute; left: -55px; top: 0 }\n\n :global(.beyondwords-widget.position-7-oclock.for-small-player > *),\n :global(.beyondwords-widget.position-11-oclock.for-small-player > *) { margin-left: 0 }\n\n :global(.beyondwords-widget.position-7-oclock.for-large-player > *),\n :global(.beyondwords-widget.position-11-oclock.for-large-player > *) { margin-left: 7px }\n\n :global(.beyondwords-widget.position-7-oclock.for-video-player > *),\n :global(.beyondwords-widget.position-11-oclock.for-video-player > *) { margin-left: 15px }\n</style>\n","<script>\n import(\"../helpers/loadTheStyles.ts\");\n\n export let projectId;\n export let contentId;\n export let playlistId;\n export let sourceId;\n export let sourceUrl;\n export let showUserInterface;\n export let playerStyle;\n export let playerTitle;\n export let callToAction;\n export let skipButtonStyle;\n export let playlistStyle;\n export let playlistToggle;\n export let mediaSession;\n export let content;\n export let contentIndex;\n export let introsOutros;\n export let introsOutrosIndex;\n export let adverts;\n export let advertIndex;\n export let persistentAdImage;\n export let persistentIndex;\n export let duration;\n export let currentTime;\n export let playbackState;\n export let playbackRate;\n export let widgetStyle;\n export let widgetPosition;\n export let widgetWidth;\n export let widgetTarget;\n export let textColor;\n export let backgroundColor;\n export let iconColor;\n export let highlightColor;\n export let logoIconEnabled;\n export let highlightSections;\n export let clickableSections;\n export let segmentWidgetSections;\n export let segmentWidgetPosition;\n export let advertConsent;\n export let analyticsConsent;\n export let analyticsCustomUrl;\n export let analyticsTag;\n\n let showAdvancedSettings = false;\n</script>\n\n<div class=\"control-panel\">\n <div class=\"heading\">\n <strong>Player settings:</strong>\n\n <a tabindex={-1} target=\"_blank\" class=\"docs\" href=\"https://github.com/beyondwords-io/player/blob/main/doc/player-settings.md\">\n view docs\n </a>\n </div>\n\n <br/>\n\n <div class=\"control\">\n playerStyle:\n <select tabindex={-1} bind:value={playerStyle}>\n <option>small</option>\n <option>standard</option>\n <option>large</option>\n <option>video</option>\n </select>\n </div>\n\n <div class=\"control\">\n playbackState:\n <select tabindex={-1} bind:value={playbackState}>\n <option>stopped</option>\n <option>playing</option>\n <option>paused</option>\n </select>\n </div>\n\n <div class=\"control\">\n playerTitle:\n <input tabindex={-1} type=\"text\" bind:value={playerTitle}>\n </div>\n\n <div class=\"control\">\n callToAction:\n <input tabindex={-1} type=\"text\" bind:value={callToAction}>\n </div>\n\n <div class=\"control\">\n skipButtonStyle:\n <select tabindex={-1} bind:value={skipButtonStyle}>\n <option>auto</option>\n <option>segments</option>\n <option>seconds</option>\n <option>seconds-15</option>\n <option>seconds-15-30</option>\n <option>tracks</option>\n </select>\n </div>\n\n <div class=\"control\">\n playlistStyle:\n <select tabindex={-1} bind:value={playlistStyle}>\n <option>auto</option>\n <option>show</option>\n <option>show-3</option>\n <option>show-999</option>\n <option>hide</option>\n </select>\n </div>\n\n <div class=\"control\">\n playlistToggle:\n <select tabindex={-1} bind:value={playlistToggle}>\n <option>auto</option>\n <option>show</option>\n <option>hide</option>\n </select>\n </div>\n\n <div class=\"control\">\n advertIndex:\n <select tabindex={-1} bind:value={advertIndex}>\n <option value={-1}>-1 (none)</option>\n {#each adverts as item, i}\n <option value={i}>{i} ({item.placement})</option>\n {/each}\n </select>\n </div>\n\n <div class=\"control\">\n widgetStyle:\n <select tabindex={-1} bind:value={widgetStyle}>\n <option>small</option>\n <option>standard</option>\n <option>large</option>\n <option>video</option>\n </select>\n </div>\n\n <div class=\"control\">\n widgetPosition:\n <select tabindex={-1} bind:value={widgetPosition}>\n <option>auto</option>\n <option>left</option>\n <option>center</option>\n <option>right</option>\n </select>\n </div>\n\n <div class=\"control\">\n widgetWidth:\n <select tabindex={-1} bind:value={widgetWidth}>\n <option>auto</option>\n <option>400px</option>\n <option>30rem</option>\n <option>fit-content</option>\n <option>initial</option>\n <option>0</option>\n </select>\n </div>\n\n <div class=\"control\">\n textColor:\n <input tabindex={-1} type=\"text\" bind:value={textColor}>\n </div>\n\n <div class=\"control\">\n backgroundColor:\n <input tabindex={-1} type=\"text\" bind:value={backgroundColor}>\n </div>\n\n <div class=\"control\">\n iconColor:\n <input tabindex={-1} type=\"text\" bind:value={iconColor}>\n </div>\n\n <div class=\"control\">\n highlightColor:\n <input tabindex={-1} type=\"text\" bind:value={highlightColor}>\n </div>\n\n <div class=\"control\">\n highlightSections:\n <select tabindex={-1} bind:value={highlightSections}>\n <option>all</option>\n <option>body</option>\n <option>none</option>\n <option>all-none</option>\n <option>none-all</option>\n </select>\n </div>\n\n <div class=\"control\">\n clickableSections:\n <select tabindex={-1} bind:value={clickableSections}>\n <option>all</option>\n <option>body</option>\n <option>none</option>\n <option>all-none</option>\n <option>none-all</option>\n </select>\n </div>\n\n <div class=\"control\">\n segmentWidgetSections:\n <select tabindex={-1} bind:value={segmentWidgetSections}>\n <option>all</option>\n <option>body</option>\n <option>none</option>\n <option>all-none</option>\n <option>none-all</option>\n </select>\n </div>\n\n <div class=\"control\">\n segmentWidgetPosition:\n <select tabindex={-1} bind:value={segmentWidgetPosition}>\n {#each [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] as hour}\n <option>{hour}-oclock</option>\n {/each}\n </select>\n </div>\n\n {#if showAdvancedSettings}\n <br/>\n <strong>Advanced settings:</strong>\n <br/><br/>\n\n <div class=\"control\">\n projectId:\n <input tabindex={-1} type=\"text\" bind:value={projectId}>\n </div>\n\n <div class=\"control\">\n contentId:\n <input tabindex={-1} type=\"text\" bind:value={contentId}>\n </div>\n\n <div class=\"control\">\n playlistId:\n <input tabindex={-1} type=\"text\" bind:value={playlistId}>\n </div>\n\n <div class=\"control\">\n sourceId:\n <input tabindex={-1} type=\"text\" bind:value={sourceId}>\n </div>\n\n <div class=\"control\">\n sourceUrl:\n <input tabindex={-1} type=\"text\" bind:value={sourceUrl}>\n </div>\n\n <div class=\"control\">\n showUserInterface:\n <select tabindex={-1} bind:value={showUserInterface}>\n <option>{false}</option>\n <option>{true}</option>\n </select>\n </div>\n\n <div class=\"control\">\n mediaSession:\n <select tabindex={-1} bind:value={mediaSession}>\n <option>auto</option>\n <option>override</option>\n <option>none</option>\n </select>\n </div>\n\n <div class=\"control\">\n contentIndex:\n <select tabindex={-1} bind:value={contentIndex}>\n {#each content as item, i}\n <option value={i}>{i} ({item.title})</option>\n {/each}\n </select>\n </div>\n\n <div class=\"control\">\n introsOutrosIndex:\n <select tabindex={-1} bind:value={introsOutrosIndex}>\n <option value={-1}>-1 (none)</option>\n {#each introsOutros as item, i}\n <option value={i}>{i}: {item.placement}</option>\n {/each}\n </select>\n </div>\n\n <div class=\"control\">\n persistentAdImage:\n <select tabindex={-1} bind:value={persistentAdImage}>\n <option>{false}</option>\n <option>{true}</option>\n </select>\n </div>\n\n <div class=\"control\">\n persistentIndex:\n <select tabindex={-1} bind:value={persistentIndex}>\n <option value={-1}>-1 (none)</option>\n {#each adverts as item, i}\n <option value={i}>{i}: {item.placement}</option>\n {/each}\n </select>\n </div>\n\n <div class=\"control\">\n duration:\n <input tabindex={-1} type=\"text\" bind:value={duration}>\n </div>\n\n <div class=\"control\">\n currentTime:\n <input tabindex={-1} type=\"text\" bind:value={currentTime}>\n </div>\n\n <div class=\"control\">\n playbackRate:\n <input tabindex={-1} type=\"text\" bind:value={playbackRate}>\n </div>\n\n <div class=\"control\">\n widgetTarget:\n <input tabindex={-1} type=\"text\" bind:value={widgetTarget}>\n </div>\n\n <div class=\"control\">\n logoIconEnabled:\n <select tabindex={-1} bind:value={logoIconEnabled}>\n <option>{false}</option>\n <option>{true}</option>\n </select>\n </div>\n\n <div class=\"control\">\n advertConsent:\n <select tabindex={-1} bind:value={advertConsent}>\n <option>personalized</option>\n <option>non-personalized</option>\n <option>under-the-age-of-consent</option>\n </select>\n </div>\n\n <div class=\"control\">\n analyticsConsent:\n <select tabindex={-1} bind:value={analyticsConsent}>\n <option>allowed</option>\n <option>without-local-storage</option>\n <option>none</option>\n </select>\n </div>\n\n <div class=\"control\">\n analyticsCustomUrl:\n <input tabindex={-1} type=\"text\" bind:value={analyticsCustomUrl}>\n </div>\n\n <div class=\"control\">\n analyticsTag:\n <input tabindex={-1} type=\"text\" bind:value={analyticsTag}>\n </div>\n {/if}\n\n <br/>\n\n {#if showAdvancedSettings}\n <a tabindex={-1} href=\"#_\" on:click={() => showAdvancedSettings = false}>hide advanced settings</a>\n {:else}\n <a tabindex={-1} href=\"#_\" on:click={() => showAdvancedSettings = true}>show advanced settings</a>\n {/if}\n</div>\n\n<style>\n .heading {\n display: flex;\n }\n\n .docs {\n text-align: right;\n }\n\n .control {\n display: flex;\n column-gap: 8px;\n margin: 10px 0;\n }\n\n input[type=\"text\"] {\n border: 1px solid grey;\n border-radius: 2px;\n }\n\n .control, input[type=\"text\"], select, strong, a {\n font-family: \"InterVariable\", sans-serif;\n font-size: 14px;\n width: 100%;\n }\n\n strong {\n font-weight: bold;\n }\n\n a {\n text-decoration: underline;\n }\n</style>\n","const blobForImageUrl = (imageUrl, width, height) => {\n revokePreviousUrls(imageUrl);\n\n const image = new Image();\n image.setAttribute(\"crossorigin\", \"anonymous\");\n\n return new Promise((resolve, reject) => {\n image.addEventListener(\"load\", handleLoad(image, width, height, resolve, reject));\n image.addEventListener(\"error\", reject);\n\n image.src = imageUrl;\n });\n};\n\nconst handleLoad = (image, width, height, resolve, reject) => () => {\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n\n canvas.width = width;\n canvas.height = height;\n\n // TODO: get image dimensions and preserve aspect ratio?\n\n context.drawImage(image, 0, 0, width, height);\n canvas.toBlob(handleToBlob(image, width, height, resolve, reject)); // png by default.\n};\n\nconst objectUrls = {};\n\nconst handleToBlob = (image, width, height, resolve, reject) => (blob) => {\n if (!blob) { reject(); }\n\n const src = URL.createObjectURL(blob);\n\n objectUrls[image.src] ||= [];\n objectUrls[image.src].push(src);\n\n resolve({ src, sizes: `${width}x${height}`, type: \"image/png\" });\n};\n\nconst revokePreviousUrls = (currentUrl) => {\n const previousImageUrls = Object.keys(objectUrls).filter(url => url !== currentUrl);\n const previousObjectUrls = previousImageUrls.map(url => objectUrls[url]).flat();\n\n previousObjectUrls.forEach(url => URL.revokeObjectURL(url));\n};\n\nexport default blobForImageUrl;\n","const blobForSvgNode = async (svgElement, width, height) => {\n svgElement = await svgElement;\n\n const html = svgElement.innerHTML;\n const src = `data:image/svg+xml,${encodeURIComponent(html)}`;\n\n return { src, sizes: `${width}x${height}`, type: \"image/svg+xml\" };\n};\n\nexport default blobForSvgNode;\n","<script>\n import { tick } from \"svelte\";\n import VolumeUp from \"./svg_icons/VolumeUp.svelte\";\n import blobForImageUrl from \"../helpers/blobForImageUrl\";\n import blobForSvgNode from \"../helpers/blobForSvgNode\";\n import newEvent from \"../helpers/newEvent\";\n\n // Use these sizes: https://developer.mozilla.org/en-US/docs/Web/API/MediaMetadata\n const imageSizes = [96, 128, 192, 256, 384, 512];\n\n // https://developer.mozilla.org/en-US/docs/Web/API/MediaSession/setActionHandler\n const actionTypes = [\"hangup\", \"nextslide\", \"nexttrack\", \"pause\", \"play\", \"previousslide\", \"previoustrack\", \"seekbackward\", \"seekforward\", \"seekto\", \"skipad\", \"stop\", \"togglecamera\", \"togglemicrophone\"];\n\n export let content = [];\n export let contentIndex = 0;\n export let activeAdvert = undefined;\n export let persistentAdvert = undefined;\n export let duration = 0;\n export let playbackState = \"stopped\";\n export let skipButtonStyle = \"auto\";\n export let backgroundColor = \"#f5f5f5\";\n export let iconColor = \"black\";\n export let onEvent = () => {};\n\n let artwork = [];\n let failedUrls = new Set();\n\n let fallbackSvgs = imageSizes.map(() => undefined);\n let renderedSvgs = imageSizes.map(() => undefined);\n\n $: isStopped = playbackState === \"stopped\";\n $: isAdvert = activeAdvert && !isStopped;\n $: isPlaylist = content.length > 1;\n\n $: contentItem = content[contentIndex];\n $: skipStyle = skipButtonStyle === \"auto\" ? (isPlaylist ? \"tracks\" : \"segments\") : skipButtonStyle;\n\n $: backwardsSeconds = parseFloat(skipStyle.split(\"-\")[1] || 10);\n $: forwardsSeconds = parseFloat(skipStyle.split(\"-\")[2] || backwardsSeconds);\n\n $: showSeekButtons = !isAdvert && skipStyle !== \"tracks\";\n $: showTrackButtons = !isAdvert && skipStyle === \"tracks\";\n $: allowScrubbing = !isAdvert;\n\n $: background = isAdvert && activeAdvert?.backgroundColor || backgroundColor;\n $: foreground = isAdvert && activeAdvert?.iconColor || iconColor;\n $: background, foreground, renderedSvgs = imageSizes.map((_, i) => tick().then(() => fallbackSvgs[i]));\n\n $: imageUrl_ = isAdvert && activeAdvert.imageUrl || !isStopped && persistentAdvert?.imageUrl || contentItem?.imageUrl;\n $: imageUrl = failedUrls.has(imageUrl_) ? null : imageUrl_;\n\n $: pngArtworks = imageUrl ? imageSizes.map(s => blobForImageUrl(imageUrl, s, s)) : [];\n $: urlArtworks = imageUrl ? [{ src: imageUrl, sizes: \"any\" }] : [];\n $: svgArtworks = imageUrl ? [] : imageSizes.map((s, i) => blobForSvgNode(renderedSvgs[i], s, s));\n\n $: artworks = Promise.all([...pngArtworks, ...urlArtworks, ...svgArtworks]);\n const onReject = () => failedUrls = failedUrls.add(imageUrl);\n\n $: title = contentItem?.title || \"\";\n $: artworks.then(arr => artwork = arr).catch(onReject);\n $: artist = \"\"; // TODO: maybe set to projectTitle\n $: album = \"\"; // TODO: maybe set to playlistTitle\n\n $: navigator.mediaSession.metadata = new MediaMetadata({ title, artist, album, artwork });\n $: navigator.mediaSession.setByPlayer = true;\n\n // Remove existing handlers, e.g. set by the user's website or other players.\n $: actionTypes.forEach(type => {\n // Chrome doesn't support the 'skipad' action type and throws an error.\n try { navigator.mediaSession.setActionHandler(type, null); } catch (e) { /* Ignore */ }\n });\n\n $: navigator.mediaSession.setActionHandler(\"play\", () => {\n onEvent(newEvent({\n type: \"PressedPlay\",\n description: \"The play button was pressed.\",\n initiatedBy: \"media-session-api\",\n }));\n });\n\n $: navigator.mediaSession.setActionHandler(\"pause\", () => {\n onEvent(newEvent({\n type: \"PressedPause\",\n description: \"The pause button was pressed.\",\n initiatedBy: \"media-session-api\",\n }));\n });\n\n $: navigator.mediaSession.setActionHandler(\"seekto\", allowScrubbing ? ({ seekTime }) => {\n onEvent(newEvent({\n type: \"ScrubbedProgressBar\",\n description: \"The user pressed on the progress bar then dragged.\",\n initiatedBy: \"media-session-api\",\n ratio: Math.max(0, Math.min(1, seekTime / duration)),\n }));\n } : null);\n\n $: navigator.mediaSession.setActionHandler(\"seekbackward\", showSeekButtons ? ({ seekOffset }) => {\n if (skipStyle === \"seconds\" || seekOffset) {\n onEvent(newEvent({\n type: \"PressedSeekBack\",\n description: \"The seek backward button was pressed.\",\n initiatedBy: \"media-session-api\",\n seconds: seekOffset || backwardsSeconds,\n }));\n } else {\n onEvent(newEvent({\n type: \"PressedPrevSegment\",\n description: \"The previous segment button was pressed.\",\n initiatedBy: \"media-session-api\",\n }));\n }\n } : null);\n\n $: navigator.mediaSession.setActionHandler(\"seekforward\", showSeekButtons ? ({ seekOffset }) => {\n if (skipStyle === \"seconds\" || seekOffset) {\n onEvent(newEvent({\n type: \"PressedSeekAhead\",\n description: \"The seek ahead button was pressed.\",\n initiatedBy: \"media-session-api\",\n seconds: seekOffset || forwardsSeconds,\n }));\n } else {\n onEvent(newEvent({\n type: \"PressedNextSegment\",\n description: \"The next segment button was pressed.\",\n initiatedBy: \"media-session-api\",\n }));\n }\n } : null);\n\n $: navigator.mediaSession.setActionHandler(\"previoustrack\", showTrackButtons ? () => {\n onEvent(newEvent({\n type: \"PressedPrevTrack\",\n description: \"The previous track button was pressed.\",\n initiatedBy: \"media-session-api\",\n }));\n } : null);\n\n $: navigator.mediaSession.setActionHandler(\"nexttrack\", showTrackButtons ? () => {\n onEvent(newEvent({\n type: \"PressedNextTrack\",\n description: \"The next track button was pressed.\",\n initiatedBy: \"media-session-api\",\n }));\n } : null);\n\n // TODO: maybe set playbackState/positionState if it isn't working for VAST ads.\n // TODO: if skipButtonStyle is tracks but there's only one track, should we change it?\n</script>\n\n<div class=\"media-session\">\n {#each imageSizes as size, i}\n <div bind:this={fallbackSvgs[i]} style=\"display: none\">\n <VolumeUp fill={background} color={foreground} scale={size / 18} zoom={0.65} />\n </div>\n {/each}\n</div>\n","<script>\n export let analyticsTag;\n\n $: alreadyLoaded = window.gtag;\n</script>\n\n<svelte:head>\n {#if !alreadyLoaded}\n <script async src=\"https://www.googletagmanager.com/gtag/js?id={analyticsTag}\"></script>\n\n <script>\n window.dataLayer = window.dataLayer || [];\n function gtag() { dataLayer.push(arguments); }\n gtag(\"js\", new Date());\n </script>\n {/if}\n</svelte:head>\n","// This class is responsible for selecting which consumer is the current owner\n// of a resource. It uses a simple strategy that grants ownership to the\n// consumer that most recently added interest. When a consumer removes interest\n// ownership reverts to the next-most-recent consumer, and so on.\n//\n// If two owners call onSelected with exactly the same arguments then the\n// OwnershipMediator avoids calling onSelected unnecessarily. The current owner\n// of a resource is always the last element in the this.consumers array.\n\nclass OwnershipMediator {\n constructor(onSelected, onDeselected) {\n this.onSelected = onSelected;\n this.onDeselected = onDeselected;\n this.consumers = {};\n }\n\n addInterest(resourceId, consumerId, ...args) {\n this.consumers[resourceId] ||= [];\n const last = this.consumers[resourceId].slice(-1)[0];\n\n this.consumers[resourceId].push({ consumerId, args });\n\n if (last && this.#arraysEqual(args, last.args)) { return; }\n\n if (last) { this.onDeselected(resourceId, ...last.args); }\n this.onSelected(resourceId, ...args);\n }\n\n removeInterest(resourceId, consumerId) {\n this.consumers[resourceId] ||= [];\n const last = this.consumers[resourceId].slice(-1)[0];\n\n this.#removeLast(this.consumers[resourceId], o => o.consumerId === consumerId);\n\n const wasSelected = last && consumerId === last.consumerId;\n if (!wasSelected) { return; }\n\n const nextLast = this.consumers[resourceId].slice(-1)[0];\n if (nextLast && this.#arraysEqual(last.args, nextLast.args)) { return; }\n\n this.onDeselected(resourceId, ...last.args);\n if (nextLast) { this.onSelected(resourceId, ...nextLast.args); }\n }\n\n // private\n\n #arraysEqual(arr1, arr2) {\n return arr1.length === arr2.length && arr1.every((e, i) => e === arr2[i]);\n }\n\n #removeLast(array, conditionFn) {\n for (let i = array.length - 1; i >= 0; i -= 1) {\n if (!conditionFn(array[i])) { continue; }\n\n array.splice(i, 1);\n return;\n }\n }\n}\n\nexport default OwnershipMediator;\n","const sectionEnabled = (type, segment, sections) => {\n let [currentSections, hoveredSections] = sections.split(\"-\");\n\n currentSections ||= \"none\";\n hoveredSections ||= currentSections;\n\n const typeSections = type === \"current\" ? currentSections : hoveredSections;\n return typeSections === \"all\" || typeSections === \"body\" && segment?.section === \"body\";\n};\n\nexport default sectionEnabled;\n","import OwnershipMediator from \"./ownershipMediator\";\nimport sectionEnabled from \"./sectionEnabled\";\n\nconst dataAttribute = \"data-beyondwords-marker\";\nconst markClasses = (m) => [\"beyondwords-highlight\", \"bwp\", `marker-${m}`];\n\nclass SegmentHighlights {\n static #mediator = new OwnershipMediator(this.#addHighlights, this.#removeHighlights);\n\n update(type, segment, sections, background) {\n const enabled = sectionEnabled(type, segment, sections);\n\n const previous = this[`prev${type}`];\n const current = enabled ? segment?.marker : null;\n\n if (current) { SegmentHighlights.#mediator.addInterest(current, this, background); }\n if (previous) { SegmentHighlights.#mediator.removeInterest(previous, this); }\n\n this[`prev${type}`] = current;\n }\n\n static #addHighlights(marker, background) {\n const markerElements = document.querySelectorAll(`[${dataAttribute}=\"${marker}\"]`);\n\n for (const element of markerElements) {\n const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT, null, false);\n let node;\n\n while ((node = walker.nextNode())) {\n const isEmpty = /^\\s*$/.test(node.nodeValue);\n if (isEmpty) { continue; }\n\n const isLink = node.parentNode.nodeName.toLowerCase() === \"a\";\n if (isLink) { node = node.parentNode; }\n\n const mark = document.createElement(\"mark\");\n\n mark.classList.add(...markClasses(marker));\n mark.style.background = background;\n\n node.parentNode.insertBefore(mark, node);\n mark.appendChild(node);\n }\n }\n }\n\n static #removeHighlights(marker) {\n const markerElements = document.querySelectorAll(`[${dataAttribute}=\"${marker}\"]`);\n\n for (const element of markerElements) {\n const markElements = element.querySelectorAll(`mark.${markClasses(marker)}`);\n\n for (const mark of markElements) {\n for (const child of mark.childNodes) {\n mark.parentNode.insertBefore(child, mark);\n mark.remove();\n }\n }\n }\n }\n}\n\nexport default SegmentHighlights;\nexport { dataAttribute };\n","import OwnershipMediator from \"./ownershipMediator\";\nimport sectionEnabled from \"./sectionEnabled\";\nimport { dataAttribute } from \"./segmentHighlights\";\n\nconst markerClasses = [\"beyondwords-clickable\", \"bwp\"]; // Also set by SegmentContainers.\n\n// This class only adds/removes a className to show 'cursor: pointer' when hovering.\n// An event is always emitted when you click on a segment and RootController\n// decides whether to act on it by checking if its section is in clickableSections.\n//\n// We don't add 'cursor: pointer' to all data-beyondwords-marker elements becuase\n// some might not be clickable if the marker isn't in the content's segments. It\n// would be confusing if the pointer icon showed but nothing happened when clicking.\n\nclass SegmentClickables {\n static #mediator = new OwnershipMediator(this.#addClasses, this.#removeClasses);\n\n update(segment, sections) {\n const enabled = sectionEnabled(\"hovered\", segment, sections);\n\n const previous = this.previous;\n const current = enabled ? segment?.marker : null;\n\n if (current) { SegmentClickables.#mediator.addInterest(current, this); }\n if (previous) { SegmentClickables.#mediator.removeInterest(previous, this); }\n\n this.previous = current;\n }\n\n static #addClasses(marker) {\n const markerElements = document.querySelectorAll(`[${dataAttribute}=\"${marker}\"]`);\n\n for (const element of markerElements) {\n element.classList.add(...markerClasses);\n }\n }\n\n static #removeClasses(marker) {\n const markerElements = document.querySelectorAll(`[${dataAttribute}=\"${marker}\"]`);\n\n for (const element of markerElements) {\n safelyRemoveClasses(element, markerClasses);\n }\n }\n}\n\n// Remove all classes but leave the .bwp in place if there are other .beyondwords-* classes.\n// This ensures the prefixed CSS rules continue to target the element from the other updaters.\nconst safelyRemoveClasses = (element, classes) => {\n if (!element) { return; }\n\n const otherClasses = [...element.classList].filter(c => !classes.includes(c));\n const hasOtherClass = otherClasses.some(c => c.startsWith(\"beyondwords-\"));\n\n const classesToRemove = hasOtherClass ? classes.filter(c => c !== \"bwp\") : classes;\n element.classList.remove(...classesToRemove);\n};\n\nexport default SegmentClickables;\nexport { safelyRemoveClasses };\n","import OwnershipMediator from \"./ownershipMediator\";\nimport { dataAttribute } from \"./segmentHighlights\";\nimport { safelyRemoveClasses } from \"./segmentClickables\";\n\nconst containerClasses = (m, p, s) => [\"beyondwords-widget\", \"bwp\", `marker-${m}`, `position-${p}`, `for-${s}-player`];\nconst markerClasses = [\"beyondwords-relative\", \"bwp\"]; // Also set by SegmentClickables.\n\nclass SegmentContainers {\n static #mediator = new OwnershipMediator(this.#addContainers, this.#removeContainers);\n\n constructor(onUpdate) {\n this.onUpdate = onUpdate;\n this.containers = [];\n }\n\n update(segment, sections, position, playerStyle) {\n const sticky = sections.includes(\"all\") || sections.includes(\"body\");\n\n const previous = this.previous;\n const current = segment?.marker || (sticky && previous?.marker);\n\n if (current) { SegmentContainers.#mediator.addInterest(current, this, this, position, playerStyle); }\n if (previous) { SegmentContainers.#mediator.removeInterest(previous, this); }\n\n this.previous = current;\n }\n\n reset() {\n this.update(null, \"none\");\n }\n\n static #addContainers(marker, self, position, playerStyle) {\n const element = document.querySelector(`[${dataAttribute}=\"${marker}\"]`);\n const container = document.createElement(\"div\");\n\n // Don't add 'position: relative' to the data-beyondwords-marker element\n // if we can help it to reduce interference on the publisher's webpage.\n const needsRelative = [\"2-oclock\", \"3-oclock\", \"4-oclock\", \"8-oclock\", \"9-oclock\", \"10-oclock\"].includes(position);\n\n if (needsRelative) { element.classList.add(...markerClasses); }\n container.classList.add(...containerClasses(marker, position, playerStyle));\n\n const insertBefore = [\"11-oclock\", \"12-oclock\", \"1-oclock\"].includes(position);\n\n if (insertBefore) {\n element.insertBefore(container, element.firstChild);\n } else {\n element.appendChild(container);\n }\n\n self.containers.push(container);\n self.onUpdate(self.containers);\n }\n\n static #removeContainers(marker, self, position, playerStyle) {\n const classes = containerClasses(marker, position, playerStyle);\n\n for (let i = 0; i < self.containers.length; i += 1) {\n const isMatch = classes.every(c => self.containers[i].classList.contains(c));\n if (!isMatch) { continue; }\n\n const element = self.containers[i].parentNode;\n safelyRemoveClasses(element, markerClasses);\n\n self.containers[i].remove();\n self.containers.splice(i, 1);\n\n i -= 1;\n }\n\n self.onUpdate(self.containers);\n }\n}\n\nexport default SegmentContainers;\n","import newEvent from \"./newEvent\";\n\nconst identifiersEvent = () => (\n newEvent({\n type: \"IdentifiersChanged\",\n description: \"The Player's content identifiers changed.\",\n initiatedBy: \"browser\",\n })\n);\n\nexport default identifiersEvent;\n","import throwError from \"../helpers/throwError\";\n\nconst fetchJson = async (url, fetchOptions = {}) => {\n const response = await fetch(url, fetchOptions).catch(() => {});\n const json = await response?.json().catch(() => {});\n\n if (response?.status !== 200) {\n throwError(`Failed to fetch ${url}`, {\n ...fetchOptions,\n responseStatus: response?.status,\n responseJson: json,\n });\n }\n\n return json;\n};\n\nconst postJson = (url, data) => (\n fetchJson(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(data, (_, v) => v === undefined ? null : v),\n })\n);\n\nexport default fetchJson;\nexport { postJson };\n","import fetchJson from \"../helpers/fetchJson\";\n\nclass WebSocketClient {\n constructor(playerApiUrl, projectId, writeToken) {\n this.baseUrl = this.#resolveBaseUrl(playerApiUrl);\n this.projectId = projectId;\n this.writeToken = writeToken;\n }\n\n async getWebSocketToken() {\n const headers = { Authorization: `Token token=${this.writeToken}` };\n const { token } = await fetchJson(`https://${this.baseUrl}/api/v4/token/ws`, { headers });\n this.webSocketToken = token;\n }\n\n async establishConnection(onMessage, onError) {\n const webSocketUrl = `wss://${this.baseUrl}/cable?token=${this.webSocketToken}`;\n const protocol = \"actioncable-v1-json\";\n\n this.webSocket = new WebSocket(webSocketUrl, protocol);\n this.webSocket.onmessage = e => onMessage(JSON.parse(e.data));\n this.webSocket.onerror = onError;\n\n await new Promise(resolve => this.webSocket.onopen = resolve);\n }\n\n subscribeToStatusChanges() {\n const identifier = JSON.stringify({ channel: \"Api::V1::ProjectChannel\", id: this.projectId });\n const jsonData = JSON.stringify({ command: \"subscribe\", identifier });\n\n this.webSocket.send(jsonData);\n }\n\n destroy() {\n this.webSocketToken = null;\n if (!this.webSocket) { return; }\n\n this.webSocket.onmessage = () => {};\n this.webSocket.onerror = () => {};\n this.webSocket.close();\n this.webSocket = null;\n }\n\n // private\n\n #resolveBaseUrl(playerApiUrl) {\n if (playerApiUrl.includes(\"staging\")) {\n return \"app.staging-beyondwords.io\";\n } else {\n return \"app.beyondwords.io\";\n }\n }\n}\n\nexport default WebSocketClient;\n","import WebSocketClient from \"../api_clients/webSocketClient\";\nimport newEvent from \"../helpers/newEvent\";\nimport throwError from \"../helpers/throwError\";\n\nlet client;\n\nconst onStatusChange = async (playerApiUrl, projectId, writeToken, onEvent) => {\n if (!playerApiUrl || !projectId || !writeToken) { return; }\n\n client?.destroy();\n client = new WebSocketClient(playerApiUrl, projectId, writeToken);\n\n await client.getWebSocketToken();\n await client.establishConnection(handleMessage(onEvent), handleError);\n await client.subscribeToStatusChanges();\n};\n\nconst handleMessage = (onEvent) => (webSocketEvent) => {\n const isStatusChange = webSocketEvent?.message?.result?.action === \"podcast_state_updated\";\n if (isStatusChange) { handleStatusChange(webSocketEvent, onEvent); }\n\n const isRejection = webSocketEvent.type === \"reject_subscription\";\n if (isRejection) { handleRejection(webSocketEvent); }\n};\n\nconst handleStatusChange = (webSocketEvent, onEvent) => {\n const result = webSocketEvent.message.result;\n\n onEvent(newEvent({\n type: \"ContentStatusChanged\",\n description: \"The processing status of a content item within the project changed.\",\n initiatedBy: \"websocket\",\n contentId: result.content_id,\n legacyId: result.legacy_id,\n sourceId: result.source_id,\n sourceUrl: result.source_url,\n contentStatus: result.state,\n }));\n};\n\nconst handleRejection = (webSocketEvent) => {\n throwError(\"The WebSocket status change subscription was rejected.\", { webSocketEvent });\n};\n\nconst handleError = (error) => {\n throwError(\"Unexpected WebSocket error.\", { error });\n};\n\nexport default onStatusChange;\n","const waitUntil = (conditionFn) => {\n if (conditionFn()) { return; }\n\n return new Promise(resolve => {\n setInterval(() => conditionFn() && resolve(), 10);\n });\n};\n\nexport default waitUntil;\n","const settableProps = (object) => {\n // TODO: make this better - perhaps by adding player.props()\n const propNames = Object.keys(object.$$.props).filter(k => !ignoreList.has(k));\n const keyValues = propNames.map(name => [name, object[name]]);\n\n return Object.fromEntries(keyValues);\n};\n\nconst ignoreList = new Set([\n \"addEventListener\",\n \"removeEventListener\",\n \"mediaElement\",\n \"userInterface\",\n \"widgetInterface\",\n \"controller\",\n]);\n\nexport default settableProps;\n","const diffObject = (objBefore, objAfter) => {\n const keys = new Set([...Object.keys(objBefore), ...Object.keys(objAfter)]);\n const diff = {};\n\n for (const key of keys) {\n const valueBefore = objBefore[key];\n const valueAfter = objAfter[key];\n\n if (valueBefore !== valueAfter) {\n diff[key] = { previousValue: valueBefore, currentValue: valueAfter };\n }\n }\n\n return diff;\n};\n\nexport default diffObject;\n","import waitUntil from \"./waitUntil\";\nimport settableProps from \"./settableProps\";\nimport diffObject from \"./diffObject\";\n\n// TODO: move state onto player (or into controller?) so that you can use transitions with multiple player instances.\nlet previousIndex = -1;\nconst changedProps = [];\n\nconst applyTransitions = async (transitions, controller, currentTime) => {\n await waitUntil(() => controller.player);\n const player = controller.player;\n\n const currentIndex = transitionIndexAtTime(player.contentIndex, currentTime, transitions);\n\n if (currentIndex > previousIndex) { callTransitions(player, previousIndex, currentIndex, transitions); }\n if (currentIndex < previousIndex) { undoTransitions(player, previousIndex, currentIndex); }\n\n previousIndex = currentIndex;\n};\n\nconst transitionIndexAtTime = (i, time, transitions) => {\n const nextIndex = transitions.findIndex(t => t[0] === i && t[1] > time || t[0] > i);\n const afterTheEnd = nextIndex === -1;\n\n if (afterTheEnd) {\n return transitions.length - 1;\n } else {\n return nextIndex - 1;\n }\n};\n\nconst callTransitions = (player, previousIndex, currentIndex, transitions) => {\n for (let i = previousIndex + 1; i <= currentIndex; i += 1) {\n const before = settableProps(player);\n\n transitions[i][2](player);\n const after = settableProps(player);\n\n const diff = diffObject(before, after);\n changedProps.push(diff);\n }\n};\n\nconst undoTransitions = (player, previousIndex, currentIndex) => {\n for (let i = previousIndex; i > currentIndex; i -= 1) {\n const diff = changedProps.pop();\n\n for (const [key, delta] of Object.entries(diff)) {\n player[key] = delta.previousValue;\n }\n }\n};\n\nexport default applyTransitions;\n","import throwError from \"./throwError\";\n\nconst resolveTarget = (target) => {\n if (!target) {\n return { newTarget: appendDivToBody(), showUserInterface: false };\n }\n\n if (isScriptTag(target)) {\n return { newTarget: addDivAfter(target), showUserInterface: true };\n }\n\n if (typeof target === \"string\") {\n return { newTarget: findByQuery(target), showUserInterface: true };\n }\n\n return { newTarget: target, showUserInterface: true };\n};\n\n// private\n\nconst isScriptTag = (target) => {\n return typeof target === \"object\" && target.nodeName.toLowerCase() === \"script\";\n};\n\nconst appendDivToBody = () => {\n const div = document.createElement(\"div\");\n document.body.appendChild(div);\n\n return div;\n};\n\nconst addDivAfter = (target) => {\n const div = document.createElement(\"div\");\n target.parentNode.insertBefore(div, target.nextSibling);\n\n return div;\n};\n\nconst findByQuery = (target, type = \"player\") => {\n if (typeof target !== \"string\") { return target; }\n\n const elements = document.querySelectorAll(target);\n\n if (elements.length === 0) {\n throwError(`Failed to initialize ${type} because the target could not be found.`, { target, elements });\n }\n\n if (elements.length > 1) {\n throwError(`Failed to initialize ${type} because the target is ambiguous. (${elements.length} elements match)`, { target, elements });\n }\n\n return elements[0];\n};\n\nexport default resolveTarget;\nexport { findByQuery };\n","<!-- svelte-ignore unused-export-let -->\n<script>\n import MediaElement from \"./MediaElement.svelte\";\n import UserInterface from \"./UserInterface.svelte\";\n import ExternalWidget from \"./ExternalWidget.svelte\";\n import ControlPanel from \"./ControlPanel.svelte\";\n import MediaSession from \"./MediaSession.svelte\";\n import GoogleAnalytics from \"./GoogleAnalytics.svelte\";\n import StyleReset from \"./StyleReset.svelte\";\n import SegmentContainers from \"../helpers/segmentContainers\";\n import SegmentClickables from \"../helpers/segmentClickables\";\n import SegmentHighlights from \"../helpers/segmentHighlights\";\n import identifiersEvent from \"../helpers/identifiersEvent\";\n import onStatusChange from \"../helpers/onStatusChange\";\n import sectionEnabled from \"../helpers/sectionEnabled\";\n import applyTransitions from \"../helpers/applyTransitions\";\n import { findByQuery } from \"../helpers/resolveTarget\";\n\n // Please document all settings and keep in-sync with /doc/player-settings.md\n export let playerApiUrl = \"https://api.beyondwords.io/v1/projects/{id}/player\";\n export let projectId = undefined;\n export let contentId = undefined;\n export let playlistId = undefined;\n export let sourceId = undefined;\n export let sourceUrl = undefined;\n export let playlist = [];\n export let showUserInterface = true;\n export let playerStyle = \"standard\";\n export let playerTitle = undefined;\n export let callToAction = undefined;\n export let skipButtonStyle = \"auto\";\n export let playlistStyle = \"auto-5-4\";\n export let playlistToggle = \"auto\";\n export let downloadFormats = [];\n export let mediaSession = \"auto\";\n export let content = [];\n export let contentIndex = 0;\n export let introsOutros = [];\n export let introsOutrosIndex = -1;\n export let adverts = [];\n export let advertIndex = -1;\n export let persistentAdImage = false;\n export let persistentIndex = -1;\n export let duration = 0;\n export let currentTime = 0;\n export let playbackState = \"stopped\";\n export let playbackRate = 1;\n export let playbackRates = [0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 2, 2.5, 3];\n export let widgetStyle = \"standard\";\n export let widgetPosition = \"auto\";\n export let widgetWidth = \"auto\";\n export let widgetTarget = undefined;\n export let textColor = \"#111\";\n export let backgroundColor = \"#f5f5f5\";\n export let iconColor = \"rgba(0, 0, 0, 0.8)\";\n export let highlightColor = \"#eee\";\n export let logoIconEnabled = true;\n export let highlightSections = \"all\";\n export let clickableSections = \"all\";\n export let segmentWidgetSections = \"body\";\n export let segmentWidgetPosition = \"7-oclock\";\n export let currentSegment = undefined;\n export let hoveredSegment = undefined;\n export let loadedMedia = undefined;\n export let advertConsent = \"personalized\";\n export let analyticsConsent = \"allowed\";\n export let analyticsCustomUrl = undefined;\n export let analyticsTag = undefined;\n export let writeToken = undefined;\n export let captureErrors = true;\n export let onError = () => {};\n export let transitions = [];\n export let controlPanel = undefined;\n export const addEventListener = (...args) => controller.addEventListener(...args);\n export const removeEventListener = (...args) => controller.removeEventListener(...args);\n\n // These are set automatically.\n export let initialProps = {};\n export let showBottomWidget = false;\n export let showMediaSession = false;\n export let isFullScreen = false;\n export let mediaElement = undefined;\n export let userInterface = undefined;\n export let widgetInterface = undefined;\n export let controller = undefined;\n export let analyticsUrl = undefined;\n export let analyticsId = undefined;\n export let listenSessionId = undefined;\n export let sessionCreatedAt = undefined;\n export let isNewListen = false;\n export let prevPercentage = 0;\n export let segmentWidgets = [];\n export let segmentContainers = new SegmentContainers(arr => segmentWidgets = arr);\n export let segmentClickables = new SegmentClickables();\n export let segmentHighlights = new SegmentHighlights();\n export const onEvent = e => controller.processEvent({ emittedFrom, ...e });\n\n $: introOrOutro = introsOutros[introsOutrosIndex];\n $: activeAdvert = adverts[advertIndex];\n $: persistentAdvert = adverts[persistentIndex];\n $: contentItem = content[contentIndex];\n\n $: interfaceStyle = isFullScreen ? \"video\" : playerStyle;\n $: emittedFrom = videoBehindWidget ? \"bottom-widget\" : \"inline-player\";\n\n $: widgetTarget = findByQuery(widgetTarget, \"widget\");\n $: controlPanel = findByQuery(controlPanel, \"control panel\");\n\n $: videoBehindWidget = showBottomWidget && widgetStyle === \"video\" && !isFullScreen;\n $: videoBehindStatic = showUserInterface && interfaceStyle === \"video\" && !videoBehindWidget;\n\n $: projectId, contentId, playlistId, sourceId, sourceUrl, playlist, onEvent(identifiersEvent());\n $: onStatusChange(playerApiUrl, projectId, writeToken, (statusEvent) => onEvent(statusEvent));\n\n $: lastHovered = hoveredSegment || lastHovered;\n $: currentSegment, currentAllowedInWidget && resetHovered();\n\n const resetHovered = () => lastHovered = hoveredSegment;\n\n $: currentAllowedInWidget = sectionEnabled(\"current\", currentSegment, segmentWidgetSections);\n $: hoveredAllowedInWidget = sectionEnabled(\"hovered\", lastHovered, segmentWidgetSections);\n\n $: widgetSegment = (hoveredAllowedInWidget && lastHovered) || (currentAllowedInWidget && currentSegment);\n\n $: widgetIsCurrent = widgetSegment?.marker === currentSegment?.marker;\n $: showRealTimeInWidget = widgetIsCurrent || activeAdvert || introOrOutro;\n\n $: segmentContainers.update(widgetSegment, segmentWidgetSections, segmentWidgetPosition, playerStyle);\n $: segmentClickables.update(hoveredSegment, clickableSections);\n\n $: segmentHighlights.update(\"current\", currentSegment, highlightSections, highlightColor);\n $: segmentHighlights.update(\"hovered\", hoveredSegment, highlightSections, highlightColor);\n\n // TODO: if timedTransitions changes then re-apply all transitions.\n $: applyTransitions(transitions, controller, currentTime);\n</script>\n\n<MediaElement\n bind:this={mediaElement}\n {onEvent}\n {content}\n {contentIndex}\n {introOrOutro}\n {activeAdvert}\n {advertConsent}\n bind:playbackState\n bind:duration\n bind:currentTime\n bind:playbackRate\n bind:prevPercentage\n {videoBehindWidget}\n {videoBehindStatic}\n {widgetPosition}\n {widgetWidth} />\n\n{#if showUserInterface}\n <UserInterface\n bind:this={userInterface}\n {onEvent}\n playerStyle={interfaceStyle}\n {callToAction}\n {skipButtonStyle}\n {playlistStyle}\n {playlistToggle}\n {downloadFormats}\n {playerTitle}\n {content}\n {contentIndex}\n {duration}\n {currentTime}\n {playbackState}\n {playbackRate}\n {activeAdvert}\n {persistentAdvert}\n {textColor}\n {backgroundColor}\n {iconColor}\n {logoIconEnabled}\n videoIsBehind={videoBehindStatic} />\n{/if}\n\n{#if showBottomWidget || widgetTarget}\n <ExternalWidget root={widgetTarget}>\n <UserInterface\n bind:this={widgetInterface}\n {onEvent}\n playerStyle={widgetStyle}\n {callToAction}\n {skipButtonStyle}\n playlistStyle=\"hide\"\n playlistToggle=\"hide\"\n {downloadFormats}\n {playerTitle}\n fixedPosition={!widgetTarget && widgetPosition}\n fixedWidth={widgetWidth}\n {content}\n {contentIndex}\n {duration}\n {currentTime}\n {playbackState}\n {playbackRate}\n {activeAdvert}\n {persistentAdvert}\n {textColor}\n {backgroundColor}\n {iconColor}\n {logoIconEnabled}\n videoIsBehind={videoBehindWidget} />\n </ExternalWidget>\n{/if}\n\n{#each segmentWidgets as root (root)}\n <ExternalWidget {root}>\n <UserInterface\n onEvent={e => onEvent({...e, emittedFrom: \"segment-widget\", widgetSegment, widgetIsCurrent })}\n playerStyle=\"small\"\n fixedWidth={0}\n logoIconEnabled={false}\n {content}\n {contentIndex}\n {duration}\n currentTime={showRealTimeInWidget ? currentTime : widgetSegment.startTime}\n playbackState={showRealTimeInWidget ? playbackState : \"paused\"}\n {activeAdvert}\n {persistentAdvert}\n {textColor}\n {backgroundColor}\n {iconColor} />\n </ExternalWidget>\n{/each}\n\n{#if controlPanel}\n <ExternalWidget root={controlPanel}>\n <ControlPanel\n bind:projectId\n bind:contentId\n bind:playlistId\n bind:sourceId\n bind:sourceUrl\n bind:showUserInterface\n bind:playerStyle\n bind:playerTitle\n bind:callToAction\n bind:skipButtonStyle\n bind:playlistStyle\n bind:playlistToggle\n bind:mediaSession\n {content}\n bind:contentIndex\n {introsOutros}\n bind:introsOutrosIndex\n {adverts}\n bind:advertIndex\n bind:persistentAdImage\n bind:persistentIndex\n bind:duration\n bind:currentTime\n bind:playbackState\n bind:playbackRate\n bind:widgetStyle\n bind:widgetPosition\n bind:widgetWidth\n bind:widgetTarget\n bind:textColor\n bind:backgroundColor\n bind:iconColor\n bind:highlightColor\n bind:logoIconEnabled\n bind:highlightSections\n bind:clickableSections\n bind:segmentWidgetSections\n bind:segmentWidgetPosition\n bind:currentSegment\n bind:hoveredSegment\n bind:advertConsent\n bind:analyticsConsent\n bind:analyticsCustomUrl\n bind:analyticsTag />\n </ExternalWidget>\n{/if}\n\n{#if showMediaSession}\n <MediaSession\n {onEvent}\n {content}\n {contentIndex}\n {activeAdvert}\n {persistentAdvert}\n {duration}\n {playbackState}\n {skipButtonStyle}\n {backgroundColor}\n {iconColor}\n />\n{/if}\n\n{#if analyticsTag}\n <GoogleAnalytics {analyticsTag} />\n{/if}\n\n<StyleReset />\n","import fetchJson from \"../helpers/fetchJson\";\n\nclass PlayerApiClient {\n constructor(playerApiUrl, projectId) {\n this.baseUrl = playerApiUrl?.replace(\"{id}\", projectId);\n }\n\n byContentId(id) {\n return fetchJson(`${this.baseUrl}/by_content_id/${id}`);\n }\n\n byPlaylistId(id) {\n return fetchJson(`${this.baseUrl}/by_playlist_id/${id}`);\n }\n\n bySourceId(id) {\n return fetchJson(`${this.baseUrl}/by_source_id/${id}`);\n }\n\n bySourceUrl(url) {\n return fetchJson(`${this.baseUrl}/by_source_url/${url}`);\n }\n\n byIdentifiers(array) {\n return fetchJson(`${this.baseUrl}/by_identifiers/${encodeURIComponent(JSON.stringify(array))}`);\n }\n}\n\nexport default PlayerApiClient;\n","const snakeCaseKeys = (value) => {\n if (typeof value !== \"object\" || value === null) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(snakeCaseKeys);\n }\n\n return Object.fromEntries(Object.entries(value).map(([k, v]) => (\n [k.replace(/([A-Z])/g, c => `_${c.toLowerCase()}`), snakeCaseKeys(v)]\n )));\n};\n\nexport default snakeCaseKeys;\n","const resolveTheme = (theme) => {\n if (theme === \"dark\") {\n return \"dark\";\n } else if (theme === \"auto\" && isBrowserDarkMode()) {\n return \"dark\";\n } else {\n return \"light\";\n }\n};\n\nconst isBrowserDarkMode = () => (\n window.matchMedia && window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n);\n\nexport default resolveTheme;\n","import PlayerApiClient from \"../api_clients/playerApiClient\";\nimport snakeCaseKeys from \"./snakeCaseKeys\";\nimport resolveTheme from \"./resolveTheme\";\nimport newEvent from \"./newEvent\";\n\nconst setPropsFromApi = async (player) => {\n const client = new PlayerApiClient(player.playerApiUrl, player.projectId);\n if (!player.playerApiUrl || !player.projectId) { return; }\n\n const identifiers = identifiersArray(player);\n if (identifiers.length === 0) { return; }\n\n const data = await fetchData(client, identifiers).catch(() => {});\n if (!data?.content) { handleNoContent(player); return; }\n\n // The player allows you to override props from the API by adding them in the script tag.\n // For example, you could add { backgroundCollor: \"yellow\" } to set a different color.\n //\n // If player.backgroundColor is changed again later and a new API request is made, this\n // change will only persist if it was initially overridden in the script tag.\n setProps(player, data);\n};\n\nconst identifiersArray = (player) => {\n const identifiers = [];\n\n if (player.contentId) { identifiers.push({ content_id: player.contentId }); }\n if (player.playlistId) { identifiers.push({ playlist_id: player.playlistId }); }\n if (player.sourceId) { identifiers.push({ source_id: player.sourceId }); }\n if (player.sourceUrl) { identifiers.push({ source_url: player.sourceUrl }); }\n if (player.playlist) { identifiers.push(...snakeCaseKeys(player.playlist)); }\n\n return [...new Set(identifiers.map(JSON.stringify))].map(JSON.parse);\n};\n\nconst fetchData = (client, identifiers) => {\n const identifier = identifiers[0];\n\n if (identifiers.length > 1) { return client.byIdentifiers(identifiers); }\n if (identifier.content_id) { return client.byContentId(identifier.content_id); }\n if (identifier.playlist_id) { return client.byPlaylistId(identifier.playlist_id); }\n if (identifier.source_id) { return client.bySourceId(identifier.source_id); }\n if (identifier.source_url) { return client.bySourceUrl(identifier.source_url); }\n};\n\nconst handleNoContent = (player) => {\n resetSomeProps(player);\n setContentProp(player);\n setAdvertsProp(player);\n\n player.onEvent(newEvent({\n type: \"NoContentAvailable\",\n description: \"No published and processed content is available for the identifiers.\",\n initiatedBy: \"browser\",\n }));\n};\n\nconst setProps = (player, data) => {\n const theme = resolveTheme(data.settings.theme);\n const colors = data.settings[`${theme}_theme`];\n\n resetSomeProps(player);\n setContentProp(player, data);\n setAdvertsProp(player, data);\n\n set(player, \"playerStyle\", data.settings.player_style);\n set(player, \"playerTitle\", data.playlist?.title || data.settings.player_title);\n set(player, \"callToAction\", data.settings.call_to_action === \"Listen to this article\" ? null : data.settings.call_to_action);\n set(player, \"skipButtonStyle\", data.settings.skip_button_style);\n set(player, \"downloadFormats\", data.settings.download_button_enabled ? [\"mp3\"] : []);\n set(player, \"introsOutros\", introsOutrosArray(data.settings));\n set(player, \"persistentAdImage\", data.settings.persistent_ad_image);\n set(player, \"widgetStyle\", data.settings.widget_style);\n set(player, \"widgetPosition\", data.settings.widget_position);\n set(player, \"textColor\", colors.text_color);\n set(player, \"backgroundColor\", colors.background_color);\n set(player, \"iconColor\", colors.icon_color);\n set(player, \"highlightColor\", colors.highlight_color);\n set(player, \"logoIconEnabled\", data.settings.logo_icon_enabled);\n set(player, \"highlightSections\", data.settings.segment_playback_enabled ? \"all\" : \"none\");\n set(player, \"clickableSections\", data.settings.segment_playback_enabled ? \"all\" : \"none\");\n set(player, \"segmentWidgetSections\", data.settings.segment_playback_enabled ? \"none\" : \"none\"); // TODO: default to body?\n set(player, \"analyticsConsent\", analyticsConsent(data.settings));\n set(player, \"analyticsCustomUrl\", data.settings.analytics_custom_url);\n set(player, \"analyticsTag\", data.settings.analytics_tag);\n set(player, \"analyticsUrl\", data.settings.analytics_url);\n set(player, \"analyticsId\", data.settings.analytics_id);\n // TODO: add support for title_enabled\n // TODO: add support for paywall_type\n // TODO: add support for paywall_url\n // TODO: add support for share_button_enabled\n // TODO: add support for voice_icon_enabled\n};\n\nconst resetSomeProps = (player) => {\n set(player, \"contentIndex\", 0);\n set(player, \"introsOutrosIndex\", -1);\n set(player, \"advertIndex\", -1);\n set(player, \"persistentIndex\", -1);\n set(player, \"duration\", 0);\n set(player, \"currentTime\", 0);\n set(player, \"playbackState\", \"stopped\");\n set(player, \"currentSegment\", undefined);\n set(player, \"hoveredSegment\", undefined);\n};\n\nconst setContentProp = (player, data) => {\n const imageEnabled = data?.settings?.image_enabled;\n const contentArray = data?.content || [];\n\n set(player, \"content\", contentArray.map((item) => ({\n id: item.id,\n title: item.title,\n imageUrl: imageEnabled && (data.playlist?.image_url || data.settings.image_url || item.image_url),\n sourceId: item.source_id,\n sourceUrl: item.source_url,\n adsEnabled: item.ads_enabled,\n duration: item.audio[0] ? item.audio[0].duration / 1000 : 0,\n audio: item.audio.map((audio) => ({\n id: audio.id,\n url: audio.url,\n contentType: audio.content_type,\n duration: audio.duration ? audio.duration / 1000 : 0,\n })),\n video: item.video.map((video) => ({\n id: video.id,\n url: video.url,\n contentType: video.content_type,\n duration: video.duration ? video.duration / 1000 : 0,\n })),\n segments: item.segments.map((segment) => ({\n marker: segment.marker,\n section: segment.section,\n startTime: segment.start_time ? segment.start_time / 1000 : 0,\n duration: segment.duration ? segment.duration / 1000 : 0,\n })),\n })));\n};\n\nconst setAdvertsProp = (player, data) => {\n const imageEnabled = data?.settings?.image_enabled;\n const advertsArray = data?.ads || [];\n\n set(player, \"adverts\", advertsArray.map((item) => {\n const isVast = item.type === \"vast\";\n\n const theme = resolveTheme(item.theme);\n const colors = item[`${theme}_theme`];\n\n return {\n id: item.id,\n type: item.type,\n placement: item.placement,\n vastUrl: isVast ? item.vast_url : null,\n clickThroughUrl: !isVast ? item.click_through_url : null,\n imageUrl: imageEnabled && item.image_url,\n textColor: colors?.text_color,\n backgroundColor: colors?.background_color,\n iconColor: colors?.icon_color,\n audio: isVast ? [] : (item.audio || item.media).map((audio) => ({\n id: audio.id,\n url: audio.url,\n contentType: audio.content_type,\n duration: audio.duration ? audio.duration / 1000 : 0,\n })),\n video: isVast ? [] : (item.video || []).map((video) => ({\n id: video.id,\n url: video.url,\n contentType: video.content_type,\n duration: video.duration ? video.duration / 1000 : 0,\n })),\n };\n }));\n};\n\nconst set = (player, propName, value) => {\n const overridden = typeof player.initialProps[propName] !== \"undefined\";\n if (!overridden) { player[propName] = value; }\n};\n\nconst introsOutrosArray = ({ intro_outro_enabled, intro_url, outro_url }) => {\n if (!intro_outro_enabled) { return []; }\n const array = [];\n\n if (intro_url) { array.push({ placement: \"pre-roll\", audio: [{ url: intro_url }], video: [] }); }\n if (outro_url) { array.push({ placement: \"post-roll\", audio: [{ url: outro_url }], video: [] }); }\n\n return array;\n};\n\nconst analyticsConsent = ({ analytics_enabled, analytics_uuid_enabled }) => {\n if (!analytics_enabled) { return \"none\"; }\n if (!analytics_uuid_enabled) { return \"without-local-storage\"; }\n\n return \"allowed\";\n};\n\nexport default setPropsFromApi;\nexport { identifiersArray, fetchData };\n","const downloadFile = async (url, filename) => {\n const response = await fetch(url);\n const blob = await response.blob();\n const href = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n\n document.body.append(anchor);\n\n anchor.href = href;\n anchor.setAttribute(\"download\", filename);\n anchor.setAttribute(\"target\", \"_blank\");\n anchor.click();\n anchor.remove();\n};\n\nexport default downloadFile;\n","const erroredAdverts = { vastUrls: new Set(), mediaSources: new Set() };\n\nconst updateErroredAdverts = (advert) => {\n if (advert.vastUrl) {\n erroredAdverts.vastUrls.add(advert.vastUrl);\n }\n\n for (const media of [...(advert.audio || []), ...(advert.video || [])]) {\n erroredAdverts.mediaSources.add(media.url);\n }\n};\n\nconst resultedInAPlaybackError = (advert) => {\n if (advert.vastUrl) {\n if (erroredAdverts.vastUrls.has(advert.vastUrl)) { return true; }\n }\n\n for (const media of [...(advert.audio || []), ...(advert.video || [])]) {\n if (erroredAdverts.mediaSources.has(media.url)) { return true; }\n }\n\n return false;\n};\n\nexport default erroredAdverts;\nexport { updateErroredAdverts, resultedInAPlaybackError };\n","// This state is shared across all player instances so that the same advert\n// doesn't play again in any player. This does not affect VAST ads because they\n// are fetched programmatically and might return a different advert each time.\n\nconst playedAdvertMedia = new Set();\n\nconst updatePlayedAdvertMedia = (advert) => {\n const media = [...(advert.audio || []), ...(advert.video || [])];\n media.forEach(m => playedAdvertMedia.add(m.url));\n};\n\nconst alreadyPlayedAdvertMedia = (advert) => {\n const media = [...(advert.audio || []), ...(advert.video || [])];\n return media.some(m => playedAdvertMedia.has(m.url));\n};\n\nexport default playedAdvertMedia;\nexport { updatePlayedAdvertMedia, alreadyPlayedAdvertMedia };\n","import findSegmentIndex from \"./findSegmentIndex\";\nimport { updateErroredAdverts, resultedInAPlaybackError } from \"./erroredAdverts\";\nimport { updatePlayedAdvertMedia, alreadyPlayedAdvertMedia } from \"./playedAdvertMedia\";\n\nconst chooseAdvert = ({ introsOutrosIndex, adverts, advertIndex, content = [], contentIndex, currentTime, atTheStart, atTheEnd, errored } = {}) => {\n const currentAdvert = adverts && adverts[advertIndex];\n\n x: if (currentAdvert) {\n if (errored) { updateErroredAdverts(currentAdvert); break x; } // Choose another advert.\n if (atTheEnd) { updatePlayedAdvertMedia(currentAdvert); return -1; } // Play the content.\n if (!atTheEnd) { return advertIndex; } // Keep playing the current advert until it ends.\n }\n\n if (!content[contentIndex]?.adsEnabled) { return -1; }\n if (introsOutrosIndex !== -1) { return -1; } // Wait until the intro/outro has finished.\n\n const placements = placementsThatCanPlay({ content, contentIndex, currentTime, atTheStart, atTheEnd });\n\n let bestSoFar = -1;\n let bestType = -Infinity;\n let bestRandom = -Infinity;\n\n for (const [thisIndex, advert] of adverts.entries()) {\n if (alreadyPlayedAdvertMedia(advert)) { continue; }\n if (resultedInAPlaybackError(advert)) { continue; }\n if (!placements.has(advert.placement)) { continue; }\n\n const thisType = typeScores[advert.type] || 0;\n if (thisType < bestType) { continue; }\n\n const thisRandom = Math.random();\n if (thisType === bestType && thisRandom < bestRandom) { continue; }\n\n bestSoFar = thisIndex;\n bestType = thisType;\n bestRandom = thisRandom;\n }\n\n return bestSoFar;\n};\n\nconst typeScores = { vast: 1, custom: 0 };\n\nconst placementsThatCanPlay = ({ content, contentIndex, currentTime, atTheStart, atTheEnd }) => {\n const isFirstItem = contentIndex === 0;\n const isLastItem = contentIndex === content.length - 1;\n\n const isPlaylist = content.length > 1;\n const isBetweenPlaylistItems = isPlaylist && atTheStart && !isFirstItem;\n\n const segments = content[contentIndex].segments;\n const lastSegment = segments[segments.length - 1];\n\n const midrollIndex = isPlaylist ? null : midrollSegmentIndex(segments);\n const midrollSegment = segments[midrollIndex];\n\n const isAfterMidroll = midrollSegment && currentTime > midrollSegment.startTime;\n const duration = lastSegment ? lastSegment.startTime + lastSegment.duration : 0;\n const closeToEnd = currentTime > duration - minimumTimeUntilEndForMidrollToPlay;\n\n const eligiblePlacements = new Set();\n\n if (atTheStart) { eligiblePlacements.add(\"pre-roll\"); }\n\n if (isAfterMidroll && !closeToEnd) { eligiblePlacements.add(\"mid-roll\"); }\n if (isBetweenPlaylistItems) { eligiblePlacements.add(\"mid-roll\"); }\n\n if (atTheEnd && isLastItem) { eligiblePlacements.add(\"post-roll\"); }\n if (isBetweenPlaylistItems) { eligiblePlacements.add(\"post-roll\"); }\n\n return eligiblePlacements;\n};\n\n// Don't play mid-roll adverts if the content duration is less than two minutes.\nconst minimumDurationForMidrollToPlay = 2 * 60;\n\n// Don't play mid-roll adverts if seeked to the last 10 seconds of content.\nconst minimumTimeUntilEndForMidrollToPlay = 10;\n\n// Play mid-roll adverts from segments starting after half-way time minus 0.5 seconds.\nconst halfWayTimeToleranceForMidroll = 0.5;\n\nconst midrollSegmentIndex = (segments) => {\n const lastSegment = segments[segments.length - 1];\n if (!lastSegment) { return; }\n\n const duration = lastSegment.startTime + lastSegment.duration;\n if (duration < minimumDurationForMidrollToPlay) { return; }\n\n const halfWayTime = duration / 2;\n const halfWayIndex = findSegmentIndex(segments, duration / 2);\n\n const startTime = segments[halfWayIndex].startTime;\n const isHalfWay = startTime >= halfWayTime - halfWayTimeToleranceForMidroll;\n\n const midrollIndex = isHalfWay ? halfWayIndex : halfWayIndex + 1;\n if (midrollIndex === segments.length) { return; }\n\n return midrollIndex;\n};\n\nexport default chooseAdvert;\n","import { resultedInAPlaybackError } from \"./erroredAdverts\";\n\nconst choosePersistentAdvert = (persistentAdImage, persistentIndex, advertIndex, adverts) => {\n let bestSoFar = -1;\n let bestMatch = -Infinity;\n let bestPlacement = -Infinity;\n\n for (const [thisIndex, advert] of (adverts || []).entries()) {\n if (!persistentAdImage) { continue; }\n if (resultedInAPlaybackError(advert)) { continue; }\n if (advert.type === \"vast\") { continue; }\n\n const thisMatch = matchScore(thisIndex, persistentIndex, advertIndex);\n if (thisMatch < bestMatch) { continue; }\n\n const thisPlacement = placementScores[advert.placement] || 0;\n if (thisMatch === bestMatch && thisPlacement < bestPlacement) { continue; }\n\n bestSoFar = thisIndex;\n bestMatch = thisMatch;\n bestPlacement = thisPlacement;\n }\n\n return bestSoFar;\n};\n\nconst placementScores = { \"pre-roll\": 2, \"mid-roll\": 1 };\n\nconst matchScore = (thisIndex, persistentIndex, advertIndex) => {\n if (thisIndex === advertIndex) { return 2; }\n if (thisIndex === persistentIndex) { return 1; }\n\n return 0;\n};\n\nexport default choosePersistentAdvert;\n","const erroredIntrosOutros = { mediaSources: new Set() };\n\nconst updateErroredIntrosOutros = (introOutro) => {\n for (const media of [...(introOutro.audio || []), (introOutro.video || [])]) {\n erroredIntrosOutros.mediaSources.add(media.url);\n }\n};\n\nconst resultedInAPlaybackError = (introOutro) => {\n for (const media of [...(introOutro.audio || []), (introOutro.video || [])]) {\n if (erroredIntrosOutros.mediaSources.has(media.url)) { return true; }\n }\n\n return false;\n};\n\nexport default erroredIntrosOutros;\nexport { updateErroredIntrosOutros, resultedInAPlaybackError };\n","// This state is shared across all player instances so that the same intro/outro\n// plays again in any player to keep the experience consistent.\n\nconst playedIntroOutroMedia = new Set();\n\nconst updatePlayedIntroOutroMedia = (introOutro) => {\n const media = [...(introOutro.audio || []), ...(introOutro.video || [])];\n media.forEach(m => playedIntroOutroMedia.add(m.url));\n};\n\nconst alreadyPlayedIntroOutroMedia = (introOutro) => {\n const media = [...(introOutro.audio || []), ...(introOutro.video || [])];\n return media.some(m => playedIntroOutroMedia.has(m.url));\n};\n\nexport default playedIntroOutroMedia;\nexport { updatePlayedIntroOutroMedia, alreadyPlayedIntroOutroMedia };\n","import { updateErroredIntrosOutros, resultedInAPlaybackError } from \"./erroredIntrosOutros\";\nimport { updatePlayedIntroOutroMedia, alreadyPlayedIntroOutroMedia } from \"./playedIntroOutroMedia\";\n\nconst chooseIntroOutro = ({ introsOutros = [], introsOutrosIndex, advertIndex, content, contentIndex, currentTime, atTheStart, atTheEnd, errored }) => {\n const currentIntroOutro = introsOutros[introsOutrosIndex];\n\n x: if (currentIntroOutro) {\n if (errored) { updateErroredIntrosOutros(currentIntroOutro); break x; } // Choose another intro/outro.\n if (atTheEnd) { updatePlayedIntroOutroMedia(currentIntroOutro); return -1; } // Play the advert/content.\n if (!atTheEnd) { return introsOutrosIndex; } // Keep playing the current intro/outro until it ends.\n }\n\n if (advertIndex !== -1) { return -1; } // Wait until the advert has finished.\n\n const placements = placementsThatCanPlay({ content, contentIndex, currentTime, atTheStart, atTheEnd });\n\n let bestSoFar = -1;\n let bestPlayed = -Infinity;\n let bestRandom = -Infinity;\n\n for (const [thisIndex, introOutro] of introsOutros.entries()) {\n if (resultedInAPlaybackError(introOutro)) { continue; }\n if (!placements.has(introOutro.placement)) { continue; }\n\n const thisPlayed = alreadyPlayedIntroOutroMedia(introOutro) ? 1 : 0;\n if (thisPlayed < bestPlayed) { continue; }\n\n const thisRandom = Math.random();\n if (thisPlayed === bestPlayed && thisRandom < bestRandom) { continue; }\n\n bestSoFar = thisIndex;\n bestPlayed = thisPlayed;\n bestRandom = thisRandom;\n }\n\n return bestSoFar;\n};\n\nconst placementsThatCanPlay = ({ content, contentIndex, currentTime, atTheStart, atTheEnd }) => {\n const eligiblePlacements = new Set();\n\n const atTheStartOfAllContent = atTheStart && contentIndex === 0 && currentTime === 0;\n const atTheEndOfAllContent = atTheEnd && contentIndex === content.length - 1;\n\n if (atTheStartOfAllContent) { eligiblePlacements.add(\"pre-roll\"); }\n if (atTheEndOfAllContent) { eligiblePlacements.add(\"post-roll\"); }\n\n return eligiblePlacements;\n};\n\nexport default chooseIntroOutro;\n","const chooseMediaSession = (Player) => {\n if (!navigator.mediaSession) { return; }\n\n const allowOverride = Player.instances().some(p => p.mediaSession === \"override\");\n if (websiteHasSetTheMediaSession() && !allowOverride) { return; }\n\n let bestSoFar;\n let bestState = -Infinity;\n let bestShowing = -Infinity;\n\n for (const player of Player.instances()) {\n if (player.mediaSession === \"none\") { continue; }\n\n const thisState = stateScores[player.playbackState] || 0;\n if (thisState < bestState) { continue; }\n\n const thisShowing = showingScores[player.showMediaSession] || 0;\n if (thisState === bestState && thisShowing < bestShowing) { continue; }\n\n bestSoFar = player;\n bestState = thisState;\n bestShowing = thisShowing;\n }\n\n for (const player of Player.instances()) {\n player.showMediaSession = player === bestSoFar;\n }\n\n return bestSoFar;\n};\n\nconst stateScores = { playing: 1, paused: 0, stopped: 0 };\nconst showingScores = { true: 1, false: 0 };\n\nconst websiteHasSetTheMediaSession = () => {\n const metadata = navigator.mediaSession.metadata;\n if (!metadata || navigator.mediaSession.setByPlayer) { return false; }\n\n const { title, artist, album, artwork } = metadata;\n return title || artist || album || artwork?.length;\n};\n\nexport default chooseMediaSession;\n","import { knownPlayerStyle } from \"./playerStyles\";\n\nconst chooseWidget = (Player) => {\n let somePlayerIsVisible = false;\n\n let bestSoFar;\n let bestState = -Infinity;\n let bestY = -Infinity;\n\n for (const player of Player.instances()) {\n if (!player.userInterface) { continue; }\n if (player.widgetTarget) { continue; }\n\n const knownStyle = knownPlayerStyle(player.widgetStyle);\n if (!knownStyle) { continue; }\n\n const withinViewport = player.userInterface.isVisible;\n if (withinViewport) { somePlayerIsVisible = true; continue; }\n\n const aboveViewport = player.userInterface.relativeY < 0;\n if (!aboveViewport) { continue; }\n\n const thisState = stateScores[player.playbackState] || 0;\n if (thisState < bestState) { continue; }\n\n const thisY = player.userInterface.absoluteY;\n if (thisState === bestState && thisY < bestY) { continue; }\n\n bestSoFar = player;\n bestState = thisState;\n bestY = thisY;\n }\n\n if (somePlayerIsVisible && bestState === 0) {\n bestSoFar = null;\n }\n\n for (const player of Player.instances()) {\n player.showBottomWidget = player === bestSoFar;\n }\n};\n\nconst stateScores = { playing: 2, paused: 1, stopped: 0 };\n\nexport default chooseWidget;\n","import { validateEventBeforeProcessing, validateEventAfterProcessing } from \"../helpers/eventValidation\";\nimport { requestFullScreen, exitFullScreen, fullScreenElement } from \"../helpers/fullScreen\";\nimport { v4 as randomUuid } from \"uuid\";\nimport waitUntil from \"../helpers/waitUntil\";\nimport throwError from \"../helpers/throwError\";\nimport setPropsFromApi from \"../helpers/setPropsFromApi\";\nimport findSegmentIndex from \"../helpers/findSegmentIndex\";\nimport settableProps from \"../helpers/settableProps\";\nimport diffObject from \"../helpers/diffObject\";\nimport sectionEnabled from \"../helpers/sectionEnabled\";\nimport downloadFile from \"../helpers/downloadFile\";\nimport chooseAdvert from \"../helpers/chooseAdvert\";\nimport choosePersistentAdvert from \"../helpers/choosePersistentAdvert\";\nimport chooseIntroOutro from \"../helpers/chooseIntroOutro\";\nimport chooseMediaSession from \"../helpers/chooseMediaSession\";\nimport chooseWidget from \"../helpers/chooseWidget\";\n\nclass RootController {\n constructor(player, PlayerClass) {\n this.player = player;\n this.PlayerClass = PlayerClass;\n this.eventListeners = { \"<any>\": {} };\n }\n\n addEventListener(eventType, callback) {\n const knownType = eventType === \"<any>\" || this[`handle${eventType}`];\n if (!knownType) { throwError(`Cannot add listener for unknown event type '${eventType}'.`); }\n\n const listenerHandle = `listener-handle-${randomUuid()}`;\n\n this.eventListeners[eventType] = this.eventListeners[eventType] || {};\n this.eventListeners[eventType][listenerHandle] = callback;\n\n return listenerHandle;\n }\n\n removeEventListener(eventType, listenerHandle) {\n this.eventListeners[eventType] = this.eventListeners[eventType] || {};\n delete this.eventListeners[eventType][listenerHandle];\n }\n\n async processEvent(event) {\n await waitUntil(() => this.player);\n validateEventBeforeProcessing(event);\n\n const handler = this[`handle${event.type}`];\n const propsBefore = settableProps(this.player);\n\n if (this.#ignoreDueToAdvert(event)) {\n event.status = \"ignored-due-to-advert\";\n } else if (this.#ignoreDueToScrubbing(event)) {\n event.status = \"ignored-due-to-scrubbing\";\n } else if (handler) {\n await handler.call(this, event);\n\n // Defer playback of intros/outros/adverts until the user presses play so\n // that the user interface shows the content rather than the interstitial.\n this.#playDeferredIntroOutro();\n this.#playDeferredAdvert();\n\n event.status = \"handled\";\n } else {\n throwError(\"No handler function for event.\", event);\n }\n\n const propsAfter = settableProps(this.player);\n\n event.changedProps = diffObject(propsBefore, propsAfter);\n event.processedAt = new Date().toISOString();\n\n validateEventAfterProcessing(event);\n\n this.#sendEventToListeners(event.type, event);\n this.#sendEventToListeners(\"<any>\", event);\n }\n\n // Please document all events and keep in-sync with /doc/player-events.md\n\n handlePressedChangeRate() { this.#setRate(i => i + 1, { cycle: true }); }\n handlePressedEnterOnChangeRate() { this.#setRate(i => i + 1, { cycle: true }); }\n handlePressedSpaceOnChangeRate() { this.#setRate(i => i + 1, { cycle: true }); }\n handlePressedUpOnChangeRate() { this.#setRate(i => i + 1); }\n handlePressedRightOnChangeRate() { this.#setRate(i => i + 1); }\n handlePressedDownOnChangeRate() { this.#setRate(i => i - 1); }\n handlePressedLeftOnChangeRate() { this.#setRate(i => i - 1); }\n\n handlePressedPrevSegment() { this.#setSegment(i => i - 1); }\n handlePressedNextSegment() { this.#setSegment(i => i + 1); }\n\n handlePressedSeekBack({ seconds }) { this.#setTime(t => t - seconds); }\n handlePressedSeekAhead({ seconds }) { this.#setTime(t => t + seconds); }\n handlePressedPrevTrack() { this.#setTrack(i => i - 1); }\n handlePressedNextTrack() { this.#setTrack(i => i + 1); }\n\n handlePressedAdvertLink() { /* Do nothing */ }\n handlePressedAdvertButton() { /* Do nothing */ }\n handlePressedAdvertImage() { /* Do nothing */ }\n handlePressedAdvertVideo() { /* Do nothing */ }\n handlePressedBeyondWords() { /* Do nothing */ }\n handlePressedSourceUrl() { /* Do nothing */ }\n\n handleDurationUpdated() { /* Do nothing */ }\n handleMediaLoaded({ loadedMedia }) { this.player.loadedMedia = loadedMedia; }\n handlePlaybackRateUpdated() { /* Do nothing */ }\n\n handleVisibilityChanged() { chooseWidget(this.PlayerClass); }\n\n handlePressedVideoBackground() { this.#playOrPause(); }\n handlePressedEnterOnProgressBar() { this.#playOrPause(); }\n handlePressedSpaceOnProgressBar() { this.#playOrPause(); }\n handlePressedEnterOnProgressCircle() { this.#playOrPause(); }\n handlePressedSpaceOnProgressCircle() { this.#playOrPause(); }\n\n handlePressedLeftOnProgressBar() { this.#setTime(t => t - 5); }\n handlePressedRightOnProgressBar() { this.#setTime(t => t + 5); }\n handlePressedLeftOnProgressCircle() { this.#setTime(t => t - 5); }\n handlePressedRightOnProgressCircle() { this.#setTime(t => t + 5); }\n\n handlePressedProgressBar({ ratio }) {\n this.preScrubState = this.player.playbackState;\n this.#pauseIfPlaying();\n this.#setTime((_, duration) => ratio * duration);\n if (ratio !== 0) { this.segmentPlayed = true; }\n }\n\n handleScrubbedProgressBar({ ratio }) {\n this.#setTime((_, duration) => ratio * duration);\n if (ratio !== 0) { this.segmentPlayed = true; }\n }\n\n handleFinishedScrubbingProgressBar() {\n this.player.playbackState = this.preScrubState;\n setTimeout(() => delete this.preScrubState, 500);\n }\n\n handleIdentifiersChanged() {\n setPropsFromApi(this.player).then(() => {\n this.#chooseAndSetIntroOutro({ atTheStart: true });\n this.#chooseAndSetAdvert({ atTheStart: true });\n });\n }\n\n handleNoContentAvailable({ description }) {\n console.warn(`BeyondWords.Player: ${description}`);\n }\n\n handlePressedPlay({ emittedFrom, widgetSegment, widgetIsCurrent }) {\n if (emittedFrom === \"segment-widget\" && !widgetIsCurrent) {\n this.#playFromSegment(widgetSegment);\n } else {\n this.player.playbackState = \"playing\";\n }\n }\n\n handlePressedPause() {\n this.player.playbackState = \"paused\";\n }\n\n handlePlaybackPlaying() {\n const otherPlayers = this.PlayerClass.instances().filter(p => p !== this.player);\n const playingPlayers = otherPlayers.filter(p => p.playbackState === \"playing\");\n\n playingPlayers.forEach(p => p.playbackState = \"paused\");\n chooseMediaSession(this.PlayerClass);\n }\n\n handlePlaybackPaused() {\n const isPlaying = this.player.playbackState === \"playing\";\n const atTheEnd = this.player.currentTime >= this.player.duration;\n\n // If you bypass the player SDK and call video.pause() on the HTML element,\n // update the state so the UI is correct. This can happen when a phone call.\n if (isPlaying && !atTheEnd && !this.preScrubState) { this.player.playbackState = \"paused\"; }\n }\n\n handleCurrentTimeUpdated() {\n if (!this.midrollPlayed) { this.#chooseAndSetAdvert(); }\n\n const atTheStart = this.player.currentTime <= 0;\n const atTheEnd = this.player.currentTime >= this.player.duration;\n const videoPaused = this.player.mediaElement.video.paused;\n\n if (!atTheStart && !atTheEnd && !videoPaused) { this.player.playbackState = \"playing\"; }\n }\n\n handlePlaybackEnded() {\n if (this.#isMidrollAdvert()) { this.midrollPlayed = true; }\n this.segmentPlayed = false;\n\n const wasIntro = this.#isIntro();\n const wasAdvert = this.#isAdvert();\n\n this.#chooseAndSetAdvert({ atTheEnd: true, wasIntro });\n if (wasAdvert) { return; } // Don't skip track because the content hasn't played yet.\n\n this.#chooseAndSetIntroOutro({ atTheEnd: true });\n if (wasIntro) { return; } // Don't skip track because the content/advert hasn't played yet.\n\n if (this.#isOutro() || this.#isAdvert()) { return; } // Don't skip track until post-roll has played.\n\n this.#setTrack(i => i + 1);\n }\n\n handlePlaybackNotAllowed({ description }) {\n console.warn(`BeyondWords.Player: ${description}`);\n\n const atTheStart = this.player.contentIndex <= 0 && this.player.currentTime <= 0;\n this.player.playbackState = atTheStart ? \"stopped\" : \"paused\";\n }\n\n handlePlaybackErrored({ mediaType, errorMessage }) {\n console.warn(`BeyondWords.Player: ${mediaType} playback error: ${errorMessage}`);\n\n if (this.#isIntro() || this.#isOutro()) {\n this.#chooseAndSetIntroOutro({ errored: true }); // TODO: how to pass atTheStart, atTheEnd?\n } else if (this.#isAdvert()) {\n this.#chooseAndSetAdvert({ errored: true }); // TODO: how to pass atTheStart, atTheEnd?\n } else {\n this.handlePlaybackEnded();\n }\n }\n\n handlePressedMaximize() {\n if (fullScreenElement()) {\n exitFullScreen();\n } else {\n requestFullScreen(this.player.target);\n }\n }\n\n handleFullScreenModeUpdated() {\n const isFullScreen = fullScreenElement() === this.player.target;\n const addOrRemove = isFullScreen ? \"add\" : \"remove\";\n\n this.player.isFullScreen = isFullScreen;\n this.player.target.classList[addOrRemove](\"maximized\");\n }\n\n handlePressedPlaylistItem({ index }) {\n this.#setTrack(() => index);\n this.player.playbackState = \"playing\";\n }\n\n handlePressedTogglePlaylist() {\n const parts = this.player.playlistStyle.split(\"-\");\n\n const isPlaylist = this.player.content.length > 1;\n const isShowing = parts[0] === \"show\" || parts[0] === \"auto\" && isPlaylist;\n\n parts[0] = isShowing ? \"hide\" : \"show\";\n this.player.playlistStyle = parts.join(\"-\");\n }\n\n handlePressedDownload({ contentIndex, audioIndex, videoIndex }) {\n const contentItem = this.player.content[contentIndex];\n\n const audioItem = contentItem.audio?.[audioIndex];\n const videoItem = contentItem.video?.[videoIndex];\n\n const mediaUrl = (audioItem || videoItem).url;\n\n const extension = mediaUrl.split(\".\").pop();\n const filename = `${contentItem.title}.${extension}`;\n\n return downloadFile(mediaUrl, filename);\n }\n\n handlePressedCloseWidget() {\n for (const player of this.PlayerClass.instances()) {\n player.playbackState = \"paused\";\n player.widgetStyle = \"closed-by-user\";\n }\n }\n\n handleContentStatusChanged({ contentId, legacyId, sourceId, sourceUrl, contentStatus }) {\n if (contentStatus !== \"processed\") { return; }\n\n // Only reload if listening hasn't started yet so that audio isn't interrupted.\n if (this.player.playbackState !== \"stopped\") { return; }\n if (this.player.contentIndex !== 0) { return; }\n if (this.player.currentTime !== 0) { return; }\n\n // The websocket sends status changes for all content in the project so check\n // that this event is for a content item that is one of the player's identifiers.\n if (!this.#matchesIdentifiers({ contentId, legacyId, sourceId, sourceUrl })) { return; }\n\n setPropsFromApi(this.player).then(() => {\n this.#chooseAndSetIntroOutro({ atTheStart: true });\n this.#chooseAndSetAdvert({ atTheStart: true });\n });\n }\n\n handleCurrentSegmentUpdated({ segment, segmentIndex, contentIndex }) {\n if (this.#isContent()) {\n this.player.currentSegment = { ...segment, segmentIndex, contentIndex };\n } else if (!this.segmentPlayed) {\n this.player.segmentContainers?.reset();\n this.player.currentSegment = null;\n }\n }\n\n handleHoveredSegmentUpdated({ segment, segmentIndex, contentIndex }) {\n if (segment) {\n this.player.hoveredSegment = { ...segment, segmentIndex, contentIndex };\n } else {\n this.player.hoveredSegment = null;\n }\n }\n\n handlePressedSegment({ segment, segmentIndex, contentIndex }) {\n const enabled = sectionEnabled(\"hovered\", segment, this.player.clickableSections);\n if (!enabled) { return; }\n\n const hasChanged = this.#currentSegmentChanged({ contentIndex, segmentIndex });\n if (!hasChanged && !this.#isAdvert()) { this.#playOrPause(); return; }\n\n const changeTrack = contentIndex !== this.player.contentIndex;\n if (changeTrack) { this.#setTrack(() => contentIndex); }\n\n this.#playFromSegment({ segmentIndex, contentIndex, ...segment });\n }\n\n // private\n\n #ignoreDueToAdvert({ type }) {\n return this.#isAdvert() && (\n type.includes(\"ChangeRate\") ||\n type.includes(\"PrevSegment\") ||\n type.includes(\"NextSegment\") ||\n type.includes(\"SeekBack\") ||\n type.includes(\"SeekAhead\") ||\n type.includes(\"Progress\") && !type.includes(\"Space\") && !type.includes(\"Enter\")\n );\n }\n\n #ignoreDueToScrubbing({ type }) {\n return this.preScrubState && (\n type.includes(\"CurrentTimeUpdated\") ||\n type.includes(\"PlaybackEnded\")\n );\n }\n\n #sendEventToListeners(eventType, event) {\n const typeListeners = this.eventListeners[eventType] || {};\n Object.values(typeListeners).forEach(f => f(event));\n }\n\n #hasIntro() {\n return this.player.introsOutros.some(o => o.placement === \"pre-roll\");\n }\n\n #hasOutro() {\n return this.player.introsOutros.some(o => o.placement === \"post-roll\");\n }\n\n #isIntro(index = this.player.introsOutrosIndex) {\n return this.player?.introsOutros?.[index]?.placement === \"pre-roll\";\n }\n\n #isOutro(index = this.player.introsOutrosIndex) {\n return this.player?.introsOutros?.[index]?.placement === \"post-roll\";\n }\n\n #isAdvert() {\n return this.player.advertIndex !== -1;\n }\n\n #isMidrollAdvert() {\n return this.player.adverts[this.player.advertIndex]?.placement === \"mid-roll\";\n }\n\n #isContent() {\n return !this.#isIntro() && !this.#isOutro() && !this.#isAdvert();\n }\n\n #playOrPause() {\n if (this.player.playbackState === \"playing\") {\n this.player.playbackState = \"paused\";\n } else {\n this.player.playbackState = \"playing\";\n }\n }\n\n #pauseIfPlaying() {\n if (this.player.playbackState === \"playing\") {\n this.player.playbackState = \"paused\";\n }\n }\n\n #playFromSegment({ segmentIndex, contentIndex, ...segment }) {\n this.#setTime(() => segment.startTime, contentIndex);\n this.player.currentSegment = { segmentIndex, contentIndex, ...segment };\n this.player.playbackState = \"playing\";\n this.segmentPlayed = true;\n }\n\n #setRate(indexFn, { cycle } = {}) {\n const playbackRates = this.player.playbackRates;\n const maxIndex = playbackRates.length - 1;\n\n const currentIndex = playbackRates.indexOf(this.player.playbackRate);\n const tryIndex = indexFn(currentIndex);\n\n let updatedIndex;\n\n if (cycle) {\n updatedIndex = tryIndex % playbackRates.length;\n } else {\n updatedIndex = Math.max(0, Math.min(maxIndex, tryIndex));\n }\n\n this.player.playbackRate = playbackRates[updatedIndex] || 1;\n }\n\n #setSegment(indexFn) {\n const segments = this.player.content[this.player.contentIndex].segments;\n\n const currentIndex = findSegmentIndex(segments, this.player.currentTime);\n const tryIndex = indexFn(currentIndex);\n\n // If the user clicks next during the intro, skip to the content.\n if (this.#isIntro() && tryIndex >= 0) {\n this.handlePlaybackEnded();\n\n // If the user clicks previous during the outro, skip back to the last segment.\n // Set 0.01 to ensure the intro doesn't play again if there are no segments.\n } else if (this.#isOutro() && tryIndex < 0) {\n this.#setIntroOutro(-1);\n this.#setTime(() => segments[segments.length - 1]?.startTime || 0.01);\n this.player.playbackState = \"playing\";\n\n // If the user clicks previous on the first segment, skip back to the intro.\n } else if (this.#isContent() && tryIndex < 0 && this.#hasIntro()) {\n this.#setTime(() => 0);\n this.#chooseAndSetIntroOutro({ atTheStart: true });\n\n // If the user clicks next on the last segment, play the outro.\n } else if (this.#isContent() && tryIndex === segments.length && this.#hasOutro()) {\n this.#setTime(() => this.player.duration - 0.01);\n\n // Otherwise, set the time to the startTime of the segment.\n } else if (this.#isContent() && tryIndex >= 0 && tryIndex < segments.length) {\n this.#setTime(() => segments[tryIndex].startTime);\n }\n }\n\n #setTrack(indexFn) {\n const tryIndex = indexFn(this.player.contentIndex);\n const outOfBounds = tryIndex < 0 || tryIndex >= this.player.content.length;\n\n if (outOfBounds) {\n this.player.playbackState = \"stopped\";\n this.#setTime(() => 0);\n } else {\n this.player.contentIndex = tryIndex;\n\n if (!this.#isAdvert()) {\n this.#setTime(() => 0);\n this.midrollPlayed = false;\n }\n }\n\n this.#setIntroOutro(-1);\n this.#chooseAndSetIntroOutro({ atTheStart: true });\n\n // Avoid playing back-to-back adverts: post-roll at the end of content\n // followed by pre-roll at the start when content is replayed by the user.\n if (!outOfBounds) {\n this.#chooseAndSetAdvert({ atTheStart: true });\n }\n }\n\n #setTime(timeFn, contentIndex) {\n if (this.#isAdvert()) {\n this.prevTime = timeFn();\n this.prevContent = contentIndex;\n } else {\n const duration = this.player.duration || 0;\n this.player.currentTime = timeFn(this.player.currentTime, duration);\n }\n }\n\n #chooseAndSetIntroOutro({ atTheStart, atTheEnd, errored } = {}) {\n const { content, introsOutros, currentTime } = this.player;\n\n const introsOutrosIndex = typeof this.nextIntroOutro !== \"undefined\" ? this.nextIntroOutro : this.player.introsOutrosIndex;\n const advertIndex = typeof this.nextAdvert !== \"undefined\" ? this.nextAdvert : this.player.advertIndex;\n const contentIndex = typeof this.prevContent !== \"undefined\" ? this.prevContent : this.player.contentIndex;\n\n this.#setIntroOutro(chooseIntroOutro({ introsOutros, introsOutrosIndex, advertIndex, content, contentIndex, currentTime, atTheStart, atTheEnd, errored }));\n }\n\n #chooseAndSetAdvert({ atTheStart, atTheEnd, wasIntro, errored } = {}) {\n const { adverts, content, currentTime } = this.player;\n\n let introsOutrosIndex = typeof this.nextIntroOutro !== \"undefined\" ? this.nextIntroOutro : this.player.introsOutrosIndex;\n const advertIndex = typeof this.nextAdvert !== \"undefined\" ? this.nextAdvert : this.player.advertIndex;\n const contentIndex = typeof this.prevContent !== \"undefined\" ? this.prevContent : this.player.contentIndex;\n\n if (wasIntro) { atTheStart = true; atTheEnd = false; introsOutrosIndex = -1; } // Choose from pre-roll advert placements after the intro.\n this.#setAdvert(chooseAdvert({ introsOutrosIndex, adverts, advertIndex, content, contentIndex, currentTime, atTheStart, atTheEnd, errored }));\n\n const persistentAdImage = this.player.persistentAdImage;\n const persistentIndex = this.player.persistentIndex;\n\n this.player.persistentIndex = choosePersistentAdvert(persistentAdImage, persistentIndex, advertIndex, adverts);\n }\n\n #playDeferredIntroOutro() {\n if (this.player.playbackState !== \"playing\") { return; }\n if (typeof this.nextIntroOutro === \"undefined\") { return; }\n\n this.#setIntroOutro(this.nextIntroOutro);\n delete this.nextIntroOutro;\n }\n\n #playDeferredAdvert() {\n if (this.player.playbackState !== \"playing\") { return; }\n if (typeof this.nextAdvert === \"undefined\") { return; }\n\n this.#setAdvert(this.nextAdvert);\n delete this.nextAdvert;\n }\n\n #setIntroOutro(index) {\n const defer = this.player.playbackState !== \"playing\" && index !== -1;\n if (defer) { this.nextIntroOutro = index; return; } else { delete this.nextIntroOutro; }\n\n const atTheStart = this.player.contentIndex <= 0 && this.player.currentTime <= 0;\n const skippedIntro = !atTheStart && this.#isIntro(index);\n\n // We were at the start and were going to play an intro but the user skipped\n // past it so clear the index and check if an advert should now play.\n if (skippedIntro) {\n this.player.introsOutrosIndex = -1;\n this.#chooseAndSetAdvert({ atTheStart: true });\n return;\n }\n\n const wasIntro = this.#isIntro();\n const wasOutro = this.#isOutro();\n\n this.player.introsOutrosIndex = index;\n\n const introFinished = wasIntro && !this.#isIntro();\n const outroFinished = wasOutro && !this.#isOutro();\n\n if (introFinished) { this.player.currentTime = 0; }\n if (outroFinished) { this.#setTrack(() => Infinity); }\n }\n\n #setAdvert(index) {\n const defer = this.player.playbackState !== \"playing\" && index !== -1;\n if (defer) { this.nextAdvert = index; return; } else { delete this.nextAdvert; }\n\n const wasAdvert = this.#isAdvert();\n this.player.advertIndex = index;\n\n const advertsStarted = !wasAdvert && this.#isAdvert();\n const advertsFinished = wasAdvert && !this.#isAdvert();\n\n if (advertsStarted) { this.#overridePlayerState(); }\n if (advertsFinished) { this.#restorePlayerState(); }\n }\n\n #overridePlayerState() {\n if (!this.#isIntro()) { this.prevTime = this.player.currentTime; }\n\n this.prevRate = this.player.playbackRate;\n this.prevContent = this.player.contentIndex;\n\n this.player.currentTime = 0;\n this.player.playbackRate = 1;\n }\n\n #restorePlayerState() {\n this.player.playbackRate = this.prevRate || 1;\n\n const trackChanged = this.player.contentIndex !== this.prevContent;\n if (!trackChanged) { this.player.currentTime = this.prevTime; }\n\n delete this.prevTime;\n delete this.prevRate;\n delete this.prevContent;\n }\n\n #matchesIdentifiers({ contentId, legacyId, sourceId, sourceUrl }) {\n return this.player.contentId === contentId ||\n this.player.contentId === legacyId ||\n this.player.sourceId === sourceId ||\n this.player.sourceUrl === sourceUrl ||\n this.player.playlist?.some(o => o.contentId === contentId) ||\n this.player.playlist?.some(o => o.contentId === legacyId) ||\n this.player.playlist?.some(o => o.sourceId === sourceId) ||\n this.player.playlist?.some(o => o.sourceUrl === sourceUrl);\n }\n\n #currentSegmentChanged({ contentIndex, segmentIndex }) {\n return (\n this.player.currentSegment?.contentIndex !== contentIndex ||\n this.player.currentSegment?.segmentIndex !== segmentIndex\n );\n }\n}\n\nexport default RootController;\n","var UNKNOWN_FUNCTION = '<unknown>';\n/**\n * This parses the different stack traces and puts them into one format\n * This borrows heavily from TraceKit (https://github.com/csnover/TraceKit)\n */\n\nfunction parse(stackString) {\n var lines = stackString.split('\\n');\n return lines.reduce(function (stack, line) {\n var parseResult = parseChrome(line) || parseWinjs(line) || parseGecko(line) || parseNode(line) || parseJSC(line);\n\n if (parseResult) {\n stack.push(parseResult);\n }\n\n return stack;\n }, []);\n}\nvar chromeRe = /^\\s*at (.*?) ?\\(((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|\\/|[a-z]:\\\\|\\\\\\\\).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\nvar chromeEvalRe = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n\nfunction parseChrome(line) {\n var parts = chromeRe.exec(line);\n\n if (!parts) {\n return null;\n }\n\n var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n\n var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n\n var submatch = chromeEvalRe.exec(parts[2]);\n\n if (isEval && submatch != null) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = submatch[1]; // url\n\n parts[3] = submatch[2]; // line\n\n parts[4] = submatch[3]; // column\n }\n\n return {\n file: !isNative ? parts[2] : null,\n methodName: parts[1] || UNKNOWN_FUNCTION,\n arguments: isNative ? [parts[2]] : [],\n lineNumber: parts[3] ? +parts[3] : null,\n column: parts[4] ? +parts[4] : null\n };\n}\n\nvar winjsRe = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\nfunction parseWinjs(line) {\n var parts = winjsRe.exec(line);\n\n if (!parts) {\n return null;\n }\n\n return {\n file: parts[2],\n methodName: parts[1] || UNKNOWN_FUNCTION,\n arguments: [],\n lineNumber: +parts[3],\n column: parts[4] ? +parts[4] : null\n };\n}\n\nvar geckoRe = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\\[native).*?|[^@]*bundle)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nvar geckoEvalRe = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n\nfunction parseGecko(line) {\n var parts = geckoRe.exec(line);\n\n if (!parts) {\n return null;\n }\n\n var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n var submatch = geckoEvalRe.exec(parts[3]);\n\n if (isEval && submatch != null) {\n // throw out eval line/column and use top-most line number\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = null; // no column when eval\n }\n\n return {\n file: parts[3],\n methodName: parts[1] || UNKNOWN_FUNCTION,\n arguments: parts[2] ? parts[2].split(',') : [],\n lineNumber: parts[4] ? +parts[4] : null,\n column: parts[5] ? +parts[5] : null\n };\n}\n\nvar javaScriptCoreRe = /^\\s*(?:([^@]*)(?:\\((.*?)\\))?@)?(\\S.*?):(\\d+)(?::(\\d+))?\\s*$/i;\n\nfunction parseJSC(line) {\n var parts = javaScriptCoreRe.exec(line);\n\n if (!parts) {\n return null;\n }\n\n return {\n file: parts[3],\n methodName: parts[1] || UNKNOWN_FUNCTION,\n arguments: [],\n lineNumber: +parts[4],\n column: parts[5] ? +parts[5] : null\n };\n}\n\nvar nodeRe = /^\\s*at (?:((?:\\[object object\\])?[^\\\\/]+(?: \\[as \\S+\\])?) )?\\(?(.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\nfunction parseNode(line) {\n var parts = nodeRe.exec(line);\n\n if (!parts) {\n return null;\n }\n\n return {\n file: parts[2],\n methodName: parts[1] || UNKNOWN_FUNCTION,\n arguments: [],\n lineNumber: +parts[3],\n column: parts[4] ? +parts[4] : null\n };\n}\n\nexport { parse };\n","import * as stackTraceParser from \"stacktrace-parser\";\n\nlet called = false;\nlet prevOnError, prevOnReject;\n\nconst setErrorHandler = ({ onError }) => {\n if (!onError || called) { return; }\n called = true;\n\n const thisFilename = originFilename(new Error());\n const isDevelopment = thisFilename?.match(/setErrorHandler/); // Not minified.\n\n prevOnError = window.onerror;\n prevOnReject = window.onunhandledrejection;\n\n window.onerror = (message, errorFilename, lineNumber, columnNumber, error) => {\n const originatedFromPlayer = errorFilename === thisFilename;\n const isPlaybackError = error?.message?.match(/request was interrupted/);\n\n const handleError = isDevelopment || originatedFromPlayer || isPlaybackError;\n if (handleError) { if (onError(error)) { return true; } }\n\n prevOnError && prevOnError(message, errorFilename, lineNumber, columnNumber, error);\n };\n\n window.onunhandledrejection = (event) => {\n const error = event.reason;\n\n const originatedFromPlayer = originFilename(error) === thisFilename;\n const isPlaybackError = error?.message?.match(/request was interrupted/);\n\n const handleError = isDevelopment || originatedFromPlayer || isPlaybackError;\n if (handleError) { if (onError(error)) { event.preventDefault(); return; } }\n\n prevOnReject && prevOnReject(event);\n };\n};\n\nconst originFilename = (error) => (\n stackTraceParser.parse(error?.stack || \"\")[0]?.file\n);\n\nexport default setErrorHandler;\n","import throwError from \"./throwError\";\n\nconst validateWebContext = () => {\n if (typeof window !== \"undefined\") { return; }\n\n throwError([\n \"Trying to initialize BeyondWords.Player in a server context but this is unsupported.\",\n \"Please only initialize the player in a context where the global window object is available.\",\n \"For example, by initializing the player inside a useEffect hook in a React application.\",\n ]);\n};\n\nexport default validateWebContext;\n","import { dataAttribute } from \"./segmentHighlights\";\nimport newEvent from \"./newEvent\";\n\nlet called = false;\n\nconst listenToSegments = () => {\n if (called) { return; }\n called = true;\n\n addEventListener(\"mousedown\", handleMouseDown);\n addEventListener(\"click\", handleMouseUp);\n addEventListener(\"mousemove\", handleMouseMove);\n};\n\nconst handleMouseDown = (event) => {\n startX = event.pageX;\n startY = event.pageY;\n};\n\nconst handleMouseUp = (event) => {\n if (event.defaultPrevented) { return; }\n if (draggedMouse(event)) { return; }\n if (event.button !== 0) { return; }\n\n const marker = markerElement(event.target)?.getAttribute(dataAttribute);\n if (!marker) { return; }\n\n for (const player of BeyondWords.Player.instances()) {\n const { segment, contentIndex, segmentIndex } = chooseSegment(player, marker);\n if (!segment) { continue; }\n\n // TODO: if multiple players then prefer the one that's playing?\n\n player.onEvent(newEvent({\n type: \"PressedSegment\",\n description: \"The user pressed on a segment in the article.\",\n initiatedBy: \"user\",\n emittedFrom: \"segment\",\n segment,\n contentIndex,\n segmentIndex,\n }));\n }\n};\n\nconst handleMouseMove = (event) => {\n const target = document.elementFromPoint(event.clientX, event.clientY);\n const marker = markerElement(target)?.getAttribute(dataAttribute);\n\n // TODO: if multiple players?\n\n for (const [i, player] of BeyondWords.Player.instances().entries()) {\n const { segment, contentIndex, segmentIndex } = chooseSegment(player, marker);\n\n if (changed(i, contentIndex, segmentIndex)) {\n player.onEvent(newEvent({\n type: \"HoveredSegmentUpdated\",\n description: \"The user hovered over a different segment in the article.\",\n initiatedBy: \"user\",\n emittedFrom: \"segment\",\n segment,\n contentIndex,\n segmentIndex,\n }));\n }\n }\n};\n\nconst markerElement = (target) => {\n while (target && target.hasAttribute) {\n if (target.hasAttribute(dataAttribute)) { return target; }\n\n if (target.onclick || target.onmousedown) { return; }\n if (target.nodeName.toLowerCase() === \"a\") { return; }\n\n target = target.parentNode;\n }\n};\n\nconst chooseSegment = (player, marker) => {\n if (!marker) { return {}; }\n\n let bestSoFar = {};\n let bestContent = -Infinity;\n\n for (const [i, content] of (player.content || []).entries()) {\n for (const [j, segment] of (content.segments || []).entries()) {\n if (marker !== segment.marker) { continue; }\n\n // If the segment appears in the content more than once then choose the first\n // segment that matches the player's contentIndex to avoid changing tracks.\n const thisContent = player.contentIndex === i ? 1 : 0;\n if (thisContent < bestContent) { continue; }\n\n // If the marker appears in the segments more than once then choose the first\n // segment so that playback starts from the earliest segment.\n if (thisContent === bestContent && bestSoFar?.segment) { continue; }\n\n bestSoFar = { contentIndex: i, segmentIndex: j, segment };\n bestContent = thisContent;\n }\n }\n\n return bestSoFar;\n};\n\nlet startX, startY;\n\nconst draggedMouse = (event) => {\n const movedX = event.pageX - startX;\n const movedY = event.pageY - startY;\n\n const moved = Math.sqrt(movedX * movedX + movedY * movedY);\n return moved > 5;\n};\n\nconst previousIndexes = {};\n\nconst changed = (playerIndex, contentIndex, segmentIndex) => {\n previousIndexes[playerIndex] ||= {};\n const previous = previousIndexes[playerIndex];\n\n if (previous.contentIndex === contentIndex && previous.segmentIndex === segmentIndex) {\n return false;\n } else {\n previous.contentIndex = contentIndex;\n previous.segmentIndex = segmentIndex;\n return true;\n }\n};\n\nexport default listenToSegments;\n","import { postJson } from \"../helpers/fetchJson\";\n\nclass AnalyticsClient {\n constructor(analyticsSink) {\n this.analyticsSink = analyticsSink;\n }\n\n sendToCustomAnalytics(data) {\n return postJson(this.analyticsSink, data);\n }\n\n sendToGoogleAnalytics(eventName, data) {\n window.gtag(\"event\", eventName, { ...data, send_to: this.analyticsSink });\n }\n}\n\nexport default AnalyticsClient;\n","import AnalyticsClient from \"../api_clients/analyticsClient\";\nimport { validateAnalyticsEvent } from \"../helpers/eventValidation\";\nimport { v4 as randomUuid } from \"uuid\";\nimport { version } from \"../../package.json\";\n\nconst sendToAnalytics = (player, playerEvent) => {\n const eventType = analyticsEventType(player, playerEvent.type);\n if (!eventType) { return; }\n\n const analyticsEvent = eventFromProps(player, eventType);\n validateAnalyticsEvent(analyticsEvent);\n\n if (player.analyticsUrl && player.analyticsConsent !== \"none\") {\n const client = new AnalyticsClient(player.analyticsUrl);\n client.sendToCustomAnalytics(analyticsEvent);\n }\n\n if (player.analyticsCustomUrl && player.analyticsConsent !== \"none\") {\n const client = new AnalyticsClient(player.analyticsCustomUrl);\n client.sendToCustomAnalytics(analyticsEvent);\n }\n\n if (player.analyticsTag) {\n const client = new AnalyticsClient(player.analyticsTag);\n client.sendToGoogleAnalytics(gaEventName(analyticsEvent), analyticsEvent);\n }\n};\n\nconst analyticsEventType = (player, playerEventType) => {\n // Emit a 'load' event once only, even if the media changes.\n if (playerEventType === \"MediaLoaded\" && !player.listenSessionId) { return \"load\"; }\n\n // Emit a 'play' event after 'PlaybackPlaying' followed by 'CurrentTimeUpdated'.\n // Only emit for new listens, i.e. if the content/advert changed from what it was previously.\n if (playerEventType === \"PlaybackPlaying\" && isNewListen(player)) { player.isNewListen = true; }\n if (playerEventType === \"CurrentTimeUpdated\" && player.isNewListen) { player.isNewListen = false; return \"play\"; }\n\n // Emit a 'play_progress' event for each 10%, 20%, ..., 100% of playback reached.\n if (playerEventType === \"CurrentTimeUpdated\" && isNextPercentage(player)) { return \"play_progress\"; }\n\n // Emit an 'ad_link_click' event when you press on an advert link/button/image/video.\n if (playerEventType.startsWith(\"PressedAdvert\")) { return \"ad_link_click\"; }\n};\n\nconst eventFromProps = (player, analyticsEventType) => {\n player.listenSessionId ||= randomUuid();\n player.sessionCreatedAt ||= Date.now();\n\n const withoutStorage = [\"without-local-storage\", \"none\"].includes(player.analyticsConsent);\n if (!withoutStorage) { localStorage.beyondwords ||= JSON.stringify(randomUuid()); }\n\n const activeAdvert = player.adverts[player.advertIndex];\n const contentItem = player.content[player.contentIndex];\n const percentage = player.duration ? (player.currentTime / player.duration) * 100 : 0;\n\n return {\n event_type: analyticsEventType,\n device_type: deviceType(),\n media_type: activeAdvert ? \"ad\" : \"content\",\n project_id: player.projectId,\n content_id: contentItem?.id,\n source_id: contentItem?.sourceId,\n analytics_id: player.analyticsId,\n ad_id: activeAdvert?.id,\n media_id: player.loadedMedia?.id,\n media_format: player.loadedMedia?.format,\n local_storage_id: withoutStorage ? null : JSON.parse(localStorage.beyondwords),\n listen_session_id: player.listenSessionId,\n session_created_at: player.sessionCreatedAt,\n duration: player.duration,\n listen_length_seconds: player.currentTime,\n listen_length_percent: Math.max(0, Math.min(100, percentage)),\n speed: player.playbackRate,\n location: window.location.href,\n referrer: document.referrer,\n player_version: \"1\",\n player_npm_version: version,\n };\n};\n\nconst gaEventName = ({ event_type, listen_length_percent }) => {\n const percentage = Math.floor(listen_length_percent / 10) * 10;\n\n if (event_type === \"load\") { return \"Load\"; }\n if (event_type === \"play\") { return \"Play\"; }\n if (event_type === \"play_progress\" && percentage === 100) { return \"Complete\"; }\n if (event_type === \"play_progress\") { return `${percentage}% listened`; }\n if (event_type === \"ad_link_click\") { return \"Advert Click\"; }\n};\n\nconst isNewListen = (player) => {\n let changed = false;\n\n // Handle content/adverts separately so that we don't consider it a new listen\n // after mid-roll adverts, or if the same advert is played twice in a row.\n const isAdvert = player.advertIndex !== -1;\n\n if (isAdvert) {\n const advertId = player.adverts[player.advertIndex]?.id || player.advertIndex;\n changed = advertId !== player.prevAdvertId;\n player.prevAdvertId = advertId;\n } else {\n const contentId = player.content[player.contentIndex]?.id || player.contentIndex;\n changed = contentId !== player.prevContentId;\n player.prevContentId = contentId;\n }\n\n return changed;\n};\n\nconst isNextPercentage = (player) => {\n // We send 'play' events with media_type: 'content' when the intro is played\n // but we should not send 'play_progress' events during the intro/outro.\n if (player.introsOutrosIndex !== -1) { return; }\n\n const nextPercentage = player.prevPercentage + 10;\n const currentPercentage = (player.currentTime / player.duration) * 100;\n\n if (currentPercentage >= nextPercentage) {\n player.prevPercentage = Math.floor(currentPercentage / 10) * 10;\n return true;\n }\n};\n\nconst deviceType = () => {\n if (maxDeviceWidth(499)) { return \"phone\"; } // Return 'phone' for 0 <= width < 499\n if (maxDeviceWidth(999)) { return \"tablet\"; } // Return 'tablet' for 500 <= width < 1000\n\n return \"desktop\"; // Return 'desktop' for 1000 <= width\n};\n\nconst maxDeviceWidth = (pixels) => (\n window.matchMedia && window.matchMedia(`only screen and (max-device-width: ${pixels}px)`).matches\n);\n\nexport default sendToAnalytics;\n","import * as stackTraceParser from \"stacktrace-parser\";\nimport { version } from \"../../package.json\";\n\nconst relativeUrl = (filename) => {\n const error = new Error();\n const url = stackTraceParser.parse(error.stack || \"\")[0]?.file;\n\n if (!url) { console.warn(\"BeyondWords.Player: unable to load dependencies\"); return \"\"; }\n if (!filename) { return url; }\n\n const pinnedUrl = url.replaceAll(\"player@latest\", `player@${version}`);\n const relativeUrl = replaceFilename(pinnedUrl, filename);\n\n return relativeUrl;\n};\n\nconst replaceFilename = (url, filename) => {\n const parts = url.split(\"/\");\n parts[parts.length - 1] = filename;\n return parts.join(\"/\");\n};\n\nexport default relativeUrl;\n","import PlayerComponent from \"./components/Player.svelte\";\nimport RootController from \"./controllers/rootController\";\nimport setErrorHandler from \"./helpers/setErrorHandler\";\nimport validateWebContext from \"./helpers/validateWebContext\";\nimport listenToSegments from \"./helpers/listenToSegments\";\nimport resolveTarget from \"./helpers/resolveTarget\";\nimport sendToAnalytics from \"./helpers/sendToAnalytics\";\nimport throwError from \"./helpers/throwError\";\nimport relativeUrl from \"./helpers/relativeUrl\";\nimport { version } from \"../package.json\";\n\nclass Player extends PlayerComponent {\n static #instances = [];\n\n constructor({ target, ...props }) {\n validateWebContext();\n setErrorHandler(props);\n listenToSegments();\n\n const { newTarget, showUserInterface } = resolveTarget(target);\n newTarget.classList.add(\"beyondwords-player\", \"bwp\");\n\n const controller = new RootController(null, Player);\n controller.addEventListener(\"<any>\", e => sendToAnalytics(this, e));\n\n const initialProps = { showUserInterface, ...props };\n super({ target: newTarget, props: { controller, ...initialProps, initialProps } });\n\n controller.player = this;\n Player.#instances.push(this);\n }\n\n static get version() {\n return version;\n }\n\n static get scriptSrc() {\n return relativeUrl();\n }\n\n static get styleSrc() {\n return relativeUrl(\"style.js\");\n }\n\n static get hlsSrc() {\n return relativeUrl(\"hls.light.min.js\");\n }\n\n static instances() {\n return [...Player.#instances];\n }\n\n static destroyAll() {\n Player.#instances.forEach(p => p.destroy());\n }\n\n destroy() {\n this.$destroy();\n Player.#instances = Player.#instances.filter(p => p !== this);\n }\n\n get target() {\n return this.$$.root;\n }\n\n set target(target) {\n throwError([\n \"Unable to change the player's target after initialization.\",\n \"Call player.destroy() and initialize a new player, instead.\",\n \"\",\n \"Alternatively, you can show or hide the player with:\",\n \"player.showUserInterface = <bool>\",\n ]);\n }\n}\n\nif (typeof window !== \"undefined\") {\n window.BeyondWords ||= {};\n window.BeyondWords.Player ||= Player;\n}\n\nexport default { Player };\n"],"names":["noop","identity","x","assign","tar","src","k","run","fn","blank_object","run_all","fns","is_function","thing","safe_not_equal","a","b","src_url_equal_anchor","src_url_equal","element_src","url","is_empty","obj","create_slot","definition","ctx","$$scope","slot_ctx","get_slot_context","get_slot_changes","dirty","lets","merged","len","i","update_slot_base","slot","slot_definition","slot_changes","get_slot_context_fn","slot_context","get_all_dirty_from_scope","length","null_to_empty","value","split_css_unit","split","is_client","now","raf","cb","tasks","run_tasks","task","loop","callback","fulfill","globals","append","target","node","get_root_for_style","root","append_empty_stylesheet","style_element","element","append_stylesheet","style","insert","anchor","detach","destroy_each","iterations","detaching","name","svg_element","text","data","space","empty","listen","event","handler","options","attr","attribute","children","set_data","set_input_value","input","set_style","key","important","select_option","select","mounting","option","select_value","selected_option","crossorigin","is_crossorigin","error","add_iframe_resize_listener","iframe","unsubscribe","toggle_class","toggle","custom_event","type","detail","bubbles","cancelable","e","managed_styles","active","hash","str","create_style_information","doc","info","create_rule","duration","delay","ease","uid","step","keyframes","p","t","rule","stylesheet","rules","animation","delete_rule","previous","next","anim","deleted","clear_rules","ownerNode","current_component","set_current_component","component","get_current_component","onMount","onDestroy","dirty_components","binding_callbacks","render_callbacks","flush_callbacks","resolved_promise","update_scheduled","schedule_update","flush","tick","add_render_callback","add_flush_callback","seen_callbacks","flushidx","saved_component","update","$$","flush_render_callbacks","filtered","targets","c","promise","wait","dispatch","direction","kind","outroing","outros","group_outros","check_outros","transition_in","block","local","transition_out","null_transition","create_bidirectional_transition","params","intro","config","running_program","pending_program","animation_name","clear_animation","init","program","d","go","easing","css","outro_and_destroy_block","lookup","update_keyed_each","old_blocks","get_key","dynamic","list","destroy","create_each_block","get_context","o","n","old_indexes","new_blocks","new_lookup","deltas","updates","child_ctx","will_move","did_move","new_block","old_block","new_key","old_key","bind","index","create_component","mount_component","customElement","fragment","after_update","new_on_destroy","destroy_component","make_dirty","instance","create_fragment","not_equal","props","append_styles","parent_component","ready","ret","rest","nodes","SvelteComponent","callbacks","$$props","throwError","message","context","getRandomValues","rnds8","rng","REGEX","validate","uuid","byteToHex","unsafeStringify","arr","offset","randomUUID","native","v4","buf","rnds","initiators","emitters","postStatuses","analyticsTypes","deviceTypes","mediaTypes","validateEventBeforeCreation","validateProperty","s","isTitleCase","validateEventBeforeProcessing","isValidUuid","isIsoDateString","validateEventAfterProcessing","validateAnalyticsEvent","string","startsWithCapital","hasNonAlphabetic","validationFn","newEvent","id","randomUuid","createdAt","__spreadValues","withQueryParams","search","googleAdTagParams","advertConsent","showingVideo","isLocahost","elementIsVisible","height","width","top","bottom","left","right","adsLoader","adDisplayContainer","onAdsManagerLoaded","onAdError","adsRequest","video","adsManagerLoadedEvent","$$invalidate","adsManager","onAdProgress","onClick","onPaused","onContentResumeRequested","adsLoaded","adEvent","adData","onEvent","playbackState","adError","adTagUrl","walker","adContainer","cssRegex","styles","currentTime","smoothedCurrentTime","onAnimationFrame","vastUrl","adParams","loadAds","orderedMediaSources","mediaObject","videoElement","audio","__spreadProps","loadMedia","source","hls","onError","play","startPosition","__async","prevPaused","prevRate","_a","_b","isHls","nativeSupport","Hls","loadHlsLibrary","af","ak","am","ar","as","az","be","bg","bm","bn","bs","ca","ckb","cs","cy","da","de","ee","el","en","eo","es","et","eu","fa","fi","fil","fr","ga","gd","gl","gu","ha","haw","he","hi","hr","hu","hy","ig","is","it","iw","ja","ka","kk","km","kn","ko","ky","lb","lg","ln","lo","lt","lv","mg","mk","ml","mn","mr","ms","mt","my","nb","ne","nl","nn","no","om","or","pa","pl","ps","pt","qu","ro","ru","rw","si","sk","sl","sn","so","sq","sr","sv","sw","ta","te","tg","th","ti","tr","tt","ug","uk","ur","uz","vi","yi","yo","zhHK","zhMO","zhTW","zh","zu","basename","path","validateTranslations","locales","languages","validateAtLeastOneDefault","validateAtMostOneDefault","validateTranslationKeys","locale","language","defaults","translations","allKeys","uniqKeys","modules","pairs","v","_","translate","translationsForBrowserPreference","localesToTry","blurElement","findSegmentIndex","segments","time","nextIndex","afterTheEnd","thisIndex","findLoadedMedia","sources","matchesUrl","matchesHls","_c","source_src_value","_attr","dispose","loadCount","initialTime","setTime","handlePlayError","timeout","loadedMedia","handleSourceError","sourceIndex","listener1","handleFullScreenChange","listener2","activeAdvert","contentItem","content","contentIndex","isFirstLoad","timeFragment","introOrOutro","handleHlsError","customUrl","prevPercentage","position","videoBehindWidget","widgetPosition","widgetWidth","segmentIndex","atTheStart","cubicOut","f","fly","y","opacity","target_opacity","transform","od","xValue","xUnit","yValue","yUnit","u","svg","svg_width_value","svg_height_value","scale","color","_set_style","button","isPlaying","tabindex","handleClick","rate","handleKeyDown","size","fontSize","seconds","description","isSegments","isSeconds","isTracks","backwardsSeconds","forwardsSeconds","margin","t_value","a_class_value","circular","current","color1","color2","visible","img","img_src_value","alt","raw_value","div","collapsible","collapsed","maxLines","maxWidth","center","bold","flex","maxWidthCss","maxHeight","progress","fullWidth","readonly","handleMouseDown","mouseDown","handleMouseMove","getMouseRatio","clientX","progressBar","mouseRatio","mouseup","handleMouseUp","mousemove","touchend","touchmove","backgroundStyle","circle","circle_stroke_dasharray_value","enabled","radius","strokeWidth","clamped","dashOffset","circumference","formatTime","hours","minutes","t2_value","span","t2","t0_value","t0","div1","div1_class_value","isScreen","playerStyle","isMobile","opacityCss","noTransition","isAdvert","zoom","fill","if_block1","create_if_block","contenttitle_changes","durationinmins_changes","larger","textColor","backgroundColor","iconColor","handleKeydown","prevItem","nextItem","handleFocus","scrollable","format","downloadFormats","item","desktopRows","mobileRows","exitDelay","idleDelay","isHovering","isExit","isIdle","exitTimeout","idleTimeout","relativeY","absoluteY","isVisible","entry","observer","belowBreakpoint","controlsOrder","playerStyles","knownPlayerStyle","canFullScreen","requestFullScreen","exitFullScreen","fullScreenElement","largeimage_changes","progresscircle_changes","advertlink_changes","advertbutton_changes","sourceurlbutton_changes","show_if","if_block0","create_if_block_15","if_block2","create_if_block_13","if_block4","create_if_block_11","if_block5","create_if_block_10","if_block7","create_if_block_8","if_block9","create_if_block_2","playlist_changes","callToAction","skipButtonStyle","playlistStyle","playlistToggle","playerTitle","fixedPosition","fixedWidth","playbackRate","persistentAdvert","logoIconEnabled","videoIsBehind","isSmall","isStandard","isLarge","isVideo","isStopped","isPlaylist","skipStyle","buttonColor","activeIconColor","buttonScale","playPauseScale","logoScale","closeScale","closeMargin","widthStyle","positionClasses","flyWidget","largeImage","largeImageHref","showBeyondWords","forcedCollapsed","playlistParts","showPlaylist","showPlaylistToggle","showAdvancedSettings","click_handler","click_handler_1","blobForImageUrl","imageUrl","revokePreviousUrls","image","resolve","reject","handleLoad","canvas","handleToBlob","objectUrls","blob","currentUrl","blobForSvgNode","svgElement","html","failedUrls","fallbackSvgs","imageSizes","renderedSvgs","onReject","$$value","showSeekButtons","showTrackButtons","imageUrl_","title","artworks","artwork","artist","album","seekTime","actionTypes","script0","script0_src_value","alreadyLoaded","OwnershipMediator","onSelected","onDeselected","__privateAdd","_arraysEqual","_removeLast","resourceId","consumerId","args","last","__privateMethod","arraysEqual_fn","removeLast_fn","nextLast","arr1","arr2","array","conditionFn","sectionEnabled","segment","sections","currentSections","hoveredSections","typeSections","dataAttribute","markClasses","m","_SegmentHighlights","background","__privateGet","_mediator","_addHighlights","addHighlights_fn","marker","markerElements","mark","_removeHighlights","removeHighlights_fn","markElements","child","SegmentHighlights","markerClasses","_SegmentClickables","_addClasses","addClasses_fn","_removeClasses","removeClasses_fn","safelyRemoveClasses","SegmentClickables","classes","classesToRemove","containerClasses","_SegmentContainers","onUpdate","sticky","_addContainers","addContainers_fn","self","container","_removeContainers","removeContainers_fn","SegmentContainers","identifiersEvent","fetchJson","_0","_1","fetchOptions","response","json","postJson","WebSocketClient","playerApiUrl","projectId","writeToken","_resolveBaseUrl","resolveBaseUrl_fn","headers","token","onMessage","webSocketUrl","protocol","identifier","jsonData","client","onStatusChange","handleMessage","handleError","webSocketEvent","handleStatusChange","handleRejection","result","waitUntil","settableProps","object","keyValues","ignoreList","diffObject","objBefore","objAfter","keys","diff","valueBefore","valueAfter","previousIndex","changedProps","applyTransitions","transitions","controller","player","currentIndex","transitionIndexAtTime","callTransitions","undoTransitions","before","after","delta","resolveTarget","isScriptTag","addDivAfter","findByQuery","appendDivToBody","elements","userinterface_changes","create_if_block_3","contentId","playlistId","sourceId","sourceUrl","showUserInterface","mediaSession","introsOutrosIndex","advertIndex","persistentAdImage","persistentIndex","widgetStyle","widgetTarget","highlightColor","highlightSections","clickableSections","segmentWidgetSections","segmentWidgetPosition","currentSegment","hoveredSegment","analyticsConsent","analyticsCustomUrl","analyticsTag","captureErrors","controlPanel","addEventListener","removeEventListener","showBottomWidget","showMediaSession","isFullScreen","mediaElement","userInterface","widgetInterface","analyticsUrl","analyticsId","listenSessionId","sessionCreatedAt","isNewListen","segmentContainers","segmentWidgets","segmentClickables","segmentHighlights","func","introsOutros","adverts","interfaceStyle","emittedFrom","statusEvent","lastHovered","currentAllowedInWidget","resetHovered","showRealTimeInWidget","widgetIsCurrent","PlayerApiClient","snakeCaseKeys","resolveTheme","theme","isBrowserDarkMode","setPropsFromApi","identifiers","identifiersArray","fetchData","handleNoContent","setProps","resetSomeProps","setContentProp","setAdvertsProp","colors","set","introsOutrosArray","imageEnabled","contentArray","advertsArray","isVast","propName","intro_outro_enabled","intro_url","outro_url","analytics_enabled","analytics_uuid_enabled","downloadFile","filename","href","erroredAdverts","updateErroredAdverts","advert","media","resultedInAPlaybackError","playedAdvertMedia","updatePlayedAdvertMedia","alreadyPlayedAdvertMedia","chooseAdvert","atTheEnd","errored","currentAdvert","placements","placementsThatCanPlay","bestSoFar","bestType","bestRandom","thisType","typeScores","thisRandom","isFirstItem","isLastItem","isBetweenPlaylistItems","lastSegment","midrollIndex","midrollSegmentIndex","midrollSegment","isAfterMidroll","closeToEnd","minimumTimeUntilEndForMidrollToPlay","eligiblePlacements","minimumDurationForMidrollToPlay","halfWayTimeToleranceForMidroll","halfWayTime","halfWayIndex","choosePersistentAdvert","bestMatch","bestPlacement","thisMatch","matchScore","thisPlacement","placementScores","erroredIntrosOutros","updateErroredIntrosOutros","introOutro","playedIntroOutroMedia","updatePlayedIntroOutroMedia","alreadyPlayedIntroOutroMedia","chooseIntroOutro","currentIntroOutro","bestPlayed","thisPlayed","atTheStartOfAllContent","atTheEndOfAllContent","chooseMediaSession","Player","allowOverride","websiteHasSetTheMediaSession","bestState","bestShowing","thisState","stateScores","thisShowing","showingScores","metadata","chooseWidget","somePlayerIsVisible","bestY","thisY","RootController","PlayerClass","_ignoreDueToAdvert","_ignoreDueToScrubbing","_sendEventToListeners","_hasIntro","_hasOutro","_isIntro","_isOutro","_isAdvert","_isMidrollAdvert","_isContent","_playOrPause","_pauseIfPlaying","_playFromSegment","_setRate","_setSegment","_setTrack","_setTime","_chooseAndSetIntroOutro","_chooseAndSetAdvert","_playDeferredIntroOutro","_playDeferredAdvert","_setIntroOutro","_setAdvert","_overridePlayerState","_restorePlayerState","_matchesIdentifiers","_currentSegmentChanged","eventType","listenerHandle","propsBefore","ignoreDueToAdvert_fn","ignoreDueToScrubbing_fn","playDeferredIntroOutro_fn","playDeferredAdvert_fn","propsAfter","sendEventToListeners_fn","setRate_fn","setSegment_fn","setTime_fn","setTrack_fn","playOrPause_fn","ratio","pauseIfPlaying_fn","chooseAndSetIntroOutro_fn","chooseAndSetAdvert_fn","widgetSegment","playFromSegment_fn","videoPaused","isMidrollAdvert_fn","wasIntro","isIntro_fn","wasAdvert","isAdvert_fn","isOutro_fn","mediaType","errorMessage","addOrRemove","parts","isShowing","audioIndex","videoIndex","audioItem","videoItem","mediaUrl","extension","legacyId","contentStatus","matchesIdentifiers_fn","isContent_fn","currentSegmentChanged_fn","typeListeners","hasIntro_fn","hasOutro_fn","__objRest","indexFn","cycle","playbackRates","maxIndex","tryIndex","updatedIndex","setIntroOutro_fn","outOfBounds","timeFn","setAdvert_fn","wasOutro","introFinished","outroFinished","advertsStarted","advertsFinished","overridePlayerState_fn","restorePlayerState_fn","_d","UNKNOWN_FUNCTION","parse","stackString","lines","stack","line","parseResult","parseChrome","parseWinjs","parseGecko","parseNode","parseJSC","chromeRe","chromeEvalRe","isNative","isEval","submatch","winjsRe","geckoRe","geckoEvalRe","javaScriptCoreRe","nodeRe","called","prevOnError","prevOnReject","setErrorHandler","thisFilename","originFilename","isDevelopment","errorFilename","lineNumber","columnNumber","originatedFromPlayer","isPlaybackError","stackTraceParser.parse","validateWebContext","listenToSegments","startX","startY","draggedMouse","markerElement","chooseSegment","changed","bestContent","j","thisContent","movedX","movedY","previousIndexes","playerIndex","AnalyticsClient","analyticsSink","eventName","sendToAnalytics","playerEvent","analyticsEventType","analyticsEvent","eventFromProps","gaEventName","playerEventType","isNextPercentage","withoutStorage","percentage","deviceType","version","event_type","listen_length_percent","advertId","nextPercentage","currentPercentage","maxDeviceWidth","pixels","relativeUrl","pinnedUrl","replaceFilename","_Player","PlayerComponent","newTarget","initialProps","_instances","__privateSet"],"mappings":"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","x_google_ignoreList":[0,2,3,4,5,6,7,131,132,216]}