{ "version": 3, "sources": ["../src/ui/fjsc/src/store.ts", "../src/ui/fjsc/src/signals.ts", "../src/ui/js/Routing/Router.ts", "../src/ui/fjsc/src/f2.ts", "../src/ui/js/Enums/Images.ts", "../src/ui/js/Cache/CacheItem.ts", "../src/ui/js/Cache/LydaCache.ts", "../src/ui/js/Classes/Config.ts", "../src/ui/js/Api/ApiRoutes.ts", "../src/ui/js/state.ts", "../src/ui/js/Classes/Util.ts", "../src/ui/js/Enums/Icons.ts", "../src/ui/js/Classes/Helpers/Time.ts", "../src/ui/js/Actions/QueueActions.ts", "../src/ui/js/Streaming/QueueManager.ts", "../src/ui/fjsc/src/FJSC.ts", "../src/ui/js/Templates/PlaylistTemplates.ts", "../src/ui/js/Api/MediaUploader.ts", "../src/ui/js/Actions/PlaylistActions.ts", "../src/ui/js/Templates/StatisticsTemplates.ts", "../src/ui/js/Actions/DragActions.ts", "../src/ui/js/Templates/FormTemplates.ts", "../src/ui/js/Enums/Genre.ts", "../src/ui/js/Classes/AudioUpload.ts", "../src/ui/js/Classes/Helpers/Date.ts", "../src/ui/js/Templates/TrackEditTemplates.ts", "../src/ui/js/Classes/Helpers/CustomText.ts", "../src/ui/js/Actions/CommentActions.ts", "../src/ui/js/Templates/CommentTemplates.ts", "../src/ui/js/Actions/MediaActions.ts", "../src/ui/js/Templates/TrackTemplates.ts", "../src/ui/js/Templates/AlbumTemplates.ts", "../src/ui/js/Actions/AlbumActions.ts", "../src/ui/js/Enums/Links.ts", "../src/ui/js/Templates/GenericTemplates.ts", "../src/ui/js/Templates/QueueTemplates.ts", "../src/ui/js/Templates/PlayerTemplates.ts", "../src/ui/js/Streaming/StreamingUpdater.ts", "../src/ui/js/Streaming/StreamClient.ts", "../src/ui/js/Streaming/StreamingBroadcaster.ts", "../src/ui/js/Streaming/PlayManager.ts", "../src/ui/js/Actions/TrackActions.ts", "../src/ui/js/Enums/Theme.ts", "../src/ui/js/Enums/UserSettings.ts", "../src/ui/js/Api/LydaApi.ts", "../src/ui/js/Actions/UserActions.ts", "../src/ui/js/Enums/Badges.ts", "../src/ui/js/Enums/Permissions.ts", "../src/ui/js/Templates/MenuTemplates.ts", "../src/ui/js/Classes/Helpers/FeatureDetector.ts", "../src/ui/js/Actions/UiActions.ts", "../src/ui/js/Templates/UserTemplates.ts", "../src/ui/js/Actions/NavActions.ts", "../src/ui/js/Templates/SearchTemplates.ts", "../src/ui/js/Classes/Helpers/NotificationParser.ts", "../src/ui/js/Templates/NavTemplates.ts", "../src/ui/js/Classes/Ui.ts", "../src/ui/js/Api/Api.ts", "../src/ui/js/Actions/AuthActions.ts", "../src/ui/js/Api/AuthApi.ts", "../src/ui/js/Classes/Validators/UserValidator.ts", "../src/ui/js/Templates/LandingPageTemplates.ts", "../src/ui/js/Enums/StreamingQuality.ts", "../src/ui/js/Templates/SettingsTemplates.ts", "../src/ui/js/Enums/RoadmapItemStatus.ts", "../src/ui/js/Templates/RoadmapTemplates.ts", "../src/ui/js/Templates/PageTemplates.ts", "../src/ui/js/Classes/KeyBindHandler.ts", "../src/ui/js/Classes/ProfilePage.ts", "../src/ui/js/Actions/LibraryActions.ts", "../src/ui/js/Templates/LogTemplates.ts", "../src/ui/js/Classes/Helpers/Num.ts", "../node_modules/@paypal/paypal-js/dist/esm/paypal-js.js", "../src/ui/js/Actions/SubscriptionActions.ts", "../src/ui/js/Templates/SubscriptionTemplates.ts", "../node_modules/@kurkle/color/dist/color.esm.js", "../node_modules/chart.js/dist/chunks/helpers.segment.js", "../node_modules/chart.js/dist/chart.js", "../node_modules/chart.js/dist/helpers.js", "../node_modules/@sgratzl/boxplots/build/index.js", "../node_modules/@sgratzl/chartjs-chart-boxplot/build/index.js", "../src/ui/js/Classes/Colors.ts", "../src/ui/js/Classes/ChartOptions.ts", "../src/ui/js/Templates/StatisticTemplates.ts", "../src/ui/js/Classes/StatisticsWrapper.ts", "../src/ui/js/Templates/RoyaltyTemplates.ts", "../src/ui/js/lyda.ts", "../src/ui/js/Routing/routes.ts", "../src/ui/main.ts"], "sourcesContent": [ "export class FjsStore {\n static keyName = \"__fjs_store__\";\n\n static get(key: string) {\n // @ts-ignore\n return window[this.keyName][key];\n }\n\n static set(key: any, value: any) {\n // @ts-ignore\n window[this.keyName][key] = value;\n }\n\n static clear() {\n // @ts-ignore\n window[this.keyName] = {};\n }\n\n static remove(key: any) {\n // @ts-ignore\n delete window[this.keyName][key];\n }\n\n static getAll() {\n // @ts-ignore\n return window[this.keyName];\n }\n\n static keys() {\n // @ts-ignore\n return Object.keys(window[this.keyName]);\n }\n\n static values() {\n // @ts-ignore\n return Object.values(window[this.keyName]);\n }\n\n static getSignalValue(key: any) {\n return this.get(key).value;\n }\n\n static setSignalValue(key: any, value: any) {\n this.get(key).value = value;\n }\n}\n\n/**\n * If called with one argument, gets the value for that key, otherwise saves it to the store.\n * @param key\n * @param value\n * @returns {*|void}\n */\nexport function store(key = null, value = null): any | void {\n if (!window) {\n console.warn(\"store() is not supported outside of the browser!\");\n return;\n }\n // @ts-ignore\n if (!window[FjsStore.keyName]) {\n // @ts-ignore\n window[FjsStore.keyName] = {};\n }\n if (arguments.length === 1) {\n return FjsStore.get(arguments[0]);\n } else if (arguments.length === 2) {\n return FjsStore.set(arguments[0], arguments[1]);\n }\n\n throw new Error(\"Passing more than 2 arguments to store() is not supported.\");\n}", "import {store} from \"./store.ts\";\n\nexport interface BoolValueAssignments {\n [key: string]: {\n onTrue: T,\n onFalse: T,\n }\n}\n\nexport type SignalCallback = (newValue: T, changed: boolean) => void;\n\nexport class Signal {\n _callbacks: SignalCallback[] = [];\n _value: T;\n _values: { [key: string]: Signal } = {};\n\n constructor(initialValue: T, updateCallback: SignalCallback = () => {\n }, key = null) {\n this._value = initialValue;\n this._values = {};\n this._callbacks.push(updateCallback);\n if (key) {\n store().set(key, this);\n }\n }\n\n /**\n * Creates an object with boolean signals that update when {this} updates.\n * @param assignments {Object} e.g. { someKey: { onTrue: value1, onFalse: value2 } }\n */\n boolValues(assignments: BoolValueAssignments = {}) {\n for (let key in assignments) {\n this._values[key] = signal(this._value ? assignments[key].onTrue : assignments[key].onFalse);\n }\n this.subscribe((newValue: T) => {\n for (let key in assignments) {\n this._values[key].value = newValue ? assignments[key].onTrue : assignments[key].onFalse;\n }\n });\n return this._values;\n }\n\n unsubscribeAll() {\n this._callbacks = [];\n }\n\n subscribe(callback: SignalCallback) {\n this._callbacks.push(callback);\n }\n\n unsubscribe(callback: SignalCallback) {\n const index = this._callbacks.indexOf(callback);\n if (index >= 0) {\n this._callbacks.splice(index, 1);\n }\n }\n\n get onUpdate(): SignalCallback[] {\n return this._callbacks;\n }\n\n set onUpdate(callback: SignalCallback) {\n this._callbacks.push(callback);\n }\n\n get value(): T {\n return this._value;\n }\n\n set value(value: T) {\n const changed = this._value !== value;\n this._value = value;\n this._callbacks.forEach(callback => callback(value, changed));\n }\n}\n\nexport function signal(initialValue: T) {\n return new Signal(initialValue);\n}\n\nexport function compute(\n valueFunction: (...args: Args) => T,\n ...signals: {[K in keyof Args]: Signal}\n): Signal {\n const getValues = () => signals.map(s => s.value) as Args;\n let out = signal(valueFunction(...getValues()));\n\n for (const sig of signals) {\n sig.subscribe((_, changed) => {\n if (!changed) {\n return;\n }\n out.value = valueFunction(...getValues());\n });\n }\n return out;\n}\n\nexport async function asyncCompute(\n valueFunction: (...args: Args) => Promise,\n ...signals: { [K in keyof Args]: Signal }\n): Promise> {\n const getValues = () => signals.map(s => s.value) as Args;\n let out = signal(await valueFunction(...getValues()));\n\n for (const sig of signals) {\n sig.subscribe(async (_, changed) => {\n if (!changed) {\n return;\n }\n out.value = await valueFunction(...getValues());\n });\n }\n return out;\n}\n\n/**\n * Short wrapper to make dependent signals easier.\n * @deprecated Use compute() instead\n * @param sourceSignal {Signal} Whenever the source signal is updated, the updateMethod gets called to update the output signal.\n * @param updateMethod {Function} Should return the value to update the output signal with.\n */\nexport function computedSignal(sourceSignal: Signal, updateMethod: Function): Signal {\n const returnSignal = signal(updateMethod(sourceSignal.value));\n sourceSignal.subscribe((newVal: (T)) => {\n try {\n returnSignal.value = updateMethod(newVal);\n } catch (e) {\n // @ts-ignore\n returnSignal.value = null;\n }\n });\n return returnSignal;\n}\n\n/**\n * @deprecated Use compute() instead\n * @param sourceSignal\n * @param propertyName\n */\nexport function signalFromProperty(sourceSignal: Signal, propertyName: string) {\n return compute((source: any) => {\n if (!source) {\n return null;\n }\n return source[propertyName];\n }, sourceSignal);\n}", "import {router} from \"../../main.ts\";\nimport {signal} from \"../../fjsc/src/signals.ts\";\n\nexport class Router {\n public currentRoute = signal(null);\n public currentParams = signal<{\n [key: string]: string;\n }>({});\n routes: any[];\n protected preRouteChange: Function = () => {};\n protected postRouteChange: Function = () => {};\n protected onNoRouteFound: Function = () => {};\n\n constructor(routes: Route[], preRouteChange: Function = () => {}, postRouteChange: Function = () => {}, onNoRouteFound: Function = () => {}) {\n this.routes = routes;\n this.preRouteChange = preRouteChange;\n this.postRouteChange = postRouteChange;\n this.onNoRouteFound = onNoRouteFound;\n this.init();\n }\n\n init() {\n window.onpopstate = () => this.handleRouteChange();\n this.handleRouteChange().then();\n }\n\n async handleRouteChange() {\n let path = window.location.pathname.substring(1);\n if (path === \"\") {\n path = \"/\";\n }\n const page = path.split(\"/\").filter(p => p !== \"\")[0] ?? \"/\";\n const route = this.routes.find(r => page.startsWith(r.path) || (r.aliases && r.aliases.some((a: string) => path.startsWith(a))));\n this.currentRoute.value = route;\n if (route) {\n const params = this.getParams(path, route);\n this.currentParams.value = params;\n this.preRouteChange && await this.preRouteChange(route, params);\n route.handler && await route.handler(route, params);\n this.postRouteChange && await this.postRouteChange(route,params);\n } else {\n this.onNoRouteFound && await this.onNoRouteFound();\n this.currentParams.value = {};\n }\n }\n\n getParams(fullPath: string, route: any) {\n const path = fullPath.split(\"/\").filter(p => p !== \"\");\n const params: {\n [key: string]: string;\n } = {};\n for (let i = 0; i < path.length; i++) {\n params[\"path_\" + i] = path[i];\n }\n const urlParams = new URLSearchParams(window.location.search);\n for (let [key, value] of urlParams.entries()) {\n params[key] = value;\n }\n if (route.params) {\n for (let i = 0; i < route.params.length; i++) {\n params[route.params[i]] = params[\"path_\" + (i + 1)];\n }\n }\n return params;\n }\n\n async navigate(path: string) {\n if (!path.startsWith(\"/\")) {\n path = \"/\" + path;\n }\n history.pushState({}, \"\", window.location.origin + path);\n await this.handleRouteChange();\n }\n\n reload() {\n this.handleRouteChange().then();\n }\n}\n\nexport function navigate(path: string, params: string[] = []) {\n if (params.length > 0) {\n path += \"?\" + params.join(\"&\");\n }\n router.navigate(path).then();\n}\n\nexport function reload() {\n router.reload();\n}\n\nexport interface Route {\n path: string;\n title?: string;\n params?: string[];\n aliases?: string[];\n}", "import {InputType} from \"./Types.ts\";\nimport {signal, Signal} from \"./signals.ts\";\n\nexport type TypeOrSignal = T | Signal;\nexport type StringOrSignal = TypeOrSignal;\nexport type HtmlPropertyValue = StringOrSignal | TypeOrSignal;\nexport type EventHandler = ((this: GlobalEventHandlers, ev: T) => any) | Function;\nexport type AnyElement = HTMLElement | SVGElement;\nexport type AnyNode = DomNode | AnyElement;\nexport type AnyElementFactory = () => AnyElement;\n\ntype propertyOmissions = Omit;\ntype StringKeys = {\n [K in keyof T]: T[K] extends string ? K : never;\n}[keyof T];\ntype stringProperties = StringKeys;\nexport type SettableCss = {\n [K in stringProperties]: StringOrSignal\n};\nexport type CssClass = Partial;\n\nexport function mergeCss(...cssObjs: (CssClass|undefined)[]): CssClass {\n return Object.assign({}, ...cssObjs.filter(o => o));\n}\n\nexport function create(tag: string) {\n return new DomNode(tag);\n}\n\nexport function nullElement() {\n return create(\"div\").styles(\"display\", \"none\").build();\n}\n\nexport function ifjs(condition: any, element: AnyElement | AnyElementFactory, inverted = false) {\n function getElement(): AnyElement {\n if (element.constructor === Function) {\n return (element)();\n }\n return element;\n }\n\n if (condition && condition.constructor === Signal) {\n const state = signal(condition.value ? (inverted ? nullElement() : getElement()) : (inverted ? getElement() : nullElement()));\n condition.subscribe((newValue: any) => {\n if (newValue) {\n state.value = inverted ? nullElement() : getElement();\n } else {\n state.value = inverted ? getElement() : nullElement();\n }\n });\n return state;\n } else {\n return condition ? (inverted ? nullElement() : getElement()) : (inverted ? getElement() : nullElement());\n }\n}\n\ntype SignalMapCallback = (item: T, index: number) => AnyElement;\n\nexport function signalMap(arrayState: Signal, wrapper: DomNode, callback: SignalMapCallback, renderSequentially = false): any {\n if (!arrayState.subscribe) {\n throw new Error(\"arrayState argument for signalMap is not subscribable\");\n }\n\n const update = (newValue: Iterable) => {\n if (!newValue) {\n return;\n }\n const tmp = [...newValue];\n const children = [];\n if (renderSequentially) {\n wrapper.overwriteChildren();\n for (let i = 0; i < tmp.length; i++) {\n wrapper.children(callback(tmp[i], i));\n }\n } else {\n for (let i = 0; i < tmp.length; i++) {\n children.push(callback(tmp[i], i));\n }\n // @ts-ignore\n wrapper.overwriteChildren(...children);\n }\n };\n arrayState.subscribe(update);\n update(arrayState.value);\n\n return wrapper.build();\n}\n\nexport function stack(message: string, debugInfo = {}) {\n console.warn(message, { debugInfo }, (new Error()).stack);\n}\n\nexport function isValidElement(element: any) {\n const validTypes = [HTMLElement, SVGElement];\n return validTypes.some(type => element instanceof type);\n}\n\nexport function getValue(maybeSignal: Signal|T): T {\n if (maybeSignal instanceof Signal) {\n return (maybeSignal as Signal).value;\n }\n return maybeSignal as T;\n}\n\ntype AnyElementWithKeyIndex = AnyElement & {\n [key: string]: HtmlPropertyValue\n};\n\nexport class DomNode {\n _node: AnyElementWithKeyIndex;\n svgTags = ['svg', 'g', 'circle', 'ellipse', 'line', 'path', 'polygon', 'polyline', 'rect', 'text', 'textPath', 'tspan'];\n\n constructor(tag: string) {\n if (this.svgTags.includes(tag)) {\n this._node = document.createElementNS(\"http://www.w3.org/2000/svg\", tag) as AnyElementWithKeyIndex;\n } else {\n this._node = document.createElement(tag) as AnyElementWithKeyIndex;\n }\n }\n\n applyGenericConfig(config: any) {\n return this.classes(\"fjsc\", ...(config.classes ?? []))\n .attributes(...(config.attributes ?? []))\n .styles(...(config.styles ?? []))\n .id(config.id)\n .css(config.css)\n .title(config.title)\n .role(config.role);\n }\n\n build(): AnyElement {\n if (!isValidElement(this._node)) {\n throw new Error('Invalid node type. Must be an HTMLElement or a subclass.');\n }\n return this._node;\n }\n\n wrapProperty(property: string, value: HtmlPropertyValue) {\n if (value && value.constructor === Signal) {\n const sig = value as Signal;\n this._node[property] = sig.value;\n sig.subscribe((newValue: HtmlPropertyValue) => {\n this._node[property] = newValue;\n });\n } else {\n if (value !== undefined && value !== null) {\n this._node[property] = value;\n }\n }\n }\n\n class(className: string) {\n return this.classes(className);\n }\n\n classes(...classes: StringOrSignal[]) {\n for (let cls of classes) {\n if (cls && cls.constructor === Signal) {\n const sig = cls as Signal;\n let previousValue = sig.value as string;\n this._node.classList.add(previousValue);\n sig.subscribe((newValue: string) => {\n this._node.classList.remove(previousValue);\n this._node.classList.add(newValue);\n previousValue = newValue;\n });\n } else {\n this._node.classList.add(cls as string);\n }\n }\n return this;\n }\n\n attribute(key: string, value: HtmlPropertyValue) {\n return this.attributes(key, value);\n }\n\n attributes(...attributes: HtmlPropertyValue[]) {\n if (arguments.length % 2 === 0) {\n for (let i = 0; i < arguments.length; i += 2) {\n const key = arguments[i];\n const value = arguments[i + 1];\n if (value && value.constructor === Signal) {\n this._node.setAttribute(key, value.value);\n value.onUpdate = (newValue: string) => {\n this._node.setAttribute(key, newValue);\n };\n } else {\n this._node.setAttribute(key, value);\n }\n }\n } else {\n throw new Error('Invalid number of arguments for attributes. Must be even. (key, value, key, value, ...)');\n }\n return this;\n }\n\n id(id: HtmlPropertyValue) {\n this.wrapProperty('id', id);\n return this;\n }\n\n text(text: HtmlPropertyValue) {\n this.wrapProperty('innerText', text);\n return this;\n }\n\n title(title: HtmlPropertyValue) {\n this.wrapProperty('title', title);\n return this;\n }\n\n html(html: HtmlPropertyValue) {\n this.wrapProperty('innerHTML', html);\n return this;\n }\n\n children(...children: (TypeOrSignal|TypeOrSignal|TypeOrSignal|null)[]) {\n for (let node of arguments) {\n if (isValidElement(node)) {\n this._node.appendChild(node);\n } else if (node instanceof DomNode) {\n this._node.appendChild(node.build());\n } else if (node && node.constructor === Signal) {\n node.subscribe((newValue: AnyNode) => {\n if (isValidElement(newValue)) {\n this._node.replaceChild(newValue as AnyElement, childNode);\n childNode = newValue;\n } else if (newValue.constructor === DomNode) {\n this._node.replaceChild(newValue.build(), childNode);\n childNode = newValue.build();\n } else {\n stack('Unexpected value for child. Must be an HTMLElement or a subclass.', newValue);\n }\n });\n let childNode = node.value;\n if (!isValidElement(childNode)) {\n // Create a placeholder div if the value is not an HTMLElement so we can swap it out later\n childNode = nullElement();\n }\n this._node.appendChild(childNode);\n } else if (node && node.constructor === Array) {\n for (let childNode of node) {\n this.children(childNode);\n }\n } else {\n if (node) {\n stack('Invalid node type. Must be an HTMLElement or a subclass.', node);\n }\n }\n }\n return this;\n }\n\n overwriteChildren() {\n this._node.innerHTML = '';\n return this.children(...arguments);\n }\n\n child() {\n return this.children(...arguments);\n }\n\n role(role: HtmlPropertyValue) {\n this.wrapProperty('role', role);\n return this;\n }\n\n prefixedAttribute(prefix: string, key: string, value: HtmlPropertyValue) {\n return this.attributes(`${prefix}-${key}`, value);\n }\n\n aria(key: string, value: HtmlPropertyValue) {\n return this.prefixedAttribute('aria', key, value);\n }\n\n data(key: string, value: HtmlPropertyValue) {\n return this.prefixedAttribute('data', key, value);\n }\n\n onclick(callback: EventHandler) {\n // @ts-ignore\n this._node.onclick = callback;\n return this;\n }\n\n onauxclick(callback: EventHandler) {\n // @ts-ignore\n this._node.onauxclick = callback;\n return this;\n }\n\n ondblclick(callback: EventHandler) {\n // @ts-ignore\n this._node.ondblclick = callback;\n return this;\n }\n\n onchange(callback: EventHandler) {\n // @ts-ignore\n this._node.onchange = callback;\n return this;\n }\n\n oninput(callback: EventHandler) {\n // @ts-ignore\n this._node.oninput = callback;\n return this;\n }\n\n onkeydown(callback: EventHandler) {\n // @ts-ignore\n this._node.onkeydown = callback;\n return this;\n }\n\n onkeyup(callback: EventHandler) {\n // @ts-ignore\n this._node.onkeyup = callback;\n return this;\n }\n\n onmousedown(callback: EventHandler) {\n // @ts-ignore\n this._node.onmousedown = callback;\n return this;\n }\n\n onmouseup(callback: EventHandler) {\n // @ts-ignore\n this._node.onmouseup = callback;\n return this;\n }\n\n onmouseover(callback: EventHandler) {\n // @ts-ignore\n this._node.onmouseover = callback;\n return this;\n }\n\n onmouseout(callback: EventHandler) {\n // @ts-ignore\n this._node.onmouseout = callback;\n return this;\n }\n\n onmousemove(callback: EventHandler) {\n // @ts-ignore\n this._node.onmousemove = callback;\n return this;\n }\n\n onmouseenter(callback: EventHandler) {\n // @ts-ignore\n this._node.onmouseenter = callback;\n return this;\n }\n\n onmouseleave(callback: EventHandler) {\n // @ts-ignore\n this._node.onmouseleave = callback;\n return this;\n }\n\n oncontextmenu(callback: EventHandler) {\n // @ts-ignore\n this._node.oncontextmenu = callback;\n return this;\n }\n\n onwheel(callback: EventHandler) {\n // @ts-ignore\n this._node.onwheel = callback;\n return this;\n }\n\n ondrag(callback: EventHandler) {\n // @ts-ignore\n this._node.ondrag = callback;\n return this;\n }\n\n ondragend(callback: EventHandler) {\n // @ts-ignore\n this._node.ondragend = callback;\n return this;\n }\n\n ondragenter(callback: EventHandler) {\n // @ts-ignore\n this._node.ondragenter = callback;\n return this;\n }\n\n ondragstart(callback: EventHandler) {\n // @ts-ignore\n this._node.ondragstart = callback;\n return this;\n }\n\n ondragleave(callback: EventHandler) {\n // @ts-ignore\n this._node.ondragleave = callback;\n return this;\n }\n\n ondragover(callback: EventHandler) {\n // @ts-ignore\n this._node.ondragover = callback;\n return this;\n }\n\n ondrop(callback: EventHandler) {\n // @ts-ignore\n this._node.ondrop = callback;\n return this;\n }\n\n onscroll(callback: EventListener) {\n this._node.onscroll = callback;\n return this;\n }\n\n onfocus(callback: EventListener) {\n this._node.onfocus = callback;\n return this;\n }\n\n onblur(callback: EventListener) {\n this._node.onblur = callback;\n return this;\n }\n\n onresize(callback: EventListener) {\n this._node.onresize = callback;\n return this;\n }\n\n onselect(callback: EventListener) {\n this._node.onselect = callback;\n return this;\n }\n\n onsubmit(callback: EventListener) {\n this._node.onsubmit = callback;\n return this;\n }\n\n onreset(callback: EventListener) {\n this._node.onreset = callback;\n return this;\n }\n\n onabort(callback: EventListener) {\n this._node.onabort = callback;\n return this;\n }\n\n onerror(callback: OnErrorEventHandler) {\n this._node.onerror = callback;\n return this;\n }\n\n oncanplay(callback: EventListener) {\n this._node.oncanplay = callback;\n return this;\n }\n\n oncanplaythrough(callback: EventListener) {\n this._node.oncanplaythrough = callback;\n return this;\n }\n\n ondurationchange(callback: EventListener) {\n this._node.ondurationchange = callback;\n return this;\n }\n\n onemptied(callback: EventListener) {\n this._node.onemptied = callback;\n return this;\n }\n\n onended(callback: EventListener) {\n this._node.onended = callback;\n return this;\n }\n\n onloadeddata(callback: EventListener) {\n this._node.onloadeddata = callback;\n return this;\n }\n\n onloadedmetadata(callback: EventListener) {\n this._node.onloadedmetadata = callback;\n return this;\n }\n\n onloadstart(callback: EventListener) {\n this._node.onloadstart = callback;\n return this;\n }\n\n onpause(callback: EventListener) {\n this._node.onpause = callback;\n return this;\n }\n\n onplay(callback: EventListener) {\n this._node.onplay = callback;\n return this;\n }\n\n onplaying(callback: EventListener) {\n this._node.onplaying = callback;\n return this;\n }\n\n onprogress(callback: EventListener) {\n this._node.onprogress = callback;\n return this;\n }\n\n onratechange(callback: EventListener) {\n this._node.onratechange = callback;\n return this;\n }\n\n onseeked(callback: EventListener) {\n this._node.onseeked = callback;\n return this;\n }\n\n onseeking(callback: EventListener) {\n this._node.onseeking = callback;\n return this;\n }\n\n onstalled(callback: EventListener) {\n this._node.onstalled = callback;\n return this;\n }\n\n onsuspend(callback: EventListener) {\n this._node.onsuspend = callback;\n return this;\n }\n\n ontimeupdate(callback: EventListener) {\n this._node.ontimeupdate = callback;\n return this;\n }\n\n onvolumechange(callback: EventListener) {\n this._node.onvolumechange = callback;\n return this;\n }\n\n onwaiting(callback: EventListener) {\n this._node.onwaiting = callback;\n return this;\n }\n\n oncopy(callback: EventListener) {\n this._node.oncopy = callback;\n return this;\n }\n\n oncut(callback: EventListener) {\n this._node.oncut = callback;\n return this;\n }\n\n onpaste(callback: EventListener) {\n this._node.onpaste = callback;\n return this;\n }\n\n onanimationstart(callback: EventListener) {\n this._node.onanimationstart = callback;\n return this;\n }\n\n onanimationend(callback: EventListener) {\n this._node.onanimationend = callback;\n return this;\n }\n\n onanimationiteration(callback: EventListener) {\n this._node.onanimationiteration = callback;\n return this;\n }\n\n ontransitionend(callback: EventListener) {\n this._node.ontransitionend = callback;\n return this;\n }\n\n on(eventName: string, callback: EventListenerOrEventListenerObject) {\n this._node.addEventListener(eventName, callback);\n return this;\n }\n\n open(open: HtmlPropertyValue) {\n this.wrapProperty('open', open);\n return this;\n }\n\n src(src: HtmlPropertyValue) {\n this.wrapProperty('src', src);\n return this;\n }\n\n alt(alt: HtmlPropertyValue) {\n this.wrapProperty('alt', alt);\n return this;\n }\n\n css(css: CssClass) {\n if (!css) {\n return this;\n }\n for (const [key, value] of Object.entries(css as Record)) {\n this.styles(key, value);\n }\n return this;\n }\n\n style(key: string, value: StringOrSignal) {\n return this.styles(key, value);\n }\n\n styles(...styles: StringOrSignal[]) {\n if (arguments.length % 2 === 0) {\n for (let i = 0; i < arguments.length; i += 2) {\n const key = arguments[i];\n const value = arguments[i + 1];\n if (key.constructor !== String) {\n throw new Error('Invalid key type for styles. Must be a string.');\n }\n if (value && value.constructor === Signal) {\n // @ts-ignore\n this._node.style[key] = value.value;\n value.onUpdate = (newValue: any) => {\n // @ts-ignore\n this._node.style[key] = newValue;\n };\n } else {\n // @ts-ignore\n this._node.style[key] = value;\n }\n }\n } else {\n throw new Error('Invalid number of arguments for styles. Must be even. (key, value, key, value, ...)');\n }\n return this;\n }\n\n width(width: HtmlPropertyValue) {\n this.wrapProperty('width', width);\n return this;\n }\n\n height(height: HtmlPropertyValue) {\n this.wrapProperty('height', height);\n return this;\n }\n\n type(type: TypeOrSignal) {\n // @ts-ignore\n this.wrapProperty('type', type);\n return this;\n }\n\n name(name: HtmlPropertyValue) {\n this.wrapProperty('name', name);\n return this;\n }\n\n value(value: HtmlPropertyValue) {\n this.wrapProperty('value', value);\n return this;\n }\n\n placeholder(placeholder: HtmlPropertyValue) {\n this.wrapProperty('placeholder', placeholder);\n return this;\n }\n\n for(forId: HtmlPropertyValue) {\n this.wrapProperty('for', forId);\n return this;\n }\n\n checked(checked: HtmlPropertyValue) {\n this.wrapProperty('checked', checked);\n return this;\n }\n\n disabled(disabled: HtmlPropertyValue) {\n this.wrapProperty('disabled', disabled);\n return this;\n }\n\n selected(selected: HtmlPropertyValue) {\n this.wrapProperty('selected', selected);\n return this;\n }\n\n href(href: HtmlPropertyValue) {\n this.wrapProperty('href', href);\n return this;\n }\n\n target(target: HtmlPropertyValue) {\n this.wrapProperty('target', target);\n return this;\n }\n\n rel(rel: HtmlPropertyValue) {\n this.wrapProperty('rel', rel);\n return this;\n }\n\n required(required: HtmlPropertyValue) {\n this.wrapProperty('required', required);\n return this;\n }\n\n multiple(multiple: HtmlPropertyValue) {\n this.wrapProperty('multiple', multiple);\n return this;\n }\n\n accept(accept: HtmlPropertyValue) {\n this.wrapProperty('accept', accept);\n return this;\n }\n\n acceptCharset(acceptCharset: HtmlPropertyValue) {\n this.wrapProperty('acceptCharset', acceptCharset);\n return this;\n }\n\n action(action: HtmlPropertyValue) {\n this.wrapProperty('action', action);\n return this;\n }\n\n autocomplete(autocomplete: HtmlPropertyValue) {\n this.wrapProperty('autocomplete', autocomplete);\n return this;\n }\n\n enctype(enctype: HtmlPropertyValue) {\n this.wrapProperty('enctype', enctype);\n return this;\n }\n\n method(method: HtmlPropertyValue) {\n this.wrapProperty('method', method);\n return this;\n }\n\n novalidate(novalidate: HtmlPropertyValue) {\n this.wrapProperty('novalidate', novalidate);\n return this;\n }\n}", "export class Images {\n static get FORMAT() {\n return \".webp\";\n }\n\n static get DEFAULT_AVATAR() {\n return window.location.origin + \"/img/defaults/avatar\" + Images.FORMAT;\n }\n\n static get DEFAULT_BANNER() {\n return window.location.origin + \"/img/defaults/banner\" + Images.FORMAT;\n }\n\n static get DEFAULT_COVER_TRACK() {\n return window.location.origin + \"/img/defaults/track\" + Images.FORMAT;\n }\n\n static get DEFAULT_COVER_ALBUM() {\n return window.location.origin + \"/img/defaults/album\" + Images.FORMAT;\n }\n\n static get DEFAULT_COVER_PLAYLIST() {\n return window.location.origin + \"/img/defaults/playlist\" + Images.FORMAT;\n }\n}", "export class CacheItem {\n content: T;\n reFetchUrl: string;\n reFetchMethod;\n reFetchHeaders;\n reFetchBody;\n reFetchTtlInSeconds;\n maximumRefetchCount;\n refetchCount;\n createTime;\n\n constructor(content: T, reFetchUrl = null, reFetchMethod = \"GET\", reFetchHeaders = {}, reFetchBody = \"\", reFetchTtlInSeconds = 60, maximumRefetchCount = 0) {\n this.content = content;\n this.reFetchUrl = reFetchUrl ?? \"\";\n this.reFetchMethod = reFetchMethod;\n this.reFetchHeaders = reFetchHeaders;\n this.reFetchBody = reFetchBody;\n this.reFetchTtlInSeconds = reFetchTtlInSeconds;\n this.maximumRefetchCount = maximumRefetchCount;\n this.refetchCount = 0;\n this.createTime = new Date();\n }\n}", "import {CacheItem} from \"./CacheItem.ts\";\n\nexport class LydaCache {\n static disable = false;\n static cacheImplementation = sessionStorage;\n\n static get(cacheKey: string): CacheItem {\n if (this.disable) {\n return new CacheItem(null);\n }\n\n const cacheItem = this.cacheImplementation.getItem(cacheKey);\n\n let value;\n try {\n value = JSON.parse(cacheItem);\n } catch (e) {\n value = cacheItem;\n }\n\n if (value === null) {\n return new CacheItem(null);\n }\n\n if (value.content) {\n try {\n value.content = JSON.parse(value.content);\n } catch (e) { /* empty */ }\n }\n\n return value;\n }\n\n static set(cacheKey: string, cacheItem: any) {\n if (this.disable) {\n return;\n }\n if (!(cacheItem instanceof CacheItem)) {\n throw new Error(\"cacheItem must be an instance of CacheItem\");\n }\n this.cacheImplementation.setItem(cacheKey, JSON.stringify(cacheItem));\n if (cacheItem.reFetchUrl !== null) {\n setTimeout(() => {\n this.reFetch(cacheKey, cacheItem);\n }, cacheItem.reFetchTtlInSeconds * 1000);\n }\n }\n\n static reFetch(cacheKey: string, cacheItem: any) {\n if (this.disable) {\n return;\n }\n if (!(cacheItem instanceof CacheItem)) {\n throw new Error(\"cacheItem must be an instance of CacheItem\");\n }\n if (!cacheItem.reFetchUrl) {\n return;\n }\n fetch(cacheItem.reFetchUrl, {\n method: cacheItem.reFetchMethod,\n headers: cacheItem.reFetchHeaders,\n body: cacheItem.reFetchBody,\n credentials: \"include\"\n }).then(async (response) => {\n const res = await response.text();\n try {\n return JSON.parse(res);\n } catch (e) {\n return res;\n }\n }).then((data) => {\n cacheItem.content = data;\n cacheItem.refetchCount++;\n this.cacheImplementation.setItem(cacheKey, JSON.stringify(cacheItem));\n });\n }\n\n static clear() {\n this.cacheImplementation.clear();\n }\n\n static remove(cacheKey: string) {\n this.cacheImplementation.removeItem(cacheKey);\n }\n}\n", "export class Config {\n static get appBaseUrl() {\n return window.location.host;\n }\n static get apiBaseUrl() {\n return window.location.hostname === \"localhost\" ? \"http://localhost:8081\" : \"https://api.lyda.app\";\n }\n static get storageBaseUrl() {\n return window.location.hostname === \"localhost\" ? \"http://localhost:8081\" : \"https://api.lyda.app\";\n }\n\n static get() {\n try {\n let config = {\n appBaseUrl: Config.appBaseUrl,\n apiBaseUrl: Config.apiBaseUrl,\n storageBaseUrl: Config.storageBaseUrl,\n filePath: Config.storageBaseUrl + \"/storage/v2\",\n avatarPath: \"\",\n bannerPath: \"\",\n coverPath: \"\",\n coverPathTracks: \"\",\n coverPathAlbums: \"\",\n coverPathPlaylists: \"\",\n } as { [key: string]: string };\n\n config = {\n ...config,\n avatarPath: config.filePath + \"/avatars/\",\n bannerPath: config.filePath + \"/banners/\",\n coverPath: config.filePath + \"/covers/\",\n coverPathTracks: config.coverPath + \"tracks/\",\n coverPathAlbums: config.coverPath + \"albums/\",\n coverPathPlaylists: config.coverPath + \"playlists/\",\n }\n\n return config;\n } catch (e) {\n console.error(\"Failed to create config\");\n }\n }\n\n static getKey(key: string): string|null {\n const config = Config.get();\n return config ? config[key] : null;\n }\n}", "import {Config} from \"../Classes/Config.ts\";\n\nexport class ApiRoutes {\n static base = Config.apiBaseUrl;\n // region Audit\n private static audit = ApiRoutes.base + \"/audit\";\n static getLogs = ApiRoutes.audit + \"/logs\";\n static getActionLogs = ApiRoutes.audit + \"/actionLogs\";\n // endregion\n\n // region User\n private static auth = ApiRoutes.base + \"/auth\";\n\n private static user = ApiRoutes.base + \"/user\";\n static getUser = ApiRoutes.user + \"/get\";\n static userSettings = ApiRoutes.user + \"/settings\";\n static userPermissions = ApiRoutes.user + \"/permissions\";\n static randomUser = ApiRoutes.user + \"/random\";\n static userExists = ApiRoutes.user + \"/exists\";\n static getLibrary = ApiRoutes.user + \"/library\";\n static exportUser = ApiRoutes.user + \"/export\";\n\n private static userActions = ApiRoutes.user + \"/actions\";\n static followUser = ApiRoutes.userActions + \"/follow\";\n static unfollowUser = ApiRoutes.userActions + \"/unfollow\";\n static verifyUser = ApiRoutes.userActions + \"/verify\";\n static unverifyUser = ApiRoutes.userActions + \"/unverify\";\n static requestVerification = ApiRoutes.userActions + \"/requestVerification\";\n static login = ApiRoutes.userActions + \"/login\";\n static logout = ApiRoutes.userActions + \"/logout\";\n static register = ApiRoutes.userActions + \"/register\";\n static requestMfaCode = ApiRoutes.userActions + \"/mfa-request\";\n static updateUserSetting = ApiRoutes.userActions + \"/update-setting\";\n static changePassword = ApiRoutes.userActions + \"/change-password\";\n static requestPasswordReset = ApiRoutes.userActions + \"/request-password-reset\";\n static resetPassword = ApiRoutes.userActions + \"/reset-password\";\n static updateUser = ApiRoutes.userActions + \"/update\";\n static verifyEmail = ApiRoutes.userActions + \"/verify-email\";\n static deleteUser = ApiRoutes.userActions + \"/delete\";\n static sendActivationEmail = ApiRoutes.userActions + \"/send-activation-email\";\n // endregion\n\n // region Subscriptions\n private static subscriptions = ApiRoutes.base + \"/subscriptions\";\n static getSubscriptionOptions = ApiRoutes.subscriptions + \"/options\";\n\n private static subscriptionActions = ApiRoutes.subscriptions + \"/actions\";\n static subscribe = ApiRoutes.subscriptionActions + \"/subscribe\";\n static unsubscribe = ApiRoutes.subscriptionActions + \"/unsubscribe\";\n // endregion\n\n // region Media\n private static media = ApiRoutes.base + \"/media\";\n static uploadMedia = ApiRoutes.media + \"/upload\";\n static deleteMedia = ApiRoutes.media + \"/delete\";\n static getImageMedia = ApiRoutes.media + \"/image\";\n // endregion\n\n // region Notifications\n private static notifications = ApiRoutes.base + \"/notifications\";\n static getAllNotifications = ApiRoutes.notifications + \"/get\";\n static markAllNotificationsAsRead = ApiRoutes.notifications + \"/actions/markAllAsRead\";\n // endregion\n\n // region Tracks\n private static tracks = ApiRoutes.base + \"/tracks\";\n static getTrackById = ApiRoutes.tracks + \"/byId\";\n static getTrackByUserId = ApiRoutes.tracks + \"/byUserId\";\n static getTrackAudio = ApiRoutes.tracks + \"/audio\";\n static getTrackCollabTypes = ApiRoutes.tracks + \"/collabTypes\";\n static getUnapprovedCollabs = ApiRoutes.tracks + \"/unapprovedCollabs\";\n static createTrack = ApiRoutes.tracks + \"/create\";\n static getRepostsByUserId = ApiRoutes.tracks + \"/repostsByUserId\";\n\n private static tracksActions = ApiRoutes.tracks + \"/actions\";\n static likeTrack = ApiRoutes.tracksActions + \"/like\";\n static unlikeTrack = ApiRoutes.tracksActions + \"/unlike\";\n static repostTrack = ApiRoutes.tracksActions + \"/repost\";\n static unrepostTrack = ApiRoutes.tracksActions + \"/unrepost\";\n static regenerateSecret = ApiRoutes.tracksActions + \"/regenerateSecret\";\n static deleteTrack = ApiRoutes.tracksActions + \"/delete\";\n static updateTrack = ApiRoutes.tracksActions + \"/update\";\n static updateTrackFull = ApiRoutes.tracksActions + \"/updateFull\";\n static saveTrackPlay = ApiRoutes.tracksActions + \"/savePlay\";\n static removeCollaborator = ApiRoutes.tracksActions + \"/removeCollaborator\";\n static addCollaborator = ApiRoutes.tracksActions + \"/addCollaborator\";\n static approveCollab = ApiRoutes.tracksActions + \"/approveCollab\";\n static denyCollab = ApiRoutes.tracksActions + \"/denyCollab\";\n\n private static feeds = ApiRoutes.tracks + \"/feeds\";\n static followingFeed = ApiRoutes.feeds + \"/following\";\n static exploreFeed = ApiRoutes.feeds + \"/explore\";\n static autoQueueFeed = ApiRoutes.feeds + \"/autoQueue\";\n // endregion\n\n // region Albums\n private static albums = ApiRoutes.base + \"/albums\";\n static getAlbumById = ApiRoutes.albums + \"/byId\";\n static getAlbumsByUserId = ApiRoutes.albums + \"/byUserId\";\n\n private static albumActions = ApiRoutes.albums + \"/actions\";\n static newAlbum = ApiRoutes.albumActions + \"/new\";\n static deleteAlbum = ApiRoutes.albumActions + \"/delete\";\n static addTrackToAlbums = ApiRoutes.albumActions + \"/addTrack\";\n static removeTrackFromAlbums = ApiRoutes.albumActions + \"/removeTrack\";\n static reorderAlbumTracks = ApiRoutes.albumActions + \"/reorderTracks\";\n static likeAlbum = ApiRoutes.albumActions + \"/like\";\n static unlikeAlbum = ApiRoutes.albumActions + \"/unlike\";\n // endregion\n\n // region Playlists\n private static playlists = ApiRoutes.base + \"/playlists\";\n static getPlaylistById = ApiRoutes.playlists + \"/byId\";\n static getPlaylistsByUserId = ApiRoutes.playlists + \"/byUserId\";\n\n private static playlistActions = ApiRoutes.playlists + \"/actions\";\n static newPlaylist = ApiRoutes.playlistActions + \"/new\";\n static deletePlaylist = ApiRoutes.playlistActions + \"/delete\";\n static addTrackToPlaylists = ApiRoutes.playlistActions + \"/addTrack\";\n static addAlbumToPlaylists = ApiRoutes.playlistActions + \"/addAlbum\";\n static removeTrackFromPlaylists = ApiRoutes.playlistActions + \"/removeTrack\";\n static reorderPlaylistTracks = ApiRoutes.playlistActions + \"/reorderTracks\";\n static likePlaylist = ApiRoutes.playlistActions + \"/like\";\n static unlikePlaylist = ApiRoutes.playlistActions + \"/unlike\";\n // endregion\n\n // region Comments\n private static comments = ApiRoutes.base + \"/comments\";\n static getModerationComments = ApiRoutes.comments + \"/get\";\n static getCommentsByTrackId = ApiRoutes.comments + \"/byTrackId\";\n\n private static commentActions = ApiRoutes.comments + \"/actions\";\n static newComment = ApiRoutes.commentActions + \"/new\";\n static deleteComment = ApiRoutes.commentActions + \"/delete\";\n static setCommentPotentiallyHarmful = ApiRoutes.commentActions + \"/setPotentiallyHarmful\";\n static setCommentHidden = ApiRoutes.commentActions + \"/setHidden\";\n // endregion\n\n // region Statistics\n private static statistics = ApiRoutes.base + \"/statistics\";\n static getPlayCountByTrack = ApiRoutes.statistics + \"/playCountByTrack\";\n static getPlayCountByMonth = ApiRoutes.statistics + \"/playCountByMonth\";\n static getLikesByTrack = ApiRoutes.statistics + \"/likesByTrack\";\n static getRoyaltiesByMonth = ApiRoutes.statistics + \"/royaltiesByMonth\";\n static getRoyaltiesByTrack = ApiRoutes.statistics + \"/royaltiesByTrack\";\n static getActivityByTime = ApiRoutes.statistics + \"/activityByTime\";\n // endregion\n\n // region Royalties\n private static royalties = ApiRoutes.base + \"/royalties\";\n static getRoyaltyInfo = ApiRoutes.royalties + \"/info\";\n static requestPayment = ApiRoutes.royalties + \"/requestPayment\";\n static calculateEarnings = ApiRoutes.royalties + \"/calculateEarnings\";\n static calculateRoyalties = ApiRoutes.royalties + \"/calculate\";\n static setRoyaltyActivation = ApiRoutes.royalties + \"/setActivation\";\n // endregion\n\n // region Search\n private static search = ApiRoutes.base + \"/search\";\n static searchTracks = ApiRoutes.search + \"/tracks\";\n static searchAlbums = ApiRoutes.search + \"/albums\";\n static searchPlaylists = ApiRoutes.search + \"/playlists\";\n static searchUsers = ApiRoutes.search + \"/users\";\n // endregion\n}", "import {compute, signal} from \"../fjsc/src/signals.ts\";\nimport {StreamClient} from \"./Streaming/StreamClient.ts\";\nimport {PlayingFrom} from \"./Models/PlayingFrom.ts\";\nimport {Track} from \"./Models/DbModels/lyda/Track.ts\";\nimport {LydaCache} from \"./Cache/LydaCache.ts\";\nimport {CacheItem} from \"./Cache/CacheItem.ts\";\nimport {User} from \"./Models/DbModels/lyda/User.ts\";\nimport {TrackPosition} from \"./Models/TrackPosition.ts\";\nimport {LoopMode} from \"./Enums/LoopMode.ts\";\nimport {Notification} from \"./Models/DbModels/lyda/Notification.ts\";\nimport {Permission} from \"./Models/DbModels/lyda/Permission.ts\";\n\nexport const dragging = signal(false);\n\nexport const navInitialized = signal(false);\n\nexport const streamClients = signal>({});\n\nexport const currentTrackId = signal(0);\ncurrentTrackId.subscribe((id, changed) => {\n if (!changed) {\n return;\n }\n LydaCache.set(\"currentTrackId\", new CacheItem(id));\n});\n\nexport const currentQuality = signal(\"h\");\n\nexport const trackInfo = signal>({});\n\nexport const volume = signal(0.25);\nvolume.subscribe((newValue, changed) => {\n if (!changed) {\n return;\n }\n LydaCache.set(\"volume\", new CacheItem(newValue));\n});\n\nexport const muted = signal(false);\n\nexport const manualQueue = signal([]);\nlet cachedQueue = LydaCache.get(\"manualQueue\").content ?? [];\nif (cachedQueue.constructor === Number) {\n cachedQueue = [cachedQueue];\n}\nmanualQueue.value = cachedQueue.filter(id => id !== undefined && id !== null);\nmanualQueue.subscribe((newQueue, changed) => {\n if (!changed) {\n return;\n }\n LydaCache.set(\"manualQueue\", new CacheItem(newQueue));\n});\n\nexport const contextQueue = signal([]);\ncontextQueue.subscribe((newQueue, changed) => {\n if (!changed) {\n return;\n }\n LydaCache.set(\"contextQueue\", new CacheItem(newQueue));\n});\nexport const autoQueue = signal([]);\n\nexport const playingFrom = signal(null);\n\nexport const currentTrackPosition = signal({ relative: 0, absolute: 0 });\ncurrentTrackPosition.subscribe((p, changed) => {\n if (!changed) {\n return;\n }\n LydaCache.set(\"currentTrackPosition\", new CacheItem(p));\n});\n\nexport const currentlyBuffered = signal(0);\n\nexport const playingElsewhere = signal(false);\n\nexport const playingHere = signal(false);\n\nexport const openMenus = signal([]);\n\nexport const currentUser = signal(null);\n\nexport const loopMode = signal(LoopMode.off);\nloopMode.value = LydaCache.get(\"loopMode\").content ?? LoopMode.off;\nloopMode.subscribe((newMode, changed) => {\n if (!changed) {\n return;\n }\n LydaCache.set(\"loopMode\", new CacheItem(newMode));\n});\n\nexport const currentSecretCode = signal(\"\");\n\nexport const notifications = signal([]);\n\nexport const permissions = signal([]);", "import {notify} from \"./Ui.ts\";\nimport {Images} from \"../Enums/Images.ts\";\nimport {LydaCache} from \"../Cache/LydaCache.ts\";\nimport {Api, ApiResponse} from \"../Api/Api.ts\";\nimport {CacheItem} from \"../Cache/CacheItem.ts\";\nimport {AnyElement} from \"../../fjsc/src/f2.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {MediaFileType} from \"../Enums/MediaFileType.ts\";\nimport {User} from \"../Models/DbModels/lyda/User.ts\";\nimport {currentUser, dragging} from \"../state.ts\";\nimport {compute, Signal} from \"../../fjsc/src/signals.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\nimport {Comment} from \"../Models/DbModels/lyda/Comment.ts\";\nimport {Likable} from \"../Models/Likable.ts\";\nimport {Track} from \"../Models/DbModels/lyda/Track.ts\";\n\nexport class Util {\n static capitalizeFirstLetter(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n }\n\n static getUrlParameter(name: string) {\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n return urlParams.get(name);\n }\n\n static getUserAvatar(id: number|null) {\n if (id === null) {\n return Images.DEFAULT_AVATAR;\n }\n return ApiRoutes.getImageMedia + `?id=${id}&quality=500&mediaFileType=${MediaFileType.userAvatar}&t=${Date.now()}`;\n }\n\n static getUserBanner(id: number|null) {\n if (id === null) {\n return Images.DEFAULT_BANNER;\n }\n return ApiRoutes.getImageMedia + `?id=${id}&quality=500&mediaFileType=${MediaFileType.userBanner}&t=${Date.now()}`;\n }\n\n static getTrackCover(id: number) {\n return ApiRoutes.getImageMedia + `?id=${id}&quality=500&mediaFileType=${MediaFileType.trackCover}&t=${Date.now()}`;\n }\n\n static getAlbumCover(id: number) {\n return ApiRoutes.getImageMedia + `?id=${id}&quality=500&mediaFileType=${MediaFileType.albumCover}&t=${Date.now()}`;\n }\n\n static getPlaylistCover(id: number) {\n return ApiRoutes.getImageMedia + `?id=${id}&quality=500&mediaFileType=${MediaFileType.playlistCover}&t=${Date.now()}`;\n }\n\n static async fileExists(url: string) {\n let response = await fetch(url);\n return response.status === 200;\n }\n\n static async updateImage(newSrc: string, oldSrc: string) {\n const fileExists = await this.fileExists(newSrc);\n if (!fileExists) {\n setTimeout(() => {\n this.updateImage(newSrc, oldSrc);\n }, 1000);\n } else {\n const images = document.querySelectorAll(\"img\");\n images.forEach((i) => {\n if (i.src === oldSrc) {\n i.src = newSrc;\n }\n });\n }\n }\n\n static formatDate(date: string|Date) {\n if (date.constructor === String) {\n date = new Date(date);\n }\n return (date as Date).toLocaleDateString();\n }\n\n static hideElementIfCondition(conditionFunc: Function, className: string, e: any) {\n if (conditionFunc(e)) {\n const target = e.target.parentElement.querySelector(\".\" + className);\n if (target === null) {\n return;\n }\n if (target.classList.contains(\"hidden\")) {\n return;\n }\n target.classList.add(\"hidden\");\n } else {\n document.addEventListener(\"click\", e => Util.hideElementIfCondition(conditionFunc, className, e), { once: true });\n }\n }\n\n static async getUserAsync(id: number|null = null, allowCache = true) {\n if (!id) {\n if (allowCache) {\n const userData = currentUser.value;\n if (userData !== null) {\n return userData;\n }\n }\n return await Util.getUser();\n } else {\n if (allowCache) {\n // TODO: Implement caching for user by id\n }\n const res = await Api.getAsync(ApiRoutes.getUser, { id: nullIfEmpty(id) });\n if (res.code === 401) {\n return null;\n }\n if (res.code === 500) {\n notify(\"An error occurred while fetching the user\", NotificationType.error);\n return null;\n }\n return Util.mapNullToEmptyString(res.data);\n }\n }\n\n static arrayPropertyMatchesUser(array: any[], property: any) {\n if (!array || !property || !currentUser.value) {\n return false;\n }\n return array.some((e) => e[property] === currentUser.value!.id);\n }\n\n static userHasLiked(entity: Likable) {\n return compute(u => !!(u && entity.likes?.some(l => l.user_id === u.id)), currentUser);\n }\n\n static userHasReposted(entity: Track) {\n return compute(u => !!(u && entity.reposts?.some(r => r.user_id === u.id)), currentUser);\n }\n\n static userIsFollowing(user: User) {\n return compute(u => !!(u && user.follows?.some(f => f.following_user_id === u.id)), currentUser);\n }\n\n static userIsFollowedBy(user: User) {\n return compute(u => !!(u && user.follows?.some(f => f.user_id === u.id)), currentUser);\n }\n\n static async getUserByNameAsync(name: string) {\n const res = await Api.getAsync(ApiRoutes.getUser, { name: nullIfEmpty(name) });\n if (res.code === 401) {\n return null;\n }\n if (res.code === 500) {\n notify(\"An error occurred while fetching the user\", NotificationType.error);\n return null;\n }\n return Util.mapNullToEmptyString(res.data);\n }\n\n static initializeModalRemove(modalContainer: AnyElement) {\n setTimeout(() => {\n document.addEventListener(\"click\", e => {\n const foundModal = document.querySelector(\".modal\");\n if (foundModal && !foundModal.contains(target(e))) {\n Util.removeModal(modalContainer);\n }\n }, {once: true});\n }, 100);\n }\n\n static removeModal(modal: AnyElement|null = null) {\n if (modal === null || !(modal instanceof HTMLElement)) {\n modal = document.querySelector(\".modal-container\");\n }\n if (modal) {\n modal.remove();\n }\n }\n\n static parseCachedUser(rawCachedUser: string|User|null) {\n let userData;\n try {\n userData = JSON.parse(rawCachedUser as string);\n } catch(e) {\n userData = rawCachedUser;\n }\n return userData;\n }\n\n static mapNullToEmptyString(obj: any) {\n for (const key in obj) {\n if (obj[key] === null) {\n obj[key] = \"\";\n }\n }\n return obj;\n }\n\n static async getUser() {\n let userData;\n const res = await Api.getAsync(ApiRoutes.getUser);\n if (res.code === 401) {\n return null;\n }\n userData = res.data;\n if (userData === null) {\n return null;\n }\n currentUser.value = Util.mapNullToEmptyString(userData);\n return currentUser.value;\n }\n\n static includeStylesheet(css: string) {\n const links = document.head.querySelectorAll(\"link[href='\" + css + \"']\");\n if (links !== null && links.length > 0) {\n return;\n }\n const link = document.createElement(\"link\");\n link.setAttribute(\"rel\", \"stylesheet\");\n link.setAttribute(\"href\", css);\n document.head.appendChild(link);\n }\n\n static removeStylesheet(css: string) {\n const links = document.head.querySelectorAll(\"link[href='\" + css + \"']\");\n if (links !== null) {\n links.forEach((l) => {\n l.remove();\n });\n }\n }\n\n static isLoggedIn() {\n return currentUser.value !== null;\n }\n\n static downloadFile(fileName: string, content: string) {\n const link = document.createElement(\"a\");\n link.href = \"data:text/plain;charset=utf-8,\" + encodeURIComponent(content);\n link.download = fileName;\n link.click();\n }\n\n static nestComments(comments: Comment[]): Comment[] {\n const commentMap: Record = {};\n\n // Step 1: Create a map with parent as key and child comments as the value\n comments.forEach((comment) => {\n const parentId = comment.parent_id ?? 0;\n\n // If the comment has a parent, group it under the parent's id\n if (!commentMap[parentId]) {\n commentMap[parentId] = [];\n }\n commentMap[parentId].push({ ...comment, comments: [] }); // Ensure comments array exists\n });\n\n // Step 2: Recursively nest comments\n const buildNestedComments = (parentId: number): Comment[] => {\n if (!commentMap[parentId]) {\n return [];\n }\n\n return commentMap[parentId].map((comment) => {\n // Assign nested comments recursively\n comment.comments = buildNestedComments(comment.id);\n return comment;\n });\n };\n\n // Step 3: Start nesting from root-level comments (parent_id === 0)\n return buildNestedComments(0);\n }\n}\n\nexport function nullIfEmpty(value: any) {\n if (value === undefined) {\n return null;\n }\n\n return value;\n}\n\nexport function finalizeLogin(step: Signal, user: User) {\n LydaCache.set(\"user\", new CacheItem(JSON.stringify(user)));\n step.value = \"complete\";\n\n let referrer = document.referrer;\n if (referrer !== \"\" && !referrer.includes(\"login\")) {\n //window.location.href = referrer;\n } else {\n //window.location.href = \"/home\";\n }\n}\n\nexport function getUserSettingValue(user: User, key: string) {\n const val = user.settings?.find(s => s.key === key)?.value;\n if (val === \"true\") return true as T;\n if (val === \"false\") return false as T;\n return val as T;\n}\n\nexport function userHasSettingValue(user: User, key: string, value: string) {\n return getUserSettingValue(user, key) === value;\n}\n\nexport function updateUserSetting(user: User, key: string, value: string) {\n return user.settings?.map(s => {\n if (s.key === key) {\n s.value = value;\n }\n return s;\n })\n}\n\nexport function target(e: Event) {\n return e.target as T;\n}\n\nexport function getErrorMessage(res: ApiResponse) {\n if (res.data?.error) {\n return res.data.error;\n }\n\n switch (res.code) {\n case 400:\n return \"Invalid request\";\n case 401:\n return \"Not logged in\";\n case 403:\n return \"Missing permissions\";\n case 404:\n return \"Not found\";\n case 500:\n return \"Server error\";\n default:\n return \"Unknown error\";\n }\n}\n\nexport async function copy(text: string) {\n await navigator.clipboard.writeText(text);\n notify(\"Copied to clipboard\", NotificationType.success);\n}\n\n\nexport function updateImagesWithSource(newSrc: string, oldSrc: string) {\n oldSrc = oldSrc.replace(/&t=\\d+/, \"\");\n const imgs = document.querySelectorAll(\"img\") as NodeListOf;\n for (const img of imgs) {\n if (img.src.includes(oldSrc)) {\n img.src = newSrc;\n }\n }\n}", "export class Icons {\n static get BASE_URL() {\n return window.location.origin + \"/img/icons/\";\n }\n\n static get IMAGE_FORMAT() {\n return \".svg\";\n }\n\n static validateIcon(icon: string) {\n if (icon === null || icon === undefined || icon === \"\") {\n return Icons.LYDA;\n }\n\n /*fetch(icon).then((response) => {\n if (response.status === 404) {\n console.error(\"Icon not found: \", icon);\n }\n });*/\n\n return icon;\n }\n\n static ICON(fileName: string): string {\n return Icons.validateIcon(Icons.BASE_URL + fileName + Icons.IMAGE_FORMAT);\n }\n\n static get WARNING() {\n return Icons.ICON(\"warning\");\n }\n\n static get QUEUE() {\n return Icons.ICON(\"queue\");\n }\n\n static get UNQUEUE() {\n return Icons.ICON(\"unqueue\");\n }\n\n static get PAUSE() {\n return Icons.ICON(\"pause\");\n }\n\n static get PLAY() {\n return Icons.ICON(\"play\");\n }\n\n static get LOUD() {\n return Icons.ICON(\"loud\");\n }\n\n static get MUTE() {\n return Icons.ICON(\"mute\");\n }\n\n static get LIKE() {\n return Icons.ICON(\"like\");\n }\n\n static get LIKE_OUTLINE() {\n return Icons.ICON(\"like_outline\");\n }\n\n static get COMMENT() {\n return Icons.ICON(\"comment\");\n }\n\n static get LYDA() {\n return Icons.ICON(\"lyda_black\");\n }\n\n static get DELETE() {\n return Icons.ICON(\"delete\");\n }\n\n static get BELL() {\n return Icons.ICON(\"bell\");\n }\n\n static get LAMP_ON() {\n return Icons.ICON(\"lamp_on\");\n }\n\n static get LAMP_OFF() {\n return Icons.ICON(\"lamp_off\");\n }\n\n static get BURGER() {\n return Icons.ICON(\"burger\");\n }\n\n static get X() {\n return Icons.ICON(\"x\");\n }\n\n static get REPLY() {\n return Icons.ICON(\"reply\");\n }\n\n static get ALBUM_ADD() {\n return Icons.ICON(\"album_add\");\n }\n\n static get PLAYLIST_ADD() {\n return Icons.ICON(\"playlist_add\");\n }\n\n static get ARROW_UP() {\n return Icons.ICON(\"arrow_up\");\n }\n\n static get ARROW_DOWN() {\n return Icons.ICON(\"arrow_down\");\n }\n\n static get ARROW_LEFT() {\n return Icons.ICON(\"arrow_left\");\n }\n\n static get ARROW_RIGHT() {\n return Icons.ICON(\"arrow_right\");\n }\n\n static get UPLOAD() {\n return Icons.ICON(\"upload\");\n }\n\n static get SETTINGS() {\n return Icons.ICON(\"settings\");\n }\n\n static get STATISTICS() {\n return Icons.ICON(\"statistics\");\n }\n\n static get UP() {\n return Icons.ICON(\"up\");\n }\n\n static get DOWN() {\n return Icons.ICON(\"down\");\n }\n\n static get LEFT() {\n return Icons.ICON(\"left\");\n }\n\n static get RIGHT() {\n return Icons.ICON(\"right\");\n }\n\n static get LOCK() {\n return Icons.ICON(\"lock\");\n }\n\n static get LOOP_SINGLE() {\n return Icons.ICON(\"loop_single\");\n }\n\n static get LOOP_CONTEXT() {\n return Icons.ICON(\"loop_context\");\n }\n\n static get LOOP_OFF() {\n return Icons.ICON(\"loop_off\");\n }\n\n static get LOGOUT() {\n return Icons.ICON(\"logout\");\n }\n\n static get FOLLOW() {\n return Icons.ICON(\"follow\");\n }\n\n static get UNFOLLOW() {\n return Icons.ICON(\"unfollow\");\n }\n\n static get VERIFIED() {\n return Icons.ICON(\"verified\");\n }\n\n static get LOGIN() {\n return Icons.ICON(\"login\");\n }\n\n static get RELOAD() {\n return Icons.ICON(\"reload\");\n }\n\n static get ACCOUNTS() {\n return Icons.ICON(\"accounts\");\n }\n\n static get SUBSCRIPTIONS() {\n return Icons.ICON(\"subscriptions\");\n }\n\n static get CALCULATE() {\n return Icons.ICON(\"calculate\");\n }\n\n static get PAY() {\n return Icons.ICON(\"pay\");\n }\n\n static get PAYPAL() {\n return Icons.ICON(\"paypal\");\n }\n\n static get PEN() {\n return Icons.ICON(\"pen\");\n }\n\n static get SPINNER() {\n return Icons.ICON(\"spinner\");\n }\n\n static get REPOST() {\n return Icons.ICON(\"repost\");\n }\n\n static get APPROVAL() {\n return Icons.ICON(\"approval\");\n }\n\n static get CHECK() {\n return Icons.ICON(\"check\");\n }\n\n static get PEOPLE() {\n return Icons.ICON(\"people\");\n }\n\n static get STARS() {\n return Icons.ICON(\"stars\");\n }\n\n static get COPY() {\n return Icons.ICON(\"copy\");\n }\n\n static get DROPDOWN() {\n return Icons.ICON(\"dropdown\");\n }\n\n static get GIFT() {\n return Icons.ICON(\"gift\");\n }\n}", "import {signal} from \"../../../fjsc/src/signals.ts\";\n\nexport class Time {\n static localDate(time: number|string|Date) {\n return new Date(time).toDateString();\n }\n\n static adjust(time: number|string|Date): Date {\n time = new Date(time);\n time.setMinutes(time.getMinutes() - time.getTimezoneOffset());\n return time;\n }\n\n static ago(time: number|string|Date, useShort = false): string {\n time = Time.adjust(time);\n switch (typeof time) {\n case \"number\":\n break;\n case \"string\":\n time = +new Date(time);\n break;\n case \"object\":\n if (time.constructor === Date) time = time.getTime();\n break;\n default:\n time = +new Date();\n }\n const time_formats = [\n [60, \"seconds\", 1], // 60\n [120, \"1 minute ago\", \"1 minute from now\"], // 60*2\n [3600, \"minutes\", 60], // 60*60, 60\n [7200, \"1 hour ago\", \"1 hour from now\"], // 60*60*2\n [86400, \"hours\", 3600], // 60*60*24, 60*60\n [172800, \"Yesterday\", \"Tomorrow\"], // 60*60*24*2\n [604800, \"days\", 86400], // 60*60*24*7, 60*60*24\n [1209600, \"Last week\", \"Next week\"], // 60*60*24*7*4*2\n [2419200, \"weeks\", 604800], // 60*60*24*7*4, 60*60*24*7\n [4838400, \"Last month\", \"Next month\"], // 60*60*24*7*4*2\n [29030400, \"months\", 2419200], // 60*60*24*7*4*12, 60*60*24*7*4\n [58060800, \"Last year\", \"Next year\"], // 60*60*24*7*4*12*2\n [2903040000, \"years\", 29030400], // 60*60*24*7*4*12*100, 60*60*24*7*4*12\n [5806080000, \"Last century\", \"Next century\"], // 60*60*24*7*4*12*100*2\n [58060800000, \"centuries\", 2903040000] // 60*60*24*7*4*12*100*20, 60*60*24*7*4*12*100\n ];\n const time_formats_short = [\n [60, \"s\", 1], // 60\n [120, \"1m ago\", \"1m until\"], // 60*2\n [3600, \"m\", 60], // 60*60, 60\n [7200, \"1h ago\", \"1h until\"], // 60*60*2\n [86400, \"h\", 3600], // 60*60*24, 60*60\n [172800, \"1d ago\", \"1d until\"], // 60*60*24*2\n [604800, \"d\", 86400], // 60*60*24*7, 60*60*24\n [1209600, \"1w ago\", \"1w until\"], // 60*60*24*7*4*2\n [2419200, \"w\", 604800], // 60*60*24*7*4, 60*60*24*7\n [4838400, \"1mo ago\", \"1mo until\"], // 60*60*24*7*4*2\n [29030400, \"mo\", 2419200], // 60*60*24*7*4*12, 60*60*24*7*4\n [58060800, \"1y ago\", \"1y until\"], // 60*60*24*7*4*12*2\n [2903040000, \"y\", 29030400], // 60*60*24*7*4*12*100, 60*60*24*7*4*12\n [5806080000, \"1c ago\", \"1c until\"], // 60*60*24*7*4*12*100*2\n [58060800000, \"c\", 2903040000] // 60*60*24*7*4*12*100*20, 60*60*24*7*4*12*100\n ];\n let seconds = (+new Date() - time) / 1000,\n token = \"ago\",\n list_choice = 1;\n\n if (seconds === 0) {\n return \"Just now\";\n }\n if (seconds < 0) {\n seconds = Math.abs(seconds);\n token = \"from now\";\n list_choice = 2;\n }\n let i = 0, format;\n const used_formats = useShort ? time_formats_short : time_formats;\n while ((format = used_formats[i++])) {\n if (seconds < (format[0] as number)) {\n if (typeof format[2] == \"string\")\n return format[list_choice] as string;\n else\n return Math.floor(seconds / format[2]) + \" \" + format[1] + \" \" + token;\n }\n }\n return time.toString();\n }\n\n static #shouldUpdateInSeconds(time: string) {\n return time.includes(\"seconds\") || time === \"Just now\";\n }\n\n static agoUpdating(time: number|string|Date, useShort = false) {\n const state = signal(Time.ago(time, useShort));\n const update = () => {\n state.value = Time.ago(time, useShort);\n const updateInterval = Time.#shouldUpdateInSeconds(state.value) ? 1000 : 60000;\n if (state.value.includes(\"hours\")) {\n return;\n }\n setTimeout(update, updateInterval);\n };\n update();\n\n return state;\n }\n\n static format(time: number): string {\n let minutes = Math.floor(time / 60);\n let seconds = Math.floor(time - minutes * 60);\n return minutes + \":\" + seconds.toString().padStart(2, \"0\");\n }\n\n static toTimeString(time: number|string|Date) {\n return new Date(time).toTimeString().split(\" \")[0];\n }\n}", "import {Api} from \"../Api/Api.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\n\nexport class QueueActions {\n static async getNewAutoQueueTracks() {\n const response = await Api.getAsync(ApiRoutes.autoQueueFeed);\n return response.data;\n }\n}", "import {StreamingUpdater} from \"./StreamingUpdater.ts\";\nimport {LydaCache} from \"../Cache/LydaCache.ts\";\nimport {PlayManager} from \"./PlayManager.ts\";\nimport {QueueActions} from \"../Actions/QueueActions.ts\";\nimport {autoQueue, contextQueue, manualQueue} from \"../state.ts\";\n\nexport class QueueManager {\n static addToAutoQueue(id: number) {\n autoQueue.value.push(id);\n\n StreamingUpdater.updateQueue().then();\n }\n\n static setAutoQueue(queue: number[]) {\n autoQueue.value = queue;\n\n StreamingUpdater.updateQueue().then();\n }\n\n static addToManualQueue(id: number) {\n if (!id) {\n return;\n }\n manualQueue.value = [...new Set([...manualQueue.value, id])];\n\n StreamingUpdater.updateQueue().then();\n }\n\n static clearAutoQueue() {\n autoQueue.value = [];\n\n StreamingUpdater.updateQueue().then();\n }\n\n static setContextQueue(queue: number[]) {\n contextQueue.value = queue;\n\n StreamingUpdater.updateQueue().then();\n }\n\n static clearContextQueue() {\n contextQueue.value = [];\n\n StreamingUpdater.updateQueue().then();\n }\n\n static async popFromAutoQueue() {\n let autoQueueTmp = QueueManager.getAutoQueue();\n let firstItem = autoQueueTmp[0];\n\n if (firstItem === undefined) {\n await QueueManager.fillAutoQueue();\n firstItem = autoQueueTmp[0];\n if (firstItem === undefined) {\n return undefined;\n }\n }\n\n autoQueueTmp = autoQueueTmp.slice(1);\n autoQueue.value = autoQueueTmp;\n\n StreamingUpdater.updateQueue().then();\n return firstItem;\n }\n\n static async fillAutoQueue() {\n const queueToAdd = await QueueActions.getNewAutoQueueTracks();\n autoQueue.value = autoQueue.value.concat(queueToAdd);\n\n StreamingUpdater.updateQueue().then();\n }\n\n static getNextTrackInContextQueue(currentId: number) {\n const index = contextQueue.value.findIndex(id => id === currentId);\n if (index === -1) {\n return null;\n }\n return contextQueue.value[index + 1];\n }\n\n static removeFromManualQueue(id: number) {\n manualQueue.value = manualQueue.value.filter((queueId) => queueId !== id);\n\n StreamingUpdater.updateQueue().then();\n }\n\n static removeFromAllQueues(id: number) {\n manualQueue.value = manualQueue.value.filter((queueId) => queueId !== id);\n contextQueue.value = contextQueue.value.filter((queueId) => queueId !== id);\n autoQueue.value = autoQueue.value.filter((queueId) => queueId !== id);\n\n StreamingUpdater.updateQueue().then();\n }\n\n static toggleInManualQueue(id: number) {\n if (QueueManager.isInManualQueue(id)) {\n QueueManager.removeFromManualQueue(id);\n } else {\n QueueManager.addToManualQueue(id);\n }\n }\n\n static getAutoQueue() {\n let autoQueueTmp = autoQueue.value;\n if (autoQueueTmp.length === 0) {\n let cache = LydaCache.get(\"queue\").content;\n if (cache) {\n autoQueueTmp = (cache.length ? cache : [cache]) as number[];\n autoQueue.value = autoQueueTmp;\n }\n }\n return autoQueueTmp;\n }\n\n static getContextQueue() {\n let contextQueueTmp = contextQueue.value;\n if (contextQueueTmp.length === 0) {\n let cache = LydaCache.get(\"contextQueue\").content;\n if (cache) {\n contextQueueTmp = (cache.length ? cache : [cache]) as number[];\n contextQueue.value = contextQueueTmp;\n }\n }\n return contextQueueTmp;\n }\n\n static getManualQueue(): number[] {\n return manualQueue.value;\n }\n\n static isInManualQueue(id: number) {\n const manualQueue = QueueManager.getManualQueue();\n return manualQueue.includes(id);\n }\n\n static moveInManualQueue(index: number, newIndex: number) {\n const queue = QueueManager.getManualQueue();\n const item = queue[index];\n queue.splice(index, 1);\n queue.splice(newIndex, 0, item);\n StreamingUpdater.updateQueue().then();\n }\n}", "import type {AnyElement, StringOrSignal, TypeOrSignal} from \"./f2.ts\";\nimport {create, ifjs, signalMap} from \"./f2.ts\";\nimport type {\n BooleanConfig,\n ButtonConfig,\n ContainerConfig,\n HeadingConfig,\n IconConfig,\n InputConfig,\n SearchableSelectConfig,\n SelectOption,\n SelectOptionConfig,\n TextareaConfig,\n TextConfig,\n} from \"./Types.ts\";\nimport {InputType} from \"./Types.ts\";\nimport {compute, Signal, signal} from \"./signals.ts\";\n\nfunction getDisabledClass(config: { disabled?: TypeOrSignal }) {\n let disabledClass;\n if (config.disabled?.subscribe) {\n disabledClass = compute((newValue): string =>\n newValue ? \"disabled\" : \"enabled\", config.disabled as Signal);\n } else {\n disabledClass = config.disabled ? \"disabled\" : \"enabled\";\n }\n\n return disabledClass;\n}\n\nexport class FJSC {\n static button(config: ButtonConfig) {\n config.classes ??= [];\n\n return create(\"button\")\n .applyGenericConfig(config)\n .onclick(config.onclick)\n .classes(getDisabledClass(config))\n .attributes(\"tabindex\", config.tabindex ?? \"0\")\n .children(\n ifjs(config.icon, () => FJSC.icon(config.icon!)),\n ifjs(config.text, () => FJSC.text({\n text: config.text!,\n }))\n ).build();\n }\n\n static input(config: InputConfig) {\n const errors = signal([]);\n const hasError = compute((e) => [...e].length > 0, errors);\n const invalidClass = compute((has: boolean): string => has ? \"invalid\" : \"valid\", hasError);\n const touched = signal(false);\n const isPassword = config.type === InputType.password;\n const passwordClass: string = isPassword ? \"fjsc-password-input\" : \"_\";\n const toggleState = signal(false);\n const configTypeSignal = config.type.constructor === Signal ? config.type as Signal : signal(config.type as InputType);\n const actualType = compute((t: boolean) => t ? InputType.text : configTypeSignal.value, toggleState);\n let lastChange = 0;\n let debounceTimeout: number | Timer | undefined;\n\n function validate(newValue: any) {\n errors.value = [];\n if (config.debounce) {\n if (Date.now() - lastChange < config.debounce) {\n if (debounceTimeout) {\n clearTimeout(debounceTimeout);\n }\n debounceTimeout = setTimeout(() => {\n debounceTimeout = undefined;\n validate(newValue);\n }, config.debounce);\n return;\n }\n }\n config.validators?.forEach(async valFunction => {\n const valErrors = await valFunction(newValue);\n if (valErrors) {\n errors.value = errors.value.concat(valErrors);\n }\n });\n if (config.required && (newValue === null || newValue === undefined || newValue === \"\") && touched.value) {\n errors.value = errors.value.concat([\"This field is required.\"]);\n }\n }\n\n let value: Signal = config.value as Signal;\n if (config.value?.subscribe) {\n config.value.subscribe(validate);\n validate(config.value.value);\n } else {\n validate(config.value as T);\n // @ts-ignore\n value = signal(config.value ?? \"\");\n }\n\n return create(\"div\")\n .classes(\"flex-v\", \"fjsc\")\n .children(\n create(\"label\")\n .classes(\"flex-v\", \"fjsc\", getDisabledClass(config))\n .text(config.label ?? \"\")\n .for(config.title)\n .children(\n create(\"input\")\n .classes(invalidClass, passwordClass)\n .applyGenericConfig(config)\n .type(actualType)\n .value(value)\n .accept(config.accept ?? \"\")\n .required(config.required ?? false)\n .placeholder(config.placeholder ?? \"\")\n .attributes(\"autofocus\", config.autofocus ?? \"\")\n .oninput((e: any) => {\n touched.value = true;\n lastChange = Date.now();\n if (!config.value?.subscribe) {\n validate(e.target.value);\n }\n\n if (config.onchange) {\n config.onchange(e.target.value);\n }\n })\n .onchange((e: any) => {\n touched.value = true;\n lastChange = Date.now();\n if (!config.value?.subscribe) {\n validate(e.target.value);\n }\n\n if (config.onchange) {\n config.onchange(e.target.value);\n }\n })\n .onkeydown(config.onkeydown ?? (() => {}))\n .name(config.name)\n .build(),\n ifjs(isPassword, FJSC.eyeButton(toggleState, () => {\n toggleState.value = !toggleState.value;\n })),\n ).build(),\n ifjs(hasError, FJSC.errorList(errors))\n ).build();\n }\n\n static eyeButton(toggleState: Signal, onClick: Function): AnyElement {\n const icon = compute((t: boolean): string => t ? \"visibility\" : \"visibility_off\", toggleState);\n\n return create(\"div\")\n .classes(\"fjsc-eye-button\")\n .onclick(onClick)\n .children(\n FJSC.icon({\n icon,\n adaptive: true,\n isUrl: false,\n })\n ).build();\n }\n\n static textarea(config: TextareaConfig) {\n const errors = signal([]);\n const hasError = compute((e) => e.length > 0, errors);\n const invalidClass = compute((has: boolean): string => has ? \"invalid\" : \"valid\", hasError);\n\n function validate(newValue: any) {\n errors.value = [];\n config.validators?.forEach(async valFunction => {\n const valErrors = await valFunction(newValue);\n if (valErrors) {\n errors.value = errors.value.concat(valErrors);\n }\n });\n if (config.required && (newValue === null || newValue === undefined || newValue === \"\")) {\n errors.value = errors.value.concat([\"This field is required.\"]);\n }\n }\n\n if (config.value?.subscribe) {\n config.value.subscribe(validate);\n validate(config.value.value);\n } else {\n validate(config.value as string);\n }\n\n return create(\"div\")\n .classes(\"flex-v\", \"fjsc\")\n .children(\n create(\"label\")\n .classes(\"flex-v\", \"fjsc\", getDisabledClass(config))\n .text(config.label ?? \"\")\n .for(config.name)\n .children(\n create(\"textarea\")\n .classes(invalidClass)\n .applyGenericConfig(config)\n .styles(\"resize\", config.resize ?? \"vertical\")\n .value(config.value)\n .required(config.required ?? false)\n .placeholder(config.placeholder ?? \"\")\n .attributes(\"autofocus\", config.autofocus ?? \"\", \"rows\", config.rows?.toString() ?? \"3\")\n .oninput((e: any) => {\n if (!config.value?.subscribe) {\n validate(e.target.value);\n }\n\n if (config.onchange) {\n config.onchange(e.target.value);\n }\n })\n .onchange((e: any) => {\n if (!config.value?.subscribe) {\n validate(e.target.value);\n }\n\n if (config.onchange) {\n config.onchange(e.target.value);\n }\n })\n .name(config.name)\n .build(),\n ).build(),\n ifjs(hasError, FJSC.errorList(errors))\n ).build();\n }\n\n static errorList(errors: Signal) {\n return signalMap(errors, create(\"div\")\n .classes(\"flex-v\", \"fjsc\", \"fjsc-error-list\"), FJSC.error);\n }\n\n static error(error: StringOrSignal) {\n return create(\"span\")\n .classes(\"fjsc-error\")\n .text(error)\n .build();\n }\n\n static area(config: ContainerConfig) {\n config.classes ??= [];\n config.children ??= [];\n\n return create(config.tag ?? \"div\")\n .applyGenericConfig(config)\n .classes(\"fjsc-area\")\n .children(...config.children)\n .build();\n }\n\n static container(config: ContainerConfig) {\n config.classes ??= [];\n config.children ??= [];\n\n return create(config.tag ?? \"div\")\n .applyGenericConfig(config)\n .classes(\"fjsc-container\")\n .children(...config.children)\n .build();\n }\n\n static text(config: TextConfig) {\n return create(config.tag ?? \"span\")\n .applyGenericConfig(config)\n .text(config.text)\n .build();\n }\n\n static heading(config: HeadingConfig) {\n return create(`h${config.level ?? 1}`)\n .applyGenericConfig(config)\n .text(config.text)\n .build();\n }\n\n static icon(config: IconConfig) {\n const icon = config.icon;\n const isMaterial = !config.isUrl;\n const iconClass = config.adaptive ? \"adaptive-icon\" : \"static-icon\";\n const pointerClass = config.title ? \"_\" : \"no-pointer\";\n\n if (isMaterial) {\n return create(\"i\")\n .applyGenericConfig(config)\n .classes(iconClass, \"material-symbols-outlined\", pointerClass)\n .text(icon)\n .onclick(config.onclick)\n .build();\n }\n\n return create(\"img\")\n .applyGenericConfig(config)\n .classes(iconClass, pointerClass)\n .attributes(\"src\", icon)\n .onclick(config.onclick)\n .build();\n }\n\n static searchableSelect(config: SearchableSelectConfig) {\n const options = config.options ?? signal([]);\n const value = config.value ?? signal(null);\n\n const search = signal(options.value.find(o => o.id === value.value)?.name ?? \"\");\n value.subscribe((newVal) => {\n search.value = options.value.find(o => o.id === newVal)?.name ?? \"\";\n });\n const optionsVisible = signal(false);\n const filtered = signal(options.value);\n const selectedIndex = signal(0);\n const filter = () => {\n //filtered.value = options.value.filter(o => o.name.toLowerCase().includes(search.value.toLowerCase()));\n selectedIndex.value = options.value.findIndex(o => o.name.toLowerCase().includes(search.value.toLowerCase()));\n }\n options.subscribe(filter);\n search.subscribe(filter);\n filter();\n const selectedId = signal(options.value[0]?.id ?? null);\n const updateSelectedId = () => {\n selectedId.value = filtered.value[selectedIndex.value]?.id;\n }\n selectedIndex.subscribe(updateSelectedId);\n filtered.subscribe(updateSelectedId);\n updateSelectedId();\n const currentIcon = compute((vis: boolean): string => vis ? \"arrow_drop_up\" : \"arrow_drop_down\", optionsVisible);\n\n return create(\"div\")\n .applyGenericConfig(config)\n .classes(\"fjsc-search-select\", \"flex-v\", \"relative\")\n .children(\n ifjs(config.label, create(\"label\")\n .classes(\"fjsc\")\n .text(config.label)\n .build()),\n create(\"div\")\n .classes(\"flex\", \"fjsc-search-select-visible\", \"fjsc\")\n .children(\n create(\"input\")\n .classes(\"fjsc\", \"fjsc-search-select-input\", getDisabledClass(config))\n .value(search)\n .onfocus(() => {\n optionsVisible.value = true;\n })\n .onkeydown((e: any) => {\n switch (e.key) {\n case \"Enter\":\n e.preventDefault();\n e.stopPropagation();\n const selectedOption = filtered.value[selectedIndex.value];\n value.value = selectedOption?.id ?? value.value;\n search.value = selectedOption?.name ?? search.value;\n optionsVisible.value = false;\n break;\n case \"ArrowDown\":\n e.preventDefault();\n e.stopPropagation();\n selectedIndex.value = (selectedIndex.value + 1) % filtered.value.length;\n break;\n case \"ArrowUp\":\n e.preventDefault();\n e.stopPropagation();\n selectedIndex.value = (selectedIndex.value - 1 + filtered.value.length) % filtered.value.length;\n break;\n case \"Escape\":\n case \"Tab\":\n optionsVisible.value = false;\n break;\n default:\n if ((e.keyCode > 32 && e.keyCode < 126) || e.key === \"Backspace\") {\n setTimeout(() => {\n search.value = e.target.value;\n });\n }\n break;\n }\n })\n .build(),\n create(\"div\")\n .classes(\"fjsc-search-select-dropdown\", getDisabledClass(config))\n .onclick(() => {\n optionsVisible.value = !optionsVisible.value;\n })\n .children(\n FJSC.icon({\n icon: currentIcon,\n adaptive: true,\n isUrl: false,\n })\n ).build()\n ).build(),\n ifjs(optionsVisible, signalMap(filtered, create(\"div\").classes(\"fjsc-search-select-options\", \"flex-v\"), (option: SelectOption) =>\n FJSC.searchSelectOption({option, value, search, optionsVisible, selectedId})))\n ).build();\n }\n\n static searchSelectOption(config: SelectOptionConfig) {\n let element: any;\n const selectedClass = compute((id: string): string => {\n element?.scrollIntoView({behavior: \"smooth\", block: \"nearest\"});\n return id === config.option.id ? \"selected\" : \"_\";\n }, config.selectedId);\n\n element = create(\"div\")\n .classes(\"fjsc-search-select-option\", \"flex\", \"gap\", \"padded\", selectedClass)\n .onclick(() => {\n config.value.value = config.option.id;\n config.search.value = config.option.name;\n config.optionsVisible.value = false;\n })\n .children(\n ifjs(config.option.image, FJSC.icon({\n icon: config.option.image ?? \"\",\n isUrl: config.option.imageIsUrl,\n adaptive: true\n })),\n create(\"span\")\n .text(config.option.name)\n .build()\n ).build();\n return element;\n }\n\n static checkbox(config: BooleanConfig) {\n const errors = signal([]);\n const hasError = compute((e) => e.length > 0, errors);\n const invalidClass = compute((has: boolean): string => has ? \"invalid\" : \"valid\", hasError);\n\n function validate(newValue: boolean) {\n errors.value = [];\n config.validators?.forEach(async valFunction => {\n const valErrors = await valFunction(newValue);\n if (valErrors) {\n errors.value = errors.value.concat(valErrors);\n }\n });\n if (config.required && (newValue === null || newValue === undefined || newValue === false)) {\n errors.value = errors.value.concat([\"This field is required.\"]);\n }\n }\n\n let checked: StringOrSignal;\n if (config.checked && config.checked.subscribe) {\n const sig = config.checked as Signal;\n sig.subscribe(validate);\n validate(sig.value);\n checked = compute(c => c.toString(), sig);\n } else {\n validate(config.checked as boolean);\n checked = config.checked.toString();\n }\n\n return create(\"div\")\n .classes(\"flex-v\", \"fjsc\")\n .children(\n create(\"label\")\n .applyGenericConfig(config)\n .classes(\"fjsc-checkbox-container\", invalidClass, getDisabledClass(config))\n .text(config.text)\n .children(\n create(\"input\")\n .type(InputType.checkbox)\n .name(config.name ?? \"\")\n .id(config.name ?? \"\")\n .required(config.required ?? false)\n .checked(checked)\n .onclick((e) => {\n const c = (e.target as HTMLInputElement).checked;\n if (!config.checked.subscribe) {\n validate(c);\n }\n\n config.onchange && config.onchange(c);\n })\n .build(),\n create(\"span\")\n .classes(\"fjsc-checkmark\")\n .children(\n ifjs(config.checked, create(\"span\")\n .classes(\"fjsc-checkmark-icon\")\n .text(\"✓\")\n .build())\n ).build(),\n ).build(),\n ifjs(hasError, FJSC.errorList(errors))\n ).build();\n }\n\n static toggle(config: BooleanConfig) {\n const errors = signal([]);\n const hasError = compute((e) => e.length > 0, errors);\n const invalidClass = compute((has: boolean): string => has ? \"invalid\" : \"valid\", hasError);\n\n function validate(newValue: boolean) {\n errors.value = [];\n config.validators?.forEach(async valFunction => {\n const valErrors = await valFunction(newValue);\n if (valErrors) {\n errors.value = errors.value.concat(valErrors);\n }\n });\n if (config.required && (newValue === null || newValue === undefined || newValue === false)) {\n errors.value = errors.value.concat([\"This field is required.\"]);\n }\n }\n\n if (config.checked.subscribe) {\n const sig = config.checked as Signal;\n sig.subscribe(validate);\n validate(sig.value);\n } else {\n validate(config.checked as boolean);\n }\n\n return create(\"div\")\n .classes(\"flex-v\", \"fjsc\")\n .children(\n create(\"label\")\n .applyGenericConfig(config)\n .classes(\"flex\", \"gap\", \"align-children\", invalidClass, getDisabledClass(config))\n .for(config.name ?? \"\")\n .children(\n create(\"input\")\n .type(InputType.checkbox)\n .classes(\"hidden\", \"fjsc-slider\")\n .id(config.name ?? \"\")\n .required(config.required ?? false)\n .checked(config.checked)\n .onclick((e) => {\n const checked = (e.target as HTMLInputElement).checked;\n if (!config.checked.subscribe) {\n validate(checked);\n }\n\n config.onchange && config.onchange(checked);\n })\n .build(),\n create(\"div\")\n .classes(\"fjsc-toggle-container\")\n .children(\n create(\"span\")\n .classes(\"fjsc-toggle-slider\")\n .build()\n ).build(),\n create(\"span\")\n .classes(\"fjsc-toggle-text\")\n .text(config.text ?? \"\")\n .build(),\n ).build(),\n ifjs(hasError, FJSC.errorList(errors))\n ).build();\n }\n}", "import {Icons} from \"../Enums/Icons.js\";\nimport {GenericTemplates} from \"./GenericTemplates.ts\";\nimport {PlaylistActions} from \"../Actions/PlaylistActions.ts\";\nimport {Time} from \"../Classes/Helpers/Time.ts\";\nimport {TrackTemplates} from \"./TrackTemplates.ts\";\nimport {UserTemplates} from \"./UserTemplates.ts\";\nimport {TrackActions} from \"../Actions/TrackActions.ts\";\nimport {QueueManager} from \"../Streaming/QueueManager.ts\";\nimport {PlayManager} from \"../Streaming/PlayManager.ts\";\nimport {StatisticsTemplates} from \"./StatisticsTemplates.ts\";\nimport {Images} from \"../Enums/Images.ts\";\nimport {Util} from \"../Classes/Util.ts\";\nimport {notify, Ui} from \"../Classes/Ui.ts\";\nimport {FJSC} from \"../../fjsc\";\nimport {User} from \"../Models/DbModels/lyda/User.ts\";\nimport {Playlist} from \"../Models/DbModels/lyda/Playlist.ts\";\nimport {AnyNode, create, HtmlPropertyValue, ifjs} from \"../../fjsc/src/f2.ts\";\nimport {Track} from \"../Models/DbModels/lyda/Track.ts\";\nimport {Album} from \"../Models/DbModels/lyda/Album.ts\";\nimport {navigate} from \"../Routing/Router.ts\";\nimport {InputType} from \"../../fjsc/src/Types.ts\";\nimport {compute, Signal, signal} from \"../../fjsc/src/signals.ts\";\nimport {UserWidgetContext} from \"../Enums/UserWidgetContext.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\nimport {ListTrack} from \"../Models/ListTrack.ts\";\n\nexport class PlaylistTemplates {\n static async addTrackToPlaylistModal(track: Track, playlists: Playlist[]) {\n if (playlists.some(p => !p.tracks)) {\n return create(\"div\").text(\"No playlists found\").build();\n }\n\n const checkedPlaylists = signal(playlists.filter(p => p.tracks!.some(t => t.track_id === track.id)).map(p => p.id));\n let playlistList = [];\n if (playlists.length === 0) {\n playlistList.push(create(\"span\")\n .classes(\"nopointer\")\n .text(\"No playlists found\")\n .build());\n } else {\n playlistList = await Promise.all(playlists.map(async (playlist) => {\n if (!playlist.tracks) {\n console.warn(\"Playlist has no tracks: \", playlist);\n return;\n }\n\n return await PlaylistTemplates.playlistInAddList(playlist, checkedPlaylists);\n })) as AnyNode[];\n }\n\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"img\")\n .styles(\"width\", \"30px\", \"height\", \"auto\")\n .classes(\"inline-icon\", \"svg\", \"nopointer\")\n .attributes(\"src\", Icons.PLAYLIST_ADD)\n .build(),\n create(\"h5\")\n .text(`Add ${track.title} to playlist`)\n .build()\n )\n .build(),\n create(\"div\")\n .classes(\"check-list\")\n .children(...playlistList)\n .build(),\n create(\"div\")\n .classes(\"flex\")\n .children(\n FJSC.button({\n text: \"Ok\",\n onclick: async () => PlaylistActions.addTrackToPlaylists(track.id, checkedPlaylists.value),\n icon: {icon: \"playlist_add\"},\n classes: [\"positive\"],\n }),\n GenericTemplates.modalCancelButton()\n ).build()\n ).build();\n }\n\n static async addAlbumToPlaylistModal(album: Album, playlists: Playlist[]) {\n const checkedPlaylists = signal(playlists.filter(p => p.tracks?.some(t => album.tracks?.some(ata => ata.track_id === t.track_id))).map(p => p.id));\n let playlistList = [];\n if (playlists.length === 0) {\n playlistList.push(create(\"span\")\n .classes(\"nopointer\")\n .text(\"No playlists found\")\n .build());\n } else {\n playlistList = await Promise.all(playlists.map(async (playlist: Playlist) => {\n return await PlaylistTemplates.playlistInAddList(playlist, checkedPlaylists);\n }));\n }\n\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"img\")\n .styles(\"width\", \"30px\", \"height\", \"auto\")\n .classes(\"inline-icon\", \"svg\", \"nopointer\")\n .attributes(\"src\", Icons.PLAYLIST_ADD)\n .build(),\n create(\"h5\")\n .text(`Add ${album.title} to playlist`)\n .build()\n ).build(),\n create(\"div\")\n .classes(\"check-list\")\n .children(...playlistList)\n .build(),\n create(\"div\")\n .classes(\"flex\")\n .children(\n FJSC.button({\n text: \"Ok\",\n onclick: async () => PlaylistActions.addAlbumToPlaylists(album.id, checkedPlaylists.value),\n icon: {icon: \"playlist_add\"},\n classes: [\"positive\"],\n }),\n GenericTemplates.modalCancelButton()\n ).build()\n ).build();\n }\n\n static async playlistInAddList(item: Playlist, checkedItems: Signal) {\n const checked = compute((ch) => ch.includes(item.id), checkedItems);\n const checkedClass = compute((c): string => c ? \"active\" : \"_\", checked);\n\n return create(\"div\")\n .classes(\"flex\", \"padded\", \"check-list-item\", checkedClass)\n .onclick(() => {\n if (checked.value) {\n checkedItems.value = checkedItems.value.filter(id => id !== item.id);\n } else {\n checkedItems.value = [...checkedItems.value, item.id];\n }\n })\n .children(\n await PlaylistTemplates.smallPlaylistCover(item),\n create(\"span\")\n .text(item.title)\n .build(),\n ).build();\n }\n\n static newPlaylistModal() {\n const playlist = signal(>{\n title: \"\",\n description: \"\",\n visibility: \"public\",\n });\n const name = compute(s => s.title ?? \"\", playlist);\n const description = compute(s => s.description ?? \"\", playlist);\n const visibility = compute(s => s.visibility === \"private\", playlist);\n const disabled = compute(s => {\n return !s.title || s.title === \"\";\n }, playlist);\n\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"h2\")\n .children(\n FJSC.icon({\n icon: \"playlist_add\",\n adaptive: true,\n }),\n create(\"span\")\n .text(\"New playlist\")\n .build(),\n ).build(),\n create(\"div\")\n .classes(\"flex-v\")\n .id(\"newPlaylistForm\")\n .children(\n FJSC.input({\n type: InputType.text,\n required: true,\n name: \"name\",\n label: \"Name\",\n placeholder: \"Playlist name\",\n value: name,\n onchange: (v) => {\n playlist.value = {...playlist.value, title: v};\n }\n }),\n FJSC.textarea({\n name: \"description\",\n label: \"Description\",\n placeholder: \"My cool playlist\",\n value: description,\n onchange: (v) => {\n playlist.value = {...playlist.value, description: v};\n }\n }),\n FJSC.toggle({\n name: \"visibility\",\n label: \"Private\",\n text: \"Private\",\n checked: visibility,\n onchange: (v) => {\n playlist.value = {...playlist.value, visibility: v ? \"private\" : \"public\"};\n }\n }),\n ).build(),\n create(\"div\")\n .classes(\"flex\")\n .children(\n FJSC.button({\n text: \"Create playlist\",\n disabled,\n onclick: async () => {\n await PlaylistActions.createNewPlaylist(playlist.value);\n Util.removeModal();\n },\n icon: {\n icon: \"playlist_add\"\n },\n classes: [\"positive\"],\n }),\n GenericTemplates.modalCancelButton()\n ).build()\n ).build();\n }\n\n static noPlaylistsYet(isOwnProfile: boolean) {\n let children;\n if (isOwnProfile) {\n children = [\n create(\"p\")\n .text(\"You have not created any playlists yet.\")\n .build(),\n create(\"div\")\n .classes(\"button-container\")\n .children(GenericTemplates.newPlaylistButton([\"secondary\"]))\n .build(),\n ];\n } else {\n children = [\n create(\"p\")\n .text(\"This user has not created any playlists yet.\")\n .build()\n ];\n }\n\n return create(\"div\")\n .classes(\"card\", \"flex-v\")\n .children(...children)\n .build();\n }\n\n static playlistCard(playlist: Playlist, isSecondary: boolean = false) {\n const icons = [];\n if (playlist.visibility === \"private\") {\n icons.push(GenericTemplates.lock());\n }\n const coverState = signal(Images.DEFAULT_COVER_PLAYLIST);\n if (playlist.has_cover) {\n coverState.value = Util.getPlaylistCover(playlist.id);\n }\n if (!playlist.user) {\n throw new Error(`Playlist ${playlist.id} has no user`);\n }\n if (!playlist.likes) {\n throw new Error(`Playlist ${playlist.id} has no likes`);\n }\n\n return create(\"div\")\n .classes(\"playlist-card\", \"padded\", \"flex-v\", \"small-gap\", isSecondary ? \"secondary\" : \"_\")\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n PlaylistTemplates.playlistCover(playlist, \"card-cover\"),\n create(\"div\")\n .classes(\"flex-v\", \"small-gap\")\n .children(\n PlaylistTemplates.title(playlist.title, playlist.id, icons),\n UserTemplates.userWidget(playlist.user, Util.arrayPropertyMatchesUser(playlist.user.follows ?? [], \"following_user_id\"), [], [], UserWidgetContext.card),\n create(\"span\")\n .classes(\"date\", \"text-small\", \"nopointer\", \"color-dim\")\n .text(Time.ago(playlist.created_at))\n .build(),\n ).build(),\n ).build(),\n create(\"div\")\n .classes(\"stats-container\", \"flex\", \"rounded\")\n .children(\n StatisticsTemplates.likesIndicator(\"playlist\", playlist.id, playlist.likes.length,\n Util.arrayPropertyMatchesUser(playlist.likes, \"user_id\")),\n StatisticsTemplates.likeListOpener(playlist.likes),\n ).build()\n ).build();\n }\n\n static title(title: HtmlPropertyValue, id: HtmlPropertyValue, icons: AnyNode[] = []) {\n return create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"span\")\n .classes(\"clickable\", \"text-large\", \"pointer\")\n .text(title)\n .onclick(() => {\n navigate(\"playlist/\" + id);\n }).build(),\n ...icons,\n ).build();\n }\n\n static playlistCover(playlist: Playlist, coverType: string) {\n const coverState = signal(Images.DEFAULT_COVER_PLAYLIST);\n if (playlist.has_cover) {\n coverState.value = Util.getPlaylistCover(playlist.id);\n }\n if (!playlist.tracks) {\n throw new Error(`Playlist ${playlist.id} has no tracks`);\n }\n\n return create(\"div\")\n .classes(\"cover-container\", \"relative\", \"pointer\", coverType)\n .attributes(\"playlist_id\", playlist.id)\n .id(playlist.id)\n .onclick(async () => {\n notify(\"Starting playlist \" + playlist.id, NotificationType.info);\n PlayManager.playFrom(\"playlist\", playlist.title, playlist.id);\n QueueManager.setContextQueue(playlist.tracks!.map(t => t.track_id));\n const firstTrack = playlist.tracks![0];\n if (!firstTrack) {\n notify(\"This playlist has no tracks\", NotificationType.error);\n return;\n }\n PlayManager.addStreamClientIfNotExists(firstTrack.track_id, firstTrack.track?.length ?? 0);\n await PlayManager.startAsync(firstTrack.track_id);\n })\n .children(\n create(\"img\")\n .classes(\"cover\", \"nopointer\", \"blurOnParentHover\")\n .src(coverState)\n .alt(playlist.title)\n .build(),\n create(\"img\")\n .classes(\"play-button-icon\", \"centeredInParent\", \"showOnParentHover\", \"inline-icon\", \"svgInverted\", \"nopointer\")\n .src(Icons.PLAY)\n .build(),\n ).build();\n }\n\n static async smallPlaylistCover(playlist: Playlist) {\n const coverState = signal(Images.DEFAULT_COVER_PLAYLIST);\n if (playlist.has_cover) {\n coverState.value = Util.getPlaylistCover(playlist.id);\n }\n\n return create(\"img\")\n .classes(\"cover\", \"rounded\", \"nopointer\", \"blurOnParentHover\")\n .styles(\"height\", \"var(--font-size-large)\")\n .src(coverState)\n .alt(playlist.title)\n .build();\n }\n\n static playlistCardsContainer(children: AnyNode[]) {\n return create(\"div\")\n .classes(\"profileContent\", \"playlists\", \"flex\")\n .children(...children)\n .build();\n }\n\n static async playlistPage(data: { playlist: Playlist, canEdit: boolean }, user: User) {\n const playlist = data.playlist;\n if (!playlist.tracks) {\n throw new Error(`Playlist ${playlist.id} has no tracks`);\n }\n const tracks = signal(playlist.tracks);\n const noTracks = compute(t => t.length === 0, tracks);\n const a_user = playlist.user;\n if (!a_user) {\n throw new Error(`Playlist ${playlist.id} has no user`);\n }\n if (!playlist.likes) {\n throw new Error(`Playlist ${playlist.id} has no likes array`);\n }\n\n async function startCallback(trackId: number) {\n await PlaylistActions.startTrackInPlaylist(playlist, trackId);\n }\n\n const editActions = [];\n if (data.canEdit) {\n editActions.push(FJSC.button({\n text: \"Delete\",\n icon: {icon: \"delete\"},\n classes: [\"negative\"],\n onclick: async () => {\n await Ui.getConfirmationModal(\"Delete playlist\", \"Are you sure you want to delete this playlist?\", \"Yes\", \"No\", () => PlaylistActions.deletePlaylist(playlist.id), () => {\n }, Icons.WARNING);\n }\n }));\n }\n const coverLoading = signal(false);\n const coverState = signal(Images.DEFAULT_COVER_PLAYLIST);\n if (playlist.has_cover) {\n coverState.value = Util.getPlaylistCover(playlist.id);\n }\n\n return create(\"div\")\n .classes(\"single-page\", \"noflexwrap\", \"padded-large\", \"rounded-large\", \"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex-v\", \"nogap\")\n .children(\n create(\"span\")\n .classes(\"title\", \"wordwrap\")\n .text(playlist.title)\n .build(),\n UserTemplates.userWidget(a_user, Util.arrayPropertyMatchesUser(a_user.follows ?? [], \"following_user_id\"), [], [], UserWidgetContext.singlePage)\n ).build(),\n create(\"div\")\n .classes(\"playlist-info-container\", \"flex\")\n .children(\n create(\"div\")\n .classes(\"cover-container\", \"relative\", data.canEdit ? \"pointer\" : \"_\")\n .onclick(e => PlaylistActions.replaceCover(e, playlist.id, data.canEdit, coverLoading))\n .children(\n ifjs(coverLoading, create(\"div\")\n .classes(\"loader\", \"loader-small\", \"centeredInParent\")\n .id(\"cover-loader\")\n .build()),\n create(\"img\")\n .classes(\"cover\", \"blurOnParentHover\", \"nopointer\")\n .src(coverState)\n .alt(playlist.title)\n .build()\n ).build(),\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n PlaylistTemplates.audioActions(playlist, user, editActions),\n create(\"div\")\n .classes(\"playlist-title-container\", \"flex-v\", \"small-gap\")\n .children(\n create(\"span\")\n .classes(\"date\", \"text-small\")\n .text(\"Created \" + Util.formatDate(playlist.created_at))\n .build()\n ).build(),\n create(\"div\")\n .classes(\"stats-container\", \"flex\", \"rounded\")\n .children(\n StatisticsTemplates.likesIndicator(\"playlist\", playlist.id, playlist.likes.length,\n Util.arrayPropertyMatchesUser(playlist.likes, \"user_id\")),\n StatisticsTemplates.likeListOpener(playlist.likes),\n ).build(),\n ).build()\n ).build(),\n TrackTemplates.tracksInList(noTracks, tracks, data, playlist, \"playlist\", startCallback)\n ).build();\n }\n\n static audioActions(playlist: Playlist, user: User, editActions: AnyNode[] = []) {\n if (!playlist.tracks) {\n throw new Error(`Playlist ${playlist.id} has no tracks`);\n }\n\n const playingFrom = PlayManager.getPlayingFrom();\n const isPlaying = playingFrom && playingFrom.type === \"playlist\" && playingFrom.id === playlist.id;\n const manualQueue = QueueManager.getManualQueue();\n const allTracksInQueue = playlist.tracks.every((t) => manualQueue.includes(t.track_id));\n const duration = playlist.tracks.reduce((acc, t) => acc + (t.track?.length ?? 0), 0);\n\n let actions: AnyNode[] = [];\n if (user) {\n actions = [\n FJSC.button({\n text: isPlaying ? \"Pause\" : \"Play\",\n icon: {\n icon: isPlaying ? Icons.PAUSE : Icons.PLAY,\n classes: [\"inline-icon\", \"svg\", \"nopointer\"],\n adaptive: true,\n isUrl: true\n },\n attributes: [\"duration\", duration.toString()],\n id: playlist.id,\n classes: [playlist.tracks.length === 0 ? \"nonclickable\" : \"_\", \"secondary\"],\n onclick: async () => {\n const firstTrack = playlist.tracks![0];\n await PlaylistActions.startTrackInPlaylist(playlist, firstTrack.track_id, true);\n }\n }),\n FJSC.button({\n text: allTracksInQueue ? \"Unqueue\" : \"Queue\",\n icon: {\n icon: isPlaying ? Icons.UNQUEUE : Icons.QUEUE,\n classes: [\"inline-icon\", \"svg\", \"nopointer\"],\n adaptive: true,\n isUrl: true\n },\n classes: [allTracksInQueue ? \"audio-queueremove\" : \"audio-queueadd\", \"secondary\"],\n onclick: async () => {\n for (let track of playlist.tracks!) {\n if (!manualQueue.includes(track.track_id)) {\n QueueManager.addToManualQueue(track.track_id);\n }\n }\n },\n }),\n ];\n }\n\n return create(\"div\")\n .classes(\"audio-actions\", \"flex\")\n .children(\n ...actions,\n ...editActions\n ).build();\n }\n}", "import { MediaFileType } from \"../Enums/MediaFileType.ts\";\nimport { ApiRoutes } from \"./ApiRoutes.ts\";\n\nexport class MediaUploader {\n static upload(\n type: MediaFileType,\n referenceId: number,\n file: File,\n onProgress?: (event: ProgressEvent) => void\n ): Promise {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n const formData = new FormData();\n\n formData.append(\"type\", type);\n formData.append(\"referenceId\", referenceId.toString());\n formData.append(\"file\", file);\n\n xhr.open(\"POST\", ApiRoutes.uploadMedia, true);\n xhr.withCredentials = true;\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(xhr.responseText);\n } else {\n reject(new Error(`Failed to upload media: ${xhr.responseText}`));\n }\n };\n\n xhr.onabort = () => {\n reject(new Error(\"Failed to upload media: Aborted\"));\n };\n\n xhr.onerror = () => {\n reject(new Error(\"Failed to upload media: Error\"));\n };\n\n if (onProgress && xhr.upload) {\n xhr.upload.onprogress = onProgress;\n }\n\n xhr.send(formData);\n });\n }\n}", "import {GenericTemplates} from \"../Templates/GenericTemplates.ts\";\nimport {PlaylistTemplates} from \"../Templates/PlaylistTemplates.ts\";\nimport {Api} from \"../Api/Api.ts\";\nimport {getErrorMessage, Util} from \"../Classes/Util.ts\";\nimport {notify, Ui} from \"../Classes/Ui.ts\";\nimport {PlayManager} from \"../Streaming/PlayManager.ts\";\nimport {QueueManager} from \"../Streaming/QueueManager.ts\";\nimport {navigate} from \"../Routing/Router.ts\";\nimport {Signal} from \"../../fjsc/src/signals.ts\";\nimport {Playlist} from \"../Models/DbModels/lyda/Playlist.ts\";\nimport {Track} from \"../Models/DbModels/lyda/Track.ts\";\nimport {Album} from \"../Models/DbModels/lyda/Album.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {MediaUploader} from \"../Api/MediaUploader.ts\";\nimport {MediaFileType} from \"../Enums/MediaFileType.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\nimport {PlaylistTrack} from \"../Models/DbModels/lyda/PlaylistTrack.ts\";\nimport {ListTrack} from \"../Models/ListTrack.ts\";\n\nexport class PlaylistActions {\n static async openAddToPlaylistModal(objectToBeAdded: Album|Track, type: \"track\"|\"album\") {\n const res = await Api.getAsync(ApiRoutes.getPlaylistsByUserId, {id: objectToBeAdded.user_id});\n if (res.code !== 200) {\n console.error(\"Failed to get playlists: \", res.data);\n return;\n }\n let modal;\n if (type === \"track\") {\n modal = GenericTemplates.modal([await PlaylistTemplates.addTrackToPlaylistModal(objectToBeAdded as Track, res.data)], \"add-to-playlist\");\n } else {\n modal = GenericTemplates.modal([await PlaylistTemplates.addAlbumToPlaylistModal(objectToBeAdded as Album, res.data)], \"add-to-playlist\");\n }\n Ui.addModal(modal);\n }\n\n static async openNewPlaylistModal() {\n let modal = GenericTemplates.modal([PlaylistTemplates.newPlaylistModal()], \"new-playlist\");\n Ui.addModal(modal);\n }\n\n static async createNewPlaylist(playlist: Partial) {\n const res = await Api.postAsync(ApiRoutes.newPlaylist, playlist);\n if (res.code !== 200) {\n notify(\"Failed to create playlist: \" + getErrorMessage(res), NotificationType.error);\n return;\n }\n notify(\"Created playlist\", NotificationType.success);\n }\n\n static async deletePlaylist(id: number) {\n const res = await Api.postAsync(ApiRoutes.deletePlaylist, {id});\n if (res.code === 200) {\n PlayManager.removeStreamClient(id);\n QueueManager.removeFromManualQueue(id);\n notify(\"Successfully deleted playlist\", NotificationType.success);\n navigate(\"profile\");\n } else {\n notify(\"Error trying to delete playlist: \" + getErrorMessage(res), NotificationType.error);\n }\n }\n\n static async addTrackToPlaylists(track_id: number, playlist_ids: number[]) {\n const res = await Api.postAsync(ApiRoutes.addTrackToPlaylists, {\n playlist_ids,\n track_id\n });\n Util.removeModal();\n if (res.code !== 200) {\n notify(\"Failed to add track to playlists: \" + getErrorMessage(res), NotificationType.error);\n return;\n }\n notify(\"Added track to playlist(s)\", NotificationType.success);\n }\n\n static async removeTrackFromPlaylist(track_id: number, playlist_ids: number[]) {\n const res = await Api.postAsync(ApiRoutes.removeTrackFromPlaylists, {playlist_ids, track_id});\n if (res.code !== 200) {\n notify(\"Failed to remove track from playlist: \" + getErrorMessage(res), NotificationType.error);\n return false;\n }\n notify(\"Removed track from playlist\", NotificationType.success);\n return true;\n }\n\n static async replaceCover(e: MouseEvent, id: number, canEdit: boolean, loading: Signal) {\n const target = e.target as HTMLImageElement;\n if (!target || !canEdit) {\n return;\n }\n const oldSrc = target.src;\n let fileInput = document.createElement(\"input\");\n fileInput.type = \"file\";\n fileInput.accept = \"image/*\";\n fileInput.onchange = async (e) => {\n loading.value = true;\n const fileTarget = e.target as HTMLInputElement;\n const file = fileTarget.files![0];\n try {\n await MediaUploader.upload(MediaFileType.playlistCover, id, file);\n notify(\"Cover updated\", NotificationType.success);\n await Util.updateImage(URL.createObjectURL(file), oldSrc);\n } catch (e: any) {\n notify(e.toString(), NotificationType.error);\n }\n loading.value = false;\n };\n fileInput.onabort = () => loading.value = false;\n fileInput.click();\n }\n\n static async moveTrackInPlaylist(playlistId: number, tracks: ListTrack[]) {\n const res = await Api.postAsync(ApiRoutes.reorderPlaylistTracks, {\n playlist_id: playlistId,\n tracks\n });\n if (res.code !== 200) {\n notify(\"Failed to move tracks: \" + getErrorMessage(res), NotificationType.error);\n return false;\n }\n return true;\n }\n\n static async likePlaylist(id: number) {\n return await Api.postAsync(ApiRoutes.likePlaylist, { id });\n }\n\n static async unlikePlaylist(id: number) {\n return await Api.postAsync(ApiRoutes.unlikePlaylist, { id });\n }\n\n static async toggleLike(id: number, isEnabled: boolean) {\n if (!Util.isLoggedIn()) {\n notify(\"You must be logged in to like playlists\", NotificationType.error);\n return false;\n }\n if (isEnabled) {\n const res = await PlaylistActions.unlikePlaylist(id);\n if (res.code !== 200) {\n return false;\n }\n } else {\n const res = await PlaylistActions.likePlaylist(id);\n if (res.code !== 200) {\n return false;\n }\n }\n return true;\n }\n\n static async startTrackInPlaylist(playlist: Playlist, trackId: number, stopIfPlaying = false) {\n const playingFrom = PlayManager.getPlayingFrom();\n const isPlaying = playingFrom && playingFrom.type === \"playlist\" && playingFrom.id === playlist.id;\n if (isPlaying && stopIfPlaying) {\n await PlayManager.stopAllAsync();\n } else {\n PlayManager.playFrom(\"playlist\", playlist.title, playlist.id);\n QueueManager.setContextQueue(playlist.tracks!.map(t => t.track_id));\n const track = playlist.tracks!.find(t => t.track_id === trackId);\n if (!track) {\n notify(\"This track could not be found in this playlist\", NotificationType.error);\n return;\n }\n PlayManager.addStreamClientIfNotExists(track.track_id, track.track?.length ?? 0);\n await PlayManager.startAsync(track.track_id);\n }\n }\n\n static async addAlbumToPlaylists(album_id: number, playlist_ids: number[]) {\n const res = await Api.postAsync(ApiRoutes.addAlbumToPlaylists, {\n playlist_ids,\n album_id\n });\n Util.removeModal();\n if (res.code !== 200) {\n notify(getErrorMessage(res), NotificationType.error);\n return;\n }\n notify(\"Added album to playlist(s)\", NotificationType.success);\n }\n}", "import {Icons} from \"../Enums/Icons.js\";\nimport {TrackActions} from \"../Actions/TrackActions.ts\";\nimport {UserTemplates} from \"./UserTemplates.ts\";\nimport {AlbumActions} from \"../Actions/AlbumActions.ts\";\nimport {PlaylistActions} from \"../Actions/PlaylistActions.ts\";\nimport {Images} from \"../Enums/Images.ts\";\nimport {Util} from \"../Classes/Util.ts\";\nimport {create, StringOrSignal} from \"../../fjsc/src/f2.ts\";\nimport {FJSC} from \"../../fjsc\";\nimport {compute, Signal, signal} from \"../../fjsc/src/signals.ts\";\nimport {UserWidgetContext} from \"../Enums/UserWidgetContext.ts\";\nimport {GenericTemplates} from \"./GenericTemplates.ts\";\n\nexport class StatisticsTemplates {\n static likesIndicator(type: string, reference_id: number, like_count: number, liked: boolean|Signal) {\n const functionMap: Record = {\n \"track\": TrackActions.toggleLike,\n \"album\": AlbumActions.toggleLike,\n \"playlist\": PlaylistActions.toggleLike,\n };\n liked = liked.constructor === Signal ? liked : signal(liked as boolean);\n const toggleClass = compute((l): string => l ? \"enabled\" : \"_\", liked);\n const imageState = compute(l => l ? Icons.LIKE : Icons.LIKE_OUTLINE, liked);\n\n return StatisticsTemplates.toggleIndicator(\"likes\", liked, like_count, imageState, reference_id, functionMap[type], [toggleClass]);\n }\n\n static repostIndicator(reference_id: number, repost_count: number, reposted: boolean|Signal) {\n reposted = reposted.constructor === Signal ? reposted : signal(reposted as boolean);\n const toggleClass = compute((r): string => r ? \"enabled\" : \"_\", reposted);\n\n return StatisticsTemplates.toggleIndicator(\"reposts\", reposted, repost_count, Icons.REPOST, reference_id, TrackActions.toggleRepost, [toggleClass]);\n }\n\n static toggleIndicator(stats_type: string, toggleObservable: Signal, count: number, icon: StringOrSignal, reference_id = -1, clickFunc: Function = () => {}, extraClasses: StringOrSignal[] = []) {\n const count$ = signal(count);\n toggleObservable.onUpdate = (value: boolean) => {\n if (!Util.isLoggedIn()) {\n return;\n }\n if (value) {\n count$.value = count$.value + 1;\n } else {\n count$.value = count$.value - 1;\n }\n };\n\n const iconIsUrl = (icon.subscribe && icon.value.startsWith(\"http\")) || icon.startsWith(\"http\");\n const stateClass = compute((s: boolean): string => s ? \"active\" : \"_\", toggleObservable);\n const stateClass2 = compute((s: boolean): string => s ? \"positive\" : \"_\", toggleObservable);\n\n return create(\"div\")\n .classes(\"flex\", \"stats-indicator\")\n .children(\n GenericTemplates.roundIconButton({\n icon: icon,\n adaptive: true,\n isUrl: iconIsUrl,\n }, async () => {\n const targetValue = !toggleObservable.value;\n toggleObservable.value = targetValue;\n clickFunc(reference_id, !targetValue).then((success: boolean) => {\n if (!success) {\n toggleObservable.value = !targetValue;\n }\n });\n }, \"\", [\"stats-indicator-action\", stateClass2, stateClass, ...extraClasses]),\n ).build();\n }\n\n static genericUserListOpener(type: string, items: any[]) {\n const openState = signal(false);\n const listClass = signal(\"hidden\");\n\n openState.onUpdate = (value: boolean) => {\n listClass.value = value ? \"visible\" : \"hidden\";\n document.addEventListener(\"click\", e => Util.hideElementIfCondition((e: any) => {\n return !(e.target.parentElement.classList.contains(type)\n || e.target.classList.contains(type));\n }, `listFromStatsIndicator.${type}`, e), {once: true});\n };\n\n const itemsList = items.map(item => {\n const avatar = signal(Images.DEFAULT_AVATAR);\n if (item.user.has_avatar) {\n avatar.value = Util.getUserAvatar(item.user_id);\n }\n return UserTemplates.userWidget(item.user, Util.arrayPropertyMatchesUser(item.user.follows, \"following_user_id\"), [], [], UserWidgetContext.list);\n });\n\n return create(\"div\")\n .classes(\"listFromStatsOpener\", type, \"flex\", \"relative\")\n .children(\n create(\"span\")\n .classes(\"stats-indicator-opener\", type, \"clickable\", \"rounded\", \"padded-inline\")\n .children(\n create(\"span\")\n .text(items.length)\n .build(),\n FJSC.icon({\n icon: \"arrow_drop_down\",\n adaptive: true,\n classes: [\"inline-icon\", \"svg\", \"nopointer\"],\n }),\n ).onclick(() => {\n openState.value = !openState.value;\n }).build(),\n create(\"div\")\n .classes(\"listFromStatsIndicator\", \"popout-below\", type, \"flex-v\", \"padded\", \"rounded\", listClass)\n .children(\n create(\"span\")\n .classes(\"text\", \"label\", \"padded-inline\", \"rounded\", \"text-small\")\n .text(type.charAt(0).toUpperCase() + type.slice(1))\n .build(),\n create(\"div\")\n .classes(\"flex-v\")\n .children(...itemsList)\n .build()\n ).build()\n ).build();\n }\n\n static likeListOpener(likes: any[]) {\n return this.genericUserListOpener(\"likes\", likes);\n }\n\n static repostListOpener(reposts: any[]) {\n return this.genericUserListOpener(\"reposts\", reposts);\n }\n}", "export class DragActions {\n static showDragTargets(filter = null) {\n const dragTargets = document.querySelectorAll(\".dragTarget\");\n dragTargets.forEach((dragTarget) => {\n if (filter && dragTarget.classList.contains(filter)) {\n dragTarget.classList.remove(\"hidden\");\n } else if (!filter) {\n dragTarget.classList.remove(\"hidden\");\n }\n });\n }\n\n static hideDragTargets(filter = null) {\n const dragTargets = document.querySelectorAll(\".dragTarget\");\n dragTargets.forEach((dragTarget) => {\n if (filter && dragTarget.classList.contains(filter)) {\n dragTarget.classList.add(\"hidden\");\n } else if (!filter) {\n dragTarget.classList.add(\"hidden\");\n }\n });\n }\n}", "import {GenericTemplates} from \"./GenericTemplates.ts\";\nimport {FJSC} from \"../../fjsc\";\nimport {InputType, SelectOption} from \"../../fjsc/src/Types.ts\";\nimport {Genre} from \"../Enums/Genre.ts\";\nimport {create, HtmlPropertyValue, StringOrSignal, TypeOrSignal} from \"../../fjsc/src/f2.ts\";\nimport {compute, signal, Signal} from \"../../fjsc/src/signals.ts\";\n\nexport class FormTemplates {\n static fileField(title: string, text: string, name: string, accept: string, required = false, onchange = (v: string, files: FileList | null) => {}) {\n return create(\"div\")\n .classes(\"flex-v\", \"small-gap\")\n .children(\n create(\"label\")\n .text(title)\n .for(name)\n .build(),\n GenericTemplates.fileInput(name, name, accept, text, required, onchange)\n ).build();\n }\n\n static dropDownField(title: string, options: TypeOrSignal, selectedValue: Signal) {\n const optionsState = options.constructor === Signal ? (options as Signal) : signal(options as SelectOption[]);\n\n return create(\"div\")\n .classes(\"flex-v\", \"small-gap\")\n .children(\n create(\"label\")\n .text(title)\n .build(),\n FJSC.searchableSelect({\n options: optionsState as Signal,\n value: selectedValue\n })\n ).build();\n }\n\n static checkBoxField(name: HtmlPropertyValue, text: HtmlPropertyValue, checked: TypeOrSignal = false, required = false, onchange = (v: boolean) => {}) {\n return create(\"div\")\n .classes(\"flex\", \"space-outwards\")\n .children(GenericTemplates.checkbox(name, checked, text, required, onchange))\n .build();\n }\n\n static textField(title: string, name: string, placeholder: string, type = \"text\", value: StringOrSignal = \"\", required = false, onchange: Function = (val: string) => {\n }, autofocus = false, onkeydown: Function = () => {\n }, classes: StringOrSignal[] = []) {\n return FJSC.input({\n type: type as InputType,\n name,\n label: title,\n placeholder,\n value,\n required,\n onchange: onchange as (v: string) => void,\n autofocus,\n onkeydown,\n classes\n });\n }\n}", "export enum Genre\n{\n ROCK = 'rock',\n POP = 'pop',\n RAP = 'rap',\n COUNTRY = 'country',\n JAZZ = 'jazz',\n METAL = 'metal',\n CLASSICAL = 'classical',\n BLUES = 'blues',\n REGGAE = 'reggae',\n FOLK = 'folk',\n ELECTRONIC = 'electronic',\n HIP_HOP = 'hip-hop',\n SOUL = 'soul',\n PUNK = 'punk',\n R_AND_B = 'r&b',\n FUNK = 'funk',\n DISCO = 'disco',\n HOUSE = 'house',\n TECHNO = 'techno',\n TRANCE = 'trance',\n DUBSTEP = 'dubstep',\n DANCE = 'dance',\n INDIE = 'indie',\n ALTERNATIVE = 'alternative',\n OTHER = 'other',\n}\n", "import {Api} from \"../Api/Api.ts\";\nimport {notify} from \"./Ui.ts\";\nimport {navigate} from \"../Routing/Router.ts\";\nimport {signal, Signal} from \"../../fjsc/src/signals.ts\";\nimport {UploadableTrack} from \"../Models/UploadableTrack.ts\";\nimport {Track} from \"../Models/DbModels/lyda/Track.ts\";\nimport {MediaUploader} from \"../Api/MediaUploader.ts\";\nimport {MediaFileType} from \"../Enums/MediaFileType.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {ProgressPart} from \"../Models/ProgressPart.ts\";\nimport {ProgressState} from \"../Enums/ProgressState.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\n\nexport class AudioUpload {\n triggerEvent: Event;\n state: Signal;\n id: number | undefined;\n ws: any;\n api: Api|undefined;\n private progress: Signal;\n\n constructor(e: Event, state: Signal, progress: Signal) {\n this.triggerEvent = e;\n this.state = state;\n this.progress = progress;\n\n this.progress.value = [\n {\n id: \"details\",\n icon: \"info\",\n text: signal(\"Details\"),\n state: signal(ProgressState.notStarted),\n retryFunction: () => this.createTrackThenNext()\n },\n {\n id: \"audio\",\n icon: \"music_note\",\n text: signal(\"Audio\"),\n state: signal(ProgressState.notStarted),\n retryFunction: () => this.uploadAudioThenNext(),\n progress: signal(0)\n },\n {\n id: \"cover\",\n icon: \"add_photo_alternate\",\n text: signal(\"Cover\"),\n state: signal(ProgressState.notStarted),\n retryFunction: () => this.uploadCoverThenNext(),\n progress: signal(0)\n }\n ]\n\n this.uploadTrack().then();\n }\n\n setProgressPartState(id: string, state: ProgressState, title?: string, progress?: number) {\n const item = this.progress.value.find(p => p.id === id);\n if (item) {\n item.state.value = state;\n if (title) {\n item.text.value = title;\n }\n if (item.progress) {\n item.progress.value = progress ?? 0;\n }\n }\n }\n\n async uploadTrack() {\n const error = await this.createTrackThenNext();\n if (error) {\n notify(`Failed to create track: ${error}`, NotificationType.error);\n return;\n }\n\n notify(\"Track upload completed\", NotificationType.success);\n navigate(`track/${this.id}`);\n }\n\n async uploadAudioThenNext() {\n this.setProgressPartState(\"audio\", ProgressState.inProgress, \"Uploading audio\");\n if (!this.state.value.audioFiles) {\n this.setProgressPartState(\"audio\", ProgressState.error, \"No audio file\");\n return \"No audio file\";\n }\n\n if (!this.id) {\n this.setProgressPartState(\"audio\", ProgressState.error, \"No track id\");\n return \"No track id\";\n }\n\n const error = await this.uploadMedia(MediaFileType.audio, this.id, this.state.value.audioFiles![0], (event: ProgressEvent) => {\n this.setProgressPartState(\"audio\", ProgressState.inProgress, \"Uploading audio...\", (event.loaded / event.total) * 100);\n });\n if (error !== true) {\n this.setProgressPartState(\"audio\", ProgressState.error, `Failed to upload audio: ${error}`);\n return `Failed to upload audio: ${error}`;\n } else {\n this.setProgressPartState(\"audio\", ProgressState.complete);\n return await this.uploadCoverThenNext();\n }\n }\n\n async uploadCoverThenNext() {\n this.setProgressPartState(\"cover\", ProgressState.inProgress, \"Uploading cover\");\n if (this.state.value.coverArtFiles) {\n if (!this.id) {\n this.setProgressPartState(\"cover\", ProgressState.error, \"No track id\");\n return \"No track id\";\n }\n\n if (!await this.uploadMedia(MediaFileType.trackCover, this.id, this.state.value.coverArtFiles![0], (event: ProgressEvent) => {\n this.setProgressPartState(\"cover\", ProgressState.inProgress, \"Uploading cover...\", (event.loaded / event.total) * 100);\n })) {\n this.setProgressPartState(\"cover\", ProgressState.error, \"Failed to upload cover\");\n return \"Failed to upload cover\";\n }\n }\n\n this.setProgressPartState(\"cover\", ProgressState.complete, \"Cover uploaded\");\n }\n\n async createTrackThenNext() {\n this.setProgressPartState(\"details\", ProgressState.inProgress, \"Creating track...\");\n const result = await this.createTrack();\n if (result && result.constructor === String) {\n this.setProgressPartState(\"details\", ProgressState.error);\n return result;\n } else if (result) {\n this.id = (result as Track).id;\n this.setProgressPartState(\"details\", ProgressState.complete);\n return await this.uploadAudioThenNext();\n }\n }\n\n async createTrack() {\n const state = this.state.value;\n\n const res = await Api.postAsync(ApiRoutes.createTrack, {\n title: state.title,\n isrc: state.isrc,\n upc: state.upc,\n visibility: state.visibility,\n collaborators: state.collaborators,\n credits: state.credits,\n release_date: state.release_date,\n genre: state.genre,\n description: state.description,\n price: state.price,\n });\n\n if (res.code !== 200) {\n return res.data.error;\n }\n\n return res.data as Track;\n }\n\n private async uploadMedia(type: MediaFileType, id: number, file: File, onProgress?: (event: ProgressEvent) => void) {\n try {\n await MediaUploader.upload(type, id, file, onProgress);\n return true;\n } catch (e) {\n return e;\n }\n }\n}\n", "export function dayFromValue(value: number|string|Date|null) {\n if (!value) {\n return new Date().toISOString().split(\"T\")[0];\n }\n const date = new Date(value);\n return date.toISOString().split(\"T\")[0];\n}", "import {FormTemplates} from \"./FormTemplates.ts\";\nimport {GenericTemplates} from \"./GenericTemplates.ts\";\nimport {Icons} from \"../Enums/Icons.ts\";\nimport {UserTemplates} from \"./UserTemplates.ts\";\nimport {Images} from \"../Enums/Images.ts\";\nimport {TrackActions} from \"../Actions/TrackActions.ts\";\nimport {Genre} from \"../Enums/Genre.ts\";\nimport {target, Util} from \"../Classes/Util.ts\";\nimport {AudioUpload} from \"../Classes/AudioUpload.ts\";\nimport {Ui} from \"../Classes/Ui.ts\";\nimport {\n AnyElement,\n AnyNode,\n create,\n DomNode,\n HtmlPropertyValue,\n ifjs,\n signalMap, StringOrSignal,\n TypeOrSignal\n} from \"../../fjsc/src/f2.ts\";\nimport {Track} from \"../Models/DbModels/lyda/Track.ts\";\nimport {FJSC} from \"../../fjsc\";\nimport {User} from \"../Models/DbModels/lyda/User.ts\";\nimport {InputType, SelectOption} from \"../../fjsc/src/Types.ts\";\nimport {TrackCollaborator} from \"../Models/DbModels/lyda/TrackCollaborator.ts\";\nimport {UploadableTrack} from \"../Models/UploadableTrack.ts\";\nimport {UploadInfo} from \"../Models/UploadInfo.ts\";\nimport {ProgressPart} from \"../Models/ProgressPart.ts\";\nimport {AlbumActions} from \"../Actions/AlbumActions.ts\";\nimport {compute, Signal, signal} from \"../../fjsc/src/signals.ts\";\nimport {reload} from \"../Routing/Router.ts\";\nimport {PlayManager} from \"../Streaming/PlayManager.ts\";\nimport {dayFromValue} from \"../Classes/Helpers/Date.ts\";\n\nexport class TrackEditTemplates {\n static uploadForm(title: string, credits: string, releaseDate: Date, visibility: string, genre: Genre,\n isrc: string, upc: string, description: string, monetization: boolean, price: number,\n linkedUsers: TrackCollaborator[]) {\n const state = signal({\n title: title ?? \"\",\n credits: credits ?? \"\",\n release_date: releaseDate ? new Date(releaseDate) : new Date(),\n visibility: visibility ?? \"public\",\n genre: genre ?? Genre.OTHER,\n isrc: isrc ?? \"\",\n upc: upc ?? \"\",\n description: description ?? \"\",\n monetization: monetization ?? true,\n price: price ?? \"1\",\n collaborators: linkedUsers ?? [],\n termsOfService: false\n });\n const errorSections = signal([]);\n const errorFields = signal([]);\n const uploadInfo = signal([]);\n\n return create(\"div\")\n .classes(\"card\")\n .children(\n create(\"progress\")\n .classes(\"progress\")\n .attributes(\"max\", \"100\", \"value\", \"0\")\n .styles(\"display\", \"none\")\n .build(),\n create(\"div\")\n .classes(\"success\")\n .build(),\n create(\"div\")\n .classes(\"error\")\n .build(),\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"h3\")\n .text(\"Upload a track\")\n .build(),\n TrackEditTemplates.upDownButtons(state, true),\n TrackEditTemplates.trackUpload(state, errorSections, errorFields),\n TrackEditTemplates.uploadButton(state, errorSections, errorFields),\n TrackEditTemplates.uploadInfo(uploadInfo),\n ).build(),\n ).build();\n }\n\n static openEditPageButton(track: Track) {\n return FJSC.button({\n text: \"Edit\",\n icon: { icon: \"edit\" },\n onclick: async () => {\n TrackActions.getTrackEditModal(track);\n }\n });\n }\n\n static addToAlbumsButton(track: Track) {\n return FJSC.button({\n text: \"Add to albums\",\n icon: { icon: \"forms_add_on\" },\n onclick: async () => {\n await AlbumActions.openAddToAlbumModal(track);\n }\n });\n }\n\n static editTrackModal(track: Track, confirmCallback: Function, cancelCallback: Function) {\n const state = signal({\n ...track,\n release_date: new Date(track.release_date)\n });\n\n return GenericTemplates.modal([\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"img\")\n .classes(\"icon\", \"svg\")\n .styles(\"width\", \"30px\", \"height\", \"auto\")\n .attributes(\"src\", Icons.PEN)\n .build(),\n create(\"h2\")\n .text(\"Edit track\")\n .build()\n ).build(),\n create(\"p\")\n .text(\"Edit the track details below\")\n .build(),\n TrackEditTemplates.upDownButtons(state, true),\n TrackEditTemplates.trackEdit(state, signal([]), false),\n create(\"div\")\n .classes(\"flex\")\n .children(\n FJSC.button({\n text: \"Save\",\n icon: { icon: \"check\" },\n classes: [\"positive\"],\n onclick: () => {\n confirmCallback(state.value);\n }\n }),\n FJSC.button({\n text: \"Cancel\",\n icon: { icon: \"close\" },\n classes: [\"negative\"],\n onclick: cancelCallback\n }),\n ).build()\n ).build(),\n ], \"edit-track\");\n }\n\n static upDownButtons(state: Signal, uploadEnabled = false) {\n const buttons = [\n FJSC.button({\n text: \"Download Info\",\n icon: { icon: \"file_save\" },\n onclick: () => {\n const json = JSON.stringify(state.value);\n Util.downloadFile(`${state.value.title}_${Date.now()}.json`, json);\n }\n }),\n ];\n\n if (uploadEnabled) {\n buttons.push(FJSC.button({\n text: \"Upload Info\",\n icon: { icon: \"upload_file\" },\n onclick: () => {\n const fileInput = document.createElement(\"input\");\n fileInput.type = \"file\";\n fileInput.onchange = async (e) => {\n const file = target(e).files![0];\n const reader = new FileReader();\n reader.onload = async (e) => {\n const jsonString = target(e).result as string;\n state.value = JSON.parse(jsonString);\n };\n reader.readAsText(file);\n };\n fileInput.click();\n },\n }));\n }\n\n return create(\"div\")\n .classes(\"flex\")\n .children(...buttons)\n .build();\n }\n\n static uploadInfo(uploadInfo: Signal) {\n return create(\"div\")\n .id(\"upload-info\")\n .children(\n signalMap(uploadInfo, create(\"div\").classes(\"flex-v\"), (info: UploadInfo) => TrackEditTemplates.uploadInfoItem(info)),\n ).build();\n }\n\n static uploadInfoItem(info: UploadInfo) {\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"span\")\n .id(\"upload-info-\" + info.type)\n .classes(\"upload-info-item\", ...(info.classes ?? []))\n .text(info.value)\n .build()\n ).build();\n }\n\n static uploadButton(state: Signal, errorSections: Signal, errorFields: Signal) {\n const errors = signal([]);\n const disabled = compute((s: UploadableTrack) => {\n const newErrors = [];\n const requiredProps = [\n { section: \"audio\", field: \"audioFileName\" },\n { section: \"info\", field: \"title\" },\n { section: \"info\", field: \"genre\" },\n { section: \"terms\", field: \"termsOfService\" },\n ];\n if (requiredProps.some(p => !s[p.field])) {\n newErrors.push(\"Missing required fields\");\n const errorProps = requiredProps.filter(p => !s[p.field]);\n errorSections.value = errorProps.map(p => p.section);\n errorFields.value = errorProps.map(p => p.field);\n } else {\n errorSections.value = [];\n errorFields.value = [];\n }\n errors.value = newErrors;\n\n return newErrors.length > 0;\n }, state);\n const buttonClass = compute((d): string => d ? \"disabled\" : \"positive\", disabled);\n const progressState = signal([]);\n\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n FJSC.button({\n text: \"Upload\",\n disabled,\n classes: [buttonClass, \"positive\"],\n onclick: (e) => {\n new AudioUpload(e, state, progressState);\n },\n icon: { icon: \"upload\" },\n }),\n FJSC.errorList(errors),\n GenericTemplates.progressSections(progressState)\n ).build();\n }\n\n static filesSection(isNewTrack = false, state: Signal, errorSections: Signal) {\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n TrackEditTemplates.sectionCard(\"Audio\", errorSections, \"audio\", [TrackEditTemplates.audioFile(isNewTrack, state)], \"music_note\", [\"flex-grow\"]),\n TrackEditTemplates.sectionCard(\"Artwork\", errorSections, \"artwork\", [\n TrackEditTemplates.coverFile(state),\n TrackEditTemplates.imagePreview(\"cover-file\")\n ], \"image\", [\"flex-grow\"]),\n ).build();\n }\n\n static trackEdit(state: Signal, errorSections: Signal, enableLinkedUsers = true) {\n const isPrivate = compute((s) => s.visibility === \"private\", state);\n\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n TrackEditTemplates.sectionCard(\"Track Details\", errorSections, \"info\", [\n create(\"div\")\n .classes(\"flex\")\n .children(\n FJSC.toggle({\n name: \"visibility\",\n label: \"Private\",\n text: \"Private\",\n checked: isPrivate,\n onchange: (v) => {\n state.value = { ...state.value, visibility: v ? \"private\" : \"public\" };\n }\n }),\n ).build(),\n TrackEditTemplates.titleInput(state),\n TrackEditTemplates.creditsInput(state),\n TrackEditTemplates.artistNameInput(state),\n ifjs(enableLinkedUsers, TrackEditTemplates.linkedUsers(state.value.collaborators, state)),\n TrackEditTemplates.releaseDateInput(state),\n TrackEditTemplates.genreInput(state),\n TrackEditTemplates.isrcInput(state),\n TrackEditTemplates.upcInput(state),\n TrackEditTemplates.descriptionInput(state),\n ], \"info\", [\"flex-grow\"]),\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n TrackEditTemplates.monetizationSection(errorSections, state),\n ).build()\n ).build();\n }\n\n private static monetizationSection(errorSections: Signal, state: Signal) {\n return TrackEditTemplates.sectionCard(\"Monetization\", errorSections, \"monetization\", [\n TrackEditTemplates.monetizationInfo(),\n FJSC.input({\n type: InputType.number,\n name: \"price\",\n label: \"Minimum track price in USD\",\n placeholder: \"1$\",\n value: compute(s => s.price, state),\n validators: [\n (v) => {\n if (v < 0) {\n return [\"Minimum track price must be a positive number\"];\n }\n }\n ],\n onchange: (v) => {\n state.value = {...state.value, price: v};\n }\n }),\n ], \"attach_money\");\n }\n\n private static titleInput(state: Signal) {\n return FJSC.input({\n type: InputType.text,\n required: true,\n name: \"title\",\n label: \"Title*\",\n placeholder: \"Track title\",\n value: compute(s => s.title, state),\n onchange: (v) => {\n state.value = {...state.value, title: v};\n }\n });\n }\n\n private static creditsInput(state: Signal) {\n return FJSC.input({\n type: InputType.text,\n name: \"credits\",\n label: \"Collaborators\",\n placeholder: \"John Music, Alice Frequency\",\n value: compute(s => s.credits, state),\n onchange: (v) => {\n state.value = {...state.value, credits: v};\n }\n });\n }\n\n private static descriptionInput(state: Signal) {\n return FJSC.textarea({\n name: \"description\",\n label: \"Description\",\n placeholder: \"My cool track\",\n value: compute(s => s.description, state),\n onchange: (v) => {\n state.value = {...state.value, description: v};\n }\n });\n }\n\n private static upcInput(state: Signal) {\n return FJSC.input({\n type: InputType.text,\n name: \"upc\",\n label: \"UPC\",\n placeholder: \"00888072469600\",\n value: compute(s => s.upc, state),\n onchange: (v) => {\n state.value = {...state.value, upc: v};\n }\n });\n }\n\n static genreInput(parentState: Signal) {\n const genres = Object.values(Genre).map((genre: string) => {\n return { name: genre, id: genre };\n }) as SelectOption[];\n const value = compute(p => p.genre ?? \"other\", parentState);\n return FormTemplates.dropDownField(\"Genre\", signal(genres), value);\n }\n\n private static isrcInput(state: Signal) {\n return FJSC.input({\n type: InputType.text,\n name: \"isrc\",\n label: \"ISRC\",\n placeholder: \"QZNWX2227540\",\n value: compute(s => s.isrc, state),\n onchange: (v) => {\n state.value = {...state.value, isrc: v};\n }\n });\n }\n\n private static releaseDateInput(state: Signal) {\n return FJSC.input({\n type: InputType.date,\n name: \"release_date\",\n label: \"Release Date\",\n placeholder: \"YYYY-MM-DD\",\n value: compute(s => dayFromValue(s.release_date), state),\n onchange: (v) => {\n state.value = {...state.value, release_date: new Date(v)};\n }\n });\n }\n\n private static artistNameInput(state: Signal) {\n return FJSC.input({\n type: InputType.text,\n name: \"artistname\",\n label: \"Artist display name\",\n placeholder: \"My other alias\",\n value: compute(s => s.artistname ?? \"\", state),\n onchange: (v) => {\n state.value = {...state.value, artistname: v};\n }\n });\n }\n\n static trackUpload(state: Signal, errorSections: Signal, errorFields: Signal, enableTos = true, enableLinkedUsers = true) {\n const isPrivate = compute((s) => s.visibility === \"private\", state);\n\n return create(\"div\")\n .classes(\"flex\")\n .children(\n TrackEditTemplates.sectionCard(\"Track Details\", errorSections, \"info\", [\n create(\"div\")\n .classes(\"flex\")\n .children(\n FJSC.toggle({\n name: \"visibility\",\n label: \"Private\",\n text: \"Private\",\n checked: isPrivate,\n onchange: (v) => {\n state.value = { ...state.value, visibility: v ? \"private\" : \"public\" };\n }\n }),\n ).build(),\n TrackEditTemplates.titleInput(state),\n TrackEditTemplates.creditsInput(state),\n TrackEditTemplates.artistNameInput(state),\n ifjs(enableLinkedUsers, TrackEditTemplates.linkedUsers(state.value.collaborators, state)),\n TrackEditTemplates.releaseDateInput(state),\n TrackEditTemplates.genreInput(state),\n TrackEditTemplates.isrcInput(state),\n TrackEditTemplates.upcInput(state),\n TrackEditTemplates.descriptionInput(state),\n ], \"info\", [\"flex-grow\"]),\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n TrackEditTemplates.filesSection(true, state, errorSections),\n TrackEditTemplates.monetizationSection(errorSections, state),\n enableTos ? TrackEditTemplates.sectionCard(\"Terms of Service\", errorSections, \"terms\", [\n FJSC.checkbox({\n name: \"termsOfService\",\n text: \"I have read and agree to the Terms of Service and Privacy Policy*\",\n checked: compute(s => s.termsOfService, state),\n required: true,\n onchange: () => {\n const old = state.value;\n state.value = { ...old, termsOfService: !old.termsOfService };\n }\n }),\n ], \"gavel\") : null,\n ).build()\n ).build();\n }\n\n static sectionCard(title: HtmlPropertyValue, errorSections: Signal, id: string, children: (TypeOrSignal|TypeOrSignal|TypeOrSignal|null)[], icon: string|null = null, classes: StringOrSignal[] = []) {\n const hasError = compute((e: string[]) => e.includes(id), errorSections);\n\n return create(\"div\")\n .classes(\"border-card\", \"flex-v\", ...classes)\n .children(\n GenericTemplates.cardLabel(title, icon, hasError),\n ...children\n ).build();\n }\n\n static audioFile(canOverwriteTitle = false, parentState: Signal) {\n return FormTemplates.fileField(\"Audio File*\", \"Choose file\", \"audio-file\", \"audio/*\", true, async (fileName: string, files) => {\n if (canOverwriteTitle) {\n if (fileName) {\n const safeName = fileName.replace(/\\.[^/.]+$/, \"\");\n if (parentState) {\n parentState.value = {...parentState.value, title: safeName, audioFileName: safeName};\n }\n }\n }\n parentState.value = {\n ...parentState.value,\n audioFiles: files\n };\n });\n }\n\n static coverFile(parentState: Signal) {\n return FormTemplates.fileField(\"Cover File\", \"Choose file (.jpg,.jpeg,.png,.gif)\", \"cover-file\", \"jpg,jpeg,png,gif\", false, async (fileName: string, files) => {\n if (fileName) {\n if (parentState) {\n const safeName = fileName.replace(/\\.[^/.]+$/, \"\");\n parentState.value = {...parentState.value, coverArtFileName: safeName};\n }\n }\n parentState.value = {\n ...parentState.value,\n coverArtFiles: files\n };\n });\n }\n\n static imagePreview(name: HtmlPropertyValue) {\n return create(\"img\")\n .id(name + \"-preview\")\n .classes(\"image-preview\", \"hidden\")\n .build();\n }\n\n static monetizationInfo() {\n return create(\"span\")\n .text(\"This track will be monetized through streaming subscriptions and available for buying.\")\n .build();\n }\n\n static removeLinkedUser(removeUserId: number, linkedUserState: Signal[]>) {\n return GenericTemplates.inlineAction(\"Remove\", \"remove\", \"remove_linked_user_\" + removeUserId, () => {\n linkedUserState.value = linkedUserState.value.filter((tc) => tc.user_id !== removeUserId);\n }, [], [\"negative\"]);\n }\n\n static deleteTrackButton(trackId: number) {\n return FJSC.button({\n text: \"Delete\",\n icon: { icon: \"delete\" },\n classes: [\"negative\"],\n onclick: async () => {\n await Ui.getConfirmationModal(\"Delete track\", \"Are you sure you want to delete this track?\", \"Yes\", \"No\", () => TrackActions.deleteTrack(trackId), () => {\n }, Icons.WARNING);\n }\n });\n }\n\n static addLinkedUserButton(callback: Function, classes: string[] = []) {\n return FJSC.button({\n text: \"Add User\",\n id: \"add_linked_user\",\n icon: { icon: \"person_add\" },\n classes,\n onclick: async () => {\n await Ui.getAddLinkedUserModal(\"Link a user\", \"Enter the username of the user you want to link\", \"\", \"Link\", \"Cancel\", callback, () => {}, \"person_add\");\n },\n });\n }\n\n static linkedUsers(linkedUsers: Partial[] = [], parentState: Signal|null = null) {\n const linkedUserState = signal(linkedUsers);\n const sendJson = signal(JSON.stringify(linkedUsers));\n const userMap = new Map();\n const container = create(\"div\")\n .classes(\"flex\")\n .build();\n linkedUserState.onUpdate = (newValue: any[]) => {\n container.innerHTML = \"\";\n for (const id of newValue) {\n const user = userMap.get(id);\n const avatarState = signal(Images.DEFAULT_AVATAR);\n if (user.has_avatar) {\n avatarState.value = Util.getUserAvatar(user.id);\n }\n container.appendChild(UserTemplates.linkedUser(user.id, user.username, user.displayname, avatarState, user.collab_type.name, TrackEditTemplates.removeLinkedUser(user.id, linkedUserState), [], [\"no-redirect\"]));\n }\n const sendValue = newValue.map((id: number) => userMap.get(id));\n sendJson.value = JSON.stringify(sendValue);\n if (parentState && parentState.value.collaborators !== sendValue) {\n parentState.value = {\n ...parentState.value,\n collaborators: sendValue\n };\n }\n };\n\n return create(\"div\")\n .classes(\"flex-v\", \"small-gap\")\n .children(\n create(\"label\")\n .text(\"Linked Users\")\n .build(),\n create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"div\")\n .classes(\"flex\")\n .id(\"linked_users_container\")\n .build(),\n create(\"input\")\n .classes(\"hidden\")\n .value(sendJson)\n .name(\"linked_users\")\n .build(),\n TrackEditTemplates.addLinkedUserButton((newUsername: string, newUser: User) => {\n userMap.set(newUser.id, newUser);\n if (!linkedUserState.value.some(tc => tc.user_id === newUser.id)) {\n linkedUserState.value = [...linkedUserState.value, >{\n user_id: newUser.id,\n type: -1, // TODO: Use actual type?\n track_id: parentState ? parentState.value.id : null,\n approved: false,\n denied: false,\n }];\n }\n }, [\"align-center\"])\n ).build(),\n ).build();\n }\n\n static replaceAudioButton(track: Track) {\n const loading = signal(false);\n\n return FJSC.button({\n text: \"Replace Audio\",\n icon: { icon: \"upload\" },\n disabled: loading,\n onclick: async () => {\n await TrackActions.replaceAudio(track.id, true, loading, () => {\n PlayManager.removeTrackFromAllStates(track.id);\n reload();\n });\n },\n });\n }\n}", "export class CustomText {\n static renderToHtml(text: string): string {\n if (!text) {\n return \"\";\n }\n\n let atMentionPattern = /(?]*>)@(\\w+)/gmi;\n let httpPattern = /(http(s)?:\\/\\/[\\w-]+(\\.[\\w-]+)+\\.?(:\\d+)?(\\/\\S*)?)/gmi;\n let replacedText = text.replace(httpPattern, \"$1\");\n replacedText = replacedText.replace(atMentionPattern, \"@$1\");\n return replacedText;\n }\n}\n\nexport function truncateText(text: string, length: number): string {\n if (!text) {\n return \"\";\n }\n return text.length > length ? text.substring(0, length - 3) + \"...\" : text;\n}", "import {Api} from \"../Api/Api.ts\";\nimport {notify, Ui} from \"../Classes/Ui.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {getErrorMessage} from \"../Classes/Util.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\nimport {Signal} from \"../../fjsc/src/signals.ts\";\n\nexport class CommentActions {\n static getModerationComments(filter: { potentiallyHarmful: boolean, user_id: number | null, offset: number, limit: number }, loading: Signal, callback: Function) {\n loading.value = true;\n Api.getAsync(ApiRoutes.getModerationComments, filter).then(res => {\n loading.value = false;\n if (res.code !== 200) {\n notify(\"Error while trying to get comments: \" + getErrorMessage(res), NotificationType.error);\n return [];\n }\n callback(res.data);\n });\n }\n\n static async setPotentiallyHarmful(id: number, v: boolean) {\n const res = await Api.postAsync(ApiRoutes.setCommentPotentiallyHarmful, {id, potentiallyHarmful: v});\n if (res.code !== 200) {\n notify(\"Error while trying to set potentially harmful for comment: \" + getErrorMessage(res), NotificationType.error);\n return false;\n }\n }\n\n static async setHidden(id: number, v: boolean) {\n const res = await Api.postAsync(ApiRoutes.setCommentHidden, {id, hidden: v});\n if (res.code !== 200) {\n notify(\"Error while trying to set hidden for comment: \" + getErrorMessage(res), NotificationType.error);\n return false;\n }\n }\n}", "import {GenericTemplates} from \"./GenericTemplates.ts\";\nimport {Icons} from \"../Enums/Icons.js\";\nimport {CommentActions} from \"../Actions/CommentActions.ts\";\nimport {TrackActions} from \"../Actions/TrackActions.ts\";\nimport {UserTemplates} from \"./UserTemplates.ts\";\nimport {Time} from \"../Classes/Helpers/Time.ts\";\nimport {Images} from \"../Enums/Images.ts\";\nimport {Util} from \"../Classes/Util.ts\";\nimport {AnyElement, create, ifjs, signalMap} from \"../../fjsc/src/f2.ts\";\nimport {Comment} from \"../Models/DbModels/lyda/Comment.ts\";\nimport {FJSC} from \"../../fjsc\";\nimport {compute, Signal, signal} from \"../../fjsc/src/signals.ts\";\nimport {UserWidgetContext} from \"../Enums/UserWidgetContext.ts\";\nimport {InputType} from \"../../fjsc/src/Types.ts\";\n\nexport class CommentTemplates {\n static moderatableComment(comment: Comment, comments: Signal) {\n return create(\"div\")\n .classes(\"flex-v\", \"comment-in-list\")\n .id(comment.id)\n .children(\n create(\"div\")\n .classes(\"flex\", \"align-children\")\n .children(\n FJSC.button({\n text: \"Open track\",\n icon: { icon: \"open_in_new\" },\n classes: [\"positive\"],\n onclick: async () => {\n window.open(window.location.origin + \"/track/\" + comment.track_id);\n }\n }),\n FJSC.button({\n text: \"Delete comment\",\n icon: { icon: \"delete\" },\n classes: [\"negative\"],\n onclick: async () => {\n await TrackActions.deleteComment(comment.id, comments);\n }\n }),\n FJSC.toggle({\n text: \"Potentially harmful\",\n checked: comment.potentially_harmful,\n onchange: async (v) => {\n await CommentActions.setPotentiallyHarmful(comment.id, v);\n comments.value = comments.value.map(c => {\n if (c.id === comment.id) {\n c.potentially_harmful = v;\n }\n return c;\n });\n }\n }),\n FJSC.toggle({\n text: \"Hidden\",\n checked: comment.hidden,\n onchange: async (v) => {\n await CommentActions.setHidden(comment.id, v);\n comments.value = comments.value.map(c => {\n if (c.id === comment.id) {\n c.hidden = v;\n }\n return c;\n });\n }\n }),\n ).build(),\n create(\"div\")\n .classes(\"card\")\n .children(\n CommentTemplates.commentInList(comment, comments),\n ).build(),\n ).build();\n }\n\n static async moderatableCommentsPage() {\n const commentsList = signal(create(\"div\").build());\n const filterState = signal({\n potentiallyHarmful: true,\n user_id: null,\n offset: 0,\n limit: 100\n });\n const loading = signal(false);\n filterState.subscribe(async (newFilter) => {\n commentsList.value = create(\"div\").build();\n CommentActions.getModerationComments(newFilter, loading, async (comments: Comment[]) => {\n commentsList.value = CommentTemplates.moderatableCommentsList(comments);\n });\n });\n CommentActions.getModerationComments(filterState.value, loading, async (comments: Comment[]) => {\n commentsList.value = CommentTemplates.moderatableCommentsList(comments);\n });\n\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex\", \"align-children\", \"fixed-bar\")\n .children(\n CommentTemplates.commentFilters(filterState),\n FJSC.button({\n text: \"Refresh\",\n icon: { icon: \"refresh\" },\n classes: [\"positive\"],\n onclick: async () => {\n commentsList.value = create(\"div\").build();\n CommentActions.getModerationComments(filterState.value, loading, async (comments: Comment[]) => {\n commentsList.value = CommentTemplates.moderatableCommentsList(comments);\n });\n }\n })\n ).build(),\n ifjs(loading, GenericTemplates.loadingSpinner()),\n commentsList\n ).build();\n }\n\n static commentFilters(filter: Signal<{ potentiallyHarmful: boolean, user_id: number | null, offset: number, limit: number }>) {\n const potentiallyHarmful = compute(f => f.potentiallyHarmful, filter);\n const userId = compute(f => f.user_id, filter);\n const offset = compute(f => f.offset, filter);\n const limit = compute(f => f.limit, filter);\n\n return create(\"div\")\n .classes(\"flex\", \"align-children\")\n .children(\n FJSC.toggle({\n text: \"Potentially harmful\",\n checked: potentiallyHarmful,\n onchange: (v) => {\n filter.value = { ...filter.value, potentiallyHarmful: v };\n }\n }),\n create(\"div\")\n .classes(\"flex\")\n .children(\n FJSC.input({\n type: InputType.number,\n name: \"user_id\",\n placeholder: \"Filter by user ID\",\n value: userId,\n onchange: (v) => {\n if (v === 0) {\n v = null;\n }\n filter.value = { ...filter.value, user_id: v };\n }\n }),\n ).build(),\n ).build();\n }\n\n static moderatableCommentsList(comments: Comment[]) {\n if (comments.length === 0) {\n return create(\"div\")\n .classes(\"card\", \"flex-v\")\n .children(\n create(\"span\")\n .text(\"No comments\")\n .build()\n ).build();\n }\n\n return create(\"div\")\n .classes(\"flex-v\", \"fixed-bar-content\")\n .children(...comments.map(c => CommentTemplates.moderatableComment(c, signal(comments))))\n .build();\n }\n\n static commentListFullWidth(track_id: number, comments: Signal, showComments: Signal) {\n const hasComments = compute(c => c.length > 0, comments);\n const nestedComments = compute(c => Util.nestComments(c), comments);\n\n return create(\"div\")\n .classes(\"listFromStatsIndicator\", \"move-to-new-row\", \"comments\", \"flex-v\")\n .children(\n ifjs(showComments, create(\"div\")\n .classes(\"flex-v\")\n .children(\n CommentTemplates.commentBox(track_id, comments),\n ifjs(hasComments, create(\"span\")\n .classes(\"text\", \"no-comments\")\n .text(\"No comments yet\")\n .build(), true),\n ifjs(hasComments, signalMap(nestedComments, create(\"div\").classes(\"flex-v\", \"comment-list\"), (comment: Comment) => CommentTemplates.commentInList(comment, comments)))\n ).build()),\n ).build();\n }\n\n static commentBox(track_id: number, comments: Signal) {\n const newComment = signal(\"\");\n\n return create(\"div\")\n .classes(\"comment-box\", \"flex-v\")\n .children(\n ifjs(Util.isLoggedIn(), create(\"div\")\n .classes(\"comment-box-input-container\", \"flex-v\", \"fullWidth\", \"card\", \"secondary\")\n .children(\n FJSC.textarea({\n classes: [\"comment-box-input\"],\n name: \"comment-box-input\",\n placeholder: \"New comment...\",\n value: newComment,\n attributes: [\"track_id\", track_id.toString()],\n onchange: v => newComment.value = v,\n }),\n FJSC.button({\n text: \"Post\",\n icon: { icon: \"send\" },\n classes: [\"positive\"],\n onclick: () => TrackActions.newComment(newComment, comments, track_id)\n }),\n ).build())\n ).build();\n }\n\n static commentInList(comment: Comment, comments: Signal): AnyElement {\n let actions = [];\n if (!comment.user) {\n throw new Error(`Comment ${comment.id} has no user`);\n }\n if (comment.canEdit) {\n actions.push(FJSC.button({\n text: \"Delete\",\n icon: { icon: \"delete\" },\n classes: [\"negative\"],\n onclick: () => TrackActions.deleteComment(comment.id, comments)\n }));\n }\n const avatarState = signal(Images.DEFAULT_AVATAR);\n if (comment.user.has_avatar) {\n avatarState.value = Util.getUserAvatar(comment.user_id);\n }\n const replyInputShown = signal(false);\n const newComment = signal(\"\");\n\n return create(\"div\")\n .classes(\"comment-in-list\", \"flex-v\")\n .id(comment.id)\n .attributes(\"parent_id\", comment.parent_id)\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n UserTemplates.userWidget(comment.user, Util.arrayPropertyMatchesUser(comment.user.follows ?? [], \"following_user_id\"), [\"comment_id\", comment.id], [], UserWidgetContext.comment),\n create(\"span\")\n .classes(\"text\", \"text-small\", \"color-dim\", \"align-center\")\n .text(Time.agoUpdating(new Date(comment.created_at)))\n .build(),\n create(\"div\")\n .classes(\"flex\")\n .children(...actions)\n .build()\n ).build(),\n create(\"div\")\n .classes(\"flex\", \"comment_body\")\n .children(\n CommentTemplates.commentContent(comment),\n ifjs(Util.isLoggedIn(), create(\"div\")\n .classes(\"flex\")\n .children(\n FJSC.button({\n text: \"Reply\",\n icon: { icon: \"reply\" },\n classes: [\"positive\"],\n onclick: () => replyInputShown.value = !replyInputShown.value\n }),\n ifjs(replyInputShown, FJSC.input({\n type: InputType.text,\n name: \"reply-input\",\n label: \"\",\n placeholder: \"Reply to \" + comment.user!.username + \"...\",\n value: newComment,\n attributes: [\"track_id\", comment.track_id.toString()],\n onchange: v => {\n newComment.value = v;\n }\n })),\n ifjs(replyInputShown, FJSC.button({\n text: \"Post\",\n icon: { icon: \"send\" },\n classes: [\"positive\"],\n onclick: () => TrackActions.newComment(newComment, comments, comment.track_id, comment.id)\n }))\n ).build()),\n ).build(),\n create(\"div\")\n .classes(\"comment-children\")\n .children(...(comment.comments?.map(c => CommentTemplates.commentInList(c, comments)) ?? []))\n .build()\n ).build();\n }\n\n static commentContent(comment: Comment) {\n if (comment.hidden) {\n const contentShown = signal(false);\n\n return create(\"div\")\n .classes(\"text\", \"comment_content\", \"text-small\", \"flex\", \"noflexwrap\", \"fullWidth\")\n .children(\n ifjs(contentShown, create(\"div\")\n .classes(\"color-dim\", \"flex\", \"noflexwrap\", \"fullWidth\")\n .onclick(() => {\n contentShown.value = !contentShown.value;\n }).children(\n GenericTemplates.icon(Icons.WARNING, true),\n create(\"i\")\n .classes(\"text\", \"comment_content\", \"text-small\", \"fullWidth\")\n .text(\"This comment has been hidden. Click to show anyway.\")\n .build()\n ).build(), true),\n ifjs(contentShown, create(\"span\")\n .onclick(() => {\n contentShown.value = !contentShown.value;\n }).text(comment.content)\n .build())\n ).build();\n } else {\n return create(\"span\")\n .classes(\"text\", \"comment_content\", \"text-small\", \"fullWidth\")\n .text(comment.content)\n .build();\n }\n }\n\n static commentButton(showButton: boolean, comments: Signal, showComments: Signal = signal(false)) {\n const count = compute(c => c.length && c.length.toString(), comments);\n\n return create(\"div\")\n .children(\n ifjs(showButton, FJSC.button({\n text: count,\n classes: [\"wide-round-button\"],\n icon: {\n icon: \"comment\",\n adaptive: true,\n classes: [\"inline-icon\", \"svg\", \"nopointer\"],\n },\n onclick: () => showComments.value = !showComments.value\n }))\n ).build();\n }\n}", "import {notify, Ui} from \"../Classes/Ui.ts\";\nimport {Api} from \"../Api/Api.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {MediaFileType} from \"../Enums/MediaFileType.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\nimport {Images} from \"../Enums/Images.ts\";\nimport {Icons} from \"../Enums/Icons.ts\";\nimport {Signal} from \"../../fjsc/src/signals.ts\";\nimport {updateImagesWithSource} from \"../Classes/Util.ts\";\n\nexport class MediaActions {\n static async deleteMedia(type: MediaFileType, referenceId: number, image: Signal, loading: Signal) {\n const defaultImageForTypes: Record = {\n [MediaFileType.userAvatar]: Images.DEFAULT_AVATAR,\n [MediaFileType.userBanner]: Images.DEFAULT_BANNER,\n [MediaFileType.trackCover]: Images.DEFAULT_COVER_TRACK,\n [MediaFileType.audio]: Images.DEFAULT_COVER_TRACK,\n [MediaFileType.albumCover]: Images.DEFAULT_COVER_ALBUM,\n [MediaFileType.playlistCover]: Images.DEFAULT_COVER_PLAYLIST,\n };\n const defaultImage = defaultImageForTypes[type];\n\n await Ui.getConfirmationModal(\"Remove image\", \"Are you sure you want to remove this image?\", \"Yes\", \"No\", async () => {\n loading.value = true;\n let response = await Api.postAsync(ApiRoutes.deleteMedia, {\n type,\n referenceId\n });\n loading.value = false;\n if (response.code === 200) {\n notify(\"Image removed\", NotificationType.success);\n updateImagesWithSource(defaultImage, image.value);\n image.value = defaultImage;\n }\n }, () => {\n }, Icons.WARNING);\n }\n}", "import {TrackActions} from \"../Actions/TrackActions.ts\";\nimport {UserTemplates} from \"./UserTemplates.ts\";\nimport {copy, Util} from \"../Classes/Util.ts\";\nimport {Icons} from \"../Enums/Icons.js\";\nimport {PlayManager} from \"../Streaming/PlayManager.ts\";\nimport {GenericTemplates} from \"./GenericTemplates.ts\";\nimport {Time} from \"../Classes/Helpers/Time.ts\";\nimport {QueueManager} from \"../Streaming/QueueManager.ts\";\nimport {StatisticsTemplates} from \"./StatisticsTemplates.ts\";\nimport {AlbumTemplates} from \"./AlbumTemplates.ts\";\nimport {PlaylistActions} from \"../Actions/PlaylistActions.ts\";\nimport {PlaylistTemplates} from \"./PlaylistTemplates.ts\";\nimport {DragActions} from \"../Actions/DragActions.ts\";\nimport {Images} from \"../Enums/Images.ts\";\nimport {TrackEditTemplates} from \"./TrackEditTemplates.ts\";\nimport {CustomText} from \"../Classes/Helpers/CustomText.ts\";\nimport {CommentTemplates} from \"./CommentTemplates.ts\";\nimport {AnyElement, AnyNode, create, HtmlPropertyValue, ifjs, signalMap} from \"../../fjsc/src/f2.ts\";\nimport {navigate} from \"../Routing/Router.ts\";\nimport {Track} from \"../Models/DbModels/lyda/Track.ts\";\nimport {User} from \"../Models/DbModels/lyda/User.ts\";\nimport {TrackCollaborator} from \"../Models/DbModels/lyda/TrackCollaborator.ts\";\nimport {TrackLike} from \"../Models/DbModels/lyda/TrackLike.ts\";\nimport {Repost} from \"../Models/DbModels/lyda/Repost.ts\";\nimport {Album} from \"../Models/DbModels/lyda/Album.ts\";\nimport {FJSC} from \"../../fjsc\";\nimport {Playlist} from \"../Models/DbModels/lyda/Playlist.ts\";\nimport {compute, Signal, signal} from \"../../fjsc/src/signals.ts\";\nimport {CollaboratorType} from \"../Models/DbModels/lyda/CollaboratorType.ts\";\nimport {currentTrackId, currentUser, manualQueue} from \"../state.ts\";\nimport {PillOption} from \"../Models/PillOption.ts\";\nimport {UserWidgetContext} from \"../Enums/UserWidgetContext.ts\";\nimport {Ui} from \"../Classes/Ui.ts\";\nimport {Api} from \"../Api/Api.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {Comment} from \"../Models/DbModels/lyda/Comment.ts\";\nimport {ListTrack} from \"../Models/ListTrack.ts\";\nimport {MediaActions} from \"../Actions/MediaActions.ts\";\nimport {MediaFileType} from \"../Enums/MediaFileType.ts\";\n\nexport class TrackTemplates {\n static trackCard(track: Track, profileId: number) {\n const icons = [];\n const isPrivate = track.visibility === \"private\";\n if (isPrivate) {\n icons.push(GenericTemplates.lock());\n }\n if (!track.collaborators) {\n throw new Error(`Track ${track.id} has no collaborators`);\n }\n if (!track.user) {\n throw new Error(`Track ${track.id} has no user`);\n }\n if (!track.likes) {\n throw new Error(`Track ${track.id} has no likes`);\n }\n if (!track.reposts) {\n throw new Error(`Track ${track.id} has no reposts`);\n }\n if (!track.comments) {\n throw new Error(`Track ${track.id} has no comments`);\n }\n const collab = track.collaborators!.find((collab: TrackCollaborator) => collab.user_id === profileId);\n const avatarState = signal(Images.DEFAULT_AVATAR);\n if (track.user.has_avatar) {\n avatarState.value = Util.getUserAvatar(track.user_id);\n }\n\n return create(\"div\")\n .classes(\"track-card\", \"noflexwrap\", \"small-gap\", \"padded\", \"flex-v\", currentTrackId.value === track.id ? \"playing\" : \"_\")\n .attributes(\"track_id\", track.id)\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n TrackTemplates.title(track.title, track.id, icons),\n collab ? TrackTemplates.collabIndicator(collab) : null,\n ).build(),\n create(\"div\")\n .classes(\"flex\", \"noflexwrap\")\n .children(\n TrackTemplates.trackCover(track, \"card-cover\"),\n create(\"div\")\n .classes(\"flex-v\", \"small-gap\")\n .children(\n UserTemplates.userWidget(track.user, Util.arrayPropertyMatchesUser(track.user.follows ?? [], \"following_user_id\"), [], [], UserWidgetContext.card),\n create(\"span\")\n .classes(\"date\", \"text-small\", \"nopointer\", \"color-dim\")\n .text(Time.ago(track.release_date ?? track.created_at))\n .build(),\n create(\"div\")\n .classes(\"flex\")\n .children(\n StatisticsTemplates.likesIndicator(\"track\", track.id, track.likes.length,\n Util.arrayPropertyMatchesUser(track.likes, \"user_id\")),\n isPrivate ? null : StatisticsTemplates.repostIndicator(track.id, track.reposts.length, Util.arrayPropertyMatchesUser(track.reposts, \"user_id\")),\n ).build()\n ).build(),\n ).build(),\n ).build();\n }\n\n static collabIndicator(collab: TrackCollaborator): any {\n return create(\"div\")\n .classes(\"pill\", \"padded-inline\", \"flex\", \"rounded-max\", \"bordered\")\n .children(\n create(\"div\")\n .classes(\"align-center\", \"text-small\", \"nopointer\")\n .text(collab.collab_type?.name)\n .build(),\n ).build();\n }\n\n static noTracksUploadedYet(isOwnProfile: boolean) {\n let children;\n if (isOwnProfile) {\n children = [\n create(\"p\")\n .text(\"We would love to hear what you make.\")\n .build(),\n create(\"div\")\n .classes(\"button-container\")\n .children(GenericTemplates.newTrackButton([\"secondary\"]))\n .build()\n ];\n } else {\n children = [\n create(\"p\")\n .text(\"Nothing here.\")\n .build()\n ];\n }\n\n return create(\"div\")\n .classes(\"card\", \"flex-v\")\n .children(...children)\n .build();\n }\n\n static trackCover(track: Track, coverType: string, startCallback: Function|null = null) {\n const imageState = signal(Images.DEFAULT_COVER_TRACK);\n if (track.has_cover) {\n imageState.value = Util.getTrackCover(track.id);\n }\n const coverLoading = signal(false);\n\n return create(\"div\")\n .classes(\"cover-container\", \"relative\", \"pointer\", coverType)\n .attributes(\"track_id\", track.id)\n .id(track.id)\n .onclick(async () => {\n if (!startCallback) {\n PlayManager.addStreamClientIfNotExists(track.id, track.length);\n await PlayManager.startAsync(track.id);\n } else {\n await startCallback(track.id);\n }\n })\n .children(\n create(\"img\")\n .classes(\"cover\", \"nopointer\", \"blurOnParentHover\")\n .src(imageState)\n .alt(track.title)\n .build(),\n create(\"div\")\n .classes(\"hidden\", !startCallback ? \"showOnParentHover\" : \"_\", \"centeredInParent\", \"flex\")\n .children(\n GenericTemplates.deleteIconButton(\"delete-image-button\", () => MediaActions.deleteMedia(MediaFileType.trackCover, track.id, imageState, coverLoading)),\n GenericTemplates.uploadIconButton(\"replace-image-button\", () => TrackActions.replaceCover(track.id, true, imageState, coverLoading)),\n ifjs(coverLoading, GenericTemplates.loadingSpinner()),\n ).build(),\n create(\"img\")\n .classes(\"play-button-icon\", \"centeredInParent\", \"hidden\", !!startCallback ? \"showOnParentHover\" : \"_\", \"inline-icon\", \"svgInverted\", \"nopointer\")\n .src(Icons.PLAY)\n .build(),\n ).build();\n }\n\n static feedTrackCover(track: Track) {\n return TrackTemplates.trackCover(track, \"inline-cover\");\n }\n\n static smallListTrackCover(track: Track, startCallback: Function|null = null) {\n return TrackTemplates.trackCover(track, \"small-cover\", startCallback);\n }\n\n static trackCardsContainer(children: AnyNode[]) {\n return create(\"div\")\n .classes(\"profileContent\", \"tracks\", \"flex\")\n .children(...children)\n .build();\n }\n\n static async trackList(tracksState: Signal, pageState: Signal, type: string, filterState: Signal, loadingState: Signal) {\n const trackList = tracksState.value.map(track => TrackTemplates.feedTrack(track));\n const trackListContainer = signal(TrackTemplates.#trackList(trackList));\n tracksState.onUpdate = async (newTracks) => {\n const trackList = newTracks.map(track => TrackTemplates.feedTrack(track));\n trackListContainer.value = TrackTemplates.#trackList(trackList);\n };\n\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n type === \"following\" ? TrackTemplates.feedFilters(filterState, loadingState) : null,\n TrackTemplates.paginationControls(pageState),\n trackListContainer,\n TrackTemplates.paginationControls(pageState)\n ).build();\n }\n\n static feedFilters(filterState: Signal, loadingState: Signal) {\n const filterMap: Record> = {\n all: {\n text: \"All\",\n icon: \"filter_list_off\"\n },\n originals: {\n text: \"Originals\",\n icon: \"draw\"\n },\n reposts: {\n text: \"Reposts\",\n icon: \"share\"\n },\n };\n const options = Object.keys(filterMap).map(k => {\n return {\n ...filterMap[k],\n value: k,\n onclick: () => {\n filterState.value = k;\n }\n };\n }) as PillOption[];\n\n return GenericTemplates.pills(options, filterState, [], loadingState);\n }\n\n static #trackList(trackList: any[]) {\n return create(\"div\")\n .classes(\"flex-v\", \"track-list\")\n .children(...trackList)\n .build();\n }\n\n static paginationControls(pageState: Signal) {\n const previousCallback = () => {\n pageState.value = pageState.value - 1;\n };\n const nextCallback = () => {\n pageState.value = pageState.value + 1;\n };\n\n const controls = signal(TrackTemplates.#paginationControls(pageState.value, previousCallback, nextCallback));\n pageState.onUpdate = (newPage) => {\n controls.value = TrackTemplates.#paginationControls(newPage, previousCallback, nextCallback);\n };\n\n return controls;\n }\n\n static #paginationControls(currentPage: number, previousCallback: Function, nextCallback: Function) {\n return create(\"div\")\n .classes(\"flex\")\n .children(\n FJSC.button({\n text: \"Previous page\",\n icon: { icon: \"arrow_left\" },\n onclick: previousCallback,\n disabled: currentPage === 1,\n classes: [\"previousPage\"],\n }),\n FJSC.button({\n text: \"Next page\",\n icon: { icon: \"arrow_right\" },\n onclick: nextCallback,\n disabled: currentPage === Infinity,\n }),\n ).build();\n }\n\n static waveform(track: Track, loudnessData: number[], small = false) {\n if (!track.processed) {\n return create(\"div\")\n .classes(\"waveform\", small ? \"waveform-small\" : \"_\", \"processing-box\", \"rounded-max\", \"relative\", \"flex\", \"nogap\")\n .title(\"This track is still processing, please check back later.\")\n .build();\n }\n return create(\"div\")\n .classes(\"waveform\", small ? \"waveform-small\" : \"_\", \"relative\", \"flex\", \"nogap\", \"pointer\")\n .id(track.id)\n .onmousedown(async (e) => {\n PlayManager.addStreamClientIfNotExists(track.id, track.length);\n await PlayManager.scrubFromElement(e);\n })\n .onmousemove(async e => {\n if (e.buttons === 1) {\n await PlayManager.scrubFromElement(e);\n }\n })\n .children(\n ...loudnessData.map((loudness, index) => {\n return create(\"div\")\n .classes(\"waveform-bar\", \"nopointer\", index % 2 === 0 ? \"even\" : \"odd\")\n .styles(\"height\", (loudness * 100) + \"%\")\n .build();\n })\n ).build();\n }\n\n static repostIndicator(repost: Repost) {\n if (!repost.user) {\n throw new Error(`Repost has no user`);\n }\n\n return FJSC.button({\n text: \"@\" + repost.user.username,\n icon: {\n icon: Icons.REPOST,\n classes: [\"inline-icon\", \"svg\"],\n isUrl: true,\n adaptive: true },\n classes: [\"special\", \"rounded-max\", \"align-center\", \"text-small\"],\n onclick: () => {\n navigate(\"profile/\" + repost.user!.username);\n }\n });\n }\n\n static feedTrack(track: Track) {\n const icons = [];\n const isPrivate = track.visibility === \"private\";\n if (isPrivate) {\n icons.push(GenericTemplates.lock());\n }\n\n const graphics = [];\n if (track.processed) {\n graphics.push(TrackTemplates.waveform(track, JSON.parse(track.loudness_data)));\n } else {\n graphics.push(TrackTemplates.waveform(track, []));\n }\n const avatarState = signal(Images.DEFAULT_AVATAR);\n if (track.user?.has_avatar) {\n avatarState.value = Util.getUserAvatar(track.user_id);\n }\n const inQueue = signal(QueueManager.isInManualQueue(track.id));\n if (!track.comments || !track.likes || !track.reposts) {\n throw new Error(`Track ${track.id} has no comments, likes or reposts`);\n }\n\n return create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"div\")\n .classes(\"list-track\", \"flex\", \"padded\", \"rounded\", \"fullWidth\", \"card\", currentTrackId.value === track.id ? \"playing\" : \"_\")\n .styles(\"max-width\", \"100%\")\n .children(\n TrackTemplates.feedTrackCover(track),\n create(\"div\")\n .classes(\"flex-v\", \"flex-grow\")\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"div\")\n .classes(\"flex-v\", \"flex-grow\", \"small-gap\")\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n TrackTemplates.title(track.title, track.id, icons),\n track.repost ? TrackTemplates.repostIndicator(track.repost) : null,\n ).build(),\n create(\"div\")\n .classes(\"flex\")\n .children(\n UserTemplates.userWidget(track.user!, Util.arrayPropertyMatchesUser(track.user!.follows ?? [], \"following_user_id\"), [], [], UserWidgetContext.card),\n create(\"span\")\n .classes(\"date\", \"text-small\", \"nopointer\", \"color-dim\", \"align-center\")\n .text(Time.ago(track.created_at))\n .build(),\n ).build()\n ).build(),\n ).build(),\n create(\"div\")\n .classes(\"flex\")\n .children(\n StatisticsTemplates.likesIndicator(\"track\", track.id, track.likes.length,\n Util.arrayPropertyMatchesUser(track.likes, \"user_id\")),\n StatisticsTemplates.likeListOpener(track.likes),\n isPrivate ? null : StatisticsTemplates.repostIndicator(track.id, track.reposts.length, Util.arrayPropertyMatchesUser(track.reposts, \"user_id\")),\n isPrivate ? null : StatisticsTemplates.repostListOpener(track.reposts),\n FJSC.button({\n text: compute((q: boolean): string => q ? \"Unqueue\" : \"Queue\", inQueue),\n icon: {\n icon: compute((q: boolean): string => q ? \"remove\" : \"switch_access_shortcut_add\", inQueue),\n adaptive: true },\n classes: [compute((q: boolean): string => q ? \"negative\" : \"positive\", inQueue)],\n onclick: () => {\n QueueManager.toggleInManualQueue(track.id);\n inQueue.value = QueueManager.isInManualQueue(track.id);\n }\n }),\n ).build(),\n create(\"div\")\n .classes(\"flex\")\n .children(\n ...graphics,\n create(\"span\")\n .classes(\"nopointer\", \"text-small\", \"align-center\")\n .text(Time.format(track.length))\n .build(),\n ).build(),\n ).build()\n ).build()\n ).build();\n }\n\n static trackInList(listTrack: ListTrack, canEdit: boolean, list: Album|Playlist,\n tracks: Signal, type: \"album\" | \"playlist\", startCallback: Function | null = null) {\n const icons = [];\n const track = listTrack.track;\n if (!track) {\n throw new Error(\"Track is missing on list track\");\n }\n if (!track.likes) {\n throw new Error(\"Track on list track is missing likes\");\n }\n\n if (track.visibility === \"private\") {\n icons.push(GenericTemplates.lock());\n }\n\n const graphics = [];\n if (track.processed) {\n graphics.push(TrackTemplates.waveform(track, JSON.parse(track.loudness_data), true));\n } else {\n graphics.push(TrackTemplates.waveform(track, [], true));\n }\n\n const dragData = {\n type: \"track\",\n id: track.id,\n };\n\n let item = create(\"div\")\n .classes(\"flex\", \"fadeIn\", \"track-in-list\");\n\n if (canEdit) {\n item = item\n .attributes(\"draggable\", \"true\")\n .ondragstart(async (e: DragEvent) => {\n DragActions.showDragTargets();\n e.dataTransfer!.setData(\"text/plain\", JSON.stringify(dragData));\n e.dataTransfer!.effectAllowed = \"move\";\n e.stopPropagation();\n })\n .ondragend(async (e) => {\n DragActions.hideDragTargets();\n e.preventDefault();\n e.stopPropagation();\n });\n }\n\n const playingClasses = currentTrackId.value === track.id ? [\"playing\"] : [];\n\n return item.children(\n create(\"div\")\n .classes(\"list-track\", \"flex\", \"padded\", \"rounded\", \"fullWidth\", \"card\", ...playingClasses)\n .styles(\"max-width\", \"100%\")\n .ondblclick(async () => {\n if (!startCallback) {\n PlayManager.addStreamClientIfNotExists(track.id, track.length);\n await PlayManager.startAsync(track.id);\n } else {\n await startCallback(track.id);\n }\n })\n .children(\n ifjs(canEdit, GenericTemplates.verticalDragIndicator()),\n TrackTemplates.smallListTrackCover(track, startCallback),\n create(\"div\")\n .classes(\"flex-v\", \"flex-grow\")\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"div\")\n .classes(\"flex-v\", \"flex-grow\", \"small-gap\")\n .children(\n create(\"div\")\n .classes(\"flex\", \"align-children\")\n .children(\n StatisticsTemplates.likesIndicator(\"track\", track.id, track.likes.length ?? [],\n Util.arrayPropertyMatchesUser(track.likes, \"user_id\")),\n TrackTemplates.title(track.title, track.id, icons),\n create(\"span\")\n .classes(\"nopointer\", \"text-small\", \"align-center\")\n .text(Time.format(track.length))\n .build(),\n create(\"span\")\n .classes(\"date\", \"text-small\", \"nopointer\", \"color-dim\", \"align-center\")\n .text(Time.ago(track.created_at))\n .build(),\n create(\"div\")\n .classes(\"flex-grow\")\n .build(),\n ifjs(canEdit, TrackTemplates.trackInListActions(track, list, listTrack, tracks, type)),\n ).build(),\n ).build(),\n ).build(),\n create(\"div\")\n .classes(\"flex\")\n .children(\n ...graphics,\n ).build(),\n ).build()\n ).build()\n ).build();\n }\n\n static trackInListActions(track: Track, list: Album|Playlist,\n listTrack: ListTrack, tracks: Signal, type: \"album\" | \"playlist\") {\n return create(\"div\")\n .classes(\"flex\")\n .children(\n FJSC.button({\n text: \"Move up\",\n icon: { icon: \"keyboard_arrow_up\" },\n classes: [\"positive\"],\n disabled: compute(p => p[0].track_id === track.id, tracks),\n onclick: async () => {\n await TrackActions.reorderTrack(type, list.id, track.id, tracks, listTrack.position - 1);\n }\n }),\n FJSC.button({\n text: \"Move down\",\n icon: { icon: \"keyboard_arrow_down\" },\n classes: [\"positive\"],\n disabled: compute(p => p[p.length - 1].track_id === track.id, tracks),\n onclick: async () => {\n await TrackActions.reorderTrack(type, list.id, track.id, tracks, listTrack.position + 1);\n }\n }),\n FJSC.button({\n text: \"Remove from \" + type,\n icon: { icon: \"close\" },\n classes: [\"negative\"],\n onclick: async () => {\n await TrackActions.removeTrackFromList(tracks, list, type, listTrack);\n }\n })\n ).build();\n }\n\n static tracksInList(noTracks: Signal, tracks: Signal, data: any, list: Album|Playlist,\n type: \"album\" | \"playlist\", startCallback: (trackId: number) => Promise) {\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n ifjs(noTracks, create(\"div\")\n .classes(\"card\")\n .children(\n create(\"span\")\n .text(`This ${type} has no tracks.`)\n .build()\n ).build()),\n signalMap(tracks, create(\"div\").classes(\"flex-v\"), (track, i) => {\n return create(\"div\")\n .classes(\"flex-v\", \"relative\")\n .children(\n ifjs(data.canEdit, GenericTemplates.dragTargetInList(async (data: any) => {\n await TrackActions.reorderTrack(type, list.id, data.id, tracks, i);\n }, i.toString())),\n TrackTemplates.trackInList(track, data.canEdit, list, tracks, \"album\", startCallback)\n ).build();\n })\n ).build();\n }\n\n static title(title: HtmlPropertyValue, id: number, icons: any[]) {\n return create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"span\")\n .classes(\"clickable\", \"text-large\", \"pointer\")\n .text(title)\n .onclick(() => {\n navigate(\"track/\" + id);\n }).build(),\n ...icons,\n ).build();\n }\n\n static collaborator(track: Track, collaborator: TrackCollaborator): any {\n const avatarState = signal(Images.DEFAULT_AVATAR);\n if (collaborator.user?.has_avatar) {\n avatarState.value = Util.getUserAvatar(collaborator.user_id);\n }\n let actionButton = null, classes = [];\n const user = currentUser.value;\n if (user && user.id === track.user_id) {\n actionButton = GenericTemplates.action(Icons.X, \"Remove\", track.id, async () => {\n await TrackActions.removeCollaboratorFromTrack(track.id, collaborator.user_id);\n });\n classes.push(\"no-redirect\");\n }\n if (!collaborator.user) {\n throw new Error(`Collaborator ${collaborator.user_id} has no user`);\n }\n if (!collaborator.collab_type) {\n throw new Error(`Collaborator ${collaborator.user_id} has no collab_type`);\n }\n\n return UserTemplates.linkedUser(collaborator.user_id, collaborator.user.username, collaborator.user.displayname, avatarState, collaborator.collab_type.name, actionButton, [], classes);\n }\n\n static async trackPage(trackData: any) {\n if (!trackData.track) {\n console.log(trackData);\n console.error(\"Invalid track data\");\n return null;\n }\n const track = trackData.track as Track;\n if (!track.likes || !track.reposts || !track.comments) {\n throw new Error(`Track ${track.id} is missing property likes, reposts or comments`);\n }\n const liked = compute(u => !!(track.likes?.some((like: TrackLike) => like.user_id === u?.id)), currentUser);\n const reposted = compute(u => !!(track.reposts?.some(repost => repost.user_id === u?.id)), currentUser);\n const collaborators = track.collaborators ?? [];\n const toAppend = [];\n const linkedUserState = signal(collaborators);\n\n function collabList(collaborators: TrackCollaborator[]) {\n return create(\"div\")\n .classes(\"flex\")\n .children(\n ...collaborators.map(collaborator => TrackTemplates.collaborator(track, collaborator)),\n trackData.canEdit ? TrackEditTemplates.addLinkedUserButton(async (newUsername: string, newUser: TrackCollaborator) => {\n const newCollab = await TrackActions.addCollaboratorToTrack(track.id, newUser.user_id, newUser.type);\n if (!newCollab) {\n return;\n }\n linkedUserState.value = [...linkedUserState.value, newCollab];\n }, [\"secondary\"]) : null\n ).build();\n }\n\n const collaboratorChildren = signal(collabList(collaborators));\n linkedUserState.onUpdate = (newCollaborators: TrackCollaborator[]) => {\n collaboratorChildren.value = collabList(newCollaborators);\n };\n\n toAppend.push(TrackTemplates.collaboratorSection(collaboratorChildren, linkedUserState));\n const icons = [];\n const isPrivate = track.visibility === \"private\";\n if (isPrivate) {\n icons.push(GenericTemplates.lock());\n }\n\n const trackUser = track.user;\n if (!trackUser) {\n throw new Error(`Track ${track.id} has no user`);\n }\n const editActions = [];\n if (trackData.canEdit) {\n editActions.push(TrackEditTemplates.addToAlbumsButton(track));\n if (isPrivate) {\n editActions.push(TrackTemplates.copyPrivateLinkButton(track.id, track.secretcode));\n }\n editActions.push(TrackEditTemplates.openEditPageButton(track));\n editActions.push(TrackEditTemplates.deleteTrackButton(track.id));\n }\n\n const description = create(\"span\")\n .id(\"track-description\")\n .classes(\"description\", \"break-lines\")\n .html(CustomText.renderToHtml(track.description))\n .build();\n\n setTimeout(() => {\n if (description.clientHeight < description.scrollHeight) {\n description.classList.add(\"overflowing\");\n }\n }, 200);\n const coverLoading = signal(false);\n const coverFile = signal(Images.DEFAULT_COVER_TRACK);\n if (track.has_cover) {\n coverFile.value = Util.getTrackCover(track.id);\n }\n const showComments = signal(false);\n const comments = signal([]);\n Api.getAsync(ApiRoutes.getCommentsByTrackId, {track_id: track.id}).then((c) => {\n if (!c.data || c.data.error) {\n return;\n }\n comments.value = c.data;\n });\n\n return create(\"div\")\n .classes(\"single-page\", \"noflexwrap\", \"padded-large\", \"rounded-large\", \"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex-v\", \"nogap\")\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"span\")\n .classes(\"text-xxlarge\")\n .text(track.title)\n .build(),\n ...icons,\n ).build(),\n UserTemplates.userWidget({\n ...trackUser,\n displayname: track.artistname ?? trackUser.displayname\n }, Util.arrayPropertyMatchesUser(trackUser.follows ?? [], \"following_user_id\"), [], [], UserWidgetContext.singlePage),\n ).build(),\n ...toAppend,\n create(\"div\")\n .classes(\"track-title-container\", \"flex-v\", \"small-gap\")\n .children(\n create(\"span\")\n .classes(\"collaborators\")\n .text(track.credits)\n .build(),\n ifjs(track.description.length > 0, description),\n create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"span\")\n .classes(\"date\", \"text-small\")\n .text(\"Uploaded \" + Util.formatDate(track.created_at))\n .build(),\n create(\"span\")\n .classes(\"playcount\", \"text-small\")\n .text(track.plays + \" plays\")\n .build()\n ).build()\n ).build(),\n create(\"div\")\n .classes(\"track-info-container\", \"flex\", \"align-bottom\")\n .children(\n TrackTemplates.trackCover(track, \"cover\"),\n // create(\"div\")\n // .classes(\"cover-container\", \"relative\", trackData.canEdit ? \"pointer\" : \"_\")\n // .onclick(() => {\n // if (!trackData.canEdit) {\n // Ui.showImageModal(coverFile);\n // return;\n // }\n // TrackActions.replaceCover(track.id, trackData.canEdit, coverFile, coverLoading)\n // })\n // .children(\n // ifjs(coverLoading, create(\"div\")\n // .classes(\"loader\", \"loader-small\", \"centeredInParent\")\n // .id(\"cover-loader\")\n // .build()),\n // create(\"img\")\n // .classes(\"cover\", \"blurOnParentHover\", \"nopointer\")\n // .src(coverFile)\n // .alt(track.title)\n // .build()\n // ).build(),\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n TrackTemplates.waveform(track, track.processed ? JSON.parse(track.loudness_data) : []),\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex\", \"align-children\")\n .children(\n TrackTemplates.playButton(track),\n TrackTemplates.addToQueueButton(track),\n ifjs(trackData.canEdit, TrackEditTemplates.replaceAudioButton(track)),\n ).build(),\n create(\"div\")\n .classes(\"stats-container\", \"flex\", \"rounded\")\n .children(\n StatisticsTemplates.likesIndicator(\"track\", track.id, track.likes.length, liked),\n StatisticsTemplates.likeListOpener(track.likes),\n ifjs(isPrivate, StatisticsTemplates.repostIndicator(track.id, track.reposts.length, reposted), true),\n ifjs(isPrivate, StatisticsTemplates.repostListOpener(track.reposts), true),\n CommentTemplates.commentButton(true, comments, showComments)\n ).build(),\n ).build()\n ).build(),\n ).build(),\n TrackTemplates.audioActions(track, editActions),\n create(\"div\")\n .classes(\"flex\")\n .children(\n CommentTemplates.commentListFullWidth(track.id, comments, showComments)\n ).build(),\n TrackTemplates.inAlbumsList(track),\n await TrackTemplates.inPlaylistsList(track)\n ).build();\n }\n\n static collaboratorSection(collaboratorChildren: AnyNode|Signal, linkedUserState: Signal) {\n const collabText = signal(\"\");\n linkedUserState.subscribe((newCollaborators: TrackCollaborator[]) => {\n collabText.value = newCollaborators.length > 0 ? \"Collaborators\" : \"\";\n });\n\n return create(\"div\")\n .classes(\"flex-v\", \"nogap\")\n .children(\n create(\"span\")\n .classes(\"text-small\")\n .text(collabText)\n .build(),\n create(\"div\")\n .classes(\"flex\")\n .id(\"linked_users_container\")\n .children(collaboratorChildren)\n .build(),\n ).build();\n }\n\n static inAlbumsList(track: Track) {\n if (!track.albums || track.albums.length === 0) {\n return create(\"div\")\n .classes(\"flex-v\", \"track-contained-list\")\n .build();\n }\n\n const albumCards = track.albums.map((album: Album) => {\n return AlbumTemplates.albumCard(album, true);\n });\n\n return create(\"div\")\n .classes(\"flex-v\", \"track-contained-list\")\n .children(\n create(\"h2\")\n .text(\"In Albums\")\n .build(),\n create(\"div\")\n .classes(\"flex\")\n .children(\n ...albumCards\n ).build()\n ).build();\n }\n\n static async inPlaylistsList(track: Track) {\n if (!track.playlists || track.playlists.length === 0) {\n return create(\"div\")\n .classes(\"flex-v\", \"track-contained-list\")\n .build();\n }\n\n const playlistCards = track.playlists.map(playlist => {\n return PlaylistTemplates.playlistCard(playlist, true);\n });\n\n return create(\"div\")\n .classes(\"flex-v\", \"track-contained-list\")\n .children(\n create(\"h2\")\n .text(\"In Playlists\")\n .build(),\n create(\"div\")\n .classes(\"flex\")\n .children(\n ...playlistCards\n ).build()\n ).build();\n }\n\n static audioActions(track: Track, editActions: AnyNode[]) {\n return create(\"div\")\n .classes(\"audio-actions\", \"flex\")\n .children(\n ifjs(currentUser, FJSC.button({\n text: \"Add to playlist\",\n icon: { icon: \"playlist_add\" },\n onclick: async () => {\n await PlaylistActions.openAddToPlaylistModal(track, \"track\");\n }\n })),\n ...editActions\n ).build();\n }\n\n private static addToQueueButton(track: Track,) {\n const inQueue = compute(q => q.includes(track.id), manualQueue);\n const text = compute((q: boolean): string => q ? \"Unqueue\" : \"Queue\", inQueue);\n const icon = compute((q: boolean): string => q ? \"remove\" : \"switch_access_shortcut_add\", inQueue);\n const queueClass = compute((q: boolean): string => q ? \"negative\" : \"positive\", inQueue);\n\n return FJSC.button({\n text,\n icon: {icon},\n classes: [queueClass],\n onclick: () => {\n QueueManager.toggleInManualQueue(track.id);\n inQueue.value = QueueManager.isInManualQueue(track.id);\n }\n });\n }\n\n static playButton(track: Track) {\n const isPlaying = PlayManager.isPlaying(track.id);\n\n return FJSC.button({\n text: isPlaying ? \"Pause\": \"Play\",\n icon: {\n icon: isPlaying ? Icons.PAUSE : Icons.PLAY,\n classes: [\"inline-icon\", \"svg\", \"nopointer\"],\n isUrl: true\n },\n classes: [\"audio-player-toggle\"],\n id: track.id,\n onclick: async () => {\n PlayManager.addStreamClientIfNotExists(track.id, track.length);\n await PlayManager.togglePlayAsync(track.id);\n },\n });\n }\n\n static toBeApprovedTrack(collabType: CollaboratorType, track: TrackCollaborator, user: User) {\n const avatarState = signal(Images.DEFAULT_AVATAR);\n if (track.user?.has_avatar) {\n avatarState.value = Util.getUserAvatar(track.user_id);\n }\n if (!track.user) {\n throw new Error(\"User not set on to be approved track with ID ${track.track_id}\");\n }\n if (!track.track) {\n throw new Error(`Track not set on to be approved track with ID ${track.track_id}`);\n }\n if (!track.user.follows) {\n throw new Error(`User follows not set on to be approved track with ID ${track.track_id}`);\n }\n\n return create(\"div\")\n .classes(\"flex\", \"card\", \"collab\")\n .id(track.track_id)\n .children(\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"span\")\n .classes(\"text-large\")\n .text(track.track.title)\n .build(),\n create(\"span\")\n .classes(\"text-small\")\n .text(Time.ago(track.created_at))\n .build(),\n UserTemplates.userWidget(track.user, track.user.follows.some(follow => follow.following_user_id === user.id), [], [], UserWidgetContext.card),\n create(\"span\")\n .text(\"Requested you to be \" + collabType.name)\n .build(),\n ).build(),\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n GenericTemplates.action(Icons.CHECK, \"Approve\", track.track_id, async () => {\n await TrackActions.approveCollab(track.track_id, track.track!.title);\n }, [], [\"secondary\", \"positive\"]),\n GenericTemplates.action(Icons.X, \"Deny\", track.track_id, async () => {\n await TrackActions.denyCollab(track.track_id, track.track!.title);\n }, [], [\"secondary\", \"negative\"]),\n ).build(),\n ).build(),\n ).build();\n }\n\n static unapprovedTracks(tracks: TrackCollaborator[], user: User) {\n const trackList = tracks.map((track: TrackCollaborator) => {\n if (!track.collab_type) {\n throw new Error(`Track Collab type is not set for unapproved track with ID ${track.track_id}`);\n }\n return TrackTemplates.toBeApprovedTrack(track.collab_type, track, user);\n });\n return create(\"div\")\n .classes(\"flex-v\")\n .children(...trackList)\n .build();\n }\n\n static copyPrivateLinkButton(id: number, code: string) {\n return FJSC.button({\n text: \"Copy private link\",\n icon: { icon: \"link\" },\n classes: [\"special\"],\n onclick: async () => copy(window.location.origin + \"/track/\" + id + \"/\" + code)\n });\n }\n}", "import {Icons} from \"../Enums/Icons.js\";\nimport {AlbumActions} from \"../Actions/AlbumActions.ts\";\nimport {Time} from \"../Classes/Helpers/Time.ts\";\nimport {GenericTemplates} from \"./GenericTemplates.ts\";\nimport {TrackActions} from \"../Actions/TrackActions.ts\";\nimport {UserTemplates} from \"./UserTemplates.ts\";\nimport {PlayManager} from \"../Streaming/PlayManager.ts\";\nimport {TrackTemplates} from \"./TrackTemplates.ts\";\nimport {QueueManager} from \"../Streaming/QueueManager.ts\";\nimport {PlaylistActions} from \"../Actions/PlaylistActions.ts\";\nimport {StatisticsTemplates} from \"./StatisticsTemplates.ts\";\nimport {Images} from \"../Enums/Images.ts\";\nimport {Util} from \"../Classes/Util.ts\";\nimport {notify, Ui} from \"../Classes/Ui.ts\";\nimport {FJSC} from \"../../fjsc\";\nimport {AnyNode, create, HtmlPropertyValue, ifjs, signalMap} from \"../../fjsc/src/f2.ts\";\nimport {Album} from \"../Models/DbModels/lyda/Album.ts\";\nimport {InputType} from \"../../fjsc/src/Types.ts\";\nimport {Track} from \"../Models/DbModels/lyda/Track.ts\";\nimport {User} from \"../Models/DbModels/lyda/User.ts\";\nimport {navigate} from \"../Routing/Router.ts\";\nimport {compute, Signal, signal} from \"../../fjsc/src/signals.ts\";\nimport {UserWidgetContext} from \"../Enums/UserWidgetContext.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\nimport {manualQueue} from \"../state.ts\";\nimport {PlaylistTrack} from \"../Models/DbModels/lyda/PlaylistTrack.ts\";\nimport {AlbumTrack} from \"../Models/DbModels/lyda/AlbumTrack.ts\";\nimport {ListTrack} from \"../Models/ListTrack.ts\";\n\nexport class AlbumTemplates {\n static async addToAlbumModal(track: Track, albums: Album[]) {\n if (albums.some(a => !a.tracks)) {\n throw new Error(`No album tracks for some of ids ${albums.map(a => a.id)}`);\n }\n\n const checkedAlbums = signal(albums.filter(a => a.tracks!.some(t => t.track_id === track.id)).map(a => a.id));\n let albumList: AnyNode[] = [];\n if (albums.length === 0) {\n albumList.push(create(\"span\")\n .classes(\"nopointer\")\n .text(\"No albums found\")\n .build());\n } else {\n albumList = await Promise.all(albums.map(async (album: Album) => {\n if (!album.tracks) {\n console.warn(\"Album has no tracks: \", album);\n return;\n }\n\n return await AlbumTemplates.albumInAddList(album, checkedAlbums);\n })) as AnyNode[];\n }\n const buttonText = compute((ch: number[]) => `Add to ${ch.length} albums`, checkedAlbums);\n\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"img\")\n .styles(\"width\", \"30px\", \"height\", \"auto\")\n .classes(\"inline-icon\", \"svg\", \"nopointer\")\n .attributes(\"src\", Icons.ALBUM_ADD)\n .build(),\n create(\"h5\")\n .text(`Add ${track.title} to album`)\n .build()\n )\n .build(),\n create(\"div\")\n .classes(\"check-list\")\n .children(\n ...albumList,\n ).build(),\n create(\"div\")\n .classes(\"flex\")\n .children(\n FJSC.button({\n text: buttonText,\n classes: [\"positive\"],\n icon: { icon: \"forms_add_on\" },\n disabled: compute((ch: number[]) => ch.length === 0, checkedAlbums),\n onclick: async () => {\n await AlbumActions.addTrackToAlbums(track.id, checkedAlbums.value);\n }\n }),\n FJSC.button({\n text: \"Cancel\",\n classes: [\"negative\"],\n icon: { icon: \"close\" },\n onclick: Util.removeModal\n }),\n ).build()\n ).build();\n }\n\t\n static async albumInAddList(item: Album, checkedItems: Signal) {\n const checked = compute((ch) => ch.includes(item.id), checkedItems);\n const checkedClass = compute((c): string => c ? \"active\" : \"_\", checked);\n\n return create(\"div\")\n .classes(\"flex\", \"padded\", \"check-list-item\", checkedClass)\n .onclick(() => {\n if (checked.value) {\n checkedItems.value = checkedItems.value.filter(id => id !== item.id);\n } else {\n checkedItems.value = [...checkedItems.value, item.id];\n }\n })\n .children(\n await AlbumTemplates.smallAlbumCover(item),\n create(\"span\")\n .text(item.title)\n .build(),\n ).build();\n }\n\n static newAlbumModal() {\n const album = signal(>{\n title: \"\",\n upc: \"\",\n description: \"\",\n release_date: new Date(),\n visibility: \"private\",\n });\n const name = compute((s) => s.title ?? \"\", album);\n const upc = compute((s) => s.upc ?? \"\", album);\n const description = compute((s) => s.description ?? \"\", album);\n const releaseDate = compute((s) => s.release_date ?? new Date(), album);\n const visibility = compute((s) => s.visibility === \"private\", album);\n const disabled = compute((s) => {\n return !s.title || s.title === \"\";\n }, album);\n\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"img\")\n .styles(\"width\", \"30px\", \"height\", \"auto\")\n .classes(\"inline-icon\", \"svg\", \"nopointer\")\n .attributes(\"src\", Icons.ALBUM_ADD)\n .build(),\n create(\"h2\")\n .text(\"New album\")\n .build()\n )\n .build(),\n create(\"div\")\n .classes(\"flex-v\")\n .id(\"newAlbumForm\")\n .children(\n FJSC.input({\n type: InputType.text,\n required: true,\n name: \"name\",\n label: \"Name\",\n placeholder: \"Album name\",\n value: name,\n onchange: (v) => {\n album.value = { ...album.value, title: v };\n }\n }),\n FJSC.input({\n type: InputType.text,\n name: \"upc\",\n label: \"UPC\",\n placeholder: \"12-digit number\",\n value: upc,\n onchange: (v) => {\n album.value = { ...album.value, upc: v };\n }\n }),\n FJSC.textarea({\n name: \"description\",\n label: \"Description\",\n placeholder: \"My cool album\",\n value: description,\n onchange: (v) => {\n album.value = { ...album.value, description: v };\n }\n }),\n FJSC.input({\n type: InputType.date,\n name: \"release_date\",\n label: \"Release Date\",\n placeholder: \"YYYY-MM-DD\",\n value: releaseDate,\n onchange: (v) => {\n album.value = { ...album.value, release_date: new Date(v) };\n }\n }),\n FJSC.toggle({\n name: \"visibility\",\n label: \"Private\",\n text: \"Private\",\n checked: visibility,\n onchange: (v) => {\n album.value = { ...album.value, visibility: v ? \"private\" : \"public\" };\n }\n }),\n ).build(),\n create(\"div\")\n .classes(\"flex\")\n .children(\n FJSC.button({\n text: \"Create album\",\n disabled,\n onclick: async () => {\n await AlbumActions.createNewAlbum(album.value);\n Util.removeModal();\n },\n icon: { icon: \"playlist_add\" },\n classes: [\"positive\"],\n }),\n GenericTemplates.modalCancelButton()\n ).build()\n ).build();\n }\n\n static noAlbumsYet(isOwnProfile: boolean) {\n let children;\n if (isOwnProfile) {\n children = [\n create(\"p\")\n .text(\"You have not created any albums yet.\")\n .build(),\n create(\"div\")\n .classes(\"button-container\")\n .children(GenericTemplates.newAlbumButton([\"secondary\"]))\n .build(),\n ];\n } else {\n children = [\n create(\"p\")\n .text(\"This user has not created any albums yet.\")\n .build()\n ];\n }\n\n return create(\"div\")\n .classes(\"card\", \"flex-v\")\n .children(...children)\n .build();\n }\n\n static albumCard(album: Album, isSecondary = false) {\n if (!album.user) {\n throw new Error(`Album has no user: ${album.id}`);\n }\n\n const icons = [];\n if (album.visibility === \"private\") {\n icons.push(GenericTemplates.lock());\n }\n\n return create(\"div\")\n .classes(\"album-card\", \"padded\", \"flex-v\", \"small-gap\", isSecondary ? \"secondary\" : \"_\")\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n AlbumTemplates.albumCover(album, \"card-cover\"),\n create(\"div\")\n .classes(\"flex-v\", \"small-gap\")\n .children(\n AlbumTemplates.title(album.title, album.id, icons),\n UserTemplates.userWidget(album.user, Util.userIsFollowing(album.user), [], [], UserWidgetContext.card),\n create(\"span\")\n .classes(\"date\", \"text-small\", \"nopointer\", \"color-dim\")\n .text(Time.ago(album.release_date))\n .build(),\n ).build(),\n ).build(),\n create(\"div\")\n .classes(\"stats-container\", \"flex\", \"rounded\")\n .children(\n StatisticsTemplates.likesIndicator(\"album\", album.id, album.likes.length, Util.userHasLiked(album)),\n StatisticsTemplates.likeListOpener(album.likes),\n ).build()\n ).build();\n }\n\n static title(title: HtmlPropertyValue, id: number, icons: any[]) {\n return create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"span\")\n .classes(\"clickable\", \"text-large\", \"pointer\")\n .text(title)\n .onclick(() => {\n navigate(\"album/\" + id);\n })\n .build(),\n ...icons,\n ).build();\n }\n\n static albumCover(album: Album, coverType: string) {\n if (!album.tracks) {\n throw new Error(`Album ${album.id} has no tracks`);\n }\n\n const srcState = signal(Images.DEFAULT_COVER_ALBUM);\n if (album.has_cover) {\n srcState.value = Util.getAlbumCover(album.id);\n }\n\n return create(\"div\")\n .classes(\"cover-container\", \"relative\", \"pointer\", coverType)\n .attributes(\"album_id\", album.id)\n .id(album.id)\n .onclick(async () => {\n PlayManager.playFrom(\"album\", album.title, album.id);\n QueueManager.setContextQueue(album.tracks!.map(t => t.track_id));\n const firstTrack = album.tracks![0];\n if (!firstTrack) {\n notify(\"This album has no tracks\", NotificationType.error);\n return;\n }\n PlayManager.addStreamClientIfNotExists(firstTrack.track_id, firstTrack.track?.length ?? 0);\n await PlayManager.startAsync(firstTrack.track_id);\n })\n .children(\n create(\"img\")\n .classes(\"cover\", \"nopointer\", \"blurOnParentHover\")\n .src(srcState)\n .alt(album.title)\n .build(),\n create(\"img\")\n .classes(\"play-button-icon\", \"centeredInParent\", \"showOnParentHover\", \"inline-icon\", \"svgInverted\", \"nopointer\")\n .src(Icons.PLAY)\n .build(),\n )\n .build();\n }\n\n static async smallAlbumCover(album: Album) {\n const coverState = signal(Images.DEFAULT_COVER_ALBUM);\n if (album.has_cover) {\n coverState.value = Util.getAlbumCover(album.id);\n }\n\n return create(\"img\")\n .classes(\"cover\", \"rounded\", \"nopointer\", \"blurOnParentHover\")\n .styles(\"height\", \"var(--font-size-large)\")\n .src(coverState)\n .alt(album.title)\n .build();\n }\n\n static albumCardsContainer(children: AnyNode[]) {\n return create(\"div\")\n .classes(\"profileContent\", \"albums\", \"flex\")\n .children(...children)\n .build();\n }\n\n static async albumPage(data: any, user: User) {\n const album = data.album as Album;\n if (!album.tracks) {\n throw new Error(`Album ${album.id} has no tracks`);\n }\n const tracks = signal(album.tracks);\n const noTracks = compute(t => t.length === 0, tracks);\n const a_user = album.user;\n if (!a_user) {\n throw new Error(`Album ${album.id} has no user`);\n }\n\n async function startCallback(trackId: number) {\n await AlbumActions.startTrackInAlbum(album, trackId);\n }\n\n const editActions = [];\n if (data.canEdit) {\n editActions.push(FJSC.button({\n text: \"Delete\",\n icon: { icon: \"delete\" },\n classes: [\"negative\"],\n onclick: async (e) => {\n await Ui.getConfirmationModal(\"Delete album\", \"Are you sure you want to delete this album?\", \"Yes\", \"No\", AlbumActions.deleteAlbumFromElement.bind(null, e), () => {\n }, Icons.WARNING);\n }\n }));\n }\n const coverLoading = signal(false);\n const coverState = signal(Images.DEFAULT_COVER_ALBUM);\n if (album.has_cover) {\n coverState.value = Util.getAlbumCover(album.id);\n }\n\n return create(\"div\")\n .classes(\"single-page\", \"noflexwrap\", \"padded-large\", \"rounded-large\", \"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex-v\", \"nogap\")\n .children(\n create(\"span\")\n .classes(\"title\", \"wordwrap\")\n .text(album.title)\n .build(),\n UserTemplates.userWidget(a_user, Util.arrayPropertyMatchesUser(a_user.follows ?? [], \"following_user_id\"), [], [], UserWidgetContext.singlePage)\n ).build(),\n create(\"div\")\n .classes(\"album-info-container\", \"flex\")\n .children(\n create(\"div\")\n .classes(\"cover-container\", \"relative\", data.canEdit ? \"pointer\" : \"_\")\n .attributes(\"album_id\", album.id, \"canEdit\", data.canEdit)\n .onclick(e => AlbumActions.replaceCover(e, album.id, data.canEdit, coverLoading))\n .children(\n ifjs(coverLoading, create(\"div\")\n .classes(\"loader\", \"loader-small\", \"centeredInParent\")\n .id(\"cover-loader\")\n .build()),\n create(\"img\")\n .classes(\"cover\", \"blurOnParentHover\", \"nopointer\")\n .src(coverState)\n .alt(album.title)\n .build()\n )\n .build(),\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n AlbumTemplates.audioActions(album, user, editActions),\n create(\"div\")\n .classes(\"album-title-container\", \"flex-v\", \"small-gap\")\n .children(\n create(\"span\")\n .classes(\"date\", \"text-small\")\n .text(\"Released \" + Util.formatDate(album.release_date))\n .build()\n ).build(),\n create(\"div\")\n .classes(\"stats-container\", \"flex\", \"rounded\")\n .children(\n StatisticsTemplates.likesIndicator(\"album\", album.id, album.likes.length,\n Util.arrayPropertyMatchesUser(album.likes, \"user_id\")),\n StatisticsTemplates.likeListOpener(album.likes),\n ).build(),\n ).build()\n ).build(),\n TrackTemplates.tracksInList(noTracks, tracks, data, album, \"album\", startCallback)\n ).build();\n }\n\n static audioActions(album: Album, user: User, editActions: AnyNode[] = []) {\n const playingFrom = PlayManager.getPlayingFrom();\n const isPlaying = playingFrom && playingFrom.type === \"album\" && playingFrom.id === album.id;\n if (!album.tracks) {\n throw new Error(`Album ${album.id} has no tracks`);\n }\n const duration = album.tracks.reduce((acc, t) => acc + (t.track?.length ?? 0), 0);\n\n let actions: AnyNode[] = [];\n if (user) {\n actions = [\n FJSC.button({\n text: isPlaying ? \"Pause\" : \"Play\",\n icon: {\n icon: isPlaying ? Icons.PAUSE : Icons.PLAY,\n classes: [\"inline-icon\", \"svg\", \"nopointer\"],\n adaptive: true,\n isUrl: true\n },\n classes: [album.tracks.length === 0 ? \"nonclickable\" : \"_\", \"secondary\"],\n attributes: [\"duration\", duration.toString()],\n id: album.id,\n onclick: async () => {\n const firstTrack = (album.tracks!)[0];\n await AlbumActions.startTrackInAlbum(album, firstTrack.track_id, true);\n },\n }),\n AlbumTemplates.addToQueueButton(album),\n FJSC.button({\n text: \"Add to playlist\",\n icon: {\n icon: Icons.PLAYLIST_ADD,\n classes: [\"inline-icon\", \"svg\", \"nopointer\"],\n adaptive: true,\n isUrl: true\n },\n classes: [\"secondary\"],\n onclick: async () => {\n await PlaylistActions.openAddToPlaylistModal(album, \"album\");\n },\n }),\n ];\n }\n\n return create(\"div\")\n .classes(\"audio-actions\", \"flex\")\n .children(\n ...actions,\n ...editActions\n ).build();\n }\n\n private static addToQueueButton(album: Album) {\n const allTracksInQueue = compute(q => album.tracks && album.tracks.every((t) => q.includes(t.track_id)), manualQueue);\n const text = compute((q): string => q ? \"Unqueue\" : \"Queue\", allTracksInQueue);\n const icon = compute((q): string => q ? Icons.UNQUEUE : Icons.QUEUE, allTracksInQueue);\n const buttonClass = compute((q): string => q ? \"audio-queueremove\" : \"audio-queueadd\", allTracksInQueue);\n\n return FJSC.button({\n text,\n icon: {\n icon,\n classes: [\"inline-icon\", \"svg\", \"nopointer\"],\n adaptive: true,\n isUrl: true\n },\n classes: [buttonClass, \"secondary\"],\n onclick: async () => {\n for (let track of album.tracks!) {\n if (!manualQueue.value.includes(track.track_id)) {\n QueueManager.addToManualQueue(track.track_id);\n }\n }\n },\n });\n }\n}", "import {GenericTemplates} from \"../Templates/GenericTemplates.ts\";\nimport {AlbumTemplates} from \"../Templates/AlbumTemplates.ts\";\nimport {Api} from \"../Api/Api.ts\";\nimport {getErrorMessage, Util} from \"../Classes/Util.ts\";\nimport {notify, Ui} from \"../Classes/Ui.ts\";\nimport {PlayManager} from \"../Streaming/PlayManager.ts\";\nimport {QueueManager} from \"../Streaming/QueueManager.ts\";\nimport {navigate} from \"../Routing/Router.ts\";\nimport {Signal} from \"../../fjsc/src/signals.ts\";\nimport {Album} from \"../Models/DbModels/lyda/Album.ts\";\nimport {Track} from \"../Models/DbModels/lyda/Track.ts\";\nimport {MediaUploader} from \"../Api/MediaUploader.ts\";\nimport {MediaFileType} from \"../Enums/MediaFileType.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\nimport {AlbumTrack} from \"../Models/DbModels/lyda/AlbumTrack.ts\";\nimport {ListTrack} from \"../Models/ListTrack.ts\";\n\nexport class AlbumActions {\n static async deleteAlbumFromElement(e: any) {\n if (!confirm) {\n return;\n }\n await AlbumActions.deleteAlbum(e.target.id);\n }\n\n static async openAddToAlbumModal(track: Track) {\n const res = await Api.getAsync(ApiRoutes.getAlbumsByUserId, {id: track.user_id});\n if (res.code !== 200) {\n console.error(\"Failed to get albums: \", res.data);\n return;\n }\n let modal = GenericTemplates.modal([await AlbumTemplates.addToAlbumModal(track, res.data)], \"add-to-album\");\n Ui.addModal(modal);\n }\n\n static async openNewAlbumModal() {\n let modal = GenericTemplates.modal([AlbumTemplates.newAlbumModal()], \"new-album\");\n Ui.addModal(modal);\n }\n\n static async createNewAlbum(album: Partial) {\n const res = await Api.postAsync(ApiRoutes.newAlbum, album);\n if (res.code !== 200) {\n notify(\"Failed to create album: \" + getErrorMessage(res), NotificationType.error);\n return;\n }\n notify(\"Created album\", NotificationType.success);\n }\n\n static async deleteAlbum(id: number) {\n const res = await Api.postAsync(ApiRoutes.deleteAlbum, {id});\n if (res.code === 200) {\n PlayManager.removeStreamClient(id);\n QueueManager.removeFromManualQueue(id);\n notify(\"Successfully deleted album\", NotificationType.success);\n navigate(\"profile\");\n } else {\n notify(\"Error trying to delete album: \" + getErrorMessage(res), NotificationType.error);\n }\n }\n\n static async addTrackToAlbums(track_id: number, album_ids: number[]) {\n const res = await Api.postAsync(ApiRoutes.addTrackToAlbums, {album_ids, track_id});\n Util.removeModal();\n if (res.code !== 200) {\n notify(\"Failed to add track to albums: \" + getErrorMessage(res), NotificationType.error);\n return;\n }\n notify(\"Added track to albums\", NotificationType.success);\n }\n\n static async removeTrackFromAlbum(track_id: number, album_ids: number[]) {\n const res = await Api.postAsync(ApiRoutes.removeTrackFromAlbums, {album_ids, track_id});\n if (res.code !== 200) {\n notify(\"Failed to remove track from album: \" + getErrorMessage(res), NotificationType.error);\n return false;\n }\n notify(\"Removed track from album\", NotificationType.success);\n return true;\n }\n\n static async replaceCover(e: MouseEvent, id: number, canEdit: boolean, loading: Signal) {\n const target = e.target as HTMLImageElement;\n if (!target || !canEdit) {\n return;\n }\n const oldSrc = target.src;\n loading.value = true;\n let fileInput = document.createElement(\"input\");\n fileInput.type = \"file\";\n fileInput.accept = \"image/*\";\n fileInput.onchange = async (e) => {\n const fileTarget = e.target as HTMLInputElement;\n const file = fileTarget.files![0];\n try {\n await MediaUploader.upload(MediaFileType.albumCover, id, file)\n notify(\"Cover updated\", NotificationType.success);\n await Util.updateImage(URL.createObjectURL(file), oldSrc);\n } catch (e: any) {\n notify(e.toString(), NotificationType.error);\n }\n loading.value = false;\n };\n fileInput.onabort = () => loading.value = false;\n fileInput.click();\n }\n\n static async moveTrackInAlbum(albumId: number, tracks: ListTrack[]) {\n const res = await Api.postAsync(ApiRoutes.reorderAlbumTracks, {\n album_id: albumId,\n tracks\n });\n if (res.code !== 200) {\n notify(\"Failed to move tracks: \" + getErrorMessage(res), NotificationType.error);\n return false;\n }\n return true;\n }\n\n static async likeAlbum(id: number) {\n return await Api.postAsync(ApiRoutes.likeAlbum, { id });\n }\n\n static async unlikeAlbum(id: number) {\n return await Api.postAsync(ApiRoutes.unlikeAlbum, { id });\n }\n\n static async toggleLike(id: number, isEnabled: boolean) {\n if (!Util.isLoggedIn()) {\n notify(\"You must be logged in to like albums\", NotificationType.error);\n return false;\n }\n if (isEnabled) {\n const res = await AlbumActions.unlikeAlbum(id);\n if (res.code !== 200) {\n return false;\n }\n } else {\n const res = await AlbumActions.likeAlbum(id);\n if (res.code !== 200) {\n return false;\n }\n }\n return true;\n }\n\n static async startTrackInAlbum(album: Album, trackId: number, stopIfPlaying = false) {\n const playingFrom = PlayManager.getPlayingFrom();\n const isPlaying = playingFrom && playingFrom.type === \"album\" && playingFrom.id === album.id;\n if (isPlaying && stopIfPlaying) {\n await PlayManager.stopAllAsync();\n } else {\n if (!album.tracks) {\n throw new Error(`Invalid album (${album.id}), has no tracks.`);\n }\n PlayManager.playFrom(\"album\", album.title, album.id);\n QueueManager.setContextQueue(album.tracks.map(t => t.track_id));\n const track = album.tracks.find(t => t.track_id === trackId);\n if (!track) {\n notify(\"This track could not be found in this album\", NotificationType.error);\n return;\n }\n PlayManager.addStreamClientIfNotExists(track.track_id, track.track?.length ?? 0);\n await PlayManager.startAsync(track.track_id);\n }\n }\n}", "export class Links {\n static get BASE_URL() {\n return window.location.origin;\n }\n\t\n static LINK(path: string) {\n return Links.BASE_URL + \"/\" + path;\n }\n\n static PROFILE(path: string) {\n return Links.LINK(\"profile/\" + path);\n }\n}", "import {Icons} from \"../Enums/Icons.ts\";\nimport {AlbumActions} from \"../Actions/AlbumActions.ts\";\nimport {PlaylistActions} from \"../Actions/PlaylistActions.ts\";\nimport {Links} from \"../Enums/Links.ts\";\nimport {Api} from \"../Api/Api.ts\";\nimport {TrackActions} from \"../Actions/TrackActions.ts\";\nimport {\n AnyElement,\n AnyNode,\n create,\n HtmlPropertyValue,\n ifjs,\n signalMap,\n StringOrSignal,\n TypeOrSignal\n} from \"../../fjsc/src/f2.ts\";\nimport {FJSC} from \"../../fjsc\";\nimport {IconConfig, InputType, SearchableSelectConfig} from \"../../fjsc/src/Types.ts\";\nimport {Util} from \"../Classes/Util.ts\";\nimport {navigate} from \"../Routing/Router.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {ProgressState} from \"../Enums/ProgressState.ts\";\nimport {ProgressPart} from \"../Models/ProgressPart.ts\";\nimport {compute, signal, Signal} from \"../../fjsc/src/signals.ts\";\nimport {SearchResult} from \"../Models/SearchResult.ts\";\nimport {openMenus} from \"../state.ts\";\nimport {PillOption} from \"../Models/PillOption.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\n\nexport class GenericTemplates {\n static icon(icon: StringOrSignal, adaptive = false, classes: StringOrSignal[] = [], title = \"\", onclick: Function | undefined = undefined) {\n const urlIndicators = [window.location.origin, \"http\", \"data:\", \"blob:\"];\n // @ts-ignore\n const isMaterial = icon && (icon as string) && icon.includes && !urlIndicators.some(i => icon.includes(i));\n const iconClass = adaptive ? \"adaptive-icon\" : \"inline-icon\";\n const svgClass = isMaterial ? \"_\" : \"svg\";\n\n return FJSC.icon({\n icon,\n adaptive,\n title,\n isUrl: !isMaterial,\n onclick,\n classes: [iconClass, svgClass, ...classes],\n });\n }\n\n static gif8831(url: StringOrSignal, link: StringOrSignal|null = null) {\n let item;\n if (link) {\n item = create(\"a\")\n .href(link)\n .target(\"_blank\")\n .children(\n create(\"img\")\n .styles(\"width\", \"88\", \"height\", \"31\")\n .width(88)\n .height(31)\n .src(url)\n .alt(\"88x31\")\n .build()\n ).build();\n } else {\n item = create(\"img\")\n .styles(\"width\", \"88\", \"height\", \"31\")\n .width(88)\n .height(31)\n .src(url)\n .alt(\"88x31\")\n .build();\n }\n\n return create(\"div\")\n .classes(\"gif8831\")\n .children(item)\n .build();\n }\n\n static cardLabel(text: HtmlPropertyValue, icon: StringOrSignal|null = null, hasError: Signal = signal(false)) {\n const errorClass = compute((h): string => h ? \"error\" : \"_\", hasError);\n\n return create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"div\")\n .classes(\"card-label\", \"flex\", \"small-gap\", errorClass)\n .children(\n ifjs(icon, GenericTemplates.icon(icon ?? \"\")),\n create(\"span\")\n .text(text)\n .build(),\n ).build(),\n ifjs(hasError, GenericTemplates.icon(\"warning\", true, [\"error\"], \"This section has errors\"))\n ).build();\n }\n\n static toggle(text: HtmlPropertyValue, id: HtmlPropertyValue, callback = () => {\n }, extraClasses: string[] = [], checked = false) {\n return create(\"label\")\n .classes(\"flex\", ...extraClasses)\n .for(id)\n .children(\n create(\"input\")\n .type(InputType.checkbox)\n .classes(\"hidden\", \"slider\")\n .id(id)\n .checked(checked)\n .onclick(callback)\n .build(),\n create(\"div\")\n .classes(\"toggle-container\")\n .children(\n create(\"span\")\n .classes(\"toggle-slider\")\n .build()\n ).build(),\n create(\"span\")\n .classes(\"toggle-text\")\n .text(text)\n .build(),\n ).build();\n }\n\n static button(text: HtmlPropertyValue, callback: Function = () => {\n }, extraClasses: string[] = [], id: HtmlPropertyValue | null = null) {\n return create(\"button\")\n .classes(...extraClasses)\n .id(id)\n .onclick(callback)\n .text(text)\n .build();\n }\n\n static lock() {\n return create(\"img\")\n .classes(\"inline-icon\", \"svg\", \"nopointer\")\n .attributes(\"src\", Icons.LOCK, \"title\", \"Private\")\n .build();\n }\n\n static title(title: HtmlPropertyValue, icons = []) {\n return create(\"div\")\n .classes(\"flex\", \"nopointer\")\n .children(\n create(\"span\")\n .classes(\"clickable\", \"text-large\")\n .text(title)\n .build(),\n ...icons,\n ).build();\n }\n\n static text(text: HtmlPropertyValue, extraClasses: string[] = []) {\n return create(\"span\")\n .classes(\"text\", ...extraClasses)\n .text(text)\n .build();\n }\n\n static textWithHtml(text: HtmlPropertyValue, extraClasses: string[] = []) {\n return create(\"span\")\n .classes(\"text\", \"notification-text\", ...extraClasses)\n .html(text)\n .build();\n }\n\n static dragTargetInList(dragStopCallback: Function, id = \"\", dropEffect = \"move\") {\n return create(\"div\")\n .classes(\"dropzone\")\n .attributes(\"reference_id\", id)\n .children(\n create(\"div\")\n .classes(\"dragIndicator\")\n .build(),\n create(\"div\")\n .classes(\"dragTarget\", \"fullWidth\", \"hidden\")\n .ondragenter(e => {\n e.preventDefault();\n const target = e.target as HTMLElement;\n const previous = target.previousSibling as HTMLElement;\n previous.classList.add(\"dragover\");\n })\n .ondragleave(e => {\n e.preventDefault();\n const target = e.target as HTMLElement;\n const previous = target.previousSibling as HTMLElement;\n previous.classList.remove(\"dragover\");\n })\n .ondragover((e: DragEvent) => {\n e.preventDefault();\n e.dataTransfer!.dropEffect = dropEffect as (\"link\" | \"none\" | \"move\" | \"copy\");\n })\n .ondrop((e: DragEvent) => {\n e.preventDefault();\n const target = e.target as HTMLElement;\n const previous = target.previousSibling as HTMLElement;\n previous.classList.remove(\"dragover\");\n const data = e.dataTransfer!.getData(\"text/plain\");\n dragStopCallback(JSON.parse(data));\n }).build()\n ).build();\n }\n\n static action(icon: StringOrSignal, text: HtmlPropertyValue, id: HtmlPropertyValue, onclick: Function, attributes: HtmlPropertyValue[] = [], classes: StringOrSignal[] = [], link: StringOrSignal|null = null) {\n return create(link ? \"a\" : \"div\")\n .classes(\"flex\", \"small-gap\", \"clickable\", \"fakeButton\", \"padded-inline\", \"rounded\")\n .children(\n GenericTemplates.icon(icon),\n create(\"span\")\n .classes(\"nopointer\")\n .text(text)\n .build()\n ).id(id)\n .attributes(...attributes)\n .classes(...classes)\n .href(link)\n .onclick(onclick)\n .build();\n }\n\n static newAlbumButton(classes: string[] = []) {\n return FJSC.button({\n text: \"New album\",\n icon: { icon: \"forms_add_on\" },\n classes: [\"positive\", ...classes],\n onclick: async () => {\n await AlbumActions.openNewAlbumModal();\n }\n });\n }\n\n static newPlaylistButton(classes: string[] = []) {\n return FJSC.button({\n text: \"New playlist\",\n icon: { icon: \"playlist_add\" },\n classes: [\"positive\", ...classes],\n onclick: async () => {\n await PlaylistActions.openNewPlaylistModal();\n }\n });\n }\n\n static newTrackButton(classes: string[] = []) {\n return FJSC.button({\n text: \"Upload\",\n icon: { icon: \"upload\" },\n classes: [\"positive\", ...classes],\n onclick: async () => {\n navigate(\"upload\");\n }\n });\n }\n\n static openPageButton(text: HtmlPropertyValue, page: string) {\n return GenericTemplates.action(Icons.STARS, text, page, async (e: MouseEvent) => {\n e.preventDefault();\n navigate(page);\n }, [], [\"positive\", \"secondary\"], Links.LINK(page));\n }\n\n static actionWithSmallBreakpoint(icon: HtmlPropertyValue, text: HtmlPropertyValue, id: HtmlPropertyValue, onclick: Function, attributes = [], classes: string[] = [], link = null) {\n return create(link ? \"a\" : \"div\")\n .classes(\"flex\", \"small-gap\", \"clickable\", \"fakeButton\", \"padded-inline\", \"rounded\")\n .children(\n create(\"img\")\n .classes(\"inline-icon\", \"svg\", \"nopointer\")\n .src(icon)\n .alt(text)\n .build(),\n create(\"span\")\n .classes(\"nopointer\", \"hideOnSmallBreakpoint\")\n .text(text)\n .build()\n ).id(id)\n .attributes(...attributes)\n .classes(...classes)\n .href(link)\n .onclick(onclick)\n .build();\n }\n\n static actionWithMidBreakpoint(icon: HtmlPropertyValue, text: HtmlPropertyValue, id: HtmlPropertyValue, onclick: Function, attributes = [], classes: string[] = [], link: HtmlPropertyValue = null) {\n return create(link ? \"a\" : \"div\")\n .classes(\"flex\", \"small-gap\", \"clickable\", \"fakeButton\", \"padded-inline\", \"rounded\")\n .children(\n create(\"img\")\n .classes(\"inline-icon\", \"svg\", \"nopointer\")\n .src(icon)\n .alt(text)\n .build(),\n create(\"span\")\n .classes(\"nopointer\", \"hideOnMidBreakpoint\")\n .text(text)\n .build()\n )\n .id(id)\n .attributes(...attributes)\n .classes(...classes)\n .href(link)\n .onclick(onclick)\n .build();\n }\n\n static pill(p: PillOption, pillState: Signal, extraClasses: string[] = []) {\n const selectedState = signal(pillState.value === p.value ? \"active\" : \"_\");\n pillState.onUpdate = (newSelected: any) => {\n selectedState.value = newSelected === p.value ? \"active\" : \"_\";\n };\n\n return FJSC.button({\n text: p.text,\n icon: p.icon ? {\n icon: p.icon,\n adaptive: true,\n isUrl: false,\n } : undefined,\n classes: [\"rounded-max\", selectedState, ...extraClasses],\n onclick: p.onclick,\n });\n }\n\n static pills(options: PillOption[], pillState: Signal, extraClasses: string[] = [], loadingState: Signal | null = null) {\n return create(\"div\")\n .classes(\"flex\", \"pill-container\", ...extraClasses)\n .children(\n ...options.map(p => {\n return GenericTemplates.pill(p, pillState);\n }),\n ifjs(loadingState, create(\"img\")\n .src(Icons.SPINNER)\n .alt(\"Loading...\")\n .classes(\"spinner-animation\", \"icon\", \"align-center\", \"nopointer\")\n .build())\n ).build();\n }\n\n static inlineAction(text: HtmlPropertyValue, icon: StringOrSignal, id: HtmlPropertyValue = null, callback: Function, extraAttributes: HtmlPropertyValue[] = [], extraClasses: StringOrSignal[] = []) {\n return create(\"div\")\n .classes(\"inline-action\", \"flex\", \"clickable\", \"fakeButton\", \"padded-inline\", \"rounded\", \"align-center\")\n .id(id)\n .attributes(...extraAttributes)\n .classes(...extraClasses)\n .onclick(callback)\n .children(\n FJSC.icon({\n icon: icon,\n adaptive: true,\n classes: [\"inline-icon\", \"svg\", \"nopointer\"],\n isUrl: false,\n }),\n create(\"span\")\n .classes(\"nopointer\", \"text-xsmall\")\n .text(text)\n .build()\n ).build();\n }\n\n static deleteIconButton(id: HtmlPropertyValue, callback: Function, extraClasses: string[] = []) {\n return FJSC.button({\n id,\n classes: [\"negative\", ...extraClasses],\n onclick: e => {\n e.stopPropagation();\n callback();\n },\n icon: { icon: \"delete\" },\n title: \"Delete\",\n text: \"\"\n });\n }\n\n static uploadIconButton(id: HtmlPropertyValue, callback: Function, extraClasses: string[] = []) {\n return FJSC.button({\n id,\n classes: [\"positive\", ...extraClasses],\n onclick: e => {\n e.stopPropagation();\n callback();\n },\n icon: { icon: \"upload\" },\n title: \"Upload\",\n text: \"\"\n });\n }\n\n static card() {\n return create(\"div\")\n .classes(\"card\")\n .build();\n }\n\n static notification(type: NotificationType = NotificationType.success, text = \"Success!\") {\n return create(\"div\")\n .classes(\"notification\", type)\n .text(text)\n .build();\n }\n\n static fileInput(id: HtmlPropertyValue, name: HtmlPropertyValue, accept: string, initialText: string, required = false, changeCallback = (v: string, files: FileList | null) => {\n }) {\n // TODO: Use signals\n const text = signal(initialText);\n const button = FJSC.button({\n text: text,\n onclick: () => {\n text.value = \"Choosing file...\";\n input.click();\n }\n }) as HTMLButtonElement;\n const input = create(\"input\")\n .type(InputType.file)\n .styles(\"display\", \"none\")\n .id(id)\n .name(name)\n .required(required)\n .attributes(\"accept\", accept)\n .onchange(e => {\n let fileName = input.value;\n if (accept && !accept.includes(\"*\")) {\n const accepts = accept.split(\",\");\n const extension = fileName.substring(fileName.lastIndexOf(\".\") + 1);\n if (!accepts.includes(extension)) {\n text.value = \"Not supported type.\";\n return;\n }\n }\n button.value = truncate(fileName);\n button.title = fileName;\n const probableName = fileName.substring(fileName.lastIndexOf(\"\\\\\") + 1);\n text.value = probableName;\n changeCallback(probableName, input.files);\n\n const preview = document.getElementById(name + \"-preview\") as HTMLImageElement;\n if (preview && input.files) {\n preview.src = URL.createObjectURL(input.files[0]);\n preview.style.display = \"initial\";\n }\n\n function truncate(text: string) {\n return text.length > 20 ? text.substring(0, 20) + \"...\" : text;\n }\n }).build() as HTMLInputElement;\n\n return create(\"div\")\n .children(\n button,\n input\n ).build();\n };\n\n static checkbox(name: HtmlPropertyValue, checked: TypeOrSignal = false, text: HtmlPropertyValue = \"\", required = false, onchange = (v: boolean) => {\n }) {\n return create(\"label\")\n .classes(\"checkbox-container\")\n .text(text)\n .children(\n create(\"input\")\n .type(InputType.checkbox)\n .name(name)\n .id(name)\n .required(required)\n .checked(checked as HtmlPropertyValue)\n .onchange((e) => onchange((e.target as HTMLInputElement).checked))\n .build(),\n create(\"span\")\n .classes(\"checkmark\")\n .children(\n create(\"span\")\n .classes(\"checkmark-icon\")\n .text(\"✓\")\n .build()\n ).build(),\n ).build();\n }\n\n static modal(children: AnyNode[], modalId: string) {\n if (openMenus.value.includes(modalId)) {\n return null;\n }\n openMenus.value.push(modalId);\n const interval = setInterval(() => {\n if (!document.getElementById(\"modal-\" + modalId)) {\n clearInterval(interval);\n openMenus.value = openMenus.value.filter(id => id !== modalId);\n }\n }, 500);\n\n return create(\"div\")\n .classes(\"modal-container\")\n .id(\"modal-\" + modalId)\n .children(\n create(\"div\")\n .classes(\"modal-overlay\")\n .build(),\n create(\"div\")\n .classes(\"modal\", \"flex-v\", \"padded-large\")\n .children(...children)\n .build()\n ).build();\n }\n\n static confirmationModal(title: HtmlPropertyValue, text: HtmlPropertyValue, icon: StringOrSignal,\n confirmText: StringOrSignal, cancelText: StringOrSignal, confirmCallback: Function,\n cancelCallback: Function) {\n return GenericTemplates.modal([\n create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"h2\")\n .classes(\"flex\")\n .children(\n GenericTemplates.icon(icon, true),\n create(\"span\")\n .text(title)\n .build()\n ).build()\n ).build(),\n create(\"p\")\n .text(text)\n .build(),\n create(\"div\")\n .classes(\"flex\")\n .children(\n FJSC.button({\n text: confirmText ?? \"Confirm\",\n onclick: confirmCallback,\n classes: [\"positive\"],\n icon: {icon: \"check\"}\n }),\n FJSC.button({\n text: cancelText ?? \"Cancel\",\n onclick: cancelCallback,\n classes: [\"negative\"],\n icon: {icon: \"close\"}\n }),\n ).build()\n ], \"confirmation\");\n }\n\n static imageModal(imageUrl: StringOrSignal) {\n return create(\"div\")\n .classes(\"modal-container\")\n .children(\n create(\"div\")\n .classes(\"modal-overlay\")\n .build(),\n create(\"div\")\n .classes(\"modal\", \"padded-large\", \"rounded\")\n .children(\n create(\"img\")\n .classes(\"full\")\n .attributes(\"src\", imageUrl)\n .build()\n ).build()\n ).build();\n }\n\n static textInputModal(title: HtmlPropertyValue, text: HtmlPropertyValue, currentValue: StringOrSignal,\n newValue: Signal, icon: HtmlPropertyValue, confirmText: StringOrSignal, cancelText: StringOrSignal,\n confirmCallback: Function, cancelCallback: Function) {\n return GenericTemplates.modal([\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"img\")\n .classes(\"icon\", \"svg\")\n .styles(\"width\", \"30px\", \"height\", \"auto\")\n .attributes(\"src\", icon)\n .build(),\n create(\"h2\")\n .text(title)\n .build()\n ).build(),\n create(\"p\")\n .text(text)\n .build(),\n FJSC.input({\n type: InputType.text,\n name: \"textInputModalInput\",\n label: \"\",\n placeholder: \"\",\n value: newValue,\n onchange: (v) => {\n newValue.value = v;\n }\n }),\n create(\"div\")\n .classes(\"flex\")\n .children(\n FJSC.button({\n text: confirmText ?? \"Confirm\",\n onclick: confirmCallback,\n classes: [\"positive\"],\n icon: {icon: \"check\"}\n }),\n FJSC.button({\n text: cancelText ?? \"Cancel\",\n onclick: cancelCallback,\n classes: [\"negative\"],\n icon: {icon: \"close\"}\n }),\n ).build()\n ).build(),\n ], \"text-input\");\n }\n\n static textAreaInputModal(title: HtmlPropertyValue, text: HtmlPropertyValue, currentValue: HtmlPropertyValue,\n newValue: Signal, icon: HtmlPropertyValue, confirmText: StringOrSignal, cancelText: StringOrSignal,\n confirmCallback: Function, cancelCallback: Function) {\n return GenericTemplates.modal([\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"img\")\n .classes(\"icon\", \"svg\")\n .styles(\"width\", \"30px\", \"height\", \"auto\")\n .attributes(\"src\", icon)\n .build(),\n create(\"h2\")\n .text(title)\n .build()\n ).build(),\n create(\"p\")\n .text(text)\n .build(),\n FJSC.textarea({\n name: \"textInputModalInput\",\n label: \"\",\n placeholder: \"\",\n value: newValue,\n onchange: (v) => {\n newValue.value = v;\n }\n }),\n create(\"div\")\n .classes(\"flex\")\n .children(\n FJSC.button({\n text: confirmText ?? \"Confirm\",\n onclick: confirmCallback,\n classes: [\"positive\"],\n icon: {icon: \"check\"}\n }),\n FJSC.button({\n text: cancelText ?? \"Cancel\",\n onclick: cancelCallback,\n classes: [\"negative\"],\n icon: {icon: \"close\"}\n }),\n ).build()\n ).build(),\n ], \"text-area-input\");\n }\n\n static tabSelector(tabs: any[], callback: Function, selectedTab = 0) {\n const selectedState = signal(selectedTab);\n selectedState.onUpdate = (newSelected: number) => {\n callback(newSelected);\n };\n callback(selectedTab);\n\n return create(\"div\")\n .classes(\"tab-selector\", \"flex\", \"rounded\", \"limitToContentWidth\")\n .children(\n ...tabs.map((t, i) => {\n const innerSelectedState = signal(i === selectedTab ? \"selected\" : \"_\");\n selectedState.onUpdate = (newSelected: number) => {\n innerSelectedState.value = i === newSelected ? \"selected\" : \"_\";\n };\n return create(\"button\")\n .classes(\"tab\", innerSelectedState)\n .onclick(() => {\n selectedState.value = i;\n })\n .text(t)\n .build();\n })\n )\n .build();\n }\n\n static containerWithSpinner(className: string) {\n return create(\"div\")\n .classes(className)\n .children(\n GenericTemplates.loadingSpinner()\n ).build();\n }\n\n static loadingSpinner() {\n return create(\"div\")\n .classes(\"spinner\")\n .children()\n .build();\n }\n\n static roundIconButton(icon: IconConfig, onclick: Function, title: StringOrSignal = \"\", classes: StringOrSignal[] = []) {\n return create(\"button\")\n .classes(\"round-button\", \"fjsc\", ...classes)\n .onclick(onclick)\n .title(title)\n .children(\n FJSC.icon({\n ...icon,\n classes: [\"round-button-icon\", \"align-center\", \"inline-icon\", \"svg\", \"nopointer\"]\n }),\n ).build()\n }\n\n static benefit(benefit: string, icon: string) {\n return create(\"div\")\n .classes(\"benefit-item\")\n .children(\n GenericTemplates.icon(icon, true),\n create(\"span\")\n .text(benefit)\n .build()\n ).build();\n }\n\n static modalCancelButton(modal: AnyElement|null = null) {\n return FJSC.button({\n text: \"Cancel\",\n onclick: () => Util.removeModal(modal),\n classes: [\"negative\"],\n icon: { icon: \"close\" }\n });\n }\n\n static addUserLinkSearchResult(entry: { id: number, display: string, image?: string }, selectedState: Signal) {\n const selectedClassState = signal(selectedState.value === entry.id ? \"active\" : \"_\");\n selectedState.onUpdate = (newSelected: number) => {\n selectedClassState.value = newSelected === entry.id ? \"active\" : \"_\";\n };\n return create(\"div\")\n .classes(\"flex\", \"clickable\", \"fakeButton\", \"padded\", \"rounded\", selectedClassState)\n .onclick(() => {\n selectedState.value = entry.id;\n })\n .children(\n create(\"img\")\n .classes(\"user-icon\", \"nopointer\")\n .attributes(\"src\", entry.image)\n .build(),\n create(\"span\")\n .classes(\"nopointer\")\n .text(entry.display)\n .build()\n ).build();\n }\n\n static addLinkedUserModal(title: HtmlPropertyValue, text: HtmlPropertyValue, currentValue: string,\n icon: StringOrSignal, confirmText: StringOrSignal, cancelText: StringOrSignal,\n confirmCallback: Function, cancelCallback: Function) {\n const selectedState = signal(0);\n const userMap = new Map();\n const collabTypeOptions = signal(create(\"span\").text(\"Loading collab types...\").build());\n const collabType = signal(\"1\");\n TrackActions.getCollabTypes().then(types => {\n collabTypeOptions.value = FJSC.searchableSelect({\n options: signal(types),\n value: collabType,\n onchange: (v) => {\n collabType.value = v;\n }\n });\n });\n\n return GenericTemplates.modal([\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"h2\")\n .classes(\"flex\")\n .children(\n GenericTemplates.icon(icon, true),\n create(\"span\")\n .text(title)\n .build(),\n ).build()\n ).build(),\n create(\"p\")\n .text(text)\n .build(),\n FJSC.input({\n id: \"addUserSearch\",\n name: \"addUserSearch\",\n type: InputType.text,\n value: currentValue ?? \"\",\n onkeydown: async (e) => {\n const target = e.target as HTMLInputElement;\n const search = target.value;\n const res = await Api.getAsync(ApiRoutes.searchUsers, {\n search,\n filters: JSON.stringify([\"users\"])\n });\n if (res.code === 200) {\n const results = document.getElementById(\"user-search-results\");\n if (results) {\n results.innerHTML = \"\";\n for (const user of res.data) {\n userMap.set(user.id, user);\n results.appendChild(GenericTemplates.addUserLinkSearchResult(user, selectedState));\n }\n }\n }\n },\n }),\n create(\"div\")\n .classes(\"flex-v\")\n .styles(\"max-height\", \"200px\", \"overflow\", \"auto\", \"flex-wrap\", \"nowrap\")\n .id(\"user-search-results\")\n .build(),\n collabTypeOptions,\n create(\"div\")\n .classes(\"flex\")\n .children(\n FJSC.button({\n text: confirmText ?? \"Confirm\",\n onclick: async () => {\n const user = userMap.get(selectedState.value); // TODO: Typing lol\n user.collab_type = parseInt(collabType.value);\n confirmCallback(selectedState.value, user, collabType);\n },\n icon: {\n icon: \"person_add\"\n },\n classes: [\"positive\"],\n }),\n FJSC.button({\n text: cancelText ?? \"Cancel\",\n onclick: cancelCallback,\n classes: [\"negative\"],\n icon: {icon: \"close\"}\n }),\n ).build()\n ).build(),\n ], \"add-linked-user\");\n }\n\n static breadcrumbs(pageMap: any, history: Signal, stepState: Signal) {\n return history.value.map((step: any) => {\n if (!pageMap[step]) {\n return null;\n }\n\n const isLast = step === history.value[history.value.length - 1];\n\n return create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"span\")\n .classes(\"inlineLink\")\n .text(pageMap[step])\n .onclick(() => {\n if (stepState.value === step) {\n return;\n }\n\n const index = history.value.indexOf(step);\n history.value = history.value.slice(0, index);\n stepState.value = step;\n }).build(),\n ifjs(isLast, create(\"span\").text(\">\").build(), true)\n ).build();\n });\n }\n\n static checkInCorner(title = \"\", extraClasses: string[] = []) {\n return create(\"img\")\n .classes(\"corner-check\", ...extraClasses)\n .title(title)\n .src(Icons.CHECK)\n .build();\n }\n\n static giftIcon(title = \"\") {\n return create(\"img\")\n .classes(\"gift-icon\", \"inline-icon\", \"svg\", \"nopointer\")\n .title(title)\n .src(Icons.GIFT)\n .build();\n }\n\n static inlineLink(link: Function|StringOrSignal, text: HtmlPropertyValue, newTab = true) {\n if (link.constructor === Function) {\n return create(\"a\")\n .classes(\"inlineLink\")\n .onclick(link as Function)\n .text(text)\n .build();\n }\n\n return create(\"a\")\n .classes(\"inlineLink\")\n .href(link as StringOrSignal)\n .target(newTab ? \"_blank\" : \"_self\")\n .text(text)\n .build()\n }\n\n static progressSections(progressState: Signal) {\n const parts = signal(progressState.value.map(part => part.id));\n progressState.subscribe(p => {\n const newList = p.map(part => part.id);\n if (newList.length !== parts.value.length) {\n parts.value = newList;\n }\n });\n\n return create(\"div\")\n .classes(\"progress-sections\")\n .children(\n signalMap(parts, create(\"div\").classes(\"flex\", \"small-gap\"), (id: string) => GenericTemplates.progressSectionPart(progressState.value.find(p => p.id === id)!))\n ).build();\n }\n\n static progressSectionPart(part: ProgressPart) {\n const retryable = compute((state): boolean => {\n return state && state === ProgressState.error && (part.retryFunction !== undefined);\n }, part.state);\n\n return create(\"div\")\n .classes(\"flex-v\", \"progress-section-part-container\", \"relative\")\n .title(part.title ?? \"\")\n .children(\n ifjs(part.progress, create(\"div\").classes(\"progress-section-part-progress\").css({\n width: compute(p => p + \"%\", part.progress ?? signal(0))\n }).build()),\n create(\"div\")\n .classes(\"progress-section-part\", \"small-gap\", \"flex\", part.state as Signal)\n .children(\n GenericTemplates.icon(part.icon, true, [part.state as Signal]),\n create(\"span\")\n .classes(\"progress-section-part-text\")\n .text(part.text)\n .build(),\n ).build(),\n ifjs(retryable, create(\"div\")\n .classes(\"progress-section-retry\", \"flex\", \"small-gap\")\n .children(\n GenericTemplates.icon(\"refresh\", true, [part.state as Signal]),\n create(\"span\")\n .classes(\"progress-section-part-text\")\n .text(\"Retry\")\n .onclick(() => part.retryFunction ? part.retryFunction() : () => {})\n .build()\n ).build())\n ).build();\n }\n\n static verticalDragIndicator() {\n return create(\"div\")\n .classes(\"vertical-drag-indicator\")\n .build();\n }\n}\n", "import {Icons} from \"../Enums/Icons.js\";\nimport {Time} from \"../Classes/Helpers/Time.ts\";\nimport {QueueManager} from \"../Streaming/QueueManager.ts\";\nimport {GenericTemplates} from \"./GenericTemplates.ts\";\nimport {DragActions} from \"../Actions/DragActions.ts\";\nimport {Util} from \"../Classes/Util.ts\";\nimport {navigate} from \"../Routing/Router.ts\";\nimport {Track} from \"../Models/DbModels/lyda/Track.ts\";\nimport {create} from \"../../fjsc/src/f2.ts\";\nimport {FJSC} from \"../../fjsc\";\nimport {User} from \"../Models/DbModels/lyda/User.ts\";\nimport {compute, signal} from \"../../fjsc/src/signals.ts\";\nimport {Images} from \"../Enums/Images.ts\";\n\nexport class QueueTemplates {\n static queueItem(track: Track, index: number, totalCount: number, attributes = [], classes = []) {\n const upButton = create(\"div\")\n .classes(\"align-center\", \"fakeButton\", \"rounded\", \"padded-inline\", \"clickablePreserveWidth\")\n .alt(\"Move up in queue\")\n .onclick(() => {\n QueueManager.moveInManualQueue(index, index - 1);\n })\n .children(\n FJSC.icon({\n icon: \"move_up\",\n adaptive: true,\n }),\n ).build();\n const downButton = create(\"div\")\n .classes(\"align-center\", \"fakeButton\", \"rounded\", \"padded-inline\", \"clickablePreserveWidth\")\n .alt(\"Move down in queue\")\n .onclick(() => {\n QueueManager.moveInManualQueue(index, index + 1);\n })\n .children(\n FJSC.icon({\n icon: \"move_down\",\n adaptive: true,\n }),\n ).build();\n const buttons = [];\n if (index === 0) {\n upButton.classList.add(\"nonclickable\");\n }\n if (index === totalCount - 1) {\n downButton.classList.add(\"nonclickable\");\n }\n buttons.push(upButton);\n buttons.push(downButton);\n\n const dragData = {\n type: \"queue\",\n from: index\n };\n\n if (!track.user) {\n throw new Error(`Track ${track.id} has no user`);\n }\n const coverState = signal(Images.DEFAULT_COVER_TRACK);\n if (track.has_cover) {\n coverState.value = Util.getTrackCover(track.id);\n }\n\n return create(\"div\")\n .styles(\"height\", \"34px\")\n .attributes(\"draggable\", \"true\")\n .ondragstart(async (e: DragEvent) => {\n DragActions.showDragTargets();\n e.dataTransfer!.setData(\"text/plain\", JSON.stringify(dragData));\n e.dataTransfer!.effectAllowed = \"move\";\n e.stopPropagation();\n })\n .ondragend(async (e: Event) => {\n DragActions.hideDragTargets();\n e.preventDefault();\n e.stopPropagation();\n })\n .children(\n create(\"div\")\n .classes(\"queue-draggable\", \"flex\", \"small-gap\", \"padded-inline\", \"rounded\")\n .children(\n create(\"img\")\n .classes(\"align-center\", \"inline-icon\", \"nopointer\")\n .src(coverState)\n .alt(track.title)\n .build(),\n create(\"span\")\n .classes(\"align-center\", \"clickable\")\n .text(track.user.displayname)\n .onclick(() => {\n navigate(\"profile/\" + track.user!.username);\n }).build(),\n create(\"span\")\n .classes(\"align-center\")\n .text(\" - \")\n .build(),\n create(\"span\")\n .classes(\"align-center\", \"clickable\", \"flex-grow\")\n .text(track.title)\n .onclick(() => {\n navigate(\"track/\" + track.id);\n }).build(),\n create(\"div\")\n .classes(\"align-center\", \"fakeButton\", \"rounded\", \"padded-inline\", \"clickablePreserveWidth\")\n .alt(\"Remove from queue\")\n .onclick(() => {\n QueueManager.removeFromManualQueue(track.id);\n })\n .children(\n create(\"img\")\n .classes(\"inline-icon\", \"svg\")\n .src(Icons.DELETE)\n .build()\n ).build(),\n ...buttons\n ).id(track.id)\n .attributes(...attributes)\n .classes(...classes)\n .build()\n ).build();\n }\n\n static queue(queue: { track: Track }[]) {\n let children = [];\n let i = 0;\n for (let item of queue) {\n children.push(GenericTemplates.dragTargetInList((data: any) => {\n QueueManager.moveInManualQueue(data.from, data.to);\n }, i.toString()));\n if (!item.track.user) {\n throw new Error(`Track ${item.track.id} has no user`);\n }\n children.push(QueueTemplates.queueItem(item.track, i, queue.length));\n i++;\n }\n\n let queueText;\n if (queue.length > 0) {\n let queueTrackLength = 0;\n for (let track of queue) {\n queueTrackLength += track.track.length;\n }\n const queueTrackLengthText = Time.format(queueTrackLength);\n queueText = queue.length === 1 ? \"1 track\" : `${queue.length} tracks`;\n queueText += ` (${queueTrackLengthText})`;\n } else {\n queueText = \"Queue is empty\";\n }\n const queueListHidden = signal(true);\n const queueListVisClass = compute((h): string => h ? \"hidden\" : \"_\", queueListHidden);\n\n return create(\"div\")\n .classes(\"relative\", \"align-center\")\n .children(\n create(\"div\")\n .classes(queueListVisClass, \"popout-above\", \"flex-v\", \"no-gap\", \"padded\", \"rounded\")\n .styles(\"width\", \"max-content\")\n .children(\n create(\"div\")\n .classes(\"flex\", \"align-center\", \"justify-center\", \"text-small\")\n .children(\n create(\"span\")\n .classes(\"flex-grow\")\n .text(queueText)\n .build(),\n ).build(),\n ...children\n ).build(),\n create(\"button\")\n .classes(\"fjsc\", \"relative\", \"align-center\")\n .onclick(() => {\n queueListHidden.value = !queueListHidden.value;\n })\n .children(\n FJSC.icon({\n icon: \"queue_music\",\n adaptive: true,\n }),\n create(\"span\")\n .classes(\"align-center\", \"nopointer\")\n .text(\"Queue\")\n .build(),\n create(\"div\")\n .classes(\"queue-bubble\", \"nopointer\")\n .text(queue.length)\n .build()\n ).build()\n ).build();\n }\n}", "import {PlayManager} from \"../Streaming/PlayManager.ts\";\nimport {StreamingUpdater} from \"../Streaming/StreamingUpdater.ts\";\nimport {Icons} from \"../Enums/Icons.js\";\nimport {Time} from \"../Classes/Helpers/Time.ts\";\nimport {QueueManager} from \"../Streaming/QueueManager.ts\";\nimport {Images} from \"../Enums/Images.ts\";\nimport {QueueTemplates} from \"./QueueTemplates.ts\";\nimport {UserTemplates} from \"./UserTemplates.ts\";\nimport {StatisticsTemplates} from \"./StatisticsTemplates.ts\";\nimport {CommentTemplates} from \"./CommentTemplates.ts\";\nimport {GenericTemplates} from \"./GenericTemplates.ts\";\nimport {notify, Ui} from \"../Classes/Ui.ts\";\nimport {Util} from \"../Classes/Util.ts\";\nimport {AnyElement, AnyNode, create, ifjs, StringOrSignal} from \"../../fjsc/src/f2.ts\";\nimport {Track} from \"../Models/DbModels/lyda/Track.ts\";\nimport {User} from \"../Models/DbModels/lyda/User.ts\";\nimport {navigate} from \"../Routing/Router.ts\";\nimport {FJSC} from \"../../fjsc\";\nimport {compute, Signal, signal} from \"../../fjsc/src/signals.ts\";\nimport {\n currentlyBuffered,\n currentTrackId,\n currentTrackPosition, loopMode, manualQueue, muted,\n playingElsewhere,\n playingFrom,\n playingHere, volume\n} from \"../state.ts\";\nimport {UserWidgetContext} from \"../Enums/UserWidgetContext.ts\";\nimport {IconConfig} from \"../../fjsc/src/Types.ts\";\nimport {LoopMode} from \"../Enums/LoopMode.ts\";\n\nexport class PlayerTemplates {\n static audioPlayer(track: Track) {\n PlayManager.addStreamClientIfNotExists(track.id, track.length);\n setInterval(async () => {\n await PlayManager.playCheck(track);\n }, 1000);\n const isCurrentTrack = compute(id => id === track.id, currentTrackId);\n const positionPercent = compute((p, isCurrent) => isCurrent ? `${p.relative * 100}%` : \"0%\", currentTrackPosition, isCurrentTrack);\n const bufferPercent = compute((p, isCurrent) => isCurrent ? `${p * 100}%` : \"0%\", currentlyBuffered, isCurrentTrack);\n\n return create(\"div\")\n .classes(\"audio-player\", \"flex-grow\", \"flex\")\n .id(\"player_\" + track.id)\n .children(\n create(\"div\")\n .classes(\"audio-player-controls\", \"fullWidth\", \"flex\", \"rounded\")\n .id(track.id)\n .attributes(\"duration\", track.length)\n .children(\n create(\"audio\")\n .id(\"audio_\" + track.id)\n .styles(\"display\", \"none\")\n .build(),\n GenericTemplates.roundIconButton({\n icon: compute(p => p ? Icons.PAUSE : Icons.PLAY, playingHere),\n adaptive: true,\n isUrl: true,\n }, async () => {\n PlayManager.togglePlayAsync(track.id).then();\n }, \"Play/Pause\"),\n PlayerTemplates.loopModeButton(),\n PlayerTemplates.trackScrubbar(track, bufferPercent, positionPercent),\n PlayerTemplates.trackTime(track),\n PlayerTemplates.loudnessControl(track)\n ).build()\n ).build();\n }\n\n private static trackScrubbar(track: Track, bufferPercent: Signal, positionPercent: Signal) {\n return create(\"div\")\n .classes(\"audio-player-scrubber\", \"flex-grow\", \"flex\", \"rounded\", \"padded-inline\")\n .id(track.id)\n .onmousedown(PlayManager.scrubFromElement)\n .onmousemove(async e => {\n if (e.buttons === 1) {\n await PlayManager.scrubFromElement(e);\n }\n })\n .children(\n create(\"div\")\n .id(track.id)\n .classes(\"audio-player-buffer-indicator\", \"rounded\", \"nopointer\")\n .styles(\"left\", bufferPercent)\n .build(),\n create(\"div\")\n .classes(\"audio-player-scrubbar\", \"rounded\", \"nopointer\")\n .build(),\n create(\"div\")\n .classes(\"audio-player-scrubbar-time\", \"rounded\", \"nopointer\")\n .styles(\"width\", positionPercent)\n .build(),\n create(\"div\")\n .id(track.id)\n .classes(\"audio-player-scrubhead\", \"rounded\", \"nopointer\")\n .styles(\"left\", positionPercent)\n .build()\n ).build();\n }\n\n private static trackTime(track: Track) {\n return create(\"div\")\n .classes(\"audio-player-time\", \"flex\", \"rounded\", \"padded-inline\", \"hideOnSmallBreakpoint\")\n .children(\n create(\"span\")\n .id(track.id)\n .classes(\"audio-player-time-current\", \"nopointer\", \"align-center\")\n .text(\"0:00\")\n .build(),\n create(\"span\")\n .classes(\"audio-player-time-separator\", \"nopointer\", \"align-center\")\n .text(\"/\")\n .build(),\n create(\"span\")\n .classes(\"audio-player-time-total\", \"nopointer\", \"align-center\")\n .text(Time.format(track.length))\n .build()\n ).build();\n }\n\n static loudnessControl(track: Track) {\n const volumePercent = compute(vol => `${vol * 100}%`, volume);\n\n return create(\"div\")\n .classes(\"loudness-control\", \"clickable\", \"relative\")\n .id(track.id)\n .onwheel(PlayManager.setLoudnessFromWheel)\n .children(\n GenericTemplates.roundIconButton({\n icon: compute(p => p ? Icons.MUTE : Icons.LOUD, muted),\n adaptive: true,\n isUrl: true,\n }, async () => {\n PlayManager.toggleMute(track.id);\n }, \"Mute/Unmute\", [\"loudness-button\"]),\n create(\"div\")\n .classes(\"loudness-bar\", \"rounded\", \"padded\", \"relative\", \"hidden\")\n .id(track.id)\n .children(\n create(\"div\")\n .classes(\"audio-player-loudnessbackground\", \"fakeButton\", \"nopointer\")\n .build(),\n create(\"div\")\n .classes(\"audio-player-loudnesstracker\")\n .onmousemove(async e => {\n if (e.buttons === 1) {\n await PlayManager.setLoudnessFromElement(e);\n }\n })\n .onclick(e => PlayManager.setLoudnessFromElement(e))\n .build(),\n create(\"div\")\n .classes(\"audio-player-loudnessbar\", \"rounded\", \"nopointer\")\n .build(),\n create(\"div\")\n .classes(\"audio-player-loudnesshead\", \"rounded\", \"nopointer\")\n .styles(\"bottom\", volumePercent)\n .id(track.id)\n .build(),\n ).build()\n ).build();\n }\n\n static async player(track: Track, trackUser: User) {\n return create(\"div\")\n .classes(\"flex-v\")\n .id(\"permanent-player\")\n .children(\n ifjs(playingElsewhere, FJSC.heading({\n text: \"Playing on another instance of Lyda\",\n level: 2,\n })),\n ifjs(playingElsewhere, create(\"div\")\n .classes(\"flex-v\", \"fullWidth\")\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n ...await PlayerTemplates.bottomTrackInfo(track, trackUser)\n ).build(),\n create(\"div\")\n .classes(\"flex\")\n .children(\n PlayerTemplates.audioPlayer(track),\n ).build(),\n ).build(), true)\n ).build();\n }\n\n static playingFrom() {\n const id = compute(pf => pf?.id, playingFrom);\n const type = compute(pf => pf?.type, playingFrom);\n const name = compute(pf => `Playing from ${pf?.name}`, playingFrom);\n\n return ifjs(playingFrom, create(\"div\")\n .classes(\"playing-from\", \"flex\")\n .children(\n create(\"span\")\n .classes(\"text-small\", \"padded-inline\", \"align-center\", \"clickable\", \"rounded\")\n .onclick(() => navigate(`${type.value}/${id.value}`))\n .text(name)\n .build(),\n ).build());\n }\n\n static noSubscriptionInfo() {\n return create(\"span\")\n .classes(\"no-sub-info\", \"rounded\", \"clickable\", \"text-small\", \"padded-inline\", \"align-center\")\n .text(\"Listening in 96kbps. Subscribe for up to 320kbps.\")\n .onclick(() => {\n navigate(\"subscribe\");\n }).build();\n }\n\n static async bottomTrackInfo(track: Track, trackUser: User) {\n const icons = [];\n const isPrivate = track.visibility !== \"public\";\n if (isPrivate) {\n icons.push(GenericTemplates.lock());\n }\n\n track.likes = track.likes ?? [];\n track.comments = track.comments ?? [];\n track.reposts = track.reposts ?? [];\n\n const cover = signal(Images.DEFAULT_COVER_TRACK);\n if (track.has_cover) {\n cover.value = Util.getTrackCover(track.id);\n }\n\n const trackList = signal<{ track: Track }[]>([]);\n manualQueue.subscribe(async (queue) => {\n const tasks = queue.map(id => PlayManager.getTrackData(id));\n trackList.value = await Promise.all(tasks);\n });\n const queueComponentMore = compute((q: any[]) => QueueTemplates.queue(q), trackList);\n const queueComponent = compute((q: any[]) => QueueTemplates.queue(q), trackList);\n\n return [\n create(\"img\")\n .classes(\"cover-image\", \"inline-cover\", \"align-center\", \"rounded\", \"clickable\", \"hover-image\")\n .src(cover)\n .onclick(async () => {\n const windowWidth = window.innerWidth;\n if (windowWidth < 600) {\n navigate(\"track/\" + track.id);\n } else {\n Ui.showImageModal(cover);\n }\n }).build(),\n create(\"span\")\n .classes(\"title\", \"clickable\", \"padded-inline\", \"align-center\")\n .text(track.title)\n .onclick(() => {\n navigate(\"track/\" + track.id);\n }).build(),\n ...icons,\n UserTemplates.userWidget(trackUser, Util.arrayPropertyMatchesUser(trackUser.follows ?? [], \"following_user_id\"),\n [], [\"hideOnSmallBreakpoint\", \"align-center\"], UserWidgetContext.player),\n PlayerTemplates.playingFrom(),\n await PlayerTemplates.moreMenu(track, isPrivate, queueComponentMore),\n create(\"div\")\n .classes(\"flex\", \"align-center\", \"hideOnMidBreakpoint\")\n .children(\n StatisticsTemplates.likesIndicator(\"track\", track.id, track.likes.length,\n Util.arrayPropertyMatchesUser(track.likes, \"user_id\")),\n isPrivate ? null : StatisticsTemplates.repostIndicator(track.id, track.reposts.length, Util.arrayPropertyMatchesUser(track.reposts, \"user_id\")),\n queueComponent\n ).build()\n ];\n }\n\n private static async moreMenu(track: Track, isPrivate: boolean, queueComponent: Signal) {\n const menuShown = signal(false);\n const activeClass = compute((m: boolean): string => m ? \"active\" : \"_\", menuShown);\n\n return create(\"div\")\n .classes(\"relative\", \"round-button\", \"showOnMidBreakpoint\")\n .children(\n GenericTemplates.roundIconButton({\n icon: \"more_horiz\",\n adaptive: true,\n }, async () => {\n menuShown.value = !menuShown.value;\n }, \"Open menu\", [\"showOnMidBreakpoint\", activeClass]),\n ifjs(menuShown, create(\"div\")\n .classes(\"popout-above\", \"card\", \"flex-v\")\n .children(\n StatisticsTemplates.likesIndicator(\"track\", track.id, track.likes!.length,\n Util.arrayPropertyMatchesUser(track.likes!, \"user_id\")),\n isPrivate ? null : StatisticsTemplates.repostIndicator(track.id, track.reposts!.length, Util.arrayPropertyMatchesUser(track.reposts!, \"user_id\")),\n CommentTemplates.commentButton(false, signal(track.comments!)),\n queueComponent\n ).build())\n ).build();\n }\n\n static loopModeButton() {\n const map: Record = {\n [LoopMode.off]: Icons.LOOP_OFF,\n [LoopMode.single]: Icons.LOOP_SINGLE,\n [LoopMode.context]: Icons.LOOP_CONTEXT,\n };\n\n return GenericTemplates.roundIconButton({\n icon: compute(mode => map[mode], loopMode),\n adaptive: true,\n isUrl: true,\n }, async () => {\n await PlayManager.nextLoopMode();\n }, \"Change loop mode\");\n }\n}", "import {PlayManager} from \"./PlayManager.ts\";\nimport {Time} from \"../Classes/Helpers/Time.ts\";\nimport {Icons} from \"../Enums/Icons.js\";\nimport {LydaCache} from \"../Cache/LydaCache.ts\";\nimport {CacheItem} from \"../Cache/CacheItem.ts\";\nimport {QueueTemplates} from \"../Templates/QueueTemplates.ts\";\nimport {QueueManager} from \"./QueueManager.ts\";\nimport {PlayerTemplates} from \"../Templates/PlayerTemplates.ts\";\nimport {Util} from \"../Classes/Util.ts\";\nimport {\n currentlyBuffered,\n currentTrackId,\n currentTrackPosition,\n manualQueue,\n playingHere,\n trackInfo\n} from \"../state.ts\";\nimport {signal} from \"../../fjsc/src/signals.ts\";\n\nconst updatingPlayState = signal(false);\n\nexport class StreamingUpdater {\n static updatePlayingIndicators() {\n const playingElements = document.querySelectorAll(\".playing\");\n for (const playingElement of playingElements) {\n playingElement.classList.remove(\"playing\");\n }\n const listTracks = document.querySelectorAll(\".list-track[track_id='\" + currentTrackId.value + \"']\");\n for (const listTrack of listTracks) {\n listTrack.classList.add(\"playing\");\n }\n const inlineTracks = document.querySelectorAll(\".inlineTrack[track_id='\" + currentTrackId.value + \"']\");\n for (const inlineTrack of inlineTracks) {\n inlineTrack.classList.add(\"playing\");\n }\n const trackCards = document.querySelectorAll(\".track-card[track_id='\" + currentTrackId.value + \"']\");\n for (const trackCard of trackCards) {\n trackCard.classList.add(\"playing\");\n }\n }\n\n static async updatePermanentPlayer() {\n if (!currentTrackId.value) {\n console.log(\"no currentTrackId\");\n return;\n }\n const streamClient = PlayManager.getStreamClient(currentTrackId.value);\n StreamingUpdater.updateBuffers(streamClient.getBufferedLength(), streamClient.duration);\n StreamingUpdater.updateScrubber(currentTrackId.value);\n\n let trackInfoTmp = trackInfo.value[currentTrackId.value];\n if (trackInfoTmp === undefined) {\n trackInfoTmp = await PlayManager.getTrackData(currentTrackId.value);\n }\n\n const footer = document.querySelector(\"footer\");\n if (!footer) {\n return;\n }\n const existingPlayer = footer.querySelector(\"#player_\" + currentTrackId.value);\n if (existingPlayer !== null) {\n return;\n }\n footer.innerHTML = \"\";\n if (footer.querySelector(\"#permanent-player\") === null) {\n if (!trackInfoTmp.track.user) {\n throw new Error(`Track ${trackInfoTmp.track.id} has no user`);\n }\n const player = await PlayerTemplates.player(trackInfoTmp.track, trackInfoTmp.track.user);\n footer.appendChild(player);\n }\n }\n\n static updateScrubber(id: number) {\n const currentTime = PlayManager.getCurrentTime(id);\n const streamClient = PlayManager.getStreamClient(id);\n if (streamClient && streamClient.playing) {\n currentTrackPosition.value = currentTime;\n }\n const scrubTimesCurrent = document.querySelectorAll(\".audio-player-time-current\") as NodeListOf;\n for (const scrubTimeCurrent of scrubTimesCurrent) {\n if (scrubTimeCurrent.id !== id.toString()) {\n continue;\n }\n scrubTimeCurrent.innerText = Time.format(currentTime.absolute);\n }\n\n const waveforms = document.querySelectorAll(\".waveform\");\n const barCount = 150;\n for (const waveform of waveforms) {\n if (waveform.id !== id.toString()) {\n continue;\n }\n const waveformBars = waveform.querySelectorAll(\".waveform-bar\");\n const barsBefore = Math.floor(currentTime.relative * barCount);\n const barsAfter = barCount - barsBefore;\n for (let i = 0; i < barsBefore; i++) {\n waveformBars[i]?.classList.add(\"active\");\n }\n for (let i = barsBefore; i < barsBefore + barsAfter; i++) {\n waveformBars[i]?.classList.remove(\"active\");\n }\n }\n\n StreamingUpdater.updateBuffers(streamClient.getBufferedLength(), streamClient.duration);\n }\n\n static updateBuffers(bufferedLength: number, duration: number) {\n currentlyBuffered.value = Math.min(Math.max(bufferedLength / duration, 0), 1);\n }\n\n static async updateQueue() {\n const queue = QueueManager.getManualQueue();\n const queueDom = document.querySelectorAll(\".audio-queueadd\") as NodeListOf;\n for (const queueItem of queueDom) {\n const img = queueItem.querySelector(\"img\");\n const text = queueItem.querySelector(\"span\");\n if (queue.includes(parseInt(queueItem.id))) {\n queueItem.classList.remove(\"audio-queueadd\");\n queueItem.classList.add(\"audio-queueremove\");\n img && (img.src = Icons.UNQUEUE);\n text && (text.innerText = \"Unqueue\");\n }\n }\n const unqueueDom = document.querySelectorAll(\".audio-queueremove\");\n for (const unqueueItem of unqueueDom) {\n const img = unqueueItem.querySelector(\"img\");\n const text = unqueueItem.querySelector(\"span\");\n if (!queue.includes(parseInt(unqueueItem.id))) {\n unqueueItem.classList.remove(\"audio-queueremove\");\n unqueueItem.classList.add(\"audio-queueadd\");\n img && (img.src = Icons.QUEUE);\n text && (text.innerText = \"Queue\");\n }\n }\n }\n\n static async updatePlayState() {\n if (updatingPlayState.value) {\n return;\n }\n updatingPlayState.value = true;\n const targets = document.querySelectorAll(\".audio-player-toggle\");\n\n const currentStreamClient = PlayManager.getStreamClient(currentTrackId.value);\n if (currentStreamClient) {\n playingHere.value = currentStreamClient.playing;\n } else {\n playingHere.value = false;\n }\n\n for (const target of targets) {\n const streamClient = PlayManager.getStreamClient(parseInt(target.id));\n if (streamClient === undefined) {\n continue;\n }\n const img = target.querySelector(\"img\") as HTMLImageElement;\n const text = target.querySelector(\"span\") as HTMLSpanElement;\n if (!img || !text) {\n const i = target.querySelector(\"i\");\n if (i) {\n if (streamClient.playing) {\n i.innerText = \"pause\";\n text.innerText = \"Pause\";\n } else {\n i.innerText = \"play_arrow\";\n text.innerText = \"Play\";\n }\n }\n continue;\n }\n if (streamClient.playing) {\n img.src = Icons.PAUSE;\n img.alt = \"Pause\";\n text.innerText = \"Pause\";\n } else {\n img.src = Icons.PLAY;\n img.alt = \"Play\";\n text.innerText = \"Play\";\n }\n img.classList.remove(\"spinner-animation\");\n }\n\n StreamingUpdater.updatePlayingIndicators();\n await StreamingUpdater.updatePermanentPlayer();\n updatingPlayState.value = false;\n }\n}", "import {PlayManager} from \"./PlayManager.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {currentQuality, currentTrackId, currentTrackPosition, volume} from \"../state.ts\";\nimport {create} from \"../../fjsc/src/f2.ts\";\nimport {compute} from \"../../fjsc/src/signals.ts\";\n\nexport class StreamClient {\n id: number;\n audio: HTMLAudioElement;\n duration: number;\n playing: boolean;\n\n constructor(id: number, code: string) {\n this.id = id;\n const src = compute(q => `${ApiRoutes.getTrackAudio}?id=${this.id}&quality=${q}&code=${code}`, currentQuality);\n this.audio = create(\"audio\")\n .attributes(\"crossOrigin\", \"use-credentials\")\n .attributes(\"preload\", \"auto\")\n .attributes(\"autoplay\", \"false\")\n .src(src)\n .build() as HTMLAudioElement;\n this.duration = this.audio.duration;\n this.playing = false;\n currentQuality.subscribe(async q => {\n if (this.playing) {\n await this.stopAsync();\n const interval = setInterval(async () => {\n if (this.getBufferedLength() >= this.duration) {\n console.log(\"Starting because buffer loaded\");\n await this.scrubTo(currentTrackPosition.value.absolute, false, false);\n await this.startAsync();\n clearInterval(interval);\n }\n }, 100);\n } else {\n await this.stopAsync();\n }\n });\n\n const currentStreamClient = PlayManager.getStreamClient(currentTrackId.value);\n if (!currentStreamClient) {\n this.setVolume(volume.value ?? 0.2);\n } else {\n this.setVolume(currentStreamClient.getVolume());\n }\n }\n\n async startAsync() {\n this.playing = true;\n currentTrackId.value = this.id;\n await this.audio.play();\n this.duration = this.audio.duration;\n }\n\n async stopAsync() {\n this.playing = false;\n await this.audio.pause();\n }\n\n async scrubTo(time: number, relative = true, togglePlay = false) {\n if (togglePlay) await this.stopAsync();\n this.audio.currentTime = time * (relative ? this.audio.duration : 1);\n if (togglePlay) await this.startAsync();\n }\n\n getCurrentTime(relative = false) {\n return relative ? this.audio.currentTime / this.audio.duration : this.audio.currentTime;\n }\n\n getVolume() {\n return Math.sqrt(this.audio.volume);\n }\n\n setVolume(volume: number) {\n this.audio.volume = volume * volume;\n }\n\n getBufferedLength() {\n return this.audio.buffered.length > 0 ? this.audio.buffered.end(0) : 0;\n }\n}", "import {PlayManager} from \"./PlayManager.ts\";\nimport {currentTrackId, playingElsewhere, playingHere} from \"../state.ts\";\nimport {stack} from \"../../fjsc/src/f2.ts\";\n\nexport enum StreamingEvent {\n trackStart = \"track-start\",\n trackStop = \"track-stop\",\n requestPlayingElsewhere = \"request-playing-elsewhere\"\n}\n\nexport const broadCastChannel = new BroadcastChannel(\"lyda-streaming\");\n\nfunction getId() {\n return Math.random().toString(36).substring(7);\n}\nlet lastSentId: string;\n\nexport class StreamingBroadcaster {\n static send(event: StreamingEvent, data: any = null) {\n console.log(\"Sending message to broadcast channel: \", event, data);\n lastSentId = getId();\n broadCastChannel.postMessage({\n event,\n data,\n id: lastSentId\n });\n }\n\n static initializeReceiver() {\n broadCastChannel.onmessage = async (e) => {\n if (e.origin !== window.location.origin) {\n console.warn(\"Received message from unknown origin: \", e);\n return;\n }\n console.log(\"Received message from broadcast channel: \", e.data);\n const data = e.data;\n switch (data.event) {\n case StreamingEvent.trackStart:\n await PlayManager.stopAllAsync();\n playingElsewhere.value = true;\n break;\n case StreamingEvent.trackStop:\n playingElsewhere.value = false;\n break;\n case StreamingEvent.requestPlayingElsewhere:\n if (!playingElsewhere.value && playingHere.value && data.id !== lastSentId) {\n StreamingBroadcaster.send(StreamingEvent.trackStart, currentTrackId.value);\n }\n break;\n }\n };\n StreamingBroadcaster.send(StreamingEvent.requestPlayingElsewhere);\n }\n}", "import {LydaCache} from \"../Cache/LydaCache.ts\";\nimport {Api} from \"../Api/Api.ts\";\nimport {CacheItem} from \"../Cache/CacheItem.ts\";\nimport {StreamingUpdater} from \"./StreamingUpdater.ts\";\nimport {QueueManager} from \"./QueueManager.ts\";\nimport {TrackActions} from \"../Actions/TrackActions.ts\";\nimport {StreamClient} from \"./StreamClient.ts\";\nimport {getErrorMessage, userHasSettingValue, Util} from \"../Classes/Util.ts\";\nimport {notify} from \"../Classes/Ui.ts\";\nimport {Track} from \"../Models/DbModels/lyda/Track.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {\n trackInfo,\n currentTrackId,\n playingFrom,\n streamClients,\n volume,\n playingHere,\n currentTrackPosition,\n loopMode,\n muted, currentSecretCode\n} from \"../state.ts\";\nimport {PlayingFrom} from \"../Models/PlayingFrom.ts\";\nimport {StreamingBroadcaster, StreamingEvent} from \"./StreamingBroadcaster.ts\";\nimport {TrackPosition} from \"../Models/TrackPosition.ts\";\nimport {LoopMode} from \"../Enums/LoopMode.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\n\nexport class PlayManager {\n static async playCheck(track: any) {\n if (PlayManager.isPlaying(track.id)) {\n const currentTime = PlayManager.getCurrentTime(track.id);\n\n if (currentTime.absolute >= PlayManager.getDuration(track.id)) {\n const loopingSingle = PlayManager.isLoopingSingle();\n if (loopingSingle) {\n await PlayManager.togglePlayAsync(track.id);\n await PlayManager.scrubTo(track.id, 0);\n } else {\n await this.playNextFromQueues(track);\n }\n TrackActions.savePlayAfterTimeIf(track.id, 5, () => track.id === currentTrackId.value && PlayManager.isPlaying(track.id));\n }\n\n StreamingUpdater.updateScrubber(track.id);\n }\n }\n\n static async playNextFromQueues(currentTrack: any) {\n const queue = QueueManager.getManualQueue();\n const nextTrackId = queue[0];\n if (nextTrackId !== undefined) {\n await PlayManager.safeStartAsync(nextTrackId);\n QueueManager.removeFromManualQueue(nextTrackId);\n } else {\n const loopingContext = PlayManager.isLoopingContext();\n const contextQueue = QueueManager.getContextQueue();\n if (contextQueue.length > 0) {\n let nextTrackId = QueueManager.getNextTrackInContextQueue(currentTrack.id);\n if (nextTrackId !== undefined && nextTrackId !== null) {\n await PlayManager.safeStartAsync(nextTrackId);\n } else {\n if (loopingContext) {\n nextTrackId = QueueManager.getContextQueue()[0];\n await PlayManager.safeStartAsync(nextTrackId);\n } else {\n await PlayManager.playNextInAutoQueue();\n }\n }\n } else {\n const user = await Util.getUserAsync();\n const autoQueue = QueueManager.getAutoQueue();\n if (autoQueue.length > 0 && user && userHasSettingValue(user, \"playFromAutoQueue\", \"true\")) {\n await PlayManager.playNextInAutoQueue();\n } else {\n await PlayManager.stopAllAsync();\n }\n }\n }\n }\n\n static addStreamClient(id: number, streamClient: StreamClient) {\n streamClients.value[id] = streamClient;\n }\n\n static removeStreamClient(id: number) {\n delete streamClients.value[id];\n }\n\n static getStreamClient(id: number): StreamClient {\n return streamClients.value[id];\n }\n\n static playFrom(type: string, name: string, id: number) {\n playingFrom.value = {type, name, id};\n LydaCache.set(\"playingFrom\", new CacheItem(playingFrom.value));\n }\n\n static getPlayingFrom() {\n let playingFromTmp = playingFrom.value;\n if (!playingFromTmp || Object.keys(playingFromTmp as any).length === 0) {\n const cachedPlayingFrom = LydaCache.get(\"playingFrom\").content ?? null;\n if (cachedPlayingFrom) {\n playingFromTmp = cachedPlayingFrom;\n playingFrom.value = playingFromTmp;\n }\n }\n return playingFromTmp;\n }\n\n static isPlaying(id: number) {\n const streamClient = PlayManager.getStreamClient(id);\n if (streamClient === undefined) {\n return false;\n } else {\n return streamClient.playing;\n }\n }\n\n static addStreamClientIfNotExists(id: number, duration: number) {\n let streamClient;\n if (PlayManager.getStreamClient(id) === undefined) {\n streamClient = new StreamClient(id, currentSecretCode.value);\n PlayManager.addStreamClient(id, streamClient);\n } else {\n streamClient = PlayManager.getStreamClient(id);\n if (streamClient.duration === 0) {\n streamClient.duration = duration;\n StreamingUpdater.updateBuffers(streamClient.getBufferedLength(), streamClient.duration);\n }\n }\n return streamClient;\n }\n\n static async removeTrackFromAllStates(id: number) {\n QueueManager.removeFromAllQueues(id);\n if (currentTrackId.value === id) {\n await PlayManager.stopAsync(id);\n PlayManager.removeStreamClient(id);\n currentTrackId.value = 0;\n delete trackInfo.value[id];\n document.querySelector(\"#permanent-player\")?.remove();\n StreamingBroadcaster.send(StreamingEvent.trackStop, id);\n }\n if (trackInfo.value[id]) {\n delete trackInfo.value[id];\n }\n }\n\n static async togglePlayAsync(id: number) {\n const streamClient = PlayManager.getStreamClient(id);\n if (streamClient === undefined) {\n return;\n }\n\n if (streamClient.playing) {\n await streamClient.stopAsync();\n playingHere.value = false;\n StreamingBroadcaster.send(StreamingEvent.trackStop, id);\n } else {\n await PlayManager.stopAllAsync();\n await streamClient.startAsync();\n StreamingBroadcaster.send(StreamingEvent.trackStart, id);\n playingHere.value = true;\n TrackActions.savePlayAfterTimeIf(id, 5, () => id === currentTrackId.value && PlayManager.isPlaying(id));\n }\n\n await StreamingUpdater.updatePlayState();\n }\n\n static async startAsync(id: number) {\n await PlayManager.stopAllAsync();\n\n const track = await PlayManager.getTrackData(id);\n const streamClient = PlayManager.addStreamClientIfNotExists(id, track.track.length);\n\n await streamClient.startAsync();\n await StreamingUpdater.updatePlayState();\n }\n\n static async safeStartAsync(id: number) {\n await PlayManager.startAsync(id);\n if (PlayManager.getCurrentTime(id).relative > .1) {\n await PlayManager.scrubTo(id, 0);\n }\n }\n\n static async playNextInAutoQueue() {\n await PlayManager.stopAllAsync();\n const nextTrackId = await QueueManager.popFromAutoQueue();\n if (nextTrackId === undefined) {\n return false;\n }\n await PlayManager.safeStartAsync(nextTrackId);\n return true;\n }\n\n static async initializeTrackAsync(id: number) {\n let streamClient = PlayManager.getStreamClient(id);\n const track = await PlayManager.getTrackData(id);\n if (streamClient === undefined) {\n streamClient = PlayManager.addStreamClientIfNotExists(id, track.track.length);\n }\n if (currentTrackPosition.value.relative !== 0) {\n await streamClient.scrubTo(currentTrackPosition.value.relative * track.track.length, false, false);\n }\n await StreamingUpdater.updatePlayState();\n }\n\n static async stopAsync(id: number) {\n const streamClient = PlayManager.getStreamClient(id);\n if (streamClient === undefined) {\n return;\n }\n\n await streamClient.stopAsync();\n playingHere.value = false;\n await StreamingUpdater.updatePlayState();\n }\n\n static async stopAllAsync(exclusionId = null) {\n for (const key in streamClients.value) {\n if (key === exclusionId) {\n continue;\n }\n await streamClients.value[key].stopAsync();\n }\n playingHere.value = false;\n\n await StreamingUpdater.updatePlayState();\n }\n\n static async scrubFromElement(e: any) {\n const value = e.offsetX / e.target.offsetWidth;\n if (e.target.id !== currentTrackId.value) {\n await PlayManager.startAsync(e.target.id);\n }\n await PlayManager.scrubTo(e.target.id, value);\n }\n\n static isLoopingSingle() {\n return loopMode.value === LoopMode.single;\n }\n\n static isLoopingContext() {\n return loopMode.value === LoopMode.context;\n }\n\n static async nextLoopMode() {\n switch (loopMode.value) {\n case LoopMode.off:\n loopMode.value = LoopMode.single;\n break;\n case LoopMode.single:\n loopMode.value = LoopMode.context;\n break;\n case LoopMode.context:\n loopMode.value = LoopMode.off;\n break;\n }\n\n const streamClient = PlayManager.getStreamClient(currentTrackId.value);\n streamClient.audio.loop = loopMode.value === LoopMode.single;\n }\n\n static async scrubTo(id: number, value: number) {\n value = Math.min(Math.max(value, 0), 1);\n\n //await PlayManager.stopAllAsync(id);\n const streamClient = PlayManager.getStreamClient(id);\n await streamClient.scrubTo(value, true, true);\n\n StreamingUpdater.updateScrubber(id);\n await StreamingUpdater.updatePlayState();\n }\n\n static getCurrentTime(id: number): TrackPosition {\n const streamClient = PlayManager.getStreamClient(id);\n const trackPosition = {\n relative: streamClient.getCurrentTime(true),\n absolute: streamClient.getCurrentTime(false)\n };\n if (isNaN(trackPosition.relative)) {\n trackPosition.relative = 0;\n }\n return trackPosition;\n }\n\n static getDuration(id: number) {\n const streamClient = PlayManager.getStreamClient(id);\n if (streamClient === undefined) {\n return 0;\n }\n return streamClient.duration;\n }\n\n static getBufferedLength(id: number) {\n const streamClient = PlayManager.getStreamClient(id);\n if (streamClient === undefined) {\n return 0;\n }\n return streamClient.getBufferedLength();\n }\n\n static toggleMute(id: number) {\n const streamClient = PlayManager.getStreamClient(id);\n if (streamClient.getVolume() > 0) {\n volume.value = streamClient.getVolume();\n muted.value = true;\n streamClient.setVolume(0);\n } else {\n muted.value = false;\n streamClient.setVolume(volume.value);\n }\n }\n\n static async setLoudnessFromElement(e: any) {\n let value = 1 - (e.offsetY / e.target.offsetHeight);\n await PlayManager.setLoudness(value);\n }\n\n static async setLoudnessFromWheel(e: any) {\n let value = PlayManager.getLoudness();\n if (e.deltaY < 0) {\n value += 0.05;\n } else {\n value -= 0.05;\n }\n await PlayManager.setLoudness(value);\n }\n\n static getLoudness() {\n const streamClient = PlayManager.getStreamClient(currentTrackId.value);\n return streamClient.getVolume();\n }\n\n static async setLoudness(value: number) {\n value = Math.min(Math.max(value, 0), 1);\n const streamClient = PlayManager.getStreamClient(currentTrackId.value);\n await streamClient.setVolume(value);\n\n volume.value = value;\n muted.value = value === 0;\n }\n\n static async skipForward(id: number) {\n const streamClient = PlayManager.getStreamClient(id);\n await PlayManager.scrubTo(id, streamClient.getCurrentTime(true) + .1);\n }\n\n static async skipBackward(id: number) {\n const streamClient = PlayManager.getStreamClient(id);\n await PlayManager.scrubTo(id, streamClient.getCurrentTime(true) - .1);\n }\n\n static config = {\n controls: {\n volumeChangeRelative: 1.2\n }\n };\n\n static async volumeUp() {\n const streamClient = PlayManager.getStreamClient(currentTrackId.value);\n await PlayManager.setLoudness(streamClient.getVolume() * PlayManager.config.controls.volumeChangeRelative);\n }\n\n static async volumeDown() {\n const streamClient = PlayManager.getStreamClient(currentTrackId.value);\n await PlayManager.setLoudness(streamClient.getVolume() / PlayManager.config.controls.volumeChangeRelative);\n }\n\n static async cacheTrackData(trackData: { track: Track }) {\n trackInfo.value[trackData.track.id] = trackData;\n }\n\n static async getTrackData(id: number, allowCache = true) {\n if (trackInfo.value[id] && allowCache) {\n return trackInfo.value[id];\n }\n const res = await Api.getAsync<{ track: Track }>(ApiRoutes.getTrackById, {id});\n if (res.code !== 200) {\n await PlayManager.removeTrackFromAllStates(id);\n notify(`Failed to get track data for ${id}: ${getErrorMessage(res)}`, NotificationType.error);\n throw new Error(`Failed to get track data for ${id}: ${res.data.error}`);\n }\n await PlayManager.cacheTrackData(res.data);\n return res.data;\n }\n}", "import {Api} from \"../Api/Api.ts\";\nimport {getErrorMessage, Util} from \"../Classes/Util.ts\";\nimport {Icons} from \"../Enums/Icons.ts\";\nimport {PlayManager} from \"../Streaming/PlayManager.ts\";\nimport {AlbumActions} from \"./AlbumActions.ts\";\nimport {PlaylistActions} from \"./PlaylistActions.ts\";\nimport {TrackEditTemplates} from \"../Templates/TrackEditTemplates.ts\";\nimport {notify, Ui} from \"../Classes/Ui.ts\";\nimport {navigate, reload} from \"../Routing/Router.ts\";\nimport {Signal} from \"../../fjsc/src/signals.ts\";\nimport {Comment} from \"../Models/DbModels/lyda/Comment.ts\";\nimport {Track} from \"../Models/DbModels/lyda/Track.ts\";\nimport {MediaFileType} from \"../Enums/MediaFileType.ts\";\nimport {MediaUploader} from \"../Api/MediaUploader.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {Album} from \"../Models/DbModels/lyda/Album.ts\";\nimport {Playlist} from \"../Models/DbModels/lyda/Playlist.ts\";\nimport {AnyElement} from \"../../fjsc/src/f2.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\nimport {currentQuality, playingHere} from \"../state.ts\";\nimport {TrackCollaborator} from \"../Models/DbModels/lyda/TrackCollaborator.ts\";\nimport {ListTrack} from \"../Models/ListTrack.ts\";\n\nexport class TrackActions {\n static async savePlay(id: number) {\n if (!playingHere.value) {\n console.log(\"Not saving play because not playing in this tab.\");\n return;\n }\n return await Api.postAsync(ApiRoutes.saveTrackPlay, { id, quality: currentQuality.value });\n }\n\n static savePlayAfterTimeIf(id: number, seconds: number, condition: () => boolean) {\n setTimeout(async () => {\n if (condition()) {\n await TrackActions.savePlay(id);\n }\n }, seconds * 1000);\n }\n\n static async unfollowUser(userId: number) {\n const res = await Api.postAsync(ApiRoutes.unfollowUser, {\n id: userId\n });\n\n if (res.code !== 200) {\n notify(\"Error while trying to unfollow user: \" + getErrorMessage(res), NotificationType.error);\n }\n\n return res;\n }\n\n static async deleteTrack(id: number) {\n if (!confirm) {\n return;\n }\n const res = await Api.postAsync(ApiRoutes.deleteTrack, { id });\n if (res.code === 200) {\n await PlayManager.removeTrackFromAllStates(id);\n notify(res.data, NotificationType.success);\n navigate(\"profile\");\n } else {\n notify(\"Error trying to delete track: \" + getErrorMessage(res), NotificationType.error);\n }\n }\n\n static async deleteComment(commentId: number, comments: Signal) {\n await Ui.getConfirmationModal(\"Delete comment\", \"Are you sure you want to delete this comment?\", \"Yes\", \"No\", async () => {\n const res = await Api.postAsync(ApiRoutes.deleteComment, {\n id: commentId,\n });\n\n if (res.code !== 200) {\n notify(getErrorMessage(res), NotificationType.error);\n return;\n }\n\n const commentCount = document.querySelector(\".stats-count.comments\") as HTMLElement;\n if (commentCount) {\n commentCount.innerText = (parseInt(commentCount.innerText) - 1).toString();\n }\n const comment = document.querySelector(\".comment-in-list[id='\" + commentId + \"']\");\n if (comment) {\n comment.remove();\n }\n comments.value = comments.value.filter(c => c.id !== commentId && c.parent_id !== commentId);\n if (document.querySelectorAll(\".comment-in-list\").length === 0) {\n const noComments = document.querySelector(\".no-comments\");\n if (noComments !== null) {\n noComments.classList.remove(\"hidden\");\n }\n }\n notify(\"Comment deleted\", NotificationType.success);\n }, () => {\n }, Icons.WARNING);\n }\n\n static async newComment(content: Signal, comments: Signal, track_id: number, parentCommentId: number|null = null) {\n if (!content.value || content.value === \"\") {\n return;\n }\n if (content.value.length > 1000) {\n notify(\"Comment is too long\", NotificationType.error);\n return;\n }\n\n const res = await Api.postAsync(ApiRoutes.newComment, {\n id: track_id,\n content: content.value,\n parentId: parentCommentId ? parentCommentId : null,\n });\n\n if (res.code !== 200) {\n notify(getErrorMessage(res), NotificationType.error);\n return;\n }\n\n const user = await Util.getUserAsync();\n\n let nowUtc = new Date();\n const offset = nowUtc.getTimezoneOffset() * 60000;\n nowUtc = new Date(nowUtc.getTime() + offset);\n const createdId = parseInt(res.data);\n\n const comment = {\n id: createdId,\n content: content.value,\n user: user,\n user_id: user.id,\n track_id: track_id,\n parent_id: parentCommentId ? parentCommentId : null,\n created_at: nowUtc,\n potentially_harmful: false,\n hidden: false,\n canEdit: true\n };\n comments.value = [...comments.value, comment];\n content.value = \"\";\n }\n\n static async likeTrack(id: number) {\n return await Api.postAsync(ApiRoutes.likeTrack, { id });\n }\n\n static async unlikeTrack(id: number) {\n return await Api.postAsync(ApiRoutes.unlikeTrack, { id });\n }\n\n static async repostTrack(id: number) {\n const res = await Api.postAsync(ApiRoutes.repostTrack, { id });\n if (res.code !== 200) {\n notify(\"Failed to repost track: \" + getErrorMessage(res), NotificationType.error);\n return false;\n }\n return true;\n }\n\n static async unrepostTrack(id: number) {\n const res = await Api.postAsync(ApiRoutes.unrepostTrack, { id });\n if (res.code !== 200) {\n notify(\"Failed to unrepost track: \" + getErrorMessage(res), NotificationType.error);\n return false;\n }\n return true;\n }\n\n static async runFollowFunctionFromElement(userId: number, following: Signal) {\n if (following.value) {\n const res = await TrackActions.unfollowUser(userId);\n if (res.code !== 200) {\n return false;\n }\n notify(`Successfully unfollowed user`, NotificationType.success);\n } else {\n const res = await TrackActions.followUser(userId);\n if (res.code !== 200) {\n return;\n }\n notify(`Successfully followed user`, NotificationType.success);\n }\n following.value = !following.value;\n }\n\n static async followUser(userId: number) {\n const res = await Api.postAsync(ApiRoutes.followUser, {\n id: userId,\n });\n\n if (res.code !== 200) {\n notify(\"Error while trying to follow user: \" + getErrorMessage(res), NotificationType.error);\n }\n\n return res;\n }\n\n static async getCollabTypes() {\n const res = await Api.getAsync(ApiRoutes.getTrackCollabTypes);\n if (res.code !== 200) {\n notify(\"Error while trying to get collab types: \" + getErrorMessage(res), NotificationType.error);\n return [];\n }\n return res.data;\n }\n\n static async toggleLike(id: number, isEnabled: boolean) {\n if (!Util.isLoggedIn()) {\n notify(\"You must be logged in to like tracks\", NotificationType.error);\n return false;\n }\n if (isEnabled) {\n const res = await TrackActions.unlikeTrack(id);\n if (res.code !== 200) {\n return false;\n }\n } else {\n const res = await TrackActions.likeTrack(id);\n if (res.code !== 200) {\n return false;\n }\n }\n return true;\n }\n\n static async toggleRepost(id: number, isEnabled: boolean) {\n if (!Util.isLoggedIn()) {\n notify(\"You must be logged in to repost tracks\", NotificationType.error);\n return false;\n }\n if (isEnabled) {\n return await TrackActions.unrepostTrack(id);\n } else {\n return await TrackActions.repostTrack(id);\n }\n }\n\n static async replaceCover(id: number, canEdit: boolean, oldSrc: Signal, loading: Signal) {\n if (!canEdit) {\n return;\n }\n loading.value = true;\n let fileInput = document.createElement(\"input\");\n fileInput.type = \"file\";\n fileInput.accept = \"image/*\";\n fileInput.onchange = async (e) => {\n const fileTarget = e.target as HTMLInputElement;\n let file = fileTarget.files![0];\n if (!file) {\n loading.value = false;\n return;\n }\n\n try {\n await MediaUploader.upload(MediaFileType.trackCover, id, file);\n notify(\"Cover updated\", NotificationType.success);\n await Util.updateImage(URL.createObjectURL(file), oldSrc.value);\n } catch (e) {\n notify(\"Failed to upload cover\", NotificationType.error);\n }\n loading.value = false;\n };\n fileInput.onabort = () => loading.value = false;\n fileInput.click();\n }\n\n static async replaceAudio(id: number, canEdit: boolean, loading: Signal, onSuccess: Function = () => {}) {\n if (!canEdit) {\n return;\n }\n loading.value = true;\n let fileInput = document.createElement(\"input\");\n fileInput.type = \"file\";\n fileInput.accept = \"audio/*\";\n fileInput.onchange = async (e) => {\n const fileTarget = e.target as HTMLInputElement;\n let file = fileTarget.files![0];\n if (!file) {\n loading.value = false;\n return;\n }\n try {\n await MediaUploader.upload(MediaFileType.audio, id, file);\n notify(\"Audio updated\", NotificationType.success);\n onSuccess();\n } catch (e) {\n notify(\"Failed to upload audio\", NotificationType.error);\n }\n loading.value = false;\n };\n fileInput.onabort = () => loading.value = false;\n fileInput.oncancel = () => loading.value = false;\n fileInput.onreset = () => loading.value = false;\n fileInput.click();\n }\n\n static replyToComment(e: any, trackId: number, commentId: number, username: string, parentCommentId: Signal) {\n const input = document.querySelector(\".comment-box-input[track_id='\" + trackId.toString() + \"']\") as HTMLInputElement;\n if (e.target.innerText === \"Reply\") {\n const replyButtons = document.querySelectorAll(\".replyButton[track_id='\" + trackId.toString() + \"']\") as NodeListOf;\n replyButtons.forEach((button) => {\n button.innerText = \"Reply\";\n });\n parentCommentId.value = commentId;\n input.placeholder = \"Reply to \" + username + \"...\";\n input.focus();\n e.target.innerText = \"Cancel\";\n } else {\n parentCommentId.value = 0;\n input.placeholder = \"New comment...\";\n e.target.innerText = \"Reply\";\n }\n }\n\n static moveTrackToPosition(idToMove: number, targetPosition: number, tracks: Signal) {\n // Extract the current list of tracks\n const currentTracks = tracks.value;\n\n // Find the index of the track to move\n const indexToMove = currentTracks.findIndex(track => track.track_id === idToMove);\n if (indexToMove === -1) {\n throw new Error(\"Track to move not found\");\n }\n\n // Clamp the targetPosition to be within bounds\n const clampedTargetPosition = Math.max(0, Math.min(targetPosition, currentTracks.length - 1));\n\n // Extract the track to move\n const [trackToMove] = currentTracks.splice(indexToMove, 1);\n\n // Insert the track at the target position\n currentTracks.splice(clampedTargetPosition, 0, trackToMove);\n\n // Update the position property of all tracks\n tracks.value = currentTracks.map((track, index) => ({\n ...track,\n position: index\n }));\n }\n\n static async removeTrackFromList(tracks: Signal, list: Playlist | Album, type: string, track: ListTrack) {\n await Ui.getConfirmationModal(\"Remove track from \" + type, \"Are you sure you want to remove this track from \" + list.title +\"?\", \"Yes\", \"No\", async () => {\n let success;\n if (type === \"album\") {\n success = await AlbumActions.removeTrackFromAlbum(track.track_id, [list.id]);\n } else {\n success = await PlaylistActions.removeTrackFromPlaylist(track.track_id, [list.id]);\n }\n if (success) {\n tracks.value = tracks.value.filter(t => t.track_id !== track.track_id);\n }\n }, () => {\n }, Icons.WARNING);\n }\n\n static async reorderTrack(type: string, listId: number, trackId: number, tracks: Signal, newPosition: number) {\n let success;\n const oldPosition = tracks.value.findIndex(t => t.track_id === trackId);\n if (oldPosition === newPosition) {\n return;\n }\n this.moveTrackToPosition(trackId, newPosition, tracks);\n if (type === \"album\") {\n success = AlbumActions.moveTrackInAlbum(listId, tracks.value);\n } else {\n success = PlaylistActions.moveTrackInPlaylist(listId, tracks.value);\n }\n if (!(await success)) {\n this.moveTrackToPosition(trackId, oldPosition, tracks);\n }\n }\n\n static async removeCollaboratorFromTrack(trackId: number, userId: number) {\n const res = await Api.postAsync(ApiRoutes.removeCollaborator, {\n id: trackId,\n userId: userId,\n });\n\n if (res.code !== 200) {\n notify(\"Error while trying to remove collaborator: \" + getErrorMessage(res), NotificationType.error);\n return;\n }\n\n const collaborator = document.querySelector(\".collaborator[user_id='\" + userId + \"']\");\n if (collaborator) collaborator.remove();\n }\n\n static async addCollaboratorToTrack(trackId: number, userId: number, collabType: number) {\n const res = await Api.postAsync(ApiRoutes.addCollaborator, {\n id: trackId,\n userId: userId,\n collabType: collabType,\n });\n\n if (res.code !== 200) {\n notify(\"Error while trying to add collaborator: \" + getErrorMessage(res), NotificationType.error);\n return;\n }\n\n return res.data;\n }\n\n static async updateTrackProperty(trackId: number, property: string, initialValue: string, callback: Function|null = null) {\n Ui.getTextAreaInputModal(\"Edit \" + property, \"Enter new track \" + property, initialValue, \"Save\", \"Cancel\", async (value: string) => {\n const res = await Api.postAsync(ApiRoutes.updateTrack, {\n id: trackId,\n field: property,\n value\n });\n if (res.code !== 200) {\n notify(\"Failed to update \" + property, NotificationType.error);\n return;\n }\n notify(property + \" updated\", NotificationType.success);\n if (callback) {\n callback(value);\n }\n }, () => {\n }, Icons.PEN).then();\n }\n\n static async getUnapprovedTracks() {\n const res = await Api.getAsync(ApiRoutes.getUnapprovedCollabs);\n if (res.code !== 200) {\n notify(\"Error while trying to get unapproved tracks: \" + getErrorMessage(res), NotificationType.error);\n return [];\n }\n return res.data;\n }\n\n static async approveCollab(id: number, name = \"track\") {\n const res = await Api.postAsync(ApiRoutes.approveCollab, {\n id: id,\n });\n if (res.code !== 200) {\n notify(\"Error while trying to approve collab: \" + getErrorMessage(res), NotificationType.error);\n return;\n }\n\n notify(`Collab on ${name} approved`, NotificationType.success);\n const collab = document.querySelector(\".collab[id='\" + id + \"']\");\n if (collab) {\n collab.remove();\n }\n }\n\n static async denyCollab(id: number, name = \"track\") {\n const res = await Api.postAsync(ApiRoutes.denyCollab, {\n id: id,\n });\n if (res.code !== 200) {\n notify(\"Error while trying to deny collab: \" + getErrorMessage(res), NotificationType.error);\n return;\n }\n\n notify(`Collab on ${name} denied`, NotificationType.success);\n const collab = document.querySelector(\".collab[id='\" + id + \"']\");\n if (collab) {\n collab.remove();\n }\n }\n\n static async updateTrackFull(track: Partial) {\n const res = await Api.postAsync(ApiRoutes.updateTrackFull, {\n id: track.id,\n title: track.title,\n collaborators: track.collaborators,\n artistname: track.artistname,\n description: track.description,\n genre: track.genre,\n release_date: track.release_date,\n visibility: track.visibility,\n isrc: track.isrc,\n upc: track.upc,\n price: track.price,\n });\n if (res.code !== 200) {\n notify(\"Error while trying to update track: \" + getErrorMessage(res), NotificationType.error);\n return;\n }\n\n return res.data;\n }\n\n static getTrackEditModal(track: Track) {\n const confirmCallback2 = async (newTrack: Track) => {\n Util.removeModal();\n await TrackActions.updateTrackFull(newTrack);\n notify(\"Track updated\", NotificationType.success);\n reload();\n };\n const cancelCallback2 = () => {\n Util.removeModal();\n };\n const modal = TrackEditTemplates.editTrackModal(track, confirmCallback2, cancelCallback2);\n Ui.addModal(modal);\n }\n}", "export enum Theme {\n light = 'light',\n dark = 'dark',\n flexoki = 'flexoki',\n}\n", "export const UserSettings = {\n notificationCollaboration: \"notification_collaboration\",\n notificationComment: \"notification_comment\",\n notificationFollow: \"notification_follow\",\n notificationLike: \"notification_like\",\n notificationRepost: \"notification_repost\",\n paypalMail: \"paypalMail\",\n publicLikes: \"publicLikes\",\n theme: \"theme\",\n streamingQuality: \"streamingQuality\",\n playFromAutoQueue: \"playFromAutoQueue\",\n};", "import {Api} from \"./Api.ts\";\nimport {notify} from \"../Classes/Ui.ts\";\nimport {Signal} from \"../../fjsc/src/signals.ts\";\nimport {ApiRoutes} from \"./ApiRoutes.ts\";\nimport {User} from \"../Models/DbModels/lyda/User.ts\";\nimport {Log} from \"../Models/DbModels/lyda/Log.ts\";\nimport {currentUser} from \"../state.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\nimport {getErrorMessage} from \"../Classes/Util.ts\";\n\nexport class LydaApi {\n static getLogs(filterState: Signal, successCallback: Function) {\n const errorText = \"Failed to get logs\";\n Api.getAsync(ApiRoutes.getLogs, {\n logLevel: filterState.value,\n offset: 0,\n limit: 50\n }).then(logs => {\n LydaApi.handleResponse(logs, errorText, successCallback);\n });\n\n filterState.subscribe(async (newValue) => {\n Api.getAsync(ApiRoutes.getLogs, {\n logLevel: newValue,\n offset: 0,\n limit: 100\n }).then(logs => {\n LydaApi.handleResponse(logs, errorText, successCallback);\n });\n });\n }\n\n static handleResponse(response: any, errorText: string, successCallback: Function) {\n if (response.code !== 200) {\n notify(errorText, NotificationType.error);\n return;\n }\n successCallback(response.data);\n }\n\n static async deleteUser() {\n return await Api.postAsync(ApiRoutes.deleteUser);\n }\n\n static async updateUser(user: Partial) {\n const res = await Api.postAsync(ApiRoutes.updateUser, { user });\n if (res.code !== 200) {\n notify(\"Failed to update account: \" + getErrorMessage(res), NotificationType.error);\n return false;\n }\n currentUser.value = {\n ...currentUser.value,\n ...user\n };\n notify(\"Account updated\", NotificationType.success);\n return true;\n }\n\n static async exportUser() {\n return await Api.getAsync(ApiRoutes.exportUser);\n }\n}", "import {Api} from \"../Api/Api.ts\";\nimport {\n getErrorMessage,\n getUserSettingValue,\n updateImagesWithSource,\n updateUserSetting,\n Util\n} from \"../Classes/Util.ts\";\nimport {notify, Ui} from \"../Classes/Ui.ts\";\nimport {LydaCache} from \"../Cache/LydaCache.ts\";\nimport {CacheItem} from \"../Cache/CacheItem.ts\";\nimport {Icons} from \"../Enums/Icons.js\";\nimport {Theme} from \"../Enums/Theme.ts\";\nimport {UserSettings} from \"../Enums/UserSettings.ts\";\nimport {MediaFileType} from \"../Enums/MediaFileType.ts\";\nimport {MediaUploader} from \"../Api/MediaUploader.ts\";\nimport {User} from \"../Models/DbModels/lyda/User.ts\";\nimport {Signal} from \"../../fjsc/src/signals.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {Notification} from \"../Models/DbModels/lyda/Notification.ts\";\nimport {LydaApi} from \"../Api/LydaApi.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\nimport {currentQuality, notifications} from \"../state.ts\";\nimport {StreamingQuality} from \"../Enums/StreamingQuality.ts\";\n\nexport class UserActions {\n static async replaceAvatar(user: User, avatar: Signal, loading: Signal) {\n let fileInput = document.createElement(\"input\");\n fileInput.type = \"file\";\n fileInput.accept = \"image/*\";\n fileInput.onchange = async (e) => {\n loading.value = true;\n if (!fileInput.files) {\n return;\n }\n\n const file = fileInput.files![0];\n try {\n await MediaUploader.upload(MediaFileType.userAvatar, user.id, file)\n notify(\"Avatar updated\", NotificationType.success);\n const newSrc = Util.getUserAvatar(user.id);\n updateImagesWithSource(newSrc, avatar.value);\n avatar.value = newSrc;\n } catch (e: any) {\n notify(`Failed to upload avatar: ${e}`, NotificationType.error);\n return;\n } finally {\n loading.value = false;\n }\n };\n fileInput.click();\n }\n\n static async replaceBanner(e: Event, user: User, banner: Signal, loading: Signal) {\n let fileInput = document.createElement(\"input\");\n fileInput.type = \"file\";\n fileInput.accept = \"image/*\";\n fileInput.onchange = async () => {\n loading.value = true;\n if (!fileInput.files) {\n return;\n }\n let file = fileInput.files![0];\n\n try {\n await MediaUploader.upload(MediaFileType.userBanner, user.id, file);\n notify(\"Banner updated\", NotificationType.success);\n const newSrc = Util.getUserBanner(user.id);\n updateImagesWithSource(newSrc, banner.value);\n banner.value = newSrc;\n } catch (e: any) {\n notify(`Failed to upload banner: ${e}`, NotificationType.error);\n return;\n } finally {\n loading.value = false;\n }\n };\n fileInput.click();\n }\n\n static getNotificationsPeriodically() {\n setInterval(async () => {\n await UserActions.getNotifications();\n }, 60000);\n }\n\n static async getNotifications() {\n const newestId = notifications.value.sort((a, b) => b.created_at - a.created_at)[0]?.id;\n let res;\n if (!newestId) {\n res = await Api.getAsync(ApiRoutes.getAllNotifications);\n if (res.code === 200) {\n notifications.value = res.data;\n }\n } else {\n res = await Api.getAsync(ApiRoutes.getAllNotifications, {after: newestId});\n if (res.code === 200) {\n notifications.value = notifications.value.concat(res.data).sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());\n }\n }\n }\n\n static async markNotificationsAsRead(newestTimestamp: Signal, visible: Signal) {\n if (visible.value) {\n await Api.postAsync(ApiRoutes.markAllNotificationsAsRead, {newest: newestTimestamp.value});\n } else {\n await UserActions.getNotifications();\n }\n }\n\n static async setTheme(theme: Theme) {\n let user = await Util.getUserAsync();\n user.settings = updateUserSetting(user, UserSettings.theme, theme);\n LydaCache.set(\"user\", new CacheItem(user));\n await UserActions.setUiTheme(theme);\n }\n\n static async setStreamingQuality(quality: StreamingQuality) {\n currentQuality.value = quality;\n await UserActions.setStringSetting(UserSettings.streamingQuality, quality);\n }\n\n static async setUiTheme(themeName: Theme, onlyLocal = false) {\n const themes = Object.values(Theme);\n if (!themes.includes(themeName)) {\n console.warn(\"Unknown theme: \", themeName);\n return;\n }\n themes.map((t) => {\n if (t === themeName) {\n return;\n }\n Util.removeStylesheet(\"/styles/\" + t + \".css\");\n });\n Util.includeStylesheet(`/styles/${themeName}.css`);\n if (onlyLocal) {\n return;\n }\n\n const res = await Api.postAsync(ApiRoutes.updateUserSetting, {setting: UserSettings.theme, value: themeName});\n if (res.code !== 200) {\n notify(`Failed to update theme: ${getErrorMessage(res)}`, NotificationType.error);\n }\n }\n\n static async setBooleanUserSetting(key: string, value: boolean) {\n const res = await Api.postAsync(ApiRoutes.updateUserSetting, {\n setting: key,\n value\n });\n if (res.code !== 200) {\n notify(\"Failed to update user setting\", NotificationType.error);\n return false;\n }\n return true;\n }\n\n static async toggleBooleanUserSetting(key: string) {\n const user = await Util.getUserAsync();\n const newValue = !getUserSettingValue(user, key);\n if (await UserActions.setBooleanUserSetting(key, newValue)) {\n user.settings = updateUserSetting(user, key, newValue.toString());\n LydaCache.set(\"user\", new CacheItem(user));\n return true;\n }\n return false;\n }\n\n static async togglePlayFromAutoQueue() {\n return await UserActions.toggleBooleanUserSetting(UserSettings.playFromAutoQueue);\n }\n\n static async togglePublicLikes() {\n return await UserActions.toggleBooleanUserSetting(UserSettings.publicLikes);\n }\n\n static async toggleNotificationSetting(key: string) {\n const settingKey = \"notification_\" + key;\n return await UserActions.toggleBooleanUserSetting(settingKey);\n }\n\n static async unverifyUser(id: number) {\n const res = await Api.postAsync(ApiRoutes.unverifyUser, {id});\n if (res.code !== 200) {\n notify(\"Failed to unverify user\", NotificationType.error);\n return false;\n }\n return true;\n }\n\n static async verifyUser(id: number) {\n const res = await Api.postAsync(ApiRoutes.verifyUser, {id});\n if (res.code !== 200) {\n notify(\"Failed to verify user\", NotificationType.error);\n return false;\n }\n return true;\n }\n\n static editDescription(currentDescription: string, successCallback: Function) {\n Ui.getTextAreaInputModal(\"Edit description\", \"Enter your new description\", currentDescription, \"Save\", \"Cancel\", async (description: string) => {\n if (await LydaApi.updateUser({description})) {\n successCallback(description);\n }\n }, () => {\n }, Icons.PEN).then();\n }\n\n static editDisplayname(currentDisplayname: string, successCallback: Function) {\n Ui.getTextInputModal(\"Edit displayname\", \"Enter your new displayname\", currentDisplayname, \"Save\", \"Cancel\", async (displayname: string) => {\n if (await LydaApi.updateUser({displayname})) {\n successCallback(displayname);\n }\n }, () => {\n }, Icons.PEN).then();\n }\n\n static editUsername(currentUsername: string, successCallback: Function) {\n Ui.getTextInputModal(\"Edit username\", \"Enter your new username\", currentUsername, \"Save\", \"Cancel\", async (username: string) => {\n if (await LydaApi.updateUser({username})) {\n successCallback(username);\n }\n }, () => {\n }, Icons.PEN).then();\n }\n\n private static setStringSetting(settingKey: string, value: string) {\n return Api.postAsync(ApiRoutes.updateUserSetting, {setting: settingKey, value});\n }\n}", "import {Icons} from \"./Icons.js\";\n\nexport class Badges {\n static BADGE(name) {\n return Icons.ICON(\"badges/badge_\" + name);\n }\n\n static get STAFF() {\n return Badges.BADGE(\"staff\");\n }\n\n static get SUPPORT_LISTENER() {\n return Badges.BADGE(\"support_listener\");\n }\n\n static get SUPPORT_ENTHUSIAST() {\n return Badges.BADGE(\"support_enthusiast\");\n }\n\n static get SUPPORT_AUDIOPHILE() {\n return Badges.BADGE(\"support_audiophile\");\n }\n\n static get CUTE() {\n return Badges.BADGE(\"cute\");\n }\n\n static get VIP() {\n return Badges.BADGE(\"vip\");\n }\n}", "export class Permissions {\n static canDeleteComments = 'canDeleteComments';\n static canEditListsOfOthers = 'canEditListsOfOthers';\n static canEditTracksOfOthers = 'canEditTracksOfOthers';\n static canBan = 'canBan';\n static canDeleteTracksOfOthers = 'canDeleteTracksOfOthers';\n static canDeleteListsOfOthers = 'canDeleteListsOfOthers';\n static canCalculateRoyalties = 'canCalculateRoyalties';\n static canVerifyUsers = 'canVerifyUsers';\n static canViewLogs = 'canViewLogs';\n static canViewActionLogs = 'canViewActionLogs';\n}\n", "import {AlbumActions} from \"../Actions/AlbumActions.ts\";\nimport {PlaylistActions} from \"../Actions/PlaylistActions.ts\";\nimport {GenericTemplates} from \"./GenericTemplates.ts\";\nimport {Util} from \"../Classes/Util.ts\";\nimport {navigate} from \"../Routing/Router.ts\";\nimport {AnyElement, create, HtmlPropertyValue, StringOrSignal} from \"../../fjsc/src/f2.ts\";\nimport {FJSC} from \"../../fjsc\";\nimport {compute, Signal, signal} from \"../../fjsc/src/signals.ts\";\n\nexport class MenuTemplates {\n static genericMenu(title: HtmlPropertyValue, menuItems: any[]) {\n const indexState = signal(0);\n const menuItemCount = menuItems.length;\n let modal = MenuTemplates.getGenericModalWithSelectedIndex(indexState, title, menuItems);\n const eventListener = (e: KeyboardEvent) => {\n if (e.code === \"ArrowUp\") {\n e.preventDefault();\n if (indexState.value === 0) {\n indexState.value = menuItemCount - 1;\n } else {\n indexState.value = indexState.value - 1;\n }\n } else if (e.code === \"ArrowDown\") {\n e.preventDefault();\n if (indexState.value === menuItemCount - 1) {\n indexState.value = 0;\n } else {\n indexState.value = indexState.value + 1;\n }\n } else if (e.code === \"Enter\") {\n e.preventDefault();\n menuItems[indexState.value].action();\n }\n };\n document.addEventListener(\"keydown\", eventListener);\n return modal;\n }\n\n static getGenericModalWithSelectedIndex(selectedIndex: Signal, title: HtmlPropertyValue, menuItems: any[]) {\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n GenericTemplates.title(title),\n ...menuItems.map((menuItem, itemIndex) => MenuTemplates.menuItem(menuItem.text, menuItem.action, menuItem.icon, selectedIndex, itemIndex))\n ).build();\n }\n\n static menuItem(text: HtmlPropertyValue, action: Function, icon: string, selectedIndex: Signal, index: number) {\n const isSelected = compute(i => i === index, selectedIndex);\n const selectedClass = compute((is): string => is ? \"active\" : \"_\", isSelected);\n\n return FJSC.button({\n text: text as StringOrSignal,\n icon: { icon },\n onclick: action,\n classes: [selectedClass],\n });\n }\n\n static createMenu() {\n const title = \"Create something new\";\n let modal: AnyElement;\n const items = [\n {\n text: \"New Album\",\n icon: \"forms_add_on\",\n action: async () => {\n Util.removeModal(modal);\n await AlbumActions.openNewAlbumModal();\n }\n },\n {\n text: \"New Track\",\n icon: \"upload\",\n action: async () => {\n Util.removeModal(modal);\n navigate(\"upload\");\n }\n },\n {\n text: \"New Playlist\",\n icon: \"playlist_add\",\n action: async () => {\n Util.removeModal(modal);\n await PlaylistActions.openNewPlaylistModal();\n }\n }\n ];\n modal = MenuTemplates.genericMenu(title, items);\n return modal;\n }\n}", "export class FeatureDetector {\n static isMobile(): boolean {\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n }\n}", "import {GenericTemplates} from \"../Templates/GenericTemplates.ts\";\nimport {MenuTemplates} from \"../Templates/MenuTemplates.ts\";\nimport {Util} from \"../Classes/Util.ts\";\nimport {FeatureDetector} from \"../Classes/Helpers/FeatureDetector.ts\";\nimport {Ui} from \"../Classes/Ui.ts\";\nimport {openMenus} from \"../state.ts\";\n\nexport class UiActions {\n static closeModal() {\n const modal = document.querySelector(\".modal-container\");\n if (modal) {\n modal.remove();\n }\n }\n\n static openCreateMenu() {\n const user = Util.getUserAsync();\n if (!user) {\n return;\n }\n let modal = GenericTemplates.modal([MenuTemplates.createMenu()], \"create-menu\");\n Ui.addModal(modal);\n }\n\n static runMobileCheck() {\n if (FeatureDetector.isMobile()) {\n const metaTag = document.createElement(\"meta\");\n metaTag.name = \"viewport\";\n metaTag.content = \"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0\";\n document.getElementsByTagName(\"head\")[0].appendChild(metaTag);\n }\n }\n}", "import {target, Util} from \"../Classes/Util.ts\";\nimport {TrackActions} from \"../Actions/TrackActions.ts\";\nimport {TrackTemplates} from \"./TrackTemplates.ts\";\nimport {UserActions} from \"../Actions/UserActions.ts\";\nimport {GenericTemplates} from \"./GenericTemplates.ts\";\nimport {AlbumTemplates} from \"./AlbumTemplates.ts\";\nimport {Icons as Icons} from \"../Enums/Icons.js\";\nimport {Badges} from \"../Enums/Badges.ts\";\nimport {Links} from \"../Enums/Links.ts\";\nimport {PlaylistTemplates} from \"./PlaylistTemplates.ts\";\nimport {CustomText, truncateText} from \"../Classes/Helpers/CustomText.ts\";\nimport {Permissions} from \"../Enums/Permissions.ts\";\nimport {Images} from \"../Enums/Images.ts\";\nimport {navigate} from \"../Routing/Router.ts\";\nimport {\n AnyElement,\n AnyNode,\n create,\n DomNode,\n HtmlPropertyValue,\n ifjs,\n nullElement,\n StringOrSignal\n} from \"../../fjsc/src/f2.ts\";\nimport {Track} from \"../Models/DbModels/lyda/Track.ts\";\nimport {User} from \"../Models/DbModels/lyda/User.ts\";\nimport {Permission} from \"../Models/DbModels/lyda/Permission.ts\";\nimport {Playlist} from \"../Models/DbModels/lyda/Playlist.ts\";\nimport {Album} from \"../Models/DbModels/lyda/Album.ts\";\nimport {Badge} from \"../Models/DbModels/lyda/Badge.ts\";\nimport {FJSC} from \"../../fjsc\";\nimport {compute, Signal, signal} from \"../../fjsc/src/signals.ts\";\nimport {UiActions} from \"../Actions/UiActions.ts\";\nimport {router} from \"../../main.ts\";\nimport {UserWidgetContext} from \"../Enums/UserWidgetContext.ts\";\nimport {currentUser} from \"../state.ts\";\nimport {Follow} from \"../Models/DbModels/lyda/Follow.ts\";\nimport {Ui} from \"../Classes/Ui.ts\";\nimport {MediaActions} from \"../Actions/MediaActions.ts\";\nimport {MediaFileType} from \"../Enums/MediaFileType.ts\";\n\nexport class UserTemplates {\n static userWidget(user: User|Signal, following: boolean|Signal, extraAttributes: HtmlPropertyValue[] = [], extraClasses: StringOrSignal[] = [], context: UserWidgetContext = UserWidgetContext.unknown) {\n const out = signal(nullElement());\n\n const getWidget = (newUser: User|null) => {\n if (!newUser) {\n return nullElement();\n }\n\n const base = create(\"button\");\n if (extraAttributes) {\n base.attributes(...extraAttributes);\n }\n if (extraClasses) {\n base.classes(...extraClasses);\n }\n out.value = this.userWidgetInternal(context, newUser, base, following);\n }\n\n if (user.constructor === Signal) {\n (user as Signal).subscribe(getWidget);\n getWidget((user as Signal).value);\n } else {\n getWidget(user as User);\n }\n return out;\n }\n\n private static userWidgetInternal(context: UserWidgetContext, user: User, base: DomNode, following: boolean|Signal) {\n const maxDisplaynameLength = [UserWidgetContext.singlePage, UserWidgetContext.list].includes(context) ? 100 : 15;\n const avatarState = signal(Images.DEFAULT_AVATAR);\n if (user.has_avatar) {\n avatarState.value = Util.getUserAvatar(user.id);\n }\n const activeClass = compute((r, p): string => {\n return r && r.path === \"profile\" && p.name === user.username ? \"active\" : \"_\";\n }, router.currentRoute, router.currentParams);\n if (following.constructor !== Signal) {\n following = signal(following as boolean);\n }\n const showFollowButton = compute(u => u && u.id && u.id !== user.id && !following.value, currentUser);\n\n return base\n .classes(\"user-widget\", \"fjsc\", activeClass, \"round-on-tiny-breakpoint\")\n .attributes(\"user_id\", user.id, \"username\", user.username)\n .onclick((e: MouseEvent) => {\n if (e.button === 0 && target(e).tagName.toLowerCase() === \"button\") {\n e.preventDefault();\n navigate(\"profile/\" + user.username);\n }\n })\n .href(Links.PROFILE(user.username))\n .title(user.displayname + \" (@\" + user.username + \")\")\n .children(\n UserTemplates.userIcon(user.id, avatarState),\n create(\"span\")\n .classes(\"text\", \"align-center\", \"nopointer\", \"user-displayname\", \"hideOnTinyBreakpoint\")\n .text(truncateText(user.displayname, maxDisplaynameLength))\n .attributes(\"data-user-id\", user.id)\n .build(),\n create(\"span\")\n .classes(\"text\", \"align-center\", \"text-xsmall\", \"nopointer\", \"user-name\", \"hideOnSmallBreakpoint\")\n .text(\"@\" + user.username)\n .attributes(\"data-user-id\", user.id)\n .build(),\n ifjs(showFollowButton, UserTemplates.followButton(following, user.id, true))\n ).build();\n }\n\n static linkedUser(user_id: number, username: string, displayname: string, avatar: StringOrSignal, collab_type: HtmlPropertyValue, actionButton: AnyNode|null = null, extraAttributes: HtmlPropertyValue[] | undefined = undefined, extraClasses: StringOrSignal[] = []) {\n const noredirect = extraClasses.includes(\"no-redirect\");\n const base = noredirect ? create(\"div\") : create(\"a\");\n if (extraAttributes) {\n base.attributes(...extraAttributes);\n }\n if (extraClasses && extraClasses.length > 0) {\n base.classes(...extraClasses);\n }\n return base\n .classes(\"user-widget\", \"collaborator\", noredirect ? \"_\" : \"clickable\", \"rounded\", \"flex-v\", \"padded-inline\")\n .attributes(\"user_id\", user_id, \"username\", username)\n .onclick(async () => {\n if (noredirect) {\n return;\n }\n navigate(`profile/${username}`);\n })\n .href(Links.PROFILE(username))\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n UserTemplates.userIcon(user_id, avatar),\n create(\"span\")\n .classes(\"text\", \"align-center\", \"nopointer\", \"user-displayname\")\n .text(displayname)\n .attributes(\"data-user-id\", user_id)\n .build(),\n create(\"span\")\n .classes(\"text\", \"align-center\", \"text-small\", \"nopointer\", \"user-name\", \"hideOnSmallBreakpoint\")\n .text(\"@\" + username)\n .attributes(\"data-user-id\", user_id)\n .build(),\n create(\"span\")\n .text(collab_type)\n .classes(\"align-center\")\n .build(),\n actionButton\n ).build(),\n ).build();\n }\n\n static userIcon(user_id: HtmlPropertyValue, avatar: StringOrSignal) {\n return create(\"img\")\n .classes(\"user-icon\", \"user-avatar\", \"align-center\", \"nopointer\")\n .attributes(\"data-user-id\", user_id)\n .attributes(\"src\", avatar)\n .build();\n }\n\n static followButton(following: boolean|Signal, user_id: number, noText = false) {\n if (following.constructor !== Signal) {\n following = signal(following as boolean);\n }\n\n return create(\"div\")\n .classes(\"follow-button\", \"fakeButton\", \"clickable\", \"rounded-max\", \"flex\", \"padded-inline\")\n .attributes(\"user_id\", user_id)\n .children(\n create(\"img\")\n .src(compute((f) => f ? Icons.UNFOLLOW : Icons.FOLLOW, following))\n .classes(\"inline-icon\", \"svg\", \"nopointer\")\n .build(),\n noText ? null : create(\"span\")\n .classes(\"text-small\", \"nopointer\")\n .text(compute((f): string => f ? \"Unfollow\" : \"Follow\", following))\n .build()\n ).onclick(async () => {\n await TrackActions.runFollowFunctionFromElement(user_id, following);\n }).build();\n }\n\n static followsBackIndicator() {\n return create(\"span\")\n .classes(\"padded-inline\", \"rounded-max\", \"text-small\", \"invertedTextWithBackground\")\n .text(\"Follows you\")\n .build();\n }\n\n static trackCards(tracks: Track[], profileId: number, isOwnProfile: boolean) {\n let children = [];\n if (tracks.length === 0) {\n return TrackTemplates.noTracksUploadedYet(isOwnProfile);\n } else {\n children = tracks.map(track => TrackTemplates.trackCard(track, profileId));\n }\n\n return TrackTemplates.trackCardsContainer(children);\n }\n\n static unapprovedTracksLink() {\n const unapprovedTracks = signal([]);\n TrackActions.getUnapprovedTracks().then(tracks => {\n unapprovedTracks.value = tracks;\n });\n const link = signal(create(\"div\").build());\n unapprovedTracks.onUpdate = (tracks: Track[]) => {\n link.value = tracks.length === 0 ? nullElement() : GenericTemplates.action(Icons.APPROVAL, \"Unapproved tracks\", \"unapproved-tracks\", async (e: Event) => {\n e.preventDefault();\n navigate(\"unapproved-tracks\");\n }, [], [], Links.LINK(\"unapproved-tracks\"));\n };\n\n return link;\n }\n\n static profile(isOwnProfile: boolean, user: User, permissions: Permission[]) {\n const selfUser = currentUser.value ?? {\n id: 0,\n };\n const following = user.follows?.some((f: Follow) => {\n return user ? f.following_user_id === selfUser.id : false;\n }) ?? false;\n const followsBack = user.following?.some((f: Follow) => {\n return user ? f.user_id === selfUser.id : false;\n }) ?? false;\n\n return [\n UserTemplates.userActionsContainer(isOwnProfile),\n UserTemplates.profileHeader(user, isOwnProfile),\n UserTemplates.profileInfo(user, isOwnProfile, permissions, following, followsBack)\n ];\n }\n\n static userActionsContainer(isOwnProfile: boolean) {\n if (!isOwnProfile) {\n return create(\"div\").build();\n }\n\n return create(\"div\")\n .classes(\"flex\", \"fullWidth\")\n .children(\n GenericTemplates.newTrackButton([\"hideOnSmallBreakpoint\"]),\n GenericTemplates.newAlbumButton([\"hideOnSmallBreakpoint\"]),\n GenericTemplates.newPlaylistButton([\"hideOnSmallBreakpoint\"]),\n FJSC.button({\n classes: [\"showOnSmallBreakpoint\", \"positive\"],\n text: \"New\",\n icon: { icon: \"add\" },\n onclick: UiActions.openCreateMenu\n }),\n FJSC.button({\n text: \"Settings\",\n icon: { icon: \"settings\" },\n onclick: async () => {\n navigate(\"settings\");\n }\n }),\n FJSC.button({\n text: \"Statistics\",\n icon: { icon: \"finance\" },\n onclick: async () => {\n navigate(\"statistics\");\n }\n }),\n UserTemplates.unapprovedTracksLink(),\n ).build();\n }\n\n static verificationBadge() {\n return create(\"div\")\n .classes(\"verification-badge\")\n .children(\n create(\"img\")\n .attributes(\"src\", Icons.VERIFIED)\n .attributes(\"alt\", \"Verified\")\n .attributes(\"title\", \"Verified\")\n .build()\n ).build();\n }\n\n static profileHeader(user: User, isOwnProfile: boolean) {\n const avatarLoading = signal(false);\n const bannerLoading = signal(false);\n const userBanner = signal(Images.DEFAULT_BANNER);\n if (user.has_banner) {\n userBanner.value = Util.getUserBanner(user.id);\n }\n const userAvatar = signal(Images.DEFAULT_AVATAR);\n if (user.has_avatar) {\n userAvatar.value = Util.getUserAvatar(user.id);\n }\n const bannerContainer = create(\"div\")\n .classes(\"banner-container\", \"relative\", isOwnProfile ? \"clickable\" : \"_\", isOwnProfile ? \"blurOnParentHover\" : \"_\")\n .onclick(() => Ui.showImageModal(userBanner))\n .children(\n create(\"img\")\n .classes(\"nopointer\", \"user-banner\", \"banner-image\")\n .attributes(\"data-user-id\", user.id)\n .src(userBanner)\n .alt(user.username)\n .build()\n ).build();\n\n return create(\"div\")\n .classes(\"profile-header\")\n .children(\n bannerContainer,\n ifjs(isOwnProfile, create(\"div\")\n .classes(\"hidden\", \"showOnParentHover\", \"centeredInParent\", \"flex\")\n .children(\n UserTemplates.bannerDeleteButton(user, userBanner, bannerLoading),\n UserTemplates.bannerReplaceButton(user, userBanner, bannerLoading)\n ).build()),\n ifjs(bannerLoading, create(\"div\")\n .classes(\"loader\", \"loader-small\", \"centeredInParent\", \"hidden\")\n .attributes(\"id\", \"banner-loader\")\n .build()),\n create(\"div\")\n .classes(\"header-info-container\", \"flex\")\n .children(\n create(\"div\")\n .classes(\"avatar-container\", \"relative\", isOwnProfile ? \"pointer\" : \"_\")\n .onclick(() => Ui.showImageModal(userAvatar))\n .onmouseover(() => {\n if (!isOwnProfile) {\n return;\n }\n })\n .onmouseleave(() => {\n if (!isOwnProfile) {\n return;\n }\n })\n .children(\n create(\"img\")\n .classes(\"nopointer\", \"user-avatar\", \"avatar-image\", isOwnProfile ? \"blurOnParentHover\" : \"_\")\n .attributes(\"data-user-id\", user.id)\n .attributes(\"src\", userAvatar)\n .attributes(\"alt\", user.username)\n .build(),\n ifjs(isOwnProfile, create(\"div\")\n .classes(\"hidden\", \"showOnParentHover\", \"centeredInParent\", \"flex\")\n .children(\n UserTemplates.avatarDeleteButton(user, userAvatar, avatarLoading),\n UserTemplates.avatarReplaceButton(user, userAvatar, avatarLoading)\n ).build()),\n ifjs(avatarLoading, create(\"div\")\n .classes(\"loader\", \"loader-small\", \"centeredInParent\", \"hidden\")\n .attributes(\"id\", \"avatar-loader\")\n .build())\n ).build(),\n ).build()\n ).build();\n }\n\n static bannerReplaceButton(user: User, userBanner: Signal = signal(\"\"), bannerLoading: Signal = signal(false)) {\n return GenericTemplates.uploadIconButton(\"banner-upload-button\", (e: Event) => UserActions.replaceBanner(e, user, userBanner, bannerLoading), [\"positive\"]);\n }\n\n static avatarDeleteButton(user: User, userAvatar: Signal = signal(\"\"), avatarLoading: Signal = signal(false)) {\n return GenericTemplates.deleteIconButton(\"avatar-delete-button\", () => MediaActions.deleteMedia(MediaFileType.userAvatar, user.id, userAvatar, avatarLoading));\n }\n\n static avatarReplaceButton(user: User, userAvatar: Signal = signal(\"\"), avatarLoading: Signal = signal(false)) {\n return GenericTemplates.uploadIconButton(\"avatar-upload-button\", () => UserActions.replaceAvatar(user, userAvatar, avatarLoading), [\"positive\"]);\n }\n\n static bannerDeleteButton(user: User, userBanner: Signal = signal(\"\"), bannerLoading: Signal = signal(false)) {\n return GenericTemplates.deleteIconButton(\"banner-delete-button\", () => MediaActions.deleteMedia(MediaFileType.userBanner, user.id, userBanner, bannerLoading));\n }\n\n static profileInfo(user: User, isOwnProfile: boolean, permissions: Permission[], following: boolean, followsBack: boolean) {\n const verified = signal(user.verified);\n const canVerify = compute(v => !v && permissions.some(p => p.name === Permissions.canVerifyUsers), verified);\n const canUnverify = compute(v => v && permissions.some(p => p.name === Permissions.canVerifyUsers), verified);\n const hasUnverifiedPrimaryEmail = isOwnProfile && user.emails && user.emails.some(e => e.primary && !e.verified);\n const hasBadges = user.badges && user.badges.length > 0;\n\n return create(\"div\")\n .classes(\"name-container\", \"flex-v\")\n .children(\n UserTemplates.displayname(user, isOwnProfile),\n create(\"div\")\n .classes(\"flex\", \"align-children\")\n .children(\n UserTemplates.username(user, isOwnProfile),\n ifjs(hasBadges, UserTemplates.badges(user.badges ?? [])),\n ifjs(verified, UserTemplates.verificationBadge()),\n ifjs(canVerify, FJSC.button({\n text: \"Verify\",\n icon: { icon: \"verified\" },\n classes: [\"positive\"],\n onclick: async () => {\n await UserActions.verifyUser(user.id);\n verified.value = true;\n }\n })),\n ifjs(canUnverify, FJSC.button({\n text: \"Unverify\",\n icon: { icon: \"close\" },\n classes: [\"negative\"],\n onclick: async () => {\n await UserActions.unverifyUser(user.id);\n verified.value = false;\n }\n })),\n !isOwnProfile && currentUser.value ? UserTemplates.followButton(following, user.id) : null,\n !isOwnProfile && followsBack ? UserTemplates.followsBackIndicator() : null,\n ).build(),\n UserTemplates.userDescription(user, isOwnProfile),\n ifjs(hasUnverifiedPrimaryEmail, create(\"div\")\n .classes(\"card\", \"padded\", \"flex\", \"warning\", \"align-children\")\n .children(\n GenericTemplates.icon(\"warning\", true, [\"warning\"]),\n create(\"span\")\n .text(\"Your primary email is not verified. Please verify it to ensure you can recover your account.\")\n .build(),\n FJSC.button({\n text: \"Go to settings\",\n icon: { icon: \"settings\" },\n classes: [\"positive\"],\n onclick: async () => {\n navigate(\"settings\");\n }\n })\n ).build())\n ).build();\n }\n\n static badges(badges: Badge[]) {\n return create(\"div\")\n .classes(\"flex\", \"small-gap\", \"limitToContentWidth\", \"rounded\", \"hideOnSmallBreakpoint\")\n .children(\n ...badges.map(badge => UserTemplates.badge(badge))\n ).build();\n }\n\n static badge(badge: Badge) {\n let addClasses = [];\n const colorBadges = [\"staff\", \"cute\", \"vip\"];\n if (colorBadges.includes(badge.name)) {\n addClasses.push(\"no-filter\");\n }\n\n return create(\"img\")\n .attributes(\"src\", Badges.BADGE(badge.name))\n .attributes(\"alt\", badge.name)\n .attributes(\"title\", badge.description)\n .classes(\"icon\", \"badge\", \"svg\", ...addClasses)\n .build();\n }\n\n static albumCards(albums: Album[], isOwnProfile: boolean) {\n let children = [];\n if (albums.length === 0) {\n return AlbumTemplates.noAlbumsYet(isOwnProfile);\n } else {\n children = albums.map((album: Album) => AlbumTemplates.albumCard(album));\n }\n\n return AlbumTemplates.albumCardsContainer(children);\n }\n\n static playlistCards(playlists: Playlist[], isOwnProfile: boolean) {\n let children = [];\n if (playlists.length === 0) {\n return PlaylistTemplates.noPlaylistsYet(isOwnProfile);\n } else {\n children = playlists.map((playlist: Playlist) => PlaylistTemplates.playlistCard(playlist));\n }\n\n return PlaylistTemplates.playlistCardsContainer(children);\n }\n\n static libraryPage(albums: Album[], playlists: Playlist[], tracks: Track[], user: User) {\n const container = create(\"div\").build();\n\n const tracksContainer = UserTemplates.libraryTracks(tracks, user);\n const albumsContainer = UserTemplates.libraryAlbums(albums);\n const playlistsContainer = UserTemplates.libraryPlaylists(playlists);\n\n const tabs = [\"Tracks\", \"Albums\", \"Playlists\"];\n const tabContents = [tracksContainer, albumsContainer, playlistsContainer];\n const tabSelector = GenericTemplates.tabSelector(tabs, (i: number) => {\n tabContents.forEach((c, j) => {\n c.value.style.display = i === j ? \"flex\" : \"none\";\n });\n }, 0);\n\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n container,\n tabSelector,\n tracksContainer,\n albumsContainer,\n playlistsContainer\n ).build();\n }\n\n static libraryAlbums(albums: Album[]) {\n const template = signal(create(\"div\").build());\n const update = (albums: Album[]) => {\n let children;\n if (albums.length === 0) {\n children = [\n create(\"span\")\n .text(\"Like some albums to see them here\")\n .build()\n ];\n } else {\n children = albums.map((album: Album) => AlbumTemplates.albumCard(album));\n }\n\n template.value = AlbumTemplates.albumCardsContainer(children);\n };\n update(albums);\n\n return template;\n }\n\n static libraryTracks(tracks: Track[], user: User) {\n const template = signal(create(\"div\").build());\n const update = (tracks: Track[]) => {\n let children;\n if (tracks.length === 0) {\n children = [\n create(\"span\")\n .text(\"Like some tracks to see them here\")\n .build()\n ];\n } else {\n children = tracks.map((track: Track) => TrackTemplates.trackCard(track, user.id));\n }\n\n template.value = TrackTemplates.trackCardsContainer(children);\n };\n update(tracks);\n\n return template;\n }\n\n static libraryPlaylists(playlists: Playlist[]) {\n const template = signal(create(\"div\").build());\n\n const update = (playlists: Playlist[]) => {\n let children;\n if (playlists.length === 0) {\n children = [\n create(\"span\")\n .text(\"Like some playlists to see them here\")\n .build()\n ];\n } else {\n children = playlists.map((playlist: Playlist) => PlaylistTemplates.playlistCard(playlist));\n }\n\n template.value = PlaylistTemplates.playlistCardsContainer(children);\n };\n update(playlists);\n\n return template;\n }\n\n static username(user: User, isOwnProfile: boolean) {\n const nameState = signal(user.username);\n const displayedName = compute(name => `@${name}`, nameState);\n\n const base = create(\"span\")\n .classes(\"username\", \"user-name\")\n .attributes(\"data-user-id\", user.id)\n .text(displayedName);\n\n if (isOwnProfile) {\n base.onclick(async () => {\n UserActions.editUsername(user.username, (newUsername: string) => {\n nameState.value = newUsername;\n });\n });\n base.classes(\"clickable\");\n }\n\n return base.build();\n }\n\n static displayname(user: User, isOwnProfile: boolean) {\n const nameState = signal(user.displayname);\n\n const base = create(\"h1\")\n .classes(\"display_name\", \"user-displayname\")\n .attributes(\"data-user-id\", user.id)\n .text(nameState);\n\n if (isOwnProfile) {\n base.onclick(async () => {\n UserActions.editDisplayname(user.displayname, (newDisplayname: string) => {\n nameState.value = newDisplayname;\n });\n });\n base.classes(\"clickable\");\n }\n\n return base.build();\n }\n\n static userDescription(user: User, isOwnProfile: boolean) {\n if (user.description === null || user.description === \"\") {\n return create(\"div\").build();\n }\n const description = create(\"span\")\n .classes(\"break-lines\")\n .id(\"user-description\")\n .html(CustomText.renderToHtml(user.description))\n .build();\n\n setTimeout(() => {\n if (description.clientHeight < description.scrollHeight) {\n description.classList.add(\"overflowing\");\n }\n }, 100);\n\n return create(\"div\")\n .classes(\"card\", \"rounded\", \"padded\", \"flex-v\", \"limitToContentWidth\")\n .children(\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n description,\n isOwnProfile ? UserTemplates.editDescriptionButton(user.description) : null\n ).build()\n ).build();\n }\n\n static editDescriptionButton(currentDescription: string) {\n const descState = signal(currentDescription);\n\n return FJSC.button({\n icon: { icon: \"edit_note\" },\n text: \"Edit description\",\n onclick: async (e: Event) => {\n e.preventDefault();\n UserActions.editDescription(descState.value, (newDescription: string) => {\n const description = document.querySelector(\"#user-description\");\n if (!description) {\n return;\n }\n description.innerHTML = CustomText.renderToHtml(newDescription);\n descState.value = newDescription;\n });\n }\n });\n }\n\n static notPublicLibrary(name: string) {\n return create(\"div\")\n .classes(\"card\", \"rounded\", \"padded\", \"flex-v\")\n .children(\n create(\"span\")\n .classes(\"text\")\n .text(`Liked content from user \"${name}\" is not public`)\n .build()\n ).build();\n }\n}", "export class NavActions {\n static openBurgerMenu() {\n const menu = document.querySelector(\".burger-menu-content\");\n menu.classList.remove(\"hidden\");\n const pageContainer = document.querySelector(\".page-container\");\n pageContainer.classList.add(\"nopointer\");\n }\n\n static closeBurgerMenu() {\n const menu = document.querySelector(\".burger-menu-content\");\n menu.classList.add(\"hidden\");\n const pageContainer = document.querySelector(\".page-container\");\n pageContainer.classList.remove(\"nopointer\");\n }\n}", "import {AnyElement, create, ifjs} from \"../../fjsc/src/f2.ts\";\nimport {Api} from \"../Api/Api.ts\";\nimport {notify} from \"../Classes/Ui.ts\";\nimport {navigate} from \"../Routing/Router.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {compute, Signal, signal} from \"../../fjsc/src/signals.ts\";\nimport {GenericTemplates} from \"./GenericTemplates.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\nimport {SearchResult} from \"../Models/SearchResult.ts\";\nimport {Util} from \"../Classes/Util.ts\";\nimport {Images} from \"../Enums/Images.ts\";\nimport {SearchContext} from \"../Enums/SearchContext.ts\";\nimport {FJSC} from \"../../fjsc\";\nimport {router} from \"../../main.ts\";\n\nexport class SearchTemplates {\n static search(context: SearchContext) {\n const results = signal([]);\n const selectedResult = signal(null);\n const resultsShown = compute(r => r.length > 0, results);\n\n let q = \"\";\n const urlParams = new URLSearchParams(window.location.search);\n if (!(router.currentRoute.value?.path === \"search\" && context === SearchContext.navBar)) {\n q = urlParams.get(\"q\") ?? \"\";\n }\n const currentSearch = signal(q ?? \"\");\n currentSearch.subscribe((newValue, changed) => {\n if (!changed) {\n return;\n }\n urlParams.set(\"q\", newValue);\n window.history.pushState({}, \"\", \"?\" + urlParams.toString());\n });\n\n return create(\"div\")\n .classes(\"search\", \"relative\", \"flex-v\", \"align-center\")\n .children(\n SearchTemplates.searchInput(results, selectedResult, currentSearch, resultsShown, context),\n SearchTemplates.searchResults(results, selectedResult, resultsShown, currentSearch, context)\n ).build();\n }\n\n static searchInput(results: Signal, selectedResult: Signal, currentSearch: Signal, resultsShown: Signal, context: SearchContext) {\n const debounce = 200;\n let timeout: Timer | undefined;\n let searchCount = 0;\n\n async function getResults() {\n if (currentSearch.value.length === 0) {\n return;\n }\n searchCount++;\n results.value = [];\n const currentSearchCount = searchCount;\n const endpoints = [ApiRoutes.searchTracks, ApiRoutes.searchAlbums, ApiRoutes.searchPlaylists, ApiRoutes.searchUsers];\n const promises = endpoints.map(async (endpoint) => {\n const res = await Api.getAsync(endpoint, {\n search: currentSearch.value\n });\n\n if (res.code !== 200) {\n notify(\"Failed to search, status code \" + res.code, NotificationType.error);\n return;\n }\n\n if (currentSearchCount !== searchCount) {\n return;\n }\n results.value = results.value.concat(res.data);\n });\n await Promise.all(promises);\n }\n const contextClasses = context === SearchContext.searchPage ? [\"fullWidth\"] : []\n getResults().then();\n\n return create(\"div\")\n .classes(\"search-input-container\", \"relative\", ...contextClasses)\n .children(\n GenericTemplates.icon(\"search\", true, [\"inline-icon\", \"svg\", \"search-icon\"]),\n GenericTemplates.icon(\"close\", true, [\"inline-icon\", \"svg\", \"clear-icon\", \"clickable\"], \"Clear search\", () => {\n currentSearch.value = \"\";\n resultsShown.value = false;\n }),\n create(\"input\")\n .classes(\"fjsc\", \"search-input\")\n .placeholder(\"Search\")\n .value(currentSearch)\n .onclick(() => {\n resultsShown.value = true;\n })\n .onkeydown((e: KeyboardEvent) => {\n const list = results.value;\n const pressedKey = e.key;\n if (pressedKey === \"ArrowDown\") {\n e.preventDefault();\n SearchTemplates.selectNextResult(selectedResult, list);\n } else if (pressedKey === \"ArrowUp\") {\n e.preventDefault();\n SearchTemplates.selectPreviousResult(selectedResult, list);\n } else if (pressedKey === \"Escape\") {\n resultsShown.value = false;\n }\n })\n .onkeyup(async (e: KeyboardEvent) => {\n const pressedKey = e.key;\n if (pressedKey === \"Enter\") {\n if (selectedResult.value === null) {\n resultsShown.value = false;\n navigate(\"search?q=\" + currentSearch.value);\n return;\n }\n const result = results.value.find(r => r.id === selectedResult.value);\n if (!result) {\n return;\n }\n resultsShown.value = false;\n navigate(result.url);\n return;\n }\n\n const target = e.target as HTMLInputElement;\n let search = target.value;\n if (pressedKey !== \"Backspace\" && pressedKey !== \"Delete\" && pressedKey.length > 1) {\n return;\n }\n\n if (search.trim().length === 0) {\n results.value = [];\n currentSearch.value = \"\";\n return;\n }\n currentSearch.value = search;\n\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n timeout = setTimeout(() => getResults(), debounce);\n }).build()\n ).build();\n }\n\n private static selectNextResult(selectedResult: Signal, list: SearchResult[]) {\n if (selectedResult.value === null) {\n selectedResult.value = list[0].id;\n return;\n }\n const index = list.findIndex(l => l.id === selectedResult.value);\n if (index === list.length - 1) {\n selectedResult.value = list[0].id;\n return;\n }\n selectedResult.value = list[index + 1].id;\n }\n\n private static selectPreviousResult(selectedResult: Signal, list: SearchResult[]) {\n if (selectedResult.value === null) {\n selectedResult.value = list[list.length - 1].id;\n return;\n }\n const index = list.findIndex(l => l.id === selectedResult.value);\n if (index === 0) {\n selectedResult.value = list[list.length - 1].id;\n return;\n }\n selectedResult.value = list[index - 1].id;\n }\n\n static searchResults(results: Signal, selectedResult: Signal, resultsShown: Signal, currentSearch: Signal, context: SearchContext): Signal {\n if (context === SearchContext.navBar) {\n return compute((r) => SearchTemplates.searchResultsList(r, selectedResult, resultsShown, currentSearch), results);\n } else {\n return compute((r) => SearchTemplates.searchResultsCards(r, selectedResult, resultsShown), results);\n }\n }\n\n static searchResultsList(searchResults: SearchResult[], selectedResult: Signal, resultsShown: Signal, currentSearch: Signal) {\n const exactMatches = searchResults.filter(r => r.exactMatch);\n const partialMatches = searchResults.filter(r => !r.exactMatch);\n const showClass = compute((s: boolean): string => s ? \"_\" : \"hidden\", resultsShown);\n\n return create(\"div\")\n .classes(\"search-results-popout\", showClass)\n .children(\n create(\"div\")\n .classes(\"flex-v\", \"nogap\")\n .children(\n create(\"div\")\n .classes(\"padded\")\n .children(\n FJSC.button({\n icon: { icon: \"manage_search\" },\n text: \"Open search\",\n classes: [\"positive\"],\n onclick: () => {\n resultsShown.value = false;\n navigate(\"search?q=\" + currentSearch.value);\n }\n }),\n ).build(),\n ifjs(exactMatches.length > 0,\n create(\"span\")\n .classes(\"search-result-header\")\n .text(\"Exact Matches\")\n .build()),\n ...exactMatches.map(result => {\n return this.searchResult(result, selectedResult, resultsShown, SearchContext.navBar);\n }),\n ifjs(partialMatches.length > 0,\n create(\"span\")\n .classes(\"search-result-header\")\n .text(\"Partial Matches\")\n .build()),\n ...partialMatches.map(result => {\n return this.searchResult(result, selectedResult, resultsShown, SearchContext.navBar);\n })\n ).build()\n ).build();\n }\n\n static searchResultsCards(searchResults: SearchResult[], selectedResult: Signal, resultsShown: Signal) {\n const groups: Record = {\n \"Albums\": searchResults.filter(r => r.type === \"album\"),\n \"Tracks\": searchResults.filter(r => r.type === \"track\"),\n \"Users\": searchResults.filter(r => r.type === \"user\"),\n \"Playlists\": searchResults.filter(r => r.type === \"playlist\")\n };\n Object.keys(groups).forEach(group => {\n if (groups[group].length === 0) {\n delete groups[group];\n }\n });\n\n return create(\"div\")\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n ifjs(searchResults.length === 0, create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"span\")\n .classes(\"color-dim\")\n .text(\"Nothing here. Try a different search?\")\n .build()\n ).build()),\n ...Object.keys(groups).map(group => {\n return create(\"div\")\n .classes(\"flex-v\", \"small-gap\", \"card\", \"search-results-card\")\n .children(\n create(\"h2\")\n .text(group)\n .build(),\n ...groups[group].sort((a, b) => a.exactMatch && !b.exactMatch ? 1 : b.exactMatch && !a.exactMatch ? -1 : 0).map(result => {\n return this.searchResult(result, selectedResult, resultsShown, SearchContext.searchPage);\n })\n ).build();\n })\n ).build()\n ).build();\n }\n\n static searchResult(searchResult: SearchResult, selectedResult: Signal, resultsShown: Signal, context: SearchContext) {\n const addClass = compute((sr): string => sr === searchResult.id ? \"selected\" : \"_\", selectedResult);\n let elementReference: AnyElement;\n selectedResult.subscribe((newId) => {\n if (newId === searchResult.id) {\n elementReference.scrollIntoView({behavior: \"smooth\", block: \"nearest\"});\n }\n });\n let display = searchResult.display;\n if (searchResult.display.length > 50) {\n display = searchResult.display.substring(0, 50) + \"...\";\n }\n let subtitle = searchResult.subtitle;\n if (subtitle && subtitle.length > 50) {\n subtitle = subtitle.substring(0, 50) + \"...\";\n }\n\n const imageGetterMap: Record = {\n \"user\": Util.getUserAvatar,\n \"track\": Util.getTrackCover,\n \"album\": Util.getAlbumCover,\n \"playlist\": Util.getPlaylistCover,\n };\n const image = signal(Images.DEFAULT_COVER_TRACK);\n if (searchResult.hasImage) {\n image.value = imageGetterMap[searchResult.type](searchResult.id);\n }\n const contextClasses = context === SearchContext.searchPage ? [\"fjsc\", \"fullWidth\"] : [\"_\"]\n\n elementReference = create(context === SearchContext.navBar ? \"div\" : \"button\")\n .classes(\"search-result\", \"space-outwards\", \"padded\", \"flex\", addClass, ...contextClasses)\n .onclick(async () => {\n navigate(searchResult.url);\n resultsShown.value = false;\n })\n .children(\n create(\"div\")\n .classes(\"flex\", \"noflexwrap\")\n .children(\n create(\"span\")\n .classes(\"search-result-image\")\n .children(\n create(\"img\")\n .src(image)\n .build()\n ).build(),\n create(\"div\")\n .classes(\"flex-v\", \"nogap\", \"search-result-text\")\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n ifjs(searchResult.exactMatch, FJSC.icon({\n icon: \"star\",\n classes: [\"nopointer\", \"svg\", \"inline-icon\"]\n })),\n create(\"span\")\n .classes(\"search-result-display\")\n .text(display)\n .build(),\n ).build(),\n create(\"span\")\n .classes(\"search-result-subtitle\", \"text-xsmall\")\n .text(subtitle)\n .build(),\n ).build(),\n ).build(),\n create(\"span\")\n .classes(\"search-result-type\", \"hideOnSmallBreakpoint\", \"padded-inline\", searchResult.type)\n .text(searchResult.type)\n .build()\n ).build();\n return elementReference;\n }\n\n static searchPage() {\n return SearchTemplates.search(SearchContext.searchPage);\n }\n}", "import {NavTemplates} from \"../../Templates/NavTemplates.ts\";\nimport {GenericTemplates} from \"../../Templates/GenericTemplates.ts\";\nimport {NotificationReference} from \"../../Models/NotificationReference.ts\";\nimport {Notification} from \"../../Models/DbModels/lyda/Notification.ts\";\n\nexport class NotificationParser {\n static parse(notification: Notification) {\n const messageParts = NotificationParser.getMessageParts(notification.message);\n const elements = [];\n for (let part of messageParts) {\n if (part.type === \"text\") {\n elements.push(GenericTemplates.textWithHtml(part.text));\n } else {\n if (notification.references) {\n const relativeLink = `/${part.type}/${NotificationParser.getLinkIdentifierByType(part.type, part.id, notification.references)}`;\n const link = NavTemplates.notificationLink(relativeLink, NotificationParser.getDisplayTextByType(part.type, part.id, notification.references));\n elements.push(link);\n }\n }\n }\n return elements;\n }\n\n static getDisplayTextByType(type: string, id: any, refs: NotificationReference[]) {\n switch (type) {\n case \"profile\":\n return refs.find(item => item.id === id)?.object.username;\n case \"track\":\n return refs.find(item => item.id === id)?.object.title;\n case \"album\":\n return refs.find(item => item.id === id)?.object.title;\n case \"playlist\":\n return refs.find(item => item.id === id)?.object.title;\n }\n return id;\n }\n\n static getLinkIdentifierByType(type: string, id: any, refs: NotificationReference[]) {\n switch (type) {\n case \"profile\":\n return refs.find(item => item.id === id)?.object.username;\n }\n return id;\n }\n\n static getMessageParts(message: string): { type: string, text?: string, id?: number }[] {\n const entities: { [key: string]: string } = {\n \"u\": \"profile\",\n \"t\": \"track\",\n \"a\": \"album\",\n \"p\": \"playlist\",\n };\n\n const result: { type: string, text?: string, id?: number }[] = [];\n\n // Regex to match `{entity:id|text}` pattern\n const regex = /\\{([utap]:\\d+)}/g;\n\n let lastIndex = 0;\n let match;\n\n // Iterating over all matches in the message string\n while ((match = regex.exec(message)) !== null) {\n const [fullMatch, entityId] = match;\n const [entity, id] = entityId.split(':');\n\n // Push plain text before the match\n if (match.index > lastIndex) {\n const plainText = message.slice(lastIndex, match.index);\n result.push({ type: 'text', text: plainText });\n }\n\n // Push matched tag with its parsed details\n if (entities[entity]) {\n result.push({\n type: entities[entity],\n id: parseInt(id),\n });\n }\n\n // Update the last index pointer\n lastIndex = match.index + fullMatch.length;\n }\n\n // Push remaining plain text after the last match\n if (lastIndex < message.length) {\n result.push({ type: 'text', text: message.slice(lastIndex) });\n }\n\n return result;\n }\n}", "import {Icons} from \"../Enums/Icons.js\";\nimport {UserTemplates} from \"./UserTemplates.ts\";\nimport {UserActions} from \"../Actions/UserActions.ts\";\nimport {NavActions} from \"../Actions/NavActions.ts\";\nimport {GenericTemplates} from \"./GenericTemplates.ts\";\nimport {SearchTemplates} from \"./SearchTemplates.ts\";\nimport {NotificationParser} from \"../Classes/Helpers/NotificationParser.ts\";\nimport {AuthActions} from \"../Actions/AuthActions.ts\";\nimport {Time} from \"../Classes/Helpers/Time.ts\";\nimport {copy, Util} from \"../Classes/Util.ts\";\nimport {navigate, reload} from \"../Routing/Router.ts\";\nimport {AnyNode, create, ifjs, signalMap, StringOrSignal} from \"../../fjsc/src/f2.ts\";\nimport {compute, signal} from \"../../fjsc/src/signals.ts\";\nimport {Notification} from \"../Models/DbModels/lyda/Notification.ts\";\nimport {FJSC} from \"../../fjsc\";\nimport {router} from \"../../main.ts\";\nimport {UserWidgetContext} from \"../Enums/UserWidgetContext.ts\";\nimport {currentUser, notifications} from \"../state.ts\";\nimport {SearchContext} from \"../Enums/SearchContext.ts\";\n\nexport class NavTemplates {\n static navTop() {\n currentUser.subscribe(async () => {\n await UserActions.getNotifications();\n });\n\n return create(\"nav\")\n .id(\"navTop\")\n .children(\n NavTemplates.navLogo(),\n NavTemplates.burgerMenu(),\n NavTemplates.burgerMenuContent(),\n create(\"div\")\n .classes(\"flex\", \"flex-grow\")\n .children(\n NavTemplates.navButton(\"following\", \"Feed\", \"rss_feed\", async () => {\n navigate(\"following\");\n }),\n NavTemplates.navButton(\"explore\", \"Explore\", \"explore\", async () => {\n navigate(\"explore\");\n }),\n NavTemplates.navButton(\"library\", \"Library\", \"category\", async () => {\n navigate(\"library\");\n }),\n SearchTemplates.search(SearchContext.navBar),\n ).build(),\n ifjs(currentUser, NavTemplates.accountSection()),\n ifjs(currentUser, NavTemplates.notSignedInNote(), true)\n ).build();\n }\n\n static navLogo() {\n return create(\"div\")\n .classes(\"nav-logo\", \"hideOnMidBreakpoint\", \"pointer\")\n .onclick(reload)\n .children(\n GenericTemplates.icon(Icons.LYDA, true, [\"icon\", \"svg\"]),\n ).build();\n }\n\n static burgerMenu() {\n return create(\"div\")\n .classes(\"burger-menu\", \"flexOnMidBreakpoint\", \"flex\", \"clickable\")\n .onclick(NavActions.openBurgerMenu)\n .children(\n GenericTemplates.icon(Icons.BURGER, true, [\"nopointer\", \"icon\", \"svg\", \"align-center\"], \"Open Menu\")\n ).build();\n }\n\n static burgerMenuContent() {\n return create(\"div\")\n .classes(\"burger-menu-content\", \"hidden\", \"padded-page\", \"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex\", \"clickable\", \"burger-menu-topbar\")\n .onclick(NavActions.closeBurgerMenu)\n .children(\n create(\"div\")\n .children(\n create(\"img\")\n .classes(\"icon\", \"svg\")\n .attributes(\"src\", Icons.LYDA, \"alt\", \"Lyda\")\n .build()\n ).build(),\n create(\"div\")\n .classes(\"mobile-menu-close\")\n .children(\n create(\"img\")\n .classes(\"icon\", \"svg\", \"nopointer\")\n .attributes(\"src\", Icons.X, \"alt\", \"X\")\n .build(),\n ).build(),\n ).build(),\n NavTemplates.navButtonInBurger(\"following\", \"Feed\", \"rss_feed\", async () => {\n NavActions.closeBurgerMenu();\n navigate(\"following\");\n }),\n NavTemplates.navButtonInBurger(\"explore\", \"Explore\", \"explore\", async () => {\n NavActions.closeBurgerMenu();\n navigate(\"explore\");\n }),\n NavTemplates.navButtonInBurger(\"library\", \"Library\", \"category\", async () => {\n NavActions.closeBurgerMenu();\n navigate(\"library\");\n }),\n ).build();\n }\n\n static navButton(id: string, text: string, icon: StringOrSignal, clickFunc: Function) {\n const active = compute(r => r && r.path === id, router.currentRoute);\n const activeClass = compute((a): string => a ? \"active\" : \"_\", active);\n\n return FJSC.button({\n text,\n icon: {\n icon,\n adaptive: true,\n classes: [\"inline-icon\", \"svg\", \"nopointer\"]\n },\n onclick: clickFunc,\n classes: [\"hideOnMidBreakpoint\", activeClass],\n id,\n });\n }\n\n static navButtonInBurger(id: string, text: string, icon: string, clickFunc: Function) {\n const active = compute(r => r && r.path === id, router.currentRoute);\n const activeClass = compute((a): string => a ? \"active\" : \"_\", active);\n\n return FJSC.button({\n text,\n icon: { icon, adaptive: true, classes: [\"inline-icon\", \"svg\", \"nopointer\"] },\n onclick: clickFunc,\n classes: [\"text-xxlarge\", \"burger-menu-button\", activeClass],\n id,\n });\n }\n\n static accountSection() {\n return create(\"div\")\n .classes(\"widest-fill-right\", \"relative\")\n .children(\n FJSC.button({\n text: \"Upload\",\n classes: [\"hideOnMidBreakpoint\", \"positive\"],\n icon: { icon: \"upload\" },\n onclick: async (e: MouseEvent) => {\n e.preventDefault();\n navigate(\"upload\");\n }\n }),\n NavTemplates.notifications(),\n UserTemplates.userWidget(currentUser, true, [], [], UserWidgetContext.nav),\n FJSC.button({\n text: \"Log out\",\n classes: [\"hideOnSmallBreakpoint\", \"negative\"],\n icon: { icon: \"logout\" },\n onclick: async () => {\n await AuthActions.logOut();\n }\n }),\n ).build();\n }\n\n static notSignedInNote() {\n return create(\"div\")\n .classes(\"widest-fill-right\")\n .children(\n FJSC.button({\n text: \"Log in\",\n icon: { icon: \"login\" },\n classes: [\"special\"],\n disabled: compute((r) => (r && r.path === \"login\") as boolean, router.currentRoute),\n onclick: async () => {\n navigate(\"login\");\n }\n })\n ).build();\n }\n\n static notificationInList(notification: Notification) {\n const elements = NotificationParser.parse(notification);\n\n return create(\"div\")\n .classes(\"listNotification\", \"flex\", notification.type, \"rounded\", \"padded-inline\", \"hoverable\", \"text-left\", notification.is_read ? \"read\" : \"unread\")\n .id(notification.id)\n .children(\n create(\"div\")\n .classes(\"flex-v\", \"no-gap\")\n .children(\n create(\"span\")\n .children(...elements)\n .build(),\n create(\"span\")\n .classes(\"notification-time\", \"text-small\")\n .text(Time.ago(notification.created_at))\n .build()\n ).build()\n ).build();\n }\n\n static notificationImage(image: { type: string, id: string }) {\n const type = image.type;\n const id = image.id;\n const srcState = signal(\"\");\n srcState.value = Util.getUserAvatar(parseInt(id));\n\n if (type === \"user\") {\n return create(\"img\")\n .classes(\"nopointer\", \"user-icon-big\", \"align-center\")\n .attributes(\"src\", srcState)\n .build();\n }\n\n return null;\n }\n\n static notificationLink(link: string, text: string) {\n return create(\"span\")\n .classes(\"inlineLink\")\n .onclick(async () => {\n navigate(link);\n })\n .onauxclick(async e => {\n if (e.button === 2) {\n e.preventDefault();\n await copy(window.location.origin + link);\n } else if (e.button === 1) {\n e.preventDefault();\n window.open(window.location.origin + link, \"_blank\");\n }\n })\n .text(text)\n .build();\n }\n\n static notifications() {\n const hasNotifs = compute(notifs => notifs.length > 0, notifications);\n const unreadNotifications = compute(notifs => notifs.filter(notification => !notification.is_read), notifications);\n const notifsClass = compute((u): string => u.length > 0 ? \"unread\" : \"_\", unreadNotifications);\n const newestTimestamp = compute(unreadNotifs => unreadNotifs.length > 0 ? unreadNotifs[0].created_at : null, unreadNotifications);\n\n const notifsVisible = signal(false);\n const listClass = compute((v): string => v ? \"_\" : \"hidden\", notifsVisible);\n\n const notificationContainer = create(\"div\")\n .classes(listClass, \"popout-below\", \"rounded\", \"absolute-align-right\", \"notification-list\")\n .children(\n signalMap(notifications, create(\"div\").classes(\"flex-v\", \"nogap\"), notif => NavTemplates.notificationInList(notif)),\n ifjs(hasNotifs, create(\"div\")\n .classes(\"text-center\", \"padded\")\n .text(\"No notifications\")\n .build(), true)\n ).build();\n\n UserActions.getNotificationsPeriodically();\n return create(\"div\")\n .classes(\"notification-container\", \"relative\")\n .children(\n FJSC.button({\n icon: { icon: \"notifications\" },\n onclick: async () => {\n notifsVisible.value = !notifsVisible.value;\n await UserActions.markNotificationsAsRead(newestTimestamp, notifsVisible);\n },\n text: \"\",\n classes: [\"fullHeight\", \"round-on-tiny-breakpoint\", notifsClass]\n }),\n notificationContainer\n ).build();\n }\n}", "import {Util} from \"./Util.ts\";\nimport {Api} from \"../Api/Api.ts\";\nimport {LydaCache} from \"../Cache/LydaCache.ts\";\nimport {NavTemplates} from \"../Templates/NavTemplates.ts\";\nimport {GenericTemplates} from \"../Templates/GenericTemplates.ts\";\nimport {CacheItem} from \"../Cache/CacheItem.ts\";\nimport {UserActions} from \"../Actions/UserActions.ts\";\nimport {AnyElement, HtmlPropertyValue, StringOrSignal} from \"../../fjsc/src/f2.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {Theme} from \"../Enums/Theme.ts\";\nimport {navigate} from \"../Routing/Router.ts\";\nimport {signal} from \"../../fjsc/src/signals.ts\";\nimport {currentUser, navInitialized, notifications} from \"../state.ts\";\nimport {User} from \"../Models/DbModels/lyda/User.ts\";\nimport {CollaboratorType} from \"../Models/DbModels/lyda/CollaboratorType.ts\";\nimport {TrackCollaborator} from \"../Models/DbModels/lyda/TrackCollaborator.ts\";\nimport {Notification} from \"../Models/DbModels/lyda/Notification.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\n\nexport class Ui {\n static validUrlPaths = {\n home: \"home\",\n search: \"search\",\n settings: \"settings\",\n playlist: \"playlist\",\n album: \"album\",\n explore: \"explore\",\n following: \"following\",\n profile: \"profile\",\n };\n\n static addModal(modal: AnyElement|null) {\n if (!modal) {\n return;\n }\n document.body.appendChild(modal);\n Util.initializeModalRemove(modal);\n }\n\n static async initializeNavBar() {\n await Util.getUser();\n if (document.getElementById(\"navTop\") === null) {\n document.body.prepend(NavTemplates.navTop());\n\n setTimeout(() => {\n window.onresize = async () => {\n await Ui.windowResize();\n };\n }, 1000);\n }\n }\n\n static async getPageHtml(page: string) {\n let cachedContent = LydaCache.get(\"page/\" + page).content;\n if (cachedContent) {\n return cachedContent;\n }\n\n let r = await fetch(`/pages/${page}.html`);\n if (r.status !== 200) {\n return null;\n }\n let pageContent = await r.text();\n if (pageContent) {\n LydaCache.set(\"page/\" + page, new CacheItem(pageContent));\n return pageContent;\n } else {\n notify(\"Could not load page.\", NotificationType.error);\n throw new Error(`No content for page ${page}.`);\n }\n }\n\n static async windowResize() {\n let pageBackground = document.querySelector(\".page-background\") as HTMLElement;\n let nav = document.querySelector(\"nav\");\n let footer = document.querySelector(\"footer\");\n if (nav === null && !navInitialized.value) {\n navInitialized.value = true;\n Ui.initializeNavBar().then(() => {\n nav = document.querySelector(\"nav\");\n if (nav && footer && pageBackground) {\n pageBackground.style.height = (window.innerHeight - nav.clientHeight - footer.clientHeight - 1) + \"px\";\n }\n });\n }\n if (nav && footer && pageBackground) {\n pageBackground.style.height = (window.innerHeight - nav.clientHeight - footer.clientHeight - 1) + \"px\";\n }\n }\n\n static async loadTheme() {\n const darkPreferred = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const user = currentUser.value;\n if (!user) {\n await UserActions.setUiTheme(Theme.dark, true);\n return;\n }\n const existingSetting = user.settings?.find(s => s.key === \"theme\");\n if (!existingSetting) {\n const newTheme = darkPreferred.matches ? \"dark\" : \"light\";\n await UserActions.setUiTheme(newTheme as Theme);\n LydaCache.set(\"user\", new CacheItem(user));\n } else {\n await UserActions.setUiTheme(existingSetting.value as Theme, true);\n }\n }\n\n static async initUser(userToShow: string|null) {\n if (!userToShow) {\n return false;\n }\n return await Util.getUserByNameAsync(userToShow);\n }\n\n static setImagesSource(userId: number, className: string, source: string) {\n let images = document.querySelectorAll(\".\" + className + \"[data-user-id='\" + userId + \"']\") as NodeListOf;\n for (let i = 0; i < images.length; i++) {\n images[i].src = source;\n }\n }\n\n static fillClassWithValue(userId: number, className: string, value: string, newPage = \"\", params: string[] = []) {\n let elements = document.querySelectorAll(\".\" + className + \"[data-user-id='\" + userId + \"']\") as NodeListOf;\n for (let element of elements) {\n element.innerHTML = value;\n element.onclick = async () => {\n navigate(newPage, params);\n };\n }\n }\n\n static showImageModal(imageUrl: StringOrSignal) {\n const modal = GenericTemplates.imageModal(imageUrl);\n Ui.addModal(modal);\n }\n\n static async getConfirmationModal(title: StringOrSignal, text: StringOrSignal, confirmText: StringOrSignal,\n cancelText: StringOrSignal, confirmCallback = () => {}, cancelCallback = () => {\n }, icon: StringOrSignal = \"\") {\n const confirmCallback2 = () => {\n confirmCallback();\n Util.removeModal();\n };\n const cancelCallback2 = () => {\n cancelCallback();\n Util.removeModal();\n };\n const modal = GenericTemplates.confirmationModal(title, text, icon, confirmText, cancelText, confirmCallback2, cancelCallback2);\n Ui.addModal(modal);\n }\n\n static async getTextInputModal(title: HtmlPropertyValue, text: HtmlPropertyValue, currentValue: string, confirmText: StringOrSignal, cancelText: StringOrSignal, confirmCallback: Function, cancelCallback: Function = () => {\n }, icon = \"\") {\n const value = signal(currentValue);\n const confirmCallback2 = () => {\n confirmCallback(value.value);\n Util.removeModal();\n };\n const cancelCallback2 = () => {\n cancelCallback();\n Util.removeModal();\n };\n const modal = GenericTemplates.textInputModal(title, text, currentValue, value, icon, confirmText, cancelText, confirmCallback2, cancelCallback2);\n Ui.addModal(modal);\n }\n\n static async getTextAreaInputModal(title: HtmlPropertyValue, text: HtmlPropertyValue, currentValue: string, confirmText: StringOrSignal, cancelText: StringOrSignal, confirmCallback: Function = () => {}, cancelCallback: Function = () => {\n }, icon = \"\") {\n const value = signal(currentValue);\n const confirmCallback2 = () => {\n confirmCallback(value.value);\n Util.removeModal();\n };\n const cancelCallback2 = () => {\n cancelCallback();\n Util.removeModal();\n };\n const modal = GenericTemplates.textAreaInputModal(title, text, currentValue, value, icon, confirmText, cancelText, confirmCallback2, cancelCallback2);\n Ui.addModal(modal);\n }\n\n static async getAddLinkedUserModal(title: StringOrSignal, text: StringOrSignal, currentValue: string,\n confirmText: StringOrSignal, cancelText: StringOrSignal,\n confirmCallback: Function = () => {}, cancelCallback: Function = () => {},\n icon = \"\") {\n const confirmCallback2 = async (username: string, newUser: TrackCollaborator, collabTypes: CollaboratorType[]) => {\n Util.removeModal();\n const user = await Util.getUserByNameAsync(username);\n user.collab_type = collabTypes.find(x => x.id === newUser.collab_type?.id);\n confirmCallback(username, user);\n };\n const cancelCallback2 = () => {\n cancelCallback();\n Util.removeModal();\n };\n const modal = GenericTemplates.addLinkedUserModal(title, text, currentValue, icon, confirmText, cancelText, confirmCallback2, cancelCallback2);\n Ui.addModal(modal);\n }\n}\n\nconst currentNotifications = signal([]);\n\nexport function notify(text: string, type = NotificationType.info, time = 7000) {\n if (currentNotifications.value.includes(text)) {\n return;\n }\n currentNotifications.value.push(text);\n const notifications = document.querySelector(\".notifications\");\n const notification = GenericTemplates.notification(type, text);\n const previousNotifications = document.querySelectorAll(\".notification\") as NodeListOf;\n if (previousNotifications) {\n const lastNotification = previousNotifications[previousNotifications.length - 1];\n if (lastNotification) {\n notification.style.top = lastNotification.offsetTop + lastNotification.clientHeight + \"px\";\n }\n }\n notifications?.appendChild(notification);\n setTimeout(() => {\n notification.remove();\n currentNotifications.value = currentNotifications.value.filter(n => n !== text);\n }, time);\n}\n", "import {NotificationType} from \"../Enums/NotificationType.ts\";\nimport {notify} from \"../Classes/Ui.ts\";\n\nexport interface ApiResponse {\n code: number;\n data: T & { error?: string };\n}\n\nexport class Api {\n static buildParams(params: any): string {\n if (Object.keys(params).length === 0) {\n return \"\";\n }\n let paramStr = \"?\";\n for (let key of Object.keys(params)) {\n paramStr += key + \"=\" + params[key] + \"&\";\n }\n return paramStr.substring(0, paramStr.length - 1);\n }\n\n static async getDataFromHttpResponse(res: Response): Promise {\n let data = await res.text();\n try {\n data = JSON.parse(data);\n } catch (e) {\n // Ignore\n }\n return data as T;\n }\n\n static async getAsync(url: string, params: object = {}, authorizationHeaders = {}): Promise> {\n if (!url) {\n throw new Error(\"url is required\");\n }\n const res = await fetch(url + Api.buildParams(params), {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...authorizationHeaders\n },\n credentials: \"include\",\n });\n\n if (res.status === 429) {\n notify(\"Too many requests, please try again in 15 minutes.\", NotificationType.error);\n return {\n code: 429,\n data: {\n error: \"Too many requests, please try again in 15 minutes.\"\n }\n };\n }\n\n return {\n code: res.status,\n data: await Api.getDataFromHttpResponse(res)\n };\n }\n\n static async postAsync(url: string, body: any = {}, authorizationHeaders: any = {}): Promise> {\n return await Api.postRawAsync(url, JSON.stringify(body), authorizationHeaders);\n }\n\n static async postRawAsync(url: string, body: any = {}, authorizationHeaders = {}) {\n const headers = {\n \"Content-Type\": \"application/json\",\n };\n if (body.constructor === FormData) {\n // @ts-ignore\n delete headers[\"Content-Type\"];\n }\n const res = await fetch(url, {\n method: \"POST\",\n mode: \"cors\",\n headers: {\n ...headers,\n ...authorizationHeaders\n },\n credentials: \"include\",\n body\n });\n\n if (res.status === 429) {\n notify(\"Too many requests, please try again in 15 minutes.\", NotificationType.error);\n return {\n code: 429,\n data: {\n error: \"Too many requests, please try again in 15 minutes.\"\n }\n };\n }\n\n return {\n code: res.status,\n data: await Api.getDataFromHttpResponse(res)\n };\n }\n}", "import {Api} from \"../Api/Api.ts\";\nimport {notify, Ui} from \"../Classes/Ui.ts\";\nimport {LydaCache} from \"../Cache/LydaCache.ts\";\nimport {Icons} from \"../Enums/Icons.js\";\nimport {PlayManager} from \"../Streaming/PlayManager.ts\";\nimport {navigate, reload} from \"../Routing/Router.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {currentUser, navInitialized} from \"../state.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\n\nexport class AuthActions {\n static resetUiState() {\n const navtop = document.getElementById(\"navTop\");\n if (navtop) {\n navtop.remove();\n }\n const footer = document.querySelector(\"footer\");\n if (footer) {\n footer.innerHTML = \"\";\n }\n navInitialized.value = false;\n LydaCache.clear();\n PlayManager.stopAllAsync().then();\n }\n\n static async logOut() {\n AuthActions.resetUiState();\n const res = await Api.postAsync(ApiRoutes.logout);\n if (res.code === 200) {\n notify(\"Logged out!\", NotificationType.success);\n navigate(\"login\");\n }\n return res;\n }\n\n static async logOutWithRedirect() {\n let r = await AuthActions.logOut();\n if (r.code === 200) {\n window.location.reload();\n navigate(\"login\");\n } else {\n notify(\"Failed to log out. Please try again later.\", NotificationType.error);\n }\n }\n\n static async loginLogout() {\n const user = LydaCache.get(\"user\");\n if (user.content) {\n await Ui.getConfirmationModal(\"Log out\", \"Are you sure you want to log out?\", \"Yes\", \"No\", AuthActions.logOut, () => {\n }, Icons.WARNING);\n } else {\n navigate(\"login\");\n }\n }\n}", "import {Api, ApiResponse} from \"./Api.ts\";\nimport {notify} from \"../Classes/Ui.ts\";\nimport {ApiRoutes} from \"./ApiRoutes.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\nimport {User} from \"../Models/DbModels/lyda/User.ts\";\n\nexport class AuthApi {\n static userExists(email: string, successCallback: Function = () => {\n }, errorCallback: Function = () => {\n }) {\n Api.getAsync(ApiRoutes.userExists, {email: encodeURIComponent(email)}).then((response) => {\n if (response.code === 200) {\n successCallback(response.data);\n } else {\n errorCallback(response.code, response.data);\n }\n });\n }\n\n static login(email: string, password: string, mfaCode: string, successCallback: Function, errorCallback: Function = () => {}) {\n Api.postAsync(ApiRoutes.login, {\n email,\n password,\n mfaCode\n }).then((response) => {\n if (response.code === 200) {\n successCallback(response.data);\n } else {\n notify(response.data.error ?? \"Unknown error while logging in\", NotificationType.error);\n errorCallback(response.code, response.data);\n }\n });\n }\n\n static user(id: number|null, successCallback: (user: User) => void) {\n Api.getAsync(ApiRoutes.getUser, {id}).then((response) => {\n if (response.code === 200) {\n successCallback(response.data as User);\n }\n });\n }\n\n static register(username: string, displayname: string, email: string, password: string, successCallback: Function, errorCallback: Function = () => {}) {\n Api.postAsync(ApiRoutes.register, {\n username,\n displayname,\n email,\n password\n }).then((response) => {\n if (response.code === 200) {\n successCallback(response);\n } else {\n notify(response.data.error ?? \"Unknown error while registering\", NotificationType.error);\n errorCallback(response);\n }\n });\n }\n\n static mfaRequest(email: string, password: string, successCallback: Function, errorCallback: Function = () => {}) {\n Api.postAsync(ApiRoutes.requestMfaCode, {\n email,\n password\n }).then((response) => {\n if (response.code === 200 || response.code === 204) {\n successCallback && successCallback(response);\n } else {\n notify(response.data.error ?? \"Unknown error while requesting MFA\", NotificationType.error);\n errorCallback && errorCallback(response);\n }\n });\n }\n\n static async requestPasswordReset(email: string): Promise> {\n return Api.postAsync(ApiRoutes.requestPasswordReset, {\n email\n });\n }\n\n static async resetPassword(token: string, newPassword: string, newPasswordConfirm: string): Promise> {\n return Api.postAsync(ApiRoutes.resetPassword, {\n token,\n newPassword,\n newPasswordConfirm\n });\n }\n\n static async sendActivationEmail() {\n return Api.postAsync(ApiRoutes.sendActivationEmail);\n }\n}", "import {AuthData} from \"../../Templates/LandingPageTemplates.ts\";\n\nexport class UserValidator {\n static validateRegistration(state: AuthData, touchedFields: Set): string[] {\n let errors = new Set();\n if (!state.username) {\n errors.add(\"Username missing\");\n }\n if (!state.email) {\n errors.add(\"Email missing\");\n }\n if (!state.password) {\n errors.add(\"Password missing\");\n }\n if (!state.password2) {\n errors.add(\"Repeat password missing\");\n }\n if (state.password !== state.password2 && touchedFields.has(\"password2\") && touchedFields.has(\"password\")) {\n errors.add(\"Passwords do not match\");\n }\n if (!state.termsOfService) {\n errors.add(\"You must agree to the Terms of Service and Privacy Policy\");\n }\n return [...errors];\n }\n\n static validateLogin(state: any): string[] {\n let errors = new Set();\n if (!state.email) {\n errors.add(\"E-Mail address missing\");\n }\n if (!state.password) {\n errors.add(\"Password missing\");\n }\n return [...errors];\n }\n\n static validatePasswordReset(state: any): string[] {\n let errors = new Set();\n if (!state.password) {\n errors.add(\"Password missing\");\n }\n if (!state.password2) {\n errors.add(\"Repeat password missing\");\n }\n if (state.password !== state.password2) {\n errors.add(\"Passwords do not match\");\n }\n return [...errors];\n }\n\n static validateEmailCheck(state: any): string[] {\n let errors = new Set();\n if (!state.email) {\n errors.add(\"E-Mail address missing\");\n }\n return [...errors];\n }\n}", "import {AuthApi} from \"../Api/AuthApi.ts\";\nimport {GenericTemplates} from \"./GenericTemplates.ts\";\nimport {FormTemplates} from \"./FormTemplates.ts\";\nimport {UserValidator} from \"../Classes/Validators/UserValidator.ts\";\nimport {finalizeLogin, target, Util} from \"../Classes/Util.ts\";\nimport {notify} from \"../Classes/Ui.ts\";\nimport {FJSC} from \"../../fjsc\";\nimport {InputType} from \"../../fjsc/src/Types.ts\";\nimport {User} from \"../Models/DbModels/lyda/User.ts\";\nimport {AnyNode, create, HtmlPropertyValue, ifjs} from \"../../fjsc/src/f2.ts\";\nimport {Api, ApiResponse} from \"../Api/Api.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {compute, Signal, signal} from \"../../fjsc/src/signals.ts\";\nimport {navigate} from \"../Routing/Router.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\nimport {currentUser} from \"../state.ts\";\n\nexport interface AuthData {\n termsOfService: boolean;\n username: string;\n displayname: string;\n email: string;\n password: string;\n password2: string;\n mfaCode: string;\n}\n\nexport class LandingPageTemplates {\n static newLandingPage() {\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex\", \"auth-box\", \"card\")\n .children(\n LandingPageTemplates.registrationLoginBox()\n ).build(),\n ).build();\n }\n\n static registrationLoginBox() {\n const templateMap: Record, user: Signal) => AnyNode> = {\n \"email\": LandingPageTemplates.emailBox,\n \"check-email\": LandingPageTemplates.checkEmailBox,\n \"register\": LandingPageTemplates.registerBox,\n \"login\": LandingPageTemplates.loginBox,\n \"checking-mfa\": LandingPageTemplates.checkForMfaBox,\n \"logging-in\": LandingPageTemplates.loggingInBox,\n \"registering\": LandingPageTemplates.registeringBox,\n \"mfa\": LandingPageTemplates.mfaBox,\n \"complete\": LandingPageTemplates.completeBox,\n \"reset-password\": LandingPageTemplates.resetPasswordBox,\n \"password-reset\": LandingPageTemplates.enterNewPasswordBox,\n \"password-reset-requested\": LandingPageTemplates.passwordResetRequestedBox,\n \"verify-email\": LandingPageTemplates.verifyEmailBox,\n };\n const altEntryPoints = [\"password-reset\", \"verify-email\"];\n let firstStep: keyof typeof templateMap | undefined = \"email\";\n if (altEntryPoints.some(entryPoint => window.location.pathname.includes(entryPoint))) {\n firstStep = altEntryPoints.find(entryPoint => window.location.pathname.includes(entryPoint)) as keyof typeof templateMap;\n }\n const step = signal(firstStep ?? \"email\");\n const user = signal({\n email: \"\",\n username: \"\",\n displayname: \"\",\n password: \"\",\n password2: \"\",\n mfaCode: \"\",\n termsOfService: false\n });\n const history = signal([\"email\"]);\n const pageMap = {\n \"email\": \"E-Mail\",\n \"register\": \"Register\",\n \"login\": \"Login\",\n \"mfa\": \"2FA\",\n \"complete\": \"Complete\"\n };\n\n const template = signal(templateMap[step.value](step, user));\n step.subscribe((newStep: keyof typeof templateMap) => {\n // @ts-ignore\n if (pageMap[newStep] && !history.value.includes(newStep)) {\n history.value = [\n ...history.value,\n newStep\n ];\n }\n template.value = create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n GenericTemplates.breadcrumbs(pageMap, history, step)\n ).build(),\n templateMap[newStep](step, user)\n ).build();\n });\n\n return template;\n }\n\n static completeBox() {\n AuthApi.user(null, user => {\n currentUser.value = user;\n });\n navigate(\"profile\");\n\n return LandingPageTemplates.waitingBox(\"Complete\", \"Redirecting...\");\n }\n\n static mfaBox(step: Signal, user: Signal) {\n return create(\"div\")\n .classes(\"flex-v\", \"align-center\")\n .children(\n create(\"h1\")\n .text(\"Two-factor authentication\")\n .build(),\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"p\")\n .text(\"You have two-factor authentication enabled. Please enter the code from the e-mail you just got sent to continue.\")\n .build(),\n FormTemplates.textField(\"Code\", \"mfa-code\", \"Code\", \"text\", \"\", true, (value: string) => {\n user.value = {\n ...user.value,\n mfaCode: value\n };\n }, true, () => {\n }),\n FJSC.button({\n text: \"Submit\",\n icon: { icon: \"login\" },\n classes: [\"positive\"],\n onclick: () => {\n step.value = \"logging-in\";\n }\n }),\n ).build(),\n ).build();\n }\n\n static verifyEmailBox(step: Signal, user: Signal) {\n const code = Util.getUrlParameter(\"code\");\n const error = signal(\"\");\n const done = signal(false);\n const activating = signal(true);\n\n Api.postAsync(ApiRoutes.verifyEmail, {\n activationCode: code\n }).then(res => {\n activating.value = false;\n if (res.code !== 200) {\n error.value = res.data.error ?? \"Unknown error\";\n } else {\n done.value = true;\n }\n });\n\n return create(\"div\")\n .classes(\"flex-v\", \"align-center\")\n .children(\n create(\"h1\")\n .text(\"Email verification\")\n .build(),\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n ifjs(activating, create(\"p\")\n .text(`We're verifying your email with code ${code}...`)\n .build()),\n ifjs(done, create(\"p\")\n .text(`This email is now verified!`)\n .build()),\n ifjs(done, FJSC.button({\n text: \"Go to profile\",\n icon: { icon: \"person\" },\n classes: [\"positive\"],\n onclick: () => {\n navigate(\"profile\");\n }\n })),\n ifjs(compute(e => e.length > 0, error), FJSC.error(error))\n ).build()\n ).build();\n }\n\n static registeringBox(step: Signal, user: Signal) {\n AuthApi.register(user.value.username, user.value.displayname, user.value.email, user.value.password, (res: ApiResponse) => {\n if (res.code === 200) {\n step.value = \"complete\";\n } else {\n notify(`Failed to register: ${res.data.error}`, NotificationType.error);\n step.value = \"email\";\n }\n });\n\n return LandingPageTemplates.waitingBox(\"Registering...\", \"Please wait\");\n }\n\n static checkForMfaBox(step: Signal, user: Signal) {\n AuthApi.mfaRequest(user.value.email, user.value.password, (res: ApiResponse) => {\n if (res.data && res.data.user) {\n finalizeLogin(step, res.data.user);\n } else if (res.data && res.data.mfa_needed) {\n step.value = \"mfa\";\n } else {\n step.value = \"logging-in\";\n }\n }, () => {\n step.value = \"login\";\n });\n\n return LandingPageTemplates.waitingBox(\"Checking for MFA...\", \"Please wait\");\n }\n\n static loggingInBox(step: Signal, user: Signal) {\n AuthApi.login(user.value.email, user.value.password, user.value.mfaCode, (data: { user: User }) => {\n notify(\"Logged in as \" + data.user.username, NotificationType.success);\n AuthApi.user(data.user.id, (user: User) => {\n finalizeLogin(step, user);\n });\n }, () => {\n step.value = \"login\";\n });\n\n return LandingPageTemplates.waitingBox(\"Logging in...\", \"Please wait\");\n }\n\n static waitingBox(title: HtmlPropertyValue, message: HtmlPropertyValue) {\n return create(\"div\")\n .classes(\"flex-v\", \"align-center\")\n .children(\n create(\"h1\")\n .text(title)\n .build(),\n create(\"div\")\n .classes(\"flex\")\n .children(\n GenericTemplates.loadingSpinner(),\n create(\"span\")\n .text(message)\n .build()\n ).build()\n ).build();\n }\n\n static loginBox(step: Signal, user: Signal) {\n const errors = signal([]);\n user.subscribe(newUser => {\n errors.value = UserValidator.validateLogin(newUser);\n });\n const continueLogin = () => {\n errors.value = UserValidator.validateLogin(user.value);\n if (errors.value.length === 0) {\n step.value = \"checking-mfa\";\n }\n };\n const email = compute((u: AuthData) => u.email, user);\n const password = compute((u: AuthData) => u.password, user);\n\n return create(\"div\")\n .classes(\"flex-v\", \"align-center\")\n .children(\n create(\"h1\")\n .text(\"Log in\")\n .build(),\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n FJSC.input({\n type: InputType.text,\n name: \"email\",\n label: \"E-Mail\",\n placeholder: \"E-Mail\",\n value: email,\n required: true,\n attributes: [\"autocomplete\", \"email\"],\n onchange: (value) => {\n AuthApi.userExists(value, () => {\n user.value = {\n ...user.value,\n email: value\n };\n }, () => {\n errors.value = [\n \"This E-mail address is not registered. Please register instead.\"\n ];\n });\n },\n }),\n LandingPageTemplates.passwordInput(password, user, () => step.value = \"checking-mfa\", true),\n FJSC.button({\n text: \"Login\",\n id: \"mfaCheckTrigger\",\n disabled: compute(u => !u.email || !u.password || u.email.trim().length === 0 || u.password.trim().length === 0, user),\n onclick: continueLogin,\n icon: {\n icon: \"login\",\n adaptive: true\n },\n classes: [\"secondary\", \"positive\"]\n }),\n FJSC.errorList(errors),\n GenericTemplates.inlineLink(() => {\n step.value = \"reset-password\";\n }, \"Change/forgot password?\", false),\n GenericTemplates.inlineLink(() => {\n step.value = \"register\";\n }, \"Register instead\"),\n ).build(),\n ).build();\n }\n\n static resetPasswordBox(step: Signal, user: Signal) {\n const errors = signal([]);\n user.subscribe(newUser => {\n errors.value = UserValidator.validateLogin(newUser);\n });\n const email = compute((u: AuthData) => u.email, user);\n\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"h1\")\n .text(\"Forgot password\")\n .build(),\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex\", \"space-outwards\")\n .children(\n FJSC.input({\n type: InputType.text,\n name: \"email\",\n label: \"E-Mail\",\n placeholder: \"E-Mail\",\n value: email,\n required: true,\n onchange: (value) => {\n user.value = {\n ...user.value,\n email: value\n };\n },\n onkeydown: (e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n user.value = {\n ...user.value,\n email: target(e).value\n };\n }\n },\n }),\n ).build(),\n FJSC.button({\n text: \"Next\",\n id: \"checkEmailTrigger\",\n classes: [\"positive\"],\n disabled: compute(u => !u.email || u.email.trim().length === 0, user),\n onclick: async () => {\n const res = await AuthApi.requestPasswordReset(email.value);\n if (res.code === 200) {\n notify(\"Password reset requested, check your email\", NotificationType.success);\n step.value = \"password-reset-requested\";\n } else {\n notify(`Failed to reset password: ${res.data.error}`, NotificationType.error);\n errors.value = [res.data.error];\n }\n },\n }),\n FJSC.errorList(errors),\n ).build(),\n ).build();\n }\n\n static enterNewPasswordBox(step: Signal, user: Signal) {\n const errors = signal([]);\n user.subscribe((newUser: AuthData) => {\n errors.value = UserValidator.validatePasswordReset(newUser);\n });\n const password = compute((u: AuthData) => u.password, user);\n const passwordConfirm = compute((u: AuthData) => u.password2, user);\n const token = Util.getUrlParameter(\"token\");\n\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"h1\")\n .text(\"Enter new password\")\n .build(),\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n LandingPageTemplates.passwordInput(password, user),\n FJSC.input({\n type: InputType.password,\n name: \"password-confirm\",\n label: \"Confirm password\",\n placeholder: \"Confirm password\",\n attributes: [\"autocomplete\", \"password\"],\n value: passwordConfirm,\n required: true,\n onchange: (value) => {\n user.value = {\n ...user.value,\n password2: value\n };\n },\n onkeydown: (e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n user.value = {\n ...user.value,\n password2: target(e).value\n };\n }\n },\n }),\n FJSC.button({\n text: \"Next\",\n classes: [\"positive\"],\n disabled: compute(u => !u.password || u.password.trim().length === 0 || u.password !== u.password2 || u.password2.trim().length === 0 || !token, user),\n onclick: async () => {\n if (!token) {\n notify(\"Token is missing\", NotificationType.error);\n return;\n }\n const res = await AuthApi.resetPassword(token, user.value.password, user.value.password2);\n if (res.code === 200) {\n notify(\"Password updated, you can now log in\", NotificationType.success);\n step.value = \"login\";\n } else {\n notify(`Failed to reset password: ${res.data.error}`, NotificationType.error);\n errors.value = [res.data.error];\n }\n },\n }),\n FJSC.errorList(errors),\n ).build(),\n ).build();\n }\n\n private static passwordInput(password: Signal, user: Signal, onEnter: Function = () => {}, focusImmediately = false) {\n setTimeout(() => {\n if (focusImmediately) {\n const input = document.querySelector(\"[name='password']\") as HTMLInputElement;\n input?.focus();\n }\n }, 100);\n\n return FJSC.input({\n type: InputType.password,\n name: \"password\",\n label: \"Password\",\n placeholder: \"Password\",\n value: password,\n required: true,\n attributes: [\"autocomplete\", \"password\"],\n onchange: (value) => {\n user.value = {\n ...user.value,\n password: value\n };\n },\n onkeydown: (e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n user.value = {\n ...user.value,\n password: target(e).value\n };\n onEnter();\n }\n },\n });\n }\n\n static passwordResetRequestedBox(step: Signal, user: Signal) {\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"h1\")\n .text(\"Password reset requested\")\n .build(),\n create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"span\")\n .text(\"Please check your email for a password reset link. After you've reset your password, you can log in.\")\n .build(),\n FJSC.button({\n text: \"Go to Login\",\n id: \"mfaCheckTrigger\",\n disabled: compute(u => !u.email || u.email.trim().length === 0, user),\n onclick: () => {\n step.value = \"login\";\n },\n classes: [\"secondary\", \"positive\"]\n }),\n ).build()\n ).build();\n }\n\n static checkEmailBox(step: Signal, user: Signal) {\n AuthApi.userExists(user.value.email, (data: User) => {\n user.value = {\n ...user.value,\n username: data.username,\n displayname: data.displayname\n };\n step.value = \"login\";\n }, () => {\n step.value = \"register\";\n });\n\n return LandingPageTemplates.waitingBox(\"Checking E-mail address...\", \"Please wait\");\n }\n\n static registerBox(step: Signal, user: Signal) {\n const errors = signal([]);\n const touchedFields = new Set();\n for (const key in user.value) {\n // @ts-ignore\n if (Object.hasOwn(user.value, key) && user.value[key] !== \"\") {\n touchedFields.add(key);\n }\n }\n user.subscribe(newUser => {\n errors.value = UserValidator.validateRegistration(newUser, touchedFields);\n });\n const emailInUseError = \"This E-mail address is already in use. Please use a different one.\";\n const continueRegistration = () => {\n errors.value = UserValidator.validateRegistration(user.value, touchedFields);\n if (errors.value.length === 0) {\n AuthApi.userExists(user.value.email, () => {\n errors.value = [emailInUseError];\n }, () => {\n step.value = \"registering\";\n });\n }\n };\n if (user.value.email) {\n AuthApi.userExists(user.value.email, () => {\n errors.value = [emailInUseError];\n });\n }\n const allFieldsTouched = signal(false);\n function checkAllFieldsTouched() {\n allFieldsTouched.value = touchedFields.size === 6;\n }\n\n return create(\"div\")\n .classes(\"flex-v\", \"align-center\")\n .children(\n create(\"h1\")\n .text(\"Register\")\n .build(),\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n FormTemplates.textField(\"Username\", \"username\", \"Username\", \"text\", user.value.username, true, (value: string) => {\n if (!touchedFields.has(\"username\") && value) {\n touchedFields.add(\"username\");\n checkAllFieldsTouched();\n }\n user.value = {\n ...user.value,\n username: value\n };\n }, true, () => {\n }, [\"flex-grow\"]),\n FormTemplates.textField(\"Display name\", \"displayname\", \"Display name\", \"text\", user.value.username, true, (value: string) => {\n if (!touchedFields.has(\"displayname\") && value) {\n touchedFields.add(\"displayname\");\n checkAllFieldsTouched();\n }\n user.value = {\n ...user.value,\n displayname: value\n };\n }, false, () => {\n }, [\"flex-grow\"]),\n FJSC.input({\n type: InputType.email,\n name: \"email\",\n label: \"Email\",\n placeholder: \"E-Mail\",\n value: user.value.email,\n required: true,\n debounce: 500,\n validators: [\n async (v) => {\n return new Promise((resolve) => {\n AuthApi.userExists(v, () => {\n errors.value = [emailInUseError];\n resolve([emailInUseError]);\n }, () => {\n const tmpErrors = [...errors.value];\n tmpErrors.splice(tmpErrors.indexOf(emailInUseError), 1);\n errors.value = tmpErrors;\n resolve(null);\n });\n });\n }\n ],\n onchange: (value) => {\n if (!touchedFields.has(\"email\") && value) {\n touchedFields.add(\"email\");\n checkAllFieldsTouched();\n }\n user.value = {\n ...user.value,\n email: value\n };\n },\n }),\n FormTemplates.textField(\"Password\", \"password\", \"Password\", \"password\", user.value.password, true, (value: string) => {\n if (!touchedFields.has(\"password\") && value) {\n touchedFields.add(\"password\");\n checkAllFieldsTouched();\n }\n user.value = {\n ...user.value,\n password: value\n };\n }, false, () => {\n }, [\"flex-grow\"]),\n FormTemplates.textField(\"Repeat password\", \"password-2\", \"Repeat password\", \"password\", user.value.password2, true, (value: string) => {\n if (!touchedFields.has(\"password2\") && value) {\n touchedFields.add(\"password2\");\n checkAllFieldsTouched();\n }\n user.value = {\n ...user.value,\n password2: value\n };\n }, false, () => {\n }, [\"flex-grow\"]),\n FormTemplates.checkBoxField(\"tos-checkbox\", \"I agree to the Terms of Service & Privacy Policy\", false, true, () => {\n if (!touchedFields.has(\"termsOfService\")) {\n touchedFields.add(\"termsOfService\");\n checkAllFieldsTouched();\n }\n user.value = {\n ...user.value,\n termsOfService: !user.value.termsOfService\n };\n }),\n GenericTemplates.inlineLink(\"https://targoninc.com/tos\", \"Read the Terms of Service / Privacy Policy\"),\n FJSC.button({\n text: \"Register\",\n id: \"registerTrigger\",\n disabled: compute((e, allTouched) => e.length > 0 || !allTouched, errors, allFieldsTouched),\n onclick: continueRegistration,\n icon: {\n icon: \"person_add\",\n adaptive: true\n },\n classes: [\"secondary\", \"positive\"]\n }),\n ifjs(allFieldsTouched, create(\"div\").classes(\"flex-v\").children(\n FJSC.errorList(errors)\n ).build()),\n ).build(),\n ).build();\n }\n\n static emailBox(step: Signal, user: Signal) {\n const errors = signal([]);\n user.subscribe(newUser => {\n errors.value = UserValidator.validateEmailCheck(newUser);\n });\n const triggerLogin = () => {\n errors.value = UserValidator.validateEmailCheck(user.value);\n if (errors.value.length === 0) {\n step.value = \"check-email\";\n }\n };\n\n return create(\"div\")\n .classes(\"flex-v\", \"align-center\")\n .children(\n create(\"h1\")\n .text(\"Enter your email\")\n .build(),\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex\", \"space-outwards\")\n .children(\n FJSC.input({\n type: InputType.text,\n name: \"email\",\n label: \"E-Mail\",\n placeholder: \"E-Mail\",\n value: user.value.email,\n required: true,\n onchange: (value) => {\n user.value = {\n ...user.value,\n email: value\n };\n },\n onkeydown: (e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n user.value = {\n ...user.value,\n email: target(e).value\n };\n triggerLogin();\n }\n }\n }),\n create(\"input\")\n .classes(\"hidden\")\n .name(\"password\")\n .type(InputType.password)\n .onchange((e) => {\n user.value = {\n ...user.value,\n password: target(e).value\n };\n })\n .build(),\n ).build(),\n FJSC.button({\n text: \"Next\",\n id: \"checkEmailTrigger\",\n disabled: compute((u, e) => !u.email || u.email.trim().length === 0 || e.length > 0, user, errors),\n onclick: triggerLogin,\n icon: {\n icon: \"arrow_forward\",\n adaptive: true\n },\n classes: [\"secondary\", \"positive\"]\n }),\n ).build(),\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"h2\")\n .text(\"Why use Lyda?\")\n .build(),\n LandingPageTemplates.lydaBenefits(),\n create(\"p\")\n .styles(\"max-width\", \"300px\")\n .children(\n create(\"span\")\n .text(\"We are focused on building a platform that is both good for artists as well as listeners.\")\n .build(),\n ).build(),\n create(\"p\")\n .classes(\"color-dim\")\n .styles(\"max-width\", \"300px\")\n .children(\n create(\"span\")\n .text(\"We want to make sure that artists can earn money from their work, and listeners can enjoy their music without ads.\")\n .build(),\n ).build(),\n create(\"p\")\n .classes(\"color-dim\")\n .styles(\"max-width\", \"300px\")\n .children(\n create(\"span\")\n .text(\" If you're curious about what we're building, you can take a look at our \")\n .build(),\n GenericTemplates.inlineLink(() => navigate(\"/roadmap\"), \"roadmap\"),\n ).build(),\n ).build(),\n ).build();\n }\n\n static lydaBenefits() {\n return create(\"div\")\n .classes(\"flex\")\n .children(\n GenericTemplates.benefit(\"Transparent royalties\", \"visibility\"),\n GenericTemplates.benefit(\"No ads\", \"ad_group_off\"),\n GenericTemplates.benefit(\"Social features\", \"people\"),\n ).build();\n\n /* Add back marquee when we have more benefits\n return create(\"div\")\n .classes(\"marquee\")\n .styles(\"max-width\", \"min(500px, 100%)\")\n .children(\n create(\"div\")\n .classes(\"scrolling\", \"flex\")\n .children(\n GenericTemplates.benefit(\"Transparent royalties\", \"visibility\"),\n GenericTemplates.benefit(\"No ads\", \"ad_group_off\"),\n GenericTemplates.benefit(\"Social features\", \"people\"),\n ).build()\n ).build();*/\n }\n\n static footer() {\n return create(\"a\")\n .href(\"https://targoninc.com/tos\")\n .target(\"_blank\")\n .text(\"Terms of Service\")\n .build();\n }\n}\n", "export enum StreamingQuality {\n low = \"l\",\n medium = \"m\",\n high = \"h\",\n}", "import {create, ifjs, signalMap} from \"../../fjsc/src/f2.ts\";\nimport {UserActions} from \"../Actions/UserActions.ts\";\nimport {Theme} from \"../Enums/Theme.ts\";\nimport {GenericTemplates} from \"./GenericTemplates.ts\";\nimport {getUserSettingValue, Util} from \"../Classes/Util.ts\";\nimport {UserSettings} from \"../Enums/UserSettings.ts\";\nimport {FJSC} from \"../../fjsc\";\nimport {ButtonConfig, InputConfig, InputType, TextareaConfig} from \"../../fjsc/src/Types.ts\";\nimport {notify, Ui} from \"../Classes/Ui.ts\";\nimport {LydaApi} from \"../Api/LydaApi.ts\";\nimport {User} from \"../Models/DbModels/lyda/User.ts\";\nimport {compute, Signal, signal} from \"../../fjsc/src/signals.ts\";\nimport {navigate, reload} from \"../Routing/Router.ts\";\nimport {AuthActions} from \"../Actions/AuthActions.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\nimport {StreamingQuality} from \"../Enums/StreamingQuality.ts\";\nimport {UserTemplates} from \"./UserTemplates.ts\";\nimport {currentUser, permissions} from \"../state.ts\";\nimport {AuthApi} from \"../Api/AuthApi.ts\";\nimport {UserEmail} from \"../Models/DbModels/lyda/UserEmail.ts\";\nimport {Api} from \"../Api/Api.ts\";\nimport {Permission} from \"../Models/DbModels/lyda/Permission.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\n\nexport class SettingsTemplates {\n static settingsPage() {\n const user = currentUser.value;\n if (!user) {\n navigate(\"login\");\n return;\n }\n\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"h1\")\n .text(\"Settings\")\n .build(),\n SettingsTemplates.accountSection(user),\n SettingsTemplates.themeSection(getUserSettingValue(user, UserSettings.theme)),\n SettingsTemplates.qualitySection(getUserSettingValue(user, UserSettings.streamingQuality) ?? \"m\"),\n SettingsTemplates.permissionsSection(),\n SettingsTemplates.behaviourSection(user),\n SettingsTemplates.notificationsSection(user),\n SettingsTemplates.dangerSection(user),\n SettingsTemplates.linksSection(),\n ).build();\n }\n\n static permissionsSection() {\n const hasAnyPermissions = compute(p => p.length > 0, permissions);\n\n return create(\"div\")\n .children(\n ifjs(hasAnyPermissions, create(\"div\")\n .classes(\"card\", \"flex-v\")\n .children(\n create(\"h2\")\n .text(\"My Permissions\")\n .build(),\n signalMap(permissions, create(\"div\").classes(\"flex-v\"), (permission: Permission) => SettingsTemplates.permissionCard(permission))\n ).build()),\n ).build();\n }\n\n static permissionCard(permission: Permission) {\n return create(\"div\")\n .children(\n create(\"span\")\n .text(permission.name)\n .build(),\n ).build();\n }\n\n static accountSection(user: User) {\n const updatedUser = signal>({});\n const saveDisabled = compute((u: Record) => {\n const keys = Object.keys(u);\n return !keys.some(k => u[k] !== user[k]);\n }, updatedUser);\n\n return create(\"div\")\n .classes(\"card\", \"flex-v\")\n .children(\n create(\"h2\")\n .text(\"Account\")\n .build(),\n FJSC.button({\n text: \"Log out\",\n classes: [\"negative\", \"showOnSmallBreakpoint\"],\n icon: {icon: \"logout\"},\n onclick: async () => {\n await AuthActions.logOut();\n }\n }),\n create(\"p\")\n .text(\"Change your account settings here.\")\n .build(),\n ifjs(user.subscription, FJSC.button({\n icon: {icon: \"payments\"},\n text: \"Manage subscription\",\n classes: [\"positive\"],\n onclick: () => {\n navigate(\"subscribe\");\n }\n })),\n ifjs(user.subscription, FJSC.button({\n icon: {icon: \"payments\"},\n text: \"Subscribe for more features\",\n classes: [\"special\"],\n onclick: () => {\n navigate(\"subscribe\");\n }\n }), true),\n SettingsTemplates.userImageSettings(user),\n create(\"div\")\n .classes(\"flex-v\", \"small-card\")\n .children(\n FJSC.input(>{\n type: InputType.text,\n label: \"Username\",\n name: \"username\",\n required: true,\n value: user.username,\n onchange: v => {\n updatedUser.value = {...updatedUser.value, username: v};\n }\n }),\n FJSC.input(>{\n type: InputType.text,\n label: \"Display name\",\n name: \"displayname\",\n required: true,\n value: user.displayname,\n onchange: v => {\n updatedUser.value = {...updatedUser.value, displayname: v};\n }\n }),\n FJSC.textarea({\n label: \"Description\",\n name: \"description\",\n value: user.description,\n onchange: v => {\n updatedUser.value = {...updatedUser.value, description: v};\n }\n }),\n SettingsTemplates.emailSettings(user.emails, updatedUser),\n ).build(),\n FJSC.button({\n disabled: saveDisabled,\n classes: [\"positive\"],\n text: \"Save changes\",\n icon: {icon: \"save\"},\n onclick: async () => {\n if (await LydaApi.updateUser(updatedUser.value)) {\n user = {...user, ...updatedUser.value};\n currentUser.value = await Util.getUserAsync(null, false);\n reload();\n }\n }\n })\n ).build();\n }\n\n static notificationsSection(user: User) {\n return create(\"div\")\n .classes(\"card\", \"flex-v\")\n .children(\n create(\"h2\")\n .text(\"E-Mail Notifications\")\n .build(),\n SettingsTemplates.notificationToggle(\"Like notifications\", \"like\", getUserSettingValue(user, UserSettings.notificationLike)),\n SettingsTemplates.notificationToggle(\"Comment notifications\", \"comment\", getUserSettingValue(user, UserSettings.notificationComment)),\n SettingsTemplates.notificationToggle(\"Follow notifications\", \"follow\", getUserSettingValue(user, UserSettings.notificationFollow)),\n SettingsTemplates.notificationToggle(\"Repost notifications\", \"repost\", getUserSettingValue(user, UserSettings.notificationRepost)),\n SettingsTemplates.notificationToggle(\"Collaboration notifications\", \"collaboration\", getUserSettingValue(user, UserSettings.notificationCollaboration)),\n ).build();\n }\n\n static notificationToggle(text: string, key: string, currentValue: boolean) {\n return GenericTemplates.toggle(text, \"notification_\" + key, async () => {\n await UserActions.toggleNotificationSetting(key);\n }, [], currentValue);\n }\n\n static behaviourSection(user: User) {\n return create(\"div\")\n .classes(\"card\", \"flex-v\")\n .children(\n create(\"h2\")\n .text(\"Behaviour\")\n .build(),\n SettingsTemplates.playFromAutoQueueToggle(getUserSettingValue(user, UserSettings.playFromAutoQueue)),\n SettingsTemplates.publicLikesToggle(getUserSettingValue(user, UserSettings.publicLikes)),\n ).build();\n }\n\n static themeSelector(theme: Theme, currentTheme$: Signal) {\n const active$ = compute(c => c === theme ? \"active\" : \"_\", currentTheme$);\n\n return FJSC.button({\n classes: [active$],\n text: theme.toUpperCase(),\n onclick: async () => {\n currentTheme$.value = theme;\n await UserActions.setTheme(theme);\n }\n });\n }\n\n static qualitySelector(value: StreamingQuality, currentValue$: Signal, actualValue$: Signal) {\n const active$ = compute(c => c === value ? \"active\" : \"_\", actualValue$);\n const disabled$ = compute(u => value === StreamingQuality.high && (!u || !u.subscription), currentUser);\n\n return FJSC.button({\n classes: [active$, `quality-selector-${value}`, value === StreamingQuality.high ? \"special\" : \"_\"],\n text: value.toUpperCase(),\n disabled: disabled$,\n onclick: async () => {\n currentValue$.value = value;\n await UserActions.setStreamingQuality(value);\n }\n });\n }\n\n static themeSection(currentTheme: Theme) {\n const themes = Object.values(Theme);\n const currentTheme$ = signal(currentTheme);\n return create(\"div\")\n .classes(\"card\", \"flex-v\")\n .children(\n create(\"h2\")\n .text(\"Theme\")\n .build(),\n create(\"div\")\n .classes(\"flex\")\n .children(\n ...themes.map(theme => SettingsTemplates.themeSelector(theme, currentTheme$))\n ).build(),\n ).build();\n }\n\n static qualitySection(currentValue: StreamingQuality) {\n const values = Object.values(StreamingQuality);\n const currentValue$ = signal(currentValue);\n const actualValue = compute((u, v) => {\n if (!u || !u.subscription) {\n if (v === StreamingQuality.high) {\n return StreamingQuality.medium;\n }\n }\n return v;\n }, currentUser, currentValue$);\n const noSubscription = compute(u => !u || !u.subscription, currentUser);\n\n return create(\"div\")\n .classes(\"card\", \"flex-v\")\n .children(\n create(\"h2\")\n .text(\"Streaming quality\")\n .build(),\n ifjs(noSubscription, create(\"div\")\n .classes(\"text\", \"text-small\", \"color-dim\")\n .text(\"High quality is only available with a subscription.\")\n .build()),\n create(\"div\")\n .classes(\"flex\")\n .children(\n ...values.map(value => SettingsTemplates.qualitySelector(value, currentValue$, actualValue))\n ).build()\n ).build();\n }\n\n static playFromAutoQueueToggle(currentValue: boolean) {\n return GenericTemplates.toggle(\"Play from auto queue\", UserSettings.playFromAutoQueue, async () => {\n await UserActions.togglePlayFromAutoQueue();\n }, [], currentValue);\n }\n\n static publicLikesToggle(currentValue: boolean) {\n return GenericTemplates.toggle(\"Make my library public\", UserSettings.publicLikes, async () => {\n await UserActions.togglePublicLikes();\n }, [], currentValue);\n }\n\n private static dangerSection(user: User) {\n return create(\"div\")\n .classes(\"card\", \"flex-v\")\n .children(\n create(\"h2\")\n .text(\"Danger Zone\")\n .build(),\n create(\"div\")\n .classes(\"flex\")\n .children(\n FJSC.button({\n text: \"Delete account\",\n icon: {icon: \"delete\"},\n classes: [\"negative\"],\n onclick: () => {\n Ui.getConfirmationModal(\"Delete account\", \"Are you sure you want to delete your account? This action cannot be undone.\",\n \"Yes, delete my account\", \"No, keep account\", async () => {\n LydaApi.deleteUser().then(res => {\n if (res.code === 200) {\n notify(\"Account deleted\", NotificationType.success);\n navigate(\"login\");\n window.location.reload();\n } else {\n notify(\"Account deletion failed\", NotificationType.error);\n }\n })\n }, () => {\n }, \"delete\").then();\n }\n }),\n FJSC.button({\n text: \"Download data\",\n icon: {icon: \"download\"},\n onclick: () => {\n LydaApi.exportUser().then(res => {\n if (res.code === 200) {\n const blob = new Blob([JSON.stringify(res.data)], {type: 'application/octet-stream'});\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `userdata-${user.username}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }\n });\n }\n })\n ).build()\n ).build();\n }\n\n private static linksSection() {\n return create(\"div\")\n .classes(\"card\", \"flex-v\")\n .children(\n create(\"h2\")\n .text(\"Links\")\n .build(),\n create(\"div\")\n .classes(\"flex\")\n .children(\n GenericTemplates.gif8831(\"/img/88x31/targoninc.gif\", \"https://targoninc.com\"),\n GenericTemplates.gif8831(\"/img/88x31/firefox.gif\", \"https://www.mozilla.org/en-US/firefox/new/\"),\n GenericTemplates.gif8831(\"/img/88x31/discord.gif\", \"https://discord.gg/QeNU8b7Hbb\"),\n GenericTemplates.gif8831(\"/img/88x31/ubuntu.gif\", \"https://ubuntu.com/\"),\n GenericTemplates.gif8831(\"/img/88x31/hetzner.gif\", \"https://www.hetzner.com/\"),\n ).build(),\n GenericTemplates.inlineLink(() => {\n navigate(\"roadmap\");\n }, \"Roadmap\"),\n ).build();\n }\n\n private static userImageSettings(user: User) {\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex\", \"card\", \"small-card\", \"secondary\")\n .children(\n create(\"span\")\n .text(\"Avatar\")\n .build(),\n UserTemplates.avatarDeleteButton(user),\n UserTemplates.avatarReplaceButton(user)\n ).build(),\n create(\"div\")\n .classes(\"flex\", \"card\", \"small-card\", \"secondary\")\n .children(\n create(\"span\")\n .text(\"Banner\")\n .build(),\n UserTemplates.bannerDeleteButton(user),\n UserTemplates.bannerReplaceButton(user)\n ).build()\n ).build();\n }\n\n private static emailSettings(emails: UserEmail[], updatedUser: Signal>) {\n const emails$ = signal(emails);\n emails$.subscribe(emails => {\n updatedUser.value = {...updatedUser.value, emails};\n });\n const primaryEmailIndex = signal(emails.findIndex(e => e.primary));\n primaryEmailIndex.subscribe(index => {\n emails$.value = emails$.value.map((e, i) => {\n e.primary = i === index;\n return e;\n });\n });\n\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"h2\")\n .classes(\"flex\")\n .children(\n GenericTemplates.icon(\"email\", true),\n create(\"h2\")\n .text(\"E-Mail settings\")\n .build(),\n ).build(),\n signalMap(emails$, create(\"div\").classes(\"flex-v\", \"card\", \"secondary\"), (email, index) => SettingsTemplates.emailSetting(email, signal(index), primaryEmailIndex, emails$)),\n FJSC.button({\n text: \"Add E-Mail\",\n icon: {icon: \"add\"},\n classes: [\"positive\"],\n onclick: async () => {\n emails$.value = [\n ...emails$.value,\n {\n email: \"\",\n primary: false,\n verified: false,\n verified_at: null\n }\n ];\n },\n })\n ).build();\n }\n\n private static emailSetting(email: UserEmail, index: Signal, primaryEmailIndex: Signal, emails$: Signal) {\n const activationTimedOut = signal(false);\n const isPrimary = compute((i, i2) => i === i2, primaryEmailIndex, index);\n\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n FJSC.input(>{\n type: InputType.email,\n name: \"email\",\n required: true,\n value: email.email,\n onchange: v => {\n emails$.value = emails$.value.map((e, i) => {\n if (i === index.value) {\n e.email = v;\n }\n return e;\n });\n }\n }),\n create(\"div\")\n .classes(\"flex\", \"align-children\")\n .children(\n FJSC.toggle({\n text: \"Primary\",\n checked: isPrimary,\n disabled: emails$.value.length === 1,\n title: emails$.value.length === 1 ? \"At least one email is required to be primary\" : \"\",\n onchange: v => {\n if (emails$.value.length === 1) {\n primaryEmailIndex.value = 0;\n return;\n }\n if (v) {\n primaryEmailIndex.value = index.value;\n } else {\n primaryEmailIndex.value = 0;\n }\n }\n }),\n ifjs(email.verified, create(\"div\")\n .classes(\"flex\", \"noflexwrap\", \"small-gap\")\n .children(\n FJSC.icon({\n icon: \"new_releases\",\n adaptive: true,\n classes: [\"text-positive\"],\n }),\n create(\"span\")\n .classes(\"text-positive\")\n .text(\"Verified on \" + Util.formatDate(email.verified_at ?? new Date()))\n .build()\n ).build()),\n ifjs(email.verified || email.email === \"\", FJSC.button({\n icon: {icon: \"verified_user\"},\n text: \"Verify\",\n classes: [\"positive\"],\n disabled: activationTimedOut,\n onclick: async () => {\n await AuthApi.sendActivationEmail();\n activationTimedOut.value = true;\n const interval = setInterval(async () => {\n const user = await Util.getUserAsync(null, false);\n if (user) {\n if (user.emails.some((e: UserEmail) => e.email === email.email && e.verified)) {\n clearInterval(interval);\n activationTimedOut.value = false;\n currentUser.value = user;\n reload();\n }\n }\n }, 10 * 1000);\n\n setTimeout(() => {\n activationTimedOut.value = false;\n }, 60 * 1000);\n }\n }), true),\n ifjs(email.verified, create(\"div\")\n .classes(\"flex\", \"noflexwrap\", \"small-gap\")\n .children(\n FJSC.icon({\n icon: \"warning\",\n adaptive: true,\n classes: [\"warning\"],\n }),\n create(\"span\")\n .classes(\"warning\")\n .text(\"Not verified\")\n .build()\n ).build(), true),\n ifjs(activationTimedOut, create(\"span\")\n .classes(\"text-positive\")\n .text(\"E-Mail sent, check your inbox and click the link to verify this address.\")\n .build()),\n ifjs(email.primary, FJSC.button({\n text: \"Delete\",\n icon: {icon: \"delete\"},\n classes: [\"negative\"],\n onclick: async () => {\n await Ui.getConfirmationModal(\"Delete email\", \"Are you sure you want to delete this email? This can't be undone.\", \"Yes\", \"No\", async () => {\n emails$.value = emails$.value.filter((e, i) => i !== index.value);\n }, () => {\n }, \"delete\");\n }\n }), true),\n ).build(),\n ).build();\n }\n}", "export enum RoadmapItemStatus {\n todo = \"todo\",\n inProgress = \"inProgress\",\n done = \"done\",\n}\n\nexport const roadMapItemIcons: Record = {\n [RoadmapItemStatus.todo]: \"hourglass_empty\",\n [RoadmapItemStatus.inProgress]: \"progress_activity\",\n [RoadmapItemStatus.done]: \"check\",\n};\n", "import {create} from \"../../fjsc/src/f2.ts\";\nimport {GenericTemplates} from \"./GenericTemplates.ts\";\nimport {roadMapItemIcons, RoadmapItemStatus} from \"../Enums/RoadmapItemStatus.ts\";\n\nlet index = 0;\n\nexport class RoadmapTemplates {\n static roadmapPage() {\n index = 0;\n\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"h1\")\n .text(\"Feature Roadmap\")\n .build(),\n RoadmapTemplates.roadmapItem(RoadmapItemStatus.todo, \"2025-2026\", \"Stripe payments + payouts\"),\n RoadmapTemplates.roadmapItem(RoadmapItemStatus.todo, \"2025\", \"Buying music\"),\n RoadmapTemplates.roadmapItem(RoadmapItemStatus.inProgress, \"2025\", \"UX improvements\"),\n RoadmapTemplates.roadmapItem(RoadmapItemStatus.inProgress, \"2025\", \"Royalty payouts\"),\n RoadmapTemplates.roadmapItem(RoadmapItemStatus.done, \"2024\", \"Subscriptions\"),\n RoadmapTemplates.roadmapItem(RoadmapItemStatus.done, \"2024\", \"Complete UI + API rewrite\"),\n RoadmapTemplates.roadmapItem(RoadmapItemStatus.done, \"2023\", \"Basic feeds\"),\n RoadmapTemplates.roadmapItem(RoadmapItemStatus.done, \"2023\", \"Streaming music\"),\n ).build();\n }\n\n static roadmapItem(status: RoadmapItemStatus, plannedTime: string, title: string) {\n const item = create(\"div\")\n .classes(\"flex-v\", \"card\", \"roadmap-item\", status)\n .styles(\"animation-delay\", `calc(.1s * ${index})`)\n .children(\n create(\"div\")\n .classes(\"flex\", \"align-children\", status != RoadmapItemStatus.done ? \"text-large\" : \"_\")\n .children(\n RoadmapTemplates.itemStatus(status),\n create(\"span\")\n .text(plannedTime)\n .build(),\n create(\"span\")\n .text(title)\n .build()\n ).build(),\n ).build();\n\n index++;\n\n return item;\n }\n\n static itemStatus(status: RoadmapItemStatus) {\n return create(\"div\")\n .classes(\"flex-v\", \"align-children\", \"roadmap-item-status\")\n .children(\n GenericTemplates.icon(roadMapItemIcons[status], true, [\"roadmap-item-status-icon\", status])\n ).build();\n }\n}", "import {create, ifjs} from \"../../fjsc/src/f2.ts\";\nimport {AuthActions} from \"../Actions/AuthActions.ts\";\nimport {LandingPageTemplates} from \"./LandingPageTemplates.ts\";\nimport {UserTemplates} from \"./UserTemplates.ts\";\nimport {Api} from \"../Api/Api.ts\";\nimport {Util} from \"../Classes/Util.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {Follow} from \"../Models/DbModels/lyda/Follow.ts\";\nimport {compute, signal} from \"../../fjsc/src/signals.ts\";\nimport {User} from \"../Models/DbModels/lyda/User.ts\";\nimport {SearchTemplates} from \"./SearchTemplates.ts\";\nimport {SettingsTemplates} from \"./SettingsTemplates.ts\";\nimport {RoadmapTemplates} from \"./RoadmapTemplates.ts\";\n\nexport class PageTemplates {\n static mapping: {[key: string]: Function} = {\n explore: this.explorePage,\n following: this.followingPage,\n album: this.albumPage,\n playlist: this.playlistPage,\n profile: this.profilePage,\n settings: SettingsTemplates.settingsPage,\n statistics: this.statisticsPage,\n track: this.trackPage,\n upload: this.uploadPage,\n library: this.libraryPage,\n logout: this.logoutPage,\n login: LandingPageTemplates.newLandingPage,\n faq: this.faqPage,\n logs: this.logsPage,\n \"action-logs\": this.actionLogsPage,\n \"404\": this.notFoundPage,\n \"unapproved-tracks\": this.unapprovedTracksPage,\n moderation: this.moderationPage,\n test: LandingPageTemplates.newLandingPage,\n subscribe: this.subscribePage,\n \"password-reset\": LandingPageTemplates.newLandingPage,\n \"verify-email\": LandingPageTemplates.newLandingPage,\n search: SearchTemplates.searchPage,\n roadmap: RoadmapTemplates.roadmapPage,\n };\n static needLoginPages: string[] = [\n \"library\",\n \"upload\",\n \"settings\",\n \"statistics\",\n \"following\",\n \"unapproved-tracks\",\n \"moderation\",\n \"subscribe\"\n ];\n\n static albumPage() {\n return create(\"div\")\n .attributes(\"lyda\", \"\")\n .attributes(\"endpoint\", ApiRoutes.getAlbumById)\n .attributes(\"params\", \"id\")\n .attributes(\"datatype\", \"album\")\n .build();\n }\n\n static explorePage() {\n return create(\"div\")\n .classes(\"tracks\", \"flex-v\")\n .attributes(\"lyda\", \"\")\n .attributes(\"feedType\", \"explore\")\n .attributes(\"datatype\", \"tracks\")\n .build();\n }\n\n static followingPage() {\n return create(\"div\")\n .classes(\"tracks\", \"flex-v\")\n .attributes(\"lyda\", \"\")\n .attributes(\"feedType\", \"following\")\n .attributes(\"datatype\", \"tracks\")\n .build();\n }\n\n static libraryPage() {\n return create(\"div\")\n .classes(\"flex-v\")\n .attributes(\"lyda\", \"\")\n .attributes(\"datatype\", \"library\")\n .build();\n }\n\n static playlistPage() {\n return create(\"div\")\n .classes(\"playlistPage\")\n .attributes(\"lyda\", \"\")\n .attributes(\"endpoint\", ApiRoutes.getPlaylistById)\n .attributes(\"params\", \"id\")\n .attributes(\"datatype\", \"playlist\")\n .build();\n }\n\n static profilePage() {\n return create(\"div\")\n .classes(\"profile\", \"flex-v\")\n .attributes(\"lyda\", \"\")\n .attributes(\"endpoint\", ApiRoutes.getUser)\n .attributes(\"params\", \"name\")\n .attributes(\"datatype\", \"profile\")\n .build();\n }\n\n static settingsPage() {\n return create(\"div\")\n .classes(\"settings\", \"flex-v\")\n .attributes(\"lyda\", \"\")\n .attributes(\"datatype\", \"settings\")\n .build();\n }\n\n static statisticsPage() {\n return create(\"div\")\n .classes(\"statistics\", \"flex-v\")\n .attributes(\"lyda\", \"\")\n .attributes(\"datatype\", \"statistics\")\n .build();\n }\n\n static trackPage() {\n return create(\"div\")\n .classes(\"trackPage\")\n .attributes(\"lyda\", \"\")\n .attributes(\"endpoint\", ApiRoutes.getTrackById)\n .attributes(\"params\", \"id,code\")\n .attributes(\"datatype\", \"track\")\n .build();\n }\n\n static uploadPage() {\n return create(\"div\")\n .classes(\"form\")\n .attributes(\"lyda\", \"\")\n .attributes(\"datatype\", \"uploadForm\")\n .build();\n }\n\n static logoutPage() {\n AuthActions.logOutWithRedirect().then();\n return create(\"div\")\n .text(\"Logging out...\")\n .build();\n }\n\n static loginPage() {\n return create(\"div\")\n .id(\"landingPage\")\n .children(LandingPageTemplates.newLandingPage())\n .build();\n }\n\n static faqPage() {\n return create(\"div\")\n .classes(\"faq\")\n .children(\n create(\"h3\")\n .classes(\"question\")\n .text(\"Can I use Lyda without a subscription?\")\n .build(),\n create(\"p\")\n .classes(\"answer\")\n .text(\"Yes, you can. However, the features are very limited and streaming quality will not be great. You can still buy songs and download them.\")\n .build(),\n create(\"h3\")\n .classes(\"question\")\n .text(\"How can I cancel my subscription?\")\n .build(),\n create(\"p\")\n .classes(\"answer\")\n .text(\"You can manage your subscriptions here. Your subscription will be cancelled and if you are on a yearly plan, the remaining time refunded.\")\n .build(),\n create(\"h3\")\n .classes(\"question\")\n .text(\"How do you make money?\")\n .build(),\n create(\"p\")\n .classes(\"answer\")\n .text(\"We take a percentage of all subscriptions and sales. This varies based on how high our income and expenses are.\")\n .build()\n )\n .build();\n }\n\n static logsPage() {\n return create(\"div\")\n .classes(\"logs\")\n .attributes(\"lyda\", \"\")\n .attributes(\"datatype\", \"logs\")\n .build();\n }\n\n static actionLogsPage() {\n return create(\"div\")\n .classes(\"logs\")\n .attributes(\"lyda\", \"\")\n .attributes(\"datatype\", \"actionLogs\")\n .build();\n }\n\n static notFoundPage() {\n const randomUserWidget = signal(create(\"span\").text(\"loading...\").build());\n const user = signal(null);\n const following = compute(u => !!(u && Util.arrayPropertyMatchesUser(u.follows ?? [], \"following_user_id\")), user);\n\n Api.getAsync(ApiRoutes.randomUser).then(async data => {\n if (data.code !== 200) {\n randomUserWidget.value = create(\"span\").text(\"Failed to load random user\").build();\n return;\n }\n user.value = data.data as User;\n });\n\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"h1\")\n .styles(\"font-size\", \"10vw\", \"line-height\", \"1\", \"font-weight\", \"bold\")\n .text(\"404\")\n .build(),\n create(\"h2\")\n .text(\"Nothing here 👀\")\n .build(),\n create(\"span\")\n .text(\"If you were trying to find a user, here's a random one:\")\n .build(),\n ifjs(user, create(\"div\")\n .classes(\"flex\")\n .children(\n UserTemplates.userWidget(user, following)\n ).build()),\n ).build();\n }\n\n static unapprovedTracksPage() {\n return create(\"div\")\n .classes(\"unapprovedTracks\")\n .attributes(\"lyda\", \"\")\n .attributes(\"datatype\", \"unapprovedTracks\")\n .build();\n }\n\n static moderationPage() {\n return create(\"div\")\n .classes(\"moderation\")\n .attributes(\"lyda\", \"\")\n .attributes(\"datatype\", \"moderation\")\n .build();\n }\n\n static subscribePage() {\n return create(\"div\")\n .classes(\"subscribe\")\n .attributes(\"lyda\", \"\")\n .attributes(\"datatype\", \"subscribe\")\n .build();\n }\n}", "import {PlayManager} from \"../Streaming/PlayManager.ts\";\nimport {UiActions} from \"../Actions/UiActions.ts\";\nimport {AuthActions} from \"../Actions/AuthActions.ts\";\nimport {currentTrackId} from \"../state.ts\";\nimport {signal} from \"../../fjsc/src/signals.ts\";\nimport {target} from \"./Util.ts\";\n\nconst keybindsInitialized = signal(false);\n\nexport class KeyBinds {\n static bindings: {[key: string]: string[]} = {\n TogglePlay: [\"Space\"],\n SkipForward: [\"ArrowRight\", \"KeyD\"],\n SkipBackward: [\"ArrowLeft\", \"KeyA\"],\n VolumeUp: [\"ArrowUp\"],\n VolumeDown: [\"ArrowDown\"],\n NewMenu: [\"KeyN\"],\n Close: [\"Escape\"],\n LoginLogout: [\"KeyL\"],\n };\n\n static functionMap: {[key: string]: {function: Function, neededModifiers?: string[]}} = {\n TogglePlay: { function: PlayManager.togglePlayAsync },\n SkipForward: { function: PlayManager.skipForward, neededModifiers: [\"shift\"] },\n SkipBackward: { function: PlayManager.skipBackward, neededModifiers: [\"shift\"] },\n VolumeUp: { function: PlayManager.volumeUp, neededModifiers: [\"shift\"] },\n VolumeDown: { function: PlayManager.volumeDown, neededModifiers: [\"shift\"] },\n NewMenu: { function: UiActions.openCreateMenu, neededModifiers: [\"shift\"] },\n LoginLogout: {function: AuthActions.loginLogout, neededModifiers: [\"shift\"]},\n Close: { function: UiActions.closeModal },\n };\n\n static handler(e: KeyboardEvent) {\n const ignoredTargets = [\"input\", \"textarea\", \"select\", \"button\"];\n if (ignoredTargets.includes(target(e).tagName.toLowerCase())) {\n return;\n }\n for (const action in KeyBinds.bindings) {\n const keybinds = KeyBinds.bindings[action];\n for (const key of keybinds) {\n if (e.code === key) {\n const funcItem = KeyBinds.functionMap[action];\n if (funcItem.neededModifiers) {\n for (const modifier of funcItem.neededModifiers) {\n // @ts-ignore\n if (!e[modifier+\"Key\"]) {\n return;\n }\n }\n }\n e.preventDefault();\n funcItem.function(currentTrackId.value);\n }\n }\n }\n }\n\n static initiate() {\n if (keybindsInitialized.value) {\n return;\n }\n document.addEventListener(\"keydown\", KeyBinds.handler);\n keybindsInitialized.value = true;\n }\n}", "import {Api} from \"../Api/Api.ts\";\nimport {notify} from \"./Ui.ts\";\nimport {UserTemplates} from \"../Templates/UserTemplates.ts\";\nimport {GenericTemplates} from \"../Templates/GenericTemplates.ts\";\nimport {User} from \"../Models/DbModels/lyda/User.ts\";\nimport {AnyElement} from \"../../fjsc/src/f2.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {getErrorMessage} from \"./Util.ts\";\nimport {Track} from \"../Models/DbModels/lyda/Track.ts\";\nimport {Album} from \"../Models/DbModels/lyda/Album.ts\";\nimport {Playlist} from \"../Models/DbModels/lyda/Playlist.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\n\nexport class ProfilePage {\n static async addTabSectionAsync(element: AnyElement, user: User, isOwnProfile: boolean) {\n const container = document.createElement(\"div\");\n container.classList.add(\"flex-v\");\n element.appendChild(container);\n const tracksContainer = GenericTemplates.containerWithSpinner(\"tracks-container\");\n const albumsContainer = GenericTemplates.containerWithSpinner(\"albums-container\");\n const playlistsContainer = GenericTemplates.containerWithSpinner(\"playlists-container\");\n const repostsContainer = GenericTemplates.containerWithSpinner(\"reposts-container\");\n\n const tabs = [\"Tracks\", \"Albums\", \"Playlists\", \"Reposts\"];\n const tabContents = [tracksContainer, albumsContainer, playlistsContainer, repostsContainer];\n const tabSelector = GenericTemplates.tabSelector(tabs, (i: number) => {\n tabContents.forEach((c, j) => {\n c.style.display = i === j ? \"block\" : \"none\";\n });\n }, 0);\n container.append(tabSelector, tracksContainer, albumsContainer, playlistsContainer, repostsContainer);\n ProfilePage.addAlbumsAsync(albumsContainer, user, isOwnProfile).then();\n ProfilePage.addTracksAsync(tracksContainer, user, isOwnProfile).then();\n ProfilePage.addPlaylistsAsync(playlistsContainer, user, isOwnProfile).then();\n ProfilePage.addRepostsAsync(repostsContainer, user, isOwnProfile).then();\n }\n\n static async addTracksAsync(element: AnyElement, user: User, isOwnProfile: boolean) {\n const res = await Api.getAsync(ApiRoutes.getTrackByUserId, { id: user.id, name: user.username });\n if (res.code !== 200) {\n notify(\"Error while getting tracks: \" + getErrorMessage(res), NotificationType.error);\n return;\n }\n const tracks = res.data;\n const trackCards = UserTemplates.trackCards(tracks, user.id, isOwnProfile);\n element.innerHTML = \"\";\n element.appendChild(trackCards);\n }\n\n static async addAlbumsAsync(element: AnyElement, user: User, isOwnProfile: boolean) {\n const res = await Api.getAsync(ApiRoutes.getAlbumsByUserId, {\n id: user.id, name: user.username\n });\n if (res.code !== 200) {\n notify(\"Error while getting albums: \" + getErrorMessage(res), NotificationType.error);\n return;\n }\n const albums = res.data;\n const albumCards = UserTemplates.albumCards(albums, isOwnProfile);\n element.innerHTML = \"\";\n element.appendChild(albumCards);\n }\n\n static async addPlaylistsAsync(element: AnyElement, user: User, isOwnProfile: boolean) {\n const res = await Api.getAsync(ApiRoutes.getPlaylistsByUserId, {\n id: user.id, name: user.username\n });\n if (res.code !== 200) {\n notify(\"Error while getting playlists: \" + getErrorMessage(res), NotificationType.error);\n return;\n }\n const playlists = res.data;\n const playlistCards = UserTemplates.playlistCards(playlists, isOwnProfile);\n element.innerHTML = \"\";\n element.appendChild(playlistCards);\n }\n\n static async addRepostsAsync(element: AnyElement, user: User, isOwnProfile: boolean) {\n const res = await Api.getAsync(ApiRoutes.getRepostsByUserId, {\n id: user.id, name: user.username\n });\n if (res.code !== 200) {\n notify(\"Error while getting reposts: \" + getErrorMessage(res), NotificationType.error);\n return;\n }\n const reposts = res.data;\n const repostCards = UserTemplates.trackCards(reposts, user.id, isOwnProfile);\n element.innerHTML = \"\";\n element.appendChild(repostCards);\n }\n}", "import {Api} from \"../Api/Api.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {notify} from \"../Classes/Ui.ts\";\nimport {Album} from \"../Models/DbModels/lyda/Album.ts\";\nimport {Playlist} from \"../Models/DbModels/lyda/Playlist.ts\";\nimport {Track} from \"../Models/DbModels/lyda/Track.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\nimport {Library} from \"../Models/Library.ts\";\n\nexport class LibraryActions {\n static async getLibrary(name: string) {\n const res = await Api.getAsync(ApiRoutes.getLibrary, { name });\n if (res.code !== 200) {\n notify(\"Failed to get library\", NotificationType.error);\n return null;\n }\n return res.data as Library;\n }\n}", "import {Time} from \"../Classes/Helpers/Time.ts\";\nimport {UserTemplates} from \"./UserTemplates.ts\";\nimport {GenericTemplates} from \"./GenericTemplates.ts\";\nimport {copy, Util} from \"../Classes/Util.ts\";\nimport {AnyElement, create, ifjs} from \"../../fjsc/src/f2.ts\";\nimport {User} from \"../Models/DbModels/lyda/User.ts\";\nimport {compute, signal, Signal} from \"../../fjsc/src/signals.ts\";\nimport {PillOption} from \"../Models/PillOption.ts\";\nimport {LogLevel} from \"../Enums/LogLevel.ts\";\nimport {Log} from \"../Models/DbModels/lyda/Log.ts\";\nimport {FJSC} from \"../../fjsc\";\nimport {LydaApi} from \"../Api/LydaApi.ts\";\nimport {truncateText} from \"../Classes/Helpers/CustomText.ts\";\n\nexport class LogTemplates {\n static async actionLogs(selfUser: User, data: any[]) {\n const users = {};\n for (const log of data) {\n if (!users[log.user_id]) {\n users[log.user_id] = await Util.getUserAsync(log.user_id);\n }\n if (!users[log.actionedUserId]) {\n users[log.actionedUserId] = await Util.getUserAsync(log.actionedUserId);\n }\n }\n\n return create(\"table\")\n .classes(\"logs\")\n .attributes(\"cellspacing\", \"0\", \"cellpadding\", \"0\")\n .children(\n create(\"thead\")\n .children(\n create(\"tr\")\n .classes(\"log\")\n .children(\n LogTemplates.header(\"Timestamp\", \"log-timestamp\"),\n LogTemplates.header(\"User\", \"log-user\"),\n LogTemplates.header(\"Action Name\", \"log-action-name\"),\n LogTemplates.header(\"Actioned User\", \"log-user\"),\n LogTemplates.header(\"Properties\", \"log-properties\"),\n ).build(),\n ).build(),\n create(\"tbody\")\n .children(\n ...data.map(l => {\n return create(\"tr\")\n .classes(\"log\", l.type)\n .children(\n create(\"td\")\n .classes(\"log-timestamp\")\n .text(Time.ago(l.createdAt))\n .build(),\n create(\"td\")\n .classes(\"log-user\")\n .children(\n UserTemplates.userWidget(users[l.user_id], users[l.user_id].follows.some(f => f.following_user_id === selfUser.id)),\n ).build(),\n create(\"td\")\n .classes(\"log-action-name\")\n .text(l.actionName)\n .build(),\n create(\"td\")\n .classes(\"log-user\")\n .children(\n UserTemplates.userWidget(users[l.actioned_user_id], users[l.actionedUserId].follows.some(f => f.following_user_id === selfUser.id)),\n ).build(),\n LogTemplates.properties(l.additional_info),\n ).build();\n })\n ).build(),\n ).build();\n }\n\n static header(title: string, type: string) {\n return create(\"th\")\n .classes(type)\n .children(\n create(\"span\")\n .classes(\"table-header\")\n .text(title)\n .build(),\n ).build();\n }\n\n static logs(data: Log[]) {\n const headers = [\"Timestamp\", \"Host\", \"Log Level\", \"Message\", \"Stack\", \"Properties\"];\n const headerDefinitions = headers.map(h => ({\n title: h,\n className: h.toLowerCase().replaceAll(\" \", \"-\"),\n }));\n const logLevelMap: Record = {\n [LogLevel.debug]: \"Debug\",\n [LogLevel.success]: \"Success\",\n [LogLevel.info]: \"Info\",\n [LogLevel.warning]: \"Warning\",\n [LogLevel.error]: \"Error\",\n [LogLevel.critical]: \"Critical\",\n [LogLevel.unknown]: \"Unknown\",\n };\n\n return create(\"table\")\n .classes(\"logs\", \"fixed-bar-content\")\n .attributes(\"cellspacing\", \"0\", \"cellpadding\", \"0\")\n .children(\n create(\"thead\")\n .children(\n create(\"tr\")\n .classes(\"log\")\n .children(\n ...headerDefinitions.map(h => LogTemplates.header(h.title, h.className)),\n ).build(),\n ).build(),\n create(\"tbody\")\n .children(\n ...data.map(l => LogTemplates.logEntry(logLevelMap, l))\n ).build(),\n ).build();\n }\n\n private static logEntry(logLevelMap: Record, l: Log) {\n const type = logLevelMap[l.logLevel].toLowerCase();\n const ago = Time.agoUpdating(new Date(l.time), true);\n const timestamp = compute(t => Time.toTimeString(l.time) + \" | \" + t, ago);\n\n return create(\"tr\")\n .classes(\"log\", type)\n .children(\n create(\"td\")\n .classes(\"log-timestamp\")\n .text(timestamp)\n .build(),\n create(\"td\")\n .classes(\"log-host\", \"color-dim\")\n .text(l.host)\n .build(),\n create(\"td\")\n .classes(\"log-level\")\n .text(logLevelMap[l.logLevel])\n .build(),\n create(\"td\")\n .classes(\"log-message\", type, \"color-dim\", \"text-small\")\n .title(l.message)\n .text(truncateText(l.message, 200))\n .onclick(() => copy(l.message))\n .build(),\n create(\"td\")\n .classes(\"log-stack\")\n .children(\n FJSC.button({\n text: \"Copy stack\",\n icon: {icon: \"content_copy\"},\n onclick: () => copy(l.stack)\n }),\n ).build(),\n LogTemplates.properties(l.properties),\n ).build();\n }\n\n static properties(data: any) {\n if (Object.keys(data).length === 0) {\n return create(\"td\")\n .classes(\"log-properties\")\n .build();\n }\n const shown = signal(false);\n\n return create(\"td\")\n .classes(\"flex-v\")\n .styles(\"position\", \"relative\")\n .children(\n FJSC.button({\n text: \"Info\",\n icon: { icon: \"info\" },\n onclick: () => {\n shown.value = !shown.value;\n }\n }),\n ifjs(shown, create(\"div\")\n .classes(\"flex-v\", \"card\", \"popout-below\", \"log-properties\")\n .children(\n ...Object.keys(data).map(k => {\n return LogTemplates.property(k, data[k]);\n })\n ).build()),\n ).build();\n }\n\n static signalProperty(key: string, value: Signal): AnyElement {\n const el = create(\"div\")\n .children(\n LogTemplates.property(key, value.value)\n ).build();\n value.subscribe(v => {\n el.innerHTML = \"\";\n el.appendChild(LogTemplates.property(key, v));\n });\n\n return el;\n }\n\n static property(key: string, value: any): AnyElement {\n if (value === null) {\n value = \"null\";\n }\n\n let valueChild, showKey = true;\n if (typeof value !== \"object\") {\n valueChild = create(\"span\")\n .classes(\"property-value\")\n .text(value)\n .build();\n } else {\n showKey = false;\n valueChild = create(\"details\")\n .children(\n create(\"summary\")\n .classes(\"property-value\")\n .text(key)\n .build(),\n create(\"div\")\n .classes(\"property-value\", \"flex-v\")\n .children(\n ...Object.keys(value).map((k: string) => {\n return LogTemplates.property(k, value[k]) as any;\n })\n ).build()\n ).build();\n }\n\n return create(\"div\")\n .classes(\"property\", \"flex\")\n .children(\n showKey ? create(\"span\")\n .classes(\"property-key\")\n .text(key)\n .build() : null,\n valueChild\n ).build();\n }\n\n static logsPage() {\n const filterState = signal(LogLevel.debug);\n const refreshOnInterval = signal(false);\n const logsList = signal(create(\"div\").build());\n const refresh = () => {\n LydaApi.getLogs(filterState, async (logs: Log[]) => {\n logsList.value = LogTemplates.logs(logs);\n });\n };\n setInterval(() => {\n if (refreshOnInterval.value) {\n refresh();\n }\n }, 1000 * 5);\n refresh();\n\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex\", \"align-children\", \"fixed-bar\")\n .children(\n LogTemplates.logFilters(filterState),\n FJSC.button({\n text: \"Refresh\",\n icon: { icon: \"refresh\" },\n classes: [\"positive\"],\n onclick: async () => {\n logsList.value = create(\"div\").build();\n refresh();\n }\n }),\n FJSC.toggle({\n text: \"Auto-refresh\",\n id: \"auto-refresh\",\n checked: refreshOnInterval,\n onchange: (v) => {\n refreshOnInterval.value = v;\n }\n }),\n ).build(),\n logsList\n ).build();\n }\n\n static logFilters(pillState: Signal) {\n const filterMap: Record> = {\n debug: {\n text: \"Debug\",\n icon: \"bug_report\",\n value: LogLevel.debug\n },\n success: {\n text: \"Success\",\n icon: \"check\",\n value: LogLevel.success\n },\n info: {\n text: \"Info\",\n icon: \"info\",\n value: LogLevel.info\n },\n warnings: {\n text: \"Warnings\",\n icon: \"warning\",\n value: LogLevel.warning\n },\n errors: {\n text: \"Errors\",\n icon: \"report\",\n value: LogLevel.error\n },\n };\n const options = Object.keys(filterMap).map(k => {\n return {\n ...filterMap[k],\n onclick: () => {\n pillState.value = filterMap[k].value;\n }\n };\n }) as PillOption[];\n\n return GenericTemplates.pills(options, pillState);\n }\n}", "export class Num {\n static shortenInArray(array) {\n return array.map((a) => {\n return Num.shorten(a);\n });\n }\n\n static shorten(number) {\n if (number.constructor !== Number) {\n number = parseInt(number);\n }\n if (number > 1000000) {\n return Math.round(number / 1000000) + \"m\";\n } else if (number > 1000) {\n return Math.round(number / 1000) + \"k\";\n }\n return number;\n }\n}\n\nexport function currency(number: any, currency = \"USD\") {\n if (!number) {\n return new Intl.NumberFormat(\"en-US\", { style: \"currency\", currency }).format(0);\n }\n if (number.constructor === String && number.includes(\".\")) {\n number = parseFloat(number as string);\n }\n if (number.constructor !== Number) {\n number = parseInt(number);\n }\n return new Intl.NumberFormat(\"en-US\", { style: \"currency\", currency }).format(number);\n}\n", "/*!\n * paypal-js v8.1.2 (2024-09-16T17:52:36.940Z)\n * Copyright 2020-present, PayPal, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction findScript(url, attributes) {\n var currentScript = document.querySelector(\"script[src=\\\"\".concat(url, \"\\\"]\"));\n if (currentScript === null)\n return null;\n var nextScript = createScriptElement(url, attributes);\n // ignore the data-uid-auto attribute that gets auto-assigned to every script tag\n var currentScriptClone = currentScript.cloneNode();\n delete currentScriptClone.dataset.uidAuto;\n // check if the new script has the same number of data attributes\n if (Object.keys(currentScriptClone.dataset).length !==\n Object.keys(nextScript.dataset).length) {\n return null;\n }\n var isExactMatch = true;\n // check if the data attribute values are the same\n Object.keys(currentScriptClone.dataset).forEach(function (key) {\n if (currentScriptClone.dataset[key] !== nextScript.dataset[key]) {\n isExactMatch = false;\n }\n });\n return isExactMatch ? currentScript : null;\n}\nfunction insertScriptElement(_a) {\n var url = _a.url, attributes = _a.attributes, onSuccess = _a.onSuccess, onError = _a.onError;\n var newScript = createScriptElement(url, attributes);\n newScript.onerror = onError;\n newScript.onload = onSuccess;\n document.head.insertBefore(newScript, document.head.firstElementChild);\n}\nfunction processOptions(options) {\n var environment = options.environment;\n // Keeping production as default to maintain backward compatibility.\n // In the future this logic needs to be changed to use sandbox domain as default instead of production.\n var sdkBaseUrl = environment === \"sandbox\"\n ? \"https://www.sandbox.paypal.com/sdk/js\"\n : \"https://www.paypal.com/sdk/js\";\n // env is not an allowed key for sdk/js url.\n delete options.environment;\n if (options.sdkBaseUrl) {\n sdkBaseUrl = options.sdkBaseUrl;\n delete options.sdkBaseUrl;\n }\n var optionsWithStringIndex = options;\n var _a = Object.keys(optionsWithStringIndex)\n .filter(function (key) {\n return (typeof optionsWithStringIndex[key] !== \"undefined\" &&\n optionsWithStringIndex[key] !== null &&\n optionsWithStringIndex[key] !== \"\");\n })\n .reduce(function (accumulator, key) {\n var value = optionsWithStringIndex[key].toString();\n key = camelCaseToKebabCase(key);\n if (key.substring(0, 4) === \"data\" || key === \"crossorigin\") {\n accumulator.attributes[key] = value;\n }\n else {\n accumulator.queryParams[key] = value;\n }\n return accumulator;\n }, {\n queryParams: {},\n attributes: {},\n }), queryParams = _a.queryParams, attributes = _a.attributes;\n if (queryParams[\"merchant-id\"] &&\n queryParams[\"merchant-id\"].indexOf(\",\") !== -1) {\n attributes[\"data-merchant-id\"] = queryParams[\"merchant-id\"];\n queryParams[\"merchant-id\"] = \"*\";\n }\n return {\n url: \"\".concat(sdkBaseUrl, \"?\").concat(objectToQueryString(queryParams)),\n attributes: attributes,\n };\n}\nfunction camelCaseToKebabCase(str) {\n var replacer = function (match, indexOfMatch) {\n return (indexOfMatch ? \"-\" : \"\") + match.toLowerCase();\n };\n return str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, replacer);\n}\nfunction objectToQueryString(params) {\n var queryString = \"\";\n Object.keys(params).forEach(function (key) {\n if (queryString.length !== 0)\n queryString += \"&\";\n queryString += key + \"=\" + params[key];\n });\n return queryString;\n}\nfunction createScriptElement(url, attributes) {\n if (attributes === void 0) { attributes = {}; }\n var newScript = document.createElement(\"script\");\n newScript.src = url;\n Object.keys(attributes).forEach(function (key) {\n newScript.setAttribute(key, attributes[key]);\n if (key === \"data-csp-nonce\") {\n newScript.setAttribute(\"nonce\", attributes[\"data-csp-nonce\"]);\n }\n });\n return newScript;\n}\n\n/**\n * Load the Paypal JS SDK script asynchronously.\n *\n * @param {Object} options - used to configure query parameters and data attributes for the JS SDK.\n * @param {PromiseConstructor} [PromisePonyfill=window.Promise] - optional Promise Constructor ponyfill.\n * @return {Promise} paypalObject - reference to the global window PayPal object.\n */\nfunction loadScript(options, PromisePonyfill) {\n if (PromisePonyfill === void 0) { PromisePonyfill = Promise; }\n validateArguments(options, PromisePonyfill);\n // resolve with null when running in Node or Deno\n if (typeof document === \"undefined\")\n return PromisePonyfill.resolve(null);\n var _a = processOptions(options), url = _a.url, attributes = _a.attributes;\n var namespace = attributes[\"data-namespace\"] || \"paypal\";\n var existingWindowNamespace = getPayPalWindowNamespace(namespace);\n if (!attributes[\"data-js-sdk-library\"]) {\n attributes[\"data-js-sdk-library\"] = \"paypal-js\";\n }\n // resolve with the existing global paypal namespace when a script with the same params already exists\n if (findScript(url, attributes) && existingWindowNamespace) {\n return PromisePonyfill.resolve(existingWindowNamespace);\n }\n return loadCustomScript({\n url: url,\n attributes: attributes,\n }, PromisePonyfill).then(function () {\n var newWindowNamespace = getPayPalWindowNamespace(namespace);\n if (newWindowNamespace) {\n return newWindowNamespace;\n }\n throw new Error(\"The window.\".concat(namespace, \" global variable is not available.\"));\n });\n}\n/**\n * Load a custom script asynchronously.\n *\n * @param {Object} options - used to set the script url and attributes.\n * @param {PromiseConstructor} [PromisePonyfill=window.Promise] - optional Promise Constructor ponyfill.\n * @return {Promise} returns a promise to indicate if the script was successfully loaded.\n */\nfunction loadCustomScript(options, PromisePonyfill) {\n if (PromisePonyfill === void 0) { PromisePonyfill = Promise; }\n validateArguments(options, PromisePonyfill);\n var url = options.url, attributes = options.attributes;\n if (typeof url !== \"string\" || url.length === 0) {\n throw new Error(\"Invalid url.\");\n }\n if (typeof attributes !== \"undefined\" && typeof attributes !== \"object\") {\n throw new Error(\"Expected attributes to be an object.\");\n }\n return new PromisePonyfill(function (resolve, reject) {\n // resolve with undefined when running in Node or Deno\n if (typeof document === \"undefined\")\n return resolve();\n insertScriptElement({\n url: url,\n attributes: attributes,\n onSuccess: function () { return resolve(); },\n onError: function () {\n var defaultError = new Error(\"The script \\\"\".concat(url, \"\\\" failed to load. Check the HTTP status code and response body in DevTools to learn more.\"));\n return reject(defaultError);\n },\n });\n });\n}\nfunction getPayPalWindowNamespace(namespace) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return window[namespace];\n}\nfunction validateArguments(options, PromisePonyfill) {\n if (typeof options !== \"object\" || options === null) {\n throw new Error(\"Expected an options object.\");\n }\n var environment = options.environment;\n if (environment &&\n environment !== \"production\" &&\n environment !== \"sandbox\") {\n throw new Error('The `environment` option must be either \"production\" or \"sandbox\".');\n }\n if (typeof PromisePonyfill !== \"undefined\" &&\n typeof PromisePonyfill !== \"function\") {\n throw new Error(\"Expected PromisePonyfill to be a function.\");\n }\n}\n\n// replaced with the package.json version at build time\nvar version = \"8.1.2\";\n\nexport { loadCustomScript, loadScript, version };\n", "import {Api} from \"../Api/Api.ts\";\nimport {notify, Ui} from \"../Classes/Ui.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {getErrorMessage} from \"../Classes/Util.ts\";\nimport {Signal} from \"../../fjsc/src/signals.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\nimport {AvailableSubscription} from \"../Models/DbModels/finance/AvailableSubscription.ts\";\nimport {Subscription} from \"../Models/DbModels/finance/Subscription.ts\";\nimport {CreateSubscriptionActions, loadScript,\n OnApproveActions, OnApproveData, PayPalButtonsComponentOptions, PayPalNamespace} from \"@paypal/paypal-js\";\nimport {reload} from \"../Routing/Router.ts\";\n\nconst clientId = \"AUw6bB-HQTIfqy5fhk-s5wZOaEQdaCIjRnCyIC3WDCRxVKc9Qvz1c6xLw7etCit1CD1qSHY5Pv-3xgQN\";\n// @ts-ignore\nconst paypal: PayPalNamespace = await loadScript({\n clientId,\n vault: true,\n intent: \"subscription\",\n});\nif (!paypal) {\n console.warn(\"PayPal SDK could not initialized\");\n}\n\nexport class SubscriptionActions {\n static async startSubscription(id: number, subPlanId: string, optionMessage: Signal) {\n SubscriptionActions.initializeDomForSubStart(id, optionMessage);\n SubscriptionActions.initializePaypalButton(subPlanId, \"paypal-button-\" + id, optionMessage, async (paypalData: any) => {\n await SubscriptionActions.subscriptionSuccess(paypalData, {\n id,\n planId: subPlanId,\n orderId: paypalData.orderID,\n externalSubscriptionId: paypalData.subscriptionID\n });\n });\n }\n\n static initializeDomForSubStart(id: number, optionMessage: Signal) {\n const subStarter = document.querySelector(\".subStarter[id=\\\"\" + id + \"\\\"]\");\n if (!subStarter) {\n console.warn(\"Could not find subStarter with id \" + id);\n return;\n }\n subStarter.classList.add(\"selected\");\n optionMessage.value = \"Click the button below to start your subscription\";\n }\n\n static initializePaypalButton(plan_id: string, button_id: string, message: Signal, onApprove: Function) {\n const buttons = paypal.Buttons!({\n createSubscription(data: Record, actions: CreateSubscriptionActions) {\n return actions.subscription.create({\n \"plan_id\": plan_id\n });\n },\n onClick(data: any, actions: any) {\n message.value = \"Opened PayPal popup\";\n },\n async onApprove(data: OnApproveData, actions: OnApproveActions) {\n await onApprove(data, actions);\n },\n onError(err: Record) {\n notify(\"Failed to start subscription: \" + err, NotificationType.error);\n message.value = \"Failed to start subscription\";\n },\n onCancel() {\n notify(\"Subscription creation cancelled\", NotificationType.info);\n message.value = \"Subscription creation cancelled\";\n },\n style: {\n color: \"silver\",\n shape: \"pill\",\n layout: \"horizontal\",\n tagline: false\n }\n });\n buttons.render(\"#\" + button_id);\n }\n\n static async subscriptionSuccess(data: any, parameters: any) {\n const res = await Api.postAsync(ApiRoutes.subscribe, {...parameters});\n if (res.code === 200) {\n notify(\"Subscription started\", NotificationType.success);\n reload();\n } else {\n notify(\"Error when starting subscription: \" + getErrorMessage(res), NotificationType.error);\n }\n }\n\n static async cancelSubscriptionWithConfirmationAsync(subscriptionId: number) {\n await Ui.getConfirmationModal(\n \"Cancel subscription\",\n \"Are you sure you want to cancel this subscription?\",\n \"Yes\", \"No\",\n () => SubscriptionActions.cancelSubscriptionAsync(subscriptionId),\n () => {},\n \"contract_delete\"\n );\n }\n\n static async cancelSubscriptionAsync(id: number) {\n const res = await Api.postAsync(ApiRoutes.unsubscribe, {id});\n if (res.code !== 200) {\n notify(\"Error while cancelling subscription: \" + getErrorMessage(res), NotificationType.error);\n return false;\n }\n\n notify(\"Subscription cancelled\", NotificationType.success);\n reload();\n return true;\n }\n\n static async loadSubscriptionOptions() {\n const res = await Api.getAsync<{\n options: AvailableSubscription[],\n currentSubscription: Subscription|null\n }>(ApiRoutes.getSubscriptionOptions);\n if (res.code !== 200) {\n notify(\"Failed to load subscription options\", NotificationType.error);\n return;\n }\n\n return res.data;\n }\n}", "import {create, ifjs, signalMap} from \"../../fjsc/src/f2.ts\";\nimport {Num as NumberFormatter} from \"../Classes/Helpers/Num.ts\";\nimport {SubscriptionActions} from \"../Actions/SubscriptionActions.ts\";\nimport {GenericTemplates} from \"./GenericTemplates.ts\";\nimport {Time} from \"../Classes/Helpers/Time.ts\";\nimport {compute, signal, Signal} from \"../../fjsc/src/signals.ts\";\nimport {AvailableSubscription} from \"../Models/DbModels/finance/AvailableSubscription.ts\";\nimport {Subscription} from \"../Models/DbModels/finance/Subscription.ts\";\nimport {SubscriptionStatus} from \"../Enums/SubscriptionStatus.ts\";\n\nexport class SubscriptionTemplates {\n static page(currency: string, options: Signal, currentSubscription: Signal) {\n const selectedOption = signal(null);\n const optionsLoading = compute(o => o.length === 0, options);\n\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"h1\")\n .text(\"Lyda subscription\")\n .build(),\n ifjs(currentSubscription, create(\"span\")\n .classes(\"color-dim\")\n .text(\"You do not have an active subscription. Choose any of the options below to start. All prices are in USD.\")\n .build(), true),\n create(\"h2\")\n .text(\"Your benefits\")\n .build(),\n SubscriptionTemplates.subscriptionBenefits(),\n ifjs(optionsLoading, GenericTemplates.loadingSpinner()),\n signalMap(options, create(\"div\")\n .classes(\"flex\"),\n (option) => SubscriptionTemplates.option(currentSubscription, selectedOption, currency, option)),\n ).build();\n }\n\n static subscriptionBenefits() {\n return create(\"div\")\n .classes(\"marquee\")\n .styles(\"max-width\", \"min(500px, 100%)\")\n .children(\n create(\"div\")\n .classes(\"scrolling\", \"flex\")\n .children(\n GenericTemplates.benefit(\"Listen in higher quality\", \"hearing\"),\n GenericTemplates.benefit(\"Artists earn money through you\", \"attach_money\"),\n GenericTemplates.benefit(\"No ads\", \"ad_group_off\"),\n GenericTemplates.benefit(\"Comment on tracks\", \"comment\"),\n GenericTemplates.benefit(\"Listen in higher quality\", \"hearing\"),\n GenericTemplates.benefit(\"Artists earn money through you\", \"attach_money\"),\n GenericTemplates.benefit(\"No ads\", \"ad_group_off\"),\n GenericTemplates.benefit(\"Comment on tracks\", \"comment\"),\n ).build()\n ).build();\n }\n\n static paypalButton(button_id: string) {\n return create(\"div\")\n .classes(\"paypalButton\")\n .children(\n create(\"div\")\n .id(button_id)\n .build()\n ).build();\n }\n\n static option(currentSubscription: Signal, selectedOption: Signal, currency: string, option: AvailableSubscription) {\n const active = compute(sub => sub && sub.subscription_id === option.id && sub.status === SubscriptionStatus.active, currentSubscription);\n const pending = compute(sub => sub && sub.subscription_id === option.id && sub.status === SubscriptionStatus.pending, currentSubscription);\n const enabled = compute((a, p) => !a && !p, active, pending);\n const activeClass = compute((a): string => a ? \"active\" : \"_\", active);\n const pendingClass = compute((a): string => a ? \"pending\" : \"_\", pending);\n const isSelectedOption = compute(selected => selected === option.id, selectedOption);\n const selectedClass = compute((s): string => s === option.id ? \"selected\" : \"_\", selectedOption);\n const gifted = compute(s => !!(s && s.gifted), currentSubscription);\n const createdAt = compute(s => s && new Date(s.created_at), currentSubscription);\n const previousId = compute(s => s && s.previous_subscription, currentSubscription);\n const startSubClass = compute(p => \"startSubscription_\" + option.id + \"_\" + p, previousId);\n const optionMessage = signal(\"Available payment providers:\");\n const buttonText = compute((a): string => a ? \"Switch plan\" : \"Subscribe\", currentSubscription);\n\n return create(\"div\")\n .classes(\"flex-v\", \"card\", \"relative\", \"subscription-option\", selectedClass, activeClass, pendingClass)\n .children(\n ifjs(active, GenericTemplates.checkInCorner(\"This subscription is active\")),\n create(\"div\")\n .classes(\"flex-v\", \"space-outwards\")\n .children(\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"h1\")\n .classes(\"limitToContentWidth\")\n .text(option.name)\n .build(),\n ifjs(gifted, GenericTemplates.giftIcon(\"This subscription has been gifted to you\"))\n ).build(),\n create(\"span\")\n .text(option.description)\n .build(),\n ).build(),\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex\", \"align-bottom\", \"small-gap\")\n .styles(\"line-height\", \"1\")\n .children(\n create(\"span\")\n .classes(\"text-xlarge\")\n .text(NumberFormatter.currency(option.price_per_term, currency))\n .build(),\n create(\"span\")\n .classes(\"text-small\")\n .text(\"/\" + option.term_type)\n .build(),\n ).build(),\n ifjs(pending, create(\"span\")\n .classes(\"text-small\", \"text-positive\")\n .title(\"Waiting for confirmation from payment provider\")\n .text(\"Pending\")\n .build()),\n ifjs(active, SubscriptionTemplates.subscribedFor(createdAt))\n ).build(),\n create(\"div\")\n .classes(\"flex-v\", startSubClass)\n .children(\n create(\"div\")\n .classes(\"flex\", \"small-gap\")\n .children(\n ifjs(active, create(\"button\")\n .classes(\"fjsc\", \"negative\")\n .id(option.id)\n .text(\"Cancel\")\n .onclick(async () => {\n const currentSub = currentSubscription.value;\n if (!currentSub) {\n console.warn(\"Can't cancel subscription, no current subscription. How did you get here?\");\n return;\n }\n await SubscriptionActions.cancelSubscriptionWithConfirmationAsync(currentSub.id);\n }).build()),\n ifjs(enabled, create(\"button\")\n .classes(\"fjsc\", \"special\", selectedClass)\n .id(option.id)\n .text(buttonText)\n .onclick(async () => {\n selectedOption.value = option.id;\n await SubscriptionActions.startSubscription(option.id, option.plan_id, optionMessage);\n }).build()),\n ifjs(isSelectedOption, create(\"button\")\n .classes(\"fjsc\", selectedClass)\n .text(\"Cancel\")\n .onclick(async () => {\n selectedOption.value = null;\n }).build()),\n ).build(),\n ifjs(isSelectedOption, create(\"span\")\n .classes(\"color-dim\")\n .text(optionMessage)\n .build()),\n ifjs(isSelectedOption, SubscriptionTemplates.paypalButton(\"paypal-button-\" + option.id))\n ).build()\n ).build()\n ).build();\n }\n\n static subscribedFor(created_at: Signal) {\n const subscribedAgo = compute(c => \"Subscribed \" + Time.ago(c ?? new Date()), created_at);\n\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"span\")\n .classes(\"text-positive\")\n .text(subscribedAgo)\n .build()\n ).build();\n }\n}", "/*!\n * @kurkle/color v0.3.2\n * https://github.com/kurkle/color#readme\n * (c) 2023 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n x: 'dark',\n Z: 'light',\n Y: 're',\n X: 'blu',\n W: 'gr',\n V: 'medium',\n U: 'slate',\n A: 'ee',\n T: 'ol',\n S: 'or',\n B: 'ra',\n C: 'lateg',\n D: 'ights',\n R: 'in',\n Q: 'turquois',\n E: 'hi',\n P: 'ro',\n O: 'al',\n N: 'le',\n M: 'de',\n L: 'yello',\n F: 'en',\n K: 'ch',\n G: 'arks',\n H: 'ea',\n I: 'ightg',\n J: 'wh'\n};\nconst names$1 = {\n OiceXe: 'f0f8ff',\n antiquewEte: 'faebd7',\n aqua: 'ffff',\n aquamarRe: '7fffd4',\n azuY: 'f0ffff',\n beige: 'f5f5dc',\n bisque: 'ffe4c4',\n black: '0',\n blanKedOmond: 'ffebcd',\n Xe: 'ff',\n XeviTet: '8a2be2',\n bPwn: 'a52a2a',\n burlywood: 'deb887',\n caMtXe: '5f9ea0',\n KartYuse: '7fff00',\n KocTate: 'd2691e',\n cSO: 'ff7f50',\n cSnflowerXe: '6495ed',\n cSnsilk: 'fff8dc',\n crimson: 'dc143c',\n cyan: 'ffff',\n xXe: '8b',\n xcyan: '8b8b',\n xgTMnPd: 'b8860b',\n xWay: 'a9a9a9',\n xgYF: '6400',\n xgYy: 'a9a9a9',\n xkhaki: 'bdb76b',\n xmagFta: '8b008b',\n xTivegYF: '556b2f',\n xSange: 'ff8c00',\n xScEd: '9932cc',\n xYd: '8b0000',\n xsOmon: 'e9967a',\n xsHgYF: '8fbc8f',\n xUXe: '483d8b',\n xUWay: '2f4f4f',\n xUgYy: '2f4f4f',\n xQe: 'ced1',\n xviTet: '9400d3',\n dAppRk: 'ff1493',\n dApskyXe: 'bfff',\n dimWay: '696969',\n dimgYy: '696969',\n dodgerXe: '1e90ff',\n fiYbrick: 'b22222',\n flSOwEte: 'fffaf0',\n foYstWAn: '228b22',\n fuKsia: 'ff00ff',\n gaRsbSo: 'dcdcdc',\n ghostwEte: 'f8f8ff',\n gTd: 'ffd700',\n gTMnPd: 'daa520',\n Way: '808080',\n gYF: '8000',\n gYFLw: 'adff2f',\n gYy: '808080',\n honeyMw: 'f0fff0',\n hotpRk: 'ff69b4',\n RdianYd: 'cd5c5c',\n Rdigo: '4b0082',\n ivSy: 'fffff0',\n khaki: 'f0e68c',\n lavFMr: 'e6e6fa',\n lavFMrXsh: 'fff0f5',\n lawngYF: '7cfc00',\n NmoncEffon: 'fffacd',\n ZXe: 'add8e6',\n ZcSO: 'f08080',\n Zcyan: 'e0ffff',\n ZgTMnPdLw: 'fafad2',\n ZWay: 'd3d3d3',\n ZgYF: '90ee90',\n ZgYy: 'd3d3d3',\n ZpRk: 'ffb6c1',\n ZsOmon: 'ffa07a',\n ZsHgYF: '20b2aa',\n ZskyXe: '87cefa',\n ZUWay: '778899',\n ZUgYy: '778899',\n ZstAlXe: 'b0c4de',\n ZLw: 'ffffe0',\n lime: 'ff00',\n limegYF: '32cd32',\n lRF: 'faf0e6',\n magFta: 'ff00ff',\n maPon: '800000',\n VaquamarRe: '66cdaa',\n VXe: 'cd',\n VScEd: 'ba55d3',\n VpurpN: '9370db',\n VsHgYF: '3cb371',\n VUXe: '7b68ee',\n VsprRggYF: 'fa9a',\n VQe: '48d1cc',\n VviTetYd: 'c71585',\n midnightXe: '191970',\n mRtcYam: 'f5fffa',\n mistyPse: 'ffe4e1',\n moccasR: 'ffe4b5',\n navajowEte: 'ffdead',\n navy: '80',\n Tdlace: 'fdf5e6',\n Tive: '808000',\n TivedBb: '6b8e23',\n Sange: 'ffa500',\n SangeYd: 'ff4500',\n ScEd: 'da70d6',\n pOegTMnPd: 'eee8aa',\n pOegYF: '98fb98',\n pOeQe: 'afeeee',\n pOeviTetYd: 'db7093',\n papayawEp: 'ffefd5',\n pHKpuff: 'ffdab9',\n peru: 'cd853f',\n pRk: 'ffc0cb',\n plum: 'dda0dd',\n powMrXe: 'b0e0e6',\n purpN: '800080',\n YbeccapurpN: '663399',\n Yd: 'ff0000',\n Psybrown: 'bc8f8f',\n PyOXe: '4169e1',\n saddNbPwn: '8b4513',\n sOmon: 'fa8072',\n sandybPwn: 'f4a460',\n sHgYF: '2e8b57',\n sHshell: 'fff5ee',\n siFna: 'a0522d',\n silver: 'c0c0c0',\n skyXe: '87ceeb',\n UXe: '6a5acd',\n UWay: '708090',\n UgYy: '708090',\n snow: 'fffafa',\n sprRggYF: 'ff7f',\n stAlXe: '4682b4',\n tan: 'd2b48c',\n teO: '8080',\n tEstN: 'd8bfd8',\n tomato: 'ff6347',\n Qe: '40e0d0',\n viTet: 'ee82ee',\n JHt: 'f5deb3',\n wEte: 'ffffff',\n wEtesmoke: 'f5f5f5',\n Lw: 'ffff00',\n LwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n", "/*!\n * Chart.js v4.4.6\n * https://www.chartjs.org\n * (c) 2024 Chart.js Contributors\n * Released under the MIT License\n */\nimport { Color } from '@kurkle/color';\n\n/**\n * @namespace Chart.helpers\n */ /**\n * An empty function that can be used, for example, for optional callback.\n */ function noop() {\n/* noop */ }\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */ const uid = (()=>{\n let id = 0;\n return ()=>id++;\n})();\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */ function isNullOrUndef(value) {\n return value === null || typeof value === 'undefined';\n}\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */ function isArray(value) {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n return true;\n }\n return false;\n}\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */ function isObject(value) {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */ function isNumberFinite(value) {\n return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */ function finiteOrDefault(value, defaultValue) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */ function valueOrDefault(value, defaultValue) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\nconst toPercentage = (value, dimension)=>typeof value === 'string' && value.endsWith('%') ? parseFloat(value) / 100 : +value / dimension;\nconst toDimension = (value, dimension)=>typeof value === 'string' && value.endsWith('%') ? parseFloat(value) / 100 * dimension : +value;\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */ function callback(fn, args, thisArg) {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\nfunction each(loopable, fn, thisArg, reverse) {\n let i, len, keys;\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for(i = len - 1; i >= 0; i--){\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for(i = 0; i < len; i++){\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for(i = 0; i < len; i++){\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */ function _elementsEqual(a0, a1) {\n let i, ilen, v0, v1;\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n for(i = 0, ilen = a0.length; i < ilen; ++i){\n v0 = a0[i];\n v1 = a1[i];\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n return true;\n}\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */ function clone(source) {\n if (isArray(source)) {\n return source.map(clone);\n }\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n for(; k < klen; ++k){\n target[keys[k]] = clone(source[keys[k]]);\n }\n return target;\n }\n return source;\n}\nfunction isValidKey(key) {\n return [\n '__proto__',\n 'prototype',\n 'constructor'\n ].indexOf(key) === -1;\n}\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */ function _merger(key, target, source, options) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\nfunction merge(target, source, options) {\n const sources = isArray(source) ? source : [\n source\n ];\n const ilen = sources.length;\n if (!isObject(target)) {\n return target;\n }\n options = options || {};\n const merger = options.merger || _merger;\n let current;\n for(let i = 0; i < ilen; ++i){\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n const keys = Object.keys(current);\n for(let k = 0, klen = keys.length; k < klen; ++k){\n merger(keys[k], target, current, options);\n }\n }\n return target;\n}\nfunction mergeIf(target, source) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return merge(target, source, {\n merger: _mergerIf\n });\n}\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */ function _mergerIf(key, target, source) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\n/**\n * @private\n */ function _deprecated(scope, value, previous, current) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous + '\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n '': (v)=>v,\n // default resolvers\n x: (o)=>o.x,\n y: (o)=>o.y\n};\n/**\n * @private\n */ function _splitKey(key) {\n const parts = key.split('.');\n const keys = [];\n let tmp = '';\n for (const part of parts){\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\n}\nfunction _getKeyResolver(key) {\n const keys = _splitKey(key);\n return (obj)=>{\n for (const k of keys){\n if (k === '') {\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\nfunction resolveObjectKey(obj, key) {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n/**\n * @private\n */ function _capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nconst defined = (value)=>typeof value !== 'undefined';\nconst isFunction = (value)=>typeof value === 'function';\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nconst setsEqual = (a, b)=>{\n if (a.size !== b.size) {\n return false;\n }\n for (const item of a){\n if (!b.has(item)) {\n return false;\n }\n }\n return true;\n};\n/**\n * @param e - The event\n * @private\n */ function _isClickEvent(e) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */ const PI = Math.PI;\nconst TAU = 2 * PI;\nconst PITAU = TAU + PI;\nconst INFINITY = Number.POSITIVE_INFINITY;\nconst RAD_PER_DEG = PI / 180;\nconst HALF_PI = PI / 2;\nconst QUARTER_PI = PI / 4;\nconst TWO_THIRDS_PI = PI * 2 / 3;\nconst log10 = Math.log10;\nconst sign = Math.sign;\nfunction almostEquals(x, y, epsilon) {\n return Math.abs(x - y) < epsilon;\n}\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */ function niceNum(range) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */ function _factorize(value) {\n const result = [];\n const sqrt = Math.sqrt(value);\n let i;\n for(i = 1; i < sqrt; i++){\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) {\n result.push(sqrt);\n }\n result.sort((a, b)=>a - b).pop();\n return result;\n}\nfunction isNumber(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n}\nfunction almostWhole(x, epsilon) {\n const rounded = Math.round(x);\n return rounded - epsilon <= x && rounded + epsilon >= x;\n}\n/**\n * @private\n */ function _setMinAndMaxByKey(array, target, property) {\n let i, ilen, value;\n for(i = 0, ilen = array.length; i < ilen; i++){\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\nfunction toRadians(degrees) {\n return degrees * (PI / 180);\n}\nfunction toDegrees(radians) {\n return radians * (180 / PI);\n}\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */ function _decimalPlaces(x) {\n if (!isNumberFinite(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while(Math.round(x * e) / e !== x){\n e *= 10;\n p++;\n }\n return p;\n}\n// Gets the angle from vertical upright to the point about a centre.\nfunction getAngleFromPoint(centrePoint, anglePoint) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n if (angle < -0.5 * PI) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\nfunction distanceBetweenPoints(pt1, pt2) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */ function _angleDiff(a, b) {\n return (a - b + PITAU) % TAU - PI;\n}\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */ function _normalizeAngle(a) {\n return (a % TAU + TAU) % TAU;\n}\n/**\n * @private\n */ function _angleBetween(angle, start, end, sameAngleIsFullCircle) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || sameAngleIsFullCircle && s === e || angleToStart > angleToEnd && startToAngle < endToAngle;\n}\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */ function _limitValue(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\n/**\n * @param {number} value\n * @private\n */ function _int16Range(value) {\n return _limitValue(value, -32768, 32767);\n}\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */ function _isBetween(value, start, end, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n\nfunction _lookup(table, value, cmp) {\n cmp = cmp || ((index)=>table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid;\n while(hi - lo > 1){\n mid = lo + hi >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n return {\n lo,\n hi\n };\n}\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */ const _lookupByKey = (table, key, value, last)=>_lookup(table, value, last ? (index)=>{\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n } : (index)=>table[index][key] < value);\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */ const _rlookupByKey = (table, key, value)=>_lookup(table, value, (index)=>table[index][key] >= value);\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */ function _filterBetween(values, min, max) {\n let start = 0;\n let end = values.length;\n while(start < end && values[start] < min){\n start++;\n }\n while(end > start && values[end - 1] > max){\n end--;\n }\n return start > 0 || end < values.length ? values.slice(start, end) : values;\n}\nconst arrayEvents = [\n 'push',\n 'pop',\n 'shift',\n 'splice',\n 'unshift'\n];\nfunction listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [\n listener\n ]\n }\n });\n arrayEvents.forEach((key)=>{\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value (...args) {\n const res = base.apply(this, args);\n array._chartjs.listeners.forEach((object)=>{\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n return res;\n }\n });\n });\n}\nfunction unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n if (listeners.length > 0) {\n return;\n }\n arrayEvents.forEach((key)=>{\n delete array[key];\n });\n delete array._chartjs;\n}\n/**\n * @param items\n */ function _arrayUnique(items) {\n const set = new Set(items);\n if (set.size === items.length) {\n return items;\n }\n return Array.from(set);\n}\n\nfunction fontString(pixelSize, fontStyle, fontFamily) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n/**\n* Request animation polyfill\n*/ const requestAnimFrame = function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}();\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */ function throttled(fn, thisArg) {\n let argsToUse = [];\n let ticking = false;\n return function(...args) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, ()=>{\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n/**\n * Debounces calling `fn` for `delay` ms\n */ function debounce(fn, delay) {\n let timeout;\n return function(...args) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */ const _toLeftRightCenter = (align)=>align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */ const _alignStartEnd = (align, start, end)=>align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */ const _textX = (align, left, right, rtl)=>{\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n/**\n * Return start and count of visible points.\n * @private\n */ function _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled) {\n const pointCount = points.length;\n let start = 0;\n let count = pointCount;\n if (meta._sorted) {\n const { iScale , _parsed } = meta;\n const axis = iScale.axis;\n const { min , max , minDefined , maxDefined } = iScale.getUserBounds();\n if (minDefined) {\n start = _limitValue(Math.min(// @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, axis, min).lo, // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo), 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(Math.max(// @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1, // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1), start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n return {\n start,\n count\n };\n}\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */ function _scaleRangesChanged(meta) {\n const { xScale , yScale , _scaleRanges } = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min || _scaleRanges.xmax !== xScale.max || _scaleRanges.ymin !== yScale.min || _scaleRanges.ymax !== yScale.max;\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n\nconst atEdge = (t)=>t === 0 || t === 1;\nconst elasticIn = (t, s, p)=>-(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t, s, p)=>Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */ const effects = {\n linear: (t)=>t,\n easeInQuad: (t)=>t * t,\n easeOutQuad: (t)=>-t * (t - 2),\n easeInOutQuad: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t : -0.5 * (--t * (t - 2) - 1),\n easeInCubic: (t)=>t * t * t,\n easeOutCubic: (t)=>(t -= 1) * t * t + 1,\n easeInOutCubic: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t : 0.5 * ((t -= 2) * t * t + 2),\n easeInQuart: (t)=>t * t * t * t,\n easeOutQuart: (t)=>-((t -= 1) * t * t * t - 1),\n easeInOutQuart: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t * t : -0.5 * ((t -= 2) * t * t * t - 2),\n easeInQuint: (t)=>t * t * t * t * t,\n easeOutQuint: (t)=>(t -= 1) * t * t * t * t + 1,\n easeInOutQuint: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t * t * t : 0.5 * ((t -= 2) * t * t * t * t + 2),\n easeInSine: (t)=>-Math.cos(t * HALF_PI) + 1,\n easeOutSine: (t)=>Math.sin(t * HALF_PI),\n easeInOutSine: (t)=>-0.5 * (Math.cos(PI * t) - 1),\n easeInExpo: (t)=>t === 0 ? 0 : Math.pow(2, 10 * (t - 1)),\n easeOutExpo: (t)=>t === 1 ? 1 : -Math.pow(2, -10 * t) + 1,\n easeInOutExpo: (t)=>atEdge(t) ? t : t < 0.5 ? 0.5 * Math.pow(2, 10 * (t * 2 - 1)) : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n easeInCirc: (t)=>t >= 1 ? t : -(Math.sqrt(1 - t * t) - 1),\n easeOutCirc: (t)=>Math.sqrt(1 - (t -= 1) * t),\n easeInOutCirc: (t)=>(t /= 0.5) < 1 ? -0.5 * (Math.sqrt(1 - t * t) - 1) : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n easeInElastic: (t)=>atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n easeOutElastic: (t)=>atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n easeInOutElastic (t) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t : t < 0.5 ? 0.5 * elasticIn(t * 2, s, p) : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n easeInBack (t) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n easeOutBack (t) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n easeInOutBack (t) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= 1.525) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2);\n },\n easeInBounce: (t)=>1 - effects.easeOutBounce(1 - t),\n easeOutBounce (t) {\n const m = 7.5625;\n const d = 2.75;\n if (t < 1 / d) {\n return m * t * t;\n }\n if (t < 2 / d) {\n return m * (t -= 1.5 / d) * t + 0.75;\n }\n if (t < 2.5 / d) {\n return m * (t -= 2.25 / d) * t + 0.9375;\n }\n return m * (t -= 2.625 / d) * t + 0.984375;\n },\n easeInOutBounce: (t)=>t < 0.5 ? effects.easeInBounce(t * 2) * 0.5 : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5\n};\n\nfunction isPatternOrGradient(value) {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n return false;\n}\nfunction color(value) {\n return isPatternOrGradient(value) ? value : new Color(value);\n}\nfunction getHoverColor(value) {\n return isPatternOrGradient(value) ? value : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n\nconst numbers = [\n 'x',\n 'y',\n 'borderWidth',\n 'radius',\n 'tension'\n];\nconst colors = [\n 'color',\n 'borderColor',\n 'backgroundColor'\n];\nfunction applyAnimationsDefaults(defaults) {\n defaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined\n });\n defaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name)=>name !== 'onProgress' && name !== 'onComplete' && name !== 'fn'\n });\n defaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n }\n });\n defaults.describe('animations', {\n _fallback: 'animation'\n });\n defaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0\n }\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: (v)=>v | 0\n }\n }\n }\n });\n}\n\nfunction applyLayoutsDefaults(defaults) {\n defaults.set('layout', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n\nconst intlCache = new Map();\nfunction getNumberFormat(locale, options) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\nfunction formatNumber(num, locale, options) {\n return getNumberFormat(locale, options).format(num);\n}\n\nconst formatters = {\n values (value) {\n return isArray(value) ? value : '' + value;\n },\n numeric (tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue;\n if (ticks.length > 1) {\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n delta = calculateDelta(tickValue, ticks);\n }\n const logDelta = log10(Math.abs(delta));\n const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n const options = {\n notation,\n minimumFractionDigits: numDecimal,\n maximumFractionDigits: numDecimal\n };\n Object.assign(options, this.options.ticks.format);\n return formatNumber(tickValue, locale, options);\n },\n logarithmic (tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = ticks[index].significand || tickValue / Math.pow(10, Math.floor(log10(tickValue)));\n if ([\n 1,\n 2,\n 3,\n 5,\n 10,\n 15\n ].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n};\nfunction calculateDelta(tickValue, ticks) {\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n var Ticks = {\n formatters\n};\n\nfunction applyScaleDefaults(defaults) {\n defaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n bounds: 'ticks',\n clip: true,\n grace: 0,\n grid: {\n display: true,\n lineWidth: 1,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options)=>options.lineWidth,\n tickColor: (_ctx, options)=>options.color,\n offset: false\n },\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n title: {\n display: false,\n text: '',\n padding: {\n top: 4,\n bottom: 4\n }\n },\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2\n }\n });\n defaults.route('scale.ticks', 'color', '', 'color');\n defaults.route('scale.grid', 'color', '', 'borderColor');\n defaults.route('scale.border', 'color', '', 'borderColor');\n defaults.route('scale.title', 'color', '', 'color');\n defaults.describe('scale', {\n _fallback: false,\n _scriptable: (name)=>!name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name)=>name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash'\n });\n defaults.describe('scales', {\n _fallback: 'scale'\n });\n defaults.describe('scale.ticks', {\n _scriptable: (name)=>name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name)=>name !== 'backdropPadding'\n });\n}\n\nconst overrides = Object.create(null);\nconst descriptors = Object.create(null);\n function getScope$1(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for(let i = 0, n = keys.length; i < n; ++i){\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope$1(root, scope), values);\n }\n return merge(getScope$1(root, ''), scope);\n}\n class Defaults {\n constructor(_descriptors, _appliers){\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context)=>context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options)=>getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options)=>getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options)=>getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true,\n includeInvisible: false\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.drawActiveElementsOnTop = true;\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n set(scope, values) {\n return set(this, scope, values);\n }\n get(scope) {\n return getScope$1(this, scope);\n }\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n override(scope, values) {\n return set(overrides, scope, values);\n }\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope$1(this, scope);\n const targetScopeObject = getScope$1(this, targetScope);\n const privateName = '_' + name;\n Object.defineProperties(scopeObject, {\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n [name]: {\n enumerable: true,\n get () {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set (value) {\n this[privateName] = value;\n }\n }\n });\n }\n apply(appliers) {\n appliers.forEach((apply)=>apply(this));\n }\n}\nvar defaults = /* #__PURE__ */ new Defaults({\n _scriptable: (name)=>!name.startsWith('on'),\n _indexable: (name)=>name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false\n }\n}, [\n applyAnimationsDefaults,\n applyLayoutsDefaults,\n applyScaleDefaults\n]);\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */ function toFontString(font) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n return (font.style ? font.style + ' ' : '') + (font.weight ? font.weight + ' ' : '') + font.size + 'px ' + font.family;\n}\n/**\n * @private\n */ function _measureText(ctx, data, gc, longest, string) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\n/**\n * @private\n */ // eslint-disable-next-line complexity\nfunction _longestText(ctx, font, arrayOfThings, cache) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n ctx.save();\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i, j, jlen, thing, nestedThing;\n for(i = 0; i < ilen; i++){\n thing = arrayOfThings[i];\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && !isArray(thing)) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for(j = 0, jlen = thing.length; j < jlen; j++){\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n ctx.restore();\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for(i = 0; i < gcLen; i++){\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */ function _alignPixel(chart, pixel, width) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n/**\n * Clears the entire canvas.\n */ function clearCanvas(canvas, ctx) {\n if (!ctx && !canvas) {\n return;\n }\n ctx = ctx || canvas.getContext('2d');\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\nfunction drawPoint(ctx, options, x, y) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n drawPointLegend(ctx, options, x, y, null);\n}\n// eslint-disable-next-line complexity\nfunction drawPointLegend(ctx, options, x, y, w) {\n let type, xOffset, yOffset, size, cornerRadius, width, xOffsetW, yOffsetW;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n ctx.beginPath();\n switch(style){\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case 'triangle':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */ case 'rectRot':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */ case 'cross':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'star':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'line':\n xOffset = w ? w / 2 : Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */ function _isPointInArea(point, area, margin) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n return !area || point && point.x > area.left - margin && point.x < area.right + margin && point.y > area.top - margin && point.y < area.bottom + margin;\n}\nfunction clipArea(ctx, area) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\nfunction unclipArea(ctx) {\n ctx.restore();\n}\n/**\n * @private\n */ function _steppedLineTo(ctx, previous, target, flip, mode) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\n/**\n * @private\n */ function _bezierCurveTo(ctx, previous, target, flip) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(flip ? previous.cp1x : previous.cp2x, flip ? previous.cp1y : previous.cp2y, flip ? target.cp2x : target.cp1x, flip ? target.cp2y : target.cp1y, target.x, target.y);\n}\nfunction setRenderOpts(ctx, opts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\nfunction decorateText(ctx, x, y, line, opts) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */ const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\nfunction drawBackdrop(ctx, opts) {\n const oldColor = ctx.fillStyle;\n ctx.fillStyle = opts.color;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n/**\n * Render text onto the canvas\n */ function renderText(ctx, text, x, y, font, opts = {}) {\n const lines = isArray(text) ? text : [\n text\n ];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i, line;\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n for(i = 0; i < lines.length; ++i){\n line = lines[i];\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n y += Number(font.lineHeight);\n }\n ctx.restore();\n}\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */ function addRoundedRectPath(ctx, rect) {\n const { x , y , w , h , radius } = rect;\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n/**\n * @alias Chart.helpers.options\n * @namespace\n */ /**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */ function toLineHeight(value, size) {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n value = +matches[2];\n switch(matches[3]){\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n }\n return size * value;\n}\nconst numberOrZero = (v)=>+v || 0;\nfunction _readValueToProps(value, props) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value) ? objProps ? (prop)=>valueOrDefault(value[prop], value[props[prop]]) : (prop)=>value[prop] : ()=>value;\n for (const prop of keys){\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */ function toTRBL(value) {\n return _readValueToProps(value, {\n top: 'y',\n right: 'x',\n bottom: 'y',\n left: 'x'\n });\n}\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */ function toTRBLCorners(value) {\n return _readValueToProps(value, [\n 'topLeft',\n 'topRight',\n 'bottomLeft',\n 'bottomRight'\n ]);\n}\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */ function toPadding(value) {\n const obj = toTRBL(value);\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n return obj;\n}\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */ function toFont(options, fallback) {\n options = options || {};\n fallback = fallback || defaults.font;\n let size = valueOrDefault(options.size, fallback.size);\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = undefined;\n }\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n font.string = toFontString(font);\n return font;\n}\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */ function resolve(inputs, context, index, info) {\n let cacheable = true;\n let i, ilen, value;\n for(i = 0, ilen = inputs.length; i < ilen; ++i){\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */ function _addGrace(minmax, grace, beginAtZero) {\n const { min , max } = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value, add)=>beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\nfunction createContext(parentContext, context) {\n return Object.assign(Object.create(parentContext), context);\n}\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */ function _createResolver(scopes, prefixes = [\n ''\n], rootScopes, fallback, getTarget = ()=>scopes[0]) {\n const finalRootScopes = rootScopes || scopes;\n if (typeof fallback === 'undefined') {\n fallback = _resolve('_fallback', scopes);\n }\n const cache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: finalRootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope)=>_createResolver([\n scope,\n ...scopes\n ], prefixes, finalRootScopes, fallback)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */ deleteProperty (target, prop) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n /**\n * A trap for getting property values.\n */ get (target, prop) {\n return _cached(target, prop, ()=>_resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */ getOwnPropertyDescriptor (target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n /**\n * A trap for Object.getPrototypeOf.\n */ getPrototypeOf () {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n /**\n * A trap for the in operator.\n */ has (target, prop) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */ ownKeys (target) {\n return getKeysFromAllScopes(target);\n },\n /**\n * A trap for setting property values.\n */ set (target, prop, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n });\n}\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */ function _attachContext(proxy, context, subProxy, descriptorDefaults) {\n const cache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx)=>_attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope)=>_attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */ deleteProperty (target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n /**\n * A trap for getting property values.\n */ get (target, prop, receiver) {\n return _cached(target, prop, ()=>_resolveWithContext(target, prop, receiver));\n },\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */ getOwnPropertyDescriptor (target, prop) {\n return target._descriptors.allKeys ? Reflect.has(proxy, prop) ? {\n enumerable: true,\n configurable: true\n } : undefined : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n /**\n * A trap for Object.getPrototypeOf.\n */ getPrototypeOf () {\n return Reflect.getPrototypeOf(proxy);\n },\n /**\n * A trap for the in operator.\n */ has (target, prop) {\n return Reflect.has(proxy, prop);\n },\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */ ownKeys () {\n return Reflect.ownKeys(proxy);\n },\n /**\n * A trap for setting property values.\n */ set (target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n });\n}\n/**\n * @private\n */ function _descriptors(proxy, defaults = {\n scriptable: true,\n indexable: true\n}) {\n const { _scriptable =defaults.scriptable , _indexable =defaults.indexable , _allKeys =defaults.allKeys } = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : ()=>_scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : ()=>_indexable\n };\n}\nconst readKey = (prefix, name)=>prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop, value)=>isObject(value) && prop !== 'adapters' && (Object.getPrototypeOf(value) === null || value.constructor === Object);\nfunction _cached(target, prop, resolve) {\n if (Object.prototype.hasOwnProperty.call(target, prop) || prop === 'constructor') {\n return target[prop];\n }\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\nfunction _resolveWithContext(target, prop, receiver) {\n const { _proxy , _context , _subProxy , _descriptors: descriptors } = target;\n let value = _proxy[prop]; // resolve from proxy\n // resolve with context\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\nfunction _resolveScriptable(prop, getValue, target, receiver) {\n const { _proxy , _context , _subProxy , _stack } = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n let value = getValue(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\nfunction _resolveArray(prop, value, target, isIndexable) {\n const { _proxy , _context , _subProxy , _descriptors: descriptors } = target;\n if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n return value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\n const arr = value;\n const scopes = _proxy._scopes.filter((s)=>s !== arr);\n value = [];\n for (const item of arr){\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\nfunction resolveFallback(fallback, prop, value) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\nconst getScope = (key, parent)=>key === true ? parent : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\nfunction addScopes(set, parentScopes, key, parentFallback, value) {\n for (const parent of parentScopes){\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, value);\n if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\nfunction createSubResolver(parentScopes, resolver, prop, value) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [\n ...parentScopes,\n ...rootScopes\n ];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n if (key === null) {\n return false;\n }\n if (typeof fallback !== 'undefined' && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [\n ''\n ], rootScopes, fallback, ()=>subGetTarget(resolver, prop, value));\n}\nfunction addScopesFromKey(set, allScopes, key, fallback, item) {\n while(key){\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\nfunction subGetTarget(resolver, prop, value) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\nfunction _resolveWithPrefixes(prop, prefixes, scopes, proxy) {\n let value;\n for (const prefix of prefixes){\n value = _resolve(readKey(prefix, prop), scopes);\n if (typeof value !== 'undefined') {\n return needsSubResolver(prop, value) ? createSubResolver(scopes, proxy, prop, value) : value;\n }\n }\n}\nfunction _resolve(key, scopes) {\n for (const scope of scopes){\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (typeof value !== 'undefined') {\n return value;\n }\n }\n}\nfunction getKeysFromAllScopes(target) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\nfunction resolveKeysFromAllScopes(scopes) {\n const set = new Set();\n for (const scope of scopes){\n for (const key of Object.keys(scope).filter((k)=>!k.startsWith('_'))){\n set.add(key);\n }\n }\n return Array.from(set);\n}\nfunction _parseObjectDataRadialScale(meta, data, start, count) {\n const { iScale } = meta;\n const { key ='r' } = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n\nconst EPSILON = Number.EPSILON || 1e-14;\nconst getPoint = (points, i)=>i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis)=>indexAxis === 'x' ? 'y' : 'x';\nfunction splineCurve(firstPoint, middlePoint, afterPoint, t) {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n // This function must also respect \"skipped\" points\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\n/**\n * Adjust tangents to ensure monotonic properties\n */ function monotoneAdjust(points, deltaK, mK) {\n const pointsLen = points.length;\n let alphaK, betaK, tauK, squaredMagnitude, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for(let i = 0; i < pointsLen - 1; ++i){\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\nfunction monotoneCompute(points, mK, indexAxis = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for(let i = 0; i < pointsLen; ++i){\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */ function splineCurveMonotone(points, indexAxis = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK = Array(pointsLen).fill(0);\n const mK = Array(pointsLen);\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for(i = 0; i < pointsLen; ++i){\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i] : !pointAfter ? deltaK[i - 1] : sign(deltaK[i - 1]) !== sign(deltaK[i]) ? 0 : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n monotoneAdjust(points, deltaK, mK);\n monotoneCompute(points, mK, indexAxis);\n}\nfunction capControlPoint(pt, min, max) {\n return Math.max(Math.min(pt, max), min);\n}\nfunction capBezierPoints(points, area) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for(i = 0, ilen = points.length; i < ilen; ++i){\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\n/**\n * @private\n */ function _updateBezierControlPoints(points, options, area, loop, indexAxis) {\n let i, ilen, point, controlPoints;\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt)=>!pt.skip);\n }\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for(i = 0, ilen = points.length; i < ilen; ++i){\n point = points[i];\n controlPoints = splineCurve(prev, point, points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen], options.tension);\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n\n/**\n * Note: typedefs are auto-exported, so use a made-up `dom` namespace where\n * necessary to avoid duplicates with `export * from './helpers`; see\n * https://github.com/microsoft/TypeScript/issues/46011\n * @typedef { import('../core/core.controller.js').default } dom.Chart\n * @typedef { import('../../types').ChartEvent } ChartEvent\n */ /**\n * @private\n */ function _isDomSupported() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n/**\n * @private\n */ function _getParentNode(domNode) {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = parent.host;\n }\n return parent;\n}\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */ function parseMaxStyle(styleValue, node, parentProperty) {\n let valueInPixels;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n return valueInPixels;\n}\nconst getComputedStyle = (element)=>element.ownerDocument.defaultView.getComputedStyle(element, null);\nfunction getStyle(el, property) {\n return getComputedStyle(el).getPropertyValue(property);\n}\nconst positions = [\n 'top',\n 'right',\n 'bottom',\n 'left'\n];\nfunction getPositionedStyle(styles, style, suffix) {\n const result = {};\n suffix = suffix ? '-' + suffix : '';\n for(let i = 0; i < 4; i++){\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\nconst useOffsetPos = (x, y, target)=>(x > 0 || y > 0) && (!target || !target.shadowRoot);\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */ function getCanvasPosition(e, canvas) {\n const touches = e.touches;\n const source = touches && touches.length ? touches[0] : e;\n const { offsetX , offsetY } = source;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {\n x,\n y,\n box\n };\n}\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */ function getRelativePosition(event, chart) {\n if ('native' in event) {\n return event;\n }\n const { canvas , currentDevicePixelRatio } = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const { x , y , box } = getCanvasPosition(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n let { width , height } = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\nfunction getContainerSize(canvas, width, height) {\n let maxWidth, maxHeight;\n if (width === undefined || height === undefined) {\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect(); // this is the border box of the container\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\nconst round1 = (v)=>Math.round(v * 10) / 10;\n// eslint-disable-next-line complexity\nfunction getMaximumSize(canvas, bbWidth, bbHeight, aspectRatio) {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let { width , height } = containerSize;\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n return {\n width,\n height\n };\n}\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */ function retinaScale(chart, forceRatio, forceStyle) {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = Math.floor(chart.height * pixelRatio);\n const deviceWidth = Math.floor(chart.width * pixelRatio);\n chart.height = Math.floor(chart.height);\n chart.width = Math.floor(chart.width);\n const canvas = chart.canvas;\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n if (canvas.style && (forceStyle || !canvas.style.height && !canvas.style.width)) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n if (chart.currentDevicePixelRatio !== pixelRatio || canvas.height !== deviceHeight || canvas.width !== deviceWidth) {\n chart.currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */ const supportsEventListenerOptions = function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive () {\n passiveSupported = true;\n return false;\n }\n };\n if (_isDomSupported()) {\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n }\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}();\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */ function readUsedSize(element, property) {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n\n/**\n * @private\n */ function _pointInLine(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n/**\n * @private\n */ function _steppedInterpolation(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y : mode === 'after' ? t < 1 ? p1.y : p2.y : t > 0 ? p2.y : p1.y\n };\n}\n/**\n * @private\n */ function _bezierInterpolation(p1, p2, t, mode) {\n const cp1 = {\n x: p1.cp2x,\n y: p1.cp2y\n };\n const cp2 = {\n x: p2.cp1x,\n y: p2.cp1y\n };\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n\nconst getRightToLeftAdapter = function(rectX, width) {\n return {\n x (x) {\n return rectX + rectX + width - x;\n },\n setWidth (w) {\n width = w;\n },\n textAlign (align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus (x, value) {\n return x - value;\n },\n leftForLtr (x, itemWidth) {\n return x - itemWidth;\n }\n };\n};\nconst getLeftToRightAdapter = function() {\n return {\n x (x) {\n return x;\n },\n setWidth (w) {},\n textAlign (align) {\n return align;\n },\n xPlus (x, value) {\n return x + value;\n },\n leftForLtr (x, _itemWidth) {\n return x;\n }\n };\n};\nfunction getRtlAdapter(rtl, rectX, width) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\nfunction overrideTextDirection(ctx, direction) {\n let style, original;\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction')\n ];\n style.setProperty('direction', direction, 'important');\n ctx.prevTextDirection = original;\n }\n}\nfunction restoreTextDirection(ctx, original) {\n if (original !== undefined) {\n delete ctx.prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle\n };\n }\n return {\n between: _isBetween,\n compare: (a, b)=>a - b,\n normalize: (x)=>x\n };\n}\nfunction normalizeSegment({ start , end , count , loop , style }) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\nfunction getSegment(segment, points, bounds) {\n const { property , start: startBound , end: endBound } = bounds;\n const { between , normalize } = propertyFn(property);\n const count = points.length;\n let { start , end , loop } = segment;\n let i, ilen;\n if (loop) {\n start += count;\n end += count;\n for(i = 0, ilen = count; i < ilen; ++i){\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n if (end < start) {\n end += count;\n }\n return {\n start,\n end,\n loop,\n style: segment.style\n };\n}\n function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [\n segment\n ];\n }\n const { property , start: startBound , end: endBound } = bounds;\n const count = points.length;\n const { compare , between , normalize } = propertyFn(property);\n const { start , end , loop , style } = getSegment(segment, points, bounds);\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n const startIsBefore = ()=>between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = ()=>compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = ()=>inside || startIsBefore();\n const shouldStop = ()=>!inside || endIsBefore();\n for(let i = start, prev = start; i <= end; ++i){\n point = points[i % count];\n if (point.skip) {\n continue;\n }\n value = normalize(point[property]);\n if (value === prevValue) {\n continue;\n }\n inside = between(value, startBound, endBound);\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({\n start: subStart,\n end: i,\n loop,\n count,\n style\n }));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n if (subStart !== null) {\n result.push(normalizeSegment({\n start: subStart,\n end,\n loop,\n count,\n style\n }));\n }\n return result;\n}\n function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n for(let i = 0; i < segments.length; i++){\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\n function findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n if (loop && !spanGaps) {\n while(start < count && !points[start].skip){\n start++;\n }\n }\n while(start < count && points[start].skip){\n start++;\n }\n start %= count;\n if (loop) {\n end += start;\n }\n while(end > start && points[end % count].skip){\n end--;\n }\n end %= count;\n return {\n start,\n end\n };\n}\n function solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n for(end = start + 1; end <= max; ++end){\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({\n start: start % count,\n end: (end - 1) % count,\n loop\n });\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n if (last !== null) {\n result.push({\n start: start % count,\n end: last % count,\n loop\n });\n }\n return result;\n}\n function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n if (!count) {\n return [];\n }\n const loop = !!line._loop;\n const { start , end } = findStartAndEnd(points, count, loop, spanGaps);\n if (spanGaps === true) {\n return splitByStyles(line, [\n {\n start,\n end,\n loop\n }\n ], points, segmentOptions);\n }\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n function splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\n function doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const { _datasetIndex: datasetIndex , options: { spanGaps } } = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n s += count;\n while(points[s % count].skip){\n s -= dir;\n }\n while(points[e % count].skip){\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({\n start: s % count,\n end: e % count,\n loop: l,\n style: st\n });\n prevStyle = st;\n start = e % count;\n }\n }\n for (const segment of segments){\n start = spanGaps ? start : segment.start;\n let prev = points[start % count];\n let style;\n for(i = start + 1; i <= segment.end; i++){\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n return result;\n}\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\nfunction styleChanged(style, prevStyle) {\n if (!prevStyle) {\n return false;\n }\n const cache = [];\n const replacer = function(key, value) {\n if (!isPatternOrGradient(value)) {\n return value;\n }\n if (!cache.includes(value)) {\n cache.push(value);\n }\n return cache.indexOf(value);\n };\n return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n\nexport { unclipArea as $, _rlookupByKey as A, _lookupByKey as B, _isPointInArea as C, getAngleFromPoint as D, toPadding as E, each as F, getMaximumSize as G, HALF_PI as H, _getParentNode as I, readUsedSize as J, supportsEventListenerOptions as K, throttled as L, _isDomSupported as M, _factorize as N, finiteOrDefault as O, PI as P, callback as Q, _addGrace as R, _limitValue as S, TAU as T, toDegrees as U, _measureText as V, _int16Range as W, _alignPixel as X, clipArea as Y, renderText as Z, _arrayUnique as _, resolve as a, fontString as a$, toFont as a0, _toLeftRightCenter as a1, _alignStartEnd as a2, overrides as a3, merge as a4, _capitalize as a5, descriptors as a6, isFunction as a7, _attachContext as a8, _createResolver as a9, overrideTextDirection as aA, _textX as aB, restoreTextDirection as aC, drawPointLegend as aD, distanceBetweenPoints as aE, noop as aF, _setMinAndMaxByKey as aG, niceNum as aH, almostWhole as aI, almostEquals as aJ, _decimalPlaces as aK, Ticks as aL, log10 as aM, _longestText as aN, _filterBetween as aO, _lookup as aP, isPatternOrGradient as aQ, getHoverColor as aR, clone as aS, _merger as aT, _mergerIf as aU, _deprecated as aV, _splitKey as aW, toFontString as aX, splineCurve as aY, splineCurveMonotone as aZ, getStyle as a_, _descriptors as aa, mergeIf as ab, uid as ac, debounce as ad, retinaScale as ae, clearCanvas as af, setsEqual as ag, _elementsEqual as ah, _isClickEvent as ai, _isBetween as aj, _readValueToProps as ak, _updateBezierControlPoints as al, _computeSegments as am, _boundSegments as an, _steppedInterpolation as ao, _bezierInterpolation as ap, _pointInLine as aq, _steppedLineTo as ar, _bezierCurveTo as as, drawPoint as at, addRoundedRectPath as au, toTRBL as av, toTRBLCorners as aw, _boundSegment as ax, _normalizeAngle as ay, getRtlAdapter as az, isArray as b, toLineHeight as b0, PITAU as b1, INFINITY as b2, RAD_PER_DEG as b3, QUARTER_PI as b4, TWO_THIRDS_PI as b5, _angleDiff as b6, color as c, defaults as d, effects as e, resolveObjectKey as f, isNumberFinite as g, defined as h, isObject as i, createContext as j, isNullOrUndef as k, listenArrayEvents as l, toPercentage as m, toDimension as n, formatNumber as o, _angleBetween as p, _getStartAndCountOfVisiblePoints as q, requestAnimFrame as r, sign as s, toRadians as t, unlistenArrayEvents as u, valueOrDefault as v, _scaleRangesChanged as w, isNumber as x, _parseObjectDataRadialScale as y, getRelativePosition as z };\n//# sourceMappingURL=helpers.segment.js.map\n", "/*!\n * Chart.js v4.4.6\n * https://www.chartjs.org\n * (c) 2024 Chart.js Contributors\n * Released under the MIT License\n */\nimport { r as requestAnimFrame, a as resolve, e as effects, c as color, i as isObject, d as defaults, b as isArray, v as valueOrDefault, u as unlistenArrayEvents, l as listenArrayEvents, f as resolveObjectKey, g as isNumberFinite, h as defined, s as sign, j as createContext, k as isNullOrUndef, _ as _arrayUnique, t as toRadians, m as toPercentage, n as toDimension, T as TAU, o as formatNumber, p as _angleBetween, H as HALF_PI, P as PI, q as _getStartAndCountOfVisiblePoints, w as _scaleRangesChanged, x as isNumber, y as _parseObjectDataRadialScale, z as getRelativePosition, A as _rlookupByKey, B as _lookupByKey, C as _isPointInArea, D as getAngleFromPoint, E as toPadding, F as each, G as getMaximumSize, I as _getParentNode, J as readUsedSize, K as supportsEventListenerOptions, L as throttled, M as _isDomSupported, N as _factorize, O as finiteOrDefault, Q as callback, R as _addGrace, S as _limitValue, U as toDegrees, V as _measureText, W as _int16Range, X as _alignPixel, Y as clipArea, Z as renderText, $ as unclipArea, a0 as toFont, a1 as _toLeftRightCenter, a2 as _alignStartEnd, a3 as overrides, a4 as merge, a5 as _capitalize, a6 as descriptors, a7 as isFunction, a8 as _attachContext, a9 as _createResolver, aa as _descriptors, ab as mergeIf, ac as uid, ad as debounce, ae as retinaScale, af as clearCanvas, ag as setsEqual, ah as _elementsEqual, ai as _isClickEvent, aj as _isBetween, ak as _readValueToProps, al as _updateBezierControlPoints, am as _computeSegments, an as _boundSegments, ao as _steppedInterpolation, ap as _bezierInterpolation, aq as _pointInLine, ar as _steppedLineTo, as as _bezierCurveTo, at as drawPoint, au as addRoundedRectPath, av as toTRBL, aw as toTRBLCorners, ax as _boundSegment, ay as _normalizeAngle, az as getRtlAdapter, aA as overrideTextDirection, aB as _textX, aC as restoreTextDirection, aD as drawPointLegend, aE as distanceBetweenPoints, aF as noop, aG as _setMinAndMaxByKey, aH as niceNum, aI as almostWhole, aJ as almostEquals, aK as _decimalPlaces, aL as Ticks, aM as log10, aN as _longestText, aO as _filterBetween, aP as _lookup } from './chunks/helpers.segment.js';\nimport '@kurkle/color';\n\nclass Animator {\n constructor(){\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n callbacks.forEach((fn)=>fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n this._request = requestAnimFrame.call(window, ()=>{\n this._update();\n this._request = null;\n if (this._running) {\n this._refresh();\n }\n });\n }\n _update(date = Date.now()) {\n let remaining = 0;\n this._charts.forEach((anims, chart)=>{\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n for(; i >= 0; --i){\n item = items[i];\n if (item._active) {\n if (item._total > anims.duration) {\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, 'progress');\n }\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n remaining += items.length;\n });\n this._lastDate = date;\n if (remaining === 0) {\n this._running = false;\n }\n }\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur)=>Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n for(; i >= 0; --i){\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\nvar animator = /* #__PURE__ */ new Animator();\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean (from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n color (from, to, factor) {\n const c0 = color(from || transparent);\n const c1 = c0.valid && color(to || transparent);\n return c1 && c1.valid ? c1.mix(c0, factor).hexString() : to;\n },\n number (from, to, factor) {\n return from + (to - from) * factor;\n }\n};\nclass Animation {\n constructor(cfg, target, prop, to){\n const currentValue = target[prop];\n to = resolve([\n cfg.to,\n to,\n currentValue,\n cfg.from\n ]);\n const from = resolve([\n cfg.from,\n currentValue,\n to\n ]);\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n active() {\n return this._active;\n }\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([\n cfg.to,\n to,\n currentValue,\n cfg.from\n ]);\n this._from = resolve([\n cfg.from,\n currentValue,\n to\n ]);\n }\n }\n cancel() {\n if (this._active) {\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n this._active = from !== to && (loop || elapsed < duration);\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n factor = elapsed / duration % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n this._target[prop] = this._fn(from, to, factor);\n }\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej)=>{\n promises.push({\n res,\n rej\n });\n });\n }\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for(let i = 0; i < promises.length; i++){\n promises[i][method]();\n }\n }\n}\n\nclass Animations {\n constructor(chart, config){\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n const animationOptions = Object.keys(defaults.animation);\n const animatedProps = this._properties;\n Object.getOwnPropertyNames(config).forEach((key)=>{\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions){\n resolved[option] = cfg[option];\n }\n (isArray(cfg.properties) && cfg.properties || [\n key\n ]).forEach((prop)=>{\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n awaitAll(target.options.$animations, newOptions).then(()=>{\n target.options = newOptions;\n }, ()=>{\n });\n }\n return animations;\n }\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n for(i = props.length - 1; i >= 0; --i){\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n if (animation) {\n if (cfg && animation.active()) {\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n target[prop] = value;\n continue;\n }\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n update(target, values) {\n if (this._properties.size === 0) {\n Object.assign(target, values);\n return;\n }\n const animations = this._createAnimations(target, values);\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for(let i = 0; i < keys.length; i++){\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n return Promise.all(running);\n}\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n target.options = options = Object.assign({}, options, {\n $shared: false,\n $animations: {}\n });\n }\n return options;\n}\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\nfunction toClip(value) {\n let t, r, b, l;\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n for(i = 0, ilen = metasets.length; i < ilen; ++i){\n keys.push(metasets[i].index);\n }\n return keys;\n}\nfunction applyStack(stack, value, dsIndex, options = {}) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n if (value === null) {\n return;\n }\n let found = false;\n for(i = 0, ilen = keys.length; i < ilen; ++i){\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n found = true;\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isNumberFinite(otherValue) && (singleMode || value === 0 || sign(value) === sign(otherValue))) {\n value += otherValue;\n }\n }\n if (!found && !options.all) {\n return 0;\n }\n return value;\n}\nfunction convertObjectDataToArray(data, meta) {\n const { iScale , vScale } = meta;\n const iAxisKey = iScale.axis === 'x' ? 'x' : 'y';\n const vAxisKey = vScale.axis === 'x' ? 'x' : 'y';\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for(i = 0, ilen = keys.length; i < ilen; ++i){\n key = keys[i];\n adata[i] = {\n [iAxisKey]: key,\n [vAxisKey]: data[key]\n };\n }\n return adata;\n}\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || stacked === undefined && meta.stack !== undefined;\n}\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\nfunction getUserBounds(scale) {\n const { min , max , minDefined , maxDefined } = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()){\n const value = stack[meta.index];\n if (positive && value > 0 || !positive && value < 0) {\n return meta.index;\n }\n }\n return null;\n}\nfunction updateStacks(controller, parsed) {\n const { chart , _cachedMeta: meta } = controller;\n const stacks = chart._stacks || (chart._stacks = {});\n const { iScale , vScale , index: datasetIndex } = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n for(let i = 0; i < ilen; ++i){\n const item = parsed[i];\n const { [iAxis]: index , [vAxis]: value } = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter((key)=>scales[key].axis === axis).shift();\n}\nfunction createDatasetContext(parent, index) {\n return createContext(parent, {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n });\n}\nfunction createDataContext(parent, index, element) {\n return createContext(parent, {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\nfunction clearStacks(meta, items) {\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n items = items || meta._parsed;\n for (const parsed of items){\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\nconst isDirectUpdateMode = (mode)=>mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared)=>shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart)=>canStack && !meta.hidden && meta._stacked && {\n keys: getSortedDatasetIndices(chart, true),\n values: null\n };\nclass DatasetController {\n static defaults = {};\n static datasetElementType = null;\n static dataElementType = null;\n constructor(chart, datasetIndex){\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n this.initialize();\n }\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n }\n }\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n const chooseId = (axis, x, y, r)=>axis === 'x' ? x : axis === 'r' ? r : y;\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale ? meta.vScale : meta.iScale;\n }\n reset() {\n this._update('reset');\n }\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n if (isObject(data)) {\n const meta = this._cachedMeta;\n this._data = convertObjectDataToArray(data, meta);\n } else if (_data !== data) {\n if (_data) {\n unlistenArrayEvents(_data, this);\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n addElements() {\n const meta = this._cachedMeta;\n this._dataCheck();\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n this._dataCheck();\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n this._resyncElements(resetNewElements);\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n meta._stacked = isStacked(meta.vScale, meta);\n }\n }\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n parse(start, count) {\n const { _cachedMeta: meta , _data: data } = this;\n const { iScale , _stacked } = meta;\n const iAxis = iScale.axis;\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\n const isNotInOrderComparedToPrev = ()=>cur[iAxis] === null || prev && cur[iAxis] < prev[iAxis];\n for(i = 0; i < count; ++i){\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n parsePrimitiveData(meta, data, start, count) {\n const { iScale , vScale } = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n parseArrayData(meta, data, start, count) {\n const { xScale , yScale } = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n parseObjectData(meta, data, start, count) {\n const { xScale , yScale } = meta;\n const { xAxisKey ='x' , yAxisKey ='y' } = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]._visualValues\n };\n return applyStack(stack, value, meta.index, {\n mode\n });\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {\n min: Number.POSITIVE_INFINITY,\n max: Number.NEGATIVE_INFINITY\n };\n const { min: otherMin , max: otherMax } = getUserBounds(otherScale);\n let i, parsed;\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isNumberFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n for(i = 0; i < ilen; ++i){\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n break;\n }\n }\n if (sorted) {\n for(i = ilen - 1; i >= 0; --i){\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n for(i = 0, ilen = parsed.length; i < ilen; ++i){\n value = parsed[i][scale.axis];\n if (isNumberFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n getMaxOverflow() {\n return false;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n update(mode) {}\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || elements.length - start;\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n for(i = start; i < start + count; ++i){\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n for(i = 0; i < active.length; ++i){\n active[i].draw(ctx, area);\n }\n }\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset ? this.resolveDatasetElementOptions(mode) : this.resolveDataElementOptions(index || 0, mode);\n }\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context || (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context || (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n _resolveElementOptions(elementType, mode = 'default', index) {\n const active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [\n `${elementType}Hover`,\n 'hover',\n elementType,\n ''\n ] : [\n elementType,\n ''\n ];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n const context = ()=>this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n if (values.$shared) {\n values.$shared = sharing;\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n return values;\n }\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || sharedOptions !== previouslySharedOptions;\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {\n sharedOptions,\n includeOptions\n };\n }\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n options: !active && this.getSharedOptions(options) || options\n });\n }\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n for (const [method, arg1, arg2] of this._syncList){\n this[method](arg1, arg2);\n }\n this._syncList = [];\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n if (count) {\n this.parse(0, count);\n }\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n const move = (arr)=>{\n arr.length += count;\n for(i = arr.length - 1; i >= end; i--){\n arr[i] = arr[i - count];\n }\n };\n move(data);\n for(i = start; i < end; ++i){\n data[i] = new this.dataElementType();\n }\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n updateElements(element, start, count, mode) {}\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n this.chart._dataChanges.push([\n this.index,\n ...args\n ]);\n }\n _onDataPush() {\n const count = arguments.length;\n this._sync([\n '_insertElements',\n this.getDataset().data.length - count,\n count\n ]);\n }\n _onDataPop() {\n this._sync([\n '_removeElements',\n this._cachedMeta.data.length - 1,\n 1\n ]);\n }\n _onDataShift() {\n this._sync([\n '_removeElements',\n 0,\n 1\n ]);\n }\n _onDataSplice(start, count) {\n if (count) {\n this._sync([\n '_removeElements',\n start,\n count\n ]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync([\n '_insertElements',\n start,\n newCount\n ]);\n }\n }\n _onDataUnshift() {\n this._sync([\n '_insertElements',\n 0,\n arguments.length\n ]);\n }\n}\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n for(let i = 0, ilen = visibleMetas.length; i < ilen; i++){\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b)=>a - b));\n }\n return scale._cache.$bar;\n}\n function computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = ()=>{\n if (curr === 32767 || curr === -32768) {\n return;\n }\n if (defined(prev)) {\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n for(i = 0, ilen = values.length; i < ilen; ++i){\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n prev = undefined;\n for(i = 0, ilen = scale.ticks.length; i < ilen; ++i){\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n return min;\n}\n function computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n size = thickness * stackCount;\n ratio = 1;\n }\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - size / 2\n };\n}\n function computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n if (prev === null) {\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n if (next === null) {\n next = curr + curr - prev;\n }\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n item[vScale.axis] = barEnd;\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n for(i = start, ilen = start + count; i < ilen; ++i){\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {\n start,\n end,\n reverse,\n top,\n bottom\n };\n}\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n if (edge === true) {\n properties.borderSkipped = {\n top: true,\n right: true,\n bottom: true,\n left: true\n };\n return;\n }\n const { start , end , reverse , top , bottom } = borderProps(properties);\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\nfunction setInflateAmount(properties, { inflateAmount }, ratio) {\n properties.inflateAmount = inflateAmount === 'auto' ? ratio === 1 ? 0.33 : 0 : inflateAmount;\n}\nclass BarController extends DatasetController {\n static id = 'bar';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'base',\n 'width',\n 'height'\n ]\n }\n }\n };\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true\n }\n }\n };\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseObjectData(meta, data, start, count) {\n const { iScale , vScale } = meta;\n const { xAxisKey ='x' , yAxisKey ='y' } = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for(i = start, ilen = start + count; i < ilen; ++i){\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n getMaxOverflow() {\n return 0;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const { iScale , vScale } = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom) ? '[' + custom.start + ', ' + custom.end + ']' : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const { index , _cachedMeta: { vScale } } = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n for(let i = start; i < start + count; i++){\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {\n base,\n head: base\n } : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || index === stack._top || index === stack._bottom,\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n _getStacks(last, dataIndex) {\n const { iScale } = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type).filter((meta)=>meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);\n const iScaleValue = currentParsed && currentParsed[iScale.axis];\n const skipNull = (meta)=>{\n const parsed = meta._parsed.find((item)=>item[iScale.axis] === iScaleValue);\n const val = parsed && parsed[meta.vScale.axis];\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n for (const meta of metasets){\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n if (stacked === false || stacks.indexOf(meta.stack) === -1 || stacked === undefined && meta.stack === undefined) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n if (!stacks.length) {\n stacks.push(undefined);\n }\n return stacks;\n }\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = name !== undefined ? stacks.indexOf(name) : -1;\n return index === -1 ? stacks.length - 1 : index;\n }\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n for(i = 0, ilen = meta.data.length; i < ilen; ++i){\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n _calculateBarValuePixels(index) {\n const { _cachedMeta: { vScale , _stacked , index: datasetIndex } , options: { base: baseValue , minBarLength } } = this;\n const actualBase = baseValue || 0;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n if (length !== value) {\n start = length - value;\n length = value;\n }\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n head = base;\n }\n size = head - base;\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n if (_stacked && !floating) {\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n if (ruler.grouped) {\n const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex' ? computeFlexCategoryTraits(index, ruler, options, stackCount) : computeFitCategoryTraits(index, ruler, options, stackCount);\n const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined);\n center = range.start + range.chunk * stackIndex + range.chunk / 2;\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n for(; i < ilen; ++i){\n if (this.getParsed(i)[vScale.axis] !== null && !rects[i].hidden) {\n rects[i].draw(this._ctx);\n }\n }\n }\n}\n\nclass BubbleController extends DatasetController {\n static id = 'bubble';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'borderWidth',\n 'radius'\n ]\n }\n }\n };\n static overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for(let i = 0; i < parsed.length; i++){\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for(let i = 0; i < parsed.length; i++){\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for(let i = 0; i < parsed.length; i++){\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n let max = 0;\n for(let i = data.length - 1; i >= 0; --i){\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const { xScale , yScale } = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n update(mode) {\n const points = this._cachedMeta.data;\n this.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const { iScale , vScale } = this._cachedMeta;\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n for(let i = start; i < start + count; i++){\n const point = points[i];\n const parsed = !reset && this.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n if (reset) {\n properties.options.radius = 0;\n }\n }\n this.updateElement(point, i, properties, mode);\n }\n }\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n if (values.$shared) {\n values = Object.assign({}, values, {\n $shared: false\n });\n }\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n return values;\n }\n}\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b)=>_angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b)=>_angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {\n ratioX,\n ratioY,\n offsetX,\n offsetY\n };\n}\nclass DoughnutController extends DatasetController {\n static id = 'doughnut';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'circumference',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'startAngle',\n 'x',\n 'y',\n 'offset',\n 'borderWidth',\n 'spacing'\n ]\n }\n },\n cutout: '50%',\n rotation: 0,\n circumference: 360,\n radius: '100%',\n spacing: 0,\n indexAxis: 'r'\n };\n static descriptors = {\n _scriptable: (name)=>name !== 'spacing',\n _indexable: (name)=>name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash')\n };\n static overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels (chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const { labels: { pointStyle , color } } = chart.legend.options;\n return data.labels.map((label, i)=>{\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick (e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n constructor(chart, datasetIndex){\n super(chart, datasetIndex);\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n linkScales() {}\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i)=>+data[i];\n if (isObject(data[start])) {\n const { key ='value' } = this._parsing;\n getter = (i)=>+resolveObjectKey(data[i], key);\n }\n let i, ilen;\n for(i = start, ilen = start + count; i < ilen; ++i){\n meta._parsed[i] = getter(i);\n }\n }\n }\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n for(let i = 0; i < this.chart.data.datasets.length; ++i){\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n return {\n rotation: min,\n circumference: max - min\n };\n }\n update(mode) {\n const chart = this.chart;\n const { chartArea } = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n const { circumference , rotation } = this._getRotationExtents();\n const { ratioX , ratioY , offsetX , offsetY } = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n meta.total = this.calculateTotal();\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._getCircumference();\n if (reset && opts.animation.animateRotate || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n for(i = 0; i < start; ++i){\n startAngle += this._circumference(i, reset);\n }\n for(i = start; i < start + count; ++i){\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n this.updateElement(arc, i, properties, mode);\n }\n }\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n for(i = 0; i < metaData.length; i++){\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n return total;\n }\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n return {\n label: labels[index] || '',\n value\n };\n }\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n if (!arcs) {\n for(i = 0, ilen = chart.data.datasets.length; i < ilen; ++i){\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n break;\n }\n }\n }\n if (!arcs) {\n return 0;\n }\n for(i = 0, ilen = arcs.length; i < ilen; ++i){\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n getMaxOffset(arcs) {\n let max = 0;\n for(let i = 0, ilen = arcs.length; i < ilen; ++i){\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n for(let i = 0; i < datasetIndex; ++i){\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n return ringWeightOffset;\n }\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n\nclass LineController extends DatasetController {\n static id = 'line';\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n showLine: true,\n spanGaps: false\n };\n static overrides = {\n scales: {\n _index_: {\n type: 'category'\n },\n _value_: {\n type: 'linear'\n }\n }\n };\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n update(mode) {\n const meta = this._cachedMeta;\n const { dataset: line , data: points = [] , _dataset } = meta;\n const animationsDisabled = this.chart._animationsDisabled;\n let { start , count } = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n this._drawStart = start;\n this._drawCount = count;\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n this.updateElements(points, start, count, mode);\n }\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const { iScale , vScale , _stacked , _dataset } = this._cachedMeta;\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const { spanGaps , segment } = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n for(let i = 0; i < pointsCount; ++i){\n const point = points[i];\n const properties = directUpdate ? point : {};\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n const parsed = this.getParsed(i);\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && Math.abs(parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n prevParsed = parsed;\n }\n }\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n\nclass PolarAreaController extends DatasetController {\n static id = 'polarArea';\n static defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ]\n }\n },\n indexAxis: 'r',\n startAngle: 0\n };\n static overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels (chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const { labels: { pointStyle , color } } = chart.legend.options;\n return data.labels.map((label, i)=>{\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick (e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n },\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n };\n constructor(chart, datasetIndex){\n super(chart, datasetIndex);\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n return {\n label: labels[index] || '',\n value\n };\n }\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n update(mode) {\n const arcs = this._cachedMeta.data;\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {\n min: Number.POSITIVE_INFINITY,\n max: Number.NEGATIVE_INFINITY\n };\n meta.data.forEach((element, index)=>{\n const parsed = this.getParsed(index).r;\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n return range;\n }\n _updateRadius() {\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? outerRadius / 100 * opts.cutoutPercentage : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n this.outerRadius = outerRadius - radiusLength * this.index;\n this.innerRadius = this.outerRadius - radiusLength;\n }\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n const defaultAngle = 360 / this.countVisibleElements();\n for(i = 0; i < start; ++i){\n angle += this._computeAngle(i, mode, defaultAngle);\n }\n for(i = start; i < start + count; i++){\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n this.updateElement(arc, i, properties, mode);\n }\n }\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n meta.data.forEach((element, index)=>{\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n return count;\n }\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index) ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle) : 0;\n }\n}\n\nclass PieController extends DoughnutController {\n static id = 'pie';\n static defaults = {\n cutout: 0,\n rotation: 0,\n circumference: 360,\n radius: '100%'\n };\n}\n\nclass RadarController extends DatasetController {\n static id = 'radar';\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n }\n };\n static overrides = {\n aspectRatio: 1,\n scales: {\n r: {\n type: 'radialLinear'\n }\n }\n };\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n line.points = points;\n if (mode !== 'resize') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n this.updateElement(line, undefined, properties, mode);\n }\n this.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n for(let i = start; i < start + count; i++){\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n\nclass ScatterController extends DatasetController {\n static id = 'scatter';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n showLine: false,\n fill: false\n };\n static overrides = {\n interaction: {\n mode: 'point'\n },\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const { xScale , yScale } = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + ')'\n };\n }\n update(mode) {\n const meta = this._cachedMeta;\n const { data: points = [] } = meta;\n const animationsDisabled = this.chart._animationsDisabled;\n let { start , count } = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n this._drawStart = start;\n this._drawCount = count;\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n if (this.options.showLine) {\n if (!this.datasetElementType) {\n this.addElements();\n }\n const { dataset: line , _dataset } = meta;\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n } else if (this.datasetElementType) {\n delete meta.dataset;\n this.datasetElementType = false;\n }\n this.updateElements(points, start, count, mode);\n }\n addElements() {\n const { showLine } = this.options;\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement('line');\n }\n super.addElements();\n }\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const { iScale , vScale , _stacked , _dataset } = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const { spanGaps , segment } = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n for(let i = start; i < start + count; ++i){\n const point = points[i];\n const parsed = this.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && Math.abs(parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n prevParsed = parsed;\n }\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n if (!this.options.showLine) {\n let max = 0;\n for(let i = data.length - 1; i >= 0; --i){\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n\nvar controllers = /*#__PURE__*/Object.freeze({\n__proto__: null,\nBarController: BarController,\nBubbleController: BubbleController,\nDoughnutController: DoughnutController,\nLineController: LineController,\nPieController: PieController,\nPolarAreaController: PolarAreaController,\nRadarController: RadarController,\nScatterController: ScatterController\n});\n\n/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */ function abstract() {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */ class DateAdapterBase {\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */ static override(members) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n options;\n constructor(options){\n this.options = options || {};\n }\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n formats() {\n return abstract();\n }\n parse() {\n return abstract();\n }\n format() {\n return abstract();\n }\n add() {\n return abstract();\n }\n diff() {\n return abstract();\n }\n startOf() {\n return abstract();\n }\n endOf() {\n return abstract();\n }\n}\nvar adapters = {\n _date: DateAdapterBase\n};\n\nfunction binarySearch(metaset, axis, value, intersect) {\n const { controller , data , _sorted } = metaset;\n const iScale = controller._cachedMeta.iScale;\n if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n return lookupMethod(data, axis, value);\n } else if (controller._sharedOptions) {\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {\n lo: start.lo,\n hi: end.hi\n };\n }\n }\n }\n return {\n lo: 0,\n hi: data.length - 1\n };\n}\n function evaluateInteractionItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for(let i = 0, ilen = metasets.length; i < ilen; ++i){\n const { index , data } = metasets[i];\n const { lo , hi } = binarySearch(metasets[i], axis, value, intersect);\n for(let j = lo; j <= hi; ++j){\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\n function getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\n function getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({\n element,\n datasetIndex,\n index\n });\n }\n };\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n function getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n function evaluationFunc(element, datasetIndex, index) {\n const { startAngle , endAngle } = element.getProps([\n 'startAngle',\n 'endAngle'\n ], useFinalPosition);\n const { angle } = getAngleFromPoint(element, {\n x: position.x,\n y: position.y\n });\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({\n element,\n datasetIndex,\n index\n });\n }\n }\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n function getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [\n {\n element,\n datasetIndex,\n index\n }\n ];\n minDistance = distance;\n } else if (distance === minDistance) {\n items.push({\n element,\n datasetIndex,\n index\n });\n }\n }\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n function getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n return axis === 'r' && !intersect ? getNearestRadialItems(chart, position, axis, useFinalPosition) : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n function getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index)=>{\n if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({\n element,\n datasetIndex,\n index\n });\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n var Interaction = {\n evaluateInteractionItems,\n modes: {\n index (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n if (!items.length) {\n return [];\n }\n chart.getSortedVisibleDatasetMetas().forEach((meta)=>{\n const index = items[0].index;\n const element = meta.data[index];\n if (element && !element.skip) {\n elements.push({\n element,\n datasetIndex: meta.index,\n index\n });\n }\n });\n return elements;\n },\n dataset (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for(let i = 0; i < data.length; ++i){\n items.push({\n element: data[i],\n datasetIndex,\n index: i\n });\n }\n }\n return items;\n },\n point (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n nearest (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n x (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n y (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n }\n }\n};\n\nconst STATIC_POSITIONS = [\n 'left',\n 'top',\n 'right',\n 'bottom'\n];\nfunction filterByPosition(array, position) {\n return array.filter((v)=>v.pos === position);\n}\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter((v)=>STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b)=>{\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ? v0.index - v1.index : v0.weight - v1.weight;\n });\n}\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n for(i = 0, ilen = (boxes || []).length; i < ilen; ++i){\n box = boxes[i];\n ({ position: pos , options: { stack , stackWeight =1 } } = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && pos + stack,\n stackWeight\n });\n }\n return layoutBoxes;\n}\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts){\n const { stack , pos , stackWeight } = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {\n count: 0,\n placed: 0,\n weight: 0,\n size: 0\n });\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\n function setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const { vBoxMaxWidth , hBoxMaxHeight } = params;\n let i, ilen, layout;\n for(i = 0, ilen = layouts.length; i < ilen; ++i){\n layout = layouts[i];\n const { fullSize } = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter((wrap)=>wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\nfunction updateDims(chartArea, params, layout, stacks) {\n const { pos , box } = layout;\n const maxPadding = chartArea.maxPadding;\n if (!isObject(pos)) {\n if (layout.size) {\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {\n size: 0,\n count: 1\n };\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n return layout.horizontal ? {\n same: widthChanged,\n other: heightChanged\n } : {\n same: heightChanged,\n other: widthChanged\n };\n}\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n function marginForPositions(positions) {\n const margin = {\n left: 0,\n top: 0,\n right: 0,\n bottom: 0\n };\n positions.forEach((pos)=>{\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n return horizontal ? marginForPositions([\n 'left',\n 'right'\n ]) : marginForPositions([\n 'top',\n 'bottom'\n ]);\n}\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n for(i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i){\n layout = boxes[i];\n box = layout.box;\n box.update(layout.width || chartArea.w, layout.height || chartArea.h, getMargins(layout.horizontal, chartArea));\n const { same , other } = updateDims(chartArea, params, layout, stacks);\n refit |= same && refitBoxes.length;\n changed = changed || other;\n if (!box.fullSize) {\n refitBoxes.push(layout);\n }\n }\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let { x , y } = chartArea;\n for (const layout of boxes){\n const box = layout.box;\n const stack = stacks[layout.stack] || {\n count: 1,\n placed: 0,\n weight: 1\n };\n const weight = layout.stackWeight / stack.weight || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n chartArea.x = x;\n chartArea.y = y;\n}\nvar layouts = {\n addBox (chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n item._layers = item._layers || function() {\n return [\n {\n z: 0,\n draw (chartArea) {\n item.draw(chartArea);\n }\n }\n ];\n };\n chart.boxes.push(item);\n },\n removeBox (chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n configure (chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n update (chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n each(chart.boxes, (box)=>{\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap)=>wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n handleMaxPadding(chartArea);\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w\n };\n each(boxes.chartArea, (layout)=>{\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {\n left: 0,\n top: 0,\n right: 0,\n bottom: 0\n });\n });\n }\n};\n\nclass BasePlatform {\n acquireContext(canvas, aspectRatio) {}\n releaseContext(context) {\n return false;\n }\n addEventListener(chart, type, listener) {}\n removeEventListener(chart, type, listener) {}\n getDevicePixelRatio() {\n return 1;\n }\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n isAttached(canvas) {\n return true;\n }\n updateConfig(config) {\n }\n}\n\nclass BasicPlatform extends BasePlatform {\n acquireContext(item) {\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n\nconst EXPANDO_KEY = '$chartjs';\n const EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\nconst isNullOrEmpty = (value)=>value === null || value === '';\n function initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n style.display = style.display || 'block';\n style.boxSizing = style.boxSizing || 'border-box';\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n return canvas;\n}\nconst eventListenerOptions = supportsEventListenerOptions ? {\n passive: true\n} : false;\nfunction addListener(node, type, listener) {\n if (node) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n}\nfunction removeListener(chart, type, listener) {\n if (chart && chart.canvas) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n }\n}\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const { x , y } = getRelativePosition(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null\n };\n}\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList){\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver((entries)=>{\n let trigger = false;\n for (const entry of entries){\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {\n childList: true,\n subtree: true\n });\n return observer;\n}\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver((entries)=>{\n let trigger = false;\n for (const entry of entries){\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {\n childList: true,\n subtree: true\n });\n return observer;\n}\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart)=>{\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height)=>{\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n listener();\n }\n }, window);\n const observer = new ResizeObserver((entries)=>{\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n return observer;\n}\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event)=>{\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n addListener(canvas, type, proxy);\n return proxy;\n}\n class DomPlatform extends BasePlatform {\n acquireContext(canvas, aspectRatio) {\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n if (context && context.canvas === canvas) {\n initCanvas(canvas, aspectRatio);\n return context;\n }\n return null;\n }\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n const initial = canvas[EXPANDO_KEY].initial;\n [\n 'height',\n 'width'\n ].forEach((prop)=>{\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n const style = initial.style || {};\n Object.keys(style).forEach((key)=>{\n canvas.style[key] = style[key];\n });\n canvas.width = canvas.width;\n delete canvas[EXPANDO_KEY];\n return true;\n }\n addEventListener(chart, type, listener) {\n this.removeEventListener(chart, type);\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n if (!proxy) {\n return;\n }\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n isAttached(canvas) {\n const container = canvas && _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n\nfunction _detectPlatform(canvas) {\n if (!_isDomSupported() || typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nclass Element {\n static defaults = {};\n static defaultRoutes = undefined;\n x;\n y;\n active = false;\n options;\n $animations;\n tooltipPosition(useFinalPosition) {\n const { x , y } = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n return {\n x,\n y\n };\n }\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n getProps(props, final) {\n const anims = this.$animations;\n if (!final || !anims) {\n // let's not create an object, if not needed\n return this;\n }\n const ret = {};\n props.forEach((prop)=>{\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop];\n });\n return ret;\n }\n}\n\nfunction autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for(i = 0, ilen = numMajorIndices - 1; i < ilen; i++){\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\n function calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n const factors = _factorize(evenMajorSpacing);\n for(let i = 0, ilen = factors.length - 1; i < ilen; i++){\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\n function getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for(i = 0, ilen = ticks.length; i < ilen; i++){\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\n function skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n spacing = Math.ceil(spacing);\n for(i = 0; i < ticks.length; i++){\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\n function skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n next = start;\n while(next < 0){\n count++;\n next = Math.round(start + count * spacing);\n }\n for(i = Math.max(start, 0); i < end; i++){\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\n function getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n if (len < 2) {\n return false;\n }\n for(diff = arr[0], i = 1; i < len; ++i){\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n\nconst reverseAlign = (align)=>align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset)=>edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit)=>Math.min(maxTicksLimit || ticksLength, ticksLength);\n function sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n for(; i < len; i += increment){\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n function getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6;\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n function garbageCollect(caches, length) {\n each(caches, (cache)=>{\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for(i = 0; i < gcLen; ++i){\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\n function getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n function getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n return lines * font.lineHeight + padding.height;\n}\nfunction createScaleContext(parent, scale) {\n return createContext(parent, {\n scale,\n type: 'scale'\n });\n}\nfunction createTickContext(parent, index, tick) {\n return createContext(parent, {\n tick,\n index,\n type: 'tick'\n });\n}\nfunction titleAlign(align, position, reverse) {\n let ret = _toLeftRightCenter(align);\n if (reverse && position !== 'right' || !reverse && position === 'right') {\n ret = reverseAlign(ret);\n }\n return ret;\n}\nfunction titleArgs(scale, offset, position, align) {\n const { top , left , bottom , right , chart } = scale;\n const { chartArea , scales } = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {\n titleX,\n titleY,\n maxWidth,\n rotation\n };\n}\nclass Scale extends Element {\n constructor(cfg){\n super();\n this.id = cfg.id;\n this.type = cfg.type;\n this.options = undefined;\n this.ctx = cfg.ctx;\n this.chart = cfg.chart;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n this.maxWidth = undefined;\n this.maxHeight = undefined;\n this.paddingTop = undefined;\n this.paddingBottom = undefined;\n this.paddingLeft = undefined;\n this.paddingRight = undefined;\n this.axis = undefined;\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n this.ticks = [];\n this._gridLineItems = null;\n this._labelItems = null;\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n this._startPixel = undefined;\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n init(options) {\n this.options = options.setContext(this.getContext());\n this.axis = options.axis;\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n parse(raw, index) {\n return raw;\n }\n getUserBounds() {\n let { _userMin , _userMax , _suggestedMin , _suggestedMax } = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isNumberFinite(_userMin),\n maxDefined: isNumberFinite(_userMax)\n };\n }\n getMinMax(canStack) {\n let { min , max , minDefined , maxDefined } = this.getUserBounds();\n let range;\n if (minDefined && maxDefined) {\n return {\n min,\n max\n };\n }\n const metas = this.getMatchingVisibleMetas();\n for(let i = 0, ilen = metas.length; i < ilen; ++i){\n range = metas[i].controller.getMinMax(this, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n getTicks() {\n return this.ticks;\n }\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n beforeUpdate() {\n callback(this.options.beforeUpdate, [\n this\n ]);\n }\n update(maxWidth, maxHeight, margins) {\n const { beginAtZero , grace , ticks: tickOpts } = this.options;\n const sampleSize = tickOpts.sampleSize;\n this.beforeUpdate();\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n this._maxLength = this.isHorizontal() ? this.width + margins.left + margins.right : this.height + margins.top + margins.bottom;\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n this.beforeBuildTicks();\n this.ticks = this.buildTicks() || [];\n this.afterBuildTicks();\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n this.configure();\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation();\n this.afterCalculateLabelRotation();\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n if (samplingEnabled) {\n this._convertTicksToLabels(this.ticks);\n }\n this.beforeFit();\n this.fit();\n this.afterFit();\n this.afterUpdate();\n }\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n afterUpdate() {\n callback(this.options.afterUpdate, [\n this\n ]);\n }\n beforeSetDimensions() {\n callback(this.options.beforeSetDimensions, [\n this\n ]);\n }\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = 0;\n this.bottom = this.height;\n }\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n callback(this.options.afterSetDimensions, [\n this\n ]);\n }\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n callback(this.options[name], [\n this\n ]);\n }\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n beforeTickToLabelConversion() {\n callback(this.options.beforeTickToLabelConversion, [\n this\n ]);\n }\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for(i = 0, ilen = ticks.length; i < ilen; i++){\n tick = ticks[i];\n tick.label = callback(tickOpts.callback, [\n tick.value,\n i,\n ticks\n ], this);\n }\n }\n afterTickToLabelConversion() {\n callback(this.options.afterTickToLabelConversion, [\n this\n ]);\n }\n beforeCalculateLabelRotation() {\n callback(this.options.beforeCalculateLabelRotation, [\n this\n ]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid) - tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)), Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n callback(this.options.afterCalculateLabelRotation, [\n this\n ]);\n }\n afterAutoSkip() {}\n beforeFit() {\n callback(this.options.beforeFit, [\n this\n ]);\n }\n fit() {\n const minSize = {\n width: 0,\n height: 0\n };\n const { chart , options: { ticks: tickOpts , title: titleOpts , grid: gridOpts } } = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight;\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n if (tickOpts.display && this.ticks.length) {\n const { first , last , widest , highest } = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n if (isHorizontal) {\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n this._handleMargins();\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n _calculatePadding(first, last, sin, cos) {\n const { ticks: { align , padding } , position } = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n afterFit() {\n callback(this.options.afterFit, [\n this\n ]);\n }\n isHorizontal() {\n const { axis , position } = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n isFullSize() {\n return this.options.fullSize;\n }\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n this.generateTickLabels(ticks);\n let i, ilen;\n for(i = 0, ilen = ticks.length; i < ilen; i++){\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n this.afterTickToLabelConversion();\n }\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n }\n return labelSizes;\n }\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n const { ctx , _longestTextCache: caches } = this;\n const widths = [];\n const heights = [];\n const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n for(i = 0; i < length; i += increment){\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {\n data: {},\n gc: []\n };\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n for(j = 0, jlen = label.length; j < jlen; ++j){\n nestedLabel = label[j];\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n const valueAt = (idx)=>({\n width: widths[idx] || 0,\n height: heights[idx] || 0\n });\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights\n };\n }\n getLabelForValue(value) {\n return value;\n }\n getPixelForValue(value, index) {\n return NaN;\n }\n getValueForPixel(pixel) {}\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n }\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n getBaseValue() {\n const { min , max } = this;\n return min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0;\n }\n getContext(index) {\n const ticks = this.ticks || [];\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context || (tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context || (this.$context = createScaleContext(this.chart.getContext(), this));\n }\n _tickSize() {\n const optionTicks = this.options.ticks;\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n const labelSizes = this._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n return this.isHorizontal() ? h * cos > w * sin ? w / cos : h / sin : h * sin < w * cos ? h / cos : w / sin;\n }\n _isVisible() {\n const display = this.options.display;\n if (display !== 'auto') {\n return !!display;\n }\n return this.getMatchingVisibleMetas().length > 0;\n }\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const { grid , position , border } = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n if (position === 'top') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for(i = 0; i < ticksLength; i += step){\n const context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n lineValue = getPixelForGridLine(this, i, offset);\n if (lineValue === undefined) {\n continue;\n }\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset\n });\n }\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n return items;\n }\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const { position , ticks: optionTicks } = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const { align , crossAlign , padding , mirror } = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n if (position === 'top') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = (chartArea.top + chartArea.bottom) / 2 + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = (chartArea.left + chartArea.right) / 2 - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n const labelSizes = this._getLabelSizes();\n for(i = 0, ilen = ticks.length; i < ilen; ++i){\n tick = ticks[i];\n label = tick.label;\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n let tickTextAlign = textAlign;\n if (isHorizontal) {\n x = pixel;\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += lineHeight / 2 * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n let backdrop;\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n switch(textBaseline){\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n }\n switch(textAlign){\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n case 'inner':\n if (i === ilen - 1) {\n left -= width;\n } else if (i > 0) {\n left -= width / 2;\n }\n break;\n }\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n color: optsAtIndex.backdropColor\n };\n }\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [\n x,\n y\n ],\n backdrop\n }\n });\n }\n return items;\n }\n _getXAxisLabelAlignment() {\n const { position , ticks } = this.options;\n const rotation = -toRadians(this.labelRotation);\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n let align = 'center';\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n return align;\n }\n _getYAxisLabelAlignment(tl) {\n const { position , ticks: { crossAlign , mirror , padding } } = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n let textAlign;\n let x;\n if (position === 'left') {\n if (mirror) {\n x = this.right + padding;\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x += widest;\n }\n } else {\n x = this.right - tickAndPadding;\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= widest / 2;\n } else {\n textAlign = 'left';\n x = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= widest / 2;\n } else {\n textAlign = 'left';\n x -= widest;\n }\n } else {\n x = this.left + tickAndPadding;\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n return {\n textAlign,\n x\n };\n }\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n const chart = this.chart;\n const position = this.options.position;\n if (position === 'left' || position === 'right') {\n return {\n top: 0,\n left: this.left,\n bottom: chart.height,\n right: this.right\n };\n }\n if (position === 'top' || position === 'bottom') {\n return {\n top: this.top,\n left: 0,\n bottom: this.bottom,\n right: chart.width\n };\n }\n }\n drawBackground() {\n const { ctx , options: { backgroundColor } , left , top , width , height } = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex((t)=>t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n const drawLine = (p1, p2, style)=>{\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n if (grid.display) {\n for(i = 0, ilen = items.length; i < ilen; ++i){\n const item = items[i];\n if (grid.drawOnChartArea) {\n drawLine({\n x: item.x1,\n y: item.y1\n }, {\n x: item.x2,\n y: item.y2\n }, item);\n }\n if (grid.drawTicks) {\n drawLine({\n x: item.tx1,\n y: item.ty1\n }, {\n x: item.tx2,\n y: item.ty2\n }, {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n });\n }\n }\n }\n }\n drawBorder() {\n const { chart , ctx , options: { border , grid } } = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n ctx.restore();\n }\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n if (!optionTicks.display) {\n return;\n }\n const ctx = this.ctx;\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n const items = this.getLabelItems(chartArea);\n for (const item of items){\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n if (area) {\n unclipArea(ctx);\n }\n }\n drawTitle() {\n const { ctx , options: { position , title , reverse } } = this;\n if (!title.display) {\n return;\n }\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n if (position === 'bottom' || position === 'center' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n const { titleX , titleY , maxWidth , rotation } = titleArgs(this, offset, position, align);\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [\n titleX,\n titleY\n ]\n });\n }\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n const bz = valueOrDefault(opts.border && opts.border.z, 0);\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n return [\n {\n z: tz,\n draw: (chartArea)=>{\n this.draw(chartArea);\n }\n }\n ];\n }\n return [\n {\n z: gz,\n draw: (chartArea)=>{\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n },\n {\n z: bz,\n draw: ()=>{\n this.drawBorder();\n }\n },\n {\n z: tz,\n draw: (chartArea)=>{\n this.drawLabels(chartArea);\n }\n }\n ];\n }\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + 'AxisID';\n const result = [];\n let i, ilen;\n for(i = 0, ilen = metas.length; i < ilen; ++i){\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n\nclass TypedRegistry {\n constructor(type, scope, override){\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n if (isIChartComponent(proto)) {\n parentScope = this.register(proto);\n }\n const items = this.items;\n const id = item.id;\n const scope = this.scope + '.' + id;\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n if (id in items) {\n return scope;\n }\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n defaults.override(item.id, item.overrides);\n }\n return scope;\n }\n get(id) {\n return this.items[id];\n }\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n if (id in items) {\n delete items[id];\n }\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\nfunction registerDefaults(item, scope, parentScope) {\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n defaults.set(scope, itemDefaults);\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach((property)=>{\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [\n scope\n ].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n\nclass Registry {\n constructor(){\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n this._typedRegistries = [\n this.controllers,\n this.scales,\n this.elements\n ];\n }\n add(...args) {\n this._each('register', args);\n }\n remove(...args) {\n this._each('unregister', args);\n }\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n _each(method, args, typedRegistry) {\n [\n ...args\n ].forEach((arg)=>{\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || reg === this.plugins && arg.id) {\n this._exec(method, reg, arg);\n } else {\n each(arg, (item)=>{\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n callback(component['before' + camelMethod], [], component);\n registry[method](component);\n callback(component['after' + camelMethod], [], component);\n }\n _getRegistryForType(type) {\n for(let i = 0; i < this._typedRegistries.length; i++){\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n return this.plugins;\n }\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n}\nvar registry = /* #__PURE__ */ new Registry();\n\nclass PluginService {\n constructor(){\n this._init = [];\n }\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._init, chart, 'uninstall');\n }\n return result;\n }\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors){\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [\n chart,\n args,\n descriptor.options\n ];\n if (callback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n return true;\n }\n invalidate() {\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n const descriptors = this._cache = this._createDescriptors(chart);\n this._notifyStateChanges(chart);\n return descriptors;\n }\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b)=>a.filter((x)=>!b.some((y)=>x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\n function allPlugins(config) {\n const localIds = {};\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for(let i = 0; i < keys.length; i++){\n plugins.push(registry.getPlugin(keys[i]));\n }\n const local = config.plugins || [];\n for(let i = 0; i < local.length; i++){\n const plugin = local[i];\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n return {\n plugins,\n localIds\n };\n}\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\nfunction createDescriptors(chart, { plugins , localIds }, options, all) {\n const result = [];\n const context = chart.getContext();\n for (const plugin of plugins){\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, {\n plugin,\n local: localIds[id]\n }, opts, context)\n });\n }\n return result;\n}\nfunction pluginOpts(config, { plugin , local }, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [\n ''\n ], {\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n\nfunction getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\nfunction idMatchesAxis(id) {\n if (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n}\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\nfunction determineAxis(id, ...scaleOptions) {\n if (idMatchesAxis(id)) {\n return id;\n }\n for (const opts of scaleOptions){\n const axis = opts.axis || axisFromPosition(opts.position) || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n if (axis) {\n return axis;\n }\n }\n throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\nfunction getAxisFromDataset(id, axis, dataset) {\n if (dataset[axis + 'AxisID'] === id) {\n return {\n axis\n };\n }\n}\nfunction retrieveAxisFromDatasets(id, config) {\n if (config.data && config.data.datasets) {\n const boundDs = config.data.datasets.filter((d)=>d.xAxisID === id || d.yAxisID === id);\n if (boundDs.length) {\n return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n }\n }\n return {};\n}\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {\n scales: {}\n };\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const scales = Object.create(null);\n Object.keys(configScales).forEach((id)=>{\n const scaleConf = configScales[id];\n if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = mergeIf(Object.create(null), [\n {\n axis\n },\n scaleConf,\n defaultScaleOptions[axis],\n defaultScaleOptions[defaultId]\n ]);\n });\n config.data.datasets.forEach((dataset)=>{\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach((defaultID)=>{\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [\n {\n axis\n },\n configScales[id],\n defaultScaleOptions[defaultID]\n ]);\n });\n });\n Object.keys(scales).forEach((key)=>{\n const scale = scales[key];\n mergeIf(scale, [\n defaults.scales[scale.type],\n defaults.scale\n ]);\n });\n return scales;\n}\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n initOptions(config);\n return config;\n}\nconst keyCache = new Map();\nconst keysCached = new Set();\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\nconst addIfFound = (set, obj, key)=>{\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\nclass Config {\n constructor(config){\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n get platform() {\n return this._config.platform;\n }\n get type() {\n return this._config.type;\n }\n set type(type) {\n this._config.type = type;\n }\n get data() {\n return this._config.data;\n }\n set data(data) {\n this._config.data = initData(data);\n }\n get options() {\n return this._config.options;\n }\n set options(options) {\n this._config.options = options;\n }\n get plugins() {\n return this._config.plugins;\n }\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType, ()=>[\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`, ()=>[\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`\n ],\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`, ()=>[\n [\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]\n ]);\n }\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`, ()=>[\n [\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || []\n ]\n ]);\n }\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n getOptionScopes(mainScope, keyLists, resetCache) {\n const { options , type } = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n const scopes = new Set();\n keyLists.forEach((keys)=>{\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach((key)=>addIfFound(scopes, mainScope, key));\n }\n keys.forEach((key)=>addIfFound(scopes, options, key));\n keys.forEach((key)=>addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach((key)=>addIfFound(scopes, defaults, key));\n keys.forEach((key)=>addIfFound(scopes, descriptors, key));\n });\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n chartOptionScopes() {\n const { options , type } = this;\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {},\n {\n type\n },\n defaults,\n descriptors\n ];\n }\n resolveNamedOptions(scopes, names, context, prefixes = [\n ''\n ]) {\n const result = {\n $shared: true\n };\n const { resolver , subPrefixes } = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n for (const prop of names){\n result[prop] = options[prop];\n }\n return result;\n }\n createResolver(scopes, context, prefixes = [\n ''\n ], descriptorDefaults) {\n const { resolver } = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context) ? _attachContext(resolver, context, undefined, descriptorDefaults) : resolver;\n }\n}\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter((p)=>!p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\nconst hasFunction = (value)=>isObject(value) && Object.getOwnPropertyNames(value).some((key)=>isFunction(value[key]));\nfunction needContext(proxy, names) {\n const { isScriptable , isIndexable } = _descriptors(proxy);\n for (const prop of names){\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if (scriptable && (isFunction(value) || hasFunction(value)) || indexable && isArray(value)) {\n return true;\n }\n }\n return false;\n}\n\nvar version = \"4.4.6\";\n\nconst KNOWN_POSITIONS = [\n 'top',\n 'bottom',\n 'left',\n 'right',\n 'chartArea'\n];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x';\n}\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1] ? a[l2] - b[l2] : a[l1] - b[l1];\n };\n}\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n chart.notifyPlugins('afterRender');\n callback(animationOptions && animationOptions.onComplete, [\n context\n ], chart);\n}\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callback(animationOptions && animationOptions.onProgress, [\n context\n ], chart);\n}\n function getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n item = item[0];\n }\n if (item && item.canvas) {\n item = item.canvas;\n }\n return item;\n}\nconst instances = {};\nconst getChart = (key)=>{\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c)=>c.canvas === canvas).pop();\n};\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys){\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n function determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\nfunction getSizeForArea(scale, chartArea, field) {\n return scale.options.clip ? scale[field] : chartArea[field];\n}\nfunction getDatasetArea(meta, chartArea) {\n const { xScale , yScale } = meta;\n if (xScale && yScale) {\n return {\n left: getSizeForArea(xScale, chartArea, 'left'),\n right: getSizeForArea(xScale, chartArea, 'right'),\n top: getSizeForArea(yScale, chartArea, 'top'),\n bottom: getSizeForArea(yScale, chartArea, 'bottom')\n };\n }\n return chartArea;\n}\nclass Chart {\n static defaults = defaults;\n static instances = instances;\n static overrides = overrides;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n constructor(item, userConfig){\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error('Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' + ' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.');\n }\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce((mode)=>this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n instances[this.id] = this;\n if (!context || !canvas) {\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n animator.listen(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n get aspectRatio() {\n const { options: { aspectRatio , maintainAspectRatio } , width , height , _aspectRatio } = this;\n if (!isNullOrUndef(aspectRatio)) {\n return aspectRatio;\n }\n if (maintainAspectRatio && _aspectRatio) {\n return _aspectRatio;\n }\n return height ? width / height : null;\n }\n get data() {\n return this.config.data;\n }\n set data(data) {\n this.config.data = data;\n }\n get options() {\n return this._options;\n }\n set options(options) {\n this.config.options = options;\n }\n get registry() {\n return registry;\n }\n _initialize() {\n this.notifyPlugins('beforeInit');\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n this.bindEvents();\n this.notifyPlugins('afterInit');\n return this;\n }\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n stop() {\n animator.stop(this);\n return this;\n }\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {\n width,\n height\n };\n }\n }\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n this.notifyPlugins('resize', {\n size: newSize\n });\n callback(options.onResize, [\n this,\n newSize\n ], this);\n if (this.attached) {\n if (this._doResize(mode)) {\n this.render();\n }\n }\n }\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n each(scalesOptions, (axisOptions, axisID)=>{\n axisOptions.id = axisID;\n });\n }\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id)=>{\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n if (scaleOpts) {\n items = items.concat(Object.keys(scaleOpts).map((id)=>{\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n }));\n }\n each(items, (item)=>{\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n scale.init(scaleOptions, options);\n });\n each(updated, (hasUpdated, id)=>{\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n each(scales, (scale)=>{\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n metasets.sort((a, b)=>a.index - b.index);\n if (numMeta > numData) {\n for(let i = numData; i < numMeta; ++i){\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n _removeUnreferencedMetasets() {\n const { _metasets: metasets , data: { datasets } } = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index)=>{\n if (datasets.filter((x)=>x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n this._removeUnreferencedMetasets();\n for(i = 0, ilen = datasets.length; i < ilen; i++){\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const { datasetElementType , dataElementType } = defaults.datasets[type];\n Object.assign(ControllerClass, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n this._updateMetasets();\n return newControllers;\n }\n _resetElements() {\n each(this.data.datasets, (dataset, datasetIndex)=>{\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n update(mode) {\n const config = this.config;\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n this._plugins.invalidate();\n if (this.notifyPlugins('beforeUpdate', {\n mode,\n cancelable: true\n }) === false) {\n return;\n }\n const newControllers = this.buildOrUpdateControllers();\n this.notifyPlugins('beforeElementsUpdate');\n let minPadding = 0;\n for(let i = 0, ilen = this.data.datasets.length; i < ilen; i++){\n const { controller } = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n if (!animsDisabled) {\n each(newControllers, (controller)=>{\n controller.reset();\n });\n }\n this._updateDatasets(mode);\n this.notifyPlugins('afterUpdate', {\n mode\n });\n this._layers.sort(compare2Level('z', '_idx'));\n const { _active , _lastEvent } = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n this.render();\n }\n _updateScales() {\n each(this.scales, (scale)=>{\n layouts.removeBox(this, scale);\n });\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n this.unbindEvents();\n this.bindEvents();\n }\n }\n _updateHiddenIndices() {\n const { _hiddenIndices } = this;\n const changes = this._getUniformDataChanges() || [];\n for (const { method , start , count } of changes){\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx)=>new Set(_dataChanges.filter((c)=>c[0] === idx).map((c, i)=>i + ',' + c.splice(1).join(',')));\n const changeSet = makeSet(0);\n for(let i = 1; i < datasetCount; i++){\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet).map((c)=>c.split(',')).map((a)=>({\n method: a[1],\n start: +a[2],\n count: +a[3]\n }));\n }\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {\n cancelable: true\n }) === false) {\n return;\n }\n layouts.update(this, this.width, this.height, minPadding);\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n this._layers = [];\n each(this.boxes, (box)=>{\n if (noArea && box.position === 'chartArea') {\n return;\n }\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n this._layers.forEach((item, index)=>{\n item._idx = index;\n });\n this.notifyPlugins('afterLayout');\n }\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {\n mode,\n cancelable: true\n }) === false) {\n return;\n }\n for(let i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n this.getDatasetMeta(i).controller.configure();\n }\n for(let i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n this._updateDataset(i, isFunction(mode) ? mode({\n datasetIndex: i\n }) : mode);\n }\n this.notifyPlugins('afterDatasetsUpdate', {\n mode\n });\n }\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {\n meta,\n index,\n mode,\n cancelable: true\n };\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n meta.controller._update(mode);\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n render() {\n if (this.notifyPlugins('beforeRender', {\n cancelable: true\n }) === false) {\n return;\n }\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({\n chart: this\n });\n }\n }\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const { width , height } = this._resizeBeforeDraw;\n this._resizeBeforeDraw = null;\n this._resize(width, height);\n }\n this.clear();\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n if (this.notifyPlugins('beforeDraw', {\n cancelable: true\n }) === false) {\n return;\n }\n const layers = this._layers;\n for(i = 0; i < layers.length && layers[i].z <= 0; ++i){\n layers[i].draw(this.chartArea);\n }\n this._drawDatasets();\n for(; i < layers.length; ++i){\n layers[i].draw(this.chartArea);\n }\n this.notifyPlugins('afterDraw');\n }\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n for(i = 0, ilen = metasets.length; i < ilen; ++i){\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n return result;\n }\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n _drawDatasets() {\n if (this.notifyPlugins('beforeDatasetsDraw', {\n cancelable: true\n }) === false) {\n return;\n }\n const metasets = this.getSortedVisibleDatasetMetas();\n for(let i = metasets.length - 1; i >= 0; --i){\n this._drawDataset(metasets[i]);\n }\n this.notifyPlugins('afterDatasetsDraw');\n }\n _drawDataset(meta) {\n const ctx = this.ctx;\n const clip = meta._clip;\n const useClip = !clip.disabled;\n const area = getDatasetArea(meta, this.chartArea);\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n if (useClip) {\n clipArea(ctx, {\n left: clip.left === false ? 0 : area.left - clip.left,\n right: clip.right === false ? this.width : area.right + clip.right,\n top: clip.top === false ? 0 : area.top - clip.top,\n bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom\n });\n }\n meta.controller.draw();\n if (useClip) {\n unclipArea(ctx);\n }\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\n }\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n return [];\n }\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter((x)=>x && x._dataset === dataset).pop();\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n return meta;\n }\n getContext() {\n return this.$context || (this.$context = createContext(null, {\n chart: this,\n type: 'chart'\n }));\n }\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n const meta = this.getDatasetMeta(datasetIndex);\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n anims.update(meta, {\n visible\n });\n this.update((ctx)=>ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n for(i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n this._destroyDatasetMeta(i);\n }\n }\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const { canvas , ctx } = this;\n this._stop();\n this.config.clearCache();\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n delete instances[this.id];\n this.notifyPlugins('afterDestroy');\n }\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n const _add = (type, listener)=>{\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const listener = (e, x, y)=>{\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n each(this.options.events, (type)=>_add(type, listener));\n }\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n const _add = (type, listener)=>{\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener)=>{\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n const listener = (width, height)=>{\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n let detached;\n const attached = ()=>{\n _remove('attach', attached);\n this.attached = true;\n this.resize();\n _add('resize', listener);\n _add('detach', detached);\n };\n detached = ()=>{\n this.attached = false;\n _remove('resize', listener);\n this._stop();\n this._resize(0, 0);\n _add('attach', attached);\n };\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n unbindEvents() {\n each(this._listeners, (listener, type)=>{\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n each(this._responsiveListeners, (listener, type)=>{\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n for(i = 0, ilen = items.length; i < ilen; ++i){\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({ datasetIndex , index })=>{\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n if (changed) {\n this._active = active;\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter((p)=>p.plugin.id === pluginId).length === 1;\n }\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.options.hover;\n const diff = (a, b)=>a.filter((x)=>!b.some((y)=>x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin)=>(plugin.options.events || this.options.events).includes(e.native.type);\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n const changed = this._handleEvent(e, replay, args.inChartArea);\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n if (changed || args.changed) {\n this.render();\n }\n return this;\n }\n _handleEvent(e, replay, inChartArea) {\n const { _active: lastActive = [] , options } = this;\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n if (inChartArea) {\n this._lastEvent = null;\n callback(options.onHover, [\n e,\n active,\n this\n ], this);\n if (isClick) {\n callback(options.onClick, [\n e,\n active,\n this\n ], this);\n }\n }\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n this._lastEvent = lastEvent;\n return changed;\n }\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n if (!inChartArea) {\n return lastActive;\n }\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\nfunction invalidatePlugins() {\n return each(Chart.instances, (chart)=>chart._plugins.invalidate());\n}\n\nfunction clipArc(ctx, element, endAngle) {\n const { startAngle , pixelMargin , x , y , outerRadius , innerRadius } = element;\n let angleMargin = pixelMargin / outerRadius;\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, [\n 'outerStart',\n 'outerEnd',\n 'innerStart',\n 'innerEnd'\n ]);\n}\n/**\n * Parse border radius from the provided options\n */ function parseBorderRadius$1(arc, innerRadius, outerRadius, angleDelta) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\n const computeOuterLimit = (val)=>{\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit)\n };\n}\n/**\n * Convert (r, 𝜃) to (x, y)\n */ function rThetaToXY(r, theta, x, y) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta)\n };\n}\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1--->a--->2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */ function pathArc(ctx, element, offset, spacing, end, circular) {\n const { x , y , startAngle: start , pixelMargin , innerRadius: innerR } = element;\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n let spacingOffset = 0;\n const alpha = end - start;\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the spacing\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? alpha * avNogSpacingRadius / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const { outerStart , outerEnd , innerStart , innerEnd } = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle);\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n ctx.beginPath();\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n // The corner segment from point 2 to point 3\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n // The corner segment from point 4 to point 5\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = (endAngle - innerEnd / innerRadius + (startAngle + innerStart / innerRadius)) / 2;\n ctx.arc(x, y, innerRadius, endAngle - innerEnd / innerRadius, innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + innerStart / innerRadius, true);\n // The corner segment from point 6 to point 7\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n // The corner segment from point 8 to point 1\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n } else {\n ctx.moveTo(x, y);\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n ctx.closePath();\n}\nfunction drawArc(ctx, element, offset, spacing, circular) {\n const { fullCircles , startAngle , circumference } = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for(let i = 0; i < fullCircles; ++i){\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\nfunction drawBorder(ctx, element, offset, spacing, circular) {\n const { fullCircles , startAngle , circumference , options } = element;\n const { borderWidth , borderJoinStyle , borderDash , borderDashOffset } = options;\n const inner = options.borderAlign === 'inner';\n if (!borderWidth) {\n return;\n }\n ctx.setLineDash(borderDash || []);\n ctx.lineDashOffset = borderDashOffset;\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || 'bevel';\n }\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for(let i = 0; i < fullCircles; ++i){\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\nclass ArcElement extends Element {\n static id = 'arc';\n static defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true\n };\n static defaultRoutes = {\n backgroundColor: 'backgroundColor'\n };\n static descriptors = {\n _scriptable: true,\n _indexable: (name)=>name !== 'borderDash'\n };\n circumference;\n endAngle;\n fullCircles;\n innerRadius;\n outerRadius;\n pixelMargin;\n startAngle;\n constructor(cfg){\n super();\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(chartX, chartY, useFinalPosition) {\n const point = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n const { angle , distance } = getAngleFromPoint(point, {\n x: chartX,\n y: chartY\n });\n const { startAngle , endAngle , innerRadius , outerRadius , circumference } = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const nonZeroBetween = _angleBetween(angle, startAngle, endAngle) && startAngle !== endAngle;\n const betweenAngles = _circumference >= TAU || nonZeroBetween;\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n return betweenAngles && withinRadius;\n }\n getCenterPoint(useFinalPosition) {\n const { x , y , startAngle , endAngle , innerRadius , outerRadius } = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ], useFinalPosition);\n const { offset , spacing } = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n tooltipPosition(useFinalPosition) {\n return this.getCenterPoint(useFinalPosition);\n }\n draw(ctx) {\n const { options , circumference } = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = options.borderAlign === 'inner' ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n ctx.save();\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n const radiusOffset = offset * fix;\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n ctx.restore();\n }\n}\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n function getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n return lineTo;\n}\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const { start: paramsStart = 0 , end: paramsEnd = count - 1 } = params;\n const { start: segmentStart , end: segmentEnd } = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n function pathSegment(ctx, line, segment, params) {\n const { points , options } = line;\n const { count , start , loop , ilen } = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n let { move =true , reverse } = params || {};\n let i, point, prev;\n for(i = 0; i <= ilen; ++i){\n point = points[(start + (reverse ? ilen - i : i)) % count];\n if (point.skip) {\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n prev = point;\n }\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n return !!loop;\n}\n function fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const { count , start , ilen } = pathVars(points, segment, params);\n const { move =true , reverse } = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n const pointIndex = (index)=>(start + (reverse ? ilen - index : index)) % count;\n const drawX = ()=>{\n if (minY !== maxY) {\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n ctx.lineTo(avgX, lastY);\n }\n };\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n for(i = 0; i <= ilen; ++i){\n point = points[pointIndex(i)];\n if (point.skip) {\n continue;\n }\n const x = point.x;\n const y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n ctx.lineTo(x, y);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n lastY = y;\n }\n drawX();\n}\n function _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\n function _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n return _pointInLine;\n}\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\nfunction strokePathDirect(ctx, line, start, count) {\n const { segments , options } = line;\n const segmentMethod = _getSegmentMethod(line);\n for (const segment of segments){\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {\n start,\n end: start + count - 1\n })) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\nconst usePath2D = typeof Path2D === 'function';\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\nclass LineElement extends Element {\n static id = 'line';\n static defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0\n };\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n static descriptors = {\n _scriptable: true,\n _indexable: (name)=>name !== 'borderDash' && name !== 'fill'\n };\n constructor(cfg){\n super();\n this.animated = true;\n this.options = undefined;\n this._chart = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n get points() {\n return this._points;\n }\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {\n property,\n start: value,\n end: value\n });\n if (!segments.length) {\n return;\n }\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for(i = 0, ilen = segments.length; i < ilen; ++i){\n const { start , end } = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n start = start || 0;\n count = count || this.points.length - start;\n for (const segment of segments){\n loop &= segmentMethod(ctx, this, segment, {\n start,\n end: start + count - 1\n });\n }\n return !!loop;\n }\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n if (points.length && options.borderWidth) {\n ctx.save();\n draw(ctx, this, start, count);\n ctx.restore();\n }\n if (this.animated) {\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n\nfunction inRange$1(el, pos, axis, useFinalPosition) {\n const options = el.options;\n const { [axis]: value } = el.getProps([\n axis\n ], useFinalPosition);\n return Math.abs(pos - value) < options.radius + options.hitRadius;\n}\nclass PointElement extends Element {\n static id = 'point';\n parsed;\n skip;\n stop;\n /**\n * @type {any}\n */ static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n };\n /**\n * @type {any}\n */ static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n constructor(cfg){\n super();\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n const options = this.options;\n const { x , y } = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n return Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2) < Math.pow(options.hitRadius + options.radius, 2);\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange$1(this, mouseX, 'x', useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange$1(this, mouseY, 'y', useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const { x , y } = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n return {\n x,\n y\n };\n }\n size(options) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n draw(ctx, area) {\n const options = this.options;\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n return;\n }\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, this.x, this.y);\n }\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n\nfunction getBarBounds(bar, useFinalPosition) {\n const { x , y , base , width , height } = bar.getProps([\n 'x',\n 'y',\n 'base',\n 'width',\n 'height'\n ], useFinalPosition);\n let left, right, top, bottom, half;\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n return {\n left,\n top,\n right,\n bottom\n };\n}\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\nfunction parseBorderRadius(bar, maxW, maxH) {\n const { enableBorderRadius } = bar.getProps([\n 'enableBorderRadius'\n ]);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n const enableBorder = enableBorderRadius || isObject(value);\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r))\n }\n }\n };\n}\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n return bounds && (skipX || _isBetween(x, bounds.left, bounds.right)) && (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n function addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\nclass BarElement extends Element {\n static id = 'bar';\n static defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: 'auto',\n pointStyle: undefined\n };\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n constructor(cfg){\n super();\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n draw(ctx) {\n const { inflateAmount , options: { borderColor , backgroundColor } } = this;\n const { inner , outer } = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n ctx.save();\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = borderColor;\n ctx.fill('evenodd');\n }\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const { x , y , base , horizontal } = this.getProps([\n 'x',\n 'y',\n 'base',\n 'horizontal'\n ], useFinalPosition);\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n\nvar elements = /*#__PURE__*/Object.freeze({\n__proto__: null,\nArcElement: ArcElement,\nBarElement: BarElement,\nLineElement: LineElement,\nPointElement: PointElement\n});\n\nconst BORDER_COLORS = [\n 'rgb(54, 162, 235)',\n 'rgb(255, 99, 132)',\n 'rgb(255, 159, 64)',\n 'rgb(255, 205, 86)',\n 'rgb(75, 192, 192)',\n 'rgb(153, 102, 255)',\n 'rgb(201, 203, 207)' // grey\n];\n// Border colors with 50% transparency\nconst BACKGROUND_COLORS = /* #__PURE__ */ BORDER_COLORS.map((color)=>color.replace('rgb(', 'rgba(').replace(')', ', 0.5)'));\nfunction getBorderColor(i) {\n return BORDER_COLORS[i % BORDER_COLORS.length];\n}\nfunction getBackgroundColor(i) {\n return BACKGROUND_COLORS[i % BACKGROUND_COLORS.length];\n}\nfunction colorizeDefaultDataset(dataset, i) {\n dataset.borderColor = getBorderColor(i);\n dataset.backgroundColor = getBackgroundColor(i);\n return ++i;\n}\nfunction colorizeDoughnutDataset(dataset, i) {\n dataset.backgroundColor = dataset.data.map(()=>getBorderColor(i++));\n return i;\n}\nfunction colorizePolarAreaDataset(dataset, i) {\n dataset.backgroundColor = dataset.data.map(()=>getBackgroundColor(i++));\n return i;\n}\nfunction getColorizer(chart) {\n let i = 0;\n return (dataset, datasetIndex)=>{\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n if (controller instanceof DoughnutController) {\n i = colorizeDoughnutDataset(dataset, i);\n } else if (controller instanceof PolarAreaController) {\n i = colorizePolarAreaDataset(dataset, i);\n } else if (controller) {\n i = colorizeDefaultDataset(dataset, i);\n }\n };\n}\nfunction containsColorsDefinitions(descriptors) {\n let k;\n for(k in descriptors){\n if (descriptors[k].borderColor || descriptors[k].backgroundColor) {\n return true;\n }\n }\n return false;\n}\nfunction containsColorsDefinition(descriptor) {\n return descriptor && (descriptor.borderColor || descriptor.backgroundColor);\n}\nfunction containsDefaultColorsDefenitions() {\n return defaults.borderColor !== 'rgba(0,0,0,0.1)' || defaults.backgroundColor !== 'rgba(0,0,0,0.1)';\n}\nvar plugin_colors = {\n id: 'colors',\n defaults: {\n enabled: true,\n forceOverride: false\n },\n beforeLayout (chart, _args, options) {\n if (!options.enabled) {\n return;\n }\n const { data: { datasets } , options: chartOptions } = chart.config;\n const { elements } = chartOptions;\n const containsColorDefenition = containsColorsDefinitions(datasets) || containsColorsDefinition(chartOptions) || elements && containsColorsDefinitions(elements) || containsDefaultColorsDefenitions();\n if (!options.forceOverride && containsColorDefenition) {\n return;\n }\n const colorizer = getColorizer(chart);\n datasets.forEach(colorizer);\n }\n};\n\nfunction lttbDecimation(data, start, count, availableWidth, options) {\n const samples = options.samples || availableWidth;\n if (samples >= count) {\n return data.slice(start, start + count);\n }\n const decimated = [];\n const bucketWidth = (count - 2) / (samples - 2);\n let sampledIndex = 0;\n const endIndex = start + count - 1;\n let a = start;\n let i, maxAreaPoint, maxArea, area, nextA;\n decimated[sampledIndex++] = data[a];\n for(i = 0; i < samples - 2; i++){\n let avgX = 0;\n let avgY = 0;\n let j;\n const avgRangeStart = Math.floor((i + 1) * bucketWidth) + 1 + start;\n const avgRangeEnd = Math.min(Math.floor((i + 2) * bucketWidth) + 1, count) + start;\n const avgRangeLength = avgRangeEnd - avgRangeStart;\n for(j = avgRangeStart; j < avgRangeEnd; j++){\n avgX += data[j].x;\n avgY += data[j].y;\n }\n avgX /= avgRangeLength;\n avgY /= avgRangeLength;\n const rangeOffs = Math.floor(i * bucketWidth) + 1 + start;\n const rangeTo = Math.min(Math.floor((i + 1) * bucketWidth) + 1, count) + start;\n const { x: pointAx , y: pointAy } = data[a];\n maxArea = area = -1;\n for(j = rangeOffs; j < rangeTo; j++){\n area = 0.5 * Math.abs((pointAx - avgX) * (data[j].y - pointAy) - (pointAx - data[j].x) * (avgY - pointAy));\n if (area > maxArea) {\n maxArea = area;\n maxAreaPoint = data[j];\n nextA = j;\n }\n }\n decimated[sampledIndex++] = maxAreaPoint;\n a = nextA;\n }\n decimated[sampledIndex++] = data[endIndex];\n return decimated;\n}\nfunction minMaxDecimation(data, start, count, availableWidth) {\n let avgX = 0;\n let countX = 0;\n let i, point, x, y, prevX, minIndex, maxIndex, startIndex, minY, maxY;\n const decimated = [];\n const endIndex = start + count - 1;\n const xMin = data[start].x;\n const xMax = data[endIndex].x;\n const dx = xMax - xMin;\n for(i = start; i < start + count; ++i){\n point = data[i];\n x = (point.x - xMin) / dx * availableWidth;\n y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n minIndex = i;\n } else if (y > maxY) {\n maxY = y;\n maxIndex = i;\n }\n avgX = (countX * avgX + point.x) / ++countX;\n } else {\n const lastIndex = i - 1;\n if (!isNullOrUndef(minIndex) && !isNullOrUndef(maxIndex)) {\n const intermediateIndex1 = Math.min(minIndex, maxIndex);\n const intermediateIndex2 = Math.max(minIndex, maxIndex);\n if (intermediateIndex1 !== startIndex && intermediateIndex1 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex1],\n x: avgX\n });\n }\n if (intermediateIndex2 !== startIndex && intermediateIndex2 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex2],\n x: avgX\n });\n }\n }\n if (i > 0 && lastIndex !== startIndex) {\n decimated.push(data[lastIndex]);\n }\n decimated.push(point);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n minIndex = maxIndex = startIndex = i;\n }\n }\n return decimated;\n}\nfunction cleanDecimatedDataset(dataset) {\n if (dataset._decimated) {\n const data = dataset._data;\n delete dataset._decimated;\n delete dataset._data;\n Object.defineProperty(dataset, 'data', {\n configurable: true,\n enumerable: true,\n writable: true,\n value: data\n });\n }\n}\nfunction cleanDecimatedData(chart) {\n chart.data.datasets.forEach((dataset)=>{\n cleanDecimatedDataset(dataset);\n });\n}\nfunction getStartAndCountOfVisiblePointsSimplified(meta, points) {\n const pointCount = points.length;\n let start = 0;\n let count;\n const { iScale } = meta;\n const { min , max , minDefined , maxDefined } = iScale.getUserBounds();\n if (minDefined) {\n start = _limitValue(_lookupByKey(points, iScale.axis, min).lo, 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(_lookupByKey(points, iScale.axis, max).hi + 1, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n return {\n start,\n count\n };\n}\nvar plugin_decimation = {\n id: 'decimation',\n defaults: {\n algorithm: 'min-max',\n enabled: false\n },\n beforeElementsUpdate: (chart, args, options)=>{\n if (!options.enabled) {\n cleanDecimatedData(chart);\n return;\n }\n const availableWidth = chart.width;\n chart.data.datasets.forEach((dataset, datasetIndex)=>{\n const { _data , indexAxis } = dataset;\n const meta = chart.getDatasetMeta(datasetIndex);\n const data = _data || dataset.data;\n if (resolve([\n indexAxis,\n chart.options.indexAxis\n ]) === 'y') {\n return;\n }\n if (!meta.controller.supportsDecimation) {\n return;\n }\n const xAxis = chart.scales[meta.xAxisID];\n if (xAxis.type !== 'linear' && xAxis.type !== 'time') {\n return;\n }\n if (chart.options.parsing) {\n return;\n }\n let { start , count } = getStartAndCountOfVisiblePointsSimplified(meta, data);\n const threshold = options.threshold || 4 * availableWidth;\n if (count <= threshold) {\n cleanDecimatedDataset(dataset);\n return;\n }\n if (isNullOrUndef(_data)) {\n dataset._data = data;\n delete dataset.data;\n Object.defineProperty(dataset, 'data', {\n configurable: true,\n enumerable: true,\n get: function() {\n return this._decimated;\n },\n set: function(d) {\n this._data = d;\n }\n });\n }\n let decimated;\n switch(options.algorithm){\n case 'lttb':\n decimated = lttbDecimation(data, start, count, availableWidth, options);\n break;\n case 'min-max':\n decimated = minMaxDecimation(data, start, count, availableWidth);\n break;\n default:\n throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`);\n }\n dataset._decimated = decimated;\n });\n },\n destroy (chart) {\n cleanDecimatedData(chart);\n }\n};\n\nfunction _segments(line, target, property) {\n const segments = line.segments;\n const points = line.points;\n const tpoints = target.points;\n const parts = [];\n for (const segment of segments){\n let { start , end } = segment;\n end = _findSegmentEnd(start, end, points);\n const bounds = _getBounds(property, points[start], points[end], segment.loop);\n if (!target.segments) {\n parts.push({\n source: segment,\n target: bounds,\n start: points[start],\n end: points[end]\n });\n continue;\n }\n const targetSegments = _boundSegments(target, bounds);\n for (const tgt of targetSegments){\n const subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n const fillSources = _boundSegment(segment, points, subBounds);\n for (const fillSource of fillSources){\n parts.push({\n source: fillSource,\n target: tgt,\n start: {\n [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n },\n end: {\n [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n }\n });\n }\n }\n }\n return parts;\n}\nfunction _getBounds(property, first, last, loop) {\n if (loop) {\n return;\n }\n let start = first[property];\n let end = last[property];\n if (property === 'angle') {\n start = _normalizeAngle(start);\n end = _normalizeAngle(end);\n }\n return {\n property,\n start,\n end\n };\n}\nfunction _pointsFromSegments(boundary, line) {\n const { x =null , y =null } = boundary || {};\n const linePoints = line.points;\n const points = [];\n line.segments.forEach(({ start , end })=>{\n end = _findSegmentEnd(start, end, linePoints);\n const first = linePoints[start];\n const last = linePoints[end];\n if (y !== null) {\n points.push({\n x: first.x,\n y\n });\n points.push({\n x: last.x,\n y\n });\n } else if (x !== null) {\n points.push({\n x,\n y: first.y\n });\n points.push({\n x,\n y: last.y\n });\n }\n });\n return points;\n}\nfunction _findSegmentEnd(start, end, points) {\n for(; end > start; end--){\n const point = points[end];\n if (!isNaN(point.x) && !isNaN(point.y)) {\n break;\n }\n }\n return end;\n}\nfunction _getEdge(a, b, prop, fn) {\n if (a && b) {\n return fn(a[prop], b[prop]);\n }\n return a ? a[prop] : b ? b[prop] : 0;\n}\n\nfunction _createBoundaryLine(boundary, line) {\n let points = [];\n let _loop = false;\n if (isArray(boundary)) {\n _loop = true;\n points = boundary;\n } else {\n points = _pointsFromSegments(boundary, line);\n }\n return points.length ? new LineElement({\n points,\n options: {\n tension: 0\n },\n _loop,\n _fullLoop: _loop\n }) : null;\n}\nfunction _shouldApplyFill(source) {\n return source && source.fill !== false;\n}\n\nfunction _resolveTarget(sources, index, propagate) {\n const source = sources[index];\n let fill = source.fill;\n const visited = [\n index\n ];\n let target;\n if (!propagate) {\n return fill;\n }\n while(fill !== false && visited.indexOf(fill) === -1){\n if (!isNumberFinite(fill)) {\n return fill;\n }\n target = sources[fill];\n if (!target) {\n return false;\n }\n if (target.visible) {\n return fill;\n }\n visited.push(fill);\n fill = target.fill;\n }\n return false;\n}\n function _decodeFill(line, index, count) {\n const fill = parseFillOption(line);\n if (isObject(fill)) {\n return isNaN(fill.value) ? false : fill;\n }\n let target = parseFloat(fill);\n if (isNumberFinite(target) && Math.floor(target) === target) {\n return decodeTargetIndex(fill[0], index, target, count);\n }\n return [\n 'origin',\n 'start',\n 'end',\n 'stack',\n 'shape'\n ].indexOf(fill) >= 0 && fill;\n}\nfunction decodeTargetIndex(firstCh, index, target, count) {\n if (firstCh === '-' || firstCh === '+') {\n target = index + target;\n }\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n return target;\n}\n function _getTargetPixel(fill, scale) {\n let pixel = null;\n if (fill === 'start') {\n pixel = scale.bottom;\n } else if (fill === 'end') {\n pixel = scale.top;\n } else if (isObject(fill)) {\n pixel = scale.getPixelForValue(fill.value);\n } else if (scale.getBasePixel) {\n pixel = scale.getBasePixel();\n }\n return pixel;\n}\n function _getTargetValue(fill, scale, startValue) {\n let value;\n if (fill === 'start') {\n value = startValue;\n } else if (fill === 'end') {\n value = scale.options.reverse ? scale.min : scale.max;\n } else if (isObject(fill)) {\n value = fill.value;\n } else {\n value = scale.getBaseValue();\n }\n return value;\n}\n function parseFillOption(line) {\n const options = line.options;\n const fillOption = options.fill;\n let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n if (fill === undefined) {\n fill = !!options.backgroundColor;\n }\n if (fill === false || fill === null) {\n return false;\n }\n if (fill === true) {\n return 'origin';\n }\n return fill;\n}\n\nfunction _buildStackLine(source) {\n const { scale , index , line } = source;\n const points = [];\n const segments = line.segments;\n const sourcePoints = line.points;\n const linesBelow = getLinesBelow(scale, index);\n linesBelow.push(_createBoundaryLine({\n x: null,\n y: scale.bottom\n }, line));\n for(let i = 0; i < segments.length; i++){\n const segment = segments[i];\n for(let j = segment.start; j <= segment.end; j++){\n addPointsBelow(points, sourcePoints[j], linesBelow);\n }\n }\n return new LineElement({\n points,\n options: {}\n });\n}\n function getLinesBelow(scale, index) {\n const below = [];\n const metas = scale.getMatchingVisibleMetas('line');\n for(let i = 0; i < metas.length; i++){\n const meta = metas[i];\n if (meta.index === index) {\n break;\n }\n if (!meta.hidden) {\n below.unshift(meta.dataset);\n }\n }\n return below;\n}\n function addPointsBelow(points, sourcePoint, linesBelow) {\n const postponed = [];\n for(let j = 0; j < linesBelow.length; j++){\n const line = linesBelow[j];\n const { first , last , point } = findPoint(line, sourcePoint, 'x');\n if (!point || first && last) {\n continue;\n }\n if (first) {\n postponed.unshift(point);\n } else {\n points.push(point);\n if (!last) {\n break;\n }\n }\n }\n points.push(...postponed);\n}\n function findPoint(line, sourcePoint, property) {\n const point = line.interpolate(sourcePoint, property);\n if (!point) {\n return {};\n }\n const pointValue = point[property];\n const segments = line.segments;\n const linePoints = line.points;\n let first = false;\n let last = false;\n for(let i = 0; i < segments.length; i++){\n const segment = segments[i];\n const firstValue = linePoints[segment.start][property];\n const lastValue = linePoints[segment.end][property];\n if (_isBetween(pointValue, firstValue, lastValue)) {\n first = pointValue === firstValue;\n last = pointValue === lastValue;\n break;\n }\n }\n return {\n first,\n last,\n point\n };\n}\n\nclass simpleArc {\n constructor(opts){\n this.x = opts.x;\n this.y = opts.y;\n this.radius = opts.radius;\n }\n pathSegment(ctx, bounds, opts) {\n const { x , y , radius } = this;\n bounds = bounds || {\n start: 0,\n end: TAU\n };\n ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n return !opts.bounds;\n }\n interpolate(point) {\n const { x , y , radius } = this;\n const angle = point.angle;\n return {\n x: x + Math.cos(angle) * radius,\n y: y + Math.sin(angle) * radius,\n angle\n };\n }\n}\n\nfunction _getTarget(source) {\n const { chart , fill , line } = source;\n if (isNumberFinite(fill)) {\n return getLineByIndex(chart, fill);\n }\n if (fill === 'stack') {\n return _buildStackLine(source);\n }\n if (fill === 'shape') {\n return true;\n }\n const boundary = computeBoundary(source);\n if (boundary instanceof simpleArc) {\n return boundary;\n }\n return _createBoundaryLine(boundary, line);\n}\n function getLineByIndex(chart, index) {\n const meta = chart.getDatasetMeta(index);\n const visible = meta && chart.isDatasetVisible(index);\n return visible ? meta.dataset : null;\n}\nfunction computeBoundary(source) {\n const scale = source.scale || {};\n if (scale.getPointPositionForValue) {\n return computeCircularBoundary(source);\n }\n return computeLinearBoundary(source);\n}\nfunction computeLinearBoundary(source) {\n const { scale ={} , fill } = source;\n const pixel = _getTargetPixel(fill, scale);\n if (isNumberFinite(pixel)) {\n const horizontal = scale.isHorizontal();\n return {\n x: horizontal ? pixel : null,\n y: horizontal ? null : pixel\n };\n }\n return null;\n}\nfunction computeCircularBoundary(source) {\n const { scale , fill } = source;\n const options = scale.options;\n const length = scale.getLabels().length;\n const start = options.reverse ? scale.max : scale.min;\n const value = _getTargetValue(fill, scale, start);\n const target = [];\n if (options.grid.circular) {\n const center = scale.getPointPositionForValue(0, start);\n return new simpleArc({\n x: center.x,\n y: center.y,\n radius: scale.getDistanceFromCenterForValue(value)\n });\n }\n for(let i = 0; i < length; ++i){\n target.push(scale.getPointPositionForValue(i, value));\n }\n return target;\n}\n\nfunction _drawfill(ctx, source, area) {\n const target = _getTarget(source);\n const { line , scale , axis } = source;\n const lineOpts = line.options;\n const fillOption = lineOpts.fill;\n const color = lineOpts.backgroundColor;\n const { above =color , below =color } = fillOption || {};\n if (target && line.points.length) {\n clipArea(ctx, area);\n doFill(ctx, {\n line,\n target,\n above,\n below,\n area,\n scale,\n axis\n });\n unclipArea(ctx);\n }\n}\nfunction doFill(ctx, cfg) {\n const { line , target , above , below , area , scale } = cfg;\n const property = line._loop ? 'angle' : cfg.axis;\n ctx.save();\n if (property === 'x' && below !== above) {\n clipVertical(ctx, target, area.top);\n fill(ctx, {\n line,\n target,\n color: above,\n scale,\n property\n });\n ctx.restore();\n ctx.save();\n clipVertical(ctx, target, area.bottom);\n }\n fill(ctx, {\n line,\n target,\n color: below,\n scale,\n property\n });\n ctx.restore();\n}\nfunction clipVertical(ctx, target, clipY) {\n const { segments , points } = target;\n let first = true;\n let lineLoop = false;\n ctx.beginPath();\n for (const segment of segments){\n const { start , end } = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(firstPoint.x, clipY);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {\n move: lineLoop\n });\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(lastPoint.x, clipY);\n }\n }\n ctx.lineTo(target.first().x, clipY);\n ctx.closePath();\n ctx.clip();\n}\nfunction fill(ctx, cfg) {\n const { line , target , property , color , scale } = cfg;\n const segments = _segments(line, target, property);\n for (const { source: src , target: tgt , start , end } of segments){\n const { style: { backgroundColor =color } = {} } = src;\n const notShape = target !== true;\n ctx.save();\n ctx.fillStyle = backgroundColor;\n clipBounds(ctx, scale, notShape && _getBounds(property, start, end));\n ctx.beginPath();\n const lineLoop = !!line.pathSegment(ctx, src);\n let loop;\n if (notShape) {\n if (lineLoop) {\n ctx.closePath();\n } else {\n interpolatedLineTo(ctx, target, end, property);\n }\n const targetLoop = !!target.pathSegment(ctx, tgt, {\n move: lineLoop,\n reverse: true\n });\n loop = lineLoop && targetLoop;\n if (!loop) {\n interpolatedLineTo(ctx, target, start, property);\n }\n }\n ctx.closePath();\n ctx.fill(loop ? 'evenodd' : 'nonzero');\n ctx.restore();\n }\n}\nfunction clipBounds(ctx, scale, bounds) {\n const { top , bottom } = scale.chart.chartArea;\n const { property , start , end } = bounds || {};\n if (property === 'x') {\n ctx.beginPath();\n ctx.rect(start, top, end - start, bottom - top);\n ctx.clip();\n }\n}\nfunction interpolatedLineTo(ctx, target, point, property) {\n const interpolatedPoint = target.interpolate(point, property);\n if (interpolatedPoint) {\n ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n }\n}\n\nvar index = {\n id: 'filler',\n afterDatasetsUpdate (chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n for(i = 0; i < count; ++i){\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n if (line && line.options && line instanceof LineElement) {\n source = {\n visible: chart.isDatasetVisible(i),\n index: i,\n fill: _decodeFill(line, i, count),\n chart,\n axis: meta.controller.options.indexAxis,\n scale: meta.vScale,\n line\n };\n }\n meta.$filler = source;\n sources.push(source);\n }\n for(i = 0; i < count; ++i){\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n source.fill = _resolveTarget(sources, i, options.propagate);\n }\n },\n beforeDraw (chart, _args, options) {\n const draw = options.drawTime === 'beforeDraw';\n const metasets = chart.getSortedVisibleDatasetMetas();\n const area = chart.chartArea;\n for(let i = metasets.length - 1; i >= 0; --i){\n const source = metasets[i].$filler;\n if (!source) {\n continue;\n }\n source.line.updateControlPoints(area, source.axis);\n if (draw && source.fill) {\n _drawfill(chart.ctx, source, area);\n }\n }\n },\n beforeDatasetsDraw (chart, _args, options) {\n if (options.drawTime !== 'beforeDatasetsDraw') {\n return;\n }\n const metasets = chart.getSortedVisibleDatasetMetas();\n for(let i = metasets.length - 1; i >= 0; --i){\n const source = metasets[i].$filler;\n if (_shouldApplyFill(source)) {\n _drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n beforeDatasetDraw (chart, args, options) {\n const source = args.meta.$filler;\n if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {\n return;\n }\n _drawfill(chart.ctx, source, chart.chartArea);\n },\n defaults: {\n propagate: true,\n drawTime: 'beforeDatasetDraw'\n }\n};\n\nconst getBoxSize = (labelOpts, fontSize)=>{\n let { boxHeight =fontSize , boxWidth =fontSize } = labelOpts;\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n }\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\nconst itemsEqual = (a, b)=>a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\nclass Legend extends Element {\n constructor(config){\n super();\n this._added = false;\n this.legendHitBoxes = [];\n this._hoveredItem = null;\n this.doughnutMode = false;\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight, margins) {\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = callback(labelOpts.generateLabels, [\n this.chart\n ], this) || [];\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item)=>labelOpts.filter(item, this.chart.data));\n }\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b)=>labelOpts.sort(a, b, this.chart.data));\n }\n if (this.options.reverse) {\n legendItems.reverse();\n }\n this.legendItems = legendItems;\n }\n fit() {\n const { options , ctx } = this;\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const { boxWidth , itemHeight } = getBoxSize(labelOpts, fontSize);\n let width, height;\n ctx.font = labelFont.string;\n if (this.isHorizontal()) {\n width = this.maxWidth;\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight;\n width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n }\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const { ctx , maxWidth , options: { labels: { padding } } } = this;\n const hitboxes = this.legendHitBoxes = [];\n const lineWidths = this.lineWidths = [\n 0\n ];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n let row = -1;\n let top = -lineHeight;\n this.legendItems.forEach((legendItem, i)=>{\n const itemWidth = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width;\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n hitboxes[i] = {\n left: 0,\n top,\n row,\n width: itemWidth,\n height: itemHeight\n };\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n return totalHeight;\n }\n _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n const { ctx , maxHeight , options: { labels: { padding } } } = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n let left = 0;\n let col = 0;\n this.legendItems.forEach((legendItem, i)=>{\n const { itemWidth , itemHeight } = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({\n width: currentColWidth,\n height: currentColHeight\n });\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n hitboxes[i] = {\n left,\n top: currentColHeight,\n col,\n width: itemWidth,\n height: itemHeight\n };\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n totalWidth += currentColWidth;\n columnSizes.push({\n width: currentColWidth,\n height: currentColHeight\n });\n return totalWidth;\n }\n adjustHitBoxes() {\n if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const { legendHitBoxes: hitboxes , options: { align , labels: { padding } , rtl } } = this;\n const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes){\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes){\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n draw() {\n if (this.options.display) {\n const ctx = this.ctx;\n clipArea(ctx, this);\n this._draw();\n unclipArea(ctx);\n }\n }\n _draw() {\n const { options: opts , columnSizes , lineWidths , ctx } = this;\n const { align , labels: labelOpts } = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const labelFont = toFont(labelOpts.font);\n const { padding } = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n this.drawTitle();\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n const { boxWidth , boxHeight , itemHeight } = getBoxSize(labelOpts, fontSize);\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n ctx.save();\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n if (labelOpts.usePointStyle) {\n const drawOptions = {\n radius: boxHeight * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n } else {\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n ctx.beginPath();\n if (Object.values(borderRadius).some((v)=>v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n ctx.restore();\n };\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + itemHeight / 2, labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n const isHorizontal = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n overrideTextDirection(this.ctx, opts.textDirection);\n const lineHeight = itemHeight + padding;\n this.legendItems.forEach((legendItem, i)=>{\n ctx.strokeStyle = legendItem.fontColor;\n ctx.fillStyle = legendItem.fontColor;\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n rtlHelper.setWidth(this.width);\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n }\n const realX = rtlHelper.x(x);\n drawLegendBox(realX, y, legendItem);\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n fillText(rtlHelper.x(x), y, legendItem);\n if (isHorizontal) {\n cursor.x += width + padding;\n } else if (typeof legendItem.text !== 'string') {\n const fontLineHeight = labelFont.lineHeight;\n cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n restoreTextDirection(this.ctx, opts.textDirection);\n }\n drawTitle() {\n const opts = this.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n if (!titleOpts.display) {\n return;\n }\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n let left = this.left;\n let maxWidth = this.width;\n if (this.isHorizontal()) {\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n } else {\n const maxHeight = this.columnSizes.reduce((acc, size)=>Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n }\n const x = _alignStartEnd(position, left, left + maxWidth);\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n _getLegendItemAt(x, y) {\n let i, hitBox, lh;\n if (_isBetween(x, this.left, this.right) && _isBetween(y, this.top, this.bottom)) {\n lh = this.legendHitBoxes;\n for(i = 0; i < lh.length; ++i){\n hitBox = lh[i];\n if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width) && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n return this.legendItems[i];\n }\n }\n }\n return null;\n }\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n if (e.type === 'mousemove' || e.type === 'mouseout') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n callback(opts.onLeave, [\n e,\n previous,\n this\n ], this);\n }\n this._hoveredItem = hoveredItem;\n if (hoveredItem && !sameItem) {\n callback(opts.onHover, [\n e,\n hoveredItem,\n this\n ], this);\n }\n } else if (hoveredItem) {\n callback(opts.onClick, [\n e,\n hoveredItem,\n this\n ], this);\n }\n }\n}\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n return {\n itemWidth,\n itemHeight\n };\n}\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n let legendItemText = legendItem.text;\n if (legendItemText && typeof legendItemText !== 'string') {\n legendItemText = legendItemText.reduce((a, b)=>a.length > b.length ? a : b);\n }\n return boxWidth + labelFont.size / 2 + ctx.measureText(legendItemText).width;\n}\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n let itemHeight = _itemHeight;\n if (typeof legendItem.text !== 'string') {\n itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n }\n return itemHeight;\n}\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n const labelHeight = legendItem.text ? legendItem.text.length : 0;\n return fontLineHeight * labelHeight;\n}\nfunction isListened(type, opts) {\n if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\nvar plugin_legend = {\n id: 'legend',\n _element: Legend,\n start (chart, _args, options) {\n const legend = chart.legend = new Legend({\n ctx: chart.ctx,\n options,\n chart\n });\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n stop (chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n beforeUpdate (chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n afterUpdate (chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n afterEvent (chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n onClick (e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n onHover: null,\n onLeave: null,\n labels: {\n color: (ctx)=>ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n generateLabels (chart) {\n const datasets = chart.data.datasets;\n const { labels: { usePointStyle , pointStyle , textAlign , color , useBorderRadius , borderRadius } } = chart.legend.options;\n return chart._getSortedDatasetMetas().map((meta)=>{\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n title: {\n color: (ctx)=>ctx.chart.options.color,\n display: false,\n position: 'center',\n text: ''\n }\n },\n descriptors: {\n _scriptable: (name)=>!name.startsWith('on'),\n labels: {\n _scriptable: (name)=>![\n 'generateLabels',\n 'filter',\n 'sort'\n ].includes(name)\n }\n }\n};\n\nclass Title extends Element {\n constructor(config){\n super();\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this._padding = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight) {\n const opts = this.options;\n this.left = 0;\n this.top = 0;\n if (!opts.display) {\n this.width = this.height = this.right = this.bottom = 0;\n return;\n }\n this.width = this.right = maxWidth;\n this.height = this.bottom = maxHeight;\n const lineCount = isArray(opts.text) ? opts.text.length : 1;\n this._padding = toPadding(opts.padding);\n const textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height;\n if (this.isHorizontal()) {\n this.height = textSize;\n } else {\n this.width = textSize;\n }\n }\n isHorizontal() {\n const pos = this.options.position;\n return pos === 'top' || pos === 'bottom';\n }\n _drawArgs(offset) {\n const { top , left , bottom , right , options } = this;\n const align = options.align;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n if (this.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n titleY = top + offset;\n maxWidth = right - left;\n } else {\n if (options.position === 'left') {\n titleX = left + offset;\n titleY = _alignStartEnd(align, bottom, top);\n rotation = PI * -0.5;\n } else {\n titleX = right - offset;\n titleY = _alignStartEnd(align, top, bottom);\n rotation = PI * 0.5;\n }\n maxWidth = bottom - top;\n }\n return {\n titleX,\n titleY,\n maxWidth,\n rotation\n };\n }\n draw() {\n const ctx = this.ctx;\n const opts = this.options;\n if (!opts.display) {\n return;\n }\n const fontOpts = toFont(opts.font);\n const lineHeight = fontOpts.lineHeight;\n const offset = lineHeight / 2 + this._padding.top;\n const { titleX , titleY , maxWidth , rotation } = this._drawArgs(offset);\n renderText(ctx, opts.text, 0, 0, fontOpts, {\n color: opts.color,\n maxWidth,\n rotation,\n textAlign: _toLeftRightCenter(opts.align),\n textBaseline: 'middle',\n translation: [\n titleX,\n titleY\n ]\n });\n }\n}\nfunction createTitle(chart, titleOpts) {\n const title = new Title({\n ctx: chart.ctx,\n options: titleOpts,\n chart\n });\n layouts.configure(chart, title, titleOpts);\n layouts.addBox(chart, title);\n chart.titleBlock = title;\n}\nvar plugin_title = {\n id: 'title',\n _element: Title,\n start (chart, _args, options) {\n createTitle(chart, options);\n },\n stop (chart) {\n const titleBlock = chart.titleBlock;\n layouts.removeBox(chart, titleBlock);\n delete chart.titleBlock;\n },\n beforeUpdate (chart, _args, options) {\n const title = chart.titleBlock;\n layouts.configure(chart, title, options);\n title.options = options;\n },\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'bold'\n },\n fullSize: true,\n padding: 10,\n position: 'top',\n text: '',\n weight: 2000\n },\n defaultRoutes: {\n color: 'color'\n },\n descriptors: {\n _scriptable: true,\n _indexable: false\n }\n};\n\nconst map = new WeakMap();\nvar plugin_subtitle = {\n id: 'subtitle',\n start (chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n stop (chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n beforeUpdate (chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal'\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500\n },\n defaultRoutes: {\n color: 'color'\n },\n descriptors: {\n _scriptable: true,\n _indexable: false\n }\n};\n\nconst positioners = {\n average (items) {\n if (!items.length) {\n return false;\n }\n let i, len;\n let xSet = new Set();\n let y = 0;\n let count = 0;\n for(i = 0, len = items.length; i < len; ++i){\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n xSet.add(pos.x);\n y += pos.y;\n ++count;\n }\n }\n if (count === 0 || xSet.size === 0) {\n return false;\n }\n const xAverage = [\n ...xSet\n ].reduce((a, b)=>a + b) / xSet.size;\n return {\n x: xAverage,\n y: y / count\n };\n },\n nearest (items, eventPosition) {\n if (!items.length) {\n return false;\n }\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n for(i = 0, len = items.length; i < len; ++i){\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n return {\n x,\n y\n };\n }\n};\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n return base;\n}\n function splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\n function createTooltipItem(chart, item) {\n const { element , datasetIndex , index } = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const { label , value } = controller.getLabelAndValue(index);\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\n function getTooltipSize(tooltip, options) {\n const ctx = tooltip.chart.ctx;\n const { body , footer , title } = tooltip;\n const { boxWidth , boxHeight } = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n let combinedBodyLength = body.reduce((count, bodyItem)=>count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight + (titleLineCount - 1) * options.titleSpacing + options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight + (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight + (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop + footerLineCount * footerFont.lineHeight + (footerLineCount - 1) * options.footerSpacing;\n }\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n ctx.save();\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n widthPadding = options.displayColors ? boxWidth + 2 + options.boxPadding : 0;\n each(body, (bodyItem)=>{\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n widthPadding = 0;\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n ctx.restore();\n width += padding.width;\n return {\n width,\n height\n };\n}\nfunction determineYAlign(chart, size) {\n const { y , height } = size;\n if (y < height / 2) {\n return 'top';\n } else if (y > chart.height - height / 2) {\n return 'bottom';\n }\n return 'center';\n}\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const { x , width } = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\nfunction determineXAlign(chart, options, size, yAlign) {\n const { x , width } = size;\n const { width: chartWidth , chartArea: { left , right } } = chart;\n let xAlign = 'center';\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n return xAlign;\n}\n function determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\nfunction alignX(size, xAlign) {\n let { x , width } = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= width / 2;\n }\n return x;\n}\nfunction alignY(size, yAlign, paddingAndSize) {\n let { y , height } = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= height / 2;\n }\n return y;\n}\n function getBackgroundPoint(options, size, alignment, chart) {\n const { caretSize , caretPadding , cornerRadius } = options;\n const { xAlign , yAlign } = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const { topLeft , topRight , bottomLeft , bottomRight } = toTRBLCorners(cornerRadius);\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n return align === 'center' ? tooltip.x + tooltip.width / 2 : align === 'right' ? tooltip.x + tooltip.width - padding.right : tooltip.x + padding.left;\n}\n function getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return createContext(parent, {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\nconst defaultCallbacks = {\n beforeTitle: noop,\n title (tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n return '';\n },\n afterTitle: noop,\n beforeBody: noop,\n beforeLabel: noop,\n label (tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n let label = tooltipItem.dataset.label || '';\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor (tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0\n };\n },\n labelTextColor () {\n return this.options.bodyColor;\n },\n labelPointStyle (tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation\n };\n },\n afterLabel: noop,\n afterBody: noop,\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n};\n function invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n if (typeof result === 'undefined') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n return result;\n}\nclass Tooltip extends Element {\n static positioners = positioners;\n constructor(config){\n super();\n this.opacity = 0;\n this._active = [];\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.chart = config.chart;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n if (cached) {\n return cached;\n }\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n return animations;\n }\n getContext() {\n return this.$context || (this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n getTitle(context, options) {\n const { callbacks } = options;\n const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n return lines;\n }\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems));\n }\n getBody(tooltipItems, options) {\n const { callbacks } = options;\n const bodyItems = [];\n each(tooltipItems, (context)=>{\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n bodyItems.push(bodyItem);\n });\n return bodyItems;\n }\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems));\n }\n getFooter(tooltipItems, options) {\n const { callbacks } = options;\n const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n return lines;\n }\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n for(i = 0, len = active.length; i < len; ++i){\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array)=>options.filter(element, index, array, data));\n }\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b)=>options.itemSort(a, b, data));\n }\n each(tooltipItems, (context)=>{\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n });\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n if (changed && options.external) {\n options.external.call(this, {\n chart: this.chart,\n tooltip: this,\n replay\n });\n }\n }\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n getCaretPosition(tooltipPoint, size, options) {\n const { xAlign , yAlign } = this;\n const { caretSize , cornerRadius } = options;\n const { topLeft , topRight , bottomLeft , bottomRight } = toTRBLCorners(cornerRadius);\n const { x: ptX , y: ptY } = tooltipPoint;\n const { width , height } = size;\n let x1, x2, x3, y1, y2, y3;\n if (yAlign === 'center') {\n y2 = ptY + height / 2;\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {\n x1,\n x2,\n x3,\n y1,\n y2,\n y3\n };\n }\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n pt.x = getAlignedX(this, options.titleAlign, options);\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n for(i = 0; i < length; ++i){\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing;\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing;\n }\n }\n }\n }\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColor = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const { boxHeight , boxWidth } = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2,\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n ctx.strokeStyle = labelColor.borderColor;\n ctx.fillStyle = labelColor.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : labelColor.borderWidth || 1;\n ctx.strokeStyle = labelColor.borderColor;\n ctx.setLineDash(labelColor.borderDash || []);\n ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColor.borderRadius);\n if (Object.values(borderRadius).some((v)=>v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius\n });\n ctx.fill();\n ctx.stroke();\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius\n });\n ctx.fill();\n } else {\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n ctx.fillStyle = this.labelTextColors[i];\n }\n drawBody(pt, ctx, options) {\n const { body } = this;\n const { bodySpacing , bodyAlign , displayColors , boxHeight , boxWidth , boxPadding } = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n ctx.fillStyle = options.bodyColor;\n each(this.beforeBody, fillLineOfText);\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right' ? bodyAlign === 'center' ? boxWidth / 2 + boxPadding : boxWidth + 2 + boxPadding : 0;\n for(i = 0, ilen = body.length; i < ilen; ++i){\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n lines = bodyItem.lines;\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n for(j = 0, jlen = lines.length; j < jlen; ++j){\n fillLineOfText(lines[j]);\n bodyLineHeight = bodyFont.lineHeight;\n }\n each(bodyItem.after, fillLineOfText);\n }\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n each(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing;\n }\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n footerFont = toFont(options.footerFont);\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n for(i = 0; i < length; ++i){\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n drawBackground(pt, ctx, tooltipSize, options) {\n const { xAlign , yAlign } = this;\n const { x , y } = pt;\n const { width , height } = tooltipSize;\n const { topLeft , topRight , bottomLeft , bottomRight } = toTRBLCorners(options.cornerRadius);\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n _willRender() {\n return !!this.opacity;\n }\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n if (!opacity) {\n return;\n }\n this._updateAnimationTarget(options);\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n const padding = toPadding(options.padding);\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n this.drawBackground(pt, ctx, tooltipSize, options);\n overrideTextDirection(ctx, options.textDirection);\n pt.y += padding.top;\n this.drawTitle(pt, ctx, options);\n this.drawBody(pt, ctx, options);\n this.drawFooter(pt, ctx, options);\n restoreTextDirection(ctx, options.textDirection);\n ctx.restore();\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({ datasetIndex , index })=>{\n const meta = this.chart.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n const positionChanged = this._positionChanged(active, e);\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n if (changed) {\n this._active = active;\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n this.update(true, replay);\n }\n }\n return changed;\n }\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n if (e.type === 'mouseout') {\n return [];\n }\n if (!inChartArea) {\n return lastActive.filter((i)=>this.chart.data.datasets[i.datasetIndex] && this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== undefined);\n }\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n if (options.reverse) {\n active.reverse();\n }\n return active;\n }\n _positionChanged(active, e) {\n const { caretX , caretY , options } = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\nvar plugin_tooltip = {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n afterInit (chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({\n chart,\n options\n });\n }\n },\n beforeUpdate (chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n reset (chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n afterDraw (chart) {\n const tooltip = chart.tooltip;\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n if (chart.notifyPlugins('beforeTooltipDraw', {\n ...args,\n cancelable: true\n }) === false) {\n return;\n }\n tooltip.draw(chart.ctx);\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n afterEvent (chart, args) {\n if (chart.tooltip) {\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n args.changed = true;\n }\n }\n },\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold'\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {},\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold'\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts)=>opts.bodyFont.size,\n boxWidth: (ctx, opts)=>opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n boxPadding: 0,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart'\n },\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'width',\n 'height',\n 'caretX',\n 'caretY'\n ]\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: defaultCallbacks\n },\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n descriptors: {\n _scriptable: (name)=>name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n additionalOptionScopes: [\n 'interaction'\n ]\n};\n\nvar plugins = /*#__PURE__*/Object.freeze({\n__proto__: null,\nColors: plugin_colors,\nDecimation: plugin_decimation,\nFiller: index,\nLegend: plugin_legend,\nSubTitle: plugin_subtitle,\nTitle: plugin_title,\nTooltip: plugin_tooltip\n});\n\nconst addIfString = (labels, raw, index, addedLabels)=>{\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({\n index,\n label: raw\n });\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\nconst validIndex = (index, max)=>index === null ? null : _limitValue(Math.round(index), 0, max);\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\nclass CategoryScale extends Scale {\n static id = 'category';\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n constructor(cfg){\n super(cfg);\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const { index , label } of added){\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n determineDataLimits() {\n const { minDefined , maxDefined } = this.getUserBounds();\n let { min , max } = this.getMinMax(true);\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n this.min = min;\n this.max = max;\n }\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n labels = min === 0 && max === labels.length - 1 ? labels : labels.slice(min, max + 1);\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n for(let value = min; value <= max; value++){\n ticks.push({\n value\n });\n }\n return ticks;\n }\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n configure() {\n super.configure();\n if (!this.isHorizontal()) {\n this._reversePixels = !this._reversePixels;\n }\n }\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n getBasePixel() {\n return this.bottom;\n }\n}\n\nfunction generateTicks$1(generationOptions, dataRange) {\n const ticks = [];\n const MIN_SPACING = 1e-14;\n const { bounds , step , min , max , precision , count , maxTicks , maxDigits , includeBounds } = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const { min: rmin , max: rmax } = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [\n {\n value: rmin\n },\n {\n value: rmax\n }\n ];\n }\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n if (!isNullOrUndef(precision)) {\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n numSpaces = (niceMax - niceMin) / spacing;\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n const decimalPlaces = Math.max(_decimalPlaces(spacing), _decimalPlaces(niceMin));\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({\n value: min\n });\n if (niceMin < min) {\n j++;\n }\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n for(; j < numSpaces; ++j){\n const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n if (maxDefined && tickValue > max) {\n break;\n }\n ticks.push({\n value: tickValue\n });\n }\n if (maxDefined && includeBounds && niceMax !== max) {\n if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({\n value: max\n });\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({\n value: niceMax\n });\n }\n return ticks;\n}\nfunction relativeLabelSize(value, minSpacing, { horizontal , minRotation }) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\nclass LinearScaleBase extends Scale {\n constructor(cfg){\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._endValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n return +raw;\n }\n handleTickRangeOptions() {\n const { beginAtZero } = this.options;\n const { minDefined , maxDefined } = this.getUserBounds();\n let { min , max } = this;\n const setMin = (v)=>min = minDefined ? min : v;\n const setMax = (v)=>max = maxDefined ? max : v;\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n setMax(max + offset);\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n getTickLimit() {\n const tickOpts = this.options.ticks;\n let { maxTicksLimit , stepSize } = tickOpts;\n let maxTicks;\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n return maxTicks;\n }\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks$1(numericGeneratorOptions, dataRange);\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n return ticks;\n }\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n super.configure();\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n\nclass LinearScale extends LinearScaleBase {\n static id = 'linear';\n static defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n };\n determineDataLimits() {\n const { min , max } = this.getMinMax(true);\n this.min = isNumberFinite(min) ? min : 0;\n this.max = isNumberFinite(max) ? max : 1;\n this.handleTickRangeOptions();\n }\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n\nconst log10Floor = (v)=>Math.floor(log10(v));\nconst changeExponent = (v, m)=>Math.pow(10, log10Floor(v) + m);\nfunction isMajor(tickVal) {\n const remain = tickVal / Math.pow(10, log10Floor(tickVal));\n return remain === 1;\n}\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while(steps(min, max, rangeExp) > 10){\n rangeExp++;\n }\n while(steps(min, max, rangeExp) < 10){\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n function generateTicks(generationOptions, { min , max }) {\n min = finiteOrDefault(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while(value < max){\n ticks.push({\n value,\n major: isMajor(value),\n significand\n });\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = finiteOrDefault(generationOptions.max, value);\n ticks.push({\n value: lastTick,\n major: isMajor(lastTick),\n significand\n });\n return ticks;\n}\nclass LogarithmicScale extends Scale {\n static id = 'logarithmic';\n static defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n constructor(cfg){\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [\n raw,\n index\n ]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isNumberFinite(value) && value > 0 ? value : null;\n }\n determineDataLimits() {\n const { min , max } = this.getMinMax(true);\n this.min = isNumberFinite(min) ? Math.max(0, min) : null;\n this.max = isNumberFinite(max) ? Math.max(0, max) : null;\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n if (this._zero && this.min !== this._suggestedMin && !isNumberFinite(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n this.handleTickRangeOptions();\n }\n handleTickRangeOptions() {\n const { minDefined , maxDefined } = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n const setMin = (v)=>min = minDefined ? min : v;\n const setMax = (v)=>max = maxDefined ? max : v;\n if (min === max) {\n if (min <= 0) {\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n setMax(changeExponent(min, +1));\n }\n this.min = min;\n this.max = max;\n }\n buildTicks() {\n const opts = this.options;\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n return ticks;\n }\n getLabelForValue(value) {\n return value === undefined ? '0' : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n configure() {\n const start = this.min;\n super.configure();\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min ? 0 : (log10(value) - this._startValue) / this._valueRange);\n }\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [\n label\n ];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - size / 2,\n end: pos + size / 2\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n return {\n start: pos,\n end: pos + size\n };\n}\n function fitWithPointLabels(scale) {\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n for(let i = 0; i < valueCount; i++){\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(toDegrees(angleRadians));\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n scale.setCenterPoint(orig.l - limits.l, limits.r - orig.r, orig.t - limits.t, limits.b - orig.b);\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\nfunction createPointLabelItem(scale, index, itemOpts) {\n const outerDistance = scale.drawingArea;\n const { extra , additionalAngle , padding , size } = itemOpts;\n const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n return {\n visible: true,\n x: pointLabelPosition.x,\n y,\n textAlign,\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n };\n}\nfunction isNotOverlapped(item, area) {\n if (!area) {\n return true;\n }\n const { left , top , right , bottom } = item;\n const apexesInArea = _isPointInArea({\n x: left,\n y: top\n }, area) || _isPointInArea({\n x: left,\n y: bottom\n }, area) || _isPointInArea({\n x: right,\n y: top\n }, area) || _isPointInArea({\n x: right,\n y: bottom\n }, area);\n return !apexesInArea;\n}\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const { centerPointLabels , display } = opts.pointLabels;\n const itemOpts = {\n extra: getTickBackdropHeight(opts) / 2,\n additionalAngle: centerPointLabels ? PI / valueCount : 0\n };\n let area;\n for(let i = 0; i < valueCount; i++){\n itemOpts.padding = padding[i];\n itemOpts.size = labelSizes[i];\n const item = createPointLabelItem(scale, i, itemOpts);\n items.push(item);\n if (display === 'auto') {\n item.visible = isNotOverlapped(item, area);\n if (item.visible) {\n area = item;\n }\n }\n }\n return items;\n}\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n return 'right';\n}\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= w / 2;\n }\n return x;\n}\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= h / 2;\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\nfunction drawPointLabelBox(ctx, opts, item) {\n const { left , top , right , bottom } = item;\n const { backdropColor } = opts;\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(opts.borderRadius);\n const padding = toPadding(opts.backdropPadding);\n ctx.fillStyle = backdropColor;\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n if (Object.values(borderRadius).some((v)=>v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n}\nfunction drawPointLabels(scale, labelCount) {\n const { ctx , options: { pointLabels } } = scale;\n for(let i = labelCount - 1; i >= 0; i--){\n const item = scale._pointLabelItems[i];\n if (!item.visible) {\n continue;\n }\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n drawPointLabelBox(ctx, optsAtIndex, item);\n const plFont = toFont(optsAtIndex.font);\n const { x , y , textAlign } = item;\n renderText(ctx, scale._pointLabels[i], x, y + plFont.lineHeight / 2, plFont, {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n });\n }\n}\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const { ctx } = scale;\n if (circular) {\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n for(let i = 1; i < labelCount; i++){\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n const { color , lineWidth } = gridLineOpts;\n if (!circular && !labelCount || !color || !lineWidth || radius < 0) {\n return;\n }\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash || []);\n ctx.lineDashOffset = borderOpts.dashOffset;\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\nfunction createPointLabelContext(parent, index, label) {\n return createContext(parent, {\n label,\n index,\n type: 'pointLabel'\n });\n}\nclass RadialLinearScale extends LinearScaleBase {\n static id = 'radialLinear';\n static defaults = {\n display: true,\n animate: true,\n position: 'chartArea',\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n grid: {\n circular: false\n },\n startAngle: 0,\n ticks: {\n showLabelBackdrop: true,\n callback: Ticks.formatters.numeric\n },\n pointLabels: {\n backdropColor: undefined,\n backdropPadding: 2,\n display: true,\n font: {\n size: 10\n },\n callback (label) {\n return label;\n },\n padding: 5,\n centerPointLabels: false\n }\n };\n static defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n };\n static descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n };\n constructor(cfg){\n super(cfg);\n this.xCenter = undefined;\n this.yCenter = undefined;\n this.drawingArea = undefined;\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n setDimensions() {\n const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n determineDataLimits() {\n const { min , max } = this.getMinMax(false);\n this.min = isNumberFinite(min) && !isNaN(min) ? min : 0;\n this.max = isNumberFinite(max) && !isNaN(max) ? max : 0;\n this.handleTickRangeOptions();\n }\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n this._pointLabels = this.getLabels().map((value, index)=>{\n const label = callback(this.options.pointLabels.callback, [\n value,\n index\n ], this);\n return label || label === 0 ? label : '';\n }).filter((v, i)=>this.chart.getDataVisibility(i));\n }\n fit() {\n const opts = this.options;\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n getPointLabelPosition(index) {\n const { left , top , right , bottom } = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom\n };\n }\n drawBackground() {\n const { backgroundColor , grid: { circular } } = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const { angleLines , grid , border } = opts;\n const labelCount = this._pointLabels.length;\n let i, offset, position;\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n if (grid.display) {\n this.ticks.forEach((tick, index)=>{\n if (index !== 0 || index === 0 && this.min < 0) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n if (angleLines.display) {\n ctx.save();\n for(i = labelCount - 1; i >= 0; i--){\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const { color , lineWidth } = optsAtIndex;\n if (!lineWidth || !color) {\n continue;\n }\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n ctx.restore();\n }\n }\n drawBorder() {}\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n if (!tickOpts.display) {\n return;\n }\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n this.ticks.forEach((tick, index)=>{\n if (index === 0 && this.min >= 0 && !opts.reverse) {\n return;\n }\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(-width / 2 - padding.left, -offset - tickFont.size / 2 - padding.top, width + padding.width, tickFont.size + padding.height);\n }\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n strokeColor: optsAtIndex.textStrokeColor,\n strokeWidth: optsAtIndex.textStrokeWidth\n });\n });\n ctx.restore();\n }\n drawTitle() {}\n}\n\nconst INTERVALS = {\n millisecond: {\n common: true,\n size: 1,\n steps: 1000\n },\n second: {\n common: true,\n size: 1000,\n steps: 60\n },\n minute: {\n common: true,\n size: 60000,\n steps: 60\n },\n hour: {\n common: true,\n size: 3600000,\n steps: 24\n },\n day: {\n common: true,\n size: 86400000,\n steps: 30\n },\n week: {\n common: false,\n size: 604800000,\n steps: 4\n },\n month: {\n common: true,\n size: 2.628e9,\n steps: 12\n },\n quarter: {\n common: false,\n size: 7.884e9,\n steps: 4\n },\n year: {\n common: true,\n size: 3.154e10\n }\n};\n const UNITS = /* #__PURE__ */ Object.keys(INTERVALS);\n function sorter(a, b) {\n return a - b;\n}\n function parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n const adapter = scale._adapter;\n const { parser , round , isoWeekday } = scale._parseOpts;\n let value = input;\n if (typeof parser === 'function') {\n value = parser(value);\n }\n if (!isNumberFinite(value)) {\n value = typeof parser === 'string' ? adapter.parse(value, parser) : adapter.parse(value);\n }\n if (value === null) {\n return null;\n }\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true) ? adapter.startOf(value, 'isoWeek', isoWeekday) : adapter.startOf(value, round);\n }\n return +value;\n}\n function determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n for(let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i){\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n return UNITS[ilen - 1];\n}\n function determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for(let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--){\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n function determineMajorUnit(unit) {\n for(let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i){\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\n function addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const { lo , hi } = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\n function setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n for(major = first; major <= last; major = +adapter.add(major, 1, majorUnit)){\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\n function ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n const map = {};\n const ilen = values.length;\n let i, value;\n for(i = 0; i < ilen; ++i){\n value = values[i];\n map[value] = i;\n ticks.push({\n value,\n major: false\n });\n }\n return ilen === 0 || !majorUnit ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\nclass TimeScale extends Scale {\n static id = 'time';\n static defaults = {\n bounds: 'data',\n adapters: {},\n time: {\n parser: false,\n unit: false,\n round: false,\n isoWeekday: false,\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n source: 'auto',\n callback: false,\n major: {\n enabled: false\n }\n }\n };\n constructor(props){\n super(props);\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n this._unit = 'day';\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n adapter.init(opts);\n mergeIf(time.displayFormats, adapter.formats());\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n super.init(scaleOpts);\n this._normalized = opts.normalized;\n }\n parse(raw, index) {\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n let { min , max , minDefined , maxDefined } = this.getUserBounds();\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n if (!minDefined || !maxDefined) {\n _applyBounds(this._getLabelBounds());\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.getMinMax(false));\n }\n }\n min = isNumberFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isNumberFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {\n min,\n max\n };\n }\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n const min = this.min;\n const max = this.max;\n const ticks = _filterBetween(timestamps, min, max);\n this._unit = timeOpts.unit || (tickOpts.autoSkip ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min)) : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n if (options.reverse) {\n ticks.reverse();\n }\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n afterAutoSkip() {\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map((tick)=>+tick.value));\n }\n }\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n this._offsets = {\n start,\n end,\n factor: 1 / (start + 1 + end)\n };\n }\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n for(time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++){\n addTick(ticks, time, timestamps);\n }\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n return Object.keys(ticks).sort(sorter).map((x)=>+x);\n }\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n format(value, format) {\n const options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const fmt = format || formats[unit];\n return this._adapter.format(value, fmt);\n }\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n if (formatter) {\n return callback(formatter, [\n time,\n index,\n ticks\n ], this);\n }\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n generateTickLabels(ticks) {\n let i, ilen, tick;\n for(i = 0, ilen = ticks.length; i < ilen; ++i){\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n return {\n w: tickLabelWidth * cosRotation + tickFontSize * sinRotation,\n h: tickLabelWidth * sinRotation + tickFontSize * cosRotation\n };\n }\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [\n exampleTime\n ], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const metas = this.getMatchingVisibleMetas();\n if (this._normalized && metas.length) {\n return this._cache.data = metas[0].controller.getAllParsedValues(this);\n }\n for(i = 0, ilen = metas.length; i < ilen; ++i){\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n return this._cache.data = this.normalize(timestamps);\n }\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const labels = this.getLabels();\n for(i = 0, ilen = labels.length; i < ilen; ++i){\n timestamps.push(parse(this, labels[i]));\n }\n return this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps);\n }\n normalize(values) {\n return _arrayUnique(values.sort(sorter));\n }\n}\n\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({ lo , hi } = _lookupByKey(table, 'pos', val));\n }\n ({ pos: prevSource , time: prevTarget } = table[lo]);\n ({ pos: nextSource , time: nextTarget } = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({ lo , hi } = _lookupByKey(table, 'time', val));\n }\n ({ time: prevSource , pos: prevTarget } = table[lo]);\n ({ time: nextSource , pos: nextTarget } = table[hi]);\n }\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\nclass TimeSeriesScale extends TimeScale {\n static id = 'timeseries';\n static defaults = TimeScale.defaults;\n constructor(props){\n super(props);\n this._table = [];\n this._minPos = undefined;\n this._tableRange = undefined;\n }\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n buildLookupTable(timestamps) {\n const { min , max } = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n for(i = 0, ilen = timestamps.length; i < ilen; ++i){\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n if (items.length < 2) {\n return [\n {\n time: min,\n pos: 0\n },\n {\n time: max,\n pos: 1\n }\n ];\n }\n for(i = 0, ilen = items.length; i < ilen; ++i){\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({\n time: curr,\n pos: i / (ilen - 1)\n });\n }\n }\n return table;\n }\n _generate() {\n const min = this.min;\n const max = this.max;\n let timestamps = super.getDataTimestamps();\n if (!timestamps.includes(min) || !timestamps.length) {\n timestamps.splice(0, 0, min);\n }\n if (!timestamps.includes(max) || timestamps.length === 1) {\n timestamps.push(max);\n }\n return timestamps.sort((a, b)=>a - b);\n }\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n if (timestamps.length) {\n return timestamps;\n }\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n return timestamps;\n }\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nvar scales = /*#__PURE__*/Object.freeze({\n__proto__: null,\nCategoryScale: CategoryScale,\nLinearScale: LinearScale,\nLogarithmicScale: LogarithmicScale,\nRadialLinearScale: RadialLinearScale,\nTimeScale: TimeScale,\nTimeSeriesScale: TimeSeriesScale\n});\n\nconst registerables = [\n controllers,\n elements,\n plugins,\n scales\n];\n\nexport { Animation, Animations, ArcElement, BarController, BarElement, BasePlatform, BasicPlatform, BubbleController, CategoryScale, Chart, plugin_colors as Colors, DatasetController, plugin_decimation as Decimation, DomPlatform, DoughnutController, Element, index as Filler, Interaction, plugin_legend as Legend, LineController, LineElement, LinearScale, LogarithmicScale, PieController, PointElement, PolarAreaController, RadarController, RadialLinearScale, Scale, ScatterController, plugin_subtitle as SubTitle, Ticks, TimeScale, TimeSeriesScale, plugin_title as Title, plugin_tooltip as Tooltip, adapters as _adapters, _detectPlatform, animator, controllers, defaults, elements, layouts, plugins, registerables, registry, scales };\n//# sourceMappingURL=chart.js.map\n", "/*!\n * Chart.js v4.4.6\n * https://www.chartjs.org\n * (c) 2024 Chart.js Contributors\n * Released under the MIT License\n */\nexport { H as HALF_PI, b2 as INFINITY, P as PI, b1 as PITAU, b4 as QUARTER_PI, b3 as RAD_PER_DEG, T as TAU, b5 as TWO_THIRDS_PI, R as _addGrace, X as _alignPixel, a2 as _alignStartEnd, p as _angleBetween, b6 as _angleDiff, _ as _arrayUnique, a8 as _attachContext, as as _bezierCurveTo, ap as _bezierInterpolation, ax as _boundSegment, an as _boundSegments, a5 as _capitalize, am as _computeSegments, a9 as _createResolver, aK as _decimalPlaces, aV as _deprecated, aa as _descriptors, ah as _elementsEqual, N as _factorize, aO as _filterBetween, I as _getParentNode, q as _getStartAndCountOfVisiblePoints, W as _int16Range, aj as _isBetween, ai as _isClickEvent, M as _isDomSupported, C as _isPointInArea, S as _limitValue, aN as _longestText, aP as _lookup, B as _lookupByKey, V as _measureText, aT as _merger, aU as _mergerIf, ay as _normalizeAngle, y as _parseObjectDataRadialScale, aq as _pointInLine, ak as _readValueToProps, A as _rlookupByKey, w as _scaleRangesChanged, aG as _setMinAndMaxByKey, aW as _splitKey, ao as _steppedInterpolation, ar as _steppedLineTo, aB as _textX, a1 as _toLeftRightCenter, al as _updateBezierControlPoints, au as addRoundedRectPath, aJ as almostEquals, aI as almostWhole, Q as callback, af as clearCanvas, Y as clipArea, aS as clone, c as color, j as createContext, ad as debounce, h as defined, aE as distanceBetweenPoints, at as drawPoint, aD as drawPointLegend, F as each, e as easingEffects, O as finiteOrDefault, a$ as fontString, o as formatNumber, D as getAngleFromPoint, aR as getHoverColor, G as getMaximumSize, z as getRelativePosition, az as getRtlAdapter, a_ as getStyle, b as isArray, g as isFinite, a7 as isFunction, k as isNullOrUndef, x as isNumber, i as isObject, aQ as isPatternOrGradient, l as listenArrayEvents, aM as log10, a4 as merge, ab as mergeIf, aH as niceNum, aF as noop, aA as overrideTextDirection, J as readUsedSize, Z as renderText, r as requestAnimFrame, a as resolve, f as resolveObjectKey, aC as restoreTextDirection, ae as retinaScale, ag as setsEqual, s as sign, aY as splineCurve, aZ as splineCurveMonotone, K as supportsEventListenerOptions, L as throttled, U as toDegrees, n as toDimension, a0 as toFont, aX as toFontString, b0 as toLineHeight, E as toPadding, m as toPercentage, t as toRadians, av as toTRBL, aw as toTRBLCorners, ac as uid, $ as unclipArea, u as unlistenArrayEvents, v as valueOrDefault } from './chunks/helpers.segment.js';\nimport '@kurkle/color';\n//# sourceMappingURL=helpers.js.map\n", "/**\n * @sgratzl/boxplots\n * https://github.com/sgratzl/boxplots\n *\n * Copyright (c) 2021 Samuel Gratzl \n */\n\nconst HELPER = Math.sqrt(2 * Math.PI);\nfunction gaussian(u) {\n return Math.exp(-0.5 * u * u) / HELPER;\n}\nfunction toSampleVariance(variance, len) {\n return (variance * len) / (len - 1);\n}\nfunction nrd(iqr, variance, len) {\n let s = Math.sqrt(toSampleVariance(variance, len));\n if (typeof iqr === 'number') {\n s = Math.min(s, iqr / 1.34);\n }\n return 1.06 * s * Math.pow(len, -0.2);\n}\nfunction kde(stats) {\n const len = stats.items.length;\n const bandwidth = nrd(stats.iqr, stats.variance, len);\n return (x) => {\n let i = 0;\n let sum = 0;\n for (i = 0; i < len; i++) {\n const v = stats.items[i];\n sum += gaussian((x - v) / bandwidth);\n }\n return sum / bandwidth / len;\n };\n}\n\nfunction quantilesInterpolate(arr, length, interpolate) {\n const n1 = length - 1;\n const compute = (q) => {\n const index = q * n1;\n const lo = Math.floor(index);\n const h = index - lo;\n const a = arr[lo];\n return h === 0 ? a : interpolate(a, arr[Math.min(lo + 1, n1)], h);\n };\n return {\n q1: compute(0.25),\n median: compute(0.5),\n q3: compute(0.75),\n };\n}\nfunction quantilesType7(arr, length = arr.length) {\n return quantilesInterpolate(arr, length, (a, b, alpha) => a + alpha * (b - a));\n}\nfunction quantilesLinear(arr, length = arr.length) {\n return quantilesInterpolate(arr, length, (i, j, fraction) => i + (j - i) * fraction);\n}\nfunction quantilesLower(arr, length = arr.length) {\n return quantilesInterpolate(arr, length, (i) => i);\n}\nfunction quantilesHigher(arr, length = arr.length) {\n return quantilesInterpolate(arr, length, (_, j) => j);\n}\nfunction quantilesNearest(arr, length = arr.length) {\n return quantilesInterpolate(arr, length, (i, j, fraction) => (fraction < 0.5 ? i : j));\n}\nfunction quantilesMidpoint(arr, length = arr.length) {\n return quantilesInterpolate(arr, length, (i, j) => (i + j) * 0.5);\n}\nfunction quantilesFivenum(arr, length = arr.length) {\n const n = length;\n const n4 = Math.floor((n + 3) / 2) / 2;\n const compute = (d) => 0.5 * (arr[Math.floor(d) - 1] + arr[Math.ceil(d) - 1]);\n return {\n q1: compute(n4),\n median: compute((n + 1) / 2),\n q3: compute(n + 1 - n4),\n };\n}\nfunction quantilesHinges(arr, length = arr.length) {\n return quantilesFivenum(arr, length);\n}\n\nfunction createSortedData(data) {\n let valid = 0;\n const { length } = data;\n const vs = data instanceof Float64Array ? new Float64Array(length) : new Float32Array(length);\n for (let i = 0; i < length; i += 1) {\n const v = data[i];\n if (v == null || Number.isNaN(v)) {\n continue;\n }\n vs[valid] = v;\n valid += 1;\n }\n const missing = length - valid;\n if (valid === 0) {\n return {\n min: Number.NaN,\n max: Number.NaN,\n missing,\n s: [],\n };\n }\n const validData = valid === length ? vs : vs.subarray(0, valid);\n validData.sort((a, b) => (a === b ? 0 : a < b ? -1 : 1));\n const min = validData[0];\n const max = validData[validData.length - 1];\n return {\n min,\n max,\n missing,\n s: validData,\n };\n}\nfunction withSortedData(data) {\n if (data.length === 0) {\n return {\n min: Number.NaN,\n max: Number.NaN,\n missing: 0,\n s: [],\n };\n }\n const min = data[0];\n const max = data[data.length - 1];\n return {\n min,\n max,\n missing: 0,\n s: data,\n };\n}\nfunction computeWhiskers(s, valid, min, max, { eps, quantiles, coef, whiskersMode }) {\n const same = (a, b) => Math.abs(a - b) < eps;\n const { median, q1, q3 } = quantiles(s, valid);\n const iqr = q3 - q1;\n const isCoefValid = typeof coef === 'number' && coef > 0;\n let whiskerLow = isCoefValid ? Math.max(min, q1 - coef * iqr) : min;\n let whiskerHigh = isCoefValid ? Math.min(max, q3 + coef * iqr) : max;\n const outlierLow = [];\n for (let i = 0; i < valid; i += 1) {\n const v = s[i];\n if (v >= whiskerLow || same(v, whiskerLow)) {\n if (whiskersMode === 'nearest') {\n whiskerLow = v;\n }\n break;\n }\n if (outlierLow.length === 0 || !same(outlierLow[outlierLow.length - 1], v)) {\n outlierLow.push(v);\n }\n }\n const reversedOutlierHigh = [];\n for (let i = valid - 1; i >= 0; i -= 1) {\n const v = s[i];\n if (v <= whiskerHigh || same(v, whiskerHigh)) {\n if (whiskersMode === 'nearest') {\n whiskerHigh = v;\n }\n break;\n }\n if ((reversedOutlierHigh.length === 0 || !same(reversedOutlierHigh[reversedOutlierHigh.length - 1], v)) &&\n (outlierLow.length === 0 || !same(outlierLow[outlierLow.length - 1], v))) {\n reversedOutlierHigh.push(v);\n }\n }\n const outlier = outlierLow.concat(reversedOutlierHigh.reverse());\n return {\n median,\n q1,\n q3,\n iqr,\n outlier,\n whiskerHigh,\n whiskerLow,\n };\n}\nfunction computeStats(s, valid) {\n let mean = 0;\n for (let i = 0; i < valid; i++) {\n const v = s[i];\n mean += v;\n }\n mean /= valid;\n let variance = 0;\n for (let i = 0; i < valid; i++) {\n const v = s[i];\n variance += (v - mean) * (v - mean);\n }\n variance /= valid;\n return {\n mean,\n variance,\n };\n}\nfunction boxplot(data, options = {}) {\n const fullOptions = {\n coef: 1.5,\n eps: 10e-3,\n quantiles: quantilesType7,\n validAndSorted: false,\n whiskersMode: 'nearest',\n ...options,\n };\n const { missing, s, min, max } = fullOptions.validAndSorted ? withSortedData(data) : createSortedData(data);\n const invalid = {\n min: Number.NaN,\n max: Number.NaN,\n mean: Number.NaN,\n missing,\n iqr: Number.NaN,\n count: data.length,\n whiskerHigh: Number.NaN,\n whiskerLow: Number.NaN,\n outlier: [],\n median: Number.NaN,\n q1: Number.NaN,\n q3: Number.NaN,\n variance: 0,\n items: [],\n kde: () => 0,\n };\n const valid = data.length - missing;\n if (valid === 0) {\n return invalid;\n }\n const result = {\n min,\n max,\n count: data.length,\n missing,\n items: s,\n ...computeStats(s, valid),\n ...computeWhiskers(s, valid, min, max, fullOptions),\n };\n return {\n ...result,\n kde: kde(result),\n };\n}\n\nexport { boxplot, boxplot as default, kde, quantilesFivenum, quantilesHigher, quantilesHinges, quantilesInterpolate, quantilesLinear, quantilesLower, quantilesMidpoint, quantilesNearest, quantilesType7 };\n//# sourceMappingURL=index.js.map\n", "/**\n * @sgratzl/chartjs-chart-boxplot\n * https://github.com/sgratzl/chartjs-chart-boxplot\n *\n * Copyright (c) 2019-2023 Samuel Gratzl \n */\n\nimport { Element, BarElement, Tooltip, BarController, registry, Chart, LinearScale, CategoryScale } from 'chart.js';\nimport { drawPoint, formatNumber, merge } from 'chart.js/helpers';\nimport { quantilesType7, boxplot, quantilesHinges, quantilesFivenum, quantilesLinear, quantilesLower, quantilesHigher, quantilesNearest, quantilesMidpoint } from '@sgratzl/boxplots';\n\nfunction whiskers(boxplot, arr, coef = 1.5) {\n const iqr = boxplot.q3 - boxplot.q1;\n const coefValid = typeof coef === 'number' && coef > 0;\n let whiskerMin = coefValid ? Math.max(boxplot.min, boxplot.q1 - coef * iqr) : boxplot.min;\n let whiskerMax = coefValid ? Math.min(boxplot.max, boxplot.q3 + coef * iqr) : boxplot.max;\n if (Array.isArray(arr)) {\n for (let i = 0; i < arr.length; i += 1) {\n const v = arr[i];\n if (v >= whiskerMin) {\n whiskerMin = v;\n break;\n }\n }\n for (let i = arr.length - 1; i >= 0; i -= 1) {\n const v = arr[i];\n if (v <= whiskerMax) {\n whiskerMax = v;\n break;\n }\n }\n }\n return {\n whiskerMin,\n whiskerMax,\n };\n}\nconst defaultStatsOptions = {\n coef: 1.5,\n quantiles: 7,\n whiskersMode: 'nearest',\n};\nfunction determineQuantiles(q) {\n if (typeof q === 'function') {\n return q;\n }\n const lookup = {\n hinges: quantilesHinges,\n fivenum: quantilesFivenum,\n 7: quantilesType7,\n quantiles: quantilesType7,\n linear: quantilesLinear,\n lower: quantilesLower,\n higher: quantilesHigher,\n nearest: quantilesNearest,\n midpoint: quantilesMidpoint,\n };\n return lookup[q] || quantilesType7;\n}\nfunction determineStatsOptions(options) {\n const coef = options == null || typeof options.coef !== 'number' ? defaultStatsOptions.coef : options.coef;\n const q = options == null || options.quantiles == null ? quantilesType7 : options.quantiles;\n const quantiles = determineQuantiles(q);\n const whiskersMode = options == null || typeof options.whiskersMode !== 'string'\n ? defaultStatsOptions.whiskersMode\n : options.whiskersMode;\n return {\n coef,\n quantiles,\n whiskersMode,\n };\n}\nfunction boxplotStats(arr, options) {\n const vs = typeof Float64Array !== 'undefined' && !(arr instanceof Float32Array || arr instanceof Float64Array)\n ? Float64Array.from(arr)\n : arr;\n const r = boxplot(vs, determineStatsOptions(options));\n return {\n items: Array.from(r.items),\n outliers: r.outlier,\n whiskerMax: r.whiskerHigh,\n whiskerMin: r.whiskerLow,\n max: r.max,\n median: r.median,\n mean: r.mean,\n min: r.min,\n q1: r.q1,\n q3: r.q3,\n };\n}\nfunction computeSamples(min, max, points) {\n const range = max - min;\n const samples = [];\n const inc = range / points;\n for (let v = min; v <= max && inc > 0; v += inc) {\n samples.push(v);\n }\n if (samples[samples.length - 1] !== max) {\n samples.push(max);\n }\n return samples;\n}\nfunction violinStats(arr, options) {\n if (arr.length === 0) {\n return undefined;\n }\n const vs = typeof Float64Array !== 'undefined' && !(arr instanceof Float32Array || arr instanceof Float64Array)\n ? Float64Array.from(arr)\n : arr;\n const stats = boxplot(vs, determineStatsOptions(options));\n const samples = computeSamples(stats.min, stats.max, options.points);\n const coords = samples.map((v) => ({ v, estimate: stats.kde(v) }));\n const maxEstimate = coords.reduce((a, d) => Math.max(a, d.estimate), Number.NEGATIVE_INFINITY);\n return {\n max: stats.max,\n min: stats.min,\n mean: stats.mean,\n median: stats.median,\n q1: stats.q1,\n q3: stats.q3,\n items: Array.from(stats.items),\n coords,\n outliers: [],\n maxEstimate,\n };\n}\nfunction asBoxPlotStats(value, options) {\n if (!value) {\n return undefined;\n }\n if (typeof value.median === 'number' && typeof value.q1 === 'number' && typeof value.q3 === 'number') {\n if (typeof value.whiskerMin === 'undefined') {\n const { coef } = determineStatsOptions(options);\n const { whiskerMin, whiskerMax } = whiskers(value, Array.isArray(value.items) ? value.items.slice().sort((a, b) => a - b) : null, coef);\n value.whiskerMin = whiskerMin;\n value.whiskerMax = whiskerMax;\n }\n return value;\n }\n if (!Array.isArray(value)) {\n return undefined;\n }\n return boxplotStats(value, options);\n}\nfunction asViolinStats(value, options) {\n if (!value) {\n return undefined;\n }\n if (typeof value.median === 'number' && Array.isArray(value.coords)) {\n return value;\n }\n if (!Array.isArray(value)) {\n return undefined;\n }\n return violinStats(value, options);\n}\nfunction rnd(seed = Date.now()) {\n let s = seed;\n return () => {\n s = (s * 9301 + 49297) % 233280;\n return s / 233280;\n };\n}\n\nconst baseDefaults$1 = {\n borderWidth: 1,\n outlierStyle: 'circle',\n outlierRadius: 2,\n outlierBorderWidth: 1,\n itemStyle: 'circle',\n itemRadius: 0,\n itemBorderWidth: 0,\n itemHitRadius: 0,\n meanStyle: 'circle',\n meanRadius: 3,\n meanBorderWidth: 1,\n hitPadding: 2,\n outlierHitRadius: 4,\n};\nconst baseRoutes = {\n outlierBackgroundColor: 'backgroundColor',\n outlierBorderColor: 'borderColor',\n itemBackgroundColor: 'backgroundColor',\n itemBorderColor: 'borderColor',\n meanBackgroundColor: 'backgroundColor',\n meanBorderColor: 'borderColor',\n};\nconst baseOptionKeys = (() => Object.keys(baseDefaults$1).concat(Object.keys(baseRoutes)))();\nlet StatsBase$1 = class StatsBase extends Element {\n isVertical() {\n return !this.horizontal;\n }\n _drawItems(ctx) {\n const vert = this.isVertical();\n const props = this.getProps(['x', 'y', 'items', 'width', 'height', 'outliers']);\n const { options } = this;\n if (options.itemRadius <= 0 || !props.items || props.items.length <= 0) {\n return;\n }\n ctx.save();\n ctx.strokeStyle = options.itemBorderColor;\n ctx.fillStyle = options.itemBackgroundColor;\n ctx.lineWidth = options.itemBorderWidth;\n const random = rnd(this._datasetIndex * 1000 + this._index);\n const pointOptions = {\n pointStyle: options.itemStyle,\n radius: options.itemRadius,\n borderWidth: options.itemBorderWidth,\n };\n const outliers = new Set(props.outliers || []);\n if (vert) {\n props.items.forEach((v) => {\n if (!outliers.has(v)) {\n drawPoint(ctx, pointOptions, props.x - props.width / 2 + random() * props.width, v);\n }\n });\n }\n else {\n props.items.forEach((v) => {\n if (!outliers.has(v)) {\n drawPoint(ctx, pointOptions, v, props.y - props.height / 2 + random() * props.height);\n }\n });\n }\n ctx.restore();\n }\n _drawOutliers(ctx) {\n const vert = this.isVertical();\n const props = this.getProps(['x', 'y', 'outliers']);\n const { options } = this;\n if (options.outlierRadius <= 0 || !props.outliers || props.outliers.length === 0) {\n return;\n }\n ctx.save();\n ctx.fillStyle = options.outlierBackgroundColor;\n ctx.strokeStyle = options.outlierBorderColor;\n ctx.lineWidth = options.outlierBorderWidth;\n const pointOptions = {\n pointStyle: options.outlierStyle,\n radius: options.outlierRadius,\n borderWidth: options.outlierBorderWidth,\n };\n if (vert) {\n props.outliers.forEach((v) => {\n drawPoint(ctx, pointOptions, props.x, v);\n });\n }\n else {\n props.outliers.forEach((v) => {\n drawPoint(ctx, pointOptions, v, props.y);\n });\n }\n ctx.restore();\n }\n _drawMeanDot(ctx) {\n const vert = this.isVertical();\n const props = this.getProps(['x', 'y', 'mean']);\n const { options } = this;\n if (options.meanRadius <= 0 || props.mean == null || Number.isNaN(props.mean)) {\n return;\n }\n ctx.save();\n ctx.fillStyle = options.meanBackgroundColor;\n ctx.strokeStyle = options.meanBorderColor;\n ctx.lineWidth = options.meanBorderWidth;\n const pointOptions = {\n pointStyle: options.meanStyle,\n radius: options.meanRadius,\n borderWidth: options.meanBorderWidth,\n };\n if (vert) {\n drawPoint(ctx, pointOptions, props.x, props.mean);\n }\n else {\n drawPoint(ctx, pointOptions, props.mean, props.y);\n }\n ctx.restore();\n }\n _getBounds(_useFinalPosition) {\n return {\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n };\n }\n _getHitBounds(useFinalPosition) {\n const padding = this.options.hitPadding;\n const b = this._getBounds(useFinalPosition);\n return {\n left: b.left - padding,\n top: b.top - padding,\n right: b.right + padding,\n bottom: b.bottom + padding,\n };\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n if (Number.isNaN(this.x) && Number.isNaN(this.y)) {\n return false;\n }\n return (this._boxInRange(mouseX, mouseY, useFinalPosition) ||\n this._outlierIndexInRange(mouseX, mouseY, useFinalPosition) != null ||\n this._itemIndexInRange(mouseX, mouseY, useFinalPosition) != null);\n }\n inXRange(mouseX, useFinalPosition) {\n const bounds = this._getHitBounds(useFinalPosition);\n return mouseX >= bounds.left && mouseX <= bounds.right;\n }\n inYRange(mouseY, useFinalPosition) {\n const bounds = this._getHitBounds(useFinalPosition);\n return mouseY >= bounds.top && mouseY <= bounds.bottom;\n }\n _outlierIndexInRange(mouseX, mouseY, useFinalPosition) {\n const props = this.getProps(['x', 'y'], useFinalPosition);\n const hitRadius = this.options.outlierHitRadius;\n const outliers = this._getOutliers(useFinalPosition);\n const vertical = this.isVertical();\n if ((vertical && Math.abs(mouseX - props.x) > hitRadius) || (!vertical && Math.abs(mouseY - props.y) > hitRadius)) {\n return null;\n }\n const toCompare = vertical ? mouseY : mouseX;\n for (let i = 0; i < outliers.length; i += 1) {\n if (Math.abs(outliers[i] - toCompare) <= hitRadius) {\n return vertical ? { index: i, x: props.x, y: outliers[i] } : { index: i, x: outliers[i], y: props.y };\n }\n }\n return null;\n }\n _itemIndexInRange(mouseX, mouseY, useFinalPosition) {\n const hitRadius = this.options.itemHitRadius;\n if (hitRadius <= 0) {\n return null;\n }\n const props = this.getProps(['x', 'y', 'items', 'width', 'height', 'outliers'], useFinalPosition);\n const vert = this.isVertical();\n const { options } = this;\n if (options.itemRadius <= 0 || !props.items || props.items.length <= 0) {\n return null;\n }\n const random = rnd(this._datasetIndex * 1000 + this._index);\n const outliers = new Set(props.outliers || []);\n if (vert) {\n for (let i = 0; i < props.items.length; i++) {\n const y = props.items[i];\n if (!outliers.has(y)) {\n const x = props.x - props.width / 2 + random() * props.width;\n if (Math.abs(x - mouseX) <= hitRadius && Math.abs(y - mouseY) <= hitRadius) {\n return { index: i, x, y };\n }\n }\n }\n }\n else {\n for (let i = 0; i < props.items.length; i++) {\n const x = props.items[i];\n if (!outliers.has(x)) {\n const y = props.y - props.height / 2 + random() * props.height;\n if (Math.abs(x - mouseX) <= hitRadius && Math.abs(y - mouseY) <= hitRadius) {\n return { index: i, x, y };\n }\n }\n }\n }\n return null;\n }\n _boxInRange(mouseX, mouseY, useFinalPosition) {\n const bounds = this._getHitBounds(useFinalPosition);\n return mouseX >= bounds.left && mouseX <= bounds.right && mouseY >= bounds.top && mouseY <= bounds.bottom;\n }\n getCenterPoint(useFinalPosition) {\n const props = this.getProps(['x', 'y'], useFinalPosition);\n return {\n x: props.x,\n y: props.y,\n };\n }\n _getOutliers(useFinalPosition) {\n const props = this.getProps(['outliers'], useFinalPosition);\n return props.outliers || [];\n }\n tooltipPosition(eventPosition, tooltip) {\n if (!eventPosition || typeof eventPosition === 'boolean') {\n return this.getCenterPoint();\n }\n if (tooltip) {\n delete tooltip._tooltipOutlier;\n delete tooltip._tooltipItem;\n }\n const info = this._outlierIndexInRange(eventPosition.x, eventPosition.y);\n if (info != null && tooltip) {\n tooltip._tooltipOutlier = {\n index: info.index,\n datasetIndex: this._datasetIndex,\n };\n return {\n x: info.x,\n y: info.y,\n };\n }\n const itemInfo = this._itemIndexInRange(eventPosition.x, eventPosition.y);\n if (itemInfo != null && tooltip) {\n tooltip._tooltipItem = {\n index: itemInfo.index,\n datasetIndex: this._datasetIndex,\n };\n return {\n x: itemInfo.x,\n y: itemInfo.y,\n };\n }\n return this.getCenterPoint();\n }\n};\n\nconst boxOptionsKeys = baseOptionKeys.concat(['medianColor', 'lowerBackgroundColor']);\nclass BoxAndWiskers extends StatsBase$1 {\n draw(ctx) {\n ctx.save();\n ctx.fillStyle = this.options.backgroundColor;\n ctx.strokeStyle = this.options.borderColor;\n ctx.lineWidth = this.options.borderWidth;\n this._drawBoxPlot(ctx);\n this._drawOutliers(ctx);\n this._drawMeanDot(ctx);\n ctx.restore();\n this._drawItems(ctx);\n }\n _drawBoxPlot(ctx) {\n if (this.isVertical()) {\n this._drawBoxPlotVertical(ctx);\n }\n else {\n this._drawBoxPlotHorizontal(ctx);\n }\n }\n _drawBoxPlotVertical(ctx) {\n const { options } = this;\n const props = this.getProps(['x', 'width', 'q1', 'q3', 'median', 'whiskerMin', 'whiskerMax']);\n const { x } = props;\n const { width } = props;\n const x0 = x - width / 2;\n if (props.q3 > props.q1) {\n ctx.fillRect(x0, props.q1, width, props.q3 - props.q1);\n }\n else {\n ctx.fillRect(x0, props.q3, width, props.q1 - props.q3);\n }\n ctx.save();\n if (options.medianColor && options.medianColor !== 'transparent' && options.medianColor !== '#0000') {\n ctx.strokeStyle = options.medianColor;\n }\n ctx.beginPath();\n ctx.moveTo(x0, props.median);\n ctx.lineTo(x0 + width, props.median);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n ctx.save();\n if (options.lowerBackgroundColor &&\n options.lowerBackgroundColor !== 'transparent' &&\n options.lowerBackgroundColor !== '#0000') {\n ctx.fillStyle = options.lowerBackgroundColor;\n if (props.q3 > props.q1) {\n ctx.fillRect(x0, props.median, width, props.q3 - props.median);\n }\n else {\n ctx.fillRect(x0, props.median, width, props.q1 - props.median);\n }\n }\n ctx.restore();\n if (props.q3 > props.q1) {\n ctx.strokeRect(x0, props.q1, width, props.q3 - props.q1);\n }\n else {\n ctx.strokeRect(x0, props.q3, width, props.q1 - props.q3);\n }\n ctx.beginPath();\n ctx.moveTo(x0, props.whiskerMin);\n ctx.lineTo(x0 + width, props.whiskerMin);\n ctx.moveTo(x, props.whiskerMin);\n ctx.lineTo(x, props.q1);\n ctx.moveTo(x0, props.whiskerMax);\n ctx.lineTo(x0 + width, props.whiskerMax);\n ctx.moveTo(x, props.whiskerMax);\n ctx.lineTo(x, props.q3);\n ctx.closePath();\n ctx.stroke();\n }\n _drawBoxPlotHorizontal(ctx) {\n const { options } = this;\n const props = this.getProps(['y', 'height', 'q1', 'q3', 'median', 'whiskerMin', 'whiskerMax']);\n const { y } = props;\n const { height } = props;\n const y0 = y - height / 2;\n if (props.q3 > props.q1) {\n ctx.fillRect(props.q1, y0, props.q3 - props.q1, height);\n }\n else {\n ctx.fillRect(props.q3, y0, props.q1 - props.q3, height);\n }\n ctx.save();\n if (options.medianColor && options.medianColor !== 'transparent') {\n ctx.strokeStyle = options.medianColor;\n }\n ctx.beginPath();\n ctx.moveTo(props.median, y0);\n ctx.lineTo(props.median, y0 + height);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n ctx.save();\n if (options.lowerBackgroundColor && options.lowerBackgroundColor !== 'transparent') {\n ctx.fillStyle = options.lowerBackgroundColor;\n if (props.q3 > props.q1) {\n ctx.fillRect(props.median, y0, props.q3 - props.median, height);\n }\n else {\n ctx.fillRect(props.median, y0, props.q1 - props.median, height);\n }\n }\n ctx.restore();\n if (props.q3 > props.q1) {\n ctx.strokeRect(props.q1, y0, props.q3 - props.q1, height);\n }\n else {\n ctx.strokeRect(props.q3, y0, props.q1 - props.q3, height);\n }\n ctx.beginPath();\n ctx.moveTo(props.whiskerMin, y0);\n ctx.lineTo(props.whiskerMin, y0 + height);\n ctx.moveTo(props.whiskerMin, y);\n ctx.lineTo(props.q1, y);\n ctx.moveTo(props.whiskerMax, y0);\n ctx.lineTo(props.whiskerMax, y0 + height);\n ctx.moveTo(props.whiskerMax, y);\n ctx.lineTo(props.q3, y);\n ctx.closePath();\n ctx.stroke();\n }\n _getBounds(useFinalPosition) {\n const vert = this.isVertical();\n if (this.x == null) {\n return {\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n };\n }\n if (vert) {\n const { x, width, whiskerMax, whiskerMin } = this.getProps(['x', 'width', 'whiskerMin', 'whiskerMax'], useFinalPosition);\n const x0 = x - width / 2;\n return {\n left: x0,\n top: whiskerMax,\n right: x0 + width,\n bottom: whiskerMin,\n };\n }\n const { y, height, whiskerMax, whiskerMin } = this.getProps(['y', 'height', 'whiskerMin', 'whiskerMax'], useFinalPosition);\n const y0 = y - height / 2;\n return {\n left: whiskerMin,\n top: y0,\n right: whiskerMax,\n bottom: y0 + height,\n };\n }\n}\nBoxAndWiskers.id = 'boxandwhiskers';\nBoxAndWiskers.defaults = {\n ...BarElement.defaults,\n ...baseDefaults$1,\n medianColor: 'transparent',\n lowerBackgroundColor: 'transparent',\n};\nBoxAndWiskers.defaultRoutes = { ...BarElement.defaultRoutes, ...baseRoutes };\n\nclass Violin extends StatsBase$1 {\n draw(ctx) {\n ctx.save();\n ctx.fillStyle = this.options.backgroundColor;\n ctx.strokeStyle = this.options.borderColor;\n ctx.lineWidth = this.options.borderWidth;\n const props = this.getProps(['x', 'y', 'median', 'width', 'height', 'min', 'max', 'coords', 'maxEstimate']);\n if (props.median != null) {\n drawPoint(ctx, {\n pointStyle: 'rectRot',\n radius: 5,\n borderWidth: this.options.borderWidth,\n }, props.x, props.y);\n }\n if (props.coords && props.coords.length > 0) {\n this._drawCoords(ctx, props);\n }\n this._drawOutliers(ctx);\n this._drawMeanDot(ctx);\n ctx.restore();\n this._drawItems(ctx);\n }\n _drawCoords(ctx, props) {\n let maxEstimate;\n if (props.maxEstimate == null) {\n maxEstimate = props.coords.reduce((a, d) => Math.max(a, d.estimate), Number.NEGATIVE_INFINITY);\n }\n else {\n maxEstimate = props.maxEstimate;\n }\n ctx.beginPath();\n if (this.isVertical()) {\n const { x, width } = props;\n const factor = width / 2 / maxEstimate;\n props.coords.forEach((c) => {\n ctx.lineTo(x - c.estimate * factor, c.v);\n });\n props.coords\n .slice()\n .reverse()\n .forEach((c) => {\n ctx.lineTo(x + c.estimate * factor, c.v);\n });\n }\n else {\n const { y, height } = props;\n const factor = height / 2 / maxEstimate;\n props.coords.forEach((c) => {\n ctx.lineTo(c.v, y - c.estimate * factor);\n });\n props.coords\n .slice()\n .reverse()\n .forEach((c) => {\n ctx.lineTo(c.v, y + c.estimate * factor);\n });\n }\n ctx.closePath();\n ctx.stroke();\n ctx.fill();\n }\n _getBounds(useFinalPosition) {\n if (this.isVertical()) {\n const { x, width, min, max } = this.getProps(['x', 'width', 'min', 'max'], useFinalPosition);\n const x0 = x - width / 2;\n return {\n left: x0,\n top: max,\n right: x0 + width,\n bottom: min,\n };\n }\n const { y, height, min, max } = this.getProps(['y', 'height', 'min', 'max'], useFinalPosition);\n const y0 = y - height / 2;\n return {\n left: min,\n top: y0,\n right: max,\n bottom: y0 + height,\n };\n }\n}\nViolin.id = 'violin';\nViolin.defaults = { ...BarElement.defaults, ...baseDefaults$1 };\nViolin.defaultRoutes = { ...BarElement.defaultRoutes, ...baseRoutes };\n\nconst interpolators = {\n number(from, to, factor) {\n if (from === to) {\n return to;\n }\n if (from == null) {\n return to;\n }\n if (to == null) {\n return from;\n }\n return from + (to - from) * factor;\n },\n};\nfunction interpolateNumberArray(from, to, factor) {\n if (typeof from === 'number' && typeof to === 'number') {\n return interpolators.number(from, to, factor);\n }\n if (Array.isArray(from) && Array.isArray(to)) {\n return to.map((t, i) => interpolators.number(from[i], t, factor));\n }\n return to;\n}\nfunction interpolateKdeCoords(from, to, factor) {\n if (Array.isArray(from) && Array.isArray(to)) {\n return to.map((t, i) => ({\n v: interpolators.number(from[i] ? from[i].v : null, t.v, factor),\n estimate: interpolators.number(from[i] ? from[i].estimate : null, t.estimate, factor),\n }));\n }\n return to;\n}\n\nfunction patchInHoveredOutlier(item) {\n const value = item.formattedValue;\n const that = this;\n if (value && that._tooltipOutlier != null && item.datasetIndex === that._tooltipOutlier.datasetIndex) {\n value.hoveredOutlierIndex = that._tooltipOutlier.index;\n }\n if (value && that._tooltipItem != null && item.datasetIndex === that._tooltipItem.datasetIndex) {\n value.hoveredItemIndex = that._tooltipItem.index;\n }\n}\nfunction outlierPositioner(items, eventPosition) {\n if (!items.length) {\n return false;\n }\n let x = 0;\n let y = 0;\n let count = 0;\n for (let i = 0; i < items.length; i += 1) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition(eventPosition, this);\n x += pos.x;\n y += pos.y;\n count += 1;\n }\n }\n return {\n x: x / count,\n y: y / count,\n };\n}\noutlierPositioner.id = 'average';\noutlierPositioner.register = () => {\n Tooltip.positioners.average = outlierPositioner;\n return outlierPositioner;\n};\n\nfunction baseDefaults(keys) {\n const colorKeys = ['borderColor', 'backgroundColor'].concat(keys.filter((c) => c.endsWith('Color')));\n return {\n animations: {\n numberArray: {\n fn: interpolateNumberArray,\n properties: ['outliers', 'items'],\n },\n colors: {\n type: 'color',\n properties: colorKeys,\n },\n },\n transitions: {\n show: {\n animations: {\n colors: {\n type: 'color',\n properties: colorKeys,\n from: 'transparent',\n },\n },\n },\n hide: {\n animations: {\n colors: {\n type: 'color',\n properties: colorKeys,\n to: 'transparent',\n },\n },\n },\n },\n minStats: 'min',\n maxStats: 'max',\n ...defaultStatsOptions,\n };\n}\nfunction defaultOverrides() {\n return {\n plugins: {\n tooltip: {\n position: outlierPositioner.register().id,\n callbacks: {\n beforeLabel: patchInHoveredOutlier,\n },\n },\n },\n };\n}\nclass StatsBase extends BarController {\n _transformStats(target, source, mapper) {\n for (const key of ['min', 'max', 'median', 'q3', 'q1', 'mean']) {\n const v = source[key];\n if (typeof v === 'number') {\n target[key] = mapper(v);\n }\n }\n for (const key of ['outliers', 'items']) {\n if (Array.isArray(source[key])) {\n target[key] = source[key].map(mapper);\n }\n }\n }\n getMinMax(scale, canStack) {\n const bak = scale.axis;\n const config = this.options;\n scale.axis = config.minStats;\n const { min } = super.getMinMax(scale, canStack);\n scale.axis = config.maxStats;\n const { max } = super.getMinMax(scale, canStack);\n scale.axis = bak;\n return { min, max };\n }\n parsePrimitiveData(meta, data, start, count) {\n const vScale = meta.vScale;\n const iScale = meta.iScale;\n const labels = iScale.getLabels();\n const r = [];\n for (let i = 0; i < count; i += 1) {\n const index = i + start;\n const parsed = {};\n parsed[iScale.axis] = iScale.parse(labels[index], index);\n const stats = this._parseStats(data == null ? null : data[index], this.options);\n if (stats) {\n Object.assign(parsed, stats);\n parsed[vScale.axis] = stats.median;\n }\n r.push(parsed);\n }\n return r;\n }\n parseArrayData(meta, data, start, count) {\n return this.parsePrimitiveData(meta, data, start, count);\n }\n parseObjectData(meta, data, start, count) {\n return this.parsePrimitiveData(meta, data, start, count);\n }\n getLabelAndValue(index) {\n const r = super.getLabelAndValue(index);\n const { vScale } = this._cachedMeta;\n const parsed = this.getParsed(index);\n if (!vScale || !parsed || r.value === 'NaN') {\n return r;\n }\n r.value = {\n raw: parsed,\n hoveredOutlierIndex: -1,\n hoveredItemIndex: -1,\n };\n this._transformStats(r.value, parsed, (v) => vScale.getLabelForValue(v));\n const s = this._toStringStats(r.value.raw);\n r.value.toString = function toString() {\n if (this.hoveredOutlierIndex >= 0) {\n return `(outlier: ${this.outliers[this.hoveredOutlierIndex]})`;\n }\n if (this.hoveredItemIndex >= 0) {\n return `(item: ${this.items[this.hoveredItemIndex]})`;\n }\n return s;\n };\n return r;\n }\n _toStringStats(b) {\n const f = (v) => (v == null ? 'NaN' : formatNumber(v, this.chart.options.locale, {}));\n return `(min: ${f(b.min)}, 25% quantile: ${f(b.q1)}, median: ${f(b.median)}, mean: ${f(b.mean)}, 75% quantile: ${f(b.q3)}, max: ${f(b.max)})`;\n }\n updateElement(rectangle, index, properties, mode) {\n const reset = mode === 'reset';\n const scale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n const base = scale.getBasePixel();\n properties._datasetIndex = this.index;\n properties._index = index;\n this._transformStats(properties, parsed, (v) => (reset ? base : scale.getPixelForValue(v, index)));\n super.updateElement(rectangle, index, properties, mode);\n }\n}\n\nfunction patchController(type, config, controller, elements = [], scales = []) {\n registry.addControllers(controller);\n if (Array.isArray(elements)) {\n registry.addElements(...elements);\n }\n else {\n registry.addElements(elements);\n }\n if (Array.isArray(scales)) {\n registry.addScales(...scales);\n }\n else {\n registry.addScales(scales);\n }\n const c = config;\n c.type = type;\n return c;\n}\n\nclass BoxPlotController extends StatsBase {\n _parseStats(value, config) {\n return asBoxPlotStats(value, config);\n }\n _transformStats(target, source, mapper) {\n super._transformStats(target, source, mapper);\n for (const key of ['whiskerMin', 'whiskerMax']) {\n target[key] = mapper(source[key]);\n }\n }\n}\nBoxPlotController.id = 'boxplot';\nBoxPlotController.defaults = merge({}, [\n BarController.defaults,\n baseDefaults(boxOptionsKeys),\n {\n animations: {\n numbers: {\n type: 'number',\n properties: BarController.defaults.animations.numbers.properties.concat(['q1', 'q3', 'min', 'max', 'median', 'whiskerMin', 'whiskerMax', 'mean'], boxOptionsKeys.filter((c) => !c.endsWith('Color'))),\n },\n },\n dataElementType: BoxAndWiskers.id,\n },\n]);\nBoxPlotController.overrides = merge({}, [BarController.overrides, defaultOverrides()]);\nclass BoxPlotChart extends Chart {\n constructor(item, config) {\n super(item, patchController('boxplot', config, BoxPlotController, BoxAndWiskers, [LinearScale, CategoryScale]));\n }\n}\nBoxPlotChart.id = BoxPlotController.id;\n\nclass ViolinController extends StatsBase {\n _parseStats(value, config) {\n return asViolinStats(value, config);\n }\n _transformStats(target, source, mapper) {\n super._transformStats(target, source, mapper);\n target.maxEstimate = source.maxEstimate;\n if (Array.isArray(source.coords)) {\n target.coords = source.coords.map((c) => ({ ...c, v: mapper(c.v) }));\n }\n }\n}\nViolinController.id = 'violin';\nViolinController.defaults = merge({}, [\n BarController.defaults,\n baseDefaults(baseOptionKeys),\n {\n points: 100,\n animations: {\n numbers: {\n type: 'number',\n properties: BarController.defaults.animations.numbers.properties.concat(['q1', 'q3', 'min', 'max', 'median', 'maxEstimate'], baseOptionKeys.filter((c) => !c.endsWith('Color'))),\n },\n kdeCoords: {\n fn: interpolateKdeCoords,\n properties: ['coords'],\n },\n },\n dataElementType: Violin.id,\n },\n]);\nViolinController.overrides = merge({}, [BarController.overrides, defaultOverrides()]);\nclass ViolinChart extends Chart {\n constructor(item, config) {\n super(item, patchController('violin', config, ViolinController, Violin, [LinearScale, CategoryScale]));\n }\n}\nViolinChart.id = ViolinController.id;\n\nexport { BoxAndWiskers, BoxPlotChart, BoxPlotController, StatsBase$1 as StatsBase, Violin, ViolinChart, ViolinController };\n//# sourceMappingURL=index.js.map\n", "export class Colors {\n static uniqueList = [\n \"hsl(0, 100%, 50%)\",\n \"hsl(25, 100%, 50%)\",\n \"hsl(50, 100%, 50%)\",\n \"hsl(75, 100%, 50%)\",\n \"hsl(100, 100%, 50%)\",\n \"hsl(125, 100%, 50%)\",\n \"hsl(150, 100%, 50%)\",\n \"hsl(175, 100%, 50%)\",\n \"hsl(200, 100%, 50%)\",\n \"hsl(225, 100%, 50%)\",\n \"hsl(250, 100%, 50%)\",\n \"hsl(275, 100%, 50%)\",\n \"hsl(300, 100%, 50%)\",\n \"hsl(325, 100%, 50%)\",\n ];\n\n static get themedList() {\n const css = getComputedStyle(document.documentElement);\n const colors = [];\n for (let i = 1; i <= 12; i++) {\n colors.push(css.getPropertyValue(`--stats-${i}`));\n }\n return colors;\n }\n}", "export class ChartOptions {\n static defaultOptions = {\n plugins: {\n customCanvasBackgroundColor: {\n color: \"transparent\",\n }\n },\n animation: {\n duration: 0\n },\n hover: {\n animationDuration: 0,\n },\n responsiveAnimationDuration: 0,\n devicePixelRatio: 2,\n };\n static noGridOptions = {\n scales: {\n x: {\n grid: {\n display: false\n },\n ticks: {\n display: false\n },\n border: {\n display: false\n }\n },\n y: {\n grid: {\n display: false\n },\n ticks: {\n display: false\n },\n border: {\n display: false\n }\n }\n }\n };\n}", "import {Chart, registerables} from \"chart.js\";\nimport {BoxPlotChart} from \"@sgratzl/chartjs-chart-boxplot\";\nimport {create, HtmlPropertyValue} from \"../../fjsc/src/f2.ts\";\nimport {Colors} from \"../Classes/Colors.ts\";\nimport {ChartOptions} from \"../Classes/ChartOptions.ts\";\n\nChart.register(...registerables);\n\nexport const usedColors = Colors.themedList;\n\nexport class StatisticTemplates {\n static donutChart(labels: string[], values: number[], valueTitle: string, title: string, id: string, colors = usedColors) {\n const ctx = create(\"canvas\")\n .classes(\"chart\")\n .id(id)\n .build();\n\n const data = {\n labels: labels,\n datasets: [{\n label: valueTitle,\n data: values,\n backgroundColor: colors,\n hoverOffset: 4\n }]\n };\n\n const config = {\n type: \"doughnut\",\n data: data,\n options: {\n ...ChartOptions.defaultOptions,\n ...ChartOptions.noGridOptions\n }\n };\n\n new Chart(ctx, config);\n\n return create(\"div\")\n .classes(\"chart-container\", \"card\", \"flex-v\")\n .children(\n create(\"h4\")\n .classes(\"chart-title\")\n .text(title)\n .build(),\n ctx,\n ).build();\n }\n\n static barChart(labels: string[], values: number[], valueTitle: string, title: string, id: string, colors = usedColors) {\n const ctx = create(\"canvas\")\n .classes(\"chart\")\n .id(id)\n .build();\n\n const data = {\n labels: labels,\n datasets: [{\n label: valueTitle,\n data: values,\n backgroundColor: colors,\n hoverOffset: 4\n }]\n };\n\n const config = {\n type: \"bar\",\n data: data,\n options: ChartOptions.defaultOptions\n };\n\n new Chart(ctx, config);\n\n return create(\"div\")\n .classes(\"chart-container-full\", \"card\", \"flex-v\")\n .children(\n create(\"h4\")\n .classes(\"chart-title\")\n .text(title)\n .build(),\n ctx,\n ).build();\n }\n\n static boxPlotChart(values: number[], title: string, id: string, colors = usedColors) {\n const ctx = create(\"canvas\")\n .classes(\"chart\")\n .id(id)\n .build();\n\n const data = {\n labels: [title],\n datasets: [{\n label: title,\n data: values,\n backgroundColor: colors,\n borderColor: colors,\n hoverOffset: 4\n }]\n };\n\n const config = {\n type: \"boxplot\",\n data: data,\n options: ChartOptions.defaultOptions\n };\n\n new BoxPlotChart(ctx, config);\n\n return create(\"div\")\n .classes(\"chart-container-vertical\", \"card\", \"flex-v\")\n .children(\n ctx,\n ).build();\n }\n\n static noData(title: HtmlPropertyValue) {\n return create(\"div\")\n .classes(\"chart-container\", \"card\", \"flex-v\")\n .children(\n create(\"h4\")\n .classes(\"chart-title\")\n .text(title)\n .build(),\n create(\"div\")\n .classes(\"flex\", \"align-center\", \"chart\")\n .children(\n create(\"span\")\n .text(\"No data yet\")\n .build()\n ).build(),\n ).build();\n }\n\n static playCountByTrackChart(trackNames: string[], playCounts: number[], trackColors = usedColors) {\n if (trackNames.length === 0) {\n return StatisticTemplates.noData(\"Play count by track\");\n }\n return StatisticTemplates.donutChart(trackNames, playCounts, \"Plays\", \"Play count by track\", \"playCountByTrackChart\", trackColors);\n }\n\n static playCountByMonthChart(monthNames: string[], playCounts: number[], trackColors = usedColors) {\n if (monthNames.length === 0) {\n return StatisticTemplates.noData(\"Play count by month\");\n }\n return StatisticTemplates.barChart(monthNames, playCounts, \"Plays\", \"Play count by month\", \"playCountByMonthChart\", [trackColors[0]]);\n }\n\n static likesByTrackChart(trackNames: string[], likeCounts: number[], trackColors = usedColors) {\n if (trackNames.length === 0) {\n return StatisticTemplates.noData(\"Likes by track\");\n }\n return StatisticTemplates.donutChart(trackNames, likeCounts, \"Likes\", \"Likes by track\", \"likesByTrackChart\", trackColors);\n }\n\n static activityByTimeChart(labels: string[], values: number[], title: string) {\n const id = Math.floor(Math.random() * 1000);\n return StatisticTemplates.barChart(labels, values, title, `${title} by time`, `activityByTimeChart-${id}`, usedColors);\n }\n\n static royaltiesByMonthChart(labels: string[], values: number[]) {\n if (labels.length === 0) {\n return StatisticTemplates.noData(\"Royalties by month\");\n }\n return StatisticTemplates.barChart(labels, values, \"Royalties\", \"Royalties by month\", \"royaltiesByMonthChart\", [usedColors[8]]);\n }\n\n static royaltiesByTrackChart(labels: string[], values: number[]) {\n if (labels.length === 0) {\n return StatisticTemplates.noData(\"Royalties by track\");\n }\n return StatisticTemplates.donutChart(labels, values, \"Royalties\", \"Royalties by track\", \"royaltiesByTrackChart\", usedColors);\n }\n}", "import {StatisticTemplates} from \"../Templates/StatisticTemplates.ts\";\nimport {Api} from \"../Api/Api.ts\";\nimport {notify} from \"./Ui.ts\";\nimport {Num} from \"./Helpers/Num.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {compute, signal} from \"../../fjsc/src/signals.ts\";\nimport {getErrorMessage} from \"./Util.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\nimport { Statistic } from \"../Models/Statistic.ts\";\nimport {Permission} from \"../Models/DbModels/lyda/Permission.ts\";\nimport {Permissions} from \"../Enums/Permissions.ts\";\nimport {create, signalMap} from \"../../fjsc/src/f2.ts\";\nimport {TypedStatistic} from \"../Models/TypedStatistic.ts\";\nimport {StatisticsTemplates} from \"../Templates/StatisticsTemplates.ts\";\nimport {ActivityTableName} from \"../Enums/ActivityTableName.ts\";\nimport {TimeResolution} from \"../Enums/TimeResolution.ts\";\n\nexport class StatisticsWrapper {\n static async getStatistics(permissions: Permission[]) {\n let additionalStats = [];\n if (permissions.some(p => p.name === Permissions.canViewLogs)) {\n additionalStats.push(StatisticsWrapper.getActivityByTime());\n }\n\n return [\n await StatisticsWrapper.getPlayCountByMonth(),\n await StatisticsWrapper.getRoyaltiesByMonth(),\n await StatisticsWrapper.getRoyaltiesByTrack(),\n await StatisticsWrapper.getPlayCountByTracks(),\n await StatisticsWrapper.getLikesByTrack(),\n ...additionalStats,\n ];\n }\n\n static async getSingleStat(template: Function, endpoint: string, reverse: boolean = false) {\n const chart = signal(template([], []));\n Api.getAsync(endpoint).then((res) => {\n if (res.code !== 200) {\n notify(getErrorMessage(res), NotificationType.error);\n return;\n }\n if (reverse) {\n res.data.reverse();\n }\n const labels = res.data.map((item: any) => item.label);\n const values = Num.shortenInArray(res.data.map((item: any) => item.value));\n chart.value = template(labels, values);\n });\n return chart;\n }\n\n static getMultipleStats(template: Function, endpoint: string, reverse: boolean = false) {\n const charts = signal([]);\n\n Api.getAsync(endpoint).then((res) => {\n if (res.code !== 200) {\n notify(getErrorMessage(res), NotificationType.error);\n return;\n }\n const data = res.data as TypedStatistic[];\n if (reverse) {\n data.reverse();\n }\n\n let components = [];\n for (const stat of data) {\n const labels = stat.stats.map((item) => item.label);\n const values = Num.shortenInArray(stat.stats.map((item) => item.value));\n components.push(template(labels, values, stat.type));\n }\n charts.value = components;\n });\n\n return create(\"div\")\n .children(\n signalMap(charts, create(\"div\").classes(\"flex\"), (chart: any) => chart),\n ).build();\n }\n\n static async getRoyaltiesByMonth() {\n return StatisticsWrapper.getSingleStat(StatisticTemplates.royaltiesByMonthChart, ApiRoutes.getRoyaltiesByMonth, true);\n }\n\n static async getRoyaltiesByTrack() {\n return StatisticsWrapper.getSingleStat(StatisticTemplates.royaltiesByTrackChart, ApiRoutes.getRoyaltiesByTrack);\n }\n\n static async getPlayCountByTracks() {\n return StatisticsWrapper.getSingleStat(StatisticTemplates.playCountByTrackChart, ApiRoutes.getPlayCountByTrack);\n }\n\n static async getPlayCountByMonth() {\n return StatisticsWrapper.getSingleStat(StatisticTemplates.playCountByMonthChart, ApiRoutes.getPlayCountByMonth, true);\n }\n\n static async getLikesByTrack() {\n return StatisticsWrapper.getSingleStat(StatisticTemplates.likesByTrackChart, ApiRoutes.getLikesByTrack, true);\n }\n\n static getActivityByTime() {\n const types = [ActivityTableName.tracks];\n const params = new URLSearchParams();\n params.append(\"types\", types.join(\",\"));\n params.append(\"resolution\", TimeResolution.hour);\n return StatisticsWrapper.getMultipleStats(StatisticTemplates.activityByTimeChart, ApiRoutes.getActivityByTime + `?` + params.toString());\n }\n}", "import {RoyaltyInfo} from \"../Models/RoyaltyInfo.ts\";\nimport {create, ifjs, nullElement} from \"../../fjsc/src/f2.ts\";\nimport {SelectOption} from \"../../fjsc/src/Types.ts\";\nimport {compute, Signal, signal} from \"../../fjsc/src/signals.ts\";\nimport {RoyaltyMonth} from \"../Models/RoyaltyMonth.ts\";\nimport {FormTemplates} from \"./FormTemplates.ts\";\nimport {FJSC} from \"../../fjsc\";\nimport {notify, Ui} from \"../Classes/Ui.ts\";\nimport {NotificationType} from \"../Enums/NotificationType.ts\";\nimport {Api} from \"../Api/Api.ts\";\nimport {ApiRoutes} from \"../Api/ApiRoutes.ts\";\nimport {getErrorMessage} from \"../Classes/Util.ts\";\nimport {Permissions} from \"../Enums/Permissions.ts\";\nimport {permissions} from \"../state.ts\";\nimport {GenericTemplates} from \"./GenericTemplates.ts\";\nimport {Icons} from \"../Enums/Icons.ts\";\nimport {UserSettings} from \"../Enums/UserSettings.ts\";\nimport {currency} from \"../Classes/Helpers/Num.ts\";\nimport {StatisticTemplates, usedColors} from \"./StatisticTemplates.ts\";\nimport {LogTemplates} from \"./LogTemplates.ts\";\n\nexport class RoyaltyTemplates {\n static artistRoyaltyActions(royaltyInfo: any) {\n const hasPayableRoyalties = royaltyInfo.available && parseFloat(royaltyInfo.available) >= 0.5;\n const paypalMailExistsState = signal(royaltyInfo.paypalMail !== null);\n const visibilityClass = signal(paypalMailExistsState.value ? \"visible\" : \"hidden\");\n const invertVisibilityClass = signal(paypalMailExistsState.value ? \"hidden\" : \"visible\");\n paypalMailExistsState.onUpdate = (exists) => {\n visibilityClass.value = exists ? \"visible\" : \"hidden\";\n invertVisibilityClass.value = exists ? \"hidden\" : \"visible\";\n };\n\n return create(\"div\")\n .classes(\"flex-v\", \"card\")\n .children(\n RoyaltyTemplates.royaltyInfo(royaltyInfo),\n create(\"div\")\n .classes(\"flex\")\n .children(\n ifjs(hasPayableRoyalties, create(\"div\")\n .classes(\"flex\")\n .children(\n GenericTemplates.action(Icons.PAYPAL, \"Set PayPal mail\", \"setPaypalMail\", async () => {\n await Ui.getTextInputModal(\"Set PayPal mail\", \"The account you will receive payments with\", \"\", \"Save\", \"Cancel\", async (address: string) => {\n const res = await Api.postAsync(ApiRoutes.updateUserSetting, {\n key: UserSettings.paypalMail,\n value: address\n });\n if (res.code !== 200) {\n notify(getErrorMessage(res), NotificationType.error);\n return;\n }\n notify(\"PayPal mail set\", NotificationType.success);\n paypalMailExistsState.value = true;\n }, () => {\n }, Icons.PAYPAL);\n }, [], [invertVisibilityClass, \"secondary\"]),\n GenericTemplates.action(Icons.PAYPAL, \"Remove PayPal mail\", \"removePaypalMail\", async () => {\n await Ui.getConfirmationModal(\"Remove PayPal mail\", \"Are you sure you want to remove your paypal mail? You'll have to add it again manually.\", \"Yes\", \"No\", async () => {\n const res = await Api.postAsync(ApiRoutes.updateUserSetting, {\n setting: \"paypalMail\",\n value: \"\"\n });\n if (res.code !== 200) {\n notify(getErrorMessage(res), NotificationType.error);\n return;\n }\n notify(\"PayPal mail removed\", NotificationType.success);\n paypalMailExistsState.value = false;\n }, () => {\n }, Icons.WARNING);\n }, [], [visibilityClass, \"secondary\"]),\n GenericTemplates.action(Icons.PAY, \"Request payment\", \"requestPayment\", async () => {\n const res = await Api.postAsync(ApiRoutes.requestPayment);\n if (res.code !== 200) {\n notify(getErrorMessage(res), NotificationType.error);\n return;\n }\n notify(\"Payment requested\", NotificationType.success);\n }, [], [visibilityClass, \"secondary\"])\n ).build())\n ).build()\n ).build();\n }\n\n static royaltyInfo(royaltyInfo: RoyaltyInfo) {\n return create(\"div\")\n .classes(\"flex\")\n .children(\n create(\"div\")\n .classes(\"card\", \"secondary\", \"flex-v\")\n .children(\n create(\"h1\")\n .text(currency(royaltyInfo.available))\n .title(royaltyInfo.available < 0.5 ? \"You need at least 50ct to request a payment\" : \"\")\n .build(),\n create(\"span\")\n .text(\"Available\")\n .build(),\n ).build(),\n create(\"div\")\n .classes(\"card\", \"secondary\", \"flex-v\")\n .children(\n create(\"h1\")\n .text(currency(royaltyInfo.totalRoyalties))\n .build(),\n create(\"span\")\n .text(\"Total royalties\")\n .build(),\n ).build(),\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"span\")\n .classes(\"royalty-info-text\", \"card\", \"secondary\")\n .text(currency(royaltyInfo.paidTotal) + \" paid out\")\n .build(),\n create(\"span\")\n .classes(\"royalty-info-text\", \"card\", \"secondary\")\n .text(currency(royaltyInfo.meanTrackRoyalty) + \" average track royalty\")\n .build(),\n ).build(),\n create(\"div\")\n .classes(\"flex-v\")\n .children(\n StatisticTemplates.boxPlotChart([royaltyInfo.trackRoyaltyValues], \"Average track royalty\", \"averageTrackRoyaltyChart\", usedColors)\n ).build(),\n ).build();\n }\n\n static royaltyCalculator(royaltyInfo: RoyaltyInfo) {\n const months = royaltyInfo.calculatableMonths.map((m: any) => {\n return {\n id: m.year * 100 + m.month,\n name: m.year + \"-\" + m.month + (m.calculated ? \" (calculated)\" : \"\"),\n };\n });\n const selectedState = signal(months[0]?.id ?? null);\n const selectedMonth = compute(id => royaltyInfo.calculatableMonths.find(m => m.year * 100 + m.month === id), selectedState);\n const hasEarnings = compute(month => month?.hasEarnings ?? false, selectedMonth);\n const isApproved = compute(month => month?.approved ?? false, selectedMonth);\n const earnings = compute(month => currency((month?.earnings ?? 0) / 100), selectedMonth);\n const artistRoyalties = compute(month => currency((month?.artistRoyalties ?? 0) / 100), selectedMonth);\n const trackRoyalties = compute(month => currency((month?.trackRoyalties ?? 0) / 100), selectedMonth);\n\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n RoyaltyTemplates.royaltyActions(months, selectedState, selectedMonth, hasEarnings, isApproved),\n ifjs(hasEarnings, create(\"div\")\n .classes(\"flex-v\")\n .children(\n LogTemplates.signalProperty(\"Earnings\", earnings),\n LogTemplates.signalProperty(\"Artist royalties\", artistRoyalties),\n LogTemplates.signalProperty(\"Track royalties\", trackRoyalties),\n ).build())\n ).build();\n }\n\n private static royaltyActions(months: SelectOption[], selectedState: Signal, selectedMonth: Signal, hasEarnings: Signal, isApproved: Signal) {\n return create(\"div\")\n .classes(\"flex-v\")\n .children(\n create(\"div\")\n .classes(\"flex\", \"align-children\")\n .children(\n FormTemplates.dropDownField(\"Month\", signal(months), selectedState),\n ).build(),\n create(\"div\")\n .classes(\"flex\", \"align-children\")\n .children(\n FJSC.button({\n text: \"Calculate earnings\",\n icon: {icon: \"account_balance\"},\n classes: [\"positive\"],\n onclick: async () => {\n const month = selectedMonth.value;\n if (!month) {\n notify(\"Please select a month\", NotificationType.error);\n return;\n }\n const res = await Api.postAsync(ApiRoutes.calculateEarnings, {\n month: month.month,\n year: month.year,\n });\n if (res.code !== 200) {\n notify(getErrorMessage(res), NotificationType.error);\n return;\n }\n notify(\"Earnings calculated\", NotificationType.success);\n }\n }),\n FJSC.button({\n text: \"Calculate royalties\",\n icon: {icon: \"calculate\"},\n classes: [\"positive\"],\n disabled: compute(has => !has, hasEarnings),\n onclick: async () => {\n const month = selectedMonth.value;\n if (!month) {\n notify(\"Please select a month\", NotificationType.error);\n return;\n }\n const res = await Api.postAsync(ApiRoutes.calculateRoyalties, {\n month: month.month,\n year: month.year,\n });\n if (res.code !== 200) {\n notify(getErrorMessage(res), NotificationType.error);\n return;\n }\n notify(\"Royalties calculated\", NotificationType.success);\n }\n }),\n FJSC.toggle({\n text: \"Approve monthly earnings\",\n checked: isApproved,\n onchange: async (v) => {\n const month = selectedMonth.value;\n if (!month) {\n notify(\"Please select a month\", NotificationType.error);\n return;\n }\n await Api.postAsync(ApiRoutes.setRoyaltyActivation, {\n month: month.month,\n year: month.year,\n approved: v,\n });\n notify(\"Switched approval status\", NotificationType.success);\n }\n })\n ).build(),\n ).build();\n }\n\n static royaltyOverview(royaltyInfo: RoyaltyInfo) {\n if (!royaltyInfo.calculatableMonths) {\n return nullElement();\n }\n\n const canCalculateRoyalties = compute(p => p.some(p => p.name === Permissions.canCalculateRoyalties), permissions);\n\n return create(\"div\")\n .children(\n ifjs(canCalculateRoyalties, create(\"div\")\n .classes(\"card\", \"flex-v\")\n .children(\n create(\"h2\")\n .text(\"Royalty overview\")\n .build(),\n RoyaltyTemplates.royaltyCalculator(royaltyInfo)\n ).build())\n ).build();\n }\n}", "import {PlayManager} from \"./Streaming/PlayManager.ts\";\nimport {UserTemplates} from \"./Templates/UserTemplates.ts\";\nimport {SettingsTemplates} from \"./Templates/SettingsTemplates.ts\";\nimport {TrackEditTemplates} from \"./Templates/TrackEditTemplates.ts\";\nimport {TrackTemplates} from \"./Templates/TrackTemplates.ts\";\nimport {ProfilePage} from \"./Classes/ProfilePage.ts\";\nimport {AlbumTemplates} from \"./Templates/AlbumTemplates.ts\";\nimport {PlaylistTemplates} from \"./Templates/PlaylistTemplates.ts\";\nimport {LibraryActions} from \"./Actions/LibraryActions.ts\";\nimport {Api} from \"./Api/Api.ts\";\nimport {StatisticTemplates} from \"./Templates/StatisticTemplates.ts\";\nimport {LogTemplates} from \"./Templates/LogTemplates.ts\";\nimport {Permissions} from \"./Enums/Permissions.ts\";\nimport {LydaApi} from \"./Api/LydaApi.ts\";\nimport {TrackActions} from \"./Actions/TrackActions.ts\";\nimport {CommentActions} from \"./Actions/CommentActions.ts\";\nimport {CommentTemplates} from \"./Templates/CommentTemplates.ts\";\nimport {SubscriptionTemplates} from \"./Templates/SubscriptionTemplates.ts\";\nimport {SubscriptionActions} from \"./Actions/SubscriptionActions.ts\";\nimport {Util} from \"./Classes/Util.ts\";\nimport {StatisticsWrapper} from \"./Classes/StatisticsWrapper.ts\";\nimport {notify} from \"./Classes/Ui.ts\";\nimport {navigate} from \"./Routing/Router.ts\";\nimport {Permission} from \"./Models/DbModels/lyda/Permission.ts\";\nimport {Follow} from \"./Models/DbModels/lyda/Follow.ts\";\nimport {AnyElement, create, ifjs} from \"../fjsc/src/f2.ts\";\nimport {User} from \"./Models/DbModels/lyda/User.ts\";\nimport {ApiRoutes} from \"./Api/ApiRoutes.ts\";\nimport {signal} from \"../fjsc/src/signals.ts\";\nimport {Track} from \"./Models/DbModels/lyda/Track.ts\";\nimport {LogLevel} from \"./Enums/LogLevel.ts\";\nimport {Log} from \"./Models/DbModels/lyda/Log.ts\";\nimport {NotificationType} from \"./Enums/NotificationType.ts\";\nimport {AvailableSubscription} from \"./Models/DbModels/finance/AvailableSubscription.ts\";\nimport {Subscription} from \"./Models/DbModels/finance/Subscription.ts\";\nimport {currentSecretCode, currentUser, permissions} from \"./state.ts\";\nimport {RoyaltyInfo} from \"./Models/RoyaltyInfo.ts\";\nimport {RoyaltyTemplates} from \"./Templates/RoyaltyTemplates.ts\";\n\nexport class Lyda {\n static async getEndpointData(endpoint: string, params = \"\") {\n let r = await Api.getAsync(endpoint + params);\n if (r.code !== 200) {\n console.error(\"Failed to fetch from endpoint \" + endpoint + \", status: \" + r.code);\n return {\n error: \"Failed to fetch from endpoint \" + endpoint + \", status: \" + r.code,\n status: r.code\n };\n }\n return r.data;\n }\n\n static async initPage(params: any) {\n let elements = document.querySelectorAll(\"[lyda]\") as NodeListOf;\n for (let element of elements) {\n await Lyda.loadPagePart(element, params);\n }\n }\n\n static async loadPagePart(element: AnyElement, params: any) {\n const endpoint = element.getAttribute(\"endpoint\");\n const neededParams = element.getAttribute(\"params\");\n let paramsString = \"\";\n if (neededParams) {\n for (let param of neededParams.split(\",\")) {\n paramsString += `&${param}=${params[param]}`;\n }\n paramsString = paramsString.substring(1);\n paramsString = `?${paramsString}`;\n }\n let data;\n if (endpoint !== null) {\n data = await Lyda.getEndpointData(endpoint, paramsString);\n }\n const user = currentUser.value;\n\n switch (element.getAttribute(\"datatype\")) {\n case \"uploadForm\":\n // @ts-ignore\n element.appendChild(TrackEditTemplates.uploadForm());\n break;\n case \"tracks\":\n const feedType = element.getAttribute(\"feedType\");\n if (!user && feedType !== \"explore\") {\n notify(\"You need to be logged in to see your feed\", NotificationType.error);\n return;\n }\n if (!feedType) {\n throw new Error(\"Missing feed type\");\n }\n this.loadFeed(feedType, element).then();\n if (data && data.error) {\n element.innerHTML = data.error;\n return;\n }\n break;\n case \"profile\":\n if (!data || data.error) {\n navigate(\"404\");\n return;\n }\n document.title = data.displayname;\n const isOwnProfile = user ? data.id === user.id : false;\n if (!user && isOwnProfile) {\n notify(\"You need to be logged in to see your profile\", NotificationType.error);\n return;\n }\n element.append(...UserTemplates.profile(isOwnProfile, data, permissions.value));\n ProfilePage.addTabSectionAsync(element, data, isOwnProfile).then();\n break;\n case \"track\":\n if (data.error) {\n notify(data.error, NotificationType.error);\n return;\n }\n document.title = data.track.title;\n currentSecretCode.value = params.code;\n await PlayManager.cacheTrackData(data);\n const trackPage = await TrackTemplates.trackPage(data);\n if (!trackPage) {\n return;\n }\n element.appendChild(trackPage);\n if (data.error) {\n element.innerHTML = data.error;\n return;\n }\n break;\n case \"album\":\n if (!user) {\n navigate(\"explore\");\n return;\n }\n document.title = data.album.title;\n element.appendChild(await AlbumTemplates.albumPage(data, user));\n if (data.error) {\n element.innerHTML = data.error;\n return;\n }\n break;\n case \"playlist\":\n if (!user) {\n navigate(\"explore\");\n return;\n }\n document.title = data.playlist.title;\n element.appendChild(await PlaylistTemplates.playlistPage(data, user));\n if (data.error) {\n element.innerHTML = data.error;\n return;\n }\n break;\n case \"statistics\":\n if (!user) {\n navigate(\"explore\");\n return;\n }\n const royaltyInfo = await Api.getAsync(ApiRoutes.getRoyaltyInfo);\n element.append(RoyaltyTemplates.artistRoyaltyActions(royaltyInfo.data));\n element.append(RoyaltyTemplates.royaltyOverview(royaltyInfo.data));\n element.append(create(\"div\").classes(\"flex\").children(...(await StatisticsWrapper.getStatistics(permissions.value))).build());\n break;\n case \"library\":\n if (!user) {\n notify(\"You need to be logged in to view your library\", NotificationType.error);\n navigate(\"login\");\n return;\n }\n const name = params.name ?? \"\";\n document.title = \"Library - \" + name;\n const library = await LibraryActions.getLibrary(name);\n if (!library) {\n element.appendChild(UserTemplates.notPublicLibrary(name));\n return;\n }\n const page = UserTemplates.libraryPage(library.albums, library.playlists, library.tracks, user);\n element.appendChild(page);\n break;\n case \"logs\":\n if (!permissions.value.some((p: Permission) => p.name === Permissions.canViewLogs)) {\n notify(\"You do not have permission to view logs\", NotificationType.error);\n navigate(\"profile\");\n return;\n }\n element.appendChild(LogTemplates.logsPage());\n break;\n case \"actionLogs\":\n if (!user) {\n notify(\"You need to be logged in to see action logs\", NotificationType.error);\n return;\n }\n if (!permissions.value.some(p => p.name === Permissions.canViewActionLogs)) {\n notify(\"You do not have permission to view action logs\", NotificationType.error);\n return;\n }\n const actionLogs = await Api.getAsync(ApiRoutes.getActionLogs);\n element.appendChild(await LogTemplates.actionLogs(user, actionLogs.data));\n break;\n case \"unapprovedTracks\":\n if (!user) {\n notify(\"You need to be logged in to see unapproved tracks\", NotificationType.error);\n navigate(\"login\");\n return;\n }\n TrackActions.getUnapprovedTracks().then(tracks => {\n element.appendChild(TrackTemplates.unapprovedTracks(tracks, user));\n });\n break;\n case \"moderation\":\n if (!user) {\n notify(\"You need to be logged in to moderate\", NotificationType.error);\n navigate(\"login\");\n return;\n }\n if (!permissions.value.some(p => p.name === Permissions.canDeleteComments)) {\n notify(\"You do not have permission to moderate\", NotificationType.error);\n return;\n }\n element.appendChild(await CommentTemplates.moderatableCommentsPage());\n break;\n case \"subscribe\":\n if (!user) {\n notify(\"You can only subscribe if you have an account already\", NotificationType.warning);\n navigate(\"login\");\n return;\n }\n const options = signal([]);\n const currentSubscription = signal(null);\n SubscriptionActions.loadSubscriptionOptions().then(res => {\n if (!res || res.error) {\n notify(\"Failed to load subscription options\", NotificationType.error);\n return;\n }\n options.value = res.options;\n currentSubscription.value = res.currentSubscription;\n });\n const currency = \"USD\";\n element.appendChild(SubscriptionTemplates.page(currency, options, currentSubscription));\n break;\n default:\n element.innerHTML = JSON.stringify(data, null, 2);\n break;\n }\n }\n\n static async loadFeed(type: string, element: AnyElement) {\n const feedMap = {\n following: ApiRoutes.followingFeed,\n explore: ApiRoutes.exploreFeed,\n autoQueue: ApiRoutes.autoQueueFeed,\n };\n const endpoint = feedMap[type as keyof typeof feedMap];\n const pageState = signal(1);\n const tracksState = signal([]);\n const filterState = signal(\"all\");\n const loadingState = signal(false);\n const pageSize = 10;\n const update = async () => {\n const pageNumber = pageState.value;\n const filter = filterState.value;\n const offset = (pageNumber - 1) * pageSize;\n const params = type === \"following\" ? {offset, filter} : {offset};\n loadingState.value = true;\n const res = await Api.getAsync(endpoint, params);\n if (res.code !== 200) {\n notify(`Failed to get tracks: ${res.data.error}`, NotificationType.error);\n loadingState.value = false;\n return;\n }\n const newTracks = res.data as Track[];\n if (newTracks && newTracks.length === 0 && pageNumber > 1) {\n pageState.value -= 1;\n loadingState.value = false;\n return;\n }\n tracksState.value = newTracks;\n loadingState.value = false;\n };\n pageState.onUpdate = update;\n filterState.onUpdate = update;\n element.appendChild(await TrackTemplates.trackList(tracksState, pageState, type, filterState, loadingState));\n pageState.value = 1;\n }\n}", "import {Route} from \"./Router.ts\";\n\nexport const routes: Route[] = [\n {\n path: \"explore\",\n title: \"Explore\",\n aliases: [\"discover\", \"home\", \"app\", \"/\"]\n },\n {\n path: \"404\",\n title: \"404\",\n aliases: [\"error\", \"not-found\"]\n },\n {\n path: \"profile\",\n title: \"Profile\",\n params: [\"name\"],\n aliases: [\"user\"]\n },\n {\n path: \"following\",\n title: \"Following\",\n },\n {\n path: \"roadmap\",\n title: \"Roadmap\",\n },\n {\n path: \"album\",\n title: \"Album\",\n params: [\"id\"]\n },\n {\n path: \"playlist\",\n title: \"Playlist\",\n params: [\"id\"]\n },\n {\n path: \"track\",\n title: \"Track\",\n params: [\"id\", \"code\"]\n },\n {\n path: \"settings\",\n title: \"Settings\",\n },\n {\n path: \"statistics\",\n title: \"Statistics\",\n },\n {\n path: \"search\",\n title: \"Search\",\n params: [\"q\"]\n },\n {\n path: \"upload\",\n title: \"Upload\",\n },\n {\n path: \"library\",\n title: \"Library\",\n params: [\"name\"]\n },\n {\n path: \"logout\",\n title: \"Logout\",\n },\n {\n path: \"login\",\n title: \"Login\",\n },\n {\n path: \"logs\",\n title: \"Logs\",\n },\n {\n path: \"action-logs\",\n title: \"Action Logs\",\n },\n {\n path: \"unapproved-tracks\",\n title: \"Unapproved Tracks\",\n },\n {\n path: \"moderation\",\n title: \"Moderation\",\n },\n {\n path: \"test\",\n title: \"Test\",\n },\n {\n path: \"subscribe\",\n title: \"Subscribe\",\n },\n {\n path: \"password-reset\",\n title: \"Password Reset\",\n },\n {\n path: \"verify-email\",\n title: \"Verify Email\",\n }\n];", "import {navigate, Route, Router} from \"./js/Routing/Router.ts\";\nimport {PageTemplates} from \"./js/Templates/PageTemplates.ts\";\nimport {KeyBinds} from \"./js/Classes/KeyBindHandler.ts\";\nimport {LydaCache} from \"./js/Cache/LydaCache.ts\";\nimport {PlayManager} from \"./js/Streaming/PlayManager.ts\";\nimport {Lyda} from \"./js/lyda.ts\";\nimport {UiActions} from \"./js/Actions/UiActions.ts\";\nimport {Ui} from \"./js/Classes/Ui.ts\";\nimport {Util} from \"./js/Classes/Util.ts\";\nimport {routes} from \"./js/Routing/routes.js\";\nimport {GenericTemplates} from \"./js/Templates/GenericTemplates.ts\";\nimport {currentTrackId, currentTrackPosition, currentUser, permissions} from \"./js/state.ts\";\nimport {StreamingBroadcaster} from \"./js/Streaming/StreamingBroadcaster.ts\";\nimport {TrackPosition} from \"./js/Models/TrackPosition.ts\";\nimport {Api} from \"./js/Api/Api.ts\";\nimport {Permission} from \"./js/Models/DbModels/lyda/Permission.ts\";\nimport {ApiRoutes} from \"./js/Api/ApiRoutes.ts\";\n\n//LydaCache.clear();\nlet pageContainer = document.querySelector(\".page-container\");\nif (!pageContainer) {\n throw new Error(\"No page container found\");\n}\npageContainer.appendChild(GenericTemplates.loadingSpinner());\ncurrentUser.value = await Util.getUserAsync(null, false);\n\nexport const router = new Router(routes, async (route: Route, params: any) => {\n const page = route.path.replace(\"/\", \"\");\n console.log(`Navigating to ${page} with params`, params);\n\n await Ui.windowResize();\n\n currentUser.value = await Util.getUserAsync(null, false);\n pageContainer.innerHTML = \"\";\n let template = PageTemplates.mapping[page]();\n if (!currentUser.value && PageTemplates.needLoginPages.includes(page)) {\n navigate(\"login\");\n }\n pageContainer.appendChild(template);\n pageContainer.scrollIntoView();\n\n Ui.loadTheme().then();\n await Lyda.initPage(params);\n}, () => {}, () => {\n console.log(window.location.pathname);\n setTimeout(() => {\n console.log(\"No route found, attempting to redirect to profile\");\n const path = window.location.pathname;\n navigate(\"profile\" + path);\n }, 100);\n});\n\nif (currentUser.value) {\n Api.getAsync(ApiRoutes.userPermissions).then(res => {\n if (res.code !== 200) {\n console.error(\"Failed to get permissions: \", res.data);\n return;\n }\n permissions.value = res.data as Permission[];\n });\n\n const currentTrackPositionTmp = LydaCache.get(\"currentTrackPosition\").content;\n if (currentTrackPositionTmp) {\n currentTrackPosition.value = currentTrackPositionTmp;\n }\n\n const currentTrackIdTmp = LydaCache.get(\"currentTrackId\").content;\n if (currentTrackIdTmp) {\n currentTrackId.value = currentTrackIdTmp;\n await PlayManager.initializeTrackAsync(currentTrackIdTmp);\n await PlayManager.stopAllAsync();\n }\n}\n\nKeyBinds.initiate();\nUiActions.runMobileCheck();\nStreamingBroadcaster.initializeReceiver();" ], "mappings": "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", "debugId": "753728956B0C990A64756E2164756E21", "names": [] }