{"version":3,"file":"esnext.min.js","sources":["js/i18n/datepicker/jquery.ui.datepicker-nl.js","js/lib/gettext.js","js/i18n/nl.js","js/lib/polyfills/url-search-params.js","js/lib/text-utils.js","js/lib/errors.js","js/lib/tokens.js","js/lib/baby-lisp.js","js/lib/lenses.js","js/lib/functional.js","js/lib/baby-lisp-apply.js","js/lib/booleanbucket.js","js/lib/mode.js","js/lib/collect-values.js","js/lib/vars.js","js/lib/case-exit.js","js/lib/a11y-user-detect.js","js/lib/a11y.js","js/lib/escape.js","js/lib/notify.js","js/lib/conf.js","js/lib/location.js","js/lib/ajax.js","js/lib/settled.js","js/lib/bbi.js","js/lib/control-helpers.js","js/lib/quotable.js","js/lib/dates.js","js/lib/feature-queries.js","js/lib/form-widgets.js","js/lib/dynprops.js","js/lib/hooks.js","js/lib/control.js","js/lib/types.js","js/lib/control-validation.js","js/lib/groupings.js","js/lib/font-classes.js","js/lib/names.js","js/lib/form-groups.js","node_modules/lit-html/lit-html.js","node_modules/@lit/reactive-element/css-tag.js","node_modules/@lit/reactive-element/reactive-element.js","node_modules/lit-element/lit-element.js","node_modules/@cahmoraes93/maybe/dist/index.js","js/lib/numerals.js","js/lib/url-utils.js","js/lib/form-widgets-definitions.js","js/lib/utils.js","js/lib/jumplist.js","js/lib/user-info.js","js/lib/permissions.js","js/json.js","js/lib/$.scrollTo.js","plugins/Dialogue/Dialogue.js","plugins/a11y-describedby/a11y-describedby.js","js/lib/getmetadata.js","js/lib/store.js","node_modules/proxy-polyfill/proxy.min.js","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/auto/auto.js","custom/rijks-ics/plugins/cogs/cogs.js","custom/rijks-ics/plugins/continuelink/continuelink.js","plugins/custom-radios/custom-radios.js","node_modules/print-js/dist/print.js","plugins/end-tools/end-tools.js","custom/rijks-ics/plugins/headings/headings.js","plugins/history/history.js","plugins/showdown/showdown.js","plugins/showdown-converter/showdown-converter.js","plugins/md-labels/md-labels.js","plugins/metadata-change-navtext/metadata-change-navtext.js","plugins/metadata-scoring/metadata-scoring.js","node_modules/ramda/es/internal/_isPlaceholder.js","node_modules/ramda/es/internal/_curry1.js","node_modules/ramda/es/internal/_curry2.js","node_modules/ramda/es/internal/_has.js","plugins/metaprogress/metaprogress.js","node_modules/ramda/es/hasPath.js","node_modules/ramda/es/has.js","plugins/mis-click-count/mis-click-count.js","custom/nta/plugins/dynamic-menu-items/clearmenu.js","plugins/mustache/mustache.js","custom/nta/plugins/disclaimer-link/disclaimer-link.js","custom/nta/plugins/dynamic-menu-items/createmenu.js","custom/nta/plugins/dynamic-menu-items/dynamic-menu-items.js","custom/nta/plugins/mopinion/mopinion.js","custom/nta/plugins/proxymap/proxymap.js","custom/nta/plugins/path-to-modelname/path-to-modelname.js","custom/nta/plugins/piwik/piwik.js","custom/nta/plugins/rijksoverheidshuisstijlfonts/rijksoverheidshuisstijlfonts.js","plugins/questionlabelgroup-ng/questionlabelgroup-ng.js"],"sourcesContent":["/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */\n/* Written by Mathias Bynens */\njQuery(function($){\n\t$.datepicker.regional.nl = {\n\t\tcloseText: 'Sluiten',\n\t\tprevText: '←',\n\t\tnextText: '→',\n\t\tcurrentText: 'Vandaag',\n\t\tmonthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',\n\t\t'juli', 'augustus', 'september', 'oktober', 'november', 'december'],\n\t\tmonthNamesShort: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun',\n\t\t'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],\n\t\tdayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],\n\t\tdayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],\n\t\tdayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n\t\tweekHeader: 'Wk',\n\t\tdateFormat: 'dd-mm-yy',\n\t\tfirstDay: 1,\n\t\tisRTL: false,\n\t\tshowMonthAfterYear: false,\n\t\tyearSuffix: ''};\n\t$.datepicker.setDefaults($.datepicker.regional.nl);\n});\n","/******* Translations ******/\n\nconst dicts = {};\n\nlet dict = {};\n\n// gettext stub\nfunction _(s, fb) {\n return dict[s] || fb || s;\n}\n\n_.tagged = (strings, ...values) =>\n strings.reduce((acc, cur, idx) => acc + cur + _(values[idx] || \"\"), \"\");\n\n_.taggedWithin =\n prefix =>\n (strings, ...values) =>\n strings.reduce(\n (acc, cur, idx) =>\n acc +\n cur +\n (_(prefix, { [values[idx]]: values[idx] })[values[idx]] ||\n values[idx] ||\n \"\"),\n \"\"\n );\n\n_.set = function (ob) {\n const lang = ob[\"lang\"] || _(\"lang\"); // Either provided or current lang?\n if (!dicts[lang]) {\n dicts[lang] = {};\n }\n for (let [key, val] of Object.entries(ob)) {\n // Set only if not set before (by _.set, or by _.addTranslations)\n dicts[lang][key] || (dicts[lang][key] = val);\n }\n dict = dicts[lang];\n};\n\n_.addTranslations = function (translations) {\n for (var term in translations) {\n if (translations.hasOwnProperty(term))\n for (var lang in translations[term]) {\n if (!dicts[lang]) dicts[lang] = {};\n // Always override what has been set before\n dicts[lang][term] = translations[term][lang];\n }\n }\n};\n\nObject.freeze(_);\n\nexport { _ };\n","import { _ } from \"$json/lib/gettext\";\n\nconst strings = {\n \"lang\": \"nl\",\n \"Doubleclick to go back to this question\":\n \"Dubbelklikken om naar deze vraag terug te springen\",\n \"create a new case\": \"maak een nieuwe casus aan\",\n \"new\": \"nieuw\",\n \"Delete\": \"Verwijder\",\n \"case\": \"casus\",\n \"cases\": \"casus\",\n \"Last opened\": \"Laatst geopend\",\n \"created\": \"gemaakt\",\n \"report\": \"rapport\",\n \"Sun\": \"Zo\",\n \"Mon\": \"Ma\",\n \"Tue\": \"Di\",\n \"Wed\": \"Wo\",\n \"Thu\": \"Do\",\n \"Fri\": \"Vr\",\n \"Sat\": \"Za\",\n \"Jan\": \"Jan\",\n \"Feb\": \"Feb\",\n \"Mar\": \"Maart\",\n \"Apr\": \"April\",\n \"May\": \"Mei\",\n \"June\": \"Juni\",\n \"July\": \"Juli\",\n \"Aug\": \"Aug\",\n \"Sep\": \"Sep\",\n \"Oct\": \"Okt\",\n \"Nov\": \"Nov\",\n \"Dec\": \"Dec\",\n \"press enter to accept\": \"accepteer met ENTER\",\n \"filter cases by name\": \"zoek casus op naam\",\n \"field--value\": \"deze waarde\",\n \"field--date\": \"deze datum\",\n \"field--field\": \"dit veld\",\n \"field--list\": \"deze opties\",\n \"quoted--value\": \"de waarde “{quotable}”\",\n \"quoted--date\": \"de datum “{quotable}”\",\n \"quoted--field\": \"het veld “{quotable}”\",\n \"quoted--list\": \"de opties in “{quotable}”\",\n \"Date required\":\n \"{quotable--init} is verplicht; gebruik het formaat dd - mm - j j j j.\",\n \"Input required\": \"{quotable--init} is verplicht\",\n \"Choice required\": \"Keuze uit {quotable} is verplicht\",\n \"Field required\": \"{quotable--init} is verplicht\",\n \"Value has to lie between {minimum} and {maximum}\":\n \"{quotable--init} moet tussen {minimum} en {maximum} liggen\",\n \"Date has to lie between {minimum} and {maximum}\":\n \"{quotable--init} moet tussen {minimum} en {maximum} liggen; gebruik het formaat dd-mm-jjjj.\",\n \"Negative number or zero expected\":\n \"{quotable--init} moet negatief zijn of nul\",\n \"Negative number expected\": \"{quotable--init} moet negatief zijn\",\n \"Value has to lie below {maximum}\":\n \"{quotable--init} moet lager zijn dan {maximum+1}\",\n \"Positive number or zero expected\": \"{quotable} moet positief zijn of nul\",\n \"Positive number expected\": \"{quotable} moet hoger zijn dan nul\",\n \"Value has to lie above {minimum}\":\n \"{quotable--init} moet hoger zijn dan {minimum-1}\",\n \"A date after {maximum} is not allowed\":\n \"{quotable--init} ná {maximum} is niet toegestaan; gebruik het formaat dd-mm-jjjj.\",\n \"A date before {minimum} is not allowed\":\n \"{quotable--init} vóór {minimum} is niet toegestaan; gebruik het formaat dd-mm-jjjj.\",\n \"Invalid date\":\n \"{quotable--init} is ongeldig; gebruik het formaat dd-mm-jjjj.\",\n \"Invalid number\": \"{quotable--init} is geen getal\",\n \"Text length exceeds the maximum of {maxlength} characters\":\n \"{quotable--init} mag maximaal {maxlength} karakters bevatten\",\n \"click for more...\": \"klik voor meer...\",\n \" (click to open link)\": \" (klik om link te openen)\",\n \"Are you sure? This will reset all values.\":\n \"Weet u het zeker? Dit zal alle ingevulde velden leegmaken.\",\n \"Yesterday\": \"Gisteren\",\n \"No valid session\": \"Ongeldige gebruikersnaam of wachtwoord\",\n \"Maximum allowed characters: {0}\": \"Maximaal {0} karakters toegestaan\",\n \"No interfaces to show\":\n \"Geen zichtbare elementen (vragen, tekstvelden) gedefinieerd\",\n // feedback\n \"Feedback\": \"Feedback\",\n \"describe the problem\": \"omschrijf het probleem\",\n \"Please do not collate issues.\": \"Een melding per keer!\",\n \"Please send only feedback about the currently visible question or questions; information about these will be sent back to the developers.\":\n \"Geef alleen feedback over de vraag of vragen die je op dit moment op je scherm ziet; informatie over die vragen wordt namelijk meegezonden naar de ontwikkelaars.\",\n \"send\": \"verstuur\",\n \"Thanks for your feedback!\": \"Bedankt voor uw melding!\",\n \"Interface has failed (probably a failing SOAP or database connection)\":\n \"Interface gefaald (waarschijnlijk een falende SOAP- of databasekoppeling)\",\n \"Choose...\": \"Kies...\",\n \"Choose or type...\": \"Kies of typ...\",\n \"cUMWrongUserNamePassword\": \"Ongeldige gebruikersnaam of wachtwoord\",\n \"cWebCaseIsRunning\":\n \"Casus laden is niet gelukt; deze casus wordt al gedraaid in een andere sessie\",\n \"The model you are trying to open does not exist\":\n \"Het beslismodel dat u probeert te openen bestaat niet\",\n \"cWebIllegalAccess\": \"Je mag deze casus niet starten of openen.\",\n \"You may now safely close this window\": \"U kunt het venster nu sluiten\",\n \"user name\": \"gebruikersnaam\",\n \"password\": \"wachtwoord\",\n \"Your models\": \"Uw modellen\",\n \"Your sessions\": \"Uw sessies\",\n \"log in\": \"inloggen\",\n \"load session\": \"Lees uw gegevens in\",\n \"load\": \"inlezen\",\n \"Choose the session file you saved earlier\":\n \"Kies het gegevensbestand dat u de vorige keer hebt opgeslagen\",\n \"Error loading session (wrong data)\":\n \"Inlezen gegevens mislukt (verkeerde gegevens).\",\n \"Please login\": \"Gelieve in te loggen\",\n \"open\": \"open\",\n \"copy\": \"kopie\",\n 'You have no tickets left for model \"{0}\"':\n 'Uw strippenkaart voor model \"{0}\" is op',\n \"__digitgroupingchar__\": \".\",\n \"__radixpoint__\": \",\",\n \"__digitgroupingrules__\": [3],\n \"attachments\": \"bijlagen\",\n \"your documents\": \"uw documenten\",\n \"saved sessions\": \"bewaarde sessies\",\n \"We are currently updating. Please try again later.\":\n \"Er is momenteel een update aan de gang, probeert u het binnenkort nogmaals.\",\n \"case name\": \"casusnaam\",\n \"dateplaceholder\": \"dd - mm - j j j j\",\n \"Error: No response from server, server probably down\":\n \"Fout: Server is tijdelijk buiten gebruik. U moet zich opnieuw aanmelden.\",\n \"Session has timed out. Please log in again.\":\n \"De sessie is afgelopen. U moet zich opnieuw aanmelden.\",\n \"first {0} results\": \"eerste {0} resultaten\",\n \"previous {0} results\": \"vorige {0} resultaten\",\n \"next {0} results\": \"volgende {0} resultaten\",\n \"last {0} results\": \"laatste {0} resultaten\",\n \"results {0} to {1} from {2}\": \"resultaten {0} tot {1} van {2}\",\n \"add row\": \"Voeg rij toe\",\n \"insert row\": \"voeg rij in\",\n \"delete row\": \"verwijder rij\",\n \"There are errors, please double check your answers.\":\n \"Er zijn nog fouten, gelieve uw antwoorden nogmaals na te gaan.\",\n \"cancel\": \"annuleer\",\n \"Something went wrong; see the server log for more information.\":\n \"Er is iets misgegaan; bekijk de server log voor meer informatie\"\n};\n\n_.set(strings);\n\nexport { strings };\n","/*! (c) Andrea Giammarchi - ISC */\nvar self = window || /* istanbul ignore next */ {};\ntry {\n (function (URLSearchParams, plus) {\n if (\n new URLSearchParams(\"q=%2B\").get(\"q\") !== plus ||\n new URLSearchParams({ q: plus }).get(\"q\") !== plus ||\n new URLSearchParams([[\"q\", plus]]).get(\"q\") !== plus ||\n new URLSearchParams(\"q=\\n\").toString() !== \"q=%0A\" ||\n new URLSearchParams({ q: \" &\" }).toString() !== \"q=+%26\" ||\n new URLSearchParams({ q: \"%zx\" }).toString() !== \"q=%25zx\"\n )\n throw URLSearchParams;\n self.URLSearchParams = URLSearchParams;\n })(URLSearchParams, \"+\");\n} catch (URLSearchParams) {\n (function (Object, String, isArray) {\n \"use strict\";\n var create = Object.create;\n var defineProperty = Object.defineProperty;\n var find = /[!'\\(\\)~]|%20|%00/g;\n var findPercentSign = /%(?![0-9a-fA-F]{2})/g;\n var plus = /\\+/g;\n var replace = {\n \"!\": \"%21\",\n \"'\": \"%27\",\n \"(\": \"%28\",\n \")\": \"%29\",\n \"~\": \"%7E\",\n \"%20\": \"+\",\n \"%00\": \"\\x00\"\n };\n var proto = {\n append: function (key, value) {\n appendTo(this._ungap, key, value);\n },\n delete: function (key) {\n delete this._ungap[key];\n },\n get: function (key) {\n return this.has(key) ? this._ungap[key][0] : null;\n },\n getAll: function (key) {\n return this.has(key) ? this._ungap[key].slice(0) : [];\n },\n has: function (key) {\n return key in this._ungap;\n },\n set: function (key, value) {\n this._ungap[key] = [String(value)];\n },\n forEach: function (callback, thisArg) {\n var self = this;\n for (var key in self._ungap) self._ungap[key].forEach(invoke, key);\n function invoke(value) {\n callback.call(thisArg, value, String(key), self);\n }\n },\n toJSON: function () {\n return {};\n },\n toString: function () {\n var query = [];\n for (var key in this._ungap) {\n var encoded = encode(key);\n for (var i = 0, value = this._ungap[key]; i < value.length; i++) {\n query.push(encoded + \"=\" + encode(value[i]));\n }\n }\n return query.join(\"&\");\n }\n };\n for (var key in proto)\n defineProperty(URLSearchParams.prototype, key, {\n configurable: true,\n writable: true,\n value: proto[key]\n });\n self.URLSearchParams = URLSearchParams;\n function URLSearchParams(query) {\n var dict = create(null);\n defineProperty(this, \"_ungap\", { value: dict });\n switch (true) {\n case !query:\n break;\n case typeof query === \"string\":\n if (query.charAt(0) === \"?\") {\n query = query.slice(1);\n }\n for (\n var pairs = query.split(\"&\"), i = 0, length = pairs.length;\n i < length;\n i++\n ) {\n var value = pairs[i];\n var index = value.indexOf(\"=\");\n if (-1 < index) {\n appendTo(\n dict,\n decode(value.slice(0, index)),\n decode(value.slice(index + 1))\n );\n } else if (value.length) {\n appendTo(dict, decode(value), \"\");\n }\n }\n break;\n case isArray(query):\n for (var i = 0, length = query.length; i < length; i++) {\n var value = query[i];\n appendTo(dict, value[0], value[1]);\n }\n break;\n case \"forEach\" in query:\n query.forEach(addEach, dict);\n break;\n default:\n for (var key in query) appendTo(dict, key, query[key]);\n }\n }\n\n function addEach(value, key) {\n appendTo(this, key, value);\n }\n\n function appendTo(dict, key, value) {\n var res = isArray(value) ? value.join(\",\") : value;\n if (key in dict) dict[key].push(res);\n else dict[key] = [res];\n }\n\n function decode(str) {\n return decodeURIComponent(\n str.replace(findPercentSign, \"%25\").replace(plus, \" \")\n );\n }\n\n function encode(str) {\n return encodeURIComponent(str).replace(find, replacer);\n }\n\n function replacer(match) {\n return replace[match];\n }\n })(Object, String, Array.isArray);\n}\n\n(function (URLSearchParamsProto) {\n var iterable = false;\n try {\n iterable = !!Symbol.iterator;\n } catch (o_O) {}\n\n /* istanbul ignore else */\n if (!(\"forEach\" in URLSearchParamsProto)) {\n URLSearchParamsProto.forEach = function forEach(callback, thisArg) {\n var self = this;\n var names = Object.create(null);\n this.toString()\n .replace(/=[\\s\\S]*?(?:&|$)/g, \"=\")\n .split(\"=\")\n .forEach(function (name) {\n if (!name.length || name in names) return;\n (names[name] = self.getAll(name)).forEach(function (value) {\n callback.call(thisArg, value, name, self);\n });\n });\n };\n }\n\n /* istanbul ignore else */\n if (!(\"keys\" in URLSearchParamsProto)) {\n URLSearchParamsProto.keys = function keys() {\n return iterator(this, function (value, key) {\n this.push(key);\n });\n };\n }\n\n /* istanbul ignore else */\n if (!(\"values\" in URLSearchParamsProto)) {\n URLSearchParamsProto.values = function values() {\n return iterator(this, function (value, key) {\n this.push(value);\n });\n };\n }\n\n /* istanbul ignore else */\n if (!(\"entries\" in URLSearchParamsProto)) {\n URLSearchParamsProto.entries = function entries() {\n return iterator(this, function (value, key) {\n this.push([key, value]);\n });\n };\n }\n\n /* istanbul ignore else */\n if (iterable && !(Symbol.iterator in URLSearchParamsProto)) {\n URLSearchParamsProto[Symbol.iterator] = URLSearchParamsProto.entries;\n }\n\n /* istanbul ignore else */\n if (!(\"sort\" in URLSearchParamsProto)) {\n URLSearchParamsProto.sort = function sort() {\n var entries = this.entries(),\n entry = entries.next(),\n done = entry.done,\n keys = [],\n values = Object.create(null),\n i,\n key,\n value;\n while (!done) {\n value = entry.value;\n key = value[0];\n keys.push(key);\n if (!(key in values)) {\n values[key] = [];\n }\n values[key].push(value[1]);\n entry = entries.next();\n done = entry.done;\n }\n // not the champion in efficiency\n // but these two bits just do the job\n keys.sort();\n for (i = 0; i < keys.length; i++) {\n this.delete(keys[i]);\n }\n for (i = 0; i < keys.length; i++) {\n key = keys[i];\n this.append(key, values[key].shift());\n }\n };\n }\n\n function iterator(self, callback) {\n var items = [];\n self.forEach(callback, items);\n return iterable\n ? items[Symbol.iterator]()\n : {\n next: function () {\n var value = items.shift();\n return { done: value === undefined, value: value };\n }\n };\n }\n\n /* istanbul ignore next */\n (function (Object) {\n var dP = Object.defineProperty,\n gOPD = Object.getOwnPropertyDescriptor,\n createSearchParamsPollute = function (search) {\n function append(name, value) {\n URLSearchParamsProto.append.call(this, name, value);\n name = this.toString();\n search.set.call(this._usp, name ? \"?\" + name : \"\");\n }\n function del(name) {\n URLSearchParamsProto.delete.call(this, name);\n name = this.toString();\n search.set.call(this._usp, name ? \"?\" + name : \"\");\n }\n function set(name, value) {\n URLSearchParamsProto.set.call(this, name, value);\n name = this.toString();\n search.set.call(this._usp, name ? \"?\" + name : \"\");\n }\n return function (sp, value) {\n sp.append = append;\n sp.delete = del;\n sp.set = set;\n return dP(sp, \"_usp\", {\n configurable: true,\n writable: true,\n value: value\n });\n };\n },\n createSearchParamsCreate = function (polluteSearchParams) {\n return function (obj, sp) {\n dP(obj, \"_searchParams\", {\n configurable: true,\n writable: true,\n value: polluteSearchParams(sp, obj)\n });\n return sp;\n };\n },\n updateSearchParams = function (sp) {\n var append = sp.append;\n sp.append = URLSearchParamsProto.append;\n URLSearchParams.call(sp, sp._usp.search.slice(1));\n sp.append = append;\n },\n verifySearchParams = function (obj, Class) {\n if (!(obj instanceof Class))\n throw new TypeError(\n \"'searchParams' accessed on an object that \" +\n \"does not implement interface \" +\n Class.name\n );\n },\n upgradeClass = function (Class) {\n var ClassProto = Class.prototype,\n searchParams = gOPD(ClassProto, \"searchParams\"),\n href = gOPD(ClassProto, \"href\"),\n search = gOPD(ClassProto, \"search\"),\n createSearchParams;\n if (!searchParams && search && search.set) {\n createSearchParams = createSearchParamsCreate(\n createSearchParamsPollute(search)\n );\n Object.defineProperties(ClassProto, {\n href: {\n get: function () {\n return href.get.call(this);\n },\n set: function (value) {\n var sp = this._searchParams;\n href.set.call(this, value);\n if (sp) updateSearchParams(sp);\n }\n },\n search: {\n get: function () {\n return search.get.call(this);\n },\n set: function (value) {\n var sp = this._searchParams;\n search.set.call(this, value);\n if (sp) updateSearchParams(sp);\n }\n },\n searchParams: {\n get: function () {\n verifySearchParams(this, Class);\n return (\n this._searchParams ||\n createSearchParams(\n this,\n new URLSearchParams(this.search.slice(1))\n )\n );\n },\n set: function (sp) {\n verifySearchParams(this, Class);\n createSearchParams(this, sp);\n }\n }\n });\n }\n };\n try {\n upgradeClass(HTMLAnchorElement);\n if (/^function|object$/.test(typeof URL) && URL.prototype)\n upgradeClass(URL);\n } catch (meh) {}\n })(Object);\n})(self.URLSearchParams.prototype, Object);\nexport default self.URLSearchParams;\n","/******* positionalFormat() BEGIN ******/\n\n/* https://github.com/pft/javascript/blob/master/positionalformat.js\n *\n * Copyright (C) 2006-2013 Niels Giesen.\n *\n * Contact: \n *\n * Author: Niels Giesen\n * Keywords: JavaScript, formatting, String\n *\n * This file is dual-licensed under either the BSD license or the\n * GNU Affero General Public License.\n *\n * positionalFormat enables you to replace numbers enclosed in curly braces (C# format\n * apparently) with positional arguments (that can be reused), like\n * this:\n *\n * positionalFormat('argument { 1 } (or is it { 2 }, or { 0 }?) comes { 1 }',3,'first',1)\n *\n * evals to:\n *\n * \"argument first (or is it 1, or 3?) comes first\"\n */\n\nexport function positionalFormat(str) {\n var args = arguments;\n return str.replace(/{\\s*(\\d+)\\s*}/g, function (match, num) {\n return args[parseInt(num) + 1] !== undefined\n ? args[parseInt(num) + 1]\n : match;\n });\n}\n\n/******* positionalFormat() END ******/\n\nexport function format(str, ob = {}) {\n return str.replace(/{\\s*([^{]+?)\\s*}/g, function (match, sub) {\n return ob[sub] !== undefined ? ob[sub] : sub;\n });\n}\n\n// export function formatPlus(str, ob = {}) {\n// return str.replace(/{\\s*([^{]+?)\\s*}/g, function (match, subwithstuff) {\n// const subs = subwithstuff.split(/\\|/);\n// console.log(subs);\n// return subs.reduce((acc, cur) => {\n// if (ob[cur] === undefined) return acc;\n// return ob[cur];\n// }, subs[0]);\n// // if (ob[sub] === undefined) return sub;\n// // if (!directives) return ob[sub] !== undefined ? ob[sub] : sub;\n// // if (\n// // directives.startsWith(\"+\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // if (\n// // directives.startsWith(\"-\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // const [sub, directives] = subwithstuff.split(/\\|/);\n// // if (ob[sub] === undefined) return sub;\n// // if (!directives) return ob[sub] !== undefined ? ob[sub] : sub;\n// // if (\n// // directives.startsWith(\"+\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // if (\n// // directives.startsWith(\"-\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// return ob[sub];\n// });\n// }\n\nexport const formatPlus = format;\n\n// (str, ob = {}) {\n// return str.replace(/{\\s*([^{]+?)\\s*}/g, function (match, subwithstuff) {\n// const subs = subwithstuff.split(/\\|/);\n// console.log(subs);\n// return subs.reduceRight((acc, cur) => {\n// if (ob[cur] === undefined) return acc;\n// return ob[cur];\n// }, subs[0]);\n// // if (ob[sub] === undefined) return sub;\n// // if (!directives) return ob[sub] !== undefined ? ob[sub] : sub;\n// // if (\n// // directives.startsWith(\"+\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // if (\n// // directives.startsWith(\"-\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // const [sub, directives] = subwithstuff.split(/\\|/);\n// // if (ob[sub] === undefined) return sub;\n// // if (!directives) return ob[sub] !== undefined ? ob[sub] : sub;\n// // if (\n// // directives.startsWith(\"+\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // if (\n// // directives.startsWith(\"-\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// return ob[sub];\n// });\n// }\n\n/** Function that count occurrences of a substring in a string;\n * @param {String} subString The sub string to search for\n * @param {String} string The string\n *\n * Based on https://gist.github.com/victornpb/7736865\n */\nexport function occurrences(subString, string) {\n string += \"\";\n subString += \"\";\n if (subString.length <= 0) return string.length + 1;\n\n var n = 0,\n pos = 0,\n step = subString.length;\n\n while (true) {\n pos = string.indexOf(subString, pos);\n if (pos >= 0) {\n ++n;\n pos += step;\n } else break;\n }\n return n;\n}\n","import { positionalFormat } from \"./text-utils.js\";\nimport { _ } from \"./gettext.js\";\n\nconst CODES = {\n cException: 1,\n cHTMLFormLoadCaseNotFound: 2,\n cHTMLMenuFileNotFound: 3,\n cWebModelIDDifferent: 4,\n cWebPleaseLogin: 5,\n cGetFileNotAllowed: 6,\n cGetDocumentNotFound: 7,\n cUMWrongUserNamePassword: 8,\n cWebSessionTimeOut: 9,\n cWebNoModelID: 10,\n cWebIllegalAccess: 11,\n cWebModelNotFound: 12,\n cWebCaseIsRunning: 13,\n cEngineLoadCaseFailed: 14, // Was: 3\n cEngineUpgrading: 15,\n cEngineNoInterfacesToShow: 16,\n cEngineLoadCaseFailedNotFound: 17,\n cEngineLoadCaseFailedWrongType: 18,\n cEngineLoadCaseFailedWrongData: 19,\n cWebOpenIsCalledWithUniqueID: 20,\n cTechGraphVizNotInstalled: 21,\n cGraphVizSessionNotFound: 22,\n cUMUserNotFound: 23,\n cUMModelNotFound: 24,\n cUMCaseNotFound: 25,\n cWebAdminNotAllowed: 26,\n cEngineGotoNodeFailed: 27,\n cPreviewNoCaseFound: 28,\n cTechUploadedFileToLarge: 29,\n cWebSaveCaseNotAllowed: 30,\n cWebSaveCaseFailed: 31,\n cInvalidUpload: 53\n};\n\nconst CODESREV = Object.fromEntries(\n Object.entries(CODES).map(([key, value]) => [value, key])\n);\n\n// Translate error - put translation in message property, return\n// error.\nfunction translate(_error) {\n const error = Object.assign({}, _error);\n // New API\n switch (error.code) {\n case CODES.cException:\n error.message = _(\n \"Something went wrong; see the server log for more information.\"\n );\n break;\n case CODES.cWebSessionTimeOut:\n error.message = _(\"Session has timed out. Please log in again.\");\n break;\n case CODES.cEngineLoadCaseFailed:\n switch (error.subcode) {\n case 1004:\n error.message = positionalFormat(\n _('You have no tickets left for model \"{0}\"'),\n error.summary\n .substring(56, error.summary.length - 1)\n .replace(/_/g, \" \")\n );\n break;\n default:\n error.message = error.summary; // Won't translate for now, may be st. like \"Loading case failed (xxx.mdl)\"\n }\n break;\n case CODES.cEngineLoadCaseFailedWrongData:\n error.message = _(\"Error loading session (wrong data)\");\n break;\n default:\n switch (error.subcode) {\n case 1002:\n error.message = _(\n \"We are currently updating. Please try again later.\"\n );\n break;\n case 1009:\n case 1025:\n error.message = positionalFormat(\n _('Infinite loop detected in {0}\"'),\n // Might be embedded though (in 1 or in 14...)\n error.summary.slice(18, error.summary.indexOf(\", infinite\"))\n );\n break;\n case 1010:\n error.message = _(\n \"Interface has failed (probably a failing SOAP or database connection)\"\n );\n break;\n default:\n error.message = _(CODESREV[error.code], _(error.summary));\n }\n }\n return error;\n}\n\nexport { CODES, translate };\n","let _token;\n\nexport const setToken = token => {\n _token = token;\n};\n\nexport async function digestMessage(message) {\n if (!(\"crypto\" in window)) return null;\n const msgUint8 = new TextEncoder().encode(message); // encode as (utf-8) Uint8Array\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", msgUint8); // hash the message\n const hashArray = Array.from(new Uint8Array(hashBuffer)); // convert buffer to byte array\n const hashHex = hashArray.map(b => b.toString(16).padStart(2, \"0\")).join(\"\"); // convert bytes to hex string\n return hashHex;\n}\n\nexport const tokenChannel =\n \"BroadcastChannel\" in window ? new BroadcastChannel(\"token\") : \"\";\n\nexport const token = {\n addEventListener: (...args) =>\n tokenChannel && tokenChannel.addEventListener(...args),\n removeEventListener: (...args) =>\n tokenChannel && tokenChannel.removeEventListener(...args),\n getHash: () => digestMessage(_token),\n setToken,\n postMessage: message =>\n token.getHash().then(\n tokenHash =>\n // digestMessage will return null on missing crypto on older\n // browsers\n tokenHash &&\n tokenChannel &&\n tokenChannel.postMessage({ tokenHash, ...message })\n )\n};\n","// https://gist.github.com/jameslaneconkling/24acb8ea326a1c8fdf64225aa7d0f44e\nconst rules = [\n { type: \"space\", regex: /^\\s/ },\n { type: \"lParen\", regex: /^\\(/ },\n { type: \"rParen\", regex: /^\\)/ },\n { type: \"number\", regex: /^[0-9.]+/ },\n { type: \"string\", regex: /^\".*?\"/ },\n { type: \"variable\", regex: /^[^\\s()]+/ } // take from the beginning 1+ characters until you hit a ' ', '(', or ')' // TODO - support escaped double quote\n];\n\nconst tokenizer = rules => input => {\n for (let i = 0; i < rules.length; i += 1) {\n let tokenized = rules[i].regex.exec(input);\n if (tokenized) {\n return {\n token: tokenized[0],\n type: rules[i].type,\n rest: input.slice(tokenized[0].length)\n };\n }\n }\n\n throw new Error(`no matching tokenize rule for ${JSON.stringify(input)}`);\n};\n\nconst parser = tokenize =>\n function parse(input, ast, parents = []) {\n if (input === \"\") {\n return ast;\n }\n\n const { token, type, rest } = tokenize(input);\n\n if (type === \"space\") {\n // do nothing\n return parse(rest, ast, parents);\n } else if (type === \"variable\") {\n ast.push(token);\n return parse(rest, ast, parents);\n } else if (type === \"number\") {\n ast.push(Number(token));\n return parse(rest, ast, parents);\n } else if (type === \"string\") {\n ast.push(token.replace(/(^\"|\"$)/g, \"'\"));\n return parse(rest, ast, parents);\n } else if (type === \"lParen\") {\n parents.push(ast);\n return parse(rest, [], parents);\n } else if (type === \"rParen\") {\n const parentAst = parents.pop();\n if (parentAst) {\n parentAst.push(ast);\n return parse(rest, parentAst, parents);\n }\n\n return parse(rest, ast, parents);\n }\n\n throw new Error(`Missing parse logic for rule ${JSON.stringify(type)}`);\n };\n\nexport default parser(tokenizer(rules));\n","const Identity = x => ({ x, map: fn => Identity(fn(x)) });\n\nconst Const = x => ({ x, map: fn => Const(x) });\n\nconst lens = (getter, setter) => functor => target =>\n functor(getter(target)).map(focus => setter(focus, target));\n\nconst over = (lens, fn, obj) => lens(x => Identity(fn(x)))(obj).x;\n\nconst set = (lens, val, obj) => over(lens, () => val, obj);\n\nconst view = (lens, obj) => lens(Const)(obj).x;\n\nexport { lens, over, set, view };\n","/** Map fn on array, then join it with joiner */\nimport * as Lenses from \"./lenses.js\";\n\nexport const applyTo = arg => fn => fn(arg);\n\nconst _apply = (fn, args) => fn(...args);\n\nexport const dec = arg => arg - 1;\n\nexport const inc = arg => arg + 1;\n\nexport function mapConcat(arr, fn, joiner) {\n return arr.map(fn).join(joiner);\n}\n\nexport const identity = x => x;\n\nexport const isNil = x => x == null;\n\nexport const not = a => !a;\n\n/**\n Differs from Ramda in that the first function in the pipe chain is\n called with a single argument.\n */\nexport const pipe =\n (...fns) =>\n value =>\n fns.reduce((acc, cur) => cur(acc), value);\n\n/**\n Differs from Ramda in that the first function in the compose chain is\n called with a single argument.\n */\nexport const compose =\n (...fns) =>\n value =>\n fns.reduceRight((acc, cur) => cur(acc), value);\n\n/**\n Same as Ramda compose() in that the first function in the compose\n chain may be called with more than one argument.\n */\nexport const composeX =\n (...fns) =>\n (...value) =>\n fns.reduceRight((acc, cur) => [cur.apply(null, acc)], value);\n\nexport const curry = (fn, ...args) => {\n if (args.length >= fn.length) return fn(...args);\n return (...args2) => curry(fn, ...[...args, ...args2]);\n};\n\nexport const join = curry((sep, arr) => arr.join(sep));\n\nexport const split = curry((sep, arr) => arr.split(sep));\n\nexport const reverse = arr => [...arr].reverse();\n\nexport const type = compose(\n s => s.slice(8, -1),\n ob => Object.prototype.toString.call(ob)\n);\n\nexport const always = value => () => value;\n\nexport const F = always(false);\n\nexport const T = always(true);\n\nexport const propOr = curry((or, prop, obj) => {\n try {\n return ifElse(isNil, () => or, identity)(obj[prop]);\n } catch (_) {\n return or;\n }\n});\n\nexport const prop = propOr(undefined);\nexport const pathOr = curry((or, pathArg, obj) =>\n reduce((acc, cur) => propOr(or, cur, acc), obj, pathArg)\n);\n\nexport const path = pathOr(undefined);\n\nexport const tail = arr => Array.prototype.slice.call(arr, 1);\n\nconst _nth = (i, arr) => arr[i];\n\nexport const head = arr => arr[0];\n\nexport const last = arr => arr[arr.length - 1];\n\nexport const cond = curry((rules, ob) => {\n const cur = rules[0];\n if (!cur) return undefined;\n return ifElse(cur[0], cur[1], cond(tail(rules)))(ob);\n});\n\nexport const choose = curry((rules, ob) => {\n const cur = rules[0];\n if (!cur) return undefined;\n return cur[0](ob) ? cur[1] : choose(tail(rules))(ob);\n});\n\nexport const length = prop(\"length\");\n\nexport const strictUniq = arr =>\n reduce((acc, cur) => (acc.indexOf(cur) > -1 ? acc : [...acc, cur]), [])(arr);\n\nconst _uniqBy = (fn, arr) =>\n Object.values(\n arr.reduce((acc, cur) => {\n const key = fn(cur);\n return _has(key, acc) ? acc : { ...acc, [key]: cur };\n }, {})\n );\n\nexport const uniqBy = curry(_uniqBy);\n\nexport const uniq = uniqBy(_equals);\n\nexport const any = curry((fn, arr) => {\n return arr.length === 0\n ? false\n : compose(fn, head)(arr)\n ? true\n : any(fn, tail(arr));\n});\n\nexport const find = curry((fn, arr) => {\n return arr.length === 0\n ? undefined\n : fn(head(arr))\n ? head(arr)\n : find(fn, tail(arr));\n});\n\nconst _findIndex = (fn, arr) => arr.findIndex(fn);\n/**\n * Returns a function applying all arguments to a *manually* curried function.\n *\n * Behaves a bit strange (see tests), so keeping it private-ish\n **/\nexport const _uncurry =\n fn =>\n (...args) =>\n args.reduce((acc, cur) => {\n return acc(cur);\n }, fn);\n\n/** Curriable functions **/\n\n/**\n * Takes a function and two values and returns true if the values map\n * to the same value; false otherwise.\n */\nconst _eqBy = (fn, a, b) => _equals(fn(a), fn(b));\n\nconst _all = (fn, arr) =>\n reduce((acc, cur) => (acc ? fn(cur) : acc), true, arr);\n\nconst _none = (fn, arr) =>\n reduce((acc, cur) => (fn(cur) ? false : acc), true, arr);\n\nconst _append = (arg, arr) => [...((arr instanceof Array && arr) || []), arg];\n\nconst _test = (regex, string) => regex.test(string);\n\nconst _match = (regex, string) => string.match(regex) || [];\n\n// https://raphacmartin.medium.com/deep-equality-in-javascript-objects-1eea8abb3649\n/**\n *\n * @param a Object\n * @param b Object\n * @returns {boolean}\n */\nfunction _equals(a, b) {\n if (!(a instanceof Object) || !(b instanceof Object)) return a === b;\n // if the number of keys is different, they are different\n if (Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n\n for (const key in a) {\n const a_value = a[key];\n const b_value = b[key];\n // If the value is an object, check if they're different objects\n // If it isn't, uses !== to check\n if (\n (a_value instanceof Object && !_equals(a_value, b_value)) ||\n (!(a_value instanceof Object) && a_value !== b_value)\n ) {\n return false;\n }\n }\n return true;\n}\n\nexport const equals = curry(_equals);\n\nconst _eqProps = (prop, a, b) => _equals(a[prop], b[prop]);\n\nconst _hasPath = (p, ob) => {\n if (p.length === 0) return true;\n return has(p[0], ob) && _hasPath(tail(p), prop(p[0], ob));\n};\n\n/** Associate prop with val in obj */\nfunction _assoc(prop, val, obj) {\n var result = {};\n for (var p in obj) {\n result[p] = obj[p];\n }\n result[prop] = val;\n return result;\n}\n\nconst _assocPath = (path, val, obj) => {\n if (path.length === 0) {\n return val;\n }\n var idx = path[0];\n if (path.length > 1) {\n var nextObj =\n !isNil(obj) && Object.prototype.hasOwnProperty.call(obj, idx)\n ? obj[idx]\n : Number.isInteger(path[1])\n ? []\n : {};\n val = assocPath(Array.prototype.slice.call(path, 1), val, nextObj);\n }\n if (Number.isInteger(idx) && Array.isArray(obj)) {\n var arr = [].concat(obj);\n arr[idx] = val;\n return arr;\n } else {\n return assoc(idx, val, obj);\n }\n};\n\n/**\n * Apply fun to all but first argN args */\nconst _consume =\n (fn, argN) =>\n (...args) => {\n return fn(...args.slice(argN));\n };\n\nconst _propEq = (key, value, ob) => _equals(prop(key, ob), value);\n\nconst _propSatisfies = (fn, key, ob) => fn(prop(key, ob));\n\nconst _pathSatisfies = (fn, key, ob) => fn(path(key, ob));\n\nconst _pathEq = (key, value, ob) => _pathSatisfies(equals(value), key, ob);\n\nconst _has = (prop, ob) =>\n complement(isNil)(ob) && Object.prototype.hasOwnProperty.call(ob, prop);\n\nconst _tryCatch = (tryer, catcher) => arg => {\n try {\n return tryer(arg);\n } catch (e) {\n return catcher(e, arg);\n }\n};\n\n/**\n Call arr.map(fn)\n\n Note: differs from Ramda, in that the callback will receive both the item, the index and the list.\n\n If you want the callback function `fn` to read only the first parameter, wrap `fn` in `unary(fn)`.\n */\nconst _map = (fn, arr) => arr.map(fn);\n\n/**\n Call arr.filter(fn)\n\n Note: differs from Ramda, in that the callback will receive both the item, the index and the list.\n\n If you want the callback function `fn` to read only the first parameter, wrap `fn` in `unary(fn)`.\n */\nconst _filter = (fn, arr) => arr.filter(fn);\n\nconst _when = (predicate, whenTrueFn, arg) =>\n predicate(arg) ? whenTrueFn(arg) : arg;\n\nconst _ifElse = (predicate, whenTrueFn, whenFalseFn, arg) =>\n predicate(arg) ? whenTrueFn(arg) : whenFalseFn(arg);\n\nconst _either = (fn1, fn2, arg) => fn1(arg) || fn2(arg);\n\nconst _allPass = (fns, arg) =>\n fns.reduce((mem, cur) => (!mem ? false : cur(arg)), true);\n\nconst _anyPass = (fns, arg) =>\n fns.reduce((mem, cur) => (mem ? true : cur(arg)), false);\n\nconst _both = (fn1, fn2, arg) => _allPass([fn1, fn2], arg);\n\nconst _complement = (fn, arg) => !fn(arg);\n\nconst _includes = (item, c) => c.includes(item);\n\nconst _lte = (first, second) => first <= second;\n\nconst _lt = (first, second) => first < second;\n\nconst _gte = (first, second) => first >= second;\n\nconst _gt = (first, second) => first > second;\n\n/**\n Call arr.reduce(fn, into);\n\n Note: differs from Ramda, in that the callback will receive the\n accumular, the item, the index and the list.\n\n If you want the callback function `fn` to read only the first two\n parameters, as with Ramda, wrap `fn` in `binary(fn)`.\n */\nconst _reduce = (fn, into, arr) => arr.reduce(fn, into);\n\nconst _tap = (fn, value) => (fn(value), value);\n\nconst _groupWith = (fn, arr) =>\n reduce(\n (acc, cur, index, arr) =>\n index === 0 || !fn(cur, arr[index - 1])\n ? [...acc, [cur]]\n : [...acc.slice(0, acc.length - 1), [...acc[acc.length - 1], cur]],\n []\n )(arr);\n\nconst _groupBy = (fn, arr) =>\n reduce((acc, cur) => over(lensProp(fn(cur)), append(cur), acc), {})(arr);\n\nconst _nthArg = (n, arg1, ...args) => [arg1, ...args][n];\n\n/** Dissociate props from obj */\nconst _omit = (props, obj) => {\n var result = {};\n for (var p in obj) {\n if (!props.includes(p)) result[p] = obj[p];\n }\n return result;\n};\n\nconst _pickBy = (pred, obj) => {\n var result = {};\n for (var k in obj) {\n if (pred(obj[k], k)) result[k] = obj[k];\n }\n return result;\n};\n\nconst _pick = (props, obj) => {\n var result = {};\n props.forEach(prop => {\n if (prop in obj) result[prop] = obj[prop];\n });\n return result;\n};\n\nconst _pickAll = (props, obj) => {\n var result = {};\n props.forEach(prop => {\n result[prop] = obj[prop];\n });\n return result;\n};\n\nfunction _dissoc(prop, obj) {\n return _omit([prop], obj);\n}\n\nconst _infichain = (fns, arg) =>\n fns.reduce(\n (acc, cur, index) => (index === 0 ? cur(arg) : cur(acc, arg)),\n null\n );\n\nconst _mergeRight = (ob1, ob2) => Object.assign({}, ob1, ob2);\n\nconst _mergeLeft = (ob1, ob2) => Object.assign({}, ob2, ob1);\n\nconst _strictWithout = (items, list) =>\n list.reduce((acc, cur) => (items.includes(cur) ? acc : [...acc, cur]), []);\n\nconst _unary = fn => arg => fn(arg);\n\nconst _binary = fn => (arg1, arg2) => fn(arg1, arg2);\n\nconst _strictDifference = (list1, list2) => {\n const out = new Set();\n const s1 = new Set(list1);\n const s2 = new Set(list2);\n for (let item of s1) {\n if (!s2.has(item)) out.add(item);\n }\n return [...out];\n};\n\nconst _mapWithRest = (fn, arr, rest1, ...rest) =>\n arr.map((cur, i, list) => fn(cur, i, list, rest1, ...rest));\n\nconst _andThen = (fn, promise) => Promise.resolve(promise).then(fn);\nconst _otherwise = (fn, promise) => promise.then(null, fn);\n\n/**\n * @param {Funcion} f f(await g(val), val)\n * @param {Funtion} g g(val) => Promise\n * @return Promise\n */\nconst _fChain = (f, g, val) => g(val).then(x => f(x, val));\n\nconst _chain = (f, g, val) => f(g(val), val);\n\nconst _juxt = (arr, arg1, ...argN) => {\n return arr.map(fn => fn(arg1, ...argN));\n};\n\nconst _slice = (from, to, arr) => arr.slice(from, to);\n\n// Copied verbatim from Ramda\nconst _is = function is(Ctor, val) {\n return (\n val instanceof Ctor ||\n (val != null &&\n (val.constructor === Ctor ||\n (Ctor.name === \"Object\" && typeof val === \"object\")))\n );\n};\n\nexport const toLower = s => s.toLowerCase();\nexport const toUpper = s => s.toUpperCase();\n\nexport const maybeNumber = string =>\n Number.isInteger(Number(string)) ? Number(string) : string;\n\nconst _applySpec =\n specs =>\n (...args) => {\n if (specs instanceof Function) {\n return specs(...args);\n }\n if (specs instanceof Array) {\n return specs.map(fn => _applySpec(fn)(...args));\n }\n const out = {};\n for (let [key, value] of Object.entries(specs)) {\n out[key] = _applySpec(value)(...args);\n }\n return out;\n };\n\nexport const applySpec = curry((specs, arg, ...args) =>\n _applySpec(specs)(arg, ...args)\n);\n\nexport const all = curry(_all),\n nthArg = curry(_nthArg),\n andThen = curry(_andThen),\n append = curry(_append),\n apply = curry(_apply),\n assoc = curry(_assoc),\n assocPath = curry(_assocPath),\n anyPass = curry(_anyPass),\n both = curry(_both),\n consume = curry(_consume),\n chain = curry(_chain),\n strictDifference = curry(_strictDifference),\n dissoc = curry(_dissoc),\n eqProps = curry(_eqProps),\n filter = curry(_filter),\n has = curry(_has),\n hasPath = curry(_hasPath),\n is = curry(_is),\n juxt = curry(_juxt),\n map = curry(_map),\n nth = curry(_nth),\n otherwise = curry(_otherwise),\n propEq = curry(_propEq),\n propSatisfies = curry(_propSatisfies),\n tryCatch = curry(_tryCatch),\n when = curry(_when),\n ifElse = curry(_ifElse),\n either = curry(_either),\n allPass = curry(_allPass),\n complement = curry(_complement),\n includes = curry(_includes),\n infichain = curry(_infichain),\n mapWithRest = curry(_mapWithRest),\n mergeLeft = curry(_mergeLeft),\n mergeRight = curry(_mergeRight),\n omit = curry(_omit),\n pathEq = curry(_pathEq),\n pathSatisfies = curry(_pathSatisfies),\n pick = curry(_pick),\n pickBy = curry(_pickBy),\n pickAll = curry(_pickAll),\n lt = curry(_lt),\n lte = curry(_lte),\n fChain = curry(_fChain),\n gt = curry(_gt),\n gte = curry(_gte),\n reduce = curry(_reduce),\n groupBy = curry(_groupBy),\n groupWith = curry(_groupWith),\n tap = curry(_tap),\n eqBy = curry(_eqBy),\n lens = curry(Lenses.lens),\n over = curry(Lenses.over),\n set = curry(Lenses.set),\n view = curry(Lenses.view),\n test = curry(_test),\n match = curry(_match),\n none = curry(_none),\n findIndex = curry(_findIndex),\n slice = curry(_slice),\n strictWithout = curry(_strictWithout),\n unary = curry(_unary),\n binary = curry(_binary),\n lensPath = p => Lenses.lens(path(p), assocPath(p)),\n lensProp = p => Lenses.lens(prop(p), assoc(p));\n\nexport const uncurried = {\n is: _is,\n all: _all,\n apply: _apply,\n append: _append,\n assoc: _assoc,\n assocPath: _assocPath,\n both: _both,\n filter: _filter,\n propEq: _propEq,\n consume: _consume,\n tryCatch: _tryCatch,\n when: _when,\n ifElse: _ifElse,\n either: _either,\n allPass: _allPass,\n complement: _complement,\n includes: _includes,\n lt: _lt,\n lte: _lte,\n gt: _gt,\n gte: _gte,\n has: _has,\n hasPath: _hasPath,\n tap: _tap,\n groupBy: _groupBy,\n groupWith: _groupWith,\n nth: _nth,\n eqBy: _eqBy,\n eqProps: _eqProps,\n equals: _equals,\n omit: _omit,\n pathEq: _pathEq,\n pick: _pick,\n pickBy: _pickBy,\n pickAll: _pickAll,\n dissoc: _dissoc,\n test: _test,\n match: _match,\n mergeLeft: _mergeLeft,\n mergeRight: _mergeRight,\n strictWithout: _strictWithout,\n unary: _unary,\n binary: _binary,\n slice: _slice,\n findIndex: _findIndex,\n toLower,\n toUpper,\n uniqBy: _uniqBy,\n ...Lenses\n};\n","import parse from \"./baby-lisp.js\";\nimport * as L from \"./functional.js\";\n\n/**\n * @typedef {Object} Bucket\n * @property {method} get Method to get key\n */\n\n/**\n * Test string against a bucket's contents\n * @function\n * @param {Bucket} bucket with a get(key) method returning a Boolean\n * or undefined.\n * @param {String} string Lispy string to test against the bucket\n */\nexport const stringSaysDo = (bucket, string) => {\n const ast = parse(`(${string})`);\n return astSaysDo(bucket)(ast);\n};\n\n/**\n * Test ast against bucket's contents\n * @function\n * @param {Bucket} bucket with a get(key) method returning a Boolean\n * or undefined.\n * @param {Object} AST Lispy AST (nested array of strings) to test against the bucket\n */\nconst astSaysDo = bucket => ast => {\n if (ast instanceof Array) {\n if (ast[0] === \"and\") {\n return L.compose(L.all(astSaysDo(bucket)), L.tail)(ast);\n }\n if (ast[0] === \"or\") {\n return L.compose(L.any(astSaysDo(bucket)), L.tail)(ast);\n }\n if (ast[0] === \"not\") {\n return L.compose(L.not, L.any(astSaysDo(bucket)), L.tail)(ast);\n }\n return L.compose(L.any(astSaysDo(bucket)))(ast);\n } else {\n return bucket.get(ast);\n }\n};\n","export class BooleanBucket {\n constructor() {\n this.booleans = [];\n }\n /**\n * @param {String} key Key to get\n */\n get(key) {\n return this.booleans[key];\n }\n /**\n * @param {String} key Key to set\n */\n set(key) {\n return this.toggle(key, true);\n }\n /**\n * @param {String} key Key to unset\n */\n unset(key) {\n return this.toggle(key, false);\n }\n /**\n * @param {String} key Key to toggle\n * @param {Boolean} [bool] New value\n */\n toggle(key, bool) {\n bool = typeof bool === \"boolean\" ? bool : !this.get(key);\n if (bool !== this.get(key)) {\n this.booleans[key] = bool;\n return [true, bool];\n } else {\n return [false, bool];\n }\n }\n}\n","/* global $ */\nimport { stringSaysDo } from \"./baby-lisp-apply.js\";\nimport { BooleanBucket } from \"./booleanbucket.js\";\n\nclass BucketWithConsequences extends BooleanBucket {\n /**\n * @param {String} key Key to toggle\n * @param {Boolean} [bool] New value\n * @param {Boolean} [reflect] Reflect the key as a class in the \n\n * Will hide or show any element which has somewhere inside data-when or data-hide-when attribute.\n * Whether or not to show or hide is based on the parsing of those attributes.\n *\n * See baby-lisp.test.js for examples.\n */\n toggle(mode, bool, reflect = true) {\n if (mode.includes('\"')) {\n console.warn(\n \"Mode contains a double quote, that is not allowed - used in querySelectorAll\"\n );\n return this;\n }\n const [changedOrAdded, bool2] = super.toggle(mode, bool);\n // Refrain from unnecessary redraw (by checking previous value):\n if (changedOrAdded) {\n $(document).trigger(\"bb:mode:\" + mode, bool2);\n if (reflect) $(\"body\").toggleClass(mode, bool2);\n {\n [\n ...document.querySelectorAll(\n '[data-when*=\"' + mode + '\"], [data-hide-when*=\"' + mode + '\"]'\n )\n ].forEach(elt => {\n let hidden = false;\n const hideWhen = elt.dataset[\"hideWhen\"];\n if (hideWhen) {\n hidden = stringSaysDo(this, hideWhen);\n }\n // hideWhen is absent or yields false, so still shown, and\n // when becomes the judge:\n if (!hidden) {\n const when = elt.dataset[\"when\"];\n // If there is no when, still show.\n if (when) {\n hidden = !stringSaysDo(this, when);\n }\n }\n elt.hidden = hidden;\n });\n }\n }\n return this;\n }\n}\n\nconst Mode = new BucketWithConsequences();\n\nexport { Mode };\n","/* global URLSearchParams FormData */\n\nimport { mapConcat, either, when } from \"./functional.js\";\n\nconst ATTR_SNAME = \"data-server-name\";\nconst ATTR_SVALUE = \"data-server-value\";\nconst CONTAINER_SELECTOR = \"#bb-q .group.selected\";\n\nconst INPUT_SELECTOR = mapConcat(\n [\"input\", \"textarea\", \"select\"],\n function (c) {\n return c + \"[name]:not([disabled])\";\n },\n \", \"\n);\n\nconst inputsOf = container => container.querySelectorAll(INPUT_SELECTOR);\n\nconst isEmptyRadioValue = val => val === null;\nconst isEmptyCheckboxValue = val => val === false;\nconst isCheckedCheckboxValue = val => val === true;\n\nfunction collectWithin({\n params = null, // Object with an .append method, taking two params\n flavor = URLSearchParams, // Constructor for an object with an .append method, taking two params, used when params is not provided\n container = document.querySelector(CONTAINER_SELECTOR),\n omitFn = isEmptyCheckboxValue,\n changeFn = when(isCheckedCheckboxValue, () => \"on\"),\n collector = inputsOf\n} = {}) {\n return _collectAll(\n collector(container),\n params || new flavor(),\n omitFn,\n changeFn\n );\n}\n\nfunction _collectAll(nodeList, params, omitFn, changeFn) {\n for (const node of nodeList) {\n const val = valueOf(node),\n name = node.getAttribute(ATTR_SNAME) || node.getAttribute(\"name\");\n if (!either(isEmptyRadioValue, omitFn, val)) {\n params.append(name, changeFn(val));\n }\n }\n return params;\n}\n\nfunction valueOf(node) {\n if (node.hasAttribute(ATTR_SVALUE)) return node.getAttribute(ATTR_SVALUE);\n switch (node.type) {\n case \"radio\":\n return node.checked ? node.value : null; // Do not collect unchecked radios -- stripped in collectAll.\n case \"checkbox\":\n /* Collect unchecked checkboxes as false -- goes against usual form submission,\n but we need this for Studio API (using JSON). Stripped out by collectAll() unless provided with a omitFn. */\n if (!node.checked) return false;\n return node.hasAttribute(\"value\") // NOT the property -- this would still be \"on\".\n ? node.value // A checkbox should send either its value or\n : true; // Return Boolean true instead of \"on\", to be changed by collectAll() with changeFn,\n // or leave it at true (for JSON communication for instance) */\n default:\n return String(node.value).replace(/\\r?\\n/g, \"\\r\\n\");\n }\n}\n\nconst serializeQuestions = () =>\n collectWithin({}).toString().replace(/\\r?\\n/g, \"%0D%0A\");\n\nexport { valueOf, serializeQuestions, collectWithin };\n","/* global $ FormData URLSearchParams */\nlet _vars = {};\n\nconst SESSION_KEYS = [\"dbname\", \"sessionid\", \"uniqueid\"];\nconst NAV_KEYS = [\"screenid\", ...SESSION_KEYS];\n\nObject.freeze(SESSION_KEYS);\nObject.freeze(NAV_KEYS);\n\nfunction setValueInVars(data, key) {\n if (typeof data[key] != \"undefined\") _vars[key] = data[key];\n}\n\nexport function setVars(data) {\n setValueInVars(data, \"version\");\n setValueInVars(data, \"uniqueid\");\n setValueInVars(data, \"replyserveraddress\");\n setValueInVars(data, \"replyserverport\");\n setValueInVars(data, \"proxyredirect\");\n setValueInVars(data, \"sessionid\");\n setValueInVars(data, \"modelname\");\n setValueInVars(data, \"dbname\");\n setValueInVars(data, \"modelid\");\n setValueInVars(data, \"showdeleteinmenu\");\n setValueInVars(data, \"showdatecreated\");\n setValueInVars(data, \"showreport\");\n setValueInVars(data, \"userinfo\");\n setValueInVars(data, \"showcopycase\");\n setValueInVars(data, \"screenid\");\n var version = getVar(\"version\");\n if (typeof version === \"string\") _vars[\"version\"] = version.split(\".\");\n}\n\nexport function getVar(string, obj) {\n return $.extend({}, _vars, obj)[string];\n}\n\n/**\n * Unset either all vars, or only those present in param vars\n *\n * @param {Array} vars An array of variable keys to delete\n *\n **/\nfunction unsetVars(arr) {\n if (!arr) return (_vars = {});\n arr.forEach(function (key) {\n delete _vars[key];\n });\n return _vars;\n}\n\nfunction collect(keys, collector = new FormData(), obj) {\n function append(key) {\n const val = getVar(key, obj);\n if (val !== undefined) collector.append(key, getVar(key, obj));\n }\n if (Array.isArray(keys)) {\n keys.forEach(append);\n } else {\n append(keys);\n }\n return collector;\n}\n\nfunction querify(keys, obj) {\n const usp = collect(keys, new URLSearchParams(), obj);\n return usp.toString();\n}\n\nexport default {\n querify,\n setVars,\n getVar,\n unsetVars,\n collect,\n NAV_KEYS,\n SESSION_KEYS\n};\n","/* global URLSearchParams */\nimport \"./polyfills/url-search-params.js\";\nimport { Mode } from \"./mode.js\";\nimport { serializeQuestions } from \"./collect-values.js\";\nimport Vars from \"./vars.js\";\n\nexport const shouldExit = () =>\n Mode.get(\"hasModel\") && Boolean(Vars.getVar(\"sessionid\"));\n\nexport const onEnd = () => {\n if (!shouldExit()) return;\n if (!navigator.sendBeacon) return;\n const data = [\n \"step=exitdelayed\",\n Vars.querify(Vars.NAV_KEYS),\n \"fmt=json\",\n serializeQuestions()\n ]\n .filter(Boolean)\n .join(\"&\");\n\n const usp = new URLSearchParams(data);\n\n navigator.sendBeacon(\"/action\", usp);\n};\n\nfunction addEndListener() {\n // Update state before navigating away, but do not logout\n if (\"onpagehide\" in window) {\n window.addEventListener(\"pagehide\", onEnd);\n } else {\n window.addEventListener(\"unload\", onEnd, false);\n }\n}\n\nexport function removeEndListener() {\n // Update state before navigating away, but do not logout\n if (\"onpagehide\" in window) {\n window.removeEventListener(\"pagehide\", onEnd);\n } else {\n window.removeEventListener(\"unload\", onEnd, false);\n }\n}\n\naddEndListener();\n","/* a11y-user-detect:\n *\n * \"User Detect\" will dynamically toggle between\n * a-keyboard-user & a-mouse-user (described in a11y.less)\n * depending on user interaction on document.\n *\n * The idea is to give keyboard users more visual queues,\n * without effecting the aesthetics for non-keyboard users.\n *\n * Author: Tim Bauwens\n * Copyright 2017 Berkeley Bridge\n *\n */\n\nimport { Mode } from \"$json/lib/mode\";\n\nexport const isKeyboardUser = () => Mode.get(\"a-keyboard-user\");\n\nexport const isMouseUser = () => Mode.get(\"a-mouse-user\");\n\nexport const setKeyboardUser = () => {\n Mode.set(\"a-keyboard-user\");\n Mode.unset(\"a-mouse-user\");\n};\n\nexport const setMouseUser = () => {\n Mode.unset(\"a-keyboard-user\");\n Mode.set(\"a-mouse-user\");\n};\n\n$(function () {\n let openingMatch, mouse;\n try {\n // Could have no opener, or opener could be X-Origin\n if (window.opener.document.body) {\n openingMatch = window.opener.document.body.className.match(\n /\\ba-(keyboard|mouse)-user\\b/\n );\n if (openingMatch) mouse = openingMatch[1] === \"mouse\";\n }\n } catch (e) {\n mouse = false;\n }\n if (mouse) {\n setMouseUser();\n } else {\n setKeyboardUser();\n }\n $(document.body).on(\"mousedown touchstart\", function () {\n setMouseUser();\n });\n $(document.body).on(\"keydown\", function (e) {\n if (\n e.key === \"Tab\" ||\n e.target.matches(`input[type=\"radio\"], input[type=\"checkbox\"]`)\n ) {\n setKeyboardUser();\n }\n });\n});\n","/* global $ */\nimport \"./a11y-user-detect.js\";\nimport { _ } from \"./gettext.js\";\n\n/*** A11y BEGIN ***/\nexport const A11y = {\n log: function (message) {\n var logdiv = document.getElementById(\"a-logdiv\");\n if (logdiv) logdiv.innerHTML = \"
\" + message + \"
\";\n }\n};\n\n/**\n * Datepicker a11y enhancements\n */\nexport const observeDatepickers = (function () {\n var init = false;\n return function initDateObservance() {\n var picker, observer;\n\n if (init || !(\"MutationObserver\" in window)) {\n init = true;\n return;\n }\n\n $(document).on(\"blur\", '[data-type=\"datetimepicker\"]', function () {\n A11y.log(\"\");\n });\n\n function observation(records, instance) {\n try {\n var infocus =\n document.activeElement.className.split(\" \").indexOf(\"hasDatepicker\") >\n -1;\n } catch (e) {\n // there mayn't be an activeElement, in which case className is undefined.\n }\n if (infocus) {\n var message = [\n $(\".ui-state-hover\").text(),\n $(\".ui-datepicker-month [selected]\").text(),\n $(\".ui-datepicker-year [selected]\").text()\n ].join(\" \");\n A11y.log(message + \", \" + _(\"press enter to accept\"));\n }\n }\n\n picker = document.getElementById(\"ui-datepicker-div\");\n\n if (picker) {\n observer = new window.MutationObserver(observation);\n observer.observe(picker, { attributes: true });\n init = true;\n }\n };\n})();\n","let escapeHTML = (function () {\n var entityMap = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n \"/\": \"/\"\n };\n var re = new RegExp(\"[&<>\\\"'/]\", \"g\");\n return function escapeHTML(string) {\n return String(string).replace(re, function (s) {\n return entityMap[s];\n });\n };\n})();\n\nconst escaped = (strings, ...values) =>\n strings.reduce(\n (acc, cur, idx) =>\n acc + cur + (values.length > idx ? escapeHTML(values[idx]) : \"\"),\n \"\"\n );\n\nexport { escapeHTML, escaped };\n","import { Mode } from \"./mode.js\";\n\n/*** NOTIFICATIONS BEGIN ***/\nlet message;\n// Notification can either be a String or an object with a message\n// property. When supplying an object, the message property will be\n// shown to the user, but the entire object will be given to\n// console.error.\nfunction notify(options = { keepalive: false, html: false }, notification) {\n if (!notification) return;\n var text = notification.message || notification,\n timeout = 5000;\n if (\n typeof console !== \"undefined\" &&\n console &&\n typeof console.error === \"function\"\n )\n console.error(notification);\n message = { notification, options };\n Mode.set(\"hasMessage\");\n if (options.html) {\n document\n .querySelectorAll(\".bb-notification\")\n .forEach(area => (area.innerHTML = text));\n } else {\n document\n .querySelectorAll(\".bb-notification\")\n .forEach(area => (area.textContent = text));\n }\n if (!options.keepalive)\n window.setTimeout(Mode.unset.bind(Mode, \"hasMessage\"), timeout);\n}\n\nexport { notify, message };\n/*** NOTIFICATIONS END ***/\n","/*** CONFIG BEGIN ***/\n\nimport conf from \"$conf.json\";\nimport { has } from \"./functional.js\";\n\nconf.a11y = Object.assign(\n {\n captions: false,\n optionfieldsets: false,\n strictlegends: false\n },\n conf.a11y\n);\n\nfunction propFinder(ob, prefix) {\n if (prefix) ob = find(prefix);\n\n function find(prop, fallback) {\n if (ob === undefined) return fallback;\n if (prop === undefined) return fallback;\n var leafs = prop.split(\".\").filter(Boolean),\n leaf = ob;\n while (has(leafs[0], leaf)) {\n leaf = leaf[leafs.shift()];\n }\n if (leafs.length === 0) return leaf;\n return fallback;\n }\n\n return find;\n}\n\nexport { conf, propFinder };\n\n/*** CONFIG END ***/\n","import { conf } from \"./conf\";\nexport const fromApiServer = s =>\n s.startsWith(\"http://\") || s.startsWith(\"https://\")\n ? s\n : [conf.apiserver, s].filter(Boolean).join(\"/\");\n","/* global jQuery */\nlet $ = jQuery;\n\nimport { escapeHTML } from \"./escape.js\";\nimport { notify } from \"./notify.js\";\nimport { _ } from \"./gettext.js\";\nimport { fromApiServer } from \"./location.js\";\n\n/**\n * Keep track of ajax requests + some convenience\n *\n * Exports busy and replace to bb.ajax object for plugins to use.\n */\nvar Ajax = {\n busy: false,\n last: null,\n direction: null,\n\n defaultOptions: {\n dataType: \"json\",\n type: \"POST\",\n url: \"action\",\n cache: false,\n async: true,\n success: checkJSON,\n error: onJSONError\n },\n\n post: function (options) {\n const _options = Object.assign({}, Ajax.defaultOptions, options, {\n url: fromApiServer(options.url || Ajax.defaultOptions.url)\n });\n $(document).trigger(\"bb:prePost\", _options);\n return $.ajax(_options);\n },\n\n replace: function (obj) {\n Ajax.last && Ajax.last.abort();\n Ajax.last = Ajax.post(obj);\n return Ajax.last;\n },\n\n release: function () {\n Ajax.busy = false;\n $(\".group.selected\").prop(\"disabled\", false);\n }\n};\n\n/**\n * Convenience method, like getJSON, but with POST\n *\n * @param {String} url URL where we POST to\n * @param {Object|String} data POST data\n *\n * Use Ajax.post instead if you want to overrule any default\n * settings from Ajax.defaultOptions.\n */\n$.postJSON = function (url, data) {\n return Ajax.post({ url: url, data: data });\n};\n\n/**\n * The default JSON error handler.\n *\n * Set appropriate flags, let user now what went wrong (as good as\n * possible).\n *\n * Trigger custom 'bb:jsonError' event on document.\n *\n * @param {Object} data XMLHTTPRequest object\n * @param {String} err Error message\n */\nfunction onJSONError(data, err) {\n Ajax.release();\n $(document).trigger(\"bb:jsonError\", data, err);\n if (data.responseText === undefined) {\n if (data.statusText === \"abort\");\n else {\n notify(\n { html: false, keepalive: true },\n _(\"Error: No response from server, server probably down\")\n );\n }\n } else if ($.trim(data.responseText) === \"\") {\n notify(\n { html: false, keepalive: true },\n _(\"Error: No response from server, server probably down\")\n );\n } else {\n notify(\n { html: true, keepalive: true },\n \"Error: \" +\n escapeHTML(err) +\n \"
Response was:
\" +\n \"
\" +\n        escapeHTML(data.responseText) +\n        \"
\"\n );\n }\n}\n\n/**\n * Indicate further processing ought to be skipped when this symbol is\n * set on JSON data.\n * @example\n import { stopDispatches } from \"$json/lib/ajax\";\n $(document).on(\"bb:preHandleData\", (event, data) => {\n event.stopImmediatePropagation(); // prevent further bb:preHandleData handlers.\n data[stopDispatches] = true;\n })\n * @constant\n * @type {Symbol}\n */\nexport const stopDispatches = Symbol(\"Skip all further dispatches\");\n\n/**\n Set this symbol to a promise on ajax data, and it shall be awaited\n before the next *handleData is run.\n*/\nconst awaiting = Symbol(\"awaiting promise\");\n\n/**\n * The default AJAX success handler. Perform actions on data.\n\n *\n * If data is not a JSON object, do nothing.\n *\n * @todo Either check data against JSON API, in some way or the\n * other, or make sure this function doesn't get called in the\n * first place when we're dealing with a non-core request; as\n * checkJSON is currently bound to ALL $.ajax requests,\n * this function may also fire for non-core requests.\n *\n * @param {Object} data 'JSON object according to BB JSON API'\n * @param {String} status Status of XHR\n * @param {Object} req The XHR object retrieving the resource\n *\n * @return undefined\n */\nasync function checkJSON(data, status, req) {\n if (typeof req.responseJSON !== \"undefined\") {\n // Since subsequent events may mess with the responseJSON\n // object, give (debuggers) the option to see the raw stuff.\n // Could be solved with a service worker instead.\n $(document).trigger(\"bb:responseText\", req.responseText);\n // use bb:preHandleData to change the JSON object for later invocations\n $(document).trigger(\"bb:preHandleData\", data);\n if (data[stopDispatches]) return;\n await data[awaiting];\n // handleData has the main stuff - the core rendering\n $(document).trigger(\"bb:handleData\", data);\n if (data[stopDispatches]) return;\n await data[awaiting];\n\n // use bb:postHandleData to change the DOM after initial rendering\n $(document).trigger(\"bb:postHandleData\", data);\n if (data[stopDispatches]) return;\n await data[awaiting];\n\n // finalHandleData may not change the DOM, but set focus for instance.\n $(document).trigger(\"bb:finalHandleData\", data);\n if (data[stopDispatches]) return;\n }\n}\n\nexport { Ajax, checkJSON, awaiting };\n","import { Mode } from \"./mode.js\";\n\nexport const setSettled = () => Mode.set(\"isSettled\");\n","/* global $, URLSearchParams */\nimport { setSettled } from \"./settled.js\";\nimport { removeEndListener } from \"./case-exit.js\";\n\nfunction BBI(options) {\n options = options || {};\n if (options.redirect_uri) {\n /** Example response:\n *\n * {\n * \"bbis\" : \"test\",\n * \"authid\" : \"Stubby\",\n * \"redirect_uri\" : \"https:\\/\\/HOST:8078\\/login?returnurl=http%3A%2F%2Fhost%3A80%2Fbbisreturns%3Fbbis%3Dtest&state=1507301556%3AGUID&authid=Stubby\",\n * \"url\": \"http:\\/\\/HOST:80\\/bbisreturns?bbis=test\",\n * \"state\": \"1507301556:6F2146D3-E0E6-4EB2-9DE4-2F31670B80D6\"\n * }\n *\n */\n var path = window.location.pathname.split(\"/\"),\n template = path.pop() || \"inlog.html\",\n returnurl =\n window.location.origin +\n path.concat(template).join(\"/\") +\n \"?\" +\n $.param({ bbis: options.bbis }),\n server = options.redirect_uri.split(\"?\")[0]; // The identity server sans params\n this.params = Object.assign({}, options.extraparams, {\n returnurl,\n authid: options.authid,\n // Add specific HTML page to state:\n state: options.state\n });\n this.url = server + \"?\" + $.param(this.params);\n this.stage = 1;\n } else {\n this.params = $.extend($.parseQuery(), { fmt: \"json\" });\n this.stage = 2;\n }\n return this;\n}\n\nBBI.prototype.authenticate = function () {\n if (!this.stage) throw \"BBI was not properly initialized\";\n if (this.stage === 1) {\n removeEndListener();\n window.location.href = this.url;\n } else if (this.stage === 2) {\n $.postJSON(\"bbisreturns\", this.params).then(setSettled);\n }\n};\n\nexport { BBI };\n","import { escapeHTML } from \"./escape.js\";\nimport {\n allPass,\n anyPass,\n both,\n complement,\n compose,\n either,\n F,\n has,\n ifElse,\n pipe,\n prop,\n propEq,\n type\n} from \"./functional.js\";\nexport const isOptional = allPass([\n complement(prop(\"notnull\")),\n either(\n complement(prop(\"stringmask\")),\n pipe(prop(\"stringmask\"), RegExp, re => re.test(\"\"))\n )\n]);\n\nexport const isVisible = prop(\"visible\");\n\nexport const isLabel = either(\n propEq(\"name\", \"label\"),\n propEq(\"controltype\", \"label\")\n);\n\nexport const isOption = either(\n propEq(\"controltype\", \"radio\"),\n propEq(\"controltype\", \"checkbox\")\n);\n\nexport const isLink = propEq(\"name\", \"linklabel\");\n\nexport const isTextual = either(isLabel, isLink);\n\nexport const isPicture = propEq(\"controltype\", \"picture\");\n\nexport const isQuestion = complement(either(isTextual, isPicture));\n\nexport const isReadOnly = both(\n isQuestion,\n either(\n ifElse(has(\"originalreadonly\"), prop(\"originalreadonly\"), prop(\"readonly\")),\n propEq(\"visible\", false)\n )\n);\n\nexport const isValidatable = ifElse(\n either(isReadOnly, propEq(\"visible\", false)),\n F,\n anyPass([\n has(\"minimum\"),\n has(\"maximum\"),\n both(has(\"maxlength\"), complement(propEq(\"maxlength\", 0))),\n prop(\"notnull\"),\n compose(s => s === \"string\", type, prop(\"stringmask\"))\n ])\n);\n\nexport const renderAttribs = attr =>\n Object.entries(attr).reduce(\n (acc, [key, value]) => acc + ` ${key}=\"${escapeHTML(value)}\"`,\n \"\"\n );\n\nexport const setAttribs = (elt, attr) =>\n Object.entries(attr).forEach(([key, value]) => elt.setAttribute(key, value));\n\nexport const bbmClass = stylename =>\n `bbm-${stylename.toLowerCase().replace(/[^a-z0-9]/g, \"-\")}`;\n","import {\n assoc,\n hasPath,\n chain,\n compose,\n either,\n path,\n prop,\n toLower,\n toUpper,\n ifElse,\n juxt,\n when\n} from \"./functional.js\";\nimport { format } from \"./text-utils.js\";\nimport { _ } from \"./gettext.js\";\n\nconst fieldDesignators = {\n datetimepicker: \"field--date\",\n numedit: \"field--value\",\n radio: \"field--list\",\n checkmultilist: \"field--list\",\n customlist: \"field--list\",\n combobox: \"field--list\",\n listbox: \"field--list\",\n multilist: \"field--list\",\n any: \"field--field\"\n};\n\nconst fieldKey = compose(\n controltype => fieldDesignators[controltype] || fieldDesignators[\"any\"],\n prop(\"controltype\")\n);\n\nconst generic = compose(key => _(key), fieldKey);\n\nconst genericQuoted = compose(\n key => _(key), // Runtime!\n key => key.replace(\"field--\", \"quoted--\"),\n fieldKey\n);\nexport const quotable = compose(\n when(\n prop(\"quotable\"),\n chain(\n assoc(\"quotable--init\"),\n compose(s => s.slice(0, 1).toUpperCase() + s.slice(1), prop(\"quotable\"))\n )\n ),\n when(\n prop(\"quotable\"),\n chain(assoc(\"quotable--upper\"), compose(toUpper, prop(\"quotable\")))\n ),\n when(\n prop(\"quotable\"),\n chain(assoc(\"quotable--lower\"), compose(toLower, prop(\"quotable\")))\n ),\n chain(assoc(\"quotable\"), either(path([\"metadata\", \"quotable\"]), generic)),\n ifElse(\n hasPath([\"metadata\", \"quotable\"]),\n compose(assoc(\"<<\", _(\"<<\", \"«\")), assoc(\">>\", _(\">>\", \"»\"))),\n compose(assoc(\"<<\", \"\"), assoc(\">>\", \"\"))\n ),\n chain(\n assoc(\"quoted--init\"),\n compose(s => s.slice(0, 1).toUpperCase() + s.slice(1), prop(\"quoted\"))\n ),\n ifElse(\n hasPath([\"metadata\", \"quotable\"]),\n chain(\n assoc(\"quoted\"),\n compose(\n arr => format(...arr),\n juxt([\n genericQuoted,\n compose(quotable => ({ quotable }), path([\"metadata\", \"quotable\"]))\n ])\n )\n ),\n chain(assoc(\"quoted\"), generic)\n )\n);\n","/* global $ */\nimport { quotable } from \"./quotable.js\";\nimport {\n apply,\n assoc,\n cond,\n compose,\n dec,\n equals,\n identity,\n lensPath,\n mergeLeft,\n match,\n over,\n path,\n pipe,\n tail,\n test,\n T\n} from \"./functional.js\";\nimport { _ } from \"./gettext.js\";\nimport { format, formatPlus } from \"./text-utils.js\";\n\n/*** DATE UTILITIES BEGIN ***/\nDate.prototype.toHoursAndMinutes = function () {\n var hours = this.getHours();\n var minutes = this.getMinutes();\n if (hours < 10) hours = \"0\" + hours;\n if (minutes < 10) minutes = \"0\" + minutes;\n return hours + \":\" + minutes;\n};\nconst dateTimeRe = /^\\/Date\\((-?\\d+)\\)\\/$/,\n pureDateRe = /^(\\d{4})-(\\d{2})-(\\d{2})$/,\n ISO8601DateTimeInZuluRe =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{3})?)?Z$/;\n\n/*\n * Convert JSON date string to a Date object and return it.\n *\n * @{datestring}:\n *\n * An ISO-8601 datetime string in Zulu Time\n *\n * OR\n *\n * a JSON date string of the form\n *\n * \"/Date(102938293293)/\"\n *\n * where the numerical part is\n * seconds from epoch\n *\n * OR:\n *\n * a date formatted as \"yyyy-mm-dd\"\n *\n * OR:\n *\n * undefined -> undefined\n *\n */\nconst date = (...args) => new Date(...args);\n\nexport const parseDate = cond([\n [equals(0), () => undefined],\n [equals(undefined), identity],\n [equals(\"\"), identity],\n [\n test(pureDateRe),\n // Note if we were to pass pureDates to new Date as a valid\n // DateStamp, the engine will interpret it as 0:00 Zulu\n // time. Which, in this very case, is probably not what we\n // want. We want the date as in the minds of the case (min/max in\n // a calendar etc). It should be represented 'as is' to the user,\n // so 2022-02-09 may never become 2022-02-08 in users TZ, so\n // interpret it according in users TZ.\n pipe(match(pureDateRe), tail, over(lensPath([1]), dec), apply(date))\n ],\n [test(ISO8601DateTimeInZuluRe), date],\n [test(dateTimeRe), pipe(match(dateTimeRe), path([1]), parseInt, date)],\n [\n T,\n thing => {\n throw `Not a date in our book: ${thing}`;\n }\n ]\n]);\n\nexport const leadWithZeroes = string =>\n string.replace(/([^0-9]|^)([0-9]{3})([^0-9]|$)/, \"$10$2$3\");\n\n/**\n *\n * @param {Object} spec Object describing a control conforming to the BB json api.\n * @param {String} value The value to be checked\n * @returns {Boolean|Error} true when value is according to spec\n * @throws Localized error message\n */\nexport function checkDate(spec = { notnull: false }, value) {\n const UIFormat = $.datepicker._defaults.dateFormat;\n const formatDate = $.datepicker.formatDate.bind($.datepicker);\n var date, mindate, maxdate;\n if (!spec.notnull && value.trim() === \"\") {\n return true;\n }\n const metadata = spec.metadata || {};\n try {\n date = valueToDate(UIFormat, value); // $.datepicker.parseDate(UIFormat, value); // This line may throw an error.\n } catch (e) {\n //couldn't parse - throw a translatable error message\n throw formatPlus(\n metadata.errdateinvalid || _(\"Invalid date\"),\n compose(assoc(\"value\", value), quotable)(spec)\n );\n }\n if (date === null) {\n if (spec.notnull) {\n throw format(\n metadata.errrequired || _(\"Date required\"),\n compose(assoc(\"value\", value), quotable)(spec)\n );\n }\n return true;\n }\n (mindate = parseDate(spec.minimum)), (maxdate = parseDate(spec.maximum));\n if (!(mindate || maxdate)) return true; // Neither is set\n const fmindate = formatDate(UIFormat, mindate),\n fmaxdate = formatDate(UIFormat, maxdate);\n const quotableDate = compose(\n mergeLeft({\n value,\n minimum: fmindate,\n maximum: fmaxdate\n }),\n quotable\n )(spec);\n try {\n if (mindate && !maxdate && date < mindate)\n throw (\n metadata.errdatebeforemimimum ||\n _(\"A date before {minimum} is not allowed\")\n );\n else if (mindate && maxdate && (date < mindate || maxdate < date))\n throw (\n metadata.errdatenotinrange ||\n _(\"Date has to lie between {minimum} and {maximum}\")\n );\n else if (maxdate && !mindate && maxdate < date)\n throw (\n metadata.errdateaftermaximum ||\n _(\"A date after {maximum} is not allowed\")\n );\n } catch (e) {\n throw format(e, quotableDate);\n }\n return true;\n}\n\nexport const valueToDate = (format, value) => {\n let date;\n try {\n date = $.datepicker.parseDate(format, value);\n } catch (e) {\n const yyyycleanformat = format.replace(/[^mdy]/g, \"\").replace(\"yy\", \"yyyy\"),\n clean = value.replace(/[^0-9]/g, \"\");\n date = new Date();\n const yearindex = yyyycleanformat.indexOf(\"yyyy\");\n // If year was less than 4 digits, and not at end, adjust indices of other fields.\n const adjustment = yearindex === 0 ? clean.length - 8 : 0;\n let year = Number(clean.substr(yearindex, 4 + adjustment));\n if (year <= 99) {\n const cutoffyear = Number.isInteger(\n $.datepicker._defaults.shortYearCutoff\n )\n ? $.datepicker._defaults.shortYearCutoff\n : (date.getYear() % 100) +\n Number($.datepicker._defaults.shortYearCutoff);\n // Note: this will become odd if current year approaches end of\n // century. Let's say we live in 2099. User enters 98 -> fine.\n // Is below 109. User enters 02 => not fine. Still below 109.\n // But jQuery UI should also fix this. And it's still a long time.\n const century = (date.getFullYear() / 100) >> 0;\n if (year <= cutoffyear) {\n year += century * 100;\n } else {\n year += (century - 1) * 100;\n }\n }\n const month = Math.max(\n 0,\n Number(clean.substr(yyyycleanformat.indexOf(\"mm\") + adjustment, 2)) - 1\n );\n const dom = Number(\n clean.substr(yyyycleanformat.indexOf(\"dd\") + adjustment, 2)\n );\n date.setFullYear(year);\n date.setMonth(month);\n date.setDate(dom);\n if (\n date.getFullYear() !== year ||\n date.getMonth() !== month ||\n date.getDate() !== dom\n ) {\n throw \"invalid date\";\n }\n }\n return date;\n};\n\nexport const onChangeDate = ev => {\n let date;\n try {\n date = valueToDate($.datepicker._defaults.dateFormat, ev.target.value);\n } catch (e) {\n // ignore\n } finally {\n if (date) {\n ev.target.value = leadWithZeroes(\n $.datepicker.formatDate($.datepicker._defaults.dateFormat, date)\n );\n }\n }\n};\n\nexport const humanDate = (function () {\n var now = new Date();\n var hour0 = now.setHours(0, 0, 0, 0);\n var dayinms = 1000 * 60 * 60 * 24;\n var hour24 = hour0 + dayinms;\n var thisyear = now.getYear();\n var daysofweek = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"].map(\n function (day) {\n return _(day);\n }\n );\n var monthsofyear = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"June\",\n \"July\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\"\n ].map(function (month) {\n return _(month);\n });\n function isToday(ms) {\n return ms > hour0 && ms < hour24;\n }\n function isYesterday(ms) {\n return hour0 > ms && ms > hour0 - dayinms;\n }\n function isLastWeek(ms) {\n return ms > hour0 - dayinms * 6;\n }\n function isThisYear(date) {\n return thisyear == date.getYear();\n }\n function humanDate(date) {\n if (!(date instanceof Date)) throw \"Expects a Date object\";\n var ms = date.valueOf();\n var hm = \"\";\n hm = date.toHoursAndMinutes();\n if (isToday(ms)) {\n return hm;\n }\n if (isYesterday(ms)) {\n return _(\"Yesterday\") + \", \" + hm;\n }\n if (isLastWeek(ms)) {\n return daysofweek[date.getDay()] + \" \" + hm;\n }\n return (\n date.getDate() +\n \" \" +\n monthsofyear[date.getMonth()] +\n (isThisYear(date) ? \"\" : \" \" + date.getFullYear()) +\n \", \" +\n hm\n );\n }\n return humanDate;\n})();\n","import { compose, either, isNil, not, path } from \"./functional.js\";\n\n/* editPolicy may be \"return\", \"stay\", or undefined, meaning off */\nexport const editPolicy = path([\"arbitrary\", \"core\", \"editPolicy\"]);\n\nexport const canEditEarlier = compose(not, isNil, editPolicy);\n\nconst isLabelValueDynamic = compose(\n value => value === true,\n path([\"arbitrary\", \"core\", \"isLabelValueDynamic\"])\n);\n\nconst preferUpdate = compose(\n value => value === true,\n path([\"arbitrary\", \"core\", \"preferUpdate\"])\n);\n\nexport const mustUpdate = either(preferUpdate, canEditEarlier);\n\nexport const updateLabels = either(mustUpdate, isLabelValueDynamic);\n","const _Widgets = {};\n\nexport function registerWidget(options) {\n _Widgets[options.name] = options;\n}\nexport function getWidget(name) {\n return _Widgets[name];\n}\n","/* global $ */\n\nimport { parseDate } from \"./dates\";\nimport { isReadOnly, isValidatable } from \"./control-helpers\";\nimport { updateLabels } from \"./feature-queries.js\";\nimport { conf } from \"./conf.js\";\nimport { getWidget } from \"./form-widgets.js\";\nimport { anyPass, has, prop } from \"./functional.js\";\nconst Dynprops = {};\n\n// Update the control element\nDynprops.update = function ($widget, control, Updates, requestor) {\n if (!$widget.get(0)) return;\n const oldval = $widget.val();\n\n const updates = Object.keys(Updates);\n const definition = getWidget(control.controltype);\n $widget.removeData([\"validated\"]);\n\n /** isForNotNull **/\n if (has(\"isForNotNull\", Updates)) {\n $widget.toggleClass(\"bb-for-required\", Boolean(control.isForNotNull));\n $widget.toggleClass(\"bb-for-optional\", !control.isForNotNull);\n }\n\n /** Placeholder **/\n if (has(\"placeholder\", Updates) > -1) {\n $widget.attr(\"placeholder\", control.placeholder);\n }\n\n /** Visible **/\n if (has(\"visible\", Updates)) {\n if (control.identifier === \"gformulier.gegevens.geschil_partner\")\n $widget.attr(\"aria-hidden\", !control.visible);\n $widget.attr(\"data-visible\", control.visible);\n\n if (control.visible) {\n window.setTimeout(function () {\n $widget.removeAttr(\"hidden\");\n }, 80);\n } else {\n window.setTimeout(function () {\n $widget.attr(\"hidden\", !control.visible);\n }, 80);\n }\n }\n\n /** Value **/\n if (has(\"value\", Updates)) {\n if (updateLabels(conf)) {\n /**\n @done: linklabel, listlabel, checkmultilist, memo, combobox, radio,\n checkbox, numedit, datetimepicker, edit, grid, multilist(?), listbox(?)\n @todo: freebox.\n\n NOTE: A widget currently can change itself *only* if\n they are registered with allowUpdatingSelf : true\n\n Widgets within a grid can update other widgets in a grid.\n */\n if (definition.setValue) {\n definition.setValue($widget.get(0), control.value, requestor, Updates);\n }\n }\n }\n\n /** Readonly **/\n if (\n anyPass([has(\"readonly\"), has(\"originalreadonly\"), has(\"visible\")], Updates)\n ) {\n const readonly = isReadOnly(control);\n if (typeof definition.onreadonly === \"function\") {\n definition.onreadonly($widget.get(0), readonly);\n } else {\n $widget.prop(\"disabled\", readonly);\n }\n }\n\n /** Minimum **/\n if (has(\"minimum\", Updates)) {\n $widget.attr(\"min\", control.minimum);\n if (control.controltype === \"datetimepicker\") {\n if (control.minimum) {\n $widget.datepicker(\"option\", \"minDate\", parseDate(control.minimum));\n }\n }\n }\n\n /** Maximum **/\n if (has(\"maximum\", Updates)) {\n $widget.attr(\"max\", control.maximum);\n if (control.controltype === \"datetimepicker\") {\n if (control.maximum) {\n $widget.datepicker(\"option\", \"maxDate\", parseDate(control.maximum));\n }\n }\n }\n\n /** Maxlength **/\n if (has(\"maxlength\", Updates)) {\n if (control.maxlength === 0) $widget.removeAttr(\"maxlength\");\n else $widget.attr(\"maxlength\", control.maxlength);\n }\n\n /** Let user know something changed perhaps against their intent. **/\n if (oldval !== $widget.val()) {\n $widget.addClass(\"bb-programmatically-changed\");\n $widget.trigger(\"change\", { programmatically: true });\n self.setTimeout(function () {\n $widget.removeClass(\"bb-programmatically-changed\");\n }, 1000);\n }\n\n /** Notnull **/\n if (has(\"notnull\", Updates)) {\n if (typeof definition.onrequired === \"function\") {\n definition.onrequired($widget.get(0), control.notnull);\n } else {\n $widget.attr(\"aria-required\", control.notnull);\n }\n if (control.notnull) {\n $widget.addClass(\"notnull\");\n } else {\n $widget.removeClass(\"notnull\");\n }\n }\n\n if (isValidatable(control)) {\n $widget.attr(\"aria-errormessage\", `${control.id}--error`);\n $widget.addClass(\"validatable\");\n } else {\n $widget.removeAttr(\"aria-errormessage\");\n $widget.removeClass(\"validatable\");\n }\n\n if (updates.length > 0) {\n const event = new CustomEvent(\"bb:updatedControl\", {\n detail: { control, Updates },\n bubbles: true\n });\n $widget.get(0).dispatchEvent(event);\n $(document).trigger(\"bb:updated\", [$widget, control, updates]);\n }\n};\n\n$.fn.extend({\n updateControl: function (controls, requestor) {\n return this.each(function () {\n const $this = $(this),\n control = $this.data(\"control\");\n if (\n this === requestor &&\n !prop(\"allowUpdatingSelf\", getWidget(control.controltype))\n ) {\n // This was the one requesting an update\n return this;\n }\n if (!control) throw (\"No updateControl defined for\", $this);\n const id = control.id,\n update = controls.find(function (c) {\n return c.id === id;\n }),\n // updates = [],\n Updates = {},\n props = [\n \"maxlength\",\n \"isForNotNull\",\n \"minimum\",\n \"maximum\",\n \"notnull\",\n \"readonly\",\n \"originalreadonly\",\n \"placeholder\",\n \"precision\",\n \"stringmask\",\n \"errortext\",\n \"visible\",\n \"value\",\n \"columns\",\n \"text\"\n ];\n // Caron-syntax used in label, therefore no (text) interface\n // returned -- should not mix and match dynprops with empty\n // labels! Do not allow this to error on the user though!\n\n // Does also handle (cause to ignore) labels within a grid!\n if (typeof update === \"undefined\") {\n return this;\n // update = $.extend({}, control, {visible: false});\n }\n for (var i in props) {\n if (control[props[i]] !== update[props[i]]) {\n Updates[props[i]] = { from: control[props[i]], to: update[props[i]] };\n control[props[i]] = update[props[i]];\n // updates.push(props[i]);\n }\n }\n Dynprops.update($this, control, Updates, requestor);\n return this;\n });\n }\n});\n\nexport { Dynprops };\n","const Hooks = new Map();\n\nexport const registerHook = key => hook => {\n if (typeof hook !== \"function\") throw \"Can only add a function as a hook\";\n Hooks.set(key, hook);\n};\n\nexport const runHook =\n key =>\n (...args) => {\n if (Hooks.has(key)) Hooks.get(key)(...args);\n };\n","/* global $ */\nimport { bbmClass, isReadOnly, renderAttribs } from \"./control-helpers\";\nimport { Dynprops } from \"./dynprops\";\nimport { escaped, escapeHTML } from \"./escape.js\";\nimport { conf, propFinder } from \"./conf\";\nimport { getWidget } from \"./form-widgets.js\";\nimport {\n assoc,\n both,\n compose,\n complement,\n has,\n hasPath,\n isNil,\n not,\n prop\n} from \"./functional.js\";\nimport { runHook } from \"./hooks.js\";\nimport { Mode } from \"./mode.js\";\n\nconst arbitraryCoreProp = propFinder(conf, \"arbitrary.core\");\n\n/**\n * Create a control widget, then insert it into the DOM\n *\n * @param {Object} control A control object as defined in the JSON API. The one to render + add.\n * @param {Object} group The group object to which this control belongs.\n * @param {Element} wGroup Element whereto this control should be added. *NOTE* that this need not be a .bb-group\n *\n * @return undefined\n *\n * @todo Simplify parameter list.\n */\nfunction wControl(control, group, wGroup) {\n control._group = group;\n let attribs = {};\n let widget;\n const enabled = group.current || complement(isReadOnly)(control);\n // Has been rendered\n if (control.$elt) {\n $(wGroup).append(control.$elt);\n return control.$elt;\n }\n if (compose(has(\"fixup\"), getWidget)(control.controltype))\n compose(fn => fn(control), prop(\"fixup\"), getWidget)(control.controltype);\n\n if (control.datatype) attribs[\"data-datatype\"] = control.datatype;\n\n if (control.meta)\n for (let d in control.meta) {\n if (both(has(d), compose(not, isNil, prop(d)))(control.meta))\n attribs[\"data-\" + d] = escape(control.meta[d]);\n }\n if (control.metadata) {\n attribs[\"data-metadata-keys\"] = Object.keys(control.metadata)\n .map(s => s.replace(/\\s/g, \"-\"))\n .join(\" \");\n }\n if (control.aria)\n for (let a in control.aria) {\n if (has(a, control.aria)) attribs[\"aria-\" + a] = control.aria[a];\n }\n\n if (control.name) {\n attribs[\"name\"] = control.name;\n }\n\n const wdef = getWidget(control.controltype);\n if (!wdef) {\n console.warn(`No widget definition for ${control.controltype}`);\n return null;\n }\n const tagName = wdef.tagName;\n attribs = wdef.attribs(attribs, control, enabled);\n\n attribs[\"data-type\"] = control.controltype;\n if (tagName) {\n widget = $(\"<\" + tagName + \" \" + renderAttribs(attribs) + \"/>\");\n } else {\n widget = $(wdef.render(control, group, attribs));\n if (!widget) return null;\n }\n\n if (control.className) {\n widget.addClass(control.className);\n }\n control.$elt = widget;\n control._elt = widget.get(0);\n\n if (wdef && wdef.tagName) {\n /**\n Okay, some (older) definitions have a tagName definition ->\n from which a quite empty skeleton widget is created.\n\n Afterwards, they fill that very widget with a render function\n of a different signature than usual:\n\n Instead of (control (plain object), group (plain object), attribs (array)), they get\n (control (plain object), widget (jQuery collection), group (plain object))).\n\n */\n wdef.render(control, widget, group);\n }\n\n // attach an id whenever meaningful:\n // if (control.id && /\\d+$/.test(control.id))\n if (control.id) {\n // id used not to be safe, but now we prepend the groupid, making it safe.\n widget.attr(\"id\", control.id);\n }\n if (control._originalid) {\n // Use data-id for stuff refering to the interface, no matter in which group it is, such as informationsources.\n widget.attr(\"data-id\", control._originalid);\n }\n\n if (hasPath([\"metadata\", \"autocomplete\"], control)) {\n widget\n .attr(\"data-server-name\", control.name)\n .attr(\"name\", control.metadata.autocomplete)\n .attr(\"autocomplete\", control.metadata.autocomplete);\n }\n\n $(wGroup).append(widget);\n\n /* Insert a space between elements so that elements are reasonably\n * well-placed when CSS is disabled.\n */\n $(wGroup).append(\" \");\n\n // Tooltips:\n if (control.hint) {\n if (enabled) Mode.set(\"hasHints\");\n runHook(\"hinter\")(widget, assoc(\"enabled\", enabled, control));\n }\n widget.data(\"control\", control);\n\n /**\n * Dynamic properties\n */\n var dynprops = [\n \"maxlength\",\n \"minimum\",\n \"maximum\",\n \"notnull\",\n \"isForNotNull\",\n \"readonly\",\n \"precision\",\n \"stringmask\",\n \"errortext\",\n \"placeholder\"\n ],\n dynpropsforus = {};\n\n for (var ii in dynprops) {\n if (has(dynprops[ii], control))\n dynpropsforus[dynprops[ii]] = { to: control[dynprops[ii]] }; // .push(dynprops[ii]);\n }\n\n if (has(\"visible\", control) && control.visible === false) {\n dynpropsforus[\"visible\"] = { to: false }; // .push(dynprops[ii]);\n }\n // dynpropsforus.push(\"visible\");\n\n widget.data(\"anchor\", widget);\n\n if (wdef && wdef.afterRender) {\n wdef.afterRender(widget, control);\n }\n\n if (shouldWrap(control)) {\n wrapInlineInput(widget);\n }\n\n /* Allow class-based styling */\n if (control[\"font-class\"]) {\n widget.addClass(bbmClass(control[\"font-class\"]));\n }\n\n /**\n * Two things:\n * - Put control tags in data-tags of Element.\n * - Make TAG known to CSS as bb-tagged-TAG.\n */\n if (control[\"tags\"] instanceof Array) {\n $(widget).data(\"tags\", control[\"tags\"]);\n $.each(control[\"tags\"], function (i, tag) {\n widget.addClass(\"bb-tagged-\" + tag);\n });\n }\n\n Dynprops.update(widget, control, dynpropsforus);\n\n return widget;\n}\n\nfunction shouldWrap(control) {\n return (\n control.prelabel ||\n control.postlabel ||\n (arbitraryCoreProp(\"wrapAllSingleLiners\") === true &&\n compose(prop(\"couldWrap\"), getWidget)(control.controltype)) ||\n (control.placeholder &&\n arbitraryCoreProp(\"accessiblePlaceholders\") === true &&\n compose(prop(\"couldWrap\"), getWidget)(control.controltype))\n );\n}\n\nfunction wrapInlineInput(widget) {\n var control = widget.data(\"control\"),\n prelabel = control.prelabel,\n postlabel = control.postlabel;\n var anchor = widget.data(\"anchor\");\n var wraptag = \"span\";\n if (anchor.get(0).nodeName === \"DIV\") wraptag = \"div\";\n anchor.wrapAll(\n \"<\" +\n wraptag +\n ' data-wraps-type=\"' +\n control.controltype +\n '\" class=\"bb-input-wrap\">\"\n );\n anchor = anchor.parent();\n widget.data(\"anchor\", anchor);\n anchor.data({\n control: control,\n type: control.controltype\n });\n if (prelabel)\n anchor.prepend(\n '' +\n escapeHTML(prelabel) +\n \"\"\n );\n if (control.placeholder && arbitraryCoreProp(\"accessiblePlaceholders\")) {\n widget\n .get(0)\n .setAttribute(\n \"aria-describedby\",\n (\n (widget.get(0).getAttribute(\"aria-describedby\") || \"\") +\n ` ${control.id}--placeholder`\n ).trim()\n );\n anchor.append(\n `${escapeHTML(control.placeholder)}`\n );\n }\n if (postlabel)\n anchor.append(\n '' +\n escapeHTML(postlabel) +\n \"\"\n );\n}\n\nconst getControl = elt => $.data(elt, \"control\");\n\nexport { getControl, wControl };\n","export const listtypes = {\n radio: \"LIST\",\n checkmultilist: \"LIST\",\n customlist: \"LIST\",\n combobox: \"BOX\",\n listbox: \"BOX\",\n multilist: \"BOX\"\n};\n","/* global $ */\nimport { occurrences } from \"$json/lib/text-utils.js\";\nimport { getWidget } from \"./form-widgets.js\";\nimport {\n always,\n assoc,\n compose,\n cond,\n curry,\n either,\n path,\n propEq,\n T,\n tap\n} from \"./functional.js\";\nimport { _ } from \"./gettext.js\";\nimport { quotable } from \"./quotable.js\";\nimport { format, formatPlus } from \"./text-utils.js\";\nimport { listtypes } from \"./types.js\";\n\nconst numofnewlines = curry(occurrences)(\"\\n\");\n\n// Validate actual input, return true if it's ok, throw an error otherwise.\nexport function validateInput(node) {\n const $node = $(node),\n control = $node.data(\"control\");\n let ok = true,\n re,\n errortext,\n val,\n category;\n\n if (control === undefined) {\n throw \"Not a BB widget\";\n }\n\n if (control.visible === false) {\n return true;\n }\n category = listtypes[control.controltype];\n\n val = $node.val();\n\n if (control.stringmask) {\n re = new RegExp(control.stringmask);\n if (!re.test(val))\n throw format(\n control.errortext,\n compose(assoc(\"value\", val), quotable)(control)\n );\n }\n if (control.notnull) {\n if (category === \"LIST\") {\n ok = $node.is(\":has(:checked)\");\n } else if (category === \"BOX\") {\n // There could be a faux, checked, option telling us to\n // fill in the field. That is the second check here.\n ok = val !== null && val !== \"\";\n } else if (control.controltype == \"checkbox\") {\n ok = $node.is(\":checked\");\n } else if (control.controltype === \"grid\") {\n if (control.addallowed === false) {\n const checkable = control.columns.find(\n either(\n propEq(\"controltype\", \"radiobutton\"),\n propEq(\"controltype\", \"checkbox\")\n )\n );\n if (checkable) {\n ok = $node.is(\":has(:checked)\");\n }\n } else {\n // A required grid should have at least one row.\n // But if no rows **can** be added it would be rude and confusing to complain to the end-user.\n ok = control.value.length > 0 || control.addallowed === false;\n }\n } else {\n re = /\\S/;\n ok = re.test(val);\n }\n if (!ok) {\n throw cond([\n [path([\"metadata\", \"errrequired\"]), path([\"metadata\", \"errrequired\"])],\n [\n propEq(\"controltype\", \"datetimepicker\"),\n compose(c => formatPlus(_(\"Date required\"), c), quotable)\n ],\n [\n always([\"BOX\", \"LIST\"].indexOf(category) > -1),\n compose(c => format(_(\"Choice required\"), c), quotable)\n ],\n [T, compose(c => format(_(\"Field required\"), c), quotable)]\n ])(control);\n }\n }\n if (control.maxlength && control.maxlength > 0) {\n ok = val.length + numofnewlines(val) <= control.maxlength;\n if (!ok) {\n throw format(\n path([\"metadata\", \"errtexttoolong\"])(control) ||\n _(\"Text length exceeds the maximum of {maxlength} characters\"),\n quotable(control)\n );\n }\n }\n if (getWidget(control.controltype).validate) {\n return getWidget(control.controltype).validate(control, val);\n }\n return true;\n}\n","import {\n groupWith,\n map,\n filter,\n pipe,\n path,\n strictUniq,\n lensPath\n} from \"./functional.js\";\n\nconst pathToGroup = [\"metadata\", \"group\"];\nexport const pathGroup = path(pathToGroup);\nexport const lensGroup = lensPath([\"metadata\", \"group\"]);\n\nconst areOfOneQuestion = (a, b) => a.isfor === b.id || b.isfor === a.id;\n\nexport const groupInner = groupWith(areOfOneQuestion);\n\nconst InfinityIfMinus1 = num => (num + 1 || Infinity) - 1;\nconst indexOfOrInfinity = (sub, s) => InfinityIfMinus1(s.indexOf(sub));\nexport const baseGroup = s => s.substr(0, indexOfOrInfinity(\".\", s));\nexport const tailGroup = s => s.substr(indexOfOrInfinity(\".\", s) + 1);\n\nconst belongTogether = (a, b) =>\n areOfOneQuestion(a, b) ||\n (pathGroup(a) &&\n pathGroup(b) &&\n baseGroup(pathGroup(a)) === baseGroup(pathGroup(b)));\n\nexport const groupOuter = groupWith(belongTogether);\n\nexport const groupClasses = pipe(\n map(path[(\"metadata\", \"groupClasses\")]),\n filter(Boolean),\n strictUniq\n);\n\nexport const doGrouping = path([\"arbitrary\", \"core\", \"form-group\", \"on\"]);\n","export const normalize = s => s.toLowerCase().replace(/[^a-z0-9]/g, \"-\");\n","import { path, either, compose, prop } from \"./functional.js\";\nimport { conf } from \"./conf.js\";\n\n/**\n\nName keys follow this pattern:\n\n__\n\n is any of:\n\n- GROUPING: subgroup of questions and/or texts and/or links\n- ITEM: a question and/or text and/or link\n- QUESTION: a question (is also an item)\n- TEXT: a top level text (not a label for a question)\n- LINK: a top level link (so: not inside markdown)\n- PICTURE: a top level image (so : nto inside markdown)\n\nGROUPING ::= ITEM+\nITEM ::= QUESTION | TEXT | LINK | PICTURE\n\n is any of:\n\n- _CLASS_ : the css class to put on this type \n- _PREFIX_: a css class prefix\n- _DATA_: a data- attribute\n\nwhere can be anything.\n\nThe default values for those keys, thus the strings that willl be used\nin the generated DOM, are provided in nameDefaults. They can be\noverwritten in the `conf.json` file in the property\n`core.form-group.names` in order to retrofit older or other naming\nschemes.\n\n*/\n\nexport const /* A grouping groups items */\n GROUPING_CLASS = \"grouping-class\", // Class of grouping\n GROUPING_PREFIX_TYPE = \"grouping-prefix-type\", // prefix for -question, -text or -author\n GROUPING_DATA_NAME = \"grouping-data-name\", // data attribute conveying author provided group name\n GROUPING_DATA_LEVEL = \"grouping-data-level\", // grouping level, 1-based\n ITEM_PREFIX_AUTHORCLASS = \"item-prefix-authorclass\", // prefix for author class set with cssclasses on the metadata\n QUESTION_CLASS = \"question-class\", //: \"bb-questionlabelgroup\",\n QUESTION_PREFIX_TYPE = \"question-prefix-type\", //: \"bb-itype\",\n QUESTION_PREFIX_PROPERTY = \"question-prefix-property\", //: \"bb-itype\",\n QUESTION_DATA_LAYOUT = \"question-data-layout\", //: \"data-form-group-layout\",\n QUESTION_PREFIX_AUTHORSTYLE = \"question-prefix-authorstyle\", //: \"bb-g-\",\n QUESTION_CLASS_NOLABEL = \"question-class-nolabel\"; //: \"form-group__question--no-label\",\n\nconst nameDefaults = {\n [GROUPING_CLASS]: \"form-group\",\n [GROUPING_PREFIX_TYPE]: \"form-group-\",\n [GROUPING_DATA_NAME]: \"data-form-group-name\",\n [GROUPING_DATA_LEVEL]: \"data-form-group-level\",\n [ITEM_PREFIX_AUTHORCLASS]: \"form-group__item--author-class-\",\n [QUESTION_CLASS]: \"bb-questionlabelgroup\",\n [QUESTION_PREFIX_TYPE]: \"bb-itype\",\n [QUESTION_PREFIX_PROPERTY]: \"question-\", //: \"bb-itype\",\n [QUESTION_DATA_LAYOUT]: \"data-form-group-layout\",\n [QUESTION_PREFIX_AUTHORSTYLE]: \"bb-g-\",\n [QUESTION_CLASS_NOLABEL]: \"form-group__question--no-label\"\n};\n\n// const fg = {\n// [GROUPING_CLASS]: \"no-form-group-outer\",\n// [GROUPING_PREFIX_TYPE]: \"form-group-\",\n// [QUESTION_CLASS]: \"bb-questionlabelgroup p-form-group\",\n// [QUESTION_PREFIX_TYPE]: \"bb-itype-\",\n// [QUESTION_DATA_LAYOUT]: \"data-p-form-group-layout-type\",\n// [QUESTION_CLASS_NOLABEL]: \"p-form-group-orphaned\"\n// };\n\n// const bem_example = {\n// [GROUPING_CLASS]: \"form-group\",\n// [GROUPING_PREFIX_TYPE]: \"form-group-\",\n// [ITEM_PREFIX_AUTHORCLASS]: \"form-group__item--author-class-\",\n// [QUESTION_CLASS]: \"bb-questionlabelgroup\",\n// [QUESTION_PREFIX_TYPE]: \"form-group__question-\",\n// [QUESTION_DATA_LAYOUT]: \"data-form-group-layout\",\n// [QUESTION_PREFIX_AUTHORSTYLE]: \"form-group__question--author-style-\"\n// };\n\nconst pathToNames = path([\"arbitrary\", \"core\", \"form-group\", \"names\"]);\n\nexport const names = propArg =>\n either(compose(prop(propArg), pathToNames), _ => prop(propArg, nameDefaults))(\n conf\n );\n","/* global $ */\nimport {\n all,\n both,\n curry,\n filter,\n has,\n compose,\n ifElse,\n head,\n path,\n prop,\n propEq,\n any,\n find,\n pathOr,\n split,\n join,\n map,\n when,\n tap,\n cond,\n not\n} from \"./functional.js\";\nimport {\n isTextual,\n isPicture,\n isQuestion,\n isVisible\n} from \"./control-helpers.js\";\nimport { groupOuter, baseGroup, tailGroup, pathGroup } from \"./groupings\";\nimport { normalize } from \"./font-classes\";\nimport { getWidget } from \"./form-widgets.js\";\nimport { conf } from \"./conf\";\nimport * as n from \"./names.js\";\nimport { names } from \"./names.js\";\n\nconst doTopLevel = pathOr(true, [\n \"arbitrary\",\n \"core\",\n \"form-group\",\n \"toplevel\"\n]);\n\nconst doLegends = pathOr(true, [\n \"arbitrary\",\n \"core\",\n \"form-group\",\n \"doLegends\"\n]);\n\nconst getLayout = type =>\n pathOr(compose(prop(\"layout\"), getWidget)(type), [\n \"arbitrary\",\n \"form-group\",\n type\n ]);\n\nconst getGroupName = compose(when(Boolean, baseGroup), pathGroup, head);\n\n// Interface Font Style\nconst questionGroupClass = compose(\n s => names(n.QUESTION_PREFIX_AUTHORSTYLE) + s,\n normalize,\n prop(\"font-class\")\n);\n\n// interface metadata: cssclasses=\nexport const extraClasses = prefix =>\n compose(\n when(\n Boolean,\n compose(\n join(\" \"),\n map(compose(s => names(prefix) + s, normalize)),\n split(\" \")\n )\n ),\n path([\"metadata\", \"cssclasses\"])\n );\n\nconst asciify = s => s.replace(/[^a-z-]/g, \"-\");\n\nconst areAllInvisible = compose(not, any(isVisible));\nconst areAllReadonly = both(\n any(both(isQuestion, isVisible)),\n compose(all(prop(\"originalreadonly\")), filter(both(isQuestion, isVisible)))\n);\n\nconst areAllNotNull = both(\n any(both(isQuestion, isVisible)),\n compose(all(prop(\"notnull\")), filter(both(isQuestion, isVisible)))\n);\n\nconst updateClassWhen = curry((className, fn, controls, elt) => {\n elt.classList.toggle(className, fn(controls));\n});\n\nconst setReadonlyFGClass = updateClassWhen(\n names(n.GROUPING_PREFIX_TYPE) + \"-readonly\",\n areAllReadonly\n);\nconst setEmptyFGClass = updateClassWhen(\n names(n.GROUPING_PREFIX_TYPE) + \"-empty\",\n areAllInvisible\n);\nconst setRequiredFGClass = updateClassWhen(\n names(n.GROUPING_PREFIX_TYPE) + \"-required\",\n areAllNotNull\n);\n\nconst setReadonlyQClass = updateClassWhen(\n names(n.QUESTION_PREFIX_PROPERTY) + \"-readonly\",\n areAllReadonly\n);\nconst setEmptyQClass = updateClassWhen(\n names(n.QUESTION_PREFIX_PROPERTY) + \"-empty\",\n areAllInvisible\n);\nconst setRequiredQClass = updateClassWhen(\n names(n.QUESTION_PREFIX_PROPERTY) + \"-required\",\n areAllNotNull\n);\n\nexport const createFormGroup = (wControl, group, level) => c => {\n let formGroup;\n const groupName = getGroupName(c);\n\n if (\n groupName ||\n (doTopLevel(conf) &&\n (doLegends(conf) || !all(propEq(\"controltype\", \"legend\"))(c)))\n ) {\n formGroup = document.createElement(\"div\");\n formGroup.className = names(n.GROUPING_CLASS);\n formGroup.setAttribute(names(n.GROUPING_DATA_LEVEL), level);\n setEmptyFGClass(c, formGroup);\n setReadonlyFGClass(c, formGroup);\n setRequiredFGClass(c, formGroup);\n formGroup.addEventListener(\"bb:updatedControl\", ({ detail }) => {\n if (has(\"visible\", detail.Updates)) {\n setEmptyFGClass(c, formGroup);\n }\n if (has(\"readonly\", detail.Updates)) {\n setReadonlyFGClass(c, formGroup);\n }\n if (has(\"notnull\", detail.Updates)) {\n setRequiredFGClass(c, formGroup);\n }\n });\n if (groupName) {\n formGroup.setAttribute(names(n.GROUPING_DATA_NAME), asciify(groupName));\n formGroup.classList.add(names(n.GROUPING_PREFIX_TYPE) + \"-author\");\n } else if (find(isQuestion, c)) {\n formGroup.classList.add(names(n.GROUPING_PREFIX_TYPE) + \"-interface\");\n } else if (compose(isPicture, head)(c)) {\n formGroup.classList.add(names(n.GROUPING_PREFIX_TYPE) + \"-picture\");\n } else if (compose(isTextual, head)(c)) {\n formGroup.classList.add(names(n.GROUPING_PREFIX_TYPE) + \"-text\");\n }\n } else {\n formGroup = document.createDocumentFragment();\n }\n\n const cWithin = compose(\n groupOuter,\n map(\n when(\n pathGroup,\n tap(control =>\n compose(\n ifElse(\n s => s === \"\",\n () => delete control.metadata.group,\n group => (control.metadata.group = group)\n ),\n tailGroup\n )(control.metadata.group)\n )\n )\n )\n )(c);\n cWithin.forEach(\n cond([\n [\n getGroupName,\n compose(\n n => formGroup.appendChild(n),\n createFormGroup(wControl, group, level + 1)\n )\n ],\n [\n any(isQuestion),\n controls => {\n const answer = find(isQuestion, controls);\n const classes = [\n names(n.QUESTION_CLASS),\n `${names(n.QUESTION_PREFIX_TYPE)}-${answer.controltype}`,\n questionGroupClass(answer),\n extraClasses(n.ITEM_PREFIX_AUTHORCLASS)(answer),\n controls.length === 1 && names(n.QUESTION_CLASS_NOLABEL)\n ].filter(Boolean);\n const qlg = document.createElement(\"div\");\n qlg.setAttribute(\n names(n.QUESTION_DATA_LAYOUT),\n answer._layout || getLayout(answer.controltype)(conf)\n );\n qlg.className = classes.join(\" \");\n setEmptyQClass(controls, qlg);\n setReadonlyQClass(controls, qlg);\n setRequiredQClass(controls, qlg);\n qlg.addEventListener(\"bb:updatedControl\", ({ detail }) => {\n if (has(\"visible\", detail.Updates)) {\n setEmptyQClass(controls, qlg);\n }\n if (has(\"readonly\", detail.Updates)) {\n setReadonlyQClass(controls, qlg);\n }\n if (has(\"notnull\", detail.Updates)) {\n setRequiredQClass(controls, qlg);\n }\n });\n controls.forEach(c => wControl(c, group, $(qlg)));\n formGroup.appendChild(qlg);\n }\n ],\n [\n () => true,\n map(c => {\n const $widget = wControl(c, group, $(formGroup));\n if ($widget)\n $widget.addClass(extraClasses(n.ITEM_PREFIX_AUTHORCLASS)(c));\n })\n ]\n ])\n );\n return formGroup;\n};\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nvar t,i,s,e;const o=globalThis.trustedTypes,l=o?o.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,n=`lit$${(Math.random()+\"\").slice(9)}$`,h=\"?\"+n,r=`<${h}>`,u=document,c=(t=\"\")=>u.createComment(t),d=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,v=Array.isArray,a=t=>{var i;return v(t)||\"function\"==typeof(null===(i=t)||void 0===i?void 0:i[Symbol.iterator])},f=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=/>|[ \t\\n\f\\r](?:([^\\s\"'>=/]+)([ \t\\n\f\\r]*=[ \t\\n\f\\r]*(?:[^ \t\\n\f\\r\"'`<>=]|(\"|')|))|$)/g,$=/'/g,g=/\"/g,y=/^(?:script|style|textarea)$/i,b=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),T=b(1),x=b(2),w=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),P=new WeakMap,V=(t,i,s)=>{var e,o;const l=null!==(e=null==s?void 0:s.renderBefore)&&void 0!==e?e:i;let n=l._$litPart$;if(void 0===n){const t=null!==(o=null==s?void 0:s.renderBefore)&&void 0!==o?o:null;l._$litPart$=n=new C(i.insertBefore(c(),t),t,void 0,s)}return n.I(t),n},E=u.createTreeWalker(u,129,null,!1),M=(t,i)=>{const s=t.length-1,e=[];let o,h=2===i?\"\":\"\",u=f;for(let i=0;i\"===c[0]?(u=null!=o?o:f,d=-1):void 0===c[1]?d=-2:(d=u.lastIndex-c[2].length,l=c[1],u=void 0===c[3]?p:'\"'===c[3]?g:$):u===g||u===$?u=p:u===_||u===m?u=f:(u=p,o=void 0);const a=u===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";h+=u===f?s+r:d>=0?(e.push(l),s.slice(0,d)+\"$lit$\"+s.slice(d)+n+a):s+n+(-2===d?(e.push(void 0),i):a)}const c=h+(t[s]||\"\")+(2===i?\"\":\"\");return[void 0!==l?l.createHTML(c):c,e]};class N{constructor({strings:t,_$litType$:i},s){let e;this.parts=[];let l=0,r=0;const u=t.length-1,d=this.parts,[v,a]=M(t,i);if(this.el=N.createElement(v,s),E.currentNode=this.el.content,2===i){const t=this.el.content,i=t.firstChild;i.remove(),t.append(...i.childNodes)}for(;null!==(e=E.nextNode())&&d.length0){e.textContent=o?o.emptyScript:\"\";for(let s=0;s2||\"\"!==s[0]||\"\"!==s[1]?(this.H=Array(s.length-1).fill(A),this.strings=s):this.H=A}get tagName(){return this.element.tagName}I(t,i=this,s,e){const o=this.strings;let l=!1;if(void 0===o)t=S(this,t,i,0),l=!d(t)||t!==this.H&&t!==w,l&&(this.H=t);else{const e=t;let n,h;for(t=o[0],n=0;nnew n(t+\"\",e),o=new Map,r=(t,...s)=>{const r=s.reduce(((e,s,o)=>e+(t=>{if(t instanceof n)return t.cssText;if(\"number\"==typeof t)return t;throw Error(`Value passed to 'css' function must be a 'css' function result: ${t}. Use 'unsafeCSS' to pass non-literal values, but\\n take care to ensure page security.`)})(s)+t[o+1]),t[0]);let i=o.get(r);return void 0===i&&o.set(r,i=new n(r,e)),i},i=(e,n)=>{t?e.adoptedStyleSheets=n.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet)):n.forEach((t=>{const n=document.createElement(\"style\");n.textContent=t.cssText,e.appendChild(n)}))},S=t?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const n of t.cssRules)e+=n.cssText;return s(e)})(t):t;export{n as CSSResult,i as adoptStyles,r as css,S as getCompatibleStyle,t as supportsAdoptingStyleSheets,s as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as i}from\"./css-tag.js\";export{CSSResult,adoptStyles,css,getCompatibleStyle,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */var s,e,h,r;const o={toAttribute(t,i){switch(i){case Boolean:t=t?\"\":null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,i){let s=t;switch(i){case Boolean:s=null!==t;break;case Number:s=null===t?null:Number(t);break;case Object:case Array:try{s=JSON.parse(t)}catch(t){s=null}}return s}},n=(t,i)=>i!==t&&(i==i||t==t),l={attribute:!0,type:String,converter:o,reflect:!1,hasChanged:n};class a extends HTMLElement{constructor(){super(),this.Πi=new Map,this.Πo=void 0,this.Πl=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this.Πh=null,this.u()}static addInitializer(t){var i;null!==(i=this.v)&&void 0!==i||(this.v=[]),this.v.push(t)}static get observedAttributes(){this.finalize();const t=[];return this.elementProperties.forEach(((i,s)=>{const e=this.Πp(s,i);void 0!==e&&(this.Πm.set(e,s),t.push(e))})),t}static createProperty(t,i=l){if(i.state&&(i.attribute=!1),this.finalize(),this.elementProperties.set(t,i),!i.noAccessor&&!this.prototype.hasOwnProperty(t)){const s=\"symbol\"==typeof t?Symbol():\"__\"+t,e=this.getPropertyDescriptor(t,s,i);void 0!==e&&Object.defineProperty(this.prototype,t,e)}}static getPropertyDescriptor(t,i,s){return{get(){return this[i]},set(e){const h=this[t];this[i]=e,this.requestUpdate(t,h,s)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)||l}static finalize(){if(this.hasOwnProperty(\"finalized\"))return!1;this.finalized=!0;const t=Object.getPrototypeOf(this);if(t.finalize(),this.elementProperties=new Map(t.elementProperties),this.Πm=new Map,this.hasOwnProperty(\"properties\")){const t=this.properties,i=[...Object.getOwnPropertyNames(t),...Object.getOwnPropertySymbols(t)];for(const s of i)this.createProperty(s,t[s])}return this.elementStyles=this.finalizeStyles(this.styles),!0}static finalizeStyles(i){const s=[];if(Array.isArray(i)){const e=new Set(i.flat(1/0).reverse());for(const i of e)s.unshift(t(i))}else void 0!==i&&s.push(t(i));return s}static Πp(t,i){const s=i.attribute;return!1===s?void 0:\"string\"==typeof s?s:\"string\"==typeof t?t.toLowerCase():void 0}u(){var t;this.Πg=new Promise((t=>this.enableUpdating=t)),this.L=new Map,this.Π_(),this.requestUpdate(),null===(t=this.constructor.v)||void 0===t||t.forEach((t=>t(this)))}addController(t){var i,s;(null!==(i=this.ΠU)&&void 0!==i?i:this.ΠU=[]).push(t),void 0!==this.renderRoot&&this.isConnected&&(null===(s=t.hostConnected)||void 0===s||s.call(t))}removeController(t){var i;null===(i=this.ΠU)||void 0===i||i.splice(this.ΠU.indexOf(t)>>>0,1)}Π_(){this.constructor.elementProperties.forEach(((t,i)=>{this.hasOwnProperty(i)&&(this.Πi.set(i,this[i]),delete this[i])}))}createRenderRoot(){var t;const s=null!==(t=this.shadowRoot)&&void 0!==t?t:this.attachShadow(this.constructor.shadowRootOptions);return i(s,this.constructor.elementStyles),s}connectedCallback(){var t;void 0===this.renderRoot&&(this.renderRoot=this.createRenderRoot()),this.enableUpdating(!0),null===(t=this.ΠU)||void 0===t||t.forEach((t=>{var i;return null===(i=t.hostConnected)||void 0===i?void 0:i.call(t)})),this.Πl&&(this.Πl(),this.Πo=this.Πl=void 0)}enableUpdating(t){}disconnectedCallback(){var t;null===(t=this.ΠU)||void 0===t||t.forEach((t=>{var i;return null===(i=t.hostDisconnected)||void 0===i?void 0:i.call(t)})),this.Πo=new Promise((t=>this.Πl=t))}attributeChangedCallback(t,i,s){this.K(t,s)}Πj(t,i,s=l){var e,h;const r=this.constructor.Πp(t,s);if(void 0!==r&&!0===s.reflect){const n=(null!==(h=null===(e=s.converter)||void 0===e?void 0:e.toAttribute)&&void 0!==h?h:o.toAttribute)(i,s.type);this.Πh=t,null==n?this.removeAttribute(r):this.setAttribute(r,n),this.Πh=null}}K(t,i){var s,e,h;const r=this.constructor,n=r.Πm.get(t);if(void 0!==n&&this.Πh!==n){const t=r.getPropertyOptions(n),l=t.converter,a=null!==(h=null!==(e=null===(s=l)||void 0===s?void 0:s.fromAttribute)&&void 0!==e?e:\"function\"==typeof l?l:null)&&void 0!==h?h:o.fromAttribute;this.Πh=n,this[n]=a(i,t.type),this.Πh=null}}requestUpdate(t,i,s){let e=!0;void 0!==t&&(((s=s||this.constructor.getPropertyOptions(t)).hasChanged||n)(this[t],i)?(this.L.has(t)||this.L.set(t,i),!0===s.reflect&&this.Πh!==t&&(void 0===this.Πk&&(this.Πk=new Map),this.Πk.set(t,s))):e=!1),!this.isUpdatePending&&e&&(this.Πg=this.Πq())}async Πq(){this.isUpdatePending=!0;try{for(await this.Πg;this.Πo;)await this.Πo}catch(t){Promise.reject(t)}const t=this.performUpdate();return null!=t&&await t,!this.isUpdatePending}performUpdate(){var t;if(!this.isUpdatePending)return;this.hasUpdated,this.Πi&&(this.Πi.forEach(((t,i)=>this[i]=t)),this.Πi=void 0);let i=!1;const s=this.L;try{i=this.shouldUpdate(s),i?(this.willUpdate(s),null===(t=this.ΠU)||void 0===t||t.forEach((t=>{var i;return null===(i=t.hostUpdate)||void 0===i?void 0:i.call(t)})),this.update(s)):this.Π$()}catch(t){throw i=!1,this.Π$(),t}i&&this.E(s)}willUpdate(t){}E(t){var i;null===(i=this.ΠU)||void 0===i||i.forEach((t=>{var i;return null===(i=t.hostUpdated)||void 0===i?void 0:i.call(t)})),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}Π$(){this.L=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this.Πg}shouldUpdate(t){return!0}update(t){void 0!==this.Πk&&(this.Πk.forEach(((t,i)=>this.Πj(i,this[i],t))),this.Πk=void 0),this.Π$()}updated(t){}firstUpdated(t){}}a.finalized=!0,a.shadowRootOptions={mode:\"open\"},null===(e=(s=globalThis).reactiveElementPlatformSupport)||void 0===e||e.call(s,{ReactiveElement:a}),(null!==(h=(r=globalThis).reactiveElementVersions)&&void 0!==h?h:r.reactiveElementVersions=[]).push(\"1.0.0-rc.1\");export{a as ReactiveElement,o as defaultConverter,n as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","import{ReactiveElement as t}from\"@lit/reactive-element\";export*from\"@lit/reactive-element\";import{render as e,noChange as r}from\"lit-html\";export*from\"lit-html\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */var i,l,o,s,n,a;const c=t;(null!==(i=(a=globalThis).litElementVersions)&&void 0!==i?i:a.litElementVersions=[]).push(\"3.0.0-rc.1\");class h extends t{constructor(){super(...arguments),this.renderOptions={host:this},this.Φt=void 0}createRenderRoot(){var t,e;const r=super.createRenderRoot();return null!==(t=(e=this.renderOptions).renderBefore)&&void 0!==t||(e.renderBefore=r.firstChild),r}update(t){const r=this.render();super.update(t),this.Φt=e(r,this.renderRoot,this.renderOptions)}connectedCallback(){var t;super.connectedCallback(),null===(t=this.Φt)||void 0===t||t.setConnected(!0)}disconnectedCallback(){var t;super.disconnectedCallback(),null===(t=this.Φt)||void 0===t||t.setConnected(!1)}render(){return r}}h.finalized=!0,h._$litElement$=!0,null===(o=(l=globalThis).litElementHydrateSupport)||void 0===o||o.call(l,{LitElement:h}),null===(n=(s=globalThis).litElementPlatformSupport)||void 0===n||n.call(s,{LitElement:h});const u={K:(t,e,r)=>{t.K(e,r)},L:t=>t.L};export{h as LitElement,c as UpdatingElement,u as _Φ};\n//# sourceMappingURL=lit-element.js.map\n","\"use strict\";var u=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var c=(t,a)=>{for(var l in a)u(t,l,{get:a[l],enumerable:!0})},o=(t,a,l,r)=>{if(a&&typeof a==\"object\"||typeof a==\"function\")for(let i of s(a))!p.call(t,i)&&i!==l&&u(t,i,{get:()=>a[i],enumerable:!(r=n(a,i))||r.enumerable});return t};var T=t=>o(u({},\"__esModule\",{value:!0}),t);var b={};c(b,{Maybe:()=>e});module.exports=T(b);var e=class{constructor(a){this.value=a}static of(a){return new e(a)}map(a){return this.isEmpty()?e.of(null):e.of(a(this.value))}chain(a){let l=this.map(a).join();return l===null?e.of(null):l}getOrElse(a){return this.isEmpty()?a:this.value}join(){return this.value}isEmpty(){return this.value===null||this.value===void 0}};0&&(module.exports={Maybe});\n//# sourceMappingURL=index.js.map","import { _ } from \"./gettext\";\n\n/*** NUMBER UTILITIES BEGIN ***/\n\nexport function forceInRange(num, min, max) {\n if (typeof min == \"undefined\" && typeof max == \"undefined\") return num;\n if (typeof min == \"undefined\") return Math.min(max, num);\n if (typeof max == \"undefined\") return Math.max(min, num);\n if (min === max) return min;\n return Math.max(Math.min(max, num), min);\n}\n\nexport const Numerals = (function () {\n /**\n * Create a getter for array, consuming items, repeating the last one\n * indefinitely.\n *\n * @param {Array} arr The array to make a repeater for\n * @return {Function()} Gets next item in arr, repeating last item indefinitely\n */\n function makeLastItemRepeater(arr) {\n var _a = arr.slice();\n var _last;\n return function getIter() {\n _last = _a.shift() || _last;\n return _last;\n };\n }\n /**\n * Create a formatting function for (arabic-hindu) numerals.\n *\n * @param {String} radixPoint String (character) used as radix point.\n * @param {String} groupingChar String (character) used for grouping\n * digits before the radix point.\n * @param {Array} groupingRules (optional) Array defining\n * grouping rules. Each element in this array stands for a group,\n * tracking leftwards from the radix point. When no more elements\n * remain, the last element will be repeated indefinitely.\n *\n * Most language use [3] (the default). For Indian, use [3,2]; for Chinese (and\n * Japanese?), use [4].\n *\n * Besides these rules, the special case of formatting\n * four digits in a row without grouping and no\n * fractional part is supported, and cannot be overruled.\n *\n * @return {Function()} Formatting function.\n */\n function makeFormatter(radixPoint, groupingChar, groupingRules) {\n return function formatter(num) {\n var idx = makeLastItemRepeater(groupingRules || [3]);\n var split = num.toString().split(\".\");\n var integralPart = split[0];\n var fractionalPart = split[1];\n var neg = (integralPart[0] === \"-\" && \"-\") || \"\";\n if (neg) integralPart = integralPart.substr(1);\n var th,\n out = \"\";\n if (integralPart) {\n // The four-digit exception rule (such as in years):\n if (!fractionalPart && integralPart.length === 4) out = integralPart;\n else {\n integralPart = integralPart.split(\"\").reverse();\n while ((th = integralPart.splice(0, idx()))[0]) {\n out = th.reverse().join(\"\") + (out ? groupingChar : \"\") + out;\n }\n }\n }\n if (fractionalPart) return neg + out + radixPoint + fractionalPart;\n return neg + out;\n };\n }\n function makeParser(radixPoint, groupingChar) {\n /**\n * Match anything not a digit or negative sign\n */\n var thre = /[^0-9-]/g;\n /**\n * Match only optional leading minus digits,\n * radixPoint, groupingChar and space characters.\n */\n var testre = new RegExp(\"^s?-?[0-9 \" + radixPoint + groupingChar + \"]*$\");\n\n return function parser(s) {\n if (!testre.test(s)) throw new Error(_(\"Invalid number\"));\n var split = s.split(radixPoint);\n var integralPart = split[0].replace(thre, \"\");\n if (!/^-?[0-9]*$/.test(integralPart))\n throw new Error(_(\"Invalid number\"));\n var fractionalPart = split[1];\n if (fractionalPart) fractionalPart = fractionalPart.replace(/\\s/g, \"\");\n if (!fractionalPart) fractionalPart = \"0\";\n if (!/^[0-9]*$/.test(fractionalPart))\n throw new Error(_(\"Invalid number\"));\n // Room for errors here.\n return new Number(integralPart + \".\" + fractionalPart) + 0;\n };\n }\n\n return {\n parser: makeParser(\n _(\"__radixpoint__\", \".\"),\n _(\"__digitgroupingchar__\", \",\")\n ),\n formatter: makeFormatter(\n _(\"__radixpoint__\", \".\"),\n _(\"__digitgroupingchar__\", \",\"),\n _(\"__digitgroupingrules__\", [3])\n ),\n makeFormatter: makeFormatter,\n makeParse: makeParser,\n refresh: () => {\n // console.log(this);\n Numerals.parser = makeParser(\n _(\"__radixpoint__\", \".\"),\n _(\"__digitgroupingchar__\", \",\")\n );\n Numerals.formatter = makeFormatter(\n _(\"__radixpoint__\", \".\"),\n _(\"__digitgroupingchar__\", \",\"),\n _(\"__digitgroupingrules__\", [3])\n );\n }\n };\n})();\n/*** NUMBER UTILITIES END ***/\n","import { fromApiServer } from \"./location.js\";\nimport Vars from \"./vars.js\";\n\nif (!window.location.origin) {\n window.location.origin =\n window.location.protocol +\n \"//\" +\n window.location.hostname +\n (window.location.port ? \":\" + window.location.port : \"\");\n}\n\n/*** URL UTILITIES BEGIN ***/\nexport const urlutils = (function () {\n var mimetypes = {\n xsl: \"text/html\",\n html: \"text/html\",\n docx: \"application/msword\",\n pdf: \"application/pdf\",\n odt: \"application/vnd.oasis.opendocument.text\",\n rtf: \"application/rtf\",\n doc: \"application/msword\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\"\n };\n function caseReport(casus) {\n return fromApiServer(\"report?\" + Vars.querify(Vars.SESSION_KEYS, casus));\n }\n function getFiles(casus) {\n return \"getfiles?\" + Vars.querify(Vars.SESSION_KEYS, casus);\n }\n function isJS(url) {\n return url.match(/javascript:/);\n }\n function isEmptyish(url) {\n return url[0] === \"?\";\n }\n var JSAlertMessage =\n \"ALERT:\\nIt looks like someone is trying to eavesdrop on you,\" +\n \" trying to evaluate JavaScript code. \" +\n \"This person may want to steal private information \" +\n \"from you or other persons. \" +\n \"For your safety and that of others, \" +\n \"please contact this website \" +\n \"to report this message.\";\n return {\n isJS,\n isEmptyish,\n JSAlertMessage,\n getFiles,\n caseReport,\n mimetype: function (url) {\n const absoluteURL = new URL(\n fromApiServer(url),\n `${location.protocol}${location.host}${location.pathname}`\n );\n const filename = absoluteURL.pathname.endsWith(\"/getfile\")\n ? new URLSearchParams(absoluteURL.search).get(\"filename\")\n : absoluteURL.pathname.split(\"/\").pop();\n if (!filename) return null;\n const ext = filename.match(/\\.([^?.]+)$/),\n mimetype = ext && mimetypes[ext[1]];\n if (!mimetype) return null;\n return {\n mimetype: mimetype,\n ext: ext[1]\n };\n }\n };\n})();\n/*** URL UTILITIES END ***/\n","/* global $ */\nimport { html, render } from \"lit\";\nimport { Maybe } from \"@cahmoraes93/maybe\";\nimport { A11y, observeDatepickers } from \"./a11y.js\";\nimport { conf, propFinder } from \"./conf.js\";\nimport { wControl, getControl } from \"./control.js\";\nimport { quotable } from \"./quotable.js\";\nimport {\n isLabel,\n isOption,\n isQuestion,\n isReadOnly,\n renderAttribs,\n setAttribs\n} from \"./control-helpers.js\";\nimport { checkDate, onChangeDate, parseDate, leadWithZeroes } from \"./dates.js\";\nimport { escapeHTML } from \"./escape.js\";\nimport { registerWidget } from \"./form-widgets.js\";\nimport {\n allPass,\n always,\n applyTo,\n both,\n compose,\n chain,\n dec,\n dissoc,\n find,\n F,\n gt,\n head,\n has,\n ifElse,\n inc,\n join,\n map,\n mergeLeft,\n path,\n propEq,\n when,\n pathEq,\n reverse,\n pipe,\n lensPath,\n lensProp,\n over,\n append,\n assoc,\n infichain,\n toLower,\n omit,\n nth,\n prop,\n propOr,\n equals,\n tap\n} from \"./functional.js\";\n\nimport { _ } from \"./gettext.js\";\nimport { fromApiServer } from \"./location.js\";\nimport { forceInRange, Numerals } from \"./numerals.js\";\nimport { format, formatPlus } from \"./text-utils.js\";\nimport { urlutils } from \"./url-utils.js\";\n\nconst arbitraryCoreProp = propFinder(conf, \"arbitrary.core\");\n\nfunction disconnectValue({ input, value, filter = x => x }) {\n input.setAttribute(\"data-server-value\", value);\n $(input).on(\"change\", function () {\n try {\n var newVal = filter(input.value, input);\n } catch (e) {\n //\n } finally {\n if (typeof newVal !== \"undefined\") {\n input.setAttribute(\"data-server-value\", newVal);\n }\n }\n });\n}\n\nconst noAttribs = always({});\n\nconst omitName = dissoc(\"name\");\nconst omitRequired = dissoc(\"aria-required\");\n\nconst emptyTag = (tagName, attribs) => {\n const elt = document.createElement(tagName);\n setAttribs(elt, attribs);\n return elt;\n};\nconst valueInside = (control, attribs, tagName) => {\n const elt = emptyTag(tagName, attribs);\n if (tagName === \"textarea\") {\n elt.value = control.value;\n } else {\n elt.innerHTML =\n control.text || escapeHTML(control.value).replace(/\\r?\\n/g, \"
\");\n }\n return elt;\n};\n\nconst checkbox = {\n name: \"checkbox\",\n render: (control, group, attribs) => {\n return emptyTag(\"input\", attribs);\n },\n attribs: (attr, control, enabled) =>\n Object.assign(\n {},\n attr,\n {\n type: \"checkbox\"\n },\n //Interface already has got a value server-side, so not\n //sending it back poses no problem.\n control.value && { checked: true }\n ),\n setValue: (input, value, requestor) => {\n input.checked = value;\n },\n layout: \"inline\"\n};\n\nregisterWidget(checkbox);\n\nconst picture = {\n name: \"picture\",\n render: (control, group, attribs) => emptyTag(\"img\", attribs),\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n alt: control.alttext,\n src: fromApiServer(control.filename)\n })\n};\n\nregisterWidget(picture);\n\nexport const edit = {\n name: \"edit\",\n couldWrap: true,\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n type: \"text\",\n autocomplete: \"off\",\n value: control.value\n }),\n render: (control, group, attribs) => emptyTag(\"input\", attribs),\n setValue: (input, value) => {\n input.value = value;\n },\n layout: \"aside\"\n};\n\nregisterWidget(edit);\n\nconst memo = {\n name: \"memo\",\n attribs: (attr, control, enabled) => {\n // const attribs = [\"name\", control.name];\n // if (control.width && control.height && control[\"font-size\"]) {\n // attribs.cols= parseInt(control.width / (control[\"font-size\"] * 0.75))\n // attribs.rows = parseInt(control.height / (control[\"font-size\"] * 1.5))\n // }\n // return [...attr, ...attribs];\n return attr;\n },\n render: (control, group, attribs) => {\n return valueInside(control, attribs, \"textarea\");\n },\n setValue: edit.setValue,\n layout: \"below\"\n};\n\nregisterWidget(memo);\n\nconst label = {\n name: \"label\",\n fixup: control => {\n control.value = (control.value || \"\").replace(/\\r\\n/g, \"\\n\"); // Normalize Windows-style (typewriter) newlines\n return control;\n },\n attribs: (attr, control, enabled) =>\n Object.assign(\n omitName(attr),\n enabled && control.isFor && { for: control.isFor },\n {\n class: `${\n control.isfor || has(\"colname\", control) ? \"bb-label\" : \"bb-text\"\n } bb-md-able`\n }\n ),\n render: (control, group, attribs) => {\n return valueInside(\n control,\n attribs,\n control._subtype === \"heading\"\n ? \"h\" + Math.min(6, control._level || 2)\n : control.isFor\n ? \"label\"\n : \"div\"\n );\n },\n setValue: (input, value) => {\n input.innerHTML = escapeHTML(value).replace(/\\r?\\n/g, \"
\");\n }\n};\n\nregisterWidget(label);\n\nexport const linklabel = {\n name: \"linklabel\",\n fixup: control => {\n control.value = control.value.trim();\n // Fix 'empty' or JS-links\n if (urlutils.isEmptyish(control.url) || urlutils.isJS(control.url)) {\n if (urlutils.isJS(control.url)) control.value = urlutils.JSAlertMessage;\n delete control.url;\n }\n return control;\n },\n attribs: (attr, control, enabled) => {\n let linkClassName = \"\";\n\n if (control.url) {\n attr[\"href\"] = fromApiServer(control.url);\n if (control.url.match(/mailto:/)) {\n attr[\"type\"] = \"email\";\n linkClassName = \"mail\";\n } else {\n linkClassName = \"bb-external\";\n if (control.isreport) linkClassName += \" report\";\n var mimetype = control.mimetype || urlutils.mimetype(control.url);\n if (mimetype) {\n attr[\"type\"] = mimetype.mimetype;\n linkClassName += \" \" + mimetype.ext;\n }\n }\n if (control.url[0] !== \"#\") attr[\"target\"] = \"_blank\";\n }\n linkClassName += \" bb-text\";\n attr[\"class\"] = linkClassName;\n return omitName(attr);\n },\n render: (control, group, attribs) => {\n return valueInside(control, attribs, \"a\");\n },\n setValue: (input, value) => {\n input.innerHTML = escapeHTML(value).replace(/\\r?\\n/g, \"
\");\n },\n layout: \"below\"\n};\n\nregisterWidget(linklabel);\n\nconst listlabel = {\n name: \"listlabel\",\n attribs: compose(\n omitName,\n omitRequired,\n mergeLeft({\n type: \"listlabel\",\n class: \"listlabel\"\n })\n ),\n item: item =>\n `
  • ${escapeHTML(item).replace(/\\\\n/g, \"
    \")}
  • `,\n render: (control, group, attribs) => {\n const value = control.value;\n const items = compose(join(\"\"), map(listlabel.item))(value);\n const widget = `
      \n${items}
    `;\n return $(widget);\n },\n setValue: (input, value, requestor) => {\n input.innerHTML = compose(join(\"\"), map(listlabel.item))(value);\n $.fn.showdown && $(input).find(\"li\").showdown();\n },\n layout: \"below\"\n};\n\nregisterWidget(listlabel);\n\nconst optionbox = {\n render: (control, group, attribs) => {\n const value = control.value;\n const widget = $(``);\n // Set head of drop-down list to an empty item.\n // If value[0].value is already the empty string, the server\n // has already done this for us (pre 4.7 or dataset-based\n // drop-down).\n // If one of the options has already been selected, do *not*\n // add this empty option.\n // @todo: remove this code once server release 4.7 or higher\n // runs everywhere.\n if (\n control.controltype === \"combobox\" &&\n value.length > 0 &&\n value[0].value !== \"\" &&\n !value.some(function (value) {\n return value.selected === true;\n })\n ) {\n value.unshift({ option: \"\", value: \"\" });\n }\n optionbox.setValue(widget.get(0), value);\n return widget;\n },\n setValue: (input, value) => {\n const options = [...input.querySelectorAll(\"option\")];\n const len = options.length;\n const newLen = value.length;\n const newOptions = input.append ? [] : null;\n let selectedValue = \"\";\n for (let i = 0; i < newLen; i++) {\n const option = value[i];\n const optionElt = options[i] || document.createElement(\"option\");\n optionElt.value = option.value;\n optionElt.textContent =\n value[i].value === \"\" ? _(\"Choose...\") : option.option;\n optionElt.classList.toggle(\"bb-valueless\", option.value === \"\");\n if (option.selected) {\n selectedValue = option.value;\n }\n if (i > len - 1) {\n if (newOptions) {\n newOptions.push(optionElt);\n } else {\n input.appendChild(optionElt);\n }\n }\n }\n if (newOptions.length) {\n input.append(...newOptions);\n } else if (newLen < len) {\n [...input.querySelectorAll(`option:nth-child(1n+${newLen + 1})`)].forEach(\n input => input.parentNode.removeChild(input)\n );\n }\n input.value = selectedValue;\n }\n};\n\nconst combobox = {\n name: \"combobox\",\n // fixup: control => {\n // if (control.freetext === true) {\n // control.controltype = \"edit\";\n // control.datalist = control.value.map(({ option }) => option);\n // control.placeholder = _(\"Choose or type...\");\n // let val = control.value.find(v => v.selected);\n // if (val) control.value = val.option;\n // else control.value = \"\";\n // }\n // return control;\n // },\n fixup: control => {\n if (control.freetext === true) {\n control.controltype = \"freebox\";\n\n // control.datalist = control.value.map(({ option }) => option);\n // control.placeholder = _(\"Choose or type...\");\n // let val = control.value.find(v => v.selected);\n // if (val) control.value = val.option;\n // else control.value = \"\";\n }\n return control;\n },\n couldWrap: true,\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n name: control.name,\n size: 1\n }),\n render: optionbox.render,\n setValue: optionbox.setValue,\n layout: \"below\"\n};\n\nregisterWidget(combobox);\n\nconst listbox = {\n name: \"listbox\",\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n name: control.name,\n size: control.value.length\n }),\n render: optionbox.render,\n setValue: optionbox.setValue,\n layout: \"below\"\n};\n\nregisterWidget(listbox);\n\nconst multilist = {\n name: \"multilist\",\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n name: control.name,\n size: control.value.length,\n multiple: \"multiple\"\n }),\n render: optionbox.render,\n setValue: (input, value, requestor) => {\n const selected = value.find(option => option.selected === true);\n input.value = selected.value;\n },\n layout: \"below\"\n};\n\nregisterWidget(multilist);\n\nconst optionlist = {\n render: (control, group, attribs) => {\n const value = control.value;\n if (value.length === 0) return null;\n const widget = $(`
      `);\n for (let i = 0; i < value.length; i++) {\n let id = control.id + \"-\" + i;\n var option = $(`\n
    • \n \n
    • \n `);\n widget.append(option);\n widget.find(\"input:last\").val(value[i].value);\n }\n return widget;\n },\n onrequired: (input, required) => {\n // $(input).find(\"input\").attr(\"aria-required\", required);\n },\n onreadonly: (list, readonly) => {\n list.classList.toggle(\"bb-disabled\", readonly);\n [...list.querySelectorAll(\"input\")].forEach(input => {\n input.disabled = readonly;\n });\n }\n};\n\nconst checklist = {\n name: \"checkmultilist\",\n attribs: compose(omitRequired, assoc(\"class\", \"checklist bb-option-list\")),\n render: optionlist.render,\n onrequired: optionlist.onrequired,\n onreadonly: optionlist.onreadonly,\n allowUpdatingSelf: true,\n setValue: (input, value, requestor) => {\n const control = $(input).data(\"control\");\n value.forEach(({ selected }, index) => {\n const option = input.querySelector(`[id=\"${control.id}-${index}\"]`);\n if (!option) return;\n if (option.checked !== selected) option.checked = selected;\n $(option).trigger(\"programmatically-changed\");\n });\n },\n layout: \"below\"\n};\n\nregisterWidget(checklist);\n\nconst radiolist = {\n name: \"radio\",\n attribs: compose(omitRequired, assoc(\"class\", \"radiogroup bb-option-list\")),\n render: optionlist.render,\n allowUpdatingSelf: true,\n onrequired: optionlist.onrequired,\n onreadonly: optionlist.onreadonly,\n setValue: (input, value, requestor) => {\n const control = $(input).data(\"control\");\n const index = value.findIndex(option => option.selected === true);\n if (index === -1) {\n input.querySelectorAll(`[id|=\"${control.id}\"]`).forEach(i => {\n i.checked = false;\n i.closest(\".bb-option\").classList.remove(\"checked\");\n });\n return;\n }\n const option = input.querySelector(`[id=\"${control.id}-${index}\"]`);\n option.checked = true;\n $(option).trigger(\"programmatically-changed\");\n },\n layout: \"below\"\n};\n\nregisterWidget(radiolist);\n\nconst datepicker = {\n name: \"datetimepicker\",\n couldWrap: true,\n fixup: control => {\n control.placeholder = _(\"dateplaceholder\");\n return control;\n },\n serverToWidgetValue: value =>\n $.datepicker.formatDate(\n $.datepicker._defaults.dateFormat,\n parseDate(value)\n ),\n widgetToServerValue: input =>\n leadWithZeroes(\n $.datepicker.formatDate(\"yy-mm-dd\", $(input).datepicker(\"getDate\"))\n ),\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n value: datepicker.serverToWidgetValue(control.value),\n autocomplete: \"off\",\n placeholder: _(\"dateplaceholder\", _(\"select date\")),\n type: \"text\"\n }),\n render: (control, group, attribs) => {\n return emptyTag(\"input\", attribs);\n },\n afterRender: (widget, control) => {\n if (!control.originalreadonly || control.dynamic) {\n widget.datepicker();\n observeDatepickers();\n\n control._elt.addEventListener(\"change\", onChangeDate);\n control._elt.addEventListener(\n \"keydown\",\n when(propEq(\"key\", \"Enter\"), () => {\n const ev = new InputEvent(\"change\", {\n bubbles: true,\n cancelable: true,\n view: window\n });\n control._elt.dispatchEvent(ev);\n })\n );\n\n disconnectValue({\n input: widget.get(0),\n filter: function (value, input) {\n return datepicker.widgetToServerValue(input);\n },\n value: control.value\n });\n widget.datepicker(\"widget\").hide();\n }\n },\n setValue: (input, value) => {\n input.setAttribute(\"data-server-value\", value);\n input.value = datepicker.serverToWidgetValue(value);\n },\n validate: (control, value) => {\n if (!control.notnull && (value || \"\").trim() === \"\") {\n // Side effect\n $($(control.$elt).datepicker(\"option\", \"altField\")).attr(\"value\", \"\");\n }\n return checkDate(control, value);\n },\n layout: \"aside\"\n};\n\nregisterWidget(datepicker);\n\nconst numedit = {\n name: \"numedit\",\n couldWrap: true,\n getMaxChars: control => {\n var max, min;\n if (has(\"maximum\", control))\n max = Numerals.formatter(\n control.maximum.toFixed(control.precision)\n ).length;\n if (has(\"minimum\", control))\n min = Numerals.formatter(\n control.minimum.toFixed(control.precision)\n ).length;\n if (typeof min === \"undefined\") return max;\n if (typeof max === \"undefined\") return undefined;\n return Math.max(max, min);\n },\n serverToWidgetValue: value => Numerals.formatter(value),\n // widgetToServerValue: input => input.value,\n attribs: (attr, control, enabled) => {\n const maxchars = numedit.getMaxChars(control);\n return Object.assign(\n {},\n attr,\n {\n type: \"text\",\n class: \"numedit\",\n autocomplete: \"off\",\n name: control.name, // Prevent bug (in JSON grid) (see mantis#5416)\n // value = control.value = parseFloat(control.value || 0);\n value: parseFloat(control.value || 0).toFixed(control.precision)\n },\n // maxchars -- not to be confused with maxlength, which used\n // for validation. This is just to aid layout decisions.\n maxchars && { \"data-maxchars\": maxchars }\n );\n },\n render: (control, group, attribs) => emptyTag(\"input\", attribs),\n afterRender: (widget, control) => {\n widget.data(\"anchor\", widget.spinner(control));\n },\n setValue: (input, value) => {\n const control = $.data(input, \"control\");\n input.value = numedit.serverToWidgetValue(\n parseFloat(value || 0).toFixed(control.precision)\n );\n },\n validate: function (control, value) {\n if (control.controltype !== \"numedit\")\n throw \"_validateNumber called on something not a number\";\n const metadata = control.metadata || {};\n var val;\n try {\n val = Numerals.parser(value);\n } catch (e) {\n throw new Error(\n format(\n metadata.errnuminvalid || _(\"Invalid number\"),\n compose(assoc(\"value\", value), numedit.quotable)(control)\n )\n );\n }\n control.hasMax = has(\"maximum\", control);\n control.hasMin = has(\"minimum\", control);\n try {\n if (typeof val !== \"number\")\n throw metadata.errnuminvalid || _(\"Invalid number\");\n if (control.hasMax && control.hasMin) {\n if (val < control.minimum || val > control.maximum) {\n throw (\n metadata.errnumnotinrange ||\n _(\"Value has to lie between {minimum} and {maximum}\")\n );\n }\n } else if (control.hasMax) {\n if (val > control.maximum) {\n if (control.maximum === 0)\n throw (\n metadata.errnumnotnegativeorzero ||\n _(\"Negative number or zero expected\")\n );\n else if (control.maximum === -1)\n throw metadata.errnumnotnegative || _(\"Negative number expected\");\n else\n throw (\n metadata.errnumabovemaximum ||\n _(\"Value has to lie below {maximum}\")\n );\n }\n } else if (control.hasMin) {\n if (val < control.minimum) {\n if (control.minimum === 0)\n throw (\n metadata.errnumnotpositiveorzero ||\n _(\"Positive number or zero expected\")\n );\n else if (control.minimum === 1)\n throw metadata.errnumnotpositive || _(\"Positive number expected\");\n else\n throw (\n metadata.errnumbelowminimum ||\n _(\"Value has to lie above {minimum}\")\n );\n }\n }\n } catch (e) {\n throw formatPlus(\n e,\n compose(assoc(\"value\", value), numedit.quotable)(control)\n );\n }\n\n return true;\n },\n quotable: compose(\n when(has(\"minimum\"), over(lensProp(\"minimum\"), Numerals.formatter)),\n when(has(\"maximum\"), over(lensProp(\"maximum\"), Numerals.formatter)),\n when(\n has(\"minimum\"),\n chain(assoc(\"minimum-1\"), compose(dec, prop(\"minimum\")))\n ),\n when(\n has(\"maximum\"),\n chain(assoc(\"maximum+1\"), compose(inc, prop(\"maximum\")))\n ),\n quotable\n ),\n layout: \"aside\"\n};\n\nregisterWidget(numedit);\n\nconst freebox = {\n name: \"freebox\",\n couldWrap: true,\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n \"type\": \"text\",\n \"data-type\": control.controltype,\n \"list\": `${control.id}-list`,\n \"placeholder\": _(\"Choose...\"),\n \"value\": freebox._realValue(control.value)\n }),\n _realValue: compose(propOr(\"\", \"option\"), find(prop(\"selected\"))),\n setValue: function (input, value, requestor) {\n input.value = freebox._realValue(value);\n },\n render: (control, group, attribs) => emptyTag(\"input\", attribs),\n afterRender: (widget, control) => {\n control._elt.insertAdjacentHTML(\n \"afterEnd\",\n `\n${control.value\n .map(({ option }) => `\n`\n );\n },\n layout: \"aside\"\n};\n\nregisterWidget(freebox);\n\nconst _radioButtonWidget = {\n name: \"radiobutton\",\n tagName: \"input\",\n attribs: (attr, control, enabled) =>\n Object.assign(\n {},\n attr,\n { type: \"radio\", value: control.value },\n control.selected && { checked: \"checked\" }\n ),\n render: $.noop\n};\n\nregisterWidget(_radioButtonWidget);\n\nconst _rangeWidget = {\n name: \"range\",\n tagName: \"input\",\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n type: \"range\",\n value: control.value\n }),\n render: $.noop,\n layout: \"aside\"\n};\n\nregisterWidget(_rangeWidget);\n\nconst _buttonWidget = {\n name: \"button\",\n attribs: (attr, control, enabled) =>\n Object.assign(\n {},\n attr,\n { type: \"submit\", value: control.value },\n control.label && { \"aria-label\": control.label }\n ),\n render: (control, group, attribs) => valueInside(control, attribs, \"button\"),\n setValue: (elt, value, requestor, Updates) => {\n if (has(\"text\", Updates)) elt.innerHTML = Updates.text.to;\n if (has(\"value\", Updates)) elt.value = Updates.value.to;\n elt.classList.toggle(\"bb-record-del\", Updates.value.to.endsWith(\"-\"));\n elt.classList.toggle(\"bb-record-add\", Updates.value.to.endsWith(\"+\"));\n }\n};\n\nregisterWidget(_buttonWidget);\n\nconst _legendWidget = {\n name: \"legend\",\n tagName: \"legend\",\n attribs: noAttribs,\n\n render: function (control, widget, group) {\n var level;\n if (!conf.a11y.strictlegends && control._subtype === \"heading\") {\n level = Math.min(6, control._level || 2);\n // Trim value and control.value itself as well.\n widget.html(\n \"' +\n escapeHTML(control.value.trim()) +\n \"\"\n );\n } else {\n widget.text(control.value);\n widget.addClass(\"bb-md-able\");\n }\n }\n};\n\nregisterWidget(_legendWidget);\n\nconst _captionWidget = {\n name: \"caption\",\n tagName: \"caption\",\n attribs: noAttribs,\n render: function (control, widget, group) {\n widget.text(control.value.trim());\n widget.addClass(\"bb-md-able\");\n }\n};\n\nregisterWidget(_captionWidget);\n\nconst _alertWidget = {\n name: \"alert\",\n tagName: \"p\",\n attribs: noAttribs,\n render: function (control, widget, group) {\n widget.text(control.value);\n // Yup, this widget exists mainly for this\n // side-effect -- setting role=\"alert\",\n // aria-live=\"assertive\" does not do the\n // trick - and forcing focus looks ugly too.\n A11y.log(control.value);\n }\n};\n\nregisterWidget(_alertWidget);\n\nexport const grid = {\n name: \"grid\",\n attribs: compose(omitRequired, omitName),\n item: item =>\n `
    • ${escapeHTML(item).replace(/\\\\n/g, \"
      \")}
    • `,\n renderable: control => {\n const copy = assoc(\n \"addPlacement\",\n !control.addallowed\n ? \"none\"\n : control.value.length === 0 ||\n arbitraryCoreProp(\"putAddRowButtonBelowGrid\")\n ? \"below\"\n : \"insert\",\n control\n );\n return pipe(\n when(\n propEq(\"addPlacement\", \"insert\"),\n compose(\n over(\n lensProp(\"columns\"),\n append({\n controltype: \"button\",\n text: `${\n (control.metadata && control.metadata.insertbuttontext) ||\n _(\"insert row\")\n }+`,\n name: \"update\",\n className: \"bb-record-add\",\n readonly: false,\n label: _(\"insert row\")\n })\n ),\n over(\n lensProp(\"value\"),\n map((row, i) =>\n append(\n {\n value:\n control.name +\n \".\" +\n ((control.offset || 0) + i + 1) +\n \".\" +\n \"+\"\n },\n row\n )\n )\n )\n )\n ),\n when(\n propEq(\"deleteallowed\", true),\n compose(\n over(\n lensProp(\"columns\"),\n append({\n controltype: \"button\",\n name: \"update\",\n className: \"bb-record-del\",\n readonly:\n !control.notnull ||\n control.value.length > 1 ||\n (control.showcolumns && control.addallowed)\n ? false\n : true,\n text: `${\n (control.metadata && control.metadata.deletebuttontext) ||\n _(\"delete row\")\n }-`\n })\n ),\n over(\n lensProp(\"value\"),\n map((row, i) =>\n append(\n {\n value:\n control.name + \".\" + ((control.offset || 0) + i) + \".\" + \"-\"\n },\n row\n )\n )\n )\n )\n ),\n infichain([\n prop(\"columns\"),\n (columns, grid) => {\n return over(\n lensProp(\"value\"),\n map((row, row_i) =>\n map((cell, cell_i) =>\n compose(\n when(\n both(prop(\"colname\"), isQuestion),\n assoc(\"aria\", { labelledby: `${control.id}-col-${cell_i}` })\n ),\n when(prop(\"colname\"), cell =>\n assoc(\"meta\", { label: cell.colname }, cell)\n ),\n cell =>\n Object.assign(\n {},\n columns[cell_i],\n {\n id:\n control.id +\n \"-\" +\n ((control.offset || 0) + row_i) +\n \"-\" +\n cell_i\n },\n cell\n ),\n assoc(\"_row_index\", (control.offset || 0) + row_i),\n assoc(\"_cell_index\", cell_i)\n )(cell)\n )(row)\n ),\n grid\n );\n }\n ]),\n over(\n lensProp(\"columns\"),\n map((col, col_i) => assoc(\"id\", `${control.id}-col-${col_i}`, col))\n ),\n over(\n lensProp(\"value\"),\n map(\n map((cell, cell_i, cells) =>\n compose(\n assoc(\"_tag\", grid.cellTag(cell, cells)),\n when(\n allPass([\n isLabel,\n pipe(prop(\"_cell_index\"), gt, applyTo(0)),\n () => isOption(cells[cell_i - 1])\n ]),\n cell => assoc(\"isFor\", cells[cell_i - 1].id, cell)\n ),\n when(\n allPass([\n isOption,\n propEq(\"_cell_index\", 0),\n () => isLabel(cells[cell_i + 1])\n ]),\n cell =>\n over(\n lensPath([\"aria\", \"labelledby\"]),\n col_id => `${cells[cell_i + 1].id} ${col_id || \"\"}`,\n cell\n )\n )\n )(cell)\n )\n )\n )\n )(copy);\n },\n cellTag: (cell, row) => {\n return cell.value === null\n ? null\n : cell._rowspan && cell._cell_index === 0 && row.length > 1\n ? \"th\"\n : \"td\";\n },\n columnheader: column => {\n const header = document.createElement(\"th\");\n header.classList.add(\"bb-md-able\");\n header.setAttribute(\"data-rowtype\", column.controltype);\n header.setAttribute(\"data-rowreadonly\", Boolean(column.readonly));\n if (has(\"colname\", column)) {\n header.innerText = column.colname;\n header.id = column.id;\n }\n return header;\n },\n colheaderids: ifElse(\n prop(\"showcolumns\"),\n compose(\n map(ifElse(propEq(\"controltype\", \"button\"), F, prop(\"id\"))),\n prop(\"columns\")\n ),\n compose(map(F), prop(\"columns\"))\n ),\n rowheaderid: (rows, i) => {\n const rows_up_to_here = rows.slice(0, i + 1);\n return compose(\n prop(\"value\"),\n map(compose(id => `${id}--cell`, prop(\"id\"), head)),\n Maybe.of,\n find(pathEq([0, \"_tag\"], \"th\")),\n reverse\n )(rows_up_to_here);\n },\n cell: cell => {\n const tag = cell._tag;\n const e_cell =\n tag === null\n ? document.createComment(\"empty cell\")\n : document.createElement(tag);\n if (tag === \"th\") {\n e_cell.id = `${cell.id}--cell`;\n }\n return e_cell;\n },\n cellSetAttributes: (e_cell, cell) => {\n if (cell._tag === null) return e_cell;\n if (cell._tag === \"th\") e_cell.setAttribute(\"scope\", \"row\");\n if (cell._rowspan > 1) e_cell.setAttribute(\"rowspan\", cell._rowspan);\n else e_cell.removeAttribute(\"rowspan\");\n if (cell.headers) e_cell.setAttribute(\"headers\", cell.headers);\n else e_cell.removeAttribute(\"headers\");\n if (typeof cell.colname !== \"undefined\")\n e_cell.setAttribute(\"data-column\", cell.colname);\n else e_cell.removeAttribute(\"data-column\");\n e_cell.classList.add(\"nth-child-\" + (cell._cell_index + 1));\n if (cell.value === \"\")\n e_cell.classList.toggle(\n \"empty\",\n cell.controltype === \"label\" && cell.value === \"\"\n ); // IE8 does not support :empty\n\n e_cell.classList.add(\"bb-celltype-\" + cell.controltype);\n return e_cell;\n },\n render: (control, group, attribs) => {\n const widget = $(`
      `);\n control = grid.renderable(control);\n if (control.value.length === 0) {\n widget.addClass(\"bb-empty\");\n }\n if (control.caption) {\n wControl(\n control.caption,\n group,\n widget //append hereto\n );\n }\n if (control.showcolumns) {\n // widget.append($(\"\".repeat(control.columns.length)));\n const thead = document.createElement(\"thead\");\n const tr = document.createElement(\"tr\");\n thead.append(tr);\n widget.append(thead);\n if (control.value.length > 0)\n tr.append(...control.columns.map(grid.columnheader));\n }\n const e_body = document.createElement(\"tbody\");\n widget.append(e_body);\n const colheaders = grid.colheaderids(control);\n control.value.forEach(function (row, i, rows) {\n // NOTE: control.offset is set by global plugin split-grid.\n // const i = idx + (control.offset || 0);\n const last_spanning_cell_id = grid.rowheaderid(rows, i);\n const e_row = document.createElement(\"tr\");\n if (row.length === 0) return;\n e_row.classList.toggle(\"bb-newscope\", row[0]._tag === \"th\");\n e_body.appendChild(e_row);\n row.forEach(function (cell, icol) {\n const rowheader = cell._tag === \"td\" ? last_spanning_cell_id : false;\n const headers = [rowheader, colheaders[icol]].filter(Boolean).join(\" \");\n const cellWithHeaders = {\n ...cell,\n headers\n };\n if (cell.value !== null) {\n const e_cell = grid.cell(cell);\n grid.cellSetAttributes(e_cell, cellWithHeaders);\n e_row.appendChild(e_cell);\n wControl(\n cell,\n control._group,\n e_cell //append hereto\n );\n } else {\n e_row.appendChild(document.createComment(\"empty cell\"));\n }\n });\n });\n\n return $(widget);\n },\n afterRender: (widget, control) => {\n const addPlacement = !control.addallowed\n ? \"none\"\n : control.value.length === 0 ||\n arbitraryCoreProp(\"putAddRowButtonBelowGrid\")\n ? \"below\"\n : \"insert\";\n if (addPlacement === \"below\") {\n const gridAddButton = ``;\n widget.get(0).insertAdjacentHTML(\"afterEnd\", gridAddButton);\n // $(widget.in.append(widget, gridAddButton);\n }\n },\n setValue: (e_grid, value, requestor, updates) => {\n // if (grid.contains(requestor))\n const control = $.data(e_grid, \"control\");\n const old = compose(\n grid.renderable,\n assoc(\"value\", updates[\"value\"].from),\n assoc(\"columns\", updates[\"columns\"].from)\n )(control);\n\n const now = grid.renderable(control);\n // Remove spurious row\n [\n ...e_grid.querySelectorAll(\n `tbody tr:nth-child(1n + ${now.value.length + 1})`\n )\n ].forEach(row => row.remove());\n // Remove spurious 'cells' (also empty cell comments)\n [...e_grid.querySelectorAll(`tbody tr`)].forEach(row => {\n let cell;\n while (((cell = row.childNodes[now.columns.length]), cell)) {\n cell.remove();\n }\n });\n\n if (\n !equals(old.columns, now.columns) ||\n (old.value.length === 0 && now.value.length !== 0) ||\n (old.value.length !== 0 && now.value.length === 0)\n ) {\n // Remove ALL column headers (re-created)\n [...e_grid.querySelectorAll(`thead tr th`)].forEach(colheader =>\n colheader.remove()\n );\n\n if (now.showcolumns && now.value.length > 0)\n now.columns // .slice(old.columns.length)\n .forEach(function (column) {\n e_grid.querySelector(\"thead tr\").append(grid.columnheader(column));\n });\n }\n\n const colheaders = grid.colheaderids(now);\n now.value.forEach((row, irow, rows) => {\n let e_row = e_grid.querySelector(`tbody tr:nth-child(${irow + 1})`);\n if (e_row === null) {\n e_row = document.createElement(\"tr\");\n e_grid.tBodies[0].append(e_row);\n }\n e_row.classList.toggle(\"bb-newscope\", row[0]._tag === \"th\");\n const last_spanning_cell_id = grid.rowheaderid(rows, irow);\n row.forEach((cell, icol) => {\n const cellInput = e_grid.querySelector(`[id=\"${cell.id}\"]`);\n const oldcell = old.value[irow] && old.value[irow][icol];\n const rowheader = cell._tag === \"td\" ? last_spanning_cell_id : false;\n const headers = [rowheader, colheaders[icol]].filter(Boolean).join(\" \");\n const cellWithHeaders = {\n ...cell,\n headers\n };\n const spot = e_row.childNodes[icol];\n if (!spot) {\n // NEW => Add at end\n const e_cell = grid.cell(cell);\n grid.cellSetAttributes(e_cell, cellWithHeaders);\n e_row.appendChild(e_cell);\n wControl(cell, control._group, e_cell);\n return;\n }\n if (\n cell.controltype !== oldcell.controltype ||\n cell._tag !== oldcell._tag\n ) {\n // REPLACE\n let e_cell;\n if (cell._tag !== oldcell._tag) {\n e_cell = grid.cell(cell);\n spot.replaceWith(e_cell);\n } else {\n // Re-use old cell\n e_cell = spot;\n if (cell._tag !== null) {\n e_cell.classList.remove(\"bb-celltype-\" + oldcell.controltype);\n e_cell.innerHTML = \"\";\n }\n }\n if (cell._tag !== null) {\n grid.cellSetAttributes(e_cell, cellWithHeaders);\n wControl(cell, control._group, e_cell);\n }\n return;\n }\n if (cell._tag === null) return;\n // UPDATE\n grid.cellSetAttributes(spot, cellWithHeaders);\n const cellControl = $.data(cellInput, \"control\");\n if (!cellControl) return;\n if (cell.value !== cellControl.value) {\n $(cellInput).updateControl(\n [\n Object.assign({}, cellControl, {\n value: cell.value,\n text: cell.text\n })\n ],\n requestor\n );\n }\n });\n });\n },\n onrequired: (grid, required) => {},\n onreadonly: (grid, readonly) => {\n grid.classList.toggle(\"bb-disabled\", readonly);\n [...grid.querySelectorAll(\"input, textarea, button\")].forEach(input => {\n input.disabled =\n readonly || compose(ifElse(Boolean, isReadOnly, F), getControl)(input);\n });\n },\n layout: \"below\"\n};\n\nregisterWidget(grid);\n\n$.fn.extend({\n /**\n * Widgetize as numedit\n */\n spinner: function (control) {\n control = control || {};\n var _interval = 250,\n interval = _interval,\n timer = null,\n me = this,\n val = Numerals.formatter(me.val()),\n $this = $(this),\n $anchor = $this;\n\n function mustAddButtons() {\n return !(arbitraryCoreProp(\"skipNumButtons\") === true);\n }\n\n function addButtons($input, control) {\n var buttontemplate =\n '
      ' +\n '
      ' +\n '
      ' +\n \"
      \";\n $input\n .wrapAll('
      ')\n .after(buttontemplate);\n $input.parents(\".bb-num\").data(\"control\", control);\n $input\n .next()\n .find(\".bb-num-down, .bb-num-up\")\n .on(\"click\", adjustOnce)\n .on(\"mousedown\", keepAdjusting)\n .on(\"mouseup mouseout\", stopAdjusting);\n\n return $input.parent();\n }\n\n function adjust(diff) {\n var parsed, val;\n try {\n parsed = Numerals.parser(me.val());\n } catch (err) {\n $this.validate(); // Let validate() handle\n // showing of errors\n }\n if (typeof parsed === \"undefined\") return;\n // A diff of 0 is just used for the sake of formatting - so do\n // not force the number to be in range.\n val = (\n diff === 0\n ? parseFloat(parsed - diff)\n : forceInRange(\n parseFloat(parsed - diff),\n control.minimum,\n control.maximum\n )\n ).toFixed(control.precision || 0);\n\n me.val(Numerals.formatter(val));\n\n //if (val == \"NaN\") val = \"\";\n $this.validate(); // Validate just for the sake\n // of getting away the error\n // message\n if (me.data(\"orgval\") !== me.val()) me.trigger(\"change\");\n $this.data(\"orgval\", $this.val());\n }\n\n $this\n .data(\"orgval\", val) // Remember the original value\n .val(val)\n .on(\"keydown\", function (e) {\n var key = e.keyCode;\n if (key === 38 || key === 40) {\n var diff = key === 38 ? -1 : 1;\n adjust(diff);\n }\n if (key === 13) {\n adjust(0);\n }\n })\n .on(\"click\", function () {\n let parsed;\n try {\n parsed = Numerals.parser(me.val());\n } catch (err) {\n //\n } finally {\n if (parsed === 0) $this.val(\"\");\n }\n })\n .on(\"blur\", function () {\n let orgval = $this.val();\n adjust(0);\n if ($this.val() !== orgval) {\n $this.addClass(\"bb-programmatically-changed\");\n window.setTimeout(function () {\n $this.removeClass(\"bb-programmatically-changed\");\n }, 1000);\n }\n // Set orgval for future changes.\n $this.data(\"orgval\", $this.val());\n });\n\n function keepAdjusting() {\n var thing = $(this);\n var diff = thing.hasClass(\"bb-num-down\") ? 1 : -1;\n timer = window.setTimeout(function () {\n adjust(diff);\n if (interval > 20) interval = interval - 10;\n thing.trigger(\"mousedown\");\n }, interval);\n }\n\n function adjustOnce() {\n var diff = $(this).hasClass(\"bb-num-down\") ? 1 : -1;\n adjust(diff);\n }\n\n function stopAdjusting() {\n window.clearTimeout(timer);\n interval = _interval;\n return false; // prevent text selection\n }\n\n if (mustAddButtons()) $anchor = addButtons($this, control);\n\n disconnectValue({\n input: $this.get(0),\n filter: Numerals.parser,\n value: control.value\n });\n $this.on(\"change\", function (_event, data) {\n if (!prop(\"programmatically\", data)) $this.validate();\n });\n return $anchor;\n }\n});\n","import { compose, find, propEq, prop, map, filter, when } from \"./functional\";\n\nexport const collectAttributes = (prefix, elt) =>\n compose(\n Object.fromEntries,\n map(({ name, value }) => [name.substr(prefix.length), value]),\n filter(({ name, value }) => name.startsWith(prefix)),\n x => [...x]\n )(elt.attributes);\n\nexport const currentGroup = compose(\n when(Boolean, find(propEq(\"current\", true))),\n prop(\"groups\")\n);\n","import { escapeHTML } from \"./escape.js\";\nimport {\n choose,\n compose,\n equals,\n findIndex,\n T,\n identity,\n slice\n} from \"$json/lib/functional.js\";\n\nconst times = (string, integer) => string.repeat(integer);\n\n/*** JUMPLIST BEGIN ***/\nfunction hasselectedbelowlevel(jumplist, level) {\n if (jumplist.length == 0) return false;\n if (jumplist[0].level <= level) return false;\n if (jumplist[0].status == \"selected\") return true;\n return hasselectedbelowlevel(jumplist.slice(1), jumplist[0].level);\n}\nfunction hasselectedbelow(jumplist) {\n return hasselectedbelowlevel(jumplist.slice(1), jumplist[0].level);\n}\n\nconst ariaCurrentAttrib = jumplist =>\n jumplist.status === \"selected\" ? ` aria-current=\"step\"` : \"\";\n\nconst chapterDataAttrib = jumplist =>\n !jumplist.ischapter ? \"\" : `data-chapterstatus=${jumplist.chapterstatus}`;\n\nfunction bakeInnerList(jumplist, level = 0, containsselection) {\n if (!(jumplist instanceof Array)) {\n return (\n (jumplist.level > level\n ? times(\n `<${Jumplist.type}>
    • `,\n jumplist.level - level\n )\n : jumplist.level < level\n ? times(`
    • `, level - jumplist.level) +\n `
    • `\n : `
    • `) +\n `${escapeHTML(\n jumplist.screentitle.trim()\n )}`\n );\n }\n if (jumplist.length == 0)\n return \"
    • \" + times(``, level);\n return (\n bakeInnerList(\n jumplist[0],\n level,\n hasselectedbelow(jumplist, jumplist[0].level)\n ) + bakeInnerList(jumplist.slice(1), jumplist[0].level)\n );\n}\nexport const bakeAsListitems = jumplist => {\n let html = bakeInnerList(jumplist);\n // Odd case of indentation sans parent:\n if ([\"u\", \"o\"].includes(html.charAt(1)))\n return '
    • ' + html + \"
    • \";\n return html;\n};\nfunction bakeAsDropDown(jumplist, level = 0, containsselection) {\n // Implemented recursively so we can make the 'chapter' selected\n if (!(jumplist instanceof Array)) {\n return (\n \"\" +\n times(\" \", level * 2) +\n escapeHTML(jumplist.screentitle.trim()) +\n \"\"\n );\n }\n if (jumplist.length == 0) return \"\";\n return (\n bakeAsDropDown(\n jumplist[0],\n level,\n hasselectedbelow(jumplist, jumplist[0].level)\n ) + bakeAsDropDown(jumplist.slice(1), jumplist[0].level)\n );\n}\n\nconst findCurrentIndex = compose(\n i => (i === -1 ? Infinity : i),\n findIndex(({ status }) => status === \"future\")\n);\n\nexport var Jumplist = new (function () {\n var _jumplist = []; //Save last jumplist\n this.type = \"ul\";\n this.draw = function draw(jumplist) {\n jumplist = jumplist || _jumplist;\n if (jumplist) _jumplist = jumplist;\n $(\n `.bb-jumplist ${Jumplist.type}, .bb-jumplist li, .bb-jumplist-dropdown select`\n ).remove();\n if (jumplist.length) {\n if (\n $(\".bb-jumplist:visible, .bb-jumplist-dropdown:visible\").length === 0\n ) {\n // If we can't rely on CSS to decide the appropriate type\n // of jumplist (happens sometimes onload), draw them both\n drawAsList(jumplist);\n drawAsDropDown(jumplist);\n } else {\n // Draw our standard list:\n if ($(\".bb-jumplist\").is(\":visible\")) drawAsList(jumplist);\n // Also draw the dropdown:\n if ($(\".bb-jumplist-dropdown\").is(\":visible\")) drawAsDropDown(jumplist);\n }\n }\n };\n\n function drawAsList(jumplist) {\n const currentIndex = findCurrentIndex(jumplist);\n $(\".bb-jumplist\").map((i, l) => {\n const slicetype = l.dataset[\"slice\"];\n const itemizer = choose([\n [equals(\"before\"), slice(0, currentIndex)],\n [equals(\"after\"), slice(currentIndex, Infinity)],\n [T, identity]\n ])(slicetype);\n\n const html = bakeAsListitems(itemizer(jumplist));\n $(l).append(\n `<${Jumplist.type} aria-describedby=\"a-jumplist-title\">${html}`\n );\n });\n $(\".bb-jumplist a:last\").addClass(\"last\");\n $(\".bb-jumplist li:last-child\").addClass(\"last-child\"); // aid older browsers\n }\n function drawAsDropDown(jumplist) {\n if (jumplist.length) {\n var html = bakeAsDropDown(jumplist, 0);\n $(\".bb-jumplist-dropdown\").append(\"\");\n }\n }\n\n return this;\n})();\n","import { getVar } from \"./vars.js\";\n\nexport const userinfo = () => getVar(\"userinfo\") || {};\n","import { userinfo } from \"./user-info.js\";\nimport {\n compose,\n either,\n includes,\n prop,\n strictDifference\n} from \"./functional.js\";\n\nexport const PERM_ACCESSALLMODELS = \"accessallmodels\",\n // Allow to access all models\n PERM_ALLOWACCESSCASES = \"allowaccesscases\",\n // Allow to access to all the cases on the server\n PERM_ALLOWACCESSCASESFROMDOMAIN = \"allowaccesscasesfromdomain\",\n // Allow to access all the cases in the same domain on the server\n PERM_ALLOWALLCASEOVERVIEWDOMAIN = \"allowallcaseoverviewdomain\",\n // Allow to see all the cases in same domain on the server\n PERM_ALLOWALLCASESOVERVIEW = \"allowallcasesoverview\",\n // Allow to see all the cases made on the server\n PERM_ALLOWCASEOVERVIEW = \"allowcaseoverview\",\n // Allow to see the cases made by the user on the server\n PERM_ALLOWDOWNLOADCASE = \"allowdownloadcase\",\n // Allow user to download a case from the server\n PERM_ALLOWIPLOGTOUSER = \"allowiplogtouser\",\n // Allow the IP log to be send to the user\n PERM_ALLOWLOGTOUSER = \"allowlogtouser\",\n // Allow the WHOLE log of the server to be send to the user\n\n PERM_ALLOWMISALL = \"allowmisall\",\n // Allow all the MIS data to be shown\n PERM_ALLOWMISDOCUMENTS = \"allowmisdocuments\",\n // Allow the documents of the case to be opened\n PERM_ALLOWMISDOMAIN = \"allowmisdomain\",\n // Allow the MIS data within the same domain to be shown\n PERM_ALLOWMISOWNCASES = \"allowmisowncases\",\n // Allow the MIS data of the own cases to be shown\n\n PERM_ALLOWSAVECASE = \"allowsavecase\",\n // Allow to save a case on the server\n PERM_ALLOWSESSIONLOGTOUSER = \"allowsessionlogtouser\",\n // Allow the log concerning a case to be send to the user\n\n PERM_ALLOWSTARTCASES = \"allowstartcases\",\n // Allow to create a new case on the server\n PERM_PUBLISHMODEL = \"publishmodel\",\n // Allow to publish models to the server\n PERM_SAASCLIENTLOGICWRITABLE = \"saasclientlogicwritable\",\n // Allow users to change texts and logic in SAAS\tNeeds either updatemodels or updateownmodel to have effect\n PERM_SAASCLIENTWRITABLE = \"saasclientwritable\",\n // Allow users to change texts of the model in SAAS\tNeeds either updatemodels or updateownmodel to have effect\n PERM_SAASMANAGEPUBLISHINGSERVERS = \"saasmanagepublishingservers\",\n // Allow management of the publishing servers in server\n PERM_UPDATEDOMAINS = \"updatedomains\",\n // Allow to update or delete all the domains on the server (needs update users and models)\n PERM_UPDATEMODELS = \"updatemodels\",\n // Allow to update or delete all the models on the server\n PERM_UPDATEOWNMODEL = \"updateownmodel\",\n // Allow update or delete the models owned by user\n PERM_UPDATEOWNUSER = \"updateownuser\",\n // Allow to update the own user on the server, need this for webadmin access\n PERM_UPDATEROLES = \"updateroles\",\n // Allow to update or delete all the roles on the server\n PERM_UPDATESETTINGS = \"updatesettings\",\n // Allow to update the settings of the server\n PERM_UPDATEUSERS = \"updateusers\",\n // Allow to update or delete all the users on the server\n PERM_GETDATASOURCELIST = \"getdatasourcelist\",\n // Allow retrieving a sparse list of datasources\n PERM_MANAGEDATASOURCES = \"managedatasources\";\n// Allow retrieving, posting, updating, and deleting datasource specs and file\n\n// 4.12 equivalents\nconst oldperms = {\n guest: [PERM_ALLOWSTARTCASES],\n user: [\n PERM_PUBLISHMODEL,\n PERM_UPDATEOWNMODEL,\n PERM_UPDATEOWNUSER,\n PERM_ALLOWCASEOVERVIEW,\n PERM_ALLOWSTARTCASES,\n PERM_ALLOWSAVECASE,\n PERM_ALLOWMISOWNCASES // ,\n // PERM_SAASCLIENTWRITABLE,\n // PERM_SAASCLIENTLOGICWRITABLE\n ],\n administrator: [\n PERM_PUBLISHMODEL,\n PERM_ACCESSALLMODELS,\n PERM_UPDATEOWNMODEL,\n PERM_UPDATEDOMAINS,\n PERM_UPDATESETTINGS,\n PERM_UPDATEMODELS,\n PERM_UPDATEUSERS,\n // PERM_UPDATEROLES,\n PERM_UPDATEOWNUSER,\n PERM_ALLOWCASEOVERVIEW,\n PERM_ALLOWACCESSCASESFROMDOMAIN,\n PERM_ALLOWACCESSCASES,\n PERM_ALLOWSTARTCASES,\n PERM_ALLOWSAVECASE,\n PERM_ALLOWMISOWNCASES,\n PERM_ALLOWMISDOCUMENTS,\n // PERM_SAASCLIENTWRITABLE,\n // PERM_SAASCLIENTLOGICWRITABLE,\n // PERM_SAASMANAGEPUBLISHINGSERVERS,\n // PERM_SAASCLIENTWRITABLE,\n PERM_ALLOWDOWNLOADCASE // ,\n // PERM_MANAGEDATASOURCES\n ],\n viewer: [PERM_ALLOWMISDOMAIN],\n manager: [\n PERM_UPDATEOWNUSER,\n PERM_ALLOWCASEOVERVIEW,\n PERM_ALLOWACCESSCASESFROMDOMAIN,\n PERM_ALLOWACCESSCASES,\n PERM_ALLOWSAVECASE,\n PERM_ALLOWMISOWNCASES // ,\n // PERM_SAASCLIENTWRITABLE\n ],\n vieweradmin: [PERM_ALLOWMISALL, PERM_ALLOWMISDOMAIN, PERM_ALLOWMISDOCUMENTS],\n any: []\n};\n\nexport const permissions = () =>\n compose(\n either(\n prop(\"permissions\"),\n compose(role => oldperms[role] || oldperms[\"any\"], prop(\"role\"))\n ),\n userinfo\n )(null);\n\nexport const hasPermission = perm =>\n perm instanceof Array\n ? strictDifference(perm, permissions()).length === 0\n : includes(perm, permissions());\n\nexport const webadminMakesSense = permissions =>\n permissions.some(perm => perm.startsWith(\"update\"));\n","/* global $ */\nif (\"bb\" in window) {\n throw \"bb was already loaded\";\n}\nimport \"./lib/polyfills/url-search-params.js\";\nimport * as Errors from \"./lib/errors.js\";\nimport { token } from \"./lib/tokens.js\";\nimport { shouldExit } from \"./lib/case-exit.js\";\nimport { A11y } from \"./lib/a11y\";\nimport { Ajax, checkJSON } from \"./lib/ajax.js\";\nimport { BBI } from \"./lib/bbi.js\";\nimport { collectWithin, serializeQuestions } from \"./lib/collect-values.js\";\nimport { conf, propFinder } from \"./lib/conf\";\nimport { wControl, getControl } from \"./lib/control.js\";\nimport { validateInput } from \"./lib/control-validation.js\";\nimport { parseDate, humanDate } from \"./lib/dates\";\nimport { escapeHTML } from \"./lib/escape.js\";\nimport {\n editPolicy,\n mustUpdate,\n canEditEarlier\n} from \"./lib/feature-queries.js\";\nimport { createFormGroup } from \"./lib/form-groups.js\";\nimport \"./lib/form-widgets-definitions.js\";\nimport { setSettled } from \"./lib/settled.js\";\nimport { collectAttributes } from \"./lib/utils\";\nimport {\n any,\n both,\n complement,\n compose,\n either,\n find,\n has,\n ifElse,\n includes,\n map,\n path,\n pathEq,\n prop,\n propEq,\n propOr,\n tap,\n when\n} from \"./lib/functional\";\nimport { doGrouping, groupOuter } from \"./lib/groupings\";\nimport { Jumplist } from \"./lib/jumplist\";\nimport { fromApiServer } from \"./lib/location.js\";\nimport { Mode } from \"./lib/mode.js\";\nimport { Numerals } from \"./lib/numerals.js\";\nimport { notify } from \"./lib/notify.js\";\nimport { permissions, webadminMakesSense } from \"./lib/permissions.js\";\nimport { _ } from \"./lib/gettext.js\";\nimport { positionalFormat } from \"./lib/text-utils\";\nimport { urlutils } from \"./lib/url-utils.js\";\nimport Vars from \"./lib/vars.js\";\nimport \"./lib/$.scrollTo.js\";\n\n$(\"html\").removeClass(\"no-js\");\n\nconst arbitraryCoreProp = propFinder(conf, \"arbitrary.core\");\n/**\n * Copyright (c) 2010 Conrad Irwin MIT license.\n * Based loosely on original: Copyright (c) 2008 mkmanning MIT license.\n *\n * Parses CGI query strings into javascript objects.\n *\n * See the README for details.\n **/\n$.parseQuery = function (options) {\n var config = { query: window.location.search || \"\" },\n params = {};\n\n if (typeof options === \"string\") {\n options = { query: options };\n }\n $.extend(config, $.parseQuery, options);\n config.query = config.query.replace(/^\\?/, \"\");\n\n $.each(config.query.split(config.separator), function (i, param) {\n var pair = param.split(\"=\"),\n key = config.decode(pair.shift(), null).toString(),\n value = config.decode(pair.length ? pair.join(\"=\") : null, key);\n\n if (\n config.array_keys.test\n ? config.array_keys.test(key)\n : config.array_keys(key)\n ) {\n params[key] = params[key] || [];\n params[key].push(value);\n } else {\n params[key] = value;\n }\n });\n delete params[\"\"];\n return params;\n};\n$.parseQuery.decode = $.parseQuery.default_decode = function (string) {\n return decodeURIComponent((string || \"\").replace(/\\+/g, \" \"));\n};\n$.parseQuery.array_keys = function () {\n return false;\n};\n$.parseQuery.separator = \"&\";\n\n// thanks http://web.enavu.com/daily-tip/maxlength-for-textarea-with-jquery/\n$(document).on(\"keyup\", \"textarea[maxlength]\", function () {\n var $this = $(this);\n //get the limit from maxlength attribute\n var limit = parseInt($this.prop(\"maxlength\"));\n //get the current text inside the textarea\n var text = $this.val();\n //count the number of characters in the text\n var chars = text.length;\n\n //check if there are more characters then allowed\n if (chars > limit) {\n //and if there are use substr to get the text before the limit\n var new_text = text.substr(0, limit);\n\n //and change the current text with the new text\n $this.val(new_text);\n $this.addClass(\"bb-programmatically-changed\");\n window.setTimeout(function () {\n $this.removeClass(\"bb-programmatically-changed\");\n }, 1000);\n }\n});\n\nlet bb = { Mode, conf };\n\n/*** TEXT UTILITIES BEGIN ***/\n\n/******* compareVersions ******/\nfunction compareVersions(a, b) {\n var i, l, d;\n\n a = a.toLowerCase().split(/(\\d+)/);\n b = b.toLowerCase().split(/(\\d+)/);\n l = Math.min(a.length, b.length);\n\n for (i = 0; i < l; i++) {\n d = a[i] - b[i];\n if (isNaN(d)) {\n if (a[i] === b[i]) d = 0;\n else if (a[i] < b[i]) {\n d = -1;\n } else d = 1;\n }\n if (d !== 0) return d;\n }\n\n return a.length - b.length;\n}\n\nfunction compareVersionsOn(prop, a, b) {\n return compareVersions(String(a[prop]), String(b[prop]));\n}\n/*** TEXT UTILITIES END ***/\n\n/*** DATEPICKER BEGIN ***/\n\n// Defaults jQuery datepicker BEGIN\n$(function () {\n $.datepicker.setDefaults(\n $.extend(\n true,\n $.datepicker._defaults,\n {\n showAnim: \"\",\n changeYear: true,\n changeMonth: true,\n yearRange: \"c-150:c+150\"\n }, // RFC\n arbitraryCoreProp(\"datepicker.defaults\") || {},\n { altFormat: \"yy-mm-dd\" }\n )\n );\n});\n// Defaults jQuery datepicker END\n\n/*** DATEPICKER END ***/\n\n/*** MISC jQUERY UTILITIES BEGIN ***/\n\n// thanks http://jqueryfordesigners.com/video.php?f=queue.flv\n$.fn.pause = function (n) {\n return this.queue(function () {\n var el = this;\n window.setTimeout(function () {\n return $(el).dequeue();\n }, n);\n });\n};\n\n$.fn.sort = function () {\n return this.pushStack($.makeArray([].sort.apply(this, arguments)));\n};\n\n$.fn.extend({\n insertAtCaret: function (myValue) {\n return this.each(function () {\n if (document.selection) {\n //For browsers like Internet Explorer\n this.focus();\n var sel = document.selection.createRange();\n sel.text = myValue;\n this.focus();\n } else if (this.selectionStart || this.selectionStart == \"0\") {\n //For browsers like Firefox and Webkit based\n var startPos = this.selectionStart;\n var endPos = this.selectionEnd;\n var scrollTop = this.scrollTop;\n this.value =\n this.value.substring(0, startPos) +\n myValue +\n this.value.substring(endPos, this.value.length);\n this.focus();\n this.selectionStart = startPos + myValue.length;\n this.selectionEnd = startPos + myValue.length;\n this.scrollTop = scrollTop;\n } else {\n this.value += myValue;\n this.focus();\n }\n return this;\n });\n },\n selectAllText: function () {\n var el = this.get(0);\n if (el) {\n if (typeof el.selectionStart === \"number\") {\n (el.selectionStart = 0), (el.selectionEnd = el.value.length);\n } else if (typeof el.createTextRange !== \"undefined\") {\n el.focus();\n var range = el.createTextRange();\n range.select();\n }\n }\n return this;\n }\n});\n\n/** Add resizeEnd event.\n *\n * Thanks Carlos Martinez on\n * http://stackoverflow.com/questions/2854407/\n * javascript-jquery-window-resize-how-to-fire-after-the-resize-is-completed\n *\n * I did put this in a closure so as not to pollute the global\n * namespace.\n */\n(function () {\n var _to = null,\n _delay = 500;\n $(window).on(\"resize\", function () {\n if (_to) window.clearTimeout(_to);\n _to = window.setTimeout(function () {\n $(this).trigger(\"resizeEnd\");\n }, _delay);\n });\n})();\n/*** MISC jQUERY UTILITIES END ***/\n\n/*** KEYMAP BEGIN ***/\nvar KEYS = {\n BACKSPACE: 8,\n TAB: 9,\n ENTER: 13,\n SPACE: 32,\n ESC: 27,\n UP: 38,\n DOWN: 40,\n KP_RADIX: 110\n};\n\n// Navigation\nvar maps = {\n questions: function (ev) {\n if (!Mode.get(\"hasModel\")) return undefined;\n if (ev.originalEvent.target && ev.originalEvent.target.tagName === \"TR\") {\n if (!gridKeys(ev)) return false;\n }\n var $target = $(ev.target);\n switch (ev.keyCode) {\n case KEYS.ENTER:\n if ($target.hasClass(\"bb-prior\")) {\n step(\"prior\");\n return false;\n }\n if ($target.hasClass(\"bb-skip\")) {\n step(\"skip\");\n return false;\n }\n if (!Mode.get(\"hasNoNext\")) {\n if (\n ev.shiftKey ||\n $target.hasClass(\"bb-next\") ||\n $target.is('input[type=\"text\"]') ||\n $target.is('input[type=\"radio\"]') ||\n $target.is('input[type=\"checkbox\"]') ||\n $target.is('input[type=\"checkbox\"]') ||\n $target.is('select[data-type=\"listbox\"]') ||\n $target.is(\"fieldset\")\n ) {\n step(\"next\");\n return false;\n }\n if (ev.target.tagName === \"TEXTAREA\") {\n ev.stopImmediatePropagation();\n break;\n }\n }\n if (ev.target.tagName === \"A\") {\n if (ev.target.href.substr(-1) !== \"#\")\n // A true link\n break;\n }\n break;\n case KEYS.SPACE:\n if ($target.is('[role=\"button\"]')) {\n $target.trigger(\"click\");\n return false;\n }\n break;\n case KEYS.BACKSPACE:\n return dispatchBackspace(ev);\n // Escape from modal window\n case KEYS.ESC:\n $(\".closable\").hide();\n break;\n case KEYS.KP_RADIX:\n if ($target.data(\"type\") === \"numedit\") {\n $target.insertAtCaret(_(\"__radixpoint__\", \".\"));\n return false;\n }\n }\n return undefined;\n }\n};\n\nfunction gridKeys(ev) {\n var target = ev.originalEvent.target,\n $target = $(target);\n switch (ev.keyCode) {\n case KEYS.UP:\n $(ev.target).prev().trigger(\"focus\");\n return false;\n case KEYS.DOWN:\n case KEYS.TAB:\n if ($target.find(\":input, a\").length !== 1) {\n return true;\n }\n if (\n $target.find(\n \"a, :input\" + ':not([type=\"checkbox\"])' + ':not([type=\"radio\"])'\n ).length\n ) {\n return true;\n }\n if (ev.shiftKey) $target.prev().trigger(\"focus\");\n else $target.next().trigger(\"focus\");\n return false;\n case KEYS.SPACE:\n var $inputs = $target.find(\n 'input[type=\"checkbox\"], ' + 'input[type=\"radio\"]'\n ),\n $input = $inputs.filter(\":nth(0)\");\n if ($inputs.length > 2) return true;\n else $input.prop(\"checked\", !$input.is(\":checked\"));\n return false;\n }\n return true;\n}\n\nfunction aintTheEnterKey(ev) {\n return ev.type === \"keydown\" && ev.keyCode !== KEYS.ENTER;\n}\n\nfunction dispatchBackspace(ev) {\n if (!ev.shiftKey) return true;\n if (Mode.get(\"hasNoPrior\")) return false;\n step(\"prior\");\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n}\n\n$(document).on(\"keydown\", maps.questions);\n\n$(document).on(\"keydown\", \".bb-btn\", function (ev) {\n if (ev.keyCode === 13) {\n // Dispatch to click handler on ENTER.\n $(this).trigger(\"click\");\n return false;\n }\n return true;\n});\n/*** KEYMAP END ***/\n\n/*** ROLES BEGIN ***/\n\nfunction setRole() {\n var userinfo = Vars.getVar(\"userinfo\") || {};\n\n Mode.toggle(\"isAdmin\", userinfo.role === \"administrator\");\n Mode.toggle(\"isUser\", userinfo.role === \"user\");\n Mode.toggle(\"isViewer\", userinfo.role === \"viewer\");\n Mode.toggle(\"isVieweradmin\", userinfo.role === \"vieweradmin\");\n Mode.toggle(\"isGuest\", userinfo.role === \"guest\");\n Mode.toggle(\"isAnonymous\", userinfo.fullname === \"anonymous\");\n const perms = permissions();\n perms.forEach(p => {\n Mode.toggle(p, true, false);\n });\n Mode.toggle(\"webadminMakesSense\", webadminMakesSense(perms), false);\n}\n\n/*** ROLES END ***/\n\n/*** INITIALIZATION BEGIN ***/\n\n$(function () {\n $(\"body\").attr(\"data-modus\", \"none\");\n\n document.addEventListener(\"submit\", function (ev) {\n var action = ev.target.getAttribute(\"action\");\n if (!action) {\n ev.preventDefault();\n return false;\n }\n return undefined;\n });\n\n $(document).on(\"submit\", \"form#bb-login\", function () {\n // Serialize form as array\n var params = $(this).serializeArray(),\n action = this.getAttribute(\"action\");\n // Trim values and set the desired format\n $.each(params, function (_, val) {\n if (val.name === \"fmt\") val.value = \"json\";\n else val.value = (val.value || \"\").trim();\n });\n $.postJSON(\n action,\n [$.param(params), window.location.search.substring(1)].join(\"&\")\n );\n return false;\n });\n\n var formfocus = window.setTimeout(function () {\n $(\"form#bb-login input[name=username]\").trigger(\"focus\");\n }, 0);\n\n bb.Router = function router(params) {\n if (\n (typeof params.username !== \"undefined\" &&\n typeof params.password !== \"undefined\") ||\n params.uniqueid ||\n params.modelid ||\n params.modelname ||\n params.dbname ||\n params.state ||\n params.request ||\n params.bsid\n ) {\n Mode.set(\"isDeepLinked\");\n hideLogin();\n if (params.bsid) new BBI().authenticate();\n else if (!bb.autologinrewritten) {\n var action;\n if (\n typeof params.username !== \"undefined\" &&\n typeof params.password !== \"undefined\"\n )\n action = \"login\";\n if (params.uniqueid) action = \"menu\";\n // Studio deeplink\n if (typeof params.uniqueid === \"undefined\" && params.modelid)\n action = \"open\";\n if (params.uniqueid && (params.modelid || params.dbname))\n action = \"action\";\n if (params.modelname) action = \"open\";\n if (params.request) {\n action = params.request;\n delete params.request;\n }\n $.postJSON(action, $.param(params) + \"&fmt=json\").then(setSettled);\n }\n window.clearTimeout(formfocus);\n }\n };\n\n if (window.location.search.length > 1) {\n bb.Router($.parseQuery());\n } else setSettled();\n\n $(document).on(\"bb:renderQuestions\", renderGroups);\n});\n\n/**\n * Set the effect to be used when re-showing login form.\n *\n * @param {String} effect One of 'show', 'fadeIn' or 'slideDown'\n */\nfunction safeResetEffect(effect = \"slideDown\") {\n if (typeof effect !== \"string\") {\n console.warn(\"Argument effect should be a string\");\n return \"slideDown\";\n }\n if (!/^(show|fadeIn|slideDown)$/.test(effect)) {\n console.warn(\"Invalid effect: \" + effect);\n return \"slideDown\";\n }\n return effect;\n}\n\nresetLogin.effect = safeResetEffect(\n arbitraryCoreProp(\"loginResetEffect\", \"slideDown\")\n);\n\nfunction resetLogin() {\n $(\"#bb-login\")[resetLogin.effect]();\n}\n\n/*** INITIALIZATION END ***/\n/*** JUMPLIST BEGIN ***/\n$(document).on(\"change\", \".bb-jumplist-dropdown select\", function () {\n bb.gotonode($(this).val());\n});\n\n$(document).on(\"click\", \"[data-groupid]\", function () {\n var $this = $(this),\n groupid = $this.attr(\"data-groupid\");\n bb.gotonode(groupid);\n});\n\n/*** JUMPLIST END ***/\n\n/*** CASES BEGIN ***/\n$.fn.deleteme = function () {\n if (\n confirm(\n _(\"Delete\") + \" \" + (this.length == 1 ? _(\"case\") : _(\"cases\")) + \"?\"\n )\n ) {\n return this.each(function () {\n var me = $(this);\n if (me.hasClass(\"bb-case\")) {\n var casus = {\n dbname: me.data(\"dbname\"),\n sessionid: me.data(\"sessionid\")\n };\n deleteCase(casus.dbname, casus.sessionid, Vars.getVar(\"uniqueid\"));\n if (isCaseCurrent(casus)) {\n $(\"#bb-q\").empty();\n Mode.unset(\"hasModel\");\n }\n }\n });\n }\n return this;\n};\n\nvar Cases = (function () {\n var _cases = [];\n var _unfilteredcases = [];\n var _MAX = 10;\n var _idx = 0;\n var _filtertext = _(\"filter cases by name\");\n\n function update(cases) {\n _unfilteredcases = cases || [];\n _cases = cases || [];\n if (cases && cases.length > 0) {\n cases.sort(function (a, b) {\n return a.dateenter > b.dateenter ? -1 : 1;\n });\n var $controls = $(\"#bb-cases-controls\");\n if ($controls.is(\":empty\")) {\n $controls.html(\n ' ' +\n ' ' +\n ' 1-10' +\n ' ' +\n ' ' +\n ''\n );\n $controls.attr(\"data-unbound\", true);\n }\n if ($controls.attr(\"data-unbound\")) {\n $controls.removeAttr(\"data-unbound\");\n $(\"#bb-cases-prev\").click(prevSlice);\n $(\"#bb-cases-next\").click(nextSlice);\n $(\"#bb-cases-first\").click(showSlice.bind(null, 0));\n $(\"#bb-cases-last\").click(\n showSlice.bind(null, Math.floor((_cases.length - 1) / _MAX))\n );\n\n $(\"#bb-cases-filter\", $controls).keyup(function (ev) {\n if (ev.keyCode === KEYS.TAB) return true;\n var $this = $(this),\n val = ($this.val() || \"\").trim();\n if (val != \"\") {\n var re = new RegExp(val, \"i\");\n _cases = _unfilteredcases.filter(function (e) {\n return re.test(e.name);\n });\n } else _cases = _unfilteredcases;\n showSlice(0);\n return false;\n });\n }\n showSlice(0);\n } else {\n empty();\n }\n }\n function showSlice(idx) {\n _idx = idx;\n var caselen = _cases.length;\n\n $(\"#bb-cases .bb-case\").remove();\n\n $(_cases.slice(_idx * _MAX, (_idx + 1) * _MAX)).each(function (i) {\n wCasus(_cases[i + _idx * _MAX]).appendTo(\"#bb-cases-table\");\n });\n if (_cases.length) {\n $(\n '' +\n '\" +\n \"\" +\n \"\" +\n (bb.Plugins.newname\n ? '' +\n '' +\n '' +\n \"\" +\n \"\"\n : \"\") +\n \"\"\n ).prependTo(\"#bb-cases-table\");\n\n // Some browsers do leave thead and tbody in place, even when\n // $().empty-ing the table, so:\n $(\"#bb-cases-table thead~thead\").remove();\n }\n\n $(\"#bb-cases-currentslice\")\n .text(\n _idx * _MAX +\n 1 +\n \"-\" +\n Math.min(caselen, (_idx + 1) * _MAX) +\n \"/\" +\n caselen\n )\n .attr(\n \"aria-label\",\n positionalFormat(\n _(\"results {0} to {1} from {2}\"),\n _idx * _MAX + 1,\n Math.min(caselen, (_idx + 1) * _MAX),\n caselen\n )\n );\n\n $(\"#bb-cases-prev, #bb-cases-first\").prop(\"disabled\", _idx == 0);\n var hasNoNext = _idx == Math.floor((caselen - 1) / _MAX);\n $(\"#bb-cases-next, #bb-cases-last\").prop(\"disabled\", hasNoNext);\n\n $(\"#bb-cases\").trigger(\"bb:rendered\");\n }\n function nextSlice() {\n var divident = Math.floor(_cases.length / _MAX);\n showSlice(Math.min(_idx + 1, divident));\n }\n function prevSlice() {\n showSlice(Math.max(_idx - 1, 0));\n }\n function empty() {\n $(\"#bb-cases-table\").empty();\n }\n return {\n empty: empty,\n update: update\n };\n})();\n\nfunction howManyColumns() {\n var base = 2;\n return (\n $.grep([\"showreport\", \"showdeleteinmenu\", \"showcopycase\"], Vars.getVar)\n .length + base\n );\n}\n\nfunction wCasus(casus) {\n var cas = $.extend(\n {},\n casus,\n // Turn into JavaScript dates, and normalize as good as we can:\n {\n dateenter: casus.dateenter && parseDate(casus.dateenter),\n datecreate:\n Vars.getVar(\"showdatecreated\") &&\n casus.datecreate &&\n parseDate(casus.datecreate)\n },\n {\n showcopycase: Vars.getVar(\"showcopycase\"),\n showdeleteinmenu: Vars.getVar(\"showdeleteinmenu\")\n }\n );\n if (Vars.getVar(\"showreport\")) cas.reporturl = urlutils.caseReport(casus);\n // Turn into JavaScript dates, and normalize as good as we can:\n if (cas.datecreate) cas.firstrun = humanDate(cas.datecreate);\n if (cas.dateenter) cas.lastaccess = humanDate(cas.dateenter);\n var html = bb.createCaseItem(cas);\n\n var $case = $(html);\n\n $case.find(\".bb-case-name\").bind(\"click keydown\", function (ev) {\n if (aintTheEnterKey(ev)) return;\n Ajax.replace({\n url: \"action\",\n data: {\n dbname: casus.dbname,\n sessionid: casus.sessionid,\n uniqueid: Vars.getVar(\"uniqueid\"),\n fmt: \"json\"\n }\n });\n });\n $case.find(\".bb-case-copy\").bind(\"click keydown\", function (ev) {\n if (aintTheEnterKey(ev)) return;\n Ajax.replace({\n url: \"action\",\n data: {\n dbname: casus.dbname,\n templateindex: casus.sessionid,\n uniqueid: Vars.getVar(\"uniqueid\"),\n fmt: \"json\"\n }\n });\n });\n $case.data(\"sessionid\", casus.sessionid);\n $case.data(\"dbname\", casus.dbname);\n return $case;\n}\n\nbb.createCaseItem =\n bb.createCaseItem ||\n function (casus) {\n var dateTitle,\n dateSpan = \"\",\n copySpan = \"\",\n reportSpan = \"\",\n deleteSpan = \"\",\n classes = [\"bb-case\"];\n dateTitle = _(\"Last opened\") + \": \" + casus.lastaccess;\n if (Vars.getVar(\"showdatecreated\")) {\n dateTitle += \", \" + _(\"created\") + \": \" + casus.firstrun;\n }\n dateSpan =\n '' +\n casus.lastaccess +\n \"\";\n if (Vars.getVar(\"showreport\")) {\n reportSpan =\n '' +\n '' +\n ' ' +\n _(\"report\") +\n \"\";\n }\n if (Vars.getVar(\"showdeleteinmenu\")) {\n deleteSpan =\n \"\" +\n '\" +\n \"\";\n }\n\n if (Vars.getVar(\"showcopycase\")) {\n copySpan =\n \"\" +\n '\" +\n \"\";\n }\n\n if (isCaseCurrent(casus)) {\n classes.push(\"current\");\n }\n\n return (\n '' +\n \"\" +\n '\" +\n dateSpan +\n reportSpan +\n deleteSpan +\n copySpan +\n \"\"\n );\n };\n\nfunction isCaseCurrent(casus) {\n return (\n casus.sessionid == Vars.getVar(\"sessionid\") &&\n casus.dbname == Vars.getVar(\"dbname\")\n );\n}\n\nfunction deleteCase(dbname, sessionid, uniqueid) {\n // Ajax.last && Ajax.last.abort();\n // todo: voeg nieuwe waarden toe aan object.\n Ajax.post({\n url: \"delete\",\n data: {\n dbname,\n sessionid,\n uniqueid,\n fmt: \"json\"\n }\n });\n}\n\n$(document).on(\"click keydown\", \".bb-case-delete\", function (ev) {\n if (ev.type === \"keydown\" && ev.keyCode !== KEYS.ENTER) return;\n $(this).parents(\".bb-case\").deleteme();\n});\n\nfunction newcase(dbname, newname, params = {}) {\n const data = Object.assign(\n {},\n Object(params) === params && params,\n {\n dbname: dbname,\n uniqueid: Vars.getVar(\"uniqueid\"),\n step: \"open\",\n fmt: \"json\"\n },\n newname && { newname }\n );\n if (Vars.getVar(\"sessionid\"))\n step(\"exit\", function (jsondata) {\n Ajax.busy = false;\n if (jsondata.status === \"Ready\") {\n Ajax.replace({ data: data });\n }\n });\n else {\n Ajax.replace({ data: data });\n }\n}\n\n$(document).on(\"click keydown\", \".bb-newname\", function (ev) {\n if (ev.type === \"click\" || aintTheEnterKey(ev)) ev.stopPropagation();\n return true;\n});\n\n$(document).on(\"click keydown\", \".bb-newcase\", function (ev) {\n if (aintTheEnterKey(ev)) return true;\n const $this = $(this),\n dbname =\n this.getAttribute(\"data-bb:dbname\") ||\n $this.parents(\".bb-model\").attr(\"data-bb:dbname\"),\n newname = $this.find(\".bb-newname\").val(),\n params = collectAttributes(\"data-bb:params-\", this);\n newcase(dbname, newname, params);\n return false;\n});\n\n/*** CASES END ***/\n\n/*** MODELS BEGIN ***/\nvar Models = {\n selector: \"#bb-models\",\n modelitem: function (model) {\n model.uniqueid = Vars.getVar(\"uniqueid\");\n return (\n (bb.createModelItem && bb.createModelItem(model)) ||\n (function (model) {\n var dbname = model.dbname;\n return (\n '' +\n \"\" +\n '\" +\n \"\" +\n '\" +\n \"\"\n );\n })(model)\n );\n },\n // Enhance Model with extra computed properties:\n enhanceModel: function (model) {\n model._selectedclass = model.selected ? \"selected\" : \"\";\n model._nicename = model.modelname.replace(/_/g, \" \");\n if (model.lastupdate) {\n model._date = parseDate(model.lastupdate);\n model._humandate = humanDate(model._date);\n }\n if (model.modelinfo) {\n model._liner_notes = model.modelinfo.split(/(?:\\r?\\n|\\\\r\\\\n|\\\\n)/);\n }\n if (model.authorinfo) {\n model._author_notes = model.authorinfo.split(/(?:\\r?\\n|\\\\r\\\\n|\\\\n)/);\n }\n return model;\n },\n update: function (data) {\n var models = data.models;\n models.sort(compareVersionsOn.bind(null, \"modelname\"));\n\n var explicit = models.filter(function (m) {\n return typeof m[\"order\"] === \"number\";\n });\n if (explicit[0]) {\n explicit.sort(function (a, b) {\n return (\n a[\"order\"] - b[\"order\"] ||\n compareVersions(String(a[\"order\"]), String(b[\"order\"]))\n );\n });\n models = models.filter(function (m) {\n // absent (undefined) or the empty string\n return typeof m[\"order\"] !== \"number\";\n });\n models = explicit.concat(models);\n }\n\n this.empty();\n var self = this;\n $(this.selector).append(\n $.map(models, function (model) {\n return self.modelitem(self.enhanceModel(model));\n })\n );\n },\n empty: function () {\n $(this.selector).empty();\n }\n};\n\n$(document).on(\"click keydown\", \".bb-model-cases\", function (ev) {\n if (aintTheEnterKey(ev)) return;\n var $this = $(this),\n dbname =\n this.getAttribute(\"data-bb:dbname\") ||\n $this.parents(\".bb-model\").attr(\"data-bb:dbname\");\n Ajax.replace({\n url: \"menu\",\n data: {\n dbname: dbname,\n uniqueid: Vars.getVar(\"uniqueid\"),\n fmt: \"json\"\n },\n dataType: \"json\"\n });\n});\n/*** MODELS END ***/\n\n/*** NAVIGATION, REQUESTS BEGIN ***/\n\n/**\n * Request 'action'\n *\n * @param {String} direction One of 'prior', 'next', 'exit', 'runtonode', 'gotonode', 'update' or 'updatemis'\n * @param {Function} cb Callback function to run on succes, defaults to checkJSON()\n * @param {Object} options Object, with possible keys: 'fullnodename' : 'graph.node',\n * 'groupid' : 'groupid-iteration',\n * 'sync' : Boolean\n */\nfunction step(direction, cb, options = {}) {\n Validation.reset();\n if (Ajax.busy) return;\n\n Ajax.last && Ajax.last.abort();\n Ajax.direction = direction;\n Ajax.row = Ajax.direction === \"update\" && options && options.update;\n\n try {\n if (\n [\"next\", \"skip\"].includes(direction) &&\n $(\"#bb-q .group:not([disabled]) .validatable:visible\")\n .validate({ silent: false, justhide: false, requestUpdate: false })\n .filter(\"[aria-invalid=true]\").length > 0\n )\n throw new Error(\"There are errors, please double check your answers.\");\n\n const container = either(prop(\"groupElt\"), () =>\n document.querySelector(\".group.selected\")\n )(options);\n const screenid = Vars.getVar(\"screenid\");\n const groupid = $.data(container).groupid;\n Ajax.groupid = groupid;\n\n // todo: voeg nieuwe waarden toe aan object.\n if (!(direction === \"prior\" && Mode.get(\"hasNoPrior\"))) {\n const ajaxOptions = {\n async: !options || !options.sync, //See noted render() as a reason for this.\n data: [\n \"step=\" + direction,\n direction === \"update\" && options && options.update\n ? \"update=\" + encodeURIComponent(options.update)\n : \"\",\n direction === \"runtonode\"\n ? \"fullnodename=\" + options.fullnodename\n : \"\",\n direction === \"gotonode\" ? \"groupid=\" + options.groupid : \"\",\n Vars.querify(Vars.SESSION_KEYS),\n \"screenid=\" + groupid,\n \"fmt=json\",\n collectWithin({\n container,\n params: new URLSearchParams(options.extraparams)\n })\n .toString()\n .replace(/\\r?\\n/g, \"%0D%0A\")\n ]\n .filter(Boolean)\n .join(\"&\"),\n success: function (data, status, req) {\n data._direction = direction;\n data._passed = options && options.pass;\n data._isUpdate = propEq(\"isUpdate\", true, options);\n // if (direction === \"update\" && groupid !== screenid && editPolicy(conf) === \"stay\") {\n // container.classList.remove(\"unselected\");\n // container.classList.add(\"selected\");\n\n // // Do not render, just update\n // Ajax.release();\n // Vars.setVars(data);\n // updateDynProps(data);\n // } else\n\n if (groupid !== screenid && editPolicy(conf) === \"return\") {\n // Do not render, we're going back again. This would be\n // nice, but we do need some values to be rerendered -\n // warranting redraw of nodes after the edited one.\n\n Ajax.release();\n Vars.setVars(data);\n } else if (options && options.cbIsAdditional) {\n options.cbIsAdditional === \"before\" && cb && cb(data, status, req);\n checkJSON(data, status, req);\n options.cbIsAdditional !== \"before\" && cb && cb(data, status, req);\n } else {\n (cb || checkJSON)(data, status, req);\n }\n if (\n Ajax.row &&\n groupid === screenid &&\n compose(\n when(Boolean, any(propEq(\"dynamic\", true))),\n prop(\"groups\")\n )(data)\n ) {\n console.info(\n \"Requesting an extra update for dynprops. Should be handled by server instead\"\n );\n window.setTimeout(bb.update, 0);\n }\n }\n };\n\n if (\n screenid !== undefined &&\n direction !== \"update\" &&\n groupid !== screenid\n ) {\n console.warn(\n `groupid ${groupid} is not the current screenid ${screenid}, but no update was requested`\n );\n }\n if (direction === \"update\" && groupid !== screenid) {\n // Hold your breath, first go back, so as to put server pointer at the right node.\n bb.gotonode(\n // Will get the .selected\n groupid,\n data => {\n Ajax.release();\n Vars.setVars(data); // Sets screenid\n Ajax.direction = direction;\n // Is always \"update\", actually;\n Ajax.row = direction === \"update\" && options && options.update;\n Ajax.groupid = groupid;\n const req = Ajax.post(ajaxOptions); // Gets the original callback, if any.\n if (editPolicy(conf) === \"return\")\n req.then(data => {\n Ajax.release();\n Vars.setVars(data);\n\n bb.gotonode(\n screenid,\n () => {\n // The gotonode invocation just overwrote the direction and row.\n Ajax.direction = direction;\n Ajax.row =\n direction === \"update\" && options && options.update;\n if (!Ajax.row) cb && cb();\n },\n {\n cbIsAdditional: \"before\",\n groupElt: container,\n isUpdate: true\n }\n );\n });\n },\n { sync: false, cbIsAdditional: false }\n );\n } else {\n Ajax.post(ajaxOptions);\n }\n }\n } catch (e) {\n $(document).trigger(\"bb:userError\", e.message);\n A11y.log(_(e.message));\n }\n}\n\nlet lastUpdateRequest;\n\nfunction requestDynProps(input) {\n if (Ajax.busy) return;\n\n var thisUpdateRequest;\n\n Ajax.last && Ajax.last.abort();\n Ajax.direction = \"update\";\n // Ajax.row = Ajax.direction === 'update' && options && options.update;\n\n const ajaxOptions = {\n async: true,\n data: [\n \"step=update\",\n Vars.querify(Vars.NAV_KEYS),\n \"fmt=json\",\n serializeQuestions()\n ]\n .filter(Boolean)\n .join(\"&\"),\n success: (...args) => {\n if (thisUpdateRequest === lastUpdateRequest) {\n $(document).trigger(\"bb:preHandleData\", ...args);\n updateDynProps(args[0], input);\n }\n }\n };\n lastUpdateRequest = thisUpdateRequest = Ajax.post(ajaxOptions);\n}\n\n// bb:prePost handler always goes off on bb.ajax.post.\n$(document).on(\"bb:prePost\", function (event, options) {\n if (includes(options.url, [\"action\", \"open\", \"bbisreturns\"]))\n if (!includes(Ajax.direction, [\"update\", \"updatemis\"]))\n $(document).trigger(\"bb:preStep\", options);\n});\n\n// bb:preStep handler goes off after user-initiated, possibly\n// expensive, actions.\n$(document).on(\"bb:preStep\", function () {\n Ajax.busy = true;\n // Hide lingering calendars\n $(\".group.selected .hasDatepicker\").datepicker(\"hide\");\n A11y.log(\"\");\n});\n\n// Save\n$(document).on(\"click\", \".bb-save\", function () {\n step(\"save\", null);\n});\n\n// Update\n$(document).on(\"click\", \"[name=update]\", function (ev) {\n step(\"update\", null, {\n update: $(this).val(),\n groupElt: ev.target.closest(\".group\")\n });\n});\n\n// Prior\n$(document).on(\"click\", \".bb-prior\", function () {\n step(\"prior\");\n});\n\n// Next\n$(document).on(\"click\", \".bb-next\", function (ev) {\n bb.next();\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n});\n\n// Skip\n$(document).on(\"click\", \".bb-skip\", function (ev) {\n bb.skip();\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n});\n\n$(document).on(\"keydown\", \".group a\", function (ev) {\n if (\n ev.shiftKey &&\n ev.keyCode === KEYS.ENTER &&\n ev.target.href.substr(-1) !== \"#\"\n ) {\n // true link BUT SHIFT + ENTER\n bb.next();\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n }\n return true;\n});\n\n// Close\n$(document).on(\"click\", \".bb-close\", function () {\n logout();\n self.close();\n $(\"body\").html(_(\"You may now safely close this window\"));\n});\n\n// Restart\n$(document).on(\"click\", \".bb-restart\", function (event) {\n if (\n \"noconfirm\" in event.currentTarget.dataset ||\n confirm(_(\"Are you sure? This will reset all values.\"))\n )\n bb.restart();\n return false;\n});\n\n/**\n * Log out\n *\n * @param {Boolean} ev Either a jQuery event or not\n * @param {Function} cb Callback function to be run after logout.\n * Supercedes default action on Ajax request. @see Ajax.post.\n */\n\nconst timedOutResponse = () => ({\n error: {\n code: 9 //Errors.CODES.cWebSessionTimeOut\n }\n});\n\nfunction logout(ev, cb) {\n if (Vars.getVar(\"uniqueid\")) {\n exit(function () {\n const options = {\n url: \"logout\",\n data: \"fmt=json&\" + Vars.querify(\"uniqueid\"),\n async: false\n };\n // When called directly, which\n if (cb instanceof Function) {\n options.success = options.error = cb;\n }\n Ajax.post(options);\n });\n } else {\n console && console.info && console.info(\"Fake logging out, ID is missing\");\n const mockResponse = timedOutResponse();\n ((cb instanceof Function && cb) || checkJSON)(mockResponse, 200, {\n responseJSON: mockResponse,\n responseText: JSON.stringify(mockResponse)\n });\n }\n return false;\n}\n\n$(document).on(\"click\", \".bb-logout\", logout);\n$(document).on(\"keydown\", \".bb-logout\", function (ev) {\n if (ev.keyCode !== KEYS.ENTER && ev.keyCode !== KEYS.SPACE) return true;\n logout(ev);\n return false;\n});\n\n/** Exit\n *\n * Exit the current case;\n * @param {Function} fun Function to execute after having exited.\n * If exiting isn't necessary, still execute fun.\n */\nfunction exit(fun, sync = true) {\n if (typeof fun !== \"function\")\n // Could be an event object on .bb-stop\n fun = undefined;\n if (shouldExit()) {\n step(\"exit\", fun, { sync });\n } else fun && fun();\n}\n\n$(document).on(\"click\", \".bb-stop\", exit);\n\n// Request 'getuserinfo'\nfunction getUserInfo() {\n $.postJSON(\"getuserinfo\", Vars.querify(\"uniqueid\") + \"&fmt=json\");\n}\n\n/*** NAVIGATION, REQUESTS END ***/\n\n/*** MENU BEGIN ***/\n\nfunction setupMenu() {\n $(\".bb-settings\").attr({ target: \"blank\" });\n}\n\n// Open WebAdmin (in new page)\nfunction openSettings() {\n var href = fromApiServer(\"webadmin\" + \"?\" + Vars.querify(\"uniqueid\"));\n window.open(href);\n return false;\n}\n\n$(document).on(\"click\", \".bb-settings\", openSettings);\n$(document).on(\"keydown\", \".bb-settings\", function (ev) {\n if (ev.keyCode !== KEYS.ENTER && ev.keyCode !== KEYS.SPACE) return true;\n openSettings(ev);\n return false;\n});\n\n/** menu\n *\n * Open menu (model overview)\n * @param {String|Object|undefined} creds Optional credentials,\n * defaults to fmt:json and uniqueid\n */\nfunction menu(creds) {\n return $.postJSON(\n \"menu\",\n creds || {\n fmt: \"json\",\n uniqueid: Vars.getVar(\"uniqueid\")\n }\n );\n}\n\n/** exitthenmenu\n *\n * Exit a case, then open a menu\n * @param {Event} ev Optional event whose propagation will be stopped\n */\nfunction exitthenmenu(ev) {\n exit(function () {\n menu();\n });\n ev && ev.stopPropagation && ev.stopPropagation();\n}\n\n$(document).on(\"click\", \".bb-openmodels\", exitthenmenu);\n$(document).on(\"keydown\", \".bb-openmodels\", function (ev) {\n if (ev.keyCode !== KEYS.ENTER) return;\n exitthenmenu(ev);\n});\n\n/*** MENU END ***/\n\n/*** MISC UI BEGIN ***/\n\nfunction hideLogin() {\n $(\"form#bb-login\").hide();\n}\n\n/**\n * Simple class toggling to implement collapsing/expanding widgets.\n *\n * Needs CSS styling and / or Event handler registered on custom\n * jQuery 'bb:collapsing' Event.\n */\n$(document).on(\"click keydown\", \".bb-collapsable .bb-collapser\", function (ev) {\n if (aintTheEnterKey(ev) || ev.shiftKey) return true;\n $(this)\n .closest(\".bb-collapsable\")\n .toggleClass(\"bb-collapsed\")\n .trigger(\"bb:collapsing\");\n return false;\n});\n\n/*** MISC UI END ***/\n\n/*** DATA HANDLERS BEGIN ***/\n\n/**\n * Default handlers for JSON object.\n *\n * Order in which these handlers are executed are:\n *\n * bb:preHandleData\n * bb:handleData\n * bb:postHandleData\n * bb:finalHandleData\n */\n\n$(document).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.groups) {\n data.groups.forEach(function (group) {\n const groupid = group.groupid;\n group.controls.forEach(function (control) {\n control._originalid = control.id;\n control.id = groupid + \"-\" + control.id;\n if (control.isfor) {\n control._originalisfor = control.isfor;\n control.isfor = groupid + \"-\" + control.isfor;\n }\n if (control.controltype === \"label\") {\n control.value = control.value.trim();\n if (control.isfor && control.value)\n control.value = control.value + \" \";\n }\n if (\n control.controltype === \"memo\" &&\n control.maxlength > 0 &&\n !control.placeholder\n ) {\n control.placeholder = positionalFormat(\n _(\"Maximum allowed characters: {0}\"),\n control.maxlength\n );\n }\n });\n });\n }\n});\n/**\n * Default handler for JSON object.\n *\n * Sets mode, variables, calls functions to update UI.\n *\n */\nfunction onHandleData(event, data) {\n // Save previous modus - it will be the next modus if unset.\n var modus = $(\"body\").attr(\"data-modus\"); // Either 'model', 'menu', or 'none'\n\n Mode.unset(\"hasMessage\");\n if (typeof data == \"undefined\") return;\n if (typeof document.selection != \"undefined\")\n try {\n document.selection.removeAllRanges();\n // eslint-disable-next-line no-empty, no-unused-vars -- tryCatch was there for IE's sake. probably because we were using Selection.empty()\n } catch (e) {}\n\n // Fix error objects - they are a mess\n if (data.error) {\n data.error = Errors.translate(data.error);\n // Do not throw the error just yet - we may need it to\n // get in the right mode\n }\n\n Vars.setVars(data);\n\n if (data.userinfo) {\n Mode.set(\"isLoggedIn\");\n setRole();\n setupMenu();\n return;\n }\n\n if (\n data.error &&\n ([\n Errors.CODES.cWebPleaseLogin,\n Errors.CODES.cUMWrongUserNamePassword,\n Errors.CODES.cWebSessionTimeOut\n ].indexOf(data.error.code) > -1 ||\n data.error.code === \"UNAUTHORIZED\")\n ) {\n // Do nothing\n } else if (has(\"bbis\", data)) {\n // Authenticate through BBI\n new BBI(data).authenticate();\n return;\n } else if (Vars.getVar(\"uniqueid\")) {\n // We are apparently logged in\n hideLogin();\n if (!Vars.getVar(\"userinfo\")) {\n // Get user information\n getUserInfo();\n }\n }\n\n // \"DrawScreen: end\"\n /* Only set modus if this is possibly mode-changing data (e.g.\n * DON'T even go here when data.userinfo is true).\n */\n if (data.status || data.groups || data.cases || data.models || data.error) {\n if (data.groups) modus = \"model\";\n else if (\n data.models ||\n data.cases ||\n (data.status && data.status == \"Ready\")\n ) {\n modus = \"menu\";\n } else if (data.status && data.status == \"logout successful\") {\n modus = \"none\";\n } else if (data.error && data.error.code === Errors.CODES.cWebPleaseLogin) {\n modus = \"none\";\n } else if (\n data.error &&\n data.error.code === Errors.CODES.cUMWrongUserNamePassword\n ) {\n modus = \"none\";\n } else if (\n data.error &&\n data.error.code === Errors.CODES.cWebSessionTimeOut\n ) {\n modus = \"none\";\n } else if (data.error && data.error.code === \"READY\") {\n modus = \"menu\";\n }\n $(\"body\").attr(\"data-modus\", modus);\n // Set current modus\n\n // Clean up state vars that were left over\n if (modus === \"menu\") {\n Vars.unsetVars([\"sessionid\", \"screenid\"]); // Session specific data\n }\n if (modus === \"none\") {\n const perms = permissions();\n Vars.unsetVars();\n perms.forEach(p => {\n Mode.toggle(p, false, false);\n });\n }\n\n // Will need to be seen with every control\n Mode.unset(\"hasHints\");\n\n if (!data.error)\n Mode.toggle(\"hasNoModelsShown\", modus !== \"menu\")\n\n .toggle(\"hasModel\", modus === \"model\")\n\n .toggle(\"hasMenu\", modus === \"menu\")\n\n .toggle(\n \"hasModels\",\n modus === \"menu\" && !!data.models && !!data.models.length\n )\n\n .toggle(\n \"hasCases\",\n modus === \"menu\" && !!data.cases && !!data.cases.length\n )\n\n .toggle(\n \"hasJumplist\",\n modus === \"model\" && !!data.jumplist && !!data.jumplist.length\n )\n\n .toggle(\n \"hasInformationsources\",\n modus === \"model\" &&\n data.informationsources &&\n !!data.informationsources.length\n )\n\n .toggle(\"hasNoPrior\", modus === \"model\" && !data.hasprevious)\n\n .toggle(\"hasNoNext\", modus === \"model\" && !data.hasnext);\n\n Mode.toggle(\"isLoggedIn\", modus !== \"none\");\n\n if (modus === \"none\") {\n Mode.unset(\"isDeepLinked\");\n setRole(); // Sets Mode\n }\n if (modus !== \"model\") {\n Mode.unset(\"isValidated\");\n }\n }\n\n if (\n data.error &&\n !includes(data.error.code, propOr([], \"ignoredErrorCodes\", conf))\n ) {\n notify(\n {\n keepalive: path([\"arbitrary\", \"core\", \"notify\", \"keepalive\"], conf),\n html: false\n },\n data.error\n );\n }\n\n // View updates\n if (data.modeldescription) {\n $(\".bb-modelname\")\n .text(data.modeldescription.replace(/_/g, \" \"))\n .attr(\"lang\", data.modellanguage);\n } else if (modus !== \"model\") {\n $(\".bb-modelname\").text(\"\");\n }\n\n if (modus !== \"model\") {\n $(\"#bb-q\").empty();\n }\n\n if (modus !== \"menu\") {\n Cases.empty();\n Models.empty();\n }\n\n if (modus === \"none\") {\n resetLogin();\n }\n\n if (modus === \"none\") {\n Mode.unset(\"hasModel\")\n .unset(\"hasNoModelsShown\")\n .unset(\"hasMenu\")\n .unset(\"hasModels\")\n .unset(\"hasCases\")\n .unset(\"hasJumplist\")\n .unset(\"hasInformationsources\")\n .unset(\"hasNoPrior\")\n .unset(\"hasNoNext\");\n }\n\n if (modus === \"menu\") {\n if (data.models && !!data.models.length) {\n Models.update(data);\n }\n if (data.cases && !!data.cases.length) {\n Cases.update(data.cases);\n }\n }\n\n if (modus === \"model\") {\n if (data.groups) {\n Validation.reset();\n $(document).trigger(\"bb:renderQuestions\", data);\n }\n Validation.setMode(); // Sets Mode\n\n $(\".bb-openattachments\").attr(\"href\", urlutils.getFiles());\n\n // if (data.informationsources){\n // runHook(\"informationsources\")(data.informationsources);\n // }\n if (data.jumplist) {\n Jumplist.type = arbitraryCoreProp(\"jumplist.type\") || \"ul\";\n Jumplist.draw(data.jumplist);\n }\n }\n}\n\n$(document).on(\"bb:handleData\", onHandleData);\n\n/**\n * Default final handler for JSON object.\n *\n * Runs after any DOM updates. Should only be used for focusing or non-UI stuff.\n *\n * Do not override (unless you know exactly what you are doing) --\n * just augment it if need be.\n *\n */\n$(document).on(\"bb:finalHandleData\", function () {\n bb.ajax.release();\n});\n\nlet returnfocusto, returnSelection;\n\nconst $document = $(document);\n\n$document.on(\"focus\", \":input\", ev => {\n const activeElement = ev.target;\n returnfocusto = activeElement.getAttribute(\"id\");\n if (activeElement.value)\n returnSelection = {\n selectionStart: 0,\n selectionEnd: activeElement.value.length,\n selectionDirection: \"forward\"\n };\n});\n\n$document.on(\"keydown\", \":input\", ev => {\n const activeElement = ev.target;\n const { selectionStart, selectionEnd, selectionDirection } = activeElement;\n returnSelection = { selectionStart, selectionEnd, selectionDirection };\n});\n\nfunction returnfocus() {\n try {\n let elt = document.querySelector(`[id=\"${returnfocusto}\"]`);\n if (elt) {\n elt.focus();\n if (elt.classList.contains(\"hasDatepicker\")) {\n $(elt).datepicker(\"widget\").hide();\n }\n let { selectionStart, selectionEnd, selectionDirection } =\n returnSelection;\n elt.setSelectionRange(selectionStart, selectionEnd, selectionDirection);\n }\n } catch (e) {\n // Checkbox throw an error that some object is not or no\n // longer usable. But how may we check?\n\n // Number inputs and such\n e.select && e.select();\n return true;\n }\n return false;\n}\n\nfunction focusHandler(event, data) {\n if (data.groups) {\n window.setTimeout(function () {\n const [grid, row] = (Ajax.row || \"\").split(\".\");\n var $input,\n focusstring = \":input:visible:enabled:not([readonly]):last\";\n if (row) {\n if (row === \"+\") {\n // Addbutton for entire grid\n $input = $(`.group [name=\"update\"][value=\"${grid}.+\"]`);\n } else {\n $input = $(\n '.group [name=\"' +\n grid +\n '\"] tbody tr:nth(' +\n row +\n \") \" +\n focusstring\n );\n // Might've been the last row - then focus the butlast one\n if (!$input.length)\n $input = $(\n '.group [name=\"' +\n grid +\n '\"] tbody tr:nth(' +\n (parseInt(row) - 1) +\n \") \" +\n focusstring\n );\n // Empty table? Focus addbutton\n if (!$input.length)\n $input = $(`.group [name=\"update\"][value=\"${grid}.+\"]`);\n }\n if ($input.length) {\n $input.trigger(\"focus\");\n }\n } else {\n // focus was lost\n if (\n both(\n complement(propEq(\"_isUpdate\", true)),\n complement(propEq(\"_direction\", \"update\"))\n )(data) ||\n (Mode.get(\"a-keyboard-user\") &&\n document.activeElement === document.body &&\n !returnfocus())\n ) {\n $(\".group.selected\").trigger(\"focus\");\n const e_group = document.querySelector(\".group.selected\");\n if (e_group === null) return;\n e_group.focus();\n if (doScrollToSelected(conf)) {\n if (e_group.previousElementSibling) {\n e_group.scrollIntoView({\n behavior: window.matchMedia(\"(prefers-reduced-motion: reduce)\")\n .matches\n ? \"auto\"\n : \"smooth\"\n });\n }\n }\n }\n }\n }, 0);\n return;\n }\n if (data.models && (!data.cases || !data.cases.length)) {\n $(\".bb-model-name:first\").trigger(\"focus\");\n $(\".bb-model.selected .bb-model-name:first\").trigger(\"focus\");\n return;\n }\n if (data.cases) {\n $(\"#bb-cases tbody .bb-case .bb-case-name:first\").trigger(\"focus\");\n return;\n }\n $(\"form#bb-login input[name=username]\").trigger(\"focus\");\n}\n\nfunction setupFocusHandler(event, data) {\n if (data.uniqueid) {\n $(document).on(\"bb:finalHandleData\", focusHandler);\n $(document).off(\"bb:finalHandleData\", setupFocusHandler);\n }\n}\n\n$(document).on(\"bb:finalHandleData\", setupFocusHandler);\n\nfunction updateDynProps(fulldata, input) {\n var data = {\n groups: fulldata.groups\n };\n $(document).trigger(\"bb:willUpdate\", fulldata);\n if (data && data.groups) {\n var group = data.groups.filter(function (group) {\n return group.current;\n })[0];\n let controls = sortControls(group.controls.slice(0), []);\n $(\n '.group [data-datatype^=\"datades:\"], .group [data-type=\"label\"]'\n ).updateControl(controls, input);\n Validation.setMode();\n }\n $(document).trigger(\"bb:hasUpdated\", fulldata);\n}\n\n$(document).on(\"bb:updated\", function (event, $widget, control, updates) {\n if (updates.indexOf(\"visible\") > -1 && control.identifier) {\n var $parent = $widget.parents(\".bb-questionlabelgroup\");\n if (control.visible) {\n $parent.attr(\"data-visible\", control.visible);\n window.setTimeout(function () {\n $parent.removeAttr(\"hidden\").attr(\"data-visible\", control.visible);\n }, 80);\n } else {\n $parent.attr(\"data-visible\", control.visible);\n window.setTimeout(function () {\n $parent.attr(\"hidden\", true);\n }, 80);\n }\n }\n});\n\n/*** DATA HANDLERS END ***/\n\n/*** VALIDATION BEGIN ***/\n\n/**\n * @Class Validation object.\n *\n */\nvar Validation = {\n /**\n * @member @private {Array} Stack of to-be-validated elemenents\n */\n _stack: [],\n /**\n * @member {Function}\n * @return undefined\n */\n reset: function () {\n this._stack = [];\n },\n /**\n * @member {Function}\n * @return {Element} Next Element eligible for validation\n */\n next: function () {\n return this._stack.pop();\n },\n /**\n * @member {Function}\n * @param {Element} el Element we want to be validated in due time\n */\n add: function (el) {\n this._stack.push(el);\n }\n};\n\n/**\n * Are all inputs valid?\n * @return {Boolean} Whether all inputs pass the test\n */\nValidation.allValid = function () {\n return (\n $.grep(\n $(\n '.group:not([disabled]) .validatable, .group:not([disabled]) [data-datatype^=\"datades:\"]'\n )\n .validate({ silent: true })\n .map(function () {\n return $(this).data(\"validated\");\n }),\n function (val) {\n return val === false;\n }\n ).length === 0\n );\n};\n\n/**\n * Update isValidated Mode\n * @return undefined\n */\nValidation.setMode = function () {\n Mode.toggle(\"isValidated\", Validation.allValid());\n};\n\n/**\n * Live Validation instructions\n */\n$(document).on(\"keyup change\", \"body.hasModel\", Validation.setMode);\n\n// Push the input just left onto the validation stack\n$(document).on(\"focusout\", \"#bb-q .group .validatable\", function () {\n var me = $(this);\n Validation.add(me[0]);\n});\n\n$.fn.extend({\n geterrorelt: function () {\n var $this = $(this);\n return $this.data(\"$error\") || $();\n },\n showValidation: function (options, ok, error) {\n var $this = $(this),\n node = $this.get(0);\n\n var errortext;\n if (error instanceof Error) errortext = error.message;\n else errortext = error;\n\n if (!document.body.contains(node)) {\n // console.log('Trying to validate unconnected', this)\n return;\n }\n $this.data(\"validated\", ok);\n\n if (!ok) {\n var $error = $this.geterrorelt(),\n $anchor = $this.is(\"input[type=checkbox]\")\n ? $this.next()\n : $this.data(\"anchor\");\n\n $this.attr(\"aria-invalid\", true);\n\n if ($error.length === 0) {\n if (!options.silent && !options.justhide) {\n $error = $(\n ``\n );\n $this.data(\"$error\", $error);\n }\n }\n // If there was already an error element, and the input is\n // still invalid but (reason and therefore) the errortext\n // has changed, change the error text shown to the user.\n if ($error.length > 0) {\n if ($error.data(\"lasterrortext\") !== errortext) {\n $error.data(\"lasterrortext\", errortext);\n $error.text(errortext);\n }\n }\n if (!options.silent && !options.justhide) {\n $this.addClass(\"error invalid\");\n // (re-)attach $error.\n $anchor.after($error);\n // This may be necessary:\n $(\"#bb-wrapmodel\").scrollTo($error);\n // Allow complicated widgets to fix stuff afterwards\n $this.trigger(\"bb:errorOn\", [errortext, $anchor, $error]);\n }\n } else {\n $this.attr(\"aria-invalid\", false);\n $this.geterrorelt().remove();\n $this.removeClass(\"error invalid\");\n $this.addClass(\"validated\");\n // Allow complicated widgets to fix stuff afterwards\n $this.trigger(\"bb:errorOff\");\n\n if (!options.silent && options.requestUpdate) {\n if (Mode.get(\"hasDynamicInterfaces\")) {\n requestDynProps(node);\n }\n }\n }\n },\n // Validate input\n // OPTIONS: silent, justhide\n validate: function (options) {\n if (!options) {\n options = {};\n }\n if (options.silent === undefined) {\n options.silent = false;\n }\n if (options.justhide === undefined) {\n options.justhide = false;\n }\n // requestUpdate needs to be false whenever validation is done\n // upon node navigation (next, skip), in order to avoid useless\n // server requests. Also, on validating for just showing errors\n // on tabbing away, we want not to request an update - that is\n // already taken care of by the onChange event\n if (options.requestUpdate === undefined) {\n options.requestUpdate = true;\n }\n\n // Argument noui says: do not update the ui (i.e. do not show nor hide any errors).\n return $(this).each(function () {\n var $this = $(this),\n ok = true,\n errortext;\n\n try {\n // Let actual validation be performed by other method.\n ok = validateInput($this);\n } catch (err) {\n ok = false;\n errortext = err;\n }\n\n return $this.showValidation(options, ok, errortext);\n });\n }\n});\n\n// Check when tabbing / clicking to new input - we want to show\n// validation while tabbing through, but not tabbing. onChange we want\n// to hide validation errors, but not show them immediately.\n$(document).on(\"focusin\", \":input\", function () {\n let validatable;\n while ((validatable = Validation.next())) {\n validatable = $(validatable);\n if ($(this).is(\":radio\")) {\n //Only validate when really outside of the radiogroup\n if (!$(this).parent(\".radiogroup\").has(validatable))\n validatable.validate({ requestUpdate: false });\n } else {\n if (validatable.get(0) != $(this).get(0))\n validatable.validate({ requestUpdate: false });\n }\n }\n});\n\n$(document).on(\n \"change\",\n \"#bb-q .group.selected :input:not(button)\",\n function () {\n var $this = $(this),\n options = { silent: false, justhide: true };\n if ($this.is(\":radio\")) {\n // validating radio???\n $this.parents(\".radiogroup\").validate(options);\n } else {\n $this.validate(options);\n }\n }\n);\n\n// Always check checkboxes onchange\n$(document).on(\"change\", \"#bb-q .group :checkbox\", function () {\n $(this).parents(\".checklist\").validate();\n});\n\nfunction debounce(func, wait, immediate) {\n var timeout;\n return function () {\n var context = this,\n args = arguments;\n var later = function () {\n timeout = null;\n if (!immediate) func.apply(context, args);\n };\n var callNow = immediate && !timeout;\n window.clearTimeout(timeout);\n timeout = window.setTimeout(later, wait);\n if (callNow) func.apply(context, args);\n };\n}\n\nconst eltControltype = compose(prop(\"controltype\"), getControl);\n\nconst doChangeOnKeyDown = elt => {\n const setting = path([\"arbitrary\", \"core\", \"update-on-typing\"])(conf);\n return (\n setting === \"always\" ||\n (setting instanceof Array && includes(eltControltype(elt), setting))\n );\n};\n\nfunction keyDown() {\n if (doChangeOnKeyDown(this)) $(this).data(\"valBefore\", $(this).val());\n}\n\n$(document).on(\n \"keydown\",\n \"#bb-q .group.selected :input:not(button)\",\n debounce(keyDown, 32, true)\n);\n\n$(document).on(\n \"keyup\",\n \"#bb-q .group.selected :input:not(button)\",\n function () {\n if (doChangeOnKeyDown(this)) {\n var $this = $(this),\n before = $this.data(\"valBefore\"),\n val = $this.val();\n if (before !== undefined && before !== val) {\n $this.trigger(\"change\");\n $this.removeData(\"valBefore\");\n }\n }\n }\n);\n/*** VALIDATION END ***/\n\n/*** HINTS, TOOLTIPS BEGIN ***/\n// Move to plugin core:tooltips\n/*** HINTS, TOOLTIPS END ***/\n\n/*** RENDERING 'ENGINE' BEGIN ***/\nconst doScrollToSelected = compose(\n val => val !== false,\n path([\"arbitrary\", \"core\", \"scrollToSelectedGroup\"])\n);\nconst setDynamicMode = tap(\n group =>\n group.current && Mode.toggle(\"hasDynamicInterfaces\", Boolean(group.dynamic))\n);\n\n/**\n * Render questions / labels (i.o.w. the main interaction\n * interface) This function is only called when there are actually\n * screens in need of rendering. Therefore, it need not check the JSON\n * object\n *\n * @param ev {Event} The event that triggered this function\n * @param data {Object} 'JSON'-object conforming to BB JSON API.\n */\nfunction renderGroups(ev, data) {\n // Save previous id\n var previd = $(\"#bb-q\" + \" .group.selected\").data(\"groupid\"),\n groups = data.groups,\n $bbq = $(\"#bb-q\");\n\n // Begin -- Only update what is new or was .selected before! There\n // is a problem with $.ajax calls when fast-clicking => therefore\n // step has {async: false}\n //\n // FIXME: when user press next, while\n // there is no next, a node too many is inserted. This can be\n // fixed now the server passes along the node id of a group.\n\n groups.forEach(setGroupTitle);\n if (![\"open\", \"exit\"].includes(Ajax.direction) && mustUpdate(conf)) {\n // Prepare DOM -- remove unneeded or to be re-rendered .groups\n for (let group of document.querySelectorAll(\".group\")) {\n if (complement(any(propEq(\"groupid\", group.dataset[\"gid\"])))(groups)) {\n // Remove a group if not in response\n group.parentNode.removeChild(group);\n } else if (Ajax.row && group.dataset[\"gid\"] === Ajax.groupid) {\n // When adding/deleting rows, safe the space where the group\n // was (entire group will be re-rendered)\n const gob = find(propEq(\"groupid\", group.dataset[\"gid\"]))(groups);\n const tempNode = document.createComment(\"group\");\n group.parentNode.replaceChild(tempNode, group);\n gob._tempNode = tempNode;\n }\n }\n compose(\n map(\n compose(\n ifElse(\n ({ groupid }) =>\n document.querySelector(`.group[data-gid=\"${groupid}\"]`),\n group => {\n updateDynProps({\n groups: [{ current: true, controls: group.controls }]\n });\n const elt = document.querySelector(\n `.group[data-gid=\"${group.groupid}\"]`\n );\n setSelectedStateAttributes(elt, group);\n },\n renderGroup\n ),\n setDynamicMode\n )\n ),\n sortGroups\n )(groups);\n } else {\n // Always remove .selected:\n $(\".group.selected\", $bbq).remove();\n if (Ajax.direction == \"next\" && groups.length > 1) {\n // Re-render only previous group and current group\n groups = groups.filter(function (group) {\n return group.current || group.groupid === previd;\n });\n } else if (\n Ajax.direction == \"prior\" &&\n $(\"#bb-q .group\").length > 0 &&\n groups.length > 1\n ) {\n // Re-render only current group\n groups = groups.filter(function (group) {\n return group.current;\n });\n } else $bbq.empty();\n // End -- Only update what is new!\n\n $bbq.hide();\n compose(map(compose(renderGroup, setDynamicMode)), sortGroups)(groups);\n }\n $bbq.attr(\"lang\", data.modellanguage).show();\n\n // Old questionlabelgroup plugin:\n if (!doGrouping(conf)) {\n (bb.questionlabelgroup || questionlabelgroup)();\n\n $('.bb-questionlabelgroup:has([data-datatype][data-visible=\"false\"])').attr(\n {\n \"data-visible\": false,\n \"hidden\": true\n }\n );\n }\n}\n\nfunction sortGroups(groups) {\n // Fix insertion order\n return groups.sort(function (a, b) {\n return a.order - b.order;\n });\n}\n\nfunction sortControls(a, b) {\n if (!a[0]) return b.reverse();\n var ac = a.shift(),\n bc = b[0];\n if (\n bc &&\n ac.controltype === \"label\" &&\n !ac.datatype && // Label with a datatype is a text interface\n bc._sorted === undefined &&\n bc.controltype !== \"label\" &&\n (bc.controltype !== \"linklabel\" || bc.isreport) &&\n bc.controltype !== \"checkbox\"\n ) {\n // Reverse input with label\n b.shift();\n bc._sorted = true; // Instruct next recursion not to touch the control\n if (has(\"notnull\", bc)) ac.isForNotNull = bc.notnull;\n if (has(\"readonly\", bc)) ac.readonly = bc.readonly;\n ac.dynamic = bc.dynamic = /^datades:/.test(bc.datatype);\n ac.metadata = Object.assign({}, bc.metadata, ac.metadata);\n bc.meta = bc.meta || {}; // Associate input with label\n bc.meta.label = (ac.value || \"\").trim();\n bc.aria = bc.aria || {}; // Associate input with label\n if (bc.notnull) bc.aria.required = true;\n if (ac.notnull) ac.aria.required = true;\n // Associate input (group) with label.\n if (\n [\"radio\", \"checkmultilist\", \"listbox\", \"multilist\"].includes(\n bc.controltype\n )\n ) {\n if (bb.conf.a11y.optionfieldsets) {\n ac.controltype = \"legend\";\n ac.className = \"bb-label\";\n } else {\n bc.aria.labelledby = ac.id;\n }\n } else if (bc.controltype === \"grid\") {\n if (bb.conf.a11y.captions) {\n ac.controltype = \"caption\";\n bc.caption = ac;\n } else {\n bc.aria.labelledby = ac.id;\n }\n } else {\n ac.isFor = bc.id;\n }\n return sortControls(a, [bc, ac].concat(b));\n } else {\n if (\n bc &&\n ac.controltype === \"label\" &&\n !ac.datatype && // Label with a datatype is a text interface\n bc.controltype === \"checkbox\"\n ) {\n ac.isFor = bc.id; // Associate label with checkbox (that comes before)\n if (has(\"notnull\", bc)) ac.isForNotNull = bc.notnull;\n if (has(\"readonly\", bc)) ac.readonly = bc.readonly;\n ac.dynamic = /^datades:/.test(bc.datatype);\n ac.metadata = Object.assign({}, bc.metadata, ac.metadata);\n bc.meta = bc.meta || {}; // Associate input with label\n bc.meta.label = (ac.value || \"\").trim();\n bc.aria = bc.aria || {};\n if (bc.notnull) bc.aria.required = true;\n if (ac.notnull) ac.aria.required = true;\n }\n return sortControls(a, [ac].concat(b));\n }\n}\n\nfunction setGroupTitle(group) {\n var controls = group.controls;\n // It's a title, if:\n // there are two 1st is label Not a 'text' interface 1st doesnt control any\n if (\n controls[1] &&\n controls[0].controltype === \"label\" &&\n !controls[0].datatype &&\n !controls[0].isfor\n ) {\n controls[0].controltype = \"legend\";\n group.screentitle = controls[0].value;\n }\n}\n\nconst setSelectedStateAttributes = (elt, group) => {\n elt.classList.toggle(\"selected\", group.current);\n elt.classList.toggle(\"unselected\", !group.current);\n if (group.current || canEditEarlier(conf)) {\n elt.removeAttribute(\"aria-hidden\");\n elt.removeAttribute(\"disabled\");\n } else {\n elt.setAttribute(\"aria-hidden\", true);\n elt.setAttribute(\"disabled\", \"disabled\");\n }\n};\n\nconst hasStatusRole = pathEq([\"metadata\", \"role\"], \"status\");\n\nfunction renderGroup(group) {\n var controls = group.controls,\n wGroup = $(\n '
      \"\n );\n\n // If this has a dupe, first remove the old one:\n $(\".group\").each(function () {\n if ($(this).data(\"groupid\") === group.groupid) $(this).remove();\n });\n\n const elt = wGroup.get(0);\n elt.dataset[\"gid\"] = group[\"groupid\"];\n wGroup.data(\"groupid\", group[\"groupid\"]);\n\n controls = sortControls(controls.slice(0), []);\n\n if (doGrouping(conf)) controls = groupOuter(controls);\n\n $(controls).each(function (i, c) {\n if (doGrouping(conf)) {\n elt.appendChild(createFormGroup(wControl, group, 1)(c));\n } else wControl(c, group, elt);\n });\n\n elt.classList.add(\"bb-screenmode-\" + group.screenmode);\n elt.setAttribute(\"data-node\", group.name);\n if (!bb.getVar(\"wrongOrder\")) elt.setAttribute(\"data-bb:order\", group.order);\n\n setSelectedStateAttributes(elt, group);\n\n if (group._tempNode) {\n group._tempNode.parentNode.replaceChild(elt, group._tempNode);\n delete group._tempNode;\n } else {\n if (group.screenmode == \"addtop\") $(\"#bb-q\").prepend(elt);\n else $(\"#bb-q\").append(elt);\n }\n}\n\n/**\n * Wrap questions + accompanying labels in a single group\n *\n * This function may be overriden by assigning a function to bb.questionlabelgroup\n * @see Plugin questionlabelgroup-ng\n *\n * @return undefined\n */\nfunction questionlabelgroup() {\n $(\".group:not(:has(.bb-questionlabelgroup))>.bb-label\").each(function () {\n var $this = $(this);\n var input = $this.next(\n \":not(label):not(a):not([type=checkbox]):not(img):not(.clearfix)\"\n );\n var itype = input.data(\"type\");\n var questionandlabel = $this.add(input);\n\n if (questionandlabel.length > 1)\n questionandlabel.wrapAll(\n '
      '\n );\n else {\n questionandlabel = $this.prev(\"[type=checkbox]\").add(this);\n if (questionandlabel.length > 1)\n questionandlabel.wrapAll(\n '
      '\n );\n }\n questionandlabel\n .parent(\".bb-questionlabelgroup\")\n .append('
      ');\n $.each(\n questionandlabel.parent(\".bb-questionlabelgroup\").find(\"[data-type]\"),\n function () {\n var $this = $(this);\n if ($this.attr(\"class\")) {\n var classname = $this.attr(\"class\").match(/\\bbbm-[a-z0-9-]+\\b/);\n if (classname) {\n classname = classname[0].replace(/\\bbbm-/, \"bb-g-\");\n $this.parents(\".bb-questionlabelgroup\").addClass(classname);\n }\n }\n }\n );\n });\n}\n\n/*** RENDERING 'ENGINE' END ***/\n\n/*** 'COMPLEX' WIDGET BEHAVIOUR BEGIN ***/\n\n/**\n * Radiogroup and checklist enhancements\n */\n\n$(document)\n .on(\"change programmatically-changed\", \".bb-option\", function (ev) {\n var $this = $(this);\n $this.toggleClass(\"checked\", ev.target.checked);\n if (ev.target.type === \"radio\" && ev.target.checked) {\n $this.siblings().removeClass(\"checked\");\n }\n })\n .on(\"focus\", \".bb-option\", function (ev) {\n $(this).addClass(\"focus\");\n if (ev.target.type === \"radio\") {\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n }\n return true;\n })\n .on(\"blur\", \".bb-option\", function () {\n $(this).removeClass(\"focus\");\n })\n .on(\n \"keydown\",\n \".radiogroup .bb-option\",\n // Fix the odd default behaviour of selecting upon focus\n function (ev) {\n var $other,\n chars = [37, 38, 39, 40],\n // left, up, right, down\n idx = chars.indexOf(ev.keyCode);\n if (idx === -1) return true;\n\n $other =\n idx < 2 // 'prev' chars\n ? $(this).prev().find('input[type=\"radio\"]')\n : $(this).next().find('input[type=\"radio\"]');\n\n // At beginning or end... go around (Edge selects otherwise...).\n if (!$other.length) {\n $other =\n idx < 2 // 'prev' chars\n ? $(this).siblings().last().find('input[type=\"radio\"]')\n : $(this).siblings().first().find('input[type=\"radio\"]');\n }\n if ($other.length) {\n $other.trigger(\"focus\");\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n }\n return true;\n }\n );\n\n/*** 'COMPLEX' WIDGET BEHAVIOUR END ***/\n\n/*** LINKS BEGIN ***/\n\n/**\n * Original code moved to plugin rewrite-links\n *\n */\n\n/*** LINKS END ***/\n\n/*** TOKENCHANNEL BEGIN ***/\n\n$(document).on(\"bb:preHandleData\", (_, data) => {\n if (has(\"uniqueid\", data)) {\n token.setToken(prop(\"uniqueid\", data));\n }\n});\n\n$(document).on(\"bb:preHandleData\", (_, data) => {\n // document.body.dispatchEvent(new customEvent(\"bb:storeToken\", { bubbles: true, })\n if (has(\"uniqueid\", data)) {\n token.setToken(prop(\"uniqueid\", data));\n }\n});\n\n$(document).on(\"bb:mode:isLoggedIn\", (_event, bool) => {\n if (!bool) {\n token\n .getHash()\n .then(tokenHash => token.postMessage({ tokenHash, type: \"loggedOut\" }));\n }\n});\n\ntoken.addEventListener(\"message\", message => {\n token.getHash().then(hash => {\n if (message.data.tokenHash === hash) {\n if (message.data.type === \"loggedOut\") window.close() || logout();\n }\n });\n});\n\n/*** TOKENCHANNEL END ***/\n\n/*** EXPORTS BEGIN ***/\n\nbb.escapeHTML = escapeHTML;\nbb.exit = exit;\nbb.deleteCase = deleteCase;\nbb.logout = logout;\nbb.menu = menu;\n\nbb.authenticate = token => Vars.setVars({ uniqueid: token });\nbb.newcase = newcase;\nbb.step = step;\nbb.restart = function restart() {\n newcase(Vars.getVar(\"dbname\"));\n};\nbb.rewind = function rewind(cb, options) {\n step(\"rewind\", cb, options);\n};\nbb.update = function update(cb, options) {\n step(\"update\", cb, options);\n};\nbb.updatemis = function updatemis(options) {\n step(\"updatemis\", $.noop, options);\n};\nbb.next = function next(cb, options) {\n step(\"next\", cb, options);\n};\nbb.prior = function prior(cb, options) {\n step(\"prior\", cb, options);\n};\nbb.skip = function skip(cb, options) {\n step(\"skip\", cb, options);\n};\nbb.gotonode = function gotonode(groupid, cb, options = null) {\n step(\"gotonode\", cb, Object.assign({}, { groupid }, options));\n};\nbb.runtonode = function runtonode(nodename, cb) {\n step(\"runtonode\", cb, { fullnodename: nodename });\n};\nbb.getVar = Vars.getVar;\nbb.notify = notify.bind(null, {});\nbb.ajax = {\n replace: Ajax.replace,\n busy: function () {\n return Ajax.busy;\n },\n release: Ajax.release,\n post: Ajax.post,\n direction: function () {\n return Ajax.direction;\n }\n};\nbb.URL = urlutils;\nbb.Numerals = Numerals;\nbb.Plugins = bb.Plugins || {};\nbb.Validation = Validation;\nbb.positionalFormat = positionalFormat;\nbb.humanDate = humanDate;\nbb.propFinder = propFinder;\nbb.requestDynProps = requestDynProps;\n// Window-export some stuff used in bookmarklets.\nwindow.bb = {\n restart: bb.restart,\n getVar: bb.getVar,\n requestDynProps: bb.requestDynProps,\n Mode,\n menu\n};\n\n/*** EXPORTS END ***/\n\nexport { bb, _, _ as gt };\n","/**\n * https://github.com/flesler/jquery.scrollTo\n * Copyright (c) 2007-2013 Ariel Flesler - afleslergmailcom | http://flesler.blogspot.com\n * Dual licensed under MIT and GPL.\n * @author Ariel Flesler\n * @version 1.4.6\n */\n(function ($) {\n var h = ($.scrollTo = function (a, b, c) {\n $(window).scrollTo(a, b, c);\n });\n h.defaults = {\n axis: \"xy\",\n duration: parseFloat($.fn.jquery) >= 1.3 ? 0 : 1,\n limit: true\n };\n h.window = function (a) {\n return $(window)._scrollable();\n };\n $.fn._scrollable = function () {\n return this.map(function () {\n var a = this,\n isWin =\n !a.nodeName ||\n $.inArray(a.nodeName.toLowerCase(), [\n \"iframe\",\n \"#document\",\n \"html\",\n \"body\"\n ]) != -1;\n if (!isWin) return a;\n var b = (a.contentWindow || a).document || a.ownerDocument || a;\n return /webkit/i.test(navigator.userAgent) || b.compatMode == \"BackCompat\"\n ? b.body\n : b.documentElement;\n });\n };\n $.fn.scrollTo = function (e, f, g) {\n if (typeof f == \"object\") {\n g = f;\n f = 0;\n }\n if (typeof g == \"function\") g = { onAfter: g };\n if (e == \"max\") e = 9e9;\n g = $.extend({}, h.defaults, g);\n f = f || g.duration;\n g.queue = g.queue && g.axis.length > 1;\n if (g.queue) f /= 2;\n g.offset = both(g.offset);\n g.over = both(g.over);\n return this._scrollable()\n .each(function () {\n if (e == null) return;\n var d = this,\n $elem = $(d),\n targ = e,\n toff,\n attr = {},\n win = $elem.is(\"html,body\");\n switch (typeof targ) {\n case \"number\":\n case \"string\":\n if (/^([+-]=?)?\\d+(\\.\\d+)?(px|%)?$/.test(targ)) {\n targ = both(targ);\n break;\n }\n targ = $(targ, this);\n if (!targ.length) return;\n case \"object\":\n if (targ.is || targ.style) toff = (targ = $(targ)).offset();\n }\n $.each(g.axis.split(\"\"), function (i, a) {\n var b = a == \"x\" ? \"Left\" : \"Top\",\n pos = b.toLowerCase(),\n key = \"scroll\" + b,\n old = d[key],\n max = h.max(d, a);\n if (toff) {\n attr[key] = toff[pos] + (win ? 0 : old - $elem.offset()[pos]);\n if (g.margin) {\n attr[key] -= parseInt(targ.css(\"margin\" + b)) || 0;\n attr[key] -= parseInt(targ.css(\"border\" + b + \"Width\")) || 0;\n }\n attr[key] += g.offset[pos] || 0;\n if (g.over[pos])\n attr[key] += targ[a == \"x\" ? \"width\" : \"height\"]() * g.over[pos];\n } else {\n var c = targ[pos];\n attr[key] =\n c.slice && c.slice(-1) == \"%\" ? (parseFloat(c) / 100) * max : c;\n }\n if (g.limit && /^\\d+$/.test(attr[key]))\n attr[key] = attr[key] <= 0 ? 0 : Math.min(attr[key], max);\n if (!i && g.queue) {\n if (old != attr[key]) animate(g.onAfterFirst);\n delete attr[key];\n }\n });\n animate(g.onAfter);\n function animate(a) {\n $elem.animate(\n attr,\n f,\n g.easing,\n a &&\n function () {\n a.call(this, targ, g);\n }\n );\n }\n })\n .end();\n };\n h.max = function (a, b) {\n var c = b == \"x\" ? \"Width\" : \"Height\",\n scroll = \"scroll\" + c;\n if (!$(a).is(\"html,body\")) return a[scroll] - $(a)[c.toLowerCase()]();\n var d = \"client\" + c,\n html = a.ownerDocument.documentElement,\n body = a.ownerDocument.body;\n return Math.max(html[scroll], body[scroll]) - Math.min(html[d], body[d]);\n };\n function both(a) {\n return typeof a == \"object\" ? a : { top: a, left: a };\n }\n})(jQuery);\n","import { _ } from \"$json\";\n\nconst DICTIONARY = {\n \"close this infomation box\": {\n \"en\": \"close this infomation box\",\n \"nl\": \"sluit dit informatievak\",\n \"en-GB\": \"close this infomation box\"\n },\n \"Send link popup\": {\n \"en\": \"Send link popup\",\n \"nl\": \"Pop-up voor koppeling verzenden\",\n \"en-GB\": \"Send link popup\"\n }\n};\n\n_.addTranslations(DICTIONARY);\n\nclass Listener {\n constructor(id) {\n this[id] = event => {\n if (event.isComposing || event.keyCode !== 27) {\n return;\n } else {\n // No need to be specific, just destroy the most recent one.\n Array.from(document.querySelectorAll(\".p-dialogue-container\"))\n .pop()\n .click();\n }\n };\n }\n}\n\nexport default class Dialogue {\n constructor(props = {}, parent) {\n this.id = `dialogue-${Date.now()}-${Math.floor(Math.random() * 10000)}`;\n this.parent =\n parent !== undefined && typeof parent === \"object\" && \"nodeType\" in parent\n ? parent\n : document.getElementsByTagName(\"body\")[0];\n this.elemprops = props;\n this.rtnfocus = document.children[0];\n }\n\n destroy(human = true) {\n let me = document.getElementById(this.id);\n if (me) this.parent.removeChild(me);\n\n // Remove keyup listener\n this.handler &&\n document.removeEventListener(`keyup`, this.handler[this.id], false);\n\n // Untrap focus\n document.querySelectorAll(\"[data-hushed-by-dialogue]\").forEach(elem => {\n let prev = elem.getAttribute(\"data-previous-tabindex\");\n elem.removeAttribute(\"tabindex\");\n if (prev !== \"none\") {\n elem.setAttribute(\"tabindex\", prev);\n }\n elem.removeAttribute(\"data-previous-tabindex\");\n elem.removeAttribute(\"data-hushed-by-tabindex\");\n });\n\n // Unhide ARIA\n document\n .querySelectorAll(\"[data-aria-hidden-by-dialogue]\")\n .forEach(elem => {\n let prev = elem.getAttribute(\"data-previous-aria\");\n elem.removeAttribute(\"aria-hidden\");\n if (prev !== \"none\") {\n elem.setAttribute(\"aria-hidden\", prev);\n }\n elem.removeAttribute(\"data-previous-aria\");\n elem.removeAttribute(\"data-aria-hidden-by-dialogue\");\n });\n\n // Return focus, but not if this was called by the render method,\n // otherwise we will override the activeElement with the initial\n // rtnfocus value (document.children[0])\n human && this.rtnfocus.focus();\n }\n\n render(elem) {\n // Remove dialogue if it already exists.\n this.destroy(false);\n\n // Remove all other focusable elements from tabindex on the DOM,\n // so we can truly trap the focus for all users w/o trapping\n // keyboard user out of the browser controls.\n document\n .querySelectorAll(\n \"a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]\"\n )\n .forEach(elem => {\n elem.setAttribute(\"data-hushed-by-dialogue\", true);\n elem.setAttribute(\n \"data-previous-tabindex\",\n elem.getAttribute(\"tabindex\") || \"none\"\n );\n elem.setAttribute(\"tabindex\", \"-1\");\n });\n\n // ARIA hide everything to avoid screen readers keyboard\n // shortcuts gaining access outside of the dialogue.\n document.querySelectorAll(\"*:not(body):not(html)\").forEach(elem => {\n elem.setAttribute(\"data-aria-hidden-by-dialogue\", true);\n elem.setAttribute(\n \"data-previous-aria\",\n elem.getAttribute(\"aria-hidden\") || \"none\"\n );\n elem.setAttribute(\"aria-hidden\", \"true\");\n });\n\n // Create elements.\n let container = document.createElement(\"div\");\n container.className = \"p-dialogue-container\";\n container.style.cssText = `\n background-color: rgba(0,0,0,.5);\n height: 100%;\n left: 0;\n position: fixed;\n text-align: center;\n top: 0;\n width: 100%;\n z-index: 100;\n `;\n container.id = this.id;\n container.setAttribute(\"role\", \"dialog\");\n // container.setAttribute(\"aria-label\", \"dialog\"); // BAD A11Y - more accessible label should be given by class caller.\n Object.keys(this.elemprops).forEach(prop => {\n prop === \"class\"\n ? (container.className += \" \" + this.elemprops[prop])\n : container.setAttribute(prop, this.elemprops[prop]);\n });\n container.addEventListener(\"click\", e => {\n this.destroy();\n });\n\n let inner = document.createElement(\"div\");\n inner.className = \"inner\";\n inner.style.cssText = `\n display: inline-block;\n margin: 10vh 25px auto 25px;\n overflow: auto;\n `;\n inner.addEventListener(\"click\", e => {\n e.stopPropagation();\n });\n\n let closer = document.createElement(\"button\");\n let x = document.createTextNode(\"+\");\n closer.append(x);\n closer.className = \"dialogue-close\";\n closer.style.cssText = `\n font-size: 2.2rem;\n line-height: 1.2rem;\n padding: 5px;\n position: absolute;\n right: 5px;\n top: 5px;\n transform-origin: top;\n transform: rotate(45deg);\n `;\n closer.addEventListener(\"click\", e => this.destroy());\n closer.setAttribute(\"aria-label\", _(\"close this infomation box\"));\n\n // Add to DOM\n inner.appendChild(closer);\n inner.appendChild(elem);\n container.appendChild(inner);\n this.parent.appendChild(container);\n\n // Set the rtnfocus, then focus inside dialogue.\n this.rtnfocus = document.activeElement;\n closer.focus();\n\n this.handler = new Listener(this.id);\n\n document.addEventListener(`keyup`, this.handler[this.id], false);\n }\n}\n","/* a11y-describedby:\n *\n * - Describe group with all its standard remarks\n * - Describe input by any non-standard remark labels directly\n * preceding it\n *\n * Author: Niels Giesen\n * Copyright 2016 Berkeley Bridge\n *\n */\nimport { tap, when, compose, prop, path, find } from \"$json/lib/functional\";\n\n$(document).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.groups) {\n $.each(data.groups, function (_, group) {\n var remarks = [],\n pretexts = [];\n $.each(group.controls, function (idx, control) {\n if (control[\"font-class\"].toLowerCase() === \"standard remark\") {\n remarks.push(control.id);\n } else if (control.datatype && control.controltype === \"label\") {\n pretexts.push(control.id);\n }\n const explicitId = path([\"metadata\", \"describedby\"], control);\n if (explicitId) {\n compose(\n when(\n Boolean,\n compose(id => pretexts.push(id), prop(\"id\"))\n ),\n find(c => c.identifier && c.identifier.endsWith(`.${explicitId}`)),\n prop(\"controls\")\n )(group);\n }\n if (control.datatype && control.controltype !== \"label\") {\n maybeSetDescription(control, pretexts);\n pretexts = [];\n }\n });\n maybeSetDescription(group, remarks);\n });\n }\n});\n\nfunction maybeSetDescription(thing, description_ids) {\n if (description_ids.length) {\n thing.aria = thing.aria || {};\n thing.aria.describedby = description_ids.join(\" \");\n }\n}\n","/*\n * This utility can be imported to ease the use\n * of metadata by pulling it from the data provided.\n * The function will return an object containing three\n * properties:\n *\n * props --> a Map() containing a single entry per metadata property\n * with it's respective value of that metadata.\n *\n * groups --> a Map() containing a single property per group\n * which has metadata, and the value of that metadata.\n *\n * controls --> a Map() containing a single property per control\n * which has metadata, and the value of that metadata.\n */\n\nconst getmetadata = data => {\n let fromnode = {\n props: new Map(),\n groups: new Map(),\n controls: new Map()\n };\n\n try {\n data.groups.forEach(group => {\n if (group.metadata !== undefined) {\n fromnode.groups.set(group.groupid, group.metadata);\n Object.keys(group.metadata).forEach(metaprop => {\n fromnode.props.set(metaprop, group.metadata[metaprop]);\n });\n }\n group.controls !== undefined &&\n group.controls.forEach(control => {\n Object.keys(control).forEach(prop => {\n if (prop === \"metadata\") {\n fromnode.controls.set([control.id], control.metadata);\n Object.keys(control.metadata).forEach(metaprop => {\n fromnode.props.set(metaprop, control.metadata[metaprop]);\n });\n }\n });\n });\n });\n return fromnode;\n } catch (err) {\n window.console && window.console.warn(err);\n return fromnode;\n }\n};\n\nexport { getmetadata };\n","/*\n\n 'Store' module can be used by any plugin\n which requires state retention that\n can not be derived from the data in the\n current data in any given JSON res.\n\n Import the Map() 'state' and use the state\n to record data as the user progresses\n through the model. The state map is recorded\n in the session data 'uistates' every time it changes.\n\n If the user refreshes the page, or opens\n the session on a new tab/browser or at another\n time, the store module will make sure that\n state is updated with the recorded one - and\n an event wil be triggered 'bb:stateChange'\n\n NB: The state is shared over all other\n plugins which require it, so please namespace\n your entries.\n\n NB: The state is stringified to be stored\n as JSON - so don't get too fancy with your\n properties or values.\n\n Author: Tim Bauwens 2021\n\n*/\n\nimport \"proxy-polyfill/proxy.min.js\";\nimport { bb } from \"$json\";\nimport { has } from \"$json/lib/functional\";\n\nvar innerState, state;\n\nconst store = {\n sessionid: \"\",\n fresh: true,\n pushing: false,\n push: function () {\n if (!this.fresh && !this.pushing) {\n this.pushing = true;\n // Wait for the innserState to finish setting.\n window.setTimeout(() => {\n var form = new URLSearchParams();\n form.set(\"fmt\", \"json\");\n form.set(\"dbname\", bb.getVar(\"dbname\"));\n form.set(\"uniqueid\", bb.getVar(\"uniqueid\"));\n form.set(\"sessionid\", bb.getVar(\"sessionid\"));\n form.set(\"uistates\", JSON.stringify(Object.fromEntries(state)));\n\n form.get(\"uniqueid\") &&\n fetch(\"uistates\", {\n method: \"post\",\n headers: {\n \"Accept\": \"application/json, text/plain, */*\",\n \"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\"\n },\n body: form\n });\n store.pushing = false;\n }, 100);\n }\n }\n};\n\n$(document).on(\"bb:preHandleData\", (e, data) => {\n if (data && data.sessionid) {\n if (store.sessionid !== data.sessionid) {\n store.fresh = true;\n store.sessionid = data.sessionid;\n state = null;\n }\n\n if (store.fresh) {\n // Page refreshed, or case opened.\n\n if (data && has(\"uistates\")(data)) {\n innerState = data.uistates\n ? new Map(Object.entries(JSON.parse(data.uistates)))\n : new Map();\n state = new Proxy(innerState, {\n get(target, prop, receiver) {\n var value = Reflect.get(target, prop, receiver);\n if (typeof value === \"function\") {\n const origSet = value;\n value = function (key, value) {\n if (prop === \"set\" || prop === \"clear\") {\n store.push();\n }\n return origSet.apply(innerState, arguments);\n };\n }\n return value;\n }\n });\n $(document).trigger(\"bb:stateChange\");\n } else {\n innerState = new Map();\n }\n store.fresh = false;\n }\n }\n});\n\nexport { state };\n","(function(){function n(){function v(){return null}function l(a){return a?\"object\"===typeof a||\"function\"===typeof a:!1}function p(a){if(null!==a&&!l(a))throw new TypeError(\"Object prototype may only be an Object or null: \"+a);}var q=null,e=Object,w=!!e.create||!({__proto__:null}instanceof e),A=e.create||(w?function(a){p(a);return{__proto__:a}}:function(a){function c(){}p(a);if(null===a)throw new SyntaxError(\"Native Object.create is required to create objects with null prototype\");c.prototype=a;return new c}),\nB=e.getPrototypeOf||([].__proto__===Array.prototype?function(a){a=a.__proto__;return l(a)?a:null}:v);var m=function(a,c){function k(){}if(void 0===(this&&this instanceof m?this.constructor:void 0))throw new TypeError(\"Constructor Proxy requires 'new'\");if(!l(a)||!l(c))throw new TypeError(\"Cannot create proxy with a non-object as target or handler\");q=function(){a=null;k=function(b){throw new TypeError(\"Cannot perform '\"+b+\"' on a proxy that has been revoked\");}};setTimeout(function(){q=null},0);var g=\nc;c={get:null,set:null,apply:null,construct:null};for(var h in g){if(!(h in c))throw new TypeError(\"Proxy polyfill does not support trap '\"+h+\"'\");c[h]=g[h]}\"function\"===typeof g&&(c.apply=g.apply.bind(g));g=B(a);var r=!1,t=!1;if(\"function\"===typeof a){var f=function(){var b=this&&this.constructor===f,d=Array.prototype.slice.call(arguments);k(b?\"construct\":\"apply\");return b&&c.construct?c.construct.call(this,a,d):!b&&c.apply?c.apply(a,this,d):b?(d.unshift(a),new (a.bind.apply(a,d))):a.apply(this,\nd)};r=!0}else a instanceof Array?(f=[],t=!0):f=w||null!==g?A(g):{};var x=c.get?function(b){k(\"get\");return c.get(this,b,f)}:function(b){k(\"get\");return this[b]},C=c.set?function(b,d){k(\"set\");c.set(this,b,d,f)}:function(b,d){k(\"set\");this[b]=d},y={};e.getOwnPropertyNames(a).forEach(function(b){if(!((r||t)&&b in f)){var d=e.getOwnPropertyDescriptor(a,b);e.defineProperty(f,b,{enumerable:!!d.enumerable,get:x.bind(a,b),set:C.bind(a,b)});y[b]=!0}});h=!0;if(r||t){var D=e.setPrototypeOf||([].__proto__===\nArray.prototype?function(b,d){p(d);b.__proto__=d;return b}:v);g&&D(f,g)||(h=!1)}if(c.get||!h)for(var u in a)y[u]||e.defineProperty(f,u,{get:x.bind(a,u)});e.seal(a);e.seal(f);return f};m.revocable=function(a,c){return{proxy:new m(a,c),revoke:q}};return m};var z=\"undefined\"!==typeof process&&\"[object process]\"==={}.toString.call(process)||\"undefined\"!==typeof navigator&&\"ReactNative\"===navigator.product?global:self;z.Proxy||(z.Proxy=n(),z.Proxy.revocable=z.Proxy.revocable);})();\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.2.1\n * https://www.chartjs.org\n * (c) 2023 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();\n let i, ilen;\n for(i = 0, ilen = items.length; i < ilen; ++i){\n set.add(items[i]);\n }\n if (set.size === ilen) {\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, iScale.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 = 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 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\nfunction 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 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 function _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 if (thing !== undefined && thing !== null && isArray(thing) !== true) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n for(j = 0, jlen = thing.length; j < jlen; j++){\n nestedThing = thing[j];\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 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 function clearCanvas(canvas, ctx) {\n ctx = ctx || canvas.getContext('2d');\n ctx.save();\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\nfunction drawPoint(ctx, options, x, y) {\n drawPointLegend(ctx, options, x, y, null);\n}\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:\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 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 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 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 function _isPointInArea(point, area, margin) {\n margin = margin || 0.5;\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 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 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}\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 += font.lineHeight;\n }\n ctx.restore();\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 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 function addRoundedRectPath(ctx, rect) {\n const { x , y , w , h , radius } = rect;\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, -HALF_PI, PI, true);\n ctx.lineTo(x, y + h - radius.bottomLeft);\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n ctx.lineTo(x + w, y + radius.topRight);\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\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\nfunction _createResolver(scopes, prefixes = [\n ''\n], rootScopes = scopes, fallback, getTarget = ()=>scopes[0]) {\n if (!defined(fallback)) {\n fallback = _resolve('_fallback', scopes);\n }\n const cache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: rootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope)=>_createResolver([\n scope,\n ...scopes\n ], prefixes, rootScopes, fallback)\n };\n return new Proxy(cache, {\n deleteProperty (target, prop) {\n delete target[prop];\n delete target._keys;\n delete scopes[0][prop];\n return true;\n },\n get (target, prop) {\n return _cached(target, prop, ()=>_resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n getOwnPropertyDescriptor (target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n getPrototypeOf () {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n has (target, prop) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n ownKeys (target) {\n return getKeysFromAllScopes(target);\n },\n set (target, prop, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value;\n delete target._keys;\n return true;\n }\n });\n}\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 deleteProperty (target, prop) {\n delete target[prop];\n delete proxy[prop];\n return true;\n },\n get (target, prop, receiver) {\n return _cached(target, prop, ()=>_resolveWithContext(target, prop, receiver));\n },\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 getPrototypeOf () {\n return Reflect.getPrototypeOf(proxy);\n },\n has (target, prop) {\n return Reflect.has(proxy, prop);\n },\n ownKeys () {\n return Reflect.ownKeys(proxy);\n },\n set (target, prop, value) {\n proxy[prop] = value;\n delete target[prop];\n return true;\n }\n });\n}\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)) {\n return target[prop];\n }\n const value = resolve();\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];\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 value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\nfunction _resolveScriptable(prop, value, 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 value = value(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\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 (defined(_context.index) && isIndexable(prop)) {\n value = value[_context.index % value.length];\n } else if (isObject(value[0])) {\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 (defined(fallback) && fallback !== key && fallback !== parentFallback) {\n return fallback;\n }\n } else if (scope === false && defined(parentFallback) && key !== parentFallback) {\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 (defined(fallback) && 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 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 (defined(value)) {\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 (defined(value)) {\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 = _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 window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\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 return prevStyle && JSON.stringify(style) !== JSON.stringify(prevStyle);\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.2.1\n * https://www.chartjs.org\n * (c) 2023 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';\nexport { aL as Ticks, d as defaults } 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 for(i = 0, ilen = keys.length; i < ilen; ++i){\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\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 return value;\n}\nfunction convertObjectDataToArray(data) {\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 x: key,\n y: 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 this._data = convertObjectDataToArray(data);\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 }\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 skipNull = (meta)=>{\n const parsed = meta.controller.getParsed(dataIndex);\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) {\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'\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 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 }\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,\nPolarAreaController: PolarAreaController,\nPieController: PieController,\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 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](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 height1 = chartArea.h * weight;\n const width1 = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width1, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width1, height1);\n }\n stack.start = x;\n stack.placed += height1;\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 node.addEventListener(type, listener, eventListenerOptions);\n}\nfunction removeListener(chart, type, listener) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\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 = _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 active = false;\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 positionAxisID1 = Object.keys(position)[0];\n const value1 = position[positionAxisID1];\n titleX = scales[positionAxisID1].getPixelForValue(value1) - 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 positionAxisID1 = Object.keys(position)[0];\n const value1 = position[positionAxisID1];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID1].getPixelForValue(value1));\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 ret1 = this._getYAxisLabelAlignment(tl);\n textAlign = ret1.textAlign;\n x = ret1.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 positionAxisID1 = Object.keys(position)[0];\n const value1 = position[positionAxisID1];\n x = this.chart.scales[positionAxisID1].getPixelForValue(value1);\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 }\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 i1 = 0; i1 < local.length; i1++){\n const plugin = local[i1];\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 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 (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n id = scaleOptions.axis || axisFromPosition(scaleOptions.position) || id.length > 1 && determineAxis(id[0].toLowerCase(), scaleOptions);\n if (id) {\n return id;\n }\n throw new Error(`Cannot determine type of '${name}' axis. Please provide 'axis' or 'position' option.`);\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);\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).reduce((acc, key)=>acc || isFunction(value[key]), false);\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.2.1\";\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 getDatasetArea(meta) {\n const { xScale , yScale } = meta;\n if (xScale && yScale) {\n return {\n left: xScale.left,\n right: xScale.right,\n top: yScale.top,\n bottom: yScale.bottom\n };\n }\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 i1 = 0, ilen1 = this.data.datasets.length; i1 < ilen1; ++i1){\n this._updateDataset(i1, isFunction(mode) ? mode({\n datasetIndex: i1\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._resize(width, height);\n this._resizeBeforeDraw = null;\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 pCenter1 = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter1.x, pCenter1.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 pCenter2 = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter2.x, pCenter2.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 pCenter3 = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter3.x, pCenter3.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 } = options;\n const inner = options.borderAlign === 'inner';\n if (!borderWidth) {\n return;\n }\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 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 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 / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const betweenAngles = _circumference >= TAU || _angleBetween(angle, startAngle, endAngle);\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}\nfunction 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 /**\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,\nLineElement: LineElement,\nPointElement: PointElement,\nBarElement: BarElement\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}\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 if (!options.forceOverride && (containsColorsDefinitions(datasets) || containsColorsDefinition(chartOptions) || elements && containsColorsDefinitions(elements))) {\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 hitbox1 of hitboxes){\n if (hitbox1.col !== col) {\n col = hitbox1.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox1.top = top;\n hitbox1.left += this.left + padding;\n hitbox1.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox1.left), hitbox1.width);\n top += hitbox1.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);\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.5 : 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 x = 0;\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 x += pos.x;\n y += pos.y;\n ++count;\n }\n }\n return {\n x: x / count,\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 labelColors = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const { boxHeight , boxWidth , boxPadding } = 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 = labelColors.borderColor;\n ctx.fillStyle = labelColors.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n ctx.lineWidth = isObject(labelColors.borderWidth) ? Math.max(...Object.values(labelColors.borderWidth)) : labelColors.borderWidth || 1;\n ctx.strokeStyle = labelColors.borderColor;\n ctx.setLineDash(labelColors.borderDash || []);\n ctx.lineDashOffset = labelColors.borderDashOffset || 0;\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth - boxPadding);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - boxPadding - 2);\n const borderRadius = toTRBLCorners(labelColors.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 = labelColors.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 = labelColors.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;\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 ticks.push({\n value: Math.round((niceMin + j * spacing) * factor) / factor\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 buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const extra = getTickBackdropHeight(opts) / 2;\n const outerDistance = scale.drawingArea;\n const additionalAngle = opts.pointLabels.centerPointLabels ? PI / valueCount : 0;\n for(let i = 0; i < valueCount; i++){\n const pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + padding[i], additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const size = labelSizes[i];\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n items.push({\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 }\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 drawPointLabels(scale, labelCount) {\n const { ctx , options: { pointLabels } } = scale;\n for(let i = labelCount - 1; i >= 0; i--){\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n const plFont = toFont(optsAtIndex.font);\n const { x , y , textAlign , left , top , right , bottom } = scale._pointLabelItems[i];\n const { backdropColor } = optsAtIndex;\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(optsAtIndex.borderRadius);\n const padding = toPadding(optsAtIndex.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 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) {\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.ticks.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 && !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 });\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((a, b)=>a - b).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 _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, TimeScale, TimeSeriesScale, plugin_title as Title, plugin_tooltip as Tooltip, adapters as _adapters, _detectPlatform, animator, controllers, elements, layouts, plugins, registerables, registry, scales };\n//# sourceMappingURL=chart.js.map\n","import {Chart, registerables} from '../dist/chart.js';\n\nChart.register(...registerables);\n\nexport * from '../dist/chart.js';\nexport default Chart;\n","/*\n cogs.js\n A plugin to cross metadata with jumplist/chapterlist\n in order to create cogs.\n*/\n\nimport { bb } from \"$json\";\nimport { getmetadata } from \"$json/lib/getmetadata\";\nimport { state } from \"$json/lib/store\";\nimport Chart from \"chart.js/auto\";\n\n((doc, win, $) => {\n var fresh = true;\n\n const applystate = () => {\n // When called, run through the state and apply UI critical states.\n bb.Mode.toggle(\"hasCogs\", state.has(\"cogs\"));\n bb.Mode.toggle(\"inAnalysis\", state.get(\"analysis\"));\n\n if (state.has(\"overviewnode\")) {\n doc.querySelectorAll('[data-action=\"go-to-cogs\"]').forEach(button => {\n button.setAttribute(\"data-groupid\", state.get(\"overviewnode\"));\n });\n }\n\n if (state.has(\"resultnode\")) {\n doc\n .querySelector(\".resultjumper-button\")\n .setAttribute(\"data-groupid\", state.get(\"resultnode\"));\n }\n };\n\n const colors = [\n \"rgba(255,64,27,.7)\",\n \"rgba(251,117,14,.7)\",\n \"rgba(232,204,17,.7)\",\n \"rgba(64,247,186,.7)\"\n ];\n\n $(doc).on(\"bb:stateChange\", (e, data) => {\n applystate();\n });\n\n $(doc).on(\"bb:preHandleData\", (e, data) => {\n // Process the metadata for this action.\n if (data && data.groups && data.groups.length) {\n // Get metadata\n let md = getmetadata(data).props;\n\n // Get chapterid and groupid of current group.\n let group = data.groups[data.groups.length - 1];\n let chapterid = group.chapterid;\n let groupid = group.groupid;\n\n // Maintain a ref list of full name to goupid.\n state.set(group.groupid, group.name);\n\n // In case we are in the analysis questions:\n state.set(\"analysis\", md.has(\"analysis\"));\n\n // If cog1 exists, then we have cogs.\n if (md.has(\"cog1\") && !state.has(\"cogs\")) {\n // The node we are currently on should be the go-to node to get back to the chapters.\n state.set(\"overviewnode\", groupid);\n // Also set the result jumper\n data.jumplist.forEach(item => {\n if (item.screentitle === \"Resultaat\") {\n state.set(\"resultnode\", item.groupid);\n }\n });\n\n let cogs = {};\n md.forEach((potential, prop) => {\n if (prop.includes(\"cog\")) {\n let cog = JSON.parse(potential);\n cogs[cog.name] = cog;\n }\n });\n state.set(\"cogs\", cogs);\n\n if (data.hasOwnProperty(\"jumplist\")) {\n data.jumplist.forEach(item => {\n if (cogs.hasOwnProperty(item.screentitle.toLowerCase()))\n cogs[item.screentitle.toLowerCase()].groupid = item.groupid;\n });\n }\n }\n\n // If we're in a chapter, record the data.\n if (chapterid !== \"\" && md.size) {\n if (md.has(\"segments\")) {\n state.set(chapterid, md.get(\"segments\"));\n }\n }\n\n // If we have a metadata entry 'back-to-cogs',\n // it means the bb-next button sould be replaced by a button that\n // gotonode setcogs.\n bb.Mode.toggle(\"goBack\", md.has(\"back-to-cogs\"));\n\n applystate();\n }\n });\n\n $(doc).on(\"bb:finalHandleData\", (e, data) => {\n if (data && data.groups && data.groups.length) {\n // Depending on the stage of the model, scroll to specific point:\n if (\n data.groups[data.groups.length - 1].name !== \"gregelhulp.introductie\" &&\n data.groups[data.groups.length - 1].name !== \"gconclusie.resultaat\" &&\n !data.groups[data.groups.length - 1].name.includes(\"ganalysis\")\n ) {\n if (data.groups[data.groups.length - 1].name.includes(\"gmaturity\")) {\n window.setTimeout(() => {\n doc.querySelector(\".p-metaprogress\").scrollIntoView({\n behavior: \"smooth\",\n block: \"start\",\n inline: \"nearest\"\n });\n }, 100);\n } else {\n window.setTimeout(() => {\n doc.querySelector(\".columns\").scrollIntoView({\n behavior: \"smooth\",\n block: \"start\",\n inline: \"nearest\"\n });\n }, 100);\n }\n } else {\n window.setTimeout(() => {\n window.scrollTo(0, 0);\n }, 100);\n }\n let cogs = state.has(\"cogs\") ? state.get(\"cogs\") : false;\n // Get chapterid and groupid of current group.\n let group = data.groups[data.groups.length - 1];\n let chapterid = group.chapterid;\n let groupid = group.groupid;\n let cogsjumplist = [...doc.querySelectorAll(\".cogs.bb-jumplist li\")];\n let piejumplist = () => [...doc.querySelectorAll(\".pie.bb-jumplist li\")];\n // Set mode if we are in chapter.\n let show = false;\n let showresult = false;\n let chapterImage;\n if (!cogs) {\n // Do the pre-cog text changes.\n // If we're not in a chapter or result page, move the text from bbq to q-content;\n let dbarea = doc.querySelector(\".initial-explanation.hml\");\n let dbstatic = dbarea.querySelector(\".static-text\");\n let dbdynamic = dbarea.querySelector(\".dynamic-text\");\n let dbtitlearea = dbarea.querySelector(\".dbtitle\");\n let dbtextarea = dbarea.querySelector(\".dbtext\");\n\n // Reset\n dbstatic.style.display = \"none\";\n dbdynamic.style.display = \"none\";\n dbtitlearea.innerHTML = \"\";\n dbtextarea.innerHTML = \"\";\n\n let dbtitles = doc.querySelectorAll(\n \"#bb-q fieldset .bbm-darkblue-title\"\n );\n dbtitles.length && dbtitlearea.append(...dbtitles);\n\n let dbtext = doc.querySelectorAll(\"#bb-q fieldset .bbm-darkblue-text\");\n dbtext.length && dbtextarea.append(...dbtext);\n\n if (dbtitles.length || dbtext.length) {\n dbdynamic.style.display = \"block\";\n } else {\n dbstatic.style.display = \"flex\";\n }\n } else {\n Object.keys(cogs).forEach(cog => {\n if (cogs[cog].groupid === group.chapterid) {\n show = true;\n chapterImage = `${cogs[cog].name\n .split(\" \")\n .join(\"-\")}-inner.png?v=20210706`;\n } else if (group.chapterid === state.get(\"resultnode\")) {\n showresult = true;\n chapterImage = `blank.png?v=20210706`;\n }\n });\n bb.Mode.toggle(\"inChapter\", show);\n bb.Mode.toggle(\"inResult\", showresult);\n // Make the chapter name accessible to CSS\n document.styleSheets[0].addRule(\n \".cogs-portal #bb-q::before\",\n `background-image: url('custom/rijks-ics/plugins/cogs/live/assets/${chapterImage}') !important;`\n );\n\n if (cogsjumplist.length) {\n cogsjumplist.forEach((li, i) => {\n let btn = li.querySelector(\"button\");\n let name = btn.innerText.toLowerCase();\n if (cogs.hasOwnProperty(name)) {\n let level = cogs[name].level;\n let scale = level * 10 + 150;\n btn.style.backgroundImage = `url('./custom/rijks-ics/plugins/cogs/live/assets/${cogs[name].image}?v=20210706')`;\n li.style.width = `${scale}px`;\n li.style.height = `${scale}px`;\n li.setAttribute(\"idx\", i);\n } else {\n li.parentNode.removeChild(li);\n }\n });\n // Now kill the connection between core and cogsjumplist\n let bbjumplist = doc.querySelector(\".cogs.bb-jumplist\");\n bbjumplist.classList.add(\"faux-jumplist\");\n bbjumplist.classList.remove(\"bb-jumplist\");\n }\n\n // Force scoresUpdated to ensure the visuals are correct after refresh.\n if (fresh) {\n $(document).trigger(\"bb:stateChange\");\n fresh = false;\n }\n\n // If we're in a chapter, and showing the portal, set up the pie.\n if (show) {\n // Prep the pie if there is one.\n // By removing any items not related to current chapter.\n let fromhere = false;\n piejumplist().forEach(li => {\n let btn = li.querySelector(\"button\");\n let btnchapterid = btn.getAttribute(\"data-groupid\");\n if (!fromhere) {\n if (btnchapterid === chapterid) {\n // This is our chapter.\n fromhere = true;\n }\n li.parentNode.removeChild(li);\n } else {\n if (btnchapterid.indexOf(\".\") !== -1) {\n // This is the next chapter heading.\n fromhere = false;\n li.parentNode.removeChild(li);\n }\n }\n });\n\n // Do we have a segment count?\n let segments =\n chapterid === \"\"\n ? false\n : state.has(chapterid)\n ? state.get(chapterid)\n : 6; // Default, if it was not defined. Naughty modeller.\n\n if (segments) {\n // If false, there's no chapter yet.\n // Prep the segments.\n\n let slicecount = piejumplist().length;\n let requiredslices = segments;\n\n // In case the modeller made a mistake.\n if (requiredslices < slicecount) requiredslices = slicecount;\n\n if (slicecount < requiredslices) {\n for (let i = requiredslices - slicecount; i >= 1; i--) {\n let fauxitem = doc.createElement(\"li\");\n fauxitem.className = \"fauxitem\";\n let fauxbutton = doc.createElement(\"button\");\n fauxitem.append(fauxbutton);\n doc.querySelector(\".pie.bb-jumplist ul\").appendChild(fauxitem);\n }\n }\n\n let selectedPos = 0;\n let share = 360 / requiredslices;\n let correction;\n piejumplist().forEach((li, i) => {\n // Move the btn text inside a wrapper, for the sake of media query which rotates for mobile view.\n let wrapper = doc.createElement(\"span\");\n wrapper.className = \"wrapper\";\n li.append(wrapper);\n wrapper.append(li.querySelector(\"button\"));\n\n if (li.classList.contains(\"selected\")) {\n selectedPos = i + 1;\n }\n\n if (share === 360) {\n li.classList.add(\"fullcircle\");\n correction = 0;\n } else if (share === 180) {\n li.classList.add(\"semicircle\");\n li.style.setProperty(\n \"transform\",\n `translate(${-i * 100}%, 0px) rotate(${i * 180}deg)`\n );\n correction = -(90 - share / 2);\n } else {\n li.style.setProperty(\n \"transform\",\n `rotate(${i * share}deg) skewY(${share - 90}deg)`\n );\n correction = -(90 - share / 2);\n li.querySelector(\".wrapper\").style.setProperty(\n \"transform\",\n `skewY(${-(share - 90)}deg) rotate(${correction}deg)`\n );\n }\n });\n\n // Rotate the pie so that the selected item faces the question.\n let rdeg = selectedPos\n ? share === 360\n ? 0\n : 90 - (selectedPos * share - share / 2)\n : 0;\n doc\n .querySelector(\".pie.bb-jumplist\")\n .style.setProperty(\"transform\", `rotate(${rdeg}deg)`);\n }\n }\n\n // When in the result page, form the grid to match design.\n if (showresult) {\n // And collate the data for the chart.\n let fontSize = Math.round(window.innerWidth / 50);\n fontSize = fontSize > 16 ? 16 : fontSize;\n fontSize = fontSize < 9 ? 9 : fontSize;\n let chart = {\n options: {\n maintainAspectRatio: false,\n plugins: {\n tooltip: {\n enabled: true,\n callbacks: {\n label: function (context) {\n return Math.round((Number(context.raw) / 4) * 100) + \" %\";\n },\n labelColor: function (context) {\n return {\n borderColor: \"rgba(0, 0, 0, 0)\",\n backgroundColor: colors[context.raw - 1]\n };\n }\n }\n },\n legend: {\n display: false\n }\n },\n scales: {\n r: {\n angleLines: {\n display: true\n },\n min: -1,\n max: 4,\n ticks: {\n stepSize: 5,\n callback: function () {\n return \"\";\n },\n backdropColor: \"rgba(0, 0, 0, 0)\"\n },\n pointLabels: {\n color: \"rgb(17,68,118)\",\n font: {\n size: fontSize\n }\n }\n }\n }\n },\n type: \"radar\",\n data: {\n datasets: [\n {\n data: [],\n labels: [],\n backgroundColor: \"grey\",\n lineTension: 0.5\n }\n ],\n labels: []\n }\n };\n\n let resultwrapper = doc.createElement(\"div\");\n resultwrapper.className = \"resultwrapper\";\n\n let table = doc.querySelector(\"#bb-q fieldset table\");\n let rows = table.querySelectorAll(\"tbody tr\");\n\n rows.forEach((row, i) => {\n let score = row.querySelector('[data-column=\"Score\"]').innerText;\n score = isNaN(score) ? \"0\" : score;\n let themeCell = row.querySelector('[data-column=\"Thema\"]');\n let themeString = themeCell.innerText\n .trim()\n .toLowerCase()\n .split(\" \")\n .join(\"-\");\n let text = row.querySelector(\n '[data-column=\"Toelichting\"]'\n ).innerHTML;\n let extraText = row.querySelector(\n '[data-column=\"Nadere toelichting\"]'\n ).innerHTML;\n let extraTextTemplate =\n extraText.trim() !== \"\"\n ? `\n \n `\n : \"\";\n let jumpToCogs =\n score < \"4\"\n ? `\n \n `\n : \"\";\n let itemtext = text + jumpToCogs;\n\n score = score.trim();\n if (score >= 1 && score <= 4) {\n document.styleSheets[0].addRule(\n `body.inResult .cogs-portal #bb-q .resultwrapper .itemwrapper[data-row=\"${\n i + 1\n }\"] .item.score::before`,\n `background-image: url('custom/rijks-ics/plugins/cogs/live/assets/cog-score-${score}.png?v=20210706')`\n );\n }\n let item = `\n
      \n \n
      \n \n
      \n
      \n
      \n

      ${themeCell.innerText}

      \n ${itemtext}\n ${extraTextTemplate}\n
      \n
      \n ${extraText}\n
      \n
      \n `;\n document.styleSheets[0].addRule(\n `body.inResult .cogs-portal #bb-q .resultwrapper .itemwrapper[data-row=\"${\n i + 1\n }\"] .item.score .themeImg::before`,\n `background-image: url('custom/rijks-ics/plugins/cogs/live/assets/${themeString}-result.png?v=20210706')`\n );\n\n resultwrapper.insertAdjacentHTML(\"beforeend\", item);\n chart.data.labels.push(themeCell.innerText);\n chart.data.datasets[0].labels.push(themeCell.innerText);\n chart.data.datasets[0].data.push(Number(score));\n });\n\n // If not all chapters are answered, the chart should be blue.\n if (chart.data.datasets[0].data.includes(0)) {\n chart.data.datasets[0].backgroundColor = \"rgba(0,30,123,.7)\";\n } else {\n // Get the bg color based on average score of all chapters.\n let average = Math.round(\n chart.data.datasets[0].data.reduce((acc, cv) => acc + cv) /\n chart.data.datasets[0].data.length\n );\n average = average === 0 ? 1 : average;\n chart.data.datasets[0].backgroundColor = colors[average - 1];\n }\n\n let chartCanvas = doc.createElement(\"canvas\");\n let chartObj = new Chart(chartCanvas, chart);\n // And now create the chart.\n let chartcontainer = doc.createElement(\"div\");\n chartcontainer.className = \"graph\";\n\n // Also create special nav buttons.\n let nav = doc.createElement(\"nav\");\n nav.insertAdjacentHTML(\n \"beforeend\",\n `\n \n \n Aan de slag!\n `\n );\n\n // Finally do the DOM stuff\n chartcontainer.appendChild(chartCanvas);\n doc.querySelector(\"#bb-q fieldset\").appendChild(chartcontainer);\n doc.querySelector(\"#bb-q fieldset\").appendChild(resultwrapper);\n doc.querySelector(\"#bb-q\").appendChild(nav);\n table.style.display = \"none\"; //IE\n table.remove();\n // Move the end tools to the fake nav;\n let target = doc.getElementById(\"end-tools-special-container\");\n target.appendChild(doc.querySelector(\".bb-p-end-tools-container\"));\n }\n }\n applystate();\n }\n });\n\n $(doc).on(\"bb:scoresUpdated\", (e, scoreMap) => {\n if (scoreMap.size) {\n // Run through the cogs and pies and update design based on score.\n let cogsjumplist = [\n ...doc.querySelectorAll(\".cogs.faux-jumplist li, .cogs.bb-jumplist li\")\n ];\n let piejumplist = [...doc.querySelectorAll(\".pie.bb-jumplist li\")];\n\n cogsjumplist.forEach(cog => {\n let btn = cog.querySelector(\"button\");\n let score = btn.getAttribute(\"data-final-score\");\n let average = Math.floor(btn.getAttribute(\"data-average-score\"));\n let idx = cog.getAttribute(\"idx\");\n if (idx && average >= 1 && average <= 5 && Number(score)) {\n document.styleSheets[0].addRule(\n `.cogs.faux-jumplist ul li[idx=\"${idx}\"]::before`,\n `background-image: url('custom/rijks-ics/plugins/cogs/live/assets/cog-score-${average}.png?v=20210706')`\n );\n }\n });\n\n piejumplist.forEach(slice => {\n if (!slice.classList.contains(\"fauxitem\")) {\n let score = slice.querySelector(\"button\").getAttribute(\"data-score\");\n if (score >= 1 && score <= 5) {\n slice.style.setProperty(\"background-color\", colors[score - 1]);\n }\n }\n });\n }\n });\n})(document, window, jQuery);\n","/*\n continuelink.js\n\n A small widget to offer end users\n a link to the session, to continue\n later.\n\n NB: Only use for anon. model which\n are set to save session.\n\n CC: Berkeley Bridge 2021\n\n Author: Tim Bauwens\n\n*/\n\nimport { bb } from \"$json\";\n\nlet needed = true;\n((doc, $) => {\n const bequiet = () => {\n const display = doc.querySelector(\".p-continuelink-info .msg\");\n display.style.opacity = 0;\n };\n\n const shout = msg => {\n const display = doc.querySelector(\".p-continuelink-info .msg\");\n display.innerText = msg;\n display.style.opacity = 1;\n window.setTimeout(bequiet, 2000);\n };\n\n const copy = e =>\n new Promise((resolve, reject) => {\n const container = e.target.parentNode;\n try {\n const link = container.querySelector(\".link\").innerText;\n navigator.clipboard.writeText(link).then(\n function () {\n resolve();\n },\n function (err) {\n reject();\n }\n );\n } catch (err) {\n reject();\n }\n });\n\n // Set the timestamp in the message\n function formatDateTwoWeeksFromNow() {\n const today = new Date();\n const twoWeeksLater = new Date(today.getTime() + 14 * 24 * 60 * 60 * 1000);\n\n const day = twoWeeksLater.getDate();\n const month = twoWeeksLater.toLocaleString(\"en\", { month: \"long\" });\n const year = twoWeeksLater.getFullYear();\n\n const formattedDate = `${day} ${month} ${year}`;\n return formattedDate;\n }\n doc.querySelector(\".p-continuelink-info .warning .time_stamp\").innerText =\n formatDateTwoWeeksFromNow();\n\n $(doc).on(\"click\", \".p-continuelink-button__copy\", e => {\n copy(e)\n .then(() => shout(\"Gekopieerd!\"))\n .catch(() =>\n shout(\"Het kopiëren lukte niet. Selecteer zelf de URL en kopiëer deze.\")\n );\n });\n\n $(doc).on(\"click\", \".p-continuelink-button__exit\", e => {\n copy(e)\n .then(() => shout(\"Gekopieerd!\"))\n .finally(() => {\n window.setTimeout(() => {\n bb.Mode.unset(\"hasCogs\");\n window.scrollTo(0, 0);\n bb.exit();\n }, 1e3);\n });\n });\n\n $(doc).on(\"bb:postHandleData\", (e, data) => {\n if (data && needed) {\n const linkdisplay = doc.querySelector(\".p-continuelink-info .link\");\n const { sessionid } = data;\n const linkurl = `https://tools.digitaltrustcenter.nl/security-check-procesautomatisering-doorgaan/?modelname=${data.modelname}&sessionid=${sessionid}`;\n linkdisplay.innerHTML = linkurl;\n needed = false;\n }\n });\n})(document, jQuery);\n","// custom-radios.js\n\n/*\n * A simple plugin to replace\n * radios with a custom design.\n * Cross-browser and working with all\n * forms of output: grids and radios\n *\n * Note you'll have to provide your own styling to the faux .p-custom-radios-label\n *\n * Author: Niels Giesen\n * Copyright Berkeley Bridge 2019\n *\n */\n\n((doc, $) => {\n $(doc).on(\"bb:postHandleData\", (e, data) => {\n // If there are any checkboxes, deal with them\n let checkboxes = $(\"#bb-q\").find(\n 'input[type=\"radio\"]:not(.p-custom-radios)'\n );\n checkboxes.each((i, checkbox) => {\n checkbox.className += \" a-offscreen p-custom-radios\";\n checkbox.insertAdjacentHTML(\n \"afterEnd\",\n `\n \n `\n );\n });\n });\n})(document, jQuery);\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"printJS\"] = factory();\n\telse\n\t\troot[\"printJS\"] = factory();\n})(window, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ \"./src/index.js\":\n/*!**********************!*\\\n !*** ./src/index.js ***!\n \\**********************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _sass_index_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sass/index.scss */ \"./src/sass/index.scss\");\n/* harmony import */ var _sass_index_scss__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_sass_index_scss__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _js_init__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/init */ \"./src/js/init.js\");\n\n\nvar printJS = _js_init__WEBPACK_IMPORTED_MODULE_1__[\"default\"].init;\n\nif (typeof window !== 'undefined') {\n window.printJS = printJS;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (printJS);\n\n/***/ }),\n\n/***/ \"./src/js/browser.js\":\n/*!***************************!*\\\n !*** ./src/js/browser.js ***!\n \\***************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\nvar Browser = {\n // Firefox 1.0+\n isFirefox: function isFirefox() {\n return typeof InstallTrigger !== 'undefined';\n },\n // Internet Explorer 6-11\n isIE: function isIE() {\n return navigator.userAgent.indexOf('MSIE') !== -1 || !!document.documentMode;\n },\n // Edge 20+\n isEdge: function isEdge() {\n return !Browser.isIE() && !!window.StyleMedia;\n },\n // Chrome 1+\n isChrome: function isChrome() {\n var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;\n return !!context.chrome;\n },\n // At least Safari 3+: \"[object HTMLElementConstructor]\"\n isSafari: function isSafari() {\n return Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0 || navigator.userAgent.toLowerCase().indexOf('safari') !== -1;\n },\n // IOS Chrome\n isIOSChrome: function isIOSChrome() {\n return navigator.userAgent.toLowerCase().indexOf('crios') !== -1;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Browser);\n\n/***/ }),\n\n/***/ \"./src/js/functions.js\":\n/*!*****************************!*\\\n !*** ./src/js/functions.js ***!\n \\*****************************/\n/*! exports provided: addWrapper, capitalizePrint, collectStyles, addHeader, cleanUp, isRawHTML */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addWrapper\", function() { return addWrapper; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"capitalizePrint\", function() { return capitalizePrint; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"collectStyles\", function() { return collectStyles; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addHeader\", function() { return addHeader; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"cleanUp\", function() { return cleanUp; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isRawHTML\", function() { return isRawHTML; });\n/* harmony import */ var _modal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modal */ \"./src/js/modal.js\");\n/* harmony import */ var _browser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./browser */ \"./src/js/browser.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\nfunction addWrapper(htmlData, params) {\n var bodyStyle = 'font-family:' + params.font + ' !important; font-size: ' + params.font_size + ' !important; width:100%;';\n return '
      ' + htmlData + '
      ';\n}\nfunction capitalizePrint(obj) {\n return obj.charAt(0).toUpperCase() + obj.slice(1);\n}\nfunction collectStyles(element, params) {\n var win = document.defaultView || window; // String variable to hold styling for each element\n\n var elementStyle = ''; // Loop over computed styles\n\n var styles = win.getComputedStyle(element, '');\n\n for (var key = 0; key < styles.length; key++) {\n // Check if style should be processed\n if (params.targetStyles.indexOf('*') !== -1 || params.targetStyle.indexOf(styles[key]) !== -1 || targetStylesMatch(params.targetStyles, styles[key])) {\n if (styles.getPropertyValue(styles[key])) elementStyle += styles[key] + ':' + styles.getPropertyValue(styles[key]) + ';';\n }\n } // Print friendly defaults (deprecated)\n\n\n elementStyle += 'max-width: ' + params.maxWidth + 'px !important; font-size: ' + params.font_size + ' !important;';\n return elementStyle;\n}\n\nfunction targetStylesMatch(styles, value) {\n for (var i = 0; i < styles.length; i++) {\n if (_typeof(value) === 'object' && value.indexOf(styles[i]) !== -1) return true;\n }\n\n return false;\n}\n\nfunction addHeader(printElement, params) {\n // Create the header container div\n var headerContainer = document.createElement('div'); // Check if the header is text or raw html\n\n if (isRawHTML(params.header)) {\n headerContainer.innerHTML = params.header;\n } else {\n // Create header element\n var headerElement = document.createElement('h1'); // Create header text node\n\n var headerNode = document.createTextNode(params.header); // Build and style\n\n headerElement.appendChild(headerNode);\n headerElement.setAttribute('style', params.headerStyle);\n headerContainer.appendChild(headerElement);\n }\n\n printElement.insertBefore(headerContainer, printElement.childNodes[0]);\n}\nfunction cleanUp(params) {\n // If we are showing a feedback message to user, remove it\n if (params.showModal) _modal__WEBPACK_IMPORTED_MODULE_0__[\"default\"].close(); // Check for a finished loading hook function\n\n if (params.onLoadingEnd) params.onLoadingEnd(); // If preloading pdf files, clean blob url\n\n if (params.showModal || params.onLoadingStart) window.URL.revokeObjectURL(params.printable); // Run onPrintDialogClose callback\n\n var event = 'mouseover';\n\n if (_browser__WEBPACK_IMPORTED_MODULE_1__[\"default\"].isChrome() || _browser__WEBPACK_IMPORTED_MODULE_1__[\"default\"].isFirefox()) {\n // Ps.: Firefox will require an extra click in the document to fire the focus event.\n event = 'focus';\n }\n\n var handler = function handler() {\n // Make sure the event only happens once.\n window.removeEventListener(event, handler);\n params.onPrintDialogClose(); // Remove iframe from the DOM\n\n var iframe = document.getElementById(params.frameId);\n\n if (iframe) {\n iframe.remove();\n }\n };\n\n window.addEventListener(event, handler);\n}\nfunction isRawHTML(raw) {\n var regexHtml = new RegExp('<([A-Za-z][A-Za-z0-9]*)\\\\b[^>]*>(.*?)');\n return regexHtml.test(raw);\n}\n\n/***/ }),\n\n/***/ \"./src/js/html.js\":\n/*!************************!*\\\n !*** ./src/js/html.js ***!\n \\************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./functions */ \"./src/js/functions.js\");\n/* harmony import */ var _print__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./print */ \"./src/js/print.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n print: function print(params, printFrame) {\n // Get the DOM printable element\n var printElement = isHtmlElement(params.printable) ? params.printable : document.getElementById(params.printable); // Check if the element exists\n\n if (!printElement) {\n window.console.error('Invalid HTML element id: ' + params.printable);\n return;\n } // Clone the target element including its children (if available)\n\n\n params.printableElement = cloneElement(printElement, params); // Add header\n\n if (params.header) {\n Object(_functions__WEBPACK_IMPORTED_MODULE_0__[\"addHeader\"])(params.printableElement, params);\n } // Print html element contents\n\n\n _print__WEBPACK_IMPORTED_MODULE_1__[\"default\"].send(params, printFrame);\n }\n});\n\nfunction cloneElement(element, params) {\n // Clone the main node (if not already inside the recursion process)\n var clone = element.cloneNode(); // Loop over and process the children elements / nodes (including text nodes)\n\n var childNodesArray = Array.prototype.slice.call(element.childNodes);\n\n for (var i = 0; i < childNodesArray.length; i++) {\n // Check if we are skipping the current element\n if (params.ignoreElements.indexOf(childNodesArray[i].id) !== -1) {\n continue;\n } // Clone the child element\n\n\n var clonedChild = cloneElement(childNodesArray[i], params); // Attach the cloned child to the cloned parent node\n\n clone.appendChild(clonedChild);\n } // Get all styling for print element (for nodes of type element only)\n\n\n if (params.scanStyles && element.nodeType === 1) {\n clone.setAttribute('style', Object(_functions__WEBPACK_IMPORTED_MODULE_0__[\"collectStyles\"])(element, params));\n } // Check if the element needs any state processing (copy user input data)\n\n\n switch (element.tagName) {\n case 'SELECT':\n // Copy the current selection value to its clone\n clone.value = element.value;\n break;\n\n case 'CANVAS':\n // Copy the canvas content to its clone\n clone.getContext('2d').drawImage(element, 0, 0);\n break;\n }\n\n return clone;\n}\n\nfunction isHtmlElement(printable) {\n // Check if element is instance of HTMLElement or has nodeType === 1 (for elements in iframe)\n return _typeof(printable) === 'object' && printable && (printable instanceof HTMLElement || printable.nodeType === 1);\n}\n\n/***/ }),\n\n/***/ \"./src/js/image.js\":\n/*!*************************!*\\\n !*** ./src/js/image.js ***!\n \\*************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./functions */ \"./src/js/functions.js\");\n/* harmony import */ var _print__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./print */ \"./src/js/print.js\");\n/* harmony import */ var _browser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./browser */ \"./src/js/browser.js\");\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n print: function print(params, printFrame) {\n // Check if we are printing one image or multiple images\n if (params.printable.constructor !== Array) {\n // Create array with one image\n params.printable = [params.printable];\n } // Create printable element (container)\n\n\n params.printableElement = document.createElement('div'); // Create all image elements and append them to the printable container\n\n params.printable.forEach(function (src) {\n // Create the image element\n var img = document.createElement('img');\n img.setAttribute('style', params.imageStyle); // Set image src with the file url\n\n img.src = src; // The following block is for Firefox, which for some reason requires the image's src to be fully qualified in\n // order to print it\n\n if (_browser__WEBPACK_IMPORTED_MODULE_2__[\"default\"].isFirefox()) {\n var fullyQualifiedSrc = img.src;\n img.src = fullyQualifiedSrc;\n } // Create the image wrapper\n\n\n var imageWrapper = document.createElement('div'); // Append image to the wrapper element\n\n imageWrapper.appendChild(img); // Append wrapper to the printable element\n\n params.printableElement.appendChild(imageWrapper);\n }); // Check if we are adding a print header\n\n if (params.header) Object(_functions__WEBPACK_IMPORTED_MODULE_0__[\"addHeader\"])(params.printableElement, params); // Print image\n\n _print__WEBPACK_IMPORTED_MODULE_1__[\"default\"].send(params, printFrame);\n }\n});\n\n/***/ }),\n\n/***/ \"./src/js/init.js\":\n/*!************************!*\\\n !*** ./src/js/init.js ***!\n \\************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./browser */ \"./src/js/browser.js\");\n/* harmony import */ var _modal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modal */ \"./src/js/modal.js\");\n/* harmony import */ var _pdf__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./pdf */ \"./src/js/pdf.js\");\n/* harmony import */ var _html__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./html */ \"./src/js/html.js\");\n/* harmony import */ var _raw_html__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./raw-html */ \"./src/js/raw-html.js\");\n/* harmony import */ var _image__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./image */ \"./src/js/image.js\");\n/* harmony import */ var _json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./json */ \"./src/js/json.js\");\n\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n\n\n\n\n\nvar printTypes = ['pdf', 'html', 'image', 'json', 'raw-html'];\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n init: function init() {\n var params = {\n printable: null,\n fallbackPrintable: null,\n type: 'pdf',\n header: null,\n headerStyle: 'font-weight: 300;',\n maxWidth: 800,\n properties: null,\n gridHeaderStyle: 'font-weight: bold; padding: 5px; border: 1px solid #dddddd;',\n gridStyle: 'border: 1px solid lightgray; margin-bottom: -1px;',\n showModal: false,\n onError: function onError(error) {\n throw error;\n },\n onLoadingStart: null,\n onLoadingEnd: null,\n onPrintDialogClose: function onPrintDialogClose() {},\n onIncompatibleBrowser: function onIncompatibleBrowser() {},\n modalMessage: 'Retrieving Document...',\n frameId: 'printJS',\n printableElement: null,\n documentTitle: 'Document',\n targetStyle: ['clear', 'display', 'width', 'min-width', 'height', 'min-height', 'max-height'],\n targetStyles: ['border', 'box', 'break', 'text-decoration'],\n ignoreElements: [],\n repeatTableHeader: true,\n css: null,\n style: null,\n scanStyles: true,\n base64: false,\n // Deprecated\n onPdfOpen: null,\n font: 'TimesNewRoman',\n font_size: '12pt',\n honorMarginPadding: true,\n honorColor: false,\n imageStyle: 'max-width: 100%;'\n }; // Check if a printable document or object was supplied\n\n var args = arguments[0];\n\n if (args === undefined) {\n throw new Error('printJS expects at least 1 attribute.');\n } // Process parameters\n\n\n switch (_typeof(args)) {\n case 'string':\n params.printable = encodeURI(args);\n params.fallbackPrintable = params.printable;\n params.type = arguments[1] || params.type;\n break;\n\n case 'object':\n params.printable = args.printable;\n params.fallbackPrintable = typeof args.fallbackPrintable !== 'undefined' ? args.fallbackPrintable : params.printable;\n params.fallbackPrintable = params.base64 ? \"data:application/pdf;base64,\".concat(params.fallbackPrintable) : params.fallbackPrintable;\n\n for (var k in params) {\n if (k === 'printable' || k === 'fallbackPrintable') continue;\n params[k] = typeof args[k] !== 'undefined' ? args[k] : params[k];\n }\n\n break;\n\n default:\n throw new Error('Unexpected argument type! Expected \"string\" or \"object\", got ' + _typeof(args));\n } // Validate printable\n\n\n if (!params.printable) throw new Error('Missing printable information.'); // Validate type\n\n if (!params.type || typeof params.type !== 'string' || printTypes.indexOf(params.type.toLowerCase()) === -1) {\n throw new Error('Invalid print type. Available types are: pdf, html, image and json.');\n } // Check if we are showing a feedback message to the user (useful for large files)\n\n\n if (params.showModal) _modal__WEBPACK_IMPORTED_MODULE_1__[\"default\"].show(params); // Check for a print start hook function\n\n if (params.onLoadingStart) params.onLoadingStart(); // To prevent duplication and issues, remove any used printFrame from the DOM\n\n var usedFrame = document.getElementById(params.frameId);\n if (usedFrame) usedFrame.parentNode.removeChild(usedFrame); // Create a new iframe for the print job\n\n var printFrame = document.createElement('iframe');\n\n if (_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFirefox()) {\n // Set the iframe to be is visible on the page (guaranteed by fixed position) but hidden using opacity 0, because\n // this works in Firefox. The height needs to be sufficient for some part of the document other than the PDF\n // viewer's toolbar to be visible in the page\n printFrame.setAttribute('style', 'width: 1px; height: 100px; position: fixed; left: 0; top: 0; opacity: 0; border-width: 0; margin: 0; padding: 0');\n } else {\n // Hide the iframe in other browsers\n printFrame.setAttribute('style', 'visibility: hidden; height: 0; width: 0; position: absolute; border: 0');\n } // Set iframe element id\n\n\n printFrame.setAttribute('id', params.frameId); // For non pdf printing, pass an html document string to srcdoc (force onload callback)\n\n if (params.type !== 'pdf') {\n printFrame.srcdoc = '' + params.documentTitle + ''; // Attach css files\n\n if (params.css) {\n // Add support for single file\n if (!Array.isArray(params.css)) params.css = [params.css]; // Create link tags for each css file\n\n params.css.forEach(function (file) {\n printFrame.srcdoc += '';\n });\n }\n\n printFrame.srcdoc += '';\n } // Check printable type\n\n\n switch (params.type) {\n case 'pdf':\n // Check browser support for pdf and if not supported we will just open the pdf file instead\n if (_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isIE()) {\n try {\n console.info('Print.js doesn\\'t support PDF printing in Internet Explorer.');\n var win = window.open(params.fallbackPrintable, '_blank');\n win.focus();\n params.onIncompatibleBrowser();\n } catch (error) {\n params.onError(error);\n } finally {\n // Make sure there is no loading modal opened\n if (params.showModal) _modal__WEBPACK_IMPORTED_MODULE_1__[\"default\"].close();\n if (params.onLoadingEnd) params.onLoadingEnd();\n }\n } else {\n _pdf__WEBPACK_IMPORTED_MODULE_2__[\"default\"].print(params, printFrame);\n }\n\n break;\n\n case 'image':\n _image__WEBPACK_IMPORTED_MODULE_5__[\"default\"].print(params, printFrame);\n break;\n\n case 'html':\n _html__WEBPACK_IMPORTED_MODULE_3__[\"default\"].print(params, printFrame);\n break;\n\n case 'raw-html':\n _raw_html__WEBPACK_IMPORTED_MODULE_4__[\"default\"].print(params, printFrame);\n break;\n\n case 'json':\n _json__WEBPACK_IMPORTED_MODULE_6__[\"default\"].print(params, printFrame);\n break;\n }\n }\n});\n\n/***/ }),\n\n/***/ \"./src/js/json.js\":\n/*!************************!*\\\n !*** ./src/js/json.js ***!\n \\************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./functions */ \"./src/js/functions.js\");\n/* harmony import */ var _print__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./print */ \"./src/js/print.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n print: function print(params, printFrame) {\n // Check if we received proper data\n if (_typeof(params.printable) !== 'object') {\n throw new Error('Invalid javascript data object (JSON).');\n } // Validate repeatTableHeader\n\n\n if (typeof params.repeatTableHeader !== 'boolean') {\n throw new Error('Invalid value for repeatTableHeader attribute (JSON).');\n } // Validate properties\n\n\n if (!params.properties || !Array.isArray(params.properties)) {\n throw new Error('Invalid properties array for your JSON data.');\n } // We will format the property objects to keep the JSON api compatible with older releases\n\n\n params.properties = params.properties.map(function (property) {\n return {\n field: _typeof(property) === 'object' ? property.field : property,\n displayName: _typeof(property) === 'object' ? property.displayName : property,\n columnSize: _typeof(property) === 'object' && property.columnSize ? property.columnSize + ';' : 100 / params.properties.length + '%;'\n };\n }); // Create a print container element\n\n params.printableElement = document.createElement('div'); // Check if we are adding a print header\n\n if (params.header) {\n Object(_functions__WEBPACK_IMPORTED_MODULE_0__[\"addHeader\"])(params.printableElement, params);\n } // Build the printable html data\n\n\n params.printableElement.innerHTML += jsonToHTML(params); // Print the json data\n\n _print__WEBPACK_IMPORTED_MODULE_1__[\"default\"].send(params, printFrame);\n }\n});\n\nfunction jsonToHTML(params) {\n // Get the row and column data\n var data = params.printable;\n var properties = params.properties; // Create a html table\n\n var htmlData = ''; // Check if the header should be repeated\n\n if (params.repeatTableHeader) {\n htmlData += '';\n } // Add the table header row\n\n\n htmlData += ''; // Add the table header columns\n\n for (var a = 0; a < properties.length; a++) {\n htmlData += '';\n } // Add the closing tag for the table header row\n\n\n htmlData += ''; // If the table header is marked as repeated, add the closing tag\n\n if (params.repeatTableHeader) {\n htmlData += '';\n } // Create the table body\n\n\n htmlData += ''; // Add the table data rows\n\n for (var i = 0; i < data.length; i++) {\n // Add the row starting tag\n htmlData += ''; // Print selected properties only\n\n for (var n = 0; n < properties.length; n++) {\n var stringData = data[i]; // Support nested objects\n\n var property = properties[n].field.split('.');\n\n if (property.length > 1) {\n for (var p = 0; p < property.length; p++) {\n stringData = stringData[property[p]];\n }\n } else {\n stringData = stringData[properties[n].field];\n } // Add the row contents and styles\n\n\n htmlData += '';\n } // Add the row closing tag\n\n\n htmlData += '';\n } // Add the table and body closing tags\n\n\n htmlData += '
      ' + Object(_functions__WEBPACK_IMPORTED_MODULE_0__[\"capitalizePrint\"])(properties[a].displayName) + '
      ' + stringData + '
      ';\n return htmlData;\n}\n\n/***/ }),\n\n/***/ \"./src/js/modal.js\":\n/*!*************************!*\\\n !*** ./src/js/modal.js ***!\n \\*************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\nvar Modal = {\n show: function show(params) {\n // Build modal\n var modalStyle = 'font-family:sans-serif; ' + 'display:table; ' + 'text-align:center; ' + 'font-weight:300; ' + 'font-size:30px; ' + 'left:0; top:0;' + 'position:fixed; ' + 'z-index: 9990;' + 'color: #0460B5; ' + 'width: 100%; ' + 'height: 100%; ' + 'background-color:rgba(255,255,255,.9);' + 'transition: opacity .3s ease;'; // Create wrapper\n\n var printModal = document.createElement('div');\n printModal.setAttribute('style', modalStyle);\n printModal.setAttribute('id', 'printJS-Modal'); // Create content div\n\n var contentDiv = document.createElement('div');\n contentDiv.setAttribute('style', 'display:table-cell; vertical-align:middle; padding-bottom:100px;'); // Add close button (requires print.css)\n\n var closeButton = document.createElement('div');\n closeButton.setAttribute('class', 'printClose');\n closeButton.setAttribute('id', 'printClose');\n contentDiv.appendChild(closeButton); // Add spinner (requires print.css)\n\n var spinner = document.createElement('span');\n spinner.setAttribute('class', 'printSpinner');\n contentDiv.appendChild(spinner); // Add message\n\n var messageNode = document.createTextNode(params.modalMessage);\n contentDiv.appendChild(messageNode); // Add contentDiv to printModal\n\n printModal.appendChild(contentDiv); // Append print modal element to document body\n\n document.getElementsByTagName('body')[0].appendChild(printModal); // Add event listener to close button\n\n document.getElementById('printClose').addEventListener('click', function () {\n Modal.close();\n });\n },\n close: function close() {\n var printModal = document.getElementById('printJS-Modal');\n\n if (printModal) {\n printModal.parentNode.removeChild(printModal);\n }\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Modal);\n\n/***/ }),\n\n/***/ \"./src/js/pdf.js\":\n/*!***********************!*\\\n !*** ./src/js/pdf.js ***!\n \\***********************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _print__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./print */ \"./src/js/print.js\");\n/* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./functions */ \"./src/js/functions.js\");\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n print: function print(params, printFrame) {\n // Check if we have base64 data\n if (params.base64) {\n var bytesArray = Uint8Array.from(atob(params.printable), function (c) {\n return c.charCodeAt(0);\n });\n createBlobAndPrint(params, printFrame, bytesArray);\n return;\n } // Format pdf url\n\n\n params.printable = /^(blob|http|\\/\\/)/i.test(params.printable) ? params.printable : window.location.origin + (params.printable.charAt(0) !== '/' ? '/' + params.printable : params.printable); // Get the file through a http request (Preload)\n\n var req = new window.XMLHttpRequest();\n req.responseType = 'arraybuffer';\n req.addEventListener('error', function () {\n Object(_functions__WEBPACK_IMPORTED_MODULE_1__[\"cleanUp\"])(params);\n params.onError(req.statusText, req); // Since we don't have a pdf document available, we will stop the print job\n });\n req.addEventListener('load', function () {\n // Check for errors\n if ([200, 201].indexOf(req.status) === -1) {\n Object(_functions__WEBPACK_IMPORTED_MODULE_1__[\"cleanUp\"])(params);\n params.onError(req.statusText, req); // Since we don't have a pdf document available, we will stop the print job\n\n return;\n } // Print requested document\n\n\n createBlobAndPrint(params, printFrame, req.response);\n });\n req.open('GET', params.printable, true);\n req.send();\n }\n});\n\nfunction createBlobAndPrint(params, printFrame, data) {\n // Pass response or base64 data to a blob and create a local object url\n var localPdf = new window.Blob([data], {\n type: 'application/pdf'\n });\n localPdf = window.URL.createObjectURL(localPdf); // Set iframe src with pdf document url\n\n printFrame.setAttribute('src', localPdf);\n _print__WEBPACK_IMPORTED_MODULE_0__[\"default\"].send(params, printFrame);\n}\n\n/***/ }),\n\n/***/ \"./src/js/print.js\":\n/*!*************************!*\\\n !*** ./src/js/print.js ***!\n \\*************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./browser */ \"./src/js/browser.js\");\n/* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./functions */ \"./src/js/functions.js\");\n\n\nvar Print = {\n send: function send(params, printFrame) {\n // Append iframe element to document body\n document.getElementsByTagName('body')[0].appendChild(printFrame); // Get iframe element\n\n var iframeElement = document.getElementById(params.frameId); // Wait for iframe to load all content\n\n iframeElement.onload = function () {\n if (params.type === 'pdf') {\n // Add a delay for Firefox. In my tests, 1000ms was sufficient but 100ms was not\n if (_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFirefox()) {\n setTimeout(function () {\n return performPrint(iframeElement, params);\n }, 1000);\n } else {\n performPrint(iframeElement, params);\n }\n\n return;\n } // Get iframe element document\n\n\n var printDocument = iframeElement.contentWindow || iframeElement.contentDocument;\n if (printDocument.document) printDocument = printDocument.document; // Append printable element to the iframe body\n\n printDocument.body.appendChild(params.printableElement); // Add custom style\n\n if (params.type !== 'pdf' && params.style) {\n // Create style element\n var style = document.createElement('style');\n style.innerHTML = params.style; // Append style element to iframe's head\n\n printDocument.head.appendChild(style);\n } // If printing images, wait for them to load inside the iframe\n\n\n var images = printDocument.getElementsByTagName('img');\n\n if (images.length > 0) {\n loadIframeImages(Array.from(images)).then(function () {\n return performPrint(iframeElement, params);\n });\n } else {\n performPrint(iframeElement, params);\n }\n };\n }\n};\n\nfunction performPrint(iframeElement, params) {\n try {\n iframeElement.focus(); // If Edge or IE, try catch with execCommand\n\n if (_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isEdge() || _browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isIE()) {\n try {\n iframeElement.contentWindow.document.execCommand('print', false, null);\n } catch (e) {\n iframeElement.contentWindow.print();\n }\n } else {\n // Other browsers\n iframeElement.contentWindow.print();\n }\n } catch (error) {\n params.onError(error);\n } finally {\n if (_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFirefox()) {\n // Move the iframe element off-screen and make it invisible\n iframeElement.style.visibility = 'hidden';\n iframeElement.style.left = '-1px';\n }\n\n Object(_functions__WEBPACK_IMPORTED_MODULE_1__[\"cleanUp\"])(params);\n }\n}\n\nfunction loadIframeImages(images) {\n var promises = images.map(function (image) {\n if (image.src && image.src !== window.location.href) {\n return loadIframeImage(image);\n }\n });\n return Promise.all(promises);\n}\n\nfunction loadIframeImage(image) {\n return new Promise(function (resolve) {\n var pollImage = function pollImage() {\n !image || typeof image.naturalWidth === 'undefined' || image.naturalWidth === 0 || !image.complete ? setTimeout(pollImage, 500) : resolve();\n };\n\n pollImage();\n });\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Print);\n\n/***/ }),\n\n/***/ \"./src/js/raw-html.js\":\n/*!****************************!*\\\n !*** ./src/js/raw-html.js ***!\n \\****************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _print__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./print */ \"./src/js/print.js\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n print: function print(params, printFrame) {\n // Create printable element (container)\n params.printableElement = document.createElement('div');\n params.printableElement.setAttribute('style', 'width:100%'); // Set our raw html as the printable element inner html content\n\n params.printableElement.innerHTML = params.printable; // Print html contents\n\n _print__WEBPACK_IMPORTED_MODULE_0__[\"default\"].send(params, printFrame);\n }\n});\n\n/***/ }),\n\n/***/ \"./src/sass/index.scss\":\n/*!*****************************!*\\\n !*** ./src/sass/index.scss ***!\n \\*****************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n// extracted by mini-css-extract-plugin\n\n/***/ }),\n\n/***/ 0:\n/*!****************************!*\\\n !*** multi ./src/index.js ***!\n \\****************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(/*! ./src/index.js */\"./src/index.js\");\n\n\n/***/ })\n\n/******/ })[\"default\"];\n});\n//# sourceMappingURL=print.map","/*\n * end-tools:\n *\n * Place up to four functions in the\n * top or bottom of bb-q on any node.\n *\n * 1) A download report button\n * 2) An email report widget\n * 3) A print option.\n * 4) A feedback widget.\n *\n * Author: Tim Bauwens\n * Copyright 2020 Berkeley Bridge\n *\n */\n\nimport print from \"print-js\";\nimport { gt, bb, _ } from \"$json\";\nimport { getmetadata } from \"../../js/lib/getmetadata\";\n\n(($, win, doc) => {\n var translations = {\n \"Rapport downloaden\": {\n nl: \"Rapport downloaden\",\n en: \"Download report\"\n },\n \"Verzend rapport via e-mail\": {\n nl: \"Verzend rapport via e-mail\",\n en: \"Send report via e-mail\"\n },\n \"Was dit nuttig?\": {\n nl: \"Was dit nuttig?\",\n en: \"Was this useful?\"\n },\n \"Verzend\": {\n nl: \"Verzend\",\n en: \"Send\"\n },\n \"vul hier uw e-mail in\": {\n nl: \"vul hier uw e-mail in\",\n en: \"provide your e-mail here\"\n },\n \"jouw@email.com\": {\n nl: \"jouw@email.com\",\n en: \"your@email.com\"\n },\n \"E-mail is verzonden...\": {\n nl: \"E-mail is verzonden.\",\n en: \"E-mail has been sent.\"\n },\n \"Bedankt voor uw feedback\": {\n nl: \"Bedankt voor uw feedback\",\n en: \"Thanks for your feedback\"\n },\n \"Ja\": {\n nl: \"Ja\",\n en: \"Yes\"\n },\n \"Nee\": {\n nl: \"Nee\",\n en: \"No\"\n },\n \"prepping\": {\n nl: \"voorbereiden...\",\n en: \"preparing...\"\n },\n \"impossible\": {\n nl: \"niet mogelijk.\",\n en: \"not posssible.\"\n }\n };\n\n gt.addTranslations(translations);\n\n var metadata,\n emailSent,\n REPORTDOC = \"\", // Because there could be multiple, but we only handle one.\n SHOWONTOP = \"true\",\n DESIRED_TOOLS = [];\n\n $(function () {\n $(doc).on(\"bb:preHandleData\", (event, data) => {\n if (data && data.groups && data.groups.length && data.sessionid) {\n // Check in case metadata has been added or changed\n metadata = getmetadata(data).props;\n\n if (\n metadata.has(\"reportdoc\") &&\n metadata.get(\"reportdoc\").split(\".\").pop() === \"pdf\"\n ) {\n REPORTDOC = metadata.get(\"reportdoc\");\n }\n if (metadata.has(\"desiredtools\")) {\n DESIRED_TOOLS.length = 0;\n metadata\n .get(\"desiredtools\")\n .split(\"|\")\n .forEach(entry => {\n DESIRED_TOOLS.push(entry);\n });\n }\n if (metadata.has(\"showontop\")) {\n SHOWONTOP = metadata.get(\"showontop\");\n } else {\n SHOWONTOP = \"true\";\n }\n\n emailSent = emailSent || false;\n }\n });\n });\n\n $(function () {\n $(doc).on(\"bb:postHandleData\", function (event, data) {\n // Unset mode for hooks\n bb.Mode.unset(\"hasThreeInOne\");\n if (data && data.groups && data.groups.length && data.sessionid) {\n if (metadata.has(\"end-tools\") && metadata.get(\"end-tools\")) {\n // Set mode for hooks\n bb.Mode.set(\"hasThreeInOne\");\n\n // Hide and reset the support inputs.\n $(\".bb-g-endtools-feedback-vote\").hide();\n $(\".bb-g-endtools-email\").hide();\n $(\".bbm-endtools-email\").val(\"\");\n\n // Create the container for the functions.\n var $container = $('
      ');\n\n if (DESIRED_TOOLS.indexOf(\"download\") > -1 && REPORTDOC.length) {\n // Make a download report button\n var $download = $(\n '
      '\n );\n $download.append(`\n \n \n ${_(\"Rapport downloaden\")}\n \n `);\n $container.append($download);\n }\n\n if (DESIRED_TOOLS.indexOf(\"print\") > -1 && REPORTDOC.length) {\n // Make the print button.\n var $print = $(\n '
      '\n );\n var $printbtn = $(`\n \n `).on(\"click\", e => {\n printJS({\n printable: `${REPORTDOC}?guid=${data.uniqueid}:${data.dbname}:${data.sessionid}`,\n type: \"pdf\",\n showModal: false\n });\n });\n $print.append($printbtn);\n $container.append($print);\n }\n\n if (DESIRED_TOOLS.indexOf(\"email\") > -1) {\n // Make the email widget\n var $email = $('
      ');\n\n if (emailSent) {\n $email.append(\n '\"\n );\n emailSent = false;\n } else {\n $email.append(\n ''\n ).append(`\n \n `);\n\n // Handler\n $(doc).off(\".end-tools-events\", \".opt-for-email\");\n $(doc).on(\n \"click.end-tools-events\",\n \".opt-for-email\",\n function (e) {\n $(\".opt-for-email\")\n .html(_(\"Verzend\") + ' ')\n .attr(\"class\", \"email-send bb-next\")\n .prop(\"disabled\", \"disabled\");\n $(\".email-address\")\n .attr(\"class\", \"email-address set\")\n .focus();\n }\n );\n $(doc).off(\".end-tools-events\", \".email-address\");\n $(doc).on(\n \"\\\n propertychange.end-tools \\\n change.end-tools-events \\\n click.end-tools-events \\\n keyup.end-tools-events \\\n input.end-tools-events \\\n paste.end-tools-events\",\n \".email-address\",\n function () {\n var input = $(\"input.email-address\").val();\n var regex =\n /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n if (regex.test(input)) {\n $(\"button.email-send\")\n .addClass(\"validated\")\n .removeAttr(\"disabled\");\n emailSent = true;\n $(\".bbm-endtools-email\").val(input);\n } else {\n $(\"button.email-send\")\n .removeClass(\"validated\")\n .prop(\"disabled\", \"disabled\");\n $(\".bbm-endtools-email\").val(\"\");\n }\n }\n );\n }\n $container.append($email);\n }\n\n if (DESIRED_TOOLS.indexOf(\"feedback\") > -1) {\n // Make the feedback buttons.\n var $feedback = $(\n '
      '\n );\n $feedback\n .append(\n `\n \n `\n )\n .append(\"\").append(`\n \n `);\n\n // Handler\n var group;\n if (data && data.userinfo)\n $feedback.data(\"userinfo\", data.userinfo);\n group = data.groups.filter(function (g) {\n return g.current;\n })[0];\n $feedback.data(\"nodename\", group.name);\n if (data && data.modelname)\n $feedback.data(\"modelname\", data.modelname);\n if (data && data.modelversion)\n $feedback.data(\"modelversion\", data.modelversion);\n $(doc).off(\".end-tools-events\", \".feedback-button\");\n $(doc).one(\n \"click.end-tools-events\",\n \".feedback-button\",\n function (e) {\n var vote =\n $(e.target).data(\"value\") !== undefined\n ? $(e.target).data(\"value\")\n : $(e.target).parents(\"button\").data(\"value\");\n\n // Add the vote to the hiddden interface.\n $(\"input.bbm-endtools-feedback-vote\").attr(\"value\", vote);\n $feedback.html(\n '\"\n );\n bb.updatemis();\n }\n );\n $container.append($feedback);\n }\n\n // Reveal top or bottom depending on conf.\n if (SHOWONTOP === \"false\") {\n $(\"fieldset.selected\").append($container);\n setTimeout(function () {\n $container.toggleClass(\"showing\");\n }, 800);\n } else {\n $(\"#bb-q\").prepend($container);\n $(\"html,body\").animate({ scrollTop: 0 });\n setTimeout(function () {\n $container.toggleClass(\"showing\");\n }, 800);\n }\n }\n }\n });\n });\n})(jQuery, window, document);\n","/* headings:\n *\n * Translate .heading* into real headings, starting at level 2\n *\n * Author: Niels Giesen\n * Copyright 2016 Berkeley Bridge\n *\n */\n(function ($, win, doc) {\n var level = 1;\n\n $(function () {\n $(doc).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.groups && data.groups.length) {\n $.each(data.groups, function (_, group) {\n $.each(group.controls, function (_, ctl) {\n if (ctl.controltype === \"label\") {\n var klass = ctl[\"font-class\"].toLowerCase();\n if (klass.indexOf(\"heading\") === 0) {\n ctl._subtype = \"heading\";\n ctl._level = (parseInt(klass.substr(7)) || 0) + level;\n }\n }\n });\n });\n }\n });\n });\n})(jQuery, window, document);\n","/* history:\n *\n * Manage history using the html5 history api and sessionStorage\n *\n * Could have support for crunchbang ( #!modelname=thisandthat )\n *\n * Author: Niels Giesen\n * Copyright 2013, 2014, 2015 Berkeley Bridge\n *\n */\nimport { bb, _ } from \"$json\";\nimport { has } from \"$json/lib/functional\";\nimport { setSettled } from \"$json/lib/settled\";\n\n(function ($, win, history, location) {\n var crunchbang = false;\n\n if (history && history.pushState) {\n if (!location.origin) {\n location.origin =\n location.protocol +\n \"//\" +\n location.hostname +\n (location.port ? \":\" + location.port : \"\");\n }\n\n $(function () {\n var apinav,\n storage,\n params = $.parseQuery(location.hash.slice(2)),\n _title_sep = \" \",\n _title = document.title;\n\n try {\n storage = window.sessionStorage;\n } catch (err) {\n storage = null;\n }\n\n function directory(loc) {\n return loc.origin + loc.pathname.replace(/[^/]+$/, \"\");\n }\n\n function restoreState(state) {\n if (state.sessionid) {\n // restore case\n bb.ajax\n .post({\n url: \"action\",\n data: state\n })\n .then(setSettled);\n } else if (bb.getVar(\"sessionid\")) {\n // exit running case and restore model view\n bb.exit(() => bb.menu(state).then(setSettled));\n } else {\n // restore model view\n bb.menu(state).then(setSettled);\n }\n }\n\n function ditchState() {\n storage && storage.removeItem(\"state\");\n history.replaceState(null, null, null);\n setSettled();\n }\n\n if (location.search !== \"\") ditchState();\n\n var initial_state =\n history.state || (storage && JSON.parse(storage.getItem(\"state\")));\n\n if (initial_state) {\n // Detect explicit edit of the crunchbang - this should\n // override the dbname parameter and instead use the modelname\n if (params.modelname && params.modelname !== initial_state.modelname) {\n initial_state.modelname = params.modelname;\n delete initial_state.dbname;\n delete initial_state.sessionid;\n }\n\n if (initial_state.directory === directory(location)) {\n bb.Mode.set(\"isLoggedIn\"); // Yes, just an assumption it will go allright.\n restoreState(initial_state);\n } else {\n ditchState();\n }\n } else if (params.modelname) {\n // Bookmarked with crunchbang, but no state\n bb.Router(params);\n } else {\n setSettled();\n }\n\n $(document).on(\"bb:jsonError\", ditchState);\n\n $(document).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.uniqueid) {\n var title,\n state = {\n fmt: \"json\",\n uniqueid: data.uniqueid,\n // Save the 'directory part'\n directory: directory(location)\n };\n if (has(\"dbname\", data) && data.sessionid) {\n state.dbname = data.dbname;\n state.sessionid = data.sessionid;\n state.modelname = data.modelname; // Needed to get interpret explicit change to location\n\n if (data.modeldescription) {\n title = [_title, data.modeldescription.replace(/_/g, \" \")].join(\n _title_sep\n );\n }\n } else if (data.models) {\n var model = $.grep(data.models, function (m) {\n return m.selected;\n })[0],\n dbname = model ? model.dbname : null;\n if (dbname !== null) {\n state.dbname = dbname;\n title = [_title, model.modelname, \"-\", _(\"overview\")].join(\n _title_sep\n );\n } else {\n title = [_title, _(\"Your models\")].join(_title_sep);\n }\n }\n if (!apinav) {\n try {\n storage && storage.setItem(\"state\", JSON.stringify(state));\n } catch (e) {\n // Guard against QuotaExceededError (which always happens on Safari Private Browsing on iOS)\n }\n if (history.state && history.state.sessionid && state.sessionid) {\n history.replaceState(\n state,\n null,\n location.origin +\n location.pathname +\n ((crunchbang && \"#!modelname=\" + data.modelname) || \"\")\n );\n } else {\n if (data.modelname && crunchbang) {\n history.pushState(\n state,\n null,\n location.origin +\n location.pathname +\n \"#!modelname=\" +\n data.modelname\n );\n } else {\n history.pushState(\n state,\n null,\n location.origin + location.pathname\n );\n }\n }\n }\n if (title && document.title !== title) {\n document.title = title;\n }\n }\n // Something went miserably wrong. Clear history to get out of this mess.\n if (\n data &&\n ((data.error && data.error.summary) ||\n (data.groups && !data.groups.length) ||\n data.status === \"logout successful\")\n ) {\n // Extra check - may be we are but updating\n if (\n data &&\n data.error &&\n data.error.code &&\n data.error.code === 14 && // Error loading case\n data.error.subcode === 1002\n )\n // Updating\n return;\n ditchState();\n }\n apinav = false;\n });\n\n win.addEventListener(\"popstate\", function (e) {\n apinav = true;\n if (e.state) {\n if (e.state.directory === directory(location)) restoreState(e.state);\n else ditchState();\n }\n });\n });\n }\n})(jQuery, window, window.history, window.location);\n","//\n// showdown.js -- A javascript port of Markdown.\n//\n// Copyright (c) 2007 John Fraser.\n//\n// Original Markdown Copyright (c) 2004-2005 John Gruber\n// \n//\n// Redistributable under a BSD-style open source license.\n// See license.txt for more information.\n//\n// The full source distribution is at:\n//\n//\t\t\t\tA A L\n//\t\t\t\tT C A\n//\t\t\t\tT K B\n//\n// \n//\n\n//\n// Wherever possible, Showdown is a straight, line-by-line port\n// of the Perl version of Markdown.\n//\n// This is not a normal parser design; it's basically just a\n// series of string substitutions. It's hard to read and\n// maintain this way, but keeping Showdown close to the original\n// design makes it easier to port new features.\n//\n// More importantly, Showdown behaves like markdown.pl in most\n// edge cases. So web applications can do client-side preview\n// in Javascript, and then build identical HTML on the server.\n//\n// This port needs the new RegExp functionality of ECMA 262,\n// 3rd Edition (i.e. Javascript 1.5). Most modern web browsers\n// should do fine. Even with the new regular expression features,\n// We do a lot of work to emulate Perl's regex functionality.\n// The tricky changes in this file mostly have the \"attacklab:\"\n// label. Major or self-explanatory changes don't.\n//\n// Smart diff tools like Araxis Merge will be able to match up\n// this file with markdown.pl in a useful way. A little tweaking\n// helps: in a copy of markdown.pl, replace \"#\" with \"//\" and\n// replace \"$text\" with \"text\". Be sure to ignore whitespace\n// and line endings.\n//\n\n//\n// Showdown usage:\n//\n// var text = \"Markdown *rocks*.\";\n//\n// var converter = new Showdown.converter();\n// var html = converter.makeHtml(text);\n//\n// alert(html);\n//\n// Note: move the sample code to the bottom of this\n// file before uncommenting it.\n//\n\n//\n// Showdown namespace\n//\nvar Showdown = {};\n\n//\n// converter\n//\n// Wraps all \"globals\" so that the only thing\n// exposed is makeHtml().\n//\nShowdown.converter = function () {\n //\n // Globals:\n //\n\n // Global hashes, used by various utility routines\n var g_urls;\n var g_titles;\n var g_html_blocks;\n\n // Used to track when we're inside an ordered or unordered list\n // (see _ProcessListItems() for details):\n var g_list_level = 0;\n\n this.makeHtml = function (text, inline_only) {\n //\n // Main function. The order in which other subs are called here is\n // essential. Link and image substitutions need to happen before\n // _EscapeSpecialCharsWithinTagAttributes(), so that any *'s or _'s in the \n // and tags get encoded.\n //\n\n // Clear the global hashes. If we don't clear these, you get conflicts\n // from other articles when generating a page which contains more than\n // one article (e.g. an index page that shows the N most recent\n // articles):\n g_urls = new Array();\n g_titles = new Array();\n g_html_blocks = new Array();\n\n // attacklab: Replace ~ with ~T\n // This lets us use tilde as an escape char to avoid md5 hashes\n // The choice of character is arbitray; anything that isn't\n // magic in Markdown will work.\n text = text.replace(/~/g, \"~T\");\n\n // attacklab: Replace $ with ~D\n // RegExp interprets $ as a special character\n // when it's in a replacement string\n text = text.replace(/\\$/g, \"~D\");\n\n // Standardize line endings\n text = text.replace(/\\r\\n/g, \"\\n\"); // DOS to Unix\n text = text.replace(/\\r/g, \"\\n\"); // Mac to Unix\n\n // Make sure text begins and ends with a couple of newlines:\n text = \"\\n\\n\" + text + \"\\n\\n\";\n\n // Convert all tabs to spaces.\n text = _Detab(text);\n\n // Strip any lines consisting only of spaces and tabs.\n // This makes subsequent regexen easier to write, because we can\n // match consecutive blank lines with /\\n+/ instead of something\n // contorted like /[ \\t]*\\n+/ .\n text = text.replace(/^[ \\t]+$/gm, \"\");\n\n // Turn block-level HTML blocks into hash entries\n text = _HashHTMLBlocks(text);\n\n // Strip link definitions, store in hashes.\n text = _StripLinkDefinitions(text);\n\n if (inline_only) text = _RunSpanGamut(text);\n else text = _RunBlockGamut(text);\n\n text = _UnescapeSpecialChars(text);\n\n // attacklab: Restore dollar signs\n text = text.replace(/~D/g, \"$$\");\n\n // attacklab: Restore tildes\n text = text.replace(/~T/g, \"~\");\n\n return text;\n };\n\n var _StripLinkDefinitions = function (text) {\n //\n // Strips link definitions from text, stores the URLs and titles in\n // hash references.\n //\n\n // Link defs are in the form: ^[id]: url \"optional title\"\n\n /*\n var text = text.replace(/\n ^[ ]{0,3}\\[(.+)\\]: // id = $1 attacklab: g_tab_width - 1\n [ \\t]*\n \\n?\t\t\t\t// maybe *one* newline\n [ \\t]*\n ?\t\t\t// url = $2\n [ \\t]*\n \\n?\t\t\t\t// maybe one newline\n [ \\t]*\n (?:\n (\\n*)\t\t\t\t// any lines skipped = $3 attacklab: lookbehind removed\n [\"(]\n (.+?)\t\t\t\t// title = $4\n [\")]\n [ \\t]*\n )?\t\t\t\t\t// title is optional\n (?:\\n+|$)\n /gm,\n function(){...});\n */\n var text = text.replace(\n /^[ ]{0,3}\\[(.+)\\]:[ \\t]*\\n?[ \\t]*?[ \\t]*\\n?[ \\t]*(?:(\\n*)[\"(](.+?)[\")][ \\t]*)?(?:\\n+|\\Z)/gm,\n function (wholeMatch, m1, m2, m3, m4) {\n m1 = m1.toLowerCase();\n g_urls[m1] = _EncodeAmpsAndAngles(m2); // Link IDs are case-insensitive\n if (m3) {\n // Oops, found blank lines, so it's not a title.\n // Put back the parenthetical statement we stole.\n return m3 + m4;\n } else if (m4) {\n g_titles[m1] = m4.replace(/\"/g, \""\");\n }\n\n // Completely remove the definition from the text\n return \"\";\n }\n );\n\n return text;\n };\n\n var _HashHTMLBlocks = function (text) {\n // attacklab: Double up blank lines to reduce lookaround\n text = text.replace(/\\n/g, \"\\n\\n\");\n\n // Hashify HTML blocks:\n // We only want to do this for block-level HTML tags, such as headers,\n // lists, and tables. That's because we still want to wrap

      s around\n // \"paragraphs\" that are wrapped in non-block-level tags, such as anchors,\n // phrase emphasis, and spans. The list of tags we're looking for is\n // hard-coded:\n var block_tags_a =\n \"p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del\";\n var block_tags_b =\n \"p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math\";\n\n // First, look for nested blocks, e.g.:\n //

      \n //
      \n // tags for inner block must be indented.\n //
      \n //
      \n //\n // The outermost tags must start at the left margin for this to match, and\n // the inner nested divs must be indented.\n // We need to do this before the next, more liberal match, because the next\n // match will start at the first `
      ` and stop at the first `
      `.\n\n // attacklab: This regex can be expensive when it fails.\n /*\n var text = text.replace(/\n (\t\t\t\t\t\t// save in $1\n ^\t\t\t\t\t// start of line (with /m)\n <($block_tags_a)\t// start tag = $2\n \\b\t\t\t\t\t// word break\n // attacklab: hack around khtml/pcre bug...\n [^\\r]*?\\n\t\t\t// any number of lines, minimally matching\n \t\t\t\t// the matching end tag\n [ \\t]*\t\t\t\t// trailing spaces/tabs\n (?=\\n+)\t\t\t\t// followed by a newline\n )\t\t\t\t\t\t// attacklab: there are sentinel newlines at end of document\n /gm,function(){...}};\n */\n text = text.replace(\n /^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\\b[^\\r]*?\\n<\\/\\2>[ \\t]*(?=\\n+))/gm,\n hashElement\n );\n\n //\n // Now match more liberally, simply from `\\n` to `\\n`\n //\n\n /*\n var text = text.replace(/\n (\t\t\t\t\t\t// save in $1\n ^\t\t\t\t\t// start of line (with /m)\n <($block_tags_b)\t// start tag = $2\n \\b\t\t\t\t\t// word break\n // attacklab: hack around khtml/pcre bug...\n [^\\r]*?\t\t\t\t// any number of lines, minimally matching\n .*\t\t\t\t// the matching end tag\n [ \\t]*\t\t\t\t// trailing spaces/tabs\n (?=\\n+)\t\t\t\t// followed by a newline\n )\t\t\t\t\t\t// attacklab: there are sentinel newlines at end of document\n /gm,function(){...}};\n */\n text = text.replace(\n /^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math)\\b[^\\r]*?.*<\\/\\2>[ \\t]*(?=\\n+)\\n)/gm,\n hashElement\n );\n\n // Special case just for
      . It was easier to make a special case than\n // to make the other regex more complicated.\n\n /*\n text = text.replace(/\n (\t\t\t\t\t\t// save in $1\n \\n\\n\t\t\t\t// Starting after a blank line\n [ ]{0,3}\n (<(hr)\t\t\t\t// start tag = $2\n \\b\t\t\t\t\t// word break\n ([^<>])*?\t\t\t//\n \\/?>)\t\t\t\t// the matching end tag\n [ \\t]*\n (?=\\n{2,})\t\t\t// followed by a blank line\n )\n /g,hashElement);\n */\n text = text.replace(\n /(\\n[ ]{0,3}(<(hr)\\b([^<>])*?\\/?>)[ \\t]*(?=\\n{2,}))/g,\n hashElement\n );\n\n // Special case for standalone HTML comments:\n\n /*\n text = text.replace(/\n (\t\t\t\t\t\t// save in $1\n \\n\\n\t\t\t\t// Starting after a blank line\n [ ]{0,3}\t\t\t// attacklab: g_tab_width - 1\n \n [ \\t]*\n (?=\\n{2,})\t\t\t// followed by a blank line\n )\n /g,hashElement);\n */\n text = text.replace(\n /(\\n\\n[ ]{0,3}[ \\t]*(?=\\n{2,}))/g,\n hashElement\n );\n\n // PHP and ASP-style processor instructions ( and <%...%>)\n\n /*\n text = text.replace(/\n (?:\n \\n\\n\t\t\t\t// Starting after a blank line\n )\n (\t\t\t\t\t\t// save in $1\n [ ]{0,3}\t\t\t// attacklab: g_tab_width - 1\n (?:\n <([?%])\t\t\t// $2\n [^\\r]*?\n \\2>\n )\n [ \\t]*\n (?=\\n{2,})\t\t\t// followed by a blank line\n )\n /g,hashElement);\n */\n text = text.replace(\n /(?:\\n\\n)([ ]{0,3}(?:<([?%])[^\\r]*?\\2>)[ \\t]*(?=\\n{2,}))/g,\n hashElement\n );\n\n // attacklab: Undo double lines (see comment at top of this function)\n text = text.replace(/\\n\\n/g, \"\\n\");\n return text;\n };\n\n var hashElement = function (wholeMatch, m1) {\n var blockText = m1;\n\n // Undo double lines\n blockText = blockText.replace(/\\n\\n/g, \"\\n\");\n blockText = blockText.replace(/^\\n/, \"\");\n\n // strip trailing blank lines\n blockText = blockText.replace(/\\n+$/g, \"\");\n\n // Replace the element text with a marker (\"~KxK\" where x is its key)\n blockText = \"\\n\\n~K\" + (g_html_blocks.push(blockText) - 1) + \"K\\n\\n\";\n\n return blockText;\n };\n\n var _RunBlockGamut = function (text) {\n //\n // These are all the transformations that form block-level\n // tags like paragraphs, headers, and list items.\n //\n text = _DoHeaders(text);\n\n // Do Horizontal Rules:\n var key = hashBlock(\"
      \");\n text = text.replace(/^[ ]{0,2}([ ]?\\*[ ]?){3,}[ \\t]*$/gm, key);\n text = text.replace(/^[ ]{0,2}([ ]?\\-[ ]?){3,}[ \\t]*$/gm, key);\n text = text.replace(/^[ ]{0,2}([ ]?\\_[ ]?){3,}[ \\t]*$/gm, key);\n\n text = _DoLists(text);\n text = _DoCodeBlocks(text);\n text = _DoBlockQuotes(text);\n\n // We already ran _HashHTMLBlocks() before, in Markdown(), but that\n // was to escape raw HTML in the original Markdown source. This time,\n // we're escaping the markup we've just created, so that we don't wrap\n //

      tags around block-level tags.\n text = _HashHTMLBlocks(text);\n text = _FormParagraphs(text);\n\n return text;\n };\n\n var _RunSpanGamut = function (text) {\n //\n // These are all the transformations that occur *within* block-level\n // tags like paragraphs, headers, and list items.\n //\n\n text = _DoCodeSpans(text);\n text = _EscapeSpecialCharsWithinTagAttributes(text);\n text = _EncodeBackslashEscapes(text);\n\n // Process anchor and image tags. Images must come first,\n // because ![foo][f] looks like an anchor.\n text = _DoImages(text);\n text = _DoAnchors(text);\n\n // Make links out of things like ``\n // Must come after _DoAnchors(), because you can use < and >\n // delimiters in inline links like [this]().\n text = _DoAutoLinks(text);\n text = _EncodeAmpsAndAngles(text);\n text = _DoItalicsAndBold(text);\n\n // Do hard breaks:\n text = text.replace(/ +\\n/g, \"
      \\n\");\n\n return text;\n };\n\n var _EscapeSpecialCharsWithinTagAttributes = function (text) {\n //\n // Within tags -- meaning between < and > -- encode [\\ ` * _] so they\n // don't conflict with their use in Markdown for code, italics and strong.\n //\n\n // Build a regex to find HTML tags and comments. See Friedl's\n // \"Mastering Regular Expressions\", 2nd Ed., pp. 200-201.\n var regex = /(<[a-z\\/!$](\"[^\"]*\"|'[^']*'|[^'\">])*>|)/gi;\n\n text = text.replace(regex, function (wholeMatch) {\n var tag = wholeMatch.replace(/(.)<\\/?code>(?=.)/g, \"$1`\");\n tag = escapeCharacters(tag, \"\\\\`*_\");\n return tag;\n });\n\n return text;\n };\n\n var _DoAnchors = function (text) {\n //\n // Turn Markdown link shortcuts into XHTML
      tags.\n //\n //\n // First, handle reference-style links: [link text] [id]\n //\n\n /*\n text = text.replace(/\n (\t\t\t\t\t\t\t// wrap whole match in $1\n \\[\n (\n (?:\n \\[[^\\]]*\\]\t\t// allow brackets nested one level\n |\n [^\\[]\t\t\t// or anything else\n )*\n )\n \\]\n\n [ ]?\t\t\t\t\t// one optional space\n (?:\\n[ ]*)?\t\t\t\t// one optional newline followed by spaces\n\n \\[\n (.*?)\t\t\t\t\t// id = $3\n \\]\n )()()()()\t\t\t\t\t// pad remaining backreferences\n /g,_DoAnchors_callback);\n */\n text = text.replace(\n /(\\[((?:\\[[^\\]]*\\]|[^\\[\\]])*)\\][ ]?(?:\\n[ ]*)?\\[(.*?)\\])()()()()/g,\n writeAnchorTag\n );\n\n //\n // Next, inline-style links: [link text](url \"optional title\")\n //\n\n /*\n text = text.replace(/\n (\t\t\t\t\t\t// wrap whole match in $1\n \\[\n (\n (?:\n \\[[^\\]]*\\]\t// allow brackets nested one level\n |\n [^\\[\\]]\t\t\t// or anything else\n )\n )\n \\]\n \\(\t\t\t\t\t\t// literal paren\n [ \\t]*\n ()\t\t\t\t\t\t// no id, so leave $3 empty\n ?\t\t\t\t// href = $4\n [ \\t]*\n (\t\t\t\t\t\t// $5\n (['\"])\t\t\t\t// quote char = $6\n (.*?)\t\t\t\t// Title = $7\n \\6\t\t\t\t\t// matching quote\n [ \\t]*\t\t\t\t// ignore any spaces/tabs between closing quote and )\n )?\t\t\t\t\t\t// title is optional\n \\)\n )\n /g,writeAnchorTag);\n */\n text = text.replace(\n /(\\[((?:\\[[^\\]]*\\]|[^\\[\\]])*)\\]\\([ \\t]*()?[ \\t]*((['\"])(.*?)\\6[ \\t]*)?\\))/g,\n writeAnchorTag\n );\n\n //\n // Last, handle reference-style shortcuts: [link text]\n // These must come last in case you've also got [link test][1]\n // or [link test](/foo)\n //\n\n /*\n text = text.replace(/\n ( // wrap whole match in $1\n \\[\n ([^\\[\\]]+)\t\t\t\t// link text = $2; can't contain '[' or ']'\n \\]\n )()()()()()\t\t\t\t\t// pad rest of backreferences\n /g, writeAnchorTag);\n */\n text = text.replace(/(\\[([^\\[\\]]+)\\])()()()()()/g, writeAnchorTag);\n\n return text;\n };\n\n var writeAnchorTag = function (wholeMatch, m1, m2, m3, m4, m5, m6, m7) {\n if (m7 == undefined) m7 = \"\";\n var whole_match = m1;\n var link_text = m2;\n var link_id = m3.toLowerCase();\n var url = m4;\n var title = m7;\n\n if (url == \"\") {\n if (link_id == \"\") {\n // lower-case and turn embedded newlines into spaces\n link_id = link_text.toLowerCase().replace(/ ?\\n/g, \" \");\n }\n url = \"#\" + link_id;\n\n if (g_urls[link_id] != undefined) {\n url = g_urls[link_id];\n if (g_titles[link_id] != undefined) {\n title = g_titles[link_id];\n }\n } else {\n if (whole_match.search(/\\(\\s*\\)$/m) > -1) {\n // Special case for explicit empty url\n url = \"\";\n } else {\n return whole_match;\n }\n }\n }\n\n url = escapeCharacters(url, \"*_\");\n var result = '\" + _EncodeBackslashEscapes(link_text) + \"\";\n\n return result;\n };\n\n var _DoImages = function (text) {\n //\n // Turn Markdown image shortcuts into tags.\n //\n\n //\n // First, handle reference-style labeled images: ![alt text][id]\n //\n\n /*\n text = text.replace(/\n (\t\t\t\t\t\t// wrap whole match in $1\n !\\[\n (.*?)\t\t\t\t// alt text = $2\n \\]\n\n [ ]?\t\t\t\t// one optional space\n (?:\\n[ ]*)?\t\t\t// one optional newline followed by spaces\n\n \\[\n (.*?)\t\t\t\t// id = $3\n \\]\n )()()()()\t\t\t\t// pad rest of backreferences\n /g,writeImageTag);\n */\n text = text.replace(\n /(!\\[(.*?)\\][ ]?(?:\\n[ ]*)?\\[(.*?)\\])()()()()/g,\n writeImageTag\n );\n\n //\n // Next, handle inline images: ![alt text](url \"optional title\")\n // Don't forget: encode * and _\n\n /*\n text = text.replace(/\n (\t\t\t\t\t\t// wrap whole match in $1\n !\\[\n (.*?)\t\t\t\t// alt text = $2\n \\]\n \\s?\t\t\t\t\t// One optional whitespace character\n \\(\t\t\t\t\t// literal paren\n [ \\t]*\n ()\t\t\t\t\t// no id, so leave $3 empty\n ?\t\t\t// src url = $4\n [ \\t]*\n (\t\t\t\t\t// $5\n (['\"])\t\t\t// quote char = $6\n (.*?)\t\t\t// title = $7\n \\6\t\t\t\t// matching quote\n [ \\t]*\n )?\t\t\t\t\t// title is optional\n \\)\n )\n /g,writeImageTag);\n */\n text = text.replace(\n /(!\\[(.*?)\\]\\s?\\([ \\t]*()?[ \\t]*((['\"])(.*?)\\6[ \\t]*)?\\))/g,\n writeImageTag\n );\n\n return text;\n };\n\n var writeImageTag = function (wholeMatch, m1, m2, m3, m4, m5, m6, m7) {\n var whole_match = m1;\n var alt_text = m2;\n var link_id = m3.toLowerCase();\n var url = m4;\n var title = m7;\n\n if (!title) title = \"\";\n\n if (url == \"\") {\n if (link_id == \"\") {\n // lower-case and turn embedded newlines into spaces\n link_id = alt_text.toLowerCase().replace(/ ?\\n/g, \" \");\n }\n url = \"#\" + link_id;\n\n if (g_urls[link_id] != undefined) {\n url = g_urls[link_id];\n if (g_titles[link_id] != undefined) {\n title = g_titles[link_id];\n }\n } else {\n return whole_match;\n }\n }\n\n alt_text = alt_text.replace(/\"/g, \""\");\n url = escapeCharacters(url, \"*_\");\n var result = '\"'\";\n\n return result;\n };\n\n var _DoHeaders = function (text) {\n // Setext-style headers:\n //\tHeader 1\n //\t========\n //\n //\tHeader 2\n //\t--------\n //\n text = text.replace(\n /^(.+)[ \\t]*\\n=+[ \\t]*\\n+/gm,\n function (wholeMatch, m1) {\n return hashBlock(\"

      \" + _RunSpanGamut(m1) + \"

      \");\n }\n );\n\n text = text.replace(\n /^(.+)[ \\t]*\\n-+[ \\t]*\\n+/gm,\n function (matchFound, m1) {\n return hashBlock(\"

      \" + _RunSpanGamut(m1) + \"

      \");\n }\n );\n\n // atx-style headers:\n // # Header 1\n // ## Header 2\n // ## Header 2 with closing hashes ##\n // ...\n // ###### Header 6\n //\n\n /*\n text = text.replace(/\n ^(\\#{1,6})\t\t\t\t// $1 = string of #'s\n [ \\t]*\n (.+?)\t\t\t\t\t// $2 = Header text\n [ \\t]*\n \\#*\t\t\t\t\t\t// optional closing #'s (not counted)\n \\n+\n /gm, function() {...});\n */\n\n text = text.replace(\n /^(\\#{1,6})[ \\t]*(.+?)[ \\t]*\\#*\\n+/gm,\n function (wholeMatch, m1, m2) {\n var h_level = m1.length;\n return hashBlock(\n \"\" + _RunSpanGamut(m2) + \"\"\n );\n }\n );\n\n return text;\n };\n\n // This declaration keeps Dojo compressor from outputting garbage:\n var _ProcessListItems;\n\n var _DoLists = function (text) {\n //\n // Form HTML ordered (numbered) and unordered (bulleted) lists.\n //\n\n // attacklab: add sentinel to hack around khtml/safari bug:\n // http://bugs.webkit.org/show_bug.cgi?id=11231\n text += \"~0\";\n\n // Re-usable pattern to match any entirel ul or ol list:\n\n /*\n var whole_list = /\n (\t\t\t\t\t\t\t\t\t// $1 = whole list\n (\t\t\t\t\t\t\t\t// $2\n [ ]{0,3}\t\t\t\t\t// attacklab: g_tab_width - 1\n ([*+-]|\\d+[.])\t\t\t\t// $3 = first list item marker\n [ \\t]+\n )\n [^\\r]+?\n (\t\t\t\t\t\t\t\t// $4\n ~0\t\t\t\t\t\t\t// sentinel for workaround; should be $\n |\n \\n{2,}\n (?=\\S)\n (?!\t\t\t\t\t\t\t// Negative lookahead for another list item marker\n [ \\t]*\n (?:[*+-]|\\d+[.])[ \\t]+\n )\n )\n )/g\n */\n var whole_list =\n /^(([ ]{0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(~0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/gm;\n\n if (g_list_level) {\n text = text.replace(whole_list, function (wholeMatch, m1, m2) {\n var list = m1;\n var list_type = m2.search(/[*+-]/g) > -1 ? \"ul\" : \"ol\";\n\n // Turn double returns into triple returns, so that we can make a\n // paragraph for the last item in a list, if necessary:\n list = list.replace(/\\n{2,}/g, \"\\n\\n\\n\");\n var result = _ProcessListItems(list);\n\n // Trim any trailing whitespace, to put the closing ``\n // up on the preceding line, to get it past the current stupid\n // HTML block parser. This is a hack to work around the terrible\n // hack that is the HTML block parser.\n result = result.replace(/\\s+$/, \"\");\n result = \"<\" + list_type + \">\" + result + \"\\n\";\n return result;\n });\n } else {\n whole_list =\n /(\\n\\n|^\\n?)(([ ]{0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(~0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/g;\n text = text.replace(whole_list, function (wholeMatch, m1, m2, m3) {\n var runup = m1;\n var list = m2;\n\n var list_type = m3.search(/[*+-]/g) > -1 ? \"ul\" : \"ol\";\n // Turn double returns into triple returns, so that we can make a\n // paragraph for the last item in a list, if necessary:\n var list = list.replace(/\\n{2,}/g, \"\\n\\n\\n\");\n var result = _ProcessListItems(list);\n result =\n runup + \"<\" + list_type + \">\\n\" + result + \"\\n\";\n return result;\n });\n }\n\n // attacklab: strip sentinel\n text = text.replace(/~0/, \"\");\n\n return text;\n };\n\n _ProcessListItems = function (list_str) {\n //\n // Process the contents of a single ordered or unordered list, splitting it\n // into individual list items.\n //\n // The $g_list_level global keeps track of when we're inside a list.\n // Each time we enter a list, we increment it; when we leave a list,\n // we decrement. If it's zero, we're not in a list anymore.\n //\n // We do this because when we're not inside a list, we want to treat\n // something like this:\n //\n // I recommend upgrading to version\n // 8. Oops, now this line is treated\n // as a sub-list.\n //\n // As a single paragraph, despite the fact that the second line starts\n // with a digit-period-space sequence.\n //\n // Whereas when we're inside a list (or sub-list), that line will be\n // treated as the start of a sub-list. What a kludge, huh? This is\n // an aspect of Markdown's syntax that's hard to parse perfectly\n // without resorting to mind-reading. Perhaps the solution is to\n // change the syntax rules such that sub-lists must start with a\n // starting cardinal number; e.g. \"1.\" or \"a.\".\n\n g_list_level++;\n\n // trim trailing blank lines:\n list_str = list_str.replace(/\\n{2,}$/, \"\\n\");\n\n // attacklab: add sentinel to emulate \\z\n list_str += \"~0\";\n\n /*\n list_str = list_str.replace(/\n (\\n)?\t\t\t\t\t\t\t// leading line = $1\n (^[ \\t]*)\t\t\t\t\t\t// leading whitespace = $2\n ([*+-]|\\d+[.]) [ \\t]+\t\t\t// list marker = $3\n ([^\\r]+?\t\t\t\t\t\t// list item text = $4\n (\\n{1,2}))\n (?= \\n* (~0 | \\2 ([*+-]|\\d+[.]) [ \\t]+))\n /gm, function(){...});\n */\n list_str = list_str.replace(\n /(\\n)?(^[ \\t]*)([*+-]|\\d+[.])[ \\t]+([^\\r]+?(\\n{1,2}))(?=\\n*(~0|\\2([*+-]|\\d+[.])[ \\t]+))/gm,\n function (wholeMatch, m1, m2, m3, m4) {\n var item = m4;\n var leading_line = m1;\n var leading_space = m2;\n\n if (leading_line || item.search(/\\n{2,}/) > -1) {\n item = _RunBlockGamut(_Outdent(item));\n } else {\n // Recursion for sub-lists:\n item = _DoLists(_Outdent(item));\n item = item.replace(/\\n$/, \"\"); // chomp(item)\n item = _RunSpanGamut(item);\n }\n\n return \"
    • \" + item + \"
    • \\n\";\n }\n );\n\n // attacklab: strip sentinel\n list_str = list_str.replace(/~0/g, \"\");\n\n g_list_level--;\n return list_str;\n };\n\n var _DoCodeBlocks = function (text) {\n //\n // Process Markdown `
      ` blocks.\n    //\n\n    /*\n    text = text.replace(text,\n      /(?:\\n\\n|^)\n      (\t\t\t\t\t\t\t\t// $1 = the code block -- one or more lines, starting with a space/tab\n        (?:\n          (?:[ ]{4}|\\t)\t\t\t// Lines must start with a tab or a tab-width of spaces - attacklab: g_tab_width\n          .*\\n+\n        )+\n      )\n      (\\n*[ ]{0,3}[^ \\t\\n]|(?=~0))\t// attacklab: g_tab_width\n    /g,function(){...});\n  */\n\n    // attacklab: sentinel workarounds for lack of \\A and \\Z, safari\\khtml bug\n    text += \"~0\";\n\n    text = text.replace(\n      /(?:\\n\\n|^)((?:(?:[ ]{4}|\\t).*\\n+)+)(\\n*[ ]{0,3}[^ \\t\\n]|(?=~0))/g,\n      function (wholeMatch, m1, m2) {\n        var codeblock = m1;\n        var nextChar = m2;\n\n        codeblock = _EncodeCode(_Outdent(codeblock));\n        codeblock = _Detab(codeblock);\n        codeblock = codeblock.replace(/^\\n+/g, \"\"); // trim leading newlines\n        codeblock = codeblock.replace(/\\n+$/g, \"\"); // trim trailing whitespace\n\n        codeblock = \"
      \" + codeblock + \"\\n
      \";\n\n return hashBlock(codeblock) + nextChar;\n }\n );\n\n // attacklab: strip sentinel\n text = text.replace(/~0/, \"\");\n\n return text;\n };\n\n var hashBlock = function (text) {\n text = text.replace(/(^\\n+|\\n+$)/g, \"\");\n return \"\\n\\n~K\" + (g_html_blocks.push(text) - 1) + \"K\\n\\n\";\n };\n\n var _DoCodeSpans = function (text) {\n //\n // * Backtick quotes are used for spans.\n //\n // * You can use multiple backticks as the delimiters if you want to\n // include literal backticks in the code span. So, this input:\n //\n // Just type ``foo `bar` baz`` at the prompt.\n //\n // Will translate to:\n //\n //

      Just type foo `bar` baz at the prompt.

      \n //\n //\tThere's no arbitrary limit to the number of backticks you\n //\tcan use as delimters. If you need three consecutive backticks\n //\tin your code, use four for delimiters, etc.\n //\n // * You can use spaces to get literal backticks at the edges:\n //\n // ... type `` `bar` `` ...\n //\n // Turns to:\n //\n // ... type `bar` ...\n //\n\n /*\n text = text.replace(/\n (^|[^\\\\])\t\t\t\t\t// Character before opening ` can't be a backslash\n (`+)\t\t\t\t\t\t// $2 = Opening run of `\n (\t\t\t\t\t\t\t// $3 = The code block\n [^\\r]*?\n [^`]\t\t\t\t\t// attacklab: work around lack of lookbehind\n )\n \\2\t\t\t\t\t\t\t// Matching closer\n (?!`)\n /gm, function(){...});\n */\n\n text = text.replace(\n /(^|[^\\\\])(`+)([^\\r]*?[^`])\\2(?!`)/gm,\n function (wholeMatch, m1, m2, m3, m4) {\n var c = m3;\n c = c.replace(/^([ \\t]*)/g, \"\"); // leading whitespace\n c = c.replace(/[ \\t]*$/g, \"\"); // trailing whitespace\n c = _EncodeCode(c);\n return m1 + \"\" + c + \"\";\n }\n );\n\n return text;\n };\n\n var _EncodeCode = function (text) {\n //\n // Encode/escape certain characters inside Markdown code runs.\n // The point is that in code, these characters are literals,\n // and lose their special Markdown meanings.\n //\n // Encode all ampersands; HTML entities are not\n // entities within a Markdown code span.\n text = text.replace(/&/g, \"&\");\n\n // Do the angle bracket song and dance:\n text = text.replace(//g, \">\");\n\n // Now, escape characters that are magic in Markdown:\n text = escapeCharacters(text, \"*_{}[]\\\\\", false);\n\n // jj the line above breaks this:\n //---\n\n //* Item\n\n // 1. Subitem\n\n // special char: *\n //---\n\n return text;\n };\n\n var _DoItalicsAndBold = function (text) {\n // must go first:\n text = text.replace(\n /(\\*\\*|__)(?=\\S)([^\\r]*?\\S[*_]*)\\1/g,\n \"$2\"\n );\n\n text = text.replace(/(\\*|_)(?=\\S)([^\\r]*?\\S)\\1/g, \"$2\");\n\n return text;\n };\n\n var _DoBlockQuotes = function (text) {\n /*\n text = text.replace(/\n (\t\t\t\t\t\t\t\t// Wrap whole match in $1\n (\n ^[ \\t]*>[ \\t]?\t\t\t// '>' at the start of a line\n .+\\n\t\t\t\t\t// rest of the first line\n (.+\\n)*\t\t\t\t\t// subsequent consecutive lines\n \\n*\t\t\t\t\t\t// blanks\n )+\n )\n /gm, function(){...});\n */\n\n text = text.replace(\n /((^[ \\t]*>[ \\t]?.+\\n(.+\\n)*\\n*)+)/gm,\n function (wholeMatch, m1) {\n var bq = m1;\n\n // attacklab: hack around Konqueror 3.5.4 bug:\n // \"----------bug\".replace(/^-/g,\"\") == \"bug\"\n\n bq = bq.replace(/^[ \\t]*>[ \\t]?/gm, \"~0\"); // trim one level of quoting\n\n // attacklab: clean up hack\n bq = bq.replace(/~0/g, \"\");\n\n bq = bq.replace(/^[ \\t]+$/gm, \"\"); // trim whitespace-only lines\n bq = _RunBlockGamut(bq); // recurse\n\n bq = bq.replace(/(^|\\n)/g, \"$1 \");\n // These leading spaces screw with
       content, so we need to fix that:\n        bq = bq.replace(\n          /(\\s*
      [^\\r]+?<\\/pre>)/gm,\n          function (wholeMatch, m1) {\n            var pre = m1;\n            // attacklab: hack around Konqueror 3.5.4 bug:\n            pre = pre.replace(/^  /gm, \"~0\");\n            pre = pre.replace(/~0/g, \"\");\n            return pre;\n          }\n        );\n\n        return hashBlock(\"
      \\n\" + bq + \"\\n
      \");\n }\n );\n return text;\n };\n\n var _FormParagraphs = function (text) {\n //\n // Params:\n // $text - string to process with html

      tags\n //\n\n // Strip leading and trailing lines:\n text = text.replace(/^\\n+/g, \"\");\n text = text.replace(/\\n+$/g, \"\");\n\n var grafs = text.split(/\\n{2,}/g);\n var grafsOut = new Array();\n\n //\n // Wrap

      tags.\n //\n var end = grafs.length;\n for (var i = 0; i < end; i++) {\n var str = grafs[i];\n\n // if this is an HTML marker, copy it\n if (str.search(/~K(\\d+)K/g) >= 0) {\n grafsOut.push(str);\n } else if (str.search(/\\S/) >= 0) {\n str = _RunSpanGamut(str);\n str = str.replace(/^([ \\t]*)/g, \"

      \");\n str += \"

      \";\n grafsOut.push(str);\n }\n }\n\n //\n // Unhashify HTML blocks\n //\n end = grafsOut.length;\n for (var i = 0; i < end; i++) {\n // if this is a marker for an html block...\n while (grafsOut[i].search(/~K(\\d+)K/) >= 0) {\n var blockText = g_html_blocks[RegExp.$1];\n blockText = blockText.replace(/\\$/g, \"$$$$\"); // Escape any dollar signs\n grafsOut[i] = grafsOut[i].replace(/~K\\d+K/, blockText);\n }\n }\n\n return grafsOut.join(\"\\n\\n\");\n };\n\n var _EncodeAmpsAndAngles = function (text) {\n // Smart processing for ampersands and angle brackets that need to be encoded.\n\n // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:\n // http://bumppo.net/projects/amputator/\n text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\\w+);)/g, \"&\");\n\n // Encode naked <'s\n text = text.replace(/<(?![a-z\\/?\\$!])/gi, \"<\");\n\n return text;\n };\n\n var _EncodeBackslashEscapes = function (text) {\n //\n // Parameter: String.\n // Returns:\tThe string, with after processing the following backslash\n // escape sequences.\n //\n\n // attacklab: The polite way to do this is with the new\n // escapeCharacters() function:\n //\n // text = escapeCharacters(text,\"\\\\\",true);\n // text = escapeCharacters(text,\"`*_{}[]()>#+-.!\",true);\n //\n // ...but we're sidestepping its use of the (slow) RegExp constructor\n // as an optimization for Firefox. This function gets called a LOT.\n\n text = text.replace(/\\\\(\\\\)/g, escapeCharacters_callback);\n text = text.replace(/\\\\([`*_{}\\[\\]()>#+-.!])/g, escapeCharacters_callback);\n return text;\n };\n\n var _DoAutoLinks = function (text) {\n text = text.replace(\n /<((https?|ftp|dict):[^'\">\\s]+)>/gi,\n '$1'\n );\n\n // Email addresses: \n\n /*\n text = text.replace(/\n <\n (?:mailto:)?\n (\n [-.\\w]+\n \\@\n [-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+\n )\n >\n /gi, _DoAutoLinks_callback());\n */\n text = text.replace(\n /<(?:mailto:)?([-.\\w]+\\@[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+)>/gi,\n function (wholeMatch, m1) {\n return _EncodeEmailAddress(_UnescapeSpecialChars(m1));\n }\n );\n\n return text;\n };\n\n var _EncodeEmailAddress = function (addr) {\n //\n // Input: an email address, e.g. \"foo@example.com\"\n //\n // Output: the email address as a mailto link, with each character\n //\tof the address encoded as either a decimal or hex entity, in\n //\tthe hopes of foiling most address harvesting spam bots. E.g.:\n //\n //\tfoo\n // @example.com\n //\n // Based on a filter by Matthew Wickline, posted to the BBEdit-Talk\n // mailing list: \n //\n\n // attacklab: why can't javascript speak hex?\n function char2hex(ch) {\n var hexDigits = \"0123456789ABCDEF\";\n var dec = ch.charCodeAt(0);\n return hexDigits.charAt(dec >> 4) + hexDigits.charAt(dec & 15);\n }\n\n var encode = [\n function (ch) {\n return \"&#\" + ch.charCodeAt(0) + \";\";\n },\n function (ch) {\n return \"&#x\" + char2hex(ch) + \";\";\n },\n function (ch) {\n return ch;\n }\n ];\n\n addr = \"mailto:\" + addr;\n\n addr = addr.replace(/./g, function (ch) {\n if (ch == \"@\") {\n // this *must* be encoded. I insist.\n ch = encode[Math.floor(Math.random() * 2)](ch);\n } else if (ch != \":\") {\n // leave ':' alone (to spot mailto: later)\n var r = Math.random();\n // roughly 10% raw, 45% hex, 45% dec\n ch = r > 0.9 ? encode[2](ch) : r > 0.45 ? encode[1](ch) : encode[0](ch);\n }\n return ch;\n });\n\n addr = '' + addr + \"\";\n addr = addr.replace(/\">.+:/g, '\">'); // strip the mailto: from the visible part\n\n return addr;\n };\n\n var _UnescapeSpecialChars = function (text) {\n //\n // Swap back in all the special characters we've hidden.\n //\n text = text.replace(/~E(\\d+)E/g, function (wholeMatch, m1) {\n var charCodeToReplace = parseInt(m1);\n return String.fromCharCode(charCodeToReplace);\n });\n return text;\n };\n\n var _Outdent = function (text) {\n //\n // Remove one level of line-leading tabs or spaces\n //\n\n // attacklab: hack around Konqueror 3.5.4 bug:\n // \"----------bug\".replace(/^-/g,\"\") == \"bug\"\n\n text = text.replace(/^(\\t|[ ]{1,4})/gm, \"~0\"); // attacklab: g_tab_width\n\n // attacklab: clean up hack\n text = text.replace(/~0/g, \"\");\n\n return text;\n };\n\n var _Detab = function (text) {\n // attacklab: Detab's completely rewritten for speed.\n // In perl we could fix it by anchoring the regexp with \\G.\n // In javascript we're less fortunate.\n\n // expand first n-1 tabs\n text = text.replace(/\\t(?=\\t)/g, \" \"); // attacklab: g_tab_width\n\n // replace the nth with two sentinels\n text = text.replace(/\\t/g, \"~A~B\");\n\n // use the sentinel to anchor our regex so it doesn't explode\n text = text.replace(/~B(.+?)~A/g, function (wholeMatch, m1, m2) {\n var leadingText = m1;\n var numSpaces = 4 - (leadingText.length % 4); // attacklab: g_tab_width\n\n // there *must* be a better way to do this:\n for (var i = 0; i < numSpaces; i++) leadingText += \" \";\n\n return leadingText;\n });\n\n // clean up sentinels\n text = text.replace(/~A/g, \" \"); // attacklab: g_tab_width\n text = text.replace(/~B/g, \"\");\n\n return text;\n };\n\n //\n // attacklab: Utility functions\n //\n\n var escapeCharacters = function (text, charsToEscape, afterBackslash) {\n // First we have to escape the escape characters so that\n // we can build a character class out of them\n var regexString =\n \"([\" + charsToEscape.replace(/([\\[\\]\\\\])/g, \"\\\\$1\") + \"])\";\n\n if (afterBackslash) {\n regexString = \"\\\\\\\\\" + regexString;\n }\n\n var regex = new RegExp(regexString, \"g\");\n text = text.replace(regex, escapeCharacters_callback);\n\n return text;\n };\n\n var escapeCharacters_callback = function (wholeMatch, m1) {\n var charCodeToEscape = m1.charCodeAt(0);\n return \"~E\" + charCodeToEscape + \"E\";\n };\n}; // end of Showdown.converter\n\nexport default Showdown;\n","import { default as Showdown } from \"$showdown\";\nexport { converter };\n\nconst converter = new Showdown.converter();\n\nconst orig = converter.makeHtml.bind(converter);\nconverter.makeHtml = (text, inline) =>\n orig(text, inline).replace(//gi,\n onlyPhrasingInside = [\n \"P\",\n \"H1\",\n \"H2\",\n \"H3\",\n \"H4\",\n \"H5\",\n \"H6\",\n \"SPAN\",\n \"LABEL\",\n \"LEGEND\",\n \"CAPTION\"\n ];\n\n if (policy === \"legacy\") {\n onlyPhrasingInside.splice(9);\n }\n\n $.fn.showdown = function () {\n return this.each(function (i, e) {\n if (e.classList.contains(\"bb-p-showdown-labels\")) return;\n e = $(e);\n var html_in, html_out;\n var onlyPhrasing = allowOnlyPhrasing(e);\n let newline = \"\\n\";\n\n html_in = e.html().replace(br_re, newline);\n html_out = converter.makeHtml(html_in, onlyPhrasing);\n if (onlyPhrasing)\n html_out = html_out.trim().replace(newlineGlobRe, \"
      \");\n\n if (topLevel !== 0)\n html_out = html_out.replace(/(<\\/?h)([1-6])/g, demoteHeading);\n\n e.html(html_out).addClass(\"bb-p-showdown-labels\");\n });\n };\n\n function allowOnlyPhrasing(e) {\n return (\n onlyPhrasingInside.indexOf(e.get(0).nodeName) > -1 ||\n (policy !== \"legacy\" && e.hasClass(\"bb-label\"))\n );\n }\n\n function demoteHeading(m, m1, m2) {\n return m1 + Math.min(6, topLevel + Number(m2));\n }\n\n $(document).on(\"bb:postHandleData\", function (event, data) {\n if (data && data.groups) {\n $(\".bb-md-able\").showdown();\n $(document).trigger(\"bb:md-done\");\n $(document).trigger(\"bb:resized\");\n }\n });\n });\n\n document.addEventListener(\n \"bb:updatedControl\",\n ({ detail: { control, Updates } }) => {\n if (has(\"value\", Updates) && isLabel(control) && updateLabels(conf)) {\n control._elt.classList.remove(\"bb-p-showdown-labels\");\n control.$elt.showdown();\n }\n if (\n has(\"value\", Updates) &&\n control.controltype === \"grid\" &&\n updateLabels(conf)\n ) {\n control.$elt.find(\".bb-md-able\").showdown();\n }\n }\n );\n})(jQuery);\n","/*\n * metadata-change-navtext\n *\n * Checks for metadata per node, specifically for\n * keys to change the nav button texts.\n *\n * Author: Tim Bauwens\n * Copyright: Berkeley Bridge 2020\n */\n\nimport { has } from \"$json/lib/functional\";\nimport { getmetadata } from \"$json/lib/getmetadata\";\n\n$(document).ready(() => {\n ((doc, $) => {\n let classes = [\"bb-next\", \"bb-prior\", \"bb-skip\", \"bb-restart\"];\n\n let originals = {};\n\n let flagged = [];\n\n classes.forEach(cls => {\n let button = doc.querySelector(`.${cls}`);\n if (!button) {\n // Remove this class, the button doesn't exist.\n flagged.push(cls);\n } else {\n let affected = button.querySelector(\".text\");\n if (!affected) {\n // Remove this class, and warn the user the template is not supportive.\n flagged.push(cls);\n window.console &&\n window.console.warn(\n `Using metadata-change-navtext with a non-supporting template.\n Please wrap nav strings with \"`\n );\n } else {\n originals[cls] = affected.innerText.trim();\n }\n }\n });\n\n classes = classes.filter(cls => !flagged.includes(cls));\n\n const reset = () => {\n // Reset strings to orig. values.\n classes.forEach(cls => {\n replace(cls, originals[cls]);\n });\n };\n\n const replace = (cls, string) => {\n doc.querySelectorAll(`.${cls}`).forEach(btn => {\n btn.querySelector(\".text\").innerText = string;\n });\n };\n\n $(doc).on(\"bb:finalHandleData\", (e, data) => {\n if (data && data.groups && data.groups.length) {\n reset();\n const groups = getmetadata(data).groups;\n let currentgroupid = data.groups.reduce(\n (id, group) => (group.current ? group.groupid : false),\n false\n );\n groups.forEach((group, id) => {\n if (id === currentgroupid) {\n classes.forEach(cls => {\n has(cls)(group) && replace(cls, group[cls]);\n });\n }\n });\n }\n });\n })(document, jQuery);\n});\n","/*\n metadata-scoring.js\n A plugin to add scoring data.\n*/\n\nimport { state } from \"$json/lib/store\";\nimport { getmetadata } from \"$json/lib/getmetadata\";\n\nvar scoreMap = new Map();\n\nconst getAverage = scoresobj => {\n let scores = Object.values(scoresobj);\n if (scores.length) {\n let total = scores.reduce(\n (accumulator, currentValue) => accumulator + currentValue\n );\n return total / scores.length;\n } else {\n return 0;\n }\n};\n\nclass Chapter {\n constructor() {\n this.scores = {};\n this.average = 0;\n }\n}\n\n((doc, $) => {\n const applystate = () => {\n // Run through the jumplist(s) (incl. fake ones) and add scores.\n let jumplist = doc.querySelectorAll(\".bb-jumplist li, .faux-jumplist li\");\n jumplist.forEach(li => {\n let btn = li.querySelector(\"button\");\n if (btn !== null) {\n let groupid = btn.getAttribute(\"data-groupid\");\n if (groupid !== null) {\n if (groupid.includes(\".\")) {\n // This is a chapter.\n if (scoreMap.has(groupid)) {\n btn.setAttribute(\n \"data-average-score\",\n scoreMap.get(groupid).average\n );\n if (scoreMap.get(groupid).hasOwnProperty(\"final\"))\n btn.setAttribute(\n \"data-final-score\",\n scoreMap.get(groupid).final\n );\n }\n } else {\n btn.setAttribute(\"data-score\", scoreMap.get(groupid));\n }\n }\n }\n });\n // Trigger an event for other plugins to react to score changes.\n $(doc).trigger(\"bb:scoresUpdated\", [scoreMap]);\n };\n\n $(doc).on(\"bb:stateChange\", _e => {\n let statescores = state.has(\"scoreMap\")\n ? new Map(Object.entries(state.get(\"scoreMap\")))\n : new Map();\n scoreMap = new Map(statescores);\n applystate();\n });\n\n $(doc).on(\"bb:postHandleData bb:hasUpdated\", (_e, data) => {\n if (data && data.groups && data.groups.length) {\n let md = getmetadata(data).props;\n let group = data.groups[data.groups.length - 1];\n let groupid = group.groupid;\n let chapterid = group.chapterid;\n\n // Grab scores from md and add to scoreMap.\n if (md.has(\"score\") && md.get(\"score\") !== \"initial\") {\n scoreMap.set(groupid, Number(md.get(\"score\")));\n // Also maintain chapter average scores.\n if (chapterid !== \"\") {\n let chapterobj = scoreMap.has(chapterid)\n ? scoreMap.get(chapterid)\n : new Chapter();\n\n chapterobj.scores[groupid] = Number(md.get(\"score\"));\n chapterobj.average = getAverage(chapterobj.scores);\n scoreMap.set(chapterid, chapterobj);\n }\n }\n\n // Also grab chapter scores if the model wishes to provide them.\n if (md.has(\"chapterscore\")) {\n // In case the modeler provides a chapter score from outside the chapter, ignore it.\n if (chapterid !== \"\") {\n let chapterobj = scoreMap.has(chapterid)\n ? scoreMap.get(chapterid)\n : new Chapter();\n\n chapterobj.final = Number(md.get(\"chapterscore\"));\n scoreMap.set(chapterid, chapterobj);\n }\n }\n if (scoreMap.size) {\n state.set(\"scoreMap\", Object.fromEntries(scoreMap));\n applystate();\n }\n }\n });\n})(document, jQuery);\n","export default function _isPlaceholder(a) {\n return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true;\n}","import _isPlaceholder from './_isPlaceholder.js';\n\n/**\n * Optimized internal one-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry1(fn) {\n return function f1(a) {\n if (arguments.length === 0 || _isPlaceholder(a)) {\n return f1;\n } else {\n return fn.apply(this, arguments);\n }\n };\n}","import _curry1 from './_curry1.js';\nimport _isPlaceholder from './_isPlaceholder.js';\n\n/**\n * Optimized internal two-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry2(fn) {\n return function f2(a, b) {\n switch (arguments.length) {\n case 0:\n return f2;\n case 1:\n return _isPlaceholder(a) ? f2 : _curry1(function (_b) {\n return fn(a, _b);\n });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f2 : _isPlaceholder(a) ? _curry1(function (_a) {\n return fn(_a, b);\n }) : _isPlaceholder(b) ? _curry1(function (_b) {\n return fn(a, _b);\n }) : fn(a, b);\n }\n };\n}","export default function _has(prop, obj) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}","/*\n * metaprogress.js\n *\n * A plugin to create and maintain a\n * progress indicator, updated by\n * metadata.\n *\n * NB: Layer requires at least one\n * element of class 'p-metaprogress'\n *\n * Tip:\n * You can provide a range, e.g. \"setmetadata('progress','3:5')\"\n * This will cause the plugin to fill the element(s) with\n * 5 spans, the first two will have class 'complete'\n * the third will have class 'current' and the last\n * two will have class 'future'.\n *\n * If you need all steps to be 'complete', you can:\n * setmetadata('progress', 'n+1:n');\n */\n\nimport { getmetadata } from \"$json/lib/getmetadata\";\nimport { _, bb } from \"$json\";\n\nconst DICTIONARY = {\n \"Your progress so far is\": {\n \"en\": \"Your progress so far is\",\n \"nl\": \"Je voortgang tot nu toe is\",\n \"en-GB\": \"Your progress so far is\"\n },\n \"You are currently on step\": {\n \"en\": \"You are currently on step\",\n \"nl\": \"U bevindt zich momenteel bij stap\",\n \"en-GB\": \"You are currently on step\"\n },\n \"of\": {\n \"en\": \"of\",\n \"nl\": \"van\",\n \"en-GB\": \"of\"\n }\n};\n_.addTranslations(DICTIONARY);\n\n((doc, $) => {\n // Add a ARIA notify block for read-aloud progress reports.\n const topIndicator = doc.querySelector(\".p-metaprogress\");\n const notifier = doc.createElement(\"span\");\n notifier.setAttribute(\"aria-live\", \"assertive\");\n notifier.setAttribute(\"aria-atomic\", \"true\");\n notifier.setAttribute(\"aria-relevant\", \"additions\");\n notifier.classList.add(\"a-offscreen\");\n topIndicator.insertAdjacentElement(\"afterend\", notifier);\n\n $(doc).on(\"bb:postHandleData\", (e, data) => {\n notifier.textContent = \"\"; // Wipe\n if (data && data.groups && data.groups.length) {\n const md = getmetadata(data).props;\n const indicators = doc.querySelectorAll(\".p-metaprogress\");\n if (md.has(\"progress\")) {\n bb.Mode.set(\"hasProgress\");\n let progress = md.get(\"progress\");\n indicators.innerHTML = \"\";\n let inner = false;\n let announcement = \"\";\n if (progress === \"hide\") {\n bb.Mode.unset(\"hasProgress\");\n }\n if (progress.includes(\":\")) {\n // The model is trying to give a range. Add spans for each potential step.\n inner = doc.createElement(\"div\");\n inner.className = \"steps\";\n let range = Number(progress.split(\":\").pop());\n let current = Number(progress.split(\":\")[0]);\n announcement = `${_(\"You are currently on step\")} ${current} ${_(\n \"of\"\n )} ${range}`;\n try {\n for (let i = range; i > 0; i--) {\n let span = doc.createElement(\"span\");\n span.className = \"step\";\n i < current && span.classList.add(\"complete\");\n i === current && span.classList.add(\"current\");\n i > current && span.classList.add(\"future\");\n span.setAttribute(\"data-step\", i);\n inner.prepend(span);\n }\n } catch (err) {\n return;\n }\n } else {\n announcement = `${_(\"Your progress so far is\")}: ${progress}%`;\n }\n indicators.forEach(indicator => {\n indicator.innerText = progress;\n if (inner) {\n indicator.innerHTML = \"\";\n indicator.append(inner);\n }\n indicator.setAttribute(\"data-progress\", md.get(\"progress\"));\n indicator.style.setProperty(\"--progress\", md.get(\"progress\"));\n });\n // Announce\n notifier.textContent = announcement;\n }\n }\n });\n})(document, jQuery);\n","import _curry2 from './internal/_curry2.js';\nimport _has from './internal/_has.js';\n\n/**\n * Returns whether or not a path exists in an object. Only the object's\n * own properties are checked.\n *\n * @func\n * @memberOf R\n * @since v0.26.0\n * @category Object\n * @typedefn Idx = String | Int\n * @sig [Idx] -> {a} -> Boolean\n * @param {Array} path The path to use.\n * @param {Object} obj The object to check the path in.\n * @return {Boolean} Whether the path exists.\n * @see R.has\n * @example\n *\n * R.hasPath(['a', 'b'], {a: {b: 2}}); // => true\n * R.hasPath(['a', 'b'], {a: {b: undefined}}); // => true\n * R.hasPath(['a', 'b'], {a: {c: 2}}); // => false\n * R.hasPath(['a', 'b'], {}); // => false\n */\nvar hasPath = /*#__PURE__*/_curry2(function hasPath(_path, obj) {\n if (_path.length === 0) {\n return false;\n }\n var val = obj;\n var idx = 0;\n while (idx < _path.length) {\n if (_has(_path[idx], val)) {\n val = val[_path[idx]];\n idx += 1;\n } else {\n return false;\n }\n }\n return true;\n});\nexport default hasPath;","import _curry2 from './internal/_curry2.js';\nimport hasPath from './hasPath.js';\n\n/**\n * Returns whether or not an object has an own property with the specified name\n *\n * @func\n * @memberOf R\n * @since v0.7.0\n * @category Object\n * @sig s -> {s: x} -> Boolean\n * @param {String} prop The name of the property to check for.\n * @param {Object} obj The object to query.\n * @return {Boolean} Whether the property exists.\n * @example\n *\n * const hasName = R.has('name');\n * hasName({name: 'alice'}); //=> true\n * hasName({name: 'bob'}); //=> true\n * hasName({}); //=> false\n *\n * const point = {x: 0, y: 0};\n * const pointHas = R.has(R.__, point);\n * pointHas('x'); //=> true\n * pointHas('y'); //=> true\n * pointHas('z'); //=> false\n */\nvar has = /*#__PURE__*/_curry2(function has(prop, obj) {\n return hasPath([prop], obj);\n});\nexport default has;","/*\n mis-click-count.js\n\n Give a model the ability to count\n every time a specifed element is\n clicked by recording it in MIS\n by means of a hidden field in the model.\n\n Copyright: Berkeley Bridge 2021\n Author: Tim Bauwens\n*/\n\nimport * as R from \"ramda\";\nimport { bb } from \"$json\";\nimport { getmetadata } from \"$json/lib/getmetadata\";\n\nconst getIDbykey = (items = [], key = \"\") => {\n const arr = [...items];\n if (!arr.length) return null;\n const item = arr.pop();\n if (item.length) {\n return R.has(key)(item[1]) ? item[0][0] : getIDbykey(arr, key);\n } else {\n return null;\n }\n};\n\n((doc, $) => {\n let clickelem = false;\n let clickfield = false;\n\n const clicked = e => {\n try {\n doc.querySelector(`[data-id=\"${clickfield}\"]`).value = \"true\";\n bb.updatemis();\n } catch (err) {\n window.console && window.console.warn(err);\n }\n };\n\n $(doc).on(\"bb:preHandleData\", (e, data) => {\n if (data && data.groups && data.groups.length) {\n const mdprops = getmetadata(data).props;\n const mdcontrols = getmetadata(data).controls;\n if (\n mdprops.has(\"p-mis-click-count\") &&\n mdprops.has(\"p-mis-click-count-field\")\n ) {\n const items = [...mdcontrols];\n if (mdprops.get(\"p-mis-click-count\") === \"end-tools-document\") {\n clickelem = \"end-tools-document\";\n } else {\n clickelem = getIDbykey(items, \"p-mis-click-count\");\n }\n clickfield = getIDbykey(items, \"p-mis-click-count-field\");\n } else {\n clickelem = clickfield = false;\n }\n }\n });\n\n $(doc).on(\"bb:finalHandleData\", (e, data) => {\n if (data && data.groups && data.groups.length) {\n if (clickelem && clickfield) {\n // First switch values from ID to data-id, which are no longer the same.\n clickfield = doc.getElementById(clickfield).getAttribute(\"data-id\");\n\n if (clickelem === \"end-tools-document\") {\n doc\n .querySelector(\".bb-p-end-tools-container .download-container a\")\n .addEventListener(\"click\", clicked);\n } else {\n // First switch values from ID to data-id, which are no longer the same.\n clickelem = doc.getElementById(clickelem).getAttribute(\"data-id\");\n\n doc.querySelectorAll(`[data-id=\"${clickelem}\"]`).forEach(elem => {\n elem.addEventListener(\"click\", clicked);\n });\n }\n\n try {\n doc\n .querySelector(`[data-id=\"${clickfield}\"]`)\n .closest(\".bb-questionlabelgroup\").style.display = \"none\";\n } catch (err) {\n // Probably this is not in a bb-questionlabelgroup...\n doc\n .querySelector(`[data-id=\"${clickfield}\"]`)\n .closest(\".bb-input-wrap\")\n .setAttribute(\"style\", \"display:none !important\");\n }\n }\n }\n });\n})(document, jQuery);\n","export function clearMenu() {\n document\n .querySelectorAll(\".p-dynamic-menu-item\")\n .forEach((el, i) => el.remove());\n}\n","/*!\n * mustache.js - Logic-less {{mustache}} templates with JavaScript\n * http://github.com/janl/mustache.js\n */\n\n/*global define: false Mustache: true*/\n\nfunction mustacheFactory(mustache) {\n var objectToString = Object.prototype.toString;\n var isArray =\n Array.isArray ||\n function isArrayPolyfill(object) {\n return objectToString.call(object) === \"[object Array]\";\n };\n\n function isFunction(object) {\n return typeof object === \"function\";\n }\n\n /**\n * More correct typeof string handling array\n * which normally returns typeof 'object'\n */\n function typeStr(obj) {\n return isArray(obj) ? \"array\" : typeof obj;\n }\n\n function escapeRegExp(string) {\n return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\");\n }\n\n /**\n * Null safe way of checking whether or not an object,\n * including its prototype, has a given property\n */\n function hasProperty(obj, propName) {\n return obj != null && typeof obj === \"object\" && propName in obj;\n }\n\n // Workaround for https://issues.apache.org/jira/browse/COUCHDB-577\n // See https://github.com/janl/mustache.js/issues/189\n var regExpTest = RegExp.prototype.test;\n function testRegExp(re, string) {\n return regExpTest.call(re, string);\n }\n\n var nonSpaceRe = /\\S/;\n function isWhitespace(string) {\n return !testRegExp(nonSpaceRe, string);\n }\n\n var entityMap = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n \"/\": \"/\",\n \"`\": \"`\",\n \"=\": \"=\"\n };\n\n function escapeHtml(string) {\n return String(string).replace(/[&<>\"'`=\\/]/g, function fromEntityMap(s) {\n return entityMap[s];\n });\n }\n\n var whiteRe = /\\s*/;\n var spaceRe = /\\s+/;\n var equalsRe = /\\s*=/;\n var curlyRe = /\\s*\\}/;\n var tagRe = /#|\\^|\\/|>|\\{|&|=|!/;\n\n /**\n * Breaks up the given `template` string into a tree of tokens. If the `tags`\n * argument is given here it must be an array with two string values: the\n * opening and closing tags used in the template (e.g. [ \"<%\", \"%>\" ]). Of\n * course, the default is to use mustaches (i.e. mustache.tags).\n *\n * A token is an array with at least 4 elements. The first element is the\n * mustache symbol that was used inside the tag, e.g. \"#\" or \"&\". If the tag\n * did not contain a symbol (i.e. {{myValue}}) this element is \"name\". For\n * all text that appears outside a symbol this element is \"text\".\n *\n * The second element of a token is its \"value\". For mustache tags this is\n * whatever else was inside the tag besides the opening symbol. For text tokens\n * this is the text itself.\n *\n * The third and fourth elements of the token are the start and end indices,\n * respectively, of the token in the original template.\n *\n * Tokens that are the root node of a subtree contain two more elements: 1) an\n * array of tokens in the subtree and 2) the index in the original template at\n * which the closing tag for that section begins.\n */\n function parseTemplate(template, tags) {\n if (!template) return [];\n\n var sections = []; // Stack to hold section tokens\n var tokens = []; // Buffer to hold the tokens\n var spaces = []; // Indices of whitespace tokens on the current line\n var hasTag = false; // Is there a {{tag}} on the current line?\n var nonSpace = false; // Is there a non-space char on the current line?\n\n // Strips all whitespace tokens array for the current line\n // if there was a {{#tag}} on it and otherwise only space.\n function stripSpace() {\n if (hasTag && !nonSpace) {\n while (spaces.length) delete tokens[spaces.pop()];\n } else {\n spaces = [];\n }\n\n hasTag = false;\n nonSpace = false;\n }\n\n var openingTagRe, closingTagRe, closingCurlyRe;\n function compileTags(tagsToCompile) {\n if (typeof tagsToCompile === \"string\")\n tagsToCompile = tagsToCompile.split(spaceRe, 2);\n\n if (!isArray(tagsToCompile) || tagsToCompile.length !== 2)\n throw new Error(\"Invalid tags: \" + tagsToCompile);\n\n openingTagRe = new RegExp(escapeRegExp(tagsToCompile[0]) + \"\\\\s*\");\n closingTagRe = new RegExp(\"\\\\s*\" + escapeRegExp(tagsToCompile[1]));\n closingCurlyRe = new RegExp(\n \"\\\\s*\" + escapeRegExp(\"}\" + tagsToCompile[1])\n );\n }\n\n compileTags(tags || mustache.tags);\n\n var scanner = new Scanner(template);\n\n var start, type, value, chr, token, openSection;\n while (!scanner.eos()) {\n start = scanner.pos;\n\n // Match any text between tags.\n value = scanner.scanUntil(openingTagRe);\n\n if (value) {\n for (var i = 0, valueLength = value.length; i < valueLength; ++i) {\n chr = value.charAt(i);\n\n if (isWhitespace(chr)) {\n spaces.push(tokens.length);\n } else {\n nonSpace = true;\n }\n\n tokens.push([\"text\", chr, start, start + 1]);\n start += 1;\n\n // Check for whitespace on the current line.\n if (chr === \"\\n\") stripSpace();\n }\n }\n\n // Match the opening tag.\n if (!scanner.scan(openingTagRe)) break;\n\n hasTag = true;\n\n // Get the tag type.\n type = scanner.scan(tagRe) || \"name\";\n scanner.scan(whiteRe);\n\n // Get the tag value.\n if (type === \"=\") {\n value = scanner.scanUntil(equalsRe);\n scanner.scan(equalsRe);\n scanner.scanUntil(closingTagRe);\n } else if (type === \"{\") {\n value = scanner.scanUntil(closingCurlyRe);\n scanner.scan(curlyRe);\n scanner.scanUntil(closingTagRe);\n type = \"&\";\n } else {\n value = scanner.scanUntil(closingTagRe);\n }\n\n // Match the closing tag.\n if (!scanner.scan(closingTagRe))\n throw new Error(\"Unclosed tag at \" + scanner.pos);\n\n token = [type, value, start, scanner.pos];\n tokens.push(token);\n\n if (type === \"#\" || type === \"^\") {\n sections.push(token);\n } else if (type === \"/\") {\n // Check section nesting.\n openSection = sections.pop();\n\n if (!openSection)\n throw new Error('Unopened section \"' + value + '\" at ' + start);\n\n if (openSection[1] !== value)\n throw new Error(\n 'Unclosed section \"' + openSection[1] + '\" at ' + start\n );\n } else if (type === \"name\" || type === \"{\" || type === \"&\") {\n nonSpace = true;\n } else if (type === \"=\") {\n // Set the tags for the next time around.\n compileTags(value);\n }\n }\n\n // Make sure there are no open sections when we're done.\n openSection = sections.pop();\n\n if (openSection)\n throw new Error(\n 'Unclosed section \"' + openSection[1] + '\" at ' + scanner.pos\n );\n\n return nestTokens(squashTokens(tokens));\n }\n\n /**\n * Combines the values of consecutive text tokens in the given `tokens` array\n * to a single token.\n */\n function squashTokens(tokens) {\n var squashedTokens = [];\n\n var token, lastToken;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n token = tokens[i];\n\n if (token) {\n if (token[0] === \"text\" && lastToken && lastToken[0] === \"text\") {\n lastToken[1] += token[1];\n lastToken[3] = token[3];\n } else {\n squashedTokens.push(token);\n lastToken = token;\n }\n }\n }\n\n return squashedTokens;\n }\n\n /**\n * Forms the given array of `tokens` into a nested tree structure where\n * tokens that represent a section have two additional items: 1) an array of\n * all tokens that appear in that section and 2) the index in the original\n * template that represents the end of that section.\n */\n function nestTokens(tokens) {\n var nestedTokens = [];\n var collector = nestedTokens;\n var sections = [];\n\n var token, section;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n token = tokens[i];\n\n switch (token[0]) {\n case \"#\":\n case \"^\":\n collector.push(token);\n sections.push(token);\n collector = token[4] = [];\n break;\n case \"/\":\n section = sections.pop();\n section[5] = token[2];\n collector =\n sections.length > 0\n ? sections[sections.length - 1][4]\n : nestedTokens;\n break;\n default:\n collector.push(token);\n }\n }\n\n return nestedTokens;\n }\n\n /**\n * A simple string scanner that is used by the template parser to find\n * tokens in template strings.\n */\n function Scanner(string) {\n this.string = string;\n this.tail = string;\n this.pos = 0;\n }\n\n /**\n * Returns `true` if the tail is empty (end of string).\n */\n Scanner.prototype.eos = function eos() {\n return this.tail === \"\";\n };\n\n /**\n * Tries to match the given regular expression at the current position.\n * Returns the matched text if it can match, the empty string otherwise.\n */\n Scanner.prototype.scan = function scan(re) {\n var match = this.tail.match(re);\n\n if (!match || match.index !== 0) return \"\";\n\n var string = match[0];\n\n this.tail = this.tail.substring(string.length);\n this.pos += string.length;\n\n return string;\n };\n\n /**\n * Skips all text until the given regular expression can be matched. Returns\n * the skipped string, which is the entire tail if no match can be made.\n */\n Scanner.prototype.scanUntil = function scanUntil(re) {\n var index = this.tail.search(re),\n match;\n\n switch (index) {\n case -1:\n match = this.tail;\n this.tail = \"\";\n break;\n case 0:\n match = \"\";\n break;\n default:\n match = this.tail.substring(0, index);\n this.tail = this.tail.substring(index);\n }\n\n this.pos += match.length;\n\n return match;\n };\n\n /**\n * Represents a rendering context by wrapping a view object and\n * maintaining a reference to the parent context.\n */\n function Context(view, parentContext) {\n this.view = view;\n this.cache = { \".\": this.view };\n this.parent = parentContext;\n }\n\n /**\n * Creates a new context using the given view with this context\n * as the parent.\n */\n Context.prototype.push = function push(view) {\n return new Context(view, this);\n };\n\n /**\n * Returns the value of the given name in this context, traversing\n * up the context hierarchy if the value is absent in this context's view.\n */\n Context.prototype.lookup = function lookup(name) {\n var cache = this.cache;\n\n var value;\n if (cache.hasOwnProperty(name)) {\n value = cache[name];\n } else {\n var context = this,\n names,\n index,\n lookupHit = false;\n\n while (context) {\n if (name.indexOf(\".\") > 0) {\n value = context.view;\n names = name.split(\".\");\n index = 0;\n\n /**\n * Using the dot notion path in `name`, we descend through the\n * nested objects.\n *\n * To be certain that the lookup has been successful, we have to\n * check if the last object in the path actually has the property\n * we are looking for. We store the result in `lookupHit`.\n *\n * This is specially necessary for when the value has been set to\n * `undefined` and we want to avoid looking up parent contexts.\n **/\n while (value != null && index < names.length) {\n if (index === names.length - 1)\n lookupHit = hasProperty(value, names[index]);\n\n value = value[names[index++]];\n }\n } else {\n value = context.view[name];\n lookupHit = hasProperty(context.view, name);\n }\n\n if (lookupHit) break;\n\n context = context.parent;\n }\n\n cache[name] = value;\n }\n\n if (isFunction(value)) value = value.call(this.view);\n\n return value;\n };\n\n /**\n * A Writer knows how to take a stream of tokens and render them to a\n * string, given a context. It also maintains a cache of templates to\n * avoid the need to parse the same template twice.\n */\n function Writer() {\n this.cache = {};\n }\n\n /**\n * Clears all cached templates in this writer.\n */\n Writer.prototype.clearCache = function clearCache() {\n this.cache = {};\n };\n\n /**\n * Parses and caches the given `template` and returns the array of tokens\n * that is generated from the parse.\n */\n Writer.prototype.parse = function parse(template, tags) {\n var cache = this.cache;\n var tokens = cache[template];\n\n if (tokens == null)\n tokens = cache[template] = parseTemplate(template, tags);\n\n return tokens;\n };\n\n /**\n * High-level method that is used to render the given `template` with\n * the given `view`.\n *\n * The optional `partials` argument may be an object that contains the\n * names and templates of partials that are used in the template. It may\n * also be a function that is used to load partial templates on the fly\n * that takes a single argument: the name of the partial.\n */\n Writer.prototype.render = function render(template, view, partials) {\n var tokens = this.parse(template);\n var context = view instanceof Context ? view : new Context(view);\n return this.renderTokens(tokens, context, partials, template);\n };\n\n /**\n * Low-level method that renders the given array of `tokens` using\n * the given `context` and `partials`.\n *\n * Note: The `originalTemplate` is only ever used to extract the portion\n * of the original template that was contained in a higher-order section.\n * If the template doesn't use higher-order sections, this argument may\n * be omitted.\n */\n Writer.prototype.renderTokens = function renderTokens(\n tokens,\n context,\n partials,\n originalTemplate\n ) {\n var buffer = \"\";\n\n var token, symbol, value;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n value = undefined;\n token = tokens[i];\n symbol = token[0];\n\n if (symbol === \"#\")\n value = this.renderSection(token, context, partials, originalTemplate);\n else if (symbol === \"^\")\n value = this.renderInverted(token, context, partials, originalTemplate);\n else if (symbol === \">\")\n value = this.renderPartial(token, context, partials, originalTemplate);\n else if (symbol === \"&\") value = this.unescapedValue(token, context);\n else if (symbol === \"name\") value = this.escapedValue(token, context);\n else if (symbol === \"text\") value = this.rawValue(token);\n\n if (value !== undefined) buffer += value;\n }\n\n return buffer;\n };\n\n Writer.prototype.renderSection = function renderSection(\n token,\n context,\n partials,\n originalTemplate\n ) {\n var self = this;\n var buffer = \"\";\n var value = context.lookup(token[1]);\n\n // This function is used to render an arbitrary template\n // in the current context by higher-order sections.\n function subRender(template) {\n return self.render(template, context, partials);\n }\n\n if (!value) return;\n\n if (isArray(value)) {\n for (var j = 0, valueLength = value.length; j < valueLength; ++j) {\n buffer += this.renderTokens(\n token[4],\n context.push(value[j]),\n partials,\n originalTemplate\n );\n }\n } else if (\n typeof value === \"object\" ||\n typeof value === \"string\" ||\n typeof value === \"number\"\n ) {\n buffer += this.renderTokens(\n token[4],\n context.push(value),\n partials,\n originalTemplate\n );\n } else if (isFunction(value)) {\n if (typeof originalTemplate !== \"string\")\n throw new Error(\n \"Cannot use higher-order sections without the original template\"\n );\n\n // Extract the portion of the original template that the section contains.\n value = value.call(\n context.view,\n originalTemplate.slice(token[3], token[5]),\n subRender\n );\n\n if (value != null) buffer += value;\n } else {\n buffer += this.renderTokens(\n token[4],\n context,\n partials,\n originalTemplate\n );\n }\n return buffer;\n };\n\n Writer.prototype.renderInverted = function renderInverted(\n token,\n context,\n partials,\n originalTemplate\n ) {\n var value = context.lookup(token[1]);\n\n // Use JavaScript's definition of falsy. Include empty arrays.\n // See https://github.com/janl/mustache.js/issues/186\n if (!value || (isArray(value) && value.length === 0))\n return this.renderTokens(token[4], context, partials, originalTemplate);\n };\n\n Writer.prototype.renderPartial = function renderPartial(\n token,\n context,\n partials\n ) {\n if (!partials) return;\n\n var value = isFunction(partials) ? partials(token[1]) : partials[token[1]];\n if (value != null)\n return this.renderTokens(this.parse(value), context, partials, value);\n };\n\n Writer.prototype.unescapedValue = function unescapedValue(token, context) {\n var value = context.lookup(token[1]);\n if (value != null) return value;\n };\n\n Writer.prototype.escapedValue = function escapedValue(token, context) {\n var value = context.lookup(token[1]);\n if (value != null) return mustache.escape(value);\n };\n\n Writer.prototype.rawValue = function rawValue(token) {\n return token[1];\n };\n\n mustache.name = \"mustache.js\";\n mustache.version = \"2.2.1\";\n mustache.tags = [\"{{\", \"}}\"];\n\n // All high-level mustache.* functions use this writer.\n var defaultWriter = new Writer();\n\n /**\n * Clears all cached templates in the default writer.\n */\n mustache.clearCache = function clearCache() {\n return defaultWriter.clearCache();\n };\n\n /**\n * Parses and caches the given template in the default writer and returns the\n * array of tokens it contains. Doing this ahead of time avoids the need to\n * parse templates on the fly as they are rendered.\n */\n mustache.parse = function parse(template, tags) {\n return defaultWriter.parse(template, tags);\n };\n\n /**\n * Renders the `template` with the given `view` and `partials` using the\n * default writer.\n */\n mustache.render = function render(template, view, partials) {\n if (typeof template !== \"string\") {\n throw new TypeError(\n 'Invalid template! Template should be a \"string\" ' +\n 'but \"' +\n typeStr(template) +\n '\" was given as the first ' +\n \"argument for mustache#render(template, view, partials)\"\n );\n }\n\n return defaultWriter.render(template, view, partials);\n };\n\n // This is here for backwards compatibility with 0.4.x.,\n /*eslint-disable */ // eslint wants camel cased function name\n mustache.to_html = function to_html(template, view, partials, send) {\n /*eslint-enable*/\n\n var result = mustache.render(template, view, partials);\n\n if (isFunction(send)) {\n send(result);\n } else {\n return result;\n }\n };\n\n // Export the escaping function so that the user may override it.\n // See https://github.com/janl/mustache.js/issues/244\n mustache.escape = escapeHtml;\n\n // Export these mainly for testing, but also for advanced usage.\n mustache.Scanner = Scanner;\n mustache.Context = Context;\n mustache.Writer = Writer;\n}\n\nlet Mustache = {};\n\nmustacheFactory(Mustache);\n\nexport default Mustache;\nexport { Mustache };\n","/* disclaimer-link:\n *\n * Add a \"disclaimer declaration\" button which\n * will toggle a pop-up info box.\n *\n * Author: Tim Bauwens\n * Copyright 2019 Berkeley Bridge\n *\n */\nimport { escapeHTML } from \"$json/lib/escape\";\nimport { converter } from \"$md-converter\";\n\n(function ($, win, doc) {\n const disclaimers = {\n a: `We hebben ons best gedaan om de teksten van deze Regelhulp zo begrijpelijk mogelijk op te schrijven.\n De teksten van deze Regelhulp geven u geen rechten.`,\n b: `Let op: deze tool is mede door het Servicecentrum Regelhulpen van RVO ontwikkeld als hulpmiddel.\n U kunt geen rechten ontlenen aan de teksten en de uitkomsten van deze Regelhulp.\n RVO en/of de eigenaar van de tool zijn niet verantwoordelijk voor de inhoud van externe\n websites waarnaar de uitkomsten verwijzen. Ook bieden de uitkomsten geen garantie voor bijvoorbeeld een indiening.\n De antwoorden die u geeft en de gegevens die u via de tool krijgt, zijn voor uw eigen gebruik.\n RVO en/of de eigenaar van de Regelhulp registreren alleen hoe vaak een tool wordt gebruikt.`\n };\n\n var models = {\n efactureren: {\n mdable: false,\n text: disclaimers.a\n },\n einvoice: {\n mdable: false,\n text: `We have tried to make the texts of this Guide as comprehensive as possible. These texts do not grant you any rights.`\n },\n internationaalmkb: {\n mdable: false,\n text: `We hebben ons best gedaan om de inhoud en\n de teksten van deze Regelhulp zo volledig en begrijpelijk mogelijk op te schrijven.\n U kunt geen rechten ontlenen aan de teksten en adviezen van de Exportwijzer.`\n },\n xpw20: {\n mdable: false,\n text: `We hebben ons best gedaan om de inhoud en\n de teksten van deze Regelhulp zo volledig en begrijpelijk mogelijk op te schrijven.\n U kunt geen rechten ontlenen aan de teksten en adviezen van de Exportwijzer.`\n },\n rie: {\n mdable: false,\n text: `We hebben ons best gedaan om de inhoud en\n de teksten van deze Regelhulp zo volledig en begrijpelijk mogelijk op te schrijven.\n U kunt geen rechten ontlenen aan de teksten en adviezen van Regelhulp RI&E.`\n },\n betrouwbaarheidsniveau_digitale_dienstverlening: {\n mdable: false,\n text: `Begin juli 2020 is de conceptregeling betrouwbaarheidsniveaus WDO in consultatie gegaan.\n De teksten van deze regelhulp zijn hier nog niet op gebaseerd.\n De teksten van deze Regelhulp geven u geen rechten.`\n },\n kringloopscan: {\n mdable: false,\n text: disclaimers.a\n },\n e_besparing: {\n mdable: false,\n text: `We hebben ons best gedaan om de teksten van de Wetchecker Energiebesparing zo\n begrijpelijk mogelijk op te schrijven. Aan de teksten en resultaten uit deze Regelhulp kunt u geen rechten ontlenen.`\n },\n regelhulpchina: {\n mdable: false,\n text: disclaimers.a\n },\n ics: {\n mdable: false,\n text: disclaimers.a\n },\n risicoklasseindeling_digitaleveiligheid: {\n mdable: false,\n text: disclaimers.a\n },\n regelhulpinternationalefinanciering: {\n mdable: false,\n text: disclaimers.b\n },\n regelhulpmest: {\n mdable: false,\n text: disclaimers.b\n },\n vastgoed_transformatie: {\n mdable: false,\n text: disclaimers.b\n },\n wbso: {\n mdable: false,\n text: disclaimers.b\n },\n IE_calculator: {\n mdable: false,\n text: disclaimers.b\n },\n ie_calculator: {\n mdable: false,\n text: disclaimers.b\n },\n regelhulpbetrouwbaarheidniveaus: {\n mdable: true,\n text: `\n\n - Deze regelhulp helpt u het best passende betrouwbaarheidsniveau te kiezen voor de toegang tot uw digitale dienst(en). U bent zelf verantwoordelijk voor de beoordeling van de risico’s en de uiteindelijke keuze. Ook kunt u geen rechten ontlenen aan het invullen van een regelhulp.\n - Het ministerie van Binnenlandse Zaken en Koninkrijksrelaties is niet verantwoordelijk voor de inhoud van externe websites waarnaar deze regelhulp verwijst.\n - De antwoorden die u geeft en de uitkomst die u van de regelhulp krijgt, zijn bestemd voor uw eigen gebruik. Het ministerie van Binnenlandse Zaken en Koninkrijksrelaties registreert alleen hoe vaak de regelhulp wordt gebruikt.\n\n `\n }\n };\n\n var closeinfo = function () {\n try {\n window.location.assign(\"#\");\n } catch (e) {\n window.console && window.console.log(e);\n }\n };\n\n $(doc).ready(function () {\n $(doc).on(\"bb:postHandleData\", function (e, data) {\n if (data && data.modelname) {\n if (Object.keys(models).indexOf(data.modelname) > -1) {\n $(\".p-disclaimer-link\").removeAttr(\"hidden\");\n if (models[data.modelname].mdable) {\n doc.querySelector(\".p-disclaimer-text\").innerHTML =\n converter.makeHtml(\n escapeHTML(models[data.modelname].text),\n false\n );\n } else {\n $(\".p-disclaimer-text\").text(models[data.modelname].text);\n }\n } else {\n $(\".p-disclaimer-link\").attr(\"hidden\", true);\n }\n }\n });\n\n $(doc).on(\"click\", \"#disclaimer-info\", function (e) {\n if ($(e.target).attr(\"id\") === \"disclaimer-info\") {\n closeinfo();\n }\n });\n\n $(doc).on(\"keydown\", function (e) {\n if ($(\"#disclaimer-info\").is(\":visible\")) {\n switch (e.which) {\n case 13:\n case 27:\n closeinfo();\n break;\n default:\n break;\n }\n }\n });\n });\n})(jQuery, window, document);\n","import { clearMenu } from \"./clearmenu.js\";\nimport { state } from \"$json/lib/store\";\nimport Dialogue from \"$Dialogue\";\n\nconst show = new Dialogue();\nconst done = new Event(\"dmi-complete\");\n\nfunction htmlDecode(input) {\n var doc = new DOMParser().parseFromString(input, \"text/html\");\n return doc.documentElement.textContent;\n}\n\nexport function createMenu() {\n clearMenu();\n let items = state.has(\"p-dynamic-menu\") ? state.get(\"p-dynamic-menu\") : {};\n\n function showtime(e) {\n let info = document.createElement(\"div\");\n let html = items[e.target.getAttribute(\"data-textid\")];\n info.innerHTML = htmlDecode(html);\n show.render(info);\n }\n\n Object.keys(items).forEach(title => {\n let item = document.createElement(\"li\");\n item.className = \"p-dynamic-menu-item\";\n let button = document.createElement(\"button\");\n button.innerText = title;\n button.setAttribute(\"data-textid\", title);\n item.append(button);\n try {\n let menuItem = item.cloneNode(true);\n menuItem.querySelector(\"button\").addEventListener(\"click\", showtime);\n document.getElementById(\"p-dynamic-menu\").append(menuItem);\n // Support class based for duplicate menus.\n document.querySelectorAll(\".p-dynamic-menu\").forEach(menu => {\n let menuItem = item.cloneNode(true);\n menuItem.querySelector(\"button\").addEventListener(\"click\", showtime);\n menu.append(menuItem);\n });\n } catch (err) {\n window.console &&\n window.console.warn(`\n Seems like the layer doesn't support dynamic-menu...\n Please make sure that the top menu (UL) has [id|class]=\"p-dynamic-menu\"\n `);\n window.console && window.console.warn(err);\n }\n });\n document.dispatchEvent(done);\n}\n","/*\n dynamic-menu-items.js\n\n Based on text-interfaces inside models, create\n menu items in the top menu with popups containing\n the content from the model.\n*/\n\nimport { state } from \"$json/lib/store\";\nimport { clearMenu } from \"./clearmenu.js\";\nimport { createMenu } from \"./createmenu.js\";\nimport { getmetadata } from \"$json/lib/getmetadata\";\n\n((doc, $) => {\n let render = false;\n var items = {};\n var session = false;\n\n var escape = document.createElement(\"textarea\");\n function escapeHTML(html) {\n escape.textContent = html;\n return escape.innerHTML;\n }\n\n $(doc).on(\"bb:finalHandleData\", (e, data) => {\n if (data && data.groups && data.groups.length) {\n if (session && session !== data.sessionid) {\n clearMenu();\n items = {};\n }\n session = data.sessionid;\n const controls = getmetadata(data).controls;\n controls.forEach((props, id) => {\n Object.keys(props).forEach(key => {\n if (key.startsWith(\"dmi-\")) {\n let elem = doc.getElementById(id[0]);\n items[props[key]] = escapeHTML(elem.outerHTML);\n elem.style.display = \"none\";\n render = true;\n }\n });\n });\n }\n if (render) {\n state.set(\"p-dynamic-menu\", items);\n render = false;\n createMenu();\n }\n if (data && data.models) {\n clearMenu();\n items = {};\n }\n if (data && data.status && data.status === \"logout successful\") {\n clearMenu();\n items = {};\n }\n });\n\n $(doc).on(\"bb:stateChange\", e => {\n if (state.has(\"p-dynamic-menu\")) {\n // Only recreate the menu if the state doesn't match what we already have.\n if (\n JSON.stringify(items) !== JSON.stringify(state.get(\"p-dynamic-menu\"))\n ) {\n items = state.get(\"p-dynamic-menu\");\n createMenu();\n }\n }\n });\n})(document, jQuery);\n","import { bb } from \"$json\";\nimport { has } from \"$json/lib/functional\";\nimport { getmetadata } from \"$json/lib/getmetadata\";\n\n((doc, $) => {\n let id = \"\";\n let current = \"\";\n window.mopinionNodeName = \"\";\n var js = document.createElement(\"script\");\n js.setAttribute(\"type\", \"text/javascript\");\n js.setAttribute(\"src\", \"//deploy.mopinion.com/js/pastease.js\");\n js.async = true;\n document.getElementsByTagName(\"head\")[0].appendChild(js);\n\n function kill() {\n current = \"\";\n\n let mopinion = doc.getElementById(\"surveyContent\");\n mopinion && mopinion.parentNode.removeChild(mopinion);\n\n let mopinionMask = doc.getElementById(\"surveyMask\");\n mopinionMask && mopinionMask.parentNode.removeChild(mopinionMask);\n\n let mopinionModal = doc.querySelector(\".mopinion-survey-content\");\n mopinionModal && mopinionModal.parentNode.removeChild(mopinionModal);\n\n let headscript = doc.getElementById(\"mopinionFeedbackScript\");\n headscript && doc.head.removeChild(headscript);\n }\n\n $(doc).on(\"bb:preHandleData\", (e, data) => {\n if (data && has(\"modelname\", data)) {\n if (current !== data.modelname) {\n if (current !== \"\") kill();\n current = data.modelname;\n\n var arbitrary = bb.propFinder(bb.conf, \"arbitrary\");\n var config = arbitrary(\"mopinion\", {});\n if (config && has(data.modelname, config)) {\n id = config[data.modelname].id;\n let t = setInterval(() => {\n try {\n Pastease.load(id);\n clearInterval(t);\n } catch (e) {}\n }, 50);\n }\n }\n } else if (data && has(\"models\", data)) {\n kill();\n }\n });\n\n $(doc).on(\"bb:finalHandleData\", (e, data) => {\n if (data && data.groups && data.groups.length) {\n let selected = doc.querySelector(\"fieldset.group.selected\");\n window.mopinionNodeName = selected.dataset.node;\n const md = getmetadata(data).props;\n if (md.has(\"p-mopinion-trigger-show\")) {\n window.showMopinion = true;\n kill();\n if (has(\"config\")(Pastease)) {\n Pastease.config(id);\n window.setTimeout(e => (window.showMopinion = false), 1e4);\n }\n }\n }\n });\n})(document, jQuery);\n","import { bb } from \"$json\";\n\nvar arbitrary = bb.propFinder(bb.conf, \"arbitrary\");\n/**\n * Get the part of pathname with which we can match our model,\n * case-insensitively\n *\n * @param {String} pathname\n *\n * @return {String} (when found)\n * @return {undefined} (when not found)\n */\nfunction getIdentifyingPartOfPath(pathname) {\n var chunks = pathname.split(\"/\"),\n path,\n i = 0;\n while (\n ((path = chunks.pop()), typeof path !== undefined && /(\\.|^$)/.test(path))\n );\n return (path && path.toLowerCase()) || arbitrary(\"proxymap.default\");\n}\n\n/**\n * Export the Usabilla function\n */\n\nexport function getSetting(key, fallback) {\n return arbitrary(\n [\"proxymap\", getIdentifyingPartOfPath(window.location.pathname), key]\n .filter(Boolean)\n .join(\".\"),\n fallback\n );\n}\n\nexport function getProxyString() {\n return getIdentifyingPartOfPath(window.location.pathname);\n}\n","import { bb } from \"$json\";\nimport { getSetting, getProxyString } from \"$proxymap\";\nimport { notify } from \"$json/lib/notify\";\n\n/* path-to-modelname:\n *\n * Open modelname based on path.\n *\n * This allows bookmarking and nice links\n *\n * Author: Niels Giesen\n * Copyright 2016, 2018 Berkeley Bridge\n *\n */\n(function ($, window, doc, location) {\n var props = bb.propFinder(bb.conf, \"arbitrary.path-to-modelname\");\n\n if (!location.origin) {\n location.origin =\n location.protocol +\n \"//\" +\n location.hostname +\n (location.port ? \":\" + location.port : \"\");\n }\n\n function open() {\n /*\n Calling 'getSetting' with empty key results in\n full proxymap object. With this we can loop\n through all additional props as query params.\n Not only modelname.\n */\n // var modelname = getSetting(\"modelname\");\n var params = getSetting(\"\", {});\n var postdata = {\n url: \"open\",\n data: {\n fmt: \"json\"\n }\n };\n Object.keys(params).forEach(param => {\n postdata.data[param] = params[param];\n });\n\n if (postdata.data.modelname) {\n bb.ajax.post(postdata);\n document.body.setAttribute(\"data-p-path-to-modelname\", getProxyString());\n } else {\n notify({ html: true, keepalive: true }, props(\"notfoundthen.message\"));\n }\n }\n\n function getState() {\n return (\n window.history &&\n window.history.pushState &&\n (window.history.state ||\n (window.sessionStorage &&\n \"JSON\" in window &&\n JSON.parse(window.sessionStorage.getItem(\"state\"))))\n );\n }\n\n function directory(loc) {\n return loc.origin + loc.pathname.replace(/[^/]+$/, \"\");\n }\n\n function hasOurState() {\n var state = getState();\n if (!state) return false;\n else return directory(location) === state.directory;\n }\n\n if (\n (location.pathname.match(/\\/$/) || location.search.length === 0) &&\n !hasOurState()\n ) {\n $(open);\n } else {\n $(doc).one(\"bb:postHandleData\", function (event, data) {\n if (\n (data && data.error && data.error.summary) ||\n (data && data.groups && !data.groups.length)\n ) {\n open();\n }\n });\n }\n})(jQuery, window, document, window.location);\n","import { bb } from \"$json\";\n// import { has } from \"$json/functional.js\";\nimport { getSetting } from \"$proxymap\";\n\nvar arbitrary = bb.propFinder(bb.conf, \"arbitrary\");\n\nfunction piwik(config) {\n let dataLayerName = `dataLayer`;\n (window[dataLayerName] = window[dataLayerName] || []),\n window[dataLayerName].push({\n start: new Date().getTime(),\n event: \"stg.start\"\n });\n var scripts = document.getElementsByTagName(\"script\")[0],\n tags = document.createElement(\"script\");\n function stgCreateCookie(a, b, c) {\n var d = \"\";\n var f = \"\";\n if (c) {\n var e = new Date();\n e.setTime(e.getTime() + 24 * c * 60 * 60 * 1e3),\n (d = \"; expires=\" + e.toUTCString());\n f = \"; SameSite=Strict\";\n }\n document.cookie = a + \"=\" + b + d + f + \"; path=/\";\n }\n var isStgDebug =\n (window.location.href.match(\"stg_debug\") ||\n document.cookie.match(\"stg_debug\")) &&\n !window.location.href.match(\"stg_disable_debug\");\n stgCreateCookie(\"stg_debug\", isStgDebug ? 1 : \"\", isStgDebug ? 14 : -1);\n var qP = [];\n dataLayerName !== \"dataLayer\" && qP.push(\"data_layer_name=\" + dataLayerName),\n isStgDebug && qP.push(\"stg_debug\");\n var qPString = qP.length > 0 ? \"?\" + qP.join(\"&\") : \"\";\n (tags.async = !0),\n (tags.src = config.endpoint + config.code + \".js\" + qPString),\n scripts.parentNode.insertBefore(tags, scripts);\n !(function (a, n, i) {\n a[n] = a[n] || {};\n for (var c = 0; c < i.length; c++)\n !(function (i) {\n (a[n][i] = a[n][i] || {}),\n (a[n][i].api =\n a[n][i].api ||\n function () {\n var a = [].slice.call(arguments, 0);\n \"string\" == typeof a[0] &&\n window[dataLayerName].push({\n event: n + \".\" + i + \":\" + a[0],\n parameters: [].slice.call(arguments, 1)\n });\n });\n })(i[c]);\n })(window, \"ppms\", [\"tm\", \"cm\"]);\n}\n\n// The default config:\nvar config = {\n code: \"4d5a6a18-a5ab-4a62-a33c-1299d0d988b9\",\n endpoint: \"//statistiek.rvo.nl/containers/\"\n};\n\n// Override per config fallback.\nvar fallback = arbitrary(\"piwik.fallback\", false);\nif (fallback) {\n config = Object.assign(config, fallback);\n}\n\n// Override per proxymapped model.\nvar modelSpecific = getSetting(\"piwik\", false);\nif (modelSpecific) {\n config = Object.assign(config, modelSpecific);\n}\n\npiwik(config);\n","/* rijksoverheidshuisstijlfonts:\n *\n * Supply Rijksoverheidshuisstijl fonts + definitions\n *\n * Author: Niels Giesen\n * Copyright 2017 Berkeley Bridge\n *\n */\n(function ($, win, doc) {\n $(function () {});\n})(jQuery, window, document);\n","import { bb } from \"$json\";\n/* questionlabelgroup-ng:\n *\n * Next-generation questionlabelgroup plugin.\n *\n * It will eventually probably replace the default implementation.\n *\n * Author: Niels Giesen\n * Copyright 2013 Berkeley Bridge\n *\n */\n(function ($) {\n $(document).off(\"bb:questionlabelgroup\");\n\n bb.questionlabelgroup = function () {\n $(\".group:not(:has(.bb-questionlabelgroup))>.bb-label\").each(function () {\n var $this = $(this),\n input = $this.prev(\"[type=checkbox]\"),\n itype,\n control = $(this).data(\"control\"),\n fieldset =\n bb.conf.a11y.optionfieldsets && control.controltype === \"legend\",\n $inner,\n $outer,\n classNames;\n\n if (!input.length)\n input = $this.nextUntil(\n \".bb-label, .bb-text, a, [type=checkbox], img, .clearfix,\" +\n \"*[data-datatype]+ul\" +\n (bb.conf.a11y.captions ? \", table\" : \"\")\n );\n\n itype = input.data(\"type\");\n $inner = $this.add(input);\n\n $outer = $(document.createElement(fieldset ? \"fieldset\" : \"div\"));\n\n if ($inner.length > 1) {\n classNames = [\n \"bb-questionlabelgroup\",\n \"bb-itype-\" + itype,\n \"bb-fields-\" + $inner.length\n ];\n\n // Direct children\n $.each($inner.filter(\"[data-type]\"), function () {\n var $this = $(this);\n if ($this.attr(\"class\")) {\n var classname = $this.attr(\"class\").match(/\\bbbm-[a-z0-9-]+\\b/);\n if (classname) {\n classname = classname[0].replace(/\\bbbm-/, \"bb-g-\");\n classNames.push(classname);\n }\n }\n });\n\n // Further offspring\n $.each($inner.find(\"[data-type]\"), function () {\n var $this = $(this);\n if ($this.attr(\"class\")) {\n var classname = $this.attr(\"class\").match(/\\bbbm-[a-z0-9-]+\\b/);\n if (classname) {\n classname = classname[0].replace(/\\bbbm-/, \"bb-g-\");\n classNames.push(classname);\n }\n }\n });\n\n // Propagate tags of immediate children to $outer\n $.each($inner, function (_, elt) {\n $.each($(elt).data(\"tags\") || [], function (_, tag) {\n classNames.push(\"bb-child-tagged-\" + tag);\n });\n });\n\n $outer.addClass(classNames.join(\" \"));\n $inner.wrapAll($outer);\n }\n });\n };\n})(jQuery);\n"],"names":["jQuery","$","datepicker","regional","nl","closeText","prevText","nextText","currentText","monthNames","monthNamesShort","dayNames","dayNamesShort","dayNamesMin","weekHeader","dateFormat","firstDay","isRTL","showMonthAfterYear","yearSuffix","setDefaults","dicts","dict","_","s","fb","tagged","strings","values","reduce","acc","cur","idx","taggedWithin","prefix","set","ob","lang","key","val","Object","entries","addTranslations","translations","term","hasOwnProperty","freeze","new","Delete","case","cases","created","report","Sun","Mon","Tue","Wed","Thu","Fri","Sat","Jan","Feb","Mar","Apr","May","June","July","Aug","Sep","Oct","Nov","Dec","Yesterday","Feedback","send","cUMWrongUserNamePassword","cWebCaseIsRunning","cWebIllegalAccess","password","load","open","copy","__digitgroupingchar__","__radixpoint__","__digitgroupingrules__","attachments","dateplaceholder","cancel","self","window","URLSearchParams","plus","get","q","toString","String","isArray","create","defineProperty","find","findPercentSign","replace","proto","append","value","appendTo","this","_ungap","delete","has","getAll","slice","forEach","callback","thisArg","invoke","call","toJSON","query","encoded","encode","i","length","push","join","prototype","configurable","writable","charAt","pairs","split","index","indexOf","decode","addEach","res","str","decodeURIComponent","encodeURIComponent","replacer","match","Array","positionalFormat","args","arguments","num","undefined","parseInt","format","sub","URLSearchParamsProto","iterable","Symbol","iterator","o_O","items","next","shift","done","names","name","keys","sort","entry","dP","gOPD","getOwnPropertyDescriptor","updateSearchParams","sp","_usp","search","verifySearchParams","obj","Class","TypeError","upgradeClass","createSearchParams","polluteSearchParams","ClassProto","searchParams","href","del","createSearchParamsPollute","defineProperties","_searchParams","HTMLAnchorElement","test","URL","meh","formatPlus","CODES","cException","cHTMLFormLoadCaseNotFound","cHTMLMenuFileNotFound","cWebModelIDDifferent","cWebPleaseLogin","cGetFileNotAllowed","cGetDocumentNotFound","cWebSessionTimeOut","cWebNoModelID","cWebModelNotFound","cEngineLoadCaseFailed","cEngineUpgrading","cEngineNoInterfacesToShow","cEngineLoadCaseFailedNotFound","cEngineLoadCaseFailedWrongType","cEngineLoadCaseFailedWrongData","cWebOpenIsCalledWithUniqueID","cTechGraphVizNotInstalled","cGraphVizSessionNotFound","cUMUserNotFound","cUMModelNotFound","cUMCaseNotFound","cWebAdminNotAllowed","cEngineGotoNodeFailed","cPreviewNoCaseFound","cTechUploadedFileToLarge","cWebSaveCaseNotAllowed","cWebSaveCaseFailed","cInvalidUpload","CODESREV","fromEntries","map","_token","tokenChannel","BroadcastChannel","token","addEventListener","removeEventListener","getHash","async","message","msgUint8","TextEncoder","hashBuffer","crypto","subtle","digest","from","Uint8Array","b","padStart","digestMessage","setToken","postMessage","then","tokenHash","tokenize","parse$1","rules","input","tokenized","regex","exec","type","rest","Error","JSON","stringify","tokenizer","parse","ast","parents","Number","parentAst","pop","Identity","x","fn","Const","lens","getter","setter","functor","target","focus","over","view","_apply","dec","arg","identity","isNil","not","a","pipe","fns","compose","reduceRight","curry","args2","sep","arr","reverse","always","F","T","propOr","or","prop","ifElse","pathOr","pathArg","path","tail","_nth","head","cond","choose","_uniqBy","_has","uniqBy","_equals","any","_findIndex","findIndex","_eqBy","_all","_append","_test","string","_match","a_value","b_value","equals","_eqProps","_hasPath","p","_assoc","result","_assocPath","nextObj","isInteger","assocPath","concat","assoc","_consume","argN","_propEq","_pathSatisfies","_pathEq","complement","_tryCatch","tryer","catcher","e","_filter","filter","_when","predicate","whenTrueFn","_ifElse","whenFalseFn","_either","fn1","fn2","_allPass","mem","_both","_complement","_includes","item","c","includes","_lte","first","second","_lt","_gte","_gt","_tap","_groupWith","_groupBy","lensProp","_omit","props","_pickBy","pred","k","_pick","_pickAll","_dissoc","_mergeRight","ob1","ob2","assign","_mergeLeft","_strictWithout","list","_unary","_binary","arg1","arg2","_slice","to","_is","Ctor","constructor","toLower","toLowerCase","toUpper","toUpperCase","_applySpec","specs","Function","out","all","n","promise","Promise","resolve","apply","anyPass","both","chain","f","g","list1","list2","Set","s1","s2","add","dissoc","hasPath","juxt","propEq","when","either","allPass","infichain","rest1","mergeLeft","pathEq","gt","into","groupWith","tap","Lenses.lens","Lenses.over","Lenses.set","Lenses.view","lensPath","stringSaysDo","bucket","astSaysDo","L.compose","L.all","L.tail","L.any","L.not","BooleanBucket","booleans","toggle","unset","bool","Mode","mode","reflect","console","warn","changedOrAdded","bool2","super","document","trigger","toggleClass","querySelectorAll","elt","hidden","hideWhen","dataset","ATTR_SNAME","ATTR_SVALUE","INPUT_SELECTOR","joiner","inputsOf","container","isEmptyRadioValue","isEmptyCheckboxValue","isCheckedCheckboxValue","collectWithin","params","flavor","querySelector","omitFn","changeFn","collector","nodeList","node","valueOf","getAttribute","_collectAll","hasAttribute","checked","serializeQuestions","_vars","SESSION_KEYS","NAV_KEYS","setValueInVars","data","getVar","extend","collect","FormData","Vars","querify","setVars","version","unsetVars","shouldExit","Boolean","onEnd","navigator","sendBeacon","usp","setKeyboardUser","setMouseUser","openingMatch","mouse","opener","body","className","on","matches","A11y","logdiv","getElementById","innerHTML","observeDatepickers","init","picker","MutationObserver","records","instance","infocus","activeElement","text","observe","attributes","escapeHTML","entityMap","re","RegExp","notify","options","keepalive","html","notification","error","area","textContent","setTimeout","bind","propFinder","fallback","leafs","leaf","conf","a11y","captions","optionfieldsets","strictlegends","fromApiServer","startsWith","apiserver","Ajax","busy","last","direction","defaultOptions","dataType","url","cache","success","checkJSON","err","release","responseText","statusText","trim","post","_options","ajax","abort","postJSON","stopDispatches","awaiting","status","req","responseJSON","setSettled","BBI","redirect_uri","location","pathname","template","returnurl","origin","param","bbis","server","extraparams","authid","state","stage","parseQuery","fmt","authenticate","isVisible","isLabel","isOption","isLink","isTextual","isPicture","isQuestion","isReadOnly","isValidatable","renderAttribs","attr","fieldDesignators","datetimepicker","numedit","radio","checkmultilist","customlist","combobox","listbox","multilist","fieldKey","controltype","generic","genericQuoted","quotable","Date","toHoursAndMinutes","hours","getHours","minutes","getMinutes","dateTimeRe","pureDateRe","date","parseDate","thing","leadWithZeroes","valueToDate","yyyycleanformat","clean","yearindex","adjustment","year","substr","cutoffyear","_defaults","shortYearCutoff","getYear","century","getFullYear","month","Math","max","dom","setFullYear","setMonth","setDate","getMonth","getDate","onChangeDate","ev","formatDate","humanDate","now","hour0","setHours","hour24","dayinms","thisyear","daysofweek","day","monthsofyear","hm","ms","isToday","isYesterday","isLastWeek","getDay","isThisYear","editPolicy","canEditEarlier","isLabelValueDynamic","preferUpdate","mustUpdate","updateLabels","_Widgets","registerWidget","getWidget","Dynprops","$widget","control","Updates","requestor","oldval","updates","definition","removeData","isForNotNull","placeholder","identifier","visible","removeAttr","setValue","readonly","onreadonly","minimum","maximum","maxlength","addClass","programmatically","removeClass","onrequired","notnull","id","event","CustomEvent","detail","bubbles","dispatchEvent","updateControl","controls","each","$this","update","Hooks","Map","arbitraryCoreProp","wControl","group","wGroup","_group","widget","attribs","enabled","current","$elt","datatype","meta","d","escape","metadata","aria","wdef","tagName","render","_elt","_originalid","autocomplete","hint","dynprops","dynpropsforus","ii","afterRender","prelabel","postlabel","shouldWrap","anchor","wraptag","nodeName","wrapAll","parent","prepend","setAttribute","wrapInlineInput","tag","getControl","listtypes","numofnewlines","subString","pos","step","pathGroup","areOfOneQuestion","isfor","indexOfOrInfinity","Infinity","baseGroup","tailGroup","groupOuter","doGrouping","normalize","GROUPING_CLASS","GROUPING_PREFIX_TYPE","GROUPING_DATA_NAME","GROUPING_DATA_LEVEL","ITEM_PREFIX_AUTHORCLASS","QUESTION_CLASS","QUESTION_PREFIX_TYPE","QUESTION_PREFIX_PROPERTY","QUESTION_DATA_LAYOUT","QUESTION_PREFIX_AUTHORSTYLE","QUESTION_CLASS_NOLABEL","nameDefaults","pathToNames","propArg","doTopLevel","doLegends","getGroupName","questionGroupClass","n.QUESTION_PREFIX_AUTHORSTYLE","extraClasses","areAllInvisible","areAllReadonly","areAllNotNull","updateClassWhen","classList","setReadonlyFGClass","n.GROUPING_PREFIX_TYPE","setEmptyFGClass","setRequiredFGClass","setReadonlyQClass","n.QUESTION_PREFIX_PROPERTY","setEmptyQClass","setRequiredQClass","createFormGroup","level","formGroup","groupName","createElement","n.GROUPING_CLASS","n.GROUPING_DATA_LEVEL","n.GROUPING_DATA_NAME","asciify","createDocumentFragment","cWithin","appendChild","answer","classes","n.QUESTION_CLASS","n.QUESTION_PREFIX_TYPE","n.ITEM_PREFIX_AUTHORCLASS","n.QUESTION_CLASS_NOLABEL","qlg","n.QUESTION_DATA_LAYOUT","_layout","getLayout","t","o","globalThis","trustedTypes","l","createPolicy","createHTML","random","h","r","u","createComment","v","m","y","w","for","A","P","WeakMap","E","createTreeWalker","N","_$litType$","parts","lastIndex","M","el","currentNode","content","firstChild","remove","childNodes","nextNode","nodeType","hasAttributes","getAttributeNames","endsWith","ctor","I","L","R","H","removeAttribute","emptyScript","static","S","_$litDirective$","O","D","creationScope","importNode","C","nextSibling","z","B","setConnected","parentNode","startNode","endNode","insertBefore","previousSibling","createTextNode","V","element","fill","W","capture","once","passive","handleEvent","host","litHtmlPlatformSupport","litHtmlVersions","ShadowRoot","ShadyCSS","nativeShadow","Document","CSSStyleSheet","cssText","styleSheet","replaceSync","adoptedStyleSheets","cssRules","toAttribute","fromAttribute","attribute","converter","hasChanged","HTMLElement","isUpdatePending","hasUpdated","observedAttributes","finalize","elementProperties","noAccessor","getPropertyDescriptor","requestUpdate","enumerable","finalized","getPrototypeOf","properties","getOwnPropertyNames","getOwnPropertySymbols","createProperty","elementStyles","finalizeStyles","styles","flat","unshift","enableUpdating","addController","renderRoot","isConnected","hostConnected","removeController","splice","createRenderRoot","shadowRoot","attachShadow","shadowRootOptions","connectedCallback","disconnectedCallback","hostDisconnected","attributeChangedCallback","K","getPropertyOptions","reject","performUpdate","shouldUpdate","willUpdate","hostUpdate","hostUpdated","firstUpdated","updated","updateComplete","getUpdateComplete","reactiveElementPlatformSupport","ReactiveElement","reactiveElementVersions","litElementVersions","renderOptions","renderBefore","_$litPart$","_$litElement$","litElementHydrateSupport","LitElement","litElementPlatformSupport","Maybe","module","isEmpty","of","getOrElse","Numerals","makeFormatter","radixPoint","groupingChar","groupingRules","_last","_a","makeLastItemRepeater","integralPart","fractionalPart","neg","th","makeParser","thre","testre","parser","formatter","makeParse","refresh","protocol","hostname","port","urlutils","mimetypes","xsl","docx","pdf","odt","rtf","doc","jpg","jpeg","png","isJS","isEmptyish","JSAlertMessage","getFiles","casus","caseReport","mimetype","absoluteURL","filename","ext","disconnectValue","newVal","noAttribs","omitName","omitRequired","emptyTag","setAttribs","valueInside","layout","alt","alttext","src","edit","couldWrap","fixup","isFor","class","_subtype","min","_level","linkClassName","isreport","listlabel","showdown","optionbox","some","selected","option","len","newLen","newOptions","selectedValue","optionElt","removeChild","freetext","size","multiple","optionlist","labelledby","required","disabled","checklist","allowUpdatingSelf","radiolist","closest","serverToWidgetValue","widgetToServerValue","originalreadonly","dynamic","InputEvent","cancelable","hide","validate","spec","UIFormat","mindate","maxdate","errdateinvalid","errrequired","fmindate","fmaxdate","quotableDate","errdatebeforemimimum","errdatenotinrange","errdateaftermaximum","checkDate","getMaxChars","toFixed","precision","maxchars","parseFloat","spinner","errnuminvalid","hasMax","hasMin","errnumnotinrange","errnumnotnegativeorzero","errnumnotnegative","errnumabovemaximum","errnumnotpositiveorzero","errnumnotpositive","errnumbelowminimum","freebox","_realValue","insertAdjacentHTML","noop","label","grid","renderable","addallowed","insertbuttontext","row","offset","showcolumns","deletebuttontext","columns","row_i","cell","cell_i","colname","col","col_i","cells","cellTag","col_id","_rowspan","_cell_index","columnheader","column","header","innerText","colheaderids","rowheaderid","rows","rows_up_to_here","_tag","e_cell","cellSetAttributes","headers","caption","thead","tr","e_body","colheaders","last_spanning_cell_id","e_row","icol","cellWithHeaders","gridAddButton","encodeURI","addbuttontext","e_grid","old","colheader","irow","tBodies","cellInput","oldcell","spot","replaceWith","cellControl","interval","timer","me","$anchor","adjust","diff","parsed","keepAdjusting","hasClass","adjustOnce","stopAdjusting","clearTimeout","keyCode","orgval","$input","after","addButtons","_event","times","integer","repeat","hasselectedbelowlevel","jumplist","hasselectedbelow","ariaCurrentAttrib","chapterDataAttrib","ischapter","chapterstatus","bakeInnerList","containsselection","Jumplist","groupid","screentitle","bakeAsListitems","bakeAsDropDown","findCurrentIndex","_jumplist","drawAsList","currentIndex","slicetype","itemizer","drawAsDropDown","draw","is","userinfo","PERM_ALLOWACCESSCASES","PERM_ALLOWACCESSCASESFROMDOMAIN","PERM_ALLOWCASEOVERVIEW","PERM_ALLOWMISDOCUMENTS","PERM_ALLOWMISDOMAIN","PERM_ALLOWMISOWNCASES","PERM_ALLOWSAVECASE","PERM_ALLOWSTARTCASES","PERM_PUBLISHMODEL","PERM_UPDATEOWNMODEL","PERM_UPDATEOWNUSER","oldperms","guest","user","administrator","viewer","manager","vieweradmin","permissions","role","scrollTo","top","left","defaults","axis","duration","jquery","limit","_scrollable","inArray","contentWindow","ownerDocument","userAgent","compatMode","documentElement","onAfter","queue","toff","$elem","targ","win","style","margin","css","animate","onAfterFirst","easing","end","scroll","config","separator","pair","array_keys","default_decode","new_text","bb","compareVersions","isNaN","compareVersionsOn","_to","showAnim","changeYear","changeMonth","yearRange","altFormat","pause","dequeue","pushStack","makeArray","insertAtCaret","myValue","selection","createRange","selectionStart","startPos","endPos","selectionEnd","scrollTop","substring","selectAllText","createTextRange","select","KEYS","maps","originalEvent","$target","prev","shiftKey","$inputs","gridKeys","stopImmediatePropagation","preventDefault","dispatchBackspace","aintTheEnterKey","setRole","fullname","perms","perm","webadminMakesSense","resetLogin","effect","serializeArray","action","formfocus","Router","username","uniqueid","modelid","modelname","dbname","request","bsid","hideLogin","autologinrewritten","renderGroups","safeResetEffect","gotonode","deleteme","confirm","sessionid","deleteCase","isCaseCurrent","empty","Cases","_cases","_unfilteredcases","_MAX","_idx","_filtertext","showSlice","caselen","cas","dateenter","datecreate","showcopycase","showdeleteinmenu","reporturl","firstrun","lastaccess","createCaseItem","$case","templateindex","wCasus","howManyColumns","Plugins","newname","prependTo","hasNoNext","floor","nextSlice","divident","prevSlice","$controls","click","keyup","grep","newcase","jsondata","dateTitle","dateSpan","copySpan","reportSpan","deleteSpan","stopPropagation","Models","selector","modelitem","model","createModelItem","_selectedclass","yours","_nicename","enhanceModel","lastupdate","_date","_humandate","modelinfo","_liner_notes","authorinfo","_author_notes","models","explicit","cb","Validation","reset","silent","justhide","screenid","ajaxOptions","sync","fullnodename","_direction","_passed","pass","_isUpdate","cbIsAdditional","info","groupElt","isUpdate","lastUpdateRequest","requestDynProps","thisUpdateRequest","updateDynProps","skip","logout","close","currentTarget","restart","exit","mockResponse","code","fun","openSettings","menu","creds","exitthenmenu","returnfocusto","returnSelection","groups","_originalisfor","modus","removeAllRanges","_error","subcode","summary","Errors.translate","Errors.CODES","informationsources","hasprevious","hasnext","modeldescription","modellanguage","setMode","$document","focusHandler","focusstring","contains","selectionDirection","setSelectionRange","returnfocus","e_group","doScrollToSelected","previousElementSibling","scrollIntoView","behavior","matchMedia","fulldata","sortControls","setupFocusHandler","off","$parent","_stack","allValid","geterrorelt","showValidation","ok","errortext","$error","$node","category","stringmask","validateInput","validatable","eltControltype","doChangeOnKeyDown","setting","func","wait","immediate","timeout","context","later","callNow","before","setDynamicMode","previd","$bbq","setGroupTitle","gob","tempNode","replaceChild","_tempNode","setSelectedStateAttributes","renderGroup","sortGroups","show","questionlabelgroup","order","ac","bc","_sorted","hasStatusRole","describedby","screenmode","itype","questionandlabel","classname","siblings","$other","hash","rewind","updatemis","prior","runtonode","nodename","en","Listener","isComposing","maybeSetDescription","description_ids","remarks","pretexts","explicitId","getmetadata","fromnode","metaprop","innerState","process","product","global","Proxy","__proto__","SyntaxError","construct","setPrototypeOf","seal","revocable","proxy","revoke","store","fresh","pushing","form","fetch","method","Accept","round","uistates","receiver","Reflect","origSet","lim","p2b","n2b","b2n","n2p","map$1","hex","h1","h2","eq","hexString","isShort","alpha","HUE_RE","hsl2rgbn","hsv2rgbn","hwb2rgbn","rgb","rgb2hsl","hueValue","calln","hsl2rgb","hue","hueParse","p1","p2","hwb2rgb","hsv2rgb","Z","Y","X","U","Q","G","J","names$1","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","nameParse","unpacked","tkeys","j","nk","unpack","transparent","RGB_RE","pow","modHSL","ratio","tmp","clone","fromObject","functionParse","rgbParse","Color","ret","_rgb","_valid","valid","rgbString","hslString","mix","color","weight","c1","c2","w2","w1","interpolate","rgb1","rgb2","clearer","greyscale","opaquer","negate","lighten","darken","saturate","desaturate","rotate","deg","uid","isNullOrUndef","isObject","isNumberFinite","isFinite","finiteOrDefault","defaultValue","valueOrDefault","toDimension","dimension","loopable","_elementsEqual","a0","a1","ilen","v0","v1","datasetIndex","source","klen","isValidKey","_merger","tval","sval","merge","sources","merger","mergeIf","_mergerIf","keyResolvers","resolveObjectKey","resolver","part","_splitKey","_getKeyResolver","_capitalize","defined","isFunction","setsEqual","PI","TAU","PITAU","INFINITY","POSITIVE_INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","almostEquals","epsilon","abs","niceNum","range","roundedRange","niceRange","fraction","isNumber","_setMinAndMaxByKey","array","property","toRadians","degrees","toDegrees","radians","_decimalPlaces","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","sqrt","angle","atan2","distance","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","start","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_isBetween","_lookup","table","cmp","mid","hi","lo","_lookupByKey","ti","_rlookupByKey","arrayEvents","unlistenArrayEvents","listener","stub","_chartjs","listeners","_arrayUnique","requestAnimFrame","requestAnimationFrame","throttled","argsToUse","ticking","_toLeftRightCenter","align","_alignStartEnd","_getStartAndCountOfVisiblePoints","points","animationsDisabled","pointCount","count","iScale","_parsed","minDefined","maxDefined","getUserBounds","getPixelForValue","_scaleRangesChanged","xScale","yScale","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","changed","atEdge","elasticIn","sin","elasticOut","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","cos","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","isPatternOrGradient","getHoverColor","numbers","colors","intlCache","formatNumber","locale","cacheKey","Intl","NumberFormat","getNumberFormat","formatters","numeric","tickValue","ticks","chart","notation","delta","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","logarithmic","remain","significand","Ticks","overrides","descriptors","getScope$1","root","scope","Defaults","_descriptors","_appliers","animation","backgroundColor","borderColor","datasets","devicePixelRatio","platform","getDevicePixelRatio","elements","events","font","family","lineHeight","hover","hoverBackgroundColor","ctx","hoverBorderColor","hoverColor","indexAxis","interaction","intersect","includeInvisible","maintainAspectRatio","onHover","onClick","parsing","plugins","responsive","scale","scales","showLine","drawActiveElementsOnTop","describe","override","route","targetScope","targetName","scopeObject","targetScopeObject","privateName","local","appliers","_scriptable","_indexable","_fallback","delay","loop","active","resize","animations","autoPadding","padding","right","bottom","display","beginAtZero","bounds","grace","lineWidth","drawOnChartArea","drawTicks","tickLength","tickWidth","_ctx","tickColor","border","dash","dashOffset","width","title","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkip","autoSkipPadding","labelOffset","minor","major","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","_measureText","gc","longest","textWidth","measureText","_longestText","arrayOfThings","garbageCollect","save","jlen","nestedThing","restore","gcLen","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","clearCanvas","canvas","getContext","resetTransform","clearRect","height","drawPoint","drawPointLegend","xOffset","yOffset","cornerRadius","xOffsetW","yOffsetW","pointStyle","rotation","radius","rad","translate","drawImage","beginPath","ellipse","arc","closePath","moveTo","lineTo","SQRT1_2","rect","borderWidth","stroke","_isPointInArea","point","clipArea","clip","unclipArea","_steppedLineTo","previous","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","renderText","opts","lines","strokeWidth","strokeColor","line","translation","fillStyle","textAlign","textBaseline","setRenderOpts","backdrop","drawBackdrop","strokeStyle","strokeText","maxWidth","fillText","decorateText","strikethrough","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","decorationWidth","oldColor","fillRect","addRoundedRectPath","topLeft","bottomLeft","bottomRight","topRight","LINE_HEIGHT","FONT_STYLE","toLineHeight","numberOrZero","_readValueToProps","objProps","read","toTRBL","toTRBLCorners","toPadding","toFont","toFontString","inputs","cacheable","createContext","parentContext","_createResolver","scopes","prefixes","rootScopes","getTarget","_resolve","toStringTag","_cacheable","_scopes","_rootScopes","_getTarget","deleteProperty","_keys","_cached","readKey","needsSubResolver","createSubResolver","_resolveWithPrefixes","getKeysFromAllScopes","ownKeys","storage","_storage","_attachContext","subProxy","descriptorDefaults","_proxy","_context","_subProxy","setContext","isScriptable","_resolveScriptable","isIndexable","_resolveArray","_resolveWithContext","allKeys","scriptable","indexable","_allKeys","resolveFallback","getScope","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","_parseObjectDataRadialScale","_parsing","EPSILON","getPoint","getValueAxis","splineCurve","firstPoint","middlePoint","afterPoint","d01","d12","s01","s12","fa","splineCurveMonotone","valueAxis","pointsLen","deltaK","mK","pointBefore","pointCurrent","pointAfter","slopeDelta","alphaK","betaK","tauK","squaredMagnitude","monotoneAdjust","iPixel","vPixel","monotoneCompute","capControlPoint","pt","_updateBezierControlPoints","controlPoints","spanGaps","cubicInterpolationMode","tension","capBezierPoints","inArea","inAreaPrev","inAreaNext","_isDomSupported","_getParentNode","domNode","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","defaultView","positions","getPositionedStyle","suffix","getRelativePosition","borderBox","boxSizing","paddings","borders","box","touches","offsetX","offsetY","useOffsetPos","getBoundingClientRect","clientX","clientY","getCanvasPosition","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","maxHeight","containerSize","containerStyle","containerBorder","containerPadding","clientWidth","clientHeight","getContainerSize","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","readUsedSize","getPropertyValue","getStyle","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","getRtlAdapter","rtl","rectX","setWidth","xPlus","leftForLtr","itemWidth","getRightToLeftAdapter","_itemWidth","overrideTextDirection","original","getPropertyPriority","setProperty","prevTextDirection","restoreTextDirection","propertyFn","between","compare","normalizeSegment","_boundSegment","segment","startBound","endBound","getSegment","prevValue","inside","subStart","shouldStart","shouldStop","_boundSegments","segments","splitByStyles","segmentOptions","chartContext","_chart","baseStyle","readStyle","_datasetIndex","prevStyle","addStyle","st","dir","p0","p0DataIndex","p1DataIndex","styleChanged","doSplitByStyles","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","Animator","_request","_charts","_running","_lastDate","_notify","anims","callbacks","numSteps","initial","currentStep","_refresh","_update","remaining","running","_active","_total","tick","_getAnims","charts","complete","progress","listen","_duration","stop","animator","interpolators","boolean","factor","c0","number","Animation","cfg","currentValue","_fn","_easing","_start","_loop","_target","_prop","_from","_promises","elapsed","promises","rej","resolved","Animations","_properties","configure","animationOptions","animatedProps","_animateOptions","$shared","$animations","resolveTargetOptions","_createAnimations","anim","awaitAll","scaleClip","allowedOverflow","getSortedDatasetIndices","filterVisible","metasets","_getSortedDatasetMetas","applyStack","stack","dsIndex","singleMode","otherValue","isStacked","stacked","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","vScale","positive","getMatchingVisibleMetas","updateStacks","controller","_cachedMeta","_stacks","iAxis","vAxis","indexScale","valueScale","getStackKey","_top","_bottom","_visualValues","getFirstScaleId","clearStacks","isDirectUpdateMode","cloneIfNotShared","cached","shared","DatasetController","_cachedDataOpts","getMeta","_type","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","supportsDecimation","$context","_syncList","datasetElementType","dataElementType","initialize","linkScales","_stacked","addElements","isPluginEnabled","updateIndex","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","iid","iAxisID","vid","vAxisID","getScaleForId","rScale","getDatasetMeta","scaleID","_getOtherScale","_destroy","_dataCheck","adata","convertObjectDataToArray","isExtensible","base","object","buildOrUpdateElements","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","sorted","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","labels","getLabels","singleScale","xAxisKey","yAxisKey","getParsed","getDataElement","updateRangeFromParsed","parsedValue","NaN","getMinMax","canStack","otherScale","createStack","NEGATIVE_INFINITY","otherMin","otherMax","_skip","getAllParsedValues","getMaxOverflow","getLabelAndValue","getLabelForValue","_clip","toClip","defaultClip","chartArea","resolveDatasetElementOptions","resolveDataElementOptions","dataIndex","raw","createDataContext","createDatasetContext","_resolveElementOptions","elementType","sharing","datasetElementScopeKeys","resolveNamedOptions","_resolveAnimations","transition","datasetAnimationScopeKeys","getSharedOptions","includeOptions","sharedOptions","_animationsDisabled","_getSharedOptions","firstOpts","previouslySharedOptions","updateSharedOptions","updateElement","_setStyle","removeHoverStyle","setHoverStyle","_removeDatasetHoverStyle","_setDatasetHoverStyle","numMeta","numData","_insertElements","_removeElements","move","updateElements","removed","_sync","_dataChanges","_onDataPush","_onDataPop","_onDataShift","_onDataSplice","newCount","_onDataUnshift","computeMinSampleSize","_cache","$bar","visibleMetas","getAllScaleValues","curr","_length","updateMinAndPrev","getPixelForTick","parseValue","startValue","endValue","barStart","barEnd","_custom","parseFloatBar","parseArrayOrPrimitive","isFloatBar","custom","setBorderSkipped","edge","borderSkipped","horizontal","borderProps","enableBorderRadius","parseEdge","orig","v2","swap","startEnd","setInflateAmount","inflateAmount","DoughnutController","animateRotate","animateScale","cutout","circumference","spacing","legend","generateLabels","fontColor","getDataVisibility","legendItem","toggleDataVisibility","innerRadius","outerRadius","_getRotation","_getCircumference","_getRotationExtents","isDatasetVisible","arcs","getMaxBorderWidth","getMaxOffset","maxSize","chartWeight","_getRingWeight","ratioX","ratioY","startAngle","endAngle","startX","startY","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","getRatioAndOffset","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","total","calculateTotal","_getRingWeightOffset","_circumference","calculateCircumference","animationOpts","centerX","centerY","metaData","borderAlign","hoverBorderWidth","hoverOffset","ringWeightOffset","PolarAreaController","angleLines","circular","pointLabels","_updateRadius","minSize","cutoutPercentage","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","controllers","BarController","categoryPercentage","barPercentage","grouped","_index_","_value_","iAxisKey","vAxisKey","bars","getBasePixel","isHorizontal","ruler","_getRuler","vpixels","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","center","_getStacks","skipNull","_getStackCount","_getStackIndex","pixels","barThickness","_startPixel","_endPixel","stackCount","baseValue","minBarLength","actualBase","floating","barSign","startPixel","getPixelForDecimal","endPixel","getValueForPixel","halfGrid","getLineWidthForValue","maxBarThickness","percent","chunk","computeFlexCategoryTraits","thickness","computeFitCategoryTraits","stackIndex","rects","BubbleController","LineController","_dataset","_decimated","animated","maxGapLength","directUpdate","pointsCount","prevParsed","nullData","lastPoint","updateControlPoints","PieController","RadarController","_fullLoop","pointPosition","getPointPositionForValue","ScatterController","registry","getElement","abstract","DateAdapterBase","members","formats","startOf","endOf","adapters","binarySearch","metaset","lookupMethod","_reversePixels","getRange","evaluateInteractionItems","position","handler","getSortedVisibleDatasetMetas","getIntersectItems","useFinalPosition","isPointInArea","inRange","getNearestCartesianItems","distanceMetric","useX","useY","deltaX","deltaY","getDistanceMetricForAxis","minDistance","getCenterPoint","getNearestItems","getProps","getNearestRadialItems","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","nearest","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","setLayoutDims","layouts","wrap","stackWeight","placed","buildStacks","vBoxMaxWidth","hBoxMaxHeight","fullSize","availableWidth","availableHeight","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","newWidth","outerWidth","newHeight","outerHeight","widthChanged","heightChanged","same","other","getMargins","marginForPositions","fitBoxes","boxes","refitBoxes","refit","setBoxDims","placeBoxes","userPadding","height1","width1","addBox","_layers","removeBox","layoutItem","minPadding","layoutBoxes","wrapBoxes","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","buildLayoutBoxes","verticalBoxes","horizontalBoxes","beforeLayout","visibleVerticalBoxCount","updatePos","change","handleMaxPadding","BasePlatform","acquireContext","releaseContext","isAttached","updateConfig","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","eventListenerOptions","removeListener","nodeListContains","createAttachObserver","observer","addedNodes","removedNodes","childList","subtree","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","createResizeObserver","ResizeObserver","contentRect","listenDevicePixelRatioChanges","releaseObserver","disconnect","unlistenDevicePixelRatioChanges","createProxyAndListen","native","fromNativeEvent","addListener","DomPlatform","renderHeight","renderWidth","displayWidth","displayHeight","initCanvas","proxies","$proxies","attach","detach","Element","tooltipPosition","hasValue","final","tickOpts","determinedMaxTicks","_tickSize","maxScale","maxChart","_maxLength","determineMaxTicks","ticksLimit","maxTicksLimit","majorIndices","getMajorIndices","numMajorIndices","newTicks","ceil","skipMajors","evenMajorSpacing","getEvenSpacing","factors","_factorize","calculateSpacing","avgMajorSpacing","majorStart","majorEnd","offsetFromEdge","getTicksLimit","ticksLength","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","lineValue","getTickMarkLength","getTitleHeight","titleAlign","reverseAlign","Scale","_margins","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","suggestedMin","suggestedMax","metas","getTicks","xLabels","yLabels","getLabelItems","_computeLabelItems","beforeUpdate","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","minmax","keepZero","_addGrace","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","afterAutoSkip","beforeFit","fit","afterFit","afterUpdate","reversePixels","_alignToPixels","alignToPixels","_callHooks","notifyPlugins","beforeTickToLabelConversion","generateTickLabels","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","labelHeight","labelWidth","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetLeft","offsetRight","isFullSize","_computeLabelSizes","caches","widths","heights","tickFont","fontString","nestedLabel","widestLabelSize","highestLabelSize","_resolveTickFontOptions","valueAt","decimal","getDecimalForPixel","getBaseValue","createTickContext","optionTicks","rot","_computeGridLineItems","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","positionAxisID","positionAxisID1","value1","optsAtIndex","optsAtIndexBorder","lineColor","tickBorderDash","tickBorderDashOffset","tickAndPadding","hTickAndPadding","lineCount","textOffset","_getXAxisLabelAlignment","_getYAxisLabelAlignment","ret1","halfCount","tickTextAlign","labelPadding","_computeLabelArea","drawBackground","drawGrid","drawLine","setLineDash","lineDashOffset","drawBorder","lastLineWidth","drawLabels","renderTextOptions","drawTitle","titleX","titleY","titleArgs","tz","gz","bz","axisID","_maxDigits","fontSize","TypedRegistry","isForType","isPrototypeOf","register","parentScope","isIChartComponent","itemDefaults","defaultRoutes","routes","propertyParts","sourceName","sourceScope","routeDefaults","registerDefaults","unregister","Registry","_typedRegistries","_each","addControllers","addPlugins","addScales","getController","_get","getPlugin","getScale","removeControllers","removeElements","removePlugins","removeScales","typedRegistry","reg","_getRegistryForType","_exec","itemReg","component","camelMethod","PluginService","_init","hook","_createDescriptors","descriptor","plugin","invalidate","_oldCache","_notifyStateChanges","localIds","i1","allPlugins","getOpts","pluginOpts","createDescriptors","previousDescriptors","pluginScopeKeys","getIndexAxis","datasetDefaults","determineAxis","scaleOptions","initOptions","chartDefaults","configScales","chartIndexAxis","scaleConf","defaultId","getDefaultScaleIDFromAxis","defaultScaleOptions","defaultID","getAxisFromDefaultScaleID","mergeScaleConfig","initData","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","_config","initConfig","_scopeCache","_resolverCache","clearCache","clear","datasetType","additionalOptionScopes","_cachedScopes","mainScope","resetCache","keyLists","chartOptionScopes","subPrefixes","getResolver","hasFunction","needContext","resolverCache","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","instances","getChart","moveNumericKeys","intKey","Chart","invalidatePlugins","userConfig","initialCanvas","existingChart","OffscreenCanvas","_detectPlatform","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","debounce","resizeDelay","_initialize","bindEvents","_resizeBeforeDraw","_resize","newSize","newRatio","onResize","ensureScalesHaveIDs","axisOptions","buildOrUpdateScales","scaleOpts","isRadial","dposition","dtype","scaleType","_updateMetasets","_destroyDatasetMeta","_removeUnreferencedMetasets","buildOrUpdateControllers","newControllers","ControllerClass","_resetElements","animsDisabled","_updateScales","_checkEventBindings","_updateHiddenIndices","_minPadding","_updateLayout","_updateDatasets","_eventHandler","_updateHoverStyles","existingEvents","newEvents","unbindEvents","changes","_getUniformDataChanges","datasetCount","makeSet","changeSet","noArea","ilen1","_updateDataset","layers","_drawDatasets","_drawDataset","useClip","getDatasetArea","getElementsAtEventForMode","setDatasetVisibility","_updateVisibility","_stop","destroy","toBase64Image","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","updateHoverStyle","getActiveElements","setActiveElements","activeElements","lastActive","pluginId","replay","hoverOptions","deactivated","activated","inChartArea","eventFilter","_handleEvent","_getActiveElements","isClick","_isClickEvent","lastEvent","determineLastEvent","parseBorderRadius$1","angleDelta","borderRadius","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","pixelMargin","innerR","spacingOffset","avNogSpacingRadius","angleOffset","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","outerMidAdjustedAngle","pCenter","p4","pCenter1","innerMidAdjustedAngle","pCenter2","p8","pCenter3","outerStartX","outerStartY","outerEndX","outerEndY","fullCircles","inner","lineJoin","angleMargin","clipArc","setStyle","lineCap","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","stepped","getLineMethod","fastPathSegment","prevX","lastY","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","usePath2D","Path2D","_path","strokePathWithCache","segmentMethod","strokePathDirect","LineElement","_points","_segments","_pointsUpdated","findStartAndEnd","solidSegments","_computeSegments","_interpolate","_getInterpolationMethod","interpolated","inRange$1","hitRadius","getBarBounds","bar","half","skipOrLimit","boundingRects","maxW","maxH","parseBorderWidth","maxR","enableBorder","parseBorderRadius","outer","skipX","skipY","addNormalRectPath","inflateRect","amount","refRect","ArcElement","chartX","chartY","rAdjust","betweenAngles","withinRadius","halfAngle","halfRadius","radiusOffset","drawArc","PointElement","hoverRadius","mouseX","mouseY","inXRange","inYRange","BarElement","addRectPath","BORDER_COLORS","BACKGROUND_COLORS","getBorderColor","getBackgroundColor","getColorizer","colorizeDoughnutDataset","colorizePolarAreaDataset","colorizeDefaultDataset","containsColorsDefinitions","plugin_colors","forceOverride","_args","chartOptions","colorizer","cleanDecimatedDataset","cleanDecimatedData","plugin_decimation","algorithm","beforeElementsUpdate","xAxis","getStartAndCountOfVisiblePointsSimplified","threshold","decimated","samples","bucketWidth","sampledIndex","endIndex","maxAreaPoint","maxArea","nextA","avgY","avgRangeStart","avgRangeEnd","avgRangeLength","rangeOffs","rangeTo","pointAx","pointAy","lttbDecimation","minIndex","maxIndex","startIndex","xMin","dx","intermediateIndex1","intermediateIndex2","minMaxDecimation","_getBounds","_findSegmentEnd","_getEdge","_createBoundaryLine","boundary","linePoints","_pointsFromSegments","_shouldApplyFill","_resolveTarget","propagate","visited","_decodeFill","fillOption","parseFillOption","firstCh","decodeTargetIndex","addPointsBelow","sourcePoint","linesBelow","postponed","findPoint","pointValue","firstValue","lastValue","simpleArc","getLineByIndex","sourcePoints","below","getLinesBelow","_buildStackLine","_getTargetValue","computeCircularBoundary","_getTargetPixel","computeLinearBoundary","computeBoundary","_drawfill","lineOpts","above","clipVertical","doFill","clipY","lineLoop","tpoints","targetSegments","tgt","subBounds","fillSources","fillSource","notShape","clipBounds","interpolatedLineTo","targetLoop","interpolatedPoint","afterDatasetsUpdate","$filler","beforeDraw","drawTime","beforeDatasetsDraw","beforeDatasetDraw","getBoxSize","labelOpts","boxHeight","boxWidth","usePointStyle","pointStyleWidth","itemHeight","Legend","_added","legendHitBoxes","_hoveredItem","doughnutMode","legendItems","columnSizes","lineWidths","buildLabels","labelFont","_computeTitleHeight","_fitRows","_fitCols","hitboxes","totalHeight","_itemHeight","heightLimit","totalWidth","currentColWidth","currentColHeight","legendItemText","calculateItemWidth","fontLineHeight","calculateLegendItemHeight","calculateItemHeight","calculateItemSize","adjustHitBoxes","rtlHelper","hitbox","hitbox1","_draw","defaultColor","halfFontSize","cursor","textDirection","lineDash","drawOptions","SQRT2","yBoxTop","xBoxLeft","drawLegendBox","_textX","titleFont","titlePadding","topPaddingPlusHalfFontSize","_getLegendItemAt","hitBox","lh","onLeave","isListened","hoveredItem","sameItem","itemsEqual","plugin_legend","_element","afterEvent","ci","useBorderRadius","Title","_padding","textSize","_drawArgs","fontOpts","plugin_title","titleBlock","createTitle","plugin_subtitle","positioners","average","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","createTooltipItem","formattedValue","getTooltipSize","tooltip","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","beforeBody","afterBody","titleSpacing","titleMarginBottom","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineXAlign","yAlign","chartWidth","xAlign","caret","caretSize","caretPadding","doesNotFitWithAlign","determineAlignment","determineYAlign","getBackgroundPoint","alignment","paddingAndSize","alignX","alignY","getAlignedX","getBeforeAfterBodyLines","overrideCallbacks","defaultCallbacks","beforeTitle","tooltipItems","labelCount","afterTitle","beforeLabel","tooltipItem","labelColor","labelTextColor","bodyColor","labelPointStyle","afterLabel","beforeFooter","afterFooter","invokeCallbackWithFallback","Tooltip","opacity","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","getTitle","getBeforeBody","getBody","bodyItems","scoped","getAfterBody","getFooter","_createItems","itemSort","positionAndSize","backgroundPoint","external","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","titleColor","_drawColorBox","colorX","rtlColorX","yOffSet","colorY","multiKeyBackground","outerX","innerX","strokeRect","drawBody","bodyAlign","bodyLineHeight","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","drawFooter","footerAlign","footerColor","tooltipSize","quadraticCurveTo","_updateAnimationTarget","animX","animY","_willRender","hasTooltipContent","globalAlpha","positionChanged","_positionChanged","_ignoreReplayEvents","plugin_tooltip","afterInit","afterDraw","Colors","Decimation","Filler","SubTitle","findOrAddLabel","addedLabels","addIfString","lastIndexOf","_getLabelForValue","generateTicks$1","generationOptions","dataRange","maxTicks","maxDigits","includeBounds","unit","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","rounded","almostWhole","decimalPlaces","relativeLabelSize","LinearScaleBase","_startValue","_endValue","_valueRange","handleTickRangeOptions","setMin","setMax","minSign","maxSign","getTickLimit","stepSize","computeTickLimit","LinearScale","log10Floor","changeExponent","isMajor","tickVal","steps","rangeExp","rangeStep","generateTicks","minExp","exp","startExp","lastTick","LogarithmicScale","_zero","getTickBackdropHeight","measureLabelSize","determineLimits","fitWithPointLabels","limits","valueCount","_pointLabels","pointLabelOpts","additionalAngle","centerPointLabels","getPointLabelContext","getPointPosition","drawingArea","plFont","updateLimits","setCenterPoint","_pointLabelItems","extra","outerDistance","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","buildPointLabelItems","hLimits","vLimits","pathRadiusLine","RadialLinearScale","leftMovement","rightMovement","topMovement","bottomMovement","scalingFactor","getValueForDistanceFromCenter","scaledDistance","pointLabel","createPointLabelContext","distanceFromCenter","getBasePosition","getPointLabelPosition","backdropLeft","backdropTop","backdropWidth","backdropHeight","drawPointLabels","gridLineOpts","drawRadiusLine","INTERVALS","millisecond","common","minute","hour","week","quarter","UNITS","sorter","adapter","_adapter","isoWeekday","_parseOpts","determineUnitForAutoTicks","minUnit","capacity","MAX_SAFE_INTEGER","addTick","time","timestamps","ticksFromTimestamps","majorUnit","setMajorTicks","TimeScale","displayFormats","_unit","_majorUnit","_offsets","_normalized","normalized","_applyBounds","_getLabelBounds","getLabelTimestamps","timeOpts","_generate","_filterBetween","_getLabelCapacity","determineUnitForFormatting","determineMajorUnit","initOffsets","offsetAfterAutoskip","getDecimalForValue","weekday","hasWeekday","getDataTimestamps","tooltipFormat","datetime","_tickFormatFunction","minorFormat","majorFormat","offsets","_getLabelSize","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","prevSource","nextSource","prevTarget","nextTarget","span","CategoryScale","_addedLabels","added","TimeSeriesScale","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","registerables","applystate","button","md","chapterid","cogs","potential","cog","block","inline","chapterImage","cogsjumplist","piejumplist","showresult","styleSheets","addRule","li","btn","backgroundImage","image","bbjumplist","fromhere","btnchapterid","slicecount","requiredslices","fauxitem","fauxbutton","correction","selectedPos","share","wrapper","rdeg","innerWidth","lineTension","resultwrapper","score","themeCell","themeString","extraText","extraTextTemplate","itemtext","cv","chartCanvas","chartcontainer","nav","dbarea","dbstatic","dbdynamic","dbtitlearea","dbtextarea","dbtitles","dbtext","scoreMap","needed","bequiet","shout","msg","link","clipboard","writeText","today","twoWeeksLater","getTime","toLocaleString","formatDateTwoWeeksFromNow","catch","finally","linkdisplay","linkurl","checkbox","factory","modules","installedModules","__webpack_require__","moduleId","exports","__esModule","ns","__webpack_exports__","printJS","Browser","isFirefox","InstallTrigger","isIE","documentMode","isEdge","StyleMedia","isChrome","chrome","isSafari","isIOSChrome","addWrapper","capitalizePrint","collectStyles","addHeader","cleanUp","isRawHTML","_modal__WEBPACK_IMPORTED_MODULE_0__","_browser__WEBPACK_IMPORTED_MODULE_1__","_typeof","htmlData","font_size","elementStyle","targetStyles","targetStyle","targetStylesMatch","printElement","headerContainer","headerElement","headerNode","headerStyle","showModal","onLoadingEnd","onLoadingStart","revokeObjectURL","printable","onPrintDialogClose","iframe","frameId","_functions__WEBPACK_IMPORTED_MODULE_0__","_print__WEBPACK_IMPORTED_MODULE_1__","cloneElement","cloneNode","childNodesArray","ignoreElements","clonedChild","scanStyles","print","printFrame","printableElement","_browser__WEBPACK_IMPORTED_MODULE_2__","img","imageStyle","fullyQualifiedSrc","imageWrapper","_browser__WEBPACK_IMPORTED_MODULE_0__","_modal__WEBPACK_IMPORTED_MODULE_1__","_pdf__WEBPACK_IMPORTED_MODULE_2__","_html__WEBPACK_IMPORTED_MODULE_3__","_raw_html__WEBPACK_IMPORTED_MODULE_4__","_image__WEBPACK_IMPORTED_MODULE_5__","_json__WEBPACK_IMPORTED_MODULE_6__","printTypes","fallbackPrintable","gridHeaderStyle","gridStyle","onError","onIncompatibleBrowser","modalMessage","documentTitle","repeatTableHeader","base64","onPdfOpen","honorMarginPadding","honorColor","usedFrame","srcdoc","file","field","displayName","columnSize","stringData","jsonToHTML","Modal","printModal","contentDiv","closeButton","messageNode","getElementsByTagName","_print__WEBPACK_IMPORTED_MODULE_0__","_functions__WEBPACK_IMPORTED_MODULE_1__","createBlobAndPrint","localPdf","Blob","createObjectURL","bytesArray","atob","charCodeAt","XMLHttpRequest","responseType","response","Print","iframeElement","onload","printDocument","contentDocument","images","pollImage","naturalWidth","loadIframeImage","loadIframeImages","performPrint","execCommand","visibility","Verzend","Ja","Nee","prepping","impossible","emailSent","REPORTDOC","SHOWONTOP","DESIRED_TOOLS","$container","$download","$print","$printbtn","$email","$feedback","modelversion","one","vote","ctl","klass","history","pushState","apinav","_title","sessionStorage","directory","loc","restoreState","ditchState","removeItem","replaceState","initial_state","getItem","setItem","Showdown","g_urls","g_titles","g_html_blocks","g_list_level","makeHtml","inline_only","_Detab","_HashHTMLBlocks","_StripLinkDefinitions","_RunSpanGamut","_RunBlockGamut","_UnescapeSpecialChars","_ProcessListItems","wholeMatch","m1","m2","m3","m4","_EncodeAmpsAndAngles","hashElement","blockText","_DoHeaders","hashBlock","_DoLists","_DoCodeBlocks","_DoBlockQuotes","_FormParagraphs","_DoCodeSpans","_EscapeSpecialCharsWithinTagAttributes","_EncodeBackslashEscapes","_DoImages","_DoAnchors","_DoAutoLinks","_DoItalicsAndBold","escapeCharacters","writeAnchorTag","m5","m6","m7","whole_match","link_text","link_id","writeImageTag","alt_text","matchFound","h_level","whole_list","list_type","runup","list_str","_Outdent","codeblock","nextChar","_EncodeCode","bq","pre","grafs","grafsOut","$1","escapeCharacters_callback","_EncodeEmailAddress","addr","ch","hexDigits","char2hex","charCodeToReplace","fromCharCode","leadingText","charsToEscape","afterBackslash","regexString","topLevel","policy","baseLevel","arbitrary","headings","newline","newlineGlobRe","br_re","onlyPhrasingInside","demoteHeading","html_in","html_out","onlyPhrasing","allowOnlyPhrasing","ready","originals","flagged","cls","affected","currentgroupid","Chapter","scores","_e","statescores","chapterobj","scoresobj","accumulator","getAverage","_isPlaceholder","_curry1","f1","_curry2","f2","_b","topIndicator","notifier","insertAdjacentElement","indicators","announcement","indicator","hasPath$1","has$1","getIDbykey","R.has","clickelem","clickfield","clicked","mdprops","mdcontrols","elem","clearMenu","mustache","objectToString","escapeRegExp","hasProperty","propName","regExpTest","nonSpaceRe","isWhitespace","testRegExp","whiteRe","spaceRe","equalsRe","curlyRe","tagRe","Scanner","Context","Writer","eos","scan","scanUntil","lookup","lookupHit","tags","tokens","openingTagRe","closingTagRe","closingCurlyRe","sections","spaces","hasTag","nonSpace","stripSpace","compileTags","tagsToCompile","chr","openSection","scanner","valueLength","nestedTokens","numTokens","nestTokens","lastToken","squashedTokens","squashTokens","parseTemplate","partials","renderTokens","originalTemplate","symbol","buffer","renderSection","renderInverted","renderPartial","unescapedValue","escapedValue","rawValue","defaultWriter","to_html","mustacheFactory","disclaimers","efactureren","mdable","einvoice","internationaalmkb","xpw20","rie","betrouwbaarheidsniveau_digitale_dienstverlening","kringloopscan","e_besparing","regelhulpchina","ics","risicoklasseindeling_digitaleveiligheid","regelhulpinternationalefinanciering","regelhulpmest","vastgoed_transformatie","wbso","IE_calculator","ie_calculator","regelhulpbetrouwbaarheidniveaus","closeinfo","log","which","elemprops","rtnfocus","children","human","closer","Event","createMenu","showtime","DOMParser","parseFromString","menuItem","session","outerHTML","mopinionNodeName","js","kill","mopinion","mopinionMask","mopinionModal","headscript","setInterval","Pastease","clearInterval","showMopinion","getIdentifyingPartOfPath","chunks","getSetting","getProxyString","postdata","hasOurState","endpoint","modelSpecific","dataLayerName","scripts","isStgDebug","cookie","setTime","toUTCString","stgCreateCookie","qP","qPString","api","parameters","piwik","$inner","$outer","classNames","fieldset","nextUntil"],"mappings":"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"}