@tixyel/streamelements 7.0.0 → 7.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","names":[],"sources":["../src/modules/EventProvider.ts","../src/modules/useStorage.ts","../src/client/client.ts","../src/helper/classes/number.ts","../src/helper/classes/element.ts","../src/helper/classes/object.ts","../src/data/collection/avatars.ts","../src/data/collection/badges.ts","../src/data/collection/css.ts","../src/data/collection/emotes.ts","../src/data/collection/items.ts","../src/data/collection/messages.ts","../src/data/collection/names.ts","../src/data/collection/tiers.ts","../src/data/collection/tts.ts","../src/data/collection/youtube-emotes.ts","../src/data/index.ts","../src/helper/classes/random.ts","../src/helper/classes/message.ts","../src/helper/classes/event.ts","../src/utils/color.ts","../src/helper/classes/color.ts","../src/helper/classes/string.ts","../src/helper/classes/sound.ts","../src/helper/classes/function.ts","../src/modules/fakeUser.ts","../src/helper/classes/utils.ts","../src/helper/index.ts","../src/actions/button.ts","../src/actions/command.ts","../src/modules/useComms.ts","../src/client/listener.ts","../src/modules/useQueue.ts","../src/local/index.ts","../src/modules/useLogger.ts","../src/multistream/comfyJs.ts","../src/streamelements/api.ts","../src/utils/alejo.ts","../src/main.ts","../src/index.ts"],"sourcesContent":["/**\n * EventProvider class for managing event listeners and emitters.\n * This class allows you to register event listeners, emit events, and manage event subscriptions.\n * @example\n * ```typescript\n * type TestEvents = {\n * load: [event: { type: 'load' }];\n * event: [event: { type: 'event' }];\n * };\n *\n * class Test extends EventProvider<TestEvents> {}\n *\n * const test = new Test();\n * test.once('load', (data) => {});\n * test.emit('load', { type: 'load' });\n *\n * test.on('event', (data) => {});\n * test.emit('event', { type: 'event' });\n * ```\n */\nexport class EventProvider<EventMap extends Record<string, any[]> = Record<string, any[]>> {\n /**\n * Stores registered event listeners.\n */\n private registeredEvents: {\n [K in keyof EventMap]?: Array<(this: this, ...args: EventMap[K]) => any>;\n } = {};\n\n /**\n * Emits an event to all registered listeners.\n * Returns an array of return values from the listeners.\n * @param eventName The name of the event.\n * @param args Arguments to pass to the listeners.\n */\n emit<K extends keyof EventMap>(eventName: K, ...args: EventMap[K]): any[] {\n const listeners = this.registeredEvents[eventName] || [];\n\n return listeners.map((listener) => listener.apply(this, args));\n }\n\n /**\n * Registers an event listener.\n * @param eventName The name of the event.\n * @param callback The callback function.\n */\n on<K extends keyof EventMap>(\n eventName: K,\n callback: (this: this, ...args: EventMap[K]) => any,\n ): this {\n if (typeof callback !== 'function') {\n throw new TypeError('Callback must be a function');\n }\n\n if (!this.registeredEvents[eventName]) {\n this.registeredEvents[eventName] = [];\n }\n\n this.registeredEvents[eventName]!.push(callback);\n\n return this;\n }\n\n /**\n * Removes a specific event listener.\n * @param eventName The name of the event.\n * @param callback The callback function to remove.\n */\n off<K extends keyof EventMap>(\n eventName: K,\n callback?: (this: this, ...args: EventMap[K]) => any,\n ): this {\n const listeners = this.registeredEvents[eventName] || [];\n\n if (!callback) {\n this.registeredEvents[eventName] = [];\n\n return this;\n }\n\n this.registeredEvents[eventName] = listeners.filter((fn) => fn !== callback);\n\n return this;\n }\n\n /**\n * Registers a listener that is executed only once.\n * @param eventName The name of the event.\n * @param callback The callback function.\n */\n once<K extends keyof EventMap>(\n eventName: K,\n callback: (this: this, ...args: EventMap[K]) => any,\n ): this {\n const wrapper = (...args: EventMap[K]) => {\n this.off(eventName, wrapper);\n callback.apply(this, args);\n };\n\n this.on(eventName, wrapper);\n\n return this;\n }\n\n /**\n * Removes all listeners for a specific event.\n * @param eventName The name of the event.\n */\n removeAllListeners<K extends keyof EventMap>(eventName: K): this {\n this.registeredEvents[eventName] = [];\n\n return this;\n }\n}\n","import { USE_SE_API } from '../main.js';\nimport type { JSONObject } from '../types/json.js';\nimport { PathValue } from '../types/path.js';\nimport { StreamElements } from '../types/streamelements/main.js';\nimport { EventProvider } from './EventProvider.js';\n\ntype UseStorageEvents<T> = {\n load: [T | null];\n update: [T];\n};\n\ntype UseStorageOptions<T> = {\n id?: string;\n data: T;\n};\n\nexport const usedStorages: Array<useStorage<any>> = [];\n\nexport class useStorage<T extends JSONObject> extends EventProvider<UseStorageEvents<T>> {\n private SE_API: StreamElements.SE_API | null = null;\n\n /** The unique identifier for the storage instance. */\n public id: string = 'default';\n public loaded: boolean = false;\n public data!: T;\n\n constructor(options: UseStorageOptions<T>) {\n super();\n\n this.id = options.id || this.id;\n this.data = options.data ?? ({} as T);\n\n usedStorages.push(this);\n\n USE_SE_API?.then((se) => {\n this.SE_API = se;\n\n se!.store\n .get<T>(this.id)\n .then((save) => {\n this.data = save ?? this.data;\n\n this.loaded = true;\n\n this.emit('load', this.data);\n\n if (JSON.stringify(this.data) !== JSON.stringify(save)) {\n this.emit('update', this.data);\n }\n })\n .catch(() => {\n this.loaded = true;\n\n this.emit('load', this.data);\n });\n });\n }\n\n /**\n * Saves the current data to storage.\n * @param data Data to save (defaults to current)\n */\n private save(data: T = this.data): void {\n if (this.loaded && this.SE_API) {\n if (JSON.stringify(this.data) !== JSON.stringify(data)) {\n this.data = data;\n\n this.SE_API.store.set<T>(this.id, this.data);\n\n this.emit('update', this.data);\n }\n }\n }\n\n /**\n * Updates the storage data and emits an update event\n * @param data Data to update (defaults to current)\n */\n public update(data: Partial<T> = this.data): void {\n if (this.loaded && JSON.stringify(this.data) !== JSON.stringify(data)) {\n const newData = { ...this.data, ...data };\n\n this.save(newData);\n }\n }\n\n /**\n * Adds a value to the storage at the specified path.\n * @param path Path to add the value to\n * @param value Value to add\n */\n public add<P extends string>(path: P, value: PathValue<T, P>): void {\n if (!this.loaded) return;\n\n useStorage.setByPath(this.data, path, value);\n\n this.save(this.data);\n }\n\n /**\n * Clears all data from the storage.\n */\n public clear(): void {\n if (this.loaded) {\n this.data = {} as T;\n\n this.save(this.data);\n }\n }\n\n /**\n * Sets a value in the storage at the specified path.\n * @param obj The object to set the value in\n * @param path The path to set the value at\n * @param value The value to set\n * @returns The updated object\n */\n static setByPath<P extends string, T extends object>(\n obj: T,\n path: P,\n value: PathValue<T, P>,\n ): void {\n const keys = path.split('.');\n let current: any = obj;\n\n for (let i = 0; i < keys.length - 1; i++) {\n if (typeof current[keys[i]] !== 'object' || current[keys[i]] == null) {\n current[keys[i]] = {};\n }\n\n current = current[keys[i]];\n }\n\n current[keys[keys.length - 1]] = value;\n\n return current;\n }\n\n public override on<K extends keyof UseStorageEvents<T>>(\n eventName: K,\n callback: (this: useStorage<T>, ...args: UseStorageEvents<T>[K]) => void,\n ): this {\n if (eventName === 'load' && this.loaded) {\n callback.apply(this, [this.data]);\n\n return this;\n }\n\n super.on(eventName, callback);\n\n return this;\n }\n}\n","import { Button } from '../actions/button.js';\nimport { Command } from '../actions/command.js';\nimport { EventProvider } from '../modules/EventProvider.js';\nimport { useStorage } from '../modules/useStorage.js';\nimport { Provider } from '../types/client.js';\nimport { StreamElements } from '../types/streamelements/main.js';\nimport { Alejo } from '../utils/alejo.js';\n\ntype ClientEvents = {\n load: [event: StreamElements.Event.onWidgetLoad];\n action: [action: Button | Command, type: 'created' | 'executed' | 'removed'];\n session: [session: StreamElements.Session.Data];\n event:\n | [provider: 'streamelements', event: StreamElements.Event.Provider.StreamElements.Events]\n | [provider: 'twitch', event: StreamElements.Event.Provider.Twitch.Events]\n | [provider: 'youtube', event: StreamElements.Event.Provider.YouTube.Events]\n | [provider: 'kick', event: StreamElements.Event.Provider.Kick.Events]\n | [provider: 'facebook', event: StreamElements.Event.Provider.Facebook.Events];\n};\n\nexport type ClientStorageOptions<T> = {\n value: T;\n timestamp: number;\n expire: number;\n};\n\nexport type ClientStorage = {\n user: Record<string, ClientStorageOptions<string>>;\n avatar: Record<string, ClientStorageOptions<string>>;\n pronoun: Record<string, ClientStorageOptions<Alejo.Pronouns.name>>;\n emote: Record<string, ClientStorageOptions<string>>;\n};\n\nexport type ClientOptions = {\n id?: string;\n debug?: boolean | (() => boolean);\n};\n\nexport class Client extends EventProvider<ClientEvents> {\n public id: string = 'default';\n public debug: boolean = false;\n\n public storage!: useStorage<ClientStorage>;\n\n public fields: StreamElements.Event.onWidgetLoad['fieldData'] = {};\n\n public session!: StreamElements.Session.Data;\n\n public loaded: boolean = false;\n\n constructor(options: ClientOptions) {\n super();\n\n this.id = options.id || this.id;\n\n this.storage = new useStorage<ClientStorage>({\n id: this.id,\n data: {\n user: {},\n avatar: {},\n pronoun: {},\n emote: {},\n },\n });\n\n this.on('load', () => {\n this.debug = Boolean(typeof options.debug === 'function' ? options.debug() : options.debug);\n });\n\n window.client = this;\n }\n\n public actions: {\n commands: Command[];\n buttons: Button[];\n } = {\n commands: [],\n buttons: [],\n };\n\n public details!: {\n provider: Provider | 'local';\n user: StreamElements.Event.onWidgetLoad['channel'];\n currency: StreamElements.Event.onWidgetLoad['currency'];\n overlay: StreamElements.Event.onWidgetLoad['overlay'];\n };\n\n public cache: {\n /**\n * Avatar cache duration in minutes.\n */\n avatar: number;\n /**\n * Pronoun cache duration in minutes.\n */\n pronoun: number;\n /**\n * Emote cache duration in minutes.\n */\n emote: number;\n } = {\n avatar: 30,\n pronoun: 60,\n emote: 120,\n };\n\n override on<K extends keyof ClientEvents>(\n eventName: K,\n callback: (this: Client, ...args: ClientEvents[K]) => void,\n ): this {\n if (eventName === 'load' && this.loaded) {\n callback.apply(this, [\n {\n channel: this.details.user,\n currency: this.details.currency,\n fieldData: this.fields,\n recents: [],\n session: {\n data: this.session,\n settings: {\n autoReset: false,\n calendar: false,\n resetOnStart: false,\n },\n },\n overlay: this.details.overlay,\n emulated: false,\n } as StreamElements.Event.onWidgetLoad,\n ] as unknown as ClientEvents[K]);\n\n return this;\n }\n\n super.on(eventName, callback);\n\n return this;\n }\n}\n","/**\n * NumberHelper class provides utility methods for working with numbers, including translation to words, balancing within a range, rounding, and generating random numbers.\n */\nexport class NumberHelper {\n /**\n * Translate number to words\n * @param num - Number to translate\n * @param type - Translation type\n * @returns - Number in words\n * @example\n * ```javascript\n * const cardinal = translate(42, 'cardinal');\n * console.log(cardinal); // \"forty-two\"\n * const ordinal = translate(42, 'ordinal');\n * console.log(ordinal); // \"forty-second\"\n * const suffix = translate(42, 'suffix');\n * console.log(suffix); // \"42nd\"\n * ```\n */\n translate(num: number, type: 'cardinal' | 'ordinal' | 'suffix' = 'cardinal'): string {\n const CARDINALS = {\n single: ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'],\n tens: [\n 'ten',\n 'eleven',\n 'twelve',\n 'thirteen',\n 'fourteen',\n 'fifteen',\n 'sixteen',\n 'seventeen',\n 'eighteen',\n 'nineteen',\n ],\n decades: ['twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety'],\n };\n const ORDINALS = {\n single: [\n 'zeroth',\n 'first',\n 'second',\n 'third',\n 'fourth',\n 'fifth',\n 'sixth',\n 'seventh',\n 'eighth',\n 'ninth',\n ],\n tens: [\n 'tenth',\n 'eleventh',\n 'twelfth',\n 'thirteenth',\n 'fourteenth',\n 'fifteenth',\n 'sixteenth',\n 'seventeenth',\n 'eighteenth',\n 'nineteenth',\n ],\n decades: [\n 'twentieth',\n 'thirtieth',\n 'fortieth',\n 'fiftieth',\n 'sixtieth',\n 'seventieth',\n 'eightieth',\n 'ninetieth',\n ],\n };\n const SUFFIXES = ['th', 'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th'];\n const SCALES = ['', 'thousand', 'million', 'billion', 'trillion', 'quadrillion', 'quintillion'];\n const SCALES_ORD = SCALES.map((s) => (s ? `${s}th` : ''));\n\n num = Math.abs(Math.floor(num));\n\n if (type === 'suffix') {\n const rem100 = num % 100;\n if (rem100 >= 11 && rem100 <= 13) return `${num}th`;\n const rem10 = num % 10;\n return `${num}${SUFFIXES[rem10]}`;\n }\n\n function below100(n: number, kind: 'cardinal' | 'ordinal'): string {\n if (n < 10) return kind === 'ordinal' ? ORDINALS.single[n] : CARDINALS.single[n];\n if (n < 20) return kind === 'ordinal' ? ORDINALS.tens[n - 10] : CARDINALS.tens[n - 10];\n const decade = Math.floor(n / 10);\n const single = n % 10;\n if (single === 0)\n return kind === 'ordinal' ? ORDINALS.decades[decade - 2] : CARDINALS.decades[decade - 2];\n const tensPart = CARDINALS.decades[decade - 2];\n const unitPart = kind === 'ordinal' ? ORDINALS.single[single] : CARDINALS.single[single];\n return `${tensPart}-${unitPart}`;\n }\n\n function below1000(n: number, kind: 'cardinal' | 'ordinal'): string {\n if (n === 0) return kind === 'ordinal' ? ORDINALS.single[0] : CARDINALS.single[0];\n const hundreds = Math.floor(n / 100);\n const rest = n % 100;\n const parts: string[] = [];\n if (hundreds > 0) {\n if (kind === 'ordinal' && rest === 0) parts.push(`${CARDINALS.single[hundreds]} hundredth`);\n else parts.push(`${CARDINALS.single[hundreds]} hundred`);\n }\n if (rest > 0) parts.push(below100(rest, kind));\n return parts.join(' ');\n }\n\n if (num < 1000) return below1000(num, type);\n\n const groups: number[] = [];\n let n = num;\n while (n > 0) {\n groups.push(n % 1000);\n n = Math.floor(n / 1000);\n }\n\n let lastNonZeroIndex = -1;\n for (let i = 0; i < groups.length; i++) if (groups[i] !== 0) lastNonZeroIndex = i;\n\n const parts: string[] = [];\n for (let i = groups.length - 1; i >= 0; i--) {\n const g = groups[i];\n if (g === 0) continue;\n const scale = SCALES[i];\n\n if (type === 'cardinal') {\n let segment = below1000(g, 'cardinal');\n if (scale) segment += ` ${scale}`;\n parts.push(segment);\n } else {\n const isLastNonZero = i === lastNonZeroIndex;\n if (isLastNonZero) {\n if (i > 0) {\n const segment = below1000(g, 'cardinal');\n const ordScale = SCALES_ORD[i];\n parts.push(segment ? `${segment} ${ordScale}` : ordScale);\n } else {\n const segment = below1000(g, 'ordinal');\n parts.push(segment);\n }\n } else {\n let segment = below1000(g, 'cardinal');\n if (scale) segment += ` ${scale}`;\n parts.push(segment);\n }\n }\n }\n\n return parts.join(', ');\n }\n\n /**\n * Balances a number within a specified range\n * @param amount - Number to balance\n * @param min - Minimum value\n * @param max - Maximum value\n * @param decimals - Number of decimal places to round to (default is 0)\n * @returns - Balanced number\n * @example\n * ```javascript\n * const balancedValue = balance(150, 0, 100);\n * console.log(balancedValue); // 100\n * ```\n */\n balance(amount: number, min: number = 0, max: number = 100, decimals: number = 0): number {\n const result = Math.min(Math.max(amount, min), max);\n\n return this.round(result, decimals);\n }\n\n /**\n * Rounds a number to a specified number of decimal places\n * @param value - Number to round\n * @param decimals - Number of decimal places (default is 2)\n * @returns Rounded number\n * @example\n * ```javascript\n * const roundedValue = round(3.14159, 3);\n * console.log(roundedValue); // 3.142\n * const roundedValueDefault = round(3.14159);\n * console.log(roundedValueDefault); // 3.14\n * const roundedValueZero = round(3.14159, 0);\n * console.log(roundedValueZero); // 3\n * ```\n */\n round(value: number, decimals: number = 2): number {\n const factor = Math.pow(10, decimals);\n\n return Math.round(value * factor) / factor;\n }\n\n /**\n * Generate random number\n * @param min - Minimum value\n * @param max - Maximum value\n * @param float - Number of decimal places (0 for integer)\n * @returns - Random number\n * @example\n * ```javascript\n * const intNumber = random(1, 10);\n * console.log(intNumber); // e.g. 7\n *\n * const floatNumber = random(1, 10, 2);\n * console.log(floatNumber); // e.g. 3.14\n * ```\n */\n random(min: number, max: number, float: number = 0): number {\n if (min > max) [min, max] = [max, min];\n\n const rand = Math.random() * (max - min) + min;\n return float ? Number(rand.toFixed(float)) : Math.round(rand);\n }\n}\n","import { NumberHelper } from './number.js';\n\nexport interface ScaleOptions<T extends HTMLElement> {\n /**\n * The parent element to use for scaling calculations. If not provided, the element's parent will be used.\n */\n parent?: HTMLElement;\n /**\n * The preferred dimension to base the scaling on. Can be 'width', 'height', or 'auto' (default).\n */\n prefer?: 'width' | 'height' | 'auto';\n /**\n * The minimum percentage of the parent size to scale to. Default is 0.\n */\n min?: number;\n /**\n * The maximum percentage of the parent size to scale to. Default is 1 (100%).\n */\n max?: number;\n /**\n * A callback function that is called after scaling is applied.\n * @param this - The HTML element being scaled.\n * @param number - The scale factor applied to the element.\n * @param element - The HTML element being scaled.\n * @returns void\n */\n apply?: (this: T, number: number, element: T) => void;\n}\n\nexport type FitTextOptions = {\n minFontSize?: number;\n maxFontSize?: number;\n parent?: HTMLElement;\n};\n\nexport class ElementHelper {\n /**\n * Merges outer span styles with inner span styles in the provided HTML string.\n * @param outerStyle - The style string to be applied to the outer span.\n * @param innerHTML - The inner HTML string which may contain a span with its own styles.\n * @returns A new HTML string with merged styles applied to a single span.\n * @example\n * ```javascript\n * const result = mergeSpanStyles(\"color: red; font-weight: bold;\", '<span style=\"font-size: 14px;\">Hello World</span>');\n * console.log(result); // Output: '<span style=\"font-size: 14px; color: red; font-weight: bold;\">Hello World</span>'\n * ```\n */\n mergeSpanStyles(outerStyle: string, innerHTML: string, className?: string): string {\n const match = innerHTML.match(/^<span(?: class=\"[^\"]*\")? style=\"([^\"]*)\">(.*)<\\/span>$/s);\n\n if (match) {\n const innerStyle = match[1];\n const content = match[2];\n const innerClass = match[0].match(/class=\"([^\"]*)\"/)?.[1] || '';\n\n let mergedStyle = [innerStyle, outerStyle]\n .filter((a) => a.length)\n .map((s) => {\n if (s.endsWith(';')) return s.slice(0, -1);\n else return s;\n })\n .join('; ')\n .replace(/\\s*;\\s*/g, '; ')\n .trim();\n\n if (!mergedStyle.endsWith(';')) mergedStyle += ';';\n\n return `<span${innerClass ? ` class=\"${innerClass} ${className ?? ''}\"` : ''}${mergedStyle ? ` style=\"${mergedStyle}\"` : ''}>${content}</span>`;\n } else {\n if (outerStyle && outerStyle.length && !outerStyle.endsWith(';')) outerStyle += ';';\n\n return `<span${className ? ` class=\"${className}\"` : ''}${outerStyle ? ` style=\"${outerStyle}\"` : ''}>${innerHTML}</span>`;\n }\n }\n\n /**\n * Scales an HTML element to fit within its parent element based on specified minimum and maximum scale factors.\n * @param element - The HTML element to be scaled.\n * @param min - Minimum scale factor (default is 0).\n * @param max - Maximum scale factor (default is 1).\n * @param options - Optional settings for scaling.\n * @returns - An object containing the new width, height, and scale factor, or void if not applied.\n * @example\n * ```javascript\n * const element = document.getElementById('myElement');\n * scale(element, 0.5, 1, { return: false });\n * ```\n */\n scale(\n element: HTMLElement,\n min: number = 0,\n max: number = 1,\n options?: { return: boolean; parent: HTMLElement; base: 'width' | 'height' },\n ): { width: number; height: number; scale: number } | void {\n const { return: returnOnly = false, parent: customParent, base } = options || {};\n\n const parent = customParent || element.parentElement || document.body;\n\n if (!parent) {\n throw new Error('No parent element found for scaling');\n }\n\n const parentRect = parent.getBoundingClientRect();\n const elementWidth = element.offsetWidth;\n const elementHeight = element.offsetHeight;\n\n if (elementWidth === 0 || elementHeight === 0) {\n throw new Error('Element has zero width or height, cannot scale');\n }\n\n // Calculate scales for both dimensions\n const scaleX = (parentRect.width * max) / elementWidth;\n const scaleY = (parentRect.height * max) / elementHeight;\n\n // Determine final scale based on base option or use smaller scale\n let finalScale =\n base === 'width' ? scaleX : base === 'height' ? scaleY : Math.min(scaleX, scaleY);\n\n // Apply minimum constraint if needed\n if (min > 0) {\n const minScaleX = (parentRect.width * min) / elementWidth;\n const minScaleY = (parentRect.height * min) / elementHeight;\n const minScale = Math.max(minScaleX, minScaleY);\n\n finalScale = Math.max(minScale, finalScale);\n }\n\n const result = {\n width: elementWidth * finalScale,\n height: elementHeight * finalScale,\n scale: finalScale,\n };\n\n if (returnOnly) {\n return result;\n }\n\n element.style.transform = `scale(${finalScale})`;\n element.style.transformOrigin = 'center center';\n\n return result;\n }\n\n /**\n * Scales an HTML element to fit within its parent element based on specified options.\n * @param element - The HTML element to be scaled.\n * @param options - Optional settings for scaling.\n * @returns The scale factor applied to the element.\n * @example\n * ```javascript\n * const element = document.getElementById('myElement');\n * const scaleFactor scalev2(element, {\n * min: 0.5,\n * max: 1,\n * prefer: 'width',\n * apply: (scale, el) => el.style.transform = `scale(${scale})`\n * });\n * console.log(`Element scaled by a factor of ${scaleFactor}`);\n * ```\n */\n scalev2<T extends HTMLElement>(element: T, options: ScaleOptions<T> = {}): number {\n const {\n parent = element.parentElement,\n prefer = 'auto',\n min = 0,\n max = 1,\n apply = () => {},\n } = options;\n\n if (!parent) {\n throw new Error('No parent element found for scaling');\n }\n\n const parentClientRect = parent.getBoundingClientRect();\n const elementClientRect = element.getBoundingClientRect();\n\n const parentWidth = parentClientRect.width;\n const parentHeight = parentClientRect.height;\n\n const elementWidth = elementClientRect.width;\n const elementHeight = elementClientRect.height;\n\n let scaleXmin = (parentWidth * min) / elementWidth;\n let scaleYmin = (parentHeight * min) / elementHeight;\n\n let scaleXmax = (parentWidth * max) / elementWidth;\n let scaleYmax = (parentHeight * max) / elementHeight;\n\n let scaleValue = Math.min(scaleXmax, scaleYmax);\n\n const minScale = Math.max(scaleXmin, scaleYmin);\n scaleValue = Math.max(scaleValue, minScale);\n\n const finalScaleX = elementWidth * scaleValue;\n const finalScaleY = elementHeight * scaleValue;\n\n if (prefer === 'width') {\n scaleValue = Math.max(scaleXmin, Math.min(scaleXmax, parentWidth / elementWidth));\n } else if (prefer === 'height') {\n scaleValue = Math.max(scaleYmin, Math.min(scaleYmax, parentHeight / elementHeight));\n } else {\n if (finalScaleX > parentWidth) {\n scaleValue = Math.max(scaleXmin, Math.min(scaleXmax, parentWidth / elementWidth));\n } else if (finalScaleY > parentHeight) {\n scaleValue = Math.max(scaleYmin, Math.min(scaleYmax, parentHeight / elementHeight));\n }\n }\n\n apply.apply(element, [scaleValue, element]);\n\n return scaleValue;\n }\n\n /**\n * Fits the text within the parent element by adjusting the font size.\n * @param element - The HTML element containing the text to be fitted.\n * @param compressor - A multiplier to adjust the fitting sensitivity (default is 1).\n * @param options - Optional settings for fitting text.\n * @returns The HTML element with adjusted font size.\n * @example\n * ```javascript\n * const element = document.getElementById('myTextElement');\n * fitText(element, 1, { minFontSize: 12, maxFontSize: 36 });\n * console.log(`Adjusted font size: ${element.style.fontSize}`);\n * ```\n */\n fitText(element: HTMLElement, compressor: number = 1, options: FitTextOptions = {}) {\n const fontSize = parseFloat(getComputedStyle(element).getPropertyValue('font-size'));\n\n const settings = {\n minFontSize: options?.minFontSize ?? 0,\n maxFontSize: options?.maxFontSize ?? fontSize,\n };\n\n const parent = options?.parent || element.parentElement;\n\n if (!parent) {\n throw new Error('No parent element found for fitting text');\n }\n\n const parentWidth = parent.clientWidth * compressor;\n const elWidth = element.offsetWidth;\n\n const ratio = parentWidth / elWidth;\n const value = fontSize * ratio;\n\n const number = new NumberHelper();\n const result = number.balance(value, settings.minFontSize, settings.maxFontSize);\n\n element.style.fontSize = result + 'px';\n\n return element;\n }\n\n /**\n * Wraps formatted HTML text with containers and splits characters into indexed spans.\n * Adds 'container' class and data-index to all parent elements, and wraps each character in a span with class 'char' and data-index.\n * @param htmlString - The input HTML string containing formatted text elements (span, strong, em, etc).\n * @param startIndex - The starting index for the data-index attribute (default is 0).\n * @returns - A new HTML string with containers and character-level indexing.\n * @example\n * ```javascript\n * const result = splitTextToChars('<span>TesTe</span> <strong>bold</strong>', 0);\n * console.log(result);\n * // Output: '<span class=\"container\" data-index=\"0\"><span class=\"char\" data-index=\"0\">T</span><span class=\"char\" data-index=\"1\">e</span>...'\n * ```\n */\n splitTextToChars(\n htmlString: string,\n startIndex: number = 0,\n preserveInterElementWhitespace: boolean = false,\n ): string {\n const parser = new DOMParser();\n const processed = document.createElement('div');\n\n let charIndex = startIndex;\n\n function processNode(node: Node): Node | DocumentFragment {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent || '';\n\n const chars = text.split('').map((char, index) => {\n const span = document.createElement('span');\n\n span.classList.add('char');\n span.dataset.index = String(charIndex);\n span.dataset.exclusivityIndex = String(index);\n span.style.setProperty('--char-index', String(charIndex));\n span.style.setProperty('--exclusivity-index', String(index));\n\n if (char === ' ' || char === '\\n' || char === '\\t') {\n span.style.whiteSpace = 'pre-wrap';\n } else {\n charIndex++;\n }\n\n span.textContent = char;\n\n return span;\n });\n\n const fragment = document.createDocumentFragment();\n chars.forEach((char) => fragment.appendChild(char));\n\n return fragment;\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n const clone = node.cloneNode(false) as HTMLElement;\n\n clone.classList.add('container');\n clone.dataset.index = String(charIndex);\n clone.style.setProperty('--char-index', String(charIndex));\n clone.style.setProperty('--exclusivity-index', String(charIndex));\n\n charIndex++;\n\n node.childNodes.forEach((child) => {\n const processed = processNode(child);\n\n clone.appendChild(processed);\n });\n\n return clone;\n }\n\n return node.cloneNode(true);\n }\n\n parser.parseFromString(htmlString, 'text/html').body.childNodes.forEach((node) => {\n if (\n !preserveInterElementWhitespace &&\n node.nodeType === Node.TEXT_NODE &&\n !node.textContent?.trim()\n ) {\n return;\n }\n\n const result = processNode(node);\n\n processed.appendChild(result);\n });\n\n let html = '';\n\n Array.from(processed.childNodes).forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE) html += node.textContent;\n else html += (node as HTMLElement).outerHTML;\n });\n\n return html;\n }\n}\n","export class ObjectHelper {\n /**\n * Flattens a nested object into a single-level object with dot-separated keys.\n * @param obj - The nested object to be flattened.\n * @param prefix - The prefix to be added to each key (used for recursion).\n * @returns A flattened object with dot-separated keys.\n * @example\n * ```javascript\n * const nestedObj = { a: { b: 1, c: { d: 2 } }, e: [3, 4] };\n * const flatObj = flatten(nestedObj);\n * console.log(flatObj);\n * // Output: { 'a.b': '1', 'a.c.d': '2', 'e:0': '3', 'e:1': '4' }\n * ```\n */\n flatten(\n obj: Record<string, any>,\n stringify: boolean = true,\n prefix: string = '',\n ): Record<string, typeof stringify extends true ? string : string | number | boolean> {\n const result = {} as Record<\n string,\n typeof stringify extends true ? string : string | number | boolean\n >;\n\n for (const key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n\n const value = obj[key];\n const path = prefix ? `${prefix}.${key}` : key;\n\n // Handle null and undefined\n if (value === null || value === undefined) {\n result[path] = String(value);\n\n continue;\n }\n\n if (typeof value === 'number' && isNaN(value)) {\n result[path] = 'NaN';\n\n continue;\n }\n\n if (typeof value === 'number' && !isNaN(value)) {\n result[path] = stringify ? String(value) : value;\n\n continue;\n }\n\n // Handle Date objects\n if (value instanceof Date) {\n result[path] = value.toISOString();\n\n continue;\n }\n\n // Handle Map objects\n if (value instanceof Map) {\n value.forEach((v, k) => {\n result[`${path}.${k}`] = JSON.stringify(v);\n });\n\n continue;\n }\n\n // Handle Array objects\n if (Array.isArray(value)) {\n value.forEach((v, i) => {\n const itemPath = `${path}:${i}`;\n\n if (typeof v === 'object') {\n Object.assign(result, this.flatten(v, stringify, itemPath));\n } else {\n result[itemPath] = stringify ? String(v) : v;\n }\n });\n\n continue;\n }\n\n // Handle nested objects\n if (typeof value === 'object') {\n Object.assign(result, this.flatten(value, stringify, path));\n continue;\n }\n\n // Handle primitive values (string, number, boolean, etc.)\n result[path] = String(value);\n }\n\n return result;\n }\n\n /**\n * Returns the entries of an object as an array of key-value pairs, with proper typing.\n * @param obj - The object to retrieve entries from.\n * @returns An array of key-value pairs from the object, typed as an array of tuples with key and value types.\n */\n entries<K extends string, V>(obj: Record<K, V>): [K, V][] {\n return Object.entries(obj) as [K, V][];\n }\n\n /**\n * Returns the values of an object as an array, with proper typing.\n * @param obj - The object to retrieve values from.\n * @returns An array of values from the object, typed as an array of the value type.\n */\n values<K extends string, V>(obj: Record<K, V>): V[] {\n return Object.values(obj) as V[];\n }\n\n /**\n * Returns the keys of an object as an array of strings, with proper typing.\n * @param obj - The object to retrieve keys from.\n * @returns An array of keys from the object, typed as an array of strings.\n */\n keys<K extends string, V>(obj: Record<K, V>): K[] {\n return Object.keys(obj) as K[];\n }\n}\n","export const avatars = [\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/13e5fa74-defa-11e9-809c-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/dbdc9198-def8-11e9-8681-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/998f01ae-def8-11e9-b95c-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/de130ab0-def7-11e9-b668-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/ebe4cd89-b4f4-4cd9-adac-2f30151b4209-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/215b7342-def9-11e9-9a66-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/ead5c8b2-a4c9-4724-b1dd-9f00b46cbd3d-profile_image-300x300.png',\n];\n","import { Twitch } from '../../types/twitch.js';\n\nexport const globalBadges: Twitch.GlobalBadge[] = [\n {\n 'set_id': 'qsmp2',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2fa68fb9-fcdd-4795-bfab-f408e10efaef/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2fa68fb9-fcdd-4795-bfab-f408e10efaef/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2fa68fb9-fcdd-4795-bfab-f408e10efaef/3',\n 'title': 'QSMP2',\n 'description': 'This badge was earned for watching QSMP during the initial 2026 launch!',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/quackity',\n },\n ],\n },\n {\n 'set_id': 'jasontheween-7-day-survival',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f299577c-8b51-4cb1-ad7c-11faca0c32e9/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f299577c-8b51-4cb1-ad7c-11faca0c32e9/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f299577c-8b51-4cb1-ad7c-11faca0c32e9/3',\n 'title': 'JasonTheWeen 7 Day Survival',\n 'description':\n \"This badge was earned by watching 30 minutes of JasonTheWeen's 7 day survival stream!\",\n 'click_action': 'visit_url',\n 'click_url': 'https://twitch.tv/jasontheween',\n },\n ],\n },\n {\n 'set_id': 'support-a-streamer-ho26-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fe0814c3-87f9-40cb-95b5-d1e7453f289d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fe0814c3-87f9-40cb-95b5-d1e7453f289d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fe0814c3-87f9-40cb-95b5-d1e7453f289d/3',\n 'title': \"Support a Streamer HO'26\",\n 'description':\n 'This badge was earned by subscribing or gifting a sub to any World of Tanks broadcast during the Holiday Ops 26 campaign period',\n 'click_action': 'visit_url',\n 'click_url': 'https://worldoftanks.eu/en/news/general-news/wot-monthly-december-2025/',\n },\n ],\n },\n {\n 'set_id': 'twitch-recap-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/48b26ab3-c9f1-4f16-b02d-fe877be389fd/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/48b26ab3-c9f1-4f16-b02d-fe877be389fd/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/48b26ab3-c9f1-4f16-b02d-fe877be389fd/3',\n 'title': 'Twitch Recap 2025',\n 'description': 'This exclusive badge was earned by the top 20% of Twitch users in 2025.',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/annual-recap',\n },\n ],\n },\n {\n 'set_id': 'ugly-sweater',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/8eddf4ab-68f8-4ee8-a07d-9d7e8520463e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/8eddf4ab-68f8-4ee8-a07d-9d7e8520463e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/8eddf4ab-68f8-4ee8-a07d-9d7e8520463e/3',\n 'title': 'Ugly Sweater',\n 'description':\n 'This badge was earned for sharing festive Clips during Holiday Hoopla 2025.',\n 'click_action': 'visit_url',\n 'click_url': 'https://help.twitch.tv/s/article/how-to-use-badges?language=en_US',\n },\n ],\n },\n {\n 'set_id': 'fright-fest-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2ef2cd27-2210-4640-bbf8-69b5c4d9e302/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2ef2cd27-2210-4640-bbf8-69b5c4d9e302/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2ef2cd27-2210-4640-bbf8-69b5c4d9e302/3',\n 'title': 'Fright Fest 2025',\n 'description': 'This badge was earned by users who shared the best 2025 Fright Fest clips.',\n 'click_action': 'visit_url',\n 'click_url': 'https://blog.twitch.tv/en/2025/10/20/twitch-fright-fest-2025/',\n },\n ],\n },\n {\n 'set_id': 'gamerduo',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/be750d4d-a3b9-4116-ae75-6ee4f3294a19/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/be750d4d-a3b9-4116-ae75-6ee4f3294a19/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/be750d4d-a3b9-4116-ae75-6ee4f3294a19/3',\n 'title': 'GamerDuo',\n 'description': 'Subbed to a streamer and got 3 months of free Super Duolingo!',\n 'click_action': 'visit_url',\n 'click_url': 'https://blog.twitch.tv/2025/10/02/sub-for-super-duolingo/',\n },\n ],\n },\n {\n 'set_id': 'video-games-day',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/34a57a67-b058-45a9-b088-da681aebc83e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/34a57a67-b058-45a9-b088-da681aebc83e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/34a57a67-b058-45a9-b088-da681aebc83e/3',\n 'title': 'Video Games Day',\n 'description':\n 'This badge was earned by users who downloaded and shared clips revolving around anything Video Games related in September 2025.',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/gaming',\n },\n ],\n },\n {\n 'set_id': 'twitch-intern-2022',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/91ed38ea-32fe-4f14-8db1-852537d19aa5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/91ed38ea-32fe-4f14-8db1-852537d19aa5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/91ed38ea-32fe-4f14-8db1-852537d19aa5/3',\n 'title': 'Twitch Intern 2022',\n 'description': 'This user was an intern at Twitch for the summer of 2022',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/jobs/early-career/',\n },\n ],\n },\n {\n 'set_id': 'touch-grass',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/51f536c1-96ca-495b-bc11-150c857a6d54/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/51f536c1-96ca-495b-bc11-150c857a6d54/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/51f536c1-96ca-495b-bc11-150c857a6d54/3',\n 'title': 'Touch Grass',\n 'description':\n 'This badge was earned by users who touched grass and shared their favorite IRL clips in August 2025.',\n 'click_action': 'visit_url',\n 'click_url': 'https://help.twitch.tv/s/article/twitch-chat-badges-guide',\n },\n ],\n },\n {\n 'set_id': 'twitchcon-referral-program-2025-chrome-star',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d139bccf-8184-4fec-a970-cd8d81a7f51a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d139bccf-8184-4fec-a970-cd8d81a7f51a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d139bccf-8184-4fec-a970-cd8d81a7f51a/3',\n 'title': 'TwitchCon Referral Program 2025 (Chrome Star)',\n 'description':\n 'This badge was earned by referring at least one friend who bought their TwitchCon 2025 ticket using your unique referral link.',\n 'click_action': 'visit_url',\n 'click_url': 'https://twitchcon.com/rotterdam-2025/referral-program/',\n },\n ],\n },\n {\n 'set_id': 'twitchcon-referral-program-2025-bleedpurple',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/81952c7b-cfec-479c-a8f6-2bccc296786c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/81952c7b-cfec-479c-a8f6-2bccc296786c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/81952c7b-cfec-479c-a8f6-2bccc296786c/3',\n 'title': 'TwitchCon Referral Program 2025 (bleedPurple)',\n 'description':\n 'This badge was earned by referring ten friends who bought their TwitchCon 2025 ticket using your unique referral link.',\n 'click_action': 'visit_url',\n 'click_url': 'https://twitchcon.com/rotterdam-2025/referral-program/',\n },\n ],\n },\n {\n 'set_id': 'share-the-love',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2de71f4f-b152-4308-a426-127a4cf8003a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2de71f4f-b152-4308-a426-127a4cf8003a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2de71f4f-b152-4308-a426-127a4cf8003a/3',\n 'title': 'Share the Love',\n 'description':\n 'This lovely badge was earned by users who shared their favorite Twitch clips in February 2025.',\n 'click_action': 'visit_url',\n 'click_url': 'https://blog.twitch.tv/2025/02/14/share-the-love-this-valentine-s-day/',\n },\n ],\n },\n {\n 'set_id': 'gone-bananas',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e2ba99f4-6079-44d1-8c07-4ca6b58de61f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e2ba99f4-6079-44d1-8c07-4ca6b58de61f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e2ba99f4-6079-44d1-8c07-4ca6b58de61f/3',\n 'title': 'Gone Bananas Badge',\n 'description':\n 'This gilded banana badge was scored by sharing a lulz-worthy clip during April Fool’s week 2025.',\n 'click_action': 'visit_url',\n 'click_url': 'http://blog.twitch.tv/2025/04/01/april-fools-day/',\n },\n ],\n },\n {\n 'set_id': 'twitchcon-2025---rotterdam',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f4d97fd0-437f-4d8d-b4d3-4b6d18e4705b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f4d97fd0-437f-4d8d-b4d3-4b6d18e4705b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f4d97fd0-437f-4d8d-b4d3-4b6d18e4705b/3',\n 'title': 'TwitchCon 2025',\n 'description': 'Celebrated TwitchCon’s 10 year anniversary in 2025',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitchcon.com/rotterdam-2025/',\n },\n ],\n },\n {\n 'set_id': 'clip-the-halls',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ce9e266a-f490-4fb2-9989-aee20036bfa5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ce9e266a-f490-4fb2-9989-aee20036bfa5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ce9e266a-f490-4fb2-9989-aee20036bfa5/3',\n 'title': 'Clip the Halls',\n 'description':\n 'For spreading the holiday cheer by sharing a clip to TikTok or YouTube during Twitch Holiday Hoopla 2024.',\n 'click_action': 'visit_url',\n 'click_url': 'https://blog.twitch.tv/en/2024/12/02/twitch-holiday-hoopla/',\n },\n ],\n },\n {\n 'set_id': 'twitch-recap-2024',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/72f2a6ac-3d9b-4406-b9e9-998b27182f61/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/72f2a6ac-3d9b-4406-b9e9-998b27182f61/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/72f2a6ac-3d9b-4406-b9e9-998b27182f61/3',\n 'title': 'Twitch Recap 2024',\n 'description':\n 'The Official Chat Badge of the Year. It takes hard work and KomodoHype to receive it. You should be proud to tell everyone you know about this.',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/annual-recap',\n },\n ],\n },\n {\n 'set_id': 'subtember-2024',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4149750c-9582-4515-9e22-da7d5437643b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4149750c-9582-4515-9e22-da7d5437643b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4149750c-9582-4515-9e22-da7d5437643b/3',\n 'title': 'SUBtember 2024',\n 'description': \"For being Subbie's friend and participating in SUBtember 2024!\",\n 'click_action': 'visit_url',\n 'click_url': 'https://link.twitch.tv/subtember2024',\n },\n ],\n },\n {\n 'set_id': 'twitch-intern-2024',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ae96ce48-e764-4232-aa48-d9abf9a5fdab/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ae96ce48-e764-4232-aa48-d9abf9a5fdab/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ae96ce48-e764-4232-aa48-d9abf9a5fdab/3',\n 'title': 'Twitch Intern 2024',\n 'description': 'This user was an intern at Twitch for the summer of 2024',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/jobs/early-career/',\n },\n ],\n },\n {\n 'set_id': 'twitch-dj',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/cf91bbc0-0332-413a-a7f3-e36bac08b624/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/cf91bbc0-0332-413a-a7f3-e36bac08b624/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/cf91bbc0-0332-413a-a7f3-e36bac08b624/3',\n 'title': 'Twitch DJ',\n 'description': 'This user is a DJ in the Twitch DJ Program.',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/dj-program',\n },\n ],\n },\n {\n 'set_id': 'destiny-2-the-final-shape-streamer',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/b1bcaf3c-d7a2-442b-b407-03f2b8ff624d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/b1bcaf3c-d7a2-442b-b407-03f2b8ff624d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/b1bcaf3c-d7a2-442b-b407-03f2b8ff624d/3',\n 'title': 'Destiny 2: The Final Shape Streamer',\n 'description':\n 'I earned this badge by taking part in the Destiny 2: The Final Shape Raid Race!',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/category/destiny-2\\t',\n },\n ],\n },\n {\n 'set_id': 'destiny-2-final-shape-raid-race',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e79ee64f-31f1-4485-9c81-b93957e69f8a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e79ee64f-31f1-4485-9c81-b93957e69f8a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e79ee64f-31f1-4485-9c81-b93957e69f8a/3',\n 'title': 'Destiny 2: The Final Shape Raid Race',\n 'description':\n 'I earned this badge by watching Destiny 2: The Final Shape Raid Race on Twitch!',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/category/destiny-2',\n },\n ],\n },\n {\n 'set_id': 'twitchcon-2024---san-diego',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/6575f0d1-2dc2-4f45-a13f-a1a969dcf8fa/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/6575f0d1-2dc2-4f45-a13f-a1a969dcf8fa/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/6575f0d1-2dc2-4f45-a13f-a1a969dcf8fa/3',\n 'title': 'TwitchCon 2024 - San Diego',\n 'description': 'Attended TwitchCon San Diego 2024',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://twitchcon.com/san-diego-2024/?utm_source=twitch&utm_medium=chat-badge&utm_campaign=tcsd24-chat-badge',\n },\n ],\n },\n {\n 'set_id': 'minecraft-15th-anniversary-celebration',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/178077b2-8b86-4f8d-927c-66ed6c1b025f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/178077b2-8b86-4f8d-927c-66ed6c1b025f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/178077b2-8b86-4f8d-927c-66ed6c1b025f/3',\n 'title': 'Minecraft 15th Anniversary Celebration',\n 'description':\n \"This badge was earned for using a special emote as part of Minecraft's 15th Anniversary Celebration on Twitch!\",\n 'click_action': 'visit_url',\n 'click_url': 'https://twitch-web.app.link/e/vkOhfCa7nJb',\n },\n ],\n },\n {\n 'set_id': 'warcraft',\n 'versions': [\n {\n 'id': 'horde',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/de8b26b6-fd28-4e6c-bc89-3d597343800d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/de8b26b6-fd28-4e6c-bc89-3d597343800d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/de8b26b6-fd28-4e6c-bc89-3d597343800d/3',\n 'title': 'Horde',\n 'description': 'For the Horde!',\n 'click_action': 'visit_url',\n 'click_url': 'http://warcraftontwitch.tv/',\n },\n {\n 'id': 'alliance',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4816339-bad4-4645-ae69-d1ab2076a6b0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4816339-bad4-4645-ae69-d1ab2076a6b0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4816339-bad4-4645-ae69-d1ab2076a6b0/3',\n 'title': 'Alliance',\n 'description': 'For Lordaeron!',\n 'click_action': 'visit_url',\n 'click_url': 'http://warcraftontwitch.tv/',\n },\n ],\n },\n {\n 'set_id': 'vip',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/b817aba4-fad8-49e2-b88a-7cc744dfa6ec/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/b817aba4-fad8-49e2-b88a-7cc744dfa6ec/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/b817aba4-fad8-49e2-b88a-7cc744dfa6ec/3',\n 'title': 'VIP',\n 'description': 'VIP',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://help.twitch.tv/customer/en/portal/articles/659115-twitch-chat-badges-guide',\n },\n ],\n },\n {\n 'set_id': 'vga-champ-2017',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/03dca92e-dc69-11e7-ac5b-9f942d292dc7/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/03dca92e-dc69-11e7-ac5b-9f942d292dc7/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/03dca92e-dc69-11e7-ac5b-9f942d292dc7/3',\n 'title': '2017 VGA Champ',\n 'description': '2017 VGA Champ',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://blog.twitch.tv/watch-and-co-stream-the-game-awards-this-thursday-on-twitch-3d8e34d2345d',\n },\n ],\n },\n {\n 'set_id': 'tyranny_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/0c79afdf-28ce-4b0b-9e25-4f221c30bfde/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/0c79afdf-28ce-4b0b-9e25-4f221c30bfde/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/0c79afdf-28ce-4b0b-9e25-4f221c30bfde/3',\n 'title': 'Tyranny',\n 'description': 'Tyranny',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Tyranny/details',\n },\n ],\n },\n {\n 'set_id': 'twitchconNA2023',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c90a753f-ab20-41bc-9c42-ede062485d2c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c90a753f-ab20-41bc-9c42-ede062485d2c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c90a753f-ab20-41bc-9c42-ede062485d2c/3',\n 'title': 'TwitchCon 2023 - Las Vegas',\n 'description': 'Attended TwitchCon Las Vegas 2023',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitchcon.com/en/las-vegas-2023/',\n },\n ],\n },\n {\n 'set_id': 'twitchconNA2020',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/3',\n 'title': 'TwitchCon 2020 - North America',\n 'description': 'Registered for TwitchCon North America 2020',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitchcon.com/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tcna20',\n },\n ],\n },\n {\n 'set_id': 'twitchconNA2022',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/344d429a-0b34-48e5-a84c-14a1b5772a3a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/344d429a-0b34-48e5-a84c-14a1b5772a3a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/344d429a-0b34-48e5-a84c-14a1b5772a3a/3',\n 'title': 'TwitchCon 2022 - San Diego',\n 'description': 'Attended TwitchCon San Diego 2022',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitchcon.com/san-diego-2022/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tcna22',\n },\n ],\n },\n {\n 'set_id': 'twitchconNA2019',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/569c829d-c216-4f56-a191-3db257ed657c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/569c829d-c216-4f56-a191-3db257ed657c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/569c829d-c216-4f56-a191-3db257ed657c/3',\n 'title': 'TwitchCon 2019 - San Diego',\n 'description': 'Attended TwitchCon San Diego 2019',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitchcon.com/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tcna19',\n },\n ],\n },\n {\n 'set_id': 'twitchconEU2023',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a8f2084e-46b9-4bb9-ae5e-00d594aafc64/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a8f2084e-46b9-4bb9-ae5e-00d594aafc64/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a8f2084e-46b9-4bb9-ae5e-00d594aafc64/3',\n 'title': 'TwitchCon 2023 - Paris',\n 'description': 'TwitchCon 2023 - Paris',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitchcon.com/paris-2023/?utm_source=chat_badge',\n },\n ],\n },\n {\n 'set_id': 'twitchconEU2022',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e4744003-50b7-4eb8-9b47-a7b1616a30c6/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e4744003-50b7-4eb8-9b47-a7b1616a30c6/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e4744003-50b7-4eb8-9b47-a7b1616a30c6/3',\n 'title': 'TwitchCon 2022 - Amsterdam',\n 'description': 'Attended TwitchCon Amsterdam 2022',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitchcon.com/amsterdam-2022/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tceu22',\n },\n ],\n },\n {\n 'set_id': 'twitchcon2018',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e68164e4-087d-4f62-81da-d3557efae3cb/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e68164e4-087d-4f62-81da-d3557efae3cb/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e68164e4-087d-4f62-81da-d3557efae3cb/3',\n 'title': 'TwitchCon 2018 - San Jose',\n 'description': 'Attended TwitchCon San Jose 2018',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitchcon.com/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tc18',\n },\n ],\n },\n {\n 'set_id': 'twitchconAmsterdam2020',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/3',\n 'title': 'TwitchCon 2020 - Amsterdam',\n 'description': 'Registered for TwitchCon Amsterdam 2020',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitchcon.com/amsterdam/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tcamsterdam20',\n },\n ],\n },\n {\n 'set_id': 'twitchconEU2019',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/590eee9e-f04d-474c-90e7-b304d9e74b32/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/590eee9e-f04d-474c-90e7-b304d9e74b32/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/590eee9e-f04d-474c-90e7-b304d9e74b32/3',\n 'title': 'TwitchCon 2019 - Berlin',\n 'description': 'Attended TwitchCon Berlin 2019',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://europe.twitchcon.com/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tceu19',\n },\n ],\n },\n {\n 'set_id': 'twitchbot',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/df9095f6-a8a0-4cc2-bb33-d908c0adffb8/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/df9095f6-a8a0-4cc2-bb33-d908c0adffb8/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/df9095f6-a8a0-4cc2-bb33-d908c0adffb8/3',\n 'title': 'AutoMod',\n 'description': 'AutoMod',\n 'click_action': 'visit_url',\n 'click_url': 'http://link.twitch.tv/automod_blog',\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/8dbdfef5-0901-457f-a644-afa77ba176e5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/8dbdfef5-0901-457f-a644-afa77ba176e5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/8dbdfef5-0901-457f-a644-afa77ba176e5/3',\n 'title': 'AutoMod',\n 'description': 'Badge type for messages that come from the automated moderation system',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'twitchcon2017',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/0964bed0-5c31-11e7-a90b-0739918f1d9b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/0964bed0-5c31-11e7-a90b-0739918f1d9b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/0964bed0-5c31-11e7-a90b-0739918f1d9b/3',\n 'title': 'TwitchCon 2017 - Long Beach',\n 'description': 'Attended TwitchCon Long Beach 2017',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitchcon.com/',\n },\n ],\n },\n {\n 'set_id': 'twitchcon-2024---rotterdam',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/95b10c66-775c-4652-9b86-10bd3a709422/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/95b10c66-775c-4652-9b86-10bd3a709422/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/95b10c66-775c-4652-9b86-10bd3a709422/3',\n 'title': 'TwitchCon 2024 - Rotterdam',\n 'description': 'Attended TwitchCon Rotterdam 2024',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://twitchcon.com/rotterdam-2024/?utm_source=twitch&utm_medium=chat-badge&utm_campaign=tceu24-chat-badge',\n },\n ],\n },\n {\n 'set_id': 'twitch-recap-2023',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4d9e9812-ba9b-48a6-8690-13f3f338ee65/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4d9e9812-ba9b-48a6-8690-13f3f338ee65/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4d9e9812-ba9b-48a6-8690-13f3f338ee65/3',\n 'title': 'Twitch Recap 2023',\n 'description':\n 'This user bled purple like it was their job, and was one of the most engaged members of Twitch in 2023!',\n 'click_action': 'visit_url',\n 'click_url': 'https://twitch-web.app.link/e/twitch-recap',\n },\n ],\n },\n {\n 'set_id': 'twitch-intern-2023',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e239e7e0-e373-4fdf-b95e-3469aec28485/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e239e7e0-e373-4fdf-b95e-3469aec28485/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e239e7e0-e373-4fdf-b95e-3469aec28485/3',\n 'title': 'Twitch Intern 2023',\n 'description': 'This user was an intern at Twitch for the summer of 2023',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/jobs/early-career/',\n },\n ],\n },\n {\n 'set_id': 'treasure-adventure-world_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/59810027-2988-4b0d-b88d-fc414c751305/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/59810027-2988-4b0d-b88d-fc414c751305/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/59810027-2988-4b0d-b88d-fc414c751305/3',\n 'title': 'Treasure Adventure World',\n 'description': 'Treasure Adventure World',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Treasure%20Adventure%20World/details',\n },\n ],\n },\n {\n 'set_id': 'titan-souls_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/092a7ce2-709c-434f-8df4-a6b075ef867d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/092a7ce2-709c-434f-8df4-a6b075ef867d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/092a7ce2-709c-434f-8df4-a6b075ef867d/3',\n 'title': 'Titan Souls',\n 'description': 'Titan Souls',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Titan%20Souls/details',\n },\n ],\n },\n {\n 'set_id': 'this-war-of-mine_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/6a20f814-cb2c-414e-89cc-f8dd483e1785/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/6a20f814-cb2c-414e-89cc-f8dd483e1785/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/6a20f814-cb2c-414e-89cc-f8dd483e1785/3',\n 'title': 'This War of Mine',\n 'description': 'This War of Mine',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/This%20War%20of%20Mine/details',\n },\n ],\n },\n {\n 'set_id': 'the-surge_2',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2c4d7e95-e138-4dde-a783-7956a8ecc408/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2c4d7e95-e138-4dde-a783-7956a8ecc408/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2c4d7e95-e138-4dde-a783-7956a8ecc408/3',\n 'title': 'The Surge',\n 'description': 'The Surge',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/The%20Surge/details',\n },\n ],\n },\n {\n 'set_id': 'the-surge_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c9f69d89-31c8-41aa-843b-fee956dfbe23/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c9f69d89-31c8-41aa-843b-fee956dfbe23/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c9f69d89-31c8-41aa-843b-fee956dfbe23/3',\n 'title': 'The Surge',\n 'description': 'The Surge',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/The%20Surge/details',\n },\n ],\n },\n {\n 'set_id': 'the-surge_3',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/0a8fc2d4-3125-4ccb-88db-e970dfbee189/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/0a8fc2d4-3125-4ccb-88db-e970dfbee189/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/0a8fc2d4-3125-4ccb-88db-e970dfbee189/3',\n 'title': 'The Surge',\n 'description': 'The Surge',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/The%20Surge/details',\n },\n ],\n },\n {\n 'set_id': 'the-golden-predictor-of-the-game-awards-2023',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c84c4dd7-9318-4e8b-9f01-1612d3f83dae/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c84c4dd7-9318-4e8b-9f01-1612d3f83dae/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c84c4dd7-9318-4e8b-9f01-1612d3f83dae/3',\n 'title': 'The Golden Predictor of the Game Awards 2023',\n 'description':\n \"You've predicted the entire 2023 Game Awards perfectly, here is a special gift for your work. Go ahead, show it off!\",\n 'click_action': 'visit_url',\n 'click_url':\n 'https://blog.twitch.tv/2023/11/30/the-2023-game-awards-is-live-on-twitch-december-7th/',\n },\n ],\n },\n {\n 'set_id': 'the-game-awards-2023',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/10cf46de-61e7-4a42-807a-7898408ce352/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/10cf46de-61e7-4a42-807a-7898408ce352/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/10cf46de-61e7-4a42-807a-7898408ce352/3',\n 'title': 'The Game Awards 2023',\n 'description':\n 'You’ve completed all categories of the 2023 Twitch Predicts: The Game Awards extension!',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://blog.twitch.tv/2023/11/30/the-2023-game-awards-is-live-on-twitch-december-7th/',\n },\n ],\n },\n {\n 'set_id': 'superhot_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5a06922-83b5-40cb-885f-bcffd3cd6c68/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5a06922-83b5-40cb-885f-bcffd3cd6c68/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5a06922-83b5-40cb-885f-bcffd3cd6c68/3',\n 'title': 'Superhot',\n 'description': 'Superhot',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/superhot/details',\n },\n ],\n },\n {\n 'set_id': 'strafe_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/0051508d-2d42-4e4b-a328-c86b04510ca4/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/0051508d-2d42-4e4b-a328-c86b04510ca4/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/0051508d-2d42-4e4b-a328-c86b04510ca4/3',\n 'title': 'Strafe',\n 'description': 'Strafe',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/strafe/details',\n },\n ],\n },\n {\n 'set_id': 'streamer-awards-2024',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/efc07d3d-46e4-4738-827b-a5bf3508983a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/efc07d3d-46e4-4738-827b-a5bf3508983a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/efc07d3d-46e4-4738-827b-a5bf3508983a/3',\n 'title': 'Streamer Awards 2024',\n 'description':\n \"You've completed all categories of the 2024 Twitch Predicts: The Streamer Awards extension!\",\n 'click_action': 'visit_url',\n 'click_url': 'https://thestreamerawards.com/home',\n },\n ],\n },\n {\n 'set_id': 'starbound_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e838e742-0025-4646-9772-18a87ba99358/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e838e742-0025-4646-9772-18a87ba99358/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e838e742-0025-4646-9772-18a87ba99358/3',\n 'title': 'Starbound',\n 'description': 'Starbound',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Starbound/details',\n },\n ],\n },\n {\n 'set_id': 'staff',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d97c37bd-a6f5-4c38-8f57-4e4bef88af34/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d97c37bd-a6f5-4c38-8f57-4e4bef88af34/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d97c37bd-a6f5-4c38-8f57-4e4bef88af34/3',\n 'title': 'Staff',\n 'description': 'Twitch Staff',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/jobs?ref=chat_badge',\n },\n ],\n },\n {\n 'set_id': 'samusoffer_beta',\n 'versions': [\n {\n 'id': '0',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/aa960159-a7b8-417e-83c1-035e4bc2deb5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/aa960159-a7b8-417e-83c1-035e4bc2deb5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/aa960159-a7b8-417e-83c1-035e4bc2deb5/3',\n 'title': 'beta_title1',\n 'description': 'beta_title1',\n 'click_action': 'visit_url',\n 'click_url': 'https://twitch.amazon.com/prime',\n },\n ],\n },\n {\n 'set_id': 'rplace-2023',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e33e0c67-c380-4241-828a-099c46e51c66/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e33e0c67-c380-4241-828a-099c46e51c66/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e33e0c67-c380-4241-828a-099c46e51c66/3',\n 'title': 'r/place 2023 Cake',\n 'description':\n \"A very delicious badge earned by watching Reddit's r/place 2023 event on Twitch Rivals or other participating channels.\",\n 'click_action': 'visit_url',\n 'click_url': 'https://www.reddit.com/r/place/',\n },\n ],\n },\n {\n 'set_id': 'rift_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f939686b-2892-46a4-9f0d-5f582578173e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f939686b-2892-46a4-9f0d-5f582578173e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f939686b-2892-46a4-9f0d-5f582578173e/3',\n 'title': 'RIFT',\n 'description': 'RIFT',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Rift/details',\n },\n ],\n },\n {\n 'set_id': 'raiden-v-directors-cut_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/441b50ae-a2e3-11e7-8a3e-6bff0c840878/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/441b50ae-a2e3-11e7-8a3e-6bff0c840878/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/441b50ae-a2e3-11e7-8a3e-6bff0c840878/3',\n 'title': 'Raiden V',\n 'description': 'Raiden V',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Raiden%20V/details',\n },\n ],\n },\n {\n 'set_id': 'psychonauts_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a9811799-dce3-475f-8feb-3745ad12b7ea/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a9811799-dce3-475f-8feb-3745ad12b7ea/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a9811799-dce3-475f-8feb-3745ad12b7ea/3',\n 'title': 'Psychonauts',\n 'description': 'Psychonauts',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Psychonauts/details',\n },\n ],\n },\n {\n 'set_id': 'premium',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/bbbe0db0-a598-423e-86d0-f9fb98ca1933/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/bbbe0db0-a598-423e-86d0-f9fb98ca1933/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/bbbe0db0-a598-423e-86d0-f9fb98ca1933/3',\n 'title': 'Prime Gaming',\n 'description': 'Prime Gaming',\n 'click_action': 'visit_url',\n 'click_url': 'https://gaming.amazon.com',\n },\n ],\n },\n {\n 'set_id': 'overwatch-league-insider_2019B',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5860811-d714-4413-9433-d6b1c9fc803c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5860811-d714-4413-9433-d6b1c9fc803c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5860811-d714-4413-9433-d6b1c9fc803c/3',\n 'title': 'OWL All-Access Pass 2019',\n 'description': 'OWL All-Access Pass 2019',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/overwatchleague',\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/75f05d4b-3042-415c-8b0b-e87620a24daf/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/75f05d4b-3042-415c-8b0b-e87620a24daf/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/75f05d4b-3042-415c-8b0b-e87620a24daf/3',\n 'title': 'OWL All-Access Pass 2019',\n 'description': 'OWL All-Access Pass 2019',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/overwatchleague',\n },\n {\n 'id': '3',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/765a0dcf-2a94-43ff-9b9c-ef6c209b90cd/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/765a0dcf-2a94-43ff-9b9c-ef6c209b90cd/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/765a0dcf-2a94-43ff-9b9c-ef6c209b90cd/3',\n 'title': 'OWL All-Access Pass 2019',\n 'description': 'OWL All-Access Pass 2019',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/overwatchleague',\n },\n {\n 'id': '4',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a8ae0ccd-783d-460d-93ee-57c485c558a6/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a8ae0ccd-783d-460d-93ee-57c485c558a6/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a8ae0ccd-783d-460d-93ee-57c485c558a6/3',\n 'title': 'OWL All-Access Pass 2019',\n 'description': 'OWL All-Access Pass 2019',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/overwatchleague',\n },\n {\n 'id': '5',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/be87fd6d-1560-4e33-9ba4-2401b58d901f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/be87fd6d-1560-4e33-9ba4-2401b58d901f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/be87fd6d-1560-4e33-9ba4-2401b58d901f/3',\n 'title': 'OWL All-Access Pass 2019',\n 'description': 'OWL All-Access Pass 2019',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/overwatchleague',\n },\n ],\n },\n {\n 'set_id': 'partner',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d12a2e27-16f6-41d0-ab77-b780518f00a3/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d12a2e27-16f6-41d0-ab77-b780518f00a3/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d12a2e27-16f6-41d0-ab77-b780518f00a3/3',\n 'title': 'Verified',\n 'description': 'Verified',\n 'click_action': 'visit_url',\n 'click_url': 'https://blog.twitch.tv/2017/04/24/the-verified-badge-is-here-13381bc05735',\n },\n ],\n },\n {\n 'set_id': 'overwatch-league-insider_2019A',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca980da1-3639-48a6-95a3-a03b002eb0e5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca980da1-3639-48a6-95a3-a03b002eb0e5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca980da1-3639-48a6-95a3-a03b002eb0e5/3',\n 'title': 'OWL All-Access Pass 2019',\n 'description': 'OWL All-Access Pass 2019',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/overwatchleague',\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ab7fa7a7-c2d9-403f-9f33-215b29b43ce4/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ab7fa7a7-c2d9-403f-9f33-215b29b43ce4/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ab7fa7a7-c2d9-403f-9f33-215b29b43ce4/3',\n 'title': 'OWL All-Access Pass 2019',\n 'description': 'OWL All-Access Pass 2019',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/overwatchleague',\n },\n ],\n },\n {\n 'set_id': 'okhlos_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/dc088bd6-8965-4907-a1a2-c0ba83874a7d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/dc088bd6-8965-4907-a1a2-c0ba83874a7d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/dc088bd6-8965-4907-a1a2-c0ba83874a7d/3',\n 'title': 'Okhlos',\n 'description': 'Okhlos',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Okhlos/details',\n },\n ],\n },\n {\n 'set_id': 'overwatch-league-insider_2018B',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/34ec1979-d9bb-4706-ad15-464de814a79d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/34ec1979-d9bb-4706-ad15-464de814a79d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/34ec1979-d9bb-4706-ad15-464de814a79d/3',\n 'title': 'OWL All-Access Pass 2018',\n 'description': 'OWL All-Access Pass 2018',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/overwatchleague',\n },\n ],\n },\n {\n 'set_id': 'overwatch-league-insider_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/51e9e0aa-12e3-48ce-b961-421af0787dad/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/51e9e0aa-12e3-48ce-b961-421af0787dad/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/51e9e0aa-12e3-48ce-b961-421af0787dad/3',\n 'title': 'OWL All-Access Pass 2018',\n 'description': 'OWL All-Access Pass 2018',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/overwatchleague',\n },\n ],\n },\n {\n 'set_id': 'kingdom-new-lands_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e3c2a67e-ef80-4fe3-ae41-b933cd11788a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e3c2a67e-ef80-4fe3-ae41-b933cd11788a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e3c2a67e-ef80-4fe3-ae41-b933cd11788a/3',\n 'title': 'Kingdom: New Lands',\n 'description': 'Kingdom: New Lands',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Kingdom:%20New%20Lands/details',\n },\n ],\n },\n {\n 'set_id': 'jackbox-party-pack_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/0f964fc1-f439-485f-a3c0-905294ee70e8/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/0f964fc1-f439-485f-a3c0-905294ee70e8/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/0f964fc1-f439-485f-a3c0-905294ee70e8/3',\n 'title': 'Jackbox Party Pack',\n 'description': 'Jackbox Party Pack',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/The%20Jackbox%20Party%20Pack/details',\n },\n ],\n },\n {\n 'set_id': 'innerspace_2',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc7d6018-657a-40e4-9246-0acdc85886d1/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc7d6018-657a-40e4-9246-0acdc85886d1/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc7d6018-657a-40e4-9246-0acdc85886d1/3',\n 'title': 'Innerspace',\n 'description': 'Innerspace',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Innerspace/details',\n },\n ],\n },\n {\n 'set_id': 'innerspace_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/97532ccd-6a07-42b5-aecf-3458b6b3ebea/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/97532ccd-6a07-42b5-aecf-3458b6b3ebea/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/97532ccd-6a07-42b5-aecf-3458b6b3ebea/3',\n 'title': 'Innerspace',\n 'description': 'Innerspace',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Innerspace/details',\n },\n ],\n },\n {\n 'set_id': 'hype-train',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fae4086c-3190-44d4-83c8-8ef0cbe1a515/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fae4086c-3190-44d4-83c8-8ef0cbe1a515/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fae4086c-3190-44d4-83c8-8ef0cbe1a515/3',\n 'title': 'Current Hype Train Conductor',\n 'description': 'Top supporter during the most recent hype train',\n 'click_action': 'visit_url',\n 'click_url': 'https://help.twitch.tv/s/article/hype-train-guide',\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9c8d038a-3a29-45ea-96d4-5031fb1a7a81/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9c8d038a-3a29-45ea-96d4-5031fb1a7a81/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9c8d038a-3a29-45ea-96d4-5031fb1a7a81/3',\n 'title': 'Former Hype Train Conductor',\n 'description': 'Top supporter during prior hype trains',\n 'click_action': 'visit_url',\n 'click_url': 'https://help.twitch.tv/s/article/hype-train-guide',\n },\n ],\n },\n {\n 'set_id': 'hello_neighbor_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/030cab2c-5d14-11e7-8d91-43a5a4306286/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/030cab2c-5d14-11e7-8d91-43a5a4306286/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/030cab2c-5d14-11e7-8d91-43a5a4306286/3',\n 'title': 'Hello Neighbor',\n 'description': 'Hello Neighbor',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Hello%20Neighbor/details',\n },\n ],\n },\n {\n 'set_id': 'gold-pixel-heart',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/1687873b-cf38-412c-aad3-f9a4ce17f8b6/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/1687873b-cf38-412c-aad3-f9a4ce17f8b6/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/1687873b-cf38-412c-aad3-f9a4ce17f8b6/3',\n 'title': 'Gold Pixel Heart',\n 'description':\n 'Thank you for donating via the Twitch Charity tool during Twitch Together for Good 2023!',\n 'click_action': 'visit_url',\n 'click_url': 'https://help.twitch.tv/s/article/twitch-charity',\n },\n ],\n },\n {\n 'set_id': 'heavy-bullets_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc83b76b-f8b2-4519-9f61-6faf84eef4cd/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc83b76b-f8b2-4519-9f61-6faf84eef4cd/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc83b76b-f8b2-4519-9f61-6faf84eef4cd/3',\n 'title': 'Heavy Bullets',\n 'description': 'Heavy Bullets',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Heavy%20Bullets/details',\n },\n ],\n },\n {\n 'set_id': 'glitchcon2020',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/1d4b03b9-51ea-42c9-8f29-698e3c85be3d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/1d4b03b9-51ea-42c9-8f29-698e3c85be3d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/1d4b03b9-51ea-42c9-8f29-698e3c85be3d/3',\n 'title': 'GlitchCon 2020',\n 'description': 'Earned for Watching Glitchcon 2020',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitchcon.com/',\n },\n ],\n },\n {\n 'set_id': 'glhf-pledge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3158e758-3cb4-43c5-94b3-7639810451c5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3158e758-3cb4-43c5-94b3-7639810451c5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3158e758-3cb4-43c5-94b3-7639810451c5/3',\n 'title': 'GLHF Pledge',\n 'description': 'Signed the GLHF pledge in support for inclusive gaming communities',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.anykey.org/pledge',\n },\n ],\n },\n {\n 'set_id': 'getting-over-it_2',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/bb620b42-e0e1-4373-928e-d4a732f99ccb/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/bb620b42-e0e1-4373-928e-d4a732f99ccb/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/bb620b42-e0e1-4373-928e-d4a732f99ccb/3',\n 'title': 'Getting Over It',\n 'description': 'Getting Over It',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Getting%20Over%20It/details',\n },\n ],\n },\n {\n 'set_id': 'getting-over-it_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/8d4e178c-81ec-4c71-af68-745b40733984/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/8d4e178c-81ec-4c71-af68-745b40733984/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/8d4e178c-81ec-4c71-af68-745b40733984/3',\n 'title': 'Getting Over It',\n 'description': 'Getting Over It',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Getting%20Over%20It/details',\n },\n ],\n },\n {\n 'set_id': 'frozen-synapse_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d4bd464d-55ea-4238-a11d-744f034e2375/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d4bd464d-55ea-4238-a11d-744f034e2375/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d4bd464d-55ea-4238-a11d-744f034e2375/3',\n 'title': 'Frozen Synapse',\n 'description': 'Frozen Synapse',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Frozen%20Synapse/details',\n },\n ],\n },\n {\n 'set_id': 'founder',\n 'versions': [\n {\n 'id': '0',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/511b78a9-ab37-472f-9569-457753bbe7d3/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/511b78a9-ab37-472f-9569-457753bbe7d3/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/511b78a9-ab37-472f-9569-457753bbe7d3/3',\n 'title': 'Founder',\n 'description': 'Founder',\n 'click_action': 'visit_url',\n 'click_url': 'https://help.twitch.tv/s/article/founders-badge',\n },\n ],\n },\n {\n 'set_id': 'frozen-cortext_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2015f087-01b5-4a01-a2bb-ecb4d6be5240/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2015f087-01b5-4a01-a2bb-ecb4d6be5240/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2015f087-01b5-4a01-a2bb-ecb4d6be5240/3',\n 'title': 'Frozen Cortext',\n 'description': 'Frozen Cortext',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Frozen%20Cortex/details',\n },\n ],\n },\n {\n 'set_id': 'firewatch_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/b6bf4889-4902-49e2-9658-c0132e71c9c4/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/b6bf4889-4902-49e2-9658-c0132e71c9c4/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/b6bf4889-4902-49e2-9658-c0132e71c9c4/3',\n 'title': 'Firewatch',\n 'description': 'Firewatch',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Firewatch/details',\n },\n ],\n },\n {\n 'set_id': 'enter-the-gungeon_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/53c9af0b-84f6-4f9d-8c80-4bc51321a37d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/53c9af0b-84f6-4f9d-8c80-4bc51321a37d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/53c9af0b-84f6-4f9d-8c80-4bc51321a37d/3',\n 'title': 'Enter The Gungeon',\n 'description': 'Enter The Gungeon',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Enter%20the%20Gungeon/details',\n },\n ],\n },\n {\n 'set_id': 'duelyst_5',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/290419b6-484a-47da-ad14-a99d6581f758/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/290419b6-484a-47da-ad14-a99d6581f758/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/290419b6-484a-47da-ad14-a99d6581f758/3',\n 'title': 'Duelyst',\n 'description': 'Duelyst',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n 'set_id': 'duelyst_6',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5e54a4b-0bf1-463a-874a-38524579aed0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5e54a4b-0bf1-463a-874a-38524579aed0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5e54a4b-0bf1-463a-874a-38524579aed0/3',\n 'title': 'Duelyst',\n 'description': 'Duelyst',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n 'set_id': 'duelyst_7',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/cf508179-3183-4987-97e0-56ca44babb9f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/cf508179-3183-4987-97e0-56ca44babb9f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/cf508179-3183-4987-97e0-56ca44babb9f/3',\n 'title': 'Duelyst',\n 'description': 'Duelyst',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n 'set_id': 'duelyst_2',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/1938acd3-2d18-471d-b1af-44f2047c033c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/1938acd3-2d18-471d-b1af-44f2047c033c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/1938acd3-2d18-471d-b1af-44f2047c033c/3',\n 'title': 'Duelyst',\n 'description': 'Duelyst',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n 'set_id': 'duelyst_4',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/39e717a8-00bc-49cc-b6d4-3ea91ee1be25/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/39e717a8-00bc-49cc-b6d4-3ea91ee1be25/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/39e717a8-00bc-49cc-b6d4-3ea91ee1be25/3',\n 'title': 'Duelyst',\n 'description': 'Duelyst',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n 'set_id': 'duelyst_3',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/344c07fc-1632-47c6-9785-e62562a6b760/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/344c07fc-1632-47c6-9785-e62562a6b760/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/344c07fc-1632-47c6-9785-e62562a6b760/3',\n 'title': 'Duelyst',\n 'description': 'Duelyst',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n 'set_id': 'duelyst_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/7d9c12f4-a2ac-4e88-8026-d1a330468282/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/7d9c12f4-a2ac-4e88-8026-d1a330468282/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/7d9c12f4-a2ac-4e88-8026-d1a330468282/3',\n 'title': 'Duelyst',\n 'description': 'Duelyst',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n 'set_id': 'devilian_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3cb92b57-1eef-451c-ac23-4d748128b2c5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3cb92b57-1eef-451c-ac23-4d748128b2c5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3cb92b57-1eef-451c-ac23-4d748128b2c5/3',\n 'title': 'Devilian',\n 'description': 'Devilian',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Devilian/details',\n },\n ],\n },\n {\n 'set_id': 'devil-may-cry-hd_4',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/af836b94-8ffd-4c0a-b7d8-a92fad5e3015/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/af836b94-8ffd-4c0a-b7d8-a92fad5e3015/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/af836b94-8ffd-4c0a-b7d8-a92fad5e3015/3',\n 'title': 'Devil May Cry HD Collection',\n 'description': 'Devil May Cry HD Collection',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitch.tv/directory/game/Devil%20May%20Cry%20HD%20Collection/details',\n },\n ],\n },\n {\n 'set_id': 'devil-may-cry-hd_3',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/df84c5bf-8d66-48e2-b9fb-c014cc9b3945/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/df84c5bf-8d66-48e2-b9fb-c014cc9b3945/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/df84c5bf-8d66-48e2-b9fb-c014cc9b3945/3',\n 'title': 'Devil May Cry HD Collection',\n 'description': 'Devil May Cry HD Collection',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitch.tv/directory/game/Devil%20May%20Cry%20HD%20Collection/details',\n },\n ],\n },\n {\n 'set_id': 'devil-may-cry-hd_2',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/408548fe-aa74-4d53-b5e9-960103d9b865/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/408548fe-aa74-4d53-b5e9-960103d9b865/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/408548fe-aa74-4d53-b5e9-960103d9b865/3',\n 'title': 'Devil May Cry HD Collection',\n 'description': 'Devil May Cry HD Collection',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitch.tv/directory/game/Devil%20May%20Cry%20HD%20Collection/details',\n },\n ],\n },\n {\n 'set_id': 'devil-may-cry-hd_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/633877d4-a91c-4c36-b75b-803f82b1352f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/633877d4-a91c-4c36-b75b-803f82b1352f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/633877d4-a91c-4c36-b75b-803f82b1352f/3',\n 'title': 'Devil May Cry HD Collection',\n 'description': 'Devil May Cry HD Collection',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitch.tv/directory/game/Devil%20May%20Cry%20HD%20Collection/details',\n },\n ],\n },\n {\n 'set_id': 'deceit_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/b14fef48-4ff9-4063-abf6-579489234fe9/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/b14fef48-4ff9-4063-abf6-579489234fe9/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/b14fef48-4ff9-4063-abf6-579489234fe9/3',\n 'title': 'Deceit',\n 'description': 'Deceit',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Deceit/details',\n },\n ],\n },\n {\n 'set_id': 'darkest-dungeon_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/52a98ddd-cc79-46a8-9fe3-30f8c719bc2d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/52a98ddd-cc79-46a8-9fe3-30f8c719bc2d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/52a98ddd-cc79-46a8-9fe3-30f8c719bc2d/3',\n 'title': 'Darkest Dungeon',\n 'description': 'Darkest Dungeon',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Darkest%20Dungeon/details',\n },\n ],\n },\n {\n 'set_id': 'cuphead_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4384659a-a2e3-11e7-a564-87f6b1288bab/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4384659a-a2e3-11e7-a564-87f6b1288bab/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4384659a-a2e3-11e7-a564-87f6b1288bab/3',\n 'title': 'Cuphead',\n 'description': 'Cuphead',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Cuphead/details',\n },\n ],\n },\n {\n 'set_id': 'clip-champ',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f38976e0-ffc9-11e7-86d6-7f98b26a9d79/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f38976e0-ffc9-11e7-86d6-7f98b26a9d79/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f38976e0-ffc9-11e7-86d6-7f98b26a9d79/3',\n 'title': 'Power Clipper',\n 'description': 'Power Clipper',\n 'click_action': 'visit_url',\n 'click_url': 'https://help.twitch.tv/customer/portal/articles/2918323-clip-champs-guide',\n },\n ],\n },\n {\n 'set_id': 'broken-age_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/56885ed2-9a09-4c8e-8131-3eb9ec15af94/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/56885ed2-9a09-4c8e-8131-3eb9ec15af94/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/56885ed2-9a09-4c8e-8131-3eb9ec15af94/3',\n 'title': 'Broken Age',\n 'description': 'Broken Age',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Broken%20Age/details',\n },\n ],\n },\n {\n 'set_id': 'bubsy-the-woolies_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c8129382-1f4e-4d15-a8d2-48bdddba9b81/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c8129382-1f4e-4d15-a8d2-48bdddba9b81/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c8129382-1f4e-4d15-a8d2-48bdddba9b81/3',\n 'title': 'Bubsy: The Woolies Strike Back',\n 'description': 'Bubsy: The Woolies Strike Back',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitch.tv/directory/game/Bubsy:%20The%20Woolies%20Strike%20Back/details',\n },\n ],\n },\n {\n 'set_id': 'bits-leader',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/8bedf8c3-7a6d-4df2-b62f-791b96a5dd31/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/8bedf8c3-7a6d-4df2-b62f-791b96a5dd31/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/8bedf8c3-7a6d-4df2-b62f-791b96a5dd31/3',\n 'title': 'Bits Leader 1',\n 'description': 'Ranked as a top cheerer on this channel',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f04baac7-9141-4456-a0e7-6301bcc34138/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f04baac7-9141-4456-a0e7-6301bcc34138/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f04baac7-9141-4456-a0e7-6301bcc34138/3',\n 'title': 'Bits Leader 2',\n 'description': 'Ranked as a top cheerer on this channel',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '3',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f1d2aab6-b647-47af-965b-84909cf303aa/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f1d2aab6-b647-47af-965b-84909cf303aa/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f1d2aab6-b647-47af-965b-84909cf303aa/3',\n 'title': 'Bits Leader 3',\n 'description': 'Ranked as a top cheerer on this channel',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n ],\n },\n {\n 'set_id': 'brawlhalla_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/bf6d6579-ab02-4f0a-9f64-a51c37040858/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/bf6d6579-ab02-4f0a-9f64-a51c37040858/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/bf6d6579-ab02-4f0a-9f64-a51c37040858/3',\n 'title': 'Brawlhalla',\n 'description': 'Brawlhalla',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Brawlhalla/details',\n },\n ],\n },\n {\n 'set_id': 'bits',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/73b5c3fb-24f9-4a82-a852-2f475b59411c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/73b5c3fb-24f9-4a82-a852-2f475b59411c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/73b5c3fb-24f9-4a82-a852-2f475b59411c/3',\n 'title': 'cheer 1',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '100',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/09d93036-e7ce-431c-9a9e-7044297133f2/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/09d93036-e7ce-431c-9a9e-7044297133f2/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/09d93036-e7ce-431c-9a9e-7044297133f2/3',\n 'title': 'cheer 100',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '1000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/0d85a29e-79ad-4c63-a285-3acd2c66f2ba/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/0d85a29e-79ad-4c63-a285-3acd2c66f2ba/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/0d85a29e-79ad-4c63-a285-3acd2c66f2ba/3',\n 'title': 'cheer 1000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '5000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/57cd97fc-3e9e-4c6d-9d41-60147137234e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/57cd97fc-3e9e-4c6d-9d41-60147137234e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/57cd97fc-3e9e-4c6d-9d41-60147137234e/3',\n 'title': 'cheer 5000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '10000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/68af213b-a771-4124-b6e3-9bb6d98aa732/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/68af213b-a771-4124-b6e3-9bb6d98aa732/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/68af213b-a771-4124-b6e3-9bb6d98aa732/3',\n 'title': 'cheer 10000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '25000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/64ca5920-c663-4bd8-bfb1-751b4caea2dd/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/64ca5920-c663-4bd8-bfb1-751b4caea2dd/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/64ca5920-c663-4bd8-bfb1-751b4caea2dd/3',\n 'title': 'cheer 25000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '50000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/62310ba7-9916-4235-9eba-40110d67f85d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/62310ba7-9916-4235-9eba-40110d67f85d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/62310ba7-9916-4235-9eba-40110d67f85d/3',\n 'title': 'cheer 50000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '75000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ce491fa4-b24f-4f3b-b6ff-44b080202792/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ce491fa4-b24f-4f3b-b6ff-44b080202792/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ce491fa4-b24f-4f3b-b6ff-44b080202792/3',\n 'title': 'cheer 75000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '100000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/96f0540f-aa63-49e1-a8b3-259ece3bd098/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/96f0540f-aa63-49e1-a8b3-259ece3bd098/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/96f0540f-aa63-49e1-a8b3-259ece3bd098/3',\n 'title': 'cheer 100000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '200000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4a0b90c4-e4ef-407f-84fe-36b14aebdbb6/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4a0b90c4-e4ef-407f-84fe-36b14aebdbb6/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4a0b90c4-e4ef-407f-84fe-36b14aebdbb6/3',\n 'title': 'cheer 200000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '300000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ac13372d-2e94-41d1-ae11-ecd677f69bb6/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ac13372d-2e94-41d1-ae11-ecd677f69bb6/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ac13372d-2e94-41d1-ae11-ecd677f69bb6/3',\n 'title': 'cheer 300000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '400000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a8f393af-76e6-4aa2-9dd0-7dcc1c34f036/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a8f393af-76e6-4aa2-9dd0-7dcc1c34f036/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a8f393af-76e6-4aa2-9dd0-7dcc1c34f036/3',\n 'title': 'cheer 400000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '500000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f6932b57-6a6e-4062-a770-dfbd9f4302e5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f6932b57-6a6e-4062-a770-dfbd9f4302e5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f6932b57-6a6e-4062-a770-dfbd9f4302e5/3',\n 'title': 'cheer 500000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '600000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4d908059-f91c-4aef-9acb-634434f4c32e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4d908059-f91c-4aef-9acb-634434f4c32e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4d908059-f91c-4aef-9acb-634434f4c32e/3',\n 'title': 'cheer 600000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '700000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a1d2a824-f216-4b9f-9642-3de8ed370957/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a1d2a824-f216-4b9f-9642-3de8ed370957/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a1d2a824-f216-4b9f-9642-3de8ed370957/3',\n 'title': 'cheer 700000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '800000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5ec2ee3e-5633-4c2a-8e77-77473fe409e6/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5ec2ee3e-5633-4c2a-8e77-77473fe409e6/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5ec2ee3e-5633-4c2a-8e77-77473fe409e6/3',\n 'title': 'cheer 800000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '900000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/088c58c6-7c38-45ba-8f73-63ef24189b84/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/088c58c6-7c38-45ba-8f73-63ef24189b84/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/088c58c6-7c38-45ba-8f73-63ef24189b84/3',\n 'title': 'cheer 900000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '1000000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/494d1c8e-c3b2-4d88-8528-baff57c9bd3f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/494d1c8e-c3b2-4d88-8528-baff57c9bd3f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/494d1c8e-c3b2-4d88-8528-baff57c9bd3f/3',\n 'title': 'cheer 1000000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '1250000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ce217209-4615-4bf8-81e3-57d06b8b9dc7/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ce217209-4615-4bf8-81e3-57d06b8b9dc7/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ce217209-4615-4bf8-81e3-57d06b8b9dc7/3',\n 'title': 'cheer 1250000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '1500000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4eba5b4-17a7-40a1-a668-bc1972c1e24d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4eba5b4-17a7-40a1-a668-bc1972c1e24d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4eba5b4-17a7-40a1-a668-bc1972c1e24d/3',\n 'title': 'cheer 1500000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '1750000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/183f1fd8-aaf4-450c-a413-e53f839f0f82/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/183f1fd8-aaf4-450c-a413-e53f839f0f82/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/183f1fd8-aaf4-450c-a413-e53f839f0f82/3',\n 'title': 'cheer 1750000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '2000000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/7ea89c53-1a3b-45f9-9223-d97ae19089f2/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/7ea89c53-1a3b-45f9-9223-d97ae19089f2/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/7ea89c53-1a3b-45f9-9223-d97ae19089f2/3',\n 'title': 'cheer 2000000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '2500000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/cf061daf-d571-4811-bcc2-c55c8792bc8f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/cf061daf-d571-4811-bcc2-c55c8792bc8f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/cf061daf-d571-4811-bcc2-c55c8792bc8f/3',\n 'title': 'cheer 2500000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '3000000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5671797f-5e9f-478c-a2b5-eb086c8928cf/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5671797f-5e9f-478c-a2b5-eb086c8928cf/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5671797f-5e9f-478c-a2b5-eb086c8928cf/3',\n 'title': 'cheer 3000000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '3500000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c3d218f5-1e45-419d-9c11-033a1ae54d3a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c3d218f5-1e45-419d-9c11-033a1ae54d3a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c3d218f5-1e45-419d-9c11-033a1ae54d3a/3',\n 'title': 'cheer 3500000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '4000000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/79fe642a-87f3-40b1-892e-a341747b6e08/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/79fe642a-87f3-40b1-892e-a341747b6e08/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/79fe642a-87f3-40b1-892e-a341747b6e08/3',\n 'title': 'cheer 4000000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '4500000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/736d4156-ac67-4256-a224-3e6e915436db/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/736d4156-ac67-4256-a224-3e6e915436db/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/736d4156-ac67-4256-a224-3e6e915436db/3',\n 'title': 'cheer 4500000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '5000000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3f085f85-8d15-4a03-a829-17fca7bf1bc2/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3f085f85-8d15-4a03-a829-17fca7bf1bc2/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3f085f85-8d15-4a03-a829-17fca7bf1bc2/3',\n 'title': 'cheer 5000000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n ],\n },\n {\n 'set_id': 'bits-charity',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a539dc18-ae19-49b0-98c4-8391a594332b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a539dc18-ae19-49b0-98c4-8391a594332b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a539dc18-ae19-49b0-98c4-8391a594332b/3',\n 'title': 'Direct Relief - Charity 2018',\n 'description': 'Supported their favorite streamer during the 2018 Blizzard of Bits',\n 'click_action': 'visit_url',\n 'click_url': 'https://link.twitch.tv/blizzardofbits',\n },\n ],\n },\n {\n 'set_id': 'battlechefbrigade_3',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/107ebb20-4fcd-449a-9931-cd3f81b84c70/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/107ebb20-4fcd-449a-9931-cd3f81b84c70/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/107ebb20-4fcd-449a-9931-cd3f81b84c70/3',\n 'title': 'Battle Chef Brigade',\n 'description': 'Battle Chef Brigade',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Battle%20Chef%20Brigade/details',\n },\n ],\n },\n {\n 'set_id': 'battlerite_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/484ebda9-f7fa-4c67-b12b-c80582f3cc61/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/484ebda9-f7fa-4c67-b12b-c80582f3cc61/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/484ebda9-f7fa-4c67-b12b-c80582f3cc61/3',\n 'title': 'Battlerite',\n 'description': 'Battlerite',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Battlerite/details',\n },\n ],\n },\n {\n 'set_id': 'battlechefbrigade_2',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ef1e96e8-a0f9-40b6-87af-2977d3c004bb/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ef1e96e8-a0f9-40b6-87af-2977d3c004bb/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ef1e96e8-a0f9-40b6-87af-2977d3c004bb/3',\n 'title': 'Battle Chef Brigade',\n 'description': 'Battle Chef Brigade',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Battle%20Chef%20Brigade/details',\n },\n ],\n },\n {\n 'set_id': 'battlechefbrigade_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/24e32e67-33cd-4227-ad96-f0a7fc836107/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/24e32e67-33cd-4227-ad96-f0a7fc836107/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/24e32e67-33cd-4227-ad96-f0a7fc836107/3',\n 'title': 'Battle Chef Brigade',\n 'description': 'Battle Chef Brigade',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Battle%20Chef%20Brigade/details',\n },\n ],\n },\n {\n 'set_id': 'axiom-verge_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f209b747-45ee-42f6-8baf-ea7542633d10/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f209b747-45ee-42f6-8baf-ea7542633d10/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f209b747-45ee-42f6-8baf-ea7542633d10/3',\n 'title': 'Axiom Verge',\n 'description': 'Axiom Verge',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Axiom%20Verge/details',\n },\n ],\n },\n {\n 'set_id': 'anomaly-2_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d1d1ad54-40a6-492b-882e-dcbdce5fa81e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d1d1ad54-40a6-492b-882e-dcbdce5fa81e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d1d1ad54-40a6-492b-882e-dcbdce5fa81e/3',\n 'title': 'Anomaly 2',\n 'description': 'Anomaly 2',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Anomaly%202/details',\n },\n ],\n },\n {\n 'set_id': 'anomaly-warzone-earth_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/858be873-fb1f-47e5-ad34-657f40d3d156/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/858be873-fb1f-47e5-ad34-657f40d3d156/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/858be873-fb1f-47e5-ad34-657f40d3d156/3',\n 'title': 'Anomaly Warzone Earth',\n 'description': 'Anomaly Warzone Earth',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Anomaly:%20Warzone%20Earth/details',\n },\n ],\n },\n {\n 'set_id': 'ambassador',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2cbc339f-34f4-488a-ae51-efdf74f4e323/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2cbc339f-34f4-488a-ae51-efdf74f4e323/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2cbc339f-34f4-488a-ae51-efdf74f4e323/3',\n 'title': 'Twitch Ambassador',\n 'description': 'Twitch Ambassador',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/team/ambassadors',\n },\n ],\n },\n {\n 'set_id': 'H1Z1_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc71386c-86cd-11e7-a55d-43f591dc0c71/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc71386c-86cd-11e7-a55d-43f591dc0c71/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc71386c-86cd-11e7-a55d-43f591dc0c71/3',\n 'title': 'H1Z1',\n 'description': 'H1Z1',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/H1Z1/details',\n },\n ],\n },\n {\n 'set_id': '60-seconds_3',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f4306617-0f96-476f-994e-5304f81bcc6e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f4306617-0f96-476f-994e-5304f81bcc6e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f4306617-0f96-476f-994e-5304f81bcc6e/3',\n 'title': '60 Seconds!',\n 'description': '60 Seconds!',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/60%20Seconds!/details',\n },\n ],\n },\n {\n 'set_id': '60-seconds_2',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/64513f7d-21dd-4a05-a699-d73761945cf9/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/64513f7d-21dd-4a05-a699-d73761945cf9/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/64513f7d-21dd-4a05-a699-d73761945cf9/3',\n 'title': '60 Seconds!',\n 'description': '60 Seconds!',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/60%20Seconds!/details',\n },\n ],\n },\n {\n 'set_id': '60-seconds_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/1e7252f9-7e80-4d3d-ae42-319f030cca99/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/1e7252f9-7e80-4d3d-ae42-319f030cca99/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/1e7252f9-7e80-4d3d-ae42-319f030cca99/3',\n 'title': '60 Seconds!',\n 'description': '60 Seconds!',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/60%20Seconds!/details',\n },\n ],\n },\n {\n 'set_id': '1979-revolution_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/7833bb6e-d20d-48ff-a58d-67fe827a4f84/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/7833bb6e-d20d-48ff-a58d-67fe827a4f84/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/7833bb6e-d20d-48ff-a58d-67fe827a4f84/3',\n 'title': '1979 Revolution',\n 'description': '1979 Revolution',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/1979%20Revolution/details',\n },\n ],\n },\n {\n 'set_id': '10-years-as-twitch-staff',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e48bfab8-6697-4c5b-84df-e64fb0150701/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e48bfab8-6697-4c5b-84df-e64fb0150701/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e48bfab8-6697-4c5b-84df-e64fb0150701/3',\n 'title': '10 years as Twitch Staff',\n 'description': 'Celebrating 10 years as Twitch Staff!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': '15-years-as-twitch-staff',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/523802ec-086b-4dec-b441-90e28b0806d8/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/523802ec-086b-4dec-b441-90e28b0806d8/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/523802ec-086b-4dec-b441-90e28b0806d8/3',\n 'title': '15 years as Twitch Staff',\n 'description': 'Celebrating 15 years as Twitch Staff!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': '5-years-as-twitch-staff',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d53671d0-0ce0-4706-905f-7fe8b122a27a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d53671d0-0ce0-4706-905f-7fe8b122a27a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d53671d0-0ce0-4706-905f-7fe8b122a27a/3',\n 'title': '5 years as Twitch Staff',\n 'description': 'Celebrating 5 years as Twitch Staff!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'aang',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/dfc8243b-037c-4e5e-a8f3-87ad1f01850d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/dfc8243b-037c-4e5e-a8f3-87ad1f01850d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/dfc8243b-037c-4e5e-a8f3-87ad1f01850d/3',\n 'title': 'Aang',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to an Avatar Legends: The Fighting Game streamer!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'admin',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9ef7e029-4cdf-4d4d-a0d5-e2b3fb2583fe/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9ef7e029-4cdf-4d4d-a0d5-e2b3fb2583fe/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9ef7e029-4cdf-4d4d-a0d5-e2b3fb2583fe/3',\n 'title': 'Admin',\n 'description': 'Twitch Admin',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'alone',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/10ba11a2-0171-42b6-9bba-8f2f14248172/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/10ba11a2-0171-42b6-9bba-8f2f14248172/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/10ba11a2-0171-42b6-9bba-8f2f14248172/3',\n 'title': 'Alone',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Little Nightmares III category during launch.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'anonymous-cheerer',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca3db7f7-18f5-487e-a329-cd0b538ee979/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca3db7f7-18f5-487e-a329-cd0b538ee979/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca3db7f7-18f5-487e-a329-cd0b538ee979/3',\n 'title': 'Anonymous Cheerer',\n 'description': 'Anonymous Cheerer',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'arc-raiders-launch-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d4aa495f-a0e4-4ab4-b3eb-7c2ea573b03f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d4aa495f-a0e4-4ab4-b3eb-7c2ea573b03f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d4aa495f-a0e4-4ab4-b3eb-7c2ea573b03f/3',\n 'title': 'Arc Raiders Launch 2025',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to an Arc Raiders streamer during launch!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'arcane-season-2-premiere',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/1d833bde-edc7-4d23-b7b6-ad5a13296675/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/1d833bde-edc7-4d23-b7b6-ad5a13296675/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/1d833bde-edc7-4d23-b7b6-ad5a13296675/3',\n 'title': 'Arcane Season 2 Premiere',\n 'description': 'This badge was earned by watching the premiere of Arcane Season 2!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'artist-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4300a897-03dc-4e83-8c0e-c332fee7057f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4300a897-03dc-4e83-8c0e-c332fee7057f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4300a897-03dc-4e83-8c0e-c332fee7057f/3',\n 'title': 'Artist',\n 'description': 'Artist on this Channel',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'battlefield-6',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d7750af0-caca-47c5-b207-1af9be69ce1b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d7750af0-caca-47c5-b207-1af9be69ce1b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d7750af0-caca-47c5-b207-1af9be69ce1b/3',\n 'title': 'Battlefield 6',\n 'description': 'This badge was earned by subscribing to a streamer playing Battlefield 6.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'bingbonglove',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4ffa02fc-ae89-4557-95ca-b9fc65909bd0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4ffa02fc-ae89-4557-95ca-b9fc65909bd0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4ffa02fc-ae89-4557-95ca-b9fc65909bd0/3',\n 'title': 'BingBongLove',\n 'description':\n 'This badge was earned by tuning in to a PEAK stream for 15 minutes from February 13 - 28, 2026!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'black-ops-7-global-launch',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e225aad6-3780-4bdc-ae38-48d3ab7dc36e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e225aad6-3780-4bdc-ae38-48d3ab7dc36e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e225aad6-3780-4bdc-ae38-48d3ab7dc36e/3',\n 'title': 'Black Ops 7 Global Launch',\n 'description':\n 'This badge was earned by subscribing to a COD: Black Ops 7 streamer during launch!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'borderlands-4-badge---ripper',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/098219cb-48d8-4945-96a6-80594c7a90dd/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/098219cb-48d8-4945-96a6-80594c7a90dd/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/098219cb-48d8-4945-96a6-80594c7a90dd/3',\n 'title': 'Borderlands 4 Badge - Ripper',\n 'description': 'This user joined the ranks of the Rippers in Borderlands 4.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'borderlands-4-badge---vault-symbol',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/97eee27d-c87f-4afb-a020-04a9d04456df/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/97eee27d-c87f-4afb-a020-04a9d04456df/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/97eee27d-c87f-4afb-a020-04a9d04456df/3',\n 'title': 'Borderlands 4 Badge - Vault Symbol',\n 'description': 'This user is rocking the Vault Symbol from Borderlands 4.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'bot-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ffa9565-c35b-4cad-800b-041e60659cf2/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ffa9565-c35b-4cad-800b-041e60659cf2/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ffa9565-c35b-4cad-800b-041e60659cf2/3',\n 'title': 'Chat Bot',\n 'description': 'This Bot has been added to the channel by the broadcaster.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'broadcaster',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5527c58c-fb7d-422d-b71b-f309dcb85cc1/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5527c58c-fb7d-422d-b71b-f309dcb85cc1/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5527c58c-fb7d-422d-b71b-f309dcb85cc1/3',\n 'title': 'Broadcaster',\n 'description': 'Broadcaster',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'bungie-foundation-ally',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f5f78a03-c73e-4ae4-86d3-a3bef7ceca6f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f5f78a03-c73e-4ae4-86d3-a3bef7ceca6f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f5f78a03-c73e-4ae4-86d3-a3bef7ceca6f/3',\n 'title': 'Bungie Foundation Ally',\n 'description': 'This badge is awarded for being an ally of the Bungie Foundation!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'bungie-foundation-supporter',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/85cb4623-0dd6-4f41-b86e-765bc8ac367d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/85cb4623-0dd6-4f41-b86e-765bc8ac367d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/85cb4623-0dd6-4f41-b86e-765bc8ac367d/3',\n 'title': 'Bungie Foundation Supporter',\n 'description': 'This badge is awarded for being a supporter of the Bungie Foundation!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'chatter-cs-go-2022',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/57b6bd6b-a1b5-4204-9e6c-eb8ed5831603/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/57b6bd6b-a1b5-4204-9e6c-eb8ed5831603/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/57b6bd6b-a1b5-4204-9e6c-eb8ed5831603/3',\n 'title': 'CS:GO Week Brazil 2022',\n 'description': 'Chatted during CS:GO Week Brazil 2022',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'clips-leader',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/12f70951-efea-48c2-b42b-d5e2ea0d71f7/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/12f70951-efea-48c2-b42b-d5e2ea0d71f7/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/12f70951-efea-48c2-b42b-d5e2ea0d71f7/3',\n 'title': 'Clips Leader 1',\n 'description': 'Ranked as a top clipper in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9eddf7ab-aa46-4798-abe2-710db1043254/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9eddf7ab-aa46-4798-abe2-710db1043254/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9eddf7ab-aa46-4798-abe2-710db1043254/3',\n 'title': 'Clips Leader 2',\n 'description': 'Ranked as a top clipper in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '3',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fb838633-6ff6-46df-98b4-9e53fcff84f6/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fb838633-6ff6-46df-98b4-9e53fcff84f6/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fb838633-6ff6-46df-98b4-9e53fcff84f6/3',\n 'title': 'Clips Leader 3',\n 'description': 'Ranked as a top clipper in this community',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'creator-cs-go-2022',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a2ea6df9-ac0a-4956-bfe9-e931f50b94fa/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a2ea6df9-ac0a-4956-bfe9-e931f50b94fa/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a2ea6df9-ac0a-4956-bfe9-e931f50b94fa/3',\n 'title': 'CS:GO Week Brazil 2022',\n 'description': 'Streamed during CS:GO Week Brazil 2022',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'crimson-butterfly',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/63243824-6d43-45cf-8d21-fe0b06ab587f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/63243824-6d43-45cf-8d21-fe0b06ab587f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/63243824-6d43-45cf-8d21-fe0b06ab587f/3',\n 'title': 'Crimson Butterfly',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a streamer in the FATAL FRAME II: Crimson Butterfly REMAKE category!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'diablo-30th-anniversary',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2f98d79a-c78c-4c61-ac9e-7bc544d44619/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2f98d79a-c78c-4c61-ac9e-7bc544d44619/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2f98d79a-c78c-4c61-ac9e-7bc544d44619/3',\n 'title': 'Diablo 30th Anniversary',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a Diablo IV streamer during the Diablo 30th Anniversary!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'diana',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/38801cc6-4d01-40f6-8949-6b9f9d5334b8/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/38801cc6-4d01-40f6-8949-6b9f9d5334b8/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/38801cc6-4d01-40f6-8949-6b9f9d5334b8/3',\n 'title': 'Diana',\n 'description':\n 'This badge was earned by subscribing or gifting a sub for a streamer in the Pragmata category',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'ditto',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/b577304e-7dc9-49f2-bee1-68caf56a91e6/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/b577304e-7dc9-49f2-bee1-68caf56a91e6/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/b577304e-7dc9-49f2-bee1-68caf56a91e6/3',\n 'title': 'Ditto',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a Pokémon Pokopia streamer during launch!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'dragonscimmy',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/da4c6554-4472-4949-b33b-e79164dbba0b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/da4c6554-4472-4949-b33b-e79164dbba0b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/da4c6554-4472-4949-b33b-e79164dbba0b/3',\n 'title': 'DragonScimmy',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to any Old School RuneScape broadcast in 2025 during the launch of Sailing, OSRS’ first ever new skill!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'dreamcon-2024',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5dfbd056-8ac1-407f-bdf3-f83183fa97ae/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5dfbd056-8ac1-407f-bdf3-f83183fa97ae/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5dfbd056-8ac1-407f-bdf3-f83183fa97ae/3',\n 'title': 'Dream Con 2024',\n 'description':\n 'This badge was earned by watching Dream Con 2024 or completing the post-event survey!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'elden-ring-recluse',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5afadc6c-933b-4ede-b318-3752bbf267a9/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5afadc6c-933b-4ede-b318-3752bbf267a9/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5afadc6c-933b-4ede-b318-3752bbf267a9/3',\n 'title': 'Elden Ring SuperFan badge - Recluse',\n 'description':\n 'You used Stream Together or participated in a stream before or after Nightreign dropped. You’ve earned the Recluse badge.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'elden-ring-wylder',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5d5ab328-0916-4655-90b9-78b983ca4262/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5d5ab328-0916-4655-90b9-78b983ca4262/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5d5ab328-0916-4655-90b9-78b983ca4262/3',\n 'title': 'Elden Ring Nightreign Clip badge - Wylder',\n 'description':\n 'You captured a clippable Elden Ring moment. You’ve earned the Wylder badge.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'eso_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/18647a68-a35f-48d7-bf97-ae5deb6b277d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/18647a68-a35f-48d7-bf97-ae5deb6b277d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/18647a68-a35f-48d7-bf97-ae5deb6b277d/3',\n 'title': 'Elder Scrolls Online',\n 'description': 'Elder Scrolls Online',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'evo-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/1469e9cf-14d9-4a48-a91c-81712d027439/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/1469e9cf-14d9-4a48-a91c-81712d027439/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/1469e9cf-14d9-4a48-a91c-81712d027439/3',\n 'title': 'Evo 2025',\n 'description': 'You have earned the Evo 2025 Badge',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'extension',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ea8b0f8c-aa27-11e8-ba0c-1370ffff3854/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ea8b0f8c-aa27-11e8-ba0c-1370ffff3854/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ea8b0f8c-aa27-11e8-ba0c-1370ffff3854/3',\n 'title': 'Extension',\n 'description': 'Extension',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'fallout-season-2-ghoul',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/815334c4-3123-489b-8854-2af0f4027b00/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/815334c4-3123-489b-8854-2af0f4027b00/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/815334c4-3123-489b-8854-2af0f4027b00/3',\n 'title': 'Fallout Season 2 Ghoul',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a Fallout 76 streamer during the launch of Burning Springs and Fallout Season 2!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'first-stand-2026-supporter',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ea899f87-f7f5-4d9d-9de9-173331341199/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ea899f87-f7f5-4d9d-9de9-173331341199/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ea899f87-f7f5-4d9d-9de9-173331341199/3',\n 'title': 'First Stand 2026 Supporter',\n 'description': 'This badge was rewarded to fans who supported First Stand 2026!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'first-stand-2026-viewer',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2ae99aac-ac5b-4d69-884b-3eb20621340d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2ae99aac-ac5b-4d69-884b-3eb20621340d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2ae99aac-ac5b-4d69-884b-3eb20621340d/3',\n 'title': 'First Stand 2026 Viewer',\n 'description': 'This badge was rewarded to fans who watched First Stand 2026!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'fischer',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/50488ced-e1ee-4ea4-bb44-fb60d7d396c2/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/50488ced-e1ee-4ea4-bb44-fb60d7d396c2/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/50488ced-e1ee-4ea4-bb44-fb60d7d396c2/3',\n 'title': 'Fischer',\n 'description': 'This badge was earned by watching Roblox during the Bloxfest Qualifiers.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'frog-lantern',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/dfc75f94-14f9-404b-b953-37eba481df37/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/dfc75f94-14f9-404b-b953-37eba481df37/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/dfc75f94-14f9-404b-b953-37eba481df37/3',\n 'title': 'Frog Lantern',\n 'description':\n 'This badge was earned by subscribing or gifting three times in the Sea of Thieves category!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'game-developer',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/85856a4a-eb7d-4e26-a43e-d204a977ade4/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/85856a4a-eb7d-4e26-a43e-d204a977ade4/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/85856a4a-eb7d-4e26-a43e-d204a977ade4/3',\n 'title': 'Game Developer',\n 'description': 'Game Developer for:',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'gears-of-war-superfan-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/18b92728-aa7a-4e24-acb5-b14ea17c8b2b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/18b92728-aa7a-4e24-acb5-b14ea17c8b2b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/18b92728-aa7a-4e24-acb5-b14ea17c8b2b/3',\n 'title': 'Gears of War Superfan Badge',\n 'description': 'This user is a Gears of War: Reloaded Superfan.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'gingko-leaf',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/394abbbd-cc1d-427f-bc00-bce294353448/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/394abbbd-cc1d-427f-bc00-bce294353448/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/394abbbd-cc1d-427f-bc00-bce294353448/3',\n 'title': 'Gingko Leaf',\n 'description':\n \"This badge was earned by watching 30 minutes of a Ghost of Yotei stream during the game's launch!\",\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'global_mod',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9384c43e-4ce7-4e94-b2a1-b93656896eba/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9384c43e-4ce7-4e94-b2a1-b93656896eba/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9384c43e-4ce7-4e94-b2a1-b93656896eba/3',\n 'title': 'Global Moderator',\n 'description': 'Global Moderator',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'gold-pixel-heart---together-for-good-24',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/52c90eac-b7ec-4e24-b500-8fceecfe91e8/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/52c90eac-b7ec-4e24-b500-8fceecfe91e8/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/52c90eac-b7ec-4e24-b500-8fceecfe91e8/3',\n 'title': \"Gold Pixel Heart - Together For Good '24\",\n 'description':\n 'This badge was earned by donating $50 or more as part of Twitch Together for Good 2024!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'gp-explorer-3',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/1e3b6965-2224-44d1-a67a-6d186c1fb17d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/1e3b6965-2224-44d1-a67a-6d186c1fb17d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/1e3b6965-2224-44d1-a67a-6d186c1fb17d/3',\n 'title': 'GP Explorer 3',\n 'description':\n 'This badge was earned by watching 15 minutes of GP Explorer 3 on any of the broadcasting channels.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'hornet',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4dc7b047-8c59-4522-97f2-24fb63147f56/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4dc7b047-8c59-4522-97f2-24fb63147f56/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4dc7b047-8c59-4522-97f2-24fb63147f56/3',\n 'title': 'Hornet',\n 'description':\n 'This badge was earned by subscribing to a streamer in the Hollow Knight: Silksong category during game launch week.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'hunt-crosses',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/b1e77273-2fc0-4d36-873a-67a7c1647efe/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/b1e77273-2fc0-4d36-873a-67a7c1647efe/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/b1e77273-2fc0-4d36-873a-67a7c1647efe/3',\n 'title': 'Hunt Crosses',\n 'description':\n 'This badge was earned by subscribing or gifting a sub in the Hunt: Showdown 1896 category from Dec. 12 - Dec. 24, 2025.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'hypershot-celestial',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ee3441d-92d4-4f00-b8b4-64cb3d97e17e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ee3441d-92d4-4f00-b8b4-64cb3d97e17e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ee3441d-92d4-4f00-b8b4-64cb3d97e17e/3',\n 'title': 'Hypershot Celestial',\n 'description': 'This badge was earned by watching Roblox during the Bloxfest Qualifiers.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'jeff-the-land-shark',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ad51bd4c-2621-4d7c-8580-89243002bc8b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ad51bd4c-2621-4d7c-8580-89243002bc8b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ad51bd4c-2621-4d7c-8580-89243002bc8b/3',\n 'title': 'Jeff the Land Shark',\n 'description':\n \"This badge was earned by subscribing or gifting a sub in the Marvel Rivals category during Marvel Rivals' 1-year anniversary!\",\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'k4sen-con-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/6ea537aa-bb9a-4410-a330-5820b7dd8a24/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/6ea537aa-bb9a-4410-a330-5820b7dd8a24/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/6ea537aa-bb9a-4410-a330-5820b7dd8a24/3',\n 'title': 'The K4SEN Con 2025',\n 'description': 'This badge was earned by watching 30 minutes of K4SEN Con 2025!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'kodama',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/374ef606-cf25-475e-994b-f7d36b8acd43/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/374ef606-cf25-475e-994b-f7d36b8acd43/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/374ef606-cf25-475e-994b-f7d36b8acd43/3',\n 'title': 'Kodama',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Nioh 3 category',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'la-velada-iv',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/655dac77-0b2f-4b62-8871-6ae21f82b34e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/655dac77-0b2f-4b62-8871-6ae21f82b34e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/655dac77-0b2f-4b62-8871-6ae21f82b34e/3',\n 'title': 'La Velada del Año IV',\n 'description': 'This badge was earned for watching La Velada del Año IV!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'la-velada-v-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3f728095-b84d-4e7e-9eee-541ea02ddea0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3f728095-b84d-4e7e-9eee-541ea02ddea0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3f728095-b84d-4e7e-9eee-541ea02ddea0/3',\n 'title': 'La Velada V Badge',\n 'description': 'This badge was earned by watching La Velada V!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'lamby',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c0801fe9-3d54-49d1-801c-3c1fadde09cd/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c0801fe9-3d54-49d1-801c-3c1fadde09cd/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c0801fe9-3d54-49d1-801c-3c1fadde09cd/3',\n 'title': 'Lamby',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a Cult of the Lamb streamer!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'lead_moderator',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/0822047b-65e0-46f2-94a9-d1091d685d33/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/0822047b-65e0-46f2-94a9-d1091d685d33/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/0822047b-65e0-46f2-94a9-d1091d685d33/3',\n 'title': 'Lead Moderator',\n 'description': 'A badge for users who are a lead moderator in the channel',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'league-of-legends-mid-season-invitational-2025---grey',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/18a0b4ba-5f62-4e94-b6f1-481731608602/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/18a0b4ba-5f62-4e94-b6f1-481731608602/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/18a0b4ba-5f62-4e94-b6f1-481731608602/3',\n 'title': 'League of Legends Mid Season Invitational 2025 Support a Streamer',\n 'description':\n 'This badge was earned by gifting a subscription to a streamer in the League of Legends category during MSI 2025.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'league-of-legends-mid-season-invitational-2025---purple',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/0a99ba23-5e1a-46b7-8ff2-efbb9a6ea54c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/0a99ba23-5e1a-46b7-8ff2-efbb9a6ea54c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/0a99ba23-5e1a-46b7-8ff2-efbb9a6ea54c/3',\n 'title': 'League of Legends Mid Season Invitational 2025',\n 'description':\n 'This badge was earned by subscribing to a lolesports channel during MSI 2025!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'legendus',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/55c355cf-ddbf-4f12-8369-6554a1f78b6f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/55c355cf-ddbf-4f12-8369-6554a1f78b6f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/55c355cf-ddbf-4f12-8369-6554a1f78b6f/3',\n 'title': 'LEGENDUS',\n 'description':\n 'This badge was granted to users who watched LEGENDUS ITADAKI, hosted by fps_shaka, on June 28-June 29, 2025.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'lol-worlds-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4545b0b5-c825-487e-8958-ce5512eb6f84/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4545b0b5-c825-487e-8958-ce5512eb6f84/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4545b0b5-c825-487e-8958-ce5512eb6f84/3',\n 'title': 'LoL Worlds 2025',\n 'description':\n 'This badge was earned by subscribing to a participating LoL Esports broadcast or co-stream of the 2025 League of Legends World Championship!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'lost-ark-anniversary',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/77995962-b02e-48e3-92ab-b77a4b352fb3/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/77995962-b02e-48e3-92ab-b77a4b352fb3/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/77995962-b02e-48e3-92ab-b77a4b352fb3/3',\n 'title': 'Lost Ark Anniversary',\n 'description':\n 'This badge was earned by watching your favorite Lost Ark streamer during the 4th Anniversary!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'low',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/58d48669-bfee-46e7-a83c-b65a30783400/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/58d48669-bfee-46e7-a83c-b65a30783400/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/58d48669-bfee-46e7-a83c-b65a30783400/3',\n 'title': 'Low',\n 'description':\n 'This badge was earned by watching 30 minutes in the Little Nightmares III category during launch!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'marathon-reveal-runner',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ae1c6c62-c057-4fad-a1d4-663bf988701f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ae1c6c62-c057-4fad-a1d4-663bf988701f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ae1c6c62-c057-4fad-a1d4-663bf988701f/3',\n 'title': 'Marathon Reveal Runner',\n 'description': 'This badge was earned by subscribing during the Marathon reveal stream!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'marathon-silkworm',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/eabd1994-d054-4eb1-a740-7cce1ad4f0cb/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/eabd1994-d054-4eb1-a740-7cce1ad4f0cb/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/eabd1994-d054-4eb1-a740-7cce1ad4f0cb/3',\n 'title': 'Marathon Silkworm',\n 'description':\n 'This Chat Badge was unlocked by watching the Marathon Server Slam & Launch Week!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'marathon-sub-burger',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5bc8a500-12f5-42c4-86f7-a678d1f930a1/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5bc8a500-12f5-42c4-86f7-a678d1f930a1/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5bc8a500-12f5-42c4-86f7-a678d1f930a1/3',\n 'title': 'Marathon Sub Burger',\n 'description': \"A tasty burger for you and a friend! Tastes like meat. Isn't\",\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'mel',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/8a7c1d1d-12bb-40d9-9be8-0a4fdf0d870c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/8a7c1d1d-12bb-40d9-9be8-0a4fdf0d870c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/8a7c1d1d-12bb-40d9-9be8-0a4fdf0d870c/3',\n 'title': 'Mel',\n 'description':\n 'This badge was earned by subscribing or gifting a sub for a streamer in the Hades II category.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'moderator',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3267646d-33f0-4b17-b3df-f923a41db1d0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3267646d-33f0-4b17-b3df-f923a41db1d0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3267646d-33f0-4b17-b3df-f923a41db1d0/3',\n 'title': 'Moderator',\n 'description': 'Moderator',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'moments',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/bf370830-d79a-497b-81c6-a365b2b60dda/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/bf370830-d79a-497b-81c6-a365b2b60dda/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/bf370830-d79a-497b-81c6-a365b2b60dda/3',\n 'title': 'Moments Badge - Tier 1',\n 'description': 'Earned for being a part of at least 1 moment on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc46b10c-5b45-43fd-81ad-d5cb0de6d2f4/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc46b10c-5b45-43fd-81ad-d5cb0de6d2f4/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc46b10c-5b45-43fd-81ad-d5cb0de6d2f4/3',\n 'title': 'Moments Badge - Tier 2',\n 'description': 'Earned for being a part of at least 5 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '3',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d08658d7-205f-4f75-ad44-8c6e0acd8ef6/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d08658d7-205f-4f75-ad44-8c6e0acd8ef6/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d08658d7-205f-4f75-ad44-8c6e0acd8ef6/3',\n 'title': 'Moments Badge - Tier 3',\n 'description': 'Earned for being a part of at least 10 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '4',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fe5b5ddc-93e7-4aaf-9b3e-799cd41808b1/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fe5b5ddc-93e7-4aaf-9b3e-799cd41808b1/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fe5b5ddc-93e7-4aaf-9b3e-799cd41808b1/3',\n 'title': 'Moments Badge - Tier 4',\n 'description': 'Earned for being a part of at least 15 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '5',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c8a0d95a-856e-4097-9fc0-7765300a4f58/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c8a0d95a-856e-4097-9fc0-7765300a4f58/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c8a0d95a-856e-4097-9fc0-7765300a4f58/3',\n 'title': 'Moments Badge - Tier 5',\n 'description': 'Earned for being a part of at least 20 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '6',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f9e3b4e4-200e-4045-bd71-3a6b480c23ae/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f9e3b4e4-200e-4045-bd71-3a6b480c23ae/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f9e3b4e4-200e-4045-bd71-3a6b480c23ae/3',\n 'title': 'Moments Badge - Tier 6',\n 'description': 'Earned for being a part of at least 30 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '7',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a90a26a4-fdf7-4ac3-a782-76a413da16c1/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a90a26a4-fdf7-4ac3-a782-76a413da16c1/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a90a26a4-fdf7-4ac3-a782-76a413da16c1/3',\n 'title': 'Moments Badge - Tier 7',\n 'description': 'Earned for being a part of at least 40 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '8',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f22286cd-6aa3-42ce-b3fb-10f5d18c4aa0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f22286cd-6aa3-42ce-b3fb-10f5d18c4aa0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f22286cd-6aa3-42ce-b3fb-10f5d18c4aa0/3',\n 'title': 'Moments Badge - Tier 8',\n 'description': 'Earned for being a part of at least 50 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '9',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5cb2e584-1efd-469b-ab1d-4d1b59a944e7/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5cb2e584-1efd-469b-ab1d-4d1b59a944e7/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5cb2e584-1efd-469b-ab1d-4d1b59a944e7/3',\n 'title': 'Moments Badge - Tier 9',\n 'description': 'Earned for being a part of at least 60 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '10',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9c13f2b6-69cd-4537-91b4-4a8bd8b6b1fd/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9c13f2b6-69cd-4537-91b4-4a8bd8b6b1fd/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9c13f2b6-69cd-4537-91b4-4a8bd8b6b1fd/3',\n 'title': 'Moments Badge - Tier 10',\n 'description': 'Earned for being a part of at least 75 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '11',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/7573e7a2-0f1f-4508-b833-d822567a1e03/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/7573e7a2-0f1f-4508-b833-d822567a1e03/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/7573e7a2-0f1f-4508-b833-d822567a1e03/3',\n 'title': 'Moments Badge - Tier 11',\n 'description': 'Earned for being a part of at least 90 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '12',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f2c91d14-85c8-434b-a6c0-6d7930091150/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f2c91d14-85c8-434b-a6c0-6d7930091150/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f2c91d14-85c8-434b-a6c0-6d7930091150/3',\n 'title': 'Moments Badge - Tier 12',\n 'description': 'Earned for being a part of at least 105 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '13',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/35eb3395-a1d3-4170-969a-86402ecfb11a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/35eb3395-a1d3-4170-969a-86402ecfb11a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/35eb3395-a1d3-4170-969a-86402ecfb11a/3',\n 'title': 'Moments Badge - Tier 13',\n 'description': 'Earned for being a part of at least 120 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '14',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/cb40eb03-1015-45ba-8793-51c66a24a3d5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/cb40eb03-1015-45ba-8793-51c66a24a3d5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/cb40eb03-1015-45ba-8793-51c66a24a3d5/3',\n 'title': 'Moments Badge - Tier 14',\n 'description': 'Earned for being a part of at least 140 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '15',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/b241d667-280b-4183-96ae-2d0053631186/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/b241d667-280b-4183-96ae-2d0053631186/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/b241d667-280b-4183-96ae-2d0053631186/3',\n 'title': 'Moments Badge - Tier 15',\n 'description': 'Earned for being a part of at least 160 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '16',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5684d1bc-8132-4a4f-850c-18d3c5bd04f3/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5684d1bc-8132-4a4f-850c-18d3c5bd04f3/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5684d1bc-8132-4a4f-850c-18d3c5bd04f3/3',\n 'title': 'Moments Badge - Tier 16',\n 'description': 'Earned for being a part of at least 180 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '17',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3b08c1ee-0f77-451b-9226-b5b22d7f023c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3b08c1ee-0f77-451b-9226-b5b22d7f023c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3b08c1ee-0f77-451b-9226-b5b22d7f023c/3',\n 'title': 'Moments Badge - Tier 17',\n 'description': 'Earned for being a part of at least 200 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '18',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/14057e75-080c-42da-a412-6232c6f33b68/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/14057e75-080c-42da-a412-6232c6f33b68/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/14057e75-080c-42da-a412-6232c6f33b68/3',\n 'title': 'Moments Badge - Tier 18',\n 'description': 'Earned for being a part of at least 225 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '19',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/6100cc6f-6b4b-4a3d-a55b-a5b34edb5ea1/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/6100cc6f-6b4b-4a3d-a55b-a5b34edb5ea1/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/6100cc6f-6b4b-4a3d-a55b-a5b34edb5ea1/3',\n 'title': 'Moments Badge - Tier 19',\n 'description': 'Earned for being a part of at least 250 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '20',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/43399796-e74c-4741-a975-56202f0af30e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/43399796-e74c-4741-a975-56202f0af30e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/43399796-e74c-4741-a975-56202f0af30e/3',\n 'title': 'Moments Badge - Tier 20',\n 'description': 'Earned for being a part of at least 275 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'mr-raccoon',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/057b7ef9-6b3d-4a9c-9f0c-ede0df1315db/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/057b7ef9-6b3d-4a9c-9f0c-ede0df1315db/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/057b7ef9-6b3d-4a9c-9f0c-ede0df1315db/3',\n 'title': 'Mr. Raccoon',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a Resident Evil: Requiem streamer.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'never-grave---witch-hat',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fb752b70-4eb6-45dd-8ee1-1194c38d2ac3/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fb752b70-4eb6-45dd-8ee1-1194c38d2ac3/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fb752b70-4eb6-45dd-8ee1-1194c38d2ac3/3',\n 'title': 'Never Grave - Witch Hat',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Never Grave category during the game launch',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'no_audio',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/aef2cd08-f29b-45a1-8c12-d44d7fd5e6f0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/aef2cd08-f29b-45a1-8c12-d44d7fd5e6f0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/aef2cd08-f29b-45a1-8c12-d44d7fd5e6f0/3',\n 'title': 'Watching without audio',\n 'description': 'Individuals with unreliable or no sound can select this badge',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'no_video',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/199a0dba-58f3-494e-a7fc-1fa0a1001fb8/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/199a0dba-58f3-494e-a7fc-1fa0a1001fb8/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/199a0dba-58f3-494e-a7fc-1fa0a1001fb8/3',\n 'title': 'Listening only',\n 'description': 'Individuals with unreliable or no video can select this badge',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'path-of-exile-2-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/8bebe4ce-6c15-4746-8c33-42312c250ceb/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/8bebe4ce-6c15-4746-8c33-42312c250ceb/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/8bebe4ce-6c15-4746-8c33-42312c250ceb/3',\n 'title': 'Chaos Orb',\n 'description':\n \"This badge was earned by subscribing to a streamer during Path of Exile 2's launch!\",\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'pokemon-30th-anniversary',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4c10b31-ad76-4600-a3cc-48c875e1f7c0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4c10b31-ad76-4600-a3cc-48c875e1f7c0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4c10b31-ad76-4600-a3cc-48c875e1f7c0/3',\n 'title': 'Pokémon 30th',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a streamer in an eligible Pokémon category!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'pokemon-legends-z-a-chikorita',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f479e945-987b-423a-a901-7b1c3b3003fb/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f479e945-987b-423a-a901-7b1c3b3003fb/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f479e945-987b-423a-a901-7b1c3b3003fb/3',\n 'title': 'Pokémon Legends: Z-A Chikorita',\n 'description':\n 'This badge was earned by purchasing a subscription or gifting a subscription to a streamer playing Pokémon Legends: Z-A for Chikorita.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'pokemon-legends-z-a-tepig',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/34799f2e-e165-42a4-ae79-1c9c06cf1d55/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/34799f2e-e165-42a4-ae79-1c9c06cf1d55/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/34799f2e-e165-42a4-ae79-1c9c06cf1d55/3',\n 'title': 'Pokémon Legends: Z-A Tepig',\n 'description':\n 'This badge was earned by purchasing a subscription or gifting a subscription to a streamer playing Pokémon Legends Z-A for Tepig.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'pokemon-legends-z-a-totodile',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/0bdb6906-ba8f-4fb6-bc9e-3aca04d3d501/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/0bdb6906-ba8f-4fb6-bc9e-3aca04d3d501/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/0bdb6906-ba8f-4fb6-bc9e-3aca04d3d501/3',\n 'title': 'Pokémon Legends: Z-A Totodile',\n 'description':\n 'This badge was earned by purchasing a subscription or gifting a subscription to a streamer playing Pokémon Legends: Z-A for Totodile.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'power-rangers',\n 'versions': [\n {\n 'id': '0',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9edf3e7f-62e4-40f5-86ab-7a646b10f1f0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9edf3e7f-62e4-40f5-86ab-7a646b10f1f0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9edf3e7f-62e4-40f5-86ab-7a646b10f1f0/3',\n 'title': 'Black Ranger',\n 'description': 'Black Ranger',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/1eeae8fe-5bc6-44ed-9c88-fb84d5e0df52/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/1eeae8fe-5bc6-44ed-9c88-fb84d5e0df52/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/1eeae8fe-5bc6-44ed-9c88-fb84d5e0df52/3',\n 'title': 'Blue Ranger',\n 'description': 'Blue Ranger',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/21bbcd6d-1751-4d28-a0c3-0b72453dd823/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/21bbcd6d-1751-4d28-a0c3-0b72453dd823/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/21bbcd6d-1751-4d28-a0c3-0b72453dd823/3',\n 'title': 'Green Ranger',\n 'description': 'Green Ranger',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '3',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5c58cb40-9028-4d16-af67-5bc0c18b745e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5c58cb40-9028-4d16-af67-5bc0c18b745e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5c58cb40-9028-4d16-af67-5bc0c18b745e/3',\n 'title': 'Pink Ranger',\n 'description': 'Pink Ranger',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '4',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/8843d2de-049f-47d5-9794-b6517903db61/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/8843d2de-049f-47d5-9794-b6517903db61/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/8843d2de-049f-47d5-9794-b6517903db61/3',\n 'title': 'Red Ranger',\n 'description': 'Red Ranger',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '5',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/06c85e34-477e-4939-9537-fd9978976042/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/06c85e34-477e-4939-9537-fd9978976042/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/06c85e34-477e-4939-9537-fd9978976042/3',\n 'title': 'White Ranger',\n 'description': 'White Ranger',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '6',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d6dca630-1ca4-48de-94e7-55ed0a24d8d1/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d6dca630-1ca4-48de-94e7-55ed0a24d8d1/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d6dca630-1ca4-48de-94e7-55ed0a24d8d1/3',\n 'title': 'Yellow Ranger',\n 'description': 'Yellow Ranger',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'predictions',\n 'versions': [\n {\n 'id': 'blue-1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e33d8b46-f63b-4e67-996d-4a7dcec0ad33/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e33d8b46-f63b-4e67-996d-4a7dcec0ad33/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e33d8b46-f63b-4e67-996d-4a7dcec0ad33/3',\n 'title': 'Predicted Blue (1)',\n 'description': 'Predicted Outcome One',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'blue-10',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/072ae906-ecf7-44f1-ac69-a5b2261d8892/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/072ae906-ecf7-44f1-ac69-a5b2261d8892/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/072ae906-ecf7-44f1-ac69-a5b2261d8892/3',\n 'title': 'Predicted Blue (10)',\n 'description': 'Predicted Outcome Ten',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'blue-2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ffdda3fe-8012-4db3-981e-7a131402b057/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ffdda3fe-8012-4db3-981e-7a131402b057/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ffdda3fe-8012-4db3-981e-7a131402b057/3',\n 'title': 'Predicted Blue (2)',\n 'description': 'Predicted Outcome Two',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'blue-3',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f2ab9a19-8ef7-4f9f-bd5d-9cf4e603f845/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f2ab9a19-8ef7-4f9f-bd5d-9cf4e603f845/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f2ab9a19-8ef7-4f9f-bd5d-9cf4e603f845/3',\n 'title': 'Predicted Blue (3)',\n 'description': 'Predicted Outcome Three',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'blue-4',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/df95317d-9568-46de-a421-a8520edb9349/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/df95317d-9568-46de-a421-a8520edb9349/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/df95317d-9568-46de-a421-a8520edb9349/3',\n 'title': 'Predicted Blue (4)',\n 'description': 'Predicted Outcome Four',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'blue-5',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/88758be8-de09-479b-9383-e3bb6d9e6f06/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/88758be8-de09-479b-9383-e3bb6d9e6f06/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/88758be8-de09-479b-9383-e3bb6d9e6f06/3',\n 'title': 'Predicted Blue (5)',\n 'description': 'Predicted Outcome Five',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'blue-6',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/46b1537e-d8b0-4c0d-8fba-a652e57b9df0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/46b1537e-d8b0-4c0d-8fba-a652e57b9df0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/46b1537e-d8b0-4c0d-8fba-a652e57b9df0/3',\n 'title': 'Predicted Blue (6)',\n 'description': 'Predicted Outcome Six',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'blue-7',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/07cd34b2-c6a1-45f5-8d8a-131e3c8b2279/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/07cd34b2-c6a1-45f5-8d8a-131e3c8b2279/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/07cd34b2-c6a1-45f5-8d8a-131e3c8b2279/3',\n 'title': 'Predicted Blue (7)',\n 'description': 'Predicted Outcome Seven',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'blue-8',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4416dfd7-db97-44a0-98e7-40b4e250615e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4416dfd7-db97-44a0-98e7-40b4e250615e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4416dfd7-db97-44a0-98e7-40b4e250615e/3',\n 'title': 'Predicted Blue (8)',\n 'description': 'Predicted Outcome Eight',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'blue-9',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc74bd90-2b74-4f56-8e42-04d405e10fae/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc74bd90-2b74-4f56-8e42-04d405e10fae/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc74bd90-2b74-4f56-8e42-04d405e10fae/3',\n 'title': 'Predicted Blue (9)',\n 'description': 'Predicted Outcome Nine',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'gray-1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/144f77a2-e324-4a6b-9c17-9304fa193a27/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/144f77a2-e324-4a6b-9c17-9304fa193a27/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/144f77a2-e324-4a6b-9c17-9304fa193a27/3',\n 'title': 'Predicted Gray (1)',\n 'description': 'Predicted Gray (1)',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'gray-2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/097a4b14-b458-47eb-91b6-fe74d3dbb3f5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/097a4b14-b458-47eb-91b6-fe74d3dbb3f5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/097a4b14-b458-47eb-91b6-fe74d3dbb3f5/3',\n 'title': 'Predicted Gray (2)',\n 'description': 'Predicted Gray (2)',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'pink-1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/75e27613-caf7-4585-98f1-cb7363a69a4a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/75e27613-caf7-4585-98f1-cb7363a69a4a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/75e27613-caf7-4585-98f1-cb7363a69a4a/3',\n 'title': 'Predicted Pink (1)',\n 'description': 'Predicted Outcome One',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'pink-2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4b76d5f2-91cc-4400-adf2-908a1e6cfd1e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4b76d5f2-91cc-4400-adf2-908a1e6cfd1e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4b76d5f2-91cc-4400-adf2-908a1e6cfd1e/3',\n 'title': 'Predicted Pink (2)',\n 'description': 'Predicted Outcome Two',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'purple-noob',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a1fb3f16-14e8-4e2b-84f8-55e2b86878c8/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a1fb3f16-14e8-4e2b-84f8-55e2b86878c8/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a1fb3f16-14e8-4e2b-84f8-55e2b86878c8/3',\n 'title': 'Purple Noob',\n 'description':\n 'Watch 1 hour of Roblox content on Twitch to earn this happy little badge. EZ W.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'purple-pixel-heart---together-for-good-24',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/1afb4b76-8c34-4b7b-8beb-75f7e5d2a1ab/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/1afb4b76-8c34-4b7b-8beb-75f7e5d2a1ab/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/1afb4b76-8c34-4b7b-8beb-75f7e5d2a1ab/3',\n 'title': \"Purple Pixel Heart - Together For Good '24\",\n 'description':\n 'This badge was earned by donating $5 or more as part of Twitch Together for Good 2024!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'raging-wolf-helm',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ff668be-59a3-4e3e-96af-e6b2908b3171/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ff668be-59a3-4e3e-96af-e6b2908b3171/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ff668be-59a3-4e3e-96af-e6b2908b3171/3',\n 'title': 'Raging Wolf Helm',\n 'description':\n 'This badge was earned for watching Elden Ring during the initial Shadow of the Erdtree Expansion launch!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'raider-icon-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5007f3e0-41d4-4bda-a605-8f72cfe8c2d4/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5007f3e0-41d4-4bda-a605-8f72cfe8c2d4/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5007f3e0-41d4-4bda-a605-8f72cfe8c2d4/3',\n 'title': 'Raider Icon',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to any ARC Raiders broadcast during the campaign period',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'rainbow-six-siege-x-10th-anniversary',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/00fc50e1-dea9-47a4-9db5-ff087e91dd0d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/00fc50e1-dea9-47a4-9db5-ff087e91dd0d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/00fc50e1-dea9-47a4-9db5-ff087e91dd0d/3',\n 'title': 'Rainbow Six Siege X 10th Anniversary',\n 'description':\n 'This badge was earned by subscribing of gifting a sub to a Rainbow Six Siege X streamer during its 10th anniversary celebration!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'revedtv-stream-awards-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/03cb38fd-00cc-4ed8-8d24-ce53189ee1de/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/03cb38fd-00cc-4ed8-8d24-ce53189ee1de/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/03cb38fd-00cc-4ed8-8d24-ce53189ee1de/3',\n 'title': 'RevedTV StreamAwards 2025',\n 'description': \"This badge was earned by watching RevedTV's StreamAwards 2025.\",\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'ruby-pixel-heart---together-for-good-24',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca0aa8ce-b2a8-4582-a5de-4d5b6915dc47/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca0aa8ce-b2a8-4582-a5de-4d5b6915dc47/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca0aa8ce-b2a8-4582-a5de-4d5b6915dc47/3',\n 'title': \"Ruby Pixel Heart - Together For Good '24\",\n 'description':\n 'This badge was earned by donating $25 or more as part of Twitch Together for Good 2024!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'rudy',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/309c197a-69ed-4c15-8226-a0992f1f5b68/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/309c197a-69ed-4c15-8226-a0992f1f5b68/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/309c197a-69ed-4c15-8226-a0992f1f5b68/3',\n 'title': 'Rudy',\n 'description':\n 'This Rudy badge was earned by subscribing or gifting a sub to a Monster Hunter Stories 3: Twisted Reflection streamer during its launch!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'rustmas-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5ec1bcd1-82fa-4c42-abf1-be5b64cb63ed/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5ec1bcd1-82fa-4c42-abf1-be5b64cb63ed/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5ec1bcd1-82fa-4c42-abf1-be5b64cb63ed/3',\n 'title': 'Rustmas 2025',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a Rust streamer during Rustmas 2025!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'sajam-slam-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9fd798d6-3d67-4458-a916-9fd5d7286159/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9fd798d6-3d67-4458-a916-9fd5d7286159/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9fd798d6-3d67-4458-a916-9fd5d7286159/3',\n 'title': 'Sajam Slam Badge',\n 'description':\n 'This badge was earned by subscribing in the Street Fighter 6 category during TwitchCon 2025!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'scampuss',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/1ae8da3f-04ba-4cf1-93e8-a1f90e09aa45/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/1ae8da3f-04ba-4cf1-93e8-a1f90e09aa45/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/1ae8da3f-04ba-4cf1-93e8-a1f90e09aa45/3',\n 'title': 'Scampuss',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Nioh 3 category during the game launch.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'seeks-eye',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2ff5095e-8b37-489c-9a53-336bf806dca2/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2ff5095e-8b37-489c-9a53-336bf806dca2/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2ff5095e-8b37-489c-9a53-336bf806dca2/3',\n 'title': \"Seek's Eye\",\n 'description': 'This badge was earned by watching Roblox during the Bloxfest Qualifiers.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'social-sharing',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d2030c7e-c400-4605-a2cf-ce32bd06af8f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d2030c7e-c400-4605-a2cf-ce32bd06af8f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d2030c7e-c400-4605-a2cf-ce32bd06af8f/3',\n 'title': 'Social Media Badge',\n 'description':\n 'This user earned a Icon badge for reaching 100 views on their social posts.',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fcca0804-1da5-4d00-ab06-7677676d4d8e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fcca0804-1da5-4d00-ab06-7677676d4d8e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fcca0804-1da5-4d00-ab06-7677676d4d8e/3',\n 'title': 'Social Media Badge',\n 'description':\n 'This user earned a Pro badge for reaching 10000 views on their social posts.',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '3',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/590698dd-2bc4-4401-817a-17c641f5e881/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/590698dd-2bc4-4401-817a-17c641f5e881/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/590698dd-2bc4-4401-817a-17c641f5e881/3',\n 'title': 'Social Media Badge',\n 'description':\n 'This user earned a Legend badge for reaching 100000 views on their social posts.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'sonic-racing-crossworlds',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3c5a5ea0-714f-46da-b764-5e7ceba59fca/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3c5a5ea0-714f-46da-b764-5e7ceba59fca/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3c5a5ea0-714f-46da-b764-5e7ceba59fca/3',\n 'title': 'Sonic Racing',\n 'description':\n 'This badge was earned by subscribing to a streamer in the Sonic Racing: Crossworlds category!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'speedons-5-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/81d89508-850c-45ae-b0e2-dbbe6e531b8d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/81d89508-850c-45ae-b0e2-dbbe6e531b8d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/81d89508-850c-45ae-b0e2-dbbe6e531b8d/3',\n 'title': 'Speedons 5 Badge',\n 'description': 'This badge was earned by watching Speedons 5!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'stream-for-humanity-2-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c02fbad3-aa4b-46d0-93a6-661719a19f1c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c02fbad3-aa4b-46d0-93a6-661719a19f1c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c02fbad3-aa4b-46d0-93a6-661719a19f1c/3',\n 'title': 'Stream For Humanity 2',\n 'description': 'Earned by supporting the Stream For Humanity 2 charity marathon',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'streamer-awards-tux',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d52bd174-3509-460b-80ac-4a8d5840194b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d52bd174-3509-460b-80ac-4a8d5840194b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d52bd174-3509-460b-80ac-4a8d5840194b/3',\n 'title': 'Streamer Awards Tux',\n 'description': 'I earned this badge by watching the 2025 Streamer Awards!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'sub-gift-leader',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/21656088-7da2-4467-acd2-55220e1f45ad/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/21656088-7da2-4467-acd2-55220e1f45ad/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/21656088-7da2-4467-acd2-55220e1f45ad/3',\n 'title': 'Gifter Leader 1',\n 'description': 'Ranked as a top subscription gifter in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/0d9fe96b-97b7-4215-b5f3-5328ebad271c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/0d9fe96b-97b7-4215-b5f3-5328ebad271c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/0d9fe96b-97b7-4215-b5f3-5328ebad271c/3',\n 'title': 'Gifter Leader 2',\n 'description': 'Ranked as a top subscription gifter in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '3',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4c6e4497-eed9-4dd3-ac64-e0599d0a63e5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4c6e4497-eed9-4dd3-ac64-e0599d0a63e5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4c6e4497-eed9-4dd3-ac64-e0599d0a63e5/3',\n 'title': 'Gifter Leader 3',\n 'description': 'Ranked as a top subscription gifter in this community',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'sub-gifter',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a5ef6c17-2e5b-4d8f-9b80-2779fd722414/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a5ef6c17-2e5b-4d8f-9b80-2779fd722414/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a5ef6c17-2e5b-4d8f-9b80-2779fd722414/3',\n 'title': 'Sub Gifter',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '5',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ee113e59-c839-4472-969a-1e16d20f3962/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ee113e59-c839-4472-969a-1e16d20f3962/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ee113e59-c839-4472-969a-1e16d20f3962/3',\n 'title': '5 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '10',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d333288c-65d7-4c7b-b691-cdd7b3484bf8/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d333288c-65d7-4c7b-b691-cdd7b3484bf8/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d333288c-65d7-4c7b-b691-cdd7b3484bf8/3',\n 'title': '10 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '25',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/052a5d41-f1cc-455c-bc7b-fe841ffaf17f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/052a5d41-f1cc-455c-bc7b-fe841ffaf17f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/052a5d41-f1cc-455c-bc7b-fe841ffaf17f/3',\n 'title': '25 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '50',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4a29737-e8a5-4420-917a-314a447f083e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4a29737-e8a5-4420-917a-314a447f083e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4a29737-e8a5-4420-917a-314a447f083e/3',\n 'title': '50 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '100',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/8343ada7-3451-434e-91c4-e82bdcf54460/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/8343ada7-3451-434e-91c4-e82bdcf54460/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/8343ada7-3451-434e-91c4-e82bdcf54460/3',\n 'title': '100 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '150',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/514845ba-0fc3-4771-bce1-14d57e91e621/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/514845ba-0fc3-4771-bce1-14d57e91e621/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/514845ba-0fc3-4771-bce1-14d57e91e621/3',\n 'title': '150 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '200',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c6b1893e-8059-4024-b93c-39c84b601732/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c6b1893e-8059-4024-b93c-39c84b601732/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c6b1893e-8059-4024-b93c-39c84b601732/3',\n 'title': '200 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '250',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/cd479dc0-4a15-407d-891f-9fd2740bddda/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/cd479dc0-4a15-407d-891f-9fd2740bddda/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/cd479dc0-4a15-407d-891f-9fd2740bddda/3',\n 'title': '250 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '300',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9e1bb24f-d238-4078-871a-ac401b76ecf2/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9e1bb24f-d238-4078-871a-ac401b76ecf2/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9e1bb24f-d238-4078-871a-ac401b76ecf2/3',\n 'title': '300 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '350',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/6c4783cd-0aba-4e75-a7a4-f48a70b665b0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/6c4783cd-0aba-4e75-a7a4-f48a70b665b0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/6c4783cd-0aba-4e75-a7a4-f48a70b665b0/3',\n 'title': '350 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '400',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/6f4cab6b-def9-4d99-ad06-90b0013b28c8/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/6f4cab6b-def9-4d99-ad06-90b0013b28c8/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/6f4cab6b-def9-4d99-ad06-90b0013b28c8/3',\n 'title': '400 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '450',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/b593d68a-f8fb-4516-a09a-18cce955402c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/b593d68a-f8fb-4516-a09a-18cce955402c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/b593d68a-f8fb-4516-a09a-18cce955402c/3',\n 'title': '450 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '500',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/60e9504c-8c3d-489f-8a74-314fb195ad8d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/60e9504c-8c3d-489f-8a74-314fb195ad8d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/60e9504c-8c3d-489f-8a74-314fb195ad8d/3',\n 'title': '500 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '550',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/024d2563-1794-43ed-b8dc-33df3efae900/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/024d2563-1794-43ed-b8dc-33df3efae900/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/024d2563-1794-43ed-b8dc-33df3efae900/3',\n 'title': '550 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '600',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ecc3aab-09bf-4823-905e-3a4647171fc1/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ecc3aab-09bf-4823-905e-3a4647171fc1/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ecc3aab-09bf-4823-905e-3a4647171fc1/3',\n 'title': '600 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '650',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/eeabf43c-8e4c-448d-9790-4c2172c57944/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/eeabf43c-8e4c-448d-9790-4c2172c57944/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/eeabf43c-8e4c-448d-9790-4c2172c57944/3',\n 'title': '650 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '700',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4a9acdc7-30be-4dd1-9898-fc9e42b3d304/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4a9acdc7-30be-4dd1-9898-fc9e42b3d304/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4a9acdc7-30be-4dd1-9898-fc9e42b3d304/3',\n 'title': '700 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '750',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca17277c-53e5-422b-8bb4-7c5dcdb0ac67/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca17277c-53e5-422b-8bb4-7c5dcdb0ac67/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca17277c-53e5-422b-8bb4-7c5dcdb0ac67/3',\n 'title': '750 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '800',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9c1fb96d-0579-43d7-ba94-94672eaef63a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9c1fb96d-0579-43d7-ba94-94672eaef63a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9c1fb96d-0579-43d7-ba94-94672eaef63a/3',\n 'title': '800 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '850',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/cc924aaf-dfd4-4f3f-822a-f5a87eb24069/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/cc924aaf-dfd4-4f3f-822a-f5a87eb24069/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/cc924aaf-dfd4-4f3f-822a-f5a87eb24069/3',\n 'title': '850 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '900',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/193d86f6-83e1-428c-9638-d6ca9e408166/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/193d86f6-83e1-428c-9638-d6ca9e408166/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/193d86f6-83e1-428c-9638-d6ca9e408166/3',\n 'title': '900 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '950',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/7ce130bd-6f55-40cc-9231-e2a4cb712962/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/7ce130bd-6f55-40cc-9231-e2a4cb712962/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/7ce130bd-6f55-40cc-9231-e2a4cb712962/3',\n 'title': '950 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '1000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/bfb7399a-c632-42f7-8d5f-154610dede81/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/bfb7399a-c632-42f7-8d5f-154610dede81/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/bfb7399a-c632-42f7-8d5f-154610dede81/3',\n 'title': '1000 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '2000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4e8b3a32-1513-44ad-8a12-6c90232c77f9/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4e8b3a32-1513-44ad-8a12-6c90232c77f9/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4e8b3a32-1513-44ad-8a12-6c90232c77f9/3',\n 'title': '2000 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '3000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/b18852ba-65d2-4b84-97d2-aeb6c44a0956/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/b18852ba-65d2-4b84-97d2-aeb6c44a0956/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/b18852ba-65d2-4b84-97d2-aeb6c44a0956/3',\n 'title': '3000 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '4000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/efbf3c93-ecfa-4b67-8d0a-1f732fb07397/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/efbf3c93-ecfa-4b67-8d0a-1f732fb07397/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/efbf3c93-ecfa-4b67-8d0a-1f732fb07397/3',\n 'title': '4000 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '5000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d775275d-fd19-4914-b63a-7928a22135c3/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d775275d-fd19-4914-b63a-7928a22135c3/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d775275d-fd19-4914-b63a-7928a22135c3/3',\n 'title': '5000 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'subscriber',\n 'versions': [\n {\n 'id': '0',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/3',\n 'title': 'Subscriber',\n 'description': 'Subscriber',\n 'click_action': 'subscribe_to_channel',\n 'click_url': null,\n },\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/3',\n 'title': 'Subscriber',\n 'description': 'Subscriber',\n 'click_action': 'subscribe_to_channel',\n 'click_url': null,\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/25a03e36-2bb2-4625-bd37-d6d9d406238d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/25a03e36-2bb2-4625-bd37-d6d9d406238d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/25a03e36-2bb2-4625-bd37-d6d9d406238d/3',\n 'title': '2-Month Subscriber',\n 'description': '2-Month Subscriber',\n 'click_action': 'subscribe_to_channel',\n 'click_url': null,\n },\n {\n 'id': '3',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e8984705-d091-4e54-8241-e53b30a84b0e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e8984705-d091-4e54-8241-e53b30a84b0e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e8984705-d091-4e54-8241-e53b30a84b0e/3',\n 'title': '3-Month Subscriber',\n 'description': '3-Month Subscriber',\n 'click_action': 'subscribe_to_channel',\n 'click_url': null,\n },\n {\n 'id': '4',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2d2485f6-d19b-4daa-8393-9493b019156b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2d2485f6-d19b-4daa-8393-9493b019156b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2d2485f6-d19b-4daa-8393-9493b019156b/3',\n 'title': '6-Month Subscriber',\n 'description': '6-Month Subscriber',\n 'click_action': 'subscribe_to_channel',\n 'click_url': null,\n },\n {\n 'id': '5',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/b4e6b13a-a76f-4c56-87e1-9375a7aaa610/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/b4e6b13a-a76f-4c56-87e1-9375a7aaa610/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/b4e6b13a-a76f-4c56-87e1-9375a7aaa610/3',\n 'title': '9-Month Subscriber',\n 'description': '9-Month Subscriber',\n 'click_action': 'subscribe_to_channel',\n 'click_url': null,\n },\n {\n 'id': '6',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed51a614-2c44-4a60-80b6-62908436b43a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed51a614-2c44-4a60-80b6-62908436b43a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed51a614-2c44-4a60-80b6-62908436b43a/3',\n 'title': '6-Month Subscriber',\n 'description': '1-Year Subscriber',\n 'click_action': 'subscribe_to_channel',\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'subtember-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a9c01f28-179e-486d-a4c7-2277e4f6adb4/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a9c01f28-179e-486d-a4c7-2277e4f6adb4/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a9c01f28-179e-486d-a4c7-2277e4f6adb4/3',\n 'title': 'SUBtember 2025',\n 'description': 'Badge given to users who sub, gift, or use bits during SUBtember 2025.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'superultracombo-2023',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5864739a-5e58-4623-9450-a2c0555ef90b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5864739a-5e58-4623-9450-a2c0555ef90b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5864739a-5e58-4623-9450-a2c0555ef90b/3',\n 'title': 'SuperUltraCombo 2023',\n 'description': \"This user joined Twitch's SuperUltraCombo 2023\",\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'survival-cup-4',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9ff55f50-2c2a-40c2-9863-158d5ac2d5fd/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9ff55f50-2c2a-40c2-9863-158d5ac2d5fd/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9ff55f50-2c2a-40c2-9863-158d5ac2d5fd/3',\n 'title': 'Survival Cup 4',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a streamer during Survival Cup 4!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'tft-paris-open',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5688799-c50c-4878-b451-de78f3ef6a56/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5688799-c50c-4878-b451-de78f3ef6a56/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5688799-c50c-4878-b451-de78f3ef6a56/3',\n 'title': 'TFT Paris Open',\n 'description':\n 'This chat badge was awarded for gifting two subscriptions to a TFT streamer during the 2025 TFT Paris Open!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'the-deer',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5f026869-a186-4f98-bb11-3eb148633d85/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5f026869-a186-4f98-bb11-3eb148633d85/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5f026869-a186-4f98-bb11-3eb148633d85/3',\n 'title': 'The Deer',\n 'description': 'This badge was earned by watching Roblox during the Bloxfest Qualifiers.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'the-first-descendant-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a56ef091-e8cd-49bd-9de9-7b342c9a7e7e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a56ef091-e8cd-49bd-9de9-7b342c9a7e7e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a56ef091-e8cd-49bd-9de9-7b342c9a7e7e/3',\n 'title': 'The First Descendant Badge',\n 'description':\n 'This badge was earned by subscribing to a streamer playing The First Descendant during launch week!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'the-man-without-fear',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4ca893e7-6ee3-4437-acdd-071340913d3c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4ca893e7-6ee3-4437-acdd-071340913d3c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4ca893e7-6ee3-4437-acdd-071340913d3c/3',\n 'title': 'The Man Without Fear',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Marvel Rivals category for the start of Season 4.5!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'the-onryos-mask',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e0d21894-8d58-4266-9127-b1bd61177899/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e0d21894-8d58-4266-9127-b1bd61177899/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e0d21894-8d58-4266-9127-b1bd61177899/3',\n 'title': \"The Onryō's Mask\",\n 'description':\n \"This badge was earned by subscribing to a Ghost of Yotei streamer during the game's launch!\",\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'together-for-good-25---good-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/192fb627-82b3-46e8-95d3-ac9feba4b1bc/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/192fb627-82b3-46e8-95d3-ac9feba4b1bc/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/192fb627-82b3-46e8-95d3-ac9feba4b1bc/3',\n 'title': \"Together for Good '25 - Good Badge\",\n 'description':\n 'This badge was earned by donating $5 or more during Twitch Together for Good 2025!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'together-for-good-25---gooder-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/84a37e81-9d61-4c29-970e-64a32ec040c7/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/84a37e81-9d61-4c29-970e-64a32ec040c7/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/84a37e81-9d61-4c29-970e-64a32ec040c7/3',\n 'title': \"Together for Good '25 - Gooder Badge\",\n 'description':\n 'This badge was earned by donating $50 or more during Twitch Together for Good 2025!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'together-for-good-25---goodest-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/928b8033-3777-49cb-a056-230135a08a62/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/928b8033-3777-49cb-a056-230135a08a62/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/928b8033-3777-49cb-a056-230135a08a62/3',\n 'title': \"Together for Good '25 - Goodest Badge\",\n 'description':\n 'This badge was earned by donating $100 or more during Twitch Together for Good 2025!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'together-for-good-25---wicked-dub-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9ddae219-6674-4fbc-add9-6e4e6572ea8e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9ddae219-6674-4fbc-add9-6e4e6572ea8e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9ddae219-6674-4fbc-add9-6e4e6572ea8e/3',\n 'title': \"Together for Good '25 - Wicked Dub Badge\",\n 'description':\n 'This badge was earned by donating at least $5 to a charity stream using Stream Together during Together for Good 2025!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'total-war-anniversary',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/17604bfd-aeb6-427d-bd0e-cae93bed6f36/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/17604bfd-aeb6-427d-bd0e-cae93bed6f36/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/17604bfd-aeb6-427d-bd0e-cae93bed6f36/3',\n 'title': 'Total War Anniversary',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Total War: Warhammer III category during the Total War 25th Anniversary.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'toxic-zombie',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ccdf9673-a0b8-4bc1-a40f-105b8b951f98/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ccdf9673-a0b8-4bc1-a40f-105b8b951f98/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ccdf9673-a0b8-4bc1-a40f-105b8b951f98/3',\n 'title': 'Toxic Zombie',\n 'description':\n 'Purchase 1 new recurring or gift subscription during the Toxic Commando launch 2026 and claim the reward',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'turbo',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/bd444ec6-8f34-4bf9-91f4-af1e3428d80f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/bd444ec6-8f34-4bf9-91f4-af1e3428d80f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/bd444ec6-8f34-4bf9-91f4-af1e3428d80f/3',\n 'title': 'Turbo',\n 'description': \"A subscriber of Twitch's monthly premium user service\",\n 'click_action': 'turbo',\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'twitchcon-2026-europe-row-houses',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4a354d32-ca7f-4d6f-815a-f80be9c7c088/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4a354d32-ca7f-4d6f-815a-f80be9c7c088/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4a354d32-ca7f-4d6f-815a-f80be9c7c088/3',\n 'title': 'TwitchCon 2026 - Europe - Row Houses',\n 'description':\n 'This badge is given to anyone who purchased a 1-day ticket to TwitchCon Europe 2026.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'twitchcon-2026-europe-windmill',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed34b8e2-7c1c-4551-b4d7-63b44d61fb31/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed34b8e2-7c1c-4551-b4d7-63b44d61fb31/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed34b8e2-7c1c-4551-b4d7-63b44d61fb31/3',\n 'title': 'TwitchCon 2026 - Europe - Windmill',\n 'description':\n 'This badge is given to anyone who purchased a 2-day ticket to TwitchCon Europe 2026.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'umbrella-corporation',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/995ff00f-c16c-4782-86ba-f2d7668dc6a2/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/995ff00f-c16c-4782-86ba-f2d7668dc6a2/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/995ff00f-c16c-4782-86ba-f2d7668dc6a2/3',\n 'title': 'Umbrella Corporation',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a Resident Evil: Requiem streamer.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'user-anniversary',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ccbbedaa-f4db-4d0b-9c2a-375de7ad947c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ccbbedaa-f4db-4d0b-9c2a-375de7ad947c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ccbbedaa-f4db-4d0b-9c2a-375de7ad947c/3',\n 'title': 'Twitchiversary Badge',\n 'description': 'Staff badge celebrating Twitch tenure',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'vct-paris-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/63c91cf1-53d1-4ee9-821f-b4d6e4144e8e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/63c91cf1-53d1-4ee9-821f-b4d6e4144e8e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/63c91cf1-53d1-4ee9-821f-b4d6e4144e8e/3',\n 'title': 'VCT Paris 2025',\n 'description':\n 'This badge was earned by subscribing to a VALORANT streamer while watching VALORANT Champions 2025!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'yellow-noob',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d87a78f5-76d9-451f-8f31-752a369e6045/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d87a78f5-76d9-451f-8f31-752a369e6045/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d87a78f5-76d9-451f-8f31-752a369e6045/3',\n 'title': 'Yellow Noob',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Roblox category during Bloxfest.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'zevent-2024',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2040d479-b815-4617-8a55-9aed027e30d0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2040d479-b815-4617-8a55-9aed027e30d0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2040d479-b815-4617-8a55-9aed027e30d0/3',\n 'title': 'ZEVENT 2024',\n 'description': 'This badge was earned for watching ZEVENT 2024!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'zevent25',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/7c39aa87-4659-4e8f-abaf-c29614cd8a29/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/7c39aa87-4659-4e8f-abaf-c29614cd8a29/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/7c39aa87-4659-4e8f-abaf-c29614cd8a29/3',\n 'title': 'ZEVENT25',\n 'description': 'This badge was earned by watching a ZEvent25 stream.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n];\n","export const css_color_names = [\n 'aliceblue',\n 'antiquewhite',\n 'aqua',\n 'aquamarine',\n 'azure',\n 'beige',\n 'bisque',\n 'black',\n 'blanchedalmond',\n 'blue',\n 'blueviolet',\n 'brown',\n 'burlywood',\n 'cadetblue',\n 'chartreuse',\n 'chocolate',\n 'coral',\n 'cornflowerblue',\n 'cornsilk',\n 'crimson',\n 'cyan',\n 'darkblue',\n 'darkcyan',\n 'darkgoldenrod',\n 'darkgray',\n 'darkgreen',\n 'darkgrey',\n 'darkkhaki',\n 'darkmagenta',\n 'darkolivegreen',\n 'darkorange',\n 'darkorchid',\n 'darkred',\n 'darksalmon',\n 'darkseagreen',\n 'darkslateblue',\n 'darkslategray',\n 'darkslategrey',\n 'darkturquoise',\n 'darkviolet',\n 'deeppink',\n 'deepskyblue',\n 'dimgray',\n 'dimgrey',\n 'dodgerblue',\n 'firebrick',\n 'floralwhite',\n 'forestgreen',\n 'fuchsia',\n 'gainsboro',\n 'ghostwhite',\n 'gold',\n 'goldenrod',\n 'gray',\n 'green',\n 'greenyellow',\n 'grey',\n 'honeydew',\n 'hotpink',\n 'indianred',\n 'indigo',\n 'ivory',\n 'khaki',\n 'lavender',\n 'lavenderblush',\n 'lawngreen',\n 'lemonchiffon',\n 'lightblue',\n 'lightcoral',\n 'lightcyan',\n 'lightgoldenrodyellow',\n 'lightgray',\n 'lightgreen',\n 'lightgrey',\n 'lightpink',\n 'lightsalmon',\n 'lightseagreen',\n 'lightskyblue',\n 'lightslategray',\n 'lightslategrey',\n 'lightsteelblue',\n 'lightyellow',\n 'lime',\n 'limegreen',\n 'linen',\n 'magenta',\n 'maroon',\n 'mediumaquamarine',\n 'mediumblue',\n 'mediumorchid',\n 'mediumpurple',\n 'mediumseagreen',\n 'mediumslateblue',\n 'mediumspringgreen',\n 'mediumturquoise',\n 'mediumvioletred',\n 'midnightblue',\n 'mintcream',\n 'mistyrose',\n 'moccasin',\n 'navajowhite',\n 'navy',\n 'oldlace',\n 'olive',\n 'olivedrab',\n 'orange',\n 'orangered',\n 'orchid',\n 'palegoldenrod',\n 'palegreen',\n 'paleturquoise',\n 'palevioletred',\n 'papayawhip',\n 'peachpuff',\n 'peru',\n 'pink',\n 'plum',\n 'powderblue',\n 'purple',\n 'rebeccapurple',\n 'red',\n 'rosybrown',\n 'royalblue',\n 'saddlebrown',\n 'salmon',\n 'sandybrown',\n 'seagreen',\n 'seashell',\n 'sienna',\n 'silver',\n 'skyblue',\n 'slateblue',\n 'slategray',\n 'slategrey',\n 'snow',\n 'springgreen',\n 'steelblue',\n 'tan',\n 'teal',\n 'thistle',\n 'tomato',\n 'turquoise',\n 'violet',\n 'wheat',\n 'white',\n 'whitesmoke',\n 'yellow',\n 'yellowgreen',\n 'transparent',\n];\n","import { BttvEmote, SeventvEmote, TwitchEmote } from '../../types/emote.js';\n\nconst SeventvEmotes = [\n {\n 'id': '01FCY771D800007PQ2DF3GDTN6',\n 'name': 'RainTime',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01FCY771D800007PQ2DF3GDTN6/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01FCY771D800007PQ2DF3GDTN6/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01FCY771D800007PQ2DF3GDTN6/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01FCY771D800007PQ2DF3GDTN6/4x.webp',\n },\n },\n {\n 'id': '01FE3XY508000AA32JP519W2EW',\n 'name': 'PETPET',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/4x.webp',\n },\n },\n {\n 'id': '01GGD5PJA8000FH13S498E9D8X',\n 'name': 'ppL',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GGD5PJA8000FH13S498E9D8X/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GGD5PJA8000FH13S498E9D8X/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GGD5PJA8000FH13S498E9D8X/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GGD5PJA8000FH13S498E9D8X/4x.webp',\n },\n },\n {\n 'id': '01GB2TN09G000AZXHZ8HNEZX6G',\n 'name': 'Clap2',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB2TN09G000AZXHZ8HNEZX6G/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB2TN09G000AZXHZ8HNEZX6G/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB2TN09G000AZXHZ8HNEZX6G/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB2TN09G000AZXHZ8HNEZX6G/4x.webp',\n },\n },\n {\n 'id': '01GAM8EFQ00004MXFXAJYKA859',\n 'name': 'Clap',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GAM8EFQ00004MXFXAJYKA859/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GAM8EFQ00004MXFXAJYKA859/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GAM8EFQ00004MXFXAJYKA859/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GAM8EFQ00004MXFXAJYKA859/4x.webp',\n },\n },\n {\n 'id': '01GAFTZ9K80003DHH026MC7JW0',\n 'name': 'PepePls',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GAFTZ9K80003DHH026MC7JW0/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GAFTZ9K80003DHH026MC7JW0/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GAFTZ9K80003DHH026MC7JW0/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GAFTZ9K80003DHH026MC7JW0/4x.webp',\n },\n },\n {\n 'id': '01GAZ199Z8000FEWHS6AT5QZV0',\n 'name': 'peepoHappy',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GAZ199Z8000FEWHS6AT5QZV0/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GAZ199Z8000FEWHS6AT5QZV0/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GAZ199Z8000FEWHS6AT5QZV0/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GAZ199Z8000FEWHS6AT5QZV0/4x.webp',\n },\n },\n {\n 'id': '01GAZ4SBX80007YCE2RXBT44B2',\n 'name': 'peepoSad',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GAZ4SBX80007YCE2RXBT44B2/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GAZ4SBX80007YCE2RXBT44B2/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GAZ4SBX80007YCE2RXBT44B2/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GAZ4SBX80007YCE2RXBT44B2/4x.webp',\n },\n },\n {\n 'id': '01GB9W8JN80004CKF2H1TWA99H',\n 'name': 'FeelsDankMan',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB9W8JN80004CKF2H1TWA99H/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB9W8JN80004CKF2H1TWA99H/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB9W8JN80004CKF2H1TWA99H/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB9W8JN80004CKF2H1TWA99H/4x.webp',\n },\n },\n {\n 'id': '01GB2S7H7000018VJGJ4A9BMFS',\n 'name': 'BillyApprove',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB2S7H7000018VJGJ4A9BMFS/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB2S7H7000018VJGJ4A9BMFS/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB2S7H7000018VJGJ4A9BMFS/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB2S7H7000018VJGJ4A9BMFS/4x.webp',\n },\n },\n {\n 'id': '01GB8EQNJ8000497KFBZWNSDFZ',\n 'name': 'forsenPls',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB8EQNJ8000497KFBZWNSDFZ/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB8EQNJ8000497KFBZWNSDFZ/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB8EQNJ8000497KFBZWNSDFZ/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB8EQNJ8000497KFBZWNSDFZ/4x.webp',\n },\n },\n {\n 'id': '01GB54CZTG0004ZBZEDT30HE2M',\n 'name': 'RoxyPotato',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB54CZTG0004ZBZEDT30HE2M/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB54CZTG0004ZBZEDT30HE2M/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB54CZTG0004ZBZEDT30HE2M/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB54CZTG0004ZBZEDT30HE2M/4x.webp',\n },\n },\n {\n 'id': '01GB4P2HX0000BJ5HR8F6XV9Q0',\n 'name': 'gachiBASS',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB4P2HX0000BJ5HR8F6XV9Q0/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB4P2HX0000BJ5HR8F6XV9Q0/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB4P2HX0000BJ5HR8F6XV9Q0/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB4P2HX0000BJ5HR8F6XV9Q0/4x.webp',\n },\n },\n {\n 'id': '01GKQXGX1R000216YB0K7GN92X',\n 'name': '(7TV)',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GKQXGX1R000216YB0K7GN92X/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GKQXGX1R000216YB0K7GN92X/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GKQXGX1R000216YB0K7GN92X/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GKQXGX1R000216YB0K7GN92X/4x.webp',\n },\n },\n {\n 'id': '01FKSDK14G0008TM5NY9QEG0QV',\n 'name': 'PartyParrot',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01FKSDK14G0008TM5NY9QEG0QV/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01FKSDK14G0008TM5NY9QEG0QV/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01FKSDK14G0008TM5NY9QEG0QV/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01FKSDK14G0008TM5NY9QEG0QV/4x.webp',\n },\n },\n {\n 'id': '01GB5VC57000003DZTMZQNY944',\n 'name': 'RebeccaBlack',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB5VC57000003DZTMZQNY944/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB5VC57000003DZTMZQNY944/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB5VC57000003DZTMZQNY944/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB5VC57000003DZTMZQNY944/4x.webp',\n },\n },\n {\n 'id': '01F014S6KG0007E4VV006YKSM3',\n 'name': 'reckH',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01F014S6KG0007E4VV006YKSM3/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01F014S6KG0007E4VV006YKSM3/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01F014S6KG0007E4VV006YKSM3/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01F014S6KG0007E4VV006YKSM3/4x.webp',\n },\n },\n {\n 'id': '01G98W833R0000BRQD106P0ZNT',\n 'name': 'WAYTOODANK',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01G98W833R0000BRQD106P0ZNT/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01G98W833R0000BRQD106P0ZNT/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01G98W833R0000BRQD106P0ZNT/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01G98W833R0000BRQD106P0ZNT/4x.webp',\n },\n },\n {\n 'id': '01GB2ZJFBG000DTBJYANG8XYFP',\n 'name': 'AlienDance',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB2ZJFBG000DTBJYANG8XYFP/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB2ZJFBG000DTBJYANG8XYFP/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB2ZJFBG000DTBJYANG8XYFP/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB2ZJFBG000DTBJYANG8XYFP/4x.webp',\n },\n },\n {\n 'id': '01G4GQC5H0000D3DGNAYJJP8EB',\n 'name': 'Gayge',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01G4GQC5H0000D3DGNAYJJP8EB/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01G4GQC5H0000D3DGNAYJJP8EB/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01G4GQC5H0000D3DGNAYJJP8EB/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01G4GQC5H0000D3DGNAYJJP8EB/4x.webp',\n },\n },\n {\n 'id': '01GGCQPCGR000C7MT8JZGP6E89',\n 'name': 'ApuApustaja',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GGCQPCGR000C7MT8JZGP6E89/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GGCQPCGR000C7MT8JZGP6E89/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GGCQPCGR000C7MT8JZGP6E89/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GGCQPCGR000C7MT8JZGP6E89/4x.webp',\n },\n },\n {\n 'id': '01GB9W2CDG000BFSD141G0MGSA',\n 'name': 'BasedGod',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB9W2CDG000BFSD141G0MGSA/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB9W2CDG000BFSD141G0MGSA/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB9W2CDG000BFSD141G0MGSA/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB9W2CDG000BFSD141G0MGSA/4x.webp',\n },\n },\n {\n 'id': '01G98V5RFG0001CD052SPS435F',\n 'name': 'GuitarTime',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01G98V5RFG0001CD052SPS435F/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01G98V5RFG0001CD052SPS435F/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01G98V5RFG0001CD052SPS435F/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01G98V5RFG0001CD052SPS435F/4x.webp',\n },\n },\n {\n 'id': '01HM524VE80004SKSHMCZWXH1T',\n 'name': 'peepoPls',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01HM524VE80004SKSHMCZWXH1T/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01HM524VE80004SKSHMCZWXH1T/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01HM524VE80004SKSHMCZWXH1T/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01HM524VE80004SKSHMCZWXH1T/4x.webp',\n },\n },\n {\n 'id': '01HM4P26CR000449DZBT4FVMA5',\n 'name': 'TeaTime',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01HM4P26CR000449DZBT4FVMA5/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01HM4P26CR000449DZBT4FVMA5/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01HM4P26CR000449DZBT4FVMA5/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01HM4P26CR000449DZBT4FVMA5/4x.webp',\n },\n },\n {\n 'id': '01HM4PGHC80007635TAZG67FT5',\n 'name': 'WineTime',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01HM4PGHC80007635TAZG67FT5/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01HM4PGHC80007635TAZG67FT5/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01HM4PGHC80007635TAZG67FT5/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01HM4PGHC80007635TAZG67FT5/4x.webp',\n },\n },\n {\n 'id': '01G98V81Q80000BRQD106P0ZEK',\n 'name': 'PianoTime',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01G98V81Q80000BRQD106P0ZEK/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01G98V81Q80000BRQD106P0ZEK/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01G98V81Q80000BRQD106P0ZEK/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01G98V81Q80000BRQD106P0ZEK/4x.webp',\n },\n },\n {\n 'id': '01G98TT6BR000A39K5ZSQFTPWR',\n 'name': 'CrayonTime',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01G98TT6BR000A39K5ZSQFTPWR/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01G98TT6BR000A39K5ZSQFTPWR/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01G98TT6BR000A39K5ZSQFTPWR/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01G98TT6BR000A39K5ZSQFTPWR/4x.webp',\n },\n },\n {\n 'id': '01HM6NJ2X000035ZKVAPWBNW26',\n 'name': 'nymnCorn',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01HM6NJ2X000035ZKVAPWBNW26/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01HM6NJ2X000035ZKVAPWBNW26/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01HM6NJ2X000035ZKVAPWBNW26/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01HM6NJ2X000035ZKVAPWBNW26/4x.webp',\n },\n },\n {\n 'id': '01HM2F7Q1R00022X3E2804NBNQ',\n 'name': 'SteerR',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01HM2F7Q1R00022X3E2804NBNQ/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01HM2F7Q1R00022X3E2804NBNQ/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01HM2F7Q1R00022X3E2804NBNQ/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01HM2F7Q1R00022X3E2804NBNQ/4x.webp',\n },\n },\n {\n 'id': '01J107C3E8000DX4MZBQSYGRXS',\n 'name': 'sevenTV',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01J107C3E8000DX4MZBQSYGRXS/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01J107C3E8000DX4MZBQSYGRXS/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01J107C3E8000DX4MZBQSYGRXS/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01J107C3E8000DX4MZBQSYGRXS/4x.webp',\n },\n },\n {\n 'id': '01FTEZEE900001E12995B12GR4',\n 'name': 'nanaAYAYA',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01FTEZEE900001E12995B12GR4/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01FTEZEE900001E12995B12GR4/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01FTEZEE900001E12995B12GR4/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01FTEZEE900001E12995B12GR4/4x.webp',\n },\n },\n {\n 'id': '01J8NMZ2HG0005G1FWF2H9Y615',\n 'name': 'BibleThump',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01J8NMZ2HG0005G1FWF2H9Y615/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01J8NMZ2HG0005G1FWF2H9Y615/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01J8NMZ2HG0005G1FWF2H9Y615/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01J8NMZ2HG0005G1FWF2H9Y615/4x.webp',\n },\n },\n {\n 'id': '01H16FA16G0005EZED5J0EY7KN',\n 'name': 'glorp',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01H16FA16G0005EZED5J0EY7KN/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01H16FA16G0005EZED5J0EY7KN/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01H16FA16G0005EZED5J0EY7KN/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01H16FA16G0005EZED5J0EY7KN/4x.webp',\n },\n },\n {\n 'id': '01GG3YGWK8000DWE419062SG28',\n 'name': 'Stare',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GG3YGWK8000DWE419062SG28/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GG3YGWK8000DWE419062SG28/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GG3YGWK8000DWE419062SG28/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GG3YGWK8000DWE419062SG28/4x.webp',\n },\n },\n {\n 'id': '01JY2MX5BE5BVWWFV153ANMMHZ',\n 'name': 'aceStare',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01JY2MX5BE5BVWWFV153ANMMHZ/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01JY2MX5BE5BVWWFV153ANMMHZ/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01JY2MX5BE5BVWWFV153ANMMHZ/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01JY2MX5BE5BVWWFV153ANMMHZ/4x.webp',\n },\n },\n {\n 'id': '01F9EM2ETG000E7SC8F953GXCX',\n 'name': 'gachiGASM',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01F9EM2ETG000E7SC8F953GXCX/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01F9EM2ETG000E7SC8F953GXCX/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01F9EM2ETG000E7SC8F953GXCX/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01F9EM2ETG000E7SC8F953GXCX/4x.webp',\n },\n },\n {\n 'id': '01GB32XE6R00018VJGJ4A9BNCV',\n 'name': 'AYAYA',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/4x.webp',\n },\n },\n {\n 'id': '01GB4XE3ZR000DKFRGM9Q1M7VS',\n 'name': 'RareParrot',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB4XE3ZR000DKFRGM9Q1M7VS/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB4XE3ZR000DKFRGM9Q1M7VS/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB4XE3ZR000DKFRGM9Q1M7VS/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB4XE3ZR000DKFRGM9Q1M7VS/4x.webp',\n },\n },\n {\n 'id': '01GB4FWTR8000DGEZ8VYY59RBN',\n 'name': 'FeelsWeirdMan',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB4FWTR8000DGEZ8VYY59RBN/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB4FWTR8000DGEZ8VYY59RBN/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB4FWTR8000DGEZ8VYY59RBN/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB4FWTR8000DGEZ8VYY59RBN/4x.webp',\n },\n },\n {\n 'id': '01GB4CK01800090V9B3D8CGEEX',\n 'name': 'EZ',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB4CK01800090V9B3D8CGEEX/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB4CK01800090V9B3D8CGEEX/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB4CK01800090V9B3D8CGEEX/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB4CK01800090V9B3D8CGEEX/4x.webp',\n },\n },\n {\n 'id': '01GB46137R000BJ5HR8F6XV8J1',\n 'name': 'FeelsOkayMan',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB46137R000BJ5HR8F6XV8J1/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB46137R000BJ5HR8F6XV8J1/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB46137R000BJ5HR8F6XV8J1/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB46137R000BJ5HR8F6XV8J1/4x.webp',\n },\n },\n {\n 'id': '01GB4EV0Q800090V9B3D8CGEHV',\n 'name': 'FeelsStrongMan',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB4EV0Q800090V9B3D8CGEHV/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB4EV0Q800090V9B3D8CGEHV/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB4EV0Q800090V9B3D8CGEHV/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB4EV0Q800090V9B3D8CGEHV/4x.webp',\n },\n },\n {\n 'id': '01GBFDVP18000CRDCG0DV7KEMY',\n 'name': '7Cinema',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GBFDVP18000CRDCG0DV7KEMY/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GBFDVP18000CRDCG0DV7KEMY/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GBFDVP18000CRDCG0DV7KEMY/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GBFDVP18000CRDCG0DV7KEMY/4x.webp',\n },\n },\n];\n\nconst BttvEmotes = [\n {\n 'id': '54fa8f1401e468494b85b537',\n 'name': ':tf:',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fa8f1401e468494b85b537/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa8f1401e468494b85b537/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa8f1401e468494b85b537/3x',\n },\n },\n {\n 'id': '54fa8fce01e468494b85b53c',\n 'name': 'CiGrip',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fa8fce01e468494b85b53c/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa8fce01e468494b85b53c/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa8fce01e468494b85b53c/3x',\n },\n },\n {\n 'id': '54fa903b01e468494b85b53f',\n 'name': 'DatSauce',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fa903b01e468494b85b53f/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa903b01e468494b85b53f/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa903b01e468494b85b53f/3x',\n },\n },\n {\n 'id': '54fa909b01e468494b85b542',\n 'name': 'ForeverAlone',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fa909b01e468494b85b542/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa909b01e468494b85b542/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa909b01e468494b85b542/3x',\n },\n },\n {\n 'id': '54fa90ba01e468494b85b543',\n 'name': 'GabeN',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fa90ba01e468494b85b543/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa90ba01e468494b85b543/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa90ba01e468494b85b543/3x',\n },\n },\n {\n 'id': '54fa90f201e468494b85b545',\n 'name': 'HailHelix',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fa90f201e468494b85b545/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa90f201e468494b85b545/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa90f201e468494b85b545/3x',\n },\n },\n {\n 'id': '54fa932201e468494b85b555',\n 'name': 'ShoopDaWhoop',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fa932201e468494b85b555/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa932201e468494b85b555/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa932201e468494b85b555/3x',\n },\n },\n {\n 'id': '54fab45f633595ca4c713abc',\n 'name': 'M&Mjc',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fab45f633595ca4c713abc/1x',\n '2': 'https://cdn.betterttv.net/emote/54fab45f633595ca4c713abc/2x',\n '4': 'https://cdn.betterttv.net/emote/54fab45f633595ca4c713abc/3x',\n },\n },\n {\n 'id': '54fab7d2633595ca4c713abf',\n 'name': 'bttvNice',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fab7d2633595ca4c713abf/1x',\n '2': 'https://cdn.betterttv.net/emote/54fab7d2633595ca4c713abf/2x',\n '4': 'https://cdn.betterttv.net/emote/54fab7d2633595ca4c713abf/3x',\n },\n },\n {\n 'id': '54fa935601e468494b85b557',\n 'name': 'TwaT',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fa935601e468494b85b557/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa935601e468494b85b557/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa935601e468494b85b557/3x',\n },\n },\n {\n 'id': '54fa99b601e468494b85b55d',\n 'name': 'WatChuSay',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fa99b601e468494b85b55d/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa99b601e468494b85b55d/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa99b601e468494b85b55d/3x',\n },\n },\n {\n 'id': '566ca11a65dbbdab32ec0558',\n 'name': 'tehPoleCat',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566ca11a65dbbdab32ec0558/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca11a65dbbdab32ec0558/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca11a65dbbdab32ec0558/3x',\n },\n },\n {\n 'id': '566ca1a365dbbdab32ec055b',\n 'name': 'AngelThump',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566ca1a365dbbdab32ec055b/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca1a365dbbdab32ec055b/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca1a365dbbdab32ec055b/3x',\n },\n },\n {\n 'id': '54fbefeb01abde735115de5b',\n 'name': 'TaxiBro',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fbefeb01abde735115de5b/1x',\n '2': 'https://cdn.betterttv.net/emote/54fbefeb01abde735115de5b/2x',\n '4': 'https://cdn.betterttv.net/emote/54fbefeb01abde735115de5b/3x',\n },\n },\n {\n 'id': '54fbf00a01abde735115de5c',\n 'name': 'BroBalt',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fbf00a01abde735115de5c/1x',\n '2': 'https://cdn.betterttv.net/emote/54fbf00a01abde735115de5c/2x',\n '4': 'https://cdn.betterttv.net/emote/54fbf00a01abde735115de5c/3x',\n },\n },\n {\n 'id': '54fbf09c01abde735115de61',\n 'name': 'CandianRage',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fbf09c01abde735115de61/1x',\n '2': 'https://cdn.betterttv.net/emote/54fbf09c01abde735115de61/2x',\n '4': 'https://cdn.betterttv.net/emote/54fbf09c01abde735115de61/3x',\n },\n },\n {\n 'id': '55028cd2135896936880fdd7',\n 'name': 'D:',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/55028cd2135896936880fdd7/1x',\n '2': 'https://cdn.betterttv.net/emote/55028cd2135896936880fdd7/2x',\n '4': 'https://cdn.betterttv.net/emote/55028cd2135896936880fdd7/3x',\n },\n },\n {\n 'id': '550352766f86a5b26c281ba2',\n 'name': 'VisLaud',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/550352766f86a5b26c281ba2/1x',\n '2': 'https://cdn.betterttv.net/emote/550352766f86a5b26c281ba2/2x',\n '4': 'https://cdn.betterttv.net/emote/550352766f86a5b26c281ba2/3x',\n },\n },\n {\n 'id': '550b344bff8ecee922d2a3c1',\n 'name': 'KaRappa',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/550b344bff8ecee922d2a3c1/1x',\n '2': 'https://cdn.betterttv.net/emote/550b344bff8ecee922d2a3c1/2x',\n '4': 'https://cdn.betterttv.net/emote/550b344bff8ecee922d2a3c1/3x',\n },\n },\n {\n 'id': '566ca00f65dbbdab32ec0544',\n 'name': 'FishMoley',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566ca00f65dbbdab32ec0544/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca00f65dbbdab32ec0544/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca00f65dbbdab32ec0544/3x',\n },\n },\n {\n 'id': '566ca02865dbbdab32ec0547',\n 'name': 'Hhhehehe',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566ca02865dbbdab32ec0547/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca02865dbbdab32ec0547/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca02865dbbdab32ec0547/3x',\n },\n },\n {\n 'id': '566ca04265dbbdab32ec054a',\n 'name': 'KKona',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566ca04265dbbdab32ec054a/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca04265dbbdab32ec054a/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca04265dbbdab32ec054a/3x',\n },\n },\n {\n 'id': '566ca09365dbbdab32ec0555',\n 'name': 'PoleDoge',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566ca09365dbbdab32ec0555/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca09365dbbdab32ec0555/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca09365dbbdab32ec0555/3x',\n },\n },\n {\n 'id': '553b48a21f145f087fc15ca6',\n 'name': 'sosGame',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/553b48a21f145f087fc15ca6/1x',\n '2': 'https://cdn.betterttv.net/emote/553b48a21f145f087fc15ca6/2x',\n '4': 'https://cdn.betterttv.net/emote/553b48a21f145f087fc15ca6/3x',\n },\n },\n {\n 'id': '55471c2789d53f2d12781713',\n 'name': 'CruW',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/55471c2789d53f2d12781713/1x',\n '2': 'https://cdn.betterttv.net/emote/55471c2789d53f2d12781713/2x',\n '4': 'https://cdn.betterttv.net/emote/55471c2789d53f2d12781713/3x',\n },\n },\n {\n 'id': '555015b77676617e17dd2e8e',\n 'name': 'RarePepe',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/555015b77676617e17dd2e8e/1x',\n '2': 'https://cdn.betterttv.net/emote/555015b77676617e17dd2e8e/2x',\n '4': 'https://cdn.betterttv.net/emote/555015b77676617e17dd2e8e/3x',\n },\n },\n {\n 'id': '555981336ba1901877765555',\n 'name': 'haHAA',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/555981336ba1901877765555/1x',\n '2': 'https://cdn.betterttv.net/emote/555981336ba1901877765555/2x',\n '4': 'https://cdn.betterttv.net/emote/555981336ba1901877765555/3x',\n },\n },\n {\n 'id': '55b6524154eefd53777b2580',\n 'name': 'FeelsBirthdayMan',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/55b6524154eefd53777b2580/1x',\n '2': 'https://cdn.betterttv.net/emote/55b6524154eefd53777b2580/2x',\n '4': 'https://cdn.betterttv.net/emote/55b6524154eefd53777b2580/3x',\n },\n },\n {\n 'id': '55f324c47f08be9f0a63cce0',\n 'name': 'RonSmug',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/55f324c47f08be9f0a63cce0/1x',\n '2': 'https://cdn.betterttv.net/emote/55f324c47f08be9f0a63cce0/2x',\n '4': 'https://cdn.betterttv.net/emote/55f324c47f08be9f0a63cce0/3x',\n },\n },\n {\n 'id': '560577560874de34757d2dc0',\n 'name': 'KappaCool',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/560577560874de34757d2dc0/1x',\n '2': 'https://cdn.betterttv.net/emote/560577560874de34757d2dc0/2x',\n '4': 'https://cdn.betterttv.net/emote/560577560874de34757d2dc0/3x',\n },\n },\n {\n 'id': '566c9fc265dbbdab32ec053b',\n 'name': 'FeelsBadMan',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566c9fc265dbbdab32ec053b/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9fc265dbbdab32ec053b/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9fc265dbbdab32ec053b/3x',\n },\n },\n {\n 'id': '566c9f3b65dbbdab32ec052e',\n 'name': 'bUrself',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566c9f3b65dbbdab32ec052e/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9f3b65dbbdab32ec052e/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9f3b65dbbdab32ec052e/3x',\n },\n },\n {\n 'id': '566c9f6365dbbdab32ec0532',\n 'name': 'ConcernDoge',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566c9f6365dbbdab32ec0532/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9f6365dbbdab32ec0532/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9f6365dbbdab32ec0532/3x',\n },\n },\n {\n 'id': '566c9fde65dbbdab32ec053e',\n 'name': 'FeelsGoodMan',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566c9fde65dbbdab32ec053e/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9fde65dbbdab32ec053e/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9fde65dbbdab32ec053e/3x',\n },\n },\n {\n 'id': '566c9ff365dbbdab32ec0541',\n 'name': 'FireSpeed',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566c9ff365dbbdab32ec0541/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9ff365dbbdab32ec0541/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9ff365dbbdab32ec0541/3x',\n },\n },\n {\n 'id': '566ca06065dbbdab32ec054e',\n 'name': 'NaM',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566ca06065dbbdab32ec054e/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca06065dbbdab32ec054e/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca06065dbbdab32ec054e/3x',\n },\n },\n {\n 'id': '566ca38765dbbdab32ec0560',\n 'name': 'SourPls',\n 'platform': 'bttv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566ca38765dbbdab32ec0560/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca38765dbbdab32ec0560/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca38765dbbdab32ec0560/3x',\n },\n },\n {\n 'id': '566dde0e65dbbdab32ec068f',\n 'name': 'FeelsSnowMan',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566dde0e65dbbdab32ec068f/1x',\n '2': 'https://cdn.betterttv.net/emote/566dde0e65dbbdab32ec068f/2x',\n '4': 'https://cdn.betterttv.net/emote/566dde0e65dbbdab32ec068f/3x',\n },\n },\n {\n 'id': '566decae65dbbdab32ec0699',\n 'name': 'FeelsSnowyMan',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566decae65dbbdab32ec0699/1x',\n '2': 'https://cdn.betterttv.net/emote/566decae65dbbdab32ec0699/2x',\n '4': 'https://cdn.betterttv.net/emote/566decae65dbbdab32ec0699/3x',\n },\n },\n {\n 'id': '567b00c61ddbe1786688a633',\n 'name': 'LuL',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/567b00c61ddbe1786688a633/1x',\n '2': 'https://cdn.betterttv.net/emote/567b00c61ddbe1786688a633/2x',\n '4': 'https://cdn.betterttv.net/emote/567b00c61ddbe1786688a633/3x',\n },\n },\n {\n 'id': '56901914991f200c34ffa656',\n 'name': 'SaltyCorn',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/56901914991f200c34ffa656/1x',\n '2': 'https://cdn.betterttv.net/emote/56901914991f200c34ffa656/2x',\n '4': 'https://cdn.betterttv.net/emote/56901914991f200c34ffa656/3x',\n },\n },\n {\n 'id': '56e9f494fff3cc5c35e5287e',\n 'name': 'monkaS',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/56e9f494fff3cc5c35e5287e/1x',\n '2': 'https://cdn.betterttv.net/emote/56e9f494fff3cc5c35e5287e/2x',\n '4': 'https://cdn.betterttv.net/emote/56e9f494fff3cc5c35e5287e/3x',\n },\n },\n {\n 'id': '56f5be00d48006ba34f530a4',\n 'name': 'VapeNation',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/56f5be00d48006ba34f530a4/1x',\n '2': 'https://cdn.betterttv.net/emote/56f5be00d48006ba34f530a4/2x',\n '4': 'https://cdn.betterttv.net/emote/56f5be00d48006ba34f530a4/3x',\n },\n },\n {\n 'id': '56fa09f18eff3b595e93ac26',\n 'name': 'ariW',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/56fa09f18eff3b595e93ac26/1x',\n '2': 'https://cdn.betterttv.net/emote/56fa09f18eff3b595e93ac26/2x',\n '4': 'https://cdn.betterttv.net/emote/56fa09f18eff3b595e93ac26/3x',\n },\n },\n {\n 'id': '5709ab688eff3b595e93c595',\n 'name': 'notsquishY',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/5709ab688eff3b595e93c595/1x',\n '2': 'https://cdn.betterttv.net/emote/5709ab688eff3b595e93c595/2x',\n '4': 'https://cdn.betterttv.net/emote/5709ab688eff3b595e93c595/3x',\n },\n },\n {\n 'id': '5733ff12e72c3c0814233e20',\n 'name': 'FeelsAmazingMan',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/5733ff12e72c3c0814233e20/1x',\n '2': 'https://cdn.betterttv.net/emote/5733ff12e72c3c0814233e20/2x',\n '4': 'https://cdn.betterttv.net/emote/5733ff12e72c3c0814233e20/3x',\n },\n },\n {\n 'id': '573d38b50ffbf6cc5cc38dc9',\n 'name': 'DuckerZ',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/573d38b50ffbf6cc5cc38dc9/1x',\n '2': 'https://cdn.betterttv.net/emote/573d38b50ffbf6cc5cc38dc9/2x',\n '4': 'https://cdn.betterttv.net/emote/573d38b50ffbf6cc5cc38dc9/3x',\n },\n },\n {\n 'id': '580e438942170bfd57189866',\n 'name': 'FeelsPumpkinMan',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/580e438942170bfd57189866/1x',\n '2': 'https://cdn.betterttv.net/emote/580e438942170bfd57189866/2x',\n '4': 'https://cdn.betterttv.net/emote/580e438942170bfd57189866/3x',\n },\n },\n {\n 'id': '59cf182fcbe2693d59d7bf46',\n 'name': 'SqShy',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/59cf182fcbe2693d59d7bf46/1x',\n '2': 'https://cdn.betterttv.net/emote/59cf182fcbe2693d59d7bf46/2x',\n '4': 'https://cdn.betterttv.net/emote/59cf182fcbe2693d59d7bf46/3x',\n },\n },\n {\n 'id': '58d2e73058d8950a875ad027',\n 'name': 'Wowee',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/58d2e73058d8950a875ad027/1x',\n '2': 'https://cdn.betterttv.net/emote/58d2e73058d8950a875ad027/2x',\n '4': 'https://cdn.betterttv.net/emote/58d2e73058d8950a875ad027/3x',\n },\n },\n {\n 'id': '5dc36a8db537d747e37ac187',\n 'name': 'WubTF',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/5dc36a8db537d747e37ac187/1x',\n '2': 'https://cdn.betterttv.net/emote/5dc36a8db537d747e37ac187/2x',\n '4': 'https://cdn.betterttv.net/emote/5dc36a8db537d747e37ac187/3x',\n },\n },\n {\n 'id': '5e76d2ab8c0f5c3723a9a87d',\n 'name': 'cvR',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/5e76d2ab8c0f5c3723a9a87d/1x',\n '2': 'https://cdn.betterttv.net/emote/5e76d2ab8c0f5c3723a9a87d/2x',\n '4': 'https://cdn.betterttv.net/emote/5e76d2ab8c0f5c3723a9a87d/3x',\n },\n },\n {\n 'id': '5e76d2d2d112fc372574d222',\n 'name': 'cvL',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/5e76d2d2d112fc372574d222/1x',\n '2': 'https://cdn.betterttv.net/emote/5e76d2d2d112fc372574d222/2x',\n '4': 'https://cdn.betterttv.net/emote/5e76d2d2d112fc372574d222/3x',\n },\n },\n {\n 'id': '5e76d338d6581c3724c0f0b2',\n 'name': 'cvHazmat',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/5e76d338d6581c3724c0f0b2/1x',\n '2': 'https://cdn.betterttv.net/emote/5e76d338d6581c3724c0f0b2/2x',\n '4': 'https://cdn.betterttv.net/emote/5e76d338d6581c3724c0f0b2/3x',\n },\n },\n {\n 'id': '5e76d399d6581c3724c0f0b8',\n 'name': 'cvMask',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/5e76d399d6581c3724c0f0b8/1x',\n '2': 'https://cdn.betterttv.net/emote/5e76d399d6581c3724c0f0b8/2x',\n '4': 'https://cdn.betterttv.net/emote/5e76d399d6581c3724c0f0b8/3x',\n },\n },\n {\n 'id': '5ffdf28dc96152314ad63960',\n 'name': 'DogChamp',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/5ffdf28dc96152314ad63960/1x',\n '2': 'https://cdn.betterttv.net/emote/5ffdf28dc96152314ad63960/2x',\n '4': 'https://cdn.betterttv.net/emote/5ffdf28dc96152314ad63960/3x',\n },\n },\n {\n 'id': '6468f7acaee1f7f47567708e',\n 'name': 'c!',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/6468f7acaee1f7f47567708e/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f7acaee1f7f47567708e/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f7acaee1f7f47567708e/3x',\n },\n },\n {\n 'id': '6468f845aee1f7f47567709b',\n 'name': 'h!',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/6468f845aee1f7f47567709b/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f845aee1f7f47567709b/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f845aee1f7f47567709b/3x',\n },\n },\n {\n 'id': '6468f869aee1f7f4756770a8',\n 'name': 'l!',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/6468f869aee1f7f4756770a8/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f869aee1f7f4756770a8/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f869aee1f7f4756770a8/3x',\n },\n },\n {\n 'id': '6468f883aee1f7f4756770b5',\n 'name': 'r!',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/6468f883aee1f7f4756770b5/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f883aee1f7f4756770b5/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f883aee1f7f4756770b5/3x',\n },\n },\n {\n 'id': '6468f89caee1f7f4756770c2',\n 'name': 'v!',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/6468f89caee1f7f4756770c2/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f89caee1f7f4756770c2/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f89caee1f7f4756770c2/3x',\n },\n },\n {\n 'id': '6468f8d1aee1f7f4756770cf',\n 'name': 'z!',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/6468f8d1aee1f7f4756770cf/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f8d1aee1f7f4756770cf/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f8d1aee1f7f4756770cf/3x',\n },\n },\n {\n 'id': '64e3b31920cb0d25d950a9f9',\n 'name': 'w!',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/64e3b31920cb0d25d950a9f9/1x',\n '2': 'https://cdn.betterttv.net/emote/64e3b31920cb0d25d950a9f9/2x',\n '4': 'https://cdn.betterttv.net/emote/64e3b31920cb0d25d950a9f9/3x',\n },\n },\n {\n 'id': '65cbe7dbaed093b2eaf87c65',\n 'name': 'p!',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/65cbe7dbaed093b2eaf87c65/1x',\n '2': 'https://cdn.betterttv.net/emote/65cbe7dbaed093b2eaf87c65/2x',\n '4': 'https://cdn.betterttv.net/emote/65cbe7dbaed093b2eaf87c65/3x',\n },\n },\n {\n 'id': '662953eeea369c0ece39eb93',\n 'name': 's!',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/662953eeea369c0ece39eb93/1x',\n '2': 'https://cdn.betterttv.net/emote/662953eeea369c0ece39eb93/2x',\n '4': 'https://cdn.betterttv.net/emote/662953eeea369c0ece39eb93/3x',\n },\n },\n];\n\nconst FfzEmotes = [\n {\n 'id': '9',\n 'name': 'ZrehplaR',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/9/1',\n '2': 'https://cdn.frankerfacez.com/emote/9/2',\n '4': 'https://cdn.frankerfacez.com/emote/9/4',\n },\n },\n {\n 'id': '6',\n 'name': 'YooHoo',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/6/1',\n '2': 'https://cdn.frankerfacez.com/emote/6/2',\n '4': 'https://cdn.frankerfacez.com/emote/6/4',\n },\n },\n {\n 'id': '4',\n 'name': 'ManChicken',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/4/1',\n '2': 'https://cdn.frankerfacez.com/emote/4/2',\n '4': 'https://cdn.frankerfacez.com/emote/4/4',\n },\n },\n {\n 'id': '3',\n 'name': 'BeanieHipster',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/3/1',\n '2': 'https://cdn.frankerfacez.com/emote/3/2',\n '4': 'https://cdn.frankerfacez.com/emote/3/4',\n },\n },\n {\n 'id': '25927',\n 'name': 'CatBag',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/25927/1',\n '2': 'https://cdn.frankerfacez.com/emote/25927/2',\n '4': 'https://cdn.frankerfacez.com/emote/25927/4',\n },\n },\n {\n 'id': '27081',\n 'name': 'ZreknarF',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/27081/1',\n '2': 'https://cdn.frankerfacez.com/emote/27081/2',\n '4': 'https://cdn.frankerfacez.com/emote/27081/4',\n },\n },\n {\n 'id': '28136',\n 'name': 'LilZ',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/28136/1',\n '2': 'https://cdn.frankerfacez.com/emote/28136/2',\n '4': 'https://cdn.frankerfacez.com/emote/28136/4',\n },\n },\n {\n 'id': '28138',\n 'name': 'ZliL',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/28138/1',\n '2': 'https://cdn.frankerfacez.com/emote/28138/2',\n '4': 'https://cdn.frankerfacez.com/emote/28138/4',\n },\n },\n {\n 'id': '149346',\n 'name': 'LaterSooner',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/149346/1',\n '2': 'https://cdn.frankerfacez.com/emote/149346/2',\n '4': 'https://cdn.frankerfacez.com/emote/149346/4',\n },\n },\n {\n 'id': '142673',\n 'name': 'BORT',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/142673/1',\n '2': 'https://cdn.frankerfacez.com/emote/142673/2',\n '4': 'https://cdn.frankerfacez.com/emote/142673/4',\n },\n },\n {\n 'id': '757384',\n 'name': 'BibleThump',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/757384/1',\n '2': 'https://cdn.frankerfacez.com/emote/757384/2',\n '4': 'https://cdn.frankerfacez.com/emote/757384/4',\n },\n },\n {\n 'id': '723890',\n 'name': 'ffzW',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/723890/1',\n '2': 'https://cdn.frankerfacez.com/emote/723890/2',\n '4': 'https://cdn.frankerfacez.com/emote/723890/4',\n },\n },\n {\n 'id': '720508',\n 'name': 'ffzX',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/720508/1',\n '2': 'https://cdn.frankerfacez.com/emote/720508/2',\n '4': 'https://cdn.frankerfacez.com/emote/720508/4',\n },\n },\n {\n 'id': '720509',\n 'name': 'ffzY',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/720509/1',\n '2': 'https://cdn.frankerfacez.com/emote/720509/2',\n '4': 'https://cdn.frankerfacez.com/emote/720509/4',\n },\n },\n {\n 'id': '720729',\n 'name': 'ffzCursed',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/720729/1',\n '2': 'https://cdn.frankerfacez.com/emote/720729/2',\n '4': 'https://cdn.frankerfacez.com/emote/720729/4',\n },\n },\n];\n\nconst TwitchEmotes = [\n {\n 'type': 'twitch',\n 'name': 'AsexualPride',\n 'id': '307827267',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827267/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827267/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827267/static/dark/3.0',\n },\n 'start': 0,\n 'end': 12,\n },\n {\n 'type': 'twitch',\n 'name': 'BisexualPride',\n 'id': '307827313',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827313/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827313/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827313/static/dark/3.0',\n },\n 'start': 13,\n 'end': 26,\n },\n {\n 'type': 'twitch',\n 'name': 'GayPride',\n 'id': '307827321',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827321/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827321/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827321/static/dark/3.0',\n },\n 'start': 27,\n 'end': 35,\n },\n {\n 'type': 'twitch',\n 'name': 'GenderFluidPride',\n 'id': '307827326',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827326/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827326/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827326/static/dark/3.0',\n },\n 'start': 36,\n 'end': 52,\n },\n {\n 'type': 'twitch',\n 'name': 'IntersexPride',\n 'id': '307827332',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827332/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827332/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827332/static/dark/3.0',\n },\n 'start': 53,\n 'end': 66,\n },\n {\n 'type': 'twitch',\n 'name': 'KappaPride',\n 'id': '55338',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/55338/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/55338/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/55338/static/dark/3.0',\n },\n 'start': 67,\n 'end': 77,\n },\n {\n 'type': 'twitch',\n 'name': 'PansexualPride',\n 'id': '307827370',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827370/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827370/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827370/static/dark/3.0',\n },\n 'start': 78,\n 'end': 92,\n },\n {\n 'type': 'twitch',\n 'name': 'TransgenderPride',\n 'id': '307827377',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827377/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827377/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827377/static/dark/3.0',\n },\n 'start': 93,\n 'end': 109,\n },\n {\n 'type': 'twitch',\n 'name': 'TheIlluminati',\n 'id': '145315',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/145315/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/145315/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/145315/static/dark/3.0',\n },\n 'start': 110,\n 'end': 123,\n },\n {\n 'type': 'twitch',\n 'name': 'BrainSlug',\n 'id': '115233',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/115233/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/115233/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/115233/static/dark/3.0',\n },\n 'start': 124,\n 'end': 133,\n },\n {\n 'type': 'twitch',\n 'name': 'imGlitch',\n 'id': '112290',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/112290/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/112290/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/112290/static/dark/3.0',\n },\n 'start': 134,\n 'end': 142,\n },\n {\n 'type': 'twitch',\n 'name': 'GlitchNRG',\n 'id': '304489309',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/304489309/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/304489309/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/304489309/static/dark/3.0',\n },\n 'start': 143,\n 'end': 152,\n },\n {\n 'type': 'twitch',\n 'name': 'TakeNRG',\n 'id': '112292',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/112292/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/112292/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/112292/static/dark/3.0',\n },\n 'start': 153,\n 'end': 160,\n },\n {\n 'type': 'twitch',\n 'name': 'DxCat',\n 'id': '110734',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/110734/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/110734/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/110734/static/dark/3.0',\n },\n 'start': 161,\n 'end': 166,\n },\n {\n 'type': 'twitch',\n 'name': 'VoHiYo',\n 'id': '81274',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/81274/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/81274/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/81274/static/dark/3.0',\n },\n 'start': 167,\n 'end': 173,\n },\n {\n 'type': 'twitch',\n 'name': 'DoritosChip',\n 'id': '102242',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/102242/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/102242/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/102242/static/dark/3.0',\n },\n 'start': 174,\n 'end': 185,\n },\n {\n 'type': 'twitch',\n 'name': 'KomodoHype',\n 'id': '81273',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/81273/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/81273/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/81273/static/dark/3.0',\n },\n 'start': 186,\n 'end': 196,\n },\n {\n 'type': 'twitch',\n 'name': 'duDudu',\n 'id': '62834',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/62834/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/62834/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/62834/static/dark/3.0',\n },\n 'start': 197,\n 'end': 203,\n },\n {\n 'type': 'twitch',\n 'name': 'CoolCat',\n 'id': '58127',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/58127/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/58127/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/58127/static/dark/3.0',\n },\n 'start': 204,\n 'end': 211,\n },\n {\n 'type': 'twitch',\n 'name': 'BloodTrail',\n 'id': '69',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/69/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/69/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/69/static/dark/3.0',\n },\n 'start': 212,\n 'end': 222,\n },\n {\n 'type': 'twitch',\n 'name': 'PunchTrees',\n 'id': '47',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/47/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/47/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/47/static/dark/3.0',\n },\n 'start': 223,\n 'end': 233,\n },\n {\n 'type': 'twitch',\n 'name': 'SSSsss',\n 'id': '46',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/46/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/46/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/46/static/dark/3.0',\n },\n 'start': 234,\n 'end': 240,\n },\n {\n 'type': 'twitch',\n 'name': 'SSSsssplode',\n 'id': 'emotesv2_df1b3a19d9fc4bff81429afdfb46fff0',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_df1b3a19d9fc4bff81429afdfb46fff0/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_df1b3a19d9fc4bff81429afdfb46fff0/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_df1b3a19d9fc4bff81429afdfb46fff0/default/dark/3.0',\n },\n 'start': 241,\n 'end': 251,\n },\n {\n 'type': 'twitch',\n 'name': 'Kappa',\n 'id': '25',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/25/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/25/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/25/static/dark/3.0',\n },\n 'start': 253,\n 'end': 258,\n },\n {\n 'type': 'twitch',\n 'name': 'KappaClaus',\n 'id': '74510',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/74510/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/74510/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/74510/static/dark/3.0',\n },\n 'start': 259,\n 'end': 269,\n },\n {\n 'type': 'twitch',\n 'name': 'MrDestructoid',\n 'id': '28',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/28/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/28/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/28/static/dark/3.0',\n },\n 'start': 270,\n 'end': 283,\n },\n {\n 'type': 'twitch',\n 'name': 'HSWP',\n 'id': '446979',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/446979/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/446979/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/446979/static/dark/3.0',\n },\n 'start': 292,\n 'end': 296,\n },\n {\n 'type': 'twitch',\n 'name': 'Shush',\n 'id': 'emotesv2_819621bcb8f44566a1bd8ea63d06c58f',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_819621bcb8f44566a1bd8ea63d06c58f/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_819621bcb8f44566a1bd8ea63d06c58f/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_819621bcb8f44566a1bd8ea63d06c58f/static/dark/3.0',\n },\n 'start': 297,\n 'end': 302,\n },\n {\n 'type': 'twitch',\n 'name': 'KPOPTT',\n 'id': '304047269',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/304047269/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/304047269/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/304047269/default/dark/3.0',\n },\n 'start': 303,\n 'end': 308,\n },\n {\n 'type': 'twitch',\n 'name': 'FrogPonder',\n 'id': 'emotesv2_a3cdcbfcae9b41bb8215b012362eea35',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_a3cdcbfcae9b41bb8215b012362eea35/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_a3cdcbfcae9b41bb8215b012362eea35/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_a3cdcbfcae9b41bb8215b012362eea35/default/dark/3.0',\n },\n 'start': 310,\n 'end': 319,\n },\n {\n 'type': 'twitch',\n 'name': 'HypeCheer',\n 'id': 'emotesv2_dd4f4f9cea1a4039ad3390e20900abe4',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dd4f4f9cea1a4039ad3390e20900abe4/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dd4f4f9cea1a4039ad3390e20900abe4/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dd4f4f9cea1a4039ad3390e20900abe4/default/dark/3.0',\n },\n 'start': 321,\n 'end': 329,\n },\n {\n 'type': 'twitch',\n 'name': 'HypeFail',\n 'id': 'emotesv2_0330a84e75ad48c1821c1d29a7dadd4d',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_0330a84e75ad48c1821c1d29a7dadd4d/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_0330a84e75ad48c1821c1d29a7dadd4d/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_0330a84e75ad48c1821c1d29a7dadd4d/default/dark/3.0',\n },\n 'start': 0,\n 'end': 7,\n },\n {\n 'type': 'twitch',\n 'name': 'HypePopcorn',\n 'id': 'emotesv2_7b8e74be7bd64601a2608c2ff5f6eb7a',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_7b8e74be7bd64601a2608c2ff5f6eb7a/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_7b8e74be7bd64601a2608c2ff5f6eb7a/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_7b8e74be7bd64601a2608c2ff5f6eb7a/default/dark/3.0',\n },\n 'start': 9,\n 'end': 19,\n },\n {\n 'type': 'twitch',\n 'name': 'GlitchCat',\n 'id': '304486301',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/304486301/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/304486301/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/304486301/static/dark/3.0',\n },\n 'start': 21,\n 'end': 30,\n },\n {\n 'type': 'twitch',\n 'name': 'SoonerLater',\n 'id': '2113050',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/2113050/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/2113050/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/2113050/static/dark/3.0',\n },\n 'start': 31,\n 'end': 42,\n },\n {\n 'type': 'twitch',\n 'name': 'FBBlock',\n 'id': '1441276',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441276/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441276/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441276/static/dark/3.0',\n },\n 'start': 43,\n 'end': 50,\n },\n {\n 'type': 'twitch',\n 'name': 'FBCatch',\n 'id': '1441281',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441281/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441281/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441281/static/dark/3.0',\n },\n 'start': 51,\n 'end': 58,\n },\n {\n 'type': 'twitch',\n 'name': 'FBPass',\n 'id': '1441271',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441271/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441271/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441271/static/dark/3.0',\n },\n 'start': 59,\n 'end': 65,\n },\n {\n 'type': 'twitch',\n 'name': 'FBRun',\n 'id': '1441261',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441261/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441261/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441261/static/dark/3.0',\n },\n 'start': 66,\n 'end': 71,\n },\n {\n 'type': 'twitch',\n 'name': 'FBtouchdown',\n 'id': '626795',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/626795/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/626795/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/626795/static/dark/3.0',\n },\n 'start': 72,\n 'end': 83,\n },\n {\n 'type': 'twitch',\n 'name': 'FBSpiral',\n 'id': '1441273',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441273/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441273/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441273/static/dark/3.0',\n },\n 'start': 84,\n 'end': 92,\n },\n {\n 'type': 'twitch',\n 'name': 'FBPenalty',\n 'id': '1441289',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441289/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441289/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441289/static/dark/3.0',\n },\n 'start': 93,\n 'end': 102,\n },\n {\n 'type': 'twitch',\n 'name': 'FBChallenge',\n 'id': '1441285',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441285/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441285/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441285/static/dark/3.0',\n },\n 'start': 103,\n 'end': 114,\n },\n {\n 'type': 'twitch',\n 'name': 'PixelBob',\n 'id': '1547903',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1547903/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1547903/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1547903/static/dark/3.0',\n },\n 'start': 115,\n 'end': 123,\n },\n {\n 'type': 'twitch',\n 'name': 'LUL',\n 'id': '425618',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/425618/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/425618/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/425618/static/dark/3.0',\n },\n 'start': 124,\n 'end': 127,\n },\n {\n 'type': 'twitch',\n 'name': 'DarkMode',\n 'id': '461298',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/461298/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/461298/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/461298/static/dark/3.0',\n },\n 'start': 128,\n 'end': 136,\n },\n {\n 'type': 'twitch',\n 'name': 'PopCorn',\n 'id': '724216',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/724216/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/724216/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/724216/static/dark/3.0',\n },\n 'start': 137,\n 'end': 144,\n },\n {\n 'type': 'twitch',\n 'name': 'EarthDay',\n 'id': '959018',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/959018/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/959018/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/959018/static/dark/3.0',\n },\n 'start': 145,\n 'end': 153,\n },\n {\n 'type': 'twitch',\n 'name': 'TwitchUnity',\n 'id': '196892',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/196892/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/196892/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/196892/static/dark/3.0',\n },\n 'start': 154,\n 'end': 165,\n },\n {\n 'type': 'twitch',\n 'name': 'Squid1',\n 'id': '191762',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/191762/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/191762/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/191762/static/dark/3.0',\n },\n 'start': 166,\n 'end': 172,\n },\n {\n 'type': 'twitch',\n 'name': 'Squid2',\n 'id': '191763',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/191763/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/191763/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/191763/static/dark/3.0',\n },\n 'start': 173,\n 'end': 179,\n },\n {\n 'type': 'twitch',\n 'name': 'Squid3',\n 'id': '191764',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/191764/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/191764/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/191764/static/dark/3.0',\n },\n 'start': 180,\n 'end': 186,\n },\n {\n 'type': 'twitch',\n 'name': 'Squid4',\n 'id': '191767',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/191767/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/191767/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/191767/static/dark/3.0',\n },\n 'start': 187,\n 'end': 193,\n },\n {\n 'type': 'twitch',\n 'name': 'DinoDance',\n 'id': 'emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7',\n 'gif': true,\n 'animated': true,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7/animated/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7/animated/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7/animated/dark/3.0',\n },\n 'start': 194,\n 'end': 203,\n },\n {\n 'type': 'twitch',\n 'name': 'CrreamAwk',\n 'id': '191313',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/191313/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/191313/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/191313/static/dark/3.0',\n },\n 'start': 204,\n 'end': 213,\n },\n {\n 'type': 'twitch',\n 'name': 'PopNemo',\n 'id': 'emotesv2_5d523adb8bbb4786821cd7091e47da21',\n 'gif': true,\n 'animated': true,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_5d523adb8bbb4786821cd7091e47da21/animated/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_5d523adb8bbb4786821cd7091e47da21/animated/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_5d523adb8bbb4786821cd7091e47da21/animated/dark/3.0',\n },\n 'start': 214,\n 'end': 221,\n },\n];\n\nconst emotes: Array<TwitchEmote | BttvEmote | SeventvEmote> = Object.values([\n ...TwitchEmotes,\n ...BttvEmotes.map((e) => ({\n type: e.platform,\n name: e.name,\n id: e.id,\n gif: e.animated,\n animated: e.animated,\n urls: e.urls,\n })),\n ...SeventvEmotes.map((e) => ({\n type: e.platform,\n name: e.name,\n id: e.id,\n gif: e.animated,\n animated: e.animated,\n urls: e.urls,\n })),\n ...FfzEmotes.map((e) => ({\n type: e.platform,\n name: e.name,\n id: e.id,\n gif: e.animated,\n animated: e.animated,\n urls: e.urls,\n })),\n]).reduce(\n (acc, emote) => {\n if ((emote as any)?.platform) {\n emote.type = (emote as any).platform;\n delete (emote as any).platform;\n }\n\n if (!acc.some((e) => e.name === emote.name)) {\n acc.push({\n ...emote,\n 'start': 0,\n 'end': 0,\n } as TwitchEmote | BttvEmote | SeventvEmote);\n }\n\n return acc;\n },\n [] as Array<TwitchEmote | BttvEmote | SeventvEmote>,\n);\n\nexport { TwitchEmotes, BttvEmotes, SeventvEmotes, FfzEmotes, emotes };\n","export const items: any[] = [];\n","export const twitch_messages = [\n 'haHAA',\n 'CiGrip',\n 'PopNemo',\n 'PogChamp',\n 'bttvNice',\n 'ariW wave',\n 'DinoDance',\n 'CruW salute',\n 'c! PogChamp',\n 'LUL LUL LUL',\n 'CandianRage',\n 'CatBag kitty!',\n '<3 good times',\n 'catJAM vibing',\n 'DuckerZ quack',\n ':tf: trollface',\n 'haHAA good one',\n \"HSWP let's go!\",\n 'DxCat claws out',\n 'ConcernDoge hmm',\n 'BroBalt nice one',\n 'VoHiYo everyone!',\n 'LuL that was funny',\n 'Kappa just kidding',\n 'FBCatch nice grab!',\n 'cvHazmat stay safe',\n 'CookieTime nom nom',\n 'LuL that was funny',\n 'CruW crew assembled',\n 'GlitchCat GlitchCat',\n 'CoolCat staying calm',\n 'bUrself be yourself!',\n 'catJAM catJAM catJAM',\n 'HSWP here we go again',\n 'Shush moment incoming',\n 'duDudu rhythm section',\n ':tf: face palm moment',\n 'duDudu rhythm section',\n 'HSWP here we go again',\n 'PunchTrees PunchTrees',\n 'SSSsss Minecraft time',\n 'KappaPride represent!',\n 'haHAA that joke though',\n 'DoritosChip snack time',\n 'DoritosChip snack time',\n 'asexualPride represent',\n 'duDudu dancing on beat',\n 'FBBlock defensive play!',\n 'ariW waving at everyone',\n 'PopNemo finding our way',\n 'ariW waving at everyone',\n 'TheIlluminati confirmed',\n 'SSSsss slithering vibes',\n 'GayPride celebrate love',\n 'BloodTrail hunting time',\n 'TheIlluminati confirmed',\n \"LUL can't stop laughing\",\n 'HypeCheer clap clap clap',\n 'DuckerZ quacking in chat',\n 'Wait for it... PogChamp!',\n 'HypeCheer clap clap clap',\n 'KPOPTT music to our ears',\n 'FrogPonder thinking frog',\n \"IntersexPride we're here\",\n 'KappaPride be proud Kappa',\n 'cvHazmat suit up for this',\n 'BrainSlug giving me ideas',\n 'KappaPride be proud Kappa',\n 'This music is fire catJAM',\n 'I just followed! PogChamp',\n 'MrDestructoid robot vibes',\n 'BroBalt brotherhood moment',\n 'VoHiYo greetings from chat',\n 'PogChamp PogChamp PogChamp',\n 'DxCat meow meow KomodoHype',\n 'Squid1 Squid2 Squid3 Squid4',\n 'KomodoHype the hype is real',\n 'DarkMode gang where you at?',\n 'Wait what just happened? D:',\n 'TakeNRG infinite energy NRG',\n 'CookieTime break time snack',\n 'The dedication is real here',\n 'PopCorn watching this unfold',\n 'CandianRage maple syrup fury',\n 'PopCorn watching this unfold',\n 'LesbianPride strong together',\n 'DinoDance DinoDance DinoDance',\n 'TakeNRG this energy is unreal',\n 'Everyone gets hype! HypeCheer',\n 'CiGrip strong grip on the game',\n 'CoolCat no stress allowed here',\n 'BisexualPride all love matters',\n 'GenderFluidPride freedom to be',\n 'DarkMode gang in here DarkMode',\n \"HypeFail oops that didn't work\",\n 'HypePopcorn this is the moment',\n 'ConcernDoge is everything okay?',\n 'BloodTrail following the leader',\n 'This is so wholesome AngelThump',\n 'ImGlitch technical difficulties',\n 'Anyone else eating? DoritosChip',\n 'PixelBob retro vibes with Kappa',\n 'SoonerLater catch you next time',\n 'imGlitch glitchy but we love it',\n 'KomodoHype the energy is crazy!',\n 'NonbinaryPride beyond the binary',\n 'PansexualPride love is universal',\n 'This community is the best Kappa',\n 'BrainSlug with the big brain play',\n 'TransgenderPride living authentic',\n 'AngelThump wholesomeness incoming',\n 'GlitchCat imGlitch what happened?',\n 'CrreamAwk that was awkward VoHiYo',\n 'IronmouseLuv appreciate the stream',\n 'PunchTrees minecraft mode activated',\n 'The skill on display here is unreal',\n 'LesbianPride GayPride BisexualPride',\n 'PogChamp PogChamp PogChamp PogChamp',\n \"TwitchUnity we're all here for this\",\n 'This is absolutely insane KomodoHype',\n 'Never seen anything like this before',\n 'Vibing with cat-shaped avatars catJAM',\n 'EarthDay appreciation for this stream',\n \"TheIlluminati knows something we don't\",\n \"Shush they're about to do something big\",\n 'Can we appreciate this moment? PogChamp',\n 'MrDestructoid destroying the competition',\n 'AsexualPride IntersexPride GenderFluidPride',\n 'TransgenderPride PansexualPride NonbinaryPride',\n];\n\nexport const youtube_messages = [\n ':ytg: Keep it up!',\n ':yt: YouTube hype!',\n ':gar: Amazing as always!',\n 'No words, just :awesome:',\n 'You got this! :yougotthis:',\n ':elbowbump: Great teamwork!',\n 'Love this energy! :goodvibes:',\n 'Just arrived! :hand-pink-waving:',\n 'Great gameplay! :hand-yellow-nails:',\n ':face-pink-tears: Tears of joy here',\n 'This stream is incredible :awesome:',\n 'Hydration break everyone! :hydrate:',\n ':text-green-game-over: You won this!',\n \":face-blue-star-eyes: You're a star!\",\n 'Virtual hug for everyone :virtualhug:',\n 'Happy to be here! :face-green-smiling:',\n 'Chilling with my dog :chillwdog: vibing',\n ':face-red-heart-shape: Love what you do',\n ':person-turqouise-waving: Hey everyone!',\n 'This community is the best! :goodvibes:',\n ':face-blue-smiling: Amazing vibes today',\n ':goodvibes: Only good vibes in this chat',\n ':body-blue-raised-arms: Victory is ours!',\n ':pride-flower-rainbow-heart: Love is love',\n ':octopus-red-waving: Waves from the chat!',\n ':thanksdoc: Thanks for the entertainment!',\n ':face-purple-crying: Why is this so good??',\n ':eyes-pink-heart-shape: Beautiful gameplay',\n ':fish-orange-wide-eyes: Eyes on the prize!',\n ':whistle-red-blow: That was a performance!',\n 'Respect the grind :hand-green-crystal-ball:',\n 'Learning so much from this stream :learning:',\n ':pride-people-embracing-two: Community love!',\n ':face-red-droopy-eyes: long day but worth it',\n 'Chilling with my cat :chillwcat: so peaceful',\n ':face-fuchsia-tongue-out: Having too much fun',\n ':person-purple-stage-event: This is showtime!',\n ':card-red-penalty: That was risky! Bold move!',\n ':face-purple-smiling-tears: This is too good!',\n ':face-orange-tv-shape: Broadcasting excellence',\n ':face-orange-tv-shape: Broadcasting excellence',\n ':face-blue-heart-eyes: This stream has my heart',\n ':person-turquoise-crowd-surf: Crowd going wild!',\n 'Best gaming session ever :trophy-yellow-smiling:',\n ':hand-purple-blue-peace: Peace out, great stream!',\n ':face-purple-sweating: Clutch moment! So intense!',\n \":hand-orange-covering-eyes: Can't believe my eyes!\",\n ':face-blue-question-mark: How do you even do that?',\n ':baseball-white-cap-out: Home run! Total knockout!',\n ':volcano-green-lava-orange: Things are getting HOT',\n ':face-purple-smiling-fangs: Evil laugh at that play',\n ':stopwatch-blue-hand-timer: Speedrunning like a pro',\n ':location-yellow-teal-bars: Streaming from the top!',\n \":face-purple-open-box: What's next? More surprises?\",\n ':person-turquoise-wizard-wand: Like magic out there!',\n ':face-blue-wide-eyes: Did that actually just happen?!',\n ':medal-yellow-first-red: Number one stream right here',\n ':face-turquoise-music-note: Vibing to this soundtrack',\n 'Can we just appreciate how awesome this is? :awesome:',\n ':popcorn-yellow-striped-smile: This is the main event!',\n ':face-orange-raised-eyebrow: Interesting strategy there',\n \":person-blue-speaking-microphone: Let's go! Hype it up!\",\n ':pride-megaphone-rainbow-handle: Amplifying good vibes!',\n \":rocket-red-countdown-liftoff: Let's go! Time to launch!\",\n ':person-blue-holding-pencil: Taking notes on these skills',\n ':face-fuchsia-poop-shape: That was a mess! But we survived',\n ':person-pink-swaying-hair: The style, the skill, everything!',\n ':body-turquoise-yoga-pose: So smooth and calm under pressure',\n ':penguin-blue-waving-tear: Goodbye for now, fantastic stream!',\n ':face-turquoise-covering-eyes: Wait what? How did you do that?',\n ':face-turquoise-covering-eyes: Wait what? How did you do that?',\n ':clock-turquoise-looking-up: What time is it? Time to watch you!',\n ':person-blue-eating-spaghetti: Fueling up after that performance',\n \":hourglass-purple-sand-orange: Time flies when you're having fun\",\n ':face-turquoise-drinking-coffee: Coffee and gaming, perfect combo',\n \":person-turquoise-writes-headphones: That's some creative strategy\",\n ':face-purple-rain-drops: Emotional over here :face-pink-drinking-tea:',\n ':pride-person-heart-lesbian: Proud and here :pride-flowers-turquoise-transgender:',\n];\n\nexport const normal_messages = [\n 'GG!',\n 'Wow just wow',\n 'Fire fire fire',\n 'Simply amazing',\n 'Never gets old',\n 'Veteran energy',\n 'That was insane',\n 'Hello everyone!',\n 'Best moment ever',\n 'Love seeing this',\n 'Walking the walk',\n 'Cannot look away',\n 'Love seeing this',\n 'Never disappoints',\n 'What a turnaround',\n 'Never counted out',\n 'Respect the grind',\n 'Never disappoints',\n 'Respect the grind',\n 'Hard work pays off',\n 'Consistency is key',\n 'Art form of gaming',\n 'Great gameplay btw',\n 'This is next level',\n 'Peak entertainment',\n 'This is why I watch',\n 'Real recognize real',\n 'Chat is going crazy',\n 'Motivation overload',\n 'When it matters most',\n 'Setting the bar high',\n 'Different vibe today',\n 'Flow state activated',\n 'Comeback king energy',\n 'Mind blown right now',\n 'Cannot stop watching',\n 'The dedication shows',\n 'Vibes are immaculate',\n 'Automatic excellence',\n 'Always coming through',\n 'Unmatched performance',\n 'Promises and delivers',\n 'Mental game is strong',\n 'Calculated every move',\n 'One step ahead always',\n 'Heart racing right now',\n 'On the edge of my seat',\n 'In the zone completely',\n 'Next level inspiration',\n 'From behind to victory',\n 'Confidence is key here',\n 'This is playoff energy',\n 'I love this community!',\n 'So satisfying to watch',\n 'Pure talent right here',\n 'Clutch moment incoming',\n 'This is peak streaming',\n 'Delivers under pressure',\n 'Ice in the veins moment',\n 'This stream is amazing!',\n 'So composed and focused',\n 'Muscle memory is insane',\n 'Gonna apply this myself',\n 'Backing it up every time',\n 'Every stream gets better',\n 'Good energy in this chat',\n 'Physical and mental peak',\n 'Tournament mode activated',\n 'Absolute unit of a player',\n 'Playing 4D chess out here',\n 'This is pure content gold',\n 'Always believes in the win',\n 'Champion mentality showing',\n 'Winners mindset on display',\n 'This deserves all the hype',\n 'Community makes it special',\n 'Red pilled and game pilled',\n 'Experience matters so much',\n 'Been perfecting this craft',\n 'Masterclass happening live',\n 'First time here, loving it!',\n 'Bringing the A game tonight',\n 'Nothing stops this momentum',\n 'Outsmarting the competition',\n 'This chat is moving so fast!',\n 'Incredible skills on display',\n 'Years of practice paying off',\n 'The way they handle pressure',\n 'Unstoppable force on display',\n 'Precision and power combined',\n 'Nothing can break this focus',\n 'This is beautiful to witness',\n 'Vision and execution perfect',\n 'Can we get some hype in chat?',\n 'Taking mental notes right now',\n 'Stealing all these strategies',\n 'Absolutely crushing it today!',\n 'POG! POG! POG! This is insane!',\n 'Just got here, what did I miss?',\n 'Showing everyone how it is done',\n 'Knowledge translation to action',\n 'Learning from the absolute best',\n 'Stream quality is insane today!',\n 'Not gonna lie, that was genius!',\n 'Gaming at its finest right here',\n 'Best stream on Twitch right now!',\n \"The strategy here is chef's kiss\",\n 'This is what greatness looks like',\n 'Going to bed, good night everyone!',\n 'Content like this is why I tune in',\n 'Clap clap clap! Amazing performance!',\n 'Absolutely phenomenal content today!',\n 'Respect to the dedication shown here',\n \"I'm taking notes for my own gameplay\",\n 'Legendary session right here, no cap',\n 'The mechanics on display here are unreal',\n 'This is what peak performance looks like',\n 'This is why I love this community so much',\n 'Setting records and breaking expectations',\n \"First time watching and I'm already hooked\",\n 'Every single play is calculated perfection',\n 'The game knowledge displayed here is insane',\n 'The fundamentals here are next level perfect',\n 'Watching someone who truly loves their craft',\n 'The way they handle adversity is so inspiring',\n 'Every single decision is calculated perfectly',\n 'The combination of speed and accuracy is wild',\n 'This is what happens when talent meets effort',\n 'The artistry in gameplay displayed right here',\n 'Stream just made my day a million times better',\n 'This level of consistency is absolutely insane',\n 'The decision making under pressure is flawless',\n 'The improvement from stream to stream is crazy',\n 'The mental fortitude required for this is huge',\n 'Reading opponents like they are so predictable',\n 'How many years did it take to reach this level?',\n 'This person has transcended normal skill levels',\n 'The ability to stay cool under extreme pressure',\n 'Been here since the beginning, never looked back',\n 'Never seen a player adapt so quickly to mistakes',\n 'This is exactly what peak performance looks like',\n 'Years of training visible in every single moment',\n 'Professional level execution on full display here',\n 'This is the standard that everyone should aspire to',\n 'Nothing phases this player when the stakes are high',\n 'This is entertainment at the absolute highest level',\n];\n\nexport const messages = [...twitch_messages, ...youtube_messages, ...normal_messages];\n","export const names = [\n 'Tixyel',\n 'awigui',\n 'kurao_w',\n 'Urie_s2',\n 'itzzcatt',\n 'BeniArts',\n 'mynnyori',\n 'DexPixel',\n 'Cupidiko',\n 'starkuss_',\n 'catsember',\n 'shy_madeit',\n 'SpookySony',\n 'nanagadesign',\n];\n","export const tiers = ['1000', '2000', '3000', 'prime'];\n","export const tts = [\n 'Filiz',\n 'Astrid',\n 'Tatyana',\n 'Maxim',\n 'Carmen',\n 'Ines',\n 'Cristiano',\n 'Vitoria',\n 'Ricardo',\n 'Maja',\n 'Jan',\n 'Jacek',\n 'Ewa',\n 'Ruben',\n 'Lotte',\n 'Liv',\n 'Seoyeon',\n 'Takumi',\n 'Mizuki',\n 'Giorgio',\n 'Carla',\n 'Bianca',\n 'Karl',\n 'Dora',\n 'Mathieu',\n 'Celine',\n 'Chantal',\n 'Penelope',\n 'Miguel',\n 'Mia',\n 'Enrique',\n 'Conchita',\n 'Geraint',\n 'Salli',\n 'Matthew',\n 'Kimberly',\n 'Kendra',\n 'Justin',\n 'Joey',\n 'Joanna',\n 'Ivy',\n 'Raveena',\n 'Aditi',\n 'Emma',\n 'Brian',\n 'Amy',\n 'Russell',\n 'Nicole',\n 'Vicki',\n 'Marlene',\n 'Hans',\n 'Naja',\n 'Mads',\n 'Gwyneth',\n 'Zhiyu',\n 'Tracy',\n 'Danny',\n 'Huihui',\n 'Yaoyao',\n 'Kangkang',\n 'HanHan',\n 'Zhiwei',\n 'Asaf',\n 'An',\n 'Stefanos',\n 'Filip',\n 'Ivan',\n 'Heidi',\n 'Herena',\n 'Kalpana',\n 'Hemant',\n 'Matej',\n 'Andika',\n 'Rizwan',\n 'Lado',\n 'Valluvar',\n 'Linda',\n 'Heather',\n 'Sean',\n 'Michael',\n 'Karsten',\n 'Guillaume',\n 'Pattara',\n 'Jakub',\n 'Szabolcs',\n 'Hoda',\n 'Naayf',\n];\n","export const YoutubeEmotes = [\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/flower-rainbow-heart-red',\n shortcuts: [':pride-flower-rainbow-heart:'],\n searchTerms: ['pride-flower-rainbow-heart'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/8cF4z9clPGshgty6vT3ImAtx_CUvz3TMY-SAu_UKw-x1Z9-2KzcK4OuyAIROrKhyvcabrw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/8cF4z9clPGshgty6vT3ImAtx_CUvz3TMY-SAu_UKw-x1Z9-2KzcK4OuyAIROrKhyvcabrw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-flower-rainbow-heart',\n },\n },\n },\n isCustomEmoji: true,\n index: 0,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-green-earth-head',\n shortcuts: [':pride-person-earth-intersex:'],\n searchTerms: ['pride-person-earth-intersex'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Gr-3he7L8jjQFj7aI0kSY1eV4aIsy-vT7Hk5shdakigG9aAJO_uMBmV6haCtK1OHjTEjj1o=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Gr-3he7L8jjQFj7aI0kSY1eV4aIsy-vT7Hk5shdakigG9aAJO_uMBmV6haCtK1OHjTEjj1o=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-person-earth-intersex',\n },\n },\n },\n isCustomEmoji: true,\n index: 1,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-yellow-heart-lesbian',\n shortcuts: [':pride-person-heart-lesbian:'],\n searchTerms: ['pride-person-heart-lesbian'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/tKVZ2TfK5tMLvF88cnz2YNVwuHNgr0eDR9Ef8J0OCkZEHXLFUtH3f6-xSHhqhwd2sL3Tu4I=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/tKVZ2TfK5tMLvF88cnz2YNVwuHNgr0eDR9Ef8J0OCkZEHXLFUtH3f6-xSHhqhwd2sL3Tu4I=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-person-heart-lesbian',\n },\n },\n },\n isCustomEmoji: true,\n index: 2,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-yellow-flower-nonbinary',\n shortcuts: [':pride-person-flower-nonbinary:'],\n searchTerms: ['pride-person-flower-nonbinary'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/le1X4KHLOmK5K1s5xu-owmP_eZK4D0ExyjnMCS6UNqZa-Zh4uEzz3mZnU3jBlLfi14Zpngw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/le1X4KHLOmK5K1s5xu-owmP_eZK4D0ExyjnMCS6UNqZa-Zh4uEzz3mZnU3jBlLfi14Zpngw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-person-flower-nonbinary',\n },\n },\n },\n isCustomEmoji: true,\n index: 3,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/flower-rainbow-heart-pansexual',\n shortcuts: [':pride-flower-pansexual:'],\n searchTerms: ['pride-flower-pansexual'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/blSdVv_UpdTn8BIWU6u9oCWhdtpc0-a-3dJeaRX9As6ftLc0OGPJ1PveQEJbUEDzf6by2Xi9=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/blSdVv_UpdTn8BIWU6u9oCWhdtpc0-a-3dJeaRX9As6ftLc0OGPJ1PveQEJbUEDzf6by2Xi9=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-flower-pansexual',\n },\n },\n },\n isCustomEmoji: true,\n index: 4,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/heart-stripes-pride-flag',\n shortcuts: [':pride-heart-rainbow-philly:'],\n searchTerms: ['pride-heart-rainbow-philly'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/7iYeXsmU2YMcKsKalaKJhirWdDASATIpl_c7Ib7akaRhvz8GChI4xpM0d0dtASjmmWPbg1NG=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/7iYeXsmU2YMcKsKalaKJhirWdDASATIpl_c7Ib7akaRhvz8GChI4xpM0d0dtASjmmWPbg1NG=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-heart-rainbow-philly',\n },\n },\n },\n isCustomEmoji: true,\n index: 5,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/symbol-turquoise-flowers-transgender',\n shortcuts: [':pride-flowers-turquoise-transgender:'],\n searchTerms: ['pride-flowers-turquoise-transgender'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/ovz1T6ay1D1GNFXwwYibZeu_rV5_iSRXWSHR2thQDLLWejVQMqWPUhsUWrMMw1tlBwllYA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/ovz1T6ay1D1GNFXwwYibZeu_rV5_iSRXWSHR2thQDLLWejVQMqWPUhsUWrMMw1tlBwllYA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-flowers-turquoise-transgender',\n },\n },\n },\n isCustomEmoji: true,\n index: 6,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hand-rainbow-fan-open',\n shortcuts: [':pride-fan-rainbow-open:'],\n searchTerms: ['pride-fan-rainbow-open'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/lDH5aORWtlc42NxTwiP3aIUIjttLVvE4Q_xIJDuu55DKvYSLeDIysOEKtGuMmEtOLgvZ_zTX=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/lDH5aORWtlc42NxTwiP3aIUIjttLVvE4Q_xIJDuu55DKvYSLeDIysOEKtGuMmEtOLgvZ_zTX=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-fan-rainbow-open',\n },\n },\n },\n isCustomEmoji: true,\n index: 7,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-pink-hair-earrings',\n shortcuts: [':pride-face-pink-earrings:'],\n searchTerms: ['pride-face-pink-earrings'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/utFog-w4fqgJ05xfQFjSdy8jvRBtFCeuWRkLH3IaVJ4WCBrdjDbXzXOprJA_h6MPOuksv0c=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/utFog-w4fqgJ05xfQFjSdy8jvRBtFCeuWRkLH3IaVJ4WCBrdjDbXzXOprJA_h6MPOuksv0c=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-face-pink-earrings',\n },\n },\n },\n isCustomEmoji: true,\n index: 8,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/unicorn-white-rainbow-mane',\n shortcuts: [':pride-unicorn-rainbow-mane:'],\n searchTerms: ['pride-unicorn-rainbow-mane'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/fvdANfncTw5aDF8GBq20kHicN5rMVoCMTM3FY8MQbZH9sZXvHy5o48yvHZWN4No5rz8b7-0=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/fvdANfncTw5aDF8GBq20kHicN5rMVoCMTM3FY8MQbZH9sZXvHy5o48yvHZWN4No5rz8b7-0=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-unicorn-rainbow-mane',\n },\n },\n },\n isCustomEmoji: true,\n index: 9,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/people-embracing-two',\n shortcuts: [':pride-people-embracing-two:'],\n searchTerms: ['pride-people-embracing-two'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/h1zJqFv2R4LzS3ZUpVyHhprCHQTIhbSecqu2Lid23byl5hD5cJdnshluOCyRdldYkWCUNg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/h1zJqFv2R4LzS3ZUpVyHhprCHQTIhbSecqu2Lid23byl5hD5cJdnshluOCyRdldYkWCUNg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-people-embracing-two',\n },\n },\n },\n isCustomEmoji: true,\n index: 10,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-green-hair-tears',\n shortcuts: [':pride-face-green-tears:'],\n searchTerms: ['pride-face-green-tears'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/2BNf4_qBG7mqt1sN-JwThp1srHlDr03xoya9hpIvbgS65HwLaaDz46r3A6dy8JnO2GtLNag=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/2BNf4_qBG7mqt1sN-JwThp1srHlDr03xoya9hpIvbgS65HwLaaDz46r3A6dy8JnO2GtLNag=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-face-green-tears',\n },\n },\n },\n isCustomEmoji: true,\n index: 11,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/megaphone-rainbow-handle',\n shortcuts: [':pride-megaphone-rainbow-handle:'],\n searchTerms: ['pride-megaphone-rainbow-handle'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/cop1MU9YkEuUxbe8d1NhPl1S9uJ60YSVTMM1gelP7Cy0BICa6Ey_TpxEFFdYITtsUK1cSg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/cop1MU9YkEuUxbe8d1NhPl1S9uJ60YSVTMM1gelP7Cy0BICa6Ey_TpxEFFdYITtsUK1cSg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-megaphone-rainbow-handle',\n },\n },\n },\n isCustomEmoji: true,\n index: 12,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hand-brown-yellow-nails',\n shortcuts: [':pride-hand-yellow-nails:'],\n searchTerms: ['pride-hand-yellow-nails'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/1dEPlxkQ1RdZkPo5CLgYvneMQ-BBo63b3nnASEAXoccnVktMjgviKqMj1pjPiK2zTPTc7g=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/1dEPlxkQ1RdZkPo5CLgYvneMQ-BBo63b3nnASEAXoccnVktMjgviKqMj1pjPiK2zTPTc7g=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-hand-yellow-nails',\n },\n },\n },\n isCustomEmoji: true,\n index: 13,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-orange-hair-flowing',\n shortcuts: [':pride-face-orange-flowing:'],\n searchTerms: ['pride-face-orange-flowing'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/RuhTeU8YiT0_NaOYjMmXv77eEw5eO5Bdzfr7ouS0u3ZAK2J4coKGe5g4fN8mJV85jC63hw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/RuhTeU8YiT0_NaOYjMmXv77eEw5eO5Bdzfr7ouS0u3ZAK2J4coKGe5g4fN8mJV85jC63hw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-face-orange-flowing',\n },\n },\n },\n isCustomEmoji: true,\n index: 14,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/CIW60IPp_dYCFcuqTgodEu4IlQ',\n shortcuts: [':yt:'],\n searchTerms: ['yt'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/IkpeJf1g9Lq0WNjvSa4XFq4LVNZ9IP5FKW8yywXb12djo1OGdJtziejNASITyq4L0itkMNw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/IkpeJf1g9Lq0WNjvSa4XFq4LVNZ9IP5FKW8yywXb12djo1OGdJtziejNASITyq4L0itkMNw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'yt',\n },\n },\n },\n isCustomEmoji: true,\n index: 15,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/CN2m5cKr49sCFYbFggodDFEKrg',\n shortcuts: [':oops:'],\n searchTerms: ['oops'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/PFoVIqIiFRS3aFf5-bt_tTC0WrDm_ylhF4BKKwgqAASNb7hVgx_adFP-XVhFiJLXdRK0EQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/PFoVIqIiFRS3aFf5-bt_tTC0WrDm_ylhF4BKKwgqAASNb7hVgx_adFP-XVhFiJLXdRK0EQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'oops',\n },\n },\n },\n isCustomEmoji: true,\n index: 16,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/X_zdXMHgJaPa8gTGt4f4Ag',\n shortcuts: [':buffering:'],\n searchTerms: ['buffering'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/5gfMEfdqO9CiLwhN9Mq7VI6--T2QFp8AXNNy5Fo7btfY6fRKkThWq35SCZ6SPMVCjg-sUA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/5gfMEfdqO9CiLwhN9Mq7VI6--T2QFp8AXNNy5Fo7btfY6fRKkThWq35SCZ6SPMVCjg-sUA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'buffering',\n },\n },\n },\n isCustomEmoji: true,\n index: 17,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/1v50XorRJ8GQ8gTz_prwAg',\n shortcuts: [':stayhome:'],\n searchTerms: ['stayhome'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/_1FGHypiub51kuTiNBX1a0H3NyFih3TnHX7bHU06j_ajTzT0OQfMLl9RI1SiQoxtgA2Grg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/_1FGHypiub51kuTiNBX1a0H3NyFih3TnHX7bHU06j_ajTzT0OQfMLl9RI1SiQoxtgA2Grg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'stayhome',\n },\n },\n },\n isCustomEmoji: true,\n index: 18,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/8P50XuS9Oo7h8wSqtIagBA',\n shortcuts: [':dothefive:'],\n searchTerms: ['dothefive'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/-nM0DOd49969h3GNcl705Ti1fIf1ZG_E3JxcOUVV-qPfCW6jY8xZ98caNLHkVSGRTSEb7Y9y=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/-nM0DOd49969h3GNcl705Ti1fIf1ZG_E3JxcOUVV-qPfCW6jY8xZ98caNLHkVSGRTSEb7Y9y=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'dothefive',\n },\n },\n },\n isCustomEmoji: true,\n index: 19,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Fv90Xq-vJcPq8gTqzreQAQ',\n shortcuts: [':elbowbump:'],\n searchTerms: ['elbowbump'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/2ou58X5XuhTrxjtIM2wew1f-HKRhN_T5SILQgHE-WD9dySzzJdGwL4R1gpKiJXcbtq6sjQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/2ou58X5XuhTrxjtIM2wew1f-HKRhN_T5SILQgHE-WD9dySzzJdGwL4R1gpKiJXcbtq6sjQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'elbowbump',\n },\n },\n },\n isCustomEmoji: true,\n index: 20,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Iv90XouTLuOR8gSxxrToBA',\n shortcuts: [':goodvibes:'],\n searchTerms: ['goodvibes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/2CvFOwgKpL29mW_C51XvaWa7Eixtv-3tD1XvZa1_WemaDDL2AqevKbTZ1rdV0OWcnOZRag=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/2CvFOwgKpL29mW_C51XvaWa7Eixtv-3tD1XvZa1_WemaDDL2AqevKbTZ1rdV0OWcnOZRag=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'goodvibes',\n },\n },\n },\n isCustomEmoji: true,\n index: 21,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Rf90XtDbG8GQ8gTz_prwAg',\n shortcuts: [':thanksdoc:'],\n searchTerms: ['thanksdoc'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/bUnO_VwXW2hDf-Da8D64KKv6nBJDYUBuo13RrOg141g2da8pi9-KClJYlUDuqIwyPBfvOO8=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/bUnO_VwXW2hDf-Da8D64KKv6nBJDYUBuo13RrOg141g2da8pi9-KClJYlUDuqIwyPBfvOO8=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'thanksdoc',\n },\n },\n },\n isCustomEmoji: true,\n index: 22,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/VP90Xv_wG82o8wTCi7CQAw',\n shortcuts: [':videocall:'],\n searchTerms: ['videocall'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/k5v_oxUzRWmTOXP0V6WJver6xdS1lyHMPcMTfxn23Md6rmixoR5RZUusFbZi1uZwjF__pv4=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/k5v_oxUzRWmTOXP0V6WJver6xdS1lyHMPcMTfxn23Md6rmixoR5RZUusFbZi1uZwjF__pv4=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'videocall',\n },\n },\n },\n isCustomEmoji: true,\n index: 23,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/dv90XtfhAurw8gTgzar4DA',\n shortcuts: [':virtualhug:'],\n searchTerms: ['virtualhug'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/U1TjOZlqtS58NGqQhE8VWDptPSrmJNkrbVRp_8jI4f84QqIGflq2Ibu7YmuOg5MmVYnpevc=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/U1TjOZlqtS58NGqQhE8VWDptPSrmJNkrbVRp_8jI4f84QqIGflq2Ibu7YmuOg5MmVYnpevc=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'virtualhug',\n },\n },\n },\n isCustomEmoji: true,\n index: 24,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hf90Xv-jHeOR8gSxxrToBA',\n shortcuts: [':yougotthis:'],\n searchTerms: ['yougotthis'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/s3uOe4lUx3iPIt1h901SlMp_sKCTp3oOVj1JV8izBw_vDVLxFqk5dq-3NX-nK_gnUwVEXld3=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/s3uOe4lUx3iPIt1h901SlMp_sKCTp3oOVj1JV8izBw_vDVLxFqk5dq-3NX-nK_gnUwVEXld3=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'yougotthis',\n },\n },\n },\n isCustomEmoji: true,\n index: 25,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/lP90XvOhCZGl8wSO1JmgAw',\n shortcuts: [':sanitizer:'],\n searchTerms: ['sanitizer'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/EJ_8vc4Gl-WxCWBurHwwWROAHrPzxgePodoNfkRY1U_I8L1O2zlqf7-wfUtTeyzq2qHNnocZ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/EJ_8vc4Gl-WxCWBurHwwWROAHrPzxgePodoNfkRY1U_I8L1O2zlqf7-wfUtTeyzq2qHNnocZ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'sanitizer',\n },\n },\n },\n isCustomEmoji: true,\n index: 26,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/uP90Xq6wNYrK8gTUoo3wAg',\n shortcuts: [':takeout:'],\n searchTerms: ['takeout'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/FizHI5IYMoNql9XeP7TV3E0ffOaNKTUSXbjtJe90e1OUODJfZbWU37VqBbTh-vpyFHlFIS0=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/FizHI5IYMoNql9XeP7TV3E0ffOaNKTUSXbjtJe90e1OUODJfZbWU37VqBbTh-vpyFHlFIS0=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'takeout',\n },\n },\n },\n isCustomEmoji: true,\n index: 27,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/fAF1XtDQMIrK8gTUoo3wAg',\n shortcuts: [':hydrate:'],\n searchTerms: ['hydrate'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/tpgZgmhX8snKniye36mnrDVfTnlc44EK92EPeZ0m9M2EPizn1vKEGJzNYdp7KQy6iNZlYDc1=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/tpgZgmhX8snKniye36mnrDVfTnlc44EK92EPeZ0m9M2EPizn1vKEGJzNYdp7KQy6iNZlYDc1=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hydrate',\n },\n },\n },\n isCustomEmoji: true,\n index: 28,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/vQF1XpyaG_XG8gTs77bACQ',\n shortcuts: [':chillwcat:'],\n searchTerms: ['chillwcat'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/y03dFcPc1B7CO20zgQYzhcRPka5Bhs6iSg57MaxJdhaLidFvvXBLf_i4_SHG7zJ_2VpBMNs=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/y03dFcPc1B7CO20zgQYzhcRPka5Bhs6iSg57MaxJdhaLidFvvXBLf_i4_SHG7zJ_2VpBMNs=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'chillwcat',\n },\n },\n },\n isCustomEmoji: true,\n index: 29,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/ygF1XpGUMMjk8gSDrI2wCw',\n shortcuts: [':chillwdog:'],\n searchTerms: ['chillwdog'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Ir9mDxzUi0mbqyYdJ3N9Lq7bN5Xdt0Q7fEYFngN3GYAcJT_tccH1as1PKmInnpt2cbWOam4=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Ir9mDxzUi0mbqyYdJ3N9Lq7bN5Xdt0Q7fEYFngN3GYAcJT_tccH1as1PKmInnpt2cbWOam4=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'chillwdog',\n },\n },\n },\n isCustomEmoji: true,\n index: 30,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/8gF1Xp_zK8jk8gSDrI2wCw',\n shortcuts: [':elbowcough:'],\n searchTerms: ['elbowcough'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/DTR9bZd1HOqpRJyz9TKiLb0cqe5Hb84Yi_79A6LWlN1tY-5kXqLDXRmtYVKE9rcqzEghmw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/DTR9bZd1HOqpRJyz9TKiLb0cqe5Hb84Yi_79A6LWlN1tY-5kXqLDXRmtYVKE9rcqzEghmw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'elbowcough',\n },\n },\n },\n isCustomEmoji: true,\n index: 31,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/EAJ1XrS7PMGQ8gTz_prwAg',\n shortcuts: [':learning:'],\n searchTerms: ['learning'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/ZuBuz8GAQ6IEcQc7CoJL8IEBTYbXEvzhBeqy1AiytmhuAT0VHjpXEjd-A5GfR4zDin1L53Q=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/ZuBuz8GAQ6IEcQc7CoJL8IEBTYbXEvzhBeqy1AiytmhuAT0VHjpXEjd-A5GfR4zDin1L53Q=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'learning',\n },\n },\n },\n isCustomEmoji: true,\n index: 32,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/JAJ1XpGpJYnW8wTupZu4Cw',\n shortcuts: [':washhands:'],\n searchTerms: ['washhands'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/qXUeUW0KpKBc9Z3AqUqr_0B7HbW1unAv4qmt7-LJGUK_gsFBIaHISWJNt4n3yvmAnQNZHE-u=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/qXUeUW0KpKBc9Z3AqUqr_0B7HbW1unAv4qmt7-LJGUK_gsFBIaHISWJNt4n3yvmAnQNZHE-u=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'washhands',\n },\n },\n },\n isCustomEmoji: true,\n index: 33,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/PAJ1XsOOI4fegwOo57ewAg',\n shortcuts: [':socialdist:'],\n searchTerms: ['socialdist'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/igBNi55-TACUi1xQkqMAor-IEXmt8He56K7pDTG5XoTsbM-rVswNzUfC5iwnfrpunWihrg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/igBNi55-TACUi1xQkqMAor-IEXmt8He56K7pDTG5XoTsbM-rVswNzUfC5iwnfrpunWihrg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'socialdist',\n },\n },\n },\n isCustomEmoji: true,\n index: 34,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/egJ1XufTKYfegwOo57ewAg',\n shortcuts: [':shelterin:'],\n searchTerms: ['shelterin'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/gjC5x98J4BoVSEPfFJaoLtc4tSBGSEdIlfL2FV4iJG9uGNykDP9oJC_QxAuBTJy6dakPxVeC=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/gjC5x98J4BoVSEPfFJaoLtc4tSBGSEdIlfL2FV4iJG9uGNykDP9oJC_QxAuBTJy6dakPxVeC=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'shelterin',\n },\n },\n },\n isCustomEmoji: true,\n index: 35,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/G8AfY6yWGuKuhL0PlbiA2AE',\n shortcuts: [':hand-pink-waving:'],\n searchTerms: ['hand-pink-waving'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/KOxdr_z3A5h1Gb7kqnxqOCnbZrBmxI2B_tRQ453BhTWUhYAlpg5ZP8IKEBkcvRoY8grY91Q=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/KOxdr_z3A5h1Gb7kqnxqOCnbZrBmxI2B_tRQ453BhTWUhYAlpg5ZP8IKEBkcvRoY8grY91Q=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hand-pink-waving',\n },\n },\n },\n isCustomEmoji: true,\n index: 36,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/KsIfY6LzFoLM6AKanYDQAg',\n shortcuts: [':face-blue-smiling:'],\n searchTerms: ['face-blue-smiling'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/cktIaPxFwnrPwn-alHvnvedHLUJwbHi8HCK3AgbHpphrMAW99qw0bDfxuZagSY5ieE9BBrA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/cktIaPxFwnrPwn-alHvnvedHLUJwbHi8HCK3AgbHpphrMAW99qw0bDfxuZagSY5ieE9BBrA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-smiling',\n },\n },\n },\n isCustomEmoji: true,\n index: 37,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/W8IfY_bwAfiPq7IPvNCA2AU',\n shortcuts: [':face-red-droopy-eyes:'],\n searchTerms: ['face-red-droopy-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/oih9s26MOYPWC_uL6tgaeOlXSGBv8MMoDrWzBt-80nEiVSL9nClgnuzUAKqkU9_TWygF6CI=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/oih9s26MOYPWC_uL6tgaeOlXSGBv8MMoDrWzBt-80nEiVSL9nClgnuzUAKqkU9_TWygF6CI=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-red-droopy-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 38,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/b8IfY7zOK9iVkNAP_I2A-AY',\n shortcuts: [':face-purple-crying:'],\n searchTerms: ['face-purple-crying'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/g6_km98AfdHbN43gvEuNdZ2I07MmzVpArLwEvNBwwPqpZYzszqhRzU_DXALl11TchX5_xFE=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/g6_km98AfdHbN43gvEuNdZ2I07MmzVpArLwEvNBwwPqpZYzszqhRzU_DXALl11TchX5_xFE=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-crying',\n },\n },\n },\n isCustomEmoji: true,\n index: 39,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hcIfY57lBJXp6AKBx4CoCA',\n shortcuts: [':text-green-game-over:'],\n searchTerms: ['text-green-game-over'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/cr36FHhSiMAJUSpO9XzjbOgxhtrdJNTVJUlMJeOOfLOFzKleAKT2SEkZwbqihBqfTXYCIg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/cr36FHhSiMAJUSpO9XzjbOgxhtrdJNTVJUlMJeOOfLOFzKleAKT2SEkZwbqihBqfTXYCIg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'text-green-game-over',\n },\n },\n },\n isCustomEmoji: true,\n index: 40,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/ssIfY7OFG5OykQOpn4CQCw',\n shortcuts: [':person-turqouise-waving:'],\n searchTerms: ['person-turqouise-waving'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/uNSzQ2M106OC1L3VGzrOsGNjopboOv-m1bnZKFGuh0DxcceSpYHhYbuyggcgnYyaF3o-AQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/uNSzQ2M106OC1L3VGzrOsGNjopboOv-m1bnZKFGuh0DxcceSpYHhYbuyggcgnYyaF3o-AQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-turqouise-waving',\n },\n },\n },\n isCustomEmoji: true,\n index: 41,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/xsIfY4OqCd2T29sP54iAsAw',\n shortcuts: [':face-green-smiling:'],\n searchTerms: ['face-green-smiling'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/G061SAfXg2bmG1ZXbJsJzQJpN8qEf_W3f5cb5nwzBYIV58IpPf6H90lElDl85iti3HgoL3o=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/G061SAfXg2bmG1ZXbJsJzQJpN8qEf_W3f5cb5nwzBYIV58IpPf6H90lElDl85iti3HgoL3o=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-green-smiling',\n },\n },\n },\n isCustomEmoji: true,\n index: 42,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/2sIfY8vIG8z96ALulYDQDQ',\n shortcuts: [':face-orange-frowning:'],\n searchTerms: ['face-orange-frowning'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Ar8jaEIxzfiyYmB7ejDOHba2kUMdR37MHn_R39mtxqO5CD4aYGvjDFL22DW_Cka6LKzhGDk=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Ar8jaEIxzfiyYmB7ejDOHba2kUMdR37MHn_R39mtxqO5CD4aYGvjDFL22DW_Cka6LKzhGDk=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-orange-frowning',\n },\n },\n },\n isCustomEmoji: true,\n index: 43,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/7cIfY5niDOmSkNAP08CA6A4',\n shortcuts: [':eyes-purple-crying:'],\n searchTerms: ['eyes-purple-crying'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/FrYgdeZPpvXs-6Mp305ZiimWJ0wV5bcVZctaUy80mnIdwe-P8HRGYAm0OyBtVx8EB9_Dxkc=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/FrYgdeZPpvXs-6Mp305ZiimWJ0wV5bcVZctaUy80mnIdwe-P8HRGYAm0OyBtVx8EB9_Dxkc=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'eyes-purple-crying',\n },\n },\n },\n isCustomEmoji: true,\n index: 44,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/A8MfY-_pEIKNr8oP78-AGA',\n shortcuts: [':face-fuchsia-wide-eyes:'],\n searchTerms: ['face-fuchsia-wide-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/zdcOC1SMmyXJOAddl9DYeEFN9YYcn5mHemJCdRFQMtDuS0V-IyE-5YjNUL1tduX1zs17tQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/zdcOC1SMmyXJOAddl9DYeEFN9YYcn5mHemJCdRFQMtDuS0V-IyE-5YjNUL1tduX1zs17tQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-fuchsia-wide-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 45,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/E8MfY5u7JPSXkNAP95GAmAE',\n shortcuts: [':cat-orange-whistling:'],\n searchTerms: ['cat-orange-whistling'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/0ocqEmuhrKCK87_J21lBkvjW70wRGC32-Buwk6TP4352CgcNjL6ug8zcsel6JiPbE58xhq5g=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/0ocqEmuhrKCK87_J21lBkvjW70wRGC32-Buwk6TP4352CgcNjL6ug8zcsel6JiPbE58xhq5g=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'cat-orange-whistling',\n },\n },\n },\n isCustomEmoji: true,\n index: 46,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/LsMfY8P6G-yckNAPjoWA8AI',\n shortcuts: [':face-blue-wide-eyes:'],\n searchTerms: ['face-blue-wide-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/2Ht4KImoWDlCddiDQVuzSJwpEb59nZJ576ckfaMh57oqz2pUkkgVTXV8osqUOgFHZdUISJM=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/2Ht4KImoWDlCddiDQVuzSJwpEb59nZJ576ckfaMh57oqz2pUkkgVTXV8osqUOgFHZdUISJM=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-wide-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 47,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Z8MfY8mzLbnovwK5roC4Bg',\n shortcuts: [':face-orange-raised-eyebrow:'],\n searchTerms: ['face-orange-raised-eyebrow'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/JbCfmOgYI-mO17LPw8e_ycqbBGESL8AVP6i7ZsBOVLd3PEpgrfEuJ9rEGpP_unDcqgWSCg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/JbCfmOgYI-mO17LPw8e_ycqbBGESL8AVP6i7ZsBOVLd3PEpgrfEuJ9rEGpP_unDcqgWSCg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-orange-raised-eyebrow',\n },\n },\n },\n isCustomEmoji: true,\n index: 48,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hcMfY5_zAbbxvwKLooCoCA',\n shortcuts: [':face-fuchsia-tongue-out:'],\n searchTerms: ['face-fuchsia-tongue-out'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/EURfJZi_heNulV3mfHzXBk8PIs9XmZ9lOOYi5za6wFMCGrps4i2BJX9j-H2gK6LIhW6h7sY=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/EURfJZi_heNulV3mfHzXBk8PIs9XmZ9lOOYi5za6wFMCGrps4i2BJX9j-H2gK6LIhW6h7sY=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-fuchsia-tongue-out',\n },\n },\n },\n isCustomEmoji: true,\n index: 49,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/ygF1XpGUMMjk8gSDrI2wCx',\n shortcuts: [':face-orange-biting-nails:'],\n searchTerms: ['face-orange-biting-nails'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/HmsXEgqUogkQOnL5LP_FdPit9Z909RJxby-uYcPxBLNhaPyqPTcGwvGaGPk2hzB_cC0hs_pV=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/HmsXEgqUogkQOnL5LP_FdPit9Z909RJxby-uYcPxBLNhaPyqPTcGwvGaGPk2hzB_cC0hs_pV=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-orange-biting-nails',\n },\n },\n },\n isCustomEmoji: true,\n index: 50,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/m8MfY4jbFsWJhL0PyouA2Ak',\n shortcuts: [':face-red-heart-shape:'],\n searchTerms: ['face-red-heart-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/I0Mem9dU_IZ4a9cQPzR0pUJ8bH-882Eg0sDQjBmPcHA6Oq0uXOZcsjPvPbtormx91Ha2eRA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/I0Mem9dU_IZ4a9cQPzR0pUJ8bH-882Eg0sDQjBmPcHA6Oq0uXOZcsjPvPbtormx91Ha2eRA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-red-heart-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 51,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/6_cfY8HJH8bV5QS5yYDYDg',\n shortcuts: [':face-fuchsia-poop-shape:'],\n searchTerms: ['face-fuchsia-poop-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/_xlyzvSimqMzhdhODyqUBLXIGA6F_d5en2bq-AIfc6fc3M7tw2jucuXRIo5igcW3g9VVe3A=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/_xlyzvSimqMzhdhODyqUBLXIGA6F_d5en2bq-AIfc6fc3M7tw2jucuXRIo5igcW3g9VVe3A=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-fuchsia-poop-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 52,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/DfgfY9LaNdmMq7IPuI2AaA',\n shortcuts: [':face-purple-wide-eyes:'],\n searchTerms: ['face-purple-wide-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/5RDrtjmzRQKuVYE_FKPUHiGh7TNtX5eSNe6XzcSytMsHirXYKunxpyAsVacTFMg0jmUGhQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/5RDrtjmzRQKuVYE_FKPUHiGh7TNtX5eSNe6XzcSytMsHirXYKunxpyAsVacTFMg0jmUGhQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-wide-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 53,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/HvgfY93GEYmqvwLUuYDwAQ',\n shortcuts: [':glasses-purple-yellow-diamond:'],\n searchTerms: ['glasses-purple-yellow-diamond'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/EnDBiuksboKsLkxp_CqMWlTcZtlL77QBkbjz_rLedMSDzrHmy_6k44YWFy2rk4I0LG6K2KI=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/EnDBiuksboKsLkxp_CqMWlTcZtlL77QBkbjz_rLedMSDzrHmy_6k44YWFy2rk4I0LG6K2KI=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'glasses-purple-yellow-diamond',\n },\n },\n },\n isCustomEmoji: true,\n index: 54,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/NvgfY9aeC_OFvOMPkrOAsAM',\n shortcuts: [':face-pink-tears:'],\n searchTerms: ['face-pink-tears'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/RL5QHCNcO_Mc98SxFEblXZt9FNoh3bIgsjm0Kj8kmeQJWMeTu7JX_NpICJ6KKwKT0oVHhAA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/RL5QHCNcO_Mc98SxFEblXZt9FNoh3bIgsjm0Kj8kmeQJWMeTu7JX_NpICJ6KKwKT0oVHhAA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-pink-tears',\n },\n },\n },\n isCustomEmoji: true,\n index: 55,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/UvgfY_vqE92T29sPvqiAkAU',\n shortcuts: [':body-blue-raised-arms:'],\n searchTerms: ['body-blue-raised-arms'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/2Jds3I9UKOfgjid97b_nlDU4X2t5MgjTof8yseCp7M-6ZhOhRkPGSPfYwmE9HjCibsfA1Uzo=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/2Jds3I9UKOfgjid97b_nlDU4X2t5MgjTof8yseCp7M-6ZhOhRkPGSPfYwmE9HjCibsfA1Uzo=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'body-blue-raised-arms',\n },\n },\n },\n isCustomEmoji: true,\n index: 56,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/YvgfY-LIBpjChgHKyYCQBg',\n shortcuts: [':hand-orange-covering-eyes:'],\n searchTerms: ['hand-orange-covering-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/y8ppa6GcJoRUdw7GwmjDmTAnSkeIkUptZMVQuFmFaTlF_CVIL7YP7hH7hd0TJbd8p9w67IM=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/y8ppa6GcJoRUdw7GwmjDmTAnSkeIkUptZMVQuFmFaTlF_CVIL7YP7hH7hd0TJbd8p9w67IM=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hand-orange-covering-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 57,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/ePgfY-K2Kp6Mr8oP1oqAwAc',\n shortcuts: [':trophy-yellow-smiling:'],\n searchTerms: ['trophy-yellow-smiling'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/7tf3A_D48gBg9g2N0Rm6HWs2aqzshHU4CuVubTXVxh1BP7YDBRC6pLBoC-ibvr-zCl_Lgg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/7tf3A_D48gBg9g2N0Rm6HWs2aqzshHU4CuVubTXVxh1BP7YDBRC6pLBoC-ibvr-zCl_Lgg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'trophy-yellow-smiling',\n },\n },\n },\n isCustomEmoji: true,\n index: 58,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/jPgfY5j2IIud29sP3ZeA4Ag',\n shortcuts: [':eyes-pink-heart-shape:'],\n searchTerms: ['eyes-pink-heart-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/5vzlCQfQQdzsG7nlQzD8eNjtyLlnATwFwGvrMpC8dgLcosNhWLXu8NN9qIS3HZjJYd872dM=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/5vzlCQfQQdzsG7nlQzD8eNjtyLlnATwFwGvrMpC8dgLcosNhWLXu8NN9qIS3HZjJYd872dM=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'eyes-pink-heart-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 59,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/oPgfY_DoKfSXkNAPq8-AgAo',\n shortcuts: [':face-turquoise-covering-eyes:'],\n searchTerms: ['face-turquoise-covering-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/H2HNPRO8f4SjMmPNh5fl10okSETW7dLTZtuE4jh9D6pSmaUiLfoZJ2oiY-qWU3Owfm1IsXg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/H2HNPRO8f4SjMmPNh5fl10okSETW7dLTZtuE4jh9D6pSmaUiLfoZJ2oiY-qWU3Owfm1IsXg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-turquoise-covering-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 60,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/tPgfY7mSO4XovQKzmYCgCw',\n shortcuts: [':hand-green-crystal-ball:'],\n searchTerms: ['hand-green-crystal-ball'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/qZfJrWDEmR03FIak7PMNRNpMjNsCnOzD9PqK8mOpAp4Kacn_uXRNJNb99tE_1uyEbvgJReF2=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/qZfJrWDEmR03FIak7PMNRNpMjNsCnOzD9PqK8mOpAp4Kacn_uXRNJNb99tE_1uyEbvgJReF2=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hand-green-crystal-ball',\n },\n },\n },\n isCustomEmoji: true,\n index: 61,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/zPgfY66lCJGRhL0Pz6iA4Aw',\n shortcuts: [':face-turquoise-drinking-coffee:'],\n searchTerms: ['face-turquoise-drinking-coffee'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/myqoI1MgFUXQr5fuWTC9mz0BCfgf3F8GSDp06o1G7w6pTz48lwARjdG8vj0vMxADvbwA1dA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/myqoI1MgFUXQr5fuWTC9mz0BCfgf3F8GSDp06o1G7w6pTz48lwARjdG8vj0vMxADvbwA1dA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-turquoise-drinking-coffee',\n },\n },\n },\n isCustomEmoji: true,\n index: 62,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/4PgfY73cJprKCq-_gIAO',\n shortcuts: [':body-green-covering-eyes:'],\n searchTerms: ['body-green-covering-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/UR8ydcU3gz360bzDsprB6d1klFSQyVzgn-Fkgu13dIKPj3iS8OtG1bhBUXPdj9pMwtM00ro=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/UR8ydcU3gz360bzDsprB6d1klFSQyVzgn-Fkgu13dIKPj3iS8OtG1bhBUXPdj9pMwtM00ro=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'body-green-covering-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 63,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/-fgfY9DIGYjbhgHLzoDIDw',\n shortcuts: [':goat-turquoise-white-horns:'],\n searchTerms: ['goat-turquoise-white-horns'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/jMnX4lu5GnjBRgiPtX5FwFmEyKTlWFrr5voz-Auko35oP0t3-zhPxR3PQMYa-7KhDeDtrv4=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/jMnX4lu5GnjBRgiPtX5FwFmEyKTlWFrr5voz-Auko35oP0t3-zhPxR3PQMYa-7KhDeDtrv4=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'goat-turquoise-white-horns',\n },\n },\n },\n isCustomEmoji: true,\n index: 64,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/EvkfY6uNC5OykQOewoCQAQ',\n shortcuts: [':hand-purple-blue-peace:'],\n searchTerms: ['hand-purple-blue-peace'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/-sC8wj6pThd7FNdslEoJlG4nB9SIbrJG3CRGh7-bNV0RVfcrJuwiWHoUZ6UmcVs7sQjxTg4=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/-sC8wj6pThd7FNdslEoJlG4nB9SIbrJG3CRGh7-bNV0RVfcrJuwiWHoUZ6UmcVs7sQjxTg4=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hand-purple-blue-peace',\n },\n },\n },\n isCustomEmoji: true,\n index: 65,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/LfkfY_zhH4GFr8oP4aKA6AI',\n shortcuts: [':face-blue-question-mark:'],\n searchTerms: ['face-blue-question-mark'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Wx4PMqTwG3f4gtR7J9Go1s8uozzByGWLSXHzrh3166ixaYRinkH_F05lslfsRUsKRvHXrDk=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Wx4PMqTwG3f4gtR7J9Go1s8uozzByGWLSXHzrh3166ixaYRinkH_F05lslfsRUsKRvHXrDk=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-question-mark',\n },\n },\n },\n isCustomEmoji: true,\n index: 66,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/RPkfY8TPGsCakNAP-JWAoAQ',\n shortcuts: [':face-blue-covering-eyes:'],\n searchTerms: ['face-blue-covering-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/kj3IgbbR6u-mifDkBNWVcdOXC-ut-tiFbDpBMGVeW79c2c54n5vI-HNYCOC6XZ9Bzgupc10=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/kj3IgbbR6u-mifDkBNWVcdOXC-ut-tiFbDpBMGVeW79c2c54n5vI-HNYCOC6XZ9Bzgupc10=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-covering-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 67,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Mm5IY53bH7SEq7IP-MWAkAM',\n shortcuts: [':face-purple-smiling-fangs:'],\n searchTerms: ['face-purple-smiling-fangs'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/k1vqi6xoHakGUfa0XuZYWHOv035807ARP-ZLwFmA-_NxENJMxsisb-kUgkSr96fj5baBOZE=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/k1vqi6xoHakGUfa0XuZYWHOv035807ARP-ZLwFmA-_NxENJMxsisb-kUgkSr96fj5baBOZE=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-smiling-fangs',\n },\n },\n },\n isCustomEmoji: true,\n index: 68,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/UW5IY-ibBqa8jgTymoCIBQ',\n shortcuts: [':face-purple-sweating:'],\n searchTerms: ['face-purple-sweating'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/tRnrCQtEKlTM9YLPo0vaxq9mDvlT0mhDld2KI7e_nDRbhta3ULKSoPVHZ1-bNlzQRANmH90=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/tRnrCQtEKlTM9YLPo0vaxq9mDvlT0mhDld2KI7e_nDRbhta3ULKSoPVHZ1-bNlzQRANmH90=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-sweating',\n },\n },\n },\n isCustomEmoji: true,\n index: 69,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Ym5IY7-0LoqA29sPq9CAkAY',\n shortcuts: [':face-purple-smiling-tears:'],\n searchTerms: ['face-purple-smiling-tears'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/MJV1k3J5s0hcUfuo78Y6MKi-apDY5NVDjO9Q7hL8fU4i0cIBgU-cU4rq4sHessJuvuGpDOjJ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/MJV1k3J5s0hcUfuo78Y6MKi-apDY5NVDjO9Q7hL8fU4i0cIBgU-cU4rq4sHessJuvuGpDOjJ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-smiling-tears',\n },\n },\n },\n isCustomEmoji: true,\n index: 70,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/dG5IY-mhEof9jgSykoCgBw',\n shortcuts: [':face-blue-star-eyes:'],\n searchTerms: ['face-blue-star-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/m_ANavMhp6cQ1HzX0HCTgp_er_yO2UA28JPbi-0HElQgnQ4_q5RUhgwueTpH-st8L3MyTA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/m_ANavMhp6cQ1HzX0HCTgp_er_yO2UA28JPbi-0HElQgnQ4_q5RUhgwueTpH-st8L3MyTA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-star-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 71,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hm5IY4W-H9SO5QS6n4CwCA',\n shortcuts: [':face-blue-heart-eyes:'],\n searchTerms: ['face-blue-heart-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/M9tzKd64_r3hvgpTSgca7K3eBlGuyiqdzzhYPp7ullFAHMgeFoNLA0uQ1dGxj3fXgfcHW4w=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/M9tzKd64_r3hvgpTSgca7K3eBlGuyiqdzzhYPp7ullFAHMgeFoNLA0uQ1dGxj3fXgfcHW4w=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-heart-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 72,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/mW5IY47PMcSnkMkPo6OAyAk',\n shortcuts: [':face-blue-three-eyes:'],\n searchTerms: ['face-blue-three-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/nSQHitVplLe5uZC404dyAwv1f58S3PN-U_799fvFzq-6b3bv-MwENO-Zs1qQI4oEXCbOJg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/nSQHitVplLe5uZC404dyAwv1f58S3PN-U_799fvFzq-6b3bv-MwENO-Zs1qQI4oEXCbOJg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-three-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 73,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/rW5IY_26FryOq7IPlL2A6Ao',\n shortcuts: [':face-blue-droopy-eyes:'],\n searchTerms: ['face-blue-droopy-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/hGPqMUCiXGt6zuX4dHy0HRZtQ-vZmOY8FM7NOHrJTta3UEJksBKjOcoE6ZUAW9sz7gIF_nk=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/hGPqMUCiXGt6zuX4dHy0HRZtQ-vZmOY8FM7NOHrJTta3UEJksBKjOcoE6ZUAW9sz7gIF_nk=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-droopy-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 74,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/v25IY7KcJIGOr8oPz4OA-As',\n shortcuts: [':planet-orange-purple-ring:'],\n searchTerms: ['planet-orange-purple-ring'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/xkaLigm3P4_1g4X1JOtkymcC7snuJu_C5YwIFAyQlAXK093X0IUjaSTinMTLKeRZ6280jXg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/xkaLigm3P4_1g4X1JOtkymcC7snuJu_C5YwIFAyQlAXK093X0IUjaSTinMTLKeRZ6280jXg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'planet-orange-purple-ring',\n },\n },\n },\n isCustomEmoji: true,\n index: 75,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-yellow-podium-blue',\n shortcuts: [':person-yellow-podium-blue:'],\n searchTerms: ['person-yellow-podium-blue'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/N28nFDm82F8kLPAa-jY_OySFsn3Ezs_2Bl5kdxC8Yxau5abkj_XZHYsS3uYKojs8qy8N-9w=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/N28nFDm82F8kLPAa-jY_OySFsn3Ezs_2Bl5kdxC8Yxau5abkj_XZHYsS3uYKojs8qy8N-9w=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-yellow-podium-blue',\n },\n },\n },\n isCustomEmoji: true,\n index: 76,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/baseball-white-cap-out',\n shortcuts: [':baseball-white-cap-out:'],\n searchTerms: ['baseball-white-cap-out'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/8DaGaXfaBN0c-ZsZ-1WqPJ6H9TsJOlUUQQEoXvmdROphZE9vdRtN0867Gb2YZcm2x38E9Q=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/8DaGaXfaBN0c-ZsZ-1WqPJ6H9TsJOlUUQQEoXvmdROphZE9vdRtN0867Gb2YZcm2x38E9Q=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'baseball-white-cap-out',\n },\n },\n },\n isCustomEmoji: true,\n index: 77,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/whistle-red-blow',\n shortcuts: [':whistle-red-blow:'],\n searchTerms: ['whistle-red-blow'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/DBu1ZfPJTnX9S1RyKKdBY-X_CEmj7eF6Uzl71j5jVBz5y4k9JcKnoiFtImAbeu4u8M2X8tU=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/DBu1ZfPJTnX9S1RyKKdBY-X_CEmj7eF6Uzl71j5jVBz5y4k9JcKnoiFtImAbeu4u8M2X8tU=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'whistle-red-blow',\n },\n },\n },\n isCustomEmoji: true,\n index: 78,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-turquoise-crowd-surf',\n shortcuts: [':person-turquoise-crowd-surf:'],\n searchTerms: ['person-turquoise-crowd-surf'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Q0wFvHZ5h54xGSTo-JeGst6InRU3yR6NdBRoyowaqGY66LPzdcrV2t-wBN21kBIdb2TeNA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Q0wFvHZ5h54xGSTo-JeGst6InRU3yR6NdBRoyowaqGY66LPzdcrV2t-wBN21kBIdb2TeNA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-turquoise-crowd-surf',\n },\n },\n },\n isCustomEmoji: true,\n index: 79,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/finger-red-number-one',\n shortcuts: [':finger-red-number-one:'],\n searchTerms: ['finger-red-number-one'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Hbk0wxBzPTBCDvD_y4qdcHL5_uu7SeOnaT2B7gl9GLB4u8Ecm9OaXCGSMMUBFeNGl5Q3fHJ2=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Hbk0wxBzPTBCDvD_y4qdcHL5_uu7SeOnaT2B7gl9GLB4u8Ecm9OaXCGSMMUBFeNGl5Q3fHJ2=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'finger-red-number-one',\n },\n },\n },\n isCustomEmoji: true,\n index: 80,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/text-yellow-goal',\n shortcuts: [':text-yellow-goal:'],\n searchTerms: ['text-yellow-goal'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/tnHp8rHjXecGbGrWNcs7xss_aVReaYE6H-QWRCXYg_aaYszHXnbP_pVADnibUiimspLvgX0L=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/tnHp8rHjXecGbGrWNcs7xss_aVReaYE6H-QWRCXYg_aaYszHXnbP_pVADnibUiimspLvgX0L=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'text-yellow-goal',\n },\n },\n },\n isCustomEmoji: true,\n index: 81,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/medal-yellow-first-red',\n shortcuts: [':medal-yellow-first-red:'],\n searchTerms: ['medal-yellow-first-red'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/EEHiiIalCBKuWDPtNOjjvmEZ-KRkf5dlgmhe5rbLn8aZQl-pNz_paq5UjxNhCrI019TWOQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/EEHiiIalCBKuWDPtNOjjvmEZ-KRkf5dlgmhe5rbLn8aZQl-pNz_paq5UjxNhCrI019TWOQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'medal-yellow-first-red',\n },\n },\n },\n isCustomEmoji: true,\n index: 82,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-blue-wheelchair-race',\n shortcuts: [':person-blue-wheelchair-race:'],\n searchTerms: ['person-blue-wheelchair-race'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/ZepxPGk5TwzrKAP9LUkzmKmEkbaF5OttNyybwok6mJENw3p0lxDXkD1X2_rAwGcUM0L-D04=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/ZepxPGk5TwzrKAP9LUkzmKmEkbaF5OttNyybwok6mJENw3p0lxDXkD1X2_rAwGcUM0L-D04=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-blue-wheelchair-race',\n },\n },\n },\n isCustomEmoji: true,\n index: 83,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/card-red-penalty',\n shortcuts: [':card-red-penalty:'],\n searchTerms: ['card-red-penalty'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/uRDUMIeAHnNsaIaShtRkQ6hO0vycbNH_BQT7i3PWetFJb09q88RTjxwzToBy9Cez20D7hA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/uRDUMIeAHnNsaIaShtRkQ6hO0vycbNH_BQT7i3PWetFJb09q88RTjxwzToBy9Cez20D7hA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'card-red-penalty',\n },\n },\n },\n isCustomEmoji: true,\n index: 84,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/stopwatch-blue-hand-timer',\n shortcuts: [':stopwatch-blue-hand-timer:'],\n searchTerms: ['stopwatch-blue-hand-timer'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/DCvefDAiskRfACgolTlvV1kMfiZVcG50UrmpnRrg3k0udFWG2Uo9zFMaJrJMSJYwcx6fMgk=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/DCvefDAiskRfACgolTlvV1kMfiZVcG50UrmpnRrg3k0udFWG2Uo9zFMaJrJMSJYwcx6fMgk=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'stopwatch-blue-hand-timer',\n },\n },\n },\n isCustomEmoji: true,\n index: 85,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-turquoise-speaker-shape',\n shortcuts: [':face-turquoise-speaker-shape:'],\n searchTerms: ['face-turquoise-speaker-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/WTFFqm70DuMxSC6ezQ5Zs45GaWD85Xwrd9Sullxt54vErPUKb_o0NJQ4kna5m7rvjbRMgr3A=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/WTFFqm70DuMxSC6ezQ5Zs45GaWD85Xwrd9Sullxt54vErPUKb_o0NJQ4kna5m7rvjbRMgr3A=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-turquoise-speaker-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 86,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/octopus-red-waving',\n shortcuts: [':octopus-red-waving:'],\n searchTerms: ['octopus-red-waving'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/L9Wo5tLT_lRQX36iZO_fJqLJR4U74J77tJ6Dg-QmPmSC_zhVQ-NodMRc9T0ozwvRXRaT43o=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/L9Wo5tLT_lRQX36iZO_fJqLJR4U74J77tJ6Dg-QmPmSC_zhVQ-NodMRc9T0ozwvRXRaT43o=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'octopus-red-waving',\n },\n },\n },\n isCustomEmoji: true,\n index: 87,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/pillow-turquoise-hot-chocolate',\n shortcuts: [':pillow-turquoise-hot-chocolate:'],\n searchTerms: ['pillow-turquoise-hot-chocolate'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/cAR4cehRxbn6dPbxKIb-7ShDdWnMxbaBqy2CXzBW4aRL3IqXs3rxG0UdS7IU71OEU7LSd20q=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/cAR4cehRxbn6dPbxKIb-7ShDdWnMxbaBqy2CXzBW4aRL3IqXs3rxG0UdS7IU71OEU7LSd20q=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pillow-turquoise-hot-chocolate',\n },\n },\n },\n isCustomEmoji: true,\n index: 88,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hourglass-purple-sand-orange',\n shortcuts: [':hourglass-purple-sand-orange:'],\n searchTerms: ['hourglass-purple-sand-orange'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/MFDLjasPt5cuSM_tK5Fnjaz_k08lKHdX_Mf7JkI6awaHriC3rGL7J_wHxyG6PPhJ8CJ6vsQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/MFDLjasPt5cuSM_tK5Fnjaz_k08lKHdX_Mf7JkI6awaHriC3rGL7J_wHxyG6PPhJ8CJ6vsQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hourglass-purple-sand-orange',\n },\n },\n },\n isCustomEmoji: true,\n index: 89,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/fish-orange-wide-eyes',\n shortcuts: [':fish-orange-wide-eyes:'],\n searchTerms: ['fish-orange-wide-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/iQLKgKs7qL3091VHgVgpaezc62uPewy50G_DoI0dMtVGmQEX5pflZrUxWfYGmRfzfUOOgJs=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/iQLKgKs7qL3091VHgVgpaezc62uPewy50G_DoI0dMtVGmQEX5pflZrUxWfYGmRfzfUOOgJs=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'fish-orange-wide-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 90,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/popcorn-yellow-striped-smile',\n shortcuts: [':popcorn-yellow-striped-smile:'],\n searchTerms: ['popcorn-yellow-striped-smile'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/TW_GktV5uVYviPDtkCRCKRDrGlUc3sJ5OHO81uqdMaaHrIQ5-sXXwJfDI3FKPyv4xtGpOlg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/TW_GktV5uVYviPDtkCRCKRDrGlUc3sJ5OHO81uqdMaaHrIQ5-sXXwJfDI3FKPyv4xtGpOlg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'popcorn-yellow-striped-smile',\n },\n },\n },\n isCustomEmoji: true,\n index: 91,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/penguin-blue-waving-tear',\n shortcuts: [':penguin-blue-waving-tear:'],\n searchTerms: ['penguin-blue-waving-tear'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/p2u7dcfZau4_bMOMtN7Ma8mjHX_43jOjDwITf4U9adT44I-y-PT7ddwPKkfbW6Wx02BTpNoC=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/p2u7dcfZau4_bMOMtN7Ma8mjHX_43jOjDwITf4U9adT44I-y-PT7ddwPKkfbW6Wx02BTpNoC=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'penguin-blue-waving-tear',\n },\n },\n },\n isCustomEmoji: true,\n index: 92,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/clock-turquoise-looking-up',\n shortcuts: [':clock-turquoise-looking-up:'],\n searchTerms: ['clock-turquoise-looking-up'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/tDnDkDZykkJTrsWEJPlRF30rmbek2wcDcAIymruOvSLTsUFIZHoAiYTRe9OtO-80lDfFGvo=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/tDnDkDZykkJTrsWEJPlRF30rmbek2wcDcAIymruOvSLTsUFIZHoAiYTRe9OtO-80lDfFGvo=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'clock-turquoise-looking-up',\n },\n },\n },\n isCustomEmoji: true,\n index: 93,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-red-smiling-live',\n shortcuts: [':face-red-smiling-live:'],\n searchTerms: ['face-red-smiling-live'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/14Pb--7rVcqnHvM7UlrYnV9Rm4J-uojX1B1kiXYvv1my-eyu77pIoPR5sH28-eNIFyLaQHs=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/14Pb--7rVcqnHvM7UlrYnV9Rm4J-uojX1B1kiXYvv1my-eyu77pIoPR5sH28-eNIFyLaQHs=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-red-smiling-live',\n },\n },\n },\n isCustomEmoji: true,\n index: 94,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hands-yellow-heart-red',\n shortcuts: [':hands-yellow-heart-red:'],\n searchTerms: ['hands-yellow-heart-red'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/qWSu2zrgOKLKgt_E-XUP9e30aydT5aF3TnNjvfBL55cTu1clP8Eoh5exN3NDPEVPYmasmoA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/qWSu2zrgOKLKgt_E-XUP9e30aydT5aF3TnNjvfBL55cTu1clP8Eoh5exN3NDPEVPYmasmoA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hands-yellow-heart-red',\n },\n },\n },\n isCustomEmoji: true,\n index: 95,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/volcano-green-lava-orange',\n shortcuts: [':volcano-green-lava-orange:'],\n searchTerms: ['volcano-green-lava-orange'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/_IWOdMxapt6IBY5Cb6LFVkA3J77dGQ7P2fuvYYv1-ahigpVfBvkubOuGLSCyFJ7jvis-X8I=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/_IWOdMxapt6IBY5Cb6LFVkA3J77dGQ7P2fuvYYv1-ahigpVfBvkubOuGLSCyFJ7jvis-X8I=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'volcano-green-lava-orange',\n },\n },\n },\n isCustomEmoji: true,\n index: 96,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-turquoise-waving-speech',\n shortcuts: [':person-turquoise-waving-speech:'],\n searchTerms: ['person-turquoise-waving-speech'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/gafhCE49PH_9q-PuigZaDdU6zOKD6grfwEh1MM7fYVs7smAS_yhYCBipq8gEiW73E0apKTzi=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/gafhCE49PH_9q-PuigZaDdU6zOKD6grfwEh1MM7fYVs7smAS_yhYCBipq8gEiW73E0apKTzi=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-turquoise-waving-speech',\n },\n },\n },\n isCustomEmoji: true,\n index: 97,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-orange-tv-shape',\n shortcuts: [':face-orange-tv-shape:'],\n searchTerms: ['face-orange-tv-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/EVK0ik6dL5mngojX9I9Juw4iFh053emP0wcUjZH0whC_LabPq-DZxN4Jg-tpMcEVfJ0QpcJ4=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/EVK0ik6dL5mngojX9I9Juw4iFh053emP0wcUjZH0whC_LabPq-DZxN4Jg-tpMcEVfJ0QpcJ4=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-orange-tv-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 98,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-blue-spam-shape',\n shortcuts: [':face-blue-spam-shape:'],\n searchTerms: ['face-blue-spam-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/hpwvR5UgJtf0bGkUf8Rn-jTlD6DYZ8FPOFY7rhZZL-JHj_7OPDr7XUOesilRPxlf-aW42Zg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/hpwvR5UgJtf0bGkUf8Rn-jTlD6DYZ8FPOFY7rhZZL-JHj_7OPDr7XUOesilRPxlf-aW42Zg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-spam-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 99,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-fuchsia-flower-shape',\n shortcuts: [':face-fuchsia-flower-shape:'],\n searchTerms: ['face-fuchsia-flower-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/o9kq4LQ0fE_x8yxj29ZeLFZiUFpHpL_k2OivHbjZbttzgQytU49Y8-VRhkOP18jgH1dQNSVz=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/o9kq4LQ0fE_x8yxj29ZeLFZiUFpHpL_k2OivHbjZbttzgQytU49Y8-VRhkOP18jgH1dQNSVz=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-fuchsia-flower-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 100,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-blue-holding-pencil',\n shortcuts: [':person-blue-holding-pencil:'],\n searchTerms: ['person-blue-holding-pencil'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/TKgph5IHIHL-A3fgkrGzmiNXzxJkibB4QWRcf_kcjIofhwcUK_pWGUFC4xPXoimmne3h8eQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/TKgph5IHIHL-A3fgkrGzmiNXzxJkibB4QWRcf_kcjIofhwcUK_pWGUFC4xPXoimmne3h8eQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-blue-holding-pencil',\n },\n },\n },\n isCustomEmoji: true,\n index: 101,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/body-turquoise-yoga-pose',\n shortcuts: [':body-turquoise-yoga-pose:'],\n searchTerms: ['body-turquoise-yoga-pose'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/GW3otW7CmWpuayb7Ddo0ux5c-OvmPZ2K3vaytJi8bHFjcn-ulT8vcHMNcqVqMp1j2lit2Vw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/GW3otW7CmWpuayb7Ddo0ux5c-OvmPZ2K3vaytJi8bHFjcn-ulT8vcHMNcqVqMp1j2lit2Vw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'body-turquoise-yoga-pose',\n },\n },\n },\n isCustomEmoji: true,\n index: 102,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/location-yellow-teal-bars',\n shortcuts: [':location-yellow-teal-bars:'],\n searchTerms: ['location-yellow-teal-bars'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/YgeWJsRspSlAp3BIS5HMmwtpWtMi8DqLg9fH7DwUZaf5kG4yABfE1mObAvjCh0xKX_HoIR23=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/YgeWJsRspSlAp3BIS5HMmwtpWtMi8DqLg9fH7DwUZaf5kG4yABfE1mObAvjCh0xKX_HoIR23=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'location-yellow-teal-bars',\n },\n },\n },\n isCustomEmoji: true,\n index: 103,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-turquoise-writing-headphones',\n shortcuts: [':person-turquoise-writing-headphones:'],\n searchTerms: ['person-turquoise-writing-headphones'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/DC4KrwzNkVxLZa2_KbKyjZTUyB9oIvH5JuEWAshsMv9Ctz4lEUVK0yX5PaMsTK3gGS-r9w=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/DC4KrwzNkVxLZa2_KbKyjZTUyB9oIvH5JuEWAshsMv9Ctz4lEUVK0yX5PaMsTK3gGS-r9w=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-turquoise-writing-headphones',\n },\n },\n },\n isCustomEmoji: true,\n index: 104,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-turquoise-wizard-wand',\n shortcuts: [':person-turquoise-wizard-wand:'],\n searchTerms: ['person-turquoise-wizard-wand'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/OiZeNvmELg2PQKbT5UCS0xbmsGbqRBSbaRVSsKnRS9gvJPw7AzPp-3ysVffHFbSMqlWKeQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/OiZeNvmELg2PQKbT5UCS0xbmsGbqRBSbaRVSsKnRS9gvJPw7AzPp-3ysVffHFbSMqlWKeQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-turquoise-wizard-wand',\n },\n },\n },\n isCustomEmoji: true,\n index: 105,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-blue-eating-spaghetti',\n shortcuts: [':person-blue-eating-spaghetti:'],\n searchTerms: ['person-blue-eating-spaghetti'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/AXZ8POmCHoxXuBaRxX6-xlT5M-nJZmO1AeUNo0t4o7xxT2Da2oGy347sHpMM8shtUs7Xxh0=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/AXZ8POmCHoxXuBaRxX6-xlT5M-nJZmO1AeUNo0t4o7xxT2Da2oGy347sHpMM8shtUs7Xxh0=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-blue-eating-spaghetti',\n },\n },\n },\n isCustomEmoji: true,\n index: 106,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-turquoise-music-note',\n shortcuts: [':face-turquoise-music-note:'],\n searchTerms: ['face-turquoise-music-note'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/-K6oRITFKVU8V4FedrqXGkV_vTqUufVCQpBpyLK6w3chF4AS1kzT0JVfJxhtlfIAw5jrNco=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/-K6oRITFKVU8V4FedrqXGkV_vTqUufVCQpBpyLK6w3chF4AS1kzT0JVfJxhtlfIAw5jrNco=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-turquoise-music-note',\n },\n },\n },\n isCustomEmoji: true,\n index: 107,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-pink-swaying-hair',\n shortcuts: [':person-pink-swaying-hair:'],\n searchTerms: ['person-pink-swaying-hair'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/L8cwo8hEoVhB1k1TopQaeR7oPTn7Ypn5IOae5NACgQT0E9PNYkmuENzVqS7dk2bYRthNAkQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/L8cwo8hEoVhB1k1TopQaeR7oPTn7Ypn5IOae5NACgQT0E9PNYkmuENzVqS7dk2bYRthNAkQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-pink-swaying-hair',\n },\n },\n },\n isCustomEmoji: true,\n index: 108,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-blue-speaking-microphone',\n shortcuts: [':person-blue-speaking-microphone:'],\n searchTerms: ['person-blue-speaking-microphone'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/FMaw3drKKGyc6dk3DvtHbkJ1Ki2uD0FLqSIiFDyuChc1lWcA9leahX3mCFMBIWviN2o8eyc=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/FMaw3drKKGyc6dk3DvtHbkJ1Ki2uD0FLqSIiFDyuChc1lWcA9leahX3mCFMBIWviN2o8eyc=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-blue-speaking-microphone',\n },\n },\n },\n isCustomEmoji: true,\n index: 109,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/rocket-red-countdown-liftoff',\n shortcuts: [':rocket-red-countdown-liftoff:'],\n searchTerms: ['rocket-red-countdown-liftoff'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/lQZFYAeWe5-SJ_fz6dCAFYz1MjBnEek8DvioGxhlj395UFTSSHqYAmfhJN2i0rz3fDD5DQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/lQZFYAeWe5-SJ_fz6dCAFYz1MjBnEek8DvioGxhlj395UFTSSHqYAmfhJN2i0rz3fDD5DQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'rocket-red-countdown-liftoff',\n },\n },\n },\n isCustomEmoji: true,\n index: 110,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-purple-rain-drops',\n shortcuts: [':face-purple-rain-drops:'],\n searchTerms: ['face-purple-rain-drops'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/woHW5Jl2RD0qxijnl_4vx4ZhP0Zp65D4Ve1DM_HrwJW-Kh6bQZoRjesGnEwjde8F4LynrQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/woHW5Jl2RD0qxijnl_4vx4ZhP0Zp65D4Ve1DM_HrwJW-Kh6bQZoRjesGnEwjde8F4LynrQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-rain-drops',\n },\n },\n },\n isCustomEmoji: true,\n index: 111,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-pink-drinking-tea',\n shortcuts: [':face-pink-drinking-tea:'],\n searchTerms: ['face-pink-drinking-tea'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/WRLIgKpnClgYOZyAwnqP-Edrdxu6_N19qa8gsB9P_6snZJYIMu5YBJX8dlM81YG6H307KA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/WRLIgKpnClgYOZyAwnqP-Edrdxu6_N19qa8gsB9P_6snZJYIMu5YBJX8dlM81YG6H307KA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-pink-drinking-tea',\n },\n },\n },\n isCustomEmoji: true,\n index: 112,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-purple-stage-event',\n shortcuts: [':person-purple-stage-event:'],\n searchTerms: ['person-purple-stage-event'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/YeVVscOyRcDJAhKo2bMwMz_B6127_7lojqafTZECTR9NSEunYO5zEi7R7RqxBD7LYLxfNnXe=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/YeVVscOyRcDJAhKo2bMwMz_B6127_7lojqafTZECTR9NSEunYO5zEi7R7RqxBD7LYLxfNnXe=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-purple-stage-event',\n },\n },\n },\n isCustomEmoji: true,\n index: 113,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-purple-open-box',\n shortcuts: [':face-purple-open-box:'],\n searchTerms: ['face-purple-open-box'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/7lJM2sLrozPtNLagPTcN0xlcStWpAuZEmO2f4Ej5kYgSp3woGdq3tWFrTH30S3mD2PyjlQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/7lJM2sLrozPtNLagPTcN0xlcStWpAuZEmO2f4Ej5kYgSp3woGdq3tWFrTH30S3mD2PyjlQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-open-box',\n },\n },\n },\n isCustomEmoji: true,\n index: 114,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/COLRg9qOwdQCFce-qgodrbsLaA',\n shortcuts: [':awesome:'],\n searchTerms: ['awesome'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/xqqFxk7nC5nYnjy0oiSPpeWX4yu4I-ysb3QJMOuVml8dHWz82FvF8bhGVjlosZRIG_XxHA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/xqqFxk7nC5nYnjy0oiSPpeWX4yu4I-ysb3QJMOuVml8dHWz82FvF8bhGVjlosZRIG_XxHA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'awesome',\n },\n },\n },\n isCustomEmoji: true,\n index: 115,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CMKC7uKOwdQCFce-qgodqbsLaA',\n shortcuts: [':gar:'],\n searchTerms: ['gar'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/pxQTF9D-uxlSIgoopRcS8zAZnBBEPp2R9bwo5qIc3kc7PF2k18so72-ohINWPa6OvWudEcsC=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/pxQTF9D-uxlSIgoopRcS8zAZnBBEPp2R9bwo5qIc3kc7PF2k18so72-ohINWPa6OvWudEcsC=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'gar',\n },\n },\n },\n isCustomEmoji: true,\n index: 116,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CJiQ8uiOwdQCFcx9qgodysAOHg',\n shortcuts: [':jakepeter:'],\n searchTerms: ['jakepeter'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/iq0g14tKRcLwmfdpHULRMeUGfpWUlUyJWr0adf1K1-dStgPOguOe8eo5bKrxmCqIOlu-J18=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/iq0g14tKRcLwmfdpHULRMeUGfpWUlUyJWr0adf1K1-dStgPOguOe8eo5bKrxmCqIOlu-J18=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'jakepeter',\n },\n },\n },\n isCustomEmoji: true,\n index: 117,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CI3h3uDJitgCFdARTgodejsFWg',\n shortcuts: [':wormRedBlue:'],\n searchTerms: ['wormRedBlue'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/QrjYSGexvrRfCVpWrgctyB3shVRAgKmXtctM1vUnA78taji1zYNWwrHs1GKBpdpG5A6yK_k=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/QrjYSGexvrRfCVpWrgctyB3shVRAgKmXtctM1vUnA78taji1zYNWwrHs1GKBpdpG5A6yK_k=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'wormRedBlue',\n },\n },\n },\n isCustomEmoji: true,\n index: 118,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CI69oYTKitgCFdaPTgodsHsP5g',\n shortcuts: [':wormOrangeGreen:'],\n searchTerms: ['wormOrangeGreen'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/S-L8lYTuP13Ds9TJZ2UlxdjDiwNRFPnj0o4x6DAecyJLXDdQ941upYRhxalbjzpJn5USU_k=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/S-L8lYTuP13Ds9TJZ2UlxdjDiwNRFPnj0o4x6DAecyJLXDdQ941upYRhxalbjzpJn5USU_k=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'wormOrangeGreen',\n },\n },\n },\n isCustomEmoji: true,\n index: 119,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CKzQr47KitgCFdCITgodq6EJZg',\n shortcuts: [':wormYellowRed:'],\n searchTerms: ['wormYellowRed'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/L9TQqjca5x7TE8ZB-ifFyU51xWXArz47rJFU7Pg2KgWMut5th9qsU-pCu1zIF98szO5wNXE=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/L9TQqjca5x7TE8ZB-ifFyU51xWXArz47rJFU7Pg2KgWMut5th9qsU-pCu1zIF98szO5wNXE=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'wormYellowRed',\n },\n },\n },\n isCustomEmoji: true,\n index: 120,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CPGD8Iu8kN4CFREChAod9OkLmg',\n shortcuts: [':ytg:'],\n searchTerms: ['ytg'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/7PgbidnZLTC-38qeoqYensfXg7s7EC1Dudv9q9l8aIjqLgnfvpfhnEBH_7toCmVmqhIe4I45=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/7PgbidnZLTC-38qeoqYensfXg7s7EC1Dudv9q9l8aIjqLgnfvpfhnEBH_7toCmVmqhIe4I45=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'ytg',\n },\n },\n },\n isCustomEmoji: true,\n index: 121,\n },\n];\n","import * as Collection from './collection/index.js';\n\nexport namespace Data {\n export const avatars = Collection.avatars;\n export const badges = Collection.globalBadges;\n\n export const css_color_names = Collection.css_color_names;\n export const items = Collection.items;\n export const names = Collection.names;\n export const tiers = Collection.tiers;\n export const tts = Collection.tts;\n\n export const messages = Collection.messages;\n export const normal_messages = Collection.normal_messages;\n export const twitch_messages = Collection.twitch_messages;\n export const youtube_messages = Collection.youtube_messages;\n\n export const emotes = Collection.emotes;\n export const ffz_emotes = Collection.FfzEmotes;\n export const bttv_emotes = Collection.BttvEmotes;\n export const seventv_emotes = Collection.SeventvEmotes;\n export const twitch_emotes = Collection.TwitchEmotes;\n export const youtube_emotes = Collection.YoutubeEmotes;\n}\n","import { Data } from '../../data/index.js';\n\nexport class RandomHelper {\n /**\n * Generate random color\n * @param type - Color format\n * @returns - Random color in specified format\n * @example\n * ```javascript\n * const hexColor = random.color('hex');\n * console.log(hexColor); // e.g. #3e92cc\n *\n * const rgbColor = random.color('rgb');\n * console.log(rgbColor); // e.g. rgb(62, 146, 204)\n * ```\n */\n color(type: 'hex' | 'hexa' | 'rgb' | 'rgba' | 'hsl' | 'hsla' | 'css-color-name' = 'hex') {\n switch (type) {\n default:\n case 'hex': {\n return `#${Math.floor(Math.random() * 0xffffff)\n .toString(16)\n .padStart(6, '0')}`;\n }\n case 'hexa': {\n const hex = `#${Math.floor(Math.random() * 0xffffff)\n .toString(16)\n .padStart(6, '0')}`;\n\n const alpha = Math.floor(Math.random() * 256)\n .toString(16)\n .padStart(2, '0');\n\n return hex + alpha;\n }\n case 'rgb': {\n const r = Math.floor(Math.random() * 256);\n const g = Math.floor(Math.random() * 256);\n const b = Math.floor(Math.random() * 256);\n\n return `rgb(${r}, ${g}, ${b})`;\n }\n case 'rgba': {\n const r = Math.floor(Math.random() * 256);\n const g = Math.floor(Math.random() * 256);\n const b = Math.floor(Math.random() * 256);\n const a = Math.random().toFixed(2);\n\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n }\n case 'hsl': {\n const h = Math.floor(Math.random() * 361);\n const s = Math.floor(Math.random() * 101);\n const l = Math.floor(Math.random() * 101);\n\n return `hsl(${h}, ${s}%, ${l}%)`;\n }\n case 'hsla': {\n const h = Math.floor(Math.random() * 361);\n const s = Math.floor(Math.random() * 101);\n const l = Math.floor(Math.random() * 101);\n const a = Math.random().toFixed(2);\n\n return `hsla(${h}, ${s}%, ${l}%, ${a})`;\n }\n case 'css-color-name': {\n var names = Data.css_color_names;\n\n return this.array(names)[0];\n }\n }\n }\n\n /**\n * Generate random number\n * @param min - Minimum value\n * @param max - Maximum value\n * @param float - Number of decimal places (0 for integer)\n * @returns - Random number\n * @example\n * ```javascript\n * const intNumber = random.number(1, 10);\n * console.log(intNumber); // e.g. 7\n *\n * const floatNumber = random.number(1, 10, 2);\n * console.log(floatNumber); // e.g. 3.14\n * ```\n */\n number(min: number, max: number, float: number = 0): number {\n if (min > max) [min, max] = [max, min];\n\n const rand = Math.random() * (max - min) + min;\n return float ? Number(rand.toFixed(float)) : Math.round(rand);\n }\n\n /**\n * Generate random boolean\n * @param threshold - Threshold between 0 and 1\n * @returns - Random boolean\n * @example\n * ```javascript\n * const boolValue = random.boolean(0.7);\n * console.log(boolValue); // e.g. true (70% chance)\n * ```\n */\n boolean(threshold: number = 0.5): boolean {\n return Math.random() > threshold;\n }\n\n /**\n * Generate random string\n * @param length - Length of the string\n * @param chars - Characters to use\n * @returns - Random string\n * @example\n * ```javascript\n * const randString = random.string(10); // e.g. \"aZ3bT9qP1x\"\n * const randHex = random.string(8, 'hex'); // e.g. \"4f3c2a1b\"\n * const randNumStr = random.string(6, 'numbers'); // e.g. \"839201\"\n * const randLetterStr = random.string(6, 'letters'); // e.g. \"aZbTqP\"\n * const randHexUpper = random.string(6, 'hex-upper'); // e.g. \"4F3C2A1B\"\n * const randHexLower = random.string(6, 'hex-lower'); // e.g. \"4f3c2a1b\"\n * ```\n */\n string(\n length: number,\n chars:\n | 'numeric'\n | 'numbers'\n | 'letters'\n | 'hex'\n | 'hex-upper'\n | 'hex-lower'\n | string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',\n ): string {\n if (chars === 'numbers' || chars === 'numeric') chars = '0123456789';\n else if (chars === 'letters' || chars === 'letter')\n chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n else if (chars === 'hex' || chars === 'hexadecimal') chars = '0123456789abcdef';\n else if (chars === 'hex-upper' || chars === 'hexadecimal-upper') chars = '0123456789ABCDEF';\n else if (chars === 'hex-lower' || chars === 'hexadecimal-lower') chars = '0123456789abcdef';\n\n let result = '';\n\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n\n return result;\n }\n\n /**\n * Pick random element from array\n * @param arr - Array to pick from\n * @returns - Random element and its index\n * @example\n * ```javascript\n * const [element, index] = random.array(['apple', 'banana', 'cherry']);\n * console.log(element, index); // e.g. \"banana\", 1\n * ```\n */\n array<T>(arr: T[]): [value: T, index: number] {\n const index = this.number(0, arr.length - 1);\n\n return [arr[index], index];\n }\n\n /**\n * Generate random date\n * @param start - Start date\n * @param end - End date\n * @returns - Random date between start and end\n * @example\n * ```javascript\n * const randDate = random.date(new Date(2020, 0, 1), new Date());\n * console.log(randDate); // e.g. 2022-05-15T10:30:00.000Z\n * ```\n */\n date(start: Date = new Date(2000, 0, 1), end: Date = new Date()): Date {\n const date = new Date(this.number(start.getTime(), end.getTime()));\n\n return date;\n }\n\n /**\n * Generate ISO date string offset by days\n * @param daysAgo - Number of days to go back\n * @returns - ISO date string\n * @example\n * ```javascript\n * const isoDate = random.daysOffset(7);\n * console.log(isoDate); // e.g. \"2024-06-10T14:23:45.678Z\"\n *\n * const isoDate30 = random.daysOffset(30);\n * console.log(isoDate30); // e.g. \"2024-05-18T09:15:30.123Z\"\n * ```\n */\n daysOffset(daysAgo: number): string {\n const now = Date.now();\n const past = now - this.number(0, daysAgo * 24 * 60 * 60 * 1000);\n\n return new Date(past).toISOString();\n }\n\n /**\n * Generate UUID v4\n * @returns - UUID string\n * @example\n * ```javascript\n * const uuid = random.uuid();\n * console.log(uuid); // e.g. \"3b12f1df-5232-4e3a-9a0c-3f9f1b1b1b1b\"\n * ```\n */\n uuid(): string {\n return crypto.randomUUID();\n }\n}\n","import { Data } from '../../data/index.js';\nimport { Emote, Provider, Twitch } from '../../types.js';\nimport { NumberHelper } from './number.js';\nimport { RandomHelper } from './random.js';\n\nexport type BadgeOptions =\n | Twitch.tags[]\n | Twitch.tags\n | `${Twitch.tags}/${string}`\n | `${Twitch.tags}/${string}`[];\n\nexport type TwitchResult = {\n keys: Twitch.tags[];\n badges: Twitch.badge[];\n versions: { [K in Twitch.tags]?: string | number };\n amount: { [K in Twitch.tags]?: string | number };\n};\n\nexport type YouTubeResult = {\n isVerified: boolean;\n isChatOwner: boolean;\n isChatSponsor: boolean;\n isChatModerator: boolean;\n};\n\nexport class MessageHelper {\n /**\n * Finds emotes in a given text.\n * @param text - The text to search for emotes.\n * @param emotes - An array of emotes to search for. Defaults to Local data emotes.\n * @returns An array of emotes found in the text with their positions.\n */\n findEmotesInText(text: string, emotes: Emote[] = Data.emotes): Emote[] {\n const result: Emote[] = [];\n\n emotes\n .filter((emote) => emote.type !== 'emoji')\n .forEach((emote) => {\n const name = emote.name;\n\n let searchIndex = 0;\n let start = 0;\n\n while (searchIndex < text.length) {\n const index = text.indexOf(name, start);\n\n if (index === -1) break;\n\n const before = index > 0 ? text[index - 1] : ' ';\n const after = index + name.length < text.length ? text[index + name.length] : ' ';\n\n if (/\\s/.test(before) && /\\s/.test(after)) {\n result.push({ ...emote, start: index, end: index + name.length });\n }\n\n start = index + 1;\n }\n });\n\n return result;\n }\n\n /**\n * Replaces emotes in the text with corresponding HTML image tags.\n * @param text - The text containing emotes.\n * @param emotes - An array of emotes with their positions in the text.\n * @returns The text with emotes replaced by HTML image tags.\n */\n replaceEmotesWithHTML(text: string, emotes: Emote[]): string {\n if (!emotes.length) return text;\n\n let result = '';\n let index = 0;\n\n emotes\n .filter((emote) => emote.type !== 'emoji')\n .forEach((emote) => {\n if (emote.start < index) return;\n\n result += text.substring(index, emote.start);\n\n const emotesArray = Array.from({ ...emote.urls, length: 5 })\n .slice(1)\n .reverse()\n .filter(Boolean);\n\n const imgUrl = emotesArray[0] || emote.urls['1'];\n\n result += `<img src=\"${imgUrl}\" alt=\"${emote.name}\" class=\"emote\" style=\"width: auto; height: 1em; vertical-align: middle;\" />`;\n\n index = emote.end;\n });\n\n result += text.substring(index);\n\n return result;\n }\n\n /**\n * Checks if the text contains only emotes and whitespace.\n * @param text - The text to check.\n * @param emotes - An array of emotes with their positions in the text.\n * @returns True if the text contains only emotes and whitespace, false otherwise.\n */\n hasOnlyEmotes(text: string, emotes: Emote[]): boolean {\n const textWithoutEmotes = emotes.reduce((acc, emote) => {\n return acc\n .replace(new RegExp(`\\\\b${emote.name}\\\\b`, 'g'), '')\n .replace(/<img[^>]*class=\"emote\"[^>]*>/gi, '');\n }, text);\n\n return textWithoutEmotes.trim().length === 0;\n }\n\n /**\n * Replaces YouTube emotes in the text with corresponding HTML image tags.\n * @param text - The text containing YouTube emotes.\n * @param emotes - An array of YouTube emotes. Defaults to Local data YouTube emotes.\n * @returns The text with YouTube emotes replaced by HTML image tags.\n */\n replaceYoutubeEmotesWithHTML(text: string, emotes = Data.youtube_emotes): string {\n const emoteCodesInside = Array.from(text.matchAll(/:(.*?):/gim), (x) => x[0]);\n\n emoteCodesInside.forEach((code) => {\n const emote = emotes.find(\n (e) => e.shortcuts.includes(code) || e.searchTerms.includes(code.slice(1, -1)),\n );\n\n if (emote) {\n const url = emote.image.thumbnails.at(-1)?.url;\n const alt = emote.image.accessibility.accessibilityData.label;\n\n if (url) {\n text = text.replace(\n code,\n `<img src=\"${url}\" alt=\"${alt}\" class=\"emote\" style=\"width: auto; height: 1em; vertical-align: middle;\" />`,\n );\n }\n }\n });\n\n return text;\n }\n\n /**\n * Maps global badge versions to a structured format.\n * @param globalBadges - An array of Twitch global badges. Defaults to Local data badges.\n * @returns An array of objects containing badge IDs and their corresponding versions.\n * @example\n * ```javascript\n * const badgeVersions = mapGlobalBadgeVersions();\n * console.log(badgeVersions);\n * // Output:\n * [\n * {\n * id: 'subscriber',\n * versions: [\n * { type: 'subscriber', version: '1', url: 'https://...', description: 'Subscriber' },\n * { type: 'subscriber', version: '2', url: 'https://...', description: '2-Month Subscriber' },\n * // ... more versions\n * ],\n * },\n * {\n * id: 'bits',\n * versions: [\n * { type: 'bits', version: '100', url: 'https://...', description: 'cheer 100' },\n * { type: 'bits', version: '1000', url: 'https://...', description: 'cheer 1000' },\n * // ... more versions\n * ],\n * },\n * // ... more badges\n * ]\n * ```\n */\n mapGlobalBadgeVersions(globalBadges: Twitch.GlobalBadge[] = Data.badges): Array<{\n id: Twitch.tags;\n versions: Twitch.badge[];\n }> {\n return globalBadges.map((badge) => ({\n id: badge.set_id,\n versions: badge.versions.map((version) => ({\n type: badge.set_id,\n version: version.id,\n url: version.image_url_4x,\n description: version.title,\n })),\n }));\n }\n\n /**\n * Maps a badge type and variation to the corresponding badge version amount.\n * @param type - The badge type (e.g., 'subscriber', 'bits', etc.).\n * @param variation - The badge variation, which can be a number or a string (e.g., 'horde', 'alliance', etc.).\n * @returns The badge version amount as a string. Returns '0' if no matching badge version is found.\n * @example\n * ```javascript\n * // For subscriber badge with 3 months\n * mapGlobalBadgeVersionAmount('subscriber', 3); // Returns '3'\n * // For bits badge with 5000 bits\n * mapGlobalBadgeVersionAmount('bits', 5000); // Returns the corresponding badge version based on the mapping\n * // For warcraft badge with 'horde' variation\n * mapGlobalBadgeVersionAmount('warcraft', 'horde'); // Returns 'horde'\n * ```\n */\n mapGlobalBadgeVersionAmount(type: Twitch.tags, variation: string | number): string {\n const IdToId = (key: Twitch.tags) =>\n Data.badges\n .find((b) => b.set_id === key)!\n .versions.map((v) => [v.id, parseInt(v.id)] as [string, number]);\n\n let result = '0';\n\n switch (type) {\n case 'subscriber': {\n if (isNaN(parseInt(variation as string))) return result;\n\n const map = Object.entries({\n '0': 0,\n '1': 1,\n '2': 2,\n '3': 3,\n '4': 6,\n '5': 9,\n '6': 12,\n });\n\n for (const [key, minAmount] of map) {\n if (parseInt(variation as string) >= minAmount) result = key;\n }\n\n break;\n }\n case 'bits':\n case 'sub-gifter':\n case 'bits-leader':\n case 'clips-leader':\n case 'sub-gift-leader': {\n if (isNaN(parseInt(variation as string))) return result;\n\n const map = IdToId(type);\n\n for (const [key, minAmount] of map) {\n if (parseInt(variation as string) >= minAmount) result = key;\n }\n\n break;\n }\n case 'warcraft': {\n const map = {\n horde: 'horde',\n alliance: 'alliance',\n };\n\n result =\n Object.entries(map).find(\n ([_, label]) => label.toLowerCase() === String(variation).toLowerCase(),\n )?.[0] || '0';\n\n break;\n }\n case 'twitchbot': {\n const map = {\n 1: 'auto mod',\n 2: 'automated moderation system',\n };\n\n result =\n Object.entries(map).find(\n ([_, label]) => label.toLowerCase() === String(variation).toLowerCase(),\n )?.[0] || '0';\n break;\n }\n case 'moments': {\n if (isNaN(parseInt(variation as string))) {\n const map = Object.fromEntries(\n Array.from({ length: 20 }, (_, i) => i + 1).map((num) => [num, `tier ${num}`]),\n );\n\n result =\n Object.entries(map).find(\n ([_, label]) => label.toLowerCase() === String(variation).toLowerCase(),\n )?.[0] || '0';\n } else {\n const map = IdToId('moments');\n\n for (const [key, minAmount] of map) {\n if (parseInt(variation as string) >= minAmount) result = key;\n }\n }\n\n break;\n }\n case 'power-rangers': {\n if (isNaN(parseInt(variation as string))) {\n const map = {\n 0: ['black ranger', 'black', 'blackranger'],\n 1: ['blue ranger', 'blue', 'blueranger'],\n 2: ['green ranger', 'green', 'greenranger'],\n 3: ['pink ranger', 'pink', 'pinkranger'],\n 4: ['red ranger', 'red', 'redranger'],\n 5: ['white ranger', 'white', 'whiteranger'],\n 6: ['yellow ranger', 'yellow', 'yellowranger'],\n };\n\n result =\n Object.entries(map).find(([_, labels]) =>\n labels.some((label) => label.toLowerCase() === String(variation).toLowerCase()),\n )?.[0] || '0';\n } else {\n const map = IdToId('power-rangers');\n\n for (const [key, minAmount] of map) {\n if (parseInt(variation as string) >= minAmount) result = key;\n }\n }\n\n break;\n }\n case 'predictions': {\n const map = Object.fromEntries(\n IdToId('predictions').map(([key, _]) => [\n key,\n [key, key.replace('-', ' '), key.replace('-', '')],\n ]),\n );\n\n result =\n Object.entries(map).find(([_, labels]) =>\n labels.some((label) => label.toLowerCase() === String(variation).toLowerCase()),\n )?.[0] || '0';\n\n break;\n }\n case 'social-sharing': {\n if (isNaN(parseInt(variation as string))) {\n const map = Object.fromEntries(\n IdToId('social-sharing').map(([key, _]) => [\n key,\n [key + ' views', key.replace('-', '') + ' views'],\n ]),\n );\n\n result =\n Object.entries(map).find(([_, labels]) =>\n labels.some((label) => label.toLowerCase() === String(variation).toLowerCase()),\n )?.[0] || '0';\n } else {\n const map = {\n 1: 100,\n 2: 10000,\n 3: 100000,\n };\n\n for (const [key, minAmount] of Object.entries(map)) {\n if (parseInt(variation as string) >= minAmount) result = key;\n }\n }\n\n break;\n }\n }\n\n return result;\n }\n\n /**\n * Generates badge data based on the provided badges and platform.\n * @param badges - The badges to generate. Can be an array or a comma-separated string.\n * @param provider - The platform provider ('twitch' or 'youtube'). Defaults to 'twitch'.\n * @returns A promise that resolves to the generated badge data.\n * @example\n * ```javascript\n * // Generate Twitch badges\n * const twitchBadges = await generateBadges(['broadcaster', 'moderator'], 'twitch');\n * // Generate YouTube badges\n * const youtubeBadges = await generateBadges('sponsor, moderator', 'youtube');\n * ```\n */\n async generateBadges<T extends Provider>(\n badges: BadgeOptions = [],\n provider: T,\n ): Promise<T extends 'twitch' ? TwitchResult : YouTubeResult> {\n const globalBadges = this.mapGlobalBadgeVersions();\n\n if (!Array.isArray(badges) && typeof badges === 'string') {\n badges = badges.split(',').map((e) => e.trim()) as Twitch.tags[];\n }\n\n var clearedBadges = badges.map((badge) => badge.split('/')[0] as Twitch.tags);\n\n if (!clearedBadges || !clearedBadges.length) {\n const number = new NumberHelper();\n const random = new RandomHelper();\n var max = number.random(1, 3);\n\n for await (const _ of Array.from({ length: max }, () => '')) {\n // var current = random.array(Object.keys(Data.badges))[0] as Twitch.roles;\n const item = random.array(globalBadges)[0];\n\n if (!clearedBadges.includes(item.id) && Array.isArray(clearedBadges)) {\n clearedBadges.push(item.id);\n } else {\n clearedBadges = [item.id];\n }\n }\n }\n\n var result;\n\n switch (provider) {\n case 'twitch': {\n const keys = Array.from(clearedBadges).filter((e) =>\n globalBadges.some((badge) => badge.id === e),\n ) as Twitch.tags[];\n\n const versions = badges.reduce(\n (acc, data) => {\n var [badge, variation = '1'] = data.split('/') as [Twitch.tags, string];\n\n let value: string | number = variation;\n\n if (!isNaN(parseInt(value))) value = parseInt(value);\n else if (!value) value = 0;\n\n acc[badge] = this.mapGlobalBadgeVersionAmount(badge, value);\n\n return acc;\n },\n {} as { [K in Twitch.tags]?: string | number },\n );\n\n result = {\n keys,\n versions,\n amount: badges.reduce(\n (acc, data) => {\n var [badge, variation = '1'] = data.split('/') as [Twitch.tags, string];\n\n let value: string | number = variation;\n\n if (!isNaN(parseInt(value))) value = parseInt(value);\n else if (!value) value = 0;\n\n acc[badge] = value;\n\n return acc;\n },\n {} as { [K in Twitch.tags]?: string | number },\n ),\n badges: Array.from(clearedBadges)\n .slice(0, 3)\n .map((badge) => {\n const data = globalBadges.find((b) => b.id === badge);\n\n if (data?.versions && data.versions.length) {\n const quantity = versions[badge];\n\n const version = data.versions.find((v) => v.version === String(quantity));\n\n if (version) return version;\n\n return data.versions[0];\n }\n\n return;\n })\n .filter(Boolean) as Twitch.badge[],\n };\n\n break;\n }\n\n case 'youtube': {\n var details = {\n 'verified': { isVerified: true },\n 'partner': { isVerified: true },\n 'broadcaster': { isChatOwner: true },\n 'host': { isChatOwner: true },\n 'sponsor': { isChatSponsor: true },\n 'subscriber': { isChatSponsor: true },\n 'moderator': { isChatModerator: true },\n };\n\n result = Object.values(clearedBadges).reduce(\n (acc, key) => {\n if (key in details) {\n Object.assign(acc, details[key as keyof typeof details]);\n }\n\n return acc;\n },\n {\n isVerified: false,\n isChatOwner: false,\n isChatSponsor: false,\n isChatModerator: false,\n } as {\n isVerified: boolean;\n isChatOwner: boolean;\n isChatSponsor: boolean;\n isChatModerator: boolean;\n },\n );\n\n break;\n }\n }\n\n return result as T extends 'twitch' ? TwitchResult : YouTubeResult;\n }\n}\n","import { ClientEvents, Provider, StreamElements } from '../../types.js';\n\nexport class EventHelper {\n /**\n * Parses the provider information from the event detail object.\n * @param detail - The event detail object received from the StreamElements event.\n * @returns An object containing the provider and the original event data.\n */\n parseProvider(detail: StreamElements.Event.onEventReceived, _provider?: Provider): ClientEvents {\n var provider: Provider =\n // @ts-ignore\n _provider ||\n // @ts-ignore\n detail.event?.provider ||\n // @ts-ignore\n detail.event?.service ||\n // @ts-ignore\n detail.event?.data?.provider ||\n // @ts-ignore\n window?.client?.details?.provider ||\n 'twitch';\n\n const actAsStreamElements = [\n 'kvstore:update',\n 'bot:counter',\n 'alertService:toggleSound',\n 'tip-latest',\n 'event:test',\n 'event:skip',\n ] as StreamElements.Event.onEventReceived['listener'][];\n\n if (actAsStreamElements.some((l) => l === detail.listener)) provider = 'streamelements';\n\n const received = { provider: provider, data: detail } as ClientEvents;\n\n return received;\n }\n}\n","import { css_color_names } from '../data/collection/css.js';\n\n/**\n * Parse a color string to RGBA components\n * @param str - color string\n * @param format - format of the input color string\n * @returns - RGBA components or null if parsing fails\n */\nexport function parseToRGBA(\n str: string,\n format: string | false,\n): { r: number; g: number; b: number; a: number } | null {\n if (!format) return null;\n\n switch (format) {\n case 'hex': {\n const hex = str.replace('#', '');\n let r = 0,\n g = 0,\n b = 0,\n a = 1;\n\n if (hex.length === 3) {\n r = parseInt(hex[0] + hex[0], 16);\n g = parseInt(hex[1] + hex[1], 16);\n b = parseInt(hex[2] + hex[2], 16);\n } else if (hex.length === 6) {\n r = parseInt(hex.slice(0, 2), 16);\n g = parseInt(hex.slice(2, 4), 16);\n b = parseInt(hex.slice(4, 6), 16);\n } else if (hex.length === 4) {\n r = parseInt(hex[0] + hex[0], 16);\n g = parseInt(hex[1] + hex[1], 16);\n b = parseInt(hex[2] + hex[2], 16);\n a = parseInt(hex[3] + hex[3], 16) / 255;\n } else if (hex.length === 8) {\n r = parseInt(hex.slice(0, 2), 16);\n g = parseInt(hex.slice(2, 4), 16);\n b = parseInt(hex.slice(4, 6), 16);\n a = parseInt(hex.slice(6, 8), 16) / 255;\n }\n\n return { r, g, b, a };\n }\n\n case 'rgb':\n case 'rgba': {\n const match = str.match(/rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\s*\\)/);\n if (!match) return null;\n\n return {\n r: parseInt(match[1]),\n g: parseInt(match[2]),\n b: parseInt(match[3]),\n a: match[4] ? parseFloat(match[4]) : 1,\n };\n }\n\n case 'hsl':\n case 'hsla': {\n const match = str.match(/hsla?\\(\\s*(\\d+)\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%(?:\\s*,\\s*([\\d.]+))?\\s*\\)/);\n if (!match) return null;\n\n const h = parseInt(match[1]);\n const s = parseInt(match[2]);\n const l = parseInt(match[3]);\n const a = match[4] ? parseFloat(match[4]) : 1;\n\n const rgb = hslToRgb(h, s, l);\n return { ...rgb, a };\n }\n\n case 'css-color-name': {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = 1;\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n\n ctx.fillStyle = str;\n ctx.fillRect(0, 0, 1, 1);\n const [r, g, b] = ctx.getImageData(0, 0, 1, 1).data;\n\n return { r, g, b, a: 1 };\n }\n\n default:\n return null;\n }\n}\n\n/**\n * Convert RGBA to Hex\n * @param rgba - RGBA components\n * @param includeAlpha - Whether to include alpha in the hex string\n * @returns Hex color string\n */\nexport function rgbaToHex(\n rgba: { r: number; g: number; b: number; a: number },\n includeAlpha: boolean = true,\n): string {\n const toHex = (n: number) => Math.round(n).toString(16).padStart(2, '0');\n\n let hex = `#${toHex(rgba.r)}${toHex(rgba.g)}${toHex(rgba.b)}`;\n\n if (includeAlpha && rgba.a < 1) {\n hex += toHex(rgba.a * 255);\n }\n\n return hex;\n}\n\n/**\n * Convert RGB to HSL\n * @param r - Red component (0-255)\n * @param g - Green component (0-255)\n * @param b - Blue component (0-255)\n * @returns HSL components\n */\nexport function rgbToHsl(r: number, g: number, b: number): { h: number; s: number; l: number } {\n r /= 255;\n g /= 255;\n b /= 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (delta !== 0) {\n s = l > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n\n switch (max) {\n case r:\n h = ((g - b) / delta + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / delta + 2) / 6;\n break;\n case b:\n h = ((r - g) / delta + 4) / 6;\n break;\n }\n }\n\n return {\n h: Math.round(h * 360),\n s: Math.round(s * 100),\n l: Math.round(l * 100),\n };\n}\n\n/**\n * Convert HSL to RGB\n * @param h - Hue (0-360)\n * @param s - Saturation (0-100)\n * @param l - Lightness (0-100)\n * @returns RGB components\n */\nexport function hslToRgb(h: number, s: number, l: number): { r: number; g: number; b: number } {\n h /= 360;\n s /= 100;\n l /= 100;\n\n let r: number, g: number, b: number;\n\n if (s === 0) {\n r = g = b = l;\n } else {\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return {\n r: Math.round(r * 255),\n g: Math.round(g * 255),\n b: Math.round(b * 255),\n };\n}\n\n/**\n * Find the closest CSS color name to the given RGB values\n * @param r - Red component (0-255)\n * @param g - Green component (0-255)\n * @param b - Blue component (0-255)\n * @returns Closest CSS color name\n */\nexport async function findClosestColorName(r: number, g: number, b: number): Promise<string> {\n const cssColors = css_color_names;\n\n let closestColor = cssColors[0];\n let minDistance = Infinity;\n\n for await (const colorName of cssColors) {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = 1;\n\n const ctx = canvas.getContext('2d');\n\n if (!ctx) continue;\n\n ctx.fillStyle = colorName;\n ctx.fillRect(0, 0, 1, 1);\n\n const [cr, cg, cb] = ctx.getImageData(0, 0, 1, 1).data;\n\n const distance = Math.sqrt(Math.pow(r - cr, 2) + Math.pow(g - cg, 2) + Math.pow(b - cb, 2));\n\n if (distance < minDistance) {\n minDistance = distance;\n closestColor = colorName;\n }\n\n if (distance === 0) break;\n }\n\n return closestColor;\n}\n","import { Data } from '../../data/index.js';\nimport { findClosestColorName, parseToRGBA, rgbaToHex, rgbToHsl } from '../../utils/color.js';\n\nexport class ColorHelper {\n /**\n * Generate opacity hex value\n * @param opacity - Opacity value from 0 to 100\n * @param color - Hex color code\n * @returns - Hex color code with opacity\n */\n opacity(opacity: number = 100, color: string = '') {\n color = color.length > 7 ? color?.substring(0, 6) : color;\n opacity = opacity > 1 ? opacity / 100 : opacity;\n\n let result = Math.round(Math.min(Math.max(opacity, 0), 1) * 255)\n .toString(16)\n .toLowerCase()\n .padStart(2, '0');\n\n return color + result;\n }\n\n /**\n * Extract color and opacity from hex code\n * @param hex - Hex color code\n * @returns - Object with color and opacity\n */\n extract(hex: string) {\n if (!hex.startsWith('#') || hex.length <= 7) {\n return {\n color: hex,\n opacity: 100,\n };\n }\n\n var color = hex.slice(-2);\n var decimal = parseInt(color, 16) / 255;\n var percentage = Math.round(decimal * 100);\n var color = hex.length > 7 ? hex.slice(0, 7) : hex;\n\n return {\n color: color,\n opacity: percentage,\n };\n }\n\n /**\n * Validate color string format\n * @param str - Color string to validate\n * @returns Detected color format or false if invalid\n * @example\n * ```javascript\n * const format1 = color.validate(\"#FF5733\"); // \"hex\"\n * const format2 = color.validate(\"rgb(255, 87, 51)\"); // \"rgb\"\n * const format3 = color.validate(\"hsl(14, 100%, 60%)\"); // \"hsl\"\n * const format4 = color.validate(\"orangered\"); // \"css-color-name\"\n * const format5 = color.validate(\"invalid-color\"); // false\n * ```\n */\n validate(str: string) {\n if (typeof str !== 'string' || !String(str).trim().length) return false;\n\n const s = str.trim();\n\n // HEX (#FFF, #FFFFFF, #FFFFFFFF)\n if (/^#([A-Fa-f0-9]{3}){1,2}$/.test(s) || /^#([A-Fa-f0-9]{4}|[A-Fa-f0-9]{8})$/.test(s)) {\n return 'hex';\n }\n\n // rgb(255, 255, 255)\n if (/^rgb\\(\\s*(?:\\d{1,3}\\s*,\\s*){2}\\d{1,3}\\s*\\)$/.test(s)) {\n return 'rgb';\n }\n\n // rgba(255, 255, 255, 0.5)\n if (/^rgba\\(\\s*(?:\\d{1,3}\\s*,\\s*){3}(?:0|1|0?\\.\\d+)\\s*\\)$/.test(s)) {\n return 'rgba';\n }\n\n // hsl(360, 100%, 100%)\n if (/^hsl\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%\\s*,\\s*\\d{1,3}%\\s*\\)$/.test(s)) {\n return 'hsl';\n }\n\n // hsla(360, 100%, 100%, 0.5)\n if (/^hsla\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%\\s*,\\s*\\d{1,3}%\\s*,\\s*(?:0|1|0?\\.\\d+)\\s*\\)$/.test(s)) {\n return 'hsla';\n }\n\n if (Data.css_color_names.includes(s.toLowerCase())) {\n return 'css-color-name';\n }\n\n return false;\n }\n\n /**\n * Convert color to different format\n * @param str - Color string to convert (e.g. \"#FF5733\", \"rgb(255, 87, 51)\")\n * @param format - Target format\n * @returns - Converted color string\n * @example\n * ```javascript\n * const hexColor = color.convert(\"rgb(255, 87, 51)\", \"hex\"); // \"#FF5733\"\n * const rgbColor = color.convert(\"#FF5733\", \"rgb\"); // \"rgb(255, 87, 51)\"\n * const hslColor = color.convert(\"#FF5733\", \"hsl\"); // \"hsl(14, 100%, 60%)\"\n * const colorName = color.convert(\"#FF5733\", \"css-color-name\"); // \"orangered\"\n * ```\n */\n async convert(\n str: string,\n format: 'hex' | 'rgb' | 'rgba' | 'hsl' | 'hsla' | 'css-color-name',\n ): Promise<string | null> {\n const valid = this.validate(str);\n\n if (!valid) throw new Error(`Invalid color format: ${str}`);\n\n if (valid === format) throw new Error(`Color is already in the desired format: ${format}`);\n\n const rgba = parseToRGBA(str.trim(), valid);\n\n if (!rgba) throw new Error(`Failed to parse color: ${str}`);\n\n switch (format) {\n case 'hex': {\n return rgbaToHex(rgba, false);\n }\n case 'rgb': {\n return `rgb(${rgba.r}, ${rgba.g}, ${rgba.b})`;\n }\n case 'rgba': {\n return `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`;\n }\n case 'hsl': {\n const hsl = rgbToHsl(rgba.r, rgba.g, rgba.b);\n return `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`;\n }\n case 'hsla': {\n const hsl = rgbToHsl(rgba.r, rgba.g, rgba.b);\n return `hsla(${hsl.h}, ${hsl.s}%, ${hsl.l}%, ${rgba.a})`;\n }\n case 'css-color-name': {\n return await findClosestColorName(rgba.r, rgba.g, rgba.b);\n }\n default: {\n return null;\n }\n }\n }\n}\n","import { ColorHelper } from './color.js';\nimport { ElementHelper } from './element.js';\nimport { ObjectHelper } from './object.js';\n\nexport type Modifier = (\n value: string,\n param: string | null | undefined,\n values: { amount?: number; count?: number },\n) => string;\n\nexport class StringHelper {\n /**\n * Replaces occurrences in a string based on a pattern with the result of an asynchronous callback function.\n * @param string - The input string to perform replacements on.\n * @param pattern - The pattern to match in the string (can be a string or a regular expression).\n * @param callback - An asynchronous callback function that takes the matched substring and any captured groups as arguments and returns the replacement string.\n * @returns A promise that resolves to the modified string with replacements applied.\n * @example\n * ```javascript\n * const result = await string.replace(\"Hello World\", /World/, async (match) => {\n * return await fetchSomeData(match); // Assume this function fetches data asynchronously\n * });\n * console.log(result); // Output will depend on the fetched data\n * ```\n */\n async replace(\n string: string,\n pattern: string,\n callback: (match: string, ...groups: string[]) => Promise<string> | string,\n ): Promise<string> {\n const promises: Array<Promise<string>> = [];\n\n string.replace(pattern, (match: string, ...groups: string[]) => {\n const promise = typeof callback === 'function' ? callback(match, ...groups) : match;\n\n promises.push(Promise.resolve(promise));\n\n return match;\n });\n\n const replacements = await Promise.all(promises);\n\n return string.replace(pattern, () => replacements.shift() ?? '');\n }\n\n /**\n * Capitalizes the first letter of a given string.\n * @param string - The input string to be capitalized.\n * @returns The capitalized string.\n * @example\n * ```javascript\n * const result = string.capitalize(\"hello world\");\n * console.log(result); // Output: \"Hello world\"\n * ```\n */\n capitalize(string: string): Capitalize<string> {\n return (string.charAt(0).toUpperCase() + string.slice(1)) as Capitalize<string>;\n }\n\n PRESETS: Record<string, string> = {};\n\n /**\n * Composes a template string by replacing placeholders with corresponding values and applying optional modifiers.\n * @param template - The template string containing placeholders in the format {key} and optional modifiers in the format [MODIFIER:param=value].\n * @param values - An object containing key-value pairs to replace the placeholders in the template.\n * @param options - Optional settings for the composition process.\n * @returns The composed string with placeholders replaced and modifiers applied.\n * @example\n * ```javascript\n * const { string } = Tixyel.Helper;\n *\n * // Basic usage with placeholders and simple modifiers\n * const template1 = \"Hello, {username}! You have {amount} [UPC=messages] and your name is [CAP=name].\";\n * const values1 = { username: \"john_doe\", amount: 5, name: \"john\" };\n * const result1 = string.compose(template1, values1);\n * // \"Hello, john_doe! You have 5 MESSAGES and your name is John.\"\n *\n * // Multiple modifiers in a single block (HTML enabled)\n * const template2 = \"[COLOR:#ff0056,BOLD={username}]\";\n * const values2 = { username: \"john_doe\" };\n * const result2 = string.compose(template2, values2, { html: true });\n * // '<span class=\"color bold\" style=\"color: #ff0056; font-weight: bold;\">john_doe</span>'\n *\n * // Conditional rendering with IF (supports ===, >=, &&, ||, !, etc.)\n * const template3 = \"[IF=vip && status === 'live'?VIP Online|Offline]\";\n * const values3 = { status: 'live', vip: true };\n * const result3 = string.compose(template3, values3);\n * // \"VIP Online\"\n *\n * // Pluralization using amount / count or an explicit key\n * const template4 = \"You have {amount} [PLURAL=message|messages].\";\n * const values4 = { amount: 1 };\n * const values5 = { amount: 3 };\n * const result4a = string.compose(template4, values4); // \"You have 1 message.\"\n * const result4b = string.compose(template4, values5); // \"You have 3 messages.\"\n *\n * // Number formatting\n * const template5 = \"Total: [NUMBER:2=amount] {currency}\";\n * const values6 = { amount: 1234.5, currency: '$' };\n * const result5 = string.compose(template5, values6);\n * // e.g. \"Total: 1,234.50 $\" (locale dependent)\n *\n * // Date and time formatting\n * const template6 = \"Created at: [DATE:iso=createdAt] ([DATE:relative=createdAt])\";\n * const values7 = { createdAt: new Date('2020-01-02T03:04:05.000Z') };\n * const result6 = string.compose(template6, values7);\n * // e.g. \"Created at: 2020-01-02T03:04:05.000Z (Xs ago)\"\n *\n * // MAP / SWITCH style mapping\n * const template7 = \"Status: [MAP:status=live:Online|offline:Offline|default:Unknown]\";\n * const values8 = { status: 'offline' };\n * const result7 = string.compose(template7, values8);\n * // \"Status: Offline\"\n *\n * // Escaping HTML\n * const template8 = \"[ESCAPE={message}]\";\n * const values9 = { message: '<b>Danger & \"HTML\"</b>' };\n * const result8 = string.compose(template8, values9);\n * // \"&lt;b&gt;Danger &amp; &quot;HTML&quot;&lt;/b&gt;\"\n *\n * // Using global presets\n * Helper.string.PRESETS['alert'] = 'BOLD,COLOR:#ff0056';\n * const template10 = \"[PRESET:alert={username}]\";\n * const values11 = { username: 'john_doe' };\n * const result10 = string.compose(template10, values11, { html: true });\n * // '<span class=\"color bold\" style=\"color: #ff0056; font-weight: bold;\">john_doe</span>'\n * ```\n */\n compose(\n template: string,\n values: Record<string, any> = {},\n options: {\n method?: 'loop' | 'index';\n html?: boolean;\n debug?: boolean;\n modifiers?: Record<string, Modifier>;\n aliases?: Record<string, string[]>;\n } = {\n method: 'index',\n html: false,\n debug: false,\n modifiers: {},\n aliases: {},\n },\n ): string {\n const { mergeSpanStyles } = new ElementHelper();\n\n const span = (style: string, value: string, className?: string) => {\n if (options.html) {\n return mergeSpanStyles(style, value, className);\n } else {\n return value;\n }\n };\n\n const baseValues = {\n skip: '<br/>',\n newline: '<br/>',\n ...values,\n };\n\n let defaultCurrency = '$';\n let defaultCurrencyCode = 'USD';\n\n if (typeof window !== 'undefined') {\n try {\n const client: any = (window as any)?.client;\n const currency = client?.details?.currency;\n\n if (currency?.symbol) defaultCurrency = String(currency.symbol);\n if (currency?.code) defaultCurrencyCode = String(currency.code);\n } catch {\n // ignore – fall back to defaults\n }\n }\n\n const object = new ObjectHelper();\n\n const flatten: Record<string, string> = Object.entries(object.flatten(baseValues)).reduce(\n (acc, [k, v]) => {\n acc[k] = String(v);\n\n if (['username', 'name', 'nick', 'nickname', 'sender'].some((e) => k === e)) {\n const username = acc?.username || acc?.name || acc?.nick || acc?.nickname || acc?.sender;\n\n acc['username'] = acc.username || username;\n acc['usernameAt'] = `@${acc.username}`;\n acc['name'] = acc.name || username;\n acc['nick'] = acc.nick || username;\n acc['nickname'] = acc.nickname || username;\n acc['sender'] = acc.sender || username;\n acc['senderAt'] = `@${acc.sender}`;\n }\n\n if (['amount', 'count'].some((e) => k === e)) {\n acc['amount'] = String(acc?.amount || acc.count || v);\n acc['count'] = String(acc?.count || acc?.amount || v);\n }\n\n acc['currency'] = acc.currency || defaultCurrency;\n acc['currencyCode'] = acc.currencyCode || defaultCurrencyCode;\n\n return acc;\n },\n {} as Record<string, string>,\n );\n\n const REGEX = {\n PLACEHOLDERS: /{([^}]+)}/g,\n MODIFIERS: /\\[([^\\]=]+)=([^\\]]+)\\]/g,\n };\n\n var amount = parseFloat(flatten?.amount ?? flatten?.count ?? 0);\n\n function getNumericFromKeyOrValue(\n keyOrValue: string,\n valuesMap: Record<string, string>,\n ): number | null {\n const trimmed = keyOrValue?.trim?.() ?? '';\n if (!trimmed.length) return null;\n\n const fromValues = (valuesMap as any)[trimmed];\n const candidate = fromValues !== undefined ? fromValues : trimmed;\n const num = parseFloat(String(candidate).replace(/\\s/g, ''));\n\n return isNaN(num) ? null : num;\n }\n\n function formatNumber(\n value: string,\n param: string | null | undefined,\n valuesMap: Record<string, string>,\n ): string {\n const decimals = !isNaN(Number(param)) ? Math.max(0, parseInt(String(param))) : 0;\n\n const num = getNumericFromKeyOrValue(value, valuesMap);\n if (num === null) return value;\n\n try {\n return num.toLocaleString(undefined, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n } catch {\n return num.toFixed(decimals);\n }\n }\n\n function formatRelativeTime(date: Date, now: Date = new Date()): string {\n const diffMs = now.getTime() - date.getTime();\n const past = diffMs >= 0;\n const abs = Math.abs(diffMs);\n\n const sec = Math.floor(abs / 1000);\n const min = Math.floor(sec / 60);\n const hour = Math.floor(min / 60);\n const day = Math.floor(hour / 24);\n const month = Math.floor(day / 30);\n const year = Math.floor(day / 365);\n\n const suffix = past ? 'ago' : 'from now';\n\n if (year > 0) return `${year}y ${suffix}`;\n if (month > 0) return `${month}mo ${suffix}`;\n if (day > 0) return `${day}d ${suffix}`;\n if (hour > 0) return `${hour}h ${suffix}`;\n if (min > 0) return `${min}m ${suffix}`;\n return `${Math.max(sec, 0)}s ${suffix}`;\n }\n\n function formatDateLike(\n value: string,\n param: string | null | undefined,\n valuesMap: Record<string, string>,\n ): string {\n const keyOrLiteral = value?.trim?.() ?? '';\n if (!keyOrLiteral.length) return value;\n\n const raw = (valuesMap as any)[keyOrLiteral] ?? keyOrLiteral;\n const date = new Date(raw);\n\n if (isNaN(date.getTime())) return value;\n\n const mode = (param ?? 'date').toString().toLowerCase();\n\n try {\n switch (mode) {\n case 'time':\n return date.toLocaleTimeString();\n case 'datetime':\n case 'full':\n return date.toLocaleString();\n case 'relative':\n case 'ago':\n return formatRelativeTime(date);\n case 'iso':\n return date.toISOString();\n case 'date':\n default:\n return date.toLocaleDateString();\n }\n } catch {\n return value;\n }\n }\n\n function pluralize(\n value: string,\n param: string | null | undefined,\n valuesMap: Record<string, string>,\n ): string {\n const text = value ?? '';\n const [singular, plural = singular] = text.split('|', 2);\n\n const key = param?.trim();\n let source: any = undefined;\n\n if (key && (valuesMap as any)[key] !== undefined) {\n source = (valuesMap as any)[key];\n } else {\n source = (valuesMap as any).amount ?? (valuesMap as any).count;\n }\n\n const num = parseFloat(String(source));\n if (isNaN(num)) return singular;\n\n const isPlural = Math.abs(num) !== 1;\n return isPlural ? plural : singular;\n }\n\n function mapSwitch(\n value: string,\n param: string | null | undefined,\n valuesMap: Record<string, string>,\n ): string {\n const key = param?.trim() ?? '';\n const targetRaw = key && (valuesMap as any)[key] !== undefined ? (valuesMap as any)[key] : '';\n const target = String(targetRaw);\n\n const entries = (value ?? '')\n .split('|')\n .map((p) => p.trim())\n .filter((p) => p.length);\n let defaultResult: string | undefined;\n\n for (const entry of entries) {\n const idx = entry.indexOf(':');\n if (idx === -1) continue;\n\n const mapKey = entry.slice(0, idx).trim();\n const mapValue = entry.slice(idx + 1);\n\n if (!mapKey.length) continue;\n\n if (mapKey.toLowerCase() === 'default') {\n defaultResult = mapValue;\n continue;\n }\n\n if (target === mapKey) return mapValue;\n }\n\n return defaultResult ?? '';\n }\n\n function escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n }\n\n function parseLiteralOrValue(token: string, valuesMap: Record<string, string>): any {\n let trimmed = token.trim();\n\n if (!trimmed.length) return undefined;\n\n const firstChar = trimmed[0];\n const lastChar = trimmed[trimmed.length - 1];\n\n if ((firstChar === '\"' && lastChar === '\"') || (firstChar === \"'\" && lastChar === \"'\")) {\n return trimmed.slice(1, -1);\n }\n\n const lowered = trimmed.toLowerCase();\n if (lowered === 'true') return true;\n if (lowered === 'false') return false;\n\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) return parseFloat(trimmed);\n\n const fromValues = valuesMap?.[trimmed];\n if (fromValues === undefined) return trimmed;\n\n const fromValuesStr = String(fromValues).trim();\n const fromValuesLower = fromValuesStr.toLowerCase();\n\n if (fromValuesLower === 'true') return true;\n if (fromValuesLower === 'false') return false;\n\n if (/^-?\\d+(\\.\\d+)?$/.test(fromValuesStr)) return parseFloat(fromValuesStr);\n\n return fromValues;\n }\n\n function coerceToBoolean(value: any): boolean {\n if (typeof value === 'boolean') return value;\n if (value === null || value === undefined) return false;\n\n const str = String(value).trim().toLowerCase();\n if (!str.length) return false;\n\n if (['false', '0', 'no', 'off', 'null', 'undefined', 'nan'].includes(str)) return false;\n\n return true;\n }\n\n function evaluateAtomicCondition(\n expression: string,\n valuesMap: Record<string, string>,\n ): boolean {\n let expr = expression.trim();\n if (!expr.length) return false;\n\n let invert = false;\n while (expr.startsWith('!')) {\n invert = !invert;\n expr = expr.slice(1).trim();\n }\n\n const operators = ['===', '!==', '==', '!=', '>=', '<=', '>', '<'];\n let op: string | null = null;\n let left = expr;\n let right = '';\n\n for (const candidate of operators) {\n const idx = expr.indexOf(candidate);\n if (idx !== -1) {\n op = candidate;\n left = expr.slice(0, idx);\n right = expr.slice(idx + candidate.length);\n break;\n }\n }\n\n let result: boolean;\n\n if (!op) {\n const value = parseLiteralOrValue(left, valuesMap);\n result = coerceToBoolean(value);\n } else {\n const leftVal = parseLiteralOrValue(left, valuesMap);\n const rightVal = parseLiteralOrValue(right, valuesMap);\n\n switch (op) {\n case '===':\n result = leftVal === rightVal;\n break;\n case '!==':\n result = leftVal !== rightVal;\n break;\n case '==':\n // eslint-disable-next-line eqeqeq\n result = (leftVal as any) == (rightVal as any);\n break;\n case '!=':\n // eslint-disable-next-line eqeqeq\n result = (leftVal as any) != (rightVal as any);\n break;\n case '>=':\n result = (leftVal as any) >= (rightVal as any);\n break;\n case '<=':\n result = (leftVal as any) <= (rightVal as any);\n break;\n case '>':\n result = (leftVal as any) > (rightVal as any);\n break;\n case '<':\n result = (leftVal as any) < (rightVal as any);\n break;\n default:\n result = false;\n break;\n }\n }\n\n return invert ? !result : result;\n }\n\n function evaluateConditionExpression(\n expression: string,\n valuesMap: Record<string, string>,\n ): boolean {\n let expr = expression.trim();\n if (!expr.length) return false;\n\n let invert = false;\n while (expr.startsWith('!')) {\n invert = !invert;\n expr = expr.slice(1).trim();\n }\n\n const orParts = expr\n .split('||')\n .map((p) => p.trim())\n .filter((p) => p.length);\n if (!orParts.length) return invert ? true : false;\n\n let result = false;\n\n for (const orPart of orParts) {\n const andParts = orPart\n .split('&&')\n .map((p) => p.trim())\n .filter((p) => p.length);\n if (!andParts.length) continue;\n\n let andResult = true;\n for (const andPart of andParts) {\n const partResult = evaluateAtomicCondition(andPart, valuesMap);\n andResult = andResult && partResult;\n if (!andResult) break;\n }\n\n result = result || andResult;\n if (result) break;\n }\n\n return invert ? !result : result;\n }\n\n const color = new ColorHelper();\n\n const HTML_MODIFIERS: Record<string, Modifier> = {\n COLOR: (value, param) =>\n span(param && !!color.validate(param) ? `color: ${param}` : '', value, 'color'),\n WEIGHT: (value, param) =>\n span(param && !isNaN(parseInt(param)) ? `font-weight: ${param}` : '', value, 'weight'),\n SEMIBOLD: (value) => span('font-weight: 600', value, 'semibold'),\n BOLD: (value) => span('font-weight: bold', value, 'bold'),\n BLACK: (value) => span('font-weight: 900', value, 'black'),\n LIGHT: (value) => span('font-weight: lighter', value, 'light'),\n STRONG: (value) => span('font-weight: bolder', value, 'strong'),\n ITALIC: (value) => span('font-style: italic', value, 'italic'),\n UNDERLINE: (value) => span('text-decoration: underline', value, 'underline'),\n STRIKETHROUGH: (value) => span('text-decoration: line-through', value, 'strikethrough'),\n SUB: (value) => span('vertical-align: sub', value, 'sub'),\n SUP: (value) => span('vertical-align: super', value, 'sup'),\n LARGER: (value) => span('font-size: larger', value, 'larger'),\n SMALL: (value) => span('font-size: smaller', value, 'small'),\n SHADOW: (value, param) => span(`text-shadow: ${param}`, value, 'shadow'),\n SIZE: (value, param) => span(param ? `font-size: ${param}` : '', value, 'size'),\n };\n\n const STRING_MODIFIERS: Record<string, Modifier> = {\n BT1: (value) => (amount > 1 ? value : ''),\n BT0: (value) => (amount > 0 ? value : ''),\n ST1: (value) => (amount < 1 ? value : ''),\n ST0: (value) => (amount < 0 ? value : ''),\n UPC: (value) => value.toUpperCase(),\n LOW: (value) => value.toLowerCase(),\n REV: (value) => value.split('').reverse().join(''),\n CAP: (value) => value.charAt(0).toUpperCase() + value.slice(1).toLowerCase(),\n NUMBER: (value, param, valuesMap) =>\n formatNumber(value, param, valuesMap as Record<string, string>),\n PLURAL: (value, param, valuesMap) =>\n pluralize(value, param, valuesMap as Record<string, string>),\n DATE: (value, param, valuesMap) =>\n formatDateLike(value, param, valuesMap as Record<string, string>),\n MAP: (value, param, valuesMap) =>\n mapSwitch(value, param, valuesMap as Record<string, string>),\n ESCAPE: (value) => escapeHtml(value),\n IF: (value, _param, valuesMap) => {\n const text = value ?? '';\n\n const [rawCondition, rest] = text.split('?', 2);\n if (!rest) return text;\n\n const [whenTrue, whenFalse = ''] = rest.split('|', 2);\n\n const condition = evaluateConditionExpression(\n rawCondition,\n valuesMap as Record<string, string>,\n );\n\n return condition ? whenTrue : whenFalse;\n },\n PRESET: (value, param) => {\n const name = param?.trim() ?? '';\n if (!name.length) return value;\n\n const group = this.PRESETS[name];\n if (!group || !group.length) return value;\n\n const modifiers = group\n .split(',')\n .map((part) => part.trim())\n .filter((part) => part.length)\n .map((part) => {\n const [mName, mParam] = part.split(':');\n return { name: mName.trim(), param: mParam?.trim() ?? null };\n });\n\n let result = value;\n for (const { name: mName, param: mParam } of modifiers) {\n result = applyModifier(result, mName, mParam);\n }\n\n return result;\n },\n FALLBACK: (value, param) => (value.length ? value : (param ?? value)),\n };\n\n const MODIFIERS: Record<string, Modifier> = {\n ...STRING_MODIFIERS,\n ...(options?.html ? HTML_MODIFIERS : {}),\n ...(options.modifiers ?? {}),\n };\n\n const ALIASES = {\n UPC: ['UPPERCASE', 'UPPER', 'UPP'],\n LOW: ['LOWERCASE', 'LOWER', 'LWC'],\n REV: ['REVERSE', 'RVS'],\n CAP: ['CAPITALIZE', 'CAPITAL'],\n NUMBER: ['NUMBER', 'NUM', 'FORMAT_NUMBER', 'FMT_NUM'],\n PLURAL: ['PLURAL', 'PL', 'PLR'],\n DATE: ['DATE', 'DATETIME', 'TIME', 'DT'],\n MAP: ['MAP', 'SWITCH'],\n ESCAPE: ['ESCAPE', 'ESC', 'ESC_HTML', 'ESCAPE_HTML'],\n PRESET: ['PRESET', 'STYLE', 'THEME'],\n BT1: ['BIGGER_THAN_1', 'GREATER_THAN_1', 'GT1'],\n BT0: ['BIGGER_THAN_0', 'GREATER_THAN_0', 'GT0'],\n ST1: ['SMALLER_THAN_1', 'LESS_THAN_1', 'LT1'],\n ST0: ['SMALLER_THAN_0', 'LESS_THAN_0', 'LT0'],\n COLOR: ['COLOUR', 'CLR', 'HIGHLIGHT'],\n BOLD: ['BOLDEN', 'B'],\n STRONG: ['STRONGEN', 'STRONG'],\n ITALIC: ['ITALICIZE', 'ITALIC', 'I'],\n UNDERLINE: ['U', 'INS', 'INSET', 'I'],\n STRIKETHROUGH: ['STRIKE', 'S', 'DELETE', 'D'],\n SUB: ['SUBSCRIPT', 'SUBS'],\n SUP: ['SUPERSCRIPT', 'SUPS'],\n LARGER: ['LARGER', 'LG'],\n SMALL: ['SMALLER', 'SM'],\n SHADOW: ['SHADOW', 'SHD'],\n FALLBACK: ['FALLBACK', 'FB'],\n IF: ['IF', 'COND', 'CONDITION'],\n ...(options.aliases ?? {}),\n };\n\n function applyModifier(value: string, name: string, param: string | null | undefined): string {\n const canonical = Object.entries(ALIASES).find(([key, aliases]) => {\n if (aliases.some((alias) => alias.toUpperCase() === name.toUpperCase())) return true;\n else if (key.toUpperCase() === name.toUpperCase()) return true;\n else return false;\n });\n const use = canonical ? canonical[0] : name.toUpperCase();\n\n try {\n if (MODIFIERS[use])\n return MODIFIERS[use](value, typeof param === 'string' ? param.trim() : null, flatten);\n else if (options?.html) return span('', value, use.toLowerCase());\n else return value;\n } catch (error) {\n if (\n options?.debug &&\n typeof console !== 'undefined' &&\n typeof console.error === 'function'\n ) {\n console.error('[Helper.string.compose] Modifier error', { name, param, error });\n }\n return value;\n }\n }\n\n function replaceAll(string: string): string {\n let str = string;\n let match;\n\n while ((match = REGEX.MODIFIERS.exec(str)) !== null) {\n const [fullMatch, modifierGroup, value] = match;\n\n const modifiers = modifierGroup\n .split(',')\n .map((part) => part.trim())\n .filter((part) => part.length)\n .map((part) => {\n const [name, param] = part.split(':');\n return { name: name.trim(), param: param?.trim() ?? null };\n });\n\n let newValue = replaceAll(value);\n\n for (const { name, param } of modifiers) {\n newValue = applyModifier(newValue, name, param);\n }\n\n str = str.replace(fullMatch, newValue ?? '');\n\n REGEX.MODIFIERS.lastIndex = 0;\n }\n\n return str;\n }\n\n function parseModifiers(str: string): string {\n let i = 0;\n const len = str.length;\n\n function parseText(stopChar?: string): string {\n let out = '';\n while (i < len) {\n if (str[i] === '\\\\') {\n if (i + 1 < len) {\n out += str[i + 1];\n i += 2;\n } else {\n i++;\n }\n } else if (str[i] === '[' && (!stopChar || stopChar !== '[')) {\n out += parseModifier();\n } else if (stopChar && str[i] === stopChar) {\n i++;\n break;\n } else {\n out += str[i++];\n }\n }\n return out;\n }\n\n function parseModifier(): string {\n i++;\n const modifiers: { name: string; param: string | null }[] = [];\n\n while (i < len && str[i] !== '=') {\n if (str[i] === ',') {\n i++;\n continue;\n }\n\n let name = '';\n while (i < len && /[A-Za-z0-9]/.test(str[i])) name += str[i++];\n\n let param: string | null = null;\n if (str[i] === ':') {\n i++;\n const paramStart = i;\n while (i < len && str[i] !== ',' && str[i] !== '=') i++;\n param = str.slice(paramStart, i);\n }\n\n if (name.length) {\n modifiers.push({ name, param });\n }\n\n if (str[i] === ',') {\n i++;\n }\n }\n\n if (str[i] === '=') i++;\n\n const value = parseText(']');\n\n return modifiers.reduce((val, { name, param }) => applyModifier(val, name, param), value);\n }\n\n return parseText();\n }\n\n let result = template.replace(REGEX.PLACEHOLDERS, (_, key: string) =>\n typeof flatten[key] === 'string' || typeof flatten[key] === 'number'\n ? String(flatten[key])\n : (key ?? key),\n );\n\n result = options.method === 'loop' ? replaceAll(result) : parseModifiers(result);\n\n return result;\n }\n}\n","export class SoundHelper {\n playing: boolean = false;\n audio!: AudioContext;\n\n /**\n * Play sound from URL with optional volume and replace parameters\n * @param url - Sound URL to play\n * @param volume - Volume level from 0 to 100 (default: 100)\n * @param replace - If true, replaces currently playing sound (default: false)\n */\n play(url: string, volume: number = 100, replace = false) {\n if (!url || !url.length) {\n throw new Error('No sound URL provided');\n }\n\n try {\n if (replace && this.playing && this.audio && this.audio.state !== 'closed')\n this.audio.close();\n\n let ctx = new AudioContext();\n let gainNode = ctx.createGain();\n gainNode.connect(ctx.destination);\n\n if (replace) {\n this.audio = ctx;\n this.playing = true;\n }\n\n fetch(url)\n .then((data) => data.arrayBuffer())\n .then((arrayBuffer) => ctx.decodeAudioData(arrayBuffer))\n .then((decodedAudio) => {\n if (ctx.state !== 'closed') {\n const playSound = ctx.createBufferSource();\n playSound.buffer = decodedAudio;\n playSound.connect(gainNode);\n gainNode.gain.value = volume / 100;\n playSound.start(ctx.currentTime);\n }\n });\n } catch (error) {\n throw new Error(`Error playing sound: ${error}`);\n }\n }\n}\n","export class FunctionHelper {\n /**\n * Apply function with given thisArg and arguments\n * @param fn - Function to apply\n * @param thisArg - Value to use as this when calling fn\n * @param args - Arguments to pass to fn\n * @returns Result of calling fn with thisArg and args\n */\n apply<TThis, TArgs extends unknown[], TReturn>(\n fn: (this: TThis, ...args: TArgs) => TReturn,\n thisArg: TThis,\n args: TArgs,\n ): TReturn {\n return fn.apply(thisArg, args);\n }\n\n /**\n * Call function with given thisArg and arguments\n * @param fn - Function to call\n * @param thisArg - Value to use as this when calling fn\n * @param args - Arguments to pass to fn\n * @returns Result of calling fn with thisArg and args\n */\n call<TThis, TArgs extends unknown[], TReturn>(\n fn: (this: TThis, ...args: TArgs) => TReturn,\n thisArg: TThis,\n ...args: TArgs\n ): TReturn {\n return fn.call(thisArg, ...args);\n }\n}\n","import { Data } from '../data/index.js';\nimport { RandomHelper } from '../helper/classes/random.js';\nimport { UtilsHelper } from '../helper/classes/utils.js';\nimport { Local } from '../local/index.js';\nimport { StreamElements, Twitch } from '../types.js';\nimport { EventProvider } from './EventProvider.js';\n\nexport class FakeUser {\n public readonly id!: string;\n public readonly name!: string;\n public readonly login!: string;\n\n public badges: Twitch.tags[] = [];\n public isSubscriber: boolean = false;\n public tier?: StreamElements.Event.Provider.Twitch.SubscriberTier;\n\n constructor(\n id: string,\n name: string,\n badges: Twitch.tags[] = [],\n isSubscriber: boolean = false,\n tier?: StreamElements.Event.Provider.Twitch.SubscriberTier,\n ) {\n this.id = id;\n this.name = name;\n this.login = name.toLocaleLowerCase();\n this.badges = badges;\n this.isSubscriber = isSubscriber;\n this.tier = tier;\n }\n}\n\nexport interface FakeUserPoolOptions {\n id?: string;\n badges?: Twitch.tags[];\n limits?: {\n [key in Twitch.tags]?: number;\n };\n fixed?: {\n [key in Twitch.tags]?: string[];\n };\n}\n\ntype FakeUserPoolEvents = {\n 'warn': [warning: Error];\n};\n\nexport const fakeUserPools: FakeUserPool[] = [];\n\nexport class FakeUserPool extends EventProvider<FakeUserPoolEvents> {\n public readonly users: FakeUser[] = [];\n public readonly id: string;\n\n private readonly byId: Map<string, FakeUser> = new Map();\n private readonly byName: Map<string, FakeUser> = new Map();\n private readonly byBadge: Map<Twitch.tags, FakeUser[]> = new Map();\n\n private static fixUser(user: string | FakeUser): string {\n if (typeof user === 'string') return user.trim().replace(/^@+/, '').toLocaleLowerCase();\n\n return FakeUserPool.fixUser(user.name);\n }\n\n private static getRandomSubTier(): StreamElements.Event.Provider.Twitch.SubscriberTier {\n const utils = new UtilsHelper();\n\n return (\n utils.probability({\n 'prime': 0.4,\n '1000': 0.3,\n '2000': 0.2,\n '3000': 0.1,\n } as {\n [key in StreamElements.Event.Provider.Twitch.SubscriberTier]: number;\n }) ?? 'prime'\n );\n }\n\n constructor(names: string[] = Data.names, options?: FakeUserPoolOptions) {\n super();\n\n this.users = this.start(names, options?.badges, options);\n this.id = options?.id ?? `fake_user_pool_${Math.random().toString(36).slice(2, 10)}`;\n this.byId = new Map(this.users.map((user) => [user.id, user]));\n this.byName = new Map(this.users.map((user) => [user.login, user]));\n this.byBadge = new Map(\n this.users.reduce((acc, user) => {\n for (const badge of user.badges) {\n const existing = acc.get(badge) ?? [];\n acc.set(badge, [...existing, user]);\n }\n return acc;\n }, new Map<Twitch.tags, FakeUser[]>()),\n );\n\n fakeUserPools.push(this);\n }\n\n private start(\n names: string[],\n badges: Twitch.tags[] = Data.badges.map((e) => e.set_id) as Twitch.tags[],\n options?: Omit<FakeUserPoolOptions, 'badges'>,\n ): FakeUser[] {\n const normalizedNames = names\n .map((name) => name && FakeUserPool.fixUser(name))\n .filter((name) => name && name.length)\n // remove duplicates\n .filter((name, index, self) => self.indexOf(name) === index);\n\n const badgePool = badges.filter((badge, index, self) => self.indexOf(badge) === index);\n\n if (!badgePool.length || !normalizedNames.length) {\n return [];\n }\n\n const users: FakeUser[] = [];\n const limits = options?.limits ?? {};\n const fixed = options?.fixed ?? {};\n const usage = new Map<Twitch.tags, number>();\n const fixedNameToBadge = new Map<string, Twitch.tags>();\n let badgeCursor = 0;\n\n const getLimit = (badge: Twitch.tags): number => {\n const value = limits[badge];\n\n return typeof value === 'number' && value > 0 ? value : Number.POSITIVE_INFINITY;\n };\n\n const canUseBadge = (badge: Twitch.tags): boolean => {\n const max = getLimit(badge);\n const current = usage.get(badge) ?? 0;\n\n return current < max;\n };\n\n const registerBadgeUsage = (badge: Twitch.tags): void => {\n const current = usage.get(badge) ?? 0;\n usage.set(badge, current + 1);\n };\n\n const normalizeUserNames = (value: string | string[] | undefined): string[] => {\n if (!value) return [];\n\n if (typeof value === 'string') {\n return [FakeUserPool.fixUser(value)].filter(Boolean);\n }\n\n if (Array.isArray(value)) {\n return value.map(FakeUserPool.fixUser).filter(Boolean);\n }\n\n return [];\n };\n\n const nextAvailableBadge = (): Twitch.tags | null => {\n for (let step = 0; step < badgePool.length; step++) {\n const badge = badgePool[(badgeCursor + step) % badgePool.length];\n\n if (canUseBadge(badge)) {\n badgeCursor = (badgeCursor + step + 1) % badgePool.length;\n return badge;\n }\n }\n\n return null;\n };\n\n for (const badge of badgePool) {\n const namesForBadge = normalizeUserNames(fixed[badge]);\n\n for (const fixedName of namesForBadge) {\n const key = FakeUserPool.fixUser(fixedName);\n\n if (!fixedNameToBadge.has(key)) {\n fixedNameToBadge.set(key, badge);\n }\n }\n }\n\n for (const name of normalizedNames) {\n let selectedBadge: Twitch.tags | null = null;\n const fixedBadge = fixedNameToBadge.get(FakeUserPool.fixUser(name));\n\n if (fixedBadge && canUseBadge(fixedBadge)) {\n selectedBadge = fixedBadge;\n } else {\n selectedBadge = nextAvailableBadge();\n }\n\n if (!selectedBadge) {\n this.emit('warn', new Error('Not enough badges to assign to users'));\n continue;\n }\n\n const userIndex = users.length + 1;\n const isSubscriber = ['subscriber', 'prime', 'founder'].includes(\n String(selectedBadge).toLocaleLowerCase(),\n );\n\n const user = new FakeUser(\n `fake_user_${userIndex.toString().padStart(2, '0')}_${Math.random().toString(36).slice(2, 8)}+${this.id}`,\n name,\n selectedBadge ? [selectedBadge] : [],\n isSubscriber,\n isSubscriber ? FakeUserPool.getRandomSubTier() : undefined,\n );\n\n users.push(user);\n\n registerBadgeUsage(selectedBadge);\n }\n\n if (users.length < normalizedNames.length) {\n this.emit(\n 'warn',\n new Error(\n 'Some users could not be assigned badges due to limits. Consider increasing limits or adding more badges.',\n ),\n );\n }\n\n return users;\n }\n\n public pick(): FakeUser | null {\n if (!this.users.length) {\n return null;\n }\n\n return new RandomHelper().array(this.users)[0];\n }\n\n public getByName(name: string): FakeUser | null {\n const key = FakeUserPool.fixUser(name);\n return this.byName.get(key) ?? null;\n }\n\n public getById(id: string): FakeUser | null {\n return this.byId.get(id) ?? null;\n }\n\n public getByBadge(badge: Twitch.tags): FakeUser[] {\n return this.byBadge.get(badge) ?? [];\n }\n\n public getToReply(\n target: { id?: string; name?: string },\n extend?: Partial<Twitch.Reply>,\n ): Twitch.Reply | null {\n let user: FakeUser | null = null;\n\n if (target?.id) {\n user = this.getById(target.id);\n }\n\n if (!user && target?.name) {\n user = this.getByName(target.name);\n }\n\n if (!user) {\n return null;\n }\n\n return {\n msgId: `fake_msg_${Math.random().toString(36).slice(2, 10)}`,\n userId: user.id,\n userLogin: user.login,\n displayName: user.name,\n msgBody: `This is a fake reply from ${user.name}`,\n ...extend,\n };\n }\n\n public buildTwitchMessage(\n messages: string[] = Data.twitch_messages,\n ): Parameters<(typeof Local)['emulate']['twitch']['message']>[0] {\n const user = this.pick();\n\n if (!user) {\n this.emit('warn', new Error('No users available to build a Twitch message'));\n return;\n }\n\n return {\n userId: user.id,\n name: user.name,\n badges: user.badges,\n message: new RandomHelper().array(messages)[0],\n };\n }\n\n public buildYouTubeMessage(\n messages: string[] = Data.youtube_messages,\n ): Parameters<(typeof Local)['emulate']['youtube']['message']>[0] {\n const user = this.pick();\n\n if (!user) {\n this.emit('warn', new Error('No users available to build a YouTube message'));\n return;\n }\n\n return {\n userId: user.id,\n name: user.name,\n badges: user.badges,\n message: new RandomHelper().array(messages)[0],\n };\n }\n}\n","import { fakeUserPools } from '../../modules/fakeUser.js';\nimport { RequireAtLeastOne, StreamElements, Twitch } from '../../types.js';\nimport { EventHelper } from './event.js';\n\nexport class UtilsHelper {\n /**\n * Delays execution for a specified number of milliseconds.\n * @param ms - The number of milliseconds to delay.\n * @returns A Promise that resolves after the specified delay.\n */\n delay<R extends any, M extends number>(ms: M, callback?: () => R): Promise<R | null> {\n return new Promise((resolve) =>\n setTimeout(() => {\n if (callback) {\n const result = callback();\n resolve(result ?? null);\n } else resolve(null);\n }, ms),\n );\n }\n\n /**\n * Returns typed entries of an object.\n * @param obj - The object to get entries from.\n * @returns An array of key-value pairs from the object.\n */\n typedEntries<K extends string, V>(obj: Record<K, V> | Array<V>): [K, V][] {\n return Object.entries(obj) as [K, V][];\n }\n\n /**\n * Returns typed values of an object.\n * @param obj - The object to get values from.\n * @returns An array of values from the object.\n */\n typedValues<K extends string, V>(obj: Record<K, V> | Array<V>): V[] {\n return Object.values(obj) as V[];\n }\n\n /**\n * Returns typed keys of an object.\n * @param obj - The object to get keys from.\n * @returns An array of keys from the object.\n */\n typedKeys<K extends string, V>(obj: Record<K, V> | Array<V>): K[] {\n return Object.keys(obj) as K[];\n }\n\n /**\n * Compares two dates and returns the difference in multiple time units.\n *\n * `total` values are based on raw milliseconds (can be decimal).\n * `calendar` values use calendar boundaries for full months/years.\n */\n compareDates(date1: Date | string, date2: Date | string) {\n const d1 = date1 instanceof Date ? new Date(date1.getTime()) : new Date(date1);\n const d2 = date2 instanceof Date ? new Date(date2.getTime()) : new Date(date2);\n\n if (Number.isNaN(d1.getTime()) || Number.isNaN(d2.getTime())) {\n throw new Error('Invalid date provided to compareDates');\n }\n\n const milliseconds = d2.getTime() - d1.getTime();\n const absMilliseconds = Math.abs(milliseconds);\n\n const totalSeconds = milliseconds / 1000;\n const totalMinutes = milliseconds / (1000 * 60);\n const totalHours = milliseconds / (1000 * 60 * 60);\n const totalDays = milliseconds / (1000 * 60 * 60 * 24);\n const totalMonths = totalDays / 30.436875;\n const totalYears = totalDays / 365.2425;\n\n const from = d1 <= d2 ? d1 : d2;\n const to = d1 <= d2 ? d2 : d1;\n let calendarMonths =\n (to.getFullYear() - from.getFullYear()) * 12 + (to.getMonth() - from.getMonth());\n\n const anchor = new Date(from);\n anchor.setMonth(anchor.getMonth() + calendarMonths);\n\n if (anchor > to) {\n calendarMonths -= 1;\n }\n\n const sign = milliseconds < 0 ? -1 : 1;\n const signedCalendarMonths = calendarMonths * sign;\n const signedCalendarYears = (calendarMonths / 12) * sign;\n\n return {\n milliseconds,\n seconds: totalSeconds,\n minutes: totalMinutes,\n hours: totalHours,\n days: totalDays,\n months: totalMonths,\n years: totalYears,\n absolute: {\n milliseconds: absMilliseconds,\n seconds: absMilliseconds / 1000,\n minutes: absMilliseconds / (1000 * 60),\n hours: absMilliseconds / (1000 * 60 * 60),\n days: absMilliseconds / (1000 * 60 * 60 * 24),\n months: absMilliseconds / (1000 * 60 * 60 * 24 * 30.436875),\n years: absMilliseconds / (1000 * 60 * 60 * 24 * 365.2425),\n },\n calendar: {\n months: signedCalendarMonths,\n years: signedCalendarYears,\n },\n isFuture: milliseconds > 0,\n isPast: milliseconds < 0,\n isSameMoment: milliseconds === 0,\n };\n }\n\n /**\n * Selects an item based on weighted probabilities.\n * @param items - An object where keys are items and values are their weights.\n * @returns A randomly selected item based on the given probabilities.\n * @example\n * ```ts\n * const utils = new UtilsHelper();\n * const result = utils.probability({\n * apple: 0.5,\n * banana: 0.3,\n * cherry: 0.2,\n * });\n * console.log(result); // 'apple', 'banana', or 'cherry' based on the defined probabilities\n * ```\n */\n probability<K extends string, V extends number>(items: Record<K, V>): K | undefined {\n const total = (Object.values(items) as number[]).reduce((acc, val) => acc + val, 0);\n const sorted = this.typedEntries(items).sort((a, b) => b[1] - a[1]);\n const rand = Math.random() * total;\n\n let cumulative = 0;\n\n for (const [item, weight] of sorted) {\n cumulative += weight;\n\n if (rand < cumulative) {\n return item;\n }\n }\n\n return undefined;\n }\n\n /**\n * Finds the subscription tier of a user based on various sources of information.\n * @param data - An object containing userId, name, and broadcasterId to identify the user.\n * @param session - The current session data which may contain recent subscription information.\n * @param checkWithAPI - Whether to check the subscription tier with an external API as a last resort.\n * @returns A promise that resolves to the subscription tier of the user (1, 2, or 3).\n * @example\n * ```javascript\n * const utils = new UtilsHelper();\n * const tier = await utils.findSubscriptionTier(\n * { userId: '12345', name: 'exampleUser', broadcasterId: '67890' },\n * sessionData,\n * true\n * );\n * console.log(tier); // 1, 2, or 3 based on the user's subscription tier\n * ```\n */\n async findSubscriptionTier(\n {\n userId,\n name,\n broadcasterId,\n }: {\n userId: string;\n name: string;\n broadcasterId?: string;\n },\n session: StreamElements.Session.Data,\n checkWithAPI: boolean = false,\n ) {\n const convert = (tier?: string | number) => {\n if (tier === 'prime') return 1;\n else if (tier === '1000' || tier === 1000 || tier === 1 || tier === '1') return 1;\n else if (tier === '2000' || tier === 2000 || tier === 2 || tier === '2') return 2;\n else if (tier === '3000' || tier === 3000 || tier === 3 || tier === '3') return 3;\n else return 1;\n };\n\n // If it's a fake user, get the tier from the fake user pool\n if (userId?.includes('fake_user_')) {\n const pool = fakeUserPools.find((p) => userId.endsWith(`+${p.id}`));\n\n if (pool) {\n const user = pool.getById(userId);\n\n if (user) return convert(user.tier);\n }\n }\n\n // Check the recent subscriptions\n const recentSubscriptions = session['subscriber-recent'];\n\n if (recentSubscriptions) {\n const subscriber = recentSubscriptions.find((sub) => sub.name === name);\n\n if (subscriber) return convert(subscriber.tier);\n }\n\n // Check the latest subscriber\n\n const latestSubscriber = session['subscriber-latest'];\n\n if (latestSubscriber.name === name) {\n return convert(latestSubscriber.tier);\n }\n\n // Check gifts\n\n const latestGift = session['subscriber-gifted-latest'];\n\n if (latestGift.name === name) {\n return convert(latestGift.tier);\n }\n\n // Last try, check with my API\n if (checkWithAPI) {\n if (\n broadcasterId?.length &&\n userId?.length &&\n !broadcasterId.includes('fake_user_') &&\n !userId.includes('fake_user_')\n ) {\n const result = await fetch(\n `https://api.tixyel.com/v1/twitch/channel/subscriber/${broadcasterId}/${userId}`,\n )\n .then(async (res) =>\n res.status == 200\n ? res.json()\n : Promise.reject(\n new Error(\n `Failed to fetch subscription data: ${res.status} ${res.statusText} ${await res.text()}`,\n ),\n ),\n )\n .then(\n (data: {\n broadcaster: { id: string; name: string; displayName: string };\n isGift: boolean;\n tier: string;\n }) => {\n return data?.tier;\n },\n )\n .catch(() => 1);\n\n if (result) return convert(result);\n }\n }\n\n return 1;\n }\n\n /**\n * Identifies a user based on the received event and session data, returning their ID, name, role, badges, and top status.\n * @param receivedEvent - The event received from the provider (Twitch or YouTube) containing user information.\n * @param session - The current session data which may contain recent activity and top user information.\n * @returns A promise that resolves to an object containing the user's ID, name, role, badges, and top status, or undefined if the user cannot be identified.\n * @example\n * ```javascript\n * const utils = new UtilsHelper();\n * const userInfo = await utils.identifyUser(receivedEvent, sessionData);\n * console.log(userInfo);\n * // {\n * // id: '12345',\n * // name: 'exampleUser',\n * // role: 'moderator',\n * // badges: [{ type: 'moderator', version: '1', url: 'https:...', description: 'Moderator' }],\n * // top: {\n * // gifter: false,\n * // tip: {\n * // session: { donator: false, donation: false },\n * // weekly: { donator: false, donation: false },\n * // monthly: { donator: false, donation: false },\n * // alltime: { donator: false, donation: false },\n * // },\n * // ...\n * // }\n * // }\n * ```\n */\n async identifyUser(\n receivedEvent:\n | StreamElements.Event.Provider.Twitch.Message\n | StreamElements.Event.Provider.YouTube.Message,\n session: StreamElements.Session.Data,\n ): Promise<IdentifyYouTubeResult | IdentifyTwitchResult | undefined> {\n const received = new EventHelper().parseProvider(receivedEvent);\n\n const getTops = (name: string): TopType => ({\n gifter: session['subscriber-alltime-gifter'].name === name,\n tip: {\n session: {\n donator: session['tip-session-top-donator'].name === name,\n donation: session['tip-session-top-donation'].name === name,\n },\n weekly: {\n donator: session['tip-weekly-top-donator'].name === name,\n donation: session['tip-weekly-top-donation'].name === name,\n },\n monthly: {\n donator: session['tip-monthly-top-donator'].name === name,\n donation: session['tip-monthly-top-donation'].name === name,\n },\n alltime: {\n donator: session['tip-alltime-top-donator'].name === name,\n donation: session['tip-alltime-top-donation'].name === name,\n },\n },\n cheer: {\n session: {\n donator: session['cheer-session-top-donator'].name === name,\n amount: session['cheer-session-top-donation'].name === name,\n },\n weekly: {\n donator: session['cheer-weekly-top-donator'].name === name,\n amount: session['cheer-weekly-top-donation'].name === name,\n },\n monthly: {\n donator: session['cheer-monthly-top-donator'].name === name,\n amount: session['cheer-monthly-top-donation'].name === name,\n },\n alltime: {\n donator: session['cheer-alltime-top-donator'].name === name,\n amount: session['cheer-alltime-top-donation'].name === name,\n },\n },\n superchat: {\n session: {\n donator: session['superchat-session-top-donator'].name === name,\n amount: session['superchat-session-top-donation'].name === name,\n },\n weekly: {\n donator: session['superchat-weekly-top-donator'].name === name,\n amount: session['superchat-weekly-top-donation'].name === name,\n },\n monthly: {\n donator: session['superchat-monthly-top-donator'].name === name,\n amount: session['superchat-monthly-top-donation'].name === name,\n },\n alltime: {\n donator: session['superchat-alltime-top-donator'].name === name,\n amount: session['superchat-alltime-top-donation'].name === name,\n },\n },\n });\n\n switch (received.provider) {\n case 'twitch': {\n switch (received.data.listener) {\n case 'message': {\n const event = received.data.event;\n const data = event.data;\n\n const tier = await this.findSubscriptionTier(\n {\n userId: data.userId,\n name: data.displayName,\n broadcasterId: data.tags['room-id'],\n },\n session ?? ({} as StreamElements.Session.Data),\n false,\n );\n\n return {\n id: data.userId,\n name: data.displayName,\n color: data.displayColor,\n role: data.tags.badges.split(',')[0].split('/')[0] as Twitch.tags,\n tags: data.tags.badges.split(',').map((b) => b.split('/')[0] as Twitch.tags),\n badges: data.tags.badges,\n tier: data.tags.badges.includes('subscriber') ? tier : undefined,\n top: getTops(data.displayName),\n } satisfies IdentifyTwitchResult;\n }\n }\n\n break;\n }\n case 'youtube': {\n switch (received.data.listener) {\n case 'message': {\n const event = received.data.event;\n const data = event.data;\n\n const role = data.authorDetails.isChatOwner\n ? 'broadcaster'\n : data.authorDetails.isChatModerator\n ? 'moderator'\n : data.authorDetails.isChatSponsor\n ? 'sponsor'\n : data.authorDetails.isVerified\n ? 'verified'\n : 'viewer';\n\n return {\n id: data.userId,\n name: data.displayName,\n role: role,\n badges: data.badges,\n top: getTops(data.displayName),\n } satisfies IdentifyYouTubeResult;\n }\n }\n\n break;\n }\n }\n\n return undefined;\n }\n}\n\ntype TopType = {\n gifter: boolean;\n tip: {\n session: { donator: boolean; donation: boolean };\n weekly: { donator: boolean; donation: boolean };\n monthly: { donator: boolean; donation: boolean };\n alltime: { donator: boolean; donation: boolean };\n };\n cheer: {\n session: { donator: boolean; amount: boolean };\n weekly: { donator: boolean; amount: boolean };\n monthly: { donator: boolean; amount: boolean };\n alltime: { donator: boolean; amount: boolean };\n };\n superchat: {\n session: { donator: boolean; amount: boolean };\n weekly: { donator: boolean; amount: boolean };\n monthly: { donator: boolean; amount: boolean };\n alltime: { donator: boolean; amount: boolean };\n };\n};\n\ntype IdentifyTwitchResult = {\n id: string;\n name: string;\n color: string;\n role: Twitch.tags;\n tags: Twitch.tags[];\n badges: string;\n tier?: 1 | 2 | 3;\n top: TopType;\n};\n\ntype IdentifyYouTubeResult = {\n id: string;\n name: string;\n role: 'broadcaster' | 'moderator' | 'sponsor' | 'verified' | 'viewer';\n badges: unknown[];\n top: TopType;\n};\n","import {\n ColorHelper,\n ElementHelper,\n EventHelper,\n FunctionHelper,\n MessageHelper,\n NumberHelper,\n ObjectHelper,\n RandomHelper,\n SoundHelper,\n StringHelper,\n UtilsHelper,\n} from './classes/index.js';\n\nexport namespace Helper {\n export const number = new NumberHelper();\n\n export const element = new ElementHelper();\n\n export const object = new ObjectHelper();\n\n export const message = new MessageHelper();\n\n export const event = new EventHelper();\n\n export const string = new StringHelper();\n\n export const sound = new SoundHelper();\n\n export const color = new ColorHelper();\n\n export const random = new RandomHelper();\n\n export const fn = new FunctionHelper();\n\n export const utils = new UtilsHelper();\n}\n","import { Client } from '../client/client.js';\nimport { Helper } from '../helper/index.js';\nimport { logger } from '../main.js';\nimport { StreamElements } from '../types/index.js';\n\ninterface ButtonOptions {\n field: string | ((field: string, value: string | boolean | number) => boolean);\n template?: string;\n name?: string;\n value?: string;\n run: (this: Client | undefined, field: string, value: string | boolean | number) => void;\n}\n\nconst buttons: Button[] = [];\n\n/**\n * Represents a button action that can be triggered by custom fields in StreamElements.\n * The button can be configured with a template and a name, and it will execute a specified function when triggered.\n * @example\n * ```javascript\n * const button = new Button({\n * field: (field, value) => field.startsWith('message-') && field.split('-')[1],\n * template: 'message-{role}',\n * // name: '[CAP={role}] role message',\n * name: 'Generate {role} message',\n * run(field, value) {\n * console.log(`Button ${field} was clicked with value: ${value}`);\n * }\n * })\n *\n * const field = button.generate([{ role: 'broadcaster' }, { role: 'moderator' }]);\n * // This will create buttons with fields \"message-broadcaster\" and \"message-moderator\" and names \"Generate broadcaster message\" and \"Generate moderator message\".\n * // field['message-broadcaster'] => { type: 'button', label: 'Generate broadcaster message' }\n * // field['message-moderator'] => { type: 'button', label: 'Generate moderator message' }\n *\n * // When a custom field with the name \"message-broadcaster\" or \"message-moderator\" is triggered, the run function will be called with the field and value.\n * ```\n */\nexport class Button {\n field: ButtonOptions['field'] = 'button';\n template: string = 'button';\n name: string = 'Button';\n value: string = '';\n\n run!: ButtonOptions['run'];\n\n constructor(options: ButtonOptions) {\n this.field = options.field ?? this.field;\n this.template =\n options.template ?? (typeof this.field === 'string' ? this.field : this.template);\n this.name = options.name ?? this.name;\n this.value = options.value ?? this.value;\n this.run = options.run;\n\n buttons.push(this);\n\n if (!(window?.client instanceof Client)) return;\n\n // Register the button in the client actions\n window?.client?.actions.buttons.push(this);\n window?.client?.emit('action', this, 'created');\n }\n\n generate(values: Array<Record<string, string | number>>) {\n const fields = Helper.utils.typedValues(values).reduce(\n (acc, values, index) => {\n const key = Helper.string.compose(this.template, { index, ...values }, { html: false });\n const name = Helper.string.compose(this.name, { index, ...values }, { html: false });\n\n acc[key] = {\n type: 'button',\n label: name,\n };\n\n let value: string | number | boolean = Helper.string.compose(\n String(this.value),\n { index, ...values },\n { html: false },\n );\n\n if (!isNaN(Number(value))) value = Number(value);\n else if (value.toLowerCase() === 'true') value = true;\n else if (value.toLowerCase() === 'false') value = false;\n\n if (\n typeof value !== 'undefined' &&\n !!value &&\n (typeof value === 'string' ? value.length : true)\n ) {\n acc[key].value = value;\n }\n\n return acc;\n },\n {} as Record<string, StreamElements.CustomField.Schema>,\n );\n\n // let result = Helper.string.compose(this.template, values, { html: false });\n\n return fields;\n }\n\n parse(field: string, value: string | boolean | number): Button {\n /**\n * Extract the actual field name by removing the template part from the provided field.\n * For example, if the template is \"button-{id}\" and the field is \"button-123\",\n * this will extract \"123\" as the actual field name.\n */\n var f = field\n .replace(\n typeof this.field === 'string'\n ? this.field\n : (this.template.replace(/\\{[^}]*\\}/g, '') ?? ''),\n '',\n )\n .trim();\n\n try {\n this.run.apply(window?.client || undefined, [f.length ? f : (field ?? field), value]);\n } catch (error) {\n throw new Error(\n `Error running button \"${this.field}\": ${error instanceof Error ? error.message : error}`,\n );\n }\n\n return this;\n }\n\n remove(): void {\n const _index = buttons.indexOf(this);\n\n if (_index > -1) {\n buttons.splice(_index, 1);\n }\n\n if (!(window?.client instanceof Client)) return;\n\n const index = window?.client.actions.buttons.indexOf(this);\n\n if (index > -1) {\n window?.client?.actions.buttons.splice(index, 1);\n window?.client?.emit('action', this, 'removed');\n }\n }\n\n static execute(field: string, value: string | boolean | number): boolean {\n try {\n if (buttons.length) {\n const found = buttons.filter((b) => {\n /**\n * Check if the button's field matches the provided field.\n */\n if (typeof b.field === 'string') return b.field === field;\n /**\n * If the button's field is a function, call it with the provided field and value to determine a match.\n */\n if (typeof b.field === 'function') return b.field(field, value);\n\n return false;\n });\n\n if (found.length && found.every((b) => b instanceof Button)) {\n found.forEach((button) => {\n try {\n button.parse(field, value);\n\n window?.client?.emit('action', button, 'executed');\n\n logger.received(`Button executed: ${field}${value ? ` with value: ${value}` : ''}`);\n } catch (error) {\n logger.error(\n `Error executing button \"${field}\": ${error instanceof Error ? error.message : error}`,\n );\n }\n });\n\n return true;\n }\n }\n } catch (error) {\n return false;\n } finally {\n return false;\n }\n }\n}\n\nexport { buttons as usedButtons };\n","import { Client } from '../client/client.js';\nimport { logger } from '../main.js';\nimport { StreamElements } from '../types/streamelements/main.js';\n\ninterface CommandOptions {\n prefix?: string;\n name: string;\n description?: string;\n arguments?: boolean;\n run: (this: Client, args: string[], event: CommandEvent) => void;\n test?: string;\n aliases?: string[];\n permissions?: string[] | boolean;\n admins?: string[];\n}\n\ntype CommandEvent =\n | { provider: 'twitch'; data: StreamElements.Event.Provider.Twitch.Message }\n | { provider: 'youtube'; data: StreamElements.Event.Provider.YouTube.Message }\n | { provider: 'kick'; data: any };\n\nconst commands: Command[] = [];\n\nexport class Command {\n prefix: string = '!';\n\n name!: string;\n description!: string;\n\n arguments: boolean = false;\n\n test: string | (() => string) = `${this.prefix}${this.name} arg1 arg2`;\n\n aliases: string[] = [];\n permissions?: string[] | boolean = undefined;\n admins: string[] = [];\n\n constructor(options: CommandOptions) {\n this.prefix = options.prefix ?? this.prefix;\n this.name = options.name;\n this.description = options.description ?? this.description;\n this.arguments = options.arguments ?? this.arguments;\n\n this.run = options.run;\n\n this.test = options.test ?? this.test;\n this.aliases = options.aliases ?? this.aliases;\n this.permissions = options.permissions ?? this.permissions;\n this.admins = options.admins ?? this.admins;\n\n commands.push(this);\n\n if (!(window?.client instanceof Client)) return;\n\n // Register the command in the client actions\n window?.client?.actions.commands.push(this);\n\n window?.client?.emit('action', this, 'created');\n }\n\n run(this: Client | undefined, args: string[], event: CommandEvent): void {}\n\n verify(nickname: string, roles: string[], args: string[]): boolean {\n if (this.arguments === true && (!args || !args.length)) {\n return false;\n }\n\n if (this.admins.some((a) => nickname.toLocaleLowerCase() === a.toLocaleLowerCase())) {\n return true;\n }\n\n if (\n this.permissions === true ||\n typeof this.permissions === 'undefined' ||\n (Array.isArray(this.permissions) && !this.permissions.length)\n ) {\n return true;\n }\n\n if (\n Array.isArray(this.permissions) &&\n (this.permissions.some(\n (p) =>\n nickname.toLowerCase() === p.toLowerCase() ||\n roles.map((r) => r.toLowerCase()).includes(p.toLowerCase()),\n ) ||\n this.permissions.includes('*'))\n ) {\n return true;\n }\n\n return false;\n }\n\n parse(text: string, event: CommandEvent): boolean {\n const args = text\n .replace(this.prefix, '')\n .split(' ')\n .slice(1)\n .map((a) => a.trim());\n\n var nickname: string = '';\n var roles: string[] = [];\n\n const rAliases = { bits: 'cheer', premium: 'prime' };\n\n switch (event.provider) {\n case 'twitch': {\n const data = event.data;\n\n nickname = data.event.data.nick || data.event.data.displayName;\n\n if (data.event.data.tags?.badges) {\n const tags = data.event.data.tags.badges.toString().replace(/\\/\\d+/g, '').split(',');\n\n roles = tags.map((t) => (t in rAliases ? rAliases[t as keyof typeof rAliases] : t));\n }\n\n break;\n }\n case 'youtube': {\n const data = event.data;\n\n const rMap = {\n isVerified: 'verified',\n isChatOwner: 'owner',\n isChatSponsor: 'sponsor',\n isChatModerator: 'moderator',\n };\n\n nickname = data.event.data.nick || data.event.data.displayName;\n\n roles = Object.entries(data.event.data.authorDetails)\n .filter(([k, v]) => k.startsWith('is') && v)\n .map(([k]) => rMap[k as keyof typeof rMap])\n .filter(Boolean);\n\n if (roles.includes('sponsor')) {\n roles.push('premium');\n roles.push('prime');\n }\n if (roles.includes('owner')) {\n roles.push('moderator');\n roles.push('broadcaster');\n }\n\n break;\n }\n case 'kick': {\n return false;\n\n break;\n }\n }\n\n const verify = this.verify(nickname, roles, args);\n\n if (verify === true) {\n this.run.apply(window?.client || undefined, [args, event]);\n }\n\n return verify;\n }\n\n remove(): void {\n const _index = commands.indexOf(this);\n\n if (_index > -1) {\n commands.splice(_index, 1);\n }\n\n if (!(window?.client instanceof Client)) return;\n\n const index = window?.client?.actions.commands.indexOf(this);\n\n if (index > -1) {\n window?.client?.actions.commands.splice(index, 1);\n window?.client?.emit('action', this, 'removed');\n }\n }\n\n static execute(received: CommandEvent): boolean {\n const data = received.data;\n\n try {\n if (commands.length && commands.some((c) => data.event.data.text.startsWith(c.prefix))) {\n const found = commands.filter((c) => {\n var nameAndAliases = [c.name, ...(c.aliases ?? [])];\n var commandMatch = data.event.data.text.replace(c.prefix, '').split(' ')[0];\n\n return nameAndAliases.includes(commandMatch);\n });\n\n if (found.length && found.every((command) => command instanceof Command)) {\n found.forEach((command) => {\n command.parse(data.event.data.text, received);\n\n window?.client?.emit('action', command, 'executed');\n\n logger.received(\n `Command executed: ${data.event.data.text} by ${data.event.data.nick || data.event.data.displayName}`,\n data,\n );\n });\n\n return true;\n }\n }\n } catch (error) {\n return false;\n } finally {\n return false;\n }\n }\n}\n\nexport { commands as usedCommands };\n","import { USE_SE_API } from '../main.js';\nimport { StreamElements } from '../types/index.js';\nimport { EventProvider } from './EventProvider.js';\n\ntype MessageMap = Record<string, any>;\n\ntype MessageTuple<T extends MessageMap> = {\n [K in keyof T]: [key: K, data: T[K]];\n}[keyof T];\n\ntype BaseEvents<T extends MessageMap> = {\n load: [];\n message: MessageTuple<T>;\n};\n\ntype UseCommsOptions = {\n id?: string;\n};\n\ntype UseCommItem<T extends MessageMap> = {\n nonce: string;\n key: keyof T;\n value: T[keyof T];\n timestamp: string;\n};\n\nexport const usedComms: Array<useComms<any>> = [];\n\n/**\n * A module for handling communications between different widgets inside streamelements.\n * @example\n * ```ts\n * type CommsMessages = {\n * hello: { loaded: boolean };\n * update: { value: number };\n * reload: {};\n * tags: string[];\n * }\n *\n * const comms = new useComms<CommsMessages>();\n *\n * comms.on('message', (message, data) => {\n * switch (message) {\n * case 'hello': {}\n * case 'update': {}\n * case 'reload': {}\n * case 'tags': {}\n * }\n * })\n * ```\n */\nexport class useComms<T extends MessageMap> extends EventProvider<BaseEvents<T>> {\n private SE_API: StreamElements.SE_API | null = null;\n\n public id: string = 'widget communications';\n public loaded: boolean = false;\n\n public history: Array<UseCommItem<T>> = [];\n public detected = new Set<string>();\n\n constructor(options: UseCommsOptions = {}) {\n super();\n\n this.id = options.id || this.id;\n\n usedComms.push(this);\n\n USE_SE_API?.then(async (se) => {\n this.loaded = true;\n this.SE_API = se;\n\n Promise.all([\n async () => {\n const history = await se.store.get<Array<UseCommItem<T>>>(this.id);\n\n if (history) {\n this.history = history.slice(-10);\n }\n },\n async () => {\n const detected = await se.store.get<string[]>(this.id + '_detected');\n\n if (detected) {\n this.detected = new Set(detected);\n }\n },\n ]);\n });\n }\n\n public async send<K extends keyof T>(key: K, data: T[K]) {\n if (this.SE_API) {\n // this.SE_API.store.set(this.id, { message: key, data });\n\n const message = {\n nonce: Math.random().toString(36).substring(2),\n key,\n value: data,\n timestamp: new Date().toISOString(),\n };\n\n this.history.push(message);\n\n this.SE_API.store.set(this.id, this.history);\n this.SE_API.store.set(this.id + '_detected', Array.from(this.detected));\n }\n }\n\n public update(history: Array<UseCommItem<T>>) {\n if (!history.length) {\n return;\n }\n\n this.history = history;\n\n const messages = history.filter((message) => !this.detected.has(message.nonce));\n\n messages.forEach((message) => {\n this.detected.add(message.nonce);\n\n this.emit('message', message.key, message.value);\n });\n }\n\n public override on<K extends keyof BaseEvents<T>>(\n eventName: K,\n callback: (this: useComms<T>, ...args: BaseEvents<T>[K]) => void,\n ) {\n if (eventName === 'load' && this.loaded) {\n callback.apply(this);\n\n return this;\n }\n\n super.on(eventName, callback);\n\n return this;\n }\n}\n","import { Button } from '../actions/button.js';\nimport { Command } from '../actions/command.js';\nimport { Helper } from '../helper/index.js';\nimport { Local } from '../local/index.js';\nimport { logger } from '../main.js';\nimport { usedComms } from '../modules/useComms.js';\nimport { useQueue } from '../modules/useQueue.js';\nimport { usedStorages } from '../modules/useStorage.js';\nimport { Client, ClientStorageOptions } from './client.js';\n\nif (typeof window !== undefined) {\n window.addEventListener('onWidgetLoad', async (data) => {\n const { detail } = data;\n\n if (window.client instanceof Client && client instanceof Client && !!client) {\n const client = window.client;\n\n client.fields = detail.fieldData;\n client.session = detail.session.data;\n\n client.details = {\n ...client.details,\n user: detail.channel,\n currency: detail.currency,\n overlay: detail.overlay,\n };\n\n if (detail.channel.id && !detail.emulated) {\n await fetch(`https://api.streamelements.com/kappa/v2/channels/${detail.channel.id}/`)\n .then((res) => res.json())\n .then((profile) => {\n if (profile.provider) {\n client.details.provider = profile.provider;\n\n return profile.provider;\n } else {\n client.details.provider = 'local';\n }\n })\n .catch(() => {\n client.details.provider = 'local';\n });\n } else {\n client.details.provider = 'local';\n }\n\n client.emit('load', detail);\n\n if (client.debug) {\n logger.received('Widget loaded!', data.detail);\n\n const fieldData = data.detail.fieldData;\n\n if (Object.keys(fieldData).length) logger.received('Field data:', fieldData);\n }\n\n client.loaded = true;\n\n client.storage.on('load', (data) => {\n if (client.debug && data) {\n logger.debug(\n '[Client]',\n 'Storage loaded for client',\n `\"${client.id}\";`,\n `Provider: \"${client.details.provider}\";`,\n data,\n );\n } else if (client.debug) {\n logger.debug(\n '[Client]',\n 'Storage loaded for client',\n `\"${client.id}\";`,\n `Provider: \"${client.details.provider}\";`,\n 'No data found.',\n );\n }\n\n if (data) {\n const clearExpired = <T extends Record<string, ClientStorageOptions<string>>>(\n data: T,\n ) => {\n const now = Date.now();\n const cleanedData: any = {};\n\n for (const key in data) {\n if (data.hasOwnProperty(key)) {\n const entry = data[key];\n\n if (entry.expire && entry.expire > now) {\n cleanedData[key] = entry;\n }\n }\n }\n\n return cleanedData as T;\n };\n\n const users = clearExpired(data['user'] || {});\n const avatars = clearExpired(data['avatar'] || {});\n const pronouns = clearExpired(data['pronoun'] || {});\n const emotes = clearExpired(data['emote'] || {});\n\n client.storage.update({\n user: users,\n avatar: avatars,\n pronoun: pronouns,\n emote: emotes,\n });\n }\n\n if (detail.channel.providerId.length) {\n client.storage.add(`avatar.${detail.channel.providerId.toLowerCase()}`, {\n value: detail.channel.avatar,\n timestamp: Date.now(),\n expire: Date.now() + client.cache.avatar * 60 * 1000,\n });\n }\n });\n }\n });\n\n window.addEventListener('onSessionUpdate', (data) => {\n const { detail } = data;\n\n if (window.client instanceof Client && client instanceof Client && !!client) {\n const client = window.client;\n\n client.session = detail.session;\n\n client.emit('session', detail.session);\n\n if (client.debug) {\n logger.debug('[Client]', 'Session updated', detail.session);\n }\n }\n });\n\n window.addEventListener('onEventReceived', ({ detail }) => {\n if (window.client instanceof Client && client instanceof Client && !!client) {\n const received = Helper.event.parseProvider(detail);\n\n switch (received.provider) {\n case 'streamelements': {\n const data = received.data;\n\n switch (data.listener) {\n case 'tip-latest': {\n const event = data.event;\n\n break;\n }\n case 'event:skip': {\n const event = data.event;\n\n break;\n }\n case 'event:test': {\n switch (data.event.listener) {\n case 'widget-button': {\n const event = data.event;\n\n Button.execute(event.field, event.value);\n\n break;\n }\n case 'subscriber-latest': {\n const event = data.event;\n break;\n }\n\n // ... alot more\n }\n\n break;\n }\n case 'kvstore:update': {\n const event = data.event;\n\n if (usedStorages.length) {\n var storage = usedStorages.find(\n (s) =>\n s.id === event.data.key.replace('customWidget.', '') || s.id === event.data.key,\n );\n\n if (storage) {\n // @ts-ignore\n storage.update(event.data.value);\n }\n }\n\n if (usedComms.length) {\n const comm = usedComms.find(\n (c) =>\n c.id === event.data.key.replace('customWidget.', '') || c.id === event.data.key,\n );\n\n if (comm) {\n // @ts-ignore\n comm.update(event.data.value);\n }\n }\n\n break;\n }\n case 'bot:counter': {\n const event = data.event;\n\n break;\n }\n case 'alertService:toggleSound': {\n const event = data.event;\n\n client.details.overlay.muted = Boolean(event.muted);\n\n break;\n }\n }\n\n window.client.emit('event', 'streamelements', received.data);\n\n break;\n }\n case 'twitch': {\n const data = received.data;\n\n switch (data.listener) {\n case 'delete-message': {\n const event = data.event;\n\n break;\n }\n case 'delete-messages': {\n const event = data.event;\n\n break;\n }\n case 'message': {\n const event = data.event;\n\n Command.execute({ provider: 'twitch', data: data });\n\n break;\n }\n case 'follower-latest': {\n const event = data.event;\n\n break;\n }\n case 'cheer-latest': {\n const event = data.event;\n\n break;\n }\n case 'subscriber-latest': {\n if (!data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\n // normal\n const event = data.event;\n } else if (\n data.event.gifted &&\n !data.event.bulkGifted &&\n !data.event.isCommunityGift\n ) {\n // gift\n const event = data.event;\n } else if (\n data.event.gifted &&\n !data.event.bulkGifted &&\n data.event.isCommunityGift\n ) {\n // community gift spam\n const event = data.event;\n } else if (\n !data.event.gifted &&\n data.event.bulkGifted &&\n !data.event.isCommunityGift\n ) {\n // community gift\n const event = data.event;\n }\n\n break;\n }\n case 'raid-latest': {\n const event = data.event;\n\n break;\n }\n }\n\n window.client.emit('event', 'twitch', received.data);\n\n break;\n }\n case 'youtube': {\n const data = received.data;\n\n switch (data.listener) {\n case 'message': {\n const event = data.event;\n\n Command.execute({ provider: 'youtube', data: data });\n\n break;\n }\n case 'subscriber-latest': {\n const event = data.event;\n\n break;\n }\n case 'sponsor-latest': {\n const event = data.event;\n\n if (!data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\n // normal\n const event = data.event;\n } else if (\n data.event.gifted &&\n !data.event.bulkGifted &&\n !data.event.isCommunityGift\n ) {\n // gift\n const event = data.event;\n } else if (\n data.event.gifted &&\n !data.event.bulkGifted &&\n data.event.isCommunityGift\n ) {\n // community gift spam\n const event = data.event;\n } else if (\n !data.event.gifted &&\n data.event.bulkGifted &&\n !data.event.isCommunityGift\n ) {\n // community gift\n const event = data.event;\n }\n\n break;\n }\n case 'superchat-latest': {\n const event = data.event;\n\n break;\n }\n }\n\n window.client.emit('event', 'youtube', received.data);\n\n break;\n }\n case 'kick': {\n const data = received.data;\n\n window.client.emit('event', 'kick', received.data);\n\n break;\n }\n case 'facebook': {\n const data = received.data;\n\n window.client.emit('event', 'facebook', received.data);\n\n break;\n }\n }\n\n const excludeListeners: Array<(typeof received.data)['listener']> = [\n 'bot:counter',\n 'alertService:toggleSound',\n 'event',\n 'event:skip',\n 'event:test',\n 'kvstore:update',\n ];\n\n if (client.debug && !excludeListeners.some((e) => e === received.data.listener)) {\n logger.received(\n '[Client]',\n `Event ${received.data.listener} received from ${received.provider}`,\n received.data.event,\n );\n }\n }\n });\n}\n","import { Client } from '../client/client.js';\nimport { logger } from '../main.js';\nimport { EventProvider } from './EventProvider.js';\n\ntype QueueEvents<T> = {\n load: [];\n cancel: [];\n update: [\n queue: QueueItem<T>[],\n priorityQueue: QueueItem<T>[],\n history: QueueItem<T>[],\n timeouts: Array<ReturnType<typeof setTimeout>>,\n ];\n process: [item: QueueItem<T>, queue: useQueue<T>];\n};\n\ntype QueueProps = {\n isoDate: string;\n isLoop: boolean;\n isPriority: boolean;\n isImmediate: boolean;\n};\n\ntype QueueItem<T> = { value: T } & QueueProps;\n\ntype QueueProcessor<T> = (this: useQueue<T>, item: T, queue: useQueue<T>) => Promise<any>;\n\ntype QueueDuration = number | boolean | undefined;\n\ninterface QueueOptions<T> {\n /**\n * Duration between processing each item in milliseconds. Set to `0` or `false` for immediate processing.\n */\n duration?: QueueDuration | 'client';\n /**\n * Function to process each item in the queue.\n */\n processor: QueueProcessor<T>;\n}\n\n/**\n * A utility class to manage a queue of items with support for priority, looping, and immediate processing.\n * @template T - The type of items in the queue.\n * @extends EventProvider<QueueEvents<T>>\n * @example\n * ```javascript\n * const myQueue = new useQueue({\n * duration: 1000,\n * processor: async function (item) {\n * console.log('Processing item:', item);\n * },\n * });\n *\n * myQueue.enqueue('Item 1');\n * myQueue.enqueue('Item 2', { isPriority: true });\n * ```\n */\nexport class useQueue<T> extends EventProvider<QueueEvents<T>> {\n queue: QueueItem<T>[] = [];\n priorityQueue: QueueItem<T>[] = [];\n history: QueueItem<T>[] = [];\n\n private timeouts: Array<ReturnType<typeof setTimeout>> = [];\n\n public running: boolean = false;\n\n public duration: QueueDuration = undefined;\n\n private loaded: boolean = false;\n\n public processor!: QueueProcessor<T>;\n\n private readonly clientWaitRetryDelay = 50;\n\n constructor(options: QueueOptions<T>) {\n super();\n\n if (!options.processor || typeof options.processor !== 'function') {\n throw new Error('A valid processor function must be provided to useQueue.');\n }\n\n this.processor = options.processor;\n\n if (options.duration !== 'client') this.duration = options.duration ?? 0;\n\n this.waitForClientAndBindLoad(options.duration);\n }\n\n private waitForClientAndBindLoad(\n duration: QueueDuration | 'client' = this.duration,\n callback?: () => void,\n ) {\n if (!(window?.client instanceof Client)) {\n setTimeout(\n () => this.waitForClientAndBindLoad(duration, callback),\n this.clientWaitRetryDelay,\n );\n\n return;\n }\n\n window.client.on('load', () => {\n if (duration === 'client')\n this.duration = (window?.client?.fields?.widgetDuration ?? 0) as number;\n\n this.emit('load');\n\n this.loaded = true;\n if (callback) callback();\n });\n }\n\n /**\n * Enqueue an item or multiple items into the queue with optional processing options.\n * @param value - The item or items to be enqueued. Can be a single value of type T or an array of objects containing the value and options.\n * @param options - Optional processing options for the item(s) being enqueued. Ignored if an array of items is provided, as each item can have its own options.\n * @returns The instance of the queue for chaining.\n * @example\n * ```javascript\n * myQueue.enqueue('Single Item', { isPriority: true });\n * myQueue.enqueue([\n * { value: 'Item 1', options: { isPriority: true } },\n * { value: 'Item 2', options: { isLoop: true } }\n * ]);\n * ```\n */\n public enqueue(value: T, options?: Partial<QueueProps>): this;\n public enqueue(items: { value: T; options?: Partial<QueueProps> }[]): this;\n public enqueue(\n valueOrItems: T | { value: T; options?: Partial<QueueProps> }[],\n options: Partial<QueueProps> = {},\n ): this {\n const hadItems = this.hasItems();\n\n const entries: { value: T; options: Partial<QueueProps> }[] = Array.isArray(valueOrItems)\n ? valueOrItems.map((entry) => ({ value: entry.value, options: entry.options ?? {} }))\n : [{ value: valueOrItems as T, options }];\n\n for (const entry of entries) {\n const item: QueueItem<T> = {\n isoDate: new Date().toISOString(),\n isLoop: entry.options?.isLoop ?? false,\n isPriority: entry.options?.isPriority ?? false,\n isImmediate: entry.options?.isImmediate ?? false,\n value: entry.value,\n };\n\n if (item.isPriority && item.isImmediate) {\n this.cancel();\n this.priorityQueue.unshift(item);\n } else {\n const targetQueue = item.isPriority ? this.priorityQueue : this.queue;\n\n targetQueue.push(item);\n }\n }\n\n // Always process immediately if it's not running and the queue was empty before\n if (this.running === false && hadItems === false) {\n this.run();\n }\n\n this.emit('update', this.queue, this.priorityQueue, this.history, this.timeouts);\n\n return this;\n }\n\n private async run() {\n if (!this.hasItems()) {\n this.running = false;\n return;\n }\n\n this.running = true;\n\n await this.next();\n\n if (typeof this.duration === 'number' && this.duration > 0) {\n this.timeouts.push(setTimeout(() => this.run(), this.duration));\n } else if (this.duration === 0 || (this.duration !== -1 && this.duration !== false)) {\n this.run();\n }\n }\n\n private async next() {\n const nextItem =\n this.priorityQueue.length > 0 ? this.priorityQueue.shift() : this.queue.shift();\n\n if (!nextItem) {\n this.running = false;\n\n return;\n }\n\n try {\n await this.processor.apply(this, [nextItem.value, this]);\n\n this.emit('process', nextItem, this);\n } catch (error) {\n logger.error(\n `Error during item processing: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n this.history.push(nextItem);\n\n const targetQueue = nextItem.isPriority ? this.priorityQueue : this.queue;\n\n if (nextItem.isLoop) targetQueue.push(nextItem);\n }\n\n /**\n * Resume processing the queue if it is paused. If the queue is already running, it will be restarted, which can be useful if new items have been added or if you want to reset the processing timer.\n * If the queue was empty before, it will start processing immediately.\n * @returns - The instance of the queue for chaining.\n * @example\n * ```javascript\n * myQueue.resume();\n * ```\n */\n public resume() {\n if (this.running) {\n this.cancel();\n }\n\n if (this.hasItems()) this.run();\n\n return this;\n }\n\n /**\n * Update the queue's state with new values. This can be used to replace the current queue, priority queue, history, or timeouts with new data. If the queue is not currently running and there are items in the queue after the update, it will start processing immediately.\n * @param save - An object containing the new state for the queue, priority queue, history, and timeouts. Each property is optional, and if not provided, the current state will be retained.\n * @returns - The instance of the queue for chaining.\n * @example\n * ```javascript\n * myQueue.update({\n * queue: newQueueItems,\n * priorityQueue: newPriorityItems,\n * history: newHistory,\n * });\n * ```\n */\n public update(save: Partial<useQueue<T>>): this {\n this.queue = save.queue ?? this.queue;\n this.priorityQueue = save.priorityQueue ?? this.priorityQueue;\n this.history = save.history ?? this.history;\n\n if (this.hasItems() && this.running === false) {\n window.client?.on('load', () => this.run());\n }\n\n return this;\n }\n\n /**\n * Cancel all pending timeouts and stop the queue from processing further items. This will clear any scheduled processing and prevent any new items from being processed until `resume()` is called again. The current state of the queue, priority queue, and history will be retained, allowing you to resume processing later without losing any data.\n */\n public cancel() {\n if (this.running) {\n this.timeouts.forEach((timeout) => clearTimeout(timeout));\n this.timeouts = [];\n this.running = false;\n\n this.emit('cancel');\n }\n }\n\n /**\n * Check if there are any items in the queue or priority queue. This method returns `true` if there are items waiting to be processed in either the main queue or the priority queue, and `false` if both queues are empty.\n * @returns - A boolean indicating whether there are items in the queue or priority queue.\n */\n public hasItems(): boolean {\n return this.queue.length > 0 || this.priorityQueue.length > 0;\n }\n\n public override on<K extends keyof QueueEvents<T>>(\n eventName: K,\n callback: (this: useQueue<T>, ...args: QueueEvents<T>[K]) => void,\n ): this {\n if (eventName === 'load' && this.loaded) {\n callback.apply(this);\n\n return this;\n }\n\n super.on(eventName, callback);\n\n return this;\n }\n}\n","import { Client } from '../client/client.js';\nimport { Data } from '../data/index.js';\nimport { BadgeOptions } from '../helper/classes/message.js';\nimport { Helper } from '../helper/index.js';\nimport { logger } from '../main.js';\nimport { useQueue } from '../modules/useQueue.js';\nimport { Twitch } from '../types.js';\nimport type { ClientEvents, Provider } from '../types/client.js';\nimport { MapNumberValuesToString } from '../types/path.js';\nimport { StreamElements } from '../types/streamelements/main.js';\n\nexport namespace Local {\n export type QueueItem =\n | { listener: 'onEventReceived'; data: StreamElements.Event.onEventReceived; session?: boolean }\n | { listener: 'onWidgetLoad'; data: StreamElements.Event.onWidgetLoad }\n | { listener: 'onSessionUpdate'; data: StreamElements.Event.onSessionUpdate };\n\n export const queue = new useQueue<QueueItem>({\n duration: 'client',\n processor: async function processor(received) {\n window.dispatchEvent(new CustomEvent(received.listener, { detail: received.data }));\n\n if (received.listener === 'onEventReceived' && received.session) {\n const sessionEvent = await Local.generate.event.onSessionUpdate(\n window?.client && window?.client instanceof Client ? window.client.session : undefined,\n Helper.event.parseProvider(received.data),\n );\n\n window.dispatchEvent(new CustomEvent('onSessionUpdate', { detail: sessionEvent }));\n }\n },\n });\n\n export const generate = {\n session: {\n types: {\n name: { type: 'string', options: Data.names.filter((e) => e.length) },\n tier: { type: 'string', options: Data.tiers.filter((e) => e.length) },\n message: { type: 'string', options: Data.normal_messages.filter((e) => e.length) },\n item: { type: 'array', options: Data.items },\n avatar: { type: 'string', options: Data.avatars.filter((e) => e.length) },\n } as Record<string, StreamElements.Session.Config.Any>,\n\n available(): StreamElements.Session.Config.Available.Data {\n const types = this.types;\n\n return {\n follower: {\n latest: { name: types.name },\n session: { count: { type: 'int', min: 50, max: 200 } },\n week: { count: { type: 'int', min: 200, max: 1000 } },\n month: { count: { type: 'int', min: 1000, max: 3000 } },\n goal: { amount: { type: 'int', min: 3000, max: 7000 } },\n total: { count: { type: 'int', min: 7000, max: 10000 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: { name: types.name, createdAt: { type: 'date', range: 400 } },\n },\n },\n subscriber: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n tier: types.tier,\n message: types.message,\n },\n 'new-latest': {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n message: types.message,\n },\n 'resub-latest': {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n message: types.message,\n },\n 'gifted-latest': {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n message: types.message,\n tier: types.tier,\n sender: types.name,\n },\n session: { count: { type: 'int', min: 10, max: 40 } },\n 'new-session': { count: { type: 'int', min: 10, max: 40 } },\n 'resub-session': { count: { type: 'int', min: 10, max: 40 } },\n 'gifted-session': { count: { type: 'int', min: 10, max: 40 } },\n week: { count: { type: 'int', min: 40, max: 100 } },\n month: { count: { type: 'int', min: 100, max: 200 } },\n goal: { amount: { type: 'int', min: 200, max: 300 } },\n total: { count: { type: 'int', min: 300, max: 400 } },\n points: { amount: { type: 'int', min: 100, max: 400 } },\n 'alltime-gifter': { name: types.name, amount: { type: 'int', min: 300, max: 400 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n tier: types.tier,\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n host: {\n latest: { name: types.name, amount: { type: 'int', min: 1, max: 10 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 1, max: 10 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n raid: {\n latest: { name: types.name, amount: { type: 'int', min: 0, max: 100 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n charityCampaignDonation: {\n latest: { name: types.name, amount: { type: 'int', min: 50, max: 150 } },\n 'session-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 50, max: 200 },\n },\n 'weekly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 200, max: 500 },\n },\n 'monthly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 800 },\n },\n 'alltime-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 800, max: 1000 },\n },\n 'session-top-donator': { name: types.name, amount: { type: 'int', min: 50, max: 200 } },\n 'weekly-top-donator': { name: types.name, amount: { type: 'int', min: 200, max: 500 } },\n 'monthly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 800 },\n },\n 'alltime-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 800, max: 1000 },\n },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 50, max: 150 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n cheer: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 200, max: 800 },\n message: types.message,\n },\n 'session-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 200, max: 1000 },\n },\n 'weekly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 5000 },\n },\n 'monthly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 5000, max: 12000 },\n },\n 'alltime-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 12000, max: 20000 },\n },\n 'session-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 200, max: 1000 },\n },\n 'weekly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 5000 },\n },\n 'monthly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 5000, max: 12000 },\n },\n 'alltime-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 12000, max: 20000 },\n },\n session: { amount: { type: 'int', min: 200, max: 1000 } },\n week: { amount: { type: 'int', min: 1000, max: 5000 } },\n month: { amount: { type: 'int', min: 5000, max: 12000 } },\n goal: { amount: { type: 'int', min: 12000, max: 18000 } },\n total: { amount: { type: 'int', min: 18000, max: 20000 } },\n count: { count: { type: 'int', min: 200, max: 1000 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 200, max: 800 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n cheerPurchase: {\n latest: { name: types.name, amount: { type: 'int', min: 200, max: 400 } },\n 'session-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 200, max: 400 },\n },\n 'weekly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 400, max: 800 },\n },\n 'monthly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 800, max: 1500 },\n },\n 'alltime-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 1500, max: 2000 },\n },\n 'session-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 200, max: 400 },\n },\n 'weekly-top-donator': { name: types.name, amount: { type: 'int', min: 400, max: 800 } },\n 'monthly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 800, max: 1500 },\n },\n 'alltime-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 1500, max: 2000 },\n },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 200, max: 400 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n superchat: {\n latest: { name: types.name, amount: { type: 'int', min: 100, max: 400 } },\n 'session-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 100, max: 500 },\n },\n 'weekly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 1000 },\n },\n 'monthly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 2000 },\n },\n 'alltime-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 2000, max: 2500 },\n },\n 'session-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 100, max: 500 },\n },\n 'weekly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 1000 },\n },\n 'monthly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 2000 },\n },\n 'alltime-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 2000, max: 2500 },\n },\n session: { amount: { type: 'int', min: 100, max: 500 } },\n week: { amount: { type: 'int', min: 500, max: 1000 } },\n month: { amount: { type: 'int', min: 1000, max: 2000 } },\n goal: { amount: { type: 'int', min: 2000, max: 2300 } },\n total: { amount: { type: 'int', min: 2300, max: 2500 } },\n count: { count: { type: 'int', min: 100, max: 500 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 100, max: 400 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n hypetrain: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n active: { type: 'int', min: 0, max: 1 },\n level: { type: 'int', min: 5, max: 10 },\n levelChanged: { type: 'int', min: 0, max: 5 },\n _type: { type: 'array', options: ['follower', 'subscriber', 'cheer', 'donation'] },\n },\n 'level-goal': { amount: { type: 'int', min: 0, max: 100 } },\n 'level-progress': {\n amount: { type: 'int', min: 0, max: 100 },\n percent: { type: 'int', min: 0, max: 100 },\n },\n total: { amount: { type: 'int', min: 0, max: 100 } },\n 'latest-top-contributors': { type: 'recent', amount: 25, value: { name: types.name } },\n },\n 'channel-points': {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n message: types.message,\n redemption: { type: 'array', options: ['Reward 1', 'Reward 2', 'Reward 3'] },\n },\n },\n tip: {\n latest: { name: types.name, amount: { type: 'int', min: 100, max: 400 } },\n 'session-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 100, max: 500 },\n },\n 'weekly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 1000 },\n },\n 'monthly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 2000 },\n },\n 'alltime-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 2000, max: 2500 },\n },\n 'session-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 100, max: 500 },\n },\n 'weekly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 1000 },\n },\n 'monthly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 2000 },\n },\n 'alltime-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 2000, max: 2500 },\n },\n session: { amount: { type: 'int', min: 100, max: 500 } },\n week: { amount: { type: 'int', min: 500, max: 1000 } },\n month: { amount: { type: 'int', min: 1000, max: 2000 } },\n goal: { amount: { type: 'int', min: 2000, max: 2300 } },\n total: { amount: { type: 'int', min: 2300, max: 2500 } },\n count: { count: { type: 'int', min: 100, max: 500 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 100, max: 400 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n merch: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n items: types.item,\n },\n 'goal-orders': { amount: { type: 'int', min: 0, max: 100 } },\n 'goal-items': { amount: { type: 'int', min: 0, max: 100 } },\n 'goal-total': { amount: { type: 'int', min: 0, max: 100 } },\n recent: { type: 'recent', amount: 25, value: { name: types.name } },\n },\n purchase: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n items: types.item,\n avatar: types.avatar,\n message: types.message,\n },\n },\n };\n },\n\n async get(startSession?: StreamElements.Session.Data): Promise<StreamElements.Session.Data> {\n const available = this.available();\n\n if (startSession) return startSession;\n\n const generate = (\n available:\n | StreamElements.Session.Config.Available.Data\n | StreamElements.Session.Config.Available.Category\n | StreamElements.Session.Config.Any,\n ): any => {\n const generateRecentData = (config: StreamElements.Session.Config.Any): Array<any> => {\n if (!config || !('amount' in config)) return [];\n\n const items: Array<{ createdAt: string }> = [];\n\n for (let i = 0; i < config.amount; i++) {\n items.push(generate(config.value));\n }\n\n return items.sort(\n (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),\n );\n };\n\n const generateObjectData = (config: Record<string, any>): Record<string, any> => {\n const result: Record<string, any> = {};\n\n for (const key in config) {\n const processedKey = key.replace('_type', 'type');\n\n result[processedKey] = generate(config[key]);\n }\n\n return result;\n };\n\n const processTypedConfig = (config: StreamElements.Session.Config.Any): any => {\n if (!config) return config;\n\n switch (config.type) {\n case 'int':\n return Helper.random.number(config.min, config.max);\n case 'string':\n return Helper.random.array(config.options)[0];\n case 'date':\n return Helper.random.daysOffset(config.range);\n case 'array':\n return Helper.random.array(config.options)[0];\n case 'recent':\n return generateRecentData(config);\n default:\n return config;\n }\n };\n\n // Main generation logic\n\n // Handle primitive values (non-objects)\n if (typeof available !== 'object' || available === null) {\n return available;\n }\n\n // Handle typed configurations (objects with a 'type' property)\n if ('type' in available && typeof available.type === 'string') {\n return processTypedConfig(available);\n }\n\n // Handle generic objects - recursively process each property\n return generateObjectData(available);\n };\n\n var session: StreamElements.Session.Data = Object.entries(generate(available)).reduce(\n (acc, [key, value]) => {\n Object.entries(value as any).forEach(\n ([subKey, subValue]) =>\n //\n (acc[`${key}-${subKey}`] = subValue),\n );\n\n return acc;\n },\n {} as Record<string, any>,\n ) as StreamElements.Session.Data;\n\n return session;\n },\n },\n event: {\n /**\n * Simulates the onWidgetLoad event for a widget.\n * @param fields - The field values to be included in the event.\n * @param session - The session data to be included in the event.\n * @param currency - The currency to be used (default is 'USD').\n * @returns A Promise that resolves to the simulated onWidgetLoad event data.\n */\n async onWidgetLoad(\n fields: Record<string, StreamElements.CustomField.Value>,\n session: StreamElements.Session.Data,\n currency: 'BRL' | 'USD' | 'EUR' = 'USD',\n ): Promise<StreamElements.Event.onWidgetLoad> {\n const currencies = {\n BRL: { code: 'BRL', name: 'Brazilian Real', symbol: 'R$' },\n USD: { code: 'USD', name: 'US Dollar', symbol: '$' },\n EUR: { code: 'EUR', name: 'Euro', symbol: '€' },\n };\n\n return {\n channel: {\n username: 'local',\n apiToken: '',\n id: '',\n providerId: '',\n avatar: '',\n },\n currency: currencies[currency] ?? currencies.USD,\n fieldData: fields,\n recents: [],\n session: {\n data: session,\n settings: {\n autoReset: false,\n calendar: false,\n resetOnStart: false,\n },\n },\n overlay: {\n isEditorMode: true,\n muted: false,\n },\n emulated: true,\n };\n },\n /**\n * Simulates the onSessionUpdate event for a widget.\n * @param session - The session data to be included in the event.\n * @returns A Promise that resolves to the simulated onSessionUpdate event data.\n */\n async onSessionUpdate(\n session?: StreamElements.Session.Data,\n update?: ClientEvents,\n ): Promise<StreamElements.Event.onSessionUpdate> {\n session ??= await Local.generate.session.get();\n\n if (update) {\n const orderByDateDesc = (a: { createdAt: string }, b: { createdAt: string }) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();\n\n switch (update.provider) {\n case 'twitch': {\n const data = update.data;\n\n switch (data.listener) {\n case 'cheer-latest': {\n const amount = data.event.amount;\n const name = data.event.displayName ?? data.event.name;\n const message = data.event.message;\n\n session['cheer-latest'] = { name, amount, message };\n\n const update = (type: 'session' | 'weekly' | 'monthly' | 'alltime' | 'all') => {\n if (type === 'all') {\n update('alltime');\n update('monthly');\n update('weekly');\n update('session');\n\n return;\n }\n\n const topDonation = session[`cheer-${type}-top-donation`];\n\n if (topDonation && amount > topDonation.amount) {\n topDonation.amount = amount;\n topDonation.name = name;\n }\n\n const topDonator = session[`cheer-${type}-top-donator`];\n\n const donatorCurrent = session['cheer-recent']\n .filter((e) => e.name.toLowerCase() === topDonator.name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n const donatorNew = session['cheer-recent']\n .filter((e) => e.name.toLowerCase() === name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n if (donatorNew > donatorCurrent) {\n topDonator.amount = donatorNew;\n topDonator.name = name;\n }\n };\n\n update('all');\n\n session['cheer-session'].amount += amount;\n session['cheer-week'].amount += amount;\n session['cheer-month'].amount += amount;\n session['cheer-total'].amount += amount;\n session['cheer-count'].count += 1;\n session['cheer-goal'].amount += amount;\n session['cheer-recent'].unshift({\n name: name,\n amount: amount,\n createdAt: new Date().toISOString(),\n });\n session['cheer-recent'] = (session['cheer-recent'] || []).sort(orderByDateDesc);\n\n break;\n }\n case 'follower-latest': {\n const name = data.event.displayName ?? data.event.name;\n\n session['follower-latest'].name = name;\n\n session['follower-session'].count += 1;\n session['follower-week'].count += 1;\n session['follower-month'].count += 1;\n session['follower-total'].count += 1;\n session['follower-goal'].amount += 1;\n session['follower-recent'].unshift({\n name: name,\n createdAt: new Date().toISOString(),\n });\n session['follower-recent'] = (session['follower-recent'] || []).sort(\n orderByDateDesc,\n );\n\n break;\n }\n case 'subscriber-latest': {\n const name = data.event.displayName ?? data.event.name;\n const amount = data.event.amount;\n const tier = data.event.tier;\n const message = data.event.message;\n\n session['subscriber-latest'] = { name, amount, tier, message: message ?? '' };\n\n if (\n !session['subscriber-recent'].find(\n (e) => e.name.toLowerCase() === name.toLowerCase(),\n )\n ) {\n session['subscriber-new-latest'] = { name, amount, message: message ?? '' };\n session['subscriber-new-session'].count += 1;\n } else if (amount > 1) {\n session['subscriber-resub-latest'] = { name, amount, message: message ?? '' };\n session['subscriber-resub-session'].count += 1;\n }\n\n if (!data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\n // normal\n } else if (\n data.event.gifted &&\n !data.event.bulkGifted &&\n !data.event.isCommunityGift\n ) {\n const sender = data.event.sender;\n // gift\n session['subscriber-gifted-latest'] = {\n name,\n amount,\n tier,\n message: message ?? '',\n sender,\n };\n session['subscriber-gifted-session'].count += 1;\n\n session['subscriber-alltime-gifter'] = { name: sender, amount };\n } else if (\n data.event.gifted &&\n !data.event.bulkGifted &&\n data.event.isCommunityGift\n ) {\n // community gift spam\n } else if (\n !data.event.gifted &&\n data.event.bulkGifted &&\n !data.event.isCommunityGift\n ) {\n // community gift\n }\n\n session['subscriber-session'].count += amount;\n session['subscriber-week'].count += amount;\n session['subscriber-month'].count += amount;\n session['subscriber-total'].count += amount;\n session['subscriber-goal'].amount += amount;\n session['subscriber-points'].amount += amount;\n\n session['subscriber-recent'].unshift({\n name: name,\n amount: amount,\n tier: tier,\n createdAt: new Date().toISOString(),\n });\n session['subscriber-recent'] = (session['subscriber-recent'] || []).sort(\n orderByDateDesc,\n );\n\n break;\n }\n case 'raid-latest': {\n const name = data.event.displayName ?? data.event.name;\n const amount = data.event.amount;\n\n session['raid-latest'] = { name, amount };\n\n session['raid-recent'].unshift({\n name: name,\n amount: amount,\n createdAt: new Date().toISOString(),\n });\n session['raid-recent'] = (session['raid-recent'] || []).sort(orderByDateDesc);\n break;\n }\n }\n\n break;\n }\n\n case 'youtube': {\n const data = update.data;\n\n switch (data.listener) {\n case 'superchat-latest': {\n const name = data.event.displayName ?? data.event.name;\n const amount = data.event.amount;\n\n session['superchat-latest'] = {\n name: name.toLowerCase(),\n displayName: name,\n amount,\n _id: Helper.random.uuid(),\n sessionTop: false,\n type: 'superchat',\n originalEventName: 'superchat-latest',\n providerId: '',\n avatar: '',\n };\n\n const update = (type: 'session' | 'weekly' | 'monthly' | 'alltime' | 'all') => {\n if (type === 'all') {\n update('alltime');\n update('monthly');\n update('weekly');\n update('session');\n\n return;\n }\n\n const topDonation = session[`superchat-${type}-top-donation`];\n\n if (topDonation && amount > topDonation.amount) {\n topDonation.amount = amount;\n topDonation.name = name;\n }\n\n const topDonator = session[`superchat-${type}-top-donator`];\n\n const donatorCurrent = session['superchat-recent']\n .filter((e) => e.name.toLowerCase() === topDonator.name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n const donatorNew = session['superchat-recent']\n .filter((e) => e.name.toLowerCase() === name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n if (donatorNew > donatorCurrent) {\n topDonator.amount = donatorNew;\n topDonator.name = name;\n }\n };\n\n update('all');\n\n session['superchat-session'].amount += amount;\n session['superchat-week'].amount += amount;\n session['superchat-month'].amount += amount;\n session['superchat-total'].amount += amount;\n session['superchat-count'].count += 1;\n session['superchat-goal'].amount += amount;\n session['superchat-recent'].unshift({\n name: name.toLowerCase(),\n displayName: name,\n amount: amount,\n _id: Helper.random.uuid(),\n sessionTop: false,\n type: 'superchat',\n originalEventName: 'superchat-latest',\n avatar: '',\n providerId: '',\n });\n // session['superchat-recent'] = (session['superchat-recent'] || []).sort(orderByDateDesc);\n\n break;\n }\n }\n\n break;\n }\n\n case 'streamelements': {\n const data = update.data;\n\n switch (data.listener) {\n case 'tip-latest': {\n const name = data.event.displayName ?? data.event.name;\n const amount = data.event.amount;\n\n session['tip-latest'] = { name, amount };\n\n const update = (type: 'session' | 'weekly' | 'monthly' | 'alltime' | 'all') => {\n if (type === 'all') {\n update('alltime');\n update('monthly');\n update('weekly');\n update('session');\n\n return;\n }\n\n const topDonation = session[`tip-${type}-top-donation`];\n\n if (topDonation && amount > topDonation.amount) {\n topDonation.amount = amount;\n topDonation.name = name;\n }\n\n const topDonator = session[`tip-${type}-top-donator`];\n\n const donatorCurrent = session['tip-recent']\n .filter((e) => e.name.toLowerCase() === topDonator.name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n const donatorNew = session['tip-recent']\n .filter((e) => e.name.toLowerCase() === name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n if (donatorNew > donatorCurrent) {\n topDonator.amount = donatorNew;\n topDonator.name = name;\n }\n };\n\n update('all');\n\n session['tip-session'].amount += amount;\n session['tip-week'].amount += amount;\n session['tip-month'].amount += amount;\n session['tip-total'].amount += amount;\n session['tip-count'].count += 1;\n session['tip-goal'].amount += amount;\n session['tip-recent'].unshift({\n name: name,\n amount: amount,\n createdAt: new Date().toISOString(),\n });\n session['tip-recent'] = (session['tip-recent'] || []).sort(orderByDateDesc);\n\n break;\n }\n case 'event:test': {\n break;\n }\n }\n\n break;\n }\n }\n }\n\n return { session, emulated: true };\n },\n /**\n * Simulates the onEventReceived event for a widget.\n * @param provider - The provider of the event (default is 'random').\n * @param type - The type of event to simulate (default is 'random').\n * @param options - Additional options to customize the event data.\n * @returns A Promise that resolves to the simulated onEventReceived event data, or null if the event type is not supported.\n * @example\n * ```javascript\n * // Simulate a random event\n * const randomEvent = await Local .generate.event.onEventReceived();\n *\n * // Simulate a Twitch message event with custom options\n * const twitchMessageEvent = await Local .generate.event.onEventReceived('twitch', 'message', { name: 'Streamer', message: 'Hello World!' });\n * ```\n */\n async onEventReceived(\n provider: Provider | 'random' = 'random',\n type:\n | StreamElements.Event.onEventReceived['listener']\n | 'random'\n | 'tip'\n | 'cheer'\n | 'follower'\n | 'raid'\n | 'subscriber' = 'random',\n options: Record<string, string | number | boolean> = {},\n ): Promise<StreamElements.Event.onEventReceived | null> {\n const available: Record<Provider, string[]> = {\n twitch: [\n 'message',\n 'follower-latest',\n 'cheer-latest',\n 'raid-latest',\n 'subscriber-latest',\n ],\n streamelements: ['tip-latest'],\n youtube: ['message', 'superchat-latest', 'subscriber-latest', 'sponsor-latest'],\n kick: [],\n facebook: [],\n };\n\n switch (provider) {\n default:\n case 'random': {\n var randomProvider = Helper.random.array(\n Object.keys(available).filter((e) => available[e as Provider].length),\n )[0] as Provider;\n var randomEvent = Helper.random.array(\n available[randomProvider],\n )[0] as StreamElements.Event.onEventReceived['listener'];\n\n return this.onEventReceived(randomProvider, randomEvent);\n }\n\n case 'twitch': {\n switch (\n type as\n | StreamElements.Event.Provider.Twitch.Events['listener']\n | 'random'\n | 'cheer'\n | 'follower'\n | 'raid'\n | 'subscriber'\n ) {\n default:\n case 'random': {\n var randomEvent = Helper.random.array(\n available[provider],\n )[0] as StreamElements.Event.onEventReceived['listener'];\n\n return this.onEventReceived(provider, randomEvent);\n }\n case 'message': {\n const data = options as Partial<{\n name: string;\n message: string;\n badges: BadgeOptions;\n color: string;\n userId: string;\n msgId: string;\n channel: string;\n time: number;\n firstMsg: boolean;\n returningChatter: boolean;\n reply: {\n msgId: string;\n userId: string;\n login: string;\n name: string;\n text: string;\n };\n thread: {\n msgId: string;\n name: string;\n };\n }>;\n\n var name = data?.name ?? Helper.random.array(Data.names.filter((e) => e.length))[0];\n var message =\n data?.message ??\n Helper.random.array(\n [...Data.twitch_messages, ...Data.normal_messages].filter((e) => e.length),\n )[0];\n\n var badges = await Helper.message.generateBadges(data?.badges ?? [], provider);\n\n var emotes = Helper.message.findEmotesInText(message);\n var renderedText = Helper.message.replaceEmotesWithHTML(message, emotes);\n\n var color = (data?.color as string) ?? Helper.random.color('hex');\n var userId = (data?.userId as string) ?? Helper.random.string(16);\n var msgId = (data?.msgId as string) ?? Helper.random.string(16);\n var time = (data?.time as number) ?? Date.now();\n\n var channel =\n (data?.channel as string) ?? window?.client?.details?.user?.username ?? 'local';\n\n var reply = data?.reply\n ? ({\n 'reply-parent-display-name': data.reply.name,\n 'reply-parent-msg-body': data.reply.text,\n 'reply-parent-msg-id': data.reply.msgId,\n 'reply-parent-user-id': data.reply.userId,\n 'reply-parent-user-login': data.reply.name.toLowerCase(),\n } satisfies Partial<Twitch.IRC>)\n : {};\n\n var thread = data?.thread\n ? ({\n 'reply-thread-parent-msg-id': data.thread.msgId,\n 'reply-thread-parent-user-login': data.thread.name.toLowerCase(),\n } satisfies Partial<Twitch.IRC>)\n : {};\n\n var roles = {\n vip: badges.keys.includes('vip') ? '' : undefined,\n subscriber: badges.keys.includes('subscriber') ? '1' : '0',\n mod: badges.keys.includes('moderator') ? '1' : '0',\n turbo: badges.keys.includes('turbo') ? '1' : '0',\n } as const;\n\n const event: StreamElements.Event.Provider.Twitch.Message = {\n listener: 'message',\n event: {\n service: provider,\n data: {\n time: time,\n tags: {\n 'badge-info': `${badges.keys.map((key) => `${key}/${badges.amount[key] ?? Helper.random.number(1, 5)}`).join(',')}`,\n 'badges': badges.keys.map((key) => `${key}/1`).join(','),\n\n ...roles,\n\n 'tmi-sent-ts': time.toString(),\n 'room-id': Helper.random.string(9, 'numbers'),\n\n 'user-id': userId,\n 'user-type': '',\n\n color: color,\n 'display-name': name,\n emotes: '',\n\n 'client-nonce': Helper.random.string(16),\n flags: '',\n id: msgId,\n 'first-msg': data?.firstMsg ? '1' : '0',\n 'returning-chatter': data?.returningChatter ? '1' : '0',\n\n ...reply,\n ...thread,\n },\n nick: name.toLowerCase(),\n displayName: name,\n displayColor: color,\n channel: channel,\n text: message,\n isAction: false,\n userId: userId,\n msgId: msgId,\n badges: badges.badges,\n emotes: emotes,\n },\n renderedText: renderedText,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'cheer':\n case 'cheer-latest': {\n var amount = (options?.amount as number) ?? Helper.random.number(100, 10000);\n var avatar = (options?.avatar as string) ?? Helper.random.array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n Helper.random.array(Data.names.filter((e) => e.length))[0];\n var message =\n (options?.message as string) ??\n Helper.random.array(Data.normal_messages.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.Twitch.Cheer & {\n event: { provider: Provider };\n } = {\n listener: 'cheer-latest',\n event: {\n amount,\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n message: message,\n providerId: '',\n _id: Helper.random.uuid(),\n sessionTop: false,\n type: 'cheer',\n originalEventName: 'cheer-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'follower':\n case 'follower-latest': {\n var avatar = (options?.avatar as string) ?? Helper.random.array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n Helper.random.array(Data.names.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.Twitch.Follower & {\n event: { provider: Provider };\n } = {\n listener: 'follower-latest',\n event: {\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n _id: Helper.random.uuid(),\n sessionTop: false,\n type: 'follower',\n originalEventName: 'follower-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'raid':\n case 'raid-latest': {\n var amount = (options?.amount as number) ?? Helper.random.number(1, 100);\n var avatar = (options?.avatar as string) ?? Helper.random.array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n Helper.random.array(Data.names.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.Twitch.Raid & {\n event: { provider: Provider };\n } = {\n listener: 'raid-latest',\n event: {\n amount,\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n _id: Helper.random.uuid(),\n sessionTop: false,\n type: 'raid',\n originalEventName: 'raid-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'subscriber':\n case 'subscriber-latest': {\n var tier =\n (options?.tier as string) ??\n Helper.random.array(['1000', '2000', '3000', 'prime'])[0];\n var amount = (options?.amount as number) ?? Helper.random.number(1, 24);\n var avatar = (options?.avatar as string) ?? Helper.random.array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n Helper.random.array(Data.names.filter((e) => e.length))[0];\n var sender =\n (options?.sender as string) ??\n Helper.random.array(Data.names.filter((e) => e.length && e !== name))[0];\n var message =\n (options?.message as string) ??\n Helper.random.array(Data.normal_messages.filter((e) => e.length))[0];\n\n var addons = {\n default: {\n avatar,\n playedAsCommunityGift: false,\n },\n gift: {\n sender,\n gifted: true,\n } as StreamElements.Event.Provider.Twitch.gift,\n community: {\n message,\n sender,\n bulkGifted: true,\n } as StreamElements.Event.Provider.Twitch.community,\n spam: {\n sender,\n gifted: true,\n isCommunityGift: true,\n } as StreamElements.Event.Provider.Twitch.spam,\n };\n\n var subTypes = ['default', 'gift', 'community', 'spam'];\n var subType = (options?.subType as string) ?? Helper.random.array(subTypes)[0];\n\n subType = subTypes.includes(subType) ? subType : 'default';\n\n const event: StreamElements.Event.Provider.Twitch.Subscriber & {\n event: { provider: Provider };\n } = {\n listener: 'subscriber-latest',\n event: {\n amount,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n tier: tier as StreamElements.Event.Provider.Twitch.SubscriberTier,\n\n ...addons.default,\n ...addons[subType as keyof typeof addons],\n\n _id: Helper.random.uuid(),\n sessionTop: false,\n type: 'subscriber',\n originalEventName: 'subscriber-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'delete-message': {\n const event: StreamElements.Event.Provider.Twitch.DeleteMessage & {\n event: { provider: Provider };\n } = {\n listener: 'delete-message',\n event: {\n msgId: (options?.id as string) ?? Helper.random.uuid(),\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'delete-messages': {\n const event: StreamElements.Event.Provider.Twitch.DeleteMessages & {\n event: { provider: Provider };\n } = {\n listener: 'delete-messages',\n event: {\n userId:\n (options?.id as string) ??\n Helper.random.number(10000000, 99999999).toString(),\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n }\n }\n\n case 'streamelements': {\n switch (\n type as\n | StreamElements.Event.Provider.StreamElements.Events['listener']\n | 'random'\n | 'tip'\n | 'mute'\n | 'unmute'\n | 'skip'\n ) {\n default:\n case 'random': {\n var randomEvent = Helper.random.array(\n available[provider],\n )[0] as StreamElements.Event.onEventReceived['listener'];\n\n return this.onEventReceived(provider, randomEvent);\n }\n case 'tip':\n case 'tip-latest': {\n var amount = (options?.amount as number) ?? Helper.random.number(100, 4000);\n var avatar = (options?.avatar as string) ?? Helper.random.array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n Helper.random.array(Data.names.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.StreamElements.Tip & {\n event: { provider: Provider };\n } = {\n listener: 'tip-latest',\n event: {\n amount,\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n _id: Helper.random.uuid(),\n sessionTop: false,\n type: 'tip',\n originalEventName: 'tip-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'kvstore:update': {\n const event: StreamElements.Event.Provider.StreamElements.KVStore & {\n event: { provider: Provider };\n } = {\n listener: 'kvstore:update',\n event: {\n data: {\n key: `customWidget.${(options?.key as string) ?? 'sampleKey'}`,\n value: (options?.value as string) ?? 'sampleValue',\n },\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'bot:counter': {\n const event: StreamElements.Event.Provider.StreamElements.BotCounter & {\n event: { provider: Provider };\n } = {\n listener: 'bot:counter',\n event: {\n counter: (options?.counter as string) ?? 'sampleCounter',\n value: (options?.value as number) ?? Helper.random.number(0, 100),\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'mute':\n case 'unmute':\n case 'alertService:toggleSound': {\n var muted =\n (options?.muted as boolean) ?? window?.client?.details?.overlay?.muted ?? false;\n\n const event: StreamElements.Event.Provider.StreamElements.AlertService & {\n event: { provider: Provider };\n } = {\n listener: 'alertService:toggleSound',\n event: {\n muted,\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'skip':\n case 'event:skip': {\n const event: StreamElements.Event.Provider.StreamElements.EventSkip & {\n event: { provider: Provider };\n } = {\n listener: 'event:skip',\n event: {\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n }\n }\n\n case 'youtube': {\n switch (\n type as\n | StreamElements.Event.Provider.YouTube.Events['listener']\n | 'random'\n | 'message'\n | 'superchat'\n | 'subscriber'\n | 'sponsor'\n ) {\n default:\n case 'random': {\n var randomEvent = Helper.random.array(\n available[provider],\n )[0] as StreamElements.Event.onEventReceived['listener'];\n\n return this.onEventReceived(provider, randomEvent);\n }\n case 'message': {\n var name =\n (options?.name as string) ??\n Helper.random.array(Data.names.filter((e) => e.length))[0];\n var message =\n (options?.message as string) ??\n Helper.random.array(\n [...Data.youtube_messages, ...Data.normal_messages].filter((e) => e.length),\n )[0];\n\n const badges = await Helper.message.generateBadges(\n (options?.badges as BadgeOptions) ?? [],\n provider,\n );\n\n var emotes = Helper.message.findEmotesInText(message);\n var renderedText = Helper.message.replaceEmotesWithHTML(message, emotes);\n\n var color = (options?.color as string) ?? Helper.random.color('hex');\n var userId =\n (options?.userId as string) ??\n Helper.random.number(10000000, 99999999).toString();\n var msgId = (options?.msgId as string) ?? Helper.random.uuid();\n var time = (options?.time as number) ?? Date.now();\n\n var avatar = (options?.avatar as string) ?? Helper.random.array(Data.avatars)[0];\n\n var channel =\n (options?.channel as string) ??\n window?.client?.details?.user?.username ??\n 'local';\n\n const event: StreamElements.Event.Provider.YouTube.Message = {\n listener: 'message',\n event: {\n service: provider,\n data: {\n kind: '',\n etag: '',\n id: '',\n snippet: {\n type: '',\n liveChatId: '',\n authorChannelId: channel,\n publishedAt: new Date().toISOString(),\n hasDisplayContent: true,\n displayMessage: message,\n textMessageDetails: {\n messageText: message,\n },\n },\n authorDetails: {\n channelId: channel,\n channelUrl: '',\n displayName: name,\n profileImageUrl: avatar,\n ...badges,\n },\n msgId: msgId,\n userId: userId,\n nick: name.toLowerCase(),\n badges: [],\n displayName: name,\n isAction: false,\n time: time,\n tags: [],\n displayColor: color,\n channel: channel,\n text: message,\n avatar: avatar,\n emotes: [],\n },\n renderedText: message,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'subscriber':\n case 'subscriber-latest': {\n var avatar = (options?.avatar as string) ?? Helper.random.array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n Helper.random.array(Data.names.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.YouTube.Subscriber & {\n event: { provider: Provider };\n } = {\n listener: 'subscriber-latest',\n event: {\n avatar,\n displayName: name,\n name: name.toLowerCase(),\n providerId: '',\n _id: Helper.random.uuid(),\n sessionTop: false,\n type: 'subscriber',\n originalEventName: 'subscriber-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'superchat':\n case 'superchat-latest': {\n var amount = (options?.amount as number) ?? Helper.random.number(100, 4000);\n var avatar = (options?.avatar as string) ?? Helper.random.array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n Helper.random.array(Data.names.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.YouTube.Superchat & {\n event: { provider: Provider };\n } = {\n listener: 'superchat-latest',\n event: {\n amount,\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n _id: Helper.random.uuid(),\n sessionTop: false,\n type: 'superchat',\n originalEventName: 'superchat-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'sponsor':\n case 'sponsor-latest': {\n var tier =\n (options?.tier as string) ?? Helper.random.array(['1000', '2000', '3000'])[0];\n var amount = (options?.amount as number) ?? Helper.random.number(1, 24);\n var avatar = (options?.avatar as string) ?? Helper.random.array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n Helper.random.array(Data.names.filter((e) => e.length))[0];\n var sender =\n (options?.sender as string) ??\n Helper.random.array(Data.names.filter((e) => e.length && e !== name))[0];\n var message =\n (options?.message as string) ??\n Helper.random.array(Data.normal_messages.filter((e) => e.length))[0];\n\n var addons = {\n default: {\n avatar,\n playedAsCommunityGift: false,\n },\n gift: {\n sender,\n gifted: true,\n } as StreamElements.Event.Provider.YouTube.gift,\n community: {\n message,\n sender,\n bulkGifted: true,\n } as StreamElements.Event.Provider.YouTube.community,\n spam: {\n sender,\n gifted: true,\n isCommunityGift: true,\n } as StreamElements.Event.Provider.YouTube.spam,\n };\n\n var subTypes = ['default', 'gift', 'community', 'spam'];\n var subType = (options?.subType as string) ?? Helper.random.array(subTypes)[0];\n\n subType = subTypes.includes(subType) ? subType : 'default';\n\n const event: StreamElements.Event.Provider.YouTube.Sponsor & {\n event: { provider: Provider };\n } = {\n listener: 'sponsor-latest',\n event: {\n amount,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n\n ...addons.default,\n ...addons[subType as keyof typeof addons],\n\n _id: Helper.random.uuid(),\n sessionTop: false,\n type: 'sponsor',\n originalEventName: 'sponsor-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n }\n }\n }\n },\n },\n };\n\n export const emulate = {\n twitch: {\n message(\n data: Partial<{\n name: string;\n message: string;\n badges: BadgeOptions;\n color: string;\n userId: string;\n msgId: string;\n channel: string;\n time: number;\n firstMsg: boolean;\n returningChatter: boolean;\n reply: {\n msgId: string;\n userId: string;\n login: string;\n name: string;\n text: string;\n };\n thread: {\n msgId: string;\n name: string;\n };\n }> = {},\n ) {\n Local.generate.event\n .onEventReceived('twitch', 'message', data as { [key: string]: any })\n .then((event) => {\n if (event) {\n Local.emulate.send('onEventReceived', event);\n }\n });\n },\n deleteMessage(msgId: string) {\n if (!msgId || typeof msgId !== 'string') return;\n\n const event: StreamElements.Event.Provider.Twitch.DeleteMessage = {\n listener: 'delete-message',\n event: {\n msgId: msgId,\n },\n };\n\n Local.emulate.send('onEventReceived', event);\n },\n deleteMessages(userId: string) {\n if (!userId || typeof userId !== 'string') return;\n\n const event: StreamElements.Event.Provider.Twitch.DeleteMessages = {\n listener: 'delete-messages',\n event: {\n userId: userId,\n },\n };\n\n Local.emulate.send('onEventReceived', event);\n },\n follower(\n data: Partial<{\n avatar: string;\n name: string;\n }> = {},\n ) {\n Local.generate.event\n .onEventReceived(\n 'twitch',\n 'follower-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n Local.emulate.send('onEventReceived', event);\n }\n });\n },\n raid(\n data: Partial<{\n amount: number;\n avatar: string;\n name: string;\n }> = {},\n ) {\n Local.generate.event\n .onEventReceived(\n 'twitch',\n 'raid-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n Local.emulate.send('onEventReceived', event);\n }\n });\n },\n cheer(\n data: Partial<{\n amount: number;\n avatar: string;\n name: string;\n message: string;\n }> = {},\n ) {\n Local.generate.event\n .onEventReceived(\n 'twitch',\n 'cheer-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n Local.emulate.send('onEventReceived', event);\n }\n });\n },\n subscriber(\n data: Partial<{\n tier: '1000' | '2000' | '3000' | 'prime';\n amount: number;\n avatar: string;\n name: string;\n sender: string;\n message: string;\n subType: 'default' | 'gift' | 'community' | 'spam';\n }> & { subType?: 'default' | 'gift' | 'community' | 'spam' } = {},\n ) {\n Local.generate.event\n .onEventReceived(\n 'twitch',\n 'subscriber-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n Local.emulate.send('onEventReceived', event);\n }\n });\n },\n },\n streamelements: {\n tip(\n data: Partial<{\n amount: number;\n avatar: string;\n name: string;\n }> = {},\n ) {\n Local.generate.event\n .onEventReceived(\n 'streamelements',\n 'tip-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n Local.emulate.send('onEventReceived', event);\n }\n });\n },\n },\n youtube: {\n message(\n data: Partial<{\n name: string;\n message: string;\n badges: BadgeOptions;\n color: string;\n userId: string;\n msgId: string;\n channel: string;\n time: number;\n avatar: string;\n }> = {},\n ) {\n Local.generate.event\n .onEventReceived(\n 'youtube',\n 'message',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n Local.emulate.send('onEventReceived', event);\n }\n });\n },\n subscriber(\n data: Partial<{\n avatar: string;\n name: string;\n }> = {},\n ) {\n Local.generate.event\n .onEventReceived(\n 'youtube',\n 'subscriber-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n Local.emulate.send('onEventReceived', event);\n }\n });\n },\n superchat(\n data: Partial<{\n amount: number;\n avatar: string;\n name: string;\n }> = {},\n ) {\n Local.generate.event\n .onEventReceived(\n 'youtube',\n 'superchat-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n Local.emulate.send('onEventReceived', event);\n }\n });\n },\n sponsor(\n data: Partial<{\n tier: '1000' | '2000' | '3000';\n amount: number;\n avatar: string;\n name: string;\n sender: string;\n message: string;\n subType: 'default' | 'gift' | 'community' | 'spam';\n }> & { subType?: 'default' | 'gift' | 'community' | 'spam' } = {},\n ) {\n Local.generate.event\n .onEventReceived(\n 'youtube',\n 'sponsor-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n Local.emulate.send('onEventReceived', event);\n }\n });\n },\n },\n kick: {},\n facebook: {},\n\n send<T extends 'onEventReceived' | 'onSessionUpdate' | 'onWidgetLoad'>(\n listener: T,\n event: T extends 'onEventReceived'\n ? StreamElements.Event.onEventReceived\n : T extends 'onSessionUpdate'\n ? StreamElements.Event.onSessionUpdate\n : StreamElements.Event.onWidgetLoad,\n ): void {\n if (!Local.queue) {\n logger.warn('Local queue is not initialized.');\n\n window.dispatchEvent(new CustomEvent(listener, { detail: event }));\n\n return;\n }\n\n switch (listener) {\n case 'onEventReceived': {\n Local.queue.enqueue({\n listener,\n data: event as StreamElements.Event.onEventReceived,\n session: listener === 'onEventReceived' ? true : undefined,\n });\n\n break;\n }\n case 'onSessionUpdate': {\n Local.queue.enqueue({\n listener,\n data: event as StreamElements.Event.onSessionUpdate,\n });\n\n break;\n }\n case 'onWidgetLoad': {\n Local.queue.enqueue({\n listener,\n data: event as StreamElements.Event.onWidgetLoad,\n });\n\n break;\n }\n }\n },\n };\n\n export async function start(\n fieldsFile: string[] = ['fields.json', 'cf.json', 'field.json', 'customfields.json'],\n dataFiles: string[] = ['data.json', 'fielddata.json', 'fd.json', 'DATA.json'],\n session?: StreamElements.Session.Data,\n ) {\n const localFiles = {\n fields: fieldsFile.find((file) => {\n try {\n new URL('./' + file, window.location.href);\n return true;\n } catch (error) {\n return false;\n }\n }),\n data: dataFiles.find((file) => {\n try {\n new URL('./' + file, window.location.href);\n return true;\n } catch (error) {\n return false;\n }\n }),\n };\n\n const data: Record<string, string | number | boolean> = await fetch(\n './' + (localFiles.data ?? 'data.json'),\n {\n cache: 'no-store',\n },\n )\n .then((res) => res.json())\n .catch(() => ({}));\n\n await fetch('./' + (localFiles.fields ?? 'fields.json'), {\n cache: 'no-store',\n })\n .then((res) => res.json())\n .then(async (customfields: Record<string, StreamElements.CustomField.Schema>) => {\n const fields = Object.entries(customfields)\n .filter(([_, { value }]) => value != undefined)\n .reduce(\n (acc, [key, { value }]) => {\n if (data && data[key] !== undefined) value = data[key];\n\n acc[key] = value;\n\n return acc;\n },\n {\n ...data,\n } as Record<string, StreamElements.CustomField.Value>,\n );\n\n const load = await Local.generate.event.onWidgetLoad(\n fields,\n await Local.generate.session.get(session),\n );\n\n window.dispatchEvent(new CustomEvent('onWidgetLoad', { detail: load }));\n });\n }\n}\n","interface Theme {\n color?: string;\n background?: string;\n bold?: boolean;\n italic?: boolean;\n fontSize?: number;\n icon?: string;\n}\n\ninterface Options {\n enabled?: boolean;\n prefix?: string | (() => string);\n}\n\ntype LogMethod = (...args: unknown[]) => void;\n\nexport class useLogger {\n public enabled: boolean;\n public prefix: string | (() => string);\n\n constructor(options: Options = {}) {\n this.enabled = options.enabled ?? true;\n this.prefix = options.prefix ?? '';\n }\n\n public apply(theme: Theme): LogMethod {\n const style = this.style(theme);\n const icon = theme.icon ? `${theme.icon} ` : '';\n\n return (...args: unknown[]): void => {\n if (!this.enabled || typeof console === 'undefined') return;\n\n let prefix: string = '';\n\n if (typeof this.prefix === 'function') prefix = this.prefix();\n else if (typeof this.prefix === 'string') prefix = this.prefix;\n\n const primitives: unknown[] = [];\n const objects: unknown[] = [];\n\n args.forEach((arg) => {\n if (typeof arg === 'string' || typeof arg === 'number' || typeof arg === 'boolean') {\n primitives.push(arg);\n } else {\n objects.push(arg);\n }\n });\n\n // Log with style\n\n if (primitives.length > 0) {\n const message = primitives.join(' ');\n console.log(\n `%c${prefix.endsWith(' ') ? prefix : prefix.trim() + ' '}${icon}${message}`,\n style,\n ...objects,\n );\n } else if (objects.length > 0) {\n console.log(\n `%c${prefix.endsWith(' ') ? prefix : prefix.trim() + ' '}${icon}`,\n style,\n ...objects,\n );\n }\n };\n }\n\n private style(theme: Theme): string {\n const styles: string[] = [];\n\n if (theme.background && theme.background !== 'transparent') {\n styles.push(`background: ${theme.background}`);\n styles.push('padding: 2px 6px');\n styles.push('border-radius: 3px');\n }\n if (theme.color) styles.push(`color: ${theme.color}`);\n if (theme.bold) styles.push('font-weight: bold');\n if (theme.italic) styles.push('font-style: italic');\n if (theme.fontSize) styles.push(`font-size: ${theme.fontSize}px`);\n\n return styles.join('; ');\n }\n\n public group(label: string): void {\n if (!this.enabled || !console.group) return;\n\n console.group(label);\n }\n\n public groupCollapsed(label: string): void {\n if (!this.enabled || !console.groupCollapsed) return;\n\n console.groupCollapsed(label);\n }\n\n public groupEnd(): void {\n if (!this.enabled || !console.groupEnd) return;\n\n console.groupEnd();\n }\n\n public table(data: unknown): void {\n if (!this.enabled || !console.table) return;\n\n console.table(data);\n }\n\n public time(label: string): void {\n if (!this.enabled || !console.time) return;\n\n console.time(label);\n }\n\n public timeEnd(label: string): void {\n if (!this.enabled || !console.timeEnd) return;\n\n console.timeEnd(label);\n }\n\n readonly error = this.apply({\n color: '#721c24',\n background: '#f8d7da',\n bold: true,\n italic: false,\n icon: '✖',\n });\n\n readonly warn = this.apply({\n color: '#856404',\n background: '#fff3cd',\n bold: true,\n italic: false,\n fontSize: 20,\n });\n\n readonly success = this.apply({\n color: '#155724',\n background: '#d4edda',\n bold: true,\n italic: false,\n fontSize: 18,\n icon: '✔',\n });\n\n readonly info = this.apply({\n color: '#0c5460',\n background: '#d1ecf1',\n fontSize: 12,\n icon: 'ℹ',\n });\n\n readonly debug = this.apply({\n color: '#8c9ba8',\n background: 'transparent',\n fontSize: 12,\n icon: '●',\n });\n\n readonly alert = this.apply({\n color: '#856404',\n background: '#fff3cd',\n bold: true,\n italic: false,\n fontSize: 20,\n icon: '⚠',\n });\n\n readonly status = this.apply({\n color: '#0c5460',\n background: '#d1ecf1',\n bold: true,\n italic: false,\n fontSize: 12,\n icon: '·',\n });\n\n readonly received = this.apply({\n color: '#E6BBFF',\n background: 'transparent',\n bold: false,\n italic: false,\n fontSize: 14,\n icon: '⬇',\n });\n\n readonly simple = this.apply({\n color: '#f6c6cb',\n background: 'transparent',\n bold: false,\n italic: false,\n fontSize: 14,\n icon: '☼',\n });\n}\n","import type {\n OnErrorHandler,\n OnCommandHandler,\n OnChatHandler,\n OnWhisperHandler,\n OnMessageDeletedHandler,\n OnJoinHandler,\n OnPartHandler,\n OnHostedHandler,\n OnRaidHandler,\n OnSubHandler,\n OnResubHandler,\n OnSubGiftHandler,\n OnSubMysteryGiftHandler,\n OnGiftSubContinueHandler,\n OnCheerHandler,\n OnRewardHandler,\n OnConnectedHandler,\n OnReconnectHandler,\n OnChatModeHandler,\n ComfyJSInstance,\n} from 'comfy.js';\n\nimport { BadgeOptions } from '../helper/classes/message.js';\nimport { Helper } from '../helper/index.js';\nimport { Local } from '../local/index.js';\nimport { logger } from '../main.js';\nimport { EventProvider } from '../modules/EventProvider.js';\n\ntype ComfyEvents = {\n load: [instance: ComfyJSInstance];\n error: Parameters<OnErrorHandler>;\n command: Parameters<OnCommandHandler>;\n chat: Parameters<OnChatHandler>;\n whisper: Parameters<OnWhisperHandler>;\n messageDeleted: Parameters<OnMessageDeletedHandler>;\n join: Parameters<OnJoinHandler>;\n part: Parameters<OnPartHandler>;\n hosted: Parameters<OnHostedHandler>;\n raid: Parameters<OnRaidHandler>;\n sub: Parameters<OnSubHandler>;\n resub: Parameters<OnResubHandler>;\n subGift: Parameters<OnSubGiftHandler>;\n subMysteryGift: Parameters<OnSubMysteryGiftHandler>;\n giftSubContinue: Parameters<OnGiftSubContinueHandler>;\n cheer: Parameters<OnCheerHandler>;\n chatMode: Parameters<OnChatModeHandler>;\n reward: Parameters<OnRewardHandler>;\n connected: Parameters<OnConnectedHandler>;\n reconnect: Parameters<OnReconnectHandler>;\n};\n\n/**\n * Creates and manages a ComfyJS instance for Twitch chat interaction.\n */\nexport class useComfyJs extends EventProvider<ComfyEvents> {\n public instance!: ComfyJSInstance;\n\n public username!: string;\n public password?: string;\n public channels!: string[];\n\n public isDebug: boolean = false;\n private init: boolean = false;\n\n public emulate: boolean = false;\n\n /**\n * Initializes a new ComfyJS instance and connects to Twitch chat.\n * @param options - Configuration options for ComfyJS instance.\n * @param emulate - Whether to emulate chat messages in the Local module.\n */\n constructor(\n options: {\n username: string;\n password?: string;\n channels: string[];\n isDebug?: boolean;\n init?: boolean;\n },\n emulate: boolean,\n ) {\n super();\n\n this.username = options.username;\n this.password = options.password;\n this.channels = options.channels;\n this.isDebug = Boolean(options.isDebug);\n this.init = Boolean(options.init);\n this.emulate = emulate;\n\n this.load()\n .then((comfyJS) => {\n this.instance = comfyJS;\n\n this.emit('load', comfyJS);\n this.connect();\n })\n .catch((err) => {\n logger.error('useComfyJs: Failed to load ComfyJS', err);\n });\n }\n\n /**\n * Loads the ComfyJS script if not already loaded.\n * @returns A promise that resolves to the ComfyJS instance.\n */\n private load(): Promise<ComfyJSInstance> {\n if (typeof window.ComfyJS === 'undefined' || !window.ComfyJS) {\n return new Promise((resolve, reject) => {\n if (this.emulate && !client) {\n return reject(\n new Error('useComfyJs: Cannot emulate chat messages without a Client instance.'),\n );\n }\n\n const script = document.createElement('script');\n\n script.src = 'https://cdn.jsdelivr.net/npm/comfy.js@1.1.29/dist/comfy.min.js';\n script.type = 'text/javascript';\n script.async = true;\n\n script.onload = () => resolve(window.ComfyJS as ComfyJSInstance);\n script.onerror = (err) => reject(err);\n\n document.head.appendChild(script);\n });\n } else return Promise.resolve(window.ComfyJS as ComfyJSInstance);\n }\n\n /**\n * Connects event handlers to the ComfyJS instance.\n */\n private connect() {\n this.instance.onError = (error) => {\n this.emit('error', error);\n\n if (client?.debug) logger.error('[Client]', 'ComfyJS Error:', error);\n };\n\n this.instance.onCommand = (user, command, message, flags, extra) => {\n this.emit('command', user, command, message, flags, extra);\n\n if (client?.debug)\n logger.debug('[Client]', `ComfyJS Command: !${command} ${message} (User: ${user})`);\n\n if (this.emulate) {\n const roles = {\n ...flags,\n broadcaster: flags.broadcaster,\n moderator: flags.mod,\n vip: flags.vip,\n subscriber: flags.subscriber,\n founder: flags.founder,\n };\n\n const data = {\n name: user,\n message: `!${command} ${message}`,\n badges: Object.entries(roles)\n .map(([role, hasRole]) => (hasRole ? role : null))\n .filter(Boolean) as BadgeOptions,\n color: extra.userColor,\n time: new Date(extra.timestamp).getTime(),\n userId: extra.userId,\n msgId: extra.id,\n channel: extra.channel,\n };\n\n Local.emulate.twitch.message(data);\n }\n };\n this.instance.onChat = (user, message, flags, self, extra) => {\n this.emit('chat', user, message, flags, self, extra);\n\n if (client?.debug) logger.debug('[Client]', `ComfyJS Chat: ${message} (User: ${user})`);\n\n if (this.emulate) {\n const roles = {\n ...flags,\n ...extra.userBadges,\n broadcaster: flags.broadcaster,\n moderator: flags.mod,\n vip: flags.vip,\n subscriber: flags.subscriber,\n founder: flags.founder,\n };\n\n Local.emulate.twitch.message({\n name: user,\n message: message,\n badges: Object.entries(roles)\n .map(([role, hasRole]) => (hasRole ? role : null))\n .filter(Boolean) as BadgeOptions,\n color: extra.userColor,\n time: new Date(extra.timestamp).getTime(),\n userId: extra.userId,\n msgId: extra.id,\n channel: extra.channel,\n });\n }\n };\n this.instance.onWhisper = (user, message, flags, self, extra) => {\n this.emit('whisper', user, message, flags, self, extra);\n\n if (client?.debug) logger.debug('[Client]', `ComfyJS Whisper: ${message} (User: ${user})`);\n };\n this.instance.onMessageDeleted = (id, extra) => {\n this.emit('messageDeleted', id, extra);\n\n if (client?.debug) logger.debug('[Client]', `ComfyJS Message Deleted: ${id}`);\n\n if (this.emulate) {\n Local.emulate.twitch.deleteMessage(id);\n }\n };\n this.instance.onJoin = (user, self, extra) => {\n this.emit('join', user, self, extra);\n\n if (client?.debug) logger.debug('[Client]', `ComfyJS Join: ${user}`);\n };\n this.instance.onPart = (user, self, extra) => {\n this.emit('part', user, self, extra);\n\n if (client?.debug) logger.debug('[Client]', `ComfyJS Part: ${user}`);\n };\n this.instance.onHosted = (user, viewers, autohost, extra) => {\n this.emit('hosted', user, viewers, autohost, extra);\n\n if (client?.debug) logger.debug('[Client]', `ComfyJS Hosted: ${user} (${viewers} viewers)`);\n };\n this.instance.onRaid = (user, viewers, extra) => {\n this.emit('raid', user, viewers, extra);\n\n if (client?.debug) logger.debug('[Client]', `ComfyJS Raid: ${user} (${viewers} viewers)`);\n\n if (this.emulate) {\n Local.emulate.twitch.raid({\n name: user,\n amount: viewers,\n });\n }\n };\n this.instance.onSub = (user, message, subTierInfo, extra) => {\n this.emit('sub', user, message, subTierInfo, extra);\n\n if (client?.debug) logger.debug('[Client]', `ComfyJS Sub: ${user} (${subTierInfo.plan})`);\n\n if (this.emulate) {\n const tier = subTierInfo.plan === 'Prime' ? 'prime' : subTierInfo.plan;\n\n Local.emulate.twitch.subscriber({\n name: user,\n message: message,\n tier: tier,\n subType: 'default',\n });\n }\n };\n this.instance.onResub = (user, message, streakMonths, cumulativeMonths, subTierInfo, extra) => {\n this.emit('resub', user, message, streakMonths, cumulativeMonths, subTierInfo, extra);\n\n if (client?.debug)\n logger.debug('[Client]', `ComfyJS Resub: ${user} (${cumulativeMonths} months)`);\n\n if (this.emulate) {\n const tier = subTierInfo.plan === 'Prime' ? 'prime' : subTierInfo.plan;\n\n Local.emulate.twitch.subscriber({\n name: user,\n message: message,\n tier: tier,\n amount: cumulativeMonths,\n subType: 'default',\n });\n }\n };\n this.instance.onSubGift = (\n gifterUser,\n streakMonths,\n recipientUser,\n senderCount,\n subTierInfo,\n extra,\n ) => {\n this.emit(\n 'subGift',\n gifterUser,\n streakMonths,\n recipientUser,\n senderCount,\n subTierInfo,\n extra,\n );\n\n if (client?.debug)\n logger.debug('[Client]', `ComfyJS Sub Gift: ${gifterUser} gifted ${senderCount} subs`);\n\n if (this.emulate) {\n const tier = subTierInfo.plan === 'Prime' ? 'prime' : subTierInfo.plan;\n\n Local.emulate.twitch.subscriber({\n name: recipientUser,\n message: '',\n sender: gifterUser,\n tier,\n amount: senderCount,\n subType: 'gift',\n });\n }\n };\n this.instance.onSubMysteryGift = (gifterUser, numbOfSubs, senderCount, subTierInfo, extra) => {\n this.emit('subMysteryGift', gifterUser, numbOfSubs, senderCount, subTierInfo, extra);\n\n if (client?.debug)\n logger.debug(\n '[Client]',\n `ComfyJS Sub Mystery Gift: ${gifterUser} gifted ${numbOfSubs} subs`,\n );\n\n if (this.emulate) {\n const tier = subTierInfo.plan === 'Prime' ? 'prime' : subTierInfo.plan;\n\n Local.emulate.twitch.subscriber({\n name: gifterUser,\n message: '',\n amount: numbOfSubs,\n tier: tier,\n subType: 'community',\n });\n }\n };\n this.instance.onGiftSubContinue = (user, sender, extra) => {\n this.emit('giftSubContinue', user, sender, extra);\n\n if (client?.debug)\n logger.debug(\n '[Client]',\n `ComfyJS Gift Sub Continue: ${user} continued their gifted sub from ${sender}`,\n );\n\n if (this.emulate) {\n Local.emulate.twitch.subscriber({\n name: user,\n message: '',\n sender: sender,\n tier: '1000',\n subType: 'gift',\n });\n }\n };\n this.instance.onCheer = (user, message, bits, flags, extra) => {\n this.emit('cheer', user, message, bits, flags, extra);\n\n if (client?.debug)\n logger.debug('[Client]', `ComfyJS Cheer: ${user} cheered ${bits} bits - ${message}`);\n\n if (this.emulate) {\n Local.emulate.twitch.cheer({\n name: user,\n message: message,\n amount: bits,\n });\n }\n };\n this.instance.onChatMode = (flags, channel) => {\n this.emit('chatMode', flags, channel);\n\n if (client?.debug) logger.debug('[Client]', `ComfyJS Chat Mode Changed on ${channel}`);\n };\n this.instance.onReward = (user, reward, cost, message, extra) => {\n this.emit('reward', user, reward, cost, message, extra);\n\n if (client?.debug)\n logger.debug(\n '[Client]',\n `ComfyJS Reward: ${user} redeemed ${reward} for ${cost} - ${message}`,\n );\n };\n this.instance.onConnected = (address, port, isFirstConnect) => {\n this.emit('connected', address, port, isFirstConnect);\n\n if (client?.debug)\n logger.debug(\n '[Client]',\n `ComfyJS Connected: ${address}:${port} (First Connect: ${isFirstConnect})`,\n );\n };\n this.instance.onReconnect = (reconnectCount) => {\n this.emit('reconnect', reconnectCount);\n\n if (client?.debug) logger.debug('[Client]', `ComfyJS Reconnect: Attempt #${reconnectCount}`);\n };\n\n if (this.init) {\n this.instance.Init(this.username, this.password, this.channels, this.isDebug);\n }\n }\n}\n","import { StreamElements } from '../types/streamelements/main.js';\n\nconst LOCAL_SE_API: StreamElements.SE_API & { store: { list: Record<string, any> } } = {\n getOverlayStatus: () => {\n return {\n isEditorMode: false,\n muted: false,\n };\n },\n resumeQueue: () => {},\n responses: {} as Record<string, any>,\n sendMessage(message: string, data: object) {},\n counters: {\n get(key: string): number | null {\n return null;\n },\n },\n sanitize(message: string): string {\n return message;\n },\n cheerFilter(message: string): string {\n return message;\n },\n setField(key: string, value: string | number | boolean | undefined, reload: boolean) {},\n\n store: {\n set: function (name: string, obj: any) {\n this.list[name] = obj;\n\n localStorage.setItem('SE_API-STORE', JSON.stringify(LOCAL_SE_API.store.list));\n },\n get: async function (name: string) {\n if (this.list[name]) return this.list[name];\n else return null;\n },\n list: {} as Record<string, any>,\n },\n};\n\nexport async function initializeLocalSEAPI() {\n let lastStore = localStorage.getItem('SE_API-STORE') ?? '';\n\n let result = lastStore ? JSON.parse(lastStore) : {};\n\n LOCAL_SE_API.store.list = result;\n\n return LOCAL_SE_API;\n}\n","export namespace Alejo {\n export namespace Pronouns {\n export type name =\n | 'hehim'\n | 'sheher'\n | 'theythem'\n | 'shethem'\n | 'hethem'\n | 'heshe'\n | 'xexem'\n | 'faefaer'\n | 'vever'\n | 'aeaer'\n | 'ziehir'\n | 'perper'\n | 'eem'\n | 'itits';\n\n export type display =\n | 'He/Him'\n | 'She/Her'\n | 'They/Them'\n | 'She/They'\n | 'He/They'\n | 'He/She'\n | 'Xe/Xem'\n | 'Fae/Faer'\n | 'Ve/Ver'\n | 'Ae/Aer'\n | 'Zie/Hir'\n | 'Per/Per'\n | 'E/Em'\n | 'It/Its';\n\n export enum map {\n hehim = 'He/Him',\n sheher = 'She/Her',\n theythem = 'They/Them',\n shethem = 'She/They',\n hethem = 'He/They',\n heshe = 'He/She',\n xexem = 'Xe/Xem',\n faefaer = 'Fae/Faer',\n vever = 'Ve/Ver',\n aeaer = 'Ae/Aer',\n ziehir = 'Zie/Hir',\n perper = 'Per/Per',\n eem = 'E/Em',\n itits = 'It/Its',\n }\n }\n\n export async function list(): Promise<typeof Pronouns.map> {\n try {\n const data = (await fetch('https://pronouns.alejo.io/api/pronouns').then((res) =>\n res.json(),\n )) as {\n display: Pronouns.display;\n name: Pronouns.name;\n }[];\n\n if (Array.isArray(data) && data.length) {\n const built = Object.fromEntries(\n data.map(({ name, display }) => [name, display] as const),\n ) as Record<Pronouns.name, Pronouns.display>;\n\n return { ...Pronouns.map, ...built } as typeof Pronouns.map;\n }\n } catch {}\n\n return { ...Pronouns.map } as typeof Pronouns.map;\n }\n\n export type user = {\n id: string;\n login: string;\n pronoun_id: Pronouns.name;\n };\n\n export async function get(username: string) {\n if (!username) throw new Error('Username is required to fetch Alejo data.');\n\n username = username.toLowerCase();\n\n if (!window?.client) {\n try {\n const data = await fetch(`https://pronouns.alejo.io/api/users/${username}`)\n .then((res) => res.json())\n .then(([data]) => data as Alejo.user | undefined);\n\n if (data) {\n return data.pronoun_id;\n }\n } catch (error) {\n throw new Error(\n `Failed to fetch pronoun data for user \"${username}\": ${error instanceof Error ? error.message : error}`,\n );\n }\n\n return;\n }\n\n if (\n username in window?.client?.storage.data.pronoun &&\n window?.client?.storage.data.pronoun[username].expire > Date.now()\n ) {\n return window?.client?.storage.data.pronoun[username].value;\n } else {\n try {\n const data = await fetch(`https://pronouns.alejo.io/api/users/${username}`)\n .then((res) => res.json())\n .then(([data]) => data as Alejo.user | undefined);\n\n if (data) {\n window?.client?.storage.add(`pronoun.${username}`, {\n value: data.pronoun_id,\n timestamp: Date.now(),\n expire: Date.now() + window?.client?.cache.pronoun * 60 * 1000,\n });\n\n return window?.client?.storage.data.pronoun[username].value ?? data.pronoun_id;\n }\n } catch (error) {\n throw new Error(\n `Failed to fetch pronoun data for user \"${username}\": ${error instanceof Error ? error.message : error}`,\n );\n }\n }\n }\n}\n","import './client/listener.js';\nimport { Button, usedButtons } from './actions/button.js';\nimport { Command, usedCommands } from './actions/command.js';\nimport { Client } from './client/client.js';\nimport { Data } from './data/index.js';\nimport { Helper } from './helper/index.js';\nimport { Local } from './local/index.js';\nimport { EventProvider } from './modules/EventProvider.js';\nimport { FakeUserPool, fakeUserPools } from './modules/fakeUser.js';\nimport { useComms, usedComms } from './modules/useComms.js';\nimport { useLogger } from './modules/useLogger.js';\nimport { useQueue } from './modules/useQueue.js';\nimport { usedStorages, useStorage } from './modules/useStorage.js';\nimport { useComfyJs } from './multistream/comfyJs.js';\nimport { initializeLocalSEAPI } from './streamelements/api.js';\nimport { StreamElements } from './types/index.js';\nimport { Alejo } from './utils/alejo.js';\n\nexport const USE_SE_API: Promise<StreamElements.SE_API> =\n typeof SE_API !== 'undefined' ? Promise.resolve(SE_API) : Promise.resolve(initializeLocalSEAPI());\nexport const logger = new useLogger();\n\nexport const main = {\n SeAPI: USE_SE_API,\n\n Client: Client,\n Helper: Helper,\n Local: Local,\n Data: Data,\n logger: logger,\n\n modules: {\n EventProvider,\n useStorage,\n useQueue,\n useLogger,\n useComms,\n FakeUserPool,\n },\n actions: {\n Button,\n Command,\n },\n multistream: {\n useComfyJs,\n },\n internal: {\n usedStorages,\n usedComms,\n usedCommands,\n usedButtons,\n fakeUserPools,\n },\n pronouns: {\n Alejo,\n },\n};\n\nif (typeof window !== 'undefined') {\n (window as any).Tixyel = main;\n} else {\n (globalThis as any).Tixyel = main;\n}\n","import { ComfyJSInstance } from 'comfy.js';\n\nimport { main } from './main.js';\nimport { StreamElements } from './types.js';\n\nexport type * from './types.ts';\n\ndeclare global {\n interface Window {\n Tixyel: typeof main;\n client: InstanceType<typeof main.Client> | undefined;\n ComfyJS?: ComfyJSInstance;\n }\n\n interface WindowEventMap {\n onWidgetLoad: CustomEvent<StreamElements.Event.onWidgetLoad>;\n onSessionUpdate: CustomEvent<StreamElements.Event.onSessionUpdate>;\n onEventReceived: CustomEvent<StreamElements.Event.onEventReceived>;\n }\n\n const Tixyel: typeof main;\n let client: InstanceType<typeof main.Client> | undefined;\n\n const SE_API: StreamElements.SE_API;\n}\n\nexport default main;\n"],"mappings":"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;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,EACD;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,EACD;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,EACD;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,EACD;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aACE;IACF,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aACE;IACF,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aACE;IACF,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACF,ECrwLY,IAAkB,s+CAsJ9B,ECpJK,IAAgB;CACpB;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;G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,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,iCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,wCAAwC;EACpD,aAAa,CAAC,sCAAsC;EACpD,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,uCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,mCAAmC;EAC/C,aAAa,CAAC,iCAAiC;EAC/C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,kCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,OAAO;EACnB,aAAa,CAAC,KAAK;EACnB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,MACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,SAAS;EACrB,aAAa,CAAC,OAAO;EACrB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,QACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,aAAa;EACzB,aAAa,CAAC,WAAW;EACzB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,YACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,eAAe;EAC3B,aAAa,CAAC,aAAa;EAC3B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,cACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,eAAe;EAC3B,aAAa,CAAC,aAAa;EAC3B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,cACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,YAAY;EACxB,aAAa,CAAC,UAAU;EACxB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,WACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,YAAY;EACxB,aAAa,CAAC,UAAU;EACxB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,WACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,eAAe;EAC3B,aAAa,CAAC,aAAa;EAC3B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,cACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,aAAa;EACzB,aAAa,CAAC,WAAW;EACzB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,YACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,eAAe;EAC3B,aAAa,CAAC,aAAa;EAC3B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,cACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,qBAAqB;EACjC,aAAa,CAAC,mBAAmB;EACjC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,oBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,sBAAsB;EAClC,aAAa,CAAC,oBAAoB;EAClC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,qBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,uBAAuB;EACnC,aAAa,CAAC,qBAAqB;EACnC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,sBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,uBAAuB;EACnC,aAAa,CAAC,qBAAqB;EACnC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,sBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,uBAAuB;EACnC,aAAa,CAAC,qBAAqB;EACnC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,sBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,wBAAwB;EACpC,aAAa,CAAC,sBAAsB;EACpC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,uBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,kCAAkC;EAC9C,aAAa,CAAC,gCAAgC;EAC9C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,iCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,oBAAoB;EAChC,aAAa,CAAC,kBAAkB;EAChC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,mBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,mCAAmC;EAC/C,aAAa,CAAC,iCAAiC;EAC/C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,kCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,wBAAwB;EACpC,aAAa,CAAC,sBAAsB;EACpC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,uBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,qBAAqB;EACjC,aAAa,CAAC,mBAAmB;EACjC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,oBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,gCAAgC;EAC5C,aAAa,CAAC,8BAA8B;EAC5C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,+BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,qBAAqB;EACjC,aAAa,CAAC,mBAAmB;EACjC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,oBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,gCAAgC;EAC5C,aAAa,CAAC,8BAA8B;EAC5C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,+BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,qBAAqB;EACjC,aAAa,CAAC,mBAAmB;EACjC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,oBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,uBAAuB;EACnC,aAAa,CAAC,qBAAqB;EACnC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,sBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,mCAAmC;EAC/C,aAAa,CAAC,iCAAiC;EAC/C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,kCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,mCAAmC;EAC/C,aAAa,CAAC,iCAAiC;EAC/C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,kCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,wCAAwC;EACpD,aAAa,CAAC,sCAAsC;EACpD,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,uCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,oCAAoC;EAChD,aAAa,CAAC,kCAAkC;EAChD,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,mCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,YAAY;EACxB,aAAa,CAAC,UAAU;EACxB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,WACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,QAAQ;EACpB,aAAa,CAAC,MAAM;EACpB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,OACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,gBAAgB;EAC5B,aAAa,CAAC,cAAc;EAC5B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,eACR,EACF;GACF;EACD,eAA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"}
1
+ {"version":3,"file":"index.es.js","names":[],"sources":["../src/modules/EventProvider.ts","../src/modules/useStorage.ts","../src/client/client.ts","../src/helper/classes/number.ts","../src/helper/classes/element.ts","../src/helper/classes/object.ts","../src/data/collection/avatars.ts","../src/data/collection/badges.ts","../src/data/collection/css.ts","../src/data/collection/emotes.ts","../src/data/collection/items.ts","../src/data/collection/messages.ts","../src/data/collection/names.ts","../src/data/collection/tiers.ts","../src/data/collection/tts.ts","../src/data/collection/youtube-emotes.ts","../src/data/index.ts","../src/helper/classes/random.ts","../src/helper/classes/message.ts","../src/helper/classes/event.ts","../src/utils/color.ts","../src/helper/classes/color.ts","../src/helper/classes/string.ts","../src/helper/classes/sound.ts","../src/helper/classes/function.ts","../src/modules/fakeUser.ts","../src/helper/classes/utils.ts","../src/helper/index.ts","../src/actions/button.ts","../src/actions/command.ts","../src/modules/useComms.ts","../src/client/listener.ts","../src/modules/useQueue.ts","../src/local/index.ts","../src/modules/useLogger.ts","../src/multistream/comfyJs.ts","../src/streamelements/api.ts","../src/utils/alejo.ts","../src/main.ts","../src/index.ts"],"sourcesContent":["/**\n * EventProvider class for managing event listeners and emitters.\n * This class allows you to register event listeners, emit events, and manage event subscriptions.\n * @example\n * ```typescript\n * type TestEvents = {\n * load: [event: { type: 'load' }];\n * event: [event: { type: 'event' }];\n * };\n *\n * class Test extends EventProvider<TestEvents> {}\n *\n * const test = new Test();\n * test.once('load', (data) => {});\n * test.emit('load', { type: 'load' });\n *\n * test.on('event', (data) => {});\n * test.emit('event', { type: 'event' });\n * ```\n */\nexport class EventProvider<EventMap extends Record<string, any[]> = Record<string, any[]>> {\n /**\n * Stores registered event listeners.\n */\n private registeredEvents: {\n [K in keyof EventMap]?: Array<(this: this, ...args: EventMap[K]) => any>;\n } = {};\n\n /**\n * Emits an event to all registered listeners.\n * Returns an array of return values from the listeners.\n * @param eventName The name of the event.\n * @param args Arguments to pass to the listeners.\n */\n emit<K extends keyof EventMap>(eventName: K, ...args: EventMap[K]): any[] {\n const listeners = this.registeredEvents[eventName] || [];\n\n return listeners.map((listener) => listener.apply(this, args));\n }\n\n /**\n * Registers an event listener.\n * @param eventName The name of the event.\n * @param callback The callback function.\n */\n on<K extends keyof EventMap>(\n eventName: K,\n callback: (this: this, ...args: EventMap[K]) => any,\n ): this {\n if (typeof callback !== 'function') {\n throw new TypeError('Callback must be a function');\n }\n\n if (!this.registeredEvents[eventName]) {\n this.registeredEvents[eventName] = [];\n }\n\n this.registeredEvents[eventName]!.push(callback);\n\n return this;\n }\n\n /**\n * Removes a specific event listener.\n * @param eventName The name of the event.\n * @param callback The callback function to remove.\n */\n off<K extends keyof EventMap>(\n eventName: K,\n callback?: (this: this, ...args: EventMap[K]) => any,\n ): this {\n const listeners = this.registeredEvents[eventName] || [];\n\n if (!callback) {\n this.registeredEvents[eventName] = [];\n\n return this;\n }\n\n this.registeredEvents[eventName] = listeners.filter((fn) => fn !== callback);\n\n return this;\n }\n\n /**\n * Registers a listener that is executed only once.\n * @param eventName The name of the event.\n * @param callback The callback function.\n */\n once<K extends keyof EventMap>(\n eventName: K,\n callback: (this: this, ...args: EventMap[K]) => any,\n ): this {\n const wrapper = (...args: EventMap[K]) => {\n this.off(eventName, wrapper);\n callback.apply(this, args);\n };\n\n this.on(eventName, wrapper);\n\n return this;\n }\n\n /**\n * Removes all listeners for a specific event.\n * @param eventName The name of the event.\n */\n removeAllListeners<K extends keyof EventMap>(eventName: K): this {\n this.registeredEvents[eventName] = [];\n\n return this;\n }\n}\n","import { USE_SE_API } from '../main.js';\nimport type { JSONObject } from '../types/json.js';\nimport { PathValue } from '../types/path.js';\nimport { StreamElements } from '../types/streamelements/main.js';\nimport { EventProvider } from './EventProvider.js';\n\ntype UseStorageEvents<T> = {\n load: [T | null];\n update: [T];\n};\n\ntype UseStorageOptions<T> = {\n id?: string;\n data: T;\n};\n\nexport const usedStorages: Array<useStorage<any>> = [];\n\nexport class useStorage<T extends JSONObject> extends EventProvider<UseStorageEvents<T>> {\n private SE_API: StreamElements.SE_API | null = null;\n\n /** The unique identifier for the storage instance. */\n public id: string = 'default';\n public loaded: boolean = false;\n public data!: T;\n\n constructor(options: UseStorageOptions<T>) {\n super();\n\n this.id = options.id || this.id;\n this.data = options.data ?? ({} as T);\n\n usedStorages.push(this);\n\n USE_SE_API?.then((se) => {\n this.SE_API = se;\n\n se!.store\n .get<T>(this.id)\n .then((save) => {\n this.data = save ?? this.data;\n\n this.loaded = true;\n\n this.emit('load', this.data);\n\n if (JSON.stringify(this.data) !== JSON.stringify(save)) {\n this.emit('update', this.data);\n }\n })\n .catch(() => {\n this.loaded = true;\n\n this.emit('load', this.data);\n });\n });\n }\n\n /**\n * Saves the current data to storage.\n * @param data Data to save (defaults to current)\n */\n private save(data: T = this.data): void {\n if (this.loaded && this.SE_API) {\n if (JSON.stringify(this.data) !== JSON.stringify(data)) {\n this.data = data;\n\n this.SE_API.store.set<T>(this.id, this.data);\n\n this.emit('update', this.data);\n }\n }\n }\n\n /**\n * Updates the storage data and emits an update event\n * @param data Data to update (defaults to current)\n */\n public update(data: Partial<T> = this.data): void {\n if (this.loaded && JSON.stringify(this.data) !== JSON.stringify(data)) {\n const newData = { ...this.data, ...data };\n\n this.save(newData);\n }\n }\n\n /**\n * Adds a value to the storage at the specified path.\n * @param path Path to add the value to\n * @param value Value to add\n */\n public add<P extends string>(path: P, value: PathValue<T, P>): void {\n if (!this.loaded) return;\n\n useStorage.setByPath(this.data, path, value);\n\n this.save(this.data);\n }\n\n /**\n * Clears all data from the storage.\n */\n public clear(): void {\n if (this.loaded) {\n this.data = {} as T;\n\n this.save(this.data);\n }\n }\n\n /**\n * Sets a value in the storage at the specified path.\n * @param obj The object to set the value in\n * @param path The path to set the value at\n * @param value The value to set\n * @returns The updated object\n */\n static setByPath<P extends string, T extends object>(\n obj: T,\n path: P,\n value: PathValue<T, P>,\n ): void {\n const keys = path.split('.');\n let current: any = obj;\n\n for (let i = 0; i < keys.length - 1; i++) {\n if (typeof current[keys[i]] !== 'object' || current[keys[i]] == null) {\n current[keys[i]] = {};\n }\n\n current = current[keys[i]];\n }\n\n current[keys[keys.length - 1]] = value;\n\n return current;\n }\n\n public override on<K extends keyof UseStorageEvents<T>>(\n eventName: K,\n callback: (this: useStorage<T>, ...args: UseStorageEvents<T>[K]) => void,\n ): this {\n if (eventName === 'load' && this.loaded) {\n callback.apply(this, [this.data]);\n\n return this;\n }\n\n super.on(eventName, callback);\n\n return this;\n }\n}\n","import { Button } from '../actions/button.js';\nimport { Command } from '../actions/command.js';\nimport { EventProvider } from '../modules/EventProvider.js';\nimport { useStorage } from '../modules/useStorage.js';\nimport { Provider } from '../types/client.js';\nimport { StreamElements } from '../types/streamelements/main.js';\nimport { Alejo } from '../utils/alejo.js';\n\ntype ClientEvents = {\n load: [event: StreamElements.Event.onWidgetLoad];\n action: [action: Button | Command, type: 'created' | 'executed' | 'removed'];\n session: [session: StreamElements.Session.Data];\n event:\n | [provider: 'streamelements', event: StreamElements.Event.Provider.StreamElements.Events]\n | [provider: 'twitch', event: StreamElements.Event.Provider.Twitch.Events]\n | [provider: 'youtube', event: StreamElements.Event.Provider.YouTube.Events]\n | [provider: 'kick', event: StreamElements.Event.Provider.Kick.Events]\n | [provider: 'facebook', event: StreamElements.Event.Provider.Facebook.Events];\n};\n\nexport type ClientStorageOptions<T> = {\n value: T;\n timestamp: number;\n expire: number;\n};\n\nexport type ClientStorage = {\n user: Record<string, ClientStorageOptions<string>>;\n avatar: Record<string, ClientStorageOptions<string>>;\n pronoun: Record<string, ClientStorageOptions<Alejo.Pronouns.name>>;\n emote: Record<string, ClientStorageOptions<string>>;\n};\n\nexport type ClientOptions = {\n id?: string;\n debug?: boolean | (() => boolean);\n};\n\nexport class Client extends EventProvider<ClientEvents> {\n public id: string = 'default';\n public debug: boolean = false;\n\n public storage!: useStorage<ClientStorage>;\n\n public fields: StreamElements.Event.onWidgetLoad['fieldData'] = {};\n\n public session!: StreamElements.Session.Data;\n\n public loaded: boolean = false;\n\n constructor(options: ClientOptions) {\n super();\n\n this.id = options.id || this.id;\n\n this.storage = new useStorage<ClientStorage>({\n id: this.id,\n data: {\n user: {},\n avatar: {},\n pronoun: {},\n emote: {},\n },\n });\n\n this.on('load', () => {\n this.debug = Boolean(typeof options.debug === 'function' ? options.debug() : options.debug);\n });\n\n window.client = this;\n }\n\n public actions: {\n commands: Command[];\n buttons: Button[];\n } = {\n commands: [],\n buttons: [],\n };\n\n public details!: {\n provider: Provider | 'local';\n user: StreamElements.Event.onWidgetLoad['channel'];\n currency: StreamElements.Event.onWidgetLoad['currency'];\n overlay: StreamElements.Event.onWidgetLoad['overlay'];\n };\n\n public cache: {\n /**\n * Avatar cache duration in minutes.\n */\n avatar: number;\n /**\n * Pronoun cache duration in minutes.\n */\n pronoun: number;\n /**\n * Emote cache duration in minutes.\n */\n emote: number;\n } = {\n avatar: 30,\n pronoun: 60,\n emote: 120,\n };\n\n override on<K extends keyof ClientEvents>(\n eventName: K,\n callback: (this: Client, ...args: ClientEvents[K]) => void,\n ): this {\n if (eventName === 'load' && this.loaded) {\n callback.apply(this, [\n {\n channel: this.details.user,\n currency: this.details.currency,\n fieldData: this.fields,\n recents: [],\n session: {\n data: this.session,\n settings: {\n autoReset: false,\n calendar: false,\n resetOnStart: false,\n },\n },\n overlay: this.details.overlay,\n emulated: false,\n } as StreamElements.Event.onWidgetLoad,\n ] as unknown as ClientEvents[K]);\n\n return this;\n }\n\n super.on(eventName, callback);\n\n return this;\n }\n}\n","/**\n * NumberHelper class provides utility methods for working with numbers, including translation to words, balancing within a range, rounding, and generating random numbers.\n */\nexport class NumberHelper {\n /**\n * Translate number to words\n * @param num - Number to translate\n * @param type - Translation type\n * @returns - Number in words\n * @example\n * ```javascript\n * const cardinal = translate(42, 'cardinal');\n * console.log(cardinal); // \"forty-two\"\n * const ordinal = translate(42, 'ordinal');\n * console.log(ordinal); // \"forty-second\"\n * const suffix = translate(42, 'suffix');\n * console.log(suffix); // \"42nd\"\n * ```\n */\n translate(num: number, type: 'cardinal' | 'ordinal' | 'suffix' = 'cardinal'): string {\n const CARDINALS = {\n single: ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'],\n tens: [\n 'ten',\n 'eleven',\n 'twelve',\n 'thirteen',\n 'fourteen',\n 'fifteen',\n 'sixteen',\n 'seventeen',\n 'eighteen',\n 'nineteen',\n ],\n decades: ['twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety'],\n };\n const ORDINALS = {\n single: [\n 'zeroth',\n 'first',\n 'second',\n 'third',\n 'fourth',\n 'fifth',\n 'sixth',\n 'seventh',\n 'eighth',\n 'ninth',\n ],\n tens: [\n 'tenth',\n 'eleventh',\n 'twelfth',\n 'thirteenth',\n 'fourteenth',\n 'fifteenth',\n 'sixteenth',\n 'seventeenth',\n 'eighteenth',\n 'nineteenth',\n ],\n decades: [\n 'twentieth',\n 'thirtieth',\n 'fortieth',\n 'fiftieth',\n 'sixtieth',\n 'seventieth',\n 'eightieth',\n 'ninetieth',\n ],\n };\n const SUFFIXES = ['th', 'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th'];\n const SCALES = ['', 'thousand', 'million', 'billion', 'trillion', 'quadrillion', 'quintillion'];\n const SCALES_ORD = SCALES.map((s) => (s ? `${s}th` : ''));\n\n num = Math.abs(Math.floor(num));\n\n if (type === 'suffix') {\n const rem100 = num % 100;\n if (rem100 >= 11 && rem100 <= 13) return `${num}th`;\n const rem10 = num % 10;\n return `${num}${SUFFIXES[rem10]}`;\n }\n\n function below100(n: number, kind: 'cardinal' | 'ordinal'): string {\n if (n < 10) return kind === 'ordinal' ? ORDINALS.single[n] : CARDINALS.single[n];\n if (n < 20) return kind === 'ordinal' ? ORDINALS.tens[n - 10] : CARDINALS.tens[n - 10];\n const decade = Math.floor(n / 10);\n const single = n % 10;\n if (single === 0)\n return kind === 'ordinal' ? ORDINALS.decades[decade - 2] : CARDINALS.decades[decade - 2];\n const tensPart = CARDINALS.decades[decade - 2];\n const unitPart = kind === 'ordinal' ? ORDINALS.single[single] : CARDINALS.single[single];\n return `${tensPart}-${unitPart}`;\n }\n\n function below1000(n: number, kind: 'cardinal' | 'ordinal'): string {\n if (n === 0) return kind === 'ordinal' ? ORDINALS.single[0] : CARDINALS.single[0];\n const hundreds = Math.floor(n / 100);\n const rest = n % 100;\n const parts: string[] = [];\n if (hundreds > 0) {\n if (kind === 'ordinal' && rest === 0) parts.push(`${CARDINALS.single[hundreds]} hundredth`);\n else parts.push(`${CARDINALS.single[hundreds]} hundred`);\n }\n if (rest > 0) parts.push(below100(rest, kind));\n return parts.join(' ');\n }\n\n if (num < 1000) return below1000(num, type);\n\n const groups: number[] = [];\n let n = num;\n while (n > 0) {\n groups.push(n % 1000);\n n = Math.floor(n / 1000);\n }\n\n let lastNonZeroIndex = -1;\n for (let i = 0; i < groups.length; i++) if (groups[i] !== 0) lastNonZeroIndex = i;\n\n const parts: string[] = [];\n for (let i = groups.length - 1; i >= 0; i--) {\n const g = groups[i];\n if (g === 0) continue;\n const scale = SCALES[i];\n\n if (type === 'cardinal') {\n let segment = below1000(g, 'cardinal');\n if (scale) segment += ` ${scale}`;\n parts.push(segment);\n } else {\n const isLastNonZero = i === lastNonZeroIndex;\n if (isLastNonZero) {\n if (i > 0) {\n const segment = below1000(g, 'cardinal');\n const ordScale = SCALES_ORD[i];\n parts.push(segment ? `${segment} ${ordScale}` : ordScale);\n } else {\n const segment = below1000(g, 'ordinal');\n parts.push(segment);\n }\n } else {\n let segment = below1000(g, 'cardinal');\n if (scale) segment += ` ${scale}`;\n parts.push(segment);\n }\n }\n }\n\n return parts.join(', ');\n }\n\n /**\n * Balances a number within a specified range\n * @param amount - Number to balance\n * @param min - Minimum value\n * @param max - Maximum value\n * @param decimals - Number of decimal places to round to (default is 0)\n * @returns - Balanced number\n * @example\n * ```javascript\n * const balancedValue = balance(150, 0, 100);\n * console.log(balancedValue); // 100\n * ```\n */\n balance(amount: number, min: number = 0, max: number = 100, decimals: number = 0): number {\n const result = Math.min(Math.max(amount, min), max);\n\n return this.round(result, decimals);\n }\n\n /**\n * Rounds a number to a specified number of decimal places\n * @param value - Number to round\n * @param decimals - Number of decimal places (default is 2)\n * @returns Rounded number\n * @example\n * ```javascript\n * const roundedValue = round(3.14159, 3);\n * console.log(roundedValue); // 3.142\n * const roundedValueDefault = round(3.14159);\n * console.log(roundedValueDefault); // 3.14\n * const roundedValueZero = round(3.14159, 0);\n * console.log(roundedValueZero); // 3\n * ```\n */\n round(value: number, decimals: number = 2): number {\n const factor = Math.pow(10, decimals);\n\n return Math.round(value * factor) / factor;\n }\n\n /**\n * Generate random number\n * @param min - Minimum value\n * @param max - Maximum value\n * @param float - Number of decimal places (0 for integer)\n * @returns - Random number\n * @example\n * ```javascript\n * const intNumber = random(1, 10);\n * console.log(intNumber); // e.g. 7\n *\n * const floatNumber = random(1, 10, 2);\n * console.log(floatNumber); // e.g. 3.14\n * ```\n */\n random(min: number, max: number, float: number = 0): number {\n if (min > max) [min, max] = [max, min];\n\n const rand = Math.random() * (max - min) + min;\n return float ? Number(rand.toFixed(float)) : Math.round(rand);\n }\n}\n","import { NumberHelper } from './number.js';\n\nexport interface ScaleOptions<T extends HTMLElement> {\n /**\n * The parent element to use for scaling calculations. If not provided, the element's parent will be used.\n */\n parent?: HTMLElement;\n /**\n * The preferred dimension to base the scaling on. Can be 'width', 'height', or 'auto' (default).\n */\n prefer?: 'width' | 'height' | 'auto';\n /**\n * The minimum percentage of the parent size to scale to. Default is 0.\n */\n min?: number;\n /**\n * The maximum percentage of the parent size to scale to. Default is 1 (100%).\n */\n max?: number;\n /**\n * A callback function that is called after scaling is applied.\n * @param this - The HTML element being scaled.\n * @param number - The scale factor applied to the element.\n * @param element - The HTML element being scaled.\n * @returns void\n */\n apply?: (this: T, number: number, element: T) => void;\n}\n\nexport type FitTextOptions = {\n minFontSize?: number;\n maxFontSize?: number;\n parent?: HTMLElement;\n};\n\nexport class ElementHelper {\n /**\n * Merges outer span styles with inner span styles in the provided HTML string.\n * @param outerStyle - The style string to be applied to the outer span.\n * @param innerHTML - The inner HTML string which may contain a span with its own styles.\n * @returns A new HTML string with merged styles applied to a single span.\n * @example\n * ```javascript\n * const result = mergeSpanStyles(\"color: red; font-weight: bold;\", '<span style=\"font-size: 14px;\">Hello World</span>');\n * console.log(result); // Output: '<span style=\"font-size: 14px; color: red; font-weight: bold;\">Hello World</span>'\n * ```\n */\n mergeSpanStyles(outerStyle: string, innerHTML: string, className?: string): string {\n const match = innerHTML.match(/^<span(?: class=\"[^\"]*\")? style=\"([^\"]*)\">(.*)<\\/span>$/s);\n\n if (match) {\n const innerStyle = match[1];\n const content = match[2];\n const innerClass = match[0].match(/class=\"([^\"]*)\"/)?.[1] || '';\n\n let mergedStyle = [innerStyle, outerStyle]\n .filter((a) => a.length)\n .map((s) => {\n if (s.endsWith(';')) return s.slice(0, -1);\n else return s;\n })\n .join('; ')\n .replace(/\\s*;\\s*/g, '; ')\n .trim();\n\n if (!mergedStyle.endsWith(';')) mergedStyle += ';';\n\n return `<span${innerClass ? ` class=\"${innerClass} ${className ?? ''}\"` : ''}${mergedStyle ? ` style=\"${mergedStyle}\"` : ''}>${content}</span>`;\n } else {\n if (outerStyle && outerStyle.length && !outerStyle.endsWith(';')) outerStyle += ';';\n\n return `<span${className ? ` class=\"${className}\"` : ''}${outerStyle ? ` style=\"${outerStyle}\"` : ''}>${innerHTML}</span>`;\n }\n }\n\n /**\n * Scales an HTML element to fit within its parent element based on specified minimum and maximum scale factors.\n * @param element - The HTML element to be scaled.\n * @param min - Minimum scale factor (default is 0).\n * @param max - Maximum scale factor (default is 1).\n * @param options - Optional settings for scaling.\n * @returns - An object containing the new width, height, and scale factor, or void if not applied.\n * @example\n * ```javascript\n * const element = document.getElementById('myElement');\n * scale(element, 0.5, 1, { return: false });\n * ```\n */\n scale(\n element: HTMLElement,\n min: number = 0,\n max: number = 1,\n options?: { return: boolean; parent: HTMLElement; base: 'width' | 'height' },\n ): { width: number; height: number; scale: number } | void {\n const { return: returnOnly = false, parent: customParent, base } = options || {};\n\n const parent = customParent || element.parentElement || document.body;\n\n if (!parent) {\n throw new Error('No parent element found for scaling');\n }\n\n const parentRect = parent.getBoundingClientRect();\n const elementWidth = element.offsetWidth;\n const elementHeight = element.offsetHeight;\n\n if (elementWidth === 0 || elementHeight === 0) {\n throw new Error('Element has zero width or height, cannot scale');\n }\n\n // Calculate scales for both dimensions\n const scaleX = (parentRect.width * max) / elementWidth;\n const scaleY = (parentRect.height * max) / elementHeight;\n\n // Determine final scale based on base option or use smaller scale\n let finalScale =\n base === 'width' ? scaleX : base === 'height' ? scaleY : Math.min(scaleX, scaleY);\n\n // Apply minimum constraint if needed\n if (min > 0) {\n const minScaleX = (parentRect.width * min) / elementWidth;\n const minScaleY = (parentRect.height * min) / elementHeight;\n const minScale = Math.max(minScaleX, minScaleY);\n\n finalScale = Math.max(minScale, finalScale);\n }\n\n const result = {\n width: elementWidth * finalScale,\n height: elementHeight * finalScale,\n scale: finalScale,\n };\n\n if (returnOnly) {\n return result;\n }\n\n element.style.transform = `scale(${finalScale})`;\n element.style.transformOrigin = 'center center';\n\n return result;\n }\n\n /**\n * Scales an HTML element to fit within its parent element based on specified options.\n * @param element - The HTML element to be scaled.\n * @param options - Optional settings for scaling.\n * @returns The scale factor applied to the element.\n * @example\n * ```javascript\n * const element = document.getElementById('myElement');\n * const scaleFactor scalev2(element, {\n * min: 0.5,\n * max: 1,\n * prefer: 'width',\n * apply: (scale, el) => el.style.transform = `scale(${scale})`\n * });\n * console.log(`Element scaled by a factor of ${scaleFactor}`);\n * ```\n */\n scalev2<T extends HTMLElement>(element: T, options: ScaleOptions<T> = {}): number {\n const {\n parent = element.parentElement,\n prefer = 'auto',\n min = 0,\n max = 1,\n apply = () => {},\n } = options;\n\n if (!parent) {\n throw new Error('No parent element found for scaling');\n }\n\n const parentClientRect = parent.getBoundingClientRect();\n const elementClientRect = element.getBoundingClientRect();\n\n const parentWidth = parentClientRect.width;\n const parentHeight = parentClientRect.height;\n\n const elementWidth = elementClientRect.width;\n const elementHeight = elementClientRect.height;\n\n let scaleXmin = (parentWidth * min) / elementWidth;\n let scaleYmin = (parentHeight * min) / elementHeight;\n\n let scaleXmax = (parentWidth * max) / elementWidth;\n let scaleYmax = (parentHeight * max) / elementHeight;\n\n let scaleValue = Math.min(scaleXmax, scaleYmax);\n\n const minScale = Math.max(scaleXmin, scaleYmin);\n scaleValue = Math.max(scaleValue, minScale);\n\n const finalScaleX = elementWidth * scaleValue;\n const finalScaleY = elementHeight * scaleValue;\n\n if (prefer === 'width') {\n scaleValue = Math.max(scaleXmin, Math.min(scaleXmax, parentWidth / elementWidth));\n } else if (prefer === 'height') {\n scaleValue = Math.max(scaleYmin, Math.min(scaleYmax, parentHeight / elementHeight));\n } else {\n if (finalScaleX > parentWidth) {\n scaleValue = Math.max(scaleXmin, Math.min(scaleXmax, parentWidth / elementWidth));\n } else if (finalScaleY > parentHeight) {\n scaleValue = Math.max(scaleYmin, Math.min(scaleYmax, parentHeight / elementHeight));\n }\n }\n\n apply.apply(element, [scaleValue, element]);\n\n return scaleValue;\n }\n\n /**\n * Fits the text within the parent element by adjusting the font size.\n * @param element - The HTML element containing the text to be fitted.\n * @param compressor - A multiplier to adjust the fitting sensitivity (default is 1).\n * @param options - Optional settings for fitting text.\n * @returns The HTML element with adjusted font size.\n * @example\n * ```javascript\n * const element = document.getElementById('myTextElement');\n * fitText(element, 1, { minFontSize: 12, maxFontSize: 36 });\n * console.log(`Adjusted font size: ${element.style.fontSize}`);\n * ```\n */\n fitText(element: HTMLElement, compressor: number = 1, options: FitTextOptions = {}) {\n const fontSize = parseFloat(getComputedStyle(element).getPropertyValue('font-size'));\n\n const settings = {\n minFontSize: options?.minFontSize ?? 0,\n maxFontSize: options?.maxFontSize ?? fontSize,\n };\n\n const parent = options?.parent || element.parentElement;\n\n if (!parent) {\n throw new Error('No parent element found for fitting text');\n }\n\n const parentWidth = parent.clientWidth * compressor;\n const elWidth = element.offsetWidth;\n\n const ratio = parentWidth / elWidth;\n const value = fontSize * ratio;\n\n const number = new NumberHelper();\n const result = number.balance(value, settings.minFontSize, settings.maxFontSize);\n\n element.style.fontSize = result + 'px';\n\n return element;\n }\n\n /**\n * Wraps formatted HTML text with containers and splits characters into indexed spans.\n * Adds 'container' class and data-index to all parent elements, and wraps each character in a span with class 'char' and data-index.\n * @param htmlString - The input HTML string containing formatted text elements (span, strong, em, etc).\n * @param startIndex - The starting index for the data-index attribute (default is 0).\n * @returns - A new HTML string with containers and character-level indexing.\n * @example\n * ```javascript\n * const result = splitTextToChars('<span>TesTe</span> <strong>bold</strong>', 0);\n * console.log(result);\n * // Output: '<span class=\"container\" data-index=\"0\"><span class=\"char\" data-index=\"0\">T</span><span class=\"char\" data-index=\"1\">e</span>...'\n * ```\n */\n splitTextToChars(\n htmlString: string,\n startIndex: number = 0,\n preserveInterElementWhitespace: boolean = false,\n ): string {\n const parser = new DOMParser();\n const processed = document.createElement('div');\n\n let charIndex = startIndex;\n\n function processNode(node: Node): Node | DocumentFragment {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent || '';\n\n const chars = text.split('').map((char, index) => {\n const span = document.createElement('span');\n\n span.classList.add('char');\n span.dataset.index = String(charIndex);\n span.dataset.exclusivityIndex = String(index);\n span.style.setProperty('--char-index', String(charIndex));\n span.style.setProperty('--exclusivity-index', String(index));\n\n if (char === ' ' || char === '\\n' || char === '\\t') {\n span.style.whiteSpace = 'pre-wrap';\n } else {\n charIndex++;\n }\n\n span.textContent = char;\n\n return span;\n });\n\n const fragment = document.createDocumentFragment();\n chars.forEach((char) => fragment.appendChild(char));\n\n return fragment;\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n const clone = node.cloneNode(false) as HTMLElement;\n\n clone.classList.add('container');\n clone.dataset.index = String(charIndex);\n clone.style.setProperty('--char-index', String(charIndex));\n clone.style.setProperty('--exclusivity-index', String(charIndex));\n\n charIndex++;\n\n node.childNodes.forEach((child) => {\n const processed = processNode(child);\n\n clone.appendChild(processed);\n });\n\n return clone;\n }\n\n return node.cloneNode(true);\n }\n\n parser.parseFromString(htmlString, 'text/html').body.childNodes.forEach((node) => {\n if (\n !preserveInterElementWhitespace &&\n node.nodeType === Node.TEXT_NODE &&\n !node.textContent?.trim()\n ) {\n return;\n }\n\n const result = processNode(node);\n\n processed.appendChild(result);\n });\n\n let html = '';\n\n Array.from(processed.childNodes).forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE) html += node.textContent;\n else html += (node as HTMLElement).outerHTML;\n });\n\n return html;\n }\n}\n","export class ObjectHelper {\n /**\n * Flattens a nested object into a single-level object with dot-separated keys.\n * @param obj - The nested object to be flattened.\n * @param prefix - The prefix to be added to each key (used for recursion).\n * @returns A flattened object with dot-separated keys.\n * @example\n * ```javascript\n * const nestedObj = { a: { b: 1, c: { d: 2 } }, e: [3, 4] };\n * const flatObj = flatten(nestedObj);\n * console.log(flatObj);\n * // Output: { 'a.b': '1', 'a.c.d': '2', 'e:0': '3', 'e:1': '4' }\n * ```\n */\n flatten(\n obj: Record<string, any>,\n stringify: boolean = true,\n prefix: string = '',\n ): Record<string, typeof stringify extends true ? string : string | number | boolean> {\n const result = {} as Record<\n string,\n typeof stringify extends true ? string : string | number | boolean\n >;\n\n for (const key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n\n const value = obj[key];\n const path = prefix ? `${prefix}.${key}` : key;\n\n // Handle null and undefined\n if (value === null || value === undefined) {\n result[path] = String(value);\n\n continue;\n }\n\n if (typeof value === 'number' && isNaN(value)) {\n result[path] = 'NaN';\n\n continue;\n }\n\n if (typeof value === 'number' && !isNaN(value)) {\n result[path] = stringify ? String(value) : value;\n\n continue;\n }\n\n // Handle Date objects\n if (value instanceof Date) {\n result[path] = value.toISOString();\n\n continue;\n }\n\n // Handle Map objects\n if (value instanceof Map) {\n value.forEach((v, k) => {\n result[`${path}.${k}`] = JSON.stringify(v);\n });\n\n continue;\n }\n\n // Handle Array objects\n if (Array.isArray(value)) {\n value.forEach((v, i) => {\n const itemPath = `${path}:${i}`;\n\n if (typeof v === 'object') {\n Object.assign(result, this.flatten(v, stringify, itemPath));\n } else {\n result[itemPath] = stringify ? String(v) : v;\n }\n });\n\n continue;\n }\n\n // Handle nested objects\n if (typeof value === 'object') {\n Object.assign(result, this.flatten(value, stringify, path));\n continue;\n }\n\n // Handle primitive values (string, number, boolean, etc.)\n result[path] = String(value);\n }\n\n return result;\n }\n\n /**\n * Returns the entries of an object as an array of key-value pairs, with proper typing.\n * @param obj - The object to retrieve entries from.\n * @returns An array of key-value pairs from the object, typed as an array of tuples with key and value types.\n */\n entries<K extends string, V>(obj: Record<K, V>): [K, V][] {\n return Object.entries(obj) as [K, V][];\n }\n\n /**\n * Returns the values of an object as an array, with proper typing.\n * @param obj - The object to retrieve values from.\n * @returns An array of values from the object, typed as an array of the value type.\n */\n values<K extends string, V>(obj: Record<K, V>): V[] {\n return Object.values(obj) as V[];\n }\n\n /**\n * Returns the keys of an object as an array of strings, with proper typing.\n * @param obj - The object to retrieve keys from.\n * @returns An array of keys from the object, typed as an array of strings.\n */\n keys<K extends string, V>(obj: Record<K, V>): K[] {\n return Object.keys(obj) as K[];\n }\n}\n","export const avatars = [\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/13e5fa74-defa-11e9-809c-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/dbdc9198-def8-11e9-8681-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/998f01ae-def8-11e9-b95c-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/de130ab0-def7-11e9-b668-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/ebe4cd89-b4f4-4cd9-adac-2f30151b4209-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/215b7342-def9-11e9-9a66-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/ead5c8b2-a4c9-4724-b1dd-9f00b46cbd3d-profile_image-300x300.png',\n];\n","import { Twitch } from '../../types/twitch.js';\n\nexport const globalBadges: Twitch.GlobalBadge[] = [\n {\n 'set_id': 'qsmp2',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2fa68fb9-fcdd-4795-bfab-f408e10efaef/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2fa68fb9-fcdd-4795-bfab-f408e10efaef/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2fa68fb9-fcdd-4795-bfab-f408e10efaef/3',\n 'title': 'QSMP2',\n 'description': 'This badge was earned for watching QSMP during the initial 2026 launch!',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/quackity',\n },\n ],\n },\n {\n 'set_id': 'jasontheween-7-day-survival',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f299577c-8b51-4cb1-ad7c-11faca0c32e9/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f299577c-8b51-4cb1-ad7c-11faca0c32e9/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f299577c-8b51-4cb1-ad7c-11faca0c32e9/3',\n 'title': 'JasonTheWeen 7 Day Survival',\n 'description':\n \"This badge was earned by watching 30 minutes of JasonTheWeen's 7 day survival stream!\",\n 'click_action': 'visit_url',\n 'click_url': 'https://twitch.tv/jasontheween',\n },\n ],\n },\n {\n 'set_id': 'support-a-streamer-ho26-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fe0814c3-87f9-40cb-95b5-d1e7453f289d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fe0814c3-87f9-40cb-95b5-d1e7453f289d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fe0814c3-87f9-40cb-95b5-d1e7453f289d/3',\n 'title': \"Support a Streamer HO'26\",\n 'description':\n 'This badge was earned by subscribing or gifting a sub to any World of Tanks broadcast during the Holiday Ops 26 campaign period',\n 'click_action': 'visit_url',\n 'click_url': 'https://worldoftanks.eu/en/news/general-news/wot-monthly-december-2025/',\n },\n ],\n },\n {\n 'set_id': 'twitch-recap-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/48b26ab3-c9f1-4f16-b02d-fe877be389fd/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/48b26ab3-c9f1-4f16-b02d-fe877be389fd/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/48b26ab3-c9f1-4f16-b02d-fe877be389fd/3',\n 'title': 'Twitch Recap 2025',\n 'description': 'This exclusive badge was earned by the top 20% of Twitch users in 2025.',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/annual-recap',\n },\n ],\n },\n {\n 'set_id': 'ugly-sweater',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/8eddf4ab-68f8-4ee8-a07d-9d7e8520463e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/8eddf4ab-68f8-4ee8-a07d-9d7e8520463e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/8eddf4ab-68f8-4ee8-a07d-9d7e8520463e/3',\n 'title': 'Ugly Sweater',\n 'description':\n 'This badge was earned for sharing festive Clips during Holiday Hoopla 2025.',\n 'click_action': 'visit_url',\n 'click_url': 'https://help.twitch.tv/s/article/how-to-use-badges?language=en_US',\n },\n ],\n },\n {\n 'set_id': 'fright-fest-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2ef2cd27-2210-4640-bbf8-69b5c4d9e302/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2ef2cd27-2210-4640-bbf8-69b5c4d9e302/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2ef2cd27-2210-4640-bbf8-69b5c4d9e302/3',\n 'title': 'Fright Fest 2025',\n 'description': 'This badge was earned by users who shared the best 2025 Fright Fest clips.',\n 'click_action': 'visit_url',\n 'click_url': 'https://blog.twitch.tv/en/2025/10/20/twitch-fright-fest-2025/',\n },\n ],\n },\n {\n 'set_id': 'gamerduo',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/be750d4d-a3b9-4116-ae75-6ee4f3294a19/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/be750d4d-a3b9-4116-ae75-6ee4f3294a19/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/be750d4d-a3b9-4116-ae75-6ee4f3294a19/3',\n 'title': 'GamerDuo',\n 'description': 'Subbed to a streamer and got 3 months of free Super Duolingo!',\n 'click_action': 'visit_url',\n 'click_url': 'https://blog.twitch.tv/2025/10/02/sub-for-super-duolingo/',\n },\n ],\n },\n {\n 'set_id': 'video-games-day',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/34a57a67-b058-45a9-b088-da681aebc83e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/34a57a67-b058-45a9-b088-da681aebc83e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/34a57a67-b058-45a9-b088-da681aebc83e/3',\n 'title': 'Video Games Day',\n 'description':\n 'This badge was earned by users who downloaded and shared clips revolving around anything Video Games related in September 2025.',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/gaming',\n },\n ],\n },\n {\n 'set_id': 'twitch-intern-2022',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/91ed38ea-32fe-4f14-8db1-852537d19aa5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/91ed38ea-32fe-4f14-8db1-852537d19aa5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/91ed38ea-32fe-4f14-8db1-852537d19aa5/3',\n 'title': 'Twitch Intern 2022',\n 'description': 'This user was an intern at Twitch for the summer of 2022',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/jobs/early-career/',\n },\n ],\n },\n {\n 'set_id': 'touch-grass',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/51f536c1-96ca-495b-bc11-150c857a6d54/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/51f536c1-96ca-495b-bc11-150c857a6d54/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/51f536c1-96ca-495b-bc11-150c857a6d54/3',\n 'title': 'Touch Grass',\n 'description':\n 'This badge was earned by users who touched grass and shared their favorite IRL clips in August 2025.',\n 'click_action': 'visit_url',\n 'click_url': 'https://help.twitch.tv/s/article/twitch-chat-badges-guide',\n },\n ],\n },\n {\n 'set_id': 'twitchcon-referral-program-2025-chrome-star',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d139bccf-8184-4fec-a970-cd8d81a7f51a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d139bccf-8184-4fec-a970-cd8d81a7f51a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d139bccf-8184-4fec-a970-cd8d81a7f51a/3',\n 'title': 'TwitchCon Referral Program 2025 (Chrome Star)',\n 'description':\n 'This badge was earned by referring at least one friend who bought their TwitchCon 2025 ticket using your unique referral link.',\n 'click_action': 'visit_url',\n 'click_url': 'https://twitchcon.com/rotterdam-2025/referral-program/',\n },\n ],\n },\n {\n 'set_id': 'twitchcon-referral-program-2025-bleedpurple',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/81952c7b-cfec-479c-a8f6-2bccc296786c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/81952c7b-cfec-479c-a8f6-2bccc296786c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/81952c7b-cfec-479c-a8f6-2bccc296786c/3',\n 'title': 'TwitchCon Referral Program 2025 (bleedPurple)',\n 'description':\n 'This badge was earned by referring ten friends who bought their TwitchCon 2025 ticket using your unique referral link.',\n 'click_action': 'visit_url',\n 'click_url': 'https://twitchcon.com/rotterdam-2025/referral-program/',\n },\n ],\n },\n {\n 'set_id': 'share-the-love',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2de71f4f-b152-4308-a426-127a4cf8003a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2de71f4f-b152-4308-a426-127a4cf8003a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2de71f4f-b152-4308-a426-127a4cf8003a/3',\n 'title': 'Share the Love',\n 'description':\n 'This lovely badge was earned by users who shared their favorite Twitch clips in February 2025.',\n 'click_action': 'visit_url',\n 'click_url': 'https://blog.twitch.tv/2025/02/14/share-the-love-this-valentine-s-day/',\n },\n ],\n },\n {\n 'set_id': 'gone-bananas',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e2ba99f4-6079-44d1-8c07-4ca6b58de61f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e2ba99f4-6079-44d1-8c07-4ca6b58de61f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e2ba99f4-6079-44d1-8c07-4ca6b58de61f/3',\n 'title': 'Gone Bananas Badge',\n 'description':\n 'This gilded banana badge was scored by sharing a lulz-worthy clip during April Fool’s week 2025.',\n 'click_action': 'visit_url',\n 'click_url': 'http://blog.twitch.tv/2025/04/01/april-fools-day/',\n },\n ],\n },\n {\n 'set_id': 'twitchcon-2025---rotterdam',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f4d97fd0-437f-4d8d-b4d3-4b6d18e4705b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f4d97fd0-437f-4d8d-b4d3-4b6d18e4705b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f4d97fd0-437f-4d8d-b4d3-4b6d18e4705b/3',\n 'title': 'TwitchCon 2025',\n 'description': 'Celebrated TwitchCon’s 10 year anniversary in 2025',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitchcon.com/rotterdam-2025/',\n },\n ],\n },\n {\n 'set_id': 'clip-the-halls',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ce9e266a-f490-4fb2-9989-aee20036bfa5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ce9e266a-f490-4fb2-9989-aee20036bfa5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ce9e266a-f490-4fb2-9989-aee20036bfa5/3',\n 'title': 'Clip the Halls',\n 'description':\n 'For spreading the holiday cheer by sharing a clip to TikTok or YouTube during Twitch Holiday Hoopla 2024.',\n 'click_action': 'visit_url',\n 'click_url': 'https://blog.twitch.tv/en/2024/12/02/twitch-holiday-hoopla/',\n },\n ],\n },\n {\n 'set_id': 'twitch-recap-2024',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/72f2a6ac-3d9b-4406-b9e9-998b27182f61/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/72f2a6ac-3d9b-4406-b9e9-998b27182f61/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/72f2a6ac-3d9b-4406-b9e9-998b27182f61/3',\n 'title': 'Twitch Recap 2024',\n 'description':\n 'The Official Chat Badge of the Year. It takes hard work and KomodoHype to receive it. You should be proud to tell everyone you know about this.',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/annual-recap',\n },\n ],\n },\n {\n 'set_id': 'subtember-2024',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4149750c-9582-4515-9e22-da7d5437643b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4149750c-9582-4515-9e22-da7d5437643b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4149750c-9582-4515-9e22-da7d5437643b/3',\n 'title': 'SUBtember 2024',\n 'description': \"For being Subbie's friend and participating in SUBtember 2024!\",\n 'click_action': 'visit_url',\n 'click_url': 'https://link.twitch.tv/subtember2024',\n },\n ],\n },\n {\n 'set_id': 'twitch-intern-2024',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ae96ce48-e764-4232-aa48-d9abf9a5fdab/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ae96ce48-e764-4232-aa48-d9abf9a5fdab/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ae96ce48-e764-4232-aa48-d9abf9a5fdab/3',\n 'title': 'Twitch Intern 2024',\n 'description': 'This user was an intern at Twitch for the summer of 2024',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/jobs/early-career/',\n },\n ],\n },\n {\n 'set_id': 'twitch-dj',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/cf91bbc0-0332-413a-a7f3-e36bac08b624/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/cf91bbc0-0332-413a-a7f3-e36bac08b624/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/cf91bbc0-0332-413a-a7f3-e36bac08b624/3',\n 'title': 'Twitch DJ',\n 'description': 'This user is a DJ in the Twitch DJ Program.',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/dj-program',\n },\n ],\n },\n {\n 'set_id': 'destiny-2-the-final-shape-streamer',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/b1bcaf3c-d7a2-442b-b407-03f2b8ff624d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/b1bcaf3c-d7a2-442b-b407-03f2b8ff624d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/b1bcaf3c-d7a2-442b-b407-03f2b8ff624d/3',\n 'title': 'Destiny 2: The Final Shape Streamer',\n 'description':\n 'I earned this badge by taking part in the Destiny 2: The Final Shape Raid Race!',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/category/destiny-2\\t',\n },\n ],\n },\n {\n 'set_id': 'destiny-2-final-shape-raid-race',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e79ee64f-31f1-4485-9c81-b93957e69f8a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e79ee64f-31f1-4485-9c81-b93957e69f8a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e79ee64f-31f1-4485-9c81-b93957e69f8a/3',\n 'title': 'Destiny 2: The Final Shape Raid Race',\n 'description':\n 'I earned this badge by watching Destiny 2: The Final Shape Raid Race on Twitch!',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/category/destiny-2',\n },\n ],\n },\n {\n 'set_id': 'twitchcon-2024---san-diego',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/6575f0d1-2dc2-4f45-a13f-a1a969dcf8fa/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/6575f0d1-2dc2-4f45-a13f-a1a969dcf8fa/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/6575f0d1-2dc2-4f45-a13f-a1a969dcf8fa/3',\n 'title': 'TwitchCon 2024 - San Diego',\n 'description': 'Attended TwitchCon San Diego 2024',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://twitchcon.com/san-diego-2024/?utm_source=twitch&utm_medium=chat-badge&utm_campaign=tcsd24-chat-badge',\n },\n ],\n },\n {\n 'set_id': 'minecraft-15th-anniversary-celebration',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/178077b2-8b86-4f8d-927c-66ed6c1b025f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/178077b2-8b86-4f8d-927c-66ed6c1b025f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/178077b2-8b86-4f8d-927c-66ed6c1b025f/3',\n 'title': 'Minecraft 15th Anniversary Celebration',\n 'description':\n \"This badge was earned for using a special emote as part of Minecraft's 15th Anniversary Celebration on Twitch!\",\n 'click_action': 'visit_url',\n 'click_url': 'https://twitch-web.app.link/e/vkOhfCa7nJb',\n },\n ],\n },\n {\n 'set_id': 'warcraft',\n 'versions': [\n {\n 'id': 'horde',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/de8b26b6-fd28-4e6c-bc89-3d597343800d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/de8b26b6-fd28-4e6c-bc89-3d597343800d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/de8b26b6-fd28-4e6c-bc89-3d597343800d/3',\n 'title': 'Horde',\n 'description': 'For the Horde!',\n 'click_action': 'visit_url',\n 'click_url': 'http://warcraftontwitch.tv/',\n },\n {\n 'id': 'alliance',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4816339-bad4-4645-ae69-d1ab2076a6b0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4816339-bad4-4645-ae69-d1ab2076a6b0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4816339-bad4-4645-ae69-d1ab2076a6b0/3',\n 'title': 'Alliance',\n 'description': 'For Lordaeron!',\n 'click_action': 'visit_url',\n 'click_url': 'http://warcraftontwitch.tv/',\n },\n ],\n },\n {\n 'set_id': 'vip',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/b817aba4-fad8-49e2-b88a-7cc744dfa6ec/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/b817aba4-fad8-49e2-b88a-7cc744dfa6ec/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/b817aba4-fad8-49e2-b88a-7cc744dfa6ec/3',\n 'title': 'VIP',\n 'description': 'VIP',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://help.twitch.tv/customer/en/portal/articles/659115-twitch-chat-badges-guide',\n },\n ],\n },\n {\n 'set_id': 'vga-champ-2017',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/03dca92e-dc69-11e7-ac5b-9f942d292dc7/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/03dca92e-dc69-11e7-ac5b-9f942d292dc7/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/03dca92e-dc69-11e7-ac5b-9f942d292dc7/3',\n 'title': '2017 VGA Champ',\n 'description': '2017 VGA Champ',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://blog.twitch.tv/watch-and-co-stream-the-game-awards-this-thursday-on-twitch-3d8e34d2345d',\n },\n ],\n },\n {\n 'set_id': 'tyranny_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/0c79afdf-28ce-4b0b-9e25-4f221c30bfde/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/0c79afdf-28ce-4b0b-9e25-4f221c30bfde/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/0c79afdf-28ce-4b0b-9e25-4f221c30bfde/3',\n 'title': 'Tyranny',\n 'description': 'Tyranny',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Tyranny/details',\n },\n ],\n },\n {\n 'set_id': 'twitchconNA2023',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c90a753f-ab20-41bc-9c42-ede062485d2c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c90a753f-ab20-41bc-9c42-ede062485d2c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c90a753f-ab20-41bc-9c42-ede062485d2c/3',\n 'title': 'TwitchCon 2023 - Las Vegas',\n 'description': 'Attended TwitchCon Las Vegas 2023',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitchcon.com/en/las-vegas-2023/',\n },\n ],\n },\n {\n 'set_id': 'twitchconNA2020',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/3',\n 'title': 'TwitchCon 2020 - North America',\n 'description': 'Registered for TwitchCon North America 2020',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitchcon.com/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tcna20',\n },\n ],\n },\n {\n 'set_id': 'twitchconNA2022',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/344d429a-0b34-48e5-a84c-14a1b5772a3a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/344d429a-0b34-48e5-a84c-14a1b5772a3a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/344d429a-0b34-48e5-a84c-14a1b5772a3a/3',\n 'title': 'TwitchCon 2022 - San Diego',\n 'description': 'Attended TwitchCon San Diego 2022',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitchcon.com/san-diego-2022/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tcna22',\n },\n ],\n },\n {\n 'set_id': 'twitchconNA2019',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/569c829d-c216-4f56-a191-3db257ed657c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/569c829d-c216-4f56-a191-3db257ed657c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/569c829d-c216-4f56-a191-3db257ed657c/3',\n 'title': 'TwitchCon 2019 - San Diego',\n 'description': 'Attended TwitchCon San Diego 2019',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitchcon.com/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tcna19',\n },\n ],\n },\n {\n 'set_id': 'twitchconEU2023',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a8f2084e-46b9-4bb9-ae5e-00d594aafc64/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a8f2084e-46b9-4bb9-ae5e-00d594aafc64/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a8f2084e-46b9-4bb9-ae5e-00d594aafc64/3',\n 'title': 'TwitchCon 2023 - Paris',\n 'description': 'TwitchCon 2023 - Paris',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitchcon.com/paris-2023/?utm_source=chat_badge',\n },\n ],\n },\n {\n 'set_id': 'twitchconEU2022',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e4744003-50b7-4eb8-9b47-a7b1616a30c6/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e4744003-50b7-4eb8-9b47-a7b1616a30c6/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e4744003-50b7-4eb8-9b47-a7b1616a30c6/3',\n 'title': 'TwitchCon 2022 - Amsterdam',\n 'description': 'Attended TwitchCon Amsterdam 2022',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitchcon.com/amsterdam-2022/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tceu22',\n },\n ],\n },\n {\n 'set_id': 'twitchcon2018',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e68164e4-087d-4f62-81da-d3557efae3cb/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e68164e4-087d-4f62-81da-d3557efae3cb/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e68164e4-087d-4f62-81da-d3557efae3cb/3',\n 'title': 'TwitchCon 2018 - San Jose',\n 'description': 'Attended TwitchCon San Jose 2018',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitchcon.com/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tc18',\n },\n ],\n },\n {\n 'set_id': 'twitchconAmsterdam2020',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/3',\n 'title': 'TwitchCon 2020 - Amsterdam',\n 'description': 'Registered for TwitchCon Amsterdam 2020',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitchcon.com/amsterdam/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tcamsterdam20',\n },\n ],\n },\n {\n 'set_id': 'twitchconEU2019',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/590eee9e-f04d-474c-90e7-b304d9e74b32/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/590eee9e-f04d-474c-90e7-b304d9e74b32/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/590eee9e-f04d-474c-90e7-b304d9e74b32/3',\n 'title': 'TwitchCon 2019 - Berlin',\n 'description': 'Attended TwitchCon Berlin 2019',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://europe.twitchcon.com/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tceu19',\n },\n ],\n },\n {\n 'set_id': 'twitchbot',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/df9095f6-a8a0-4cc2-bb33-d908c0adffb8/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/df9095f6-a8a0-4cc2-bb33-d908c0adffb8/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/df9095f6-a8a0-4cc2-bb33-d908c0adffb8/3',\n 'title': 'AutoMod',\n 'description': 'AutoMod',\n 'click_action': 'visit_url',\n 'click_url': 'http://link.twitch.tv/automod_blog',\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/8dbdfef5-0901-457f-a644-afa77ba176e5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/8dbdfef5-0901-457f-a644-afa77ba176e5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/8dbdfef5-0901-457f-a644-afa77ba176e5/3',\n 'title': 'AutoMod',\n 'description': 'Badge type for messages that come from the automated moderation system',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'twitchcon2017',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/0964bed0-5c31-11e7-a90b-0739918f1d9b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/0964bed0-5c31-11e7-a90b-0739918f1d9b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/0964bed0-5c31-11e7-a90b-0739918f1d9b/3',\n 'title': 'TwitchCon 2017 - Long Beach',\n 'description': 'Attended TwitchCon Long Beach 2017',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitchcon.com/',\n },\n ],\n },\n {\n 'set_id': 'twitchcon-2024---rotterdam',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/95b10c66-775c-4652-9b86-10bd3a709422/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/95b10c66-775c-4652-9b86-10bd3a709422/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/95b10c66-775c-4652-9b86-10bd3a709422/3',\n 'title': 'TwitchCon 2024 - Rotterdam',\n 'description': 'Attended TwitchCon Rotterdam 2024',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://twitchcon.com/rotterdam-2024/?utm_source=twitch&utm_medium=chat-badge&utm_campaign=tceu24-chat-badge',\n },\n ],\n },\n {\n 'set_id': 'twitch-recap-2023',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4d9e9812-ba9b-48a6-8690-13f3f338ee65/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4d9e9812-ba9b-48a6-8690-13f3f338ee65/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4d9e9812-ba9b-48a6-8690-13f3f338ee65/3',\n 'title': 'Twitch Recap 2023',\n 'description':\n 'This user bled purple like it was their job, and was one of the most engaged members of Twitch in 2023!',\n 'click_action': 'visit_url',\n 'click_url': 'https://twitch-web.app.link/e/twitch-recap',\n },\n ],\n },\n {\n 'set_id': 'twitch-intern-2023',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e239e7e0-e373-4fdf-b95e-3469aec28485/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e239e7e0-e373-4fdf-b95e-3469aec28485/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e239e7e0-e373-4fdf-b95e-3469aec28485/3',\n 'title': 'Twitch Intern 2023',\n 'description': 'This user was an intern at Twitch for the summer of 2023',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/jobs/early-career/',\n },\n ],\n },\n {\n 'set_id': 'treasure-adventure-world_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/59810027-2988-4b0d-b88d-fc414c751305/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/59810027-2988-4b0d-b88d-fc414c751305/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/59810027-2988-4b0d-b88d-fc414c751305/3',\n 'title': 'Treasure Adventure World',\n 'description': 'Treasure Adventure World',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Treasure%20Adventure%20World/details',\n },\n ],\n },\n {\n 'set_id': 'titan-souls_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/092a7ce2-709c-434f-8df4-a6b075ef867d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/092a7ce2-709c-434f-8df4-a6b075ef867d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/092a7ce2-709c-434f-8df4-a6b075ef867d/3',\n 'title': 'Titan Souls',\n 'description': 'Titan Souls',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Titan%20Souls/details',\n },\n ],\n },\n {\n 'set_id': 'this-war-of-mine_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/6a20f814-cb2c-414e-89cc-f8dd483e1785/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/6a20f814-cb2c-414e-89cc-f8dd483e1785/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/6a20f814-cb2c-414e-89cc-f8dd483e1785/3',\n 'title': 'This War of Mine',\n 'description': 'This War of Mine',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/This%20War%20of%20Mine/details',\n },\n ],\n },\n {\n 'set_id': 'the-surge_2',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2c4d7e95-e138-4dde-a783-7956a8ecc408/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2c4d7e95-e138-4dde-a783-7956a8ecc408/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2c4d7e95-e138-4dde-a783-7956a8ecc408/3',\n 'title': 'The Surge',\n 'description': 'The Surge',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/The%20Surge/details',\n },\n ],\n },\n {\n 'set_id': 'the-surge_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c9f69d89-31c8-41aa-843b-fee956dfbe23/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c9f69d89-31c8-41aa-843b-fee956dfbe23/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c9f69d89-31c8-41aa-843b-fee956dfbe23/3',\n 'title': 'The Surge',\n 'description': 'The Surge',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/The%20Surge/details',\n },\n ],\n },\n {\n 'set_id': 'the-surge_3',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/0a8fc2d4-3125-4ccb-88db-e970dfbee189/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/0a8fc2d4-3125-4ccb-88db-e970dfbee189/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/0a8fc2d4-3125-4ccb-88db-e970dfbee189/3',\n 'title': 'The Surge',\n 'description': 'The Surge',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/The%20Surge/details',\n },\n ],\n },\n {\n 'set_id': 'the-golden-predictor-of-the-game-awards-2023',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c84c4dd7-9318-4e8b-9f01-1612d3f83dae/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c84c4dd7-9318-4e8b-9f01-1612d3f83dae/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c84c4dd7-9318-4e8b-9f01-1612d3f83dae/3',\n 'title': 'The Golden Predictor of the Game Awards 2023',\n 'description':\n \"You've predicted the entire 2023 Game Awards perfectly, here is a special gift for your work. Go ahead, show it off!\",\n 'click_action': 'visit_url',\n 'click_url':\n 'https://blog.twitch.tv/2023/11/30/the-2023-game-awards-is-live-on-twitch-december-7th/',\n },\n ],\n },\n {\n 'set_id': 'the-game-awards-2023',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/10cf46de-61e7-4a42-807a-7898408ce352/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/10cf46de-61e7-4a42-807a-7898408ce352/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/10cf46de-61e7-4a42-807a-7898408ce352/3',\n 'title': 'The Game Awards 2023',\n 'description':\n 'You’ve completed all categories of the 2023 Twitch Predicts: The Game Awards extension!',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://blog.twitch.tv/2023/11/30/the-2023-game-awards-is-live-on-twitch-december-7th/',\n },\n ],\n },\n {\n 'set_id': 'superhot_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5a06922-83b5-40cb-885f-bcffd3cd6c68/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5a06922-83b5-40cb-885f-bcffd3cd6c68/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5a06922-83b5-40cb-885f-bcffd3cd6c68/3',\n 'title': 'Superhot',\n 'description': 'Superhot',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/superhot/details',\n },\n ],\n },\n {\n 'set_id': 'strafe_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/0051508d-2d42-4e4b-a328-c86b04510ca4/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/0051508d-2d42-4e4b-a328-c86b04510ca4/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/0051508d-2d42-4e4b-a328-c86b04510ca4/3',\n 'title': 'Strafe',\n 'description': 'Strafe',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/strafe/details',\n },\n ],\n },\n {\n 'set_id': 'streamer-awards-2024',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/efc07d3d-46e4-4738-827b-a5bf3508983a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/efc07d3d-46e4-4738-827b-a5bf3508983a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/efc07d3d-46e4-4738-827b-a5bf3508983a/3',\n 'title': 'Streamer Awards 2024',\n 'description':\n \"You've completed all categories of the 2024 Twitch Predicts: The Streamer Awards extension!\",\n 'click_action': 'visit_url',\n 'click_url': 'https://thestreamerawards.com/home',\n },\n ],\n },\n {\n 'set_id': 'starbound_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e838e742-0025-4646-9772-18a87ba99358/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e838e742-0025-4646-9772-18a87ba99358/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e838e742-0025-4646-9772-18a87ba99358/3',\n 'title': 'Starbound',\n 'description': 'Starbound',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Starbound/details',\n },\n ],\n },\n {\n 'set_id': 'staff',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d97c37bd-a6f5-4c38-8f57-4e4bef88af34/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d97c37bd-a6f5-4c38-8f57-4e4bef88af34/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d97c37bd-a6f5-4c38-8f57-4e4bef88af34/3',\n 'title': 'Staff',\n 'description': 'Twitch Staff',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/jobs?ref=chat_badge',\n },\n ],\n },\n {\n 'set_id': 'samusoffer_beta',\n 'versions': [\n {\n 'id': '0',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/aa960159-a7b8-417e-83c1-035e4bc2deb5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/aa960159-a7b8-417e-83c1-035e4bc2deb5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/aa960159-a7b8-417e-83c1-035e4bc2deb5/3',\n 'title': 'beta_title1',\n 'description': 'beta_title1',\n 'click_action': 'visit_url',\n 'click_url': 'https://twitch.amazon.com/prime',\n },\n ],\n },\n {\n 'set_id': 'rplace-2023',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e33e0c67-c380-4241-828a-099c46e51c66/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e33e0c67-c380-4241-828a-099c46e51c66/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e33e0c67-c380-4241-828a-099c46e51c66/3',\n 'title': 'r/place 2023 Cake',\n 'description':\n \"A very delicious badge earned by watching Reddit's r/place 2023 event on Twitch Rivals or other participating channels.\",\n 'click_action': 'visit_url',\n 'click_url': 'https://www.reddit.com/r/place/',\n },\n ],\n },\n {\n 'set_id': 'rift_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f939686b-2892-46a4-9f0d-5f582578173e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f939686b-2892-46a4-9f0d-5f582578173e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f939686b-2892-46a4-9f0d-5f582578173e/3',\n 'title': 'RIFT',\n 'description': 'RIFT',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Rift/details',\n },\n ],\n },\n {\n 'set_id': 'raiden-v-directors-cut_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/441b50ae-a2e3-11e7-8a3e-6bff0c840878/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/441b50ae-a2e3-11e7-8a3e-6bff0c840878/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/441b50ae-a2e3-11e7-8a3e-6bff0c840878/3',\n 'title': 'Raiden V',\n 'description': 'Raiden V',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Raiden%20V/details',\n },\n ],\n },\n {\n 'set_id': 'psychonauts_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a9811799-dce3-475f-8feb-3745ad12b7ea/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a9811799-dce3-475f-8feb-3745ad12b7ea/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a9811799-dce3-475f-8feb-3745ad12b7ea/3',\n 'title': 'Psychonauts',\n 'description': 'Psychonauts',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Psychonauts/details',\n },\n ],\n },\n {\n 'set_id': 'premium',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/bbbe0db0-a598-423e-86d0-f9fb98ca1933/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/bbbe0db0-a598-423e-86d0-f9fb98ca1933/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/bbbe0db0-a598-423e-86d0-f9fb98ca1933/3',\n 'title': 'Prime Gaming',\n 'description': 'Prime Gaming',\n 'click_action': 'visit_url',\n 'click_url': 'https://gaming.amazon.com',\n },\n ],\n },\n {\n 'set_id': 'overwatch-league-insider_2019B',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5860811-d714-4413-9433-d6b1c9fc803c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5860811-d714-4413-9433-d6b1c9fc803c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5860811-d714-4413-9433-d6b1c9fc803c/3',\n 'title': 'OWL All-Access Pass 2019',\n 'description': 'OWL All-Access Pass 2019',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/overwatchleague',\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/75f05d4b-3042-415c-8b0b-e87620a24daf/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/75f05d4b-3042-415c-8b0b-e87620a24daf/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/75f05d4b-3042-415c-8b0b-e87620a24daf/3',\n 'title': 'OWL All-Access Pass 2019',\n 'description': 'OWL All-Access Pass 2019',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/overwatchleague',\n },\n {\n 'id': '3',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/765a0dcf-2a94-43ff-9b9c-ef6c209b90cd/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/765a0dcf-2a94-43ff-9b9c-ef6c209b90cd/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/765a0dcf-2a94-43ff-9b9c-ef6c209b90cd/3',\n 'title': 'OWL All-Access Pass 2019',\n 'description': 'OWL All-Access Pass 2019',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/overwatchleague',\n },\n {\n 'id': '4',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a8ae0ccd-783d-460d-93ee-57c485c558a6/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a8ae0ccd-783d-460d-93ee-57c485c558a6/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a8ae0ccd-783d-460d-93ee-57c485c558a6/3',\n 'title': 'OWL All-Access Pass 2019',\n 'description': 'OWL All-Access Pass 2019',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/overwatchleague',\n },\n {\n 'id': '5',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/be87fd6d-1560-4e33-9ba4-2401b58d901f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/be87fd6d-1560-4e33-9ba4-2401b58d901f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/be87fd6d-1560-4e33-9ba4-2401b58d901f/3',\n 'title': 'OWL All-Access Pass 2019',\n 'description': 'OWL All-Access Pass 2019',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/overwatchleague',\n },\n ],\n },\n {\n 'set_id': 'partner',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d12a2e27-16f6-41d0-ab77-b780518f00a3/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d12a2e27-16f6-41d0-ab77-b780518f00a3/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d12a2e27-16f6-41d0-ab77-b780518f00a3/3',\n 'title': 'Verified',\n 'description': 'Verified',\n 'click_action': 'visit_url',\n 'click_url': 'https://blog.twitch.tv/2017/04/24/the-verified-badge-is-here-13381bc05735',\n },\n ],\n },\n {\n 'set_id': 'overwatch-league-insider_2019A',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca980da1-3639-48a6-95a3-a03b002eb0e5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca980da1-3639-48a6-95a3-a03b002eb0e5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca980da1-3639-48a6-95a3-a03b002eb0e5/3',\n 'title': 'OWL All-Access Pass 2019',\n 'description': 'OWL All-Access Pass 2019',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/overwatchleague',\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ab7fa7a7-c2d9-403f-9f33-215b29b43ce4/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ab7fa7a7-c2d9-403f-9f33-215b29b43ce4/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ab7fa7a7-c2d9-403f-9f33-215b29b43ce4/3',\n 'title': 'OWL All-Access Pass 2019',\n 'description': 'OWL All-Access Pass 2019',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/overwatchleague',\n },\n ],\n },\n {\n 'set_id': 'okhlos_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/dc088bd6-8965-4907-a1a2-c0ba83874a7d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/dc088bd6-8965-4907-a1a2-c0ba83874a7d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/dc088bd6-8965-4907-a1a2-c0ba83874a7d/3',\n 'title': 'Okhlos',\n 'description': 'Okhlos',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Okhlos/details',\n },\n ],\n },\n {\n 'set_id': 'overwatch-league-insider_2018B',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/34ec1979-d9bb-4706-ad15-464de814a79d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/34ec1979-d9bb-4706-ad15-464de814a79d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/34ec1979-d9bb-4706-ad15-464de814a79d/3',\n 'title': 'OWL All-Access Pass 2018',\n 'description': 'OWL All-Access Pass 2018',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/overwatchleague',\n },\n ],\n },\n {\n 'set_id': 'overwatch-league-insider_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/51e9e0aa-12e3-48ce-b961-421af0787dad/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/51e9e0aa-12e3-48ce-b961-421af0787dad/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/51e9e0aa-12e3-48ce-b961-421af0787dad/3',\n 'title': 'OWL All-Access Pass 2018',\n 'description': 'OWL All-Access Pass 2018',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/overwatchleague',\n },\n ],\n },\n {\n 'set_id': 'kingdom-new-lands_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e3c2a67e-ef80-4fe3-ae41-b933cd11788a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e3c2a67e-ef80-4fe3-ae41-b933cd11788a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e3c2a67e-ef80-4fe3-ae41-b933cd11788a/3',\n 'title': 'Kingdom: New Lands',\n 'description': 'Kingdom: New Lands',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Kingdom:%20New%20Lands/details',\n },\n ],\n },\n {\n 'set_id': 'jackbox-party-pack_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/0f964fc1-f439-485f-a3c0-905294ee70e8/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/0f964fc1-f439-485f-a3c0-905294ee70e8/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/0f964fc1-f439-485f-a3c0-905294ee70e8/3',\n 'title': 'Jackbox Party Pack',\n 'description': 'Jackbox Party Pack',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/The%20Jackbox%20Party%20Pack/details',\n },\n ],\n },\n {\n 'set_id': 'innerspace_2',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc7d6018-657a-40e4-9246-0acdc85886d1/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc7d6018-657a-40e4-9246-0acdc85886d1/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc7d6018-657a-40e4-9246-0acdc85886d1/3',\n 'title': 'Innerspace',\n 'description': 'Innerspace',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Innerspace/details',\n },\n ],\n },\n {\n 'set_id': 'innerspace_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/97532ccd-6a07-42b5-aecf-3458b6b3ebea/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/97532ccd-6a07-42b5-aecf-3458b6b3ebea/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/97532ccd-6a07-42b5-aecf-3458b6b3ebea/3',\n 'title': 'Innerspace',\n 'description': 'Innerspace',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Innerspace/details',\n },\n ],\n },\n {\n 'set_id': 'hype-train',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fae4086c-3190-44d4-83c8-8ef0cbe1a515/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fae4086c-3190-44d4-83c8-8ef0cbe1a515/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fae4086c-3190-44d4-83c8-8ef0cbe1a515/3',\n 'title': 'Current Hype Train Conductor',\n 'description': 'Top supporter during the most recent hype train',\n 'click_action': 'visit_url',\n 'click_url': 'https://help.twitch.tv/s/article/hype-train-guide',\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9c8d038a-3a29-45ea-96d4-5031fb1a7a81/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9c8d038a-3a29-45ea-96d4-5031fb1a7a81/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9c8d038a-3a29-45ea-96d4-5031fb1a7a81/3',\n 'title': 'Former Hype Train Conductor',\n 'description': 'Top supporter during prior hype trains',\n 'click_action': 'visit_url',\n 'click_url': 'https://help.twitch.tv/s/article/hype-train-guide',\n },\n ],\n },\n {\n 'set_id': 'hello_neighbor_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/030cab2c-5d14-11e7-8d91-43a5a4306286/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/030cab2c-5d14-11e7-8d91-43a5a4306286/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/030cab2c-5d14-11e7-8d91-43a5a4306286/3',\n 'title': 'Hello Neighbor',\n 'description': 'Hello Neighbor',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Hello%20Neighbor/details',\n },\n ],\n },\n {\n 'set_id': 'gold-pixel-heart',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/1687873b-cf38-412c-aad3-f9a4ce17f8b6/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/1687873b-cf38-412c-aad3-f9a4ce17f8b6/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/1687873b-cf38-412c-aad3-f9a4ce17f8b6/3',\n 'title': 'Gold Pixel Heart',\n 'description':\n 'Thank you for donating via the Twitch Charity tool during Twitch Together for Good 2023!',\n 'click_action': 'visit_url',\n 'click_url': 'https://help.twitch.tv/s/article/twitch-charity',\n },\n ],\n },\n {\n 'set_id': 'heavy-bullets_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc83b76b-f8b2-4519-9f61-6faf84eef4cd/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc83b76b-f8b2-4519-9f61-6faf84eef4cd/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc83b76b-f8b2-4519-9f61-6faf84eef4cd/3',\n 'title': 'Heavy Bullets',\n 'description': 'Heavy Bullets',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Heavy%20Bullets/details',\n },\n ],\n },\n {\n 'set_id': 'glitchcon2020',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/1d4b03b9-51ea-42c9-8f29-698e3c85be3d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/1d4b03b9-51ea-42c9-8f29-698e3c85be3d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/1d4b03b9-51ea-42c9-8f29-698e3c85be3d/3',\n 'title': 'GlitchCon 2020',\n 'description': 'Earned for Watching Glitchcon 2020',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitchcon.com/',\n },\n ],\n },\n {\n 'set_id': 'glhf-pledge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3158e758-3cb4-43c5-94b3-7639810451c5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3158e758-3cb4-43c5-94b3-7639810451c5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3158e758-3cb4-43c5-94b3-7639810451c5/3',\n 'title': 'GLHF Pledge',\n 'description': 'Signed the GLHF pledge in support for inclusive gaming communities',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.anykey.org/pledge',\n },\n ],\n },\n {\n 'set_id': 'getting-over-it_2',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/bb620b42-e0e1-4373-928e-d4a732f99ccb/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/bb620b42-e0e1-4373-928e-d4a732f99ccb/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/bb620b42-e0e1-4373-928e-d4a732f99ccb/3',\n 'title': 'Getting Over It',\n 'description': 'Getting Over It',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Getting%20Over%20It/details',\n },\n ],\n },\n {\n 'set_id': 'getting-over-it_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/8d4e178c-81ec-4c71-af68-745b40733984/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/8d4e178c-81ec-4c71-af68-745b40733984/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/8d4e178c-81ec-4c71-af68-745b40733984/3',\n 'title': 'Getting Over It',\n 'description': 'Getting Over It',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Getting%20Over%20It/details',\n },\n ],\n },\n {\n 'set_id': 'frozen-synapse_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d4bd464d-55ea-4238-a11d-744f034e2375/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d4bd464d-55ea-4238-a11d-744f034e2375/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d4bd464d-55ea-4238-a11d-744f034e2375/3',\n 'title': 'Frozen Synapse',\n 'description': 'Frozen Synapse',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Frozen%20Synapse/details',\n },\n ],\n },\n {\n 'set_id': 'founder',\n 'versions': [\n {\n 'id': '0',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/511b78a9-ab37-472f-9569-457753bbe7d3/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/511b78a9-ab37-472f-9569-457753bbe7d3/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/511b78a9-ab37-472f-9569-457753bbe7d3/3',\n 'title': 'Founder',\n 'description': 'Founder',\n 'click_action': 'visit_url',\n 'click_url': 'https://help.twitch.tv/s/article/founders-badge',\n },\n ],\n },\n {\n 'set_id': 'frozen-cortext_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2015f087-01b5-4a01-a2bb-ecb4d6be5240/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2015f087-01b5-4a01-a2bb-ecb4d6be5240/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2015f087-01b5-4a01-a2bb-ecb4d6be5240/3',\n 'title': 'Frozen Cortext',\n 'description': 'Frozen Cortext',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Frozen%20Cortex/details',\n },\n ],\n },\n {\n 'set_id': 'firewatch_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/b6bf4889-4902-49e2-9658-c0132e71c9c4/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/b6bf4889-4902-49e2-9658-c0132e71c9c4/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/b6bf4889-4902-49e2-9658-c0132e71c9c4/3',\n 'title': 'Firewatch',\n 'description': 'Firewatch',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Firewatch/details',\n },\n ],\n },\n {\n 'set_id': 'enter-the-gungeon_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/53c9af0b-84f6-4f9d-8c80-4bc51321a37d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/53c9af0b-84f6-4f9d-8c80-4bc51321a37d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/53c9af0b-84f6-4f9d-8c80-4bc51321a37d/3',\n 'title': 'Enter The Gungeon',\n 'description': 'Enter The Gungeon',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Enter%20the%20Gungeon/details',\n },\n ],\n },\n {\n 'set_id': 'duelyst_5',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/290419b6-484a-47da-ad14-a99d6581f758/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/290419b6-484a-47da-ad14-a99d6581f758/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/290419b6-484a-47da-ad14-a99d6581f758/3',\n 'title': 'Duelyst',\n 'description': 'Duelyst',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n 'set_id': 'duelyst_6',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5e54a4b-0bf1-463a-874a-38524579aed0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5e54a4b-0bf1-463a-874a-38524579aed0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5e54a4b-0bf1-463a-874a-38524579aed0/3',\n 'title': 'Duelyst',\n 'description': 'Duelyst',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n 'set_id': 'duelyst_7',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/cf508179-3183-4987-97e0-56ca44babb9f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/cf508179-3183-4987-97e0-56ca44babb9f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/cf508179-3183-4987-97e0-56ca44babb9f/3',\n 'title': 'Duelyst',\n 'description': 'Duelyst',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n 'set_id': 'duelyst_2',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/1938acd3-2d18-471d-b1af-44f2047c033c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/1938acd3-2d18-471d-b1af-44f2047c033c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/1938acd3-2d18-471d-b1af-44f2047c033c/3',\n 'title': 'Duelyst',\n 'description': 'Duelyst',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n 'set_id': 'duelyst_4',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/39e717a8-00bc-49cc-b6d4-3ea91ee1be25/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/39e717a8-00bc-49cc-b6d4-3ea91ee1be25/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/39e717a8-00bc-49cc-b6d4-3ea91ee1be25/3',\n 'title': 'Duelyst',\n 'description': 'Duelyst',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n 'set_id': 'duelyst_3',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/344c07fc-1632-47c6-9785-e62562a6b760/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/344c07fc-1632-47c6-9785-e62562a6b760/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/344c07fc-1632-47c6-9785-e62562a6b760/3',\n 'title': 'Duelyst',\n 'description': 'Duelyst',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n 'set_id': 'duelyst_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/7d9c12f4-a2ac-4e88-8026-d1a330468282/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/7d9c12f4-a2ac-4e88-8026-d1a330468282/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/7d9c12f4-a2ac-4e88-8026-d1a330468282/3',\n 'title': 'Duelyst',\n 'description': 'Duelyst',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n 'set_id': 'devilian_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3cb92b57-1eef-451c-ac23-4d748128b2c5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3cb92b57-1eef-451c-ac23-4d748128b2c5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3cb92b57-1eef-451c-ac23-4d748128b2c5/3',\n 'title': 'Devilian',\n 'description': 'Devilian',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Devilian/details',\n },\n ],\n },\n {\n 'set_id': 'devil-may-cry-hd_4',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/af836b94-8ffd-4c0a-b7d8-a92fad5e3015/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/af836b94-8ffd-4c0a-b7d8-a92fad5e3015/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/af836b94-8ffd-4c0a-b7d8-a92fad5e3015/3',\n 'title': 'Devil May Cry HD Collection',\n 'description': 'Devil May Cry HD Collection',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitch.tv/directory/game/Devil%20May%20Cry%20HD%20Collection/details',\n },\n ],\n },\n {\n 'set_id': 'devil-may-cry-hd_3',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/df84c5bf-8d66-48e2-b9fb-c014cc9b3945/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/df84c5bf-8d66-48e2-b9fb-c014cc9b3945/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/df84c5bf-8d66-48e2-b9fb-c014cc9b3945/3',\n 'title': 'Devil May Cry HD Collection',\n 'description': 'Devil May Cry HD Collection',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitch.tv/directory/game/Devil%20May%20Cry%20HD%20Collection/details',\n },\n ],\n },\n {\n 'set_id': 'devil-may-cry-hd_2',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/408548fe-aa74-4d53-b5e9-960103d9b865/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/408548fe-aa74-4d53-b5e9-960103d9b865/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/408548fe-aa74-4d53-b5e9-960103d9b865/3',\n 'title': 'Devil May Cry HD Collection',\n 'description': 'Devil May Cry HD Collection',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitch.tv/directory/game/Devil%20May%20Cry%20HD%20Collection/details',\n },\n ],\n },\n {\n 'set_id': 'devil-may-cry-hd_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/633877d4-a91c-4c36-b75b-803f82b1352f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/633877d4-a91c-4c36-b75b-803f82b1352f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/633877d4-a91c-4c36-b75b-803f82b1352f/3',\n 'title': 'Devil May Cry HD Collection',\n 'description': 'Devil May Cry HD Collection',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitch.tv/directory/game/Devil%20May%20Cry%20HD%20Collection/details',\n },\n ],\n },\n {\n 'set_id': 'deceit_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/b14fef48-4ff9-4063-abf6-579489234fe9/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/b14fef48-4ff9-4063-abf6-579489234fe9/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/b14fef48-4ff9-4063-abf6-579489234fe9/3',\n 'title': 'Deceit',\n 'description': 'Deceit',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Deceit/details',\n },\n ],\n },\n {\n 'set_id': 'darkest-dungeon_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/52a98ddd-cc79-46a8-9fe3-30f8c719bc2d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/52a98ddd-cc79-46a8-9fe3-30f8c719bc2d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/52a98ddd-cc79-46a8-9fe3-30f8c719bc2d/3',\n 'title': 'Darkest Dungeon',\n 'description': 'Darkest Dungeon',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Darkest%20Dungeon/details',\n },\n ],\n },\n {\n 'set_id': 'cuphead_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4384659a-a2e3-11e7-a564-87f6b1288bab/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4384659a-a2e3-11e7-a564-87f6b1288bab/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4384659a-a2e3-11e7-a564-87f6b1288bab/3',\n 'title': 'Cuphead',\n 'description': 'Cuphead',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Cuphead/details',\n },\n ],\n },\n {\n 'set_id': 'clip-champ',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f38976e0-ffc9-11e7-86d6-7f98b26a9d79/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f38976e0-ffc9-11e7-86d6-7f98b26a9d79/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f38976e0-ffc9-11e7-86d6-7f98b26a9d79/3',\n 'title': 'Power Clipper',\n 'description': 'Power Clipper',\n 'click_action': 'visit_url',\n 'click_url': 'https://help.twitch.tv/customer/portal/articles/2918323-clip-champs-guide',\n },\n ],\n },\n {\n 'set_id': 'broken-age_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/56885ed2-9a09-4c8e-8131-3eb9ec15af94/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/56885ed2-9a09-4c8e-8131-3eb9ec15af94/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/56885ed2-9a09-4c8e-8131-3eb9ec15af94/3',\n 'title': 'Broken Age',\n 'description': 'Broken Age',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Broken%20Age/details',\n },\n ],\n },\n {\n 'set_id': 'bubsy-the-woolies_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c8129382-1f4e-4d15-a8d2-48bdddba9b81/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c8129382-1f4e-4d15-a8d2-48bdddba9b81/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c8129382-1f4e-4d15-a8d2-48bdddba9b81/3',\n 'title': 'Bubsy: The Woolies Strike Back',\n 'description': 'Bubsy: The Woolies Strike Back',\n 'click_action': 'visit_url',\n 'click_url':\n 'https://www.twitch.tv/directory/game/Bubsy:%20The%20Woolies%20Strike%20Back/details',\n },\n ],\n },\n {\n 'set_id': 'bits-leader',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/8bedf8c3-7a6d-4df2-b62f-791b96a5dd31/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/8bedf8c3-7a6d-4df2-b62f-791b96a5dd31/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/8bedf8c3-7a6d-4df2-b62f-791b96a5dd31/3',\n 'title': 'Bits Leader 1',\n 'description': 'Ranked as a top cheerer on this channel',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f04baac7-9141-4456-a0e7-6301bcc34138/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f04baac7-9141-4456-a0e7-6301bcc34138/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f04baac7-9141-4456-a0e7-6301bcc34138/3',\n 'title': 'Bits Leader 2',\n 'description': 'Ranked as a top cheerer on this channel',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '3',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f1d2aab6-b647-47af-965b-84909cf303aa/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f1d2aab6-b647-47af-965b-84909cf303aa/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f1d2aab6-b647-47af-965b-84909cf303aa/3',\n 'title': 'Bits Leader 3',\n 'description': 'Ranked as a top cheerer on this channel',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n ],\n },\n {\n 'set_id': 'brawlhalla_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/bf6d6579-ab02-4f0a-9f64-a51c37040858/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/bf6d6579-ab02-4f0a-9f64-a51c37040858/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/bf6d6579-ab02-4f0a-9f64-a51c37040858/3',\n 'title': 'Brawlhalla',\n 'description': 'Brawlhalla',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Brawlhalla/details',\n },\n ],\n },\n {\n 'set_id': 'bits',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/73b5c3fb-24f9-4a82-a852-2f475b59411c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/73b5c3fb-24f9-4a82-a852-2f475b59411c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/73b5c3fb-24f9-4a82-a852-2f475b59411c/3',\n 'title': 'cheer 1',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '100',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/09d93036-e7ce-431c-9a9e-7044297133f2/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/09d93036-e7ce-431c-9a9e-7044297133f2/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/09d93036-e7ce-431c-9a9e-7044297133f2/3',\n 'title': 'cheer 100',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '1000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/0d85a29e-79ad-4c63-a285-3acd2c66f2ba/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/0d85a29e-79ad-4c63-a285-3acd2c66f2ba/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/0d85a29e-79ad-4c63-a285-3acd2c66f2ba/3',\n 'title': 'cheer 1000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '5000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/57cd97fc-3e9e-4c6d-9d41-60147137234e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/57cd97fc-3e9e-4c6d-9d41-60147137234e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/57cd97fc-3e9e-4c6d-9d41-60147137234e/3',\n 'title': 'cheer 5000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '10000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/68af213b-a771-4124-b6e3-9bb6d98aa732/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/68af213b-a771-4124-b6e3-9bb6d98aa732/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/68af213b-a771-4124-b6e3-9bb6d98aa732/3',\n 'title': 'cheer 10000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '25000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/64ca5920-c663-4bd8-bfb1-751b4caea2dd/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/64ca5920-c663-4bd8-bfb1-751b4caea2dd/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/64ca5920-c663-4bd8-bfb1-751b4caea2dd/3',\n 'title': 'cheer 25000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '50000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/62310ba7-9916-4235-9eba-40110d67f85d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/62310ba7-9916-4235-9eba-40110d67f85d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/62310ba7-9916-4235-9eba-40110d67f85d/3',\n 'title': 'cheer 50000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '75000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ce491fa4-b24f-4f3b-b6ff-44b080202792/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ce491fa4-b24f-4f3b-b6ff-44b080202792/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ce491fa4-b24f-4f3b-b6ff-44b080202792/3',\n 'title': 'cheer 75000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '100000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/96f0540f-aa63-49e1-a8b3-259ece3bd098/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/96f0540f-aa63-49e1-a8b3-259ece3bd098/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/96f0540f-aa63-49e1-a8b3-259ece3bd098/3',\n 'title': 'cheer 100000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '200000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4a0b90c4-e4ef-407f-84fe-36b14aebdbb6/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4a0b90c4-e4ef-407f-84fe-36b14aebdbb6/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4a0b90c4-e4ef-407f-84fe-36b14aebdbb6/3',\n 'title': 'cheer 200000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '300000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ac13372d-2e94-41d1-ae11-ecd677f69bb6/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ac13372d-2e94-41d1-ae11-ecd677f69bb6/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ac13372d-2e94-41d1-ae11-ecd677f69bb6/3',\n 'title': 'cheer 300000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '400000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a8f393af-76e6-4aa2-9dd0-7dcc1c34f036/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a8f393af-76e6-4aa2-9dd0-7dcc1c34f036/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a8f393af-76e6-4aa2-9dd0-7dcc1c34f036/3',\n 'title': 'cheer 400000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '500000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f6932b57-6a6e-4062-a770-dfbd9f4302e5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f6932b57-6a6e-4062-a770-dfbd9f4302e5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f6932b57-6a6e-4062-a770-dfbd9f4302e5/3',\n 'title': 'cheer 500000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '600000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4d908059-f91c-4aef-9acb-634434f4c32e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4d908059-f91c-4aef-9acb-634434f4c32e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4d908059-f91c-4aef-9acb-634434f4c32e/3',\n 'title': 'cheer 600000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '700000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a1d2a824-f216-4b9f-9642-3de8ed370957/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a1d2a824-f216-4b9f-9642-3de8ed370957/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a1d2a824-f216-4b9f-9642-3de8ed370957/3',\n 'title': 'cheer 700000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '800000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5ec2ee3e-5633-4c2a-8e77-77473fe409e6/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5ec2ee3e-5633-4c2a-8e77-77473fe409e6/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5ec2ee3e-5633-4c2a-8e77-77473fe409e6/3',\n 'title': 'cheer 800000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '900000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/088c58c6-7c38-45ba-8f73-63ef24189b84/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/088c58c6-7c38-45ba-8f73-63ef24189b84/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/088c58c6-7c38-45ba-8f73-63ef24189b84/3',\n 'title': 'cheer 900000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '1000000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/494d1c8e-c3b2-4d88-8528-baff57c9bd3f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/494d1c8e-c3b2-4d88-8528-baff57c9bd3f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/494d1c8e-c3b2-4d88-8528-baff57c9bd3f/3',\n 'title': 'cheer 1000000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '1250000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ce217209-4615-4bf8-81e3-57d06b8b9dc7/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ce217209-4615-4bf8-81e3-57d06b8b9dc7/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ce217209-4615-4bf8-81e3-57d06b8b9dc7/3',\n 'title': 'cheer 1250000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '1500000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4eba5b4-17a7-40a1-a668-bc1972c1e24d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4eba5b4-17a7-40a1-a668-bc1972c1e24d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4eba5b4-17a7-40a1-a668-bc1972c1e24d/3',\n 'title': 'cheer 1500000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '1750000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/183f1fd8-aaf4-450c-a413-e53f839f0f82/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/183f1fd8-aaf4-450c-a413-e53f839f0f82/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/183f1fd8-aaf4-450c-a413-e53f839f0f82/3',\n 'title': 'cheer 1750000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '2000000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/7ea89c53-1a3b-45f9-9223-d97ae19089f2/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/7ea89c53-1a3b-45f9-9223-d97ae19089f2/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/7ea89c53-1a3b-45f9-9223-d97ae19089f2/3',\n 'title': 'cheer 2000000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '2500000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/cf061daf-d571-4811-bcc2-c55c8792bc8f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/cf061daf-d571-4811-bcc2-c55c8792bc8f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/cf061daf-d571-4811-bcc2-c55c8792bc8f/3',\n 'title': 'cheer 2500000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '3000000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5671797f-5e9f-478c-a2b5-eb086c8928cf/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5671797f-5e9f-478c-a2b5-eb086c8928cf/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5671797f-5e9f-478c-a2b5-eb086c8928cf/3',\n 'title': 'cheer 3000000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '3500000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c3d218f5-1e45-419d-9c11-033a1ae54d3a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c3d218f5-1e45-419d-9c11-033a1ae54d3a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c3d218f5-1e45-419d-9c11-033a1ae54d3a/3',\n 'title': 'cheer 3500000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '4000000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/79fe642a-87f3-40b1-892e-a341747b6e08/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/79fe642a-87f3-40b1-892e-a341747b6e08/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/79fe642a-87f3-40b1-892e-a341747b6e08/3',\n 'title': 'cheer 4000000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '4500000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/736d4156-ac67-4256-a224-3e6e915436db/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/736d4156-ac67-4256-a224-3e6e915436db/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/736d4156-ac67-4256-a224-3e6e915436db/3',\n 'title': 'cheer 4500000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n {\n 'id': '5000000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3f085f85-8d15-4a03-a829-17fca7bf1bc2/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3f085f85-8d15-4a03-a829-17fca7bf1bc2/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3f085f85-8d15-4a03-a829-17fca7bf1bc2/3',\n 'title': 'cheer 5000000',\n 'description': ' ',\n 'click_action': 'visit_url',\n 'click_url': 'https://bits.twitch.tv',\n },\n ],\n },\n {\n 'set_id': 'bits-charity',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a539dc18-ae19-49b0-98c4-8391a594332b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a539dc18-ae19-49b0-98c4-8391a594332b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a539dc18-ae19-49b0-98c4-8391a594332b/3',\n 'title': 'Direct Relief - Charity 2018',\n 'description': 'Supported their favorite streamer during the 2018 Blizzard of Bits',\n 'click_action': 'visit_url',\n 'click_url': 'https://link.twitch.tv/blizzardofbits',\n },\n ],\n },\n {\n 'set_id': 'battlechefbrigade_3',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/107ebb20-4fcd-449a-9931-cd3f81b84c70/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/107ebb20-4fcd-449a-9931-cd3f81b84c70/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/107ebb20-4fcd-449a-9931-cd3f81b84c70/3',\n 'title': 'Battle Chef Brigade',\n 'description': 'Battle Chef Brigade',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Battle%20Chef%20Brigade/details',\n },\n ],\n },\n {\n 'set_id': 'battlerite_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/484ebda9-f7fa-4c67-b12b-c80582f3cc61/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/484ebda9-f7fa-4c67-b12b-c80582f3cc61/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/484ebda9-f7fa-4c67-b12b-c80582f3cc61/3',\n 'title': 'Battlerite',\n 'description': 'Battlerite',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Battlerite/details',\n },\n ],\n },\n {\n 'set_id': 'battlechefbrigade_2',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ef1e96e8-a0f9-40b6-87af-2977d3c004bb/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ef1e96e8-a0f9-40b6-87af-2977d3c004bb/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ef1e96e8-a0f9-40b6-87af-2977d3c004bb/3',\n 'title': 'Battle Chef Brigade',\n 'description': 'Battle Chef Brigade',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Battle%20Chef%20Brigade/details',\n },\n ],\n },\n {\n 'set_id': 'battlechefbrigade_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/24e32e67-33cd-4227-ad96-f0a7fc836107/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/24e32e67-33cd-4227-ad96-f0a7fc836107/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/24e32e67-33cd-4227-ad96-f0a7fc836107/3',\n 'title': 'Battle Chef Brigade',\n 'description': 'Battle Chef Brigade',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Battle%20Chef%20Brigade/details',\n },\n ],\n },\n {\n 'set_id': 'axiom-verge_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f209b747-45ee-42f6-8baf-ea7542633d10/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f209b747-45ee-42f6-8baf-ea7542633d10/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f209b747-45ee-42f6-8baf-ea7542633d10/3',\n 'title': 'Axiom Verge',\n 'description': 'Axiom Verge',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Axiom%20Verge/details',\n },\n ],\n },\n {\n 'set_id': 'anomaly-2_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d1d1ad54-40a6-492b-882e-dcbdce5fa81e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d1d1ad54-40a6-492b-882e-dcbdce5fa81e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d1d1ad54-40a6-492b-882e-dcbdce5fa81e/3',\n 'title': 'Anomaly 2',\n 'description': 'Anomaly 2',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Anomaly%202/details',\n },\n ],\n },\n {\n 'set_id': 'anomaly-warzone-earth_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/858be873-fb1f-47e5-ad34-657f40d3d156/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/858be873-fb1f-47e5-ad34-657f40d3d156/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/858be873-fb1f-47e5-ad34-657f40d3d156/3',\n 'title': 'Anomaly Warzone Earth',\n 'description': 'Anomaly Warzone Earth',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/Anomaly:%20Warzone%20Earth/details',\n },\n ],\n },\n {\n 'set_id': 'ambassador',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2cbc339f-34f4-488a-ae51-efdf74f4e323/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2cbc339f-34f4-488a-ae51-efdf74f4e323/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2cbc339f-34f4-488a-ae51-efdf74f4e323/3',\n 'title': 'Twitch Ambassador',\n 'description': 'Twitch Ambassador',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/team/ambassadors',\n },\n ],\n },\n {\n 'set_id': 'H1Z1_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc71386c-86cd-11e7-a55d-43f591dc0c71/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc71386c-86cd-11e7-a55d-43f591dc0c71/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc71386c-86cd-11e7-a55d-43f591dc0c71/3',\n 'title': 'H1Z1',\n 'description': 'H1Z1',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/H1Z1/details',\n },\n ],\n },\n {\n 'set_id': '60-seconds_3',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f4306617-0f96-476f-994e-5304f81bcc6e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f4306617-0f96-476f-994e-5304f81bcc6e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f4306617-0f96-476f-994e-5304f81bcc6e/3',\n 'title': '60 Seconds!',\n 'description': '60 Seconds!',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/60%20Seconds!/details',\n },\n ],\n },\n {\n 'set_id': '60-seconds_2',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/64513f7d-21dd-4a05-a699-d73761945cf9/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/64513f7d-21dd-4a05-a699-d73761945cf9/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/64513f7d-21dd-4a05-a699-d73761945cf9/3',\n 'title': '60 Seconds!',\n 'description': '60 Seconds!',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/60%20Seconds!/details',\n },\n ],\n },\n {\n 'set_id': '60-seconds_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/1e7252f9-7e80-4d3d-ae42-319f030cca99/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/1e7252f9-7e80-4d3d-ae42-319f030cca99/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/1e7252f9-7e80-4d3d-ae42-319f030cca99/3',\n 'title': '60 Seconds!',\n 'description': '60 Seconds!',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/60%20Seconds!/details',\n },\n ],\n },\n {\n 'set_id': '1979-revolution_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/7833bb6e-d20d-48ff-a58d-67fe827a4f84/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/7833bb6e-d20d-48ff-a58d-67fe827a4f84/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/7833bb6e-d20d-48ff-a58d-67fe827a4f84/3',\n 'title': '1979 Revolution',\n 'description': '1979 Revolution',\n 'click_action': 'visit_url',\n 'click_url': 'https://www.twitch.tv/directory/game/1979%20Revolution/details',\n },\n ],\n },\n {\n 'set_id': '10-years-as-twitch-staff',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e48bfab8-6697-4c5b-84df-e64fb0150701/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e48bfab8-6697-4c5b-84df-e64fb0150701/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e48bfab8-6697-4c5b-84df-e64fb0150701/3',\n 'title': '10 years as Twitch Staff',\n 'description': 'Celebrating 10 years as Twitch Staff!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': '15-years-as-twitch-staff',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/523802ec-086b-4dec-b441-90e28b0806d8/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/523802ec-086b-4dec-b441-90e28b0806d8/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/523802ec-086b-4dec-b441-90e28b0806d8/3',\n 'title': '15 years as Twitch Staff',\n 'description': 'Celebrating 15 years as Twitch Staff!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': '5-years-as-twitch-staff',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d53671d0-0ce0-4706-905f-7fe8b122a27a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d53671d0-0ce0-4706-905f-7fe8b122a27a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d53671d0-0ce0-4706-905f-7fe8b122a27a/3',\n 'title': '5 years as Twitch Staff',\n 'description': 'Celebrating 5 years as Twitch Staff!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'aang',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/dfc8243b-037c-4e5e-a8f3-87ad1f01850d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/dfc8243b-037c-4e5e-a8f3-87ad1f01850d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/dfc8243b-037c-4e5e-a8f3-87ad1f01850d/3',\n 'title': 'Aang',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to an Avatar Legends: The Fighting Game streamer!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'admin',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9ef7e029-4cdf-4d4d-a0d5-e2b3fb2583fe/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9ef7e029-4cdf-4d4d-a0d5-e2b3fb2583fe/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9ef7e029-4cdf-4d4d-a0d5-e2b3fb2583fe/3',\n 'title': 'Admin',\n 'description': 'Twitch Admin',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'alone',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/10ba11a2-0171-42b6-9bba-8f2f14248172/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/10ba11a2-0171-42b6-9bba-8f2f14248172/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/10ba11a2-0171-42b6-9bba-8f2f14248172/3',\n 'title': 'Alone',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Little Nightmares III category during launch.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'anonymous-cheerer',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca3db7f7-18f5-487e-a329-cd0b538ee979/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca3db7f7-18f5-487e-a329-cd0b538ee979/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca3db7f7-18f5-487e-a329-cd0b538ee979/3',\n 'title': 'Anonymous Cheerer',\n 'description': 'Anonymous Cheerer',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'arc-raiders-launch-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d4aa495f-a0e4-4ab4-b3eb-7c2ea573b03f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d4aa495f-a0e4-4ab4-b3eb-7c2ea573b03f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d4aa495f-a0e4-4ab4-b3eb-7c2ea573b03f/3',\n 'title': 'Arc Raiders Launch 2025',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to an Arc Raiders streamer during launch!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'arcane-season-2-premiere',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/1d833bde-edc7-4d23-b7b6-ad5a13296675/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/1d833bde-edc7-4d23-b7b6-ad5a13296675/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/1d833bde-edc7-4d23-b7b6-ad5a13296675/3',\n 'title': 'Arcane Season 2 Premiere',\n 'description': 'This badge was earned by watching the premiere of Arcane Season 2!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'artist-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4300a897-03dc-4e83-8c0e-c332fee7057f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4300a897-03dc-4e83-8c0e-c332fee7057f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4300a897-03dc-4e83-8c0e-c332fee7057f/3',\n 'title': 'Artist',\n 'description': 'Artist on this Channel',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'battlefield-6',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d7750af0-caca-47c5-b207-1af9be69ce1b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d7750af0-caca-47c5-b207-1af9be69ce1b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d7750af0-caca-47c5-b207-1af9be69ce1b/3',\n 'title': 'Battlefield 6',\n 'description': 'This badge was earned by subscribing to a streamer playing Battlefield 6.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'bingbonglove',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4ffa02fc-ae89-4557-95ca-b9fc65909bd0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4ffa02fc-ae89-4557-95ca-b9fc65909bd0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4ffa02fc-ae89-4557-95ca-b9fc65909bd0/3',\n 'title': 'BingBongLove',\n 'description':\n 'This badge was earned by tuning in to a PEAK stream for 15 minutes from February 13 - 28, 2026!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'black-ops-7-global-launch',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e225aad6-3780-4bdc-ae38-48d3ab7dc36e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e225aad6-3780-4bdc-ae38-48d3ab7dc36e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e225aad6-3780-4bdc-ae38-48d3ab7dc36e/3',\n 'title': 'Black Ops 7 Global Launch',\n 'description':\n 'This badge was earned by subscribing to a COD: Black Ops 7 streamer during launch!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'borderlands-4-badge---ripper',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/098219cb-48d8-4945-96a6-80594c7a90dd/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/098219cb-48d8-4945-96a6-80594c7a90dd/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/098219cb-48d8-4945-96a6-80594c7a90dd/3',\n 'title': 'Borderlands 4 Badge - Ripper',\n 'description': 'This user joined the ranks of the Rippers in Borderlands 4.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'borderlands-4-badge---vault-symbol',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/97eee27d-c87f-4afb-a020-04a9d04456df/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/97eee27d-c87f-4afb-a020-04a9d04456df/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/97eee27d-c87f-4afb-a020-04a9d04456df/3',\n 'title': 'Borderlands 4 Badge - Vault Symbol',\n 'description': 'This user is rocking the Vault Symbol from Borderlands 4.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'bot-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ffa9565-c35b-4cad-800b-041e60659cf2/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ffa9565-c35b-4cad-800b-041e60659cf2/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ffa9565-c35b-4cad-800b-041e60659cf2/3',\n 'title': 'Chat Bot',\n 'description': 'This Bot has been added to the channel by the broadcaster.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'broadcaster',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5527c58c-fb7d-422d-b71b-f309dcb85cc1/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5527c58c-fb7d-422d-b71b-f309dcb85cc1/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5527c58c-fb7d-422d-b71b-f309dcb85cc1/3',\n 'title': 'Broadcaster',\n 'description': 'Broadcaster',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'bungie-foundation-ally',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f5f78a03-c73e-4ae4-86d3-a3bef7ceca6f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f5f78a03-c73e-4ae4-86d3-a3bef7ceca6f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f5f78a03-c73e-4ae4-86d3-a3bef7ceca6f/3',\n 'title': 'Bungie Foundation Ally',\n 'description': 'This badge is awarded for being an ally of the Bungie Foundation!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'bungie-foundation-supporter',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/85cb4623-0dd6-4f41-b86e-765bc8ac367d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/85cb4623-0dd6-4f41-b86e-765bc8ac367d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/85cb4623-0dd6-4f41-b86e-765bc8ac367d/3',\n 'title': 'Bungie Foundation Supporter',\n 'description': 'This badge is awarded for being a supporter of the Bungie Foundation!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'chatter-cs-go-2022',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/57b6bd6b-a1b5-4204-9e6c-eb8ed5831603/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/57b6bd6b-a1b5-4204-9e6c-eb8ed5831603/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/57b6bd6b-a1b5-4204-9e6c-eb8ed5831603/3',\n 'title': 'CS:GO Week Brazil 2022',\n 'description': 'Chatted during CS:GO Week Brazil 2022',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'clips-leader',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/12f70951-efea-48c2-b42b-d5e2ea0d71f7/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/12f70951-efea-48c2-b42b-d5e2ea0d71f7/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/12f70951-efea-48c2-b42b-d5e2ea0d71f7/3',\n 'title': 'Clips Leader 1',\n 'description': 'Ranked as a top clipper in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9eddf7ab-aa46-4798-abe2-710db1043254/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9eddf7ab-aa46-4798-abe2-710db1043254/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9eddf7ab-aa46-4798-abe2-710db1043254/3',\n 'title': 'Clips Leader 2',\n 'description': 'Ranked as a top clipper in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '3',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fb838633-6ff6-46df-98b4-9e53fcff84f6/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fb838633-6ff6-46df-98b4-9e53fcff84f6/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fb838633-6ff6-46df-98b4-9e53fcff84f6/3',\n 'title': 'Clips Leader 3',\n 'description': 'Ranked as a top clipper in this community',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'creator-cs-go-2022',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a2ea6df9-ac0a-4956-bfe9-e931f50b94fa/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a2ea6df9-ac0a-4956-bfe9-e931f50b94fa/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a2ea6df9-ac0a-4956-bfe9-e931f50b94fa/3',\n 'title': 'CS:GO Week Brazil 2022',\n 'description': 'Streamed during CS:GO Week Brazil 2022',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'crimson-butterfly',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/63243824-6d43-45cf-8d21-fe0b06ab587f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/63243824-6d43-45cf-8d21-fe0b06ab587f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/63243824-6d43-45cf-8d21-fe0b06ab587f/3',\n 'title': 'Crimson Butterfly',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a streamer in the FATAL FRAME II: Crimson Butterfly REMAKE category!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'diablo-30th-anniversary',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2f98d79a-c78c-4c61-ac9e-7bc544d44619/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2f98d79a-c78c-4c61-ac9e-7bc544d44619/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2f98d79a-c78c-4c61-ac9e-7bc544d44619/3',\n 'title': 'Diablo 30th Anniversary',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a Diablo IV streamer during the Diablo 30th Anniversary!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'diana',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/38801cc6-4d01-40f6-8949-6b9f9d5334b8/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/38801cc6-4d01-40f6-8949-6b9f9d5334b8/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/38801cc6-4d01-40f6-8949-6b9f9d5334b8/3',\n 'title': 'Diana',\n 'description':\n 'This badge was earned by subscribing or gifting a sub for a streamer in the Pragmata category',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'ditto',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/b577304e-7dc9-49f2-bee1-68caf56a91e6/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/b577304e-7dc9-49f2-bee1-68caf56a91e6/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/b577304e-7dc9-49f2-bee1-68caf56a91e6/3',\n 'title': 'Ditto',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a Pokémon Pokopia streamer during launch!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'dragonscimmy',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/da4c6554-4472-4949-b33b-e79164dbba0b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/da4c6554-4472-4949-b33b-e79164dbba0b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/da4c6554-4472-4949-b33b-e79164dbba0b/3',\n 'title': 'DragonScimmy',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to any Old School RuneScape broadcast in 2025 during the launch of Sailing, OSRS’ first ever new skill!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'dreamcon-2024',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5dfbd056-8ac1-407f-bdf3-f83183fa97ae/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5dfbd056-8ac1-407f-bdf3-f83183fa97ae/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5dfbd056-8ac1-407f-bdf3-f83183fa97ae/3',\n 'title': 'Dream Con 2024',\n 'description':\n 'This badge was earned by watching Dream Con 2024 or completing the post-event survey!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'elden-ring-recluse',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5afadc6c-933b-4ede-b318-3752bbf267a9/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5afadc6c-933b-4ede-b318-3752bbf267a9/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5afadc6c-933b-4ede-b318-3752bbf267a9/3',\n 'title': 'Elden Ring SuperFan badge - Recluse',\n 'description':\n 'You used Stream Together or participated in a stream before or after Nightreign dropped. You’ve earned the Recluse badge.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'elden-ring-wylder',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5d5ab328-0916-4655-90b9-78b983ca4262/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5d5ab328-0916-4655-90b9-78b983ca4262/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5d5ab328-0916-4655-90b9-78b983ca4262/3',\n 'title': 'Elden Ring Nightreign Clip badge - Wylder',\n 'description':\n 'You captured a clippable Elden Ring moment. You’ve earned the Wylder badge.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'eso_1',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/18647a68-a35f-48d7-bf97-ae5deb6b277d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/18647a68-a35f-48d7-bf97-ae5deb6b277d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/18647a68-a35f-48d7-bf97-ae5deb6b277d/3',\n 'title': 'Elder Scrolls Online',\n 'description': 'Elder Scrolls Online',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'evo-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/1469e9cf-14d9-4a48-a91c-81712d027439/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/1469e9cf-14d9-4a48-a91c-81712d027439/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/1469e9cf-14d9-4a48-a91c-81712d027439/3',\n 'title': 'Evo 2025',\n 'description': 'You have earned the Evo 2025 Badge',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'extension',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ea8b0f8c-aa27-11e8-ba0c-1370ffff3854/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ea8b0f8c-aa27-11e8-ba0c-1370ffff3854/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ea8b0f8c-aa27-11e8-ba0c-1370ffff3854/3',\n 'title': 'Extension',\n 'description': 'Extension',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'fallout-season-2-ghoul',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/815334c4-3123-489b-8854-2af0f4027b00/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/815334c4-3123-489b-8854-2af0f4027b00/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/815334c4-3123-489b-8854-2af0f4027b00/3',\n 'title': 'Fallout Season 2 Ghoul',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a Fallout 76 streamer during the launch of Burning Springs and Fallout Season 2!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'first-stand-2026-supporter',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ea899f87-f7f5-4d9d-9de9-173331341199/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ea899f87-f7f5-4d9d-9de9-173331341199/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ea899f87-f7f5-4d9d-9de9-173331341199/3',\n 'title': 'First Stand 2026 Supporter',\n 'description': 'This badge was rewarded to fans who supported First Stand 2026!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'first-stand-2026-viewer',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2ae99aac-ac5b-4d69-884b-3eb20621340d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2ae99aac-ac5b-4d69-884b-3eb20621340d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2ae99aac-ac5b-4d69-884b-3eb20621340d/3',\n 'title': 'First Stand 2026 Viewer',\n 'description': 'This badge was rewarded to fans who watched First Stand 2026!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'fischer',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/50488ced-e1ee-4ea4-bb44-fb60d7d396c2/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/50488ced-e1ee-4ea4-bb44-fb60d7d396c2/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/50488ced-e1ee-4ea4-bb44-fb60d7d396c2/3',\n 'title': 'Fischer',\n 'description': 'This badge was earned by watching Roblox during the Bloxfest Qualifiers.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'frog-lantern',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/dfc75f94-14f9-404b-b953-37eba481df37/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/dfc75f94-14f9-404b-b953-37eba481df37/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/dfc75f94-14f9-404b-b953-37eba481df37/3',\n 'title': 'Frog Lantern',\n 'description':\n 'This badge was earned by subscribing or gifting three times in the Sea of Thieves category!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'game-developer',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/85856a4a-eb7d-4e26-a43e-d204a977ade4/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/85856a4a-eb7d-4e26-a43e-d204a977ade4/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/85856a4a-eb7d-4e26-a43e-d204a977ade4/3',\n 'title': 'Game Developer',\n 'description': 'Game Developer for:',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'gears-of-war-superfan-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/18b92728-aa7a-4e24-acb5-b14ea17c8b2b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/18b92728-aa7a-4e24-acb5-b14ea17c8b2b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/18b92728-aa7a-4e24-acb5-b14ea17c8b2b/3',\n 'title': 'Gears of War Superfan Badge',\n 'description': 'This user is a Gears of War: Reloaded Superfan.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'gingko-leaf',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/394abbbd-cc1d-427f-bc00-bce294353448/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/394abbbd-cc1d-427f-bc00-bce294353448/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/394abbbd-cc1d-427f-bc00-bce294353448/3',\n 'title': 'Gingko Leaf',\n 'description':\n \"This badge was earned by watching 30 minutes of a Ghost of Yotei stream during the game's launch!\",\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'global_mod',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9384c43e-4ce7-4e94-b2a1-b93656896eba/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9384c43e-4ce7-4e94-b2a1-b93656896eba/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9384c43e-4ce7-4e94-b2a1-b93656896eba/3',\n 'title': 'Global Moderator',\n 'description': 'Global Moderator',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'gold-pixel-heart---together-for-good-24',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/52c90eac-b7ec-4e24-b500-8fceecfe91e8/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/52c90eac-b7ec-4e24-b500-8fceecfe91e8/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/52c90eac-b7ec-4e24-b500-8fceecfe91e8/3',\n 'title': \"Gold Pixel Heart - Together For Good '24\",\n 'description':\n 'This badge was earned by donating $50 or more as part of Twitch Together for Good 2024!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'gp-explorer-3',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/1e3b6965-2224-44d1-a67a-6d186c1fb17d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/1e3b6965-2224-44d1-a67a-6d186c1fb17d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/1e3b6965-2224-44d1-a67a-6d186c1fb17d/3',\n 'title': 'GP Explorer 3',\n 'description':\n 'This badge was earned by watching 15 minutes of GP Explorer 3 on any of the broadcasting channels.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'hornet',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4dc7b047-8c59-4522-97f2-24fb63147f56/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4dc7b047-8c59-4522-97f2-24fb63147f56/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4dc7b047-8c59-4522-97f2-24fb63147f56/3',\n 'title': 'Hornet',\n 'description':\n 'This badge was earned by subscribing to a streamer in the Hollow Knight: Silksong category during game launch week.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'hunt-crosses',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/b1e77273-2fc0-4d36-873a-67a7c1647efe/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/b1e77273-2fc0-4d36-873a-67a7c1647efe/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/b1e77273-2fc0-4d36-873a-67a7c1647efe/3',\n 'title': 'Hunt Crosses',\n 'description':\n 'This badge was earned by subscribing or gifting a sub in the Hunt: Showdown 1896 category from Dec. 12 - Dec. 24, 2025.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'hypershot-celestial',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ee3441d-92d4-4f00-b8b4-64cb3d97e17e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ee3441d-92d4-4f00-b8b4-64cb3d97e17e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ee3441d-92d4-4f00-b8b4-64cb3d97e17e/3',\n 'title': 'Hypershot Celestial',\n 'description': 'This badge was earned by watching Roblox during the Bloxfest Qualifiers.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'jeff-the-land-shark',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ad51bd4c-2621-4d7c-8580-89243002bc8b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ad51bd4c-2621-4d7c-8580-89243002bc8b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ad51bd4c-2621-4d7c-8580-89243002bc8b/3',\n 'title': 'Jeff the Land Shark',\n 'description':\n \"This badge was earned by subscribing or gifting a sub in the Marvel Rivals category during Marvel Rivals' 1-year anniversary!\",\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'k4sen-con-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/6ea537aa-bb9a-4410-a330-5820b7dd8a24/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/6ea537aa-bb9a-4410-a330-5820b7dd8a24/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/6ea537aa-bb9a-4410-a330-5820b7dd8a24/3',\n 'title': 'The K4SEN Con 2025',\n 'description': 'This badge was earned by watching 30 minutes of K4SEN Con 2025!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'kodama',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/374ef606-cf25-475e-994b-f7d36b8acd43/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/374ef606-cf25-475e-994b-f7d36b8acd43/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/374ef606-cf25-475e-994b-f7d36b8acd43/3',\n 'title': 'Kodama',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Nioh 3 category',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'la-velada-iv',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/655dac77-0b2f-4b62-8871-6ae21f82b34e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/655dac77-0b2f-4b62-8871-6ae21f82b34e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/655dac77-0b2f-4b62-8871-6ae21f82b34e/3',\n 'title': 'La Velada del Año IV',\n 'description': 'This badge was earned for watching La Velada del Año IV!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'la-velada-v-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3f728095-b84d-4e7e-9eee-541ea02ddea0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3f728095-b84d-4e7e-9eee-541ea02ddea0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3f728095-b84d-4e7e-9eee-541ea02ddea0/3',\n 'title': 'La Velada V Badge',\n 'description': 'This badge was earned by watching La Velada V!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'lamby',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c0801fe9-3d54-49d1-801c-3c1fadde09cd/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c0801fe9-3d54-49d1-801c-3c1fadde09cd/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c0801fe9-3d54-49d1-801c-3c1fadde09cd/3',\n 'title': 'Lamby',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a Cult of the Lamb streamer!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'lead_moderator',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/0822047b-65e0-46f2-94a9-d1091d685d33/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/0822047b-65e0-46f2-94a9-d1091d685d33/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/0822047b-65e0-46f2-94a9-d1091d685d33/3',\n 'title': 'Lead Moderator',\n 'description': 'A badge for users who are a lead moderator in the channel',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'league-of-legends-mid-season-invitational-2025---grey',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/18a0b4ba-5f62-4e94-b6f1-481731608602/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/18a0b4ba-5f62-4e94-b6f1-481731608602/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/18a0b4ba-5f62-4e94-b6f1-481731608602/3',\n 'title': 'League of Legends Mid Season Invitational 2025 Support a Streamer',\n 'description':\n 'This badge was earned by gifting a subscription to a streamer in the League of Legends category during MSI 2025.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'league-of-legends-mid-season-invitational-2025---purple',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/0a99ba23-5e1a-46b7-8ff2-efbb9a6ea54c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/0a99ba23-5e1a-46b7-8ff2-efbb9a6ea54c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/0a99ba23-5e1a-46b7-8ff2-efbb9a6ea54c/3',\n 'title': 'League of Legends Mid Season Invitational 2025',\n 'description':\n 'This badge was earned by subscribing to a lolesports channel during MSI 2025!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'legendus',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/55c355cf-ddbf-4f12-8369-6554a1f78b6f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/55c355cf-ddbf-4f12-8369-6554a1f78b6f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/55c355cf-ddbf-4f12-8369-6554a1f78b6f/3',\n 'title': 'LEGENDUS',\n 'description':\n 'This badge was granted to users who watched LEGENDUS ITADAKI, hosted by fps_shaka, on June 28-June 29, 2025.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'lol-worlds-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4545b0b5-c825-487e-8958-ce5512eb6f84/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4545b0b5-c825-487e-8958-ce5512eb6f84/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4545b0b5-c825-487e-8958-ce5512eb6f84/3',\n 'title': 'LoL Worlds 2025',\n 'description':\n 'This badge was earned by subscribing to a participating LoL Esports broadcast or co-stream of the 2025 League of Legends World Championship!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'lost-ark-anniversary',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/77995962-b02e-48e3-92ab-b77a4b352fb3/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/77995962-b02e-48e3-92ab-b77a4b352fb3/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/77995962-b02e-48e3-92ab-b77a4b352fb3/3',\n 'title': 'Lost Ark Anniversary',\n 'description':\n 'This badge was earned by watching your favorite Lost Ark streamer during the 4th Anniversary!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'low',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/58d48669-bfee-46e7-a83c-b65a30783400/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/58d48669-bfee-46e7-a83c-b65a30783400/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/58d48669-bfee-46e7-a83c-b65a30783400/3',\n 'title': 'Low',\n 'description':\n 'This badge was earned by watching 30 minutes in the Little Nightmares III category during launch!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'marathon-reveal-runner',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ae1c6c62-c057-4fad-a1d4-663bf988701f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ae1c6c62-c057-4fad-a1d4-663bf988701f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ae1c6c62-c057-4fad-a1d4-663bf988701f/3',\n 'title': 'Marathon Reveal Runner',\n 'description': 'This badge was earned by subscribing during the Marathon reveal stream!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'marathon-silkworm',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/eabd1994-d054-4eb1-a740-7cce1ad4f0cb/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/eabd1994-d054-4eb1-a740-7cce1ad4f0cb/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/eabd1994-d054-4eb1-a740-7cce1ad4f0cb/3',\n 'title': 'Marathon Silkworm',\n 'description':\n 'This Chat Badge was unlocked by watching the Marathon Server Slam & Launch Week!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'marathon-sub-burger',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5bc8a500-12f5-42c4-86f7-a678d1f930a1/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5bc8a500-12f5-42c4-86f7-a678d1f930a1/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5bc8a500-12f5-42c4-86f7-a678d1f930a1/3',\n 'title': 'Marathon Sub Burger',\n 'description': \"A tasty burger for you and a friend! Tastes like meat. Isn't\",\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'mel',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/8a7c1d1d-12bb-40d9-9be8-0a4fdf0d870c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/8a7c1d1d-12bb-40d9-9be8-0a4fdf0d870c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/8a7c1d1d-12bb-40d9-9be8-0a4fdf0d870c/3',\n 'title': 'Mel',\n 'description':\n 'This badge was earned by subscribing or gifting a sub for a streamer in the Hades II category.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'moderator',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3267646d-33f0-4b17-b3df-f923a41db1d0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3267646d-33f0-4b17-b3df-f923a41db1d0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3267646d-33f0-4b17-b3df-f923a41db1d0/3',\n 'title': 'Moderator',\n 'description': 'Moderator',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'moments',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/bf370830-d79a-497b-81c6-a365b2b60dda/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/bf370830-d79a-497b-81c6-a365b2b60dda/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/bf370830-d79a-497b-81c6-a365b2b60dda/3',\n 'title': 'Moments Badge - Tier 1',\n 'description': 'Earned for being a part of at least 1 moment on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc46b10c-5b45-43fd-81ad-d5cb0de6d2f4/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc46b10c-5b45-43fd-81ad-d5cb0de6d2f4/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc46b10c-5b45-43fd-81ad-d5cb0de6d2f4/3',\n 'title': 'Moments Badge - Tier 2',\n 'description': 'Earned for being a part of at least 5 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '3',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d08658d7-205f-4f75-ad44-8c6e0acd8ef6/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d08658d7-205f-4f75-ad44-8c6e0acd8ef6/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d08658d7-205f-4f75-ad44-8c6e0acd8ef6/3',\n 'title': 'Moments Badge - Tier 3',\n 'description': 'Earned for being a part of at least 10 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '4',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fe5b5ddc-93e7-4aaf-9b3e-799cd41808b1/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fe5b5ddc-93e7-4aaf-9b3e-799cd41808b1/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fe5b5ddc-93e7-4aaf-9b3e-799cd41808b1/3',\n 'title': 'Moments Badge - Tier 4',\n 'description': 'Earned for being a part of at least 15 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '5',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c8a0d95a-856e-4097-9fc0-7765300a4f58/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c8a0d95a-856e-4097-9fc0-7765300a4f58/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c8a0d95a-856e-4097-9fc0-7765300a4f58/3',\n 'title': 'Moments Badge - Tier 5',\n 'description': 'Earned for being a part of at least 20 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '6',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f9e3b4e4-200e-4045-bd71-3a6b480c23ae/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f9e3b4e4-200e-4045-bd71-3a6b480c23ae/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f9e3b4e4-200e-4045-bd71-3a6b480c23ae/3',\n 'title': 'Moments Badge - Tier 6',\n 'description': 'Earned for being a part of at least 30 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '7',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a90a26a4-fdf7-4ac3-a782-76a413da16c1/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a90a26a4-fdf7-4ac3-a782-76a413da16c1/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a90a26a4-fdf7-4ac3-a782-76a413da16c1/3',\n 'title': 'Moments Badge - Tier 7',\n 'description': 'Earned for being a part of at least 40 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '8',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f22286cd-6aa3-42ce-b3fb-10f5d18c4aa0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f22286cd-6aa3-42ce-b3fb-10f5d18c4aa0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f22286cd-6aa3-42ce-b3fb-10f5d18c4aa0/3',\n 'title': 'Moments Badge - Tier 8',\n 'description': 'Earned for being a part of at least 50 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '9',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5cb2e584-1efd-469b-ab1d-4d1b59a944e7/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5cb2e584-1efd-469b-ab1d-4d1b59a944e7/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5cb2e584-1efd-469b-ab1d-4d1b59a944e7/3',\n 'title': 'Moments Badge - Tier 9',\n 'description': 'Earned for being a part of at least 60 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '10',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9c13f2b6-69cd-4537-91b4-4a8bd8b6b1fd/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9c13f2b6-69cd-4537-91b4-4a8bd8b6b1fd/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9c13f2b6-69cd-4537-91b4-4a8bd8b6b1fd/3',\n 'title': 'Moments Badge - Tier 10',\n 'description': 'Earned for being a part of at least 75 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '11',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/7573e7a2-0f1f-4508-b833-d822567a1e03/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/7573e7a2-0f1f-4508-b833-d822567a1e03/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/7573e7a2-0f1f-4508-b833-d822567a1e03/3',\n 'title': 'Moments Badge - Tier 11',\n 'description': 'Earned for being a part of at least 90 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '12',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f2c91d14-85c8-434b-a6c0-6d7930091150/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f2c91d14-85c8-434b-a6c0-6d7930091150/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f2c91d14-85c8-434b-a6c0-6d7930091150/3',\n 'title': 'Moments Badge - Tier 12',\n 'description': 'Earned for being a part of at least 105 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '13',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/35eb3395-a1d3-4170-969a-86402ecfb11a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/35eb3395-a1d3-4170-969a-86402ecfb11a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/35eb3395-a1d3-4170-969a-86402ecfb11a/3',\n 'title': 'Moments Badge - Tier 13',\n 'description': 'Earned for being a part of at least 120 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '14',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/cb40eb03-1015-45ba-8793-51c66a24a3d5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/cb40eb03-1015-45ba-8793-51c66a24a3d5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/cb40eb03-1015-45ba-8793-51c66a24a3d5/3',\n 'title': 'Moments Badge - Tier 14',\n 'description': 'Earned for being a part of at least 140 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '15',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/b241d667-280b-4183-96ae-2d0053631186/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/b241d667-280b-4183-96ae-2d0053631186/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/b241d667-280b-4183-96ae-2d0053631186/3',\n 'title': 'Moments Badge - Tier 15',\n 'description': 'Earned for being a part of at least 160 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '16',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5684d1bc-8132-4a4f-850c-18d3c5bd04f3/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5684d1bc-8132-4a4f-850c-18d3c5bd04f3/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5684d1bc-8132-4a4f-850c-18d3c5bd04f3/3',\n 'title': 'Moments Badge - Tier 16',\n 'description': 'Earned for being a part of at least 180 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '17',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3b08c1ee-0f77-451b-9226-b5b22d7f023c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3b08c1ee-0f77-451b-9226-b5b22d7f023c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3b08c1ee-0f77-451b-9226-b5b22d7f023c/3',\n 'title': 'Moments Badge - Tier 17',\n 'description': 'Earned for being a part of at least 200 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '18',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/14057e75-080c-42da-a412-6232c6f33b68/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/14057e75-080c-42da-a412-6232c6f33b68/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/14057e75-080c-42da-a412-6232c6f33b68/3',\n 'title': 'Moments Badge - Tier 18',\n 'description': 'Earned for being a part of at least 225 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '19',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/6100cc6f-6b4b-4a3d-a55b-a5b34edb5ea1/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/6100cc6f-6b4b-4a3d-a55b-a5b34edb5ea1/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/6100cc6f-6b4b-4a3d-a55b-a5b34edb5ea1/3',\n 'title': 'Moments Badge - Tier 19',\n 'description': 'Earned for being a part of at least 250 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '20',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/43399796-e74c-4741-a975-56202f0af30e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/43399796-e74c-4741-a975-56202f0af30e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/43399796-e74c-4741-a975-56202f0af30e/3',\n 'title': 'Moments Badge - Tier 20',\n 'description': 'Earned for being a part of at least 275 moments on a channel',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'mr-raccoon',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/057b7ef9-6b3d-4a9c-9f0c-ede0df1315db/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/057b7ef9-6b3d-4a9c-9f0c-ede0df1315db/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/057b7ef9-6b3d-4a9c-9f0c-ede0df1315db/3',\n 'title': 'Mr. Raccoon',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a Resident Evil: Requiem streamer.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'never-grave---witch-hat',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fb752b70-4eb6-45dd-8ee1-1194c38d2ac3/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fb752b70-4eb6-45dd-8ee1-1194c38d2ac3/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fb752b70-4eb6-45dd-8ee1-1194c38d2ac3/3',\n 'title': 'Never Grave - Witch Hat',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Never Grave category during the game launch',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'no_audio',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/aef2cd08-f29b-45a1-8c12-d44d7fd5e6f0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/aef2cd08-f29b-45a1-8c12-d44d7fd5e6f0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/aef2cd08-f29b-45a1-8c12-d44d7fd5e6f0/3',\n 'title': 'Watching without audio',\n 'description': 'Individuals with unreliable or no sound can select this badge',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'no_video',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/199a0dba-58f3-494e-a7fc-1fa0a1001fb8/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/199a0dba-58f3-494e-a7fc-1fa0a1001fb8/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/199a0dba-58f3-494e-a7fc-1fa0a1001fb8/3',\n 'title': 'Listening only',\n 'description': 'Individuals with unreliable or no video can select this badge',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'path-of-exile-2-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/8bebe4ce-6c15-4746-8c33-42312c250ceb/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/8bebe4ce-6c15-4746-8c33-42312c250ceb/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/8bebe4ce-6c15-4746-8c33-42312c250ceb/3',\n 'title': 'Chaos Orb',\n 'description':\n \"This badge was earned by subscribing to a streamer during Path of Exile 2's launch!\",\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'pokemon-30th-anniversary',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4c10b31-ad76-4600-a3cc-48c875e1f7c0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4c10b31-ad76-4600-a3cc-48c875e1f7c0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4c10b31-ad76-4600-a3cc-48c875e1f7c0/3',\n 'title': 'Pokémon 30th',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a streamer in an eligible Pokémon category!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'pokemon-legends-z-a-chikorita',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f479e945-987b-423a-a901-7b1c3b3003fb/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f479e945-987b-423a-a901-7b1c3b3003fb/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f479e945-987b-423a-a901-7b1c3b3003fb/3',\n 'title': 'Pokémon Legends: Z-A Chikorita',\n 'description':\n 'This badge was earned by purchasing a subscription or gifting a subscription to a streamer playing Pokémon Legends: Z-A for Chikorita.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'pokemon-legends-z-a-tepig',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/34799f2e-e165-42a4-ae79-1c9c06cf1d55/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/34799f2e-e165-42a4-ae79-1c9c06cf1d55/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/34799f2e-e165-42a4-ae79-1c9c06cf1d55/3',\n 'title': 'Pokémon Legends: Z-A Tepig',\n 'description':\n 'This badge was earned by purchasing a subscription or gifting a subscription to a streamer playing Pokémon Legends Z-A for Tepig.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'pokemon-legends-z-a-totodile',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/0bdb6906-ba8f-4fb6-bc9e-3aca04d3d501/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/0bdb6906-ba8f-4fb6-bc9e-3aca04d3d501/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/0bdb6906-ba8f-4fb6-bc9e-3aca04d3d501/3',\n 'title': 'Pokémon Legends: Z-A Totodile',\n 'description':\n 'This badge was earned by purchasing a subscription or gifting a subscription to a streamer playing Pokémon Legends: Z-A for Totodile.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'power-rangers',\n 'versions': [\n {\n 'id': '0',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9edf3e7f-62e4-40f5-86ab-7a646b10f1f0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9edf3e7f-62e4-40f5-86ab-7a646b10f1f0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9edf3e7f-62e4-40f5-86ab-7a646b10f1f0/3',\n 'title': 'Black Ranger',\n 'description': 'Black Ranger',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/1eeae8fe-5bc6-44ed-9c88-fb84d5e0df52/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/1eeae8fe-5bc6-44ed-9c88-fb84d5e0df52/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/1eeae8fe-5bc6-44ed-9c88-fb84d5e0df52/3',\n 'title': 'Blue Ranger',\n 'description': 'Blue Ranger',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/21bbcd6d-1751-4d28-a0c3-0b72453dd823/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/21bbcd6d-1751-4d28-a0c3-0b72453dd823/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/21bbcd6d-1751-4d28-a0c3-0b72453dd823/3',\n 'title': 'Green Ranger',\n 'description': 'Green Ranger',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '3',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5c58cb40-9028-4d16-af67-5bc0c18b745e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5c58cb40-9028-4d16-af67-5bc0c18b745e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5c58cb40-9028-4d16-af67-5bc0c18b745e/3',\n 'title': 'Pink Ranger',\n 'description': 'Pink Ranger',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '4',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/8843d2de-049f-47d5-9794-b6517903db61/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/8843d2de-049f-47d5-9794-b6517903db61/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/8843d2de-049f-47d5-9794-b6517903db61/3',\n 'title': 'Red Ranger',\n 'description': 'Red Ranger',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '5',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/06c85e34-477e-4939-9537-fd9978976042/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/06c85e34-477e-4939-9537-fd9978976042/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/06c85e34-477e-4939-9537-fd9978976042/3',\n 'title': 'White Ranger',\n 'description': 'White Ranger',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '6',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d6dca630-1ca4-48de-94e7-55ed0a24d8d1/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d6dca630-1ca4-48de-94e7-55ed0a24d8d1/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d6dca630-1ca4-48de-94e7-55ed0a24d8d1/3',\n 'title': 'Yellow Ranger',\n 'description': 'Yellow Ranger',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'predictions',\n 'versions': [\n {\n 'id': 'blue-1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e33d8b46-f63b-4e67-996d-4a7dcec0ad33/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e33d8b46-f63b-4e67-996d-4a7dcec0ad33/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e33d8b46-f63b-4e67-996d-4a7dcec0ad33/3',\n 'title': 'Predicted Blue (1)',\n 'description': 'Predicted Outcome One',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'blue-10',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/072ae906-ecf7-44f1-ac69-a5b2261d8892/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/072ae906-ecf7-44f1-ac69-a5b2261d8892/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/072ae906-ecf7-44f1-ac69-a5b2261d8892/3',\n 'title': 'Predicted Blue (10)',\n 'description': 'Predicted Outcome Ten',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'blue-2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ffdda3fe-8012-4db3-981e-7a131402b057/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ffdda3fe-8012-4db3-981e-7a131402b057/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ffdda3fe-8012-4db3-981e-7a131402b057/3',\n 'title': 'Predicted Blue (2)',\n 'description': 'Predicted Outcome Two',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'blue-3',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/f2ab9a19-8ef7-4f9f-bd5d-9cf4e603f845/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/f2ab9a19-8ef7-4f9f-bd5d-9cf4e603f845/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/f2ab9a19-8ef7-4f9f-bd5d-9cf4e603f845/3',\n 'title': 'Predicted Blue (3)',\n 'description': 'Predicted Outcome Three',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'blue-4',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/df95317d-9568-46de-a421-a8520edb9349/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/df95317d-9568-46de-a421-a8520edb9349/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/df95317d-9568-46de-a421-a8520edb9349/3',\n 'title': 'Predicted Blue (4)',\n 'description': 'Predicted Outcome Four',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'blue-5',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/88758be8-de09-479b-9383-e3bb6d9e6f06/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/88758be8-de09-479b-9383-e3bb6d9e6f06/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/88758be8-de09-479b-9383-e3bb6d9e6f06/3',\n 'title': 'Predicted Blue (5)',\n 'description': 'Predicted Outcome Five',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'blue-6',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/46b1537e-d8b0-4c0d-8fba-a652e57b9df0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/46b1537e-d8b0-4c0d-8fba-a652e57b9df0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/46b1537e-d8b0-4c0d-8fba-a652e57b9df0/3',\n 'title': 'Predicted Blue (6)',\n 'description': 'Predicted Outcome Six',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'blue-7',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/07cd34b2-c6a1-45f5-8d8a-131e3c8b2279/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/07cd34b2-c6a1-45f5-8d8a-131e3c8b2279/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/07cd34b2-c6a1-45f5-8d8a-131e3c8b2279/3',\n 'title': 'Predicted Blue (7)',\n 'description': 'Predicted Outcome Seven',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'blue-8',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4416dfd7-db97-44a0-98e7-40b4e250615e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4416dfd7-db97-44a0-98e7-40b4e250615e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4416dfd7-db97-44a0-98e7-40b4e250615e/3',\n 'title': 'Predicted Blue (8)',\n 'description': 'Predicted Outcome Eight',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'blue-9',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc74bd90-2b74-4f56-8e42-04d405e10fae/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc74bd90-2b74-4f56-8e42-04d405e10fae/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fc74bd90-2b74-4f56-8e42-04d405e10fae/3',\n 'title': 'Predicted Blue (9)',\n 'description': 'Predicted Outcome Nine',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'gray-1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/144f77a2-e324-4a6b-9c17-9304fa193a27/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/144f77a2-e324-4a6b-9c17-9304fa193a27/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/144f77a2-e324-4a6b-9c17-9304fa193a27/3',\n 'title': 'Predicted Gray (1)',\n 'description': 'Predicted Gray (1)',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'gray-2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/097a4b14-b458-47eb-91b6-fe74d3dbb3f5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/097a4b14-b458-47eb-91b6-fe74d3dbb3f5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/097a4b14-b458-47eb-91b6-fe74d3dbb3f5/3',\n 'title': 'Predicted Gray (2)',\n 'description': 'Predicted Gray (2)',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'pink-1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/75e27613-caf7-4585-98f1-cb7363a69a4a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/75e27613-caf7-4585-98f1-cb7363a69a4a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/75e27613-caf7-4585-98f1-cb7363a69a4a/3',\n 'title': 'Predicted Pink (1)',\n 'description': 'Predicted Outcome One',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': 'pink-2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4b76d5f2-91cc-4400-adf2-908a1e6cfd1e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4b76d5f2-91cc-4400-adf2-908a1e6cfd1e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4b76d5f2-91cc-4400-adf2-908a1e6cfd1e/3',\n 'title': 'Predicted Pink (2)',\n 'description': 'Predicted Outcome Two',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'purple-noob',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a1fb3f16-14e8-4e2b-84f8-55e2b86878c8/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a1fb3f16-14e8-4e2b-84f8-55e2b86878c8/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a1fb3f16-14e8-4e2b-84f8-55e2b86878c8/3',\n 'title': 'Purple Noob',\n 'description':\n 'Watch 1 hour of Roblox content on Twitch to earn this happy little badge. EZ W.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'purple-pixel-heart---together-for-good-24',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/1afb4b76-8c34-4b7b-8beb-75f7e5d2a1ab/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/1afb4b76-8c34-4b7b-8beb-75f7e5d2a1ab/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/1afb4b76-8c34-4b7b-8beb-75f7e5d2a1ab/3',\n 'title': \"Purple Pixel Heart - Together For Good '24\",\n 'description':\n 'This badge was earned by donating $5 or more as part of Twitch Together for Good 2024!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'raging-wolf-helm',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ff668be-59a3-4e3e-96af-e6b2908b3171/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ff668be-59a3-4e3e-96af-e6b2908b3171/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ff668be-59a3-4e3e-96af-e6b2908b3171/3',\n 'title': 'Raging Wolf Helm',\n 'description':\n 'This badge was earned for watching Elden Ring during the initial Shadow of the Erdtree Expansion launch!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'raider-icon-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5007f3e0-41d4-4bda-a605-8f72cfe8c2d4/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5007f3e0-41d4-4bda-a605-8f72cfe8c2d4/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5007f3e0-41d4-4bda-a605-8f72cfe8c2d4/3',\n 'title': 'Raider Icon',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to any ARC Raiders broadcast during the campaign period',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'rainbow-six-siege-x-10th-anniversary',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/00fc50e1-dea9-47a4-9db5-ff087e91dd0d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/00fc50e1-dea9-47a4-9db5-ff087e91dd0d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/00fc50e1-dea9-47a4-9db5-ff087e91dd0d/3',\n 'title': 'Rainbow Six Siege X 10th Anniversary',\n 'description':\n 'This badge was earned by subscribing of gifting a sub to a Rainbow Six Siege X streamer during its 10th anniversary celebration!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'revedtv-stream-awards-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/03cb38fd-00cc-4ed8-8d24-ce53189ee1de/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/03cb38fd-00cc-4ed8-8d24-ce53189ee1de/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/03cb38fd-00cc-4ed8-8d24-ce53189ee1de/3',\n 'title': 'RevedTV StreamAwards 2025',\n 'description': \"This badge was earned by watching RevedTV's StreamAwards 2025.\",\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'ruby-pixel-heart---together-for-good-24',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca0aa8ce-b2a8-4582-a5de-4d5b6915dc47/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca0aa8ce-b2a8-4582-a5de-4d5b6915dc47/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca0aa8ce-b2a8-4582-a5de-4d5b6915dc47/3',\n 'title': \"Ruby Pixel Heart - Together For Good '24\",\n 'description':\n 'This badge was earned by donating $25 or more as part of Twitch Together for Good 2024!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'rudy',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/309c197a-69ed-4c15-8226-a0992f1f5b68/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/309c197a-69ed-4c15-8226-a0992f1f5b68/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/309c197a-69ed-4c15-8226-a0992f1f5b68/3',\n 'title': 'Rudy',\n 'description':\n 'This Rudy badge was earned by subscribing or gifting a sub to a Monster Hunter Stories 3: Twisted Reflection streamer during its launch!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'rustmas-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5ec1bcd1-82fa-4c42-abf1-be5b64cb63ed/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5ec1bcd1-82fa-4c42-abf1-be5b64cb63ed/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5ec1bcd1-82fa-4c42-abf1-be5b64cb63ed/3',\n 'title': 'Rustmas 2025',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a Rust streamer during Rustmas 2025!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'sajam-slam-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9fd798d6-3d67-4458-a916-9fd5d7286159/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9fd798d6-3d67-4458-a916-9fd5d7286159/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9fd798d6-3d67-4458-a916-9fd5d7286159/3',\n 'title': 'Sajam Slam Badge',\n 'description':\n 'This badge was earned by subscribing in the Street Fighter 6 category during TwitchCon 2025!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'scampuss',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/1ae8da3f-04ba-4cf1-93e8-a1f90e09aa45/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/1ae8da3f-04ba-4cf1-93e8-a1f90e09aa45/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/1ae8da3f-04ba-4cf1-93e8-a1f90e09aa45/3',\n 'title': 'Scampuss',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Nioh 3 category during the game launch.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'seeks-eye',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2ff5095e-8b37-489c-9a53-336bf806dca2/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2ff5095e-8b37-489c-9a53-336bf806dca2/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2ff5095e-8b37-489c-9a53-336bf806dca2/3',\n 'title': \"Seek's Eye\",\n 'description': 'This badge was earned by watching Roblox during the Bloxfest Qualifiers.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'social-sharing',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d2030c7e-c400-4605-a2cf-ce32bd06af8f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d2030c7e-c400-4605-a2cf-ce32bd06af8f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d2030c7e-c400-4605-a2cf-ce32bd06af8f/3',\n 'title': 'Social Media Badge',\n 'description':\n 'This user earned a Icon badge for reaching 100 views on their social posts.',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/fcca0804-1da5-4d00-ab06-7677676d4d8e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/fcca0804-1da5-4d00-ab06-7677676d4d8e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/fcca0804-1da5-4d00-ab06-7677676d4d8e/3',\n 'title': 'Social Media Badge',\n 'description':\n 'This user earned a Pro badge for reaching 10000 views on their social posts.',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '3',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/590698dd-2bc4-4401-817a-17c641f5e881/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/590698dd-2bc4-4401-817a-17c641f5e881/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/590698dd-2bc4-4401-817a-17c641f5e881/3',\n 'title': 'Social Media Badge',\n 'description':\n 'This user earned a Legend badge for reaching 100000 views on their social posts.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'sonic-racing-crossworlds',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3c5a5ea0-714f-46da-b764-5e7ceba59fca/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3c5a5ea0-714f-46da-b764-5e7ceba59fca/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3c5a5ea0-714f-46da-b764-5e7ceba59fca/3',\n 'title': 'Sonic Racing',\n 'description':\n 'This badge was earned by subscribing to a streamer in the Sonic Racing: Crossworlds category!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'speedons-5-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/81d89508-850c-45ae-b0e2-dbbe6e531b8d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/81d89508-850c-45ae-b0e2-dbbe6e531b8d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/81d89508-850c-45ae-b0e2-dbbe6e531b8d/3',\n 'title': 'Speedons 5 Badge',\n 'description': 'This badge was earned by watching Speedons 5!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'stream-for-humanity-2-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c02fbad3-aa4b-46d0-93a6-661719a19f1c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c02fbad3-aa4b-46d0-93a6-661719a19f1c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c02fbad3-aa4b-46d0-93a6-661719a19f1c/3',\n 'title': 'Stream For Humanity 2',\n 'description': 'Earned by supporting the Stream For Humanity 2 charity marathon',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'streamer-awards-tux',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d52bd174-3509-460b-80ac-4a8d5840194b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d52bd174-3509-460b-80ac-4a8d5840194b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d52bd174-3509-460b-80ac-4a8d5840194b/3',\n 'title': 'Streamer Awards Tux',\n 'description': 'I earned this badge by watching the 2025 Streamer Awards!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'sub-gift-leader',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/21656088-7da2-4467-acd2-55220e1f45ad/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/21656088-7da2-4467-acd2-55220e1f45ad/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/21656088-7da2-4467-acd2-55220e1f45ad/3',\n 'title': 'Gifter Leader 1',\n 'description': 'Ranked as a top subscription gifter in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/0d9fe96b-97b7-4215-b5f3-5328ebad271c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/0d9fe96b-97b7-4215-b5f3-5328ebad271c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/0d9fe96b-97b7-4215-b5f3-5328ebad271c/3',\n 'title': 'Gifter Leader 2',\n 'description': 'Ranked as a top subscription gifter in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '3',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4c6e4497-eed9-4dd3-ac64-e0599d0a63e5/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4c6e4497-eed9-4dd3-ac64-e0599d0a63e5/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4c6e4497-eed9-4dd3-ac64-e0599d0a63e5/3',\n 'title': 'Gifter Leader 3',\n 'description': 'Ranked as a top subscription gifter in this community',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'sub-gifter',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a5ef6c17-2e5b-4d8f-9b80-2779fd722414/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a5ef6c17-2e5b-4d8f-9b80-2779fd722414/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a5ef6c17-2e5b-4d8f-9b80-2779fd722414/3',\n 'title': 'Sub Gifter',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '5',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ee113e59-c839-4472-969a-1e16d20f3962/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ee113e59-c839-4472-969a-1e16d20f3962/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ee113e59-c839-4472-969a-1e16d20f3962/3',\n 'title': '5 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '10',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d333288c-65d7-4c7b-b691-cdd7b3484bf8/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d333288c-65d7-4c7b-b691-cdd7b3484bf8/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d333288c-65d7-4c7b-b691-cdd7b3484bf8/3',\n 'title': '10 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '25',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/052a5d41-f1cc-455c-bc7b-fe841ffaf17f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/052a5d41-f1cc-455c-bc7b-fe841ffaf17f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/052a5d41-f1cc-455c-bc7b-fe841ffaf17f/3',\n 'title': '25 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '50',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4a29737-e8a5-4420-917a-314a447f083e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4a29737-e8a5-4420-917a-314a447f083e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c4a29737-e8a5-4420-917a-314a447f083e/3',\n 'title': '50 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '100',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/8343ada7-3451-434e-91c4-e82bdcf54460/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/8343ada7-3451-434e-91c4-e82bdcf54460/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/8343ada7-3451-434e-91c4-e82bdcf54460/3',\n 'title': '100 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '150',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/514845ba-0fc3-4771-bce1-14d57e91e621/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/514845ba-0fc3-4771-bce1-14d57e91e621/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/514845ba-0fc3-4771-bce1-14d57e91e621/3',\n 'title': '150 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '200',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c6b1893e-8059-4024-b93c-39c84b601732/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c6b1893e-8059-4024-b93c-39c84b601732/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c6b1893e-8059-4024-b93c-39c84b601732/3',\n 'title': '200 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '250',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/cd479dc0-4a15-407d-891f-9fd2740bddda/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/cd479dc0-4a15-407d-891f-9fd2740bddda/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/cd479dc0-4a15-407d-891f-9fd2740bddda/3',\n 'title': '250 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '300',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9e1bb24f-d238-4078-871a-ac401b76ecf2/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9e1bb24f-d238-4078-871a-ac401b76ecf2/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9e1bb24f-d238-4078-871a-ac401b76ecf2/3',\n 'title': '300 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '350',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/6c4783cd-0aba-4e75-a7a4-f48a70b665b0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/6c4783cd-0aba-4e75-a7a4-f48a70b665b0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/6c4783cd-0aba-4e75-a7a4-f48a70b665b0/3',\n 'title': '350 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '400',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/6f4cab6b-def9-4d99-ad06-90b0013b28c8/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/6f4cab6b-def9-4d99-ad06-90b0013b28c8/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/6f4cab6b-def9-4d99-ad06-90b0013b28c8/3',\n 'title': '400 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '450',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/b593d68a-f8fb-4516-a09a-18cce955402c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/b593d68a-f8fb-4516-a09a-18cce955402c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/b593d68a-f8fb-4516-a09a-18cce955402c/3',\n 'title': '450 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '500',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/60e9504c-8c3d-489f-8a74-314fb195ad8d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/60e9504c-8c3d-489f-8a74-314fb195ad8d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/60e9504c-8c3d-489f-8a74-314fb195ad8d/3',\n 'title': '500 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '550',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/024d2563-1794-43ed-b8dc-33df3efae900/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/024d2563-1794-43ed-b8dc-33df3efae900/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/024d2563-1794-43ed-b8dc-33df3efae900/3',\n 'title': '550 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '600',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ecc3aab-09bf-4823-905e-3a4647171fc1/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ecc3aab-09bf-4823-905e-3a4647171fc1/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/3ecc3aab-09bf-4823-905e-3a4647171fc1/3',\n 'title': '600 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '650',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/eeabf43c-8e4c-448d-9790-4c2172c57944/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/eeabf43c-8e4c-448d-9790-4c2172c57944/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/eeabf43c-8e4c-448d-9790-4c2172c57944/3',\n 'title': '650 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '700',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4a9acdc7-30be-4dd1-9898-fc9e42b3d304/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4a9acdc7-30be-4dd1-9898-fc9e42b3d304/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4a9acdc7-30be-4dd1-9898-fc9e42b3d304/3',\n 'title': '700 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '750',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca17277c-53e5-422b-8bb4-7c5dcdb0ac67/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca17277c-53e5-422b-8bb4-7c5dcdb0ac67/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ca17277c-53e5-422b-8bb4-7c5dcdb0ac67/3',\n 'title': '750 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '800',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9c1fb96d-0579-43d7-ba94-94672eaef63a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9c1fb96d-0579-43d7-ba94-94672eaef63a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9c1fb96d-0579-43d7-ba94-94672eaef63a/3',\n 'title': '800 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '850',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/cc924aaf-dfd4-4f3f-822a-f5a87eb24069/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/cc924aaf-dfd4-4f3f-822a-f5a87eb24069/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/cc924aaf-dfd4-4f3f-822a-f5a87eb24069/3',\n 'title': '850 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '900',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/193d86f6-83e1-428c-9638-d6ca9e408166/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/193d86f6-83e1-428c-9638-d6ca9e408166/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/193d86f6-83e1-428c-9638-d6ca9e408166/3',\n 'title': '900 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '950',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/7ce130bd-6f55-40cc-9231-e2a4cb712962/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/7ce130bd-6f55-40cc-9231-e2a4cb712962/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/7ce130bd-6f55-40cc-9231-e2a4cb712962/3',\n 'title': '950 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '1000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/bfb7399a-c632-42f7-8d5f-154610dede81/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/bfb7399a-c632-42f7-8d5f-154610dede81/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/bfb7399a-c632-42f7-8d5f-154610dede81/3',\n 'title': '1000 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '2000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4e8b3a32-1513-44ad-8a12-6c90232c77f9/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4e8b3a32-1513-44ad-8a12-6c90232c77f9/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4e8b3a32-1513-44ad-8a12-6c90232c77f9/3',\n 'title': '2000 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '3000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/b18852ba-65d2-4b84-97d2-aeb6c44a0956/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/b18852ba-65d2-4b84-97d2-aeb6c44a0956/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/b18852ba-65d2-4b84-97d2-aeb6c44a0956/3',\n 'title': '3000 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '4000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/efbf3c93-ecfa-4b67-8d0a-1f732fb07397/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/efbf3c93-ecfa-4b67-8d0a-1f732fb07397/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/efbf3c93-ecfa-4b67-8d0a-1f732fb07397/3',\n 'title': '4000 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n {\n 'id': '5000',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d775275d-fd19-4914-b63a-7928a22135c3/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d775275d-fd19-4914-b63a-7928a22135c3/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d775275d-fd19-4914-b63a-7928a22135c3/3',\n 'title': '5000 Gift Subs',\n 'description': 'Has gifted a subscription to another viewer in this community',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'subscriber',\n 'versions': [\n {\n 'id': '0',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/3',\n 'title': 'Subscriber',\n 'description': 'Subscriber',\n 'click_action': 'subscribe_to_channel',\n 'click_url': null,\n },\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/3',\n 'title': 'Subscriber',\n 'description': 'Subscriber',\n 'click_action': 'subscribe_to_channel',\n 'click_url': null,\n },\n {\n 'id': '2',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/25a03e36-2bb2-4625-bd37-d6d9d406238d/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/25a03e36-2bb2-4625-bd37-d6d9d406238d/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/25a03e36-2bb2-4625-bd37-d6d9d406238d/3',\n 'title': '2-Month Subscriber',\n 'description': '2-Month Subscriber',\n 'click_action': 'subscribe_to_channel',\n 'click_url': null,\n },\n {\n 'id': '3',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e8984705-d091-4e54-8241-e53b30a84b0e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e8984705-d091-4e54-8241-e53b30a84b0e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e8984705-d091-4e54-8241-e53b30a84b0e/3',\n 'title': '3-Month Subscriber',\n 'description': '3-Month Subscriber',\n 'click_action': 'subscribe_to_channel',\n 'click_url': null,\n },\n {\n 'id': '4',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2d2485f6-d19b-4daa-8393-9493b019156b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2d2485f6-d19b-4daa-8393-9493b019156b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2d2485f6-d19b-4daa-8393-9493b019156b/3',\n 'title': '6-Month Subscriber',\n 'description': '6-Month Subscriber',\n 'click_action': 'subscribe_to_channel',\n 'click_url': null,\n },\n {\n 'id': '5',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/b4e6b13a-a76f-4c56-87e1-9375a7aaa610/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/b4e6b13a-a76f-4c56-87e1-9375a7aaa610/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/b4e6b13a-a76f-4c56-87e1-9375a7aaa610/3',\n 'title': '9-Month Subscriber',\n 'description': '9-Month Subscriber',\n 'click_action': 'subscribe_to_channel',\n 'click_url': null,\n },\n {\n 'id': '6',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed51a614-2c44-4a60-80b6-62908436b43a/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed51a614-2c44-4a60-80b6-62908436b43a/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed51a614-2c44-4a60-80b6-62908436b43a/3',\n 'title': '6-Month Subscriber',\n 'description': '1-Year Subscriber',\n 'click_action': 'subscribe_to_channel',\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'subtember-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a9c01f28-179e-486d-a4c7-2277e4f6adb4/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a9c01f28-179e-486d-a4c7-2277e4f6adb4/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a9c01f28-179e-486d-a4c7-2277e4f6adb4/3',\n 'title': 'SUBtember 2025',\n 'description': 'Badge given to users who sub, gift, or use bits during SUBtember 2025.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'superultracombo-2023',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5864739a-5e58-4623-9450-a2c0555ef90b/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5864739a-5e58-4623-9450-a2c0555ef90b/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5864739a-5e58-4623-9450-a2c0555ef90b/3',\n 'title': 'SuperUltraCombo 2023',\n 'description': \"This user joined Twitch's SuperUltraCombo 2023\",\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'survival-cup-4',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9ff55f50-2c2a-40c2-9863-158d5ac2d5fd/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9ff55f50-2c2a-40c2-9863-158d5ac2d5fd/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9ff55f50-2c2a-40c2-9863-158d5ac2d5fd/3',\n 'title': 'Survival Cup 4',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a streamer during Survival Cup 4!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'tft-paris-open',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5688799-c50c-4878-b451-de78f3ef6a56/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5688799-c50c-4878-b451-de78f3ef6a56/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/c5688799-c50c-4878-b451-de78f3ef6a56/3',\n 'title': 'TFT Paris Open',\n 'description':\n 'This chat badge was awarded for gifting two subscriptions to a TFT streamer during the 2025 TFT Paris Open!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'the-deer',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/5f026869-a186-4f98-bb11-3eb148633d85/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/5f026869-a186-4f98-bb11-3eb148633d85/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/5f026869-a186-4f98-bb11-3eb148633d85/3',\n 'title': 'The Deer',\n 'description': 'This badge was earned by watching Roblox during the Bloxfest Qualifiers.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'the-first-descendant-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/a56ef091-e8cd-49bd-9de9-7b342c9a7e7e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/a56ef091-e8cd-49bd-9de9-7b342c9a7e7e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/a56ef091-e8cd-49bd-9de9-7b342c9a7e7e/3',\n 'title': 'The First Descendant Badge',\n 'description':\n 'This badge was earned by subscribing to a streamer playing The First Descendant during launch week!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'the-man-without-fear',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4ca893e7-6ee3-4437-acdd-071340913d3c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4ca893e7-6ee3-4437-acdd-071340913d3c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4ca893e7-6ee3-4437-acdd-071340913d3c/3',\n 'title': 'The Man Without Fear',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Marvel Rivals category for the start of Season 4.5!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'the-onryos-mask',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/e0d21894-8d58-4266-9127-b1bd61177899/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/e0d21894-8d58-4266-9127-b1bd61177899/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/e0d21894-8d58-4266-9127-b1bd61177899/3',\n 'title': \"The Onryō's Mask\",\n 'description':\n \"This badge was earned by subscribing to a Ghost of Yotei streamer during the game's launch!\",\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'together-for-good-25---good-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/192fb627-82b3-46e8-95d3-ac9feba4b1bc/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/192fb627-82b3-46e8-95d3-ac9feba4b1bc/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/192fb627-82b3-46e8-95d3-ac9feba4b1bc/3',\n 'title': \"Together for Good '25 - Good Badge\",\n 'description':\n 'This badge was earned by donating $5 or more during Twitch Together for Good 2025!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'together-for-good-25---gooder-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/84a37e81-9d61-4c29-970e-64a32ec040c7/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/84a37e81-9d61-4c29-970e-64a32ec040c7/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/84a37e81-9d61-4c29-970e-64a32ec040c7/3',\n 'title': \"Together for Good '25 - Gooder Badge\",\n 'description':\n 'This badge was earned by donating $50 or more during Twitch Together for Good 2025!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'together-for-good-25---goodest-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/928b8033-3777-49cb-a056-230135a08a62/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/928b8033-3777-49cb-a056-230135a08a62/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/928b8033-3777-49cb-a056-230135a08a62/3',\n 'title': \"Together for Good '25 - Goodest Badge\",\n 'description':\n 'This badge was earned by donating $100 or more during Twitch Together for Good 2025!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'together-for-good-25---wicked-dub-badge',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/9ddae219-6674-4fbc-add9-6e4e6572ea8e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/9ddae219-6674-4fbc-add9-6e4e6572ea8e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/9ddae219-6674-4fbc-add9-6e4e6572ea8e/3',\n 'title': \"Together for Good '25 - Wicked Dub Badge\",\n 'description':\n 'This badge was earned by donating at least $5 to a charity stream using Stream Together during Together for Good 2025!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'total-war-anniversary',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/17604bfd-aeb6-427d-bd0e-cae93bed6f36/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/17604bfd-aeb6-427d-bd0e-cae93bed6f36/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/17604bfd-aeb6-427d-bd0e-cae93bed6f36/3',\n 'title': 'Total War Anniversary',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Total War: Warhammer III category during the Total War 25th Anniversary.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'toxic-zombie',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ccdf9673-a0b8-4bc1-a40f-105b8b951f98/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ccdf9673-a0b8-4bc1-a40f-105b8b951f98/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ccdf9673-a0b8-4bc1-a40f-105b8b951f98/3',\n 'title': 'Toxic Zombie',\n 'description':\n 'Purchase 1 new recurring or gift subscription during the Toxic Commando launch 2026 and claim the reward',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'turbo',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/bd444ec6-8f34-4bf9-91f4-af1e3428d80f/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/bd444ec6-8f34-4bf9-91f4-af1e3428d80f/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/bd444ec6-8f34-4bf9-91f4-af1e3428d80f/3',\n 'title': 'Turbo',\n 'description': \"A subscriber of Twitch's monthly premium user service\",\n 'click_action': 'turbo',\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'twitchcon-2026-europe-row-houses',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/4a354d32-ca7f-4d6f-815a-f80be9c7c088/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/4a354d32-ca7f-4d6f-815a-f80be9c7c088/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/4a354d32-ca7f-4d6f-815a-f80be9c7c088/3',\n 'title': 'TwitchCon 2026 - Europe - Row Houses',\n 'description':\n 'This badge is given to anyone who purchased a 1-day ticket to TwitchCon Europe 2026.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'twitchcon-2026-europe-windmill',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed34b8e2-7c1c-4551-b4d7-63b44d61fb31/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed34b8e2-7c1c-4551-b4d7-63b44d61fb31/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ed34b8e2-7c1c-4551-b4d7-63b44d61fb31/3',\n 'title': 'TwitchCon 2026 - Europe - Windmill',\n 'description':\n 'This badge is given to anyone who purchased a 2-day ticket to TwitchCon Europe 2026.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'umbrella-corporation',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/995ff00f-c16c-4782-86ba-f2d7668dc6a2/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/995ff00f-c16c-4782-86ba-f2d7668dc6a2/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/995ff00f-c16c-4782-86ba-f2d7668dc6a2/3',\n 'title': 'Umbrella Corporation',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a Resident Evil: Requiem streamer.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'user-anniversary',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/ccbbedaa-f4db-4d0b-9c2a-375de7ad947c/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/ccbbedaa-f4db-4d0b-9c2a-375de7ad947c/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/ccbbedaa-f4db-4d0b-9c2a-375de7ad947c/3',\n 'title': 'Twitchiversary Badge',\n 'description': 'Staff badge celebrating Twitch tenure',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'vct-paris-2025',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/63c91cf1-53d1-4ee9-821f-b4d6e4144e8e/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/63c91cf1-53d1-4ee9-821f-b4d6e4144e8e/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/63c91cf1-53d1-4ee9-821f-b4d6e4144e8e/3',\n 'title': 'VCT Paris 2025',\n 'description':\n 'This badge was earned by subscribing to a VALORANT streamer while watching VALORANT Champions 2025!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'yellow-noob',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/d87a78f5-76d9-451f-8f31-752a369e6045/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/d87a78f5-76d9-451f-8f31-752a369e6045/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/d87a78f5-76d9-451f-8f31-752a369e6045/3',\n 'title': 'Yellow Noob',\n 'description':\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Roblox category during Bloxfest.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'zevent-2024',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/2040d479-b815-4617-8a55-9aed027e30d0/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/2040d479-b815-4617-8a55-9aed027e30d0/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/2040d479-b815-4617-8a55-9aed027e30d0/3',\n 'title': 'ZEVENT 2024',\n 'description': 'This badge was earned for watching ZEVENT 2024!',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n {\n 'set_id': 'zevent25',\n 'versions': [\n {\n 'id': '1',\n 'image_url_1x':\n 'https://static-cdn.jtvnw.net/badges/v1/7c39aa87-4659-4e8f-abaf-c29614cd8a29/1',\n 'image_url_2x':\n 'https://static-cdn.jtvnw.net/badges/v1/7c39aa87-4659-4e8f-abaf-c29614cd8a29/2',\n 'image_url_4x':\n 'https://static-cdn.jtvnw.net/badges/v1/7c39aa87-4659-4e8f-abaf-c29614cd8a29/3',\n 'title': 'ZEVENT25',\n 'description': 'This badge was earned by watching a ZEvent25 stream.',\n 'click_action': null,\n 'click_url': null,\n },\n ],\n },\n];\n","export const css_color_names = [\n 'aliceblue',\n 'antiquewhite',\n 'aqua',\n 'aquamarine',\n 'azure',\n 'beige',\n 'bisque',\n 'black',\n 'blanchedalmond',\n 'blue',\n 'blueviolet',\n 'brown',\n 'burlywood',\n 'cadetblue',\n 'chartreuse',\n 'chocolate',\n 'coral',\n 'cornflowerblue',\n 'cornsilk',\n 'crimson',\n 'cyan',\n 'darkblue',\n 'darkcyan',\n 'darkgoldenrod',\n 'darkgray',\n 'darkgreen',\n 'darkgrey',\n 'darkkhaki',\n 'darkmagenta',\n 'darkolivegreen',\n 'darkorange',\n 'darkorchid',\n 'darkred',\n 'darksalmon',\n 'darkseagreen',\n 'darkslateblue',\n 'darkslategray',\n 'darkslategrey',\n 'darkturquoise',\n 'darkviolet',\n 'deeppink',\n 'deepskyblue',\n 'dimgray',\n 'dimgrey',\n 'dodgerblue',\n 'firebrick',\n 'floralwhite',\n 'forestgreen',\n 'fuchsia',\n 'gainsboro',\n 'ghostwhite',\n 'gold',\n 'goldenrod',\n 'gray',\n 'green',\n 'greenyellow',\n 'grey',\n 'honeydew',\n 'hotpink',\n 'indianred',\n 'indigo',\n 'ivory',\n 'khaki',\n 'lavender',\n 'lavenderblush',\n 'lawngreen',\n 'lemonchiffon',\n 'lightblue',\n 'lightcoral',\n 'lightcyan',\n 'lightgoldenrodyellow',\n 'lightgray',\n 'lightgreen',\n 'lightgrey',\n 'lightpink',\n 'lightsalmon',\n 'lightseagreen',\n 'lightskyblue',\n 'lightslategray',\n 'lightslategrey',\n 'lightsteelblue',\n 'lightyellow',\n 'lime',\n 'limegreen',\n 'linen',\n 'magenta',\n 'maroon',\n 'mediumaquamarine',\n 'mediumblue',\n 'mediumorchid',\n 'mediumpurple',\n 'mediumseagreen',\n 'mediumslateblue',\n 'mediumspringgreen',\n 'mediumturquoise',\n 'mediumvioletred',\n 'midnightblue',\n 'mintcream',\n 'mistyrose',\n 'moccasin',\n 'navajowhite',\n 'navy',\n 'oldlace',\n 'olive',\n 'olivedrab',\n 'orange',\n 'orangered',\n 'orchid',\n 'palegoldenrod',\n 'palegreen',\n 'paleturquoise',\n 'palevioletred',\n 'papayawhip',\n 'peachpuff',\n 'peru',\n 'pink',\n 'plum',\n 'powderblue',\n 'purple',\n 'rebeccapurple',\n 'red',\n 'rosybrown',\n 'royalblue',\n 'saddlebrown',\n 'salmon',\n 'sandybrown',\n 'seagreen',\n 'seashell',\n 'sienna',\n 'silver',\n 'skyblue',\n 'slateblue',\n 'slategray',\n 'slategrey',\n 'snow',\n 'springgreen',\n 'steelblue',\n 'tan',\n 'teal',\n 'thistle',\n 'tomato',\n 'turquoise',\n 'violet',\n 'wheat',\n 'white',\n 'whitesmoke',\n 'yellow',\n 'yellowgreen',\n 'transparent',\n];\n","import { BttvEmote, SeventvEmote, TwitchEmote } from '../../types/emote.js';\n\nconst SeventvEmotes = [\n {\n 'id': '01FCY771D800007PQ2DF3GDTN6',\n 'name': 'RainTime',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01FCY771D800007PQ2DF3GDTN6/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01FCY771D800007PQ2DF3GDTN6/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01FCY771D800007PQ2DF3GDTN6/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01FCY771D800007PQ2DF3GDTN6/4x.webp',\n },\n },\n {\n 'id': '01FE3XY508000AA32JP519W2EW',\n 'name': 'PETPET',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/4x.webp',\n },\n },\n {\n 'id': '01GGD5PJA8000FH13S498E9D8X',\n 'name': 'ppL',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GGD5PJA8000FH13S498E9D8X/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GGD5PJA8000FH13S498E9D8X/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GGD5PJA8000FH13S498E9D8X/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GGD5PJA8000FH13S498E9D8X/4x.webp',\n },\n },\n {\n 'id': '01GB2TN09G000AZXHZ8HNEZX6G',\n 'name': 'Clap2',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB2TN09G000AZXHZ8HNEZX6G/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB2TN09G000AZXHZ8HNEZX6G/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB2TN09G000AZXHZ8HNEZX6G/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB2TN09G000AZXHZ8HNEZX6G/4x.webp',\n },\n },\n {\n 'id': '01GAM8EFQ00004MXFXAJYKA859',\n 'name': 'Clap',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GAM8EFQ00004MXFXAJYKA859/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GAM8EFQ00004MXFXAJYKA859/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GAM8EFQ00004MXFXAJYKA859/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GAM8EFQ00004MXFXAJYKA859/4x.webp',\n },\n },\n {\n 'id': '01GAFTZ9K80003DHH026MC7JW0',\n 'name': 'PepePls',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GAFTZ9K80003DHH026MC7JW0/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GAFTZ9K80003DHH026MC7JW0/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GAFTZ9K80003DHH026MC7JW0/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GAFTZ9K80003DHH026MC7JW0/4x.webp',\n },\n },\n {\n 'id': '01GAZ199Z8000FEWHS6AT5QZV0',\n 'name': 'peepoHappy',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GAZ199Z8000FEWHS6AT5QZV0/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GAZ199Z8000FEWHS6AT5QZV0/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GAZ199Z8000FEWHS6AT5QZV0/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GAZ199Z8000FEWHS6AT5QZV0/4x.webp',\n },\n },\n {\n 'id': '01GAZ4SBX80007YCE2RXBT44B2',\n 'name': 'peepoSad',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GAZ4SBX80007YCE2RXBT44B2/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GAZ4SBX80007YCE2RXBT44B2/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GAZ4SBX80007YCE2RXBT44B2/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GAZ4SBX80007YCE2RXBT44B2/4x.webp',\n },\n },\n {\n 'id': '01GB9W8JN80004CKF2H1TWA99H',\n 'name': 'FeelsDankMan',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB9W8JN80004CKF2H1TWA99H/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB9W8JN80004CKF2H1TWA99H/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB9W8JN80004CKF2H1TWA99H/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB9W8JN80004CKF2H1TWA99H/4x.webp',\n },\n },\n {\n 'id': '01GB2S7H7000018VJGJ4A9BMFS',\n 'name': 'BillyApprove',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB2S7H7000018VJGJ4A9BMFS/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB2S7H7000018VJGJ4A9BMFS/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB2S7H7000018VJGJ4A9BMFS/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB2S7H7000018VJGJ4A9BMFS/4x.webp',\n },\n },\n {\n 'id': '01GB8EQNJ8000497KFBZWNSDFZ',\n 'name': 'forsenPls',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB8EQNJ8000497KFBZWNSDFZ/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB8EQNJ8000497KFBZWNSDFZ/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB8EQNJ8000497KFBZWNSDFZ/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB8EQNJ8000497KFBZWNSDFZ/4x.webp',\n },\n },\n {\n 'id': '01GB54CZTG0004ZBZEDT30HE2M',\n 'name': 'RoxyPotato',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB54CZTG0004ZBZEDT30HE2M/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB54CZTG0004ZBZEDT30HE2M/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB54CZTG0004ZBZEDT30HE2M/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB54CZTG0004ZBZEDT30HE2M/4x.webp',\n },\n },\n {\n 'id': '01GB4P2HX0000BJ5HR8F6XV9Q0',\n 'name': 'gachiBASS',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB4P2HX0000BJ5HR8F6XV9Q0/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB4P2HX0000BJ5HR8F6XV9Q0/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB4P2HX0000BJ5HR8F6XV9Q0/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB4P2HX0000BJ5HR8F6XV9Q0/4x.webp',\n },\n },\n {\n 'id': '01GKQXGX1R000216YB0K7GN92X',\n 'name': '(7TV)',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GKQXGX1R000216YB0K7GN92X/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GKQXGX1R000216YB0K7GN92X/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GKQXGX1R000216YB0K7GN92X/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GKQXGX1R000216YB0K7GN92X/4x.webp',\n },\n },\n {\n 'id': '01FKSDK14G0008TM5NY9QEG0QV',\n 'name': 'PartyParrot',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01FKSDK14G0008TM5NY9QEG0QV/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01FKSDK14G0008TM5NY9QEG0QV/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01FKSDK14G0008TM5NY9QEG0QV/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01FKSDK14G0008TM5NY9QEG0QV/4x.webp',\n },\n },\n {\n 'id': '01GB5VC57000003DZTMZQNY944',\n 'name': 'RebeccaBlack',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB5VC57000003DZTMZQNY944/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB5VC57000003DZTMZQNY944/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB5VC57000003DZTMZQNY944/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB5VC57000003DZTMZQNY944/4x.webp',\n },\n },\n {\n 'id': '01F014S6KG0007E4VV006YKSM3',\n 'name': 'reckH',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01F014S6KG0007E4VV006YKSM3/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01F014S6KG0007E4VV006YKSM3/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01F014S6KG0007E4VV006YKSM3/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01F014S6KG0007E4VV006YKSM3/4x.webp',\n },\n },\n {\n 'id': '01G98W833R0000BRQD106P0ZNT',\n 'name': 'WAYTOODANK',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01G98W833R0000BRQD106P0ZNT/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01G98W833R0000BRQD106P0ZNT/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01G98W833R0000BRQD106P0ZNT/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01G98W833R0000BRQD106P0ZNT/4x.webp',\n },\n },\n {\n 'id': '01GB2ZJFBG000DTBJYANG8XYFP',\n 'name': 'AlienDance',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB2ZJFBG000DTBJYANG8XYFP/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB2ZJFBG000DTBJYANG8XYFP/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB2ZJFBG000DTBJYANG8XYFP/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB2ZJFBG000DTBJYANG8XYFP/4x.webp',\n },\n },\n {\n 'id': '01G4GQC5H0000D3DGNAYJJP8EB',\n 'name': 'Gayge',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01G4GQC5H0000D3DGNAYJJP8EB/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01G4GQC5H0000D3DGNAYJJP8EB/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01G4GQC5H0000D3DGNAYJJP8EB/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01G4GQC5H0000D3DGNAYJJP8EB/4x.webp',\n },\n },\n {\n 'id': '01GGCQPCGR000C7MT8JZGP6E89',\n 'name': 'ApuApustaja',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GGCQPCGR000C7MT8JZGP6E89/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GGCQPCGR000C7MT8JZGP6E89/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GGCQPCGR000C7MT8JZGP6E89/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GGCQPCGR000C7MT8JZGP6E89/4x.webp',\n },\n },\n {\n 'id': '01GB9W2CDG000BFSD141G0MGSA',\n 'name': 'BasedGod',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB9W2CDG000BFSD141G0MGSA/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB9W2CDG000BFSD141G0MGSA/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB9W2CDG000BFSD141G0MGSA/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB9W2CDG000BFSD141G0MGSA/4x.webp',\n },\n },\n {\n 'id': '01G98V5RFG0001CD052SPS435F',\n 'name': 'GuitarTime',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01G98V5RFG0001CD052SPS435F/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01G98V5RFG0001CD052SPS435F/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01G98V5RFG0001CD052SPS435F/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01G98V5RFG0001CD052SPS435F/4x.webp',\n },\n },\n {\n 'id': '01HM524VE80004SKSHMCZWXH1T',\n 'name': 'peepoPls',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01HM524VE80004SKSHMCZWXH1T/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01HM524VE80004SKSHMCZWXH1T/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01HM524VE80004SKSHMCZWXH1T/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01HM524VE80004SKSHMCZWXH1T/4x.webp',\n },\n },\n {\n 'id': '01HM4P26CR000449DZBT4FVMA5',\n 'name': 'TeaTime',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01HM4P26CR000449DZBT4FVMA5/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01HM4P26CR000449DZBT4FVMA5/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01HM4P26CR000449DZBT4FVMA5/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01HM4P26CR000449DZBT4FVMA5/4x.webp',\n },\n },\n {\n 'id': '01HM4PGHC80007635TAZG67FT5',\n 'name': 'WineTime',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01HM4PGHC80007635TAZG67FT5/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01HM4PGHC80007635TAZG67FT5/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01HM4PGHC80007635TAZG67FT5/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01HM4PGHC80007635TAZG67FT5/4x.webp',\n },\n },\n {\n 'id': '01G98V81Q80000BRQD106P0ZEK',\n 'name': 'PianoTime',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01G98V81Q80000BRQD106P0ZEK/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01G98V81Q80000BRQD106P0ZEK/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01G98V81Q80000BRQD106P0ZEK/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01G98V81Q80000BRQD106P0ZEK/4x.webp',\n },\n },\n {\n 'id': '01G98TT6BR000A39K5ZSQFTPWR',\n 'name': 'CrayonTime',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01G98TT6BR000A39K5ZSQFTPWR/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01G98TT6BR000A39K5ZSQFTPWR/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01G98TT6BR000A39K5ZSQFTPWR/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01G98TT6BR000A39K5ZSQFTPWR/4x.webp',\n },\n },\n {\n 'id': '01HM6NJ2X000035ZKVAPWBNW26',\n 'name': 'nymnCorn',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01HM6NJ2X000035ZKVAPWBNW26/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01HM6NJ2X000035ZKVAPWBNW26/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01HM6NJ2X000035ZKVAPWBNW26/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01HM6NJ2X000035ZKVAPWBNW26/4x.webp',\n },\n },\n {\n 'id': '01HM2F7Q1R00022X3E2804NBNQ',\n 'name': 'SteerR',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01HM2F7Q1R00022X3E2804NBNQ/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01HM2F7Q1R00022X3E2804NBNQ/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01HM2F7Q1R00022X3E2804NBNQ/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01HM2F7Q1R00022X3E2804NBNQ/4x.webp',\n },\n },\n {\n 'id': '01J107C3E8000DX4MZBQSYGRXS',\n 'name': 'sevenTV',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01J107C3E8000DX4MZBQSYGRXS/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01J107C3E8000DX4MZBQSYGRXS/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01J107C3E8000DX4MZBQSYGRXS/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01J107C3E8000DX4MZBQSYGRXS/4x.webp',\n },\n },\n {\n 'id': '01FTEZEE900001E12995B12GR4',\n 'name': 'nanaAYAYA',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01FTEZEE900001E12995B12GR4/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01FTEZEE900001E12995B12GR4/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01FTEZEE900001E12995B12GR4/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01FTEZEE900001E12995B12GR4/4x.webp',\n },\n },\n {\n 'id': '01J8NMZ2HG0005G1FWF2H9Y615',\n 'name': 'BibleThump',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01J8NMZ2HG0005G1FWF2H9Y615/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01J8NMZ2HG0005G1FWF2H9Y615/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01J8NMZ2HG0005G1FWF2H9Y615/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01J8NMZ2HG0005G1FWF2H9Y615/4x.webp',\n },\n },\n {\n 'id': '01H16FA16G0005EZED5J0EY7KN',\n 'name': 'glorp',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01H16FA16G0005EZED5J0EY7KN/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01H16FA16G0005EZED5J0EY7KN/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01H16FA16G0005EZED5J0EY7KN/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01H16FA16G0005EZED5J0EY7KN/4x.webp',\n },\n },\n {\n 'id': '01GG3YGWK8000DWE419062SG28',\n 'name': 'Stare',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GG3YGWK8000DWE419062SG28/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GG3YGWK8000DWE419062SG28/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GG3YGWK8000DWE419062SG28/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GG3YGWK8000DWE419062SG28/4x.webp',\n },\n },\n {\n 'id': '01JY2MX5BE5BVWWFV153ANMMHZ',\n 'name': 'aceStare',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01JY2MX5BE5BVWWFV153ANMMHZ/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01JY2MX5BE5BVWWFV153ANMMHZ/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01JY2MX5BE5BVWWFV153ANMMHZ/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01JY2MX5BE5BVWWFV153ANMMHZ/4x.webp',\n },\n },\n {\n 'id': '01F9EM2ETG000E7SC8F953GXCX',\n 'name': 'gachiGASM',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01F9EM2ETG000E7SC8F953GXCX/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01F9EM2ETG000E7SC8F953GXCX/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01F9EM2ETG000E7SC8F953GXCX/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01F9EM2ETG000E7SC8F953GXCX/4x.webp',\n },\n },\n {\n 'id': '01GB32XE6R00018VJGJ4A9BNCV',\n 'name': 'AYAYA',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/4x.webp',\n },\n },\n {\n 'id': '01GB4XE3ZR000DKFRGM9Q1M7VS',\n 'name': 'RareParrot',\n 'platform': '7tv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB4XE3ZR000DKFRGM9Q1M7VS/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB4XE3ZR000DKFRGM9Q1M7VS/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB4XE3ZR000DKFRGM9Q1M7VS/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB4XE3ZR000DKFRGM9Q1M7VS/4x.webp',\n },\n },\n {\n 'id': '01GB4FWTR8000DGEZ8VYY59RBN',\n 'name': 'FeelsWeirdMan',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB4FWTR8000DGEZ8VYY59RBN/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB4FWTR8000DGEZ8VYY59RBN/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB4FWTR8000DGEZ8VYY59RBN/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB4FWTR8000DGEZ8VYY59RBN/4x.webp',\n },\n },\n {\n 'id': '01GB4CK01800090V9B3D8CGEEX',\n 'name': 'EZ',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB4CK01800090V9B3D8CGEEX/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB4CK01800090V9B3D8CGEEX/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB4CK01800090V9B3D8CGEEX/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB4CK01800090V9B3D8CGEEX/4x.webp',\n },\n },\n {\n 'id': '01GB46137R000BJ5HR8F6XV8J1',\n 'name': 'FeelsOkayMan',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB46137R000BJ5HR8F6XV8J1/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB46137R000BJ5HR8F6XV8J1/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB46137R000BJ5HR8F6XV8J1/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB46137R000BJ5HR8F6XV8J1/4x.webp',\n },\n },\n {\n 'id': '01GB4EV0Q800090V9B3D8CGEHV',\n 'name': 'FeelsStrongMan',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GB4EV0Q800090V9B3D8CGEHV/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB4EV0Q800090V9B3D8CGEHV/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB4EV0Q800090V9B3D8CGEHV/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB4EV0Q800090V9B3D8CGEHV/4x.webp',\n },\n },\n {\n 'id': '01GBFDVP18000CRDCG0DV7KEMY',\n 'name': '7Cinema',\n 'platform': '7tv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.7tv.app/emote/01GBFDVP18000CRDCG0DV7KEMY/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GBFDVP18000CRDCG0DV7KEMY/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GBFDVP18000CRDCG0DV7KEMY/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GBFDVP18000CRDCG0DV7KEMY/4x.webp',\n },\n },\n];\n\nconst BttvEmotes = [\n {\n 'id': '54fa8f1401e468494b85b537',\n 'name': ':tf:',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fa8f1401e468494b85b537/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa8f1401e468494b85b537/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa8f1401e468494b85b537/3x',\n },\n },\n {\n 'id': '54fa8fce01e468494b85b53c',\n 'name': 'CiGrip',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fa8fce01e468494b85b53c/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa8fce01e468494b85b53c/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa8fce01e468494b85b53c/3x',\n },\n },\n {\n 'id': '54fa903b01e468494b85b53f',\n 'name': 'DatSauce',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fa903b01e468494b85b53f/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa903b01e468494b85b53f/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa903b01e468494b85b53f/3x',\n },\n },\n {\n 'id': '54fa909b01e468494b85b542',\n 'name': 'ForeverAlone',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fa909b01e468494b85b542/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa909b01e468494b85b542/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa909b01e468494b85b542/3x',\n },\n },\n {\n 'id': '54fa90ba01e468494b85b543',\n 'name': 'GabeN',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fa90ba01e468494b85b543/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa90ba01e468494b85b543/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa90ba01e468494b85b543/3x',\n },\n },\n {\n 'id': '54fa90f201e468494b85b545',\n 'name': 'HailHelix',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fa90f201e468494b85b545/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa90f201e468494b85b545/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa90f201e468494b85b545/3x',\n },\n },\n {\n 'id': '54fa932201e468494b85b555',\n 'name': 'ShoopDaWhoop',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fa932201e468494b85b555/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa932201e468494b85b555/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa932201e468494b85b555/3x',\n },\n },\n {\n 'id': '54fab45f633595ca4c713abc',\n 'name': 'M&Mjc',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fab45f633595ca4c713abc/1x',\n '2': 'https://cdn.betterttv.net/emote/54fab45f633595ca4c713abc/2x',\n '4': 'https://cdn.betterttv.net/emote/54fab45f633595ca4c713abc/3x',\n },\n },\n {\n 'id': '54fab7d2633595ca4c713abf',\n 'name': 'bttvNice',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fab7d2633595ca4c713abf/1x',\n '2': 'https://cdn.betterttv.net/emote/54fab7d2633595ca4c713abf/2x',\n '4': 'https://cdn.betterttv.net/emote/54fab7d2633595ca4c713abf/3x',\n },\n },\n {\n 'id': '54fa935601e468494b85b557',\n 'name': 'TwaT',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fa935601e468494b85b557/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa935601e468494b85b557/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa935601e468494b85b557/3x',\n },\n },\n {\n 'id': '54fa99b601e468494b85b55d',\n 'name': 'WatChuSay',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fa99b601e468494b85b55d/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa99b601e468494b85b55d/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa99b601e468494b85b55d/3x',\n },\n },\n {\n 'id': '566ca11a65dbbdab32ec0558',\n 'name': 'tehPoleCat',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566ca11a65dbbdab32ec0558/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca11a65dbbdab32ec0558/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca11a65dbbdab32ec0558/3x',\n },\n },\n {\n 'id': '566ca1a365dbbdab32ec055b',\n 'name': 'AngelThump',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566ca1a365dbbdab32ec055b/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca1a365dbbdab32ec055b/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca1a365dbbdab32ec055b/3x',\n },\n },\n {\n 'id': '54fbefeb01abde735115de5b',\n 'name': 'TaxiBro',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fbefeb01abde735115de5b/1x',\n '2': 'https://cdn.betterttv.net/emote/54fbefeb01abde735115de5b/2x',\n '4': 'https://cdn.betterttv.net/emote/54fbefeb01abde735115de5b/3x',\n },\n },\n {\n 'id': '54fbf00a01abde735115de5c',\n 'name': 'BroBalt',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fbf00a01abde735115de5c/1x',\n '2': 'https://cdn.betterttv.net/emote/54fbf00a01abde735115de5c/2x',\n '4': 'https://cdn.betterttv.net/emote/54fbf00a01abde735115de5c/3x',\n },\n },\n {\n 'id': '54fbf09c01abde735115de61',\n 'name': 'CandianRage',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/54fbf09c01abde735115de61/1x',\n '2': 'https://cdn.betterttv.net/emote/54fbf09c01abde735115de61/2x',\n '4': 'https://cdn.betterttv.net/emote/54fbf09c01abde735115de61/3x',\n },\n },\n {\n 'id': '55028cd2135896936880fdd7',\n 'name': 'D:',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/55028cd2135896936880fdd7/1x',\n '2': 'https://cdn.betterttv.net/emote/55028cd2135896936880fdd7/2x',\n '4': 'https://cdn.betterttv.net/emote/55028cd2135896936880fdd7/3x',\n },\n },\n {\n 'id': '550352766f86a5b26c281ba2',\n 'name': 'VisLaud',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/550352766f86a5b26c281ba2/1x',\n '2': 'https://cdn.betterttv.net/emote/550352766f86a5b26c281ba2/2x',\n '4': 'https://cdn.betterttv.net/emote/550352766f86a5b26c281ba2/3x',\n },\n },\n {\n 'id': '550b344bff8ecee922d2a3c1',\n 'name': 'KaRappa',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/550b344bff8ecee922d2a3c1/1x',\n '2': 'https://cdn.betterttv.net/emote/550b344bff8ecee922d2a3c1/2x',\n '4': 'https://cdn.betterttv.net/emote/550b344bff8ecee922d2a3c1/3x',\n },\n },\n {\n 'id': '566ca00f65dbbdab32ec0544',\n 'name': 'FishMoley',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566ca00f65dbbdab32ec0544/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca00f65dbbdab32ec0544/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca00f65dbbdab32ec0544/3x',\n },\n },\n {\n 'id': '566ca02865dbbdab32ec0547',\n 'name': 'Hhhehehe',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566ca02865dbbdab32ec0547/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca02865dbbdab32ec0547/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca02865dbbdab32ec0547/3x',\n },\n },\n {\n 'id': '566ca04265dbbdab32ec054a',\n 'name': 'KKona',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566ca04265dbbdab32ec054a/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca04265dbbdab32ec054a/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca04265dbbdab32ec054a/3x',\n },\n },\n {\n 'id': '566ca09365dbbdab32ec0555',\n 'name': 'PoleDoge',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566ca09365dbbdab32ec0555/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca09365dbbdab32ec0555/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca09365dbbdab32ec0555/3x',\n },\n },\n {\n 'id': '553b48a21f145f087fc15ca6',\n 'name': 'sosGame',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/553b48a21f145f087fc15ca6/1x',\n '2': 'https://cdn.betterttv.net/emote/553b48a21f145f087fc15ca6/2x',\n '4': 'https://cdn.betterttv.net/emote/553b48a21f145f087fc15ca6/3x',\n },\n },\n {\n 'id': '55471c2789d53f2d12781713',\n 'name': 'CruW',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/55471c2789d53f2d12781713/1x',\n '2': 'https://cdn.betterttv.net/emote/55471c2789d53f2d12781713/2x',\n '4': 'https://cdn.betterttv.net/emote/55471c2789d53f2d12781713/3x',\n },\n },\n {\n 'id': '555015b77676617e17dd2e8e',\n 'name': 'RarePepe',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/555015b77676617e17dd2e8e/1x',\n '2': 'https://cdn.betterttv.net/emote/555015b77676617e17dd2e8e/2x',\n '4': 'https://cdn.betterttv.net/emote/555015b77676617e17dd2e8e/3x',\n },\n },\n {\n 'id': '555981336ba1901877765555',\n 'name': 'haHAA',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/555981336ba1901877765555/1x',\n '2': 'https://cdn.betterttv.net/emote/555981336ba1901877765555/2x',\n '4': 'https://cdn.betterttv.net/emote/555981336ba1901877765555/3x',\n },\n },\n {\n 'id': '55b6524154eefd53777b2580',\n 'name': 'FeelsBirthdayMan',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/55b6524154eefd53777b2580/1x',\n '2': 'https://cdn.betterttv.net/emote/55b6524154eefd53777b2580/2x',\n '4': 'https://cdn.betterttv.net/emote/55b6524154eefd53777b2580/3x',\n },\n },\n {\n 'id': '55f324c47f08be9f0a63cce0',\n 'name': 'RonSmug',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/55f324c47f08be9f0a63cce0/1x',\n '2': 'https://cdn.betterttv.net/emote/55f324c47f08be9f0a63cce0/2x',\n '4': 'https://cdn.betterttv.net/emote/55f324c47f08be9f0a63cce0/3x',\n },\n },\n {\n 'id': '560577560874de34757d2dc0',\n 'name': 'KappaCool',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/560577560874de34757d2dc0/1x',\n '2': 'https://cdn.betterttv.net/emote/560577560874de34757d2dc0/2x',\n '4': 'https://cdn.betterttv.net/emote/560577560874de34757d2dc0/3x',\n },\n },\n {\n 'id': '566c9fc265dbbdab32ec053b',\n 'name': 'FeelsBadMan',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566c9fc265dbbdab32ec053b/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9fc265dbbdab32ec053b/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9fc265dbbdab32ec053b/3x',\n },\n },\n {\n 'id': '566c9f3b65dbbdab32ec052e',\n 'name': 'bUrself',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566c9f3b65dbbdab32ec052e/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9f3b65dbbdab32ec052e/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9f3b65dbbdab32ec052e/3x',\n },\n },\n {\n 'id': '566c9f6365dbbdab32ec0532',\n 'name': 'ConcernDoge',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566c9f6365dbbdab32ec0532/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9f6365dbbdab32ec0532/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9f6365dbbdab32ec0532/3x',\n },\n },\n {\n 'id': '566c9fde65dbbdab32ec053e',\n 'name': 'FeelsGoodMan',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566c9fde65dbbdab32ec053e/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9fde65dbbdab32ec053e/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9fde65dbbdab32ec053e/3x',\n },\n },\n {\n 'id': '566c9ff365dbbdab32ec0541',\n 'name': 'FireSpeed',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566c9ff365dbbdab32ec0541/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9ff365dbbdab32ec0541/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9ff365dbbdab32ec0541/3x',\n },\n },\n {\n 'id': '566ca06065dbbdab32ec054e',\n 'name': 'NaM',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566ca06065dbbdab32ec054e/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca06065dbbdab32ec054e/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca06065dbbdab32ec054e/3x',\n },\n },\n {\n 'id': '566ca38765dbbdab32ec0560',\n 'name': 'SourPls',\n 'platform': 'bttv',\n 'animated': true,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566ca38765dbbdab32ec0560/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca38765dbbdab32ec0560/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca38765dbbdab32ec0560/3x',\n },\n },\n {\n 'id': '566dde0e65dbbdab32ec068f',\n 'name': 'FeelsSnowMan',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566dde0e65dbbdab32ec068f/1x',\n '2': 'https://cdn.betterttv.net/emote/566dde0e65dbbdab32ec068f/2x',\n '4': 'https://cdn.betterttv.net/emote/566dde0e65dbbdab32ec068f/3x',\n },\n },\n {\n 'id': '566decae65dbbdab32ec0699',\n 'name': 'FeelsSnowyMan',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/566decae65dbbdab32ec0699/1x',\n '2': 'https://cdn.betterttv.net/emote/566decae65dbbdab32ec0699/2x',\n '4': 'https://cdn.betterttv.net/emote/566decae65dbbdab32ec0699/3x',\n },\n },\n {\n 'id': '567b00c61ddbe1786688a633',\n 'name': 'LuL',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/567b00c61ddbe1786688a633/1x',\n '2': 'https://cdn.betterttv.net/emote/567b00c61ddbe1786688a633/2x',\n '4': 'https://cdn.betterttv.net/emote/567b00c61ddbe1786688a633/3x',\n },\n },\n {\n 'id': '56901914991f200c34ffa656',\n 'name': 'SaltyCorn',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/56901914991f200c34ffa656/1x',\n '2': 'https://cdn.betterttv.net/emote/56901914991f200c34ffa656/2x',\n '4': 'https://cdn.betterttv.net/emote/56901914991f200c34ffa656/3x',\n },\n },\n {\n 'id': '56e9f494fff3cc5c35e5287e',\n 'name': 'monkaS',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/56e9f494fff3cc5c35e5287e/1x',\n '2': 'https://cdn.betterttv.net/emote/56e9f494fff3cc5c35e5287e/2x',\n '4': 'https://cdn.betterttv.net/emote/56e9f494fff3cc5c35e5287e/3x',\n },\n },\n {\n 'id': '56f5be00d48006ba34f530a4',\n 'name': 'VapeNation',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/56f5be00d48006ba34f530a4/1x',\n '2': 'https://cdn.betterttv.net/emote/56f5be00d48006ba34f530a4/2x',\n '4': 'https://cdn.betterttv.net/emote/56f5be00d48006ba34f530a4/3x',\n },\n },\n {\n 'id': '56fa09f18eff3b595e93ac26',\n 'name': 'ariW',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/56fa09f18eff3b595e93ac26/1x',\n '2': 'https://cdn.betterttv.net/emote/56fa09f18eff3b595e93ac26/2x',\n '4': 'https://cdn.betterttv.net/emote/56fa09f18eff3b595e93ac26/3x',\n },\n },\n {\n 'id': '5709ab688eff3b595e93c595',\n 'name': 'notsquishY',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/5709ab688eff3b595e93c595/1x',\n '2': 'https://cdn.betterttv.net/emote/5709ab688eff3b595e93c595/2x',\n '4': 'https://cdn.betterttv.net/emote/5709ab688eff3b595e93c595/3x',\n },\n },\n {\n 'id': '5733ff12e72c3c0814233e20',\n 'name': 'FeelsAmazingMan',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/5733ff12e72c3c0814233e20/1x',\n '2': 'https://cdn.betterttv.net/emote/5733ff12e72c3c0814233e20/2x',\n '4': 'https://cdn.betterttv.net/emote/5733ff12e72c3c0814233e20/3x',\n },\n },\n {\n 'id': '573d38b50ffbf6cc5cc38dc9',\n 'name': 'DuckerZ',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/573d38b50ffbf6cc5cc38dc9/1x',\n '2': 'https://cdn.betterttv.net/emote/573d38b50ffbf6cc5cc38dc9/2x',\n '4': 'https://cdn.betterttv.net/emote/573d38b50ffbf6cc5cc38dc9/3x',\n },\n },\n {\n 'id': '580e438942170bfd57189866',\n 'name': 'FeelsPumpkinMan',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/580e438942170bfd57189866/1x',\n '2': 'https://cdn.betterttv.net/emote/580e438942170bfd57189866/2x',\n '4': 'https://cdn.betterttv.net/emote/580e438942170bfd57189866/3x',\n },\n },\n {\n 'id': '59cf182fcbe2693d59d7bf46',\n 'name': 'SqShy',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/59cf182fcbe2693d59d7bf46/1x',\n '2': 'https://cdn.betterttv.net/emote/59cf182fcbe2693d59d7bf46/2x',\n '4': 'https://cdn.betterttv.net/emote/59cf182fcbe2693d59d7bf46/3x',\n },\n },\n {\n 'id': '58d2e73058d8950a875ad027',\n 'name': 'Wowee',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/58d2e73058d8950a875ad027/1x',\n '2': 'https://cdn.betterttv.net/emote/58d2e73058d8950a875ad027/2x',\n '4': 'https://cdn.betterttv.net/emote/58d2e73058d8950a875ad027/3x',\n },\n },\n {\n 'id': '5dc36a8db537d747e37ac187',\n 'name': 'WubTF',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/5dc36a8db537d747e37ac187/1x',\n '2': 'https://cdn.betterttv.net/emote/5dc36a8db537d747e37ac187/2x',\n '4': 'https://cdn.betterttv.net/emote/5dc36a8db537d747e37ac187/3x',\n },\n },\n {\n 'id': '5e76d2ab8c0f5c3723a9a87d',\n 'name': 'cvR',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/5e76d2ab8c0f5c3723a9a87d/1x',\n '2': 'https://cdn.betterttv.net/emote/5e76d2ab8c0f5c3723a9a87d/2x',\n '4': 'https://cdn.betterttv.net/emote/5e76d2ab8c0f5c3723a9a87d/3x',\n },\n },\n {\n 'id': '5e76d2d2d112fc372574d222',\n 'name': 'cvL',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/5e76d2d2d112fc372574d222/1x',\n '2': 'https://cdn.betterttv.net/emote/5e76d2d2d112fc372574d222/2x',\n '4': 'https://cdn.betterttv.net/emote/5e76d2d2d112fc372574d222/3x',\n },\n },\n {\n 'id': '5e76d338d6581c3724c0f0b2',\n 'name': 'cvHazmat',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/5e76d338d6581c3724c0f0b2/1x',\n '2': 'https://cdn.betterttv.net/emote/5e76d338d6581c3724c0f0b2/2x',\n '4': 'https://cdn.betterttv.net/emote/5e76d338d6581c3724c0f0b2/3x',\n },\n },\n {\n 'id': '5e76d399d6581c3724c0f0b8',\n 'name': 'cvMask',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/5e76d399d6581c3724c0f0b8/1x',\n '2': 'https://cdn.betterttv.net/emote/5e76d399d6581c3724c0f0b8/2x',\n '4': 'https://cdn.betterttv.net/emote/5e76d399d6581c3724c0f0b8/3x',\n },\n },\n {\n 'id': '5ffdf28dc96152314ad63960',\n 'name': 'DogChamp',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/5ffdf28dc96152314ad63960/1x',\n '2': 'https://cdn.betterttv.net/emote/5ffdf28dc96152314ad63960/2x',\n '4': 'https://cdn.betterttv.net/emote/5ffdf28dc96152314ad63960/3x',\n },\n },\n {\n 'id': '6468f7acaee1f7f47567708e',\n 'name': 'c!',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/6468f7acaee1f7f47567708e/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f7acaee1f7f47567708e/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f7acaee1f7f47567708e/3x',\n },\n },\n {\n 'id': '6468f845aee1f7f47567709b',\n 'name': 'h!',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/6468f845aee1f7f47567709b/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f845aee1f7f47567709b/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f845aee1f7f47567709b/3x',\n },\n },\n {\n 'id': '6468f869aee1f7f4756770a8',\n 'name': 'l!',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/6468f869aee1f7f4756770a8/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f869aee1f7f4756770a8/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f869aee1f7f4756770a8/3x',\n },\n },\n {\n 'id': '6468f883aee1f7f4756770b5',\n 'name': 'r!',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/6468f883aee1f7f4756770b5/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f883aee1f7f4756770b5/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f883aee1f7f4756770b5/3x',\n },\n },\n {\n 'id': '6468f89caee1f7f4756770c2',\n 'name': 'v!',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/6468f89caee1f7f4756770c2/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f89caee1f7f4756770c2/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f89caee1f7f4756770c2/3x',\n },\n },\n {\n 'id': '6468f8d1aee1f7f4756770cf',\n 'name': 'z!',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/6468f8d1aee1f7f4756770cf/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f8d1aee1f7f4756770cf/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f8d1aee1f7f4756770cf/3x',\n },\n },\n {\n 'id': '64e3b31920cb0d25d950a9f9',\n 'name': 'w!',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/64e3b31920cb0d25d950a9f9/1x',\n '2': 'https://cdn.betterttv.net/emote/64e3b31920cb0d25d950a9f9/2x',\n '4': 'https://cdn.betterttv.net/emote/64e3b31920cb0d25d950a9f9/3x',\n },\n },\n {\n 'id': '65cbe7dbaed093b2eaf87c65',\n 'name': 'p!',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/65cbe7dbaed093b2eaf87c65/1x',\n '2': 'https://cdn.betterttv.net/emote/65cbe7dbaed093b2eaf87c65/2x',\n '4': 'https://cdn.betterttv.net/emote/65cbe7dbaed093b2eaf87c65/3x',\n },\n },\n {\n 'id': '662953eeea369c0ece39eb93',\n 'name': 's!',\n 'platform': 'bttv',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.betterttv.net/emote/662953eeea369c0ece39eb93/1x',\n '2': 'https://cdn.betterttv.net/emote/662953eeea369c0ece39eb93/2x',\n '4': 'https://cdn.betterttv.net/emote/662953eeea369c0ece39eb93/3x',\n },\n },\n];\n\nconst FfzEmotes = [\n {\n 'id': '9',\n 'name': 'ZrehplaR',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/9/1',\n '2': 'https://cdn.frankerfacez.com/emote/9/2',\n '4': 'https://cdn.frankerfacez.com/emote/9/4',\n },\n },\n {\n 'id': '6',\n 'name': 'YooHoo',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/6/1',\n '2': 'https://cdn.frankerfacez.com/emote/6/2',\n '4': 'https://cdn.frankerfacez.com/emote/6/4',\n },\n },\n {\n 'id': '4',\n 'name': 'ManChicken',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/4/1',\n '2': 'https://cdn.frankerfacez.com/emote/4/2',\n '4': 'https://cdn.frankerfacez.com/emote/4/4',\n },\n },\n {\n 'id': '3',\n 'name': 'BeanieHipster',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/3/1',\n '2': 'https://cdn.frankerfacez.com/emote/3/2',\n '4': 'https://cdn.frankerfacez.com/emote/3/4',\n },\n },\n {\n 'id': '25927',\n 'name': 'CatBag',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/25927/1',\n '2': 'https://cdn.frankerfacez.com/emote/25927/2',\n '4': 'https://cdn.frankerfacez.com/emote/25927/4',\n },\n },\n {\n 'id': '27081',\n 'name': 'ZreknarF',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/27081/1',\n '2': 'https://cdn.frankerfacez.com/emote/27081/2',\n '4': 'https://cdn.frankerfacez.com/emote/27081/4',\n },\n },\n {\n 'id': '28136',\n 'name': 'LilZ',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/28136/1',\n '2': 'https://cdn.frankerfacez.com/emote/28136/2',\n '4': 'https://cdn.frankerfacez.com/emote/28136/4',\n },\n },\n {\n 'id': '28138',\n 'name': 'ZliL',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/28138/1',\n '2': 'https://cdn.frankerfacez.com/emote/28138/2',\n '4': 'https://cdn.frankerfacez.com/emote/28138/4',\n },\n },\n {\n 'id': '149346',\n 'name': 'LaterSooner',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/149346/1',\n '2': 'https://cdn.frankerfacez.com/emote/149346/2',\n '4': 'https://cdn.frankerfacez.com/emote/149346/4',\n },\n },\n {\n 'id': '142673',\n 'name': 'BORT',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/142673/1',\n '2': 'https://cdn.frankerfacez.com/emote/142673/2',\n '4': 'https://cdn.frankerfacez.com/emote/142673/4',\n },\n },\n {\n 'id': '757384',\n 'name': 'BibleThump',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/757384/1',\n '2': 'https://cdn.frankerfacez.com/emote/757384/2',\n '4': 'https://cdn.frankerfacez.com/emote/757384/4',\n },\n },\n {\n 'id': '723890',\n 'name': 'ffzW',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/723890/1',\n '2': 'https://cdn.frankerfacez.com/emote/723890/2',\n '4': 'https://cdn.frankerfacez.com/emote/723890/4',\n },\n },\n {\n 'id': '720508',\n 'name': 'ffzX',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/720508/1',\n '2': 'https://cdn.frankerfacez.com/emote/720508/2',\n '4': 'https://cdn.frankerfacez.com/emote/720508/4',\n },\n },\n {\n 'id': '720509',\n 'name': 'ffzY',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/720509/1',\n '2': 'https://cdn.frankerfacez.com/emote/720509/2',\n '4': 'https://cdn.frankerfacez.com/emote/720509/4',\n },\n },\n {\n 'id': '720729',\n 'name': 'ffzCursed',\n 'platform': 'ffz',\n 'animated': false,\n 'urls': {\n '1': 'https://cdn.frankerfacez.com/emote/720729/1',\n '2': 'https://cdn.frankerfacez.com/emote/720729/2',\n '4': 'https://cdn.frankerfacez.com/emote/720729/4',\n },\n },\n];\n\nconst TwitchEmotes = [\n {\n 'type': 'twitch',\n 'name': 'AsexualPride',\n 'id': '307827267',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827267/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827267/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827267/static/dark/3.0',\n },\n 'start': 0,\n 'end': 12,\n },\n {\n 'type': 'twitch',\n 'name': 'BisexualPride',\n 'id': '307827313',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827313/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827313/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827313/static/dark/3.0',\n },\n 'start': 13,\n 'end': 26,\n },\n {\n 'type': 'twitch',\n 'name': 'GayPride',\n 'id': '307827321',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827321/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827321/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827321/static/dark/3.0',\n },\n 'start': 27,\n 'end': 35,\n },\n {\n 'type': 'twitch',\n 'name': 'GenderFluidPride',\n 'id': '307827326',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827326/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827326/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827326/static/dark/3.0',\n },\n 'start': 36,\n 'end': 52,\n },\n {\n 'type': 'twitch',\n 'name': 'IntersexPride',\n 'id': '307827332',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827332/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827332/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827332/static/dark/3.0',\n },\n 'start': 53,\n 'end': 66,\n },\n {\n 'type': 'twitch',\n 'name': 'KappaPride',\n 'id': '55338',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/55338/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/55338/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/55338/static/dark/3.0',\n },\n 'start': 67,\n 'end': 77,\n },\n {\n 'type': 'twitch',\n 'name': 'PansexualPride',\n 'id': '307827370',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827370/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827370/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827370/static/dark/3.0',\n },\n 'start': 78,\n 'end': 92,\n },\n {\n 'type': 'twitch',\n 'name': 'TransgenderPride',\n 'id': '307827377',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827377/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827377/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827377/static/dark/3.0',\n },\n 'start': 93,\n 'end': 109,\n },\n {\n 'type': 'twitch',\n 'name': 'TheIlluminati',\n 'id': '145315',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/145315/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/145315/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/145315/static/dark/3.0',\n },\n 'start': 110,\n 'end': 123,\n },\n {\n 'type': 'twitch',\n 'name': 'BrainSlug',\n 'id': '115233',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/115233/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/115233/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/115233/static/dark/3.0',\n },\n 'start': 124,\n 'end': 133,\n },\n {\n 'type': 'twitch',\n 'name': 'imGlitch',\n 'id': '112290',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/112290/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/112290/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/112290/static/dark/3.0',\n },\n 'start': 134,\n 'end': 142,\n },\n {\n 'type': 'twitch',\n 'name': 'GlitchNRG',\n 'id': '304489309',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/304489309/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/304489309/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/304489309/static/dark/3.0',\n },\n 'start': 143,\n 'end': 152,\n },\n {\n 'type': 'twitch',\n 'name': 'TakeNRG',\n 'id': '112292',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/112292/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/112292/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/112292/static/dark/3.0',\n },\n 'start': 153,\n 'end': 160,\n },\n {\n 'type': 'twitch',\n 'name': 'DxCat',\n 'id': '110734',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/110734/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/110734/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/110734/static/dark/3.0',\n },\n 'start': 161,\n 'end': 166,\n },\n {\n 'type': 'twitch',\n 'name': 'VoHiYo',\n 'id': '81274',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/81274/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/81274/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/81274/static/dark/3.0',\n },\n 'start': 167,\n 'end': 173,\n },\n {\n 'type': 'twitch',\n 'name': 'DoritosChip',\n 'id': '102242',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/102242/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/102242/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/102242/static/dark/3.0',\n },\n 'start': 174,\n 'end': 185,\n },\n {\n 'type': 'twitch',\n 'name': 'KomodoHype',\n 'id': '81273',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/81273/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/81273/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/81273/static/dark/3.0',\n },\n 'start': 186,\n 'end': 196,\n },\n {\n 'type': 'twitch',\n 'name': 'duDudu',\n 'id': '62834',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/62834/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/62834/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/62834/static/dark/3.0',\n },\n 'start': 197,\n 'end': 203,\n },\n {\n 'type': 'twitch',\n 'name': 'CoolCat',\n 'id': '58127',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/58127/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/58127/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/58127/static/dark/3.0',\n },\n 'start': 204,\n 'end': 211,\n },\n {\n 'type': 'twitch',\n 'name': 'BloodTrail',\n 'id': '69',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/69/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/69/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/69/static/dark/3.0',\n },\n 'start': 212,\n 'end': 222,\n },\n {\n 'type': 'twitch',\n 'name': 'PunchTrees',\n 'id': '47',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/47/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/47/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/47/static/dark/3.0',\n },\n 'start': 223,\n 'end': 233,\n },\n {\n 'type': 'twitch',\n 'name': 'SSSsss',\n 'id': '46',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/46/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/46/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/46/static/dark/3.0',\n },\n 'start': 234,\n 'end': 240,\n },\n {\n 'type': 'twitch',\n 'name': 'SSSsssplode',\n 'id': 'emotesv2_df1b3a19d9fc4bff81429afdfb46fff0',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_df1b3a19d9fc4bff81429afdfb46fff0/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_df1b3a19d9fc4bff81429afdfb46fff0/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_df1b3a19d9fc4bff81429afdfb46fff0/default/dark/3.0',\n },\n 'start': 241,\n 'end': 251,\n },\n {\n 'type': 'twitch',\n 'name': 'Kappa',\n 'id': '25',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/25/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/25/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/25/static/dark/3.0',\n },\n 'start': 253,\n 'end': 258,\n },\n {\n 'type': 'twitch',\n 'name': 'KappaClaus',\n 'id': '74510',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/74510/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/74510/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/74510/static/dark/3.0',\n },\n 'start': 259,\n 'end': 269,\n },\n {\n 'type': 'twitch',\n 'name': 'MrDestructoid',\n 'id': '28',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/28/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/28/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/28/static/dark/3.0',\n },\n 'start': 270,\n 'end': 283,\n },\n {\n 'type': 'twitch',\n 'name': 'HSWP',\n 'id': '446979',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/446979/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/446979/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/446979/static/dark/3.0',\n },\n 'start': 292,\n 'end': 296,\n },\n {\n 'type': 'twitch',\n 'name': 'Shush',\n 'id': 'emotesv2_819621bcb8f44566a1bd8ea63d06c58f',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_819621bcb8f44566a1bd8ea63d06c58f/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_819621bcb8f44566a1bd8ea63d06c58f/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_819621bcb8f44566a1bd8ea63d06c58f/static/dark/3.0',\n },\n 'start': 297,\n 'end': 302,\n },\n {\n 'type': 'twitch',\n 'name': 'KPOPTT',\n 'id': '304047269',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/304047269/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/304047269/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/304047269/default/dark/3.0',\n },\n 'start': 303,\n 'end': 308,\n },\n {\n 'type': 'twitch',\n 'name': 'FrogPonder',\n 'id': 'emotesv2_a3cdcbfcae9b41bb8215b012362eea35',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_a3cdcbfcae9b41bb8215b012362eea35/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_a3cdcbfcae9b41bb8215b012362eea35/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_a3cdcbfcae9b41bb8215b012362eea35/default/dark/3.0',\n },\n 'start': 310,\n 'end': 319,\n },\n {\n 'type': 'twitch',\n 'name': 'HypeCheer',\n 'id': 'emotesv2_dd4f4f9cea1a4039ad3390e20900abe4',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dd4f4f9cea1a4039ad3390e20900abe4/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dd4f4f9cea1a4039ad3390e20900abe4/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dd4f4f9cea1a4039ad3390e20900abe4/default/dark/3.0',\n },\n 'start': 321,\n 'end': 329,\n },\n {\n 'type': 'twitch',\n 'name': 'HypeFail',\n 'id': 'emotesv2_0330a84e75ad48c1821c1d29a7dadd4d',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_0330a84e75ad48c1821c1d29a7dadd4d/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_0330a84e75ad48c1821c1d29a7dadd4d/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_0330a84e75ad48c1821c1d29a7dadd4d/default/dark/3.0',\n },\n 'start': 0,\n 'end': 7,\n },\n {\n 'type': 'twitch',\n 'name': 'HypePopcorn',\n 'id': 'emotesv2_7b8e74be7bd64601a2608c2ff5f6eb7a',\n 'gif': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_7b8e74be7bd64601a2608c2ff5f6eb7a/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_7b8e74be7bd64601a2608c2ff5f6eb7a/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_7b8e74be7bd64601a2608c2ff5f6eb7a/default/dark/3.0',\n },\n 'start': 9,\n 'end': 19,\n },\n {\n 'type': 'twitch',\n 'name': 'GlitchCat',\n 'id': '304486301',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/304486301/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/304486301/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/304486301/static/dark/3.0',\n },\n 'start': 21,\n 'end': 30,\n },\n {\n 'type': 'twitch',\n 'name': 'SoonerLater',\n 'id': '2113050',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/2113050/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/2113050/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/2113050/static/dark/3.0',\n },\n 'start': 31,\n 'end': 42,\n },\n {\n 'type': 'twitch',\n 'name': 'FBBlock',\n 'id': '1441276',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441276/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441276/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441276/static/dark/3.0',\n },\n 'start': 43,\n 'end': 50,\n },\n {\n 'type': 'twitch',\n 'name': 'FBCatch',\n 'id': '1441281',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441281/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441281/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441281/static/dark/3.0',\n },\n 'start': 51,\n 'end': 58,\n },\n {\n 'type': 'twitch',\n 'name': 'FBPass',\n 'id': '1441271',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441271/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441271/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441271/static/dark/3.0',\n },\n 'start': 59,\n 'end': 65,\n },\n {\n 'type': 'twitch',\n 'name': 'FBRun',\n 'id': '1441261',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441261/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441261/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441261/static/dark/3.0',\n },\n 'start': 66,\n 'end': 71,\n },\n {\n 'type': 'twitch',\n 'name': 'FBtouchdown',\n 'id': '626795',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/626795/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/626795/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/626795/static/dark/3.0',\n },\n 'start': 72,\n 'end': 83,\n },\n {\n 'type': 'twitch',\n 'name': 'FBSpiral',\n 'id': '1441273',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441273/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441273/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441273/static/dark/3.0',\n },\n 'start': 84,\n 'end': 92,\n },\n {\n 'type': 'twitch',\n 'name': 'FBPenalty',\n 'id': '1441289',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441289/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441289/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441289/static/dark/3.0',\n },\n 'start': 93,\n 'end': 102,\n },\n {\n 'type': 'twitch',\n 'name': 'FBChallenge',\n 'id': '1441285',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441285/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441285/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441285/static/dark/3.0',\n },\n 'start': 103,\n 'end': 114,\n },\n {\n 'type': 'twitch',\n 'name': 'PixelBob',\n 'id': '1547903',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1547903/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1547903/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1547903/static/dark/3.0',\n },\n 'start': 115,\n 'end': 123,\n },\n {\n 'type': 'twitch',\n 'name': 'LUL',\n 'id': '425618',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/425618/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/425618/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/425618/static/dark/3.0',\n },\n 'start': 124,\n 'end': 127,\n },\n {\n 'type': 'twitch',\n 'name': 'DarkMode',\n 'id': '461298',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/461298/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/461298/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/461298/static/dark/3.0',\n },\n 'start': 128,\n 'end': 136,\n },\n {\n 'type': 'twitch',\n 'name': 'PopCorn',\n 'id': '724216',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/724216/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/724216/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/724216/static/dark/3.0',\n },\n 'start': 137,\n 'end': 144,\n },\n {\n 'type': 'twitch',\n 'name': 'EarthDay',\n 'id': '959018',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/959018/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/959018/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/959018/static/dark/3.0',\n },\n 'start': 145,\n 'end': 153,\n },\n {\n 'type': 'twitch',\n 'name': 'TwitchUnity',\n 'id': '196892',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/196892/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/196892/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/196892/static/dark/3.0',\n },\n 'start': 154,\n 'end': 165,\n },\n {\n 'type': 'twitch',\n 'name': 'Squid1',\n 'id': '191762',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/191762/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/191762/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/191762/static/dark/3.0',\n },\n 'start': 166,\n 'end': 172,\n },\n {\n 'type': 'twitch',\n 'name': 'Squid2',\n 'id': '191763',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/191763/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/191763/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/191763/static/dark/3.0',\n },\n 'start': 173,\n 'end': 179,\n },\n {\n 'type': 'twitch',\n 'name': 'Squid3',\n 'id': '191764',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/191764/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/191764/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/191764/static/dark/3.0',\n },\n 'start': 180,\n 'end': 186,\n },\n {\n 'type': 'twitch',\n 'name': 'Squid4',\n 'id': '191767',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/191767/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/191767/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/191767/static/dark/3.0',\n },\n 'start': 187,\n 'end': 193,\n },\n {\n 'type': 'twitch',\n 'name': 'DinoDance',\n 'id': 'emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7',\n 'gif': true,\n 'animated': true,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7/animated/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7/animated/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7/animated/dark/3.0',\n },\n 'start': 194,\n 'end': 203,\n },\n {\n 'type': 'twitch',\n 'name': 'CrreamAwk',\n 'id': '191313',\n 'gif': false,\n 'animated': false,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/191313/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/191313/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/191313/static/dark/3.0',\n },\n 'start': 204,\n 'end': 213,\n },\n {\n 'type': 'twitch',\n 'name': 'PopNemo',\n 'id': 'emotesv2_5d523adb8bbb4786821cd7091e47da21',\n 'gif': true,\n 'animated': true,\n 'urls': {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_5d523adb8bbb4786821cd7091e47da21/animated/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_5d523adb8bbb4786821cd7091e47da21/animated/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_5d523adb8bbb4786821cd7091e47da21/animated/dark/3.0',\n },\n 'start': 214,\n 'end': 221,\n },\n];\n\nconst emotes: Array<TwitchEmote | BttvEmote | SeventvEmote> = Object.values([\n ...TwitchEmotes,\n ...BttvEmotes.map((e) => ({\n type: e.platform,\n name: e.name,\n id: e.id,\n gif: e.animated,\n animated: e.animated,\n urls: e.urls,\n })),\n ...SeventvEmotes.map((e) => ({\n type: e.platform,\n name: e.name,\n id: e.id,\n gif: e.animated,\n animated: e.animated,\n urls: e.urls,\n })),\n ...FfzEmotes.map((e) => ({\n type: e.platform,\n name: e.name,\n id: e.id,\n gif: e.animated,\n animated: e.animated,\n urls: e.urls,\n })),\n]).reduce(\n (acc, emote) => {\n if ((emote as any)?.platform) {\n emote.type = (emote as any).platform;\n delete (emote as any).platform;\n }\n\n if (!acc.some((e) => e.name === emote.name)) {\n acc.push({\n ...emote,\n 'start': 0,\n 'end': 0,\n } as TwitchEmote | BttvEmote | SeventvEmote);\n }\n\n return acc;\n },\n [] as Array<TwitchEmote | BttvEmote | SeventvEmote>,\n);\n\nexport { TwitchEmotes, BttvEmotes, SeventvEmotes, FfzEmotes, emotes };\n","export const items: any[] = [];\n","export const twitch_messages = [\n 'haHAA',\n 'CiGrip',\n 'PopNemo',\n 'PogChamp',\n 'bttvNice',\n 'ariW wave',\n 'DinoDance',\n 'CruW salute',\n 'c! PogChamp',\n 'LUL LUL LUL',\n 'CandianRage',\n 'CatBag kitty!',\n '<3 good times',\n 'catJAM vibing',\n 'DuckerZ quack',\n ':tf: trollface',\n 'haHAA good one',\n \"HSWP let's go!\",\n 'DxCat claws out',\n 'ConcernDoge hmm',\n 'BroBalt nice one',\n 'VoHiYo everyone!',\n 'LuL that was funny',\n 'Kappa just kidding',\n 'FBCatch nice grab!',\n 'cvHazmat stay safe',\n 'CookieTime nom nom',\n 'LuL that was funny',\n 'CruW crew assembled',\n 'GlitchCat GlitchCat',\n 'CoolCat staying calm',\n 'bUrself be yourself!',\n 'catJAM catJAM catJAM',\n 'HSWP here we go again',\n 'Shush moment incoming',\n 'duDudu rhythm section',\n ':tf: face palm moment',\n 'duDudu rhythm section',\n 'HSWP here we go again',\n 'PunchTrees PunchTrees',\n 'SSSsss Minecraft time',\n 'KappaPride represent!',\n 'haHAA that joke though',\n 'DoritosChip snack time',\n 'DoritosChip snack time',\n 'asexualPride represent',\n 'duDudu dancing on beat',\n 'FBBlock defensive play!',\n 'ariW waving at everyone',\n 'PopNemo finding our way',\n 'ariW waving at everyone',\n 'TheIlluminati confirmed',\n 'SSSsss slithering vibes',\n 'GayPride celebrate love',\n 'BloodTrail hunting time',\n 'TheIlluminati confirmed',\n \"LUL can't stop laughing\",\n 'HypeCheer clap clap clap',\n 'DuckerZ quacking in chat',\n 'Wait for it... PogChamp!',\n 'HypeCheer clap clap clap',\n 'KPOPTT music to our ears',\n 'FrogPonder thinking frog',\n \"IntersexPride we're here\",\n 'KappaPride be proud Kappa',\n 'cvHazmat suit up for this',\n 'BrainSlug giving me ideas',\n 'KappaPride be proud Kappa',\n 'This music is fire catJAM',\n 'I just followed! PogChamp',\n 'MrDestructoid robot vibes',\n 'BroBalt brotherhood moment',\n 'VoHiYo greetings from chat',\n 'PogChamp PogChamp PogChamp',\n 'DxCat meow meow KomodoHype',\n 'Squid1 Squid2 Squid3 Squid4',\n 'KomodoHype the hype is real',\n 'DarkMode gang where you at?',\n 'Wait what just happened? D:',\n 'TakeNRG infinite energy NRG',\n 'CookieTime break time snack',\n 'The dedication is real here',\n 'PopCorn watching this unfold',\n 'CandianRage maple syrup fury',\n 'PopCorn watching this unfold',\n 'LesbianPride strong together',\n 'DinoDance DinoDance DinoDance',\n 'TakeNRG this energy is unreal',\n 'Everyone gets hype! HypeCheer',\n 'CiGrip strong grip on the game',\n 'CoolCat no stress allowed here',\n 'BisexualPride all love matters',\n 'GenderFluidPride freedom to be',\n 'DarkMode gang in here DarkMode',\n \"HypeFail oops that didn't work\",\n 'HypePopcorn this is the moment',\n 'ConcernDoge is everything okay?',\n 'BloodTrail following the leader',\n 'This is so wholesome AngelThump',\n 'ImGlitch technical difficulties',\n 'Anyone else eating? DoritosChip',\n 'PixelBob retro vibes with Kappa',\n 'SoonerLater catch you next time',\n 'imGlitch glitchy but we love it',\n 'KomodoHype the energy is crazy!',\n 'NonbinaryPride beyond the binary',\n 'PansexualPride love is universal',\n 'This community is the best Kappa',\n 'BrainSlug with the big brain play',\n 'TransgenderPride living authentic',\n 'AngelThump wholesomeness incoming',\n 'GlitchCat imGlitch what happened?',\n 'CrreamAwk that was awkward VoHiYo',\n 'IronmouseLuv appreciate the stream',\n 'PunchTrees minecraft mode activated',\n 'The skill on display here is unreal',\n 'LesbianPride GayPride BisexualPride',\n 'PogChamp PogChamp PogChamp PogChamp',\n \"TwitchUnity we're all here for this\",\n 'This is absolutely insane KomodoHype',\n 'Never seen anything like this before',\n 'Vibing with cat-shaped avatars catJAM',\n 'EarthDay appreciation for this stream',\n \"TheIlluminati knows something we don't\",\n \"Shush they're about to do something big\",\n 'Can we appreciate this moment? PogChamp',\n 'MrDestructoid destroying the competition',\n 'AsexualPride IntersexPride GenderFluidPride',\n 'TransgenderPride PansexualPride NonbinaryPride',\n];\n\nexport const youtube_messages = [\n ':ytg: Keep it up!',\n ':yt: YouTube hype!',\n ':gar: Amazing as always!',\n 'No words, just :awesome:',\n 'You got this! :yougotthis:',\n ':elbowbump: Great teamwork!',\n 'Love this energy! :goodvibes:',\n 'Just arrived! :hand-pink-waving:',\n 'Great gameplay! :hand-yellow-nails:',\n ':face-pink-tears: Tears of joy here',\n 'This stream is incredible :awesome:',\n 'Hydration break everyone! :hydrate:',\n ':text-green-game-over: You won this!',\n \":face-blue-star-eyes: You're a star!\",\n 'Virtual hug for everyone :virtualhug:',\n 'Happy to be here! :face-green-smiling:',\n 'Chilling with my dog :chillwdog: vibing',\n ':face-red-heart-shape: Love what you do',\n ':person-turqouise-waving: Hey everyone!',\n 'This community is the best! :goodvibes:',\n ':face-blue-smiling: Amazing vibes today',\n ':goodvibes: Only good vibes in this chat',\n ':body-blue-raised-arms: Victory is ours!',\n ':pride-flower-rainbow-heart: Love is love',\n ':octopus-red-waving: Waves from the chat!',\n ':thanksdoc: Thanks for the entertainment!',\n ':face-purple-crying: Why is this so good??',\n ':eyes-pink-heart-shape: Beautiful gameplay',\n ':fish-orange-wide-eyes: Eyes on the prize!',\n ':whistle-red-blow: That was a performance!',\n 'Respect the grind :hand-green-crystal-ball:',\n 'Learning so much from this stream :learning:',\n ':pride-people-embracing-two: Community love!',\n ':face-red-droopy-eyes: long day but worth it',\n 'Chilling with my cat :chillwcat: so peaceful',\n ':face-fuchsia-tongue-out: Having too much fun',\n ':person-purple-stage-event: This is showtime!',\n ':card-red-penalty: That was risky! Bold move!',\n ':face-purple-smiling-tears: This is too good!',\n ':face-orange-tv-shape: Broadcasting excellence',\n ':face-orange-tv-shape: Broadcasting excellence',\n ':face-blue-heart-eyes: This stream has my heart',\n ':person-turquoise-crowd-surf: Crowd going wild!',\n 'Best gaming session ever :trophy-yellow-smiling:',\n ':hand-purple-blue-peace: Peace out, great stream!',\n ':face-purple-sweating: Clutch moment! So intense!',\n \":hand-orange-covering-eyes: Can't believe my eyes!\",\n ':face-blue-question-mark: How do you even do that?',\n ':baseball-white-cap-out: Home run! Total knockout!',\n ':volcano-green-lava-orange: Things are getting HOT',\n ':face-purple-smiling-fangs: Evil laugh at that play',\n ':stopwatch-blue-hand-timer: Speedrunning like a pro',\n ':location-yellow-teal-bars: Streaming from the top!',\n \":face-purple-open-box: What's next? More surprises?\",\n ':person-turquoise-wizard-wand: Like magic out there!',\n ':face-blue-wide-eyes: Did that actually just happen?!',\n ':medal-yellow-first-red: Number one stream right here',\n ':face-turquoise-music-note: Vibing to this soundtrack',\n 'Can we just appreciate how awesome this is? :awesome:',\n ':popcorn-yellow-striped-smile: This is the main event!',\n ':face-orange-raised-eyebrow: Interesting strategy there',\n \":person-blue-speaking-microphone: Let's go! Hype it up!\",\n ':pride-megaphone-rainbow-handle: Amplifying good vibes!',\n \":rocket-red-countdown-liftoff: Let's go! Time to launch!\",\n ':person-blue-holding-pencil: Taking notes on these skills',\n ':face-fuchsia-poop-shape: That was a mess! But we survived',\n ':person-pink-swaying-hair: The style, the skill, everything!',\n ':body-turquoise-yoga-pose: So smooth and calm under pressure',\n ':penguin-blue-waving-tear: Goodbye for now, fantastic stream!',\n ':face-turquoise-covering-eyes: Wait what? How did you do that?',\n ':face-turquoise-covering-eyes: Wait what? How did you do that?',\n ':clock-turquoise-looking-up: What time is it? Time to watch you!',\n ':person-blue-eating-spaghetti: Fueling up after that performance',\n \":hourglass-purple-sand-orange: Time flies when you're having fun\",\n ':face-turquoise-drinking-coffee: Coffee and gaming, perfect combo',\n \":person-turquoise-writes-headphones: That's some creative strategy\",\n ':face-purple-rain-drops: Emotional over here :face-pink-drinking-tea:',\n ':pride-person-heart-lesbian: Proud and here :pride-flowers-turquoise-transgender:',\n];\n\nexport const normal_messages = [\n 'GG!',\n 'Wow just wow',\n 'Fire fire fire',\n 'Simply amazing',\n 'Never gets old',\n 'Veteran energy',\n 'That was insane',\n 'Hello everyone!',\n 'Best moment ever',\n 'Love seeing this',\n 'Walking the walk',\n 'Cannot look away',\n 'Love seeing this',\n 'Never disappoints',\n 'What a turnaround',\n 'Never counted out',\n 'Respect the grind',\n 'Never disappoints',\n 'Respect the grind',\n 'Hard work pays off',\n 'Consistency is key',\n 'Art form of gaming',\n 'Great gameplay btw',\n 'This is next level',\n 'Peak entertainment',\n 'This is why I watch',\n 'Real recognize real',\n 'Chat is going crazy',\n 'Motivation overload',\n 'When it matters most',\n 'Setting the bar high',\n 'Different vibe today',\n 'Flow state activated',\n 'Comeback king energy',\n 'Mind blown right now',\n 'Cannot stop watching',\n 'The dedication shows',\n 'Vibes are immaculate',\n 'Automatic excellence',\n 'Always coming through',\n 'Unmatched performance',\n 'Promises and delivers',\n 'Mental game is strong',\n 'Calculated every move',\n 'One step ahead always',\n 'Heart racing right now',\n 'On the edge of my seat',\n 'In the zone completely',\n 'Next level inspiration',\n 'From behind to victory',\n 'Confidence is key here',\n 'This is playoff energy',\n 'I love this community!',\n 'So satisfying to watch',\n 'Pure talent right here',\n 'Clutch moment incoming',\n 'This is peak streaming',\n 'Delivers under pressure',\n 'Ice in the veins moment',\n 'This stream is amazing!',\n 'So composed and focused',\n 'Muscle memory is insane',\n 'Gonna apply this myself',\n 'Backing it up every time',\n 'Every stream gets better',\n 'Good energy in this chat',\n 'Physical and mental peak',\n 'Tournament mode activated',\n 'Absolute unit of a player',\n 'Playing 4D chess out here',\n 'This is pure content gold',\n 'Always believes in the win',\n 'Champion mentality showing',\n 'Winners mindset on display',\n 'This deserves all the hype',\n 'Community makes it special',\n 'Red pilled and game pilled',\n 'Experience matters so much',\n 'Been perfecting this craft',\n 'Masterclass happening live',\n 'First time here, loving it!',\n 'Bringing the A game tonight',\n 'Nothing stops this momentum',\n 'Outsmarting the competition',\n 'This chat is moving so fast!',\n 'Incredible skills on display',\n 'Years of practice paying off',\n 'The way they handle pressure',\n 'Unstoppable force on display',\n 'Precision and power combined',\n 'Nothing can break this focus',\n 'This is beautiful to witness',\n 'Vision and execution perfect',\n 'Can we get some hype in chat?',\n 'Taking mental notes right now',\n 'Stealing all these strategies',\n 'Absolutely crushing it today!',\n 'POG! POG! POG! This is insane!',\n 'Just got here, what did I miss?',\n 'Showing everyone how it is done',\n 'Knowledge translation to action',\n 'Learning from the absolute best',\n 'Stream quality is insane today!',\n 'Not gonna lie, that was genius!',\n 'Gaming at its finest right here',\n 'Best stream on Twitch right now!',\n \"The strategy here is chef's kiss\",\n 'This is what greatness looks like',\n 'Going to bed, good night everyone!',\n 'Content like this is why I tune in',\n 'Clap clap clap! Amazing performance!',\n 'Absolutely phenomenal content today!',\n 'Respect to the dedication shown here',\n \"I'm taking notes for my own gameplay\",\n 'Legendary session right here, no cap',\n 'The mechanics on display here are unreal',\n 'This is what peak performance looks like',\n 'This is why I love this community so much',\n 'Setting records and breaking expectations',\n \"First time watching and I'm already hooked\",\n 'Every single play is calculated perfection',\n 'The game knowledge displayed here is insane',\n 'The fundamentals here are next level perfect',\n 'Watching someone who truly loves their craft',\n 'The way they handle adversity is so inspiring',\n 'Every single decision is calculated perfectly',\n 'The combination of speed and accuracy is wild',\n 'This is what happens when talent meets effort',\n 'The artistry in gameplay displayed right here',\n 'Stream just made my day a million times better',\n 'This level of consistency is absolutely insane',\n 'The decision making under pressure is flawless',\n 'The improvement from stream to stream is crazy',\n 'The mental fortitude required for this is huge',\n 'Reading opponents like they are so predictable',\n 'How many years did it take to reach this level?',\n 'This person has transcended normal skill levels',\n 'The ability to stay cool under extreme pressure',\n 'Been here since the beginning, never looked back',\n 'Never seen a player adapt so quickly to mistakes',\n 'This is exactly what peak performance looks like',\n 'Years of training visible in every single moment',\n 'Professional level execution on full display here',\n 'This is the standard that everyone should aspire to',\n 'Nothing phases this player when the stakes are high',\n 'This is entertainment at the absolute highest level',\n];\n\nexport const messages = [...twitch_messages, ...youtube_messages, ...normal_messages];\n","export const names = [\n 'Tixyel',\n 'awigui',\n 'kurao_w',\n 'Urie_s2',\n 'itzzcatt',\n 'BeniArts',\n 'mynnyori',\n 'DexPixel',\n 'Cupidiko',\n 'starkuss_',\n 'catsember',\n 'shy_madeit',\n 'SpookySony',\n 'nanagadesign',\n];\n","export const tiers = ['1000', '2000', '3000', 'prime'];\n","export const tts = [\n 'Filiz',\n 'Astrid',\n 'Tatyana',\n 'Maxim',\n 'Carmen',\n 'Ines',\n 'Cristiano',\n 'Vitoria',\n 'Ricardo',\n 'Maja',\n 'Jan',\n 'Jacek',\n 'Ewa',\n 'Ruben',\n 'Lotte',\n 'Liv',\n 'Seoyeon',\n 'Takumi',\n 'Mizuki',\n 'Giorgio',\n 'Carla',\n 'Bianca',\n 'Karl',\n 'Dora',\n 'Mathieu',\n 'Celine',\n 'Chantal',\n 'Penelope',\n 'Miguel',\n 'Mia',\n 'Enrique',\n 'Conchita',\n 'Geraint',\n 'Salli',\n 'Matthew',\n 'Kimberly',\n 'Kendra',\n 'Justin',\n 'Joey',\n 'Joanna',\n 'Ivy',\n 'Raveena',\n 'Aditi',\n 'Emma',\n 'Brian',\n 'Amy',\n 'Russell',\n 'Nicole',\n 'Vicki',\n 'Marlene',\n 'Hans',\n 'Naja',\n 'Mads',\n 'Gwyneth',\n 'Zhiyu',\n 'Tracy',\n 'Danny',\n 'Huihui',\n 'Yaoyao',\n 'Kangkang',\n 'HanHan',\n 'Zhiwei',\n 'Asaf',\n 'An',\n 'Stefanos',\n 'Filip',\n 'Ivan',\n 'Heidi',\n 'Herena',\n 'Kalpana',\n 'Hemant',\n 'Matej',\n 'Andika',\n 'Rizwan',\n 'Lado',\n 'Valluvar',\n 'Linda',\n 'Heather',\n 'Sean',\n 'Michael',\n 'Karsten',\n 'Guillaume',\n 'Pattara',\n 'Jakub',\n 'Szabolcs',\n 'Hoda',\n 'Naayf',\n];\n","export const YoutubeEmotes = [\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/flower-rainbow-heart-red',\n shortcuts: [':pride-flower-rainbow-heart:'],\n searchTerms: ['pride-flower-rainbow-heart'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/8cF4z9clPGshgty6vT3ImAtx_CUvz3TMY-SAu_UKw-x1Z9-2KzcK4OuyAIROrKhyvcabrw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/8cF4z9clPGshgty6vT3ImAtx_CUvz3TMY-SAu_UKw-x1Z9-2KzcK4OuyAIROrKhyvcabrw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-flower-rainbow-heart',\n },\n },\n },\n isCustomEmoji: true,\n index: 0,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-green-earth-head',\n shortcuts: [':pride-person-earth-intersex:'],\n searchTerms: ['pride-person-earth-intersex'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Gr-3he7L8jjQFj7aI0kSY1eV4aIsy-vT7Hk5shdakigG9aAJO_uMBmV6haCtK1OHjTEjj1o=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Gr-3he7L8jjQFj7aI0kSY1eV4aIsy-vT7Hk5shdakigG9aAJO_uMBmV6haCtK1OHjTEjj1o=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-person-earth-intersex',\n },\n },\n },\n isCustomEmoji: true,\n index: 1,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-yellow-heart-lesbian',\n shortcuts: [':pride-person-heart-lesbian:'],\n searchTerms: ['pride-person-heart-lesbian'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/tKVZ2TfK5tMLvF88cnz2YNVwuHNgr0eDR9Ef8J0OCkZEHXLFUtH3f6-xSHhqhwd2sL3Tu4I=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/tKVZ2TfK5tMLvF88cnz2YNVwuHNgr0eDR9Ef8J0OCkZEHXLFUtH3f6-xSHhqhwd2sL3Tu4I=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-person-heart-lesbian',\n },\n },\n },\n isCustomEmoji: true,\n index: 2,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-yellow-flower-nonbinary',\n shortcuts: [':pride-person-flower-nonbinary:'],\n searchTerms: ['pride-person-flower-nonbinary'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/le1X4KHLOmK5K1s5xu-owmP_eZK4D0ExyjnMCS6UNqZa-Zh4uEzz3mZnU3jBlLfi14Zpngw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/le1X4KHLOmK5K1s5xu-owmP_eZK4D0ExyjnMCS6UNqZa-Zh4uEzz3mZnU3jBlLfi14Zpngw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-person-flower-nonbinary',\n },\n },\n },\n isCustomEmoji: true,\n index: 3,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/flower-rainbow-heart-pansexual',\n shortcuts: [':pride-flower-pansexual:'],\n searchTerms: ['pride-flower-pansexual'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/blSdVv_UpdTn8BIWU6u9oCWhdtpc0-a-3dJeaRX9As6ftLc0OGPJ1PveQEJbUEDzf6by2Xi9=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/blSdVv_UpdTn8BIWU6u9oCWhdtpc0-a-3dJeaRX9As6ftLc0OGPJ1PveQEJbUEDzf6by2Xi9=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-flower-pansexual',\n },\n },\n },\n isCustomEmoji: true,\n index: 4,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/heart-stripes-pride-flag',\n shortcuts: [':pride-heart-rainbow-philly:'],\n searchTerms: ['pride-heart-rainbow-philly'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/7iYeXsmU2YMcKsKalaKJhirWdDASATIpl_c7Ib7akaRhvz8GChI4xpM0d0dtASjmmWPbg1NG=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/7iYeXsmU2YMcKsKalaKJhirWdDASATIpl_c7Ib7akaRhvz8GChI4xpM0d0dtASjmmWPbg1NG=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-heart-rainbow-philly',\n },\n },\n },\n isCustomEmoji: true,\n index: 5,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/symbol-turquoise-flowers-transgender',\n shortcuts: [':pride-flowers-turquoise-transgender:'],\n searchTerms: ['pride-flowers-turquoise-transgender'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/ovz1T6ay1D1GNFXwwYibZeu_rV5_iSRXWSHR2thQDLLWejVQMqWPUhsUWrMMw1tlBwllYA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/ovz1T6ay1D1GNFXwwYibZeu_rV5_iSRXWSHR2thQDLLWejVQMqWPUhsUWrMMw1tlBwllYA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-flowers-turquoise-transgender',\n },\n },\n },\n isCustomEmoji: true,\n index: 6,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hand-rainbow-fan-open',\n shortcuts: [':pride-fan-rainbow-open:'],\n searchTerms: ['pride-fan-rainbow-open'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/lDH5aORWtlc42NxTwiP3aIUIjttLVvE4Q_xIJDuu55DKvYSLeDIysOEKtGuMmEtOLgvZ_zTX=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/lDH5aORWtlc42NxTwiP3aIUIjttLVvE4Q_xIJDuu55DKvYSLeDIysOEKtGuMmEtOLgvZ_zTX=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-fan-rainbow-open',\n },\n },\n },\n isCustomEmoji: true,\n index: 7,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-pink-hair-earrings',\n shortcuts: [':pride-face-pink-earrings:'],\n searchTerms: ['pride-face-pink-earrings'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/utFog-w4fqgJ05xfQFjSdy8jvRBtFCeuWRkLH3IaVJ4WCBrdjDbXzXOprJA_h6MPOuksv0c=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/utFog-w4fqgJ05xfQFjSdy8jvRBtFCeuWRkLH3IaVJ4WCBrdjDbXzXOprJA_h6MPOuksv0c=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-face-pink-earrings',\n },\n },\n },\n isCustomEmoji: true,\n index: 8,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/unicorn-white-rainbow-mane',\n shortcuts: [':pride-unicorn-rainbow-mane:'],\n searchTerms: ['pride-unicorn-rainbow-mane'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/fvdANfncTw5aDF8GBq20kHicN5rMVoCMTM3FY8MQbZH9sZXvHy5o48yvHZWN4No5rz8b7-0=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/fvdANfncTw5aDF8GBq20kHicN5rMVoCMTM3FY8MQbZH9sZXvHy5o48yvHZWN4No5rz8b7-0=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-unicorn-rainbow-mane',\n },\n },\n },\n isCustomEmoji: true,\n index: 9,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/people-embracing-two',\n shortcuts: [':pride-people-embracing-two:'],\n searchTerms: ['pride-people-embracing-two'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/h1zJqFv2R4LzS3ZUpVyHhprCHQTIhbSecqu2Lid23byl5hD5cJdnshluOCyRdldYkWCUNg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/h1zJqFv2R4LzS3ZUpVyHhprCHQTIhbSecqu2Lid23byl5hD5cJdnshluOCyRdldYkWCUNg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-people-embracing-two',\n },\n },\n },\n isCustomEmoji: true,\n index: 10,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-green-hair-tears',\n shortcuts: [':pride-face-green-tears:'],\n searchTerms: ['pride-face-green-tears'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/2BNf4_qBG7mqt1sN-JwThp1srHlDr03xoya9hpIvbgS65HwLaaDz46r3A6dy8JnO2GtLNag=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/2BNf4_qBG7mqt1sN-JwThp1srHlDr03xoya9hpIvbgS65HwLaaDz46r3A6dy8JnO2GtLNag=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-face-green-tears',\n },\n },\n },\n isCustomEmoji: true,\n index: 11,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/megaphone-rainbow-handle',\n shortcuts: [':pride-megaphone-rainbow-handle:'],\n searchTerms: ['pride-megaphone-rainbow-handle'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/cop1MU9YkEuUxbe8d1NhPl1S9uJ60YSVTMM1gelP7Cy0BICa6Ey_TpxEFFdYITtsUK1cSg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/cop1MU9YkEuUxbe8d1NhPl1S9uJ60YSVTMM1gelP7Cy0BICa6Ey_TpxEFFdYITtsUK1cSg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-megaphone-rainbow-handle',\n },\n },\n },\n isCustomEmoji: true,\n index: 12,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hand-brown-yellow-nails',\n shortcuts: [':pride-hand-yellow-nails:'],\n searchTerms: ['pride-hand-yellow-nails'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/1dEPlxkQ1RdZkPo5CLgYvneMQ-BBo63b3nnASEAXoccnVktMjgviKqMj1pjPiK2zTPTc7g=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/1dEPlxkQ1RdZkPo5CLgYvneMQ-BBo63b3nnASEAXoccnVktMjgviKqMj1pjPiK2zTPTc7g=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-hand-yellow-nails',\n },\n },\n },\n isCustomEmoji: true,\n index: 13,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-orange-hair-flowing',\n shortcuts: [':pride-face-orange-flowing:'],\n searchTerms: ['pride-face-orange-flowing'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/RuhTeU8YiT0_NaOYjMmXv77eEw5eO5Bdzfr7ouS0u3ZAK2J4coKGe5g4fN8mJV85jC63hw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/RuhTeU8YiT0_NaOYjMmXv77eEw5eO5Bdzfr7ouS0u3ZAK2J4coKGe5g4fN8mJV85jC63hw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-face-orange-flowing',\n },\n },\n },\n isCustomEmoji: true,\n index: 14,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/CIW60IPp_dYCFcuqTgodEu4IlQ',\n shortcuts: [':yt:'],\n searchTerms: ['yt'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/IkpeJf1g9Lq0WNjvSa4XFq4LVNZ9IP5FKW8yywXb12djo1OGdJtziejNASITyq4L0itkMNw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/IkpeJf1g9Lq0WNjvSa4XFq4LVNZ9IP5FKW8yywXb12djo1OGdJtziejNASITyq4L0itkMNw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'yt',\n },\n },\n },\n isCustomEmoji: true,\n index: 15,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/CN2m5cKr49sCFYbFggodDFEKrg',\n shortcuts: [':oops:'],\n searchTerms: ['oops'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/PFoVIqIiFRS3aFf5-bt_tTC0WrDm_ylhF4BKKwgqAASNb7hVgx_adFP-XVhFiJLXdRK0EQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/PFoVIqIiFRS3aFf5-bt_tTC0WrDm_ylhF4BKKwgqAASNb7hVgx_adFP-XVhFiJLXdRK0EQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'oops',\n },\n },\n },\n isCustomEmoji: true,\n index: 16,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/X_zdXMHgJaPa8gTGt4f4Ag',\n shortcuts: [':buffering:'],\n searchTerms: ['buffering'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/5gfMEfdqO9CiLwhN9Mq7VI6--T2QFp8AXNNy5Fo7btfY6fRKkThWq35SCZ6SPMVCjg-sUA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/5gfMEfdqO9CiLwhN9Mq7VI6--T2QFp8AXNNy5Fo7btfY6fRKkThWq35SCZ6SPMVCjg-sUA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'buffering',\n },\n },\n },\n isCustomEmoji: true,\n index: 17,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/1v50XorRJ8GQ8gTz_prwAg',\n shortcuts: [':stayhome:'],\n searchTerms: ['stayhome'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/_1FGHypiub51kuTiNBX1a0H3NyFih3TnHX7bHU06j_ajTzT0OQfMLl9RI1SiQoxtgA2Grg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/_1FGHypiub51kuTiNBX1a0H3NyFih3TnHX7bHU06j_ajTzT0OQfMLl9RI1SiQoxtgA2Grg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'stayhome',\n },\n },\n },\n isCustomEmoji: true,\n index: 18,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/8P50XuS9Oo7h8wSqtIagBA',\n shortcuts: [':dothefive:'],\n searchTerms: ['dothefive'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/-nM0DOd49969h3GNcl705Ti1fIf1ZG_E3JxcOUVV-qPfCW6jY8xZ98caNLHkVSGRTSEb7Y9y=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/-nM0DOd49969h3GNcl705Ti1fIf1ZG_E3JxcOUVV-qPfCW6jY8xZ98caNLHkVSGRTSEb7Y9y=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'dothefive',\n },\n },\n },\n isCustomEmoji: true,\n index: 19,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Fv90Xq-vJcPq8gTqzreQAQ',\n shortcuts: [':elbowbump:'],\n searchTerms: ['elbowbump'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/2ou58X5XuhTrxjtIM2wew1f-HKRhN_T5SILQgHE-WD9dySzzJdGwL4R1gpKiJXcbtq6sjQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/2ou58X5XuhTrxjtIM2wew1f-HKRhN_T5SILQgHE-WD9dySzzJdGwL4R1gpKiJXcbtq6sjQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'elbowbump',\n },\n },\n },\n isCustomEmoji: true,\n index: 20,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Iv90XouTLuOR8gSxxrToBA',\n shortcuts: [':goodvibes:'],\n searchTerms: ['goodvibes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/2CvFOwgKpL29mW_C51XvaWa7Eixtv-3tD1XvZa1_WemaDDL2AqevKbTZ1rdV0OWcnOZRag=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/2CvFOwgKpL29mW_C51XvaWa7Eixtv-3tD1XvZa1_WemaDDL2AqevKbTZ1rdV0OWcnOZRag=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'goodvibes',\n },\n },\n },\n isCustomEmoji: true,\n index: 21,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Rf90XtDbG8GQ8gTz_prwAg',\n shortcuts: [':thanksdoc:'],\n searchTerms: ['thanksdoc'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/bUnO_VwXW2hDf-Da8D64KKv6nBJDYUBuo13RrOg141g2da8pi9-KClJYlUDuqIwyPBfvOO8=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/bUnO_VwXW2hDf-Da8D64KKv6nBJDYUBuo13RrOg141g2da8pi9-KClJYlUDuqIwyPBfvOO8=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'thanksdoc',\n },\n },\n },\n isCustomEmoji: true,\n index: 22,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/VP90Xv_wG82o8wTCi7CQAw',\n shortcuts: [':videocall:'],\n searchTerms: ['videocall'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/k5v_oxUzRWmTOXP0V6WJver6xdS1lyHMPcMTfxn23Md6rmixoR5RZUusFbZi1uZwjF__pv4=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/k5v_oxUzRWmTOXP0V6WJver6xdS1lyHMPcMTfxn23Md6rmixoR5RZUusFbZi1uZwjF__pv4=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'videocall',\n },\n },\n },\n isCustomEmoji: true,\n index: 23,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/dv90XtfhAurw8gTgzar4DA',\n shortcuts: [':virtualhug:'],\n searchTerms: ['virtualhug'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/U1TjOZlqtS58NGqQhE8VWDptPSrmJNkrbVRp_8jI4f84QqIGflq2Ibu7YmuOg5MmVYnpevc=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/U1TjOZlqtS58NGqQhE8VWDptPSrmJNkrbVRp_8jI4f84QqIGflq2Ibu7YmuOg5MmVYnpevc=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'virtualhug',\n },\n },\n },\n isCustomEmoji: true,\n index: 24,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hf90Xv-jHeOR8gSxxrToBA',\n shortcuts: [':yougotthis:'],\n searchTerms: ['yougotthis'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/s3uOe4lUx3iPIt1h901SlMp_sKCTp3oOVj1JV8izBw_vDVLxFqk5dq-3NX-nK_gnUwVEXld3=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/s3uOe4lUx3iPIt1h901SlMp_sKCTp3oOVj1JV8izBw_vDVLxFqk5dq-3NX-nK_gnUwVEXld3=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'yougotthis',\n },\n },\n },\n isCustomEmoji: true,\n index: 25,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/lP90XvOhCZGl8wSO1JmgAw',\n shortcuts: [':sanitizer:'],\n searchTerms: ['sanitizer'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/EJ_8vc4Gl-WxCWBurHwwWROAHrPzxgePodoNfkRY1U_I8L1O2zlqf7-wfUtTeyzq2qHNnocZ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/EJ_8vc4Gl-WxCWBurHwwWROAHrPzxgePodoNfkRY1U_I8L1O2zlqf7-wfUtTeyzq2qHNnocZ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'sanitizer',\n },\n },\n },\n isCustomEmoji: true,\n index: 26,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/uP90Xq6wNYrK8gTUoo3wAg',\n shortcuts: [':takeout:'],\n searchTerms: ['takeout'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/FizHI5IYMoNql9XeP7TV3E0ffOaNKTUSXbjtJe90e1OUODJfZbWU37VqBbTh-vpyFHlFIS0=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/FizHI5IYMoNql9XeP7TV3E0ffOaNKTUSXbjtJe90e1OUODJfZbWU37VqBbTh-vpyFHlFIS0=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'takeout',\n },\n },\n },\n isCustomEmoji: true,\n index: 27,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/fAF1XtDQMIrK8gTUoo3wAg',\n shortcuts: [':hydrate:'],\n searchTerms: ['hydrate'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/tpgZgmhX8snKniye36mnrDVfTnlc44EK92EPeZ0m9M2EPizn1vKEGJzNYdp7KQy6iNZlYDc1=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/tpgZgmhX8snKniye36mnrDVfTnlc44EK92EPeZ0m9M2EPizn1vKEGJzNYdp7KQy6iNZlYDc1=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hydrate',\n },\n },\n },\n isCustomEmoji: true,\n index: 28,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/vQF1XpyaG_XG8gTs77bACQ',\n shortcuts: [':chillwcat:'],\n searchTerms: ['chillwcat'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/y03dFcPc1B7CO20zgQYzhcRPka5Bhs6iSg57MaxJdhaLidFvvXBLf_i4_SHG7zJ_2VpBMNs=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/y03dFcPc1B7CO20zgQYzhcRPka5Bhs6iSg57MaxJdhaLidFvvXBLf_i4_SHG7zJ_2VpBMNs=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'chillwcat',\n },\n },\n },\n isCustomEmoji: true,\n index: 29,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/ygF1XpGUMMjk8gSDrI2wCw',\n shortcuts: [':chillwdog:'],\n searchTerms: ['chillwdog'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Ir9mDxzUi0mbqyYdJ3N9Lq7bN5Xdt0Q7fEYFngN3GYAcJT_tccH1as1PKmInnpt2cbWOam4=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Ir9mDxzUi0mbqyYdJ3N9Lq7bN5Xdt0Q7fEYFngN3GYAcJT_tccH1as1PKmInnpt2cbWOam4=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'chillwdog',\n },\n },\n },\n isCustomEmoji: true,\n index: 30,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/8gF1Xp_zK8jk8gSDrI2wCw',\n shortcuts: [':elbowcough:'],\n searchTerms: ['elbowcough'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/DTR9bZd1HOqpRJyz9TKiLb0cqe5Hb84Yi_79A6LWlN1tY-5kXqLDXRmtYVKE9rcqzEghmw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/DTR9bZd1HOqpRJyz9TKiLb0cqe5Hb84Yi_79A6LWlN1tY-5kXqLDXRmtYVKE9rcqzEghmw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'elbowcough',\n },\n },\n },\n isCustomEmoji: true,\n index: 31,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/EAJ1XrS7PMGQ8gTz_prwAg',\n shortcuts: [':learning:'],\n searchTerms: ['learning'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/ZuBuz8GAQ6IEcQc7CoJL8IEBTYbXEvzhBeqy1AiytmhuAT0VHjpXEjd-A5GfR4zDin1L53Q=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/ZuBuz8GAQ6IEcQc7CoJL8IEBTYbXEvzhBeqy1AiytmhuAT0VHjpXEjd-A5GfR4zDin1L53Q=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'learning',\n },\n },\n },\n isCustomEmoji: true,\n index: 32,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/JAJ1XpGpJYnW8wTupZu4Cw',\n shortcuts: [':washhands:'],\n searchTerms: ['washhands'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/qXUeUW0KpKBc9Z3AqUqr_0B7HbW1unAv4qmt7-LJGUK_gsFBIaHISWJNt4n3yvmAnQNZHE-u=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/qXUeUW0KpKBc9Z3AqUqr_0B7HbW1unAv4qmt7-LJGUK_gsFBIaHISWJNt4n3yvmAnQNZHE-u=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'washhands',\n },\n },\n },\n isCustomEmoji: true,\n index: 33,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/PAJ1XsOOI4fegwOo57ewAg',\n shortcuts: [':socialdist:'],\n searchTerms: ['socialdist'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/igBNi55-TACUi1xQkqMAor-IEXmt8He56K7pDTG5XoTsbM-rVswNzUfC5iwnfrpunWihrg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/igBNi55-TACUi1xQkqMAor-IEXmt8He56K7pDTG5XoTsbM-rVswNzUfC5iwnfrpunWihrg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'socialdist',\n },\n },\n },\n isCustomEmoji: true,\n index: 34,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/egJ1XufTKYfegwOo57ewAg',\n shortcuts: [':shelterin:'],\n searchTerms: ['shelterin'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/gjC5x98J4BoVSEPfFJaoLtc4tSBGSEdIlfL2FV4iJG9uGNykDP9oJC_QxAuBTJy6dakPxVeC=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/gjC5x98J4BoVSEPfFJaoLtc4tSBGSEdIlfL2FV4iJG9uGNykDP9oJC_QxAuBTJy6dakPxVeC=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'shelterin',\n },\n },\n },\n isCustomEmoji: true,\n index: 35,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/G8AfY6yWGuKuhL0PlbiA2AE',\n shortcuts: [':hand-pink-waving:'],\n searchTerms: ['hand-pink-waving'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/KOxdr_z3A5h1Gb7kqnxqOCnbZrBmxI2B_tRQ453BhTWUhYAlpg5ZP8IKEBkcvRoY8grY91Q=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/KOxdr_z3A5h1Gb7kqnxqOCnbZrBmxI2B_tRQ453BhTWUhYAlpg5ZP8IKEBkcvRoY8grY91Q=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hand-pink-waving',\n },\n },\n },\n isCustomEmoji: true,\n index: 36,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/KsIfY6LzFoLM6AKanYDQAg',\n shortcuts: [':face-blue-smiling:'],\n searchTerms: ['face-blue-smiling'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/cktIaPxFwnrPwn-alHvnvedHLUJwbHi8HCK3AgbHpphrMAW99qw0bDfxuZagSY5ieE9BBrA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/cktIaPxFwnrPwn-alHvnvedHLUJwbHi8HCK3AgbHpphrMAW99qw0bDfxuZagSY5ieE9BBrA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-smiling',\n },\n },\n },\n isCustomEmoji: true,\n index: 37,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/W8IfY_bwAfiPq7IPvNCA2AU',\n shortcuts: [':face-red-droopy-eyes:'],\n searchTerms: ['face-red-droopy-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/oih9s26MOYPWC_uL6tgaeOlXSGBv8MMoDrWzBt-80nEiVSL9nClgnuzUAKqkU9_TWygF6CI=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/oih9s26MOYPWC_uL6tgaeOlXSGBv8MMoDrWzBt-80nEiVSL9nClgnuzUAKqkU9_TWygF6CI=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-red-droopy-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 38,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/b8IfY7zOK9iVkNAP_I2A-AY',\n shortcuts: [':face-purple-crying:'],\n searchTerms: ['face-purple-crying'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/g6_km98AfdHbN43gvEuNdZ2I07MmzVpArLwEvNBwwPqpZYzszqhRzU_DXALl11TchX5_xFE=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/g6_km98AfdHbN43gvEuNdZ2I07MmzVpArLwEvNBwwPqpZYzszqhRzU_DXALl11TchX5_xFE=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-crying',\n },\n },\n },\n isCustomEmoji: true,\n index: 39,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hcIfY57lBJXp6AKBx4CoCA',\n shortcuts: [':text-green-game-over:'],\n searchTerms: ['text-green-game-over'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/cr36FHhSiMAJUSpO9XzjbOgxhtrdJNTVJUlMJeOOfLOFzKleAKT2SEkZwbqihBqfTXYCIg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/cr36FHhSiMAJUSpO9XzjbOgxhtrdJNTVJUlMJeOOfLOFzKleAKT2SEkZwbqihBqfTXYCIg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'text-green-game-over',\n },\n },\n },\n isCustomEmoji: true,\n index: 40,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/ssIfY7OFG5OykQOpn4CQCw',\n shortcuts: [':person-turqouise-waving:'],\n searchTerms: ['person-turqouise-waving'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/uNSzQ2M106OC1L3VGzrOsGNjopboOv-m1bnZKFGuh0DxcceSpYHhYbuyggcgnYyaF3o-AQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/uNSzQ2M106OC1L3VGzrOsGNjopboOv-m1bnZKFGuh0DxcceSpYHhYbuyggcgnYyaF3o-AQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-turqouise-waving',\n },\n },\n },\n isCustomEmoji: true,\n index: 41,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/xsIfY4OqCd2T29sP54iAsAw',\n shortcuts: [':face-green-smiling:'],\n searchTerms: ['face-green-smiling'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/G061SAfXg2bmG1ZXbJsJzQJpN8qEf_W3f5cb5nwzBYIV58IpPf6H90lElDl85iti3HgoL3o=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/G061SAfXg2bmG1ZXbJsJzQJpN8qEf_W3f5cb5nwzBYIV58IpPf6H90lElDl85iti3HgoL3o=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-green-smiling',\n },\n },\n },\n isCustomEmoji: true,\n index: 42,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/2sIfY8vIG8z96ALulYDQDQ',\n shortcuts: [':face-orange-frowning:'],\n searchTerms: ['face-orange-frowning'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Ar8jaEIxzfiyYmB7ejDOHba2kUMdR37MHn_R39mtxqO5CD4aYGvjDFL22DW_Cka6LKzhGDk=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Ar8jaEIxzfiyYmB7ejDOHba2kUMdR37MHn_R39mtxqO5CD4aYGvjDFL22DW_Cka6LKzhGDk=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-orange-frowning',\n },\n },\n },\n isCustomEmoji: true,\n index: 43,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/7cIfY5niDOmSkNAP08CA6A4',\n shortcuts: [':eyes-purple-crying:'],\n searchTerms: ['eyes-purple-crying'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/FrYgdeZPpvXs-6Mp305ZiimWJ0wV5bcVZctaUy80mnIdwe-P8HRGYAm0OyBtVx8EB9_Dxkc=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/FrYgdeZPpvXs-6Mp305ZiimWJ0wV5bcVZctaUy80mnIdwe-P8HRGYAm0OyBtVx8EB9_Dxkc=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'eyes-purple-crying',\n },\n },\n },\n isCustomEmoji: true,\n index: 44,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/A8MfY-_pEIKNr8oP78-AGA',\n shortcuts: [':face-fuchsia-wide-eyes:'],\n searchTerms: ['face-fuchsia-wide-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/zdcOC1SMmyXJOAddl9DYeEFN9YYcn5mHemJCdRFQMtDuS0V-IyE-5YjNUL1tduX1zs17tQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/zdcOC1SMmyXJOAddl9DYeEFN9YYcn5mHemJCdRFQMtDuS0V-IyE-5YjNUL1tduX1zs17tQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-fuchsia-wide-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 45,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/E8MfY5u7JPSXkNAP95GAmAE',\n shortcuts: [':cat-orange-whistling:'],\n searchTerms: ['cat-orange-whistling'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/0ocqEmuhrKCK87_J21lBkvjW70wRGC32-Buwk6TP4352CgcNjL6ug8zcsel6JiPbE58xhq5g=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/0ocqEmuhrKCK87_J21lBkvjW70wRGC32-Buwk6TP4352CgcNjL6ug8zcsel6JiPbE58xhq5g=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'cat-orange-whistling',\n },\n },\n },\n isCustomEmoji: true,\n index: 46,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/LsMfY8P6G-yckNAPjoWA8AI',\n shortcuts: [':face-blue-wide-eyes:'],\n searchTerms: ['face-blue-wide-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/2Ht4KImoWDlCddiDQVuzSJwpEb59nZJ576ckfaMh57oqz2pUkkgVTXV8osqUOgFHZdUISJM=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/2Ht4KImoWDlCddiDQVuzSJwpEb59nZJ576ckfaMh57oqz2pUkkgVTXV8osqUOgFHZdUISJM=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-wide-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 47,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Z8MfY8mzLbnovwK5roC4Bg',\n shortcuts: [':face-orange-raised-eyebrow:'],\n searchTerms: ['face-orange-raised-eyebrow'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/JbCfmOgYI-mO17LPw8e_ycqbBGESL8AVP6i7ZsBOVLd3PEpgrfEuJ9rEGpP_unDcqgWSCg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/JbCfmOgYI-mO17LPw8e_ycqbBGESL8AVP6i7ZsBOVLd3PEpgrfEuJ9rEGpP_unDcqgWSCg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-orange-raised-eyebrow',\n },\n },\n },\n isCustomEmoji: true,\n index: 48,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hcMfY5_zAbbxvwKLooCoCA',\n shortcuts: [':face-fuchsia-tongue-out:'],\n searchTerms: ['face-fuchsia-tongue-out'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/EURfJZi_heNulV3mfHzXBk8PIs9XmZ9lOOYi5za6wFMCGrps4i2BJX9j-H2gK6LIhW6h7sY=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/EURfJZi_heNulV3mfHzXBk8PIs9XmZ9lOOYi5za6wFMCGrps4i2BJX9j-H2gK6LIhW6h7sY=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-fuchsia-tongue-out',\n },\n },\n },\n isCustomEmoji: true,\n index: 49,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/ygF1XpGUMMjk8gSDrI2wCx',\n shortcuts: [':face-orange-biting-nails:'],\n searchTerms: ['face-orange-biting-nails'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/HmsXEgqUogkQOnL5LP_FdPit9Z909RJxby-uYcPxBLNhaPyqPTcGwvGaGPk2hzB_cC0hs_pV=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/HmsXEgqUogkQOnL5LP_FdPit9Z909RJxby-uYcPxBLNhaPyqPTcGwvGaGPk2hzB_cC0hs_pV=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-orange-biting-nails',\n },\n },\n },\n isCustomEmoji: true,\n index: 50,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/m8MfY4jbFsWJhL0PyouA2Ak',\n shortcuts: [':face-red-heart-shape:'],\n searchTerms: ['face-red-heart-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/I0Mem9dU_IZ4a9cQPzR0pUJ8bH-882Eg0sDQjBmPcHA6Oq0uXOZcsjPvPbtormx91Ha2eRA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/I0Mem9dU_IZ4a9cQPzR0pUJ8bH-882Eg0sDQjBmPcHA6Oq0uXOZcsjPvPbtormx91Ha2eRA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-red-heart-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 51,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/6_cfY8HJH8bV5QS5yYDYDg',\n shortcuts: [':face-fuchsia-poop-shape:'],\n searchTerms: ['face-fuchsia-poop-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/_xlyzvSimqMzhdhODyqUBLXIGA6F_d5en2bq-AIfc6fc3M7tw2jucuXRIo5igcW3g9VVe3A=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/_xlyzvSimqMzhdhODyqUBLXIGA6F_d5en2bq-AIfc6fc3M7tw2jucuXRIo5igcW3g9VVe3A=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-fuchsia-poop-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 52,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/DfgfY9LaNdmMq7IPuI2AaA',\n shortcuts: [':face-purple-wide-eyes:'],\n searchTerms: ['face-purple-wide-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/5RDrtjmzRQKuVYE_FKPUHiGh7TNtX5eSNe6XzcSytMsHirXYKunxpyAsVacTFMg0jmUGhQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/5RDrtjmzRQKuVYE_FKPUHiGh7TNtX5eSNe6XzcSytMsHirXYKunxpyAsVacTFMg0jmUGhQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-wide-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 53,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/HvgfY93GEYmqvwLUuYDwAQ',\n shortcuts: [':glasses-purple-yellow-diamond:'],\n searchTerms: ['glasses-purple-yellow-diamond'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/EnDBiuksboKsLkxp_CqMWlTcZtlL77QBkbjz_rLedMSDzrHmy_6k44YWFy2rk4I0LG6K2KI=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/EnDBiuksboKsLkxp_CqMWlTcZtlL77QBkbjz_rLedMSDzrHmy_6k44YWFy2rk4I0LG6K2KI=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'glasses-purple-yellow-diamond',\n },\n },\n },\n isCustomEmoji: true,\n index: 54,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/NvgfY9aeC_OFvOMPkrOAsAM',\n shortcuts: [':face-pink-tears:'],\n searchTerms: ['face-pink-tears'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/RL5QHCNcO_Mc98SxFEblXZt9FNoh3bIgsjm0Kj8kmeQJWMeTu7JX_NpICJ6KKwKT0oVHhAA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/RL5QHCNcO_Mc98SxFEblXZt9FNoh3bIgsjm0Kj8kmeQJWMeTu7JX_NpICJ6KKwKT0oVHhAA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-pink-tears',\n },\n },\n },\n isCustomEmoji: true,\n index: 55,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/UvgfY_vqE92T29sPvqiAkAU',\n shortcuts: [':body-blue-raised-arms:'],\n searchTerms: ['body-blue-raised-arms'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/2Jds3I9UKOfgjid97b_nlDU4X2t5MgjTof8yseCp7M-6ZhOhRkPGSPfYwmE9HjCibsfA1Uzo=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/2Jds3I9UKOfgjid97b_nlDU4X2t5MgjTof8yseCp7M-6ZhOhRkPGSPfYwmE9HjCibsfA1Uzo=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'body-blue-raised-arms',\n },\n },\n },\n isCustomEmoji: true,\n index: 56,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/YvgfY-LIBpjChgHKyYCQBg',\n shortcuts: [':hand-orange-covering-eyes:'],\n searchTerms: ['hand-orange-covering-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/y8ppa6GcJoRUdw7GwmjDmTAnSkeIkUptZMVQuFmFaTlF_CVIL7YP7hH7hd0TJbd8p9w67IM=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/y8ppa6GcJoRUdw7GwmjDmTAnSkeIkUptZMVQuFmFaTlF_CVIL7YP7hH7hd0TJbd8p9w67IM=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hand-orange-covering-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 57,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/ePgfY-K2Kp6Mr8oP1oqAwAc',\n shortcuts: [':trophy-yellow-smiling:'],\n searchTerms: ['trophy-yellow-smiling'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/7tf3A_D48gBg9g2N0Rm6HWs2aqzshHU4CuVubTXVxh1BP7YDBRC6pLBoC-ibvr-zCl_Lgg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/7tf3A_D48gBg9g2N0Rm6HWs2aqzshHU4CuVubTXVxh1BP7YDBRC6pLBoC-ibvr-zCl_Lgg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'trophy-yellow-smiling',\n },\n },\n },\n isCustomEmoji: true,\n index: 58,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/jPgfY5j2IIud29sP3ZeA4Ag',\n shortcuts: [':eyes-pink-heart-shape:'],\n searchTerms: ['eyes-pink-heart-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/5vzlCQfQQdzsG7nlQzD8eNjtyLlnATwFwGvrMpC8dgLcosNhWLXu8NN9qIS3HZjJYd872dM=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/5vzlCQfQQdzsG7nlQzD8eNjtyLlnATwFwGvrMpC8dgLcosNhWLXu8NN9qIS3HZjJYd872dM=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'eyes-pink-heart-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 59,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/oPgfY_DoKfSXkNAPq8-AgAo',\n shortcuts: [':face-turquoise-covering-eyes:'],\n searchTerms: ['face-turquoise-covering-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/H2HNPRO8f4SjMmPNh5fl10okSETW7dLTZtuE4jh9D6pSmaUiLfoZJ2oiY-qWU3Owfm1IsXg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/H2HNPRO8f4SjMmPNh5fl10okSETW7dLTZtuE4jh9D6pSmaUiLfoZJ2oiY-qWU3Owfm1IsXg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-turquoise-covering-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 60,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/tPgfY7mSO4XovQKzmYCgCw',\n shortcuts: [':hand-green-crystal-ball:'],\n searchTerms: ['hand-green-crystal-ball'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/qZfJrWDEmR03FIak7PMNRNpMjNsCnOzD9PqK8mOpAp4Kacn_uXRNJNb99tE_1uyEbvgJReF2=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/qZfJrWDEmR03FIak7PMNRNpMjNsCnOzD9PqK8mOpAp4Kacn_uXRNJNb99tE_1uyEbvgJReF2=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hand-green-crystal-ball',\n },\n },\n },\n isCustomEmoji: true,\n index: 61,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/zPgfY66lCJGRhL0Pz6iA4Aw',\n shortcuts: [':face-turquoise-drinking-coffee:'],\n searchTerms: ['face-turquoise-drinking-coffee'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/myqoI1MgFUXQr5fuWTC9mz0BCfgf3F8GSDp06o1G7w6pTz48lwARjdG8vj0vMxADvbwA1dA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/myqoI1MgFUXQr5fuWTC9mz0BCfgf3F8GSDp06o1G7w6pTz48lwARjdG8vj0vMxADvbwA1dA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-turquoise-drinking-coffee',\n },\n },\n },\n isCustomEmoji: true,\n index: 62,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/4PgfY73cJprKCq-_gIAO',\n shortcuts: [':body-green-covering-eyes:'],\n searchTerms: ['body-green-covering-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/UR8ydcU3gz360bzDsprB6d1klFSQyVzgn-Fkgu13dIKPj3iS8OtG1bhBUXPdj9pMwtM00ro=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/UR8ydcU3gz360bzDsprB6d1klFSQyVzgn-Fkgu13dIKPj3iS8OtG1bhBUXPdj9pMwtM00ro=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'body-green-covering-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 63,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/-fgfY9DIGYjbhgHLzoDIDw',\n shortcuts: [':goat-turquoise-white-horns:'],\n searchTerms: ['goat-turquoise-white-horns'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/jMnX4lu5GnjBRgiPtX5FwFmEyKTlWFrr5voz-Auko35oP0t3-zhPxR3PQMYa-7KhDeDtrv4=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/jMnX4lu5GnjBRgiPtX5FwFmEyKTlWFrr5voz-Auko35oP0t3-zhPxR3PQMYa-7KhDeDtrv4=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'goat-turquoise-white-horns',\n },\n },\n },\n isCustomEmoji: true,\n index: 64,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/EvkfY6uNC5OykQOewoCQAQ',\n shortcuts: [':hand-purple-blue-peace:'],\n searchTerms: ['hand-purple-blue-peace'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/-sC8wj6pThd7FNdslEoJlG4nB9SIbrJG3CRGh7-bNV0RVfcrJuwiWHoUZ6UmcVs7sQjxTg4=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/-sC8wj6pThd7FNdslEoJlG4nB9SIbrJG3CRGh7-bNV0RVfcrJuwiWHoUZ6UmcVs7sQjxTg4=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hand-purple-blue-peace',\n },\n },\n },\n isCustomEmoji: true,\n index: 65,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/LfkfY_zhH4GFr8oP4aKA6AI',\n shortcuts: [':face-blue-question-mark:'],\n searchTerms: ['face-blue-question-mark'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Wx4PMqTwG3f4gtR7J9Go1s8uozzByGWLSXHzrh3166ixaYRinkH_F05lslfsRUsKRvHXrDk=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Wx4PMqTwG3f4gtR7J9Go1s8uozzByGWLSXHzrh3166ixaYRinkH_F05lslfsRUsKRvHXrDk=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-question-mark',\n },\n },\n },\n isCustomEmoji: true,\n index: 66,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/RPkfY8TPGsCakNAP-JWAoAQ',\n shortcuts: [':face-blue-covering-eyes:'],\n searchTerms: ['face-blue-covering-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/kj3IgbbR6u-mifDkBNWVcdOXC-ut-tiFbDpBMGVeW79c2c54n5vI-HNYCOC6XZ9Bzgupc10=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/kj3IgbbR6u-mifDkBNWVcdOXC-ut-tiFbDpBMGVeW79c2c54n5vI-HNYCOC6XZ9Bzgupc10=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-covering-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 67,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Mm5IY53bH7SEq7IP-MWAkAM',\n shortcuts: [':face-purple-smiling-fangs:'],\n searchTerms: ['face-purple-smiling-fangs'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/k1vqi6xoHakGUfa0XuZYWHOv035807ARP-ZLwFmA-_NxENJMxsisb-kUgkSr96fj5baBOZE=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/k1vqi6xoHakGUfa0XuZYWHOv035807ARP-ZLwFmA-_NxENJMxsisb-kUgkSr96fj5baBOZE=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-smiling-fangs',\n },\n },\n },\n isCustomEmoji: true,\n index: 68,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/UW5IY-ibBqa8jgTymoCIBQ',\n shortcuts: [':face-purple-sweating:'],\n searchTerms: ['face-purple-sweating'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/tRnrCQtEKlTM9YLPo0vaxq9mDvlT0mhDld2KI7e_nDRbhta3ULKSoPVHZ1-bNlzQRANmH90=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/tRnrCQtEKlTM9YLPo0vaxq9mDvlT0mhDld2KI7e_nDRbhta3ULKSoPVHZ1-bNlzQRANmH90=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-sweating',\n },\n },\n },\n isCustomEmoji: true,\n index: 69,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Ym5IY7-0LoqA29sPq9CAkAY',\n shortcuts: [':face-purple-smiling-tears:'],\n searchTerms: ['face-purple-smiling-tears'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/MJV1k3J5s0hcUfuo78Y6MKi-apDY5NVDjO9Q7hL8fU4i0cIBgU-cU4rq4sHessJuvuGpDOjJ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/MJV1k3J5s0hcUfuo78Y6MKi-apDY5NVDjO9Q7hL8fU4i0cIBgU-cU4rq4sHessJuvuGpDOjJ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-smiling-tears',\n },\n },\n },\n isCustomEmoji: true,\n index: 70,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/dG5IY-mhEof9jgSykoCgBw',\n shortcuts: [':face-blue-star-eyes:'],\n searchTerms: ['face-blue-star-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/m_ANavMhp6cQ1HzX0HCTgp_er_yO2UA28JPbi-0HElQgnQ4_q5RUhgwueTpH-st8L3MyTA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/m_ANavMhp6cQ1HzX0HCTgp_er_yO2UA28JPbi-0HElQgnQ4_q5RUhgwueTpH-st8L3MyTA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-star-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 71,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hm5IY4W-H9SO5QS6n4CwCA',\n shortcuts: [':face-blue-heart-eyes:'],\n searchTerms: ['face-blue-heart-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/M9tzKd64_r3hvgpTSgca7K3eBlGuyiqdzzhYPp7ullFAHMgeFoNLA0uQ1dGxj3fXgfcHW4w=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/M9tzKd64_r3hvgpTSgca7K3eBlGuyiqdzzhYPp7ullFAHMgeFoNLA0uQ1dGxj3fXgfcHW4w=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-heart-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 72,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/mW5IY47PMcSnkMkPo6OAyAk',\n shortcuts: [':face-blue-three-eyes:'],\n searchTerms: ['face-blue-three-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/nSQHitVplLe5uZC404dyAwv1f58S3PN-U_799fvFzq-6b3bv-MwENO-Zs1qQI4oEXCbOJg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/nSQHitVplLe5uZC404dyAwv1f58S3PN-U_799fvFzq-6b3bv-MwENO-Zs1qQI4oEXCbOJg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-three-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 73,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/rW5IY_26FryOq7IPlL2A6Ao',\n shortcuts: [':face-blue-droopy-eyes:'],\n searchTerms: ['face-blue-droopy-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/hGPqMUCiXGt6zuX4dHy0HRZtQ-vZmOY8FM7NOHrJTta3UEJksBKjOcoE6ZUAW9sz7gIF_nk=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/hGPqMUCiXGt6zuX4dHy0HRZtQ-vZmOY8FM7NOHrJTta3UEJksBKjOcoE6ZUAW9sz7gIF_nk=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-droopy-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 74,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/v25IY7KcJIGOr8oPz4OA-As',\n shortcuts: [':planet-orange-purple-ring:'],\n searchTerms: ['planet-orange-purple-ring'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/xkaLigm3P4_1g4X1JOtkymcC7snuJu_C5YwIFAyQlAXK093X0IUjaSTinMTLKeRZ6280jXg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/xkaLigm3P4_1g4X1JOtkymcC7snuJu_C5YwIFAyQlAXK093X0IUjaSTinMTLKeRZ6280jXg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'planet-orange-purple-ring',\n },\n },\n },\n isCustomEmoji: true,\n index: 75,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-yellow-podium-blue',\n shortcuts: [':person-yellow-podium-blue:'],\n searchTerms: ['person-yellow-podium-blue'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/N28nFDm82F8kLPAa-jY_OySFsn3Ezs_2Bl5kdxC8Yxau5abkj_XZHYsS3uYKojs8qy8N-9w=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/N28nFDm82F8kLPAa-jY_OySFsn3Ezs_2Bl5kdxC8Yxau5abkj_XZHYsS3uYKojs8qy8N-9w=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-yellow-podium-blue',\n },\n },\n },\n isCustomEmoji: true,\n index: 76,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/baseball-white-cap-out',\n shortcuts: [':baseball-white-cap-out:'],\n searchTerms: ['baseball-white-cap-out'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/8DaGaXfaBN0c-ZsZ-1WqPJ6H9TsJOlUUQQEoXvmdROphZE9vdRtN0867Gb2YZcm2x38E9Q=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/8DaGaXfaBN0c-ZsZ-1WqPJ6H9TsJOlUUQQEoXvmdROphZE9vdRtN0867Gb2YZcm2x38E9Q=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'baseball-white-cap-out',\n },\n },\n },\n isCustomEmoji: true,\n index: 77,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/whistle-red-blow',\n shortcuts: [':whistle-red-blow:'],\n searchTerms: ['whistle-red-blow'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/DBu1ZfPJTnX9S1RyKKdBY-X_CEmj7eF6Uzl71j5jVBz5y4k9JcKnoiFtImAbeu4u8M2X8tU=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/DBu1ZfPJTnX9S1RyKKdBY-X_CEmj7eF6Uzl71j5jVBz5y4k9JcKnoiFtImAbeu4u8M2X8tU=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'whistle-red-blow',\n },\n },\n },\n isCustomEmoji: true,\n index: 78,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-turquoise-crowd-surf',\n shortcuts: [':person-turquoise-crowd-surf:'],\n searchTerms: ['person-turquoise-crowd-surf'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Q0wFvHZ5h54xGSTo-JeGst6InRU3yR6NdBRoyowaqGY66LPzdcrV2t-wBN21kBIdb2TeNA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Q0wFvHZ5h54xGSTo-JeGst6InRU3yR6NdBRoyowaqGY66LPzdcrV2t-wBN21kBIdb2TeNA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-turquoise-crowd-surf',\n },\n },\n },\n isCustomEmoji: true,\n index: 79,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/finger-red-number-one',\n shortcuts: [':finger-red-number-one:'],\n searchTerms: ['finger-red-number-one'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Hbk0wxBzPTBCDvD_y4qdcHL5_uu7SeOnaT2B7gl9GLB4u8Ecm9OaXCGSMMUBFeNGl5Q3fHJ2=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Hbk0wxBzPTBCDvD_y4qdcHL5_uu7SeOnaT2B7gl9GLB4u8Ecm9OaXCGSMMUBFeNGl5Q3fHJ2=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'finger-red-number-one',\n },\n },\n },\n isCustomEmoji: true,\n index: 80,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/text-yellow-goal',\n shortcuts: [':text-yellow-goal:'],\n searchTerms: ['text-yellow-goal'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/tnHp8rHjXecGbGrWNcs7xss_aVReaYE6H-QWRCXYg_aaYszHXnbP_pVADnibUiimspLvgX0L=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/tnHp8rHjXecGbGrWNcs7xss_aVReaYE6H-QWRCXYg_aaYszHXnbP_pVADnibUiimspLvgX0L=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'text-yellow-goal',\n },\n },\n },\n isCustomEmoji: true,\n index: 81,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/medal-yellow-first-red',\n shortcuts: [':medal-yellow-first-red:'],\n searchTerms: ['medal-yellow-first-red'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/EEHiiIalCBKuWDPtNOjjvmEZ-KRkf5dlgmhe5rbLn8aZQl-pNz_paq5UjxNhCrI019TWOQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/EEHiiIalCBKuWDPtNOjjvmEZ-KRkf5dlgmhe5rbLn8aZQl-pNz_paq5UjxNhCrI019TWOQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'medal-yellow-first-red',\n },\n },\n },\n isCustomEmoji: true,\n index: 82,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-blue-wheelchair-race',\n shortcuts: [':person-blue-wheelchair-race:'],\n searchTerms: ['person-blue-wheelchair-race'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/ZepxPGk5TwzrKAP9LUkzmKmEkbaF5OttNyybwok6mJENw3p0lxDXkD1X2_rAwGcUM0L-D04=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/ZepxPGk5TwzrKAP9LUkzmKmEkbaF5OttNyybwok6mJENw3p0lxDXkD1X2_rAwGcUM0L-D04=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-blue-wheelchair-race',\n },\n },\n },\n isCustomEmoji: true,\n index: 83,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/card-red-penalty',\n shortcuts: [':card-red-penalty:'],\n searchTerms: ['card-red-penalty'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/uRDUMIeAHnNsaIaShtRkQ6hO0vycbNH_BQT7i3PWetFJb09q88RTjxwzToBy9Cez20D7hA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/uRDUMIeAHnNsaIaShtRkQ6hO0vycbNH_BQT7i3PWetFJb09q88RTjxwzToBy9Cez20D7hA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'card-red-penalty',\n },\n },\n },\n isCustomEmoji: true,\n index: 84,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/stopwatch-blue-hand-timer',\n shortcuts: [':stopwatch-blue-hand-timer:'],\n searchTerms: ['stopwatch-blue-hand-timer'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/DCvefDAiskRfACgolTlvV1kMfiZVcG50UrmpnRrg3k0udFWG2Uo9zFMaJrJMSJYwcx6fMgk=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/DCvefDAiskRfACgolTlvV1kMfiZVcG50UrmpnRrg3k0udFWG2Uo9zFMaJrJMSJYwcx6fMgk=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'stopwatch-blue-hand-timer',\n },\n },\n },\n isCustomEmoji: true,\n index: 85,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-turquoise-speaker-shape',\n shortcuts: [':face-turquoise-speaker-shape:'],\n searchTerms: ['face-turquoise-speaker-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/WTFFqm70DuMxSC6ezQ5Zs45GaWD85Xwrd9Sullxt54vErPUKb_o0NJQ4kna5m7rvjbRMgr3A=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/WTFFqm70DuMxSC6ezQ5Zs45GaWD85Xwrd9Sullxt54vErPUKb_o0NJQ4kna5m7rvjbRMgr3A=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-turquoise-speaker-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 86,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/octopus-red-waving',\n shortcuts: [':octopus-red-waving:'],\n searchTerms: ['octopus-red-waving'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/L9Wo5tLT_lRQX36iZO_fJqLJR4U74J77tJ6Dg-QmPmSC_zhVQ-NodMRc9T0ozwvRXRaT43o=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/L9Wo5tLT_lRQX36iZO_fJqLJR4U74J77tJ6Dg-QmPmSC_zhVQ-NodMRc9T0ozwvRXRaT43o=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'octopus-red-waving',\n },\n },\n },\n isCustomEmoji: true,\n index: 87,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/pillow-turquoise-hot-chocolate',\n shortcuts: [':pillow-turquoise-hot-chocolate:'],\n searchTerms: ['pillow-turquoise-hot-chocolate'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/cAR4cehRxbn6dPbxKIb-7ShDdWnMxbaBqy2CXzBW4aRL3IqXs3rxG0UdS7IU71OEU7LSd20q=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/cAR4cehRxbn6dPbxKIb-7ShDdWnMxbaBqy2CXzBW4aRL3IqXs3rxG0UdS7IU71OEU7LSd20q=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pillow-turquoise-hot-chocolate',\n },\n },\n },\n isCustomEmoji: true,\n index: 88,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hourglass-purple-sand-orange',\n shortcuts: [':hourglass-purple-sand-orange:'],\n searchTerms: ['hourglass-purple-sand-orange'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/MFDLjasPt5cuSM_tK5Fnjaz_k08lKHdX_Mf7JkI6awaHriC3rGL7J_wHxyG6PPhJ8CJ6vsQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/MFDLjasPt5cuSM_tK5Fnjaz_k08lKHdX_Mf7JkI6awaHriC3rGL7J_wHxyG6PPhJ8CJ6vsQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hourglass-purple-sand-orange',\n },\n },\n },\n isCustomEmoji: true,\n index: 89,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/fish-orange-wide-eyes',\n shortcuts: [':fish-orange-wide-eyes:'],\n searchTerms: ['fish-orange-wide-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/iQLKgKs7qL3091VHgVgpaezc62uPewy50G_DoI0dMtVGmQEX5pflZrUxWfYGmRfzfUOOgJs=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/iQLKgKs7qL3091VHgVgpaezc62uPewy50G_DoI0dMtVGmQEX5pflZrUxWfYGmRfzfUOOgJs=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'fish-orange-wide-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 90,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/popcorn-yellow-striped-smile',\n shortcuts: [':popcorn-yellow-striped-smile:'],\n searchTerms: ['popcorn-yellow-striped-smile'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/TW_GktV5uVYviPDtkCRCKRDrGlUc3sJ5OHO81uqdMaaHrIQ5-sXXwJfDI3FKPyv4xtGpOlg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/TW_GktV5uVYviPDtkCRCKRDrGlUc3sJ5OHO81uqdMaaHrIQ5-sXXwJfDI3FKPyv4xtGpOlg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'popcorn-yellow-striped-smile',\n },\n },\n },\n isCustomEmoji: true,\n index: 91,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/penguin-blue-waving-tear',\n shortcuts: [':penguin-blue-waving-tear:'],\n searchTerms: ['penguin-blue-waving-tear'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/p2u7dcfZau4_bMOMtN7Ma8mjHX_43jOjDwITf4U9adT44I-y-PT7ddwPKkfbW6Wx02BTpNoC=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/p2u7dcfZau4_bMOMtN7Ma8mjHX_43jOjDwITf4U9adT44I-y-PT7ddwPKkfbW6Wx02BTpNoC=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'penguin-blue-waving-tear',\n },\n },\n },\n isCustomEmoji: true,\n index: 92,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/clock-turquoise-looking-up',\n shortcuts: [':clock-turquoise-looking-up:'],\n searchTerms: ['clock-turquoise-looking-up'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/tDnDkDZykkJTrsWEJPlRF30rmbek2wcDcAIymruOvSLTsUFIZHoAiYTRe9OtO-80lDfFGvo=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/tDnDkDZykkJTrsWEJPlRF30rmbek2wcDcAIymruOvSLTsUFIZHoAiYTRe9OtO-80lDfFGvo=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'clock-turquoise-looking-up',\n },\n },\n },\n isCustomEmoji: true,\n index: 93,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-red-smiling-live',\n shortcuts: [':face-red-smiling-live:'],\n searchTerms: ['face-red-smiling-live'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/14Pb--7rVcqnHvM7UlrYnV9Rm4J-uojX1B1kiXYvv1my-eyu77pIoPR5sH28-eNIFyLaQHs=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/14Pb--7rVcqnHvM7UlrYnV9Rm4J-uojX1B1kiXYvv1my-eyu77pIoPR5sH28-eNIFyLaQHs=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-red-smiling-live',\n },\n },\n },\n isCustomEmoji: true,\n index: 94,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hands-yellow-heart-red',\n shortcuts: [':hands-yellow-heart-red:'],\n searchTerms: ['hands-yellow-heart-red'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/qWSu2zrgOKLKgt_E-XUP9e30aydT5aF3TnNjvfBL55cTu1clP8Eoh5exN3NDPEVPYmasmoA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/qWSu2zrgOKLKgt_E-XUP9e30aydT5aF3TnNjvfBL55cTu1clP8Eoh5exN3NDPEVPYmasmoA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hands-yellow-heart-red',\n },\n },\n },\n isCustomEmoji: true,\n index: 95,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/volcano-green-lava-orange',\n shortcuts: [':volcano-green-lava-orange:'],\n searchTerms: ['volcano-green-lava-orange'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/_IWOdMxapt6IBY5Cb6LFVkA3J77dGQ7P2fuvYYv1-ahigpVfBvkubOuGLSCyFJ7jvis-X8I=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/_IWOdMxapt6IBY5Cb6LFVkA3J77dGQ7P2fuvYYv1-ahigpVfBvkubOuGLSCyFJ7jvis-X8I=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'volcano-green-lava-orange',\n },\n },\n },\n isCustomEmoji: true,\n index: 96,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-turquoise-waving-speech',\n shortcuts: [':person-turquoise-waving-speech:'],\n searchTerms: ['person-turquoise-waving-speech'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/gafhCE49PH_9q-PuigZaDdU6zOKD6grfwEh1MM7fYVs7smAS_yhYCBipq8gEiW73E0apKTzi=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/gafhCE49PH_9q-PuigZaDdU6zOKD6grfwEh1MM7fYVs7smAS_yhYCBipq8gEiW73E0apKTzi=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-turquoise-waving-speech',\n },\n },\n },\n isCustomEmoji: true,\n index: 97,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-orange-tv-shape',\n shortcuts: [':face-orange-tv-shape:'],\n searchTerms: ['face-orange-tv-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/EVK0ik6dL5mngojX9I9Juw4iFh053emP0wcUjZH0whC_LabPq-DZxN4Jg-tpMcEVfJ0QpcJ4=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/EVK0ik6dL5mngojX9I9Juw4iFh053emP0wcUjZH0whC_LabPq-DZxN4Jg-tpMcEVfJ0QpcJ4=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-orange-tv-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 98,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-blue-spam-shape',\n shortcuts: [':face-blue-spam-shape:'],\n searchTerms: ['face-blue-spam-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/hpwvR5UgJtf0bGkUf8Rn-jTlD6DYZ8FPOFY7rhZZL-JHj_7OPDr7XUOesilRPxlf-aW42Zg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/hpwvR5UgJtf0bGkUf8Rn-jTlD6DYZ8FPOFY7rhZZL-JHj_7OPDr7XUOesilRPxlf-aW42Zg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-spam-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 99,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-fuchsia-flower-shape',\n shortcuts: [':face-fuchsia-flower-shape:'],\n searchTerms: ['face-fuchsia-flower-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/o9kq4LQ0fE_x8yxj29ZeLFZiUFpHpL_k2OivHbjZbttzgQytU49Y8-VRhkOP18jgH1dQNSVz=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/o9kq4LQ0fE_x8yxj29ZeLFZiUFpHpL_k2OivHbjZbttzgQytU49Y8-VRhkOP18jgH1dQNSVz=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-fuchsia-flower-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 100,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-blue-holding-pencil',\n shortcuts: [':person-blue-holding-pencil:'],\n searchTerms: ['person-blue-holding-pencil'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/TKgph5IHIHL-A3fgkrGzmiNXzxJkibB4QWRcf_kcjIofhwcUK_pWGUFC4xPXoimmne3h8eQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/TKgph5IHIHL-A3fgkrGzmiNXzxJkibB4QWRcf_kcjIofhwcUK_pWGUFC4xPXoimmne3h8eQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-blue-holding-pencil',\n },\n },\n },\n isCustomEmoji: true,\n index: 101,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/body-turquoise-yoga-pose',\n shortcuts: [':body-turquoise-yoga-pose:'],\n searchTerms: ['body-turquoise-yoga-pose'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/GW3otW7CmWpuayb7Ddo0ux5c-OvmPZ2K3vaytJi8bHFjcn-ulT8vcHMNcqVqMp1j2lit2Vw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/GW3otW7CmWpuayb7Ddo0ux5c-OvmPZ2K3vaytJi8bHFjcn-ulT8vcHMNcqVqMp1j2lit2Vw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'body-turquoise-yoga-pose',\n },\n },\n },\n isCustomEmoji: true,\n index: 102,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/location-yellow-teal-bars',\n shortcuts: [':location-yellow-teal-bars:'],\n searchTerms: ['location-yellow-teal-bars'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/YgeWJsRspSlAp3BIS5HMmwtpWtMi8DqLg9fH7DwUZaf5kG4yABfE1mObAvjCh0xKX_HoIR23=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/YgeWJsRspSlAp3BIS5HMmwtpWtMi8DqLg9fH7DwUZaf5kG4yABfE1mObAvjCh0xKX_HoIR23=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'location-yellow-teal-bars',\n },\n },\n },\n isCustomEmoji: true,\n index: 103,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-turquoise-writing-headphones',\n shortcuts: [':person-turquoise-writing-headphones:'],\n searchTerms: ['person-turquoise-writing-headphones'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/DC4KrwzNkVxLZa2_KbKyjZTUyB9oIvH5JuEWAshsMv9Ctz4lEUVK0yX5PaMsTK3gGS-r9w=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/DC4KrwzNkVxLZa2_KbKyjZTUyB9oIvH5JuEWAshsMv9Ctz4lEUVK0yX5PaMsTK3gGS-r9w=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-turquoise-writing-headphones',\n },\n },\n },\n isCustomEmoji: true,\n index: 104,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-turquoise-wizard-wand',\n shortcuts: [':person-turquoise-wizard-wand:'],\n searchTerms: ['person-turquoise-wizard-wand'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/OiZeNvmELg2PQKbT5UCS0xbmsGbqRBSbaRVSsKnRS9gvJPw7AzPp-3ysVffHFbSMqlWKeQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/OiZeNvmELg2PQKbT5UCS0xbmsGbqRBSbaRVSsKnRS9gvJPw7AzPp-3ysVffHFbSMqlWKeQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-turquoise-wizard-wand',\n },\n },\n },\n isCustomEmoji: true,\n index: 105,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-blue-eating-spaghetti',\n shortcuts: [':person-blue-eating-spaghetti:'],\n searchTerms: ['person-blue-eating-spaghetti'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/AXZ8POmCHoxXuBaRxX6-xlT5M-nJZmO1AeUNo0t4o7xxT2Da2oGy347sHpMM8shtUs7Xxh0=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/AXZ8POmCHoxXuBaRxX6-xlT5M-nJZmO1AeUNo0t4o7xxT2Da2oGy347sHpMM8shtUs7Xxh0=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-blue-eating-spaghetti',\n },\n },\n },\n isCustomEmoji: true,\n index: 106,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-turquoise-music-note',\n shortcuts: [':face-turquoise-music-note:'],\n searchTerms: ['face-turquoise-music-note'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/-K6oRITFKVU8V4FedrqXGkV_vTqUufVCQpBpyLK6w3chF4AS1kzT0JVfJxhtlfIAw5jrNco=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/-K6oRITFKVU8V4FedrqXGkV_vTqUufVCQpBpyLK6w3chF4AS1kzT0JVfJxhtlfIAw5jrNco=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-turquoise-music-note',\n },\n },\n },\n isCustomEmoji: true,\n index: 107,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-pink-swaying-hair',\n shortcuts: [':person-pink-swaying-hair:'],\n searchTerms: ['person-pink-swaying-hair'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/L8cwo8hEoVhB1k1TopQaeR7oPTn7Ypn5IOae5NACgQT0E9PNYkmuENzVqS7dk2bYRthNAkQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/L8cwo8hEoVhB1k1TopQaeR7oPTn7Ypn5IOae5NACgQT0E9PNYkmuENzVqS7dk2bYRthNAkQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-pink-swaying-hair',\n },\n },\n },\n isCustomEmoji: true,\n index: 108,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-blue-speaking-microphone',\n shortcuts: [':person-blue-speaking-microphone:'],\n searchTerms: ['person-blue-speaking-microphone'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/FMaw3drKKGyc6dk3DvtHbkJ1Ki2uD0FLqSIiFDyuChc1lWcA9leahX3mCFMBIWviN2o8eyc=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/FMaw3drKKGyc6dk3DvtHbkJ1Ki2uD0FLqSIiFDyuChc1lWcA9leahX3mCFMBIWviN2o8eyc=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-blue-speaking-microphone',\n },\n },\n },\n isCustomEmoji: true,\n index: 109,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/rocket-red-countdown-liftoff',\n shortcuts: [':rocket-red-countdown-liftoff:'],\n searchTerms: ['rocket-red-countdown-liftoff'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/lQZFYAeWe5-SJ_fz6dCAFYz1MjBnEek8DvioGxhlj395UFTSSHqYAmfhJN2i0rz3fDD5DQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/lQZFYAeWe5-SJ_fz6dCAFYz1MjBnEek8DvioGxhlj395UFTSSHqYAmfhJN2i0rz3fDD5DQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'rocket-red-countdown-liftoff',\n },\n },\n },\n isCustomEmoji: true,\n index: 110,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-purple-rain-drops',\n shortcuts: [':face-purple-rain-drops:'],\n searchTerms: ['face-purple-rain-drops'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/woHW5Jl2RD0qxijnl_4vx4ZhP0Zp65D4Ve1DM_HrwJW-Kh6bQZoRjesGnEwjde8F4LynrQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/woHW5Jl2RD0qxijnl_4vx4ZhP0Zp65D4Ve1DM_HrwJW-Kh6bQZoRjesGnEwjde8F4LynrQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-rain-drops',\n },\n },\n },\n isCustomEmoji: true,\n index: 111,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-pink-drinking-tea',\n shortcuts: [':face-pink-drinking-tea:'],\n searchTerms: ['face-pink-drinking-tea'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/WRLIgKpnClgYOZyAwnqP-Edrdxu6_N19qa8gsB9P_6snZJYIMu5YBJX8dlM81YG6H307KA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/WRLIgKpnClgYOZyAwnqP-Edrdxu6_N19qa8gsB9P_6snZJYIMu5YBJX8dlM81YG6H307KA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-pink-drinking-tea',\n },\n },\n },\n isCustomEmoji: true,\n index: 112,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-purple-stage-event',\n shortcuts: [':person-purple-stage-event:'],\n searchTerms: ['person-purple-stage-event'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/YeVVscOyRcDJAhKo2bMwMz_B6127_7lojqafTZECTR9NSEunYO5zEi7R7RqxBD7LYLxfNnXe=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/YeVVscOyRcDJAhKo2bMwMz_B6127_7lojqafTZECTR9NSEunYO5zEi7R7RqxBD7LYLxfNnXe=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-purple-stage-event',\n },\n },\n },\n isCustomEmoji: true,\n index: 113,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-purple-open-box',\n shortcuts: [':face-purple-open-box:'],\n searchTerms: ['face-purple-open-box'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/7lJM2sLrozPtNLagPTcN0xlcStWpAuZEmO2f4Ej5kYgSp3woGdq3tWFrTH30S3mD2PyjlQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/7lJM2sLrozPtNLagPTcN0xlcStWpAuZEmO2f4Ej5kYgSp3woGdq3tWFrTH30S3mD2PyjlQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-open-box',\n },\n },\n },\n isCustomEmoji: true,\n index: 114,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/COLRg9qOwdQCFce-qgodrbsLaA',\n shortcuts: [':awesome:'],\n searchTerms: ['awesome'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/xqqFxk7nC5nYnjy0oiSPpeWX4yu4I-ysb3QJMOuVml8dHWz82FvF8bhGVjlosZRIG_XxHA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/xqqFxk7nC5nYnjy0oiSPpeWX4yu4I-ysb3QJMOuVml8dHWz82FvF8bhGVjlosZRIG_XxHA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'awesome',\n },\n },\n },\n isCustomEmoji: true,\n index: 115,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CMKC7uKOwdQCFce-qgodqbsLaA',\n shortcuts: [':gar:'],\n searchTerms: ['gar'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/pxQTF9D-uxlSIgoopRcS8zAZnBBEPp2R9bwo5qIc3kc7PF2k18so72-ohINWPa6OvWudEcsC=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/pxQTF9D-uxlSIgoopRcS8zAZnBBEPp2R9bwo5qIc3kc7PF2k18so72-ohINWPa6OvWudEcsC=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'gar',\n },\n },\n },\n isCustomEmoji: true,\n index: 116,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CJiQ8uiOwdQCFcx9qgodysAOHg',\n shortcuts: [':jakepeter:'],\n searchTerms: ['jakepeter'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/iq0g14tKRcLwmfdpHULRMeUGfpWUlUyJWr0adf1K1-dStgPOguOe8eo5bKrxmCqIOlu-J18=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/iq0g14tKRcLwmfdpHULRMeUGfpWUlUyJWr0adf1K1-dStgPOguOe8eo5bKrxmCqIOlu-J18=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'jakepeter',\n },\n },\n },\n isCustomEmoji: true,\n index: 117,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CI3h3uDJitgCFdARTgodejsFWg',\n shortcuts: [':wormRedBlue:'],\n searchTerms: ['wormRedBlue'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/QrjYSGexvrRfCVpWrgctyB3shVRAgKmXtctM1vUnA78taji1zYNWwrHs1GKBpdpG5A6yK_k=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/QrjYSGexvrRfCVpWrgctyB3shVRAgKmXtctM1vUnA78taji1zYNWwrHs1GKBpdpG5A6yK_k=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'wormRedBlue',\n },\n },\n },\n isCustomEmoji: true,\n index: 118,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CI69oYTKitgCFdaPTgodsHsP5g',\n shortcuts: [':wormOrangeGreen:'],\n searchTerms: ['wormOrangeGreen'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/S-L8lYTuP13Ds9TJZ2UlxdjDiwNRFPnj0o4x6DAecyJLXDdQ941upYRhxalbjzpJn5USU_k=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/S-L8lYTuP13Ds9TJZ2UlxdjDiwNRFPnj0o4x6DAecyJLXDdQ941upYRhxalbjzpJn5USU_k=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'wormOrangeGreen',\n },\n },\n },\n isCustomEmoji: true,\n index: 119,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CKzQr47KitgCFdCITgodq6EJZg',\n shortcuts: [':wormYellowRed:'],\n searchTerms: ['wormYellowRed'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/L9TQqjca5x7TE8ZB-ifFyU51xWXArz47rJFU7Pg2KgWMut5th9qsU-pCu1zIF98szO5wNXE=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/L9TQqjca5x7TE8ZB-ifFyU51xWXArz47rJFU7Pg2KgWMut5th9qsU-pCu1zIF98szO5wNXE=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'wormYellowRed',\n },\n },\n },\n isCustomEmoji: true,\n index: 120,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CPGD8Iu8kN4CFREChAod9OkLmg',\n shortcuts: [':ytg:'],\n searchTerms: ['ytg'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/7PgbidnZLTC-38qeoqYensfXg7s7EC1Dudv9q9l8aIjqLgnfvpfhnEBH_7toCmVmqhIe4I45=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/7PgbidnZLTC-38qeoqYensfXg7s7EC1Dudv9q9l8aIjqLgnfvpfhnEBH_7toCmVmqhIe4I45=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'ytg',\n },\n },\n },\n isCustomEmoji: true,\n index: 121,\n },\n];\n","import * as Collection from './collection/index.js';\n\nexport namespace Data {\n export const avatars = Collection.avatars;\n export const badges = Collection.globalBadges;\n\n export const css_color_names = Collection.css_color_names;\n export const items = Collection.items;\n export const names = Collection.names;\n export const tiers = Collection.tiers;\n export const tts = Collection.tts;\n\n export const messages = Collection.messages;\n export const normal_messages = Collection.normal_messages;\n export const twitch_messages = Collection.twitch_messages;\n export const youtube_messages = Collection.youtube_messages;\n\n export const emotes = Collection.emotes;\n export const ffz_emotes = Collection.FfzEmotes;\n export const bttv_emotes = Collection.BttvEmotes;\n export const seventv_emotes = Collection.SeventvEmotes;\n export const twitch_emotes = Collection.TwitchEmotes;\n export const youtube_emotes = Collection.YoutubeEmotes;\n}\n","import { Data } from '../../data/index.js';\n\nexport class RandomHelper {\n /**\n * Generate random color\n * @param type - Color format\n * @returns - Random color in specified format\n * @example\n * ```javascript\n * const hexColor = random.color('hex');\n * console.log(hexColor); // e.g. #3e92cc\n *\n * const rgbColor = random.color('rgb');\n * console.log(rgbColor); // e.g. rgb(62, 146, 204)\n * ```\n */\n color(type: 'hex' | 'hexa' | 'rgb' | 'rgba' | 'hsl' | 'hsla' | 'css-color-name' = 'hex') {\n switch (type) {\n default:\n case 'hex': {\n return `#${Math.floor(Math.random() * 0xffffff)\n .toString(16)\n .padStart(6, '0')}`;\n }\n case 'hexa': {\n const hex = `#${Math.floor(Math.random() * 0xffffff)\n .toString(16)\n .padStart(6, '0')}`;\n\n const alpha = Math.floor(Math.random() * 256)\n .toString(16)\n .padStart(2, '0');\n\n return hex + alpha;\n }\n case 'rgb': {\n const r = Math.floor(Math.random() * 256);\n const g = Math.floor(Math.random() * 256);\n const b = Math.floor(Math.random() * 256);\n\n return `rgb(${r}, ${g}, ${b})`;\n }\n case 'rgba': {\n const r = Math.floor(Math.random() * 256);\n const g = Math.floor(Math.random() * 256);\n const b = Math.floor(Math.random() * 256);\n const a = Math.random().toFixed(2);\n\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n }\n case 'hsl': {\n const h = Math.floor(Math.random() * 361);\n const s = Math.floor(Math.random() * 101);\n const l = Math.floor(Math.random() * 101);\n\n return `hsl(${h}, ${s}%, ${l}%)`;\n }\n case 'hsla': {\n const h = Math.floor(Math.random() * 361);\n const s = Math.floor(Math.random() * 101);\n const l = Math.floor(Math.random() * 101);\n const a = Math.random().toFixed(2);\n\n return `hsla(${h}, ${s}%, ${l}%, ${a})`;\n }\n case 'css-color-name': {\n var names = Data.css_color_names;\n\n return this.array(names)[0];\n }\n }\n }\n\n /**\n * Generate random number\n * @param min - Minimum value\n * @param max - Maximum value\n * @param float - Number of decimal places (0 for integer)\n * @returns - Random number\n * @example\n * ```javascript\n * const intNumber = random.number(1, 10);\n * console.log(intNumber); // e.g. 7\n *\n * const floatNumber = random.number(1, 10, 2);\n * console.log(floatNumber); // e.g. 3.14\n * ```\n */\n number(min: number, max: number, float: number = 0): number {\n if (min > max) [min, max] = [max, min];\n\n const rand = Math.random() * (max - min) + min;\n return float ? Number(rand.toFixed(float)) : Math.round(rand);\n }\n\n /**\n * Generate random boolean\n * @param threshold - Threshold between 0 and 1\n * @returns - Random boolean\n * @example\n * ```javascript\n * const boolValue = random.boolean(0.7);\n * console.log(boolValue); // e.g. true (70% chance)\n * ```\n */\n boolean(threshold: number = 0.5): boolean {\n return Math.random() > threshold;\n }\n\n /**\n * Generate random string\n * @param length - Length of the string\n * @param chars - Characters to use\n * @returns - Random string\n * @example\n * ```javascript\n * const randString = random.string(10); // e.g. \"aZ3bT9qP1x\"\n * const randHex = random.string(8, 'hex'); // e.g. \"4f3c2a1b\"\n * const randNumStr = random.string(6, 'numbers'); // e.g. \"839201\"\n * const randLetterStr = random.string(6, 'letters'); // e.g. \"aZbTqP\"\n * const randHexUpper = random.string(6, 'hex-upper'); // e.g. \"4F3C2A1B\"\n * const randHexLower = random.string(6, 'hex-lower'); // e.g. \"4f3c2a1b\"\n * ```\n */\n string(\n length: number,\n chars:\n | 'numeric'\n | 'numbers'\n | 'letters'\n | 'hex'\n | 'hex-upper'\n | 'hex-lower'\n | string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',\n ): string {\n if (chars === 'numbers' || chars === 'numeric') chars = '0123456789';\n else if (chars === 'letters' || chars === 'letter')\n chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n else if (chars === 'hex' || chars === 'hexadecimal') chars = '0123456789abcdef';\n else if (chars === 'hex-upper' || chars === 'hexadecimal-upper') chars = '0123456789ABCDEF';\n else if (chars === 'hex-lower' || chars === 'hexadecimal-lower') chars = '0123456789abcdef';\n\n let result = '';\n\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n\n return result;\n }\n\n /**\n * Pick random element from array\n * @param arr - Array to pick from\n * @returns - Random element and its index\n * @example\n * ```javascript\n * const [element, index] = random.array(['apple', 'banana', 'cherry']);\n * console.log(element, index); // e.g. \"banana\", 1\n * ```\n */\n array<T>(arr: T[]): [value: T, index: number] {\n const index = this.number(0, arr.length - 1);\n\n return [arr[index], index];\n }\n\n /**\n * Generate random date\n * @param start - Start date\n * @param end - End date\n * @returns - Random date between start and end\n * @example\n * ```javascript\n * const randDate = random.date(new Date(2020, 0, 1), new Date());\n * console.log(randDate); // e.g. 2022-05-15T10:30:00.000Z\n * ```\n */\n date(start: Date = new Date(2000, 0, 1), end: Date = new Date()): Date {\n const date = new Date(this.number(start.getTime(), end.getTime()));\n\n return date;\n }\n\n /**\n * Generate ISO date string offset by days\n * @param daysAgo - Number of days to go back\n * @returns - ISO date string\n * @example\n * ```javascript\n * const isoDate = random.daysOffset(7);\n * console.log(isoDate); // e.g. \"2024-06-10T14:23:45.678Z\"\n *\n * const isoDate30 = random.daysOffset(30);\n * console.log(isoDate30); // e.g. \"2024-05-18T09:15:30.123Z\"\n * ```\n */\n daysOffset(daysAgo: number): string {\n const now = Date.now();\n const past = now - this.number(0, daysAgo * 24 * 60 * 60 * 1000);\n\n return new Date(past).toISOString();\n }\n\n /**\n * Generate UUID v4\n * @returns - UUID string\n * @example\n * ```javascript\n * const uuid = random.uuid();\n * console.log(uuid); // e.g. \"3b12f1df-5232-4e3a-9a0c-3f9f1b1b1b1b\"\n * ```\n */\n uuid(): string {\n return crypto.randomUUID();\n }\n}\n","import { Data } from '../../data/index.js';\nimport { Emote, Provider, Twitch } from '../../types.js';\nimport { NumberHelper } from './number.js';\nimport { RandomHelper } from './random.js';\n\nexport type BadgeOptions =\n | Twitch.tags[]\n | Twitch.tags\n | `${Twitch.tags}/${string}`\n | `${Twitch.tags}/${string}`[];\n\nexport type TwitchResult = {\n keys: Twitch.tags[];\n badges: Twitch.badge[];\n versions: { [K in Twitch.tags]?: string | number };\n amount: { [K in Twitch.tags]?: string | number };\n};\n\nexport type YouTubeResult = {\n isVerified: boolean;\n isChatOwner: boolean;\n isChatSponsor: boolean;\n isChatModerator: boolean;\n};\n\nexport class MessageHelper {\n /**\n * Finds emotes in a given text.\n * @param text - The text to search for emotes.\n * @param emotes - An array of emotes to search for. Defaults to Local data emotes.\n * @returns An array of emotes found in the text with their positions.\n */\n findEmotesInText(text: string, emotes: Emote[] = Data.emotes): Emote[] {\n const result: Emote[] = [];\n\n emotes\n .filter((emote) => emote.type !== 'emoji')\n .forEach((emote) => {\n const name = emote.name;\n\n let searchIndex = 0;\n let start = 0;\n\n while (searchIndex < text.length) {\n const index = text.indexOf(name, start);\n\n if (index === -1) break;\n\n const before = index > 0 ? text[index - 1] : ' ';\n const after = index + name.length < text.length ? text[index + name.length] : ' ';\n\n if (/\\s/.test(before) && /\\s/.test(after)) {\n result.push({ ...emote, start: index, end: index + name.length });\n }\n\n start = index + 1;\n }\n });\n\n return result;\n }\n\n /**\n * Replaces emotes in the text with corresponding HTML image tags.\n * @param text - The text containing emotes.\n * @param emotes - An array of emotes with their positions in the text.\n * @returns The text with emotes replaced by HTML image tags.\n */\n replaceEmotesWithHTML(text: string, emotes: Emote[]): string {\n if (!emotes.length) return text;\n\n let result = '';\n let index = 0;\n\n emotes\n .filter((emote) => emote.type !== 'emoji')\n .forEach((emote) => {\n if (emote.start < index) return;\n\n result += text.substring(index, emote.start);\n\n const emotesArray = Array.from({ ...emote.urls, length: 5 })\n .slice(1)\n .reverse()\n .filter(Boolean);\n\n const imgUrl = emotesArray[0] || emote.urls['1'];\n\n result += `<img src=\"${imgUrl}\" alt=\"${emote.name}\" class=\"emote\" style=\"width: auto; height: 1em; vertical-align: middle;\" />`;\n\n index = emote.end;\n });\n\n result += text.substring(index);\n\n return result;\n }\n\n /**\n * Checks if the text contains only emotes and whitespace.\n * @param text - The text to check.\n * @param emotes - An array of emotes with their positions in the text.\n * @returns True if the text contains only emotes and whitespace, false otherwise.\n */\n hasOnlyEmotes(text: string, emotes: Emote[]): boolean {\n const textWithoutEmotes = emotes.reduce((acc, emote) => {\n return acc\n .replace(new RegExp(`\\\\b${emote.name}\\\\b`, 'g'), '')\n .replace(/<img[^>]*class=\"emote\"[^>]*>/gi, '');\n }, text);\n\n return textWithoutEmotes.trim().length === 0;\n }\n\n /**\n * Replaces YouTube emotes in the text with corresponding HTML image tags.\n * @param text - The text containing YouTube emotes.\n * @param emotes - An array of YouTube emotes. Defaults to Local data YouTube emotes.\n * @returns The text with YouTube emotes replaced by HTML image tags.\n */\n replaceYoutubeEmotesWithHTML(text: string, emotes = Data.youtube_emotes): string {\n const emoteCodesInside = Array.from(text.matchAll(/:(.*?):/gim), (x) => x[0]);\n\n emoteCodesInside.forEach((code) => {\n const emote = emotes.find(\n (e) => e.shortcuts.includes(code) || e.searchTerms.includes(code.slice(1, -1)),\n );\n\n if (emote) {\n const url = emote.image.thumbnails.at(-1)?.url;\n const alt = emote.image.accessibility.accessibilityData.label;\n\n if (url) {\n text = text.replace(\n code,\n `<img src=\"${url}\" alt=\"${alt}\" class=\"emote\" style=\"width: auto; height: 1em; vertical-align: middle;\" />`,\n );\n }\n }\n });\n\n return text;\n }\n\n /**\n * Maps global badge versions to a structured format.\n * @param globalBadges - An array of Twitch global badges. Defaults to Local data badges.\n * @returns An array of objects containing badge IDs and their corresponding versions.\n * @example\n * ```javascript\n * const badgeVersions = mapGlobalBadgeVersions();\n * console.log(badgeVersions);\n * // Output:\n * [\n * {\n * id: 'subscriber',\n * versions: [\n * { type: 'subscriber', version: '1', url: 'https://...', description: 'Subscriber' },\n * { type: 'subscriber', version: '2', url: 'https://...', description: '2-Month Subscriber' },\n * // ... more versions\n * ],\n * },\n * {\n * id: 'bits',\n * versions: [\n * { type: 'bits', version: '100', url: 'https://...', description: 'cheer 100' },\n * { type: 'bits', version: '1000', url: 'https://...', description: 'cheer 1000' },\n * // ... more versions\n * ],\n * },\n * // ... more badges\n * ]\n * ```\n */\n mapGlobalBadgeVersions(globalBadges: Twitch.GlobalBadge[] = Data.badges): Array<{\n id: Twitch.tags;\n versions: Twitch.badge[];\n }> {\n return globalBadges.map((badge) => ({\n id: badge.set_id,\n versions: badge.versions.map((version) => ({\n type: badge.set_id,\n version: version.id,\n url: version.image_url_4x,\n description: version.title,\n })),\n }));\n }\n\n /**\n * Maps a badge type and variation to the corresponding badge version amount.\n * @param type - The badge type (e.g., 'subscriber', 'bits', etc.).\n * @param variation - The badge variation, which can be a number or a string (e.g., 'horde', 'alliance', etc.).\n * @returns The badge version amount as a string. Returns '0' if no matching badge version is found.\n * @example\n * ```javascript\n * // For subscriber badge with 3 months\n * mapGlobalBadgeVersionAmount('subscriber', 3); // Returns '3'\n * // For bits badge with 5000 bits\n * mapGlobalBadgeVersionAmount('bits', 5000); // Returns the corresponding badge version based on the mapping\n * // For warcraft badge with 'horde' variation\n * mapGlobalBadgeVersionAmount('warcraft', 'horde'); // Returns 'horde'\n * ```\n */\n mapGlobalBadgeVersionAmount(type: Twitch.tags, variation: string | number): string {\n const IdToId = (key: Twitch.tags) =>\n Data.badges\n .find((b) => b.set_id === key)!\n .versions.map((v) => [v.id, parseInt(v.id)] as [string, number]);\n\n let result = '0';\n\n switch (type) {\n case 'subscriber': {\n if (isNaN(parseInt(variation as string))) return result;\n\n const map = Object.entries({\n '0': 0,\n '1': 1,\n '2': 2,\n '3': 3,\n '4': 6,\n '5': 9,\n '6': 12,\n });\n\n for (const [key, minAmount] of map) {\n if (parseInt(variation as string) >= minAmount) result = key;\n }\n\n break;\n }\n case 'bits':\n case 'sub-gifter':\n case 'bits-leader':\n case 'clips-leader':\n case 'sub-gift-leader': {\n if (isNaN(parseInt(variation as string))) return result;\n\n const map = IdToId(type);\n\n for (const [key, minAmount] of map) {\n if (parseInt(variation as string) >= minAmount) result = key;\n }\n\n break;\n }\n case 'warcraft': {\n const map = {\n horde: 'horde',\n alliance: 'alliance',\n };\n\n result =\n Object.entries(map).find(\n ([_, label]) => label.toLowerCase() === String(variation).toLowerCase(),\n )?.[0] || '0';\n\n break;\n }\n case 'twitchbot': {\n const map = {\n 1: 'auto mod',\n 2: 'automated moderation system',\n };\n\n result =\n Object.entries(map).find(\n ([_, label]) => label.toLowerCase() === String(variation).toLowerCase(),\n )?.[0] || '0';\n break;\n }\n case 'moments': {\n if (isNaN(parseInt(variation as string))) {\n const map = Object.fromEntries(\n Array.from({ length: 20 }, (_, i) => i + 1).map((num) => [num, `tier ${num}`]),\n );\n\n result =\n Object.entries(map).find(\n ([_, label]) => label.toLowerCase() === String(variation).toLowerCase(),\n )?.[0] || '0';\n } else {\n const map = IdToId('moments');\n\n for (const [key, minAmount] of map) {\n if (parseInt(variation as string) >= minAmount) result = key;\n }\n }\n\n break;\n }\n case 'power-rangers': {\n if (isNaN(parseInt(variation as string))) {\n const map = {\n 0: ['black ranger', 'black', 'blackranger'],\n 1: ['blue ranger', 'blue', 'blueranger'],\n 2: ['green ranger', 'green', 'greenranger'],\n 3: ['pink ranger', 'pink', 'pinkranger'],\n 4: ['red ranger', 'red', 'redranger'],\n 5: ['white ranger', 'white', 'whiteranger'],\n 6: ['yellow ranger', 'yellow', 'yellowranger'],\n };\n\n result =\n Object.entries(map).find(([_, labels]) =>\n labels.some((label) => label.toLowerCase() === String(variation).toLowerCase()),\n )?.[0] || '0';\n } else {\n const map = IdToId('power-rangers');\n\n for (const [key, minAmount] of map) {\n if (parseInt(variation as string) >= minAmount) result = key;\n }\n }\n\n break;\n }\n case 'predictions': {\n const map = Object.fromEntries(\n IdToId('predictions').map(([key, _]) => [\n key,\n [key, key.replace('-', ' '), key.replace('-', '')],\n ]),\n );\n\n result =\n Object.entries(map).find(([_, labels]) =>\n labels.some((label) => label.toLowerCase() === String(variation).toLowerCase()),\n )?.[0] || '0';\n\n break;\n }\n case 'social-sharing': {\n if (isNaN(parseInt(variation as string))) {\n const map = Object.fromEntries(\n IdToId('social-sharing').map(([key, _]) => [\n key,\n [key + ' views', key.replace('-', '') + ' views'],\n ]),\n );\n\n result =\n Object.entries(map).find(([_, labels]) =>\n labels.some((label) => label.toLowerCase() === String(variation).toLowerCase()),\n )?.[0] || '0';\n } else {\n const map = {\n 1: 100,\n 2: 10000,\n 3: 100000,\n };\n\n for (const [key, minAmount] of Object.entries(map)) {\n if (parseInt(variation as string) >= minAmount) result = key;\n }\n }\n\n break;\n }\n }\n\n return result;\n }\n\n /**\n * Generates badge data based on the provided badges and platform.\n * @param badges - The badges to generate. Can be an array or a comma-separated string.\n * @param provider - The platform provider ('twitch' or 'youtube'). Defaults to 'twitch'.\n * @returns A promise that resolves to the generated badge data.\n * @example\n * ```javascript\n * // Generate Twitch badges\n * const twitchBadges = await generateBadges(['broadcaster', 'moderator'], 'twitch');\n * // Generate YouTube badges\n * const youtubeBadges = await generateBadges('sponsor, moderator', 'youtube');\n * ```\n */\n async generateBadges<T extends Provider>(\n badges: BadgeOptions = [],\n provider: T,\n ): Promise<T extends 'twitch' ? TwitchResult : YouTubeResult> {\n const globalBadges = this.mapGlobalBadgeVersions();\n\n if (!Array.isArray(badges) && typeof badges === 'string') {\n badges = badges.split(',').map((e) => e.trim()) as Twitch.tags[];\n }\n\n var clearedBadges = badges.map((badge) => badge.split('/')[0] as Twitch.tags);\n\n if (!clearedBadges || !clearedBadges.length) {\n const number = new NumberHelper();\n const random = new RandomHelper();\n var max = number.random(1, 3);\n\n for await (const _ of Array.from({ length: max }, () => '')) {\n // var current = random.array(Object.keys(Data.badges))[0] as Twitch.roles;\n const item = random.array(globalBadges)[0];\n\n if (!clearedBadges.includes(item.id) && Array.isArray(clearedBadges)) {\n clearedBadges.push(item.id);\n } else {\n clearedBadges = [item.id];\n }\n }\n }\n\n var result;\n\n switch (provider) {\n case 'twitch': {\n const keys = Array.from(clearedBadges).filter((e) =>\n globalBadges.some((badge) => badge.id === e),\n ) as Twitch.tags[];\n\n const versions = badges.reduce(\n (acc, data) => {\n var [badge, variation = '1'] = data.split('/') as [Twitch.tags, string];\n\n let value: string | number = variation;\n\n if (!isNaN(parseInt(value))) value = parseInt(value);\n else if (!value) value = 0;\n\n acc[badge] = this.mapGlobalBadgeVersionAmount(badge, value);\n\n return acc;\n },\n {} as { [K in Twitch.tags]?: string | number },\n );\n\n result = {\n keys,\n versions,\n amount: badges.reduce(\n (acc, data) => {\n var [badge, variation = '1'] = data.split('/') as [Twitch.tags, string];\n\n let value: string | number = variation;\n\n if (!isNaN(parseInt(value))) value = parseInt(value);\n else if (!value) value = 0;\n\n acc[badge] = value;\n\n return acc;\n },\n {} as { [K in Twitch.tags]?: string | number },\n ),\n badges: Array.from(clearedBadges)\n .slice(0, 3)\n .map((badge) => {\n const data = globalBadges.find((b) => b.id === badge);\n\n if (data?.versions && data.versions.length) {\n const quantity = versions[badge];\n\n const version = data.versions.find((v) => v.version === String(quantity));\n\n if (version) return version;\n\n return data.versions[0];\n }\n\n return;\n })\n .filter(Boolean) as Twitch.badge[],\n };\n\n break;\n }\n\n case 'youtube': {\n var details = {\n 'verified': { isVerified: true },\n 'partner': { isVerified: true },\n 'broadcaster': { isChatOwner: true },\n 'host': { isChatOwner: true },\n 'sponsor': { isChatSponsor: true },\n 'subscriber': { isChatSponsor: true },\n 'moderator': { isChatModerator: true },\n };\n\n result = Object.values(clearedBadges).reduce(\n (acc, key) => {\n if (key in details) {\n Object.assign(acc, details[key as keyof typeof details]);\n }\n\n return acc;\n },\n {\n isVerified: false,\n isChatOwner: false,\n isChatSponsor: false,\n isChatModerator: false,\n } as {\n isVerified: boolean;\n isChatOwner: boolean;\n isChatSponsor: boolean;\n isChatModerator: boolean;\n },\n );\n\n break;\n }\n }\n\n return result as T extends 'twitch' ? TwitchResult : YouTubeResult;\n }\n}\n","import { ClientEvents, Provider, StreamElements } from '../../types.js';\n\nexport class EventHelper {\n /**\n * Parses the provider information from the event detail object.\n * @param detail - The event detail object received from the StreamElements event.\n * @returns An object containing the provider and the original event data.\n */\n parseProvider(detail: StreamElements.Event.onEventReceived, _provider?: Provider): ClientEvents {\n var provider: Provider =\n // @ts-ignore\n _provider ||\n // @ts-ignore\n detail.event?.provider ||\n // @ts-ignore\n detail.event?.service ||\n // @ts-ignore\n detail.event?.data?.provider ||\n // @ts-ignore\n window?.client?.details?.provider ||\n 'twitch';\n\n const actAsStreamElements = [\n 'kvstore:update',\n 'bot:counter',\n 'alertService:toggleSound',\n 'tip-latest',\n 'event:test',\n 'event:skip',\n ] as StreamElements.Event.onEventReceived['listener'][];\n\n if (actAsStreamElements.some((l) => l === detail.listener)) provider = 'streamelements';\n\n const received = { provider: provider, data: detail } as ClientEvents;\n\n return received;\n }\n}\n","import { css_color_names } from '../data/collection/css.js';\n\n/**\n * Parse a color string to RGBA components\n * @param str - color string\n * @param format - format of the input color string\n * @returns - RGBA components or null if parsing fails\n */\nexport function parseToRGBA(\n str: string,\n format: string | false,\n): { r: number; g: number; b: number; a: number } | null {\n if (!format) return null;\n\n switch (format) {\n case 'hex': {\n const hex = str.replace('#', '');\n let r = 0,\n g = 0,\n b = 0,\n a = 1;\n\n if (hex.length === 3) {\n r = parseInt(hex[0] + hex[0], 16);\n g = parseInt(hex[1] + hex[1], 16);\n b = parseInt(hex[2] + hex[2], 16);\n } else if (hex.length === 6) {\n r = parseInt(hex.slice(0, 2), 16);\n g = parseInt(hex.slice(2, 4), 16);\n b = parseInt(hex.slice(4, 6), 16);\n } else if (hex.length === 4) {\n r = parseInt(hex[0] + hex[0], 16);\n g = parseInt(hex[1] + hex[1], 16);\n b = parseInt(hex[2] + hex[2], 16);\n a = parseInt(hex[3] + hex[3], 16) / 255;\n } else if (hex.length === 8) {\n r = parseInt(hex.slice(0, 2), 16);\n g = parseInt(hex.slice(2, 4), 16);\n b = parseInt(hex.slice(4, 6), 16);\n a = parseInt(hex.slice(6, 8), 16) / 255;\n }\n\n return { r, g, b, a };\n }\n\n case 'rgb':\n case 'rgba': {\n const match = str.match(/rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\s*\\)/);\n if (!match) return null;\n\n return {\n r: parseInt(match[1]),\n g: parseInt(match[2]),\n b: parseInt(match[3]),\n a: match[4] ? parseFloat(match[4]) : 1,\n };\n }\n\n case 'hsl':\n case 'hsla': {\n const match = str.match(/hsla?\\(\\s*(\\d+)\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%(?:\\s*,\\s*([\\d.]+))?\\s*\\)/);\n if (!match) return null;\n\n const h = parseInt(match[1]);\n const s = parseInt(match[2]);\n const l = parseInt(match[3]);\n const a = match[4] ? parseFloat(match[4]) : 1;\n\n const rgb = hslToRgb(h, s, l);\n return { ...rgb, a };\n }\n\n case 'css-color-name': {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = 1;\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n\n ctx.fillStyle = str;\n ctx.fillRect(0, 0, 1, 1);\n const [r, g, b] = ctx.getImageData(0, 0, 1, 1).data;\n\n return { r, g, b, a: 1 };\n }\n\n default:\n return null;\n }\n}\n\n/**\n * Convert RGBA to Hex\n * @param rgba - RGBA components\n * @param includeAlpha - Whether to include alpha in the hex string\n * @returns Hex color string\n */\nexport function rgbaToHex(\n rgba: { r: number; g: number; b: number; a: number },\n includeAlpha: boolean = true,\n): string {\n const toHex = (n: number) => Math.round(n).toString(16).padStart(2, '0');\n\n let hex = `#${toHex(rgba.r)}${toHex(rgba.g)}${toHex(rgba.b)}`;\n\n if (includeAlpha && rgba.a < 1) {\n hex += toHex(rgba.a * 255);\n }\n\n return hex;\n}\n\n/**\n * Convert RGB to HSL\n * @param r - Red component (0-255)\n * @param g - Green component (0-255)\n * @param b - Blue component (0-255)\n * @returns HSL components\n */\nexport function rgbToHsl(r: number, g: number, b: number): { h: number; s: number; l: number } {\n r /= 255;\n g /= 255;\n b /= 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (delta !== 0) {\n s = l > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n\n switch (max) {\n case r:\n h = ((g - b) / delta + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / delta + 2) / 6;\n break;\n case b:\n h = ((r - g) / delta + 4) / 6;\n break;\n }\n }\n\n return {\n h: Math.round(h * 360),\n s: Math.round(s * 100),\n l: Math.round(l * 100),\n };\n}\n\n/**\n * Convert HSL to RGB\n * @param h - Hue (0-360)\n * @param s - Saturation (0-100)\n * @param l - Lightness (0-100)\n * @returns RGB components\n */\nexport function hslToRgb(h: number, s: number, l: number): { r: number; g: number; b: number } {\n h /= 360;\n s /= 100;\n l /= 100;\n\n let r: number, g: number, b: number;\n\n if (s === 0) {\n r = g = b = l;\n } else {\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return {\n r: Math.round(r * 255),\n g: Math.round(g * 255),\n b: Math.round(b * 255),\n };\n}\n\n/**\n * Find the closest CSS color name to the given RGB values\n * @param r - Red component (0-255)\n * @param g - Green component (0-255)\n * @param b - Blue component (0-255)\n * @returns Closest CSS color name\n */\nexport async function findClosestColorName(r: number, g: number, b: number): Promise<string> {\n const cssColors = css_color_names;\n\n let closestColor = cssColors[0];\n let minDistance = Infinity;\n\n for await (const colorName of cssColors) {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = 1;\n\n const ctx = canvas.getContext('2d');\n\n if (!ctx) continue;\n\n ctx.fillStyle = colorName;\n ctx.fillRect(0, 0, 1, 1);\n\n const [cr, cg, cb] = ctx.getImageData(0, 0, 1, 1).data;\n\n const distance = Math.sqrt(Math.pow(r - cr, 2) + Math.pow(g - cg, 2) + Math.pow(b - cb, 2));\n\n if (distance < minDistance) {\n minDistance = distance;\n closestColor = colorName;\n }\n\n if (distance === 0) break;\n }\n\n return closestColor;\n}\n","import { Data } from '../../data/index.js';\nimport { findClosestColorName, parseToRGBA, rgbaToHex, rgbToHsl } from '../../utils/color.js';\n\nexport class ColorHelper {\n /**\n * Generate opacity hex value\n * @param opacity - Opacity value from 0 to 100\n * @param color - Hex color code\n * @returns - Hex color code with opacity\n */\n opacity(opacity: number = 100, color: string = '') {\n color = color.length > 7 ? color?.substring(0, 6) : color;\n opacity = opacity > 1 ? opacity / 100 : opacity;\n\n let result = Math.round(Math.min(Math.max(opacity, 0), 1) * 255)\n .toString(16)\n .toLowerCase()\n .padStart(2, '0');\n\n return color + result;\n }\n\n /**\n * Extract color and opacity from hex code\n * @param hex - Hex color code\n * @returns - Object with color and opacity\n */\n extract(hex: string) {\n if (!hex.startsWith('#') || hex.length <= 7) {\n return {\n color: hex,\n opacity: 100,\n };\n }\n\n var color = hex.slice(-2);\n var decimal = parseInt(color, 16) / 255;\n var percentage = Math.round(decimal * 100);\n var color = hex.length > 7 ? hex.slice(0, 7) : hex;\n\n return {\n color: color,\n opacity: percentage,\n };\n }\n\n /**\n * Validate color string format\n * @param str - Color string to validate\n * @returns Detected color format or false if invalid\n * @example\n * ```javascript\n * const format1 = color.validate(\"#FF5733\"); // \"hex\"\n * const format2 = color.validate(\"rgb(255, 87, 51)\"); // \"rgb\"\n * const format3 = color.validate(\"hsl(14, 100%, 60%)\"); // \"hsl\"\n * const format4 = color.validate(\"orangered\"); // \"css-color-name\"\n * const format5 = color.validate(\"invalid-color\"); // false\n * ```\n */\n validate(str: string) {\n if (typeof str !== 'string' || !String(str).trim().length) return false;\n\n const s = str.trim();\n\n // HEX (#FFF, #FFFFFF, #FFFFFFFF)\n if (/^#([A-Fa-f0-9]{3}){1,2}$/.test(s) || /^#([A-Fa-f0-9]{4}|[A-Fa-f0-9]{8})$/.test(s)) {\n return 'hex';\n }\n\n // rgb(255, 255, 255)\n if (/^rgb\\(\\s*(?:\\d{1,3}\\s*,\\s*){2}\\d{1,3}\\s*\\)$/.test(s)) {\n return 'rgb';\n }\n\n // rgba(255, 255, 255, 0.5)\n if (/^rgba\\(\\s*(?:\\d{1,3}\\s*,\\s*){3}(?:0|1|0?\\.\\d+)\\s*\\)$/.test(s)) {\n return 'rgba';\n }\n\n // hsl(360, 100%, 100%)\n if (/^hsl\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%\\s*,\\s*\\d{1,3}%\\s*\\)$/.test(s)) {\n return 'hsl';\n }\n\n // hsla(360, 100%, 100%, 0.5)\n if (/^hsla\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%\\s*,\\s*\\d{1,3}%\\s*,\\s*(?:0|1|0?\\.\\d+)\\s*\\)$/.test(s)) {\n return 'hsla';\n }\n\n if (Data.css_color_names.includes(s.toLowerCase())) {\n return 'css-color-name';\n }\n\n return false;\n }\n\n /**\n * Convert color to different format\n * @param str - Color string to convert (e.g. \"#FF5733\", \"rgb(255, 87, 51)\")\n * @param format - Target format\n * @returns - Converted color string\n * @example\n * ```javascript\n * const hexColor = color.convert(\"rgb(255, 87, 51)\", \"hex\"); // \"#FF5733\"\n * const rgbColor = color.convert(\"#FF5733\", \"rgb\"); // \"rgb(255, 87, 51)\"\n * const hslColor = color.convert(\"#FF5733\", \"hsl\"); // \"hsl(14, 100%, 60%)\"\n * const colorName = color.convert(\"#FF5733\", \"css-color-name\"); // \"orangered\"\n * ```\n */\n async convert(\n str: string,\n format: 'hex' | 'rgb' | 'rgba' | 'hsl' | 'hsla' | 'css-color-name',\n ): Promise<string | null> {\n const valid = this.validate(str);\n\n if (!valid) throw new Error(`Invalid color format: ${str}`);\n\n if (valid === format) throw new Error(`Color is already in the desired format: ${format}`);\n\n const rgba = parseToRGBA(str.trim(), valid);\n\n if (!rgba) throw new Error(`Failed to parse color: ${str}`);\n\n switch (format) {\n case 'hex': {\n return rgbaToHex(rgba, false);\n }\n case 'rgb': {\n return `rgb(${rgba.r}, ${rgba.g}, ${rgba.b})`;\n }\n case 'rgba': {\n return `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`;\n }\n case 'hsl': {\n const hsl = rgbToHsl(rgba.r, rgba.g, rgba.b);\n return `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`;\n }\n case 'hsla': {\n const hsl = rgbToHsl(rgba.r, rgba.g, rgba.b);\n return `hsla(${hsl.h}, ${hsl.s}%, ${hsl.l}%, ${rgba.a})`;\n }\n case 'css-color-name': {\n return await findClosestColorName(rgba.r, rgba.g, rgba.b);\n }\n default: {\n return null;\n }\n }\n }\n}\n","import { ColorHelper } from './color.js';\nimport { ElementHelper } from './element.js';\nimport { ObjectHelper } from './object.js';\n\nexport type Modifier = (\n value: string,\n param: string | null | undefined,\n values: { amount?: number; count?: number },\n) => string;\n\nexport class StringHelper {\n /**\n * Replaces occurrences in a string based on a pattern with the result of an asynchronous callback function.\n * @param string - The input string to perform replacements on.\n * @param pattern - The pattern to match in the string (can be a string or a regular expression).\n * @param callback - An asynchronous callback function that takes the matched substring and any captured groups as arguments and returns the replacement string.\n * @returns A promise that resolves to the modified string with replacements applied.\n * @example\n * ```javascript\n * const result = await string.replace(\"Hello World\", /World/, async (match) => {\n * return await fetchSomeData(match); // Assume this function fetches data asynchronously\n * });\n * console.log(result); // Output will depend on the fetched data\n * ```\n */\n async replace(\n string: string,\n pattern: string,\n callback: (match: string, ...groups: string[]) => Promise<string> | string,\n ): Promise<string> {\n const promises: Array<Promise<string>> = [];\n\n string.replace(pattern, (match: string, ...groups: string[]) => {\n const promise = typeof callback === 'function' ? callback(match, ...groups) : match;\n\n promises.push(Promise.resolve(promise));\n\n return match;\n });\n\n const replacements = await Promise.all(promises);\n\n return string.replace(pattern, () => replacements.shift() ?? '');\n }\n\n /**\n * Capitalizes the first letter of a given string.\n * @param string - The input string to be capitalized.\n * @returns The capitalized string.\n * @example\n * ```javascript\n * const result = string.capitalize(\"hello world\");\n * console.log(result); // Output: \"Hello world\"\n * ```\n */\n capitalize(string: string): Capitalize<string> {\n return (string.charAt(0).toUpperCase() + string.slice(1)) as Capitalize<string>;\n }\n\n PRESETS: Record<string, string> = {};\n\n /**\n * Composes a template string by replacing placeholders with corresponding values and applying optional modifiers.\n * @param template - The template string containing placeholders in the format {key} and optional modifiers in the format [MODIFIER:param=value].\n * @param values - An object containing key-value pairs to replace the placeholders in the template.\n * @param options - Optional settings for the composition process.\n * @returns The composed string with placeholders replaced and modifiers applied.\n * @example\n * ```javascript\n * const { string } = Tixyel.Helper;\n *\n * // Basic usage with placeholders and simple modifiers\n * const template1 = \"Hello, {username}! You have {amount} [UPC=messages] and your name is [CAP=name].\";\n * const values1 = { username: \"john_doe\", amount: 5, name: \"john\" };\n * const result1 = string.compose(template1, values1);\n * // \"Hello, john_doe! You have 5 MESSAGES and your name is John.\"\n *\n * // Multiple modifiers in a single block (HTML enabled)\n * const template2 = \"[COLOR:#ff0056,BOLD={username}]\";\n * const values2 = { username: \"john_doe\" };\n * const result2 = string.compose(template2, values2, { html: true });\n * // '<span class=\"color bold\" style=\"color: #ff0056; font-weight: bold;\">john_doe</span>'\n *\n * // Conditional rendering with IF (supports ===, >=, &&, ||, !, etc.)\n * const template3 = \"[IF=vip && status === 'live'?VIP Online|Offline]\";\n * const values3 = { status: 'live', vip: true };\n * const result3 = string.compose(template3, values3);\n * // \"VIP Online\"\n *\n * // Pluralization using amount / count or an explicit key\n * const template4 = \"You have {amount} [PLURAL=message|messages].\";\n * const values4 = { amount: 1 };\n * const values5 = { amount: 3 };\n * const result4a = string.compose(template4, values4); // \"You have 1 message.\"\n * const result4b = string.compose(template4, values5); // \"You have 3 messages.\"\n *\n * // Number formatting\n * const template5 = \"Total: [NUMBER:2=amount] {currency}\";\n * const values6 = { amount: 1234.5, currency: '$' };\n * const result5 = string.compose(template5, values6);\n * // e.g. \"Total: 1,234.50 $\" (locale dependent)\n *\n * // Date and time formatting\n * const template6 = \"Created at: [DATE:iso=createdAt] ([DATE:relative=createdAt])\";\n * const values7 = { createdAt: new Date('2020-01-02T03:04:05.000Z') };\n * const result6 = string.compose(template6, values7);\n * // e.g. \"Created at: 2020-01-02T03:04:05.000Z (Xs ago)\"\n *\n * // MAP / SWITCH style mapping\n * const template7 = \"Status: [MAP:status=live:Online|offline:Offline|default:Unknown]\";\n * const values8 = { status: 'offline' };\n * const result7 = string.compose(template7, values8);\n * // \"Status: Offline\"\n *\n * // Escaping HTML\n * const template8 = \"[ESCAPE={message}]\";\n * const values9 = { message: '<b>Danger & \"HTML\"</b>' };\n * const result8 = string.compose(template8, values9);\n * // \"&lt;b&gt;Danger &amp; &quot;HTML&quot;&lt;/b&gt;\"\n *\n * // Using global presets\n * Helper.string.PRESETS['alert'] = 'BOLD,COLOR:#ff0056';\n * const template10 = \"[PRESET:alert={username}]\";\n * const values11 = { username: 'john_doe' };\n * const result10 = string.compose(template10, values11, { html: true });\n * // '<span class=\"color bold\" style=\"color: #ff0056; font-weight: bold;\">john_doe</span>'\n * ```\n */\n compose(\n template: string,\n values: Record<string, any> = {},\n options: {\n method?: 'loop' | 'index';\n html?: boolean;\n debug?: boolean;\n modifiers?: Record<string, Modifier>;\n aliases?: Record<string, string[]>;\n } = {\n method: 'index',\n html: false,\n debug: false,\n modifiers: {},\n aliases: {},\n },\n ): string {\n const { mergeSpanStyles } = new ElementHelper();\n\n const span = (style: string, value: string, className?: string) => {\n if (options.html) {\n return mergeSpanStyles(style, value, className);\n } else {\n return value;\n }\n };\n\n const baseValues = {\n skip: '<br/>',\n newline: '<br/>',\n ...values,\n };\n\n let defaultCurrency = '$';\n let defaultCurrencyCode = 'USD';\n\n if (typeof window !== 'undefined') {\n try {\n const client: any = (window as any)?.client;\n const currency = client?.details?.currency;\n\n if (currency?.symbol) defaultCurrency = String(currency.symbol);\n if (currency?.code) defaultCurrencyCode = String(currency.code);\n } catch {\n // ignore – fall back to defaults\n }\n }\n\n const object = new ObjectHelper();\n\n const flatten: Record<string, string> = Object.entries(object.flatten(baseValues)).reduce(\n (acc, [k, v]) => {\n acc[k] = String(v);\n\n if (['username', 'name', 'nick', 'nickname', 'sender'].some((e) => k === e)) {\n const username = acc?.username || acc?.name || acc?.nick || acc?.nickname || acc?.sender;\n\n acc['username'] = acc.username || username;\n acc['usernameAt'] = `@${acc.username}`;\n acc['name'] = acc.name || username;\n acc['nick'] = acc.nick || username;\n acc['nickname'] = acc.nickname || username;\n acc['sender'] = acc.sender || username;\n acc['senderAt'] = `@${acc.sender}`;\n }\n\n if (['amount', 'count'].some((e) => k === e)) {\n acc['amount'] = String(acc?.amount || acc.count || v);\n acc['count'] = String(acc?.count || acc?.amount || v);\n }\n\n acc['currency'] = acc.currency || defaultCurrency;\n acc['currencyCode'] = acc.currencyCode || defaultCurrencyCode;\n\n return acc;\n },\n {} as Record<string, string>,\n );\n\n const REGEX = {\n PLACEHOLDERS: /{([^}]+)}/g,\n MODIFIERS: /\\[([^\\]=]+)=([^\\]]+)\\]/g,\n };\n\n var amount = parseFloat(flatten?.amount ?? flatten?.count ?? 0);\n\n function getNumericFromKeyOrValue(\n keyOrValue: string,\n valuesMap: Record<string, string>,\n ): number | null {\n const trimmed = keyOrValue?.trim?.() ?? '';\n if (!trimmed.length) return null;\n\n const fromValues = (valuesMap as any)[trimmed];\n const candidate = fromValues !== undefined ? fromValues : trimmed;\n const num = parseFloat(String(candidate).replace(/\\s/g, ''));\n\n return isNaN(num) ? null : num;\n }\n\n function formatNumber(\n value: string,\n param: string | null | undefined,\n valuesMap: Record<string, string>,\n ): string {\n const decimals = !isNaN(Number(param)) ? Math.max(0, parseInt(String(param))) : 0;\n\n const num = getNumericFromKeyOrValue(value, valuesMap);\n if (num === null) return value;\n\n try {\n return num.toLocaleString(undefined, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n } catch {\n return num.toFixed(decimals);\n }\n }\n\n function formatRelativeTime(date: Date, now: Date = new Date()): string {\n const diffMs = now.getTime() - date.getTime();\n const past = diffMs >= 0;\n const abs = Math.abs(diffMs);\n\n const sec = Math.floor(abs / 1000);\n const min = Math.floor(sec / 60);\n const hour = Math.floor(min / 60);\n const day = Math.floor(hour / 24);\n const month = Math.floor(day / 30);\n const year = Math.floor(day / 365);\n\n const suffix = past ? 'ago' : 'from now';\n\n if (year > 0) return `${year}y ${suffix}`;\n if (month > 0) return `${month}mo ${suffix}`;\n if (day > 0) return `${day}d ${suffix}`;\n if (hour > 0) return `${hour}h ${suffix}`;\n if (min > 0) return `${min}m ${suffix}`;\n return `${Math.max(sec, 0)}s ${suffix}`;\n }\n\n function formatDateLike(\n value: string,\n param: string | null | undefined,\n valuesMap: Record<string, string>,\n ): string {\n const keyOrLiteral = value?.trim?.() ?? '';\n if (!keyOrLiteral.length) return value;\n\n const raw = (valuesMap as any)[keyOrLiteral] ?? keyOrLiteral;\n const date = new Date(raw);\n\n if (isNaN(date.getTime())) return value;\n\n const mode = (param ?? 'date').toString().toLowerCase();\n\n try {\n switch (mode) {\n case 'time':\n return date.toLocaleTimeString();\n case 'datetime':\n case 'full':\n return date.toLocaleString();\n case 'relative':\n case 'ago':\n return formatRelativeTime(date);\n case 'iso':\n return date.toISOString();\n case 'date':\n default:\n return date.toLocaleDateString();\n }\n } catch {\n return value;\n }\n }\n\n function pluralize(\n value: string,\n param: string | null | undefined,\n valuesMap: Record<string, string>,\n ): string {\n const text = value ?? '';\n const [singular, plural = singular] = text.split('|', 2);\n\n const key = param?.trim();\n let source: any = undefined;\n\n if (key && (valuesMap as any)[key] !== undefined) {\n source = (valuesMap as any)[key];\n } else {\n source = (valuesMap as any).amount ?? (valuesMap as any).count;\n }\n\n const num = parseFloat(String(source));\n if (isNaN(num)) return singular;\n\n const isPlural = Math.abs(num) !== 1;\n return isPlural ? plural : singular;\n }\n\n function mapSwitch(\n value: string,\n param: string | null | undefined,\n valuesMap: Record<string, string>,\n ): string {\n const key = param?.trim() ?? '';\n const targetRaw = key && (valuesMap as any)[key] !== undefined ? (valuesMap as any)[key] : '';\n const target = String(targetRaw);\n\n const entries = (value ?? '')\n .split('|')\n .map((p) => p.trim())\n .filter((p) => p.length);\n let defaultResult: string | undefined;\n\n for (const entry of entries) {\n const idx = entry.indexOf(':');\n if (idx === -1) continue;\n\n const mapKey = entry.slice(0, idx).trim();\n const mapValue = entry.slice(idx + 1);\n\n if (!mapKey.length) continue;\n\n if (mapKey.toLowerCase() === 'default') {\n defaultResult = mapValue;\n continue;\n }\n\n if (target === mapKey) return mapValue;\n }\n\n return defaultResult ?? '';\n }\n\n function escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n }\n\n function parseLiteralOrValue(token: string, valuesMap: Record<string, string>): any {\n let trimmed = token.trim();\n\n if (!trimmed.length) return undefined;\n\n const firstChar = trimmed[0];\n const lastChar = trimmed[trimmed.length - 1];\n\n if ((firstChar === '\"' && lastChar === '\"') || (firstChar === \"'\" && lastChar === \"'\")) {\n return trimmed.slice(1, -1);\n }\n\n const lowered = trimmed.toLowerCase();\n if (lowered === 'true') return true;\n if (lowered === 'false') return false;\n\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) return parseFloat(trimmed);\n\n const fromValues = valuesMap?.[trimmed];\n if (fromValues === undefined) return trimmed;\n\n const fromValuesStr = String(fromValues).trim();\n const fromValuesLower = fromValuesStr.toLowerCase();\n\n if (fromValuesLower === 'true') return true;\n if (fromValuesLower === 'false') return false;\n\n if (/^-?\\d+(\\.\\d+)?$/.test(fromValuesStr)) return parseFloat(fromValuesStr);\n\n return fromValues;\n }\n\n function coerceToBoolean(value: any): boolean {\n if (typeof value === 'boolean') return value;\n if (value === null || value === undefined) return false;\n\n const str = String(value).trim().toLowerCase();\n if (!str.length) return false;\n\n if (['false', '0', 'no', 'off', 'null', 'undefined', 'nan'].includes(str)) return false;\n\n return true;\n }\n\n function evaluateAtomicCondition(\n expression: string,\n valuesMap: Record<string, string>,\n ): boolean {\n let expr = expression.trim();\n if (!expr.length) return false;\n\n let invert = false;\n while (expr.startsWith('!')) {\n invert = !invert;\n expr = expr.slice(1).trim();\n }\n\n const operators = ['===', '!==', '==', '!=', '>=', '<=', '>', '<'];\n let op: string | null = null;\n let left = expr;\n let right = '';\n\n for (const candidate of operators) {\n const idx = expr.indexOf(candidate);\n if (idx !== -1) {\n op = candidate;\n left = expr.slice(0, idx);\n right = expr.slice(idx + candidate.length);\n break;\n }\n }\n\n let result: boolean;\n\n if (!op) {\n const value = parseLiteralOrValue(left, valuesMap);\n result = coerceToBoolean(value);\n } else {\n const leftVal = parseLiteralOrValue(left, valuesMap);\n const rightVal = parseLiteralOrValue(right, valuesMap);\n\n switch (op) {\n case '===':\n result = leftVal === rightVal;\n break;\n case '!==':\n result = leftVal !== rightVal;\n break;\n case '==':\n // eslint-disable-next-line eqeqeq\n result = (leftVal as any) == (rightVal as any);\n break;\n case '!=':\n // eslint-disable-next-line eqeqeq\n result = (leftVal as any) != (rightVal as any);\n break;\n case '>=':\n result = (leftVal as any) >= (rightVal as any);\n break;\n case '<=':\n result = (leftVal as any) <= (rightVal as any);\n break;\n case '>':\n result = (leftVal as any) > (rightVal as any);\n break;\n case '<':\n result = (leftVal as any) < (rightVal as any);\n break;\n default:\n result = false;\n break;\n }\n }\n\n return invert ? !result : result;\n }\n\n function evaluateConditionExpression(\n expression: string,\n valuesMap: Record<string, string>,\n ): boolean {\n let expr = expression.trim();\n if (!expr.length) return false;\n\n let invert = false;\n while (expr.startsWith('!')) {\n invert = !invert;\n expr = expr.slice(1).trim();\n }\n\n const orParts = expr\n .split('||')\n .map((p) => p.trim())\n .filter((p) => p.length);\n if (!orParts.length) return invert ? true : false;\n\n let result = false;\n\n for (const orPart of orParts) {\n const andParts = orPart\n .split('&&')\n .map((p) => p.trim())\n .filter((p) => p.length);\n if (!andParts.length) continue;\n\n let andResult = true;\n for (const andPart of andParts) {\n const partResult = evaluateAtomicCondition(andPart, valuesMap);\n andResult = andResult && partResult;\n if (!andResult) break;\n }\n\n result = result || andResult;\n if (result) break;\n }\n\n return invert ? !result : result;\n }\n\n const color = new ColorHelper();\n\n const HTML_MODIFIERS: Record<string, Modifier> = {\n COLOR: (value, param) =>\n span(param && !!color.validate(param) ? `color: ${param}` : '', value, 'color'),\n WEIGHT: (value, param) =>\n span(param && !isNaN(parseInt(param)) ? `font-weight: ${param}` : '', value, 'weight'),\n SEMIBOLD: (value) => span('font-weight: 600', value, 'semibold'),\n BOLD: (value) => span('font-weight: bold', value, 'bold'),\n BLACK: (value) => span('font-weight: 900', value, 'black'),\n LIGHT: (value) => span('font-weight: lighter', value, 'light'),\n STRONG: (value) => span('font-weight: bolder', value, 'strong'),\n ITALIC: (value) => span('font-style: italic', value, 'italic'),\n UNDERLINE: (value) => span('text-decoration: underline', value, 'underline'),\n STRIKETHROUGH: (value) => span('text-decoration: line-through', value, 'strikethrough'),\n SUB: (value) => span('vertical-align: sub', value, 'sub'),\n SUP: (value) => span('vertical-align: super', value, 'sup'),\n LARGER: (value) => span('font-size: larger', value, 'larger'),\n SMALL: (value) => span('font-size: smaller', value, 'small'),\n SHADOW: (value, param) => span(`text-shadow: ${param}`, value, 'shadow'),\n SIZE: (value, param) => span(param ? `font-size: ${param}` : '', value, 'size'),\n };\n\n const STRING_MODIFIERS: Record<string, Modifier> = {\n BT1: (value) => (amount > 1 ? value : ''),\n BT0: (value) => (amount > 0 ? value : ''),\n ST1: (value) => (amount < 1 ? value : ''),\n ST0: (value) => (amount < 0 ? value : ''),\n UPC: (value) => value.toUpperCase(),\n LOW: (value) => value.toLowerCase(),\n REV: (value) => value.split('').reverse().join(''),\n CAP: (value) => value.charAt(0).toUpperCase() + value.slice(1).toLowerCase(),\n NUMBER: (value, param, valuesMap) =>\n formatNumber(value, param, valuesMap as Record<string, string>),\n PLURAL: (value, param, valuesMap) =>\n pluralize(value, param, valuesMap as Record<string, string>),\n DATE: (value, param, valuesMap) =>\n formatDateLike(value, param, valuesMap as Record<string, string>),\n MAP: (value, param, valuesMap) =>\n mapSwitch(value, param, valuesMap as Record<string, string>),\n ESCAPE: (value) => escapeHtml(value),\n IF: (value, _param, valuesMap) => {\n const text = value ?? '';\n\n const [rawCondition, rest] = text.split('?', 2);\n if (!rest) return text;\n\n const [whenTrue, whenFalse = ''] = rest.split('|', 2);\n\n const condition = evaluateConditionExpression(\n rawCondition,\n valuesMap as Record<string, string>,\n );\n\n return condition ? whenTrue : whenFalse;\n },\n PRESET: (value, param) => {\n const name = param?.trim() ?? '';\n if (!name.length) return value;\n\n const group = this.PRESETS[name];\n if (!group || !group.length) return value;\n\n const modifiers = group\n .split(',')\n .map((part) => part.trim())\n .filter((part) => part.length)\n .map((part) => {\n const [mName, mParam] = part.split(':');\n return { name: mName.trim(), param: mParam?.trim() ?? null };\n });\n\n let result = value;\n for (const { name: mName, param: mParam } of modifiers) {\n result = applyModifier(result, mName, mParam);\n }\n\n return result;\n },\n FALLBACK: (value, param) => (value.length ? value : (param ?? value)),\n };\n\n const MODIFIERS: Record<string, Modifier> = {\n ...STRING_MODIFIERS,\n ...(options?.html ? HTML_MODIFIERS : {}),\n ...(options.modifiers ?? {}),\n };\n\n const ALIASES = {\n UPC: ['UPPERCASE', 'UPPER', 'UPP'],\n LOW: ['LOWERCASE', 'LOWER', 'LWC'],\n REV: ['REVERSE', 'RVS'],\n CAP: ['CAPITALIZE', 'CAPITAL'],\n NUMBER: ['NUMBER', 'NUM', 'FORMAT_NUMBER', 'FMT_NUM'],\n PLURAL: ['PLURAL', 'PL', 'PLR'],\n DATE: ['DATE', 'DATETIME', 'TIME', 'DT'],\n MAP: ['MAP', 'SWITCH'],\n ESCAPE: ['ESCAPE', 'ESC', 'ESC_HTML', 'ESCAPE_HTML'],\n PRESET: ['PRESET', 'STYLE', 'THEME'],\n BT1: ['BIGGER_THAN_1', 'GREATER_THAN_1', 'GT1'],\n BT0: ['BIGGER_THAN_0', 'GREATER_THAN_0', 'GT0'],\n ST1: ['SMALLER_THAN_1', 'LESS_THAN_1', 'LT1'],\n ST0: ['SMALLER_THAN_0', 'LESS_THAN_0', 'LT0'],\n COLOR: ['COLOUR', 'CLR', 'HIGHLIGHT'],\n BOLD: ['BOLDEN', 'B'],\n STRONG: ['STRONGEN', 'STRONG'],\n ITALIC: ['ITALICIZE', 'ITALIC', 'I'],\n UNDERLINE: ['U', 'INS', 'INSET', 'I'],\n STRIKETHROUGH: ['STRIKE', 'S', 'DELETE', 'D'],\n SUB: ['SUBSCRIPT', 'SUBS'],\n SUP: ['SUPERSCRIPT', 'SUPS'],\n LARGER: ['LARGER', 'LG'],\n SMALL: ['SMALLER', 'SM'],\n SHADOW: ['SHADOW', 'SHD'],\n FALLBACK: ['FALLBACK', 'FB'],\n IF: ['IF', 'COND', 'CONDITION'],\n ...(options.aliases ?? {}),\n };\n\n function applyModifier(value: string, name: string, param: string | null | undefined): string {\n const canonical = Object.entries(ALIASES).find(([key, aliases]) => {\n if (aliases.some((alias) => alias.toUpperCase() === name.toUpperCase())) return true;\n else if (key.toUpperCase() === name.toUpperCase()) return true;\n else return false;\n });\n const use = canonical ? canonical[0] : name.toUpperCase();\n\n try {\n if (MODIFIERS[use])\n return MODIFIERS[use](value, typeof param === 'string' ? param.trim() : null, flatten);\n else if (options?.html) return span('', value, use.toLowerCase());\n else return value;\n } catch (error) {\n if (\n options?.debug &&\n typeof console !== 'undefined' &&\n typeof console.error === 'function'\n ) {\n console.error('[Helper.string.compose] Modifier error', { name, param, error });\n }\n return value;\n }\n }\n\n function replaceAll(string: string): string {\n let str = string;\n let match;\n\n while ((match = REGEX.MODIFIERS.exec(str)) !== null) {\n const [fullMatch, modifierGroup, value] = match;\n\n const modifiers = modifierGroup\n .split(',')\n .map((part) => part.trim())\n .filter((part) => part.length)\n .map((part) => {\n const [name, param] = part.split(':');\n return { name: name.trim(), param: param?.trim() ?? null };\n });\n\n let newValue = replaceAll(value);\n\n for (const { name, param } of modifiers) {\n newValue = applyModifier(newValue, name, param);\n }\n\n str = str.replace(fullMatch, newValue ?? '');\n\n REGEX.MODIFIERS.lastIndex = 0;\n }\n\n return str;\n }\n\n function parseModifiers(str: string): string {\n let i = 0;\n const len = str.length;\n\n function parseText(stopChar?: string): string {\n let out = '';\n while (i < len) {\n if (str[i] === '\\\\') {\n if (i + 1 < len) {\n out += str[i + 1];\n i += 2;\n } else {\n i++;\n }\n } else if (str[i] === '[' && (!stopChar || stopChar !== '[')) {\n out += parseModifier();\n } else if (stopChar && str[i] === stopChar) {\n i++;\n break;\n } else {\n out += str[i++];\n }\n }\n return out;\n }\n\n function parseModifier(): string {\n i++;\n const modifiers: { name: string; param: string | null }[] = [];\n\n while (i < len && str[i] !== '=') {\n if (str[i] === ',') {\n i++;\n continue;\n }\n\n let name = '';\n while (i < len && /[A-Za-z0-9]/.test(str[i])) name += str[i++];\n\n let param: string | null = null;\n if (str[i] === ':') {\n i++;\n const paramStart = i;\n while (i < len && str[i] !== ',' && str[i] !== '=') i++;\n param = str.slice(paramStart, i);\n }\n\n if (name.length) {\n modifiers.push({ name, param });\n }\n\n if (str[i] === ',') {\n i++;\n }\n }\n\n if (str[i] === '=') i++;\n\n const value = parseText(']');\n\n return modifiers.reduce((val, { name, param }) => applyModifier(val, name, param), value);\n }\n\n return parseText();\n }\n\n let result = template.replace(REGEX.PLACEHOLDERS, (_, key: string) =>\n typeof flatten[key] === 'string' || typeof flatten[key] === 'number'\n ? String(flatten[key])\n : (key ?? key),\n );\n\n result = options.method === 'loop' ? replaceAll(result) : parseModifiers(result);\n\n return result;\n }\n}\n","export class SoundHelper {\n playing: boolean = false;\n audio!: AudioContext;\n\n /**\n * Play sound from URL with optional volume and replace parameters\n * @param url - Sound URL to play\n * @param volume - Volume level from 0 to 100 (default: 100)\n * @param replace - If true, replaces currently playing sound (default: false)\n */\n play(url: string, volume: number = 100, replace = false) {\n if (!url || !url.length) {\n throw new Error('No sound URL provided');\n }\n\n try {\n if (replace && this.playing && this.audio && this.audio.state !== 'closed')\n this.audio.close();\n\n let ctx = new AudioContext();\n let gainNode = ctx.createGain();\n gainNode.connect(ctx.destination);\n\n if (replace) {\n this.audio = ctx;\n this.playing = true;\n }\n\n fetch(url)\n .then((data) => data.arrayBuffer())\n .then((arrayBuffer) => ctx.decodeAudioData(arrayBuffer))\n .then((decodedAudio) => {\n if (ctx.state !== 'closed') {\n const playSound = ctx.createBufferSource();\n playSound.buffer = decodedAudio;\n playSound.connect(gainNode);\n gainNode.gain.value = volume / 100;\n playSound.start(ctx.currentTime);\n }\n });\n } catch (error) {\n throw new Error(`Error playing sound: ${error}`);\n }\n }\n}\n","export class FunctionHelper {\n /**\n * Apply function with given thisArg and arguments\n * @param fn - Function to apply\n * @param thisArg - Value to use as this when calling fn\n * @param args - Arguments to pass to fn\n * @returns Result of calling fn with thisArg and args\n */\n apply<TThis, TArgs extends unknown[], TReturn>(\n fn: (this: TThis, ...args: TArgs) => TReturn,\n thisArg: TThis,\n args: TArgs,\n ): TReturn {\n return fn.apply(thisArg, args);\n }\n\n /**\n * Call function with given thisArg and arguments\n * @param fn - Function to call\n * @param thisArg - Value to use as this when calling fn\n * @param args - Arguments to pass to fn\n * @returns Result of calling fn with thisArg and args\n */\n call<TThis, TArgs extends unknown[], TReturn>(\n fn: (this: TThis, ...args: TArgs) => TReturn,\n thisArg: TThis,\n ...args: TArgs\n ): TReturn {\n return fn.call(thisArg, ...args);\n }\n}\n","import { Data } from '../data/index.js';\nimport { RandomHelper } from '../helper/classes/random.js';\nimport { UtilsHelper } from '../helper/classes/utils.js';\nimport { Local } from '../local/index.js';\nimport { StreamElements, Twitch } from '../types.js';\nimport { EventProvider } from './EventProvider.js';\n\nexport class FakeUser {\n public readonly id!: string;\n public readonly name!: string;\n public readonly login!: string;\n\n public badges: Twitch.tags[] = [];\n public isSubscriber: boolean = false;\n public tier?: StreamElements.Event.Provider.Twitch.SubscriberTier;\n\n constructor(\n id: string,\n name: string,\n badges: Twitch.tags[] = [],\n isSubscriber: boolean = false,\n tier?: StreamElements.Event.Provider.Twitch.SubscriberTier,\n ) {\n this.id = id;\n this.name = name;\n this.login = name.toLocaleLowerCase();\n this.badges = badges;\n this.isSubscriber = isSubscriber;\n this.tier = tier;\n }\n}\n\nexport interface FakeUserPoolOptions {\n id?: string;\n names?: string[];\n badges?: Twitch.tags[];\n limits?: {\n [key in Twitch.tags]?: number;\n };\n fixed?: {\n [key in Twitch.tags]?: string[];\n };\n}\n\ntype FakeUserPoolEvents = {\n 'warn': [warning: Error];\n};\n\nexport const fakeUserPools: FakeUserPool[] = [];\n\nexport class FakeUserPool extends EventProvider<FakeUserPoolEvents> {\n public readonly users: FakeUser[] = [];\n public readonly id: string;\n\n private readonly byId: Map<string, FakeUser> = new Map();\n private readonly byName: Map<string, FakeUser> = new Map();\n private readonly byBadge: Map<Twitch.tags, FakeUser[]> = new Map();\n\n private static fixUser(user: string | FakeUser): string {\n if (typeof user === 'string') return user.trim().replace(/^@+/, '').toLocaleLowerCase();\n\n return FakeUserPool.fixUser(user.name);\n }\n\n private static getRandomSubTier(): StreamElements.Event.Provider.Twitch.SubscriberTier {\n const utils = new UtilsHelper();\n\n return (\n utils.probability({\n 'prime': 0.4,\n '1000': 0.3,\n '2000': 0.2,\n '3000': 0.1,\n } as {\n [key in StreamElements.Event.Provider.Twitch.SubscriberTier]: number;\n }) ?? 'prime'\n );\n }\n\n constructor(options?: FakeUserPoolOptions) {\n super();\n\n this.id = options?.id || `fake_user_pool_${Math.random().toString(36).slice(2, 10)}`;\n\n this.users = this.start(options?.names || Data.names, options?.badges, options);\n this.byId = new Map(this.users.map((user) => [user.id, user]));\n this.byName = new Map(this.users.map((user) => [user.login, user]));\n this.byBadge = new Map(\n this.users.reduce((acc, user) => {\n for (const badge of user.badges) {\n const existing = acc.get(badge) ?? [];\n acc.set(badge, [...existing, user]);\n }\n return acc;\n }, new Map<Twitch.tags, FakeUser[]>()),\n );\n\n fakeUserPools.push(this);\n }\n\n private start(\n names: string[],\n badges: Twitch.tags[] = Data.badges.map((e) => e.set_id) as Twitch.tags[],\n options?: Omit<FakeUserPoolOptions, 'badges'>,\n ): FakeUser[] {\n const normalizedNames = names\n .map((name) => name && FakeUserPool.fixUser(name))\n .filter((name) => name && name.length)\n // remove duplicates\n .filter((name, index, self) => self.indexOf(name) === index);\n\n const badgePool = badges.filter((badge, index, self) => self.indexOf(badge) === index);\n\n if (!badgePool.length || !normalizedNames.length) {\n return [];\n }\n\n const users: FakeUser[] = [];\n const limits = options?.limits ?? {};\n const fixed = options?.fixed ?? {};\n const usage = new Map<Twitch.tags, number>();\n const fixedNameToBadge = new Map<string, Twitch.tags>();\n let badgeCursor = 0;\n\n const getLimit = (badge: Twitch.tags): number => {\n const value = limits[badge];\n\n return typeof value === 'number' && value > 0 ? value : Number.POSITIVE_INFINITY;\n };\n\n const canUseBadge = (badge: Twitch.tags): boolean => {\n const max = getLimit(badge);\n const current = usage.get(badge) ?? 0;\n\n return current < max;\n };\n\n const registerBadgeUsage = (badge: Twitch.tags): void => {\n const current = usage.get(badge) ?? 0;\n usage.set(badge, current + 1);\n };\n\n const normalizeUserNames = (value: string | string[] | undefined): string[] => {\n if (!value) return [];\n\n if (typeof value === 'string') {\n return [FakeUserPool.fixUser(value)].filter(Boolean);\n }\n\n if (Array.isArray(value)) {\n return value.map(FakeUserPool.fixUser).filter(Boolean);\n }\n\n return [];\n };\n\n const nextAvailableBadge = (): Twitch.tags | null => {\n for (let step = 0; step < badgePool.length; step++) {\n const badge = badgePool[(badgeCursor + step) % badgePool.length];\n\n if (canUseBadge(badge)) {\n badgeCursor = (badgeCursor + step + 1) % badgePool.length;\n return badge;\n }\n }\n\n return null;\n };\n\n for (const badge of badgePool) {\n const namesForBadge = normalizeUserNames(fixed[badge]);\n\n for (const fixedName of namesForBadge) {\n const key = FakeUserPool.fixUser(fixedName);\n\n if (!fixedNameToBadge.has(key)) {\n fixedNameToBadge.set(key, badge);\n }\n }\n }\n\n for (const name of normalizedNames) {\n let selectedBadge: Twitch.tags | null = null;\n const fixedBadge = fixedNameToBadge.get(FakeUserPool.fixUser(name));\n\n if (fixedBadge && canUseBadge(fixedBadge)) {\n selectedBadge = fixedBadge;\n } else {\n selectedBadge = nextAvailableBadge();\n }\n\n if (!selectedBadge) {\n this.emit('warn', new Error('Not enough badges to assign to users'));\n continue;\n }\n\n const userIndex = users.length + 1;\n const isSubscriber = ['subscriber', 'prime', 'founder'].includes(\n String(selectedBadge).toLocaleLowerCase(),\n );\n\n const user = new FakeUser(\n `fake_user_${userIndex.toString().padStart(2, '0')}_${Math.random().toString(36).slice(2, 8)}+${this.id}`,\n name,\n selectedBadge ? [selectedBadge] : [],\n isSubscriber,\n isSubscriber ? FakeUserPool.getRandomSubTier() : undefined,\n );\n\n users.push(user);\n\n registerBadgeUsage(selectedBadge);\n }\n\n if (users.length < normalizedNames.length) {\n this.emit(\n 'warn',\n new Error(\n 'Some users could not be assigned badges due to limits. Consider increasing limits or adding more badges.',\n ),\n );\n }\n\n return users;\n }\n\n public pick(): FakeUser | null {\n if (!this.users.length) {\n return null;\n }\n\n return new RandomHelper().array(this.users)[0];\n }\n\n public getByName(name: string): FakeUser | null {\n const key = FakeUserPool.fixUser(name);\n return this.byName.get(key) ?? null;\n }\n\n public getById(id: string): FakeUser | null {\n return this.byId.get(id) ?? null;\n }\n\n public getByBadge(badge: Twitch.tags): FakeUser[] {\n return this.byBadge.get(badge) ?? [];\n }\n\n public getToReply(\n target: { id?: string; name?: string },\n extend?: Partial<Twitch.Reply>,\n ): Twitch.Reply | null {\n let user: FakeUser | null = null;\n\n if (target?.id) {\n user = this.getById(target.id);\n }\n\n if (!user && target?.name) {\n user = this.getByName(target.name);\n }\n\n if (!user) {\n return null;\n }\n\n return {\n msgId: `fake_msg_${Math.random().toString(36).slice(2, 10)}`,\n userId: user.id,\n userLogin: user.login,\n displayName: user.name,\n msgBody: `This is a fake reply from ${user.name}`,\n ...extend,\n };\n }\n\n public buildTwitchMessage(\n messages: string[] = Data.twitch_messages,\n ): Parameters<(typeof Local)['emulate']['twitch']['message']>[0] {\n const user = this.pick();\n\n if (!user) {\n this.emit('warn', new Error('No users available to build a Twitch message'));\n return;\n }\n\n return {\n userId: user.id,\n name: user.name,\n badges: user.badges,\n message: new RandomHelper().array(messages)[0],\n };\n }\n\n public buildYouTubeMessage(\n messages: string[] = Data.youtube_messages,\n ): Parameters<(typeof Local)['emulate']['youtube']['message']>[0] {\n const user = this.pick();\n\n if (!user) {\n this.emit('warn', new Error('No users available to build a YouTube message'));\n return;\n }\n\n return {\n userId: user.id,\n name: user.name,\n badges: user.badges,\n message: new RandomHelper().array(messages)[0],\n };\n }\n}\n","import { fakeUserPools } from '../../modules/fakeUser.js';\nimport { RequireAtLeastOne, StreamElements, Twitch } from '../../types.js';\nimport { EventHelper } from './event.js';\n\nexport class UtilsHelper {\n /**\n * Delays execution for a specified number of milliseconds.\n * @param ms - The number of milliseconds to delay.\n * @returns A Promise that resolves after the specified delay.\n */\n delay<R extends any, M extends number>(ms: M, callback?: () => R): Promise<R | null> {\n return new Promise((resolve) =>\n setTimeout(() => {\n if (callback) {\n const result = callback();\n resolve(result ?? null);\n } else resolve(null);\n }, ms),\n );\n }\n\n /**\n * Returns typed entries of an object.\n * @param obj - The object to get entries from.\n * @returns An array of key-value pairs from the object.\n */\n typedEntries<K extends string, V>(obj: Record<K, V> | Array<V>): [K, V][] {\n return Object.entries(obj) as [K, V][];\n }\n\n /**\n * Returns typed values of an object.\n * @param obj - The object to get values from.\n * @returns An array of values from the object.\n */\n typedValues<K extends string, V>(obj: Record<K, V> | Array<V>): V[] {\n return Object.values(obj) as V[];\n }\n\n /**\n * Returns typed keys of an object.\n * @param obj - The object to get keys from.\n * @returns An array of keys from the object.\n */\n typedKeys<K extends string, V>(obj: Record<K, V> | Array<V>): K[] {\n return Object.keys(obj) as K[];\n }\n\n /**\n * Compares two dates and returns the difference in multiple time units.\n *\n * `total` values are based on raw milliseconds (can be decimal).\n * `calendar` values use calendar boundaries for full months/years.\n */\n compareDates(date1: Date | string, date2: Date | string) {\n const d1 = date1 instanceof Date ? new Date(date1.getTime()) : new Date(date1);\n const d2 = date2 instanceof Date ? new Date(date2.getTime()) : new Date(date2);\n\n if (Number.isNaN(d1.getTime()) || Number.isNaN(d2.getTime())) {\n throw new Error('Invalid date provided to compareDates');\n }\n\n const milliseconds = d2.getTime() - d1.getTime();\n const absMilliseconds = Math.abs(milliseconds);\n\n const totalSeconds = milliseconds / 1000;\n const totalMinutes = milliseconds / (1000 * 60);\n const totalHours = milliseconds / (1000 * 60 * 60);\n const totalDays = milliseconds / (1000 * 60 * 60 * 24);\n const totalMonths = totalDays / 30.436875;\n const totalYears = totalDays / 365.2425;\n\n const from = d1 <= d2 ? d1 : d2;\n const to = d1 <= d2 ? d2 : d1;\n let calendarMonths =\n (to.getFullYear() - from.getFullYear()) * 12 + (to.getMonth() - from.getMonth());\n\n const anchor = new Date(from);\n anchor.setMonth(anchor.getMonth() + calendarMonths);\n\n if (anchor > to) {\n calendarMonths -= 1;\n }\n\n const sign = milliseconds < 0 ? -1 : 1;\n const signedCalendarMonths = calendarMonths * sign;\n const signedCalendarYears = (calendarMonths / 12) * sign;\n\n return {\n milliseconds,\n seconds: totalSeconds,\n minutes: totalMinutes,\n hours: totalHours,\n days: totalDays,\n months: totalMonths,\n years: totalYears,\n absolute: {\n milliseconds: absMilliseconds,\n seconds: absMilliseconds / 1000,\n minutes: absMilliseconds / (1000 * 60),\n hours: absMilliseconds / (1000 * 60 * 60),\n days: absMilliseconds / (1000 * 60 * 60 * 24),\n months: absMilliseconds / (1000 * 60 * 60 * 24 * 30.436875),\n years: absMilliseconds / (1000 * 60 * 60 * 24 * 365.2425),\n },\n calendar: {\n months: signedCalendarMonths,\n years: signedCalendarYears,\n },\n isFuture: milliseconds > 0,\n isPast: milliseconds < 0,\n isSameMoment: milliseconds === 0,\n };\n }\n\n /**\n * Selects an item based on weighted probabilities.\n * @param items - An object where keys are items and values are their weights.\n * @returns A randomly selected item based on the given probabilities.\n * @example\n * ```ts\n * const utils = new UtilsHelper();\n * const result = utils.probability({\n * apple: 0.5,\n * banana: 0.3,\n * cherry: 0.2,\n * });\n * console.log(result); // 'apple', 'banana', or 'cherry' based on the defined probabilities\n * ```\n */\n probability<K extends string, V extends number>(items: Record<K, V>): K | undefined {\n const total = (Object.values(items) as number[]).reduce((acc, val) => acc + val, 0);\n const sorted = this.typedEntries(items).sort((a, b) => b[1] - a[1]);\n const rand = Math.random() * total;\n\n let cumulative = 0;\n\n for (const [item, weight] of sorted) {\n cumulative += weight;\n\n if (rand < cumulative) {\n return item;\n }\n }\n\n return undefined;\n }\n\n /**\n * Finds the subscription tier of a user based on various sources of information.\n * @param data - An object containing userId, name, and broadcasterId to identify the user.\n * @param session - The current session data which may contain recent subscription information.\n * @param checkWithAPI - Whether to check the subscription tier with an external API as a last resort.\n * @returns A promise that resolves to the subscription tier of the user (1, 2, or 3).\n * @example\n * ```javascript\n * const utils = new UtilsHelper();\n * const tier = await utils.findSubscriptionTier(\n * { userId: '12345', name: 'exampleUser', broadcasterId: '67890' },\n * sessionData,\n * true\n * );\n * console.log(tier); // 1, 2, or 3 based on the user's subscription tier\n * ```\n */\n async findSubscriptionTier(\n {\n userId,\n name,\n broadcasterId,\n }: {\n userId: string;\n name: string;\n broadcasterId?: string;\n },\n session: StreamElements.Session.Data,\n checkWithAPI: boolean = false,\n ) {\n const convert = (tier?: string | number) => {\n if (tier === 'prime') return 1;\n else if (tier === '1000' || tier === 1000 || tier === 1 || tier === '1') return 1;\n else if (tier === '2000' || tier === 2000 || tier === 2 || tier === '2') return 2;\n else if (tier === '3000' || tier === 3000 || tier === 3 || tier === '3') return 3;\n else return 1;\n };\n\n // If it's a fake user, get the tier from the fake user pool\n if (userId?.includes('fake_user_')) {\n const pool = fakeUserPools.find((p) => userId.endsWith(`+${p.id}`));\n\n if (pool) {\n const user = pool.getById(userId);\n\n if (user) return convert(user.tier);\n }\n }\n\n // Check the recent subscriptions\n const recentSubscriptions = session['subscriber-recent'];\n\n if (recentSubscriptions) {\n const subscriber = recentSubscriptions.find((sub) => sub.name === name);\n\n if (subscriber) return convert(subscriber.tier);\n }\n\n // Check the latest subscriber\n\n const latestSubscriber = session['subscriber-latest'];\n\n if (latestSubscriber.name === name) {\n return convert(latestSubscriber.tier);\n }\n\n // Check gifts\n\n const latestGift = session['subscriber-gifted-latest'];\n\n if (latestGift.name === name) {\n return convert(latestGift.tier);\n }\n\n // Last try, check with my API\n if (checkWithAPI) {\n if (\n broadcasterId?.length &&\n userId?.length &&\n !broadcasterId.includes('fake_user_') &&\n !userId.includes('fake_user_')\n ) {\n const result = await fetch(\n `https://api.tixyel.com/v1/twitch/channel/subscriber/${broadcasterId}/${userId}`,\n )\n .then(async (res) =>\n res.status == 200\n ? res.json()\n : Promise.reject(\n new Error(\n `Failed to fetch subscription data: ${res.status} ${res.statusText} ${await res.text()}`,\n ),\n ),\n )\n .then(\n (data: {\n broadcaster: { id: string; name: string; displayName: string };\n isGift: boolean;\n tier: string;\n }) => {\n return data?.tier;\n },\n )\n .catch(() => 1);\n\n if (result) return convert(result);\n }\n }\n\n return 1;\n }\n\n /**\n * Identifies a user based on the received event and session data, returning their ID, name, role, badges, and top status.\n * @param receivedEvent - The event received from the provider (Twitch or YouTube) containing user information.\n * @param session - The current session data which may contain recent activity and top user information.\n * @returns A promise that resolves to an object containing the user's ID, name, role, badges, and top status, or undefined if the user cannot be identified.\n * @example\n * ```javascript\n * const utils = new UtilsHelper();\n * const userInfo = await utils.identifyUser(receivedEvent, sessionData);\n * console.log(userInfo);\n * // {\n * // id: '12345',\n * // name: 'exampleUser',\n * // role: 'moderator',\n * // badges: [{ type: 'moderator', version: '1', url: 'https:...', description: 'Moderator' }],\n * // top: {\n * // gifter: false,\n * // tip: {\n * // session: { donator: false, donation: false },\n * // weekly: { donator: false, donation: false },\n * // monthly: { donator: false, donation: false },\n * // alltime: { donator: false, donation: false },\n * // },\n * // ...\n * // }\n * // }\n * ```\n */\n async identifyUser(\n receivedEvent:\n | StreamElements.Event.Provider.Twitch.Message\n | StreamElements.Event.Provider.YouTube.Message,\n session: StreamElements.Session.Data,\n ): Promise<IdentifyYouTubeResult | IdentifyTwitchResult | undefined> {\n const received = new EventHelper().parseProvider(receivedEvent);\n\n const getTops = (name: string): TopType => ({\n gifter: session['subscriber-alltime-gifter'].name === name,\n tip: {\n session: {\n donator: session['tip-session-top-donator'].name === name,\n donation: session['tip-session-top-donation'].name === name,\n },\n weekly: {\n donator: session['tip-weekly-top-donator'].name === name,\n donation: session['tip-weekly-top-donation'].name === name,\n },\n monthly: {\n donator: session['tip-monthly-top-donator'].name === name,\n donation: session['tip-monthly-top-donation'].name === name,\n },\n alltime: {\n donator: session['tip-alltime-top-donator'].name === name,\n donation: session['tip-alltime-top-donation'].name === name,\n },\n },\n cheer: {\n session: {\n donator: session['cheer-session-top-donator'].name === name,\n amount: session['cheer-session-top-donation'].name === name,\n },\n weekly: {\n donator: session['cheer-weekly-top-donator'].name === name,\n amount: session['cheer-weekly-top-donation'].name === name,\n },\n monthly: {\n donator: session['cheer-monthly-top-donator'].name === name,\n amount: session['cheer-monthly-top-donation'].name === name,\n },\n alltime: {\n donator: session['cheer-alltime-top-donator'].name === name,\n amount: session['cheer-alltime-top-donation'].name === name,\n },\n },\n superchat: {\n session: {\n donator: session['superchat-session-top-donator'].name === name,\n amount: session['superchat-session-top-donation'].name === name,\n },\n weekly: {\n donator: session['superchat-weekly-top-donator'].name === name,\n amount: session['superchat-weekly-top-donation'].name === name,\n },\n monthly: {\n donator: session['superchat-monthly-top-donator'].name === name,\n amount: session['superchat-monthly-top-donation'].name === name,\n },\n alltime: {\n donator: session['superchat-alltime-top-donator'].name === name,\n amount: session['superchat-alltime-top-donation'].name === name,\n },\n },\n });\n\n switch (received.provider) {\n case 'twitch': {\n switch (received.data.listener) {\n case 'message': {\n const event = received.data.event;\n const data = event.data;\n\n const tier = await this.findSubscriptionTier(\n {\n userId: data.userId,\n name: data.displayName,\n broadcasterId: data.tags['room-id'],\n },\n session ?? ({} as StreamElements.Session.Data),\n false,\n );\n\n return {\n id: data.userId,\n name: data.displayName,\n color: data.displayColor,\n role: data.tags.badges.split(',')[0].split('/')[0] as Twitch.tags,\n tags: data.tags.badges.split(',').map((b) => b.split('/')[0] as Twitch.tags),\n badges: data.badges,\n tier: data.tags.badges.includes('subscriber') ? tier : undefined,\n top: getTops(data.displayName),\n } satisfies IdentifyTwitchResult;\n }\n }\n\n break;\n }\n case 'youtube': {\n switch (received.data.listener) {\n case 'message': {\n const event = received.data.event;\n const data = event.data;\n\n const role = data.authorDetails.isChatOwner\n ? 'broadcaster'\n : data.authorDetails.isChatModerator\n ? 'moderator'\n : data.authorDetails.isChatSponsor\n ? 'sponsor'\n : data.authorDetails.isVerified\n ? 'verified'\n : 'viewer';\n\n return {\n id: data.userId,\n name: data.displayName,\n role: role,\n badges: data.badges,\n top: getTops(data.displayName),\n } satisfies IdentifyYouTubeResult;\n }\n }\n\n break;\n }\n }\n\n return undefined;\n }\n}\n\ntype TopType = {\n gifter: boolean;\n tip: {\n session: { donator: boolean; donation: boolean };\n weekly: { donator: boolean; donation: boolean };\n monthly: { donator: boolean; donation: boolean };\n alltime: { donator: boolean; donation: boolean };\n };\n cheer: {\n session: { donator: boolean; amount: boolean };\n weekly: { donator: boolean; amount: boolean };\n monthly: { donator: boolean; amount: boolean };\n alltime: { donator: boolean; amount: boolean };\n };\n superchat: {\n session: { donator: boolean; amount: boolean };\n weekly: { donator: boolean; amount: boolean };\n monthly: { donator: boolean; amount: boolean };\n alltime: { donator: boolean; amount: boolean };\n };\n};\n\ntype IdentifyTwitchResult = {\n id: string;\n name: string;\n color: string;\n role: Twitch.tags;\n tags: Twitch.tags[];\n badges: Twitch.badge[];\n tier?: 1 | 2 | 3;\n top: TopType;\n};\n\ntype IdentifyYouTubeResult = {\n id: string;\n name: string;\n role: 'broadcaster' | 'moderator' | 'sponsor' | 'verified' | 'viewer';\n badges: unknown[];\n top: TopType;\n};\n","import {\n ColorHelper,\n ElementHelper,\n EventHelper,\n FunctionHelper,\n MessageHelper,\n NumberHelper,\n ObjectHelper,\n RandomHelper,\n SoundHelper,\n StringHelper,\n UtilsHelper,\n} from './classes/index.js';\n\nexport namespace Helper {\n export const number = new NumberHelper();\n\n export const element = new ElementHelper();\n\n export const object = new ObjectHelper();\n\n export const message = new MessageHelper();\n\n export const event = new EventHelper();\n\n export const string = new StringHelper();\n\n export const sound = new SoundHelper();\n\n export const color = new ColorHelper();\n\n export const random = new RandomHelper();\n\n export const fn = new FunctionHelper();\n\n export const utils = new UtilsHelper();\n}\n","import { Client } from '../client/client.js';\nimport { Helper } from '../helper/index.js';\nimport { logger } from '../main.js';\nimport { StreamElements } from '../types/index.js';\n\ninterface ButtonOptions {\n field: string | ((field: string, value: string | boolean | number) => boolean);\n template?: string;\n name?: string;\n value?: string;\n run: (this: Client | undefined, field: string, value: string | boolean | number) => void;\n}\n\nconst buttons: Button[] = [];\n\n/**\n * Represents a button action that can be triggered by custom fields in StreamElements.\n * The button can be configured with a template and a name, and it will execute a specified function when triggered.\n * @example\n * ```javascript\n * const button = new Button({\n * field: (field, value) => field.startsWith('message-') && field.split('-')[1],\n * template: 'message-{role}',\n * // name: '[CAP={role}] role message',\n * name: 'Generate {role} message',\n * run(field, value) {\n * console.log(`Button ${field} was clicked with value: ${value}`);\n * }\n * })\n *\n * const field = button.generate([{ role: 'broadcaster' }, { role: 'moderator' }]);\n * // This will create buttons with fields \"message-broadcaster\" and \"message-moderator\" and names \"Generate broadcaster message\" and \"Generate moderator message\".\n * // field['message-broadcaster'] => { type: 'button', label: 'Generate broadcaster message' }\n * // field['message-moderator'] => { type: 'button', label: 'Generate moderator message' }\n *\n * // When a custom field with the name \"message-broadcaster\" or \"message-moderator\" is triggered, the run function will be called with the field and value.\n * ```\n */\nexport class Button {\n field: ButtonOptions['field'] = 'button';\n template: string = 'button';\n name: string = 'Button';\n value: string = '';\n\n run!: ButtonOptions['run'];\n\n constructor(options: ButtonOptions) {\n this.field = options.field ?? this.field;\n this.template =\n options.template ?? (typeof this.field === 'string' ? this.field : this.template);\n this.name = options.name ?? this.name;\n this.value = options.value ?? this.value;\n this.run = options.run;\n\n buttons.push(this);\n\n if (!(window?.client instanceof Client)) return;\n\n // Register the button in the client actions\n window?.client?.actions.buttons.push(this);\n window?.client?.emit('action', this, 'created');\n }\n\n generate(values: Array<Record<string, string | number>>) {\n const fields = Helper.utils.typedValues(values).reduce(\n (acc, values, index) => {\n const key = Helper.string.compose(this.template, { index, ...values }, { html: false });\n const name = Helper.string.compose(this.name, { index, ...values }, { html: false });\n\n acc[key] = {\n type: 'button',\n label: name,\n };\n\n let value: string | number | boolean = Helper.string.compose(\n String(this.value),\n { index, ...values },\n { html: false },\n );\n\n if (!isNaN(Number(value))) value = Number(value);\n else if (value.toLowerCase() === 'true') value = true;\n else if (value.toLowerCase() === 'false') value = false;\n\n if (\n typeof value !== 'undefined' &&\n !!value &&\n (typeof value === 'string' ? value.length : true)\n ) {\n acc[key].value = value;\n }\n\n return acc;\n },\n {} as Record<string, StreamElements.CustomField.Schema>,\n );\n\n // let result = Helper.string.compose(this.template, values, { html: false });\n\n return fields;\n }\n\n parse(field: string, value: string | boolean | number): Button {\n /**\n * Extract the actual field name by removing the template part from the provided field.\n * For example, if the template is \"button-{id}\" and the field is \"button-123\",\n * this will extract \"123\" as the actual field name.\n */\n var f = field\n .replace(\n typeof this.field === 'string'\n ? this.field\n : (this.template.replace(/\\{[^}]*\\}/g, '') ?? ''),\n '',\n )\n .trim();\n\n try {\n this.run.apply(window?.client || undefined, [f.length ? f : (field ?? field), value]);\n } catch (error) {\n throw new Error(\n `Error running button \"${this.field}\": ${error instanceof Error ? error.message : error}`,\n );\n }\n\n return this;\n }\n\n remove(): void {\n const _index = buttons.indexOf(this);\n\n if (_index > -1) {\n buttons.splice(_index, 1);\n }\n\n if (!(window?.client instanceof Client)) return;\n\n const index = window?.client.actions.buttons.indexOf(this);\n\n if (index > -1) {\n window?.client?.actions.buttons.splice(index, 1);\n window?.client?.emit('action', this, 'removed');\n }\n }\n\n static execute(field: string, value: string | boolean | number): boolean {\n try {\n if (buttons.length) {\n const found = buttons.filter((b) => {\n /**\n * Check if the button's field matches the provided field.\n */\n if (typeof b.field === 'string') return b.field === field;\n /**\n * If the button's field is a function, call it with the provided field and value to determine a match.\n */\n if (typeof b.field === 'function') return b.field(field, value);\n\n return false;\n });\n\n if (found.length && found.every((b) => b instanceof Button)) {\n found.forEach((button) => {\n try {\n button.parse(field, value);\n\n window?.client?.emit('action', button, 'executed');\n\n logger.received(`Button executed: ${field}${value ? ` with value: ${value}` : ''}`);\n } catch (error) {\n logger.error(\n `Error executing button \"${field}\": ${error instanceof Error ? error.message : error}`,\n );\n }\n });\n\n return true;\n }\n }\n } catch (error) {\n return false;\n } finally {\n return false;\n }\n }\n}\n\nexport { buttons as usedButtons };\n","import { Client } from '../client/client.js';\nimport { logger } from '../main.js';\nimport { StreamElements } from '../types/streamelements/main.js';\n\ninterface CommandOptions {\n prefix?: string;\n name: string;\n description?: string;\n arguments?: boolean;\n run: (this: Client, args: string[], event: CommandEvent) => void;\n test?: string;\n aliases?: string[];\n permissions?: string[] | boolean;\n admins?: string[];\n}\n\ntype CommandEvent =\n | { provider: 'twitch'; data: StreamElements.Event.Provider.Twitch.Message }\n | { provider: 'youtube'; data: StreamElements.Event.Provider.YouTube.Message }\n | { provider: 'kick'; data: any };\n\nconst commands: Command[] = [];\n\nexport class Command {\n prefix: string = '!';\n\n name!: string;\n description!: string;\n\n arguments: boolean = false;\n\n test: string | (() => string) = `${this.prefix}${this.name} arg1 arg2`;\n\n aliases: string[] = [];\n permissions?: string[] | boolean = undefined;\n admins: string[] = [];\n\n constructor(options: CommandOptions) {\n this.prefix = options.prefix ?? this.prefix;\n this.name = options.name;\n this.description = options.description ?? this.description;\n this.arguments = options.arguments ?? this.arguments;\n\n this.run = options.run;\n\n this.test = options.test ?? this.test;\n this.aliases = options.aliases ?? this.aliases;\n this.permissions = options.permissions ?? this.permissions;\n this.admins = options.admins ?? this.admins;\n\n commands.push(this);\n\n if (!(window?.client instanceof Client)) return;\n\n // Register the command in the client actions\n window?.client?.actions.commands.push(this);\n\n window?.client?.emit('action', this, 'created');\n }\n\n run(this: Client | undefined, args: string[], event: CommandEvent): void {}\n\n verify(nickname: string, roles: string[], args: string[]): boolean {\n if (this.arguments === true && (!args || !args.length)) {\n return false;\n }\n\n if (this.admins.some((a) => nickname.toLocaleLowerCase() === a.toLocaleLowerCase())) {\n return true;\n }\n\n if (\n this.permissions === true ||\n typeof this.permissions === 'undefined' ||\n (Array.isArray(this.permissions) && !this.permissions.length)\n ) {\n return true;\n }\n\n if (\n Array.isArray(this.permissions) &&\n (this.permissions.some(\n (p) =>\n nickname.toLowerCase() === p.toLowerCase() ||\n roles.map((r) => r.toLowerCase()).includes(p.toLowerCase()),\n ) ||\n this.permissions.includes('*'))\n ) {\n return true;\n }\n\n return false;\n }\n\n parse(text: string, event: CommandEvent): boolean {\n const args = text\n .replace(this.prefix, '')\n .split(' ')\n .slice(1)\n .map((a) => a.trim());\n\n var nickname: string = '';\n var roles: string[] = [];\n\n const rAliases = { bits: 'cheer', premium: 'prime' };\n\n switch (event.provider) {\n case 'twitch': {\n const data = event.data;\n\n nickname = data.event.data.nick || data.event.data.displayName;\n\n if (data.event.data.tags?.badges) {\n const tags = data.event.data.tags.badges.toString().replace(/\\/\\d+/g, '').split(',');\n\n roles = tags.map((t) => (t in rAliases ? rAliases[t as keyof typeof rAliases] : t));\n }\n\n break;\n }\n case 'youtube': {\n const data = event.data;\n\n const rMap = {\n isVerified: 'verified',\n isChatOwner: 'owner',\n isChatSponsor: 'sponsor',\n isChatModerator: 'moderator',\n };\n\n nickname = data.event.data.nick || data.event.data.displayName;\n\n roles = Object.entries(data.event.data.authorDetails)\n .filter(([k, v]) => k.startsWith('is') && v)\n .map(([k]) => rMap[k as keyof typeof rMap])\n .filter(Boolean);\n\n if (roles.includes('sponsor')) {\n roles.push('premium');\n roles.push('prime');\n }\n if (roles.includes('owner')) {\n roles.push('moderator');\n roles.push('broadcaster');\n }\n\n break;\n }\n case 'kick': {\n return false;\n\n break;\n }\n }\n\n const verify = this.verify(nickname, roles, args);\n\n if (verify === true) {\n this.run.apply(window?.client || undefined, [args, event]);\n }\n\n return verify;\n }\n\n remove(): void {\n const _index = commands.indexOf(this);\n\n if (_index > -1) {\n commands.splice(_index, 1);\n }\n\n if (!(window?.client instanceof Client)) return;\n\n const index = window?.client?.actions.commands.indexOf(this);\n\n if (index > -1) {\n window?.client?.actions.commands.splice(index, 1);\n window?.client?.emit('action', this, 'removed');\n }\n }\n\n static execute(received: CommandEvent): boolean {\n const data = received.data;\n\n try {\n if (commands.length && commands.some((c) => data.event.data.text.startsWith(c.prefix))) {\n const found = commands.filter((c) => {\n var nameAndAliases = [c.name, ...(c.aliases ?? [])];\n var commandMatch = data.event.data.text.replace(c.prefix, '').split(' ')[0];\n\n return nameAndAliases.includes(commandMatch);\n });\n\n if (found.length && found.every((command) => command instanceof Command)) {\n found.forEach((command) => {\n command.parse(data.event.data.text, received);\n\n window?.client?.emit('action', command, 'executed');\n\n logger.received(\n `Command executed: ${data.event.data.text} by ${data.event.data.nick || data.event.data.displayName}`,\n data,\n );\n });\n\n return true;\n }\n }\n } catch (error) {\n return false;\n } finally {\n return false;\n }\n }\n}\n\nexport { commands as usedCommands };\n","import { USE_SE_API } from '../main.js';\nimport { StreamElements } from '../types/index.js';\nimport { EventProvider } from './EventProvider.js';\n\ntype MessageMap = Record<string, any>;\n\ntype MessageTuple<T extends MessageMap> = {\n [K in keyof T]: [key: K, data: T[K]];\n}[keyof T];\n\ntype BaseEvents<T extends MessageMap> = {\n load: [];\n message: MessageTuple<T>;\n};\n\ntype UseCommsOptions = {\n id?: string;\n};\n\ntype UseCommItem<T extends MessageMap> = {\n nonce: string;\n key: keyof T;\n value: T[keyof T];\n timestamp: string;\n};\n\nexport const usedComms: Array<useComms<any>> = [];\n\n/**\n * A module for handling communications between different widgets inside streamelements.\n * @example\n * ```ts\n * type CommsMessages = {\n * hello: { loaded: boolean };\n * update: { value: number };\n * reload: {};\n * tags: string[];\n * }\n *\n * const comms = new useComms<CommsMessages>();\n *\n * comms.on('message', (message, data) => {\n * switch (message) {\n * case 'hello': {}\n * case 'update': {}\n * case 'reload': {}\n * case 'tags': {}\n * }\n * })\n * ```\n */\nexport class useComms<T extends MessageMap> extends EventProvider<BaseEvents<T>> {\n private SE_API: StreamElements.SE_API | null = null;\n\n public id: string = 'widget communications';\n public loaded: boolean = false;\n\n public history: Array<UseCommItem<T>> = [];\n public detected = new Set<string>();\n\n constructor(options: UseCommsOptions = {}) {\n super();\n\n this.id = options.id || this.id;\n\n usedComms.push(this);\n\n USE_SE_API?.then(async (se) => {\n this.loaded = true;\n this.SE_API = se;\n\n Promise.all([\n async () => {\n const history = await se.store.get<Array<UseCommItem<T>>>(this.id);\n\n if (history) {\n this.history = history.slice(-10);\n }\n },\n async () => {\n const detected = await se.store.get<string[]>(this.id + '_detected');\n\n if (detected) {\n this.detected = new Set(detected);\n }\n },\n ]);\n });\n }\n\n public async send<K extends keyof T>(key: K, data: T[K]) {\n if (this.SE_API) {\n // this.SE_API.store.set(this.id, { message: key, data });\n\n const message = {\n nonce: Math.random().toString(36).substring(2),\n key,\n value: data,\n timestamp: new Date().toISOString(),\n };\n\n this.history.push(message);\n\n this.SE_API.store.set(this.id, this.history);\n this.SE_API.store.set(this.id + '_detected', Array.from(this.detected));\n }\n }\n\n public update(history: Array<UseCommItem<T>>) {\n if (!history.length) {\n return;\n }\n\n this.history = history;\n\n const messages = history.filter((message) => !this.detected.has(message.nonce));\n\n messages.forEach((message) => {\n this.detected.add(message.nonce);\n\n this.emit('message', message.key, message.value);\n });\n }\n\n public override on<K extends keyof BaseEvents<T>>(\n eventName: K,\n callback: (this: useComms<T>, ...args: BaseEvents<T>[K]) => void,\n ) {\n if (eventName === 'load' && this.loaded) {\n callback.apply(this);\n\n return this;\n }\n\n super.on(eventName, callback);\n\n return this;\n }\n}\n","import { Button } from '../actions/button.js';\nimport { Command } from '../actions/command.js';\nimport { Helper } from '../helper/index.js';\nimport { Local } from '../local/index.js';\nimport { logger } from '../main.js';\nimport { usedComms } from '../modules/useComms.js';\nimport { useQueue } from '../modules/useQueue.js';\nimport { usedStorages } from '../modules/useStorage.js';\nimport { Client, ClientStorageOptions } from './client.js';\n\nif (typeof window !== undefined) {\n window.addEventListener('onWidgetLoad', async (data) => {\n const { detail } = data;\n\n if (window.client instanceof Client && client instanceof Client && !!client) {\n const client = window.client;\n\n client.fields = detail.fieldData;\n client.session = detail.session.data;\n\n client.details = {\n ...client.details,\n user: detail.channel,\n currency: detail.currency,\n overlay: detail.overlay,\n };\n\n if (detail.channel.id && !detail.emulated) {\n await fetch(`https://api.streamelements.com/kappa/v2/channels/${detail.channel.id}/`)\n .then((res) => res.json())\n .then((profile) => {\n if (profile.provider) {\n client.details.provider = profile.provider;\n\n return profile.provider;\n } else {\n client.details.provider = 'local';\n }\n })\n .catch(() => {\n client.details.provider = 'local';\n });\n } else {\n client.details.provider = 'local';\n }\n\n client.emit('load', detail);\n\n if (client.debug) {\n logger.received('Widget loaded!', data.detail);\n\n const fieldData = data.detail.fieldData;\n\n if (Object.keys(fieldData).length) logger.received('Field data:', fieldData);\n }\n\n client.loaded = true;\n\n client.storage.on('load', (data) => {\n if (client.debug && data) {\n logger.debug(\n '[Client]',\n 'Storage loaded for client',\n `\"${client.id}\";`,\n `Provider: \"${client.details.provider}\";`,\n data,\n );\n } else if (client.debug) {\n logger.debug(\n '[Client]',\n 'Storage loaded for client',\n `\"${client.id}\";`,\n `Provider: \"${client.details.provider}\";`,\n 'No data found.',\n );\n }\n\n if (data) {\n const clearExpired = <T extends Record<string, ClientStorageOptions<string>>>(\n data: T,\n ) => {\n const now = Date.now();\n const cleanedData: any = {};\n\n for (const key in data) {\n if (data.hasOwnProperty(key)) {\n const entry = data[key];\n\n if (entry.expire && entry.expire > now) {\n cleanedData[key] = entry;\n }\n }\n }\n\n return cleanedData as T;\n };\n\n const users = clearExpired(data['user'] || {});\n const avatars = clearExpired(data['avatar'] || {});\n const pronouns = clearExpired(data['pronoun'] || {});\n const emotes = clearExpired(data['emote'] || {});\n\n client.storage.update({\n user: users,\n avatar: avatars,\n pronoun: pronouns,\n emote: emotes,\n });\n }\n\n if (detail.channel.providerId.length) {\n client.storage.add(`avatar.${detail.channel.providerId.toLowerCase()}`, {\n value: detail.channel.avatar,\n timestamp: Date.now(),\n expire: Date.now() + client.cache.avatar * 60 * 1000,\n });\n }\n });\n }\n });\n\n window.addEventListener('onSessionUpdate', (data) => {\n const { detail } = data;\n\n if (window.client instanceof Client && client instanceof Client && !!client) {\n const client = window.client;\n\n client.session = detail.session;\n\n client.emit('session', detail.session);\n\n if (client.debug) {\n logger.debug('[Client]', 'Session updated', detail.session);\n }\n }\n });\n\n window.addEventListener('onEventReceived', ({ detail }) => {\n if (window.client instanceof Client && client instanceof Client && !!client) {\n const received = Helper.event.parseProvider(detail);\n\n switch (received.provider) {\n case 'streamelements': {\n const data = received.data;\n\n switch (data.listener) {\n case 'tip-latest': {\n const event = data.event;\n\n break;\n }\n case 'event:skip': {\n const event = data.event;\n\n break;\n }\n case 'event:test': {\n switch (data.event.listener) {\n case 'widget-button': {\n const event = data.event;\n\n Button.execute(event.field, event.value);\n\n break;\n }\n case 'subscriber-latest': {\n const event = data.event;\n break;\n }\n\n // ... alot more\n }\n\n break;\n }\n case 'kvstore:update': {\n const event = data.event;\n\n if (usedStorages.length) {\n var storage = usedStorages.find(\n (s) =>\n s.id === event.data.key.replace('customWidget.', '') || s.id === event.data.key,\n );\n\n if (storage) {\n // @ts-ignore\n storage.update(event.data.value);\n }\n }\n\n if (usedComms.length) {\n const comm = usedComms.find(\n (c) =>\n c.id === event.data.key.replace('customWidget.', '') || c.id === event.data.key,\n );\n\n if (comm) {\n // @ts-ignore\n comm.update(event.data.value);\n }\n }\n\n break;\n }\n case 'bot:counter': {\n const event = data.event;\n\n break;\n }\n case 'alertService:toggleSound': {\n const event = data.event;\n\n client.details.overlay.muted = Boolean(event.muted);\n\n break;\n }\n }\n\n window.client.emit('event', 'streamelements', received.data);\n\n break;\n }\n case 'twitch': {\n const data = received.data;\n\n switch (data.listener) {\n case 'delete-message': {\n const event = data.event;\n\n break;\n }\n case 'delete-messages': {\n const event = data.event;\n\n break;\n }\n case 'message': {\n const event = data.event;\n\n Command.execute({ provider: 'twitch', data: data });\n\n break;\n }\n case 'follower-latest': {\n const event = data.event;\n\n break;\n }\n case 'cheer-latest': {\n const event = data.event;\n\n break;\n }\n case 'subscriber-latest': {\n if (!data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\n // normal\n const event = data.event;\n } else if (\n data.event.gifted &&\n !data.event.bulkGifted &&\n !data.event.isCommunityGift\n ) {\n // gift\n const event = data.event;\n } else if (\n data.event.gifted &&\n !data.event.bulkGifted &&\n data.event.isCommunityGift\n ) {\n // community gift spam\n const event = data.event;\n } else if (\n !data.event.gifted &&\n data.event.bulkGifted &&\n !data.event.isCommunityGift\n ) {\n // community gift\n const event = data.event;\n }\n\n break;\n }\n case 'raid-latest': {\n const event = data.event;\n\n break;\n }\n }\n\n window.client.emit('event', 'twitch', received.data);\n\n break;\n }\n case 'youtube': {\n const data = received.data;\n\n switch (data.listener) {\n case 'message': {\n const event = data.event;\n\n Command.execute({ provider: 'youtube', data: data });\n\n break;\n }\n case 'subscriber-latest': {\n const event = data.event;\n\n break;\n }\n case 'sponsor-latest': {\n const event = data.event;\n\n if (!data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\n // normal\n const event = data.event;\n } else if (\n data.event.gifted &&\n !data.event.bulkGifted &&\n !data.event.isCommunityGift\n ) {\n // gift\n const event = data.event;\n } else if (\n data.event.gifted &&\n !data.event.bulkGifted &&\n data.event.isCommunityGift\n ) {\n // community gift spam\n const event = data.event;\n } else if (\n !data.event.gifted &&\n data.event.bulkGifted &&\n !data.event.isCommunityGift\n ) {\n // community gift\n const event = data.event;\n }\n\n break;\n }\n case 'superchat-latest': {\n const event = data.event;\n\n break;\n }\n }\n\n window.client.emit('event', 'youtube', received.data);\n\n break;\n }\n case 'kick': {\n const data = received.data;\n\n window.client.emit('event', 'kick', received.data);\n\n break;\n }\n case 'facebook': {\n const data = received.data;\n\n window.client.emit('event', 'facebook', received.data);\n\n break;\n }\n }\n\n const excludeListeners: Array<(typeof received.data)['listener']> = [\n 'bot:counter',\n 'alertService:toggleSound',\n 'event',\n 'event:skip',\n 'event:test',\n 'kvstore:update',\n ];\n\n if (client.debug && !excludeListeners.some((e) => e === received.data.listener)) {\n logger.received(\n '[Client]',\n `Event ${received.data.listener} received from ${received.provider}`,\n received.data.event,\n );\n }\n }\n });\n}\n","import { Client } from '../client/client.js';\nimport { logger } from '../main.js';\nimport { EventProvider } from './EventProvider.js';\n\ntype QueueEvents<T> = {\n load: [];\n cancel: [];\n update: [\n queue: QueueItem<T>[],\n priorityQueue: QueueItem<T>[],\n history: QueueItem<T>[],\n timeouts: Array<ReturnType<typeof setTimeout>>,\n ];\n process: [item: QueueItem<T>, queue: useQueue<T>];\n};\n\ntype QueueProps = {\n isoDate: string;\n isLoop: boolean;\n isPriority: boolean;\n isImmediate: boolean;\n};\n\ntype QueueItem<T> = { value: T } & QueueProps;\n\ntype QueueProcessor<T> = (this: useQueue<T>, item: T, queue: useQueue<T>) => Promise<any>;\n\ntype QueueDuration = number | boolean | undefined;\n\ninterface QueueOptions<T> {\n /**\n * Duration between processing each item in milliseconds. Set to `0` or `false` for immediate processing.\n */\n duration?: QueueDuration | 'client';\n /**\n * Function to process each item in the queue.\n */\n processor: QueueProcessor<T>;\n}\n\n/**\n * A utility class to manage a queue of items with support for priority, looping, and immediate processing.\n * @template T - The type of items in the queue.\n * @extends EventProvider<QueueEvents<T>>\n * @example\n * ```javascript\n * const myQueue = new useQueue({\n * duration: 1000,\n * processor: async function (item) {\n * console.log('Processing item:', item);\n * },\n * });\n *\n * myQueue.enqueue('Item 1');\n * myQueue.enqueue('Item 2', { isPriority: true });\n * ```\n */\nexport class useQueue<T> extends EventProvider<QueueEvents<T>> {\n queue: QueueItem<T>[] = [];\n priorityQueue: QueueItem<T>[] = [];\n history: QueueItem<T>[] = [];\n\n private timeouts: Array<ReturnType<typeof setTimeout>> = [];\n\n public running: boolean = false;\n\n public duration: QueueDuration = undefined;\n\n private loaded: boolean = false;\n\n public processor!: QueueProcessor<T>;\n\n private readonly clientWaitRetryDelay = 50;\n\n constructor(options: QueueOptions<T>) {\n super();\n\n if (!options.processor || typeof options.processor !== 'function') {\n throw new Error('A valid processor function must be provided to useQueue.');\n }\n\n this.processor = options.processor;\n\n if (options.duration !== 'client') this.duration = options.duration ?? 0;\n\n this.waitForClientAndBindLoad(options.duration);\n }\n\n private waitForClientAndBindLoad(\n duration: QueueDuration | 'client' = this.duration,\n callback?: () => void,\n ) {\n if (!(window?.client instanceof Client)) {\n setTimeout(\n () => this.waitForClientAndBindLoad(duration, callback),\n this.clientWaitRetryDelay,\n );\n\n return;\n }\n\n window.client.on('load', () => {\n if (duration === 'client')\n this.duration = (window?.client?.fields?.widgetDuration ?? 0) as number;\n\n this.emit('load');\n\n this.loaded = true;\n if (callback) callback();\n });\n }\n\n /**\n * Enqueue an item or multiple items into the queue with optional processing options.\n * @param value - The item or items to be enqueued. Can be a single value of type T or an array of objects containing the value and options.\n * @param options - Optional processing options for the item(s) being enqueued. Ignored if an array of items is provided, as each item can have its own options.\n * @returns The instance of the queue for chaining.\n * @example\n * ```javascript\n * myQueue.enqueue('Single Item', { isPriority: true });\n * myQueue.enqueue([\n * { value: 'Item 1', options: { isPriority: true } },\n * { value: 'Item 2', options: { isLoop: true } }\n * ]);\n * ```\n */\n public enqueue(value: T, options?: Partial<QueueProps>): this;\n public enqueue(items: { value: T; options?: Partial<QueueProps> }[]): this;\n public enqueue(\n valueOrItems: T | { value: T; options?: Partial<QueueProps> }[],\n options: Partial<QueueProps> = {},\n ): this {\n const hadItems = this.hasItems();\n\n const entries: { value: T; options: Partial<QueueProps> }[] = Array.isArray(valueOrItems)\n ? valueOrItems.map((entry) => ({ value: entry.value, options: entry.options ?? {} }))\n : [{ value: valueOrItems as T, options }];\n\n for (const entry of entries) {\n const item: QueueItem<T> = {\n isoDate: new Date().toISOString(),\n isLoop: entry.options?.isLoop ?? false,\n isPriority: entry.options?.isPriority ?? false,\n isImmediate: entry.options?.isImmediate ?? false,\n value: entry.value,\n };\n\n if (item.isPriority && item.isImmediate) {\n this.cancel();\n this.priorityQueue.unshift(item);\n } else {\n const targetQueue = item.isPriority ? this.priorityQueue : this.queue;\n\n targetQueue.push(item);\n }\n }\n\n // Always process immediately if it's not running and the queue was empty before\n if (this.running === false && hadItems === false) {\n this.run();\n }\n\n this.emit('update', this.queue, this.priorityQueue, this.history, this.timeouts);\n\n return this;\n }\n\n private async run() {\n if (!this.hasItems()) {\n this.running = false;\n return;\n }\n\n this.running = true;\n\n await this.next();\n\n if (typeof this.duration === 'number' && this.duration > 0) {\n this.timeouts.push(setTimeout(() => this.run(), this.duration));\n } else if (this.duration === 0 || (this.duration !== -1 && this.duration !== false)) {\n this.run();\n }\n }\n\n private async next() {\n const nextItem =\n this.priorityQueue.length > 0 ? this.priorityQueue.shift() : this.queue.shift();\n\n if (!nextItem) {\n this.running = false;\n\n return;\n }\n\n try {\n await this.processor.apply(this, [nextItem.value, this]);\n\n this.emit('process', nextItem, this);\n } catch (error) {\n logger.error(\n `Error during item processing: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n this.history.push(nextItem);\n\n const targetQueue = nextItem.isPriority ? this.priorityQueue : this.queue;\n\n if (nextItem.isLoop) targetQueue.push(nextItem);\n }\n\n /**\n * Resume processing the queue if it is paused. If the queue is already running, it will be restarted, which can be useful if new items have been added or if you want to reset the processing timer.\n * If the queue was empty before, it will start processing immediately.\n * @returns - The instance of the queue for chaining.\n * @example\n * ```javascript\n * myQueue.resume();\n * ```\n */\n public resume() {\n if (this.running) {\n this.cancel();\n }\n\n if (this.hasItems()) this.run();\n\n return this;\n }\n\n /**\n * Update the queue's state with new values. This can be used to replace the current queue, priority queue, history, or timeouts with new data. If the queue is not currently running and there are items in the queue after the update, it will start processing immediately.\n * @param save - An object containing the new state for the queue, priority queue, history, and timeouts. Each property is optional, and if not provided, the current state will be retained.\n * @returns - The instance of the queue for chaining.\n * @example\n * ```javascript\n * myQueue.update({\n * queue: newQueueItems,\n * priorityQueue: newPriorityItems,\n * history: newHistory,\n * });\n * ```\n */\n public update(save: Partial<useQueue<T>>): this {\n this.queue = save.queue ?? this.queue;\n this.priorityQueue = save.priorityQueue ?? this.priorityQueue;\n this.history = save.history ?? this.history;\n\n if (this.hasItems() && this.running === false) {\n window.client?.on('load', () => this.run());\n }\n\n return this;\n }\n\n /**\n * Cancel all pending timeouts and stop the queue from processing further items. This will clear any scheduled processing and prevent any new items from being processed until `resume()` is called again. The current state of the queue, priority queue, and history will be retained, allowing you to resume processing later without losing any data.\n */\n public cancel() {\n if (this.running) {\n this.timeouts.forEach((timeout) => clearTimeout(timeout));\n this.timeouts = [];\n this.running = false;\n\n this.emit('cancel');\n }\n }\n\n /**\n * Check if there are any items in the queue or priority queue. This method returns `true` if there are items waiting to be processed in either the main queue or the priority queue, and `false` if both queues are empty.\n * @returns - A boolean indicating whether there are items in the queue or priority queue.\n */\n public hasItems(): boolean {\n return this.queue.length > 0 || this.priorityQueue.length > 0;\n }\n\n public override on<K extends keyof QueueEvents<T>>(\n eventName: K,\n callback: (this: useQueue<T>, ...args: QueueEvents<T>[K]) => void,\n ): this {\n if (eventName === 'load' && this.loaded) {\n callback.apply(this);\n\n return this;\n }\n\n super.on(eventName, callback);\n\n return this;\n }\n}\n","import { Client } from '../client/client.js';\nimport { Data } from '../data/index.js';\nimport { BadgeOptions } from '../helper/classes/message.js';\nimport { Helper } from '../helper/index.js';\nimport { logger } from '../main.js';\nimport { useQueue } from '../modules/useQueue.js';\nimport { Twitch } from '../types.js';\nimport type { ClientEvents, Provider } from '../types/client.js';\nimport { MapNumberValuesToString } from '../types/path.js';\nimport { StreamElements } from '../types/streamelements/main.js';\n\nexport namespace Local {\n export type QueueItem =\n | { listener: 'onEventReceived'; data: StreamElements.Event.onEventReceived; session?: boolean }\n | { listener: 'onWidgetLoad'; data: StreamElements.Event.onWidgetLoad }\n | { listener: 'onSessionUpdate'; data: StreamElements.Event.onSessionUpdate };\n\n export const queue = new useQueue<QueueItem>({\n duration: 'client',\n processor: async function processor(received) {\n window.dispatchEvent(new CustomEvent(received.listener, { detail: received.data }));\n\n if (received.listener === 'onEventReceived' && received.session) {\n const sessionEvent = await Local.generate.event.onSessionUpdate(\n window?.client && window?.client instanceof Client ? window.client.session : undefined,\n Helper.event.parseProvider(received.data),\n );\n\n window.dispatchEvent(new CustomEvent('onSessionUpdate', { detail: sessionEvent }));\n }\n },\n });\n\n export const generate = {\n session: {\n types: {\n name: { type: 'string', options: Data.names.filter((e) => e.length) },\n tier: { type: 'string', options: Data.tiers.filter((e) => e.length) },\n message: { type: 'string', options: Data.normal_messages.filter((e) => e.length) },\n item: { type: 'array', options: Data.items },\n avatar: { type: 'string', options: Data.avatars.filter((e) => e.length) },\n } as Record<string, StreamElements.Session.Config.Any>,\n\n available(): StreamElements.Session.Config.Available.Data {\n const types = this.types;\n\n return {\n follower: {\n latest: { name: types.name },\n session: { count: { type: 'int', min: 50, max: 200 } },\n week: { count: { type: 'int', min: 200, max: 1000 } },\n month: { count: { type: 'int', min: 1000, max: 3000 } },\n goal: { amount: { type: 'int', min: 3000, max: 7000 } },\n total: { count: { type: 'int', min: 7000, max: 10000 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: { name: types.name, createdAt: { type: 'date', range: 400 } },\n },\n },\n subscriber: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n tier: types.tier,\n message: types.message,\n },\n 'new-latest': {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n message: types.message,\n },\n 'resub-latest': {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n message: types.message,\n },\n 'gifted-latest': {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n message: types.message,\n tier: types.tier,\n sender: types.name,\n },\n session: { count: { type: 'int', min: 10, max: 40 } },\n 'new-session': { count: { type: 'int', min: 10, max: 40 } },\n 'resub-session': { count: { type: 'int', min: 10, max: 40 } },\n 'gifted-session': { count: { type: 'int', min: 10, max: 40 } },\n week: { count: { type: 'int', min: 40, max: 100 } },\n month: { count: { type: 'int', min: 100, max: 200 } },\n goal: { amount: { type: 'int', min: 200, max: 300 } },\n total: { count: { type: 'int', min: 300, max: 400 } },\n points: { amount: { type: 'int', min: 100, max: 400 } },\n 'alltime-gifter': { name: types.name, amount: { type: 'int', min: 300, max: 400 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n tier: types.tier,\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n host: {\n latest: { name: types.name, amount: { type: 'int', min: 1, max: 10 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 1, max: 10 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n raid: {\n latest: { name: types.name, amount: { type: 'int', min: 0, max: 100 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n charityCampaignDonation: {\n latest: { name: types.name, amount: { type: 'int', min: 50, max: 150 } },\n 'session-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 50, max: 200 },\n },\n 'weekly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 200, max: 500 },\n },\n 'monthly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 800 },\n },\n 'alltime-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 800, max: 1000 },\n },\n 'session-top-donator': { name: types.name, amount: { type: 'int', min: 50, max: 200 } },\n 'weekly-top-donator': { name: types.name, amount: { type: 'int', min: 200, max: 500 } },\n 'monthly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 800 },\n },\n 'alltime-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 800, max: 1000 },\n },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 50, max: 150 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n cheer: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 200, max: 800 },\n message: types.message,\n },\n 'session-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 200, max: 1000 },\n },\n 'weekly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 5000 },\n },\n 'monthly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 5000, max: 12000 },\n },\n 'alltime-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 12000, max: 20000 },\n },\n 'session-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 200, max: 1000 },\n },\n 'weekly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 5000 },\n },\n 'monthly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 5000, max: 12000 },\n },\n 'alltime-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 12000, max: 20000 },\n },\n session: { amount: { type: 'int', min: 200, max: 1000 } },\n week: { amount: { type: 'int', min: 1000, max: 5000 } },\n month: { amount: { type: 'int', min: 5000, max: 12000 } },\n goal: { amount: { type: 'int', min: 12000, max: 18000 } },\n total: { amount: { type: 'int', min: 18000, max: 20000 } },\n count: { count: { type: 'int', min: 200, max: 1000 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 200, max: 800 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n cheerPurchase: {\n latest: { name: types.name, amount: { type: 'int', min: 200, max: 400 } },\n 'session-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 200, max: 400 },\n },\n 'weekly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 400, max: 800 },\n },\n 'monthly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 800, max: 1500 },\n },\n 'alltime-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 1500, max: 2000 },\n },\n 'session-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 200, max: 400 },\n },\n 'weekly-top-donator': { name: types.name, amount: { type: 'int', min: 400, max: 800 } },\n 'monthly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 800, max: 1500 },\n },\n 'alltime-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 1500, max: 2000 },\n },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 200, max: 400 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n superchat: {\n latest: { name: types.name, amount: { type: 'int', min: 100, max: 400 } },\n 'session-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 100, max: 500 },\n },\n 'weekly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 1000 },\n },\n 'monthly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 2000 },\n },\n 'alltime-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 2000, max: 2500 },\n },\n 'session-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 100, max: 500 },\n },\n 'weekly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 1000 },\n },\n 'monthly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 2000 },\n },\n 'alltime-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 2000, max: 2500 },\n },\n session: { amount: { type: 'int', min: 100, max: 500 } },\n week: { amount: { type: 'int', min: 500, max: 1000 } },\n month: { amount: { type: 'int', min: 1000, max: 2000 } },\n goal: { amount: { type: 'int', min: 2000, max: 2300 } },\n total: { amount: { type: 'int', min: 2300, max: 2500 } },\n count: { count: { type: 'int', min: 100, max: 500 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 100, max: 400 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n hypetrain: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n active: { type: 'int', min: 0, max: 1 },\n level: { type: 'int', min: 5, max: 10 },\n levelChanged: { type: 'int', min: 0, max: 5 },\n _type: { type: 'array', options: ['follower', 'subscriber', 'cheer', 'donation'] },\n },\n 'level-goal': { amount: { type: 'int', min: 0, max: 100 } },\n 'level-progress': {\n amount: { type: 'int', min: 0, max: 100 },\n percent: { type: 'int', min: 0, max: 100 },\n },\n total: { amount: { type: 'int', min: 0, max: 100 } },\n 'latest-top-contributors': { type: 'recent', amount: 25, value: { name: types.name } },\n },\n 'channel-points': {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n message: types.message,\n redemption: { type: 'array', options: ['Reward 1', 'Reward 2', 'Reward 3'] },\n },\n },\n tip: {\n latest: { name: types.name, amount: { type: 'int', min: 100, max: 400 } },\n 'session-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 100, max: 500 },\n },\n 'weekly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 1000 },\n },\n 'monthly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 2000 },\n },\n 'alltime-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 2000, max: 2500 },\n },\n 'session-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 100, max: 500 },\n },\n 'weekly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 1000 },\n },\n 'monthly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 2000 },\n },\n 'alltime-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 2000, max: 2500 },\n },\n session: { amount: { type: 'int', min: 100, max: 500 } },\n week: { amount: { type: 'int', min: 500, max: 1000 } },\n month: { amount: { type: 'int', min: 1000, max: 2000 } },\n goal: { amount: { type: 'int', min: 2000, max: 2300 } },\n total: { amount: { type: 'int', min: 2300, max: 2500 } },\n count: { count: { type: 'int', min: 100, max: 500 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 100, max: 400 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n merch: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n items: types.item,\n },\n 'goal-orders': { amount: { type: 'int', min: 0, max: 100 } },\n 'goal-items': { amount: { type: 'int', min: 0, max: 100 } },\n 'goal-total': { amount: { type: 'int', min: 0, max: 100 } },\n recent: { type: 'recent', amount: 25, value: { name: types.name } },\n },\n purchase: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n items: types.item,\n avatar: types.avatar,\n message: types.message,\n },\n },\n };\n },\n\n async get(startSession?: StreamElements.Session.Data): Promise<StreamElements.Session.Data> {\n const available = this.available();\n\n if (startSession) return startSession;\n\n const generate = (\n available:\n | StreamElements.Session.Config.Available.Data\n | StreamElements.Session.Config.Available.Category\n | StreamElements.Session.Config.Any,\n ): any => {\n const generateRecentData = (config: StreamElements.Session.Config.Any): Array<any> => {\n if (!config || !('amount' in config)) return [];\n\n const items: Array<{ createdAt: string }> = [];\n\n for (let i = 0; i < config.amount; i++) {\n items.push(generate(config.value));\n }\n\n return items.sort(\n (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),\n );\n };\n\n const generateObjectData = (config: Record<string, any>): Record<string, any> => {\n const result: Record<string, any> = {};\n\n for (const key in config) {\n const processedKey = key.replace('_type', 'type');\n\n result[processedKey] = generate(config[key]);\n }\n\n return result;\n };\n\n const processTypedConfig = (config: StreamElements.Session.Config.Any): any => {\n if (!config) return config;\n\n switch (config.type) {\n case 'int':\n return Helper.random.number(config.min, config.max);\n case 'string':\n return Helper.random.array(config.options)[0];\n case 'date':\n return Helper.random.daysOffset(config.range);\n case 'array':\n return Helper.random.array(config.options)[0];\n case 'recent':\n return generateRecentData(config);\n default:\n return config;\n }\n };\n\n // Main generation logic\n\n // Handle primitive values (non-objects)\n if (typeof available !== 'object' || available === null) {\n return available;\n }\n\n // Handle typed configurations (objects with a 'type' property)\n if ('type' in available && typeof available.type === 'string') {\n return processTypedConfig(available);\n }\n\n // Handle generic objects - recursively process each property\n return generateObjectData(available);\n };\n\n var session: StreamElements.Session.Data = Object.entries(generate(available)).reduce(\n (acc, [key, value]) => {\n Object.entries(value as any).forEach(\n ([subKey, subValue]) =>\n //\n (acc[`${key}-${subKey}`] = subValue),\n );\n\n return acc;\n },\n {} as Record<string, any>,\n ) as StreamElements.Session.Data;\n\n return session;\n },\n },\n event: {\n /**\n * Simulates the onWidgetLoad event for a widget.\n * @param fields - The field values to be included in the event.\n * @param session - The session data to be included in the event.\n * @param currency - The currency to be used (default is 'USD').\n * @returns A Promise that resolves to the simulated onWidgetLoad event data.\n */\n async onWidgetLoad(\n fields: Record<string, StreamElements.CustomField.Value>,\n session: StreamElements.Session.Data,\n currency: 'BRL' | 'USD' | 'EUR' = 'USD',\n ): Promise<StreamElements.Event.onWidgetLoad> {\n const currencies = {\n BRL: { code: 'BRL', name: 'Brazilian Real', symbol: 'R$' },\n USD: { code: 'USD', name: 'US Dollar', symbol: '$' },\n EUR: { code: 'EUR', name: 'Euro', symbol: '€' },\n };\n\n return {\n channel: {\n username: 'local',\n apiToken: '',\n id: '',\n providerId: '',\n avatar: '',\n },\n currency: currencies[currency] ?? currencies.USD,\n fieldData: fields,\n recents: [],\n session: {\n data: session,\n settings: {\n autoReset: false,\n calendar: false,\n resetOnStart: false,\n },\n },\n overlay: {\n isEditorMode: true,\n muted: false,\n },\n emulated: true,\n };\n },\n /**\n * Simulates the onSessionUpdate event for a widget.\n * @param session - The session data to be included in the event.\n * @returns A Promise that resolves to the simulated onSessionUpdate event data.\n */\n async onSessionUpdate(\n session?: StreamElements.Session.Data,\n update?: ClientEvents,\n ): Promise<StreamElements.Event.onSessionUpdate> {\n session ??= await Local.generate.session.get();\n\n if (update) {\n const orderByDateDesc = (a: { createdAt: string }, b: { createdAt: string }) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();\n\n switch (update.provider) {\n case 'twitch': {\n const data = update.data;\n\n switch (data.listener) {\n case 'cheer-latest': {\n const amount = data.event.amount;\n const name = data.event.displayName ?? data.event.name;\n const message = data.event.message;\n\n session['cheer-latest'] = { name, amount, message };\n\n const update = (type: 'session' | 'weekly' | 'monthly' | 'alltime' | 'all') => {\n if (type === 'all') {\n update('alltime');\n update('monthly');\n update('weekly');\n update('session');\n\n return;\n }\n\n const topDonation = session[`cheer-${type}-top-donation`];\n\n if (topDonation && amount > topDonation.amount) {\n topDonation.amount = amount;\n topDonation.name = name;\n }\n\n const topDonator = session[`cheer-${type}-top-donator`];\n\n const donatorCurrent = session['cheer-recent']\n .filter((e) => e.name.toLowerCase() === topDonator.name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n const donatorNew = session['cheer-recent']\n .filter((e) => e.name.toLowerCase() === name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n if (donatorNew > donatorCurrent) {\n topDonator.amount = donatorNew;\n topDonator.name = name;\n }\n };\n\n update('all');\n\n session['cheer-session'].amount += amount;\n session['cheer-week'].amount += amount;\n session['cheer-month'].amount += amount;\n session['cheer-total'].amount += amount;\n session['cheer-count'].count += 1;\n session['cheer-goal'].amount += amount;\n session['cheer-recent'].unshift({\n name: name,\n amount: amount,\n createdAt: new Date().toISOString(),\n });\n session['cheer-recent'] = (session['cheer-recent'] || []).sort(orderByDateDesc);\n\n break;\n }\n case 'follower-latest': {\n const name = data.event.displayName ?? data.event.name;\n\n session['follower-latest'].name = name;\n\n session['follower-session'].count += 1;\n session['follower-week'].count += 1;\n session['follower-month'].count += 1;\n session['follower-total'].count += 1;\n session['follower-goal'].amount += 1;\n session['follower-recent'].unshift({\n name: name,\n createdAt: new Date().toISOString(),\n });\n session['follower-recent'] = (session['follower-recent'] || []).sort(\n orderByDateDesc,\n );\n\n break;\n }\n case 'subscriber-latest': {\n const name = data.event.displayName ?? data.event.name;\n const amount = data.event.amount;\n const tier = data.event.tier;\n const message = data.event.message;\n\n session['subscriber-latest'] = { name, amount, tier, message: message ?? '' };\n\n if (\n !session['subscriber-recent'].find(\n (e) => e.name.toLowerCase() === name.toLowerCase(),\n )\n ) {\n session['subscriber-new-latest'] = { name, amount, message: message ?? '' };\n session['subscriber-new-session'].count += 1;\n } else if (amount > 1) {\n session['subscriber-resub-latest'] = { name, amount, message: message ?? '' };\n session['subscriber-resub-session'].count += 1;\n }\n\n if (!data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\n // normal\n } else if (\n data.event.gifted &&\n !data.event.bulkGifted &&\n !data.event.isCommunityGift\n ) {\n const sender = data.event.sender;\n // gift\n session['subscriber-gifted-latest'] = {\n name,\n amount,\n tier,\n message: message ?? '',\n sender,\n };\n session['subscriber-gifted-session'].count += 1;\n\n session['subscriber-alltime-gifter'] = { name: sender, amount };\n } else if (\n data.event.gifted &&\n !data.event.bulkGifted &&\n data.event.isCommunityGift\n ) {\n // community gift spam\n } else if (\n !data.event.gifted &&\n data.event.bulkGifted &&\n !data.event.isCommunityGift\n ) {\n // community gift\n }\n\n session['subscriber-session'].count += amount;\n session['subscriber-week'].count += amount;\n session['subscriber-month'].count += amount;\n session['subscriber-total'].count += amount;\n session['subscriber-goal'].amount += amount;\n session['subscriber-points'].amount += amount;\n\n session['subscriber-recent'].unshift({\n name: name,\n amount: amount,\n tier: tier,\n createdAt: new Date().toISOString(),\n });\n session['subscriber-recent'] = (session['subscriber-recent'] || []).sort(\n orderByDateDesc,\n );\n\n break;\n }\n case 'raid-latest': {\n const name = data.event.displayName ?? data.event.name;\n const amount = data.event.amount;\n\n session['raid-latest'] = { name, amount };\n\n session['raid-recent'].unshift({\n name: name,\n amount: amount,\n createdAt: new Date().toISOString(),\n });\n session['raid-recent'] = (session['raid-recent'] || []).sort(orderByDateDesc);\n break;\n }\n }\n\n break;\n }\n\n case 'youtube': {\n const data = update.data;\n\n switch (data.listener) {\n case 'superchat-latest': {\n const name = data.event.displayName ?? data.event.name;\n const amount = data.event.amount;\n\n session['superchat-latest'] = {\n name: name.toLowerCase(),\n displayName: name,\n amount,\n _id: Helper.random.uuid(),\n sessionTop: false,\n type: 'superchat',\n originalEventName: 'superchat-latest',\n providerId: '',\n avatar: '',\n };\n\n const update = (type: 'session' | 'weekly' | 'monthly' | 'alltime' | 'all') => {\n if (type === 'all') {\n update('alltime');\n update('monthly');\n update('weekly');\n update('session');\n\n return;\n }\n\n const topDonation = session[`superchat-${type}-top-donation`];\n\n if (topDonation && amount > topDonation.amount) {\n topDonation.amount = amount;\n topDonation.name = name;\n }\n\n const topDonator = session[`superchat-${type}-top-donator`];\n\n const donatorCurrent = session['superchat-recent']\n .filter((e) => e.name.toLowerCase() === topDonator.name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n const donatorNew = session['superchat-recent']\n .filter((e) => e.name.toLowerCase() === name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n if (donatorNew > donatorCurrent) {\n topDonator.amount = donatorNew;\n topDonator.name = name;\n }\n };\n\n update('all');\n\n session['superchat-session'].amount += amount;\n session['superchat-week'].amount += amount;\n session['superchat-month'].amount += amount;\n session['superchat-total'].amount += amount;\n session['superchat-count'].count += 1;\n session['superchat-goal'].amount += amount;\n session['superchat-recent'].unshift({\n name: name.toLowerCase(),\n displayName: name,\n amount: amount,\n _id: Helper.random.uuid(),\n sessionTop: false,\n type: 'superchat',\n originalEventName: 'superchat-latest',\n avatar: '',\n providerId: '',\n });\n // session['superchat-recent'] = (session['superchat-recent'] || []).sort(orderByDateDesc);\n\n break;\n }\n }\n\n break;\n }\n\n case 'streamelements': {\n const data = update.data;\n\n switch (data.listener) {\n case 'tip-latest': {\n const name = data.event.displayName ?? data.event.name;\n const amount = data.event.amount;\n\n session['tip-latest'] = { name, amount };\n\n const update = (type: 'session' | 'weekly' | 'monthly' | 'alltime' | 'all') => {\n if (type === 'all') {\n update('alltime');\n update('monthly');\n update('weekly');\n update('session');\n\n return;\n }\n\n const topDonation = session[`tip-${type}-top-donation`];\n\n if (topDonation && amount > topDonation.amount) {\n topDonation.amount = amount;\n topDonation.name = name;\n }\n\n const topDonator = session[`tip-${type}-top-donator`];\n\n const donatorCurrent = session['tip-recent']\n .filter((e) => e.name.toLowerCase() === topDonator.name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n const donatorNew = session['tip-recent']\n .filter((e) => e.name.toLowerCase() === name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n if (donatorNew > donatorCurrent) {\n topDonator.amount = donatorNew;\n topDonator.name = name;\n }\n };\n\n update('all');\n\n session['tip-session'].amount += amount;\n session['tip-week'].amount += amount;\n session['tip-month'].amount += amount;\n session['tip-total'].amount += amount;\n session['tip-count'].count += 1;\n session['tip-goal'].amount += amount;\n session['tip-recent'].unshift({\n name: name,\n amount: amount,\n createdAt: new Date().toISOString(),\n });\n session['tip-recent'] = (session['tip-recent'] || []).sort(orderByDateDesc);\n\n break;\n }\n case 'event:test': {\n break;\n }\n }\n\n break;\n }\n }\n }\n\n return { session, emulated: true };\n },\n /**\n * Simulates the onEventReceived event for a widget.\n * @param provider - The provider of the event (default is 'random').\n * @param type - The type of event to simulate (default is 'random').\n * @param options - Additional options to customize the event data.\n * @returns A Promise that resolves to the simulated onEventReceived event data, or null if the event type is not supported.\n * @example\n * ```javascript\n * // Simulate a random event\n * const randomEvent = await Local .generate.event.onEventReceived();\n *\n * // Simulate a Twitch message event with custom options\n * const twitchMessageEvent = await Local .generate.event.onEventReceived('twitch', 'message', { name: 'Streamer', message: 'Hello World!' });\n * ```\n */\n async onEventReceived(\n provider: Provider | 'random' = 'random',\n type:\n | StreamElements.Event.onEventReceived['listener']\n | 'random'\n | 'tip'\n | 'cheer'\n | 'follower'\n | 'raid'\n | 'subscriber' = 'random',\n options: Record<string, string | number | boolean> = {},\n ): Promise<StreamElements.Event.onEventReceived | null> {\n const available: Record<Provider, string[]> = {\n twitch: [\n 'message',\n 'follower-latest',\n 'cheer-latest',\n 'raid-latest',\n 'subscriber-latest',\n ],\n streamelements: ['tip-latest'],\n youtube: ['message', 'superchat-latest', 'subscriber-latest', 'sponsor-latest'],\n kick: [],\n facebook: [],\n };\n\n switch (provider) {\n default:\n case 'random': {\n var randomProvider = Helper.random.array(\n Object.keys(available).filter((e) => available[e as Provider].length),\n )[0] as Provider;\n var randomEvent = Helper.random.array(\n available[randomProvider],\n )[0] as StreamElements.Event.onEventReceived['listener'];\n\n return this.onEventReceived(randomProvider, randomEvent);\n }\n\n case 'twitch': {\n switch (\n type as\n | StreamElements.Event.Provider.Twitch.Events['listener']\n | 'random'\n | 'cheer'\n | 'follower'\n | 'raid'\n | 'subscriber'\n ) {\n default:\n case 'random': {\n var randomEvent = Helper.random.array(\n available[provider],\n )[0] as StreamElements.Event.onEventReceived['listener'];\n\n return this.onEventReceived(provider, randomEvent);\n }\n case 'message': {\n const data = options as Partial<{\n name: string;\n message: string;\n badges: BadgeOptions;\n color: string;\n userId: string;\n msgId: string;\n channel: string;\n time: number;\n firstMsg: boolean;\n returningChatter: boolean;\n reply: {\n msgId: string;\n userId: string;\n login: string;\n name: string;\n text: string;\n };\n thread: {\n msgId: string;\n name: string;\n };\n }>;\n\n var name = data?.name ?? Helper.random.array(Data.names.filter((e) => e.length))[0];\n var message =\n data?.message ??\n Helper.random.array(\n [...Data.twitch_messages, ...Data.normal_messages].filter((e) => e.length),\n )[0];\n\n var badges = await Helper.message.generateBadges(data?.badges ?? [], provider);\n\n var emotes = Helper.message.findEmotesInText(message);\n var renderedText = Helper.message.replaceEmotesWithHTML(message, emotes);\n\n var color = (data?.color as string) ?? Helper.random.color('hex');\n var userId = (data?.userId as string) ?? Helper.random.string(16);\n var msgId = (data?.msgId as string) ?? Helper.random.string(16);\n var time = (data?.time as number) ?? Date.now();\n\n var channel =\n (data?.channel as string) ?? window?.client?.details?.user?.username ?? 'local';\n\n var reply = data?.reply\n ? ({\n 'reply-parent-display-name': data.reply.name,\n 'reply-parent-msg-body': data.reply.text,\n 'reply-parent-msg-id': data.reply.msgId,\n 'reply-parent-user-id': data.reply.userId,\n 'reply-parent-user-login': data.reply.name.toLowerCase(),\n } satisfies Partial<Twitch.IRC>)\n : {};\n\n var thread = data?.thread\n ? ({\n 'reply-thread-parent-msg-id': data.thread.msgId,\n 'reply-thread-parent-user-login': data.thread.name.toLowerCase(),\n } satisfies Partial<Twitch.IRC>)\n : {};\n\n var roles = {\n vip: badges.keys.includes('vip') ? '' : undefined,\n subscriber: badges.keys.includes('subscriber') ? '1' : '0',\n mod: badges.keys.includes('moderator') ? '1' : '0',\n turbo: badges.keys.includes('turbo') ? '1' : '0',\n } as const;\n\n const event: StreamElements.Event.Provider.Twitch.Message = {\n listener: 'message',\n event: {\n service: provider,\n data: {\n time: time,\n tags: {\n 'badge-info': `${badges.keys.map((key) => `${key}/${badges.amount[key] ?? Helper.random.number(1, 5)}`).join(',')}`,\n 'badges': badges.keys.map((key) => `${key}/1`).join(','),\n\n ...roles,\n\n 'tmi-sent-ts': time.toString(),\n 'room-id': Helper.random.string(9, 'numbers'),\n\n 'user-id': userId,\n 'user-type': '',\n\n color: color,\n 'display-name': name,\n emotes: '',\n\n 'client-nonce': Helper.random.string(16),\n flags: '',\n id: msgId,\n 'first-msg': data?.firstMsg ? '1' : '0',\n 'returning-chatter': data?.returningChatter ? '1' : '0',\n\n ...reply,\n ...thread,\n },\n nick: name.toLowerCase(),\n displayName: name,\n displayColor: color,\n channel: channel,\n text: message,\n isAction: false,\n userId: userId,\n msgId: msgId,\n badges: badges.badges,\n emotes: emotes,\n },\n renderedText: renderedText,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'cheer':\n case 'cheer-latest': {\n var amount = (options?.amount as number) ?? Helper.random.number(100, 10000);\n var avatar = (options?.avatar as string) ?? Helper.random.array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n Helper.random.array(Data.names.filter((e) => e.length))[0];\n var message =\n (options?.message as string) ??\n Helper.random.array(Data.normal_messages.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.Twitch.Cheer & {\n event: { provider: Provider };\n } = {\n listener: 'cheer-latest',\n event: {\n amount,\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n message: message,\n providerId: '',\n _id: Helper.random.uuid(),\n sessionTop: false,\n type: 'cheer',\n originalEventName: 'cheer-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'follower':\n case 'follower-latest': {\n var avatar = (options?.avatar as string) ?? Helper.random.array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n Helper.random.array(Data.names.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.Twitch.Follower & {\n event: { provider: Provider };\n } = {\n listener: 'follower-latest',\n event: {\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n _id: Helper.random.uuid(),\n sessionTop: false,\n type: 'follower',\n originalEventName: 'follower-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'raid':\n case 'raid-latest': {\n var amount = (options?.amount as number) ?? Helper.random.number(1, 100);\n var avatar = (options?.avatar as string) ?? Helper.random.array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n Helper.random.array(Data.names.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.Twitch.Raid & {\n event: { provider: Provider };\n } = {\n listener: 'raid-latest',\n event: {\n amount,\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n _id: Helper.random.uuid(),\n sessionTop: false,\n type: 'raid',\n originalEventName: 'raid-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'subscriber':\n case 'subscriber-latest': {\n var tier =\n (options?.tier as string) ??\n Helper.random.array(['1000', '2000', '3000', 'prime'])[0];\n var amount = (options?.amount as number) ?? Helper.random.number(1, 24);\n var avatar = (options?.avatar as string) ?? Helper.random.array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n Helper.random.array(Data.names.filter((e) => e.length))[0];\n var sender =\n (options?.sender as string) ??\n Helper.random.array(Data.names.filter((e) => e.length && e !== name))[0];\n var message =\n (options?.message as string) ??\n Helper.random.array(Data.normal_messages.filter((e) => e.length))[0];\n\n var addons = {\n default: {\n avatar,\n playedAsCommunityGift: false,\n },\n gift: {\n sender,\n gifted: true,\n } as StreamElements.Event.Provider.Twitch.gift,\n community: {\n message,\n sender,\n bulkGifted: true,\n } as StreamElements.Event.Provider.Twitch.community,\n spam: {\n sender,\n gifted: true,\n isCommunityGift: true,\n } as StreamElements.Event.Provider.Twitch.spam,\n };\n\n var subTypes = ['default', 'gift', 'community', 'spam'];\n var subType = (options?.subType as string) ?? Helper.random.array(subTypes)[0];\n\n subType = subTypes.includes(subType) ? subType : 'default';\n\n const event: StreamElements.Event.Provider.Twitch.Subscriber & {\n event: { provider: Provider };\n } = {\n listener: 'subscriber-latest',\n event: {\n amount,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n tier: tier as StreamElements.Event.Provider.Twitch.SubscriberTier,\n\n ...addons.default,\n ...addons[subType as keyof typeof addons],\n\n _id: Helper.random.uuid(),\n sessionTop: false,\n type: 'subscriber',\n originalEventName: 'subscriber-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'delete-message': {\n const event: StreamElements.Event.Provider.Twitch.DeleteMessage & {\n event: { provider: Provider };\n } = {\n listener: 'delete-message',\n event: {\n msgId: (options?.id as string) ?? Helper.random.uuid(),\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'delete-messages': {\n const event: StreamElements.Event.Provider.Twitch.DeleteMessages & {\n event: { provider: Provider };\n } = {\n listener: 'delete-messages',\n event: {\n userId:\n (options?.id as string) ??\n Helper.random.number(10000000, 99999999).toString(),\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n }\n }\n\n case 'streamelements': {\n switch (\n type as\n | StreamElements.Event.Provider.StreamElements.Events['listener']\n | 'random'\n | 'tip'\n | 'mute'\n | 'unmute'\n | 'skip'\n ) {\n default:\n case 'random': {\n var randomEvent = Helper.random.array(\n available[provider],\n )[0] as StreamElements.Event.onEventReceived['listener'];\n\n return this.onEventReceived(provider, randomEvent);\n }\n case 'tip':\n case 'tip-latest': {\n var amount = (options?.amount as number) ?? Helper.random.number(100, 4000);\n var avatar = (options?.avatar as string) ?? Helper.random.array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n Helper.random.array(Data.names.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.StreamElements.Tip & {\n event: { provider: Provider };\n } = {\n listener: 'tip-latest',\n event: {\n amount,\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n _id: Helper.random.uuid(),\n sessionTop: false,\n type: 'tip',\n originalEventName: 'tip-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'kvstore:update': {\n const event: StreamElements.Event.Provider.StreamElements.KVStore & {\n event: { provider: Provider };\n } = {\n listener: 'kvstore:update',\n event: {\n data: {\n key: `customWidget.${(options?.key as string) ?? 'sampleKey'}`,\n value: (options?.value as string) ?? 'sampleValue',\n },\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'bot:counter': {\n const event: StreamElements.Event.Provider.StreamElements.BotCounter & {\n event: { provider: Provider };\n } = {\n listener: 'bot:counter',\n event: {\n counter: (options?.counter as string) ?? 'sampleCounter',\n value: (options?.value as number) ?? Helper.random.number(0, 100),\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'mute':\n case 'unmute':\n case 'alertService:toggleSound': {\n var muted =\n (options?.muted as boolean) ?? window?.client?.details?.overlay?.muted ?? false;\n\n const event: StreamElements.Event.Provider.StreamElements.AlertService & {\n event: { provider: Provider };\n } = {\n listener: 'alertService:toggleSound',\n event: {\n muted,\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'skip':\n case 'event:skip': {\n const event: StreamElements.Event.Provider.StreamElements.EventSkip & {\n event: { provider: Provider };\n } = {\n listener: 'event:skip',\n event: {\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n }\n }\n\n case 'youtube': {\n switch (\n type as\n | StreamElements.Event.Provider.YouTube.Events['listener']\n | 'random'\n | 'message'\n | 'superchat'\n | 'subscriber'\n | 'sponsor'\n ) {\n default:\n case 'random': {\n var randomEvent = Helper.random.array(\n available[provider],\n )[0] as StreamElements.Event.onEventReceived['listener'];\n\n return this.onEventReceived(provider, randomEvent);\n }\n case 'message': {\n var name =\n (options?.name as string) ??\n Helper.random.array(Data.names.filter((e) => e.length))[0];\n var message =\n (options?.message as string) ??\n Helper.random.array(\n [...Data.youtube_messages, ...Data.normal_messages].filter((e) => e.length),\n )[0];\n\n const badges = await Helper.message.generateBadges(\n (options?.badges as BadgeOptions) ?? [],\n provider,\n );\n\n var emotes = Helper.message.findEmotesInText(message);\n var renderedText = Helper.message.replaceEmotesWithHTML(message, emotes);\n\n var color = (options?.color as string) ?? Helper.random.color('hex');\n var userId =\n (options?.userId as string) ??\n Helper.random.number(10000000, 99999999).toString();\n var msgId = (options?.msgId as string) ?? Helper.random.uuid();\n var time = (options?.time as number) ?? Date.now();\n\n var avatar = (options?.avatar as string) ?? Helper.random.array(Data.avatars)[0];\n\n var channel =\n (options?.channel as string) ??\n window?.client?.details?.user?.username ??\n 'local';\n\n const event: StreamElements.Event.Provider.YouTube.Message = {\n listener: 'message',\n event: {\n service: provider,\n data: {\n kind: '',\n etag: '',\n id: '',\n snippet: {\n type: '',\n liveChatId: '',\n authorChannelId: channel,\n publishedAt: new Date().toISOString(),\n hasDisplayContent: true,\n displayMessage: message,\n textMessageDetails: {\n messageText: message,\n },\n },\n authorDetails: {\n channelId: channel,\n channelUrl: '',\n displayName: name,\n profileImageUrl: avatar,\n ...badges,\n },\n msgId: msgId,\n userId: userId,\n nick: name.toLowerCase(),\n badges: [],\n displayName: name,\n isAction: false,\n time: time,\n tags: [],\n displayColor: color,\n channel: channel,\n text: message,\n avatar: avatar,\n emotes: [],\n },\n renderedText: message,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'subscriber':\n case 'subscriber-latest': {\n var avatar = (options?.avatar as string) ?? Helper.random.array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n Helper.random.array(Data.names.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.YouTube.Subscriber & {\n event: { provider: Provider };\n } = {\n listener: 'subscriber-latest',\n event: {\n avatar,\n displayName: name,\n name: name.toLowerCase(),\n providerId: '',\n _id: Helper.random.uuid(),\n sessionTop: false,\n type: 'subscriber',\n originalEventName: 'subscriber-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'superchat':\n case 'superchat-latest': {\n var amount = (options?.amount as number) ?? Helper.random.number(100, 4000);\n var avatar = (options?.avatar as string) ?? Helper.random.array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n Helper.random.array(Data.names.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.YouTube.Superchat & {\n event: { provider: Provider };\n } = {\n listener: 'superchat-latest',\n event: {\n amount,\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n _id: Helper.random.uuid(),\n sessionTop: false,\n type: 'superchat',\n originalEventName: 'superchat-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'sponsor':\n case 'sponsor-latest': {\n var tier =\n (options?.tier as string) ?? Helper.random.array(['1000', '2000', '3000'])[0];\n var amount = (options?.amount as number) ?? Helper.random.number(1, 24);\n var avatar = (options?.avatar as string) ?? Helper.random.array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n Helper.random.array(Data.names.filter((e) => e.length))[0];\n var sender =\n (options?.sender as string) ??\n Helper.random.array(Data.names.filter((e) => e.length && e !== name))[0];\n var message =\n (options?.message as string) ??\n Helper.random.array(Data.normal_messages.filter((e) => e.length))[0];\n\n var addons = {\n default: {\n avatar,\n playedAsCommunityGift: false,\n },\n gift: {\n sender,\n gifted: true,\n } as StreamElements.Event.Provider.YouTube.gift,\n community: {\n message,\n sender,\n bulkGifted: true,\n } as StreamElements.Event.Provider.YouTube.community,\n spam: {\n sender,\n gifted: true,\n isCommunityGift: true,\n } as StreamElements.Event.Provider.YouTube.spam,\n };\n\n var subTypes = ['default', 'gift', 'community', 'spam'];\n var subType = (options?.subType as string) ?? Helper.random.array(subTypes)[0];\n\n subType = subTypes.includes(subType) ? subType : 'default';\n\n const event: StreamElements.Event.Provider.YouTube.Sponsor & {\n event: { provider: Provider };\n } = {\n listener: 'sponsor-latest',\n event: {\n amount,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n\n ...addons.default,\n ...addons[subType as keyof typeof addons],\n\n _id: Helper.random.uuid(),\n sessionTop: false,\n type: 'sponsor',\n originalEventName: 'sponsor-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n }\n }\n }\n },\n },\n };\n\n export const emulate = {\n twitch: {\n message(\n data: Partial<{\n name: string;\n message: string;\n badges: BadgeOptions;\n color: string;\n userId: string;\n msgId: string;\n channel: string;\n time: number;\n firstMsg: boolean;\n returningChatter: boolean;\n reply: {\n msgId: string;\n userId: string;\n login: string;\n name: string;\n text: string;\n };\n thread: {\n msgId: string;\n name: string;\n };\n }> = {},\n ) {\n Local.generate.event\n .onEventReceived('twitch', 'message', data as { [key: string]: any })\n .then((event) => {\n if (event) {\n Local.emulate.send('onEventReceived', event);\n }\n });\n },\n deleteMessage(msgId: string) {\n if (!msgId || typeof msgId !== 'string') return;\n\n const event: StreamElements.Event.Provider.Twitch.DeleteMessage = {\n listener: 'delete-message',\n event: {\n msgId: msgId,\n },\n };\n\n Local.emulate.send('onEventReceived', event);\n },\n deleteMessages(userId: string) {\n if (!userId || typeof userId !== 'string') return;\n\n const event: StreamElements.Event.Provider.Twitch.DeleteMessages = {\n listener: 'delete-messages',\n event: {\n userId: userId,\n },\n };\n\n Local.emulate.send('onEventReceived', event);\n },\n follower(\n data: Partial<{\n avatar: string;\n name: string;\n }> = {},\n ) {\n Local.generate.event\n .onEventReceived(\n 'twitch',\n 'follower-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n Local.emulate.send('onEventReceived', event);\n }\n });\n },\n raid(\n data: Partial<{\n amount: number;\n avatar: string;\n name: string;\n }> = {},\n ) {\n Local.generate.event\n .onEventReceived(\n 'twitch',\n 'raid-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n Local.emulate.send('onEventReceived', event);\n }\n });\n },\n cheer(\n data: Partial<{\n amount: number;\n avatar: string;\n name: string;\n message: string;\n }> = {},\n ) {\n Local.generate.event\n .onEventReceived(\n 'twitch',\n 'cheer-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n Local.emulate.send('onEventReceived', event);\n }\n });\n },\n subscriber(\n data: Partial<{\n tier: '1000' | '2000' | '3000' | 'prime';\n amount: number;\n avatar: string;\n name: string;\n sender: string;\n message: string;\n subType: 'default' | 'gift' | 'community' | 'spam';\n }> & { subType?: 'default' | 'gift' | 'community' | 'spam' } = {},\n ) {\n Local.generate.event\n .onEventReceived(\n 'twitch',\n 'subscriber-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n Local.emulate.send('onEventReceived', event);\n }\n });\n },\n },\n streamelements: {\n tip(\n data: Partial<{\n amount: number;\n avatar: string;\n name: string;\n }> = {},\n ) {\n Local.generate.event\n .onEventReceived(\n 'streamelements',\n 'tip-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n Local.emulate.send('onEventReceived', event);\n }\n });\n },\n },\n youtube: {\n message(\n data: Partial<{\n name: string;\n message: string;\n badges: BadgeOptions;\n color: string;\n userId: string;\n msgId: string;\n channel: string;\n time: number;\n avatar: string;\n }> = {},\n ) {\n Local.generate.event\n .onEventReceived(\n 'youtube',\n 'message',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n Local.emulate.send('onEventReceived', event);\n }\n });\n },\n subscriber(\n data: Partial<{\n avatar: string;\n name: string;\n }> = {},\n ) {\n Local.generate.event\n .onEventReceived(\n 'youtube',\n 'subscriber-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n Local.emulate.send('onEventReceived', event);\n }\n });\n },\n superchat(\n data: Partial<{\n amount: number;\n avatar: string;\n name: string;\n }> = {},\n ) {\n Local.generate.event\n .onEventReceived(\n 'youtube',\n 'superchat-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n Local.emulate.send('onEventReceived', event);\n }\n });\n },\n sponsor(\n data: Partial<{\n tier: '1000' | '2000' | '3000';\n amount: number;\n avatar: string;\n name: string;\n sender: string;\n message: string;\n subType: 'default' | 'gift' | 'community' | 'spam';\n }> & { subType?: 'default' | 'gift' | 'community' | 'spam' } = {},\n ) {\n Local.generate.event\n .onEventReceived(\n 'youtube',\n 'sponsor-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n Local.emulate.send('onEventReceived', event);\n }\n });\n },\n },\n kick: {},\n facebook: {},\n\n send<T extends 'onEventReceived' | 'onSessionUpdate' | 'onWidgetLoad'>(\n listener: T,\n event: T extends 'onEventReceived'\n ? StreamElements.Event.onEventReceived\n : T extends 'onSessionUpdate'\n ? StreamElements.Event.onSessionUpdate\n : StreamElements.Event.onWidgetLoad,\n ): void {\n if (!Local.queue) {\n logger.warn('Local queue is not initialized.');\n\n window.dispatchEvent(new CustomEvent(listener, { detail: event }));\n\n return;\n }\n\n switch (listener) {\n case 'onEventReceived': {\n Local.queue.enqueue({\n listener,\n data: event as StreamElements.Event.onEventReceived,\n session: listener === 'onEventReceived' ? true : undefined,\n });\n\n break;\n }\n case 'onSessionUpdate': {\n Local.queue.enqueue({\n listener,\n data: event as StreamElements.Event.onSessionUpdate,\n });\n\n break;\n }\n case 'onWidgetLoad': {\n Local.queue.enqueue({\n listener,\n data: event as StreamElements.Event.onWidgetLoad,\n });\n\n break;\n }\n }\n },\n };\n\n export async function start(\n fieldsFile: string[] = ['fields.json', 'cf.json', 'field.json', 'customfields.json'],\n dataFiles: string[] = ['data.json', 'fielddata.json', 'fd.json', 'DATA.json'],\n session?: StreamElements.Session.Data,\n ) {\n const localFiles = {\n fields: fieldsFile.find((file) => {\n try {\n new URL('./' + file, window.location.href);\n return true;\n } catch (error) {\n return false;\n }\n }),\n data: dataFiles.find((file) => {\n try {\n new URL('./' + file, window.location.href);\n return true;\n } catch (error) {\n return false;\n }\n }),\n };\n\n const data: Record<string, string | number | boolean> = await fetch(\n './' + (localFiles.data ?? 'data.json'),\n {\n cache: 'no-store',\n },\n )\n .then((res) => res.json())\n .catch(() => ({}));\n\n await fetch('./' + (localFiles.fields ?? 'fields.json'), {\n cache: 'no-store',\n })\n .then((res) => res.json())\n .then(async (customfields: Record<string, StreamElements.CustomField.Schema>) => {\n const fields = Object.entries(customfields)\n .filter(([_, { value }]) => value != undefined)\n .reduce(\n (acc, [key, { value }]) => {\n if (data && data[key] !== undefined) value = data[key];\n\n acc[key] = value;\n\n return acc;\n },\n {\n ...data,\n } as Record<string, StreamElements.CustomField.Value>,\n );\n\n const load = await Local.generate.event.onWidgetLoad(\n fields,\n await Local.generate.session.get(session),\n );\n\n window.dispatchEvent(new CustomEvent('onWidgetLoad', { detail: load }));\n });\n }\n}\n","interface Theme {\n color?: string;\n background?: string;\n bold?: boolean;\n italic?: boolean;\n fontSize?: number;\n icon?: string;\n}\n\ninterface Options {\n enabled?: boolean;\n prefix?: string | (() => string);\n}\n\ntype LogMethod = (...args: unknown[]) => void;\n\nexport class useLogger {\n public enabled: boolean;\n public prefix: string | (() => string);\n\n constructor(options: Options = {}) {\n this.enabled = options.enabled ?? true;\n this.prefix = options.prefix ?? '';\n }\n\n public apply(theme: Theme): LogMethod {\n const style = this.style(theme);\n const icon = theme.icon ? `${theme.icon} ` : '';\n\n return (...args: unknown[]): void => {\n if (!this.enabled || typeof console === 'undefined') return;\n\n let prefix: string = '';\n\n if (typeof this.prefix === 'function') prefix = this.prefix();\n else if (typeof this.prefix === 'string') prefix = this.prefix;\n\n const primitives: unknown[] = [];\n const objects: unknown[] = [];\n\n args.forEach((arg) => {\n if (typeof arg === 'string' || typeof arg === 'number' || typeof arg === 'boolean') {\n primitives.push(arg);\n } else {\n objects.push(arg);\n }\n });\n\n // Log with style\n\n if (primitives.length > 0) {\n const message = primitives.join(' ');\n console.log(\n `%c${prefix.endsWith(' ') ? prefix : prefix.trim() + ' '}${icon}${message}`,\n style,\n ...objects,\n );\n } else if (objects.length > 0) {\n console.log(\n `%c${prefix.endsWith(' ') ? prefix : prefix.trim() + ' '}${icon}`,\n style,\n ...objects,\n );\n }\n };\n }\n\n private style(theme: Theme): string {\n const styles: string[] = [];\n\n if (theme.background && theme.background !== 'transparent') {\n styles.push(`background: ${theme.background}`);\n styles.push('padding: 2px 6px');\n styles.push('border-radius: 3px');\n }\n if (theme.color) styles.push(`color: ${theme.color}`);\n if (theme.bold) styles.push('font-weight: bold');\n if (theme.italic) styles.push('font-style: italic');\n if (theme.fontSize) styles.push(`font-size: ${theme.fontSize}px`);\n\n return styles.join('; ');\n }\n\n public group(label: string): void {\n if (!this.enabled || !console.group) return;\n\n console.group(label);\n }\n\n public groupCollapsed(label: string): void {\n if (!this.enabled || !console.groupCollapsed) return;\n\n console.groupCollapsed(label);\n }\n\n public groupEnd(): void {\n if (!this.enabled || !console.groupEnd) return;\n\n console.groupEnd();\n }\n\n public table(data: unknown): void {\n if (!this.enabled || !console.table) return;\n\n console.table(data);\n }\n\n public time(label: string): void {\n if (!this.enabled || !console.time) return;\n\n console.time(label);\n }\n\n public timeEnd(label: string): void {\n if (!this.enabled || !console.timeEnd) return;\n\n console.timeEnd(label);\n }\n\n readonly error = this.apply({\n color: '#721c24',\n background: '#f8d7da',\n bold: true,\n italic: false,\n icon: '✖',\n });\n\n readonly warn = this.apply({\n color: '#856404',\n background: '#fff3cd',\n bold: true,\n italic: false,\n fontSize: 20,\n });\n\n readonly success = this.apply({\n color: '#155724',\n background: '#d4edda',\n bold: true,\n italic: false,\n fontSize: 18,\n icon: '✔',\n });\n\n readonly info = this.apply({\n color: '#0c5460',\n background: '#d1ecf1',\n fontSize: 12,\n icon: 'ℹ',\n });\n\n readonly debug = this.apply({\n color: '#8c9ba8',\n background: 'transparent',\n fontSize: 12,\n icon: '●',\n });\n\n readonly alert = this.apply({\n color: '#856404',\n background: '#fff3cd',\n bold: true,\n italic: false,\n fontSize: 20,\n icon: '⚠',\n });\n\n readonly status = this.apply({\n color: '#0c5460',\n background: '#d1ecf1',\n bold: true,\n italic: false,\n fontSize: 12,\n icon: '·',\n });\n\n readonly received = this.apply({\n color: '#E6BBFF',\n background: 'transparent',\n bold: false,\n italic: false,\n fontSize: 14,\n icon: '⬇',\n });\n\n readonly simple = this.apply({\n color: '#f6c6cb',\n background: 'transparent',\n bold: false,\n italic: false,\n fontSize: 14,\n icon: '☼',\n });\n}\n","import type {\n OnErrorHandler,\n OnCommandHandler,\n OnChatHandler,\n OnWhisperHandler,\n OnMessageDeletedHandler,\n OnJoinHandler,\n OnPartHandler,\n OnHostedHandler,\n OnRaidHandler,\n OnSubHandler,\n OnResubHandler,\n OnSubGiftHandler,\n OnSubMysteryGiftHandler,\n OnGiftSubContinueHandler,\n OnCheerHandler,\n OnRewardHandler,\n OnConnectedHandler,\n OnReconnectHandler,\n OnChatModeHandler,\n ComfyJSInstance,\n} from 'comfy.js';\n\nimport { BadgeOptions } from '../helper/classes/message.js';\nimport { Helper } from '../helper/index.js';\nimport { Local } from '../local/index.js';\nimport { logger } from '../main.js';\nimport { EventProvider } from '../modules/EventProvider.js';\n\ntype ComfyEvents = {\n load: [instance: ComfyJSInstance];\n error: Parameters<OnErrorHandler>;\n command: Parameters<OnCommandHandler>;\n chat: Parameters<OnChatHandler>;\n whisper: Parameters<OnWhisperHandler>;\n messageDeleted: Parameters<OnMessageDeletedHandler>;\n join: Parameters<OnJoinHandler>;\n part: Parameters<OnPartHandler>;\n hosted: Parameters<OnHostedHandler>;\n raid: Parameters<OnRaidHandler>;\n sub: Parameters<OnSubHandler>;\n resub: Parameters<OnResubHandler>;\n subGift: Parameters<OnSubGiftHandler>;\n subMysteryGift: Parameters<OnSubMysteryGiftHandler>;\n giftSubContinue: Parameters<OnGiftSubContinueHandler>;\n cheer: Parameters<OnCheerHandler>;\n chatMode: Parameters<OnChatModeHandler>;\n reward: Parameters<OnRewardHandler>;\n connected: Parameters<OnConnectedHandler>;\n reconnect: Parameters<OnReconnectHandler>;\n};\n\n/**\n * Creates and manages a ComfyJS instance for Twitch chat interaction.\n */\nexport class useComfyJs extends EventProvider<ComfyEvents> {\n public instance!: ComfyJSInstance;\n\n public username!: string;\n public password?: string;\n public channels!: string[];\n\n public isDebug: boolean = false;\n private init: boolean = false;\n\n public emulate: boolean = false;\n\n /**\n * Initializes a new ComfyJS instance and connects to Twitch chat.\n * @param options - Configuration options for ComfyJS instance.\n * @param emulate - Whether to emulate chat messages in the Local module.\n */\n constructor(\n options: {\n username: string;\n password?: string;\n channels: string[];\n isDebug?: boolean;\n init?: boolean;\n },\n emulate: boolean,\n ) {\n super();\n\n this.username = options.username;\n this.password = options.password;\n this.channels = options.channels;\n this.isDebug = Boolean(options.isDebug);\n this.init = Boolean(options.init);\n this.emulate = emulate;\n\n this.load()\n .then((comfyJS) => {\n this.instance = comfyJS;\n\n this.emit('load', comfyJS);\n this.connect();\n })\n .catch((err) => {\n logger.error('useComfyJs: Failed to load ComfyJS', err);\n });\n }\n\n /**\n * Loads the ComfyJS script if not already loaded.\n * @returns A promise that resolves to the ComfyJS instance.\n */\n private load(): Promise<ComfyJSInstance> {\n if (typeof window.ComfyJS === 'undefined' || !window.ComfyJS) {\n return new Promise((resolve, reject) => {\n if (this.emulate && !client) {\n return reject(\n new Error('useComfyJs: Cannot emulate chat messages without a Client instance.'),\n );\n }\n\n const script = document.createElement('script');\n\n script.src = 'https://cdn.jsdelivr.net/npm/comfy.js@1.1.29/dist/comfy.min.js';\n script.type = 'text/javascript';\n script.async = true;\n\n script.onload = () => resolve(window.ComfyJS as ComfyJSInstance);\n script.onerror = (err) => reject(err);\n\n document.head.appendChild(script);\n });\n } else return Promise.resolve(window.ComfyJS as ComfyJSInstance);\n }\n\n /**\n * Connects event handlers to the ComfyJS instance.\n */\n private connect() {\n this.instance.onError = (error) => {\n this.emit('error', error);\n\n if (client?.debug) logger.error('[Client]', 'ComfyJS Error:', error);\n };\n\n this.instance.onCommand = (user, command, message, flags, extra) => {\n this.emit('command', user, command, message, flags, extra);\n\n if (client?.debug)\n logger.debug('[Client]', `ComfyJS Command: !${command} ${message} (User: ${user})`);\n\n if (this.emulate) {\n const roles = {\n ...flags,\n broadcaster: flags.broadcaster,\n moderator: flags.mod,\n vip: flags.vip,\n subscriber: flags.subscriber,\n founder: flags.founder,\n };\n\n const data = {\n name: user,\n message: `!${command} ${message}`,\n badges: Object.entries(roles)\n .map(([role, hasRole]) => (hasRole ? role : null))\n .filter(Boolean) as BadgeOptions,\n color: extra.userColor,\n time: new Date(extra.timestamp).getTime(),\n userId: extra.userId,\n msgId: extra.id,\n channel: extra.channel,\n };\n\n Local.emulate.twitch.message(data);\n }\n };\n this.instance.onChat = (user, message, flags, self, extra) => {\n this.emit('chat', user, message, flags, self, extra);\n\n if (client?.debug) logger.debug('[Client]', `ComfyJS Chat: ${message} (User: ${user})`);\n\n if (this.emulate) {\n const roles = {\n ...flags,\n ...extra.userBadges,\n broadcaster: flags.broadcaster,\n moderator: flags.mod,\n vip: flags.vip,\n subscriber: flags.subscriber,\n founder: flags.founder,\n };\n\n Local.emulate.twitch.message({\n name: user,\n message: message,\n badges: Object.entries(roles)\n .map(([role, hasRole]) => (hasRole ? role : null))\n .filter(Boolean) as BadgeOptions,\n color: extra.userColor,\n time: new Date(extra.timestamp).getTime(),\n userId: extra.userId,\n msgId: extra.id,\n channel: extra.channel,\n });\n }\n };\n this.instance.onWhisper = (user, message, flags, self, extra) => {\n this.emit('whisper', user, message, flags, self, extra);\n\n if (client?.debug) logger.debug('[Client]', `ComfyJS Whisper: ${message} (User: ${user})`);\n };\n this.instance.onMessageDeleted = (id, extra) => {\n this.emit('messageDeleted', id, extra);\n\n if (client?.debug) logger.debug('[Client]', `ComfyJS Message Deleted: ${id}`);\n\n if (this.emulate) {\n Local.emulate.twitch.deleteMessage(id);\n }\n };\n this.instance.onJoin = (user, self, extra) => {\n this.emit('join', user, self, extra);\n\n if (client?.debug) logger.debug('[Client]', `ComfyJS Join: ${user}`);\n };\n this.instance.onPart = (user, self, extra) => {\n this.emit('part', user, self, extra);\n\n if (client?.debug) logger.debug('[Client]', `ComfyJS Part: ${user}`);\n };\n this.instance.onHosted = (user, viewers, autohost, extra) => {\n this.emit('hosted', user, viewers, autohost, extra);\n\n if (client?.debug) logger.debug('[Client]', `ComfyJS Hosted: ${user} (${viewers} viewers)`);\n };\n this.instance.onRaid = (user, viewers, extra) => {\n this.emit('raid', user, viewers, extra);\n\n if (client?.debug) logger.debug('[Client]', `ComfyJS Raid: ${user} (${viewers} viewers)`);\n\n if (this.emulate) {\n Local.emulate.twitch.raid({\n name: user,\n amount: viewers,\n });\n }\n };\n this.instance.onSub = (user, message, subTierInfo, extra) => {\n this.emit('sub', user, message, subTierInfo, extra);\n\n if (client?.debug) logger.debug('[Client]', `ComfyJS Sub: ${user} (${subTierInfo.plan})`);\n\n if (this.emulate) {\n const tier = subTierInfo.plan === 'Prime' ? 'prime' : subTierInfo.plan;\n\n Local.emulate.twitch.subscriber({\n name: user,\n message: message,\n tier: tier,\n subType: 'default',\n });\n }\n };\n this.instance.onResub = (user, message, streakMonths, cumulativeMonths, subTierInfo, extra) => {\n this.emit('resub', user, message, streakMonths, cumulativeMonths, subTierInfo, extra);\n\n if (client?.debug)\n logger.debug('[Client]', `ComfyJS Resub: ${user} (${cumulativeMonths} months)`);\n\n if (this.emulate) {\n const tier = subTierInfo.plan === 'Prime' ? 'prime' : subTierInfo.plan;\n\n Local.emulate.twitch.subscriber({\n name: user,\n message: message,\n tier: tier,\n amount: cumulativeMonths,\n subType: 'default',\n });\n }\n };\n this.instance.onSubGift = (\n gifterUser,\n streakMonths,\n recipientUser,\n senderCount,\n subTierInfo,\n extra,\n ) => {\n this.emit(\n 'subGift',\n gifterUser,\n streakMonths,\n recipientUser,\n senderCount,\n subTierInfo,\n extra,\n );\n\n if (client?.debug)\n logger.debug('[Client]', `ComfyJS Sub Gift: ${gifterUser} gifted ${senderCount} subs`);\n\n if (this.emulate) {\n const tier = subTierInfo.plan === 'Prime' ? 'prime' : subTierInfo.plan;\n\n Local.emulate.twitch.subscriber({\n name: recipientUser,\n message: '',\n sender: gifterUser,\n tier,\n amount: senderCount,\n subType: 'gift',\n });\n }\n };\n this.instance.onSubMysteryGift = (gifterUser, numbOfSubs, senderCount, subTierInfo, extra) => {\n this.emit('subMysteryGift', gifterUser, numbOfSubs, senderCount, subTierInfo, extra);\n\n if (client?.debug)\n logger.debug(\n '[Client]',\n `ComfyJS Sub Mystery Gift: ${gifterUser} gifted ${numbOfSubs} subs`,\n );\n\n if (this.emulate) {\n const tier = subTierInfo.plan === 'Prime' ? 'prime' : subTierInfo.plan;\n\n Local.emulate.twitch.subscriber({\n name: gifterUser,\n message: '',\n amount: numbOfSubs,\n tier: tier,\n subType: 'community',\n });\n }\n };\n this.instance.onGiftSubContinue = (user, sender, extra) => {\n this.emit('giftSubContinue', user, sender, extra);\n\n if (client?.debug)\n logger.debug(\n '[Client]',\n `ComfyJS Gift Sub Continue: ${user} continued their gifted sub from ${sender}`,\n );\n\n if (this.emulate) {\n Local.emulate.twitch.subscriber({\n name: user,\n message: '',\n sender: sender,\n tier: '1000',\n subType: 'gift',\n });\n }\n };\n this.instance.onCheer = (user, message, bits, flags, extra) => {\n this.emit('cheer', user, message, bits, flags, extra);\n\n if (client?.debug)\n logger.debug('[Client]', `ComfyJS Cheer: ${user} cheered ${bits} bits - ${message}`);\n\n if (this.emulate) {\n Local.emulate.twitch.cheer({\n name: user,\n message: message,\n amount: bits,\n });\n }\n };\n this.instance.onChatMode = (flags, channel) => {\n this.emit('chatMode', flags, channel);\n\n if (client?.debug) logger.debug('[Client]', `ComfyJS Chat Mode Changed on ${channel}`);\n };\n this.instance.onReward = (user, reward, cost, message, extra) => {\n this.emit('reward', user, reward, cost, message, extra);\n\n if (client?.debug)\n logger.debug(\n '[Client]',\n `ComfyJS Reward: ${user} redeemed ${reward} for ${cost} - ${message}`,\n );\n };\n this.instance.onConnected = (address, port, isFirstConnect) => {\n this.emit('connected', address, port, isFirstConnect);\n\n if (client?.debug)\n logger.debug(\n '[Client]',\n `ComfyJS Connected: ${address}:${port} (First Connect: ${isFirstConnect})`,\n );\n };\n this.instance.onReconnect = (reconnectCount) => {\n this.emit('reconnect', reconnectCount);\n\n if (client?.debug) logger.debug('[Client]', `ComfyJS Reconnect: Attempt #${reconnectCount}`);\n };\n\n if (this.init) {\n this.instance.Init(this.username, this.password, this.channels, this.isDebug);\n }\n }\n}\n","import { StreamElements } from '../types/streamelements/main.js';\n\nconst LOCAL_SE_API: StreamElements.SE_API & { store: { list: Record<string, any> } } = {\n getOverlayStatus: () => {\n return {\n isEditorMode: false,\n muted: false,\n };\n },\n resumeQueue: () => {},\n responses: {} as Record<string, any>,\n sendMessage(message: string, data: object) {},\n counters: {\n get(key: string): number | null {\n return null;\n },\n },\n sanitize(message: string): string {\n return message;\n },\n cheerFilter(message: string): string {\n return message;\n },\n setField(key: string, value: string | number | boolean | undefined, reload: boolean) {},\n\n store: {\n set: function (name: string, obj: any) {\n this.list[name] = obj;\n\n localStorage.setItem('SE_API-STORE', JSON.stringify(LOCAL_SE_API.store.list));\n },\n get: async function (name: string) {\n if (this.list[name]) return this.list[name];\n else return null;\n },\n list: {} as Record<string, any>,\n },\n};\n\nexport async function initializeLocalSEAPI() {\n let lastStore = localStorage.getItem('SE_API-STORE') ?? '';\n\n let result = lastStore ? JSON.parse(lastStore) : {};\n\n LOCAL_SE_API.store.list = result;\n\n return LOCAL_SE_API;\n}\n","export namespace Alejo {\n export namespace Pronouns {\n export type name =\n | 'hehim'\n | 'sheher'\n | 'theythem'\n | 'shethem'\n | 'hethem'\n | 'heshe'\n | 'xexem'\n | 'faefaer'\n | 'vever'\n | 'aeaer'\n | 'ziehir'\n | 'perper'\n | 'eem'\n | 'itits';\n\n export type display =\n | 'He/Him'\n | 'She/Her'\n | 'They/Them'\n | 'She/They'\n | 'He/They'\n | 'He/She'\n | 'Xe/Xem'\n | 'Fae/Faer'\n | 'Ve/Ver'\n | 'Ae/Aer'\n | 'Zie/Hir'\n | 'Per/Per'\n | 'E/Em'\n | 'It/Its';\n\n export enum map {\n hehim = 'He/Him',\n sheher = 'She/Her',\n theythem = 'They/Them',\n shethem = 'She/They',\n hethem = 'He/They',\n heshe = 'He/She',\n xexem = 'Xe/Xem',\n faefaer = 'Fae/Faer',\n vever = 'Ve/Ver',\n aeaer = 'Ae/Aer',\n ziehir = 'Zie/Hir',\n perper = 'Per/Per',\n eem = 'E/Em',\n itits = 'It/Its',\n }\n }\n\n export async function list(): Promise<typeof Pronouns.map> {\n try {\n const data = (await fetch('https://pronouns.alejo.io/api/pronouns').then((res) =>\n res.json(),\n )) as {\n display: Pronouns.display;\n name: Pronouns.name;\n }[];\n\n if (Array.isArray(data) && data.length) {\n const built = Object.fromEntries(\n data.map(({ name, display }) => [name, display] as const),\n ) as Record<Pronouns.name, Pronouns.display>;\n\n return { ...Pronouns.map, ...built } as typeof Pronouns.map;\n }\n } catch {}\n\n return { ...Pronouns.map } as typeof Pronouns.map;\n }\n\n export type user = {\n id: string;\n login: string;\n pronoun_id: Pronouns.name;\n };\n\n export async function get(username: string) {\n if (!username) throw new Error('Username is required to fetch Alejo data.');\n\n username = username.toLowerCase();\n\n if (!window?.client) {\n try {\n const data = await fetch(`https://pronouns.alejo.io/api/users/${username}`)\n .then((res) => res.json())\n .then(([data]) => data as Alejo.user | undefined);\n\n if (data) {\n return data.pronoun_id;\n }\n } catch (error) {\n throw new Error(\n `Failed to fetch pronoun data for user \"${username}\": ${error instanceof Error ? error.message : error}`,\n );\n }\n\n return;\n }\n\n if (\n username in window?.client?.storage.data.pronoun &&\n window?.client?.storage.data.pronoun[username].expire > Date.now()\n ) {\n return window?.client?.storage.data.pronoun[username].value;\n } else {\n try {\n const data = await fetch(`https://pronouns.alejo.io/api/users/${username}`)\n .then((res) => res.json())\n .then(([data]) => data as Alejo.user | undefined);\n\n if (data) {\n window?.client?.storage.add(`pronoun.${username}`, {\n value: data.pronoun_id,\n timestamp: Date.now(),\n expire: Date.now() + window?.client?.cache.pronoun * 60 * 1000,\n });\n\n return window?.client?.storage.data.pronoun[username].value ?? data.pronoun_id;\n }\n } catch (error) {\n throw new Error(\n `Failed to fetch pronoun data for user \"${username}\": ${error instanceof Error ? error.message : error}`,\n );\n }\n }\n }\n}\n","import './client/listener.js';\nimport { Button, usedButtons } from './actions/button.js';\nimport { Command, usedCommands } from './actions/command.js';\nimport { Client } from './client/client.js';\nimport { Data } from './data/index.js';\nimport { Helper } from './helper/index.js';\nimport { Local } from './local/index.js';\nimport { EventProvider } from './modules/EventProvider.js';\nimport { FakeUserPool, fakeUserPools } from './modules/fakeUser.js';\nimport { useComms, usedComms } from './modules/useComms.js';\nimport { useLogger } from './modules/useLogger.js';\nimport { useQueue } from './modules/useQueue.js';\nimport { usedStorages, useStorage } from './modules/useStorage.js';\nimport { useComfyJs } from './multistream/comfyJs.js';\nimport { initializeLocalSEAPI } from './streamelements/api.js';\nimport { StreamElements } from './types/index.js';\nimport { Alejo } from './utils/alejo.js';\n\nexport const USE_SE_API: Promise<StreamElements.SE_API> =\n typeof SE_API !== 'undefined' ? Promise.resolve(SE_API) : Promise.resolve(initializeLocalSEAPI());\nexport const logger = new useLogger();\n\nexport const main = {\n SeAPI: USE_SE_API,\n\n Client: Client,\n Helper: Helper,\n Local: Local,\n Data: Data,\n logger: logger,\n\n modules: {\n EventProvider,\n useStorage,\n useQueue,\n useLogger,\n useComms,\n FakeUserPool,\n },\n actions: {\n Button,\n Command,\n },\n multistream: {\n useComfyJs,\n },\n internal: {\n usedStorages,\n usedComms,\n usedCommands,\n usedButtons,\n fakeUserPools,\n },\n pronouns: {\n Alejo,\n },\n};\n\nif (typeof window !== 'undefined') {\n (window as any).Tixyel = main;\n} else {\n (globalThis as any).Tixyel = main;\n}\n","import { ComfyJSInstance } from 'comfy.js';\n\nimport { main } from './main.js';\nimport { StreamElements } from './types.js';\n\nexport type * from './types.ts';\n\ndeclare global {\n interface Window {\n Tixyel: typeof main;\n client: InstanceType<typeof main.Client> | undefined;\n ComfyJS?: ComfyJSInstance;\n }\n\n interface WindowEventMap {\n onWidgetLoad: CustomEvent<StreamElements.Event.onWidgetLoad>;\n onSessionUpdate: CustomEvent<StreamElements.Event.onSessionUpdate>;\n onEventReceived: CustomEvent<StreamElements.Event.onEventReceived>;\n }\n\n const Tixyel: typeof main;\n let client: InstanceType<typeof main.Client> | undefined;\n\n const SE_API: StreamElements.SE_API;\n}\n\nexport default main;\n"],"mappings":"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;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,EACD;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,EACD;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,EACD;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,EACD;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WACE;GACH,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aACE;IACF,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aACE;IACF,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aACE;IACF,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY;GACV;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACD;IACE,IAAM;IACN,cACE;IACF,cACE;IACF,cACE;IACF,OAAS;IACT,aAAe;IACf,cAAgB;IAChB,WAAa;IACd;GACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aACE;GACF,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACD;EACE,QAAU;EACV,UAAY,CACV;GACE,IAAM;GACN,cACE;GACF,cACE;GACF,cACE;GACF,OAAS;GACT,aAAe;GACf,cAAgB;GAChB,WAAa;GACd,CACF;EACF;CACF,ECrwLY,IAAkB,s+CAsJ9B,ECpJK,IAAgB;CACpB;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACF,EAEK,IAAa;CACjB;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACF,EAEK,IAAY;CAChB;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAM;EACN,MAAQ;EACR,UAAY;EACZ,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACF,EAEK,IAAe;CACnB;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACD;EACE,MAAQ;EACR,MAAQ;EACR,IAAM;EACN,KAAO;EACP,UAAY;EACZ,MAAQ;GACN,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAS;EACT,KAAO;EACR;CACF,EAEK,IAAwD,OAAO,OAAO;CAC1E,GAAG;CACH,GAAG,EAAW,KAAK,OAAO;EACxB,MAAM,EAAE;EACR,MAAM,EAAE;EACR,IAAI,EAAE;EACN,KAAK,EAAE;EACP,UAAU,EAAE;EACZ,MAAM,EAAE;EACT,EAAE;CACH,GAAG,EAAc,KAAK,OAAO;EAC3B,MAAM,EAAE;EACR,MAAM,EAAE;EACR,IAAI,EAAE;EACN,KAAK,EAAE;EACP,UAAU,EAAE;EACZ,MAAM,EAAE;EACT,EAAE;CACH,GAAG,EAAU,KAAK,OAAO;EACvB,MAAM,EAAE;EACR,MAAM,EAAE;EACR,IAAI,EAAE;EACN,KAAK,EAAE;EACP,UAAU,EAAE;EACZ,MAAM,EAAE;EACT,EAAE;CACJ,CAAC,CAAC,QACA,GAAK,OACC,GAAe,aAClB,EAAM,OAAQ,EAAc,UAC5B,OAAQ,EAAc,WAGnB,EAAI,MAAM,MAAM,EAAE,SAAS,EAAM,KAAK,IACzC,EAAI,KAAK;CACP,GAAG;CACH,OAAS;CACT,KAAO;CACR,CAA2C,EAGvC,IAET,EAAE,CACH,ECpsEY,IAAe,EAAE,ECAjB,IAAkB,iwGAkI9B,EAEY,IAAmB,2oHA+E/B,EAEY,IAAkB,wrIAmJ9B,EAEY,IAAW;CAAC,GAAG;CAAiB,GAAG;CAAkB,GAAG;CAAgB,EC1WxE,IAAQ;CACnB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,ECfY,IAAQ;CAAC;CAAQ;CAAQ;CAAQ;CAAQ,ECAzC,IAAM,+lBAwFlB,ECxFY,IAAgB;CAC3B;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,gCAAgC;EAC5C,aAAa,CAAC,8BAA8B;EAC5C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,+BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,kCAAkC;EAC9C,aAAa,CAAC,gCAAgC;EAC9C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,iCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,wCAAwC;EACpD,aAAa,CAAC,sCAAsC;EACpD,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,uCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,mCAAmC;EAC/C,aAAa,CAAC,iCAAiC;EAC/C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,kCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,OAAO;EACnB,aAAa,CAAC,KAAK;EACnB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,MACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,SAAS;EACrB,aAAa,CAAC,OAAO;EACrB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,QACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,aAAa;EACzB,aAAa,CAAC,WAAW;EACzB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,YACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,eAAe;EAC3B,aAAa,CAAC,aAAa;EAC3B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,cACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,eAAe;EAC3B,aAAa,CAAC,aAAa;EAC3B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,cACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,YAAY;EACxB,aAAa,CAAC,UAAU;EACxB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,WACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,YAAY;EACxB,aAAa,CAAC,UAAU;EACxB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,WACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,eAAe;EAC3B,aAAa,CAAC,aAAa;EAC3B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,cACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,aAAa;EACzB,aAAa,CAAC,WAAW;EACzB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,YACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,eAAe;EAC3B,aAAa,CAAC,aAAa;EAC3B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,cACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,qBAAqB;EACjC,aAAa,CAAC,mBAAmB;EACjC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,oBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,sBAAsB;EAClC,aAAa,CAAC,oBAAoB;EAClC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,qBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,uBAAuB;EACnC,aAAa,CAAC,qBAAqB;EACnC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,sBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,uBAAuB;EACnC,aAAa,CAAC,qBAAqB;EACnC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,sBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,uBAAuB;EACnC,aAAa,CAAC,qBAAqB;EACnC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,sBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,wBAAwB;EACpC,aAAa,CAAC,sBAAsB;EACpC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,uBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,kCAAkC;EAC9C,aAAa,CAAC,gCAAgC;EAC9C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,iCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,oBAAoB;EAChC,aAAa,CAAC,kBAAkB;EAChC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,mBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,mCAAmC;EAC/C,aAAa,CAAC,iCAAiC;EAC/C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,kCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,wBAAwB;EACpC,aAAa,CAAC,sBAAsB;EACpC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,uBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,qBAAqB;EACjC,aAAa,CAAC,mBAAmB;EACjC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,oBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,gCAAgC;EAC5C,aAAa,CAAC,8BAA8B;EAC5C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,+BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,qBAAqB;EACjC,aAAa,CAAC,mBAAmB;EACjC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,oBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,gCAAgC;EAC5C,aAAa,CAAC,8BAA8B;EAC5C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,+BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,qBAAqB;EACjC,aAAa,CAAC,mBAAmB;EACjC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,oBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,uBAAuB;EACnC,aAAa,CAAC,qBAAqB;EACnC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,sBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,mCAAmC;EAC/C,aAAa,CAAC,iCAAiC;EAC/C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,kCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,mCAAmC;EAC/C,aAAa,CAAC,iCAAiC;EAC/C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,kCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,wCAAwC;EACpD,aAAa,CAAC,sCAAsC;EACpD,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,uCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,oCAAoC;EAChD,aAAa,CAAC,kCAAkC;EAChD,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,mCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,YAAY;EACxB,aAAa,CAAC,UAAU;EACxB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,WACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,QAAQ;EACpB,aAAa,CAAC,MAAM;EACpB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,OACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,gBAAgB;EAC5B,aAAa,CAAC,cAAc;EAC5B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,eACR,EACF;GACF;EACD,eAA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"}