@dpuse/dpuse-tool-highcharts-visualiser 0.0.82 → 0.0.84
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -30
- package/dist/{AnimationUtilities-CJw-tdb_.js → AnimationUtilities-eb22eIjK.js} +84 -84
- package/dist/AnimationUtilities-eb22eIjK.js.map +1 -0
- package/dist/{BorderRadius-CqHYi9va.js → BorderRadius-Cois3N8q.js} +2 -2
- package/dist/{BorderRadius-CqHYi9va.js.map → BorderRadius-Cois3N8q.js.map} +1 -1
- package/dist/{CenteredUtilities-BTUT7_Ld.js → CenteredUtilities-WO6ukK5m.js} +305 -309
- package/dist/CenteredUtilities-WO6ukK5m.js.map +1 -0
- package/dist/{SVGElement-uTuGcjav.js → SVGElement-z7ENyQ6Y.js} +73 -73
- package/dist/SVGElement-z7ENyQ6Y.js.map +1 -0
- package/dist/{SeriesRegistry-CXsAINSj.js → SeriesRegistry-CDI1sm9L.js} +127 -126
- package/dist/SeriesRegistry-CDI1sm9L.js.map +1 -0
- package/dist/{TextPath-Coabnrz0.js → TextPath-CiV8mQgF.js} +1 -1
- package/dist/{TextPath-Coabnrz0.js.map → TextPath-CiV8mQgF.js.map} +1 -1
- package/dist/{dependency-wheel.src-ByNiAiZS.js → dependency-wheel.src-m4DwYrP7.js} +5 -5
- package/dist/{dependency-wheel.src-ByNiAiZS.js.map → dependency-wheel.src-m4DwYrP7.js.map} +1 -1
- package/dist/dpuse-tool-highcharts-visualiser.es.js +1423 -1413
- package/dist/dpuse-tool-highcharts-visualiser.es.js.map +1 -1
- package/dist/{highchartsMoreCustom-Cm6MkFMu.js → highchartsMoreCustom-C7_1r-Ql.js} +328 -300
- package/dist/highchartsMoreCustom-C7_1r-Ql.js.map +1 -0
- package/dist/{pattern-fill.src-CGZp553r.js → pattern-fill.src-kXG__4iS.js} +43 -43
- package/dist/pattern-fill.src-kXG__4iS.js.map +1 -0
- package/dist/sankey.src-B-54oc-3.js +522 -0
- package/dist/sankey.src-B-54oc-3.js.map +1 -0
- package/dist/{streamgraph.src-DjMW1U2g.js → streamgraph.src-DLpEiTz6.js} +2 -2
- package/dist/streamgraph.src-DLpEiTz6.js.map +1 -0
- package/dist/types/eslint.config.d.ts +1 -1
- package/package.json +28 -17
- package/dist/AnimationUtilities-CJw-tdb_.js.map +0 -1
- package/dist/CenteredUtilities-BTUT7_Ld.js.map +0 -1
- package/dist/SVGElement-uTuGcjav.js.map +0 -1
- package/dist/SeriesRegistry-CXsAINSj.js.map +0 -1
- package/dist/highchartsMoreCustom-Cm6MkFMu.js.map +0 -1
- package/dist/pattern-fill.src-CGZp553r.js.map +0 -1
- package/dist/sankey.src-Buj1zAlU.js +0 -522
- package/dist/sankey.src-Buj1zAlU.js.map +0 -1
- package/dist/streamgraph.src-DjMW1U2g.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SVGElement-uTuGcjav.js","names":["H"],"sources":["../node_modules/highcharts/es-modules/Core/Renderer/SVG/SVGElement.js"],"sourcesContent":["/* *\n *\n * (c) 2010-2026 Highsoft AS\n * Author: Torstein Hønsi\n *\n * Integration of this software requires a license.\n * - For commercial use, see www.highcharts.com/license\n * - For non-commercial, see www.highcharts.com/license-eula\n *\n *\n * */\n'use strict';\nimport { animate, animObject, stop } from '../../Animation/AnimationUtilities.js';\nimport Color from '../../Color/Color.js';\nimport H from '../../Globals.js';\nconst { deg2rad, doc, svg, SVG_NS, win, isFirefox } = H;\nimport { addEvent, attr, createElement, crisp, css, defined, erase, extend, fireEvent, getAlignFactor, isArray, isFunction, isNumber, isObject, isString, merge, objectEach, pInt, pick, pushUnique, replaceNested, syncTimeout } from '../../../Shared/Utilities.js';\nimport { uniqueKey } from '../../Utilities.js';\n/* *\n *\n * Class\n *\n * */\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/**\n * The SVGElement prototype is a JavaScript wrapper for SVG elements used in the\n * rendering layer of Highcharts. Combined with the\n * {@link Highcharts.SVGRenderer}\n * object, these prototypes allow freeform annotation in the charts or even in\n * HTML pages without instantiating a chart. The SVGElement can also wrap HTML\n * labels, when `text` or `label` elements are created with the `useHTML`\n * parameter.\n *\n * The SVGElement instances are created through factory functions on the\n * {@link Highcharts.SVGRenderer}\n * object, like\n * {@link Highcharts.SVGRenderer#rect|rect},\n * {@link Highcharts.SVGRenderer#path|path},\n * {@link Highcharts.SVGRenderer#text|text},\n * {@link Highcharts.SVGRenderer#label|label},\n * {@link Highcharts.SVGRenderer#g|g}\n * and more.\n *\n * See [How to use the SVG Renderer](\n * https://www.highcharts.com/docs/advanced-chart-features/renderer) for a\n * comprehensive tutorial on how to draw SVG elements on a chart.\n *\n * @class\n * @name Highcharts.SVGElement\n */\nclass SVGElement {\n // @todo public zIndex?: number;\n /* *\n *\n * Functions\n *\n * */\n /**\n * Get the current value of an attribute or pseudo attribute,\n * used mainly for animation. Called internally from\n * the {@link Highcharts.SVGRenderer#attr} function.\n *\n * @internal\n * @function Highcharts.SVGElement#_defaultGetter\n *\n * @param {string} key\n * Property key.\n *\n * @return {number|string}\n * Property value.\n */\n _defaultGetter(key) {\n let ret = pick(this[key + 'Value'], // Align getter\n this[key], this.element ? this.element.getAttribute(key) : null, 0);\n if (/^-?[\\d\\.]+$/.test(ret)) { // Is numerical\n ret = parseFloat(ret);\n }\n return ret;\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#_defaultSetter\n * @param {string} value\n * @param {string} key\n * @param {Highcharts.SVGDOMElement} element\n */\n _defaultSetter(value, key, element) {\n element.setAttribute(key, value);\n }\n /**\n * Add the element to the DOM. All elements must be added this way.\n *\n * @sample highcharts/members/renderer-g\n * Elements added to a group\n *\n * @function Highcharts.SVGElement#add\n *\n * @param {Highcharts.SVGElement} [parent]\n * The parent item to add it to. If undefined, the element is added to the\n * {@link Highcharts.SVGRenderer.box}.\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVGElement for chaining.\n */\n add(parent) {\n const renderer = this.renderer, element = this.element;\n let inserted;\n if (parent) {\n this.parentGroup = parent;\n }\n // Build formatted text\n if (typeof this.textStr !== 'undefined' &&\n this.element.nodeName === 'text' // Not for SVGLabel instances\n ) {\n renderer.buildText(this);\n }\n // Mark as added\n this.added = true;\n // If we're adding to renderer root, or other elements in the group\n // have a z index, we need to handle it\n if (!parent || parent.handleZ || this.zIndex) {\n inserted = this.zIndexSetter();\n }\n // If zIndex is not handled, append at the end\n if (!inserted) {\n (parent ?\n parent.element :\n renderer.box).appendChild(element);\n }\n // Fire an event for internal hooks\n if (this.onAdd) {\n this.onAdd();\n }\n return this;\n }\n /**\n * Add a class name to an element.\n *\n * @function Highcharts.SVGElement#addClass\n *\n * @param {string} className\n * The new class name to add.\n *\n * @param {boolean} [replace=false]\n * When true, the existing class name(s) will be overwritten with the new\n * one. When false, the new one is added.\n *\n * @return {Highcharts.SVGElement}\n * Return the SVG element for chainability.\n */\n addClass(className, replace) {\n const currentClassName = replace ? '' : (this.attr('class') || '');\n // Trim the string and remove duplicates\n className = (className || '')\n .split(/ /g)\n .reduce(function (newClassName, name) {\n if (currentClassName.indexOf(name) === -1) {\n newClassName.push(name);\n }\n return newClassName;\n }, (currentClassName ?\n [currentClassName] :\n []))\n .join(' ');\n if (className !== currentClassName) {\n this.attr('class', className);\n }\n return this;\n }\n /**\n * This method is executed in the end of `attr()`, after setting all\n * attributes in the hash. In can be used to efficiently consolidate\n * multiple attributes in one SVG property -- e.g., translate, rotate and\n * scale are merged in one \"transform\" attribute in the SVG node.\n *\n * @internal\n * @function Highcharts.SVGElement#afterSetters\n */\n afterSetters() {\n // Update transform. Do this outside the loop to prevent redundant\n // updating for batch setting of attributes.\n if (this.doTransform) {\n this.updateTransform();\n this.doTransform = false;\n }\n }\n /**\n * Align the element relative to the chart or another box.\n *\n * @function Highcharts.SVGElement#align\n *\n * @param {Highcharts.AlignObject} [alignOptions]\n * The alignment options. The function can be called without this parameter\n * in order to re-align an element after the box has been updated.\n *\n * @param {boolean} [alignByTranslate]\n * Align element by translation.\n *\n * @param {string|Highcharts.BBoxObject} [alignTo]\n * The box to align to, needs a width and height. When the box is a string,\n * it refers to an object in the Renderer. For example, when box is\n * `spacingBox`, it refers to `Renderer.spacingBox` which holds `width`,\n * `height`, `x` and `y` properties.\n *\n * @param {boolean} [redraw]\n * Decide if SVGElement should be redrawn with new alignment or just change\n * its attributes.\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVGElement for chaining.\n */\n align(alignOptions, alignByTranslate, alignTo, redraw = true) {\n const renderer = this.renderer, alignedObjects = renderer.alignedObjects, initialAlignment = Boolean(alignOptions);\n // First call on instantiate\n if (alignOptions) {\n this.alignOptions = alignOptions;\n this.alignByTranslate = alignByTranslate;\n this.alignTo = alignTo;\n // When called on resize, no arguments are supplied\n }\n else {\n alignOptions = this.alignOptions || {};\n alignByTranslate = this.alignByTranslate;\n alignTo = this.alignTo;\n }\n const alignToKey = !alignTo || isString(alignTo) ?\n alignTo || 'renderer' :\n void 0;\n // When aligned to a key, automatically re-align on redraws\n if (alignToKey) {\n // Prevent duplicates, like legendGroup after resize\n if (initialAlignment) {\n pushUnique(alignedObjects, this);\n }\n alignTo = void 0; // Do not use the box\n }\n const alignToBox = pick(alignTo, renderer[alignToKey], renderer), \n // Default: left align\n x = (alignToBox.x || 0) + (alignOptions.x || 0) +\n ((alignToBox.width || 0) - (alignOptions.width || 0)) *\n getAlignFactor(alignOptions.align), \n // Default: top align\n y = (alignToBox.y || 0) + (alignOptions.y || 0) +\n ((alignToBox.height || 0) - (alignOptions.height || 0)) *\n getAlignFactor(alignOptions.verticalAlign), attribs = {};\n // Add text-align attribute only if option is defined, #22698\n if (alignOptions.align) {\n attribs['text-align'] = alignOptions.align;\n }\n attribs[alignByTranslate ? 'translateX' : 'x'] = Math.round(x);\n attribs[alignByTranslate ? 'translateY' : 'y'] = Math.round(y);\n // Animate only if already placed\n if (redraw) {\n this[this.placed ? 'animate' : 'attr'](attribs);\n this.placed = true;\n }\n this.alignAttr = attribs;\n return this;\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#alignSetter\n * @param {\"left\"|\"center\"|\"right\"} value\n */\n alignSetter(value) {\n const convert = {\n left: 'start',\n center: 'middle',\n right: 'end'\n };\n if (convert[value]) {\n this.alignValue = value;\n this.element.setAttribute('text-anchor', convert[value]);\n }\n }\n /**\n * Animate to given attributes or CSS properties.\n *\n * @sample highcharts/members/element-on/\n * Setting some attributes by animation\n *\n * @function Highcharts.SVGElement#animate\n *\n * @param {Highcharts.SVGAttributes} params\n * SVG attributes or CSS to animate.\n *\n * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [options]\n * Animation options.\n *\n * @param {Function} [complete]\n * Function to perform at the end of animation.\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVGElement for chaining.\n */\n animate(params, options, complete) {\n const animOptions = animObject(pick(options, this.renderer.globalAnimation, true)), deferTime = animOptions.defer;\n // When the page is hidden save resources in the background by not\n // running animation at all (#9749).\n if (doc.hidden) {\n animOptions.duration = 0;\n }\n if (animOptions.duration !== 0) {\n // Allows using a callback with the global animation without\n // overwriting it\n if (complete) {\n animOptions.complete = complete;\n }\n // If defer option is defined delay the animation #12901\n syncTimeout(() => {\n if (this.element) {\n animate(this, params, animOptions);\n }\n }, deferTime);\n }\n else {\n this.attr(params, void 0, complete || animOptions.complete);\n // Call the end step synchronously\n objectEach(params, function (val, prop) {\n if (animOptions.step) {\n animOptions.step.call(this, val, { prop: prop, pos: 1, elem: this });\n }\n }, this);\n }\n return this;\n }\n /**\n * Apply a text outline through a custom CSS property, by copying the text\n * element and apply stroke to the copy. Used internally. Contrast checks at\n * [example](https://jsfiddle.net/highcharts/43soe9m1/2/).\n *\n * @example\n * // Specific color\n * text.css({\n * textOutline: '1px black'\n * });\n * // Automatic contrast\n * text.css({\n * color: '#000000', // black text\n * textOutline: '1px contrast' // => white outline\n * });\n *\n * @internal\n * @function Highcharts.SVGElement#applyTextOutline\n *\n * @param {string} textOutline\n * A custom CSS `text-outline` setting, defined by `width color`.\n */\n applyTextOutline(textOutline) {\n const elem = this.element, hasContrast = textOutline.indexOf('contrast') !== -1, styles = {};\n // When the text shadow is set to contrast, use dark stroke for light\n // text and vice versa.\n if (hasContrast) {\n styles.textOutline = textOutline = textOutline.replace(/contrast/g, this.renderer.getContrast(elem.style.fill));\n }\n // Extract the stroke width and color\n const spacePos = textOutline.indexOf(' '), color = textOutline.substring(spacePos + 1);\n let strokeWidth = textOutline.substring(0, spacePos);\n if (strokeWidth && strokeWidth !== 'none' && H.svg) {\n this.fakeTS = true; // Fake text shadow\n // Since the stroke is applied on center of the actual outline, we\n // need to double it to get the correct stroke-width outside the\n // glyphs.\n strokeWidth = strokeWidth.replace(/(^[\\d\\.]+)(.*?)$/g, function (match, digit, unit) {\n return (2 * Number(digit)) + unit;\n });\n // Remove shadows from previous runs.\n this.removeTextOutline();\n const outline = doc.createElementNS(SVG_NS, 'tspan');\n attr(outline, {\n 'class': 'highcharts-text-outline',\n fill: color,\n stroke: color,\n 'stroke-width': strokeWidth,\n 'stroke-linejoin': 'round'\n });\n // For each of the tspans and text nodes, create a copy in the\n // outline.\n const parentElem = elem.querySelector('textPath') || elem;\n [].forEach.call(parentElem.childNodes, (childNode) => {\n const clone = childNode.cloneNode(true);\n if (clone.removeAttribute) {\n ['fill', 'stroke', 'stroke-width', 'stroke'].forEach((prop) => clone\n .removeAttribute(prop));\n }\n outline.appendChild(clone);\n });\n // Collect the sum of dy from all children, included nested ones\n let totalHeight = 0;\n [].forEach.call(parentElem.querySelectorAll('text tspan'), (element) => {\n totalHeight += Number(element.getAttribute('dy'));\n });\n // Insert an absolutely positioned break before the original text\n // to keep it in place\n const br = doc.createElementNS(SVG_NS, 'tspan');\n br.textContent = '\\u200B';\n // Reset the position for the following text\n attr(br, {\n x: Number(elem.getAttribute('x')),\n dy: -totalHeight\n });\n // Insert the outline\n outline.appendChild(br);\n parentElem.insertBefore(outline, parentElem.firstChild);\n }\n }\n /**\n * @function Highcharts.SVGElement#attr\n * @param {string} key\n * @return {number|string}\n */ /**\n * Apply native and custom attributes to the SVG elements.\n *\n * In order to set the rotation center for rotation, set x and y to 0 and\n * use `translateX` and `translateY` attributes to position the element\n * instead.\n *\n * Attributes frequently used in Highcharts are `fill`, `stroke`,\n * `stroke-width`.\n *\n * @sample highcharts/members/renderer-rect/\n * Setting some attributes\n *\n * @example\n * // Set multiple attributes\n * element.attr({\n * stroke: 'red',\n * fill: 'blue',\n * x: 10,\n * y: 10\n * });\n *\n * // Set a single attribute\n * element.attr('stroke', 'red');\n *\n * // Get an attribute\n * element.attr('stroke'); // => 'red'\n *\n * @function Highcharts.SVGElement#attr\n *\n * @param {string|Highcharts.SVGAttributes} [hash]\n * The native and custom SVG attributes.\n *\n * @param {number|string|Highcharts.SVGPathArray} [val]\n * If the type of the first argument is `string`, the second can be a value,\n * which will serve as a single attribute setter. If the first argument is a\n * string and the second is undefined, the function serves as a getter and\n * the current value of the property is returned.\n *\n * @param {Function} [complete]\n * A callback function to execute after setting the attributes. This makes\n * the function compliant and interchangeable with the\n * {@link SVGElement#animate} function.\n *\n * @param {boolean} [continueAnimation=true]\n * Used internally when `.attr` is called as part of an animation step.\n * Otherwise, calling `.attr` for an attribute will stop animation for that\n * attribute.\n *\n * @return {Highcharts.SVGElement}\n * If used as a setter, it returns the current {@link Highcharts.SVGElement}\n * so the calls can be chained. If used as a getter, the current value of\n * the attribute is returned.\n */\n attr(hash, val, complete, continueAnimation) {\n const { element } = this, symbolCustomAttribs = SVGElement.symbolCustomAttribs;\n let key, hasSetSymbolSize, ret = this, skipAttr, setter;\n // Single key-value pair\n if (typeof hash === 'string' && typeof val !== 'undefined') {\n key = hash;\n hash = {};\n hash[key] = val;\n }\n // Used as a getter: first argument is a string, second is undefined\n if (typeof hash === 'string') {\n ret = (this[hash + 'Getter'] ||\n this._defaultGetter).call(this, hash, element);\n // Setter\n }\n else {\n objectEach(hash, function eachAttribute(val, key) {\n skipAttr = false;\n // Unless .attr is from the animator update, stop current\n // running animation of this property\n if (!continueAnimation) {\n stop(this, key);\n }\n // Special handling of symbol attributes\n if (this.symbolName &&\n symbolCustomAttribs.indexOf(key) !== -1) {\n if (!hasSetSymbolSize) {\n this.symbolAttr(hash);\n hasSetSymbolSize = true;\n }\n skipAttr = true;\n }\n if (this.rotation && (key === 'x' || key === 'y')) {\n this.doTransform = true;\n }\n if (!skipAttr) {\n setter = (this[key + 'Setter'] ||\n this._defaultSetter);\n setter.call(this, val, key, element);\n }\n }, this);\n this.afterSetters();\n }\n // In accordance with animate, run a complete callback\n if (complete) {\n complete.call(this);\n }\n return ret;\n }\n /**\n * Apply a clipping shape to this element.\n *\n * @function Highcharts.SVGElement#clip\n *\n * @param {SVGElement} [clipElem]\n * The clipping shape. If skipped, the current clip is removed.\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVG element to allow chaining.\n */\n clip(clipElem) {\n if (clipElem && !clipElem.clipPath) {\n // Add a hyphen at the end to avoid confusion in testing indexes\n // -1 and -10, -11 etc (#6550)\n const id = uniqueKey() + '-', clipPath = this.renderer.createElement('clipPath')\n .attr({ id })\n .add(this.renderer.defs);\n extend(clipElem, { clipPath, id, count: 0 });\n clipElem.add(clipPath);\n }\n return this.attr('clip-path', clipElem ?\n `url(${this.renderer.url}#${clipElem.id})` :\n 'none');\n }\n /**\n * Calculate the coordinates needed for drawing a rectangle crisply and\n * return the calculated attributes.\n *\n * @function Highcharts.SVGElement#crisp\n *\n * @param {Highcharts.RectangleObject} rect\n * Rectangle to crisp.\n *\n * @param {number} [strokeWidth]\n * The stroke width to consider when computing crisp positioning. It can\n * also be set directly on the rect parameter.\n *\n * @return {Highcharts.RectangleObject}\n * The modified rectangle arguments.\n */\n crisp(rect, strokeWidth) {\n // Math.round because strokeWidth can sometimes have roundoff errors\n strokeWidth = Math.round(strokeWidth || rect.strokeWidth || 0);\n const x1 = rect.x || this.x || 0, y1 = rect.y || this.y || 0, x2 = (rect.width || this.width || 0) + x1, y2 = (rect.height || this.height || 0) + y1, \n // Find all the rounded coordinates for corners\n x = crisp(x1, strokeWidth), y = crisp(y1, strokeWidth), x2Crisp = crisp(x2, strokeWidth), y2Crisp = crisp(y2, strokeWidth);\n extend(rect, {\n x,\n y,\n width: x2Crisp - x,\n height: y2Crisp - y\n });\n if (defined(rect.strokeWidth)) {\n rect.strokeWidth = strokeWidth;\n }\n return rect;\n }\n /**\n * Build and apply an SVG gradient out of a common JavaScript configuration\n * object. This function is called from the attribute setters. An event\n * hook is added for supporting other complex color types.\n *\n * @internal\n * @function Highcharts.SVGElement#complexColor\n * @param {Highcharts.GradientColorObject|Highcharts.PatternObject} colorOptions\n * The gradient or pattern options structure.\n * @param {string} prop\n * The property to apply, can either be `fill` or `stroke`.\n * @param {Highcharts.SVGDOMElement} elem\n * SVG element to apply the gradient on.\n */\n complexColor(colorOptions, prop, elem) {\n const renderer = this.renderer;\n let colorObject, gradName, gradAttr, radAttr, gradients, stops, stopOpacity, radialReference, id, key = [], value;\n fireEvent(this.renderer, 'complexColor', {\n args: arguments\n }, () => {\n // Apply linear or radial gradients\n if (colorOptions.radialGradient) {\n gradName = 'radialGradient';\n }\n else if (colorOptions.linearGradient) {\n gradName = 'linearGradient';\n }\n if (gradName) {\n gradAttr = colorOptions[gradName];\n gradients = renderer.gradients;\n stops = colorOptions.stops;\n radialReference = elem.radialReference;\n // Keep < 2.2 compatibility\n if (isArray(gradAttr)) {\n colorOptions[gradName] = gradAttr = {\n x1: gradAttr[0],\n y1: gradAttr[1],\n x2: gradAttr[2],\n y2: gradAttr[3],\n gradientUnits: 'userSpaceOnUse'\n };\n }\n // Correct the radial gradient for the radial reference system\n if (gradName === 'radialGradient' &&\n radialReference &&\n !defined(gradAttr.gradientUnits)) {\n // Save the radial attributes for updating\n radAttr = gradAttr;\n gradAttr = merge(gradAttr, renderer.getRadialAttr(radialReference, radAttr), { gradientUnits: 'userSpaceOnUse' });\n }\n // Build the unique key to detect whether we need to create a\n // new element (#1282)\n objectEach(gradAttr, function (value, n) {\n if (n !== 'id') {\n key.push(n, value);\n }\n });\n objectEach(stops, function (val) {\n key.push(val);\n });\n key = key.join(',');\n // Check if a gradient object with the same config object is\n // created within this renderer\n if (gradients[key]) {\n id = gradients[key].attr('id');\n }\n else {\n // Set the id and create the element\n gradAttr.id = id = uniqueKey();\n const gradientObject = gradients[key] =\n renderer.createElement(gradName)\n .attr(gradAttr)\n .add(renderer.defs);\n gradientObject.radAttr = radAttr;\n // The gradient needs to keep a list of stops to be able to\n // destroy them\n gradientObject.stops = [];\n stops.forEach(([offset, stopColor]) => {\n if (stopColor.indexOf('rgba') === 0) {\n colorObject = Color.parse(stopColor);\n stopColor = colorObject.get('rgb');\n stopOpacity = colorObject.get('a');\n }\n else {\n stopOpacity = 1;\n }\n const stopObject = renderer.createElement('stop').attr({\n offset,\n 'stop-color': stopColor,\n 'stop-opacity': stopOpacity\n }).add(gradientObject);\n // Add the stop element to the gradient\n gradientObject.stops.push(stopObject);\n });\n }\n // Set the reference to the gradient object\n value = 'url(' + renderer.url + '#' + id + ')';\n elem.setAttribute(prop, value);\n elem.gradient = key;\n // Allow the color to be concatenated into tooltips formatters\n // etc. (#2995)\n colorOptions.toString = function () {\n return value;\n };\n }\n });\n }\n /**\n * Set styles for the element. In addition to CSS styles supported by\n * native SVG and HTML elements, there are also some custom made for\n * Highcharts, like `width`, `ellipsis` and `textOverflow` for SVG text\n * elements.\n *\n * @sample highcharts/members/renderer-text-on-chart/\n * Styled text\n *\n * @function Highcharts.SVGElement#css\n *\n * @param {Highcharts.CSSObject} styles\n * The new CSS styles.\n *\n * @return {Highcharts.SVGElement}\n * Return the SVG element for chaining.\n */\n css(styles) {\n const oldStyles = this.styles, newStyles = {}, elem = this.element, renderer = this.renderer;\n let textWidth, hasNew = !oldStyles;\n // Filter out existing styles to increase performance (#2640)\n if (oldStyles) {\n objectEach(styles, function (value, n) {\n if (oldStyles && oldStyles[n] !== value) {\n newStyles[n] = value;\n hasNew = true;\n }\n });\n }\n if (hasNew) {\n // Merge the new styles with the old ones\n if (oldStyles) {\n styles = extend(oldStyles, newStyles);\n }\n // Get the text width from style\n // Previously set, unset it (#8234)\n if (styles.width === null || styles.width === 'auto') {\n delete this.textWidth;\n // Apply new\n }\n else if (elem.nodeName.toLowerCase() === 'text' &&\n styles.width) {\n textWidth = this.textWidth = pInt(styles.width);\n }\n // Store object\n extend(this.styles, styles);\n if (textWidth && (!svg && renderer.forExport)) {\n delete styles.width;\n }\n const fontSize = isFirefox && styles.fontSize || null;\n // Necessary in firefox to be able to set font-size, #22124\n if (fontSize && (isNumber(fontSize) ||\n /^\\d+$/.test(fontSize))) {\n styles.fontSize += 'px';\n }\n const stylesToApply = merge(styles);\n if (elem.namespaceURI === this.SVG_NS) {\n // These CSS properties are interpreted internally by the SVG\n // renderer, but are not supported by SVG and should not be\n // added to the DOM. In styled mode, no CSS should find its way\n // to the DOM whatsoever (#6173, #6474).\n ['textOutline', 'textOverflow', 'whiteSpace', 'width'].forEach((key) => (stylesToApply &&\n delete stylesToApply[key]));\n // SVG requires fill for text\n if (stylesToApply.color) {\n stylesToApply.fill = stylesToApply.color;\n delete stylesToApply.color;\n }\n }\n css(elem, stylesToApply);\n }\n if (this.added) {\n // Rebuild text after added. Cache mechanisms in the buildText will\n // prevent building if there are no significant changes.\n if (this.element.nodeName === 'text') {\n renderer.buildText(this);\n }\n // Apply text outline after added\n if (styles.textOutline) {\n this.applyTextOutline(styles.textOutline);\n }\n }\n return this;\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#dashstyleSetter\n * @param {string} value\n */\n dashstyleSetter(value) {\n let i, strokeWidth = this['stroke-width'];\n // If \"inherit\", like maps in IE, assume 1 (#4981). With HC5 and the new\n // strokeWidth function, we should be able to use that instead.\n if (strokeWidth === 'inherit') {\n strokeWidth = 1;\n }\n if (value) {\n value = value.toLowerCase();\n const v = value\n .replace('shortdashdotdot', '3,1,1,1,1,1,')\n .replace('shortdashdot', '3,1,1,1')\n .replace('shortdot', '1,1,')\n .replace('shortdash', '3,1,')\n .replace('longdash', '8,3,')\n .replace(/dot/g, '1,3,')\n .replace('dash', '4,3,')\n .replace(/,$/, '')\n .split(','); // Ending comma\n i = v.length;\n while (i--) {\n v[i] = '' + (pInt(v[i]) * pick(strokeWidth, NaN));\n }\n value = v.join(',').replace(/NaN/g, 'none'); // #3226\n this.element.setAttribute('stroke-dasharray', value);\n }\n }\n /**\n * Destroy the element and element wrapper and clear up the DOM and event\n * hooks.\n *\n * @function Highcharts.SVGElement#destroy\n */\n destroy() {\n const wrapper = this, { element = {}, renderer, stops } = wrapper, ownerSVGElement = element.ownerSVGElement;\n // Remove events\n element.onclick = element.onmouseout = element.onmouseover =\n element.onmousemove = element.point = null;\n stop(wrapper); // Stop running animations\n if (wrapper.clipPath && ownerSVGElement) {\n const clipPath = wrapper.clipPath;\n // Look for existing references to this clipPath and remove them\n // before destroying the element (#6196).\n // The upper case version is for Edge\n [].forEach.call(ownerSVGElement.querySelectorAll('[clip-path],[CLIP-PATH]'), function (el) {\n if (el.getAttribute('clip-path').indexOf(clipPath.element.id) > -1) {\n el.removeAttribute('clip-path');\n }\n });\n wrapper.clipPath = clipPath.destroy();\n }\n // Destroy stops in case this is a gradient object @todo old code?\n if (stops) {\n for (const stop of stops) {\n stop.destroy();\n }\n stops.length = 0;\n }\n // Remove element\n wrapper.safeRemoveChild(element);\n // Remove from alignObjects\n if (wrapper.alignOptions) {\n erase(renderer.alignedObjects, wrapper);\n }\n objectEach(wrapper, (val, key) => {\n if (\n // Destroy child elements of a group\n wrapper[key]?.parentGroup === wrapper ||\n // Destroy own elements\n ['connector', 'foreignObject'].indexOf(key) !== -1) {\n wrapper[key]?.destroy?.();\n }\n // Delete all properties\n delete wrapper[key];\n });\n return;\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#dSetter\n * @param {number|string|Highcharts.SVGPathArray} value\n * @param {string} key\n * @param {Highcharts.SVGDOMElement} element\n */\n dSetter(value, key, element) {\n if (isArray(value)) {\n // Backwards compatibility, convert one-dimensional array into an\n // array of segments\n if (typeof value[0] === 'string') {\n value = this.renderer.pathToSegments(value);\n }\n this.pathArray = value;\n value = value.reduce((acc, seg, i) => {\n if (!seg?.join) {\n return (seg || '').toString();\n }\n return (i ? acc + ' ' : '') + seg.join(' ');\n }, '');\n }\n if (/(NaN| {2}|^$)/.test(value)) {\n value = 'M 0 0';\n }\n // Check for cache before resetting. Resetting causes disturbance in the\n // DOM, causing flickering in some cases in Edge/IE (#6747). Also\n // possible performance gain.\n if (this[key] !== value) {\n element.setAttribute(key, value);\n this[key] = value;\n }\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#fillSetter\n * @param {Highcharts.ColorType} value\n * @param {string} key\n * @param {Highcharts.SVGDOMElement} element\n */\n fillSetter(value, key, element) {\n if (typeof value === 'string') {\n element.setAttribute(key, value);\n }\n else if (value) {\n this.complexColor(value, key, element);\n }\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#hrefSetter\n * @param {Highcharts.ColorType} value\n * @param {string} key\n * @param {Highcharts.SVGDOMElement} element\n */\n hrefSetter(value, key, element) {\n // Namespace is needed for offline export, #19106\n element.setAttributeNS('http://www.w3.org/1999/xlink', key, value);\n }\n /**\n * Get the bounding box (width, height, x and y) for the element. Generally\n * used to get rendered text size. Since this is called a lot in charts,\n * the results are cached based on text properties, in order to save DOM\n * traffic. The returned bounding box includes the rotation, so for example\n * a single text line of rotation 90 will report a greater height, and a\n * width corresponding to the line-height.\n *\n * @sample highcharts/members/renderer-on-chart/\n * Draw a rectangle based on a text's bounding box\n *\n * @function Highcharts.SVGElement#getBBox\n *\n * @param {boolean} [reload]\n * Skip the cache and get the updated DOM bounding box.\n *\n * @param {number} [rot]\n * Override the element's rotation. This is internally used on axis\n * labels with a value of 0 to find out what the bounding box would\n * be have been if it were not rotated.\n *\n * @return {Highcharts.BBoxObject}\n * The bounding box with `x`, `y`, `width` and `height` properties.\n */\n getBBox(reload, rot) {\n const wrapper = this, { element, renderer, styles, textStr } = wrapper, { cache, cacheKeys } = renderer, isSVG = element.namespaceURI === wrapper.SVG_NS, rotation = pick(rot, wrapper.rotation, 0), fontSize = renderer.styledMode ? (element &&\n SVGElement.prototype.getStyle.call(element, 'font-size')) : (styles.fontSize), cacheKey = this.getBBoxCacheKey([\n renderer.rootFontSize,\n this.textWidth, // #7874, also useHTML\n this.alignValue,\n styles.fontWeight, // #12163\n styles.lineClamp,\n styles.textOverflow, // #5968\n fontSize,\n rotation\n ]);\n let bBox, height, toggleTextShadowShim;\n if (cacheKey && !reload) {\n bBox = cache[cacheKey];\n }\n // No cache found\n if (!bBox || bBox.polygon) {\n // SVG elements\n if (isSVG || renderer.forExport) {\n try { // Fails in Firefox if the container has display: none.\n // When the text shadow shim is used, we need to hide the\n // fake shadows to get the correct bounding box (#3872)\n toggleTextShadowShim = this.fakeTS && function (display) {\n const outline = element.querySelector('.highcharts-text-outline');\n if (outline) {\n css(outline, { display });\n }\n };\n // Workaround for #3842, Firefox reporting wrong bounding\n // box for shadows\n if (isFunction(toggleTextShadowShim)) {\n toggleTextShadowShim('none');\n }\n bBox = element.getBBox ?\n // SVG: use extend because IE9 is not allowed to change\n // width and height in case of rotation (below)\n extend({}, element.getBBox()) : {\n // HTML elements with `exporting.allowHTML` and\n // legacy IE in export mode\n width: element.offsetWidth,\n height: element.offsetHeight,\n x: 0,\n y: 0\n };\n // #3842\n if (isFunction(toggleTextShadowShim)) {\n toggleTextShadowShim('');\n }\n }\n catch {\n // Ignore error\n }\n // If the bBox is not set, the try-catch block above failed. The\n // other condition is for Opera that returns a width of\n // -Infinity on hidden elements.\n if (!bBox || bBox.width < 0) {\n bBox = { x: 0, y: 0, width: 0, height: 0 };\n }\n // Use HTML within SVG\n }\n else {\n bBox = wrapper.htmlGetBBox();\n }\n // True SVG elements as well as HTML elements in modern browsers\n // using the .useHTML option need to compensated for rotation\n height = bBox.height;\n // Workaround for wrong bounding box in IE, Edge and Chrome on\n // Windows. With Highcharts' default font, IE and Edge report\n // a box height of 16.899 and Chrome rounds it to 17. If this\n // stands uncorrected, it results in more padding added below\n // the text than above when adding a label border or background.\n // Also vertical positioning is affected.\n // https://jsfiddle.net/highcharts/em37nvuj/\n // (#1101, #1505, #1669, #2568, #6213).\n if (isSVG) {\n bBox.height = height = ({\n '11px,17': 14,\n '13px,20': 16\n }[`${fontSize || ''},${Math.round(height)}`] ||\n height);\n }\n // Adjust for rotated text\n if (rotation) {\n bBox = this.getRotatedBox(bBox, rotation);\n }\n // Create a reference to catch changes to bBox\n const e = { bBox };\n fireEvent(this, 'afterGetBBox', e);\n // Pick up any changes after the fired event\n bBox = e.bBox;\n }\n // Cache it. When loading a chart in a hidden iframe in Firefox and\n // IE/Edge, the bounding box height is 0, so don't cache it (#5620).\n if (cacheKey && (textStr === '' || bBox.height > 0)) {\n // Rotate (#4681)\n while (cacheKeys.length > 250) {\n delete cache[cacheKeys.shift()];\n }\n if (!cache[cacheKey]) {\n cacheKeys.push(cacheKey);\n }\n cache[cacheKey] = bBox;\n }\n return bBox;\n }\n /**\n * Overridable method to get a cache key for the bounding box of this\n * element.\n *\n * @example\n * // Plugin to let the getBBox function respond to font family changes\n * (({ SVGElement }) => {\n * const getBBoxCacheKey = SVGElement.prototype.getBBoxCacheKey;\n * SVGElement.prototype.getBBoxCacheKey = function (keys) {\n * const key = getBBoxCacheKey.call(this, keys);\n * const fontFamily = this.styles.fontFamily;\n * return key + (fontFamily ? `,${fontFamily}` : '');\n * };\n * })(Highcharts);\n *\n * @function Highcharts.SVGElement#getBBoxCacheKey\n *\n * @return {string|void} The cache key based on the text properties.\n */\n getBBoxCacheKey(keys) {\n // Avoid undefined and null (#7316)\n if (defined(this.textStr)) {\n let textStr = '' + this.textStr;\n // Since numerical labels appear a lot in a chart, we approximate\n // that a label of n characters has the same bounding box as others\n // of the same length. Unless there is inner HTML in the label. In\n // that case, leave the numbers as is (#5899).\n if (textStr.indexOf('<') === -1) {\n textStr = textStr.replace(/\\d/g, '0');\n }\n // Properties that affect bounding box\n return [\n textStr,\n ...keys\n ].join(',');\n }\n }\n /**\n * Get the rotated box.\n * @internal\n */\n getRotatedBox(box, rotation) {\n const { x: boxX, y: boxY, width, height } = box, { alignValue, translateY, rotationOriginX = 0, rotationOriginY = 0 } = this, alignFactor = getAlignFactor(alignValue), baseline = Number(this.element.getAttribute('y') || 0) -\n (translateY ? 0 : boxY), rad = rotation * deg2rad, rad90 = (rotation - 90) * deg2rad, cosRad = Math.cos(rad), sinRad = Math.sin(rad), wCosRad = width * cosRad, wSinRad = width * sinRad, cosRad90 = Math.cos(rad90), sinRad90 = Math.sin(rad90), [[xOriginCosRad, xOriginSinRad], [yOriginCosRad, yOriginSinRad]] = [\n rotationOriginX,\n rotationOriginY\n ].map((rotOrigin) => [\n rotOrigin - (rotOrigin * cosRad),\n rotOrigin * sinRad\n ]), \n // Find the starting point on the left side baseline of\n // the text\n pX = ((boxX + alignFactor * (width - wCosRad)) +\n xOriginCosRad + yOriginSinRad), pY = ((boxY + baseline - alignFactor * wSinRad) -\n xOriginSinRad + yOriginCosRad), \n // Find all corners\n aX = pX + baseline * cosRad90, bX = aX + wCosRad, cX = bX - height * cosRad90, dX = cX - wCosRad, aY = pY + baseline * sinRad90, bY = aY + wSinRad, cY = bY - height * sinRad90, dY = cY - wSinRad;\n // Deduct the bounding box from the corners\n const x = Math.min(aX, bX, cX, dX), y = Math.min(aY, bY, cY, dY), boxWidth = Math.max(aX, bX, cX, dX) - x, boxHeight = Math.max(aY, bY, cY, dY) - y;\n /* Uncomment to visualize boxes\n this.bBoxViz ??= this.renderer.path()\n .attr({\n stroke: 'red',\n 'stroke-width': 1,\n zIndex: 20\n })\n .add();\n this.bBoxViz.attr('d', [\n ['M', aX, aY],\n ['L', bX, bY],\n ['L', cX, cY],\n ['L', dX, dY],\n ['Z']\n ]);\n // */\n return {\n x,\n y,\n width: boxWidth,\n height: boxHeight,\n polygon: [\n [aX, aY],\n [bX, bY],\n [cX, cY],\n [dX, dY]\n ]\n };\n }\n /**\n * Get the computed style. Only in styled mode.\n *\n * @example\n * chart.series[0].points[0].graphic.getStyle('stroke-width'); // => '1px'\n *\n * @function Highcharts.SVGElement#getStyle\n *\n * @param {string} prop\n * The property name to check for.\n *\n * @return {string}\n * The current computed value.\n */\n getStyle(prop) {\n return win\n .getComputedStyle(this.element || this, '')\n .getPropertyValue(prop);\n }\n /**\n * Check if an element has the given class name.\n *\n * @function Highcharts.SVGElement#hasClass\n *\n * @param {string} className\n * The class name to check for.\n *\n * @return {boolean}\n * Whether the class name is found.\n */\n hasClass(className) {\n return ('' + this.attr('class'))\n .split(' ')\n .indexOf(className) !== -1;\n }\n /**\n * Hide the element, similar to setting the `visibility` attribute to\n * `hidden`.\n *\n * @function Highcharts.SVGElement#hide\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVGElement for chaining.\n */\n hide() {\n return this.attr({ visibility: 'hidden' });\n }\n /** @internal */\n htmlGetBBox() {\n return { height: 0, width: 0, x: 0, y: 0 };\n }\n /**\n * Initialize the SVG element. This function only exists to make the\n * initialization process overridable. It should not be called directly.\n *\n * @function Highcharts.SVGElement#init\n *\n * @param {Highcharts.SVGRenderer} renderer\n * The SVGRenderer instance to initialize to.\n *\n * @param {string} nodeName\n * The SVG node name.\n */\n constructor(renderer, nodeName) {\n /** @internal */\n this.onEvents = {};\n /** @internal */\n this.opacity = 1; // Default base for animation\n /** @internal */\n this.SVG_NS = SVG_NS;\n /**\n * The primary DOM node. Each `SVGElement` instance wraps a main DOM\n * node, but may also represent more nodes.\n *\n * @name Highcharts.SVGElement#element\n * @type {Highcharts.SVGDOMElement|Highcharts.HTMLDOMElement}\n */\n this.element = nodeName === 'div' || nodeName === 'body' ?\n createElement(nodeName) :\n doc.createElementNS(this.SVG_NS, nodeName);\n /**\n * The renderer that the SVGElement belongs to.\n *\n * @name Highcharts.SVGElement#renderer\n * @type {Highcharts.SVGRenderer}\n */\n this.renderer = renderer;\n this.styles = {};\n fireEvent(this, 'afterInit');\n }\n /**\n * Add an event listener. This is a simple setter that replaces the\n * previous event of the same type added by this function, as opposed to\n * the {@link Highcharts#addEvent} function.\n *\n * @sample highcharts/members/element-on/\n * A clickable rectangle\n *\n * @function Highcharts.SVGElement#on\n *\n * @param {string} eventType\n * The event type.\n *\n * @param {Function} handler\n * The handler callback.\n *\n * @return {Highcharts.SVGElement}\n * The SVGElement for chaining.\n */\n on(eventType, handler) {\n const { onEvents } = this;\n if (onEvents[eventType]) {\n // Unbind existing event\n onEvents[eventType]();\n }\n onEvents[eventType] = addEvent(this.element, eventType, handler);\n return this;\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#opacitySetter\n * @param {string} value\n * @param {string} key\n * @param {Highcharts.SVGDOMElement} element\n */\n opacitySetter(value, key, element) {\n // Round off to avoid float errors, like tests where opacity lands on\n // 9.86957e-06 instead of 0\n const opacity = Number(Number(value).toFixed(3));\n this.opacity = opacity;\n element.setAttribute(key, opacity);\n }\n /**\n * Re-align an aligned text or label after setting the text.\n *\n * @internal\n * @function Highcharts.SVGElement#reAlign\n *\n */\n reAlign() {\n if (this.alignOptions?.width && this.alignOptions.align !== 'left') {\n this.alignOptions.width = this.getBBox().width;\n this.placed = false; // Block animation\n this.align();\n }\n }\n /**\n * Remove a class name from the element.\n *\n * @function Highcharts.SVGElement#removeClass\n *\n * @param {string|RegExp} className\n * The class name to remove.\n *\n * @return {Highcharts.SVGElement} Returns the SVG element for chainability.\n */\n removeClass(className) {\n return this.attr('class', ('' + this.attr('class'))\n .replace(isString(className) ?\n new RegExp(`(^| )${className}( |$)`) : // #12064, #13590\n className, ' ')\n .replace(/ +/g, ' ')\n .trim());\n }\n /**\n *\n * @internal\n */\n removeTextOutline() {\n const outline = this.element\n .querySelector('tspan.highcharts-text-outline');\n if (outline) {\n this.safeRemoveChild(outline);\n }\n }\n /**\n * Removes an element from the DOM.\n *\n * @internal\n * @function Highcharts.SVGElement#safeRemoveChild\n *\n * @param {Highcharts.SVGDOMElement|Highcharts.HTMLDOMElement} element\n * The DOM node to remove.\n */\n safeRemoveChild(element) {\n const parentNode = element.parentNode;\n if (parentNode) {\n parentNode.removeChild(element);\n }\n }\n /**\n * Set the coordinates needed to draw a consistent radial gradient across\n * a shape regardless of positioning inside the chart. Used on pie slices\n * to make all the slices have the same radial reference point.\n *\n * @function Highcharts.SVGElement#setRadialReference\n *\n * @param {Array<number>} coordinates\n * The center reference. The format is `[centerX, centerY, diameter]` in\n * pixels.\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVGElement for chaining.\n */\n setRadialReference(coordinates) {\n const existingGradient = (this.element.gradient &&\n this.renderer.gradients[this.element.gradient]) || void 0;\n this.element.radialReference = coordinates;\n // On redrawing objects with an existing gradient, the gradient needs\n // to be repositioned (#3801)\n if (existingGradient?.radAttr) {\n existingGradient.animate(this.renderer.getRadialAttr(coordinates, existingGradient.radAttr));\n }\n return this;\n }\n /**\n * Add a shadow to the element. In styled mode, this method is not used,\n * instead use `defs` and filters.\n *\n * @example\n * renderer.rect(10, 100, 100, 100)\n * .attr({ fill: 'red' })\n * .shadow(true);\n *\n * @function Highcharts.SVGElement#shadow\n *\n * @param {boolean|Highcharts.ShadowOptionsObject} [shadowOptions] The\n * shadow options. If `true`, the default options are applied. If\n * `false`, the current shadow will be removed.\n *\n * @return {Highcharts.SVGElement} Returns the SVGElement for chaining.\n */\n shadow(shadowOptions) {\n const { renderer } = this, options = merge(this.parentGroup?.rotation === 90 ? {\n offsetX: -1,\n offsetY: -1\n } : {}, isObject(shadowOptions) ? shadowOptions : {}), id = renderer.shadowDefinition(options);\n return this.attr({\n filter: shadowOptions ?\n `url(${renderer.url}#${id})` :\n 'none'\n });\n }\n /**\n * Show the element after it has been hidden.\n *\n * @function Highcharts.SVGElement#show\n *\n * @param {boolean} [inherit=true]\n * Set the visibility attribute to `inherit` rather than `visible`.\n * The difference is that an element with `visibility=\"visible\"`\n * will be visible even if the parent is hidden.\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVGElement for chaining.\n */\n show(inherit = true) {\n return this.attr({ visibility: inherit ? 'inherit' : 'visible' });\n }\n /**\n * Set the stroke-width and record it on the SVGElement\n *\n * @internal\n * @function Highcharts.SVGElement#strokeSetter\n * @param {number|string|ColorType} value\n * @param {string} key\n * @param {Highcharts.SVGDOMElement} element\n */\n 'stroke-widthSetter'(value, key, element) {\n // Record it for quick access in getter\n this[key] = value;\n element.setAttribute(key, value);\n }\n /**\n * Get the computed stroke width in pixel values. This is used extensively\n * when drawing shapes to ensure the shapes are rendered crisp and\n * positioned correctly relative to each other. Using\n * `shape-rendering: crispEdges` leaves us less control over positioning,\n * for example when we want to stack columns next to each other, or position\n * things pixel-perfectly within the plot box.\n *\n * The common pattern when placing a shape is:\n * - Create the SVGElement and add it to the DOM. In styled mode, it will\n * now receive a stroke width from the style sheet. In classic mode we\n * will add the `stroke-width` attribute.\n * - Read the computed `elem.strokeWidth()`.\n * - Place it based on the stroke width.\n *\n * @function Highcharts.SVGElement#strokeWidth\n *\n * @return {number}\n * The stroke width in pixels. Even if the given stroke width (in CSS or by\n * attributes) is based on `em` or other units, the pixel size is returned.\n */\n strokeWidth() {\n // In non-styled mode, read the stroke width as set by .attr\n if (!this.renderer.styledMode) {\n return this['stroke-width'] || 0;\n }\n // In styled mode, read computed stroke width\n const val = this.getStyle('stroke-width');\n let ret = 0, tempElement;\n // Read pixel values directly\n if (/px$/.test(val)) {\n ret = pInt(val);\n // Other values like em, pt etc need to be measured\n }\n else if (val !== '') {\n tempElement = doc.createElementNS(SVG_NS, 'rect');\n attr(tempElement, {\n width: val,\n 'stroke-width': 0\n });\n this.element.parentNode.appendChild(tempElement);\n ret = tempElement.getBBox().width;\n tempElement.parentNode.removeChild(tempElement);\n }\n return ret;\n }\n /**\n * If one of the symbol size affecting parameters are changed,\n * check all the others only once for each call to an element's\n * .attr() method\n *\n * @internal\n * @function Highcharts.SVGElement#symbolAttr\n *\n * @param {Highcharts.SVGAttributes} hash\n * The attributes to set.\n */\n symbolAttr(hash) {\n const wrapper = this;\n SVGElement.symbolCustomAttribs.forEach(function (key) {\n wrapper[key] = pick(hash[key], wrapper[key]);\n });\n wrapper.attr({\n d: wrapper.renderer.symbols[wrapper.symbolName](wrapper.x, wrapper.y, wrapper.width, wrapper.height, wrapper)\n });\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#textSetter\n * @param {string} value\n */\n textSetter(value) {\n if (value !== this.textStr) {\n // Delete size caches when the text changes\n delete this.textPxLength;\n this.textStr = value;\n if (this.added) {\n this.renderer.buildText(this);\n }\n this.reAlign();\n }\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#titleSetter\n * @param {string} value\n */\n titleSetter(value) {\n const el = this.element;\n const titleNode = el.getElementsByTagName('title')[0] ||\n doc.createElementNS(this.SVG_NS, 'title');\n // Move to first child\n if (el.insertBefore) {\n el.insertBefore(titleNode, el.firstChild);\n }\n else {\n el.appendChild(titleNode);\n }\n // Replace text content and escape markup\n titleNode.textContent = replaceNested(// Scan #[73]\n pick(value, ''), // #3276, #3895\n [/<[^>]*>/g, '']).replace(/</g, '<').replace(/>/g, '>');\n }\n /**\n * Bring the element to the front. Alternatively, a new zIndex can be set.\n *\n * @sample highcharts/members/element-tofront/\n * Click an element to bring it to front\n *\n * @function Highcharts.SVGElement#toFront\n *\n * @return {Highcharts.SVGElement}\n * Returns the SVGElement for chaining.\n */\n toFront() {\n const element = this.element;\n element.parentNode.appendChild(element);\n return this;\n }\n /**\n * Move an object and its children by x and y values.\n *\n * @function Highcharts.SVGElement#translate\n *\n * @param {number} x\n * The x value.\n *\n * @param {number} y\n * The y value.\n *\n * @return {Highcharts.SVGElement}\n * Translated element.\n */\n translate(x, y) {\n return this.attr({\n translateX: x,\n translateY: y\n });\n }\n /**\n * Update the transform attribute based on internal properties. Deals with\n * the custom `translateX`, `translateY`, `rotation`, `scaleX` and `scaleY`\n * attributes and updates the SVG `transform` attribute.\n *\n * @internal\n * @function Highcharts.SVGElement#updateTransform\n */\n updateTransform(attrib = 'transform') {\n const { element, foreignObject, matrix, rotation = 0, rotationOriginX, rotationOriginY, scaleX, scaleY, text, translateX = 0, translateY = 0 } = this;\n // Apply translate. Nearly all transformed elements have translation,\n // so instead of checking for translate = 0, do it always (#1767,\n // #1846).\n const transform = [`translate(${translateX},${translateY})`];\n // Apply matrix\n if (defined(matrix)) {\n transform.push('matrix(' + matrix.join(',') + ')');\n }\n // Apply rotation\n if (rotation) {\n transform.push('rotate(' + rotation + ' ' +\n (rotationOriginX ?? element.getAttribute('x') ?? this.x ?? 0) +\n ' ' +\n (rotationOriginY ?? element.getAttribute('y') ?? this.y ?? 0) +\n ')');\n }\n // Apply scale\n if (defined(scaleX) || defined(scaleY)) {\n transform.push(`scale(${scaleX ?? 1} ${scaleY ?? 1})`);\n }\n if (transform.length && !(text || this).textPath) {\n (foreignObject?.element || element)\n .setAttribute(attrib, transform.join(' '));\n }\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#visibilitySetter\n *\n * @param {string} value\n *\n * @param {string} key\n *\n * @param {Highcharts.SVGDOMElement} element\n *\n */\n visibilitySetter(value, key, element) {\n // IE9-11 doesn't handle visibility:inherit well, so we remove the\n // attribute instead (#2881, #3909)\n if (value === 'inherit') {\n element.removeAttribute(key);\n }\n else if (this[key] !== value) { // #6747\n element.setAttribute(key, value);\n }\n this[key] = value;\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#xGetter\n */\n xGetter(key) {\n if (this.element.nodeName === 'circle') {\n if (key === 'x') {\n key = 'cx';\n }\n else if (key === 'y') {\n key = 'cy';\n }\n }\n return this._defaultGetter(key);\n }\n /**\n * @internal\n * @function Highcharts.SVGElement#zIndexSetter\n */\n zIndexSetter(value, key) {\n const { element, parentGroup, renderer } = this, parentNode = parentGroup?.element || renderer.box, svgParent = parentNode === renderer.box;\n let childNodes, otherElement, otherZIndex, inserted = false, undefinedOtherZIndex, run = this.added, i;\n if (defined(value)) {\n // So we can read it for other elements in the group\n element.setAttribute('data-z-index', value);\n value = +value;\n if (this[key] === value) {\n // Only update when needed (#3865)\n run = false;\n }\n }\n else if (defined(this[key])) {\n element.removeAttribute('data-z-index');\n }\n this[key] = value;\n // Insert according to this and other elements' zIndex. Before .add() is\n // called, nothing is done. Then on add, or by later calls to\n // zIndexSetter, the node is placed on the right place in the DOM.\n if (run) {\n value = this.zIndex;\n if (value && parentGroup) {\n parentGroup.handleZ = true;\n }\n childNodes = parentNode.childNodes;\n for (i = childNodes.length - 1; i >= 0 && !inserted; i--) {\n otherElement = childNodes[i];\n otherZIndex = otherElement.getAttribute('data-z-index');\n undefinedOtherZIndex = !defined(otherZIndex);\n if (otherElement !== element) {\n if (\n // Negative zIndex versus no zIndex:\n // On all levels except the highest. If the parent is\n // <svg>, then we don't want to put items before <desc>\n // or <defs>\n defined(value) && value < 0 &&\n undefinedOtherZIndex &&\n !svgParent &&\n !i) {\n parentNode.insertBefore(element, childNodes[i]);\n inserted = true;\n }\n else if (\n // Insert after the first element with a lower zIndex\n (defined(value) &&\n parseFloat(otherZIndex || '') <= value) ||\n // If negative zIndex, add this before first undefined\n // zIndex element\n (undefinedOtherZIndex &&\n (!defined(value) || value >= 0))) {\n parentNode.insertBefore(element, childNodes[i + 1]);\n inserted = true;\n }\n }\n }\n if (!inserted) {\n parentNode.insertBefore(element, childNodes[svgParent ? 3 : 0]);\n inserted = true;\n }\n }\n return inserted;\n }\n}\n/* *\n *\n * Properties\n *\n * */\n/**\n * Custom attributes used for symbols, these should be filtered out when\n * setting SVGElement attributes (#9375).\n * @internal\n */\nSVGElement.symbolCustomAttribs = [\n 'anchorX',\n 'anchorY',\n 'clockwise',\n 'end',\n 'height',\n 'innerR',\n 'r',\n 'start',\n 'width',\n 'x',\n 'y'\n];\n// Some shared setters and getters\nSVGElement.prototype.strokeSetter = SVGElement.prototype.fillSetter;\nSVGElement.prototype.yGetter = SVGElement.prototype.xGetter;\nSVGElement.prototype.matrixSetter =\n SVGElement.prototype.rotationOriginXSetter =\n SVGElement.prototype.rotationOriginYSetter =\n SVGElement.prototype.rotationSetter =\n SVGElement.prototype.scaleXSetter =\n SVGElement.prototype.scaleYSetter =\n SVGElement.prototype.translateXSetter =\n SVGElement.prototype.translateYSetter =\n SVGElement.prototype.verticalAlignSetter = function (value, key) {\n this[key] = value;\n this.doTransform = true;\n };\n/* *\n *\n * Default Export\n *\n * */\nexport default SVGElement;\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Reference to the global SVGElement class as a workaround for a name conflict\n * in the Highcharts namespace.\n *\n * @global\n * @typedef {global.SVGElement} GlobalSVGElement\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGElement\n */\n/**\n * The horizontal alignment of an element.\n *\n * @typedef {\"center\"|\"left\"|\"right\"} Highcharts.AlignValue\n */\n/**\n * Options to align the element relative to the chart or another box.\n *\n * @interface Highcharts.AlignObject\n */ /**\n* Horizontal alignment. Can be one of `left`, `center` and `right`.\n*\n* @name Highcharts.AlignObject#align\n* @type {Highcharts.AlignValue|undefined}\n*\n* @default left\n*/ /**\n* Vertical alignment. Can be one of `top`, `middle` and `bottom`.\n*\n* @name Highcharts.AlignObject#verticalAlign\n* @type {Highcharts.VerticalAlignValue|undefined}\n*\n* @default top\n*/ /**\n* Horizontal pixel offset from alignment.\n*\n* @name Highcharts.AlignObject#x\n* @type {number|undefined}\n*\n* @default 0\n*/ /**\n* Vertical pixel offset from alignment.\n*\n* @name Highcharts.AlignObject#y\n* @type {number|undefined}\n*\n* @default 0\n*/ /**\n* Use the `transform` attribute with translateX and translateY custom\n* attributes to align this elements rather than `x` and `y` attributes.\n*\n* @name Highcharts.AlignObject#alignByTranslate\n* @type {boolean|undefined}\n*\n* @default false\n*/\n/**\n * Bounding box of an element.\n *\n * @interface Highcharts.BBoxObject\n * @extends Highcharts.PositionObject\n */ /**\n* Height of the bounding box.\n*\n* @name Highcharts.BBoxObject#height\n* @type {number}\n*/ /**\n* Width of the bounding box.\n*\n* @name Highcharts.BBoxObject#width\n* @type {number}\n*/ /**\n* Horizontal position of the bounding box.\n*\n* @name Highcharts.BBoxObject#x\n* @type {number}\n*/ /**\n* Vertical position of the bounding box.\n*\n* @name Highcharts.BBoxObject#y\n* @type {number}\n*/\n/**\n * An object of key-value pairs for SVG attributes. Attributes in Highcharts\n * elements for the most parts correspond to SVG, but some are specific to\n * Highcharts, like `zIndex`, `rotation`, `rotationOriginX`,\n * `rotationOriginY`, `translateX`, `translateY`, `scaleX` and `scaleY`. SVG\n * attributes containing a hyphen are _not_ camel-cased, they should be\n * quoted to preserve the hyphen.\n *\n * @example\n * {\n * 'stroke': '#ff0000', // basic\n * 'stroke-width': 2, // hyphenated\n * 'rotation': 45 // custom\n * 'd': ['M', 10, 10, 'L', 30, 30, 'z'] // path definition, note format\n * }\n *\n * @interface Highcharts.SVGAttributes\n */ /**\n* @name Highcharts.SVGAttributes#[key:string]\n* @type {*}\n*/ /**\n* @name Highcharts.SVGAttributes#d\n* @type {string|Highcharts.SVGPathArray|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#dx\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#dy\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#fill\n* @type {Highcharts.ColorType|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#inverted\n* @type {boolean|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#matrix\n* @type {Array<number>|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#rotation\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#rotationOriginX\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#rotationOriginY\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#scaleX\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#scaleY\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#stroke\n* @type {Highcharts.ColorType|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#style\n* @type {string|Highcharts.CSSObject|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#translateX\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#translateY\n* @type {number|undefined}\n*/ /**\n* @name Highcharts.SVGAttributes#zIndex\n* @type {number|undefined}\n*/\n/**\n * An SVG DOM element. The type is a reference to the regular SVGElement in the\n * global scope.\n *\n * @typedef {globals.GlobalSVGElement} Highcharts.SVGDOMElement\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGElement\n */\n/**\n * The vertical alignment of an element.\n *\n * @typedef {\"bottom\"|\"middle\"|\"top\"} Highcharts.VerticalAlignValue\n */\n''; // Keeps doclets above in JS file\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SeriesRegistry-CXsAINSj.js","names":["H","D","G","format","defaultOptions","D","F","defaultOptions","D","H"],"sources":["../node_modules/highcharts/es-modules/Core/Renderer/HTML/AST.js","../node_modules/highcharts/es-modules/Core/Templating.js","../node_modules/highcharts/es-modules/Core/Series/Point.js","../node_modules/highcharts/es-modules/Core/Series/SeriesRegistry.js"],"sourcesContent":["/* *\n *\n * (c) 2010-2026 Highsoft AS\n * Author: Torstein Hønsi\n *\n * Integration of this software requires a license.\n * - For commercial use, see www.highcharts.com/license\n * - For non-commercial, see www.highcharts.com/license-eula\n *\n *\n * */\n'use strict';\nimport H from '../../Globals.js';\nconst { SVG_NS, win } = H;\nimport { attr, createElement, css, isFunction, isString, objectEach, splat } from '../../../Shared/Utilities.js';\nimport { error } from '../../Utilities.js';\nconst { trustedTypes } = win;\n/* *\n *\n * Constants\n *\n * */\n// Create the trusted type policy. This should not be exposed.\nconst trustedTypesPolicy = (trustedTypes &&\n isFunction(trustedTypes.createPolicy) &&\n trustedTypes.createPolicy('highcharts', {\n createHTML: (s) => s\n }));\nconst emptyHTML = trustedTypesPolicy ?\n trustedTypesPolicy.createHTML('') :\n '';\n/* *\n *\n * Class\n *\n * */\n/**\n * The AST class represents an abstract syntax tree of HTML or SVG content. It\n * can take HTML as an argument, parse it, optionally transform it to SVG, then\n * perform sanitation before inserting it into the DOM.\n *\n * @class\n * @name Highcharts.AST\n *\n * @param {string|Array<Highcharts.ASTNode>} source\n * Either an HTML string or an ASTNode list to populate the tree.\n */\nclass AST {\n /* *\n *\n * Static Functions\n *\n * */\n /**\n * Filter an object of SVG or HTML attributes against the allow list.\n *\n * @static\n *\n * @function Highcharts.AST#filterUserAttributes\n *\n * @param {Highcharts.SVGAttributes} attributes The attributes to filter\n *\n * @return {Highcharts.SVGAttributes}\n * The filtered attributes\n */\n static filterUserAttributes(attributes) {\n objectEach(attributes, (val, key) => {\n let valid = true;\n if (AST.allowedAttributes.indexOf(key) === -1) {\n valid = false;\n }\n if (['background', 'dynsrc', 'href', 'lowsrc', 'src']\n .indexOf(key) !== -1) {\n valid = isString(val) && AST.allowedReferences.some((ref) => val.indexOf(ref) === 0);\n }\n if (!valid) {\n error(33, false, void 0, {\n 'Invalid attribute in config': `${key}`\n });\n delete attributes[key];\n }\n // #17753, < is not allowed in SVG attributes\n if (isString(val) && attributes[key]) {\n attributes[key] = val.replace(/</g, '<');\n }\n });\n return attributes;\n }\n /**\n * Utility function to parse a style string to a CSSObject.\n *\n * @internal\n * @param {string} style\n * The style string to parse.\n * @return {Highcharts.CSSObject}\n * The parsed CSSObject.\n */\n static parseStyle(style) {\n return style\n .split(';')\n .reduce((styles, line) => {\n const pair = line.split(':').map((s) => s.trim()), key = pair.shift();\n if (key && pair.length) {\n styles[key.replace(/-([a-z])/g, (g) => g[1].toUpperCase())] = pair.join(':'); // #17146\n }\n return styles;\n }, {});\n }\n /**\n * Utility function to set html content for an element by passing in a\n * markup string. The markup is safely parsed by the AST class to avoid\n * XSS vulnerabilities. This function should be used instead of setting\n * `innerHTML` in all cases where the content is not fully trusted.\n *\n * @static\n * @function Highcharts.AST#setElementHTML\n *\n * @param {SVGDOMElement|HTMLDOMElement} el\n * Node to set content of.\n *\n * @param {string} html\n * Markup string\n */\n static setElementHTML(el, html) {\n el.innerHTML = AST.emptyHTML; // Clear previous\n if (html) {\n const ast = new AST(html);\n ast.addToDOM(el);\n }\n }\n /* *\n *\n * Constructor\n *\n * */\n // Construct an AST from HTML markup, or wrap an array of existing AST nodes\n constructor(source) {\n this.nodes = typeof source === 'string' ?\n this.parseMarkup(source) : source;\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Add the tree defined as a hierarchical JS structure to the DOM\n *\n * @function Highcharts.AST#addToDOM\n *\n * @param {Highcharts.HTMLDOMElement|Highcharts.SVGDOMElement} parent\n * The node where it should be added\n *\n * @return {Highcharts.HTMLDOMElement|Highcharts.SVGDOMElement}\n * The inserted node.\n */\n addToDOM(parent) {\n /**\n * @internal\n * @param {Highcharts.ASTNode} subtree\n * HTML/SVG definition.\n * @param {Element} [subParent]\n * Parent node.\n * @return {Highcharts.SVGDOMElement|Highcharts.HTMLDOMElement}\n * The inserted node.\n */\n function recurse(subtree, subParent) {\n let ret;\n splat(subtree).forEach(function (item) {\n const tagName = item.tagName;\n const textNode = item.textContent ?\n H.doc.createTextNode(item.textContent) :\n void 0;\n // Whether to ignore the AST filtering totally, #15345\n const bypassHTMLFiltering = AST.bypassHTMLFiltering;\n let node;\n if (tagName) {\n if (tagName === '#text') {\n node = textNode;\n }\n else if (AST.allowedTags.indexOf(tagName) !== -1 ||\n bypassHTMLFiltering) {\n const NS = tagName === 'svg' ?\n SVG_NS :\n (subParent.namespaceURI || SVG_NS);\n const element = H.doc.createElementNS(NS, tagName);\n const attributes = item.attributes || {};\n // Apply attributes from root of AST node, legacy from\n // from before TextBuilder\n objectEach(item, function (val, key) {\n if (key !== 'tagName' &&\n key !== 'attributes' &&\n key !== 'children' &&\n key !== 'style' &&\n key !== 'textContent') {\n attributes[key] = val;\n }\n });\n attr(element, bypassHTMLFiltering ?\n attributes :\n AST.filterUserAttributes(attributes));\n if (item.style) {\n css(element, item.style);\n }\n // Add text content\n if (textNode) {\n element.appendChild(textNode);\n }\n // Recurse\n recurse(item.children || [], element);\n node = element;\n }\n else {\n error(33, false, void 0, {\n 'Invalid tagName in config': tagName\n });\n }\n }\n // Add to the tree\n if (node) {\n subParent.appendChild(node);\n }\n ret = node;\n });\n // Return last node added (on top level it's the only one)\n return ret;\n }\n return recurse(this.nodes, parent);\n }\n /**\n * Parse HTML/SVG markup into AST Node objects. Used internally from the\n * constructor.\n *\n * @internal\n * @param {string} markup\n * The markup string.\n * @return {Array<Highcharts.ASTNode>}\n * The parsed nodes.\n */\n parseMarkup(markup) {\n const nodes = [];\n markup = markup\n .trim()\n // The style attribute throws a warning when parsing when CSP is\n // enabled (#6884), so use an alias and pick it up below\n // Make all quotation marks parse correctly to DOM (#17627)\n .replace(/ style=([\"'])/g, ' data-style=$1');\n let doc;\n try {\n doc = new DOMParser().parseFromString(trustedTypesPolicy ?\n trustedTypesPolicy.createHTML(markup) :\n markup, 'text/html');\n }\n catch {\n // There are two cases where this fails:\n // 1. IE9 and PhantomJS, where the DOMParser only supports parsing\n // XML\n // 2. Due to a Chromium issue where chart redraws are triggered by\n // a `beforeprint` event (#16931),\n // https://issues.chromium.org/issues/40222135\n }\n if (!doc) {\n const body = createElement('div');\n body.innerHTML = markup;\n doc = { body };\n }\n const appendChildNodes = (node, addTo) => {\n // Preserve the camelCase of SVG tags via localName (#24702).\n const tagName = node.localName ||\n node.nodeName.toLowerCase();\n // Add allowed tags\n const astNode = {\n tagName\n };\n if (tagName === '#text') {\n astNode.textContent = node.textContent || '';\n }\n const parsedAttributes = node.attributes;\n // Add attributes\n if (parsedAttributes) {\n const attributes = {};\n [].forEach.call(parsedAttributes, (attrib) => {\n if (attrib.name === 'data-style') {\n astNode.style = AST.parseStyle(attrib.value);\n }\n else {\n attributes[attrib.name] = attrib.value;\n }\n });\n astNode.attributes = attributes;\n }\n // Handle children\n if (node.childNodes.length) {\n const children = [];\n [].forEach.call(node.childNodes, (childNode) => {\n appendChildNodes(childNode, children);\n });\n if (children.length) {\n astNode.children = children;\n }\n }\n addTo.push(astNode);\n };\n [].forEach.call(doc.body.childNodes, (childNode) => appendChildNodes(childNode, nodes));\n return nodes;\n }\n}\n/* *\n *\n * Static Properties\n *\n * */\n/**\n * The list of allowed SVG or HTML attributes, used for sanitizing\n * potentially harmful content from the chart configuration before adding to\n * the DOM.\n *\n * @see [Source code with default values](\n * https://github.com/highcharts/highcharts/blob/master/ts/Core/Renderer/HTML/AST.ts#:~:text=public%20static%20allowedAttributes)\n *\n * @example\n * // Allow a custom, trusted attribute\n * Highcharts.AST.allowedAttributes.push('data-value');\n *\n * @name Highcharts.AST.allowedAttributes\n * @type {Array<string>}\n */\nAST.allowedAttributes = [\n 'alt',\n 'aria-controls',\n 'aria-describedby',\n 'aria-expanded',\n 'aria-haspopup',\n 'aria-hidden',\n 'aria-label',\n 'aria-labelledby',\n 'aria-live',\n 'aria-pressed',\n 'aria-readonly',\n 'aria-roledescription',\n 'aria-selected',\n 'aria-sort',\n 'class',\n 'clip-path',\n 'color',\n 'colspan',\n 'cx',\n 'cy',\n 'd',\n 'disabled',\n 'dx',\n 'dy',\n 'fill',\n 'filterUnits',\n 'flood-color',\n 'flood-opacity',\n 'height',\n 'href',\n 'id',\n 'in',\n 'in2',\n 'markerHeight',\n 'markerWidth',\n 'offset',\n 'opacity',\n 'operator',\n 'orient',\n 'padding',\n 'paddingLeft',\n 'paddingRight',\n 'patternUnits',\n 'r',\n 'radius',\n 'refX',\n 'refY',\n 'result',\n 'role',\n 'rowspan',\n 'scope',\n 'slope',\n 'src',\n 'startOffset',\n 'stdDeviation',\n 'stop-color',\n 'stop-opacity',\n 'stroke-linecap',\n 'stroke-width',\n 'stroke',\n 'style',\n 'summary',\n 'tabindex',\n 'tableValues',\n 'target',\n 'text-align',\n 'text-anchor',\n 'textAnchor',\n 'textLength',\n 'title',\n 'type',\n 'valign',\n 'width',\n 'x',\n 'x1',\n 'x2',\n 'xlink:href',\n 'y',\n 'y1',\n 'y2',\n 'zIndex'\n];\n/**\n * The list of allowed references for referring attributes like `href` and\n * `src`. Attribute values will only be allowed if they start with one of\n * these strings.\n *\n * @see [Source code with default values](\n * https://github.com/highcharts/highcharts/blob/master/ts/Core/Renderer/HTML/AST.ts#:~:text=public%20static%20allowedReferences)\n *\n * @example\n * // Allow tel:\n * Highcharts.AST.allowedReferences.push('tel:');\n *\n * @name Highcharts.AST.allowedReferences\n * @type {Array<string>}\n */\nAST.allowedReferences = [\n 'https://',\n 'http://',\n 'mailto:',\n '/',\n '../',\n './',\n '#'\n];\n/**\n * The list of allowed SVG or HTML tags, used for sanitizing potentially\n * harmful content from the chart configuration before adding to the DOM.\n *\n * @see [Source code with default values](\n * https://github.com/highcharts/highcharts/blob/master/ts/Core/Renderer/HTML/AST.ts#:~:text=public%20static%20allowedTags)\n *\n * @example\n * // Allow a custom, trusted tag\n * Highcharts.AST.allowedTags.push('blink'); // ;)\n *\n * @name Highcharts.AST.allowedTags\n * @type {Array<string>}\n */\nAST.allowedTags = [\n '#text',\n 'a',\n 'abbr',\n 'b',\n 'br',\n 'button',\n 'caption',\n 'circle',\n 'clipPath',\n 'code',\n 'dd',\n 'defs',\n 'div',\n 'dl',\n 'dt',\n 'em',\n 'feComponentTransfer',\n 'feComposite',\n 'feDropShadow',\n 'feFlood',\n 'feFuncA',\n 'feFuncB',\n 'feFuncG',\n 'feFuncR',\n 'feGaussianBlur',\n 'feMerge',\n 'feMergeNode',\n 'feMorphology',\n 'feOffset',\n 'filter',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'hr',\n 'i',\n 'img',\n 'li',\n 'linearGradient',\n 'marker',\n 'ol',\n 'p',\n 'path',\n 'pattern',\n 'pre',\n 'rect',\n 'small',\n 'span',\n 'stop',\n 'strong',\n 'style',\n 'sub',\n 'sup',\n 'svg',\n 'table',\n 'tbody',\n 'td',\n 'text',\n 'textPath',\n 'th',\n 'thead',\n 'title',\n 'tr',\n 'tspan',\n 'u',\n 'ul'\n];\n/** @internal */\nAST.emptyHTML = emptyHTML;\n/**\n * Allow all custom SVG and HTML attributes, references and tags (together\n * with potentially harmful ones) to be added to the DOM from the chart\n * configuration. In other words, disable the allow-listing which is the\n * primary functionality of the AST.\n *\n * WARNING: Setting this property to `true` while allowing untrusted user\n * data in the chart configuration will expose your application to XSS\n * security risks!\n *\n * Note that in case you want to allow a known set of tags or attributes,\n * you should allow-list them instead of disabling the filtering totally.\n * See [allowedAttributes](Highcharts.AST#.allowedAttributes),\n * [allowedReferences](Highcharts.AST#.allowedReferences) and\n * [allowedTags](Highcharts.AST#.allowedTags). The `bypassHTMLFiltering`\n * setting is intended only for those cases where allow-listing is not\n * practical, and the chart configuration already comes from a secure\n * source.\n *\n * @example\n * // Allow all custom attributes, references and tags (disable DOM XSS\n * // filtering)\n * Highcharts.AST.bypassHTMLFiltering = true;\n *\n * @name Highcharts.AST.bypassHTMLFiltering\n * @static\n */\nAST.bypassHTMLFiltering = false;\n/* *\n *\n * Default Export\n *\n * */\nexport default AST;\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Serialized form of an SVG/HTML definition, including children.\n *\n * @interface Highcharts.ASTNode\n */ /**\n* @name Highcharts.ASTNode#attributes\n* @type {Highcharts.SVGAttributes|undefined}\n*/ /**\n* @name Highcharts.ASTNode#children\n* @type {Array<Highcharts.ASTNode>|undefined}\n*/ /**\n* @name Highcharts.ASTNode#tagName\n* @type {string|undefined}\n*/ /**\n* @name Highcharts.ASTNode#textContent\n* @type {string|undefined}\n*/\n(''); // Keeps doclets above in file\n","/* *\n *\n * (c) 2010-2026 Highsoft AS\n * Author: Torstein Hønsi\n *\n * Integration of this software requires a license.\n * - For commercial use, see www.highcharts.com/license\n * - For non-commercial, see www.highcharts.com/license-eula\n *\n *\n * */\n'use strict';\nimport D from './Defaults.js';\nconst { defaultOptions, defaultTime } = D;\nimport G from './Globals.js';\nconst { pageLang } = G;\nimport { correctFloat, extend, getNestedProperty, isArray, isNumber, isObject, isString, pick, ucfirst } from '../Shared/Utilities.js';\n/** @internal */\nconst helpers = {\n // Built-in helpers\n add: (a, b) => a + b,\n divide: (a, b) => (b !== 0 ? correctFloat(a / b) : ''),\n // eslint-disable-next-line eqeqeq\n eq: (a, b) => a == b,\n each: function (arr) {\n const match = arguments[arguments.length - 1];\n return isArray(arr) ?\n arr.map((item, i) => format(match.body, extend(isObject(item) ? item : { '@this': item }, {\n '@index': i,\n '@first': i === 0,\n '@last': i === arr.length - 1\n }))).join('') :\n false;\n },\n ge: (a, b) => a >= b,\n gt: (a, b) => a > b,\n 'if': (condition) => !!condition,\n le: (a, b) => a <= b,\n lt: (a, b) => a < b,\n multiply: (a, b) => correctFloat(a * b, 15),\n // eslint-disable-next-line eqeqeq\n ne: (a, b) => a != b,\n subtract: (a, b) => a - b,\n ucfirst,\n unless: (condition) => !condition\n};\nconst numberFormatCache = {};\n/* *\n *\n * Functions\n *\n * */\n/**\n * Internal convenience function.\n * @internal\n */\nconst isQuotedString = (str) => /^[\"'].+[\"']$/.test(str);\n/**\n * Formats a JavaScript date timestamp (milliseconds since Jan 1st 1970) into a\n * human readable date string. The format is a subset of the formats for PHP's\n * [strftime](https://www.php.net/manual/en/function.strftime.php) function.\n * Additional formats can be given in the {@link Highcharts.dateFormats} hook.\n *\n * Since v6.0.5, all internal dates are formatted through the\n * {@link Highcharts.Chart#time} instance to respect chart-level time settings.\n * The `Highcharts.dateFormat` function only reflects global time settings set\n * with `setOptions`.\n *\n * Supported format keys:\n * - `%a`: Short weekday, like 'Mon'\n * - `%A`: Long weekday, like 'Monday'\n * - `%d`: Two digit day of the month, 01 to 31\n * - `%e`: Day of the month, 1 through 31\n * - `%w`: Day of the week, 0 through 6\n * - `%b`: Short month, like 'Jan'\n * - `%B`: Long month, like 'January'\n * - `%m`: Two digit month number, 01 through 12\n * - `%y`: Two digits year, like 09 for 2009\n * - `%Y`: Four digits year, like 2009\n * - `%H`: Two digits hours in 24h format, 00 through 23\n * - `%k`: Hours in 24h format, 0 through 23\n * - `%I`: Two digits hours in 12h format, 00 through 11\n * - `%l`: Hours in 12h format, 1 through 12\n * - `%M`: Two digits minutes, 00 through 59\n * - `%p`: Upper case AM or PM\n * - `%P`: Lower case AM or PM\n * - `%S`: Two digits seconds, 00 through 59\n * - `%L`: Milliseconds (naming from Ruby)\n *\n * @function Highcharts.dateFormat\n *\n * @param {string} format\n * The desired format where various time representations are prefixed\n * with `%`.\n *\n * @param {number} timestamp\n * The JavaScript timestamp.\n *\n * @param {boolean} [upperCaseFirst=false]\n * Upper case first letter in the return.\n *\n * @return {string}\n * The formatted date.\n */\nfunction dateFormat(format, timestamp, upperCaseFirst) {\n return defaultTime.dateFormat(format, timestamp, upperCaseFirst);\n}\n/**\n * Format a string according to a subset of the rules of Python's String.format\n * method.\n *\n * @example\n * let s = Highcharts.format(\n * 'The {color} fox was {len:.2f} feet long',\n * { color: 'red', len: Math.PI }\n * );\n * // => The red fox was 3.14 feet long\n *\n * @function Highcharts.format\n *\n * @param {string} str\n * The string to format.\n *\n * @param {Record<string, *>} ctx\n * The context, a collection of key-value pairs where each key is\n * replaced by its value.\n *\n * @param {Highcharts.Chart} [owner]\n * A `Chart` or `Grid` instance used to get numberFormatter and time.\n *\n * @return {string}\n * The formatted string.\n */\nfunction format(str = '', ctx, owner) {\n const regex = /\\{([^{}]+)\\}/g, \n // The sub expression regex is the same as the top expression regex,\n // but except parens and block helpers (#), and surrounded by parens\n // instead of curly brackets.\n subRegex = /\\(([^()]+)\\)/g, matches = [], floatRegex = /f$/, decRegex = /\\.(\\d)/, lang = owner?.options?.lang || defaultOptions.lang, time = owner?.time || defaultTime, numberFormatter = owner?.numberFormatter || numberFormat.bind(owner);\n /*\n * Get a literal or variable value inside a template expression. May be\n * extended with other types like string or null if needed, but keep it\n * small for now.\n */\n const resolveProperty = (key = '') => {\n let n;\n // Literals\n if (key === 'true') {\n return true;\n }\n if (key === 'false') {\n return false;\n }\n if ((n = Number(key)).toString() === key) {\n return n;\n }\n if (isQuotedString(key)) {\n return key.slice(1, -1);\n }\n // Variables and constants\n return getNestedProperty(key, ctx);\n };\n let match, currentMatch, depth = 0, hasSub;\n // Parse and create tree\n while ((match = regex.exec(str)) !== null) {\n // When a sub expression is found, it is evaluated first, and the\n // results recursively evaluated until no subexpression exists.\n const mainMatch = match, subMatch = subRegex.exec(match[1]);\n if (subMatch) {\n match = subMatch;\n hasSub = true;\n }\n if (!currentMatch?.isBlock) {\n currentMatch = {\n ctx,\n expression: match[1],\n find: match[0],\n isBlock: match[1].charAt(0) === '#',\n start: match.index,\n startInner: match.index + match[0].length,\n length: match[0].length\n };\n }\n // Identify helpers\n const fn = (currentMatch.isBlock ? mainMatch : match)[1].split(' ')[0].replace('#', '');\n if (helpers[fn]) {\n // Block helper, only 0 level is handled\n if (currentMatch.isBlock && fn === currentMatch.fn) {\n depth++;\n }\n if (!currentMatch.fn) {\n currentMatch.fn = fn;\n }\n }\n // Closing a block helper\n const startingElseSection = match[1] === 'else';\n if (currentMatch.isBlock &&\n currentMatch.fn && (match[1] === `/${currentMatch.fn}` ||\n startingElseSection)) {\n if (!depth) { // === 0\n const start = currentMatch.startInner, body = str.substr(start, match.index - start);\n // Either closing without an else section, or when encountering\n // an else section\n if (currentMatch.body === void 0) {\n currentMatch.body = body;\n currentMatch.startInner = match.index + match[0].length;\n // The body exists already, so this is the else section\n }\n else {\n currentMatch.elseBody = body;\n }\n currentMatch.find += body + match[0];\n if (!startingElseSection) {\n matches.push(currentMatch);\n currentMatch = void 0;\n }\n }\n else if (!startingElseSection) {\n depth--;\n }\n // Common expression\n }\n else if (!currentMatch.isBlock) {\n matches.push(currentMatch);\n }\n // Evaluate sub-matches one by one to prevent orphaned block closers\n if (subMatch && !currentMatch?.isBlock) {\n break;\n }\n }\n // Execute\n matches.forEach((match) => {\n const { body, elseBody, expression, fn } = match;\n let replacement, i;\n // Helper function\n if (fn) {\n // Pass the helpers the amount of arguments defined by the function,\n // then the match as the last argument.\n const args = [match], parts = [], len = expression.length;\n let start = 0, startChar;\n for (i = 0; i <= len; i++) {\n const char = expression.charAt(i);\n // Start of string\n if (!startChar && (char === '\"' || char === '\\'')) {\n startChar = char;\n // End of string\n }\n else if (startChar === char) {\n startChar = '';\n }\n if (!startChar &&\n (char === ' ' || i === len)) {\n parts.push(expression.substr(start, i - start));\n start = i + 1;\n }\n }\n i = helpers[fn].length;\n while (i--) {\n args.unshift(resolveProperty(parts[i + 1]));\n }\n replacement = helpers[fn].apply(ctx, args);\n // Block helpers may return true or false. They may also return a\n // string, like the `each` helper.\n if (match.isBlock && typeof replacement === 'boolean') {\n replacement = format(replacement ? body : elseBody, ctx, owner);\n }\n // Simple variable replacement\n }\n else {\n const valueAndFormat = isQuotedString(expression) ?\n [expression] : expression.split(':');\n replacement = resolveProperty(valueAndFormat.shift() || '');\n // Format the replacement\n if (valueAndFormat.length && typeof replacement === 'number') {\n const segment = valueAndFormat.join(':');\n if (floatRegex.test(segment)) { // Float\n const decimals = parseInt((segment.match(decRegex) || ['', '-1'])[1], 10);\n if (replacement !== null) {\n replacement = numberFormatter(replacement, decimals, lang.decimalPoint, segment.indexOf(',') > -1 ? lang.thousandsSep : '');\n }\n }\n else {\n replacement = time.dateFormat(segment, replacement);\n }\n }\n // Use string literal in order to be preserved in the outer\n // expression\n subRegex.lastIndex = 0;\n if (subRegex.test(match.find) && isString(replacement)) {\n replacement = `\"${replacement}\"`;\n }\n }\n str = str.replace(match.find, pick(replacement, ''));\n });\n return hasSub ? format(str, ctx, owner) : str;\n}\n/**\n * Format a number and return a string based on input settings.\n *\n * @sample highcharts/members/highcharts-numberformat/\n * Custom number format\n *\n * @function Highcharts.numberFormat\n *\n * @param {number} number\n * The input number to format.\n *\n * @param {number} decimals\n * The amount of decimals. A value of -1 preserves the amount in the\n * input number.\n *\n * @param {string} [decimalPoint]\n * The decimal point, defaults to the one given in the lang options, or\n * a dot.\n *\n * @param {string} [thousandsSep]\n * The thousands separator, defaults to the one given in the lang\n * options, or a space character.\n *\n * @return {string}\n * The formatted number.\n */\nfunction numberFormat(number, decimals, decimalPoint, thousandsSep) {\n number = +number || 0;\n decimals = +decimals;\n let ret, fractionDigits, [mantissa, exp] = number.toString().split('e').map(Number);\n const lang = this?.options?.lang || defaultOptions.lang, origDec = (number.toString().split('.')[1] || '').split('e')[0].length, firstDecimals = decimals, options = {};\n decimalPoint ?? (decimalPoint = lang.decimalPoint);\n thousandsSep ?? (thousandsSep = lang.thousandsSep);\n if (decimals === -1) {\n // Preserve decimals. Not huge numbers (#3793).\n decimals = Math.min(origDec, 20);\n }\n else if (!isNumber(decimals)) {\n decimals = 2;\n }\n else if (decimals && exp < 0) {\n // Expose decimals from exponential notation (#7042)\n fractionDigits = decimals + exp;\n if (fractionDigits >= 0) {\n // Remove too small part of the number while keeping the notation\n mantissa = +mantissa.toExponential(fractionDigits).split('e')[0];\n decimals = fractionDigits;\n }\n else {\n // `fractionDigits < 0`\n mantissa = Math.floor(mantissa);\n if (decimals < 20) {\n // Use number instead of exponential notation (#7405)\n number = +(mantissa * Math.pow(10, exp)).toFixed(decimals);\n }\n else {\n // Or zero\n number = 0;\n }\n exp = 0;\n }\n }\n if (exp) {\n decimals ?? (decimals = 2);\n number = mantissa;\n }\n if (isNumber(decimals) && decimals >= 0) {\n options.minimumFractionDigits = decimals;\n options.maximumFractionDigits = decimals;\n }\n if (thousandsSep === '') {\n options.useGrouping = false;\n }\n const hasSeparators = thousandsSep || decimalPoint, locale = hasSeparators ?\n 'en' : (this?.locale || lang.locale || pageLang), cacheKey = JSON.stringify(options) + locale, nf = numberFormatCache[cacheKey] ?? (numberFormatCache[cacheKey] = new Intl.NumberFormat(locale, options));\n ret = nf.format(number);\n // If thousandsSep or decimalPoint are set, fall back to using English\n // format with string replacement for the separators.\n if (hasSeparators) {\n ret = ret\n // Preliminary step to avoid re-swapping (#22402)\n .replace(/([,\\.])/g, '_$1')\n .replace(/_\\,/g, thousandsSep ?? ',')\n .replace('_.', decimalPoint ?? '.');\n }\n if (\n // Remove signed zero (#20564)\n (!decimals && +ret === 0) ||\n // Small numbers, no decimals (#14023)\n (exp < 0 && !firstDecimals)) {\n ret = '0';\n }\n if (exp && +ret !== 0) {\n ret += 'e' + (exp < 0 ? '' : '+') + exp;\n }\n return ret;\n}\n/* *\n *\n * Default Export\n *\n * */\nconst Templating = {\n dateFormat,\n format,\n helpers,\n numberFormat\n};\nexport default Templating;\n/* *\n * API Declarations\n * */\n/**\n * The Highcharts.TemplatingObject interface provides a structure for defining\n * helpers. Helpers can be used as conditional blocks or functions within\n * expressions. Highcharts includes several built-in helpers and supports\n * the addition of custom helpers.\n *\n * @see [More information](\n * https://www.highcharts.com/docs/chart-concepts/templating#helpers)\n *\n * @interface Highcharts.TemplatingObject\n */ /**\n* @example\n* // Define a custom helper to return the absolute value of a number\n* Highcharts.Templating.helpers.abs = value => Math.abs(value);\n*\n* // Usage in a format string\n* format: 'Absolute value: {abs point.y}'\n*\n* @name Highcharts.TemplatingObject#helpers\n* @type {Record<string, Function>}\n*/ /**\n* @name Highcharts.Templating\n* @type {Highcharts.TemplatingObject}\n*/\n(''); // Keeps doclets above in file\n","/* *\n *\n * (c) 2010-2026 Highsoft AS\n * Author: Torstein Hønsi\n *\n * Integration of this software requires a license.\n * - For commercial use, see www.highcharts.com/license\n * - For non-commercial, see www.highcharts.com/license-eula\n *\n *\n * */\n'use strict';\nimport AST from '../Renderer/HTML/AST.js';\nimport { animObject } from '../Animation/AnimationUtilities.js';\nimport D from '../Defaults.js';\nconst { defaultOptions } = D;\nimport F from '../Templating.js';\nconst { format } = F;\nimport { addEvent, crisp, erase, extend, fireEvent, getNestedProperty, isArray, isFunction, isNumber, isObject, isString, merge, pick, removeEvent } from '../../Shared/Utilities.js';\nimport { uniqueKey } from '../Utilities.js';\n/* eslint-disable no-invalid-this, valid-jsdoc */\n/* *\n *\n * Class\n *\n * */\n/**\n * The Point object. The point objects are generated from the `series.data`\n * configuration objects or raw numbers. They can be accessed from the\n * `Series.points` array. Other ways to instantiate points are through {@link\n * Highcharts.Series#addPoint} or {@link Highcharts.Series#setData}.\n *\n * @class\n * @name Highcharts.Point\n *\n * @param {Highcharts.Series} series\n * The series object containing this point.\n *\n * @param {Highcharts.PointOptionsType} options\n * The data in either number, array or object format.\n *\n * @param {number} [x]\n * Optionally, the X value of the point.\n *\n * @emits Highcharts.Point#event:afterInit\n */\nclass Point {\n /* *\n *\n * Constructor\n *\n * */\n constructor(series, options, x) {\n /** @internal */\n this.formatPrefix = 'point';\n /**\n * For certain series types, like pie charts, where individual points can\n * be shown or hidden.\n *\n * @name Highcharts.Point#visible\n * @type {boolean}\n * @default true\n */\n this.visible = true;\n // For tooltip and data label formatting\n this.point = this;\n this.series = series;\n this.applyOptions(options, x);\n // Add a unique ID to the point if none is assigned\n this.id ?? (this.id = uniqueKey());\n this.resolveColor();\n this.dataLabelOnNull ?? (this.dataLabelOnNull = series.options.nullInteraction);\n series.chart.pointCount++;\n // Set point properties for convenient access in tooltip and data labels\n this.category = series.xAxis?.categories?.[this.x] ?? this.x;\n this.key = this.name ?? this.category;\n fireEvent(this, 'afterInit');\n }\n /* *\n *\n * API JSDoc doclet copies for uninitialized properties\n *\n * */\n /**\n * For categorized axes this property holds the category name for the\n * point. For other axes it holds the X value.\n *\n * @name Highcharts.Point#category\n * @type {number|string}\n */\n /**\n * The point's current color.\n *\n * @name Highcharts.Point#color\n * @type {Highcharts.ColorType|undefined}\n */\n /**\n * The point's current color index, used in styled mode instead of\n * `color`. The color index is inserted in class names used for styling.\n *\n * @name Highcharts.Point#colorIndex\n * @type {number|undefined}\n */\n /**\n * SVG graphic representing the point in the chart. In some cases it may be\n * a hidden graphic to improve accessibility.\n *\n * Typically this is a simple shape, like a `rect` for column charts or\n * `path` for line markers, but for some complex series types like boxplot\n * or 3D charts, the graphic may be a `g` element containing other shapes.\n * The graphic is generated the first time {@link Series#drawPoints} runs,\n * and updated and moved on subsequent runs.\n *\n * @see Highcharts.Point#graphics\n *\n * @name Highcharts.Point#graphic\n * @type {Highcharts.SVGElement|undefined}\n */\n /**\n * Array for multiple SVG graphics representing the point in the\n * chart. Only used in cases where the point can not be represented\n * by a single graphic.\n *\n * @see Highcharts.Point#graphic\n *\n * @name Highcharts.Point#graphics\n * @type {Array<Highcharts.SVGElement>|undefined}\n */\n /**\n * The point's name if it is defined, or its category in case of a category,\n * otherwise the x value. Convenient for tooltip and data label formatting.\n *\n * @name Highcharts.Point#key\n * @type {number|string}\n */\n /**\n * The name of the point. The name can be given as the first position of the\n * point configuration array, or as a `name` property in the configuration:\n *\n * @example\n * // Array config\n * data: [\n * ['John', 1],\n * ['Jane', 2]\n * ]\n *\n * // Object config\n * data: [{\n * name: 'John',\n * y: 1\n * }, {\n * name: 'Jane',\n * y: 2\n * }]\n *\n * @name Highcharts.Point#name\n * @type {string}\n */\n /**\n * The point's options as applied in the initial configuration, or\n * extended through `Point.update`.\n *\n * In TypeScript you have to extend `PointOptionsObject` via an\n * additional interface to allow custom data options:\n *\n * ```\n * declare interface PointOptionsObject {\n * customProperty: string;\n * }\n * ```\n *\n * @name Highcharts.Point#options\n * @type {Highcharts.PointOptionsObject}\n */\n /**\n * The percentage for points in a stacked series, pies or gauges.\n *\n * @name Highcharts.Point#percentage\n * @type {number|undefined}\n */\n /**\n * Array of all hovered points when using shared tooltips.\n *\n * @name Highcharts.Point#points\n * @type {Array<Highcharts.Point>|undefined}\n */\n /**\n * Whether the point is selected or not.\n *\n * @see Point#select\n * @see Chart#getSelectedPoints\n *\n * @name Highcharts.Point#selected\n * @type {boolean}\n */\n /**\n * The series object associated with the point.\n *\n * @name Highcharts.Point#series\n * @type {Highcharts.Series}\n */\n /**\n * The attributes of the rendered SVG shape like in `column` or `pie`\n * series.\n *\n * @readonly\n * @name Highcharts.Point#shapeArgs\n * @type {Readonly<Highcharts.SVGAttributes>|undefined}\n */\n /**\n * Defines the tooltip's position for a data point in a chart. It is an\n * array of numbers representing the coordinates for the tooltip's\n * placement, allowing for precise control over its location.\n *\n * @readonly\n * @name Highcharts.Point#tooltipPos\n * @type {Readonly<Array<number>>|undefined}\n */\n /**\n * The total of values in either a stack for stacked series, or a pie in a\n * pie series.\n *\n * @name Highcharts.Point#total\n * @type {number|undefined}\n */\n /**\n * The x value of the point.\n *\n * @name Highcharts.Point#x\n * @type {number}\n */\n /**\n * The y value of the point.\n *\n * @name Highcharts.Point#y\n * @type {number|undefined}\n */\n /* *\n *\n * Functions\n *\n * */\n /**\n * Apply the options containing the x and y data and possible some extra\n * properties. Called on point init or from point.update.\n *\n * @internal\n * @function Highcharts.Point#applyOptions\n *\n * @param {Highcharts.PointOptionsType} options\n * The point options as defined in series.data.\n *\n * @param {number} [x]\n * Optionally, the x value.\n *\n * @param {boolean} [isMock]\n * If true, the point is not a real instance, but a mock object\n * created for handling data. Avoid some logic.\n *\n * @return {Highcharts.Point}\n * The Point instance.\n */\n applyOptions(options, x, isMock) {\n const point = this, series = point.series, pointValKey = series.options.pointValKey || series.pointValKey;\n options = Point.prototype.optionsToObject.call(this, options);\n // Copy options directly to point\n extend(point, options);\n // If we're updating, extend or merge existing options\n if (point.options) {\n // If we're not allowed to mutate, merge new data into existing and\n // return a copy, because `point.options` is a reference to\n // `options.data[i]`\n point.options = series.chart.options.chart.allowMutatingData ?\n extend(point.options, options) :\n merge(point.options, options);\n }\n else {\n point.options = options;\n }\n // For higher dimension series types. For instance, for ranges, point.y\n // is mapped to point.low.\n if (pointValKey) {\n point.y = Point.prototype.getNestedProperty.call(point, pointValKey);\n }\n if (isNumber(x)) {\n point.x = x;\n }\n if (!isMock) {\n // The point is initially selected by options (#5777)\n if (point.selected) {\n point.state = 'select';\n }\n // Since options are copied into the Point instance, some accidental\n // options must be shielded (#5681)\n if (options.group) {\n delete point.group;\n }\n if (options.dataLabels) {\n delete point.dataLabels;\n }\n point.isNull = point.isValid && !point.isValid();\n // #9233, #10874\n point.formatPrefix = point.isNull ? 'null' : 'point';\n }\n return point;\n }\n /**\n * Get the origin position for entrance animation of new points. Modifies\n * the given x and y based on the chart orientation and shape dimensions.\n * Adds an opacity of 0 to make the point fade in.\n *\n * To disable entrance animation, return an empty object.\n *\n * @param {Highcharts.PositionObject} position\n * The initial x and y position in terms of plot area coordinates.\n * @param {Highcharts.SVGAttributes} shape\n * The shape arguments, containing width and height and more.\n * @return {Highcharts.SVGAttributes}\n * The modified attributes with x and y adjusted for the shape.\n *\n * @internal\n * @function Highcharts.Point#getOrigin\n */\n getOrigin({ x = 0, y = 0 }, shape = {}) {\n const { graphic, series } = this;\n // The chart is inverted, but the marker group is not, like a scatter\n // series in an inverted chart.\n if (series.chart.inverted &&\n graphic?.parentGroup &&\n !graphic?.parentGroup?.rotation) {\n const pos = this.pos(false, x, y);\n if (pos) {\n x = pos[0];\n y = pos[1];\n }\n }\n x -= (shape.width || 0) / 2;\n y -= (shape.height || 0) / 2;\n const attribs = { x };\n // To avoid having to deal with stacking, column height etc, we only set\n // y for non-column series. Range series (having this.plotHigh) also\n // have their own logic, with two markers per point.\n if (!series.is('column') && !this.plotHigh) {\n attribs.y = y;\n }\n return attribs;\n }\n /**\n * Destroy a point to clear memory. Its reference still stays in\n * `series.data`.\n *\n * @internal\n * @function Highcharts.Point#destroy\n *\n * @param {boolean} [sync]\n * Whether to destroy the point synchronously. Used internally from\n * series.destroy, where condemned points may cause animation errors\n * (#24976).\n */\n destroy(sync) {\n if (!this.destroyed && !this.condemned) {\n const point = this, series = point.series, chart = series.chart, hoverPoints = chart.hoverPoints, globalAnimation = point.series.chart.renderer.globalAnimation, { duration } = animObject(globalAnimation);\n /**\n * Allow to call after animation.\n * @internal\n */\n const destroyPoint = () => {\n // Remove all events and elements\n if (point.graphic ||\n point.graphics ||\n point.dataLabel ||\n point.dataLabels) {\n removeEvent(point);\n point.destroyElements();\n }\n for (const prop in point) { // eslint-disable-line guard-for-in\n delete point[prop];\n }\n this.destroyed = true;\n };\n if (point.legendItem) {\n // Pies have legend items\n chart.legend.destroyItem(point);\n }\n if (hoverPoints) {\n point.setState();\n erase(hoverPoints, point);\n if (!hoverPoints.length) {\n chart.hoverPoints = void 0;\n }\n }\n if (point === chart.hoverPoint) {\n point.onMouseOut();\n }\n // Remove properties after animation\n if (duration && !sync && series.condemnedPoints) {\n series.condemnedPoints.push(this);\n this.graphic?.addClass('highcharts-point-condemned');\n setTimeout(destroyPoint, duration);\n }\n else {\n destroyPoint();\n }\n chart.pointCount--;\n }\n this.condemned = true;\n }\n /**\n * Destroy SVG elements associated with the point.\n *\n * @internal\n * @function Highcharts.Point#destroyElements\n *\n * @param {Highcharts.Dictionary<number>} [kinds]\n * Kinds of elements to destroy\n */\n destroyElements(kinds = { graphic: 1, dataLabel: 1 }) {\n const point = this, props = [];\n let prop, i;\n if (kinds.graphic) {\n props.push('graphic', 'connector');\n }\n if (kinds.dataLabel) {\n props.push('dataLabel', 'dataLabelPath', 'dataLabelUpper');\n }\n i = props.length;\n while (i--) {\n prop = props[i];\n if (point[prop]) {\n point[prop] = point[prop].destroy();\n }\n }\n ['graphic', 'dataLabel'].forEach((prop) => {\n const plural = `${prop}s`;\n if (kinds[prop] && point[plural]) {\n point[plural].forEach((item) => {\n if (item?.element) {\n item.destroy();\n }\n });\n delete point[plural];\n }\n });\n }\n /**\n * Fire an event on the Point object.\n *\n * @internal\n * @function Highcharts.Point#firePointEvent\n *\n * @param {string} eventType\n * Type of the event.\n *\n * @param {Highcharts.Dictionary<any>|Event} [eventArgs]\n * Additional event arguments.\n *\n * @param {Highcharts.EventCallbackFunction<Highcharts.Point>|Function} [defaultFunction]\n * Default event handler.\n *\n * @emits Highcharts.Point#event:*\n */\n firePointEvent(eventType, eventArgs, defaultFunction) {\n const point = this, series = this.series, seriesOptions = series.options;\n // Load event handlers on demand to save time on mouseover/out\n point.manageEvent(eventType);\n // Add default handler if in selection mode\n if (eventType === 'click' && seriesOptions.allowPointSelect) {\n defaultFunction = function (event) {\n // Control key is for Windows, meta (= Cmd key) for Mac, Shift\n // for Opera.\n if (!point.condemned && point.select) { // #2911, #19075\n point.select(null, event.ctrlKey || event.metaKey || event.shiftKey);\n }\n };\n }\n fireEvent(point, eventType, eventArgs, defaultFunction);\n }\n /**\n * Get the CSS class names for individual points. Used internally where the\n * returned value is set on every point.\n *\n * @function Highcharts.Point#getClassName\n *\n * @return {string}\n * The class names.\n */\n getClassName() {\n const point = this;\n return 'highcharts-point' +\n (point.selected ? ' highcharts-point-select' : '') +\n (point.negative && point.series.options.negativeColor !== false ?\n ' highcharts-negative' : '') +\n (point.isNull ? ' highcharts-null-point' : '') +\n (typeof point.colorIndex !== 'undefined' ?\n ' highcharts-color-' + point.colorIndex : '') +\n (point.options.className ? ' ' + point.options.className : '') +\n (point.zone?.className ?\n ' ' + point.zone.className.replace('highcharts-negative', '') :\n '');\n }\n /**\n * Returns the value of the point property for a given value.\n * @internal\n */\n getNestedProperty(key) {\n if (!key) {\n return;\n }\n if (key.indexOf('custom.') === 0) {\n return getNestedProperty(key, this.options);\n }\n return this[key];\n }\n /**\n * In a series with `zones`, return the zone that the point belongs to.\n *\n * @function Highcharts.Point#getZone\n *\n * @return {Highcharts.SeriesZonesOptionsObject|undefined}\n * The zone item, or `undefined` if the series has no zones.\n */\n getZone() {\n const series = this.series, zones = series.zones, zoneAxis = series.zoneAxis || 'y';\n let zone, i = 0;\n zone = zones[i];\n while (i < zones.length &&\n this[zoneAxis] >= zone.value) {\n zone = zones[++i];\n }\n // For resetting or reusing the point (#8100)\n if (!this.nonZonedColor) {\n this.nonZonedColor = this.color;\n }\n if (zone?.color && !this.options.color) {\n this.color = zone.color;\n }\n else {\n this.color = this.nonZonedColor;\n }\n return zone;\n }\n /**\n * Utility to check if point has new shape type. Used in column series and\n * all others that are based on column series.\n * @internal\n */\n hasNewShapeType() {\n const point = this;\n const oldShapeType = point.graphic &&\n (point.graphic.symbolName || point.graphic.element.nodeName);\n return oldShapeType !== this.shapeType;\n }\n /**\n * Determine if point is valid.\n *\n * @internal\n * @function Highcharts.Point#isValid\n */\n isValid() {\n return ((isNumber(this.x) ||\n this.x instanceof Date) &&\n isNumber(this.y));\n }\n /**\n * Transform number or array configs into objects. Also called for object\n * configs. Used internally to unify the different configuration formats for\n * points. For example, a simple number `10` in a line series will be\n * transformed to `{ y: 10 }`, and an array config like `[1, 10]` in a\n * scatter series will be transformed to `{ x: 1, y: 10 }`.\n *\n * @function Highcharts.Point#optionsToObject\n *\n * @param {Highcharts.PointOptionsType} options\n * Series data options.\n *\n * @return {Highcharts.Dictionary<*>}\n * Transformed point options.\n */\n optionsToObject(options) {\n const series = this.series, keys = series.options.keys, pointArrayMap = keys || series.pointArrayMap || ['y'], valueCount = pointArrayMap.length;\n let ret = {}, firstItemType, i = 0, j = 0;\n if (isNumber(options) || options === null) {\n ret[pointArrayMap[0]] = options;\n }\n else if (isArray(options)) {\n // With leading x value\n if (!keys && options.length > valueCount) {\n firstItemType = typeof options[0];\n if (firstItemType === 'string') {\n if (series.xAxis?.dateTime) {\n ret.x = series.chart.time.parse(options[0]);\n }\n else {\n ret[series.tupleKey || 'name'] = options[0];\n }\n }\n else if (firstItemType === 'number') {\n ret.x = options[0];\n }\n i++;\n }\n while (j < valueCount) {\n // Skip undefined positions for keys\n if (!keys || typeof options[i] !== 'undefined') {\n ret[pointArrayMap[j]] = options[i];\n }\n i++;\n j++;\n }\n }\n else if (typeof options === 'object') {\n ret = options;\n // This is the fastest way to detect if there are individual point\n // dataLabels that need to be considered in drawDataLabels. These\n // can only occur in object configs.\n if (options.dataLabels) {\n // Override the prototype function to always return true,\n // regardless of whether data labels are enabled series-wide\n series.hasDataLabels = () => true;\n }\n // Same approach as above for markers\n if (options.marker) {\n series._hasPointMarkers = true;\n }\n }\n // Handle nested keys, e.g. ['color.pattern.image'], but only if we're\n // using keys or `dataTable`\n if (keys || !series.options.data) {\n Object.keys(ret).forEach((key) => {\n if (key.indexOf('.') > 0) {\n Point.prototype.setNestedProperty(ret, ret[key], key);\n // Delete the literal nested key\n delete ret[key];\n }\n });\n }\n return ret;\n }\n /**\n * Get the pixel position of the point relative to the plot area.\n *\n * @function Highcharts.Point#pos\n *\n * @sample highcharts/point/position\n * Get point's position in pixels.\n *\n * @param {boolean} chartCoordinates\n * If true, the returned position is relative to the full chart area.\n * If false, it is relative to the plot area determined by the axes.\n *\n * @param {number|undefined} plotX\n * A custom plot x position to be computed. Used internally for getting the\n * starting point of an animation.\n *\n * @param {number|undefined} plotY\n * A custom plot y position to be computed. Used internally for getting the\n * starting point of an animation, and for some series types that have\n * multiple `y` positions, like area range (low and high values).\n *\n * @return {Array<number>|undefined}\n * Coordinates of the point if the point exists.\n */\n pos(chartCoordinates, plotX = this.plotX, plotY = this.plotY) {\n const { series } = this, { chart, xAxis, yAxis } = series || {};\n let posX = 0, posY = 0;\n if (chart && isNumber(plotX) && isNumber(plotY)) {\n if (chartCoordinates) {\n posX = xAxis ? xAxis.pos : chart.plotLeft;\n posY = yAxis ? yAxis.pos : chart.plotTop;\n }\n return chart.inverted && xAxis && yAxis ?\n [yAxis.len - plotY + posY, xAxis.len - plotX + posX] :\n [plotX + posX, plotY + posY];\n }\n }\n /**\n * Resolve the color of a point.\n *\n * @internal\n * @function Highcharts.Point#resolveColor\n */\n resolveColor() {\n const { options, series } = this, chart = series.chart, optionsChart = chart.options.chart, styledMode = chart.styledMode;\n let color, colorCount = optionsChart.colorCount, colorIndex;\n // Remove points nonZonedColor for later recalculation\n delete this.nonZonedColor;\n if (series.options.colorByPoint) {\n if (!styledMode) {\n const colors = series.options.colors ||\n chart.options.colors;\n color = colors?.[series.colorCounter];\n colorCount = colors?.length;\n }\n colorIndex = series.colorCounter;\n series.colorCounter++;\n // Loop back to zero\n if (series.colorCounter === colorCount) {\n series.colorCounter = 0;\n }\n }\n else {\n if (!styledMode) {\n color = series.color;\n }\n colorIndex = series.colorIndex;\n }\n this.colorIndex = options.colorIndex ?? colorIndex;\n this.color = options.color ?? color;\n }\n /**\n * Set a value in an object, on the property defined by key. The key\n * supports nested properties using dot notation. The function modifies the\n * input object and does not make a copy.\n *\n * @function Highcharts.Point#setNestedProperty<T>\n *\n * @param {T} object\n * The object to set the value on.\n *\n * @param {*} value\n * The value to set.\n *\n * @param {string} key\n * Key to the property to set.\n *\n * @return {T}\n * The modified object.\n */\n setNestedProperty(object, value, key) {\n const nestedKeys = key.split('.');\n nestedKeys.reduce(function (result, key, i, arr) {\n const isLastKey = arr.length - 1 === i;\n result[key] = (isLastKey ?\n value :\n isObject(result[key], true) ?\n result[key] :\n {});\n return result[key];\n }, object);\n return object;\n }\n /** @internal */\n shouldDraw() {\n return !this.isNull;\n }\n /**\n * Extendable method for formatting each point's tooltip line.\n *\n * @function Highcharts.Point#tooltipFormatter\n *\n * @param {string} pointFormat\n * The point format.\n *\n * @return {string}\n * A string to be concatenated in to the common tooltip text.\n */\n tooltipFormatter(pointFormat) {\n // Insert options for valueDecimals, valuePrefix, and valueSuffix\n const { chart, pointArrayMap = ['y'], tooltipOptions } = this.series, { valueDecimals = '', valuePrefix = '', valueSuffix = '' } = tooltipOptions;\n // Replace default point style with class name\n if (chart.styledMode) {\n pointFormat = chart.tooltip?.styledModeFormat(pointFormat) ||\n pointFormat;\n }\n // Loop over the point array map and replace unformatted values with\n // sprintf formatting markup\n pointArrayMap.forEach((key) => {\n key = '{point.' + key; // Without the closing bracket\n if (valuePrefix || valueSuffix) {\n pointFormat = pointFormat.replace(RegExp(key + '}', 'g'), valuePrefix + key + '}' + valueSuffix);\n }\n pointFormat = pointFormat.replace(RegExp(key + '}', 'g'), key + ':,.' + valueDecimals + 'f}');\n });\n return format(pointFormat, this, chart);\n }\n /**\n * Update point with new options (typically x/y data) and optionally redraw\n * the series.\n *\n * @sample highcharts/members/point-update-column/\n * Update column value\n * @sample highcharts/members/point-update-pie/\n * Update pie slice\n * @sample maps/members/point-update/\n * Update map area value in Highmaps\n *\n * @function Highcharts.Point#update\n *\n * @param {Highcharts.PointOptionsType} options\n * The point options. Point options are handled as described under\n * the `series.type.data` item for each series type. For example\n * for a line series, if options is a single number, the point will\n * be given that number as the marin y value. If it is an array, it\n * will be interpreted as x and y values respectively. If it is an\n * object, advanced options are applied.\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart after the point is updated. If doing\n * more operations on the chart, it is best practice to set\n * `redraw` to false and call `chart.redraw()` after.\n *\n * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animation=true]\n * Whether to apply animation, and optionally animation\n * configuration.\n *\n * @emits Highcharts.Point#event:update\n */\n update(options, redraw = true, animation, runEvent) {\n const point = this, series = point.series, graphic = point.graphic, chart = series.chart, seriesOptions = series.options, dataOptions = seriesOptions.data;\n /**\n * Perform the actual update of the point.\n *\n * @internal\n */\n function update() {\n point.applyOptions(options);\n // Update visuals, #4146\n // Handle mock graphic elements for a11y, #12718\n const hasMockGraphic = graphic && point.hasMockGraphic, index = point.index;\n const shouldDestroyGraphic = point.y === null ?\n !hasMockGraphic :\n hasMockGraphic;\n if (graphic && shouldDestroyGraphic) {\n point.graphic = graphic.destroy();\n delete point.hasMockGraphic;\n }\n if (isObject(options, true)) {\n // Destroy so we can get new elements\n if (graphic?.element) {\n // \"null\" is also a valid symbol\n if (options?.marker &&\n typeof options.marker.symbol !== 'undefined') {\n point.graphic = graphic.destroy();\n }\n }\n if (options?.dataLabels && point.dataLabel) {\n point.dataLabel = point.dataLabel.destroy(); // #2468\n }\n }\n const pointOptions = point.optionsToObject(options);\n if (!series.hasProcessedDataTable) {\n // Record changes in the data table (#24451)\n series.dataTable.setRow(pointOptions, index);\n // Record the options to options.data. If the old or the new\n // config is an object, use point options, otherwise use raw\n // options (#4701, #4916).\n if (dataOptions) {\n dataOptions[index] = (isObject(dataOptions[index], true) ||\n isObject(options, true)) ?\n point.options :\n options ?? dataOptions[index];\n }\n }\n // Redraw\n series.isDirty = series.isDirtyData = true;\n if ('x' in pointOptions) {\n if (isString(pointOptions.x)) {\n // Clear cache and force recalc in getColumn\n series.xColumnIsNumbers = void 0;\n }\n point.x = series.getX(pointOptions.x);\n point.isNull = point.isValid && !point.isValid();\n if (series.xColumn) {\n series.xColumn[index] = point.x;\n }\n }\n if (!series.fixedBox && series.hasCartesianSeries) { // #1906, #2320\n chart.isDirtyBox = true;\n }\n if (seriesOptions.legendType === 'point') { // #1831, #1885\n chart.isDirtyLegend = true;\n }\n if (redraw) {\n chart.redraw(animation);\n }\n }\n // Fire the event with a default handler of doing the update\n if (runEvent === false) { // When called from setData\n update();\n }\n else {\n point.firePointEvent('update', { options: options }, update);\n }\n }\n /**\n * Remove a point and optionally redraw the series and if necessary the axes\n *\n * @sample highcharts/plotoptions/series-point-events-remove/\n * Remove point and confirm\n * @sample highcharts/members/point-remove/\n * Remove pie slice\n * @sample maps/members/point-remove/\n * Remove selected points in Highmaps\n *\n * @function Highcharts.Point#remove\n *\n * @param {boolean} [redraw=true]\n * Whether to redraw the chart or wait for an explicit call. When\n * doing more operations on the chart, for example running\n * `point.remove()` in a loop, it is best practice to set `redraw`\n * to false and call `chart.redraw()` after.\n *\n * @param {boolean|Partial<Highcharts.AnimationOptionsObject>} [animation=false]\n * Whether to apply animation, and optionally animation\n * configuration.\n */\n remove(redraw, animation) {\n this.series.removePoint(this.series.data.indexOf(this), redraw, animation);\n }\n /**\n * Toggle the selection status of a point.\n *\n * @see Highcharts.Chart#getSelectedPoints\n *\n * @sample highcharts/members/point-select/\n * Select a point from a button\n * @sample highcharts/members/point-select-lasso/\n * Lasso selection\n * @sample highcharts/chart/events-selection-points/\n * Rectangle selection\n * @sample maps/series/data-id/\n * Select a point in Highmaps\n *\n * @function Highcharts.Point#select\n *\n * @param {boolean} [selected]\n * When `true`, the point is selected. When `false`, the point is\n * unselected. When `null` or `undefined`, the selection state is toggled.\n *\n * @param {boolean} [accumulate=false]\n * When `true`, the selection is added to other selected points.\n * When `false`, other selected points are deselected. Internally in\n * Highcharts, when\n * [allowPointSelect](https://api.highcharts.com/highcharts/plotOptions.series.allowPointSelect)\n * is `true`, selected points are accumulated on Control, Shift or Cmd\n * clicking the point.\n *\n * @emits Highcharts.Point#event:select\n * @emits Highcharts.Point#event:unselect\n */\n select(selected, accumulate) {\n const point = this, series = point.series, chart = series.chart;\n selected = pick(selected, !point.selected);\n this.selectedStaging = selected;\n // Fire the event with the default handler\n point.firePointEvent(selected ? 'select' : 'unselect', { accumulate: accumulate }, function () {\n point.selected = point.options.selected = selected;\n if (series.options.data) {\n series.options.data[series.data.indexOf(point)] =\n point.options;\n }\n point.setState(selected && 'select');\n // Unselect all other points unless Ctrl or Cmd + click\n if (!accumulate) {\n chart.getSelectedPoints().forEach(function (loopPoint) {\n const loopSeries = loopPoint.series, loopSeriesOptions = loopSeries.options;\n if (loopPoint.selected && loopPoint !== point) {\n loopPoint.selected = loopPoint.options.selected =\n false;\n if (loopSeriesOptions.data) {\n loopSeriesOptions.data[loopSeries.data.indexOf(loopPoint)] = loopPoint.options;\n }\n // Programmatically selecting a point should restore\n // normal state, but when click happened on other\n // point, set inactive state to match other points\n loopPoint.setState(chart.hoverPoints &&\n loopSeriesOptions.inactiveOtherPoints ?\n 'inactive' : '');\n loopPoint.firePointEvent('unselect');\n }\n });\n }\n });\n delete this.selectedStaging;\n }\n /**\n * Runs on mouse over the point. Called internally from mouse and touch\n * events.\n *\n * @function Highcharts.Point#onMouseOver\n *\n * @param {Highcharts.PointerEventObject} [e]\n * The event arguments.\n */\n onMouseOver(e) {\n const point = this, series = point.series, { inverted, pointer } = series.chart;\n if (pointer) {\n e = e ?\n pointer.normalize(e) :\n // In cases where onMouseOver is called directly without an\n // event\n pointer.getChartCoordinatesFromPoint(point, inverted);\n pointer.runPointActions(e, point);\n }\n }\n /**\n * Runs on mouse out from the point. Called internally from mouse and touch\n * events.\n *\n * @function Highcharts.Point#onMouseOut\n * @emits Highcharts.Point#event:mouseOut\n */\n onMouseOut() {\n const point = this;\n if (!point.series) {\n return;\n }\n const chart = point.series.chart;\n point.firePointEvent('mouseOut');\n if (!point.series.options.inactiveOtherPoints) {\n (chart.hoverPoints || []).forEach(function (p) {\n p.setState();\n });\n }\n chart.hoverPoints = chart.hoverPoint = null;\n }\n /**\n * Manage specific event from the series' and point's options. Only do it on\n * demand, to save processing time on hovering.\n *\n * @internal\n * @function Highcharts.Point#importEvents\n */\n manageEvent(eventType) {\n const point = this, options = merge(point.series.options.point, point.options), userEvent = options.events?.[eventType];\n if (isFunction(userEvent) &&\n (!point.hcEvents?.[eventType] ||\n // Some HC modules, like marker-clusters, draggable-points etc.\n // use events in their logic, so we need to be sure, that\n // callback function is different\n point.hcEvents?.[eventType]?.map((el) => el.fn)\n .indexOf(userEvent) === -1)) {\n // While updating the existing callback event the old one should be\n // removed\n point.importedUserEvent?.();\n point.importedUserEvent = addEvent(point, eventType, userEvent);\n if (point.hcEvents) {\n point.hcEvents[eventType].userEvent = true;\n }\n }\n else if (point.importedUserEvent &&\n !userEvent &&\n point.hcEvents?.[eventType] &&\n point.hcEvents?.[eventType].userEvent) {\n removeEvent(point, eventType);\n delete point.hcEvents[eventType];\n if (!Object.keys(point.hcEvents)) {\n delete point.importedUserEvent;\n }\n }\n }\n /**\n * Set the point's state.\n *\n * @function Highcharts.Point#setState\n *\n * @param {Highcharts.PointStateValue|\"\"} [state]\n * The new state, can be one of `'hover'`, `'select'`, `'inactive'`,\n * or `''` (an empty string), `'normal'` or `undefined` to set to\n * normal state.\n * @param {boolean} [move]\n * State for animation.\n *\n * @emits Highcharts.Point#event:afterSetState\n */\n setState(state, move) {\n const point = this, series = point.series, previousState = point.state, stateOptions = series.options.states?.[state || 'normal'] || {}, markerOptions = (defaultOptions.plotOptions?.[series.type]?.marker &&\n series.options.marker), normalDisabled = markerOptions?.enabled === false, markerStateOptions = markerOptions?.states?.[state || 'normal'] ||\n {}, stateDisabled = markerStateOptions.enabled === false, pointMarker = point.marker || {}, chart = series.chart, hasMarkers = (markerOptions && series.markerAttribs);\n let halo = series.halo, markerAttribs, pointAttribs, pointAttribsAnimation, stateMarkerGraphic = series.stateMarkerGraphic, newSymbol;\n state = state || ''; // Empty string\n if (\n // Already has this state\n (state === point.state && !move) ||\n // Selected points don't respond to hover\n (point.selected && state !== 'select') ||\n // Series' state options is disabled\n (stateOptions.enabled === false) ||\n // General point marker's state options is disabled\n (state && (stateDisabled ||\n (normalDisabled && markerStateOptions.enabled === false))) ||\n // Individual point marker's state options is disabled\n (state &&\n pointMarker.states?.[state]?.enabled === false) // #1610\n ) {\n return;\n }\n point.state = state;\n if (hasMarkers) {\n markerAttribs = series.markerAttribs(point, state);\n }\n // Apply hover styles to the existing point\n // Prevent from mocked null points (#14966)\n if (point.graphic && !point.hasMockGraphic) {\n if (previousState) {\n point.graphic.removeClass('highcharts-point-' + previousState);\n }\n if (state) {\n point.graphic.addClass('highcharts-point-' + state);\n }\n if (!chart.styledMode) {\n pointAttribs = series.pointAttribs(point, state);\n pointAttribsAnimation = (chart.options.chart.animation ??\n stateOptions.animation);\n const opacity = pointAttribs.opacity;\n // Some inactive points (e.g. slices in pie) should apply\n // opacity also for their labels\n if (series.options.inactiveOtherPoints && isNumber(opacity)) {\n (point.dataLabels || []).forEach(function (label) {\n if (label &&\n !label.hasClass('highcharts-data-label-hidden')) {\n label.animate({ opacity }, pointAttribsAnimation);\n if (label.connector) {\n label.connector.animate({ opacity }, pointAttribsAnimation);\n }\n }\n });\n }\n point.graphic.animate(pointAttribs, pointAttribsAnimation);\n }\n if (markerAttribs) {\n point.graphic.animate(markerAttribs, (\n // Turn off globally:\n chart.options.chart.animation ??\n markerStateOptions.animation ??\n markerOptions.animation));\n }\n // Zooming in from a range with no markers to a range with markers\n if (stateMarkerGraphic) {\n stateMarkerGraphic.hide();\n }\n }\n else {\n // If a graphic is not applied to each point in the normal state,\n // create a shared graphic for the hover state\n if (state && markerStateOptions) {\n newSymbol = pointMarker.symbol || series.symbol;\n // If the point has another symbol than the previous one, throw\n // away the state marker graphic and force a new one (#1459)\n if (stateMarkerGraphic &&\n stateMarkerGraphic.currentSymbol !== newSymbol) {\n stateMarkerGraphic = stateMarkerGraphic.destroy();\n }\n // Add a new state marker graphic\n if (markerAttribs) {\n if (!stateMarkerGraphic) {\n if (newSymbol) {\n series.stateMarkerGraphic = stateMarkerGraphic =\n chart.renderer\n .symbol(newSymbol, markerAttribs.x, markerAttribs.y, markerAttribs.width, markerAttribs.height, merge(markerOptions, markerStateOptions))\n .add(series.markerGroup);\n stateMarkerGraphic.currentSymbol = newSymbol;\n }\n // Move the existing graphic\n }\n else {\n stateMarkerGraphic[move ? 'animate' : 'attr']({\n x: markerAttribs.x,\n y: markerAttribs.y\n });\n }\n }\n if (!chart.styledMode && stateMarkerGraphic &&\n point.state !== 'inactive') {\n stateMarkerGraphic.attr(series.pointAttribs(point, state));\n }\n }\n if (stateMarkerGraphic) {\n stateMarkerGraphic[state && point.isInside ? 'show' : 'hide'](); // #2450\n stateMarkerGraphic.element.point = point; // #4310\n stateMarkerGraphic.addClass(point.getClassName(), true);\n }\n }\n // Show me your halo\n const haloOptions = isObject(stateOptions.halo) ?\n stateOptions.halo :\n {};\n const markerGraphic = (point.graphic || stateMarkerGraphic);\n const markerVisibility = markerGraphic?.visibility || 'inherit';\n if (haloOptions.size &&\n markerGraphic &&\n markerVisibility !== 'hidden' &&\n !point.isCluster) {\n if (!halo) {\n series.halo = halo = chart.renderer.path()\n // #5818, #5903, #6705\n .add(markerGraphic.parentGroup);\n }\n halo.show()[move ? 'animate' : 'attr']({\n d: point.haloPath(haloOptions.size)\n });\n halo.attr({\n 'class': 'highcharts-halo highcharts-color-' +\n pick(point.colorIndex, series.colorIndex) +\n (point.className ? ' ' + point.className : ''),\n 'visibility': markerVisibility,\n 'zIndex': -1 // #4929, #8276\n });\n halo.point = point; // #6055\n if (!chart.styledMode) {\n halo.attr(extend({\n 'fill': point.color || series.color,\n 'fill-opacity': haloOptions.opacity\n }, AST.filterUserAttributes(haloOptions.attributes || {})));\n }\n }\n else if (halo?.point?.haloPath &&\n !halo.point.destroyed) {\n // Animate back to 0 on the current halo point (#6055)\n halo.animate({ d: halo.point.haloPath(0) }, null, \n // Hide after unhovering. The `complete` callback runs in the\n // halo's context (#7681).\n halo.hide);\n }\n fireEvent(point, 'afterSetState', { state });\n }\n /**\n * Get the path definition for the halo, which is usually a shadow-like\n * circle around the currently hovered point.\n *\n * @function Highcharts.Point#haloPath\n *\n * @param {number} size\n * The radius of the circular halo.\n *\n * @return {Highcharts.SVGPathArray}\n * The path definition.\n */\n haloPath(size) {\n const pos = this.pos();\n return pos ? this.series.chart.renderer.symbols.circle(crisp(pos[0], 1) - size, pos[1] - size, size * 2, size * 2) : [];\n }\n}\n/* *\n *\n * Default Export\n *\n * */\nexport default Point;\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * Function callback when a series point is clicked. Return false to cancel the\n * action.\n *\n * @callback Highcharts.PointClickCallbackFunction\n *\n * @param {Highcharts.Point} this\n * The point where the event occurred.\n *\n * @param {Highcharts.PointClickEventObject} event\n * Event arguments.\n *\n * @param {Highcharts.Point} [ctx]\n * Since v12.6.0, the point context passed as an extra argument for\n * arrow functions.\n */\n/**\n * Common information for a click event on a series point.\n *\n * @interface Highcharts.PointClickEventObject\n * @extends Highcharts.PointerEventObject\n */ /**\n* Clicked point.\n* @name Highcharts.PointClickEventObject#point\n* @type {Highcharts.Point}\n*/\n/**\n * Gets fired when the mouse leaves the area close to the point.\n *\n * @callback Highcharts.PointMouseOutCallbackFunction\n *\n * @param {Highcharts.Point} this\n * Point where the event occurred.\n *\n * @param {global.PointerEvent} event\n * Event that occurred.\n *\n * @param {Highcharts.Point} [ctx]\n * Since v12.6.0, the point context passed as an extra argument for\n * arrow functions.\n */\n/**\n * Gets fired when the mouse enters the area close to the point.\n *\n * @callback Highcharts.PointMouseOverCallbackFunction\n *\n * @param {Highcharts.Point} this\n * Point where the event occurred.\n *\n * @param {global.Event} event\n * Event that occurred.\n *\n * @param {Highcharts.Point} [ctx]\n * Since v12.6.0, the point context passed as an extra argument for\n * arrow functions.\n */\n/**\n * The generic point options for all series.\n *\n * In TypeScript you have to extend `PointOptionsObject` with an additional\n * declaration to allow custom data options:\n *\n * ```\n * declare interface PointOptionsObject {\n * customProperty: string;\n * }\n * ```\n *\n * @interface Highcharts.PointOptionsObject\n */\n/**\n * Possible option types for a data point. Use `null` to indicate a gap.\n *\n * @typedef {number|string|Highcharts.PointOptionsObject|Array<(number|string|null)>|null} Highcharts.PointOptionsType\n */\n/**\n * Gets fired when the point is removed using the `.remove()` method.\n *\n * @callback Highcharts.PointRemoveCallbackFunction\n *\n * @param {Highcharts.Point} this\n * Point where the event occurred.\n *\n * @param {global.Event} event\n * Event that occurred.\n *\n * @param {Highcharts.Point} [ctx]\n * Since v12.6.0, the point context passed as an extra argument for\n * arrow functions.\n */\n/**\n * Possible key values for the point state options.\n *\n * @typedef {\"hover\"|\"inactive\"|\"normal\"|\"select\"} Highcharts.PointStateValue\n */\n/**\n * Gets fired when the point is updated programmatically through the `.update()`\n * method.\n *\n * @callback Highcharts.PointUpdateCallbackFunction\n *\n * @param {Highcharts.Point} this\n * Point where the event occurred.\n *\n * @param {Highcharts.PointUpdateEventObject} event\n * Event that occurred.\n *\n * @param {Highcharts.Point} [ctx]\n * Since v12.6.0, the point context passed as an extra argument for\n * arrow functions.\n */\n/**\n * Information about the update event.\n *\n * @interface Highcharts.PointUpdateEventObject\n * @extends global.Event\n */ /**\n* Options data of the update event.\n* @name Highcharts.PointUpdateEventObject#options\n* @type {Highcharts.PointOptionsType}\n*/\n/**\n * @interface Highcharts.PointEventsOptionsObject\n */ /**\n* Fires when the point is selected either programmatically or following a click\n* on the point. One parameter, `event`, is passed to the function. Returning\n* `false` cancels the operation.\n* @name Highcharts.PointEventsOptionsObject#select\n* @type {Highcharts.PointSelectCallbackFunction|undefined}\n*/ /**\n* Fires when the point is unselected either programmatically or following a\n* click on the point. One parameter, `event`, is passed to the function.\n* Returning `false` cancels the operation.\n* @name Highcharts.PointEventsOptionsObject#unselect\n* @type {Highcharts.PointUnselectCallbackFunction|undefined}\n*/\n/**\n * Information about the select/unselect event.\n *\n * @interface Highcharts.PointInteractionEventObject\n * @extends global.Event\n */ /**\n* @name Highcharts.PointInteractionEventObject#accumulate\n* @type {boolean}\n*/\n/**\n * Gets fired when the point is selected either programmatically or following a\n * click on the point.\n *\n * @callback Highcharts.PointSelectCallbackFunction\n *\n * @param {Highcharts.Point} this\n * Point where the event occurred.\n *\n * @param {Highcharts.PointInteractionEventObject} event\n * Event that occurred.\n *\n * @param {Highcharts.Point} [ctx]\n * Since v12.6.0, the point context passed as an extra argument for\n * arrow functions.\n */\n/**\n * Fires when the point is unselected either programmatically or following a\n * click on the point.\n *\n * @callback Highcharts.PointUnselectCallbackFunction\n *\n * @param {Highcharts.Point} this\n * Point where the event occurred.\n *\n * @param {Highcharts.PointInteractionEventObject} event\n * Event that occurred.\n *\n * @param {Highcharts.Point} [ctx]\n * Since v12.6.0, the point context passed as an extra argument for\n * arrow functions.\n */\n''; // Keeps doclets above in JS file.\n","/* *\n *\n * (c) 2010-2026 Highsoft AS\n * Author: Torstein Hønsi\n *\n * Integration of this software requires a license.\n * - For commercial use, see www.highcharts.com/license\n * - For non-commercial, see www.highcharts.com/license-eula\n *\n *\n * */\n'use strict';\nimport H from '../Globals.js';\nimport D from '../Defaults.js';\nconst { defaultOptions } = D;\nimport Point from './Point.js';\nimport { extend, extendClass, merge } from '../../Shared/Utilities.js';\n/* *\n *\n * Namespace\n *\n * */\nvar SeriesRegistry;\n(function (SeriesRegistry) {\n /* *\n *\n * Properties\n *\n * */\n /**\n * @internal\n * @todo Move `Globals.seriesTypes` code to her.\n */\n SeriesRegistry.seriesTypes = H.seriesTypes;\n /* *\n *\n * Functions\n *\n * */\n /**\n * Registers class pattern of a series.\n *\n * @param {string} seriesType\n * The series type as an identifier string in lower case.\n *\n * @param {Function} SeriesClass\n * The series class as a class pattern or a constructor function with\n * prototype.\n *\n * @return {boolean}\n * True if series type was added, false if it already exists.\n */\n function registerSeriesType(seriesType, SeriesClass) {\n const defaultPlotOptions = defaultOptions.plotOptions || {}, seriesOptions = SeriesClass.defaultOptions, seriesProto = SeriesClass.prototype;\n seriesProto.type = seriesType;\n if (!seriesProto.pointClass) {\n seriesProto.pointClass = Point;\n }\n if (SeriesRegistry.seriesTypes[seriesType]) {\n return false;\n }\n if (seriesOptions) {\n defaultPlotOptions[seriesType] = seriesOptions;\n }\n SeriesRegistry.seriesTypes[seriesType] = SeriesClass;\n return true;\n }\n SeriesRegistry.registerSeriesType = registerSeriesType;\n /**\n * Old factory to create new series prototypes.\n *\n * @deprecated 9.0.0\n * @function Highcharts.seriesType\n *\n * @param {string} type\n * The series type name.\n *\n * @param {string} parent\n * The parent series type name. Use `line` to inherit from the basic\n * {@link Series} object.\n *\n * @param {Highcharts.SeriesOptionsType|Highcharts.Dictionary<*>} options\n * The additional default options that are merged with the parent's options.\n *\n * @param {Highcharts.Dictionary<*>} [seriesProto]\n * The properties (functions and primitives) to set on the new prototype.\n *\n * @param {Highcharts.Dictionary<*>} [pointProto]\n * Members for a series-specific extension of the {@link Point} prototype if\n * needed.\n *\n * @return {Highcharts.Series}\n * The newly created prototype as extended from {@link Series} or its\n * derivatives.\n */\n function seriesType(type, parent, options, seriesProto, pointProto) {\n const defaultPlotOptions = defaultOptions.plotOptions || {};\n parent = parent || '';\n // Merge the options\n defaultPlotOptions[type] = merge(defaultPlotOptions[parent], options);\n // Create the class\n delete SeriesRegistry.seriesTypes[type];\n const parentClass = (SeriesRegistry.seriesTypes[parent] ||\n H.Series), childClass = extendClass(parentClass, seriesProto);\n registerSeriesType(type, childClass);\n SeriesRegistry.seriesTypes[type].prototype.type = type;\n // Create the point class if needed\n if (pointProto) {\n class PointClass extends Point {\n }\n extend(PointClass.prototype, pointProto);\n SeriesRegistry.seriesTypes[type].prototype.pointClass = PointClass;\n }\n return SeriesRegistry.seriesTypes[type];\n }\n SeriesRegistry.seriesType = seriesType;\n})(SeriesRegistry || (SeriesRegistry = {}));\n/* *\n *\n * Default Export\n *\n * */\nexport default SeriesRegistry;\n"],"x_google_ignoreList":[0,1,2,3],"mappings":";;AAaA,IAAM,EAAE,WAAQ,WAAQA,GAGlB,EAAE,oBAAiB,GAOnB,IAAsB,KACxB,EAAW,EAAa,YAAY,KACpC,EAAa,aAAa,cAAc,EACpC,aAAa,MAAM,EACvB,CAAC,GACC,IAAY,IACd,EAAmB,WAAW,EAAE,IAChC,IAiBE,IAAN,MAAM,EAAI;CAkBN,OAAO,qBAAqB,GAAY;EAqBpC,OApBA,EAAW,IAAa,GAAK,MAAQ;GACjC,IAAI,IAAQ;GAeZ,AAdI,EAAI,kBAAkB,QAAQ,CAAG,MAAM,OACvC,IAAQ,KAER;IAAC;IAAc;IAAU;IAAQ;IAAU;GAAK,CAAC,CAChD,QAAQ,CAAG,MAAM,OAClB,IAAQ,EAAS,CAAG,KAAK,EAAI,kBAAkB,MAAM,MAAQ,EAAI,QAAQ,CAAG,MAAM,CAAC,IAElF,MACD,EAAM,IAAI,IAAO,KAAK,GAAG,EACrB,+BAA+B,GAAG,IACtC,CAAC,GACD,OAAO,EAAW,KAGlB,EAAS,CAAG,KAAK,EAAW,OAC5B,EAAW,KAAO,EAAI,QAAQ,MAAM,MAAM;EAElD,CAAC,GACM;CACX;CAUA,OAAO,WAAW,GAAO;EACrB,OAAO,EACF,MAAM,GAAG,CAAC,CACV,QAAQ,GAAQ,MAAS;GAC1B,IAAM,IAAO,EAAK,MAAM,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK,CAAC,GAAG,IAAM,EAAK,MAAM;GAIpE,OAHI,KAAO,EAAK,WACZ,EAAO,EAAI,QAAQ,cAAc,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAK,KAAK,GAAG,IAExE;EACX,GAAG,CAAC,CAAC;CACT;CAgBA,OAAO,eAAe,GAAI,GAAM;EAE5B,AADA,EAAG,YAAY,EAAI,WACf,KAEA,IADgB,EAAI,CAClB,CAAC,CAAC,SAAS,CAAE;CAEvB;CAOA,YAAY,GAAQ;EAChB,KAAK,QAAQ,OAAO,KAAW,WAC3B,KAAK,YAAY,CAAM,IAAI;CACnC;CAiBA,SAAS,GAAQ;EAUb,SAAS,EAAQ,GAAS,GAAW;GACjC,IAAI;GA0DJ,OAzDA,EAAM,CAAO,CAAC,CAAC,QAAQ,SAAU,GAAM;IACnC,IAAM,IAAU,EAAK,SACf,IAAW,EAAK,cAClBA,EAAE,IAAI,eAAe,EAAK,WAAW,IACrC,KAAK,GAEH,IAAsB,EAAI,qBAC5B;IACJ,IAAI,GAAS;KACT,IAAI,MAAY,SACZ,IAAO;UAEN,IAAI,EAAI,YAAY,QAAQ,CAAO,MAAM,MAC1C,GAAqB;MACrB,IAAM,IAAK,MAAY,QACnB,IACC,EAAU,gBAAgB,GACzB,IAAUA,EAAE,IAAI,gBAAgB,GAAI,CAAO,GAC3C,IAAa,EAAK,cAAc,CAAC;MAwBvC,AArBA,EAAW,GAAM,SAAU,GAAK,GAAK;OACjC,AAAI,MAAQ,aACR,MAAQ,gBACR,MAAQ,cACR,MAAQ,WACR,MAAQ,kBACR,EAAW,KAAO;MAE1B,CAAC,GACD,EAAK,GAAS,IACV,IACA,EAAI,qBAAqB,CAAU,CAAC,GACpC,EAAK,SACL,EAAI,GAAS,EAAK,KAAK,GAGvB,KACA,EAAQ,YAAY,CAAQ,GAGhC,EAAQ,EAAK,YAAY,CAAC,GAAG,CAAO,GACpC,IAAO;KACX,OAEI,EAAM,IAAI,IAAO,KAAK,GAAG,EACrB,6BAA6B,EACjC,CAAC;IAET;IAKA,AAHI,KACA,EAAU,YAAY,CAAI,GAE9B,IAAM;GACV,CAAC,GAEM;EACX;EACA,OAAO,EAAQ,KAAK,OAAO,CAAM;CACrC;CAWA,YAAY,GAAQ;EAChB,IAAM,IAAQ,CAAC;EACf,IAAS,EACJ,KAAK,CAAC,CAIN,QAAQ,kBAAkB,gBAAgB;EAC/C,IAAI;EACJ,IAAI;GACA,IAAM,IAAI,UAAU,CAAC,CAAC,gBAAgB,IAClC,EAAmB,WAAW,CAAM,IACpC,GAAQ,WAAW;EAC3B,QACM,CAON;EACA,IAAI,CAAC,GAAK;GACN,IAAM,IAAO,EAAc,KAAK;GAEhC,AADA,EAAK,YAAY,GACjB,IAAM,EAAE,QAAK;EACjB;EACA,IAAM,KAAoB,GAAM,MAAU;GAEtC,IAAM,IAAU,EAAK,aACjB,EAAK,SAAS,YAAY,GAExB,IAAU,EACZ,WACJ;GACA,AAAI,MAAY,YACZ,EAAQ,cAAc,EAAK,eAAe;GAE9C,IAAM,IAAmB,EAAK;GAE9B,IAAI,GAAkB;IAClB,IAAM,IAAa,CAAC;IASpB,AARA,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAmB,MAAW;KAC1C,AAAI,EAAO,SAAS,eAChB,EAAQ,QAAQ,EAAI,WAAW,EAAO,KAAK,IAG3C,EAAW,EAAO,QAAQ,EAAO;IAEzC,CAAC,GACD,EAAQ,aAAa;GACzB;GAEA,IAAI,EAAK,WAAW,QAAQ;IACxB,IAAM,IAAW,CAAC;IAIlB,AAHA,CAAC,CAAC,CAAC,QAAQ,KAAK,EAAK,aAAa,MAAc;KAC5C,EAAiB,GAAW,CAAQ;IACxC,CAAC,GACG,EAAS,WACT,EAAQ,WAAW;GAE3B;GACA,EAAM,KAAK,CAAO;EACtB;EAEA,OADA,CAAC,CAAC,CAAC,QAAQ,KAAK,EAAI,KAAK,aAAa,MAAc,EAAiB,GAAW,CAAK,CAAC,GAC/E;CACX;AACJ;AAqBA,EAAI,oBAAoB,2sBAkFxB,GAgBA,EAAI,oBAAoB;CACpB;CACA;CACA;CACA;CACA;CACA;CACA;AACJ,GAeA,EAAI,cAAc,6aAqElB,GAEA,EAAI,YAAY,GA4BhB,EAAI,sBAAsB;;;ACthB1B,IAAM,EAAE,gBAAA,GAAgB,mBAAgBC,GAElC,EAAE,gBAAaC,GAGf,IAAU;CAEZ,MAAM,GAAG,MAAM,IAAI;CACnB,SAAS,GAAG,MAAO,MAAM,IAA0B,KAAtB,EAAa,IAAI,CAAC;CAE/C,KAAK,GAAG,MAAM,KAAK;CACnB,MAAM,SAAU,GAAK;EACjB,IAAM,IAAQ,UAAU,UAAU,SAAS;EAC3C,OAAO,EAAQ,CAAG,IACd,EAAI,KAAK,GAAM,MAAMC,EAAO,EAAM,MAAM,EAAO,EAAS,CAAI,IAAI,IAAO,EAAE,SAAS,EAAK,GAAG;GACtF,UAAU;GACV,UAAU,MAAM;GAChB,SAAS,MAAM,EAAI,SAAS;EAChC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IACZ;CACR;CACA,KAAK,GAAG,MAAM,KAAK;CACnB,KAAK,GAAG,MAAM,IAAI;CAClB,KAAO,MAAc,CAAC,CAAC;CACvB,KAAK,GAAG,MAAM,KAAK;CACnB,KAAK,GAAG,MAAM,IAAI;CAClB,WAAW,GAAG,MAAM,EAAa,IAAI,GAAG,EAAE;CAE1C,KAAK,GAAG,MAAM,KAAK;CACnB,WAAW,GAAG,MAAM,IAAI;CACxB;CACA,SAAS,MAAc,CAAC;AAC5B,GACM,IAAoB,CAAC,GAUrB,KAAkB,MAAQ,eAAe,KAAK,CAAG;AAgDvD,SAAS,EAAW,GAAQ,GAAW,GAAgB;CACnD,OAAO,EAAY,WAAW,GAAQ,GAAW,CAAc;AACnE;AA2BA,SAASA,EAAO,IAAM,IAAI,GAAK,GAAO;CAClC,IAAM,IAAQ,iBAId,IAAW,iBAAiB,IAAU,CAAC,GAAG,IAAa,MAAM,IAAW,UAAU,IAAO,GAAO,SAAS,QAAQC,EAAe,MAAM,IAAO,GAAO,QAAQ,GAAa,IAAkB,GAAO,mBAAmB,EAAa,KAAK,CAAK,GAMtO,KAAmB,IAAM,OAAO;EAClC,IAAI;EAeJ,OAbI,MAAQ,SACD,KAEP,MAAQ,UACD,MAEN,IAAI,OAAO,CAAG,EAAA,CAAG,SAAS,MAAM,IAC1B,IAEP,EAAe,CAAG,IACX,EAAI,MAAM,GAAG,EAAE,IAGnB,EAAkB,GAAK,CAAG;CACrC,GACI,GAAO,GAAc,IAAQ,GAAG;CAEpC,QAAQ,IAAQ,EAAM,KAAK,CAAG,OAAO,OAAM;EAGvC,IAAM,IAAY,GAAO,IAAW,EAAS,KAAK,EAAM,EAAE;EAK1D,AAJI,MACA,IAAQ,GACR,IAAS,KAER,GAAc,YACf,IAAe;GACX;GACA,YAAY,EAAM;GAClB,MAAM,EAAM;GACZ,SAAS,EAAM,EAAE,CAAC,OAAO,CAAC,MAAM;GAChC,OAAO,EAAM;GACb,YAAY,EAAM,QAAQ,EAAM,EAAE,CAAC;GACnC,QAAQ,EAAM,EAAE,CAAC;EACrB;EAGJ,IAAM,KAAM,EAAa,UAAU,IAAY,EAAA,CAAO,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,QAAQ,KAAK,EAAE;EACtF,AAAI,EAAQ,OAEJ,EAAa,WAAW,MAAO,EAAa,MAC5C,KAEC,EAAa,OACd,EAAa,KAAK;EAI1B,IAAM,IAAsB,EAAM,OAAO;EACzC,IAAI,EAAa,WACb,EAAa,OAAO,EAAM,OAAO,IAAI,EAAa,QAClD,IAAsB;GACtB,IAAK,GAkBA,AAAK,KACN;QAnBQ;IACR,IAAM,IAAQ,EAAa,YAAY,IAAO,EAAI,OAAO,GAAO,EAAM,QAAQ,CAAK;IAYnF,AATI,EAAa,SAAS,KAAK,KAC3B,EAAa,OAAO,GACpB,EAAa,aAAa,EAAM,QAAQ,EAAM,EAAE,CAAC,UAIjD,EAAa,WAAW,GAE5B,EAAa,QAAQ,IAAO,EAAM,IAC7B,MACD,EAAQ,KAAK,CAAY,GACzB,IAAe,KAAK;GAE5B;EAKJ,OACK,AAAK,EAAa,WACnB,EAAQ,KAAK,CAAY;EAG7B,IAAI,KAAY,CAAC,GAAc,SAC3B;CAER;CAiEA,OA/DA,EAAQ,SAAS,MAAU;EACvB,IAAM,EAAE,SAAM,aAAU,eAAY,UAAO,GACvC,GAAa;EAEjB,IAAI,GAAI;GAGJ,IAAM,IAAO,CAAC,CAAK,GAAG,IAAQ,CAAC,GAAG,IAAM,EAAW,QAC/C,IAAQ,GAAG;GACf,KAAK,IAAI,GAAG,KAAK,GAAK,KAAK;IACvB,IAAM,IAAO,EAAW,OAAO,CAAC;IAShC,AAPI,CAAC,MAAc,MAAS,QAAO,MAAS,OACxC,IAAY,IAGP,MAAc,MACnB,IAAY,KAEZ,CAAC,MACA,MAAS,OAAO,MAAM,OACvB,EAAM,KAAK,EAAW,OAAO,GAAO,IAAI,CAAK,CAAC,GAC9C,IAAQ,IAAI;GAEpB;GAEA,KADA,IAAI,EAAQ,EAAG,CAAC,QACT,MACH,EAAK,QAAQ,EAAgB,EAAM,IAAI,EAAE,CAAC;GAK9C,AAHA,IAAc,EAAQ,EAAG,CAAC,MAAM,GAAK,CAAI,GAGrC,EAAM,WAAW,OAAO,KAAgB,cACxC,IAAcD,EAAO,IAAc,IAAO,GAAU,GAAK,CAAK;EAGtE,OACK;GACD,IAAM,IAAiB,EAAe,CAAU,IAC5C,CAAC,CAAU,IAAI,EAAW,MAAM,GAAG;GAGvC,IAFA,IAAc,EAAgB,EAAe,MAAM,KAAK,EAAE,GAEtD,EAAe,UAAU,OAAO,KAAgB,UAAU;IAC1D,IAAM,IAAU,EAAe,KAAK,GAAG;IACvC,IAAI,EAAW,KAAK,CAAO,GAAG;KAC1B,IAAM,IAAW,UAAU,EAAQ,MAAM,CAAQ,KAAK,CAAC,IAAI,IAAI,EAAA,CAAG,IAAI,EAAE;KACxE,AAAI,MAAgB,SAChB,IAAc,EAAgB,GAAa,GAAU,EAAK,cAAc,EAAQ,QAAQ,GAAG,IAAI,KAAK,EAAK,eAAe,EAAE;IAElI,OAEI,IAAc,EAAK,WAAW,GAAS,CAAW;GAE1D;GAIA,AADA,EAAS,YAAY,GACjB,EAAS,KAAK,EAAM,IAAI,KAAK,EAAS,CAAW,MACjD,IAAc,IAAI,EAAY;EAEtC;EACA,IAAM,EAAI,QAAQ,EAAM,MAAM,EAAK,GAAa,EAAE,CAAC;CACvD,CAAC,GACM,IAASA,EAAO,GAAK,GAAK,CAAK,IAAI;AAC9C;AA2BA,SAAS,EAAa,GAAQ,GAAU,GAAc,GAAc;CAEhE,AADA,IAAS,CAAC,KAAU,GACpB,IAAW,CAAC;CACZ,IAAI,GAAK,GAAgB,CAAC,GAAU,KAAO,EAAO,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,GAC5E,IAAO,MAAM,SAAS,QAAQC,EAAe,MAAM,KAAW,EAAO,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,GAAA,CAAI,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,QAAQ,IAAgB,GAAU,IAAU,CAAC;CAwCtK,AAvCA,AAAiB,MAAe,EAAK,cACrC,AAAiB,MAAe,EAAK,cACjC,MAAa,KAEb,IAAW,KAAK,IAAI,GAAS,EAAE,IAEzB,EAAS,CAAQ,IAGlB,KAAY,IAAM,MAEvB,IAAiB,IAAW,GACxB,KAAkB,KAElB,IAAW,CAAC,EAAS,cAAc,CAAc,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAC9D,IAAW,MAIX,IAAW,KAAK,MAAM,CAAQ,GAC9B,AAMI,IANA,IAAW,KAEF,EAAE,IAAoB,MAAI,EAAG,CAAG,QAAQ,CAAQ,IAIhD,GAEb,IAAM,MArBV,IAAW,GAwBX,MACA,AAAa,MAAW,GACxB,IAAS,IAET,EAAS,CAAQ,KAAK,KAAY,MAClC,EAAQ,wBAAwB,GAChC,EAAQ,wBAAwB,IAEhC,MAAiB,OACjB,EAAQ,cAAc;CAE1B,IAAM,IAAgB,KAAgB,GAAc,IAAS,IACzD,OAAQ,MAAM,UAAU,EAAK,UAAU,GAAW,IAAW,KAAK,UAAU,CAAO,IAAI;CAqB3F,OApBA,KADwG,EAAkB,OAAc,EAAkB,KAAY,IAAI,KAAK,aAAa,GAAQ,CAAO,GAAA,CAClM,OAAO,CAAM,GAGlB,MACA,IAAM,EAED,QAAQ,YAAY,KAAK,CAAC,CAC1B,QAAQ,QAAQ,KAAgB,GAAG,CAAC,CACpC,QAAQ,MAAM,KAAgB,GAAG,KAIzC,CAAC,KAAY,CAAC,KAAQ,KAElB,IAAM,KAAK,CAAC,OACb,IAAM,MAEN,KAAO,CAAC,KAAQ,MAChB,KAAO,OAAO,IAAM,IAAI,KAAK,OAAO,IAEjC;AACX;AAMA,IAAM,IAAa;CACf;CACA,QAAA;CACA;CACA;AACJ,GCpYM,EAAE,gBAAA,MAAmBC,GAErB,EAAE,cAAWC,GA6Bb,IAAN,MAAM,EAAM;CAMR,YAAY,GAAQ,GAAS,GAAG;EAwB5B,AAtBA,KAAK,eAAe,SASpB,KAAK,UAAU,IAEf,KAAK,QAAQ,MACb,KAAK,SAAS,GACd,KAAK,aAAa,GAAS,CAAC,GAE5B,AAAY,KAAK,OAAK,EAAU,GAChC,KAAK,aAAa,GAClB,AAAyB,KAAK,oBAAkB,EAAO,QAAQ,iBAC/D,EAAO,MAAM,cAEb,KAAK,WAAW,EAAO,OAAO,aAAa,KAAK,MAAM,KAAK,GAC3D,KAAK,MAAM,KAAK,QAAQ,KAAK,UAC7B,EAAU,MAAM,WAAW;CAC/B;CAyLA,aAAa,GAAS,GAAG,GAAQ;EAC7B,IAAM,IAAQ,MAAM,IAAS,EAAM,QAAQ,IAAc,EAAO,QAAQ,eAAe,EAAO;EAyC9F,OAxCA,IAAU,EAAM,UAAU,gBAAgB,KAAK,MAAM,CAAO,GAE5D,EAAO,GAAO,CAAO,GAErB,AASI,EAAM,UATN,EAAM,UAIU,EAAO,MAAM,QAAQ,MAAM,oBACvC,EAAO,EAAM,SAAS,CAAO,IAC7B,EAAM,EAAM,SAAS,CAAO,IAGhB,GAIhB,MACA,EAAM,IAAI,EAAM,UAAU,kBAAkB,KAAK,GAAO,CAAW,IAEnE,EAAS,CAAC,MACV,EAAM,IAAI,IAET,MAEG,EAAM,aACN,EAAM,QAAQ,WAId,EAAQ,SACR,OAAO,EAAM,OAEb,EAAQ,cACR,OAAO,EAAM,YAEjB,EAAM,SAAS,EAAM,WAAW,CAAC,EAAM,QAAQ,GAE/C,EAAM,eAAe,EAAM,SAAS,SAAS,UAE1C;CACX;CAkBA,UAAU,EAAE,OAAI,GAAG,OAAI,KAAK,IAAQ,CAAC,GAAG;EACpC,IAAM,EAAE,YAAS,cAAW;EAG5B,IAAI,EAAO,MAAM,YACb,GAAS,eACT,CAAC,GAAS,aAAa,UAAU;GACjC,IAAM,IAAM,KAAK,IAAI,IAAO,GAAG,CAAC;GAChC,AAAI,MACA,IAAI,EAAI,IACR,IAAI,EAAI;EAEhB;EAEA,AADA,MAAM,EAAM,SAAS,KAAK,GAC1B,MAAM,EAAM,UAAU,KAAK;EAC3B,IAAM,IAAU,EAAE,KAAE;EAOpB,OAHI,CAAC,EAAO,GAAG,QAAQ,KAAK,CAAC,KAAK,aAC9B,EAAQ,IAAI,IAET;CACX;CAaA,QAAQ,GAAM;EACV,IAAI,CAAC,KAAK,aAAa,CAAC,KAAK,WAAW;GACpC,IAAM,IAAQ,MAAM,IAAS,EAAM,QAAQ,IAAQ,EAAO,OAAO,IAAc,EAAM,aAAa,IAAkB,EAAM,OAAO,MAAM,SAAS,iBAAiB,EAAE,gBAAa,EAAW,CAAe,GAKpM,UAAqB;IAEvB,CAAI,EAAM,WACN,EAAM,YACN,EAAM,aACN,EAAM,gBACN,EAAY,CAAK,GACjB,EAAM,gBAAgB;IAE1B,KAAK,IAAM,KAAQ,GACf,OAAO,EAAM;IAEjB,KAAK,YAAY;GACrB;GAwBA,AAvBI,EAAM,cAEN,EAAM,OAAO,YAAY,CAAK,GAE9B,MACA,EAAM,SAAS,GACf,EAAM,GAAa,CAAK,GACnB,EAAY,WACb,EAAM,cAAc,KAAK,KAG7B,MAAU,EAAM,cAChB,EAAM,WAAW,GAGjB,KAAY,CAAC,KAAQ,EAAO,mBAC5B,EAAO,gBAAgB,KAAK,IAAI,GAChC,KAAK,SAAS,SAAS,4BAA4B,GACnD,WAAW,GAAc,CAAQ,KAGjC,EAAa,GAEjB,EAAM;EACV;EACA,KAAK,YAAY;CACrB;CAUA,gBAAgB,IAAQ;EAAE,SAAS;EAAG,WAAW;CAAE,GAAG;EAClD,IAAM,IAAQ,MAAM,IAAQ,CAAC,GACzB,GAAM;EAQV,KAPI,EAAM,WACN,EAAM,KAAK,WAAW,WAAW,GAEjC,EAAM,aACN,EAAM,KAAK,aAAa,iBAAiB,gBAAgB,GAE7D,IAAI,EAAM,QACH,MAEH,AADA,IAAO,EAAM,IACT,EAAM,OACN,EAAM,KAAQ,EAAM,EAAK,CAAC,QAAQ;EAG1C,CAAC,WAAW,WAAW,CAAC,CAAC,SAAS,MAAS;GACvC,IAAM,IAAS,GAAG,EAAK;GACvB,AAAI,EAAM,MAAS,EAAM,OACrB,EAAM,EAAO,CAAC,SAAS,MAAS;IAC5B,AAAI,GAAM,WACN,EAAK,QAAQ;GAErB,CAAC,GACD,OAAO,EAAM;EAErB,CAAC;CACL;CAkBA,eAAe,GAAW,GAAW,GAAiB;EAClD,IAAM,IAAQ,MAA4B,IAAb,KAAK,OAA+B;EAajE,AAXA,EAAM,YAAY,CAAS,GAEvB,MAAc,WAAW,EAAc,qBACvC,IAAkB,SAAU,GAAO;GAG/B,AAAI,CAAC,EAAM,aAAa,EAAM,UAC1B,EAAM,OAAO,MAAM,EAAM,WAAW,EAAM,WAAW,EAAM,QAAQ;EAE3E,IAEJ,EAAU,GAAO,GAAW,GAAW,CAAe;CAC1D;CAUA,eAAe;EACX,IAAM,IAAQ;EACd,OAAO,sBACF,EAAM,WAAW,6BAA6B,OAC9C,EAAM,YAAY,EAAM,OAAO,QAAQ,kBAAkB,KACtD,yBAAyB,OAC5B,EAAM,SAAS,2BAA2B,OACnC,EAAM,eAAe,SACiB,KAA1C,uBAAuB,EAAM,eAChC,EAAM,QAAQ,YAAY,MAAM,EAAM,QAAQ,YAAY,OAC1D,EAAM,MAAM,YACT,MAAM,EAAM,KAAK,UAAU,QAAQ,uBAAuB,EAAE,IAC5D;CACZ;CAKA,kBAAkB,GAAK;EACd,OAML,OAHI,EAAI,QAAQ,SAAS,MAAM,IACpB,EAAkB,GAAK,KAAK,OAAO,IAEvC,KAAK;CAChB;CASA,UAAU;EACN,IAAM,IAAS,KAAK,QAAQ,IAAQ,EAAO,OAAO,IAAW,EAAO,YAAY,KAC5E,GAAM,IAAI;EAEd,KADA,IAAO,EAAM,IACN,IAAI,EAAM,UACb,KAAK,MAAa,EAAK,QACvB,IAAO,EAAM,EAAE;EAYnB,OATA,AACI,KAAK,kBAAgB,KAAK,OAE9B,AAII,KAAK,QAJL,GAAM,SAAS,CAAC,KAAK,QAAQ,QAChB,EAAK,QAGL,KAAK,eAEf;CACX;CAMA,kBAAkB;EACd,IAAM,IAAQ;EAGd,QAFqB,EAAM,YACtB,EAAM,QAAQ,cAAc,EAAM,QAAQ,QAAQ,eAC/B,KAAK;CACjC;CAOA,UAAU;EACN,QAAS,EAAS,KAAK,CAAC,KACpB,KAAK,aAAa,SAClB,EAAS,KAAK,CAAC;CACvB;CAgBA,gBAAgB,GAAS;EACrB,IAAM,IAAS,KAAK,QAAQ,IAAO,EAAO,QAAQ,MAAM,IAAgB,KAAQ,EAAO,iBAAiB,CAAC,GAAG,GAAG,IAAa,EAAc,QACtI,IAAM,CAAC,GAAG,GAAe,IAAI,GAAG,IAAI;EACxC,IAAI,EAAS,CAAO,KAAK,MAAY,MACjC,EAAI,EAAc,MAAM;OAEvB,IAAI,EAAQ,CAAO,GAiBpB,KAfI,CAAC,KAAQ,EAAQ,SAAS,MAC1B,IAAgB,OAAO,EAAQ,IAC3B,MAAkB,WACd,EAAO,OAAO,WACd,EAAI,IAAI,EAAO,MAAM,KAAK,MAAM,EAAQ,EAAE,IAG1C,EAAI,EAAO,YAAY,UAAU,EAAQ,KAGxC,MAAkB,aACvB,EAAI,IAAI,EAAQ,KAEpB,MAEG,IAAI,IAMP,CAJI,CAAC,KAAe,EAAQ,OAAO,YAC/B,EAAI,EAAc,MAAM,EAAQ,KAEpC,KACA;OAGH,AAAI,OAAO,KAAY,aACxB,IAAM,GAIF,EAAQ,eAGR,EAAO,sBAAsB,KAG7B,EAAQ,WACR,EAAO,mBAAmB;EAclC,QATI,KAAQ,CAAC,EAAO,QAAQ,SACxB,OAAO,KAAK,CAAG,CAAC,CAAC,SAAS,MAAQ;GAC9B,AAAI,EAAI,QAAQ,GAAG,IAAI,MACnB,EAAM,UAAU,kBAAkB,GAAK,EAAI,IAAM,CAAG,GAEpD,OAAO,EAAI;EAEnB,CAAC,GAEE;CACX;CAyBA,IAAI,GAAkB,IAAQ,KAAK,OAAO,IAAQ,KAAK,OAAO;EAC1D,IAAM,EAAE,cAAW,MAAM,EAAE,UAAO,UAAO,aAAU,KAAU,CAAC,GAC1D,IAAO,GAAG,IAAO;EACrB,IAAI,KAAS,EAAS,CAAK,KAAK,EAAS,CAAK,GAK1C,OAJI,MACA,IAAO,IAAQ,EAAM,MAAM,EAAM,UACjC,IAAO,IAAQ,EAAM,MAAM,EAAM,UAE9B,EAAM,YAAY,KAAS,IAC9B,CAAC,EAAM,MAAM,IAAQ,GAAM,EAAM,MAAM,IAAQ,CAAI,IACnD,CAAC,IAAQ,GAAM,IAAQ,CAAI;CAEvC;CAOA,eAAe;EACX,IAAM,EAAE,YAAS,cAAW,MAAM,IAAQ,EAAO,OAAO,IAAe,EAAM,QAAQ,OAAO,IAAa,EAAM,YAC3G,GAAO,IAAa,EAAa,YAAY;EAGjD,IADA,OAAO,KAAK,eACR,EAAO,QAAQ,cAAc;GAC7B,IAAI,CAAC,GAAY;IACb,IAAM,IAAS,EAAO,QAAQ,UAC1B,EAAM,QAAQ;IAElB,AADA,IAAQ,IAAS,EAAO,eACxB,IAAa,GAAQ;GACzB;GAIA,AAHA,IAAa,EAAO,cACpB,EAAO,gBAEH,EAAO,iBAAiB,MACxB,EAAO,eAAe;EAE9B,OAKI,AAHK,MACD,IAAQ,EAAO,QAEnB,IAAa,EAAO;EAGxB,AADA,KAAK,aAAa,EAAQ,cAAc,GACxC,KAAK,QAAQ,EAAQ,SAAS;CAClC;CAoBA,kBAAkB,GAAQ,GAAO,GAAK;EAWlC,OATA,EADuB,MAAM,GACpB,CAAC,CAAC,OAAO,SAAU,GAAQ,GAAK,GAAG,GAAK;GAO7C,OALA,EAAO,KADW,EAAI,SAAS,MAAM,IAEjC,IACA,EAAS,EAAO,IAAM,EAAI,IACtB,EAAO,KACP,CAAC,GACF,EAAO;EAClB,GAAG,CAAM,GACF;CACX;CAEA,aAAa;EACT,OAAO,CAAC,KAAK;CACjB;CAYA,iBAAiB,GAAa;EAE1B,IAAM,EAAE,UAAO,mBAAgB,CAAC,GAAG,GAAG,sBAAmB,KAAK,QAAQ,EAAE,mBAAgB,IAAI,iBAAc,IAAI,iBAAc,OAAO;EAenI,OAbI,EAAM,eACN,IAAc,EAAM,SAAS,iBAAiB,CAAW,KACrD,IAIR,EAAc,SAAS,MAAQ;GAK3B,AAJA,IAAM,YAAY,IACd,KAAe,OACf,IAAc,EAAY,QAAQ,OAAO,IAAM,KAAK,GAAG,GAAG,IAAc,IAAM,MAAM,CAAW,IAEnG,IAAc,EAAY,QAAQ,OAAO,IAAM,KAAK,GAAG,GAAG,IAAM,QAAQ,IAAgB,IAAI;EAChG,CAAC,GACM,EAAO,GAAa,MAAM,CAAK;CAC1C;CAiCA,OAAO,GAAS,IAAS,IAAM,GAAW,GAAU;EAChD,IAAM,IAAQ,MAAM,IAAS,EAAM,QAAQ,IAAU,EAAM,SAAS,IAAQ,EAAO,OAAO,IAAgB,EAAO,SAAS,IAAc,EAAc;EAMtJ,SAAS,IAAS;GACd,EAAM,aAAa,CAAO;GAG1B,IAAM,IAAiB,KAAW,EAAM,gBAAgB,IAAQ,EAAM,OAChE,IAAuB,EAAM,MAAM,OACrC,CAAC,IACD;GAKJ,AAJI,KAAW,MACX,EAAM,UAAU,EAAQ,QAAQ,GAChC,OAAO,EAAM,iBAEb,EAAS,GAAS,EAAI,MAElB,GAAS,WAEL,GAAS,UACF,EAAQ,OAAO,WAAW,WACjC,EAAM,UAAU,EAAQ,QAAQ,IAGpC,GAAS,cAAc,EAAM,cAC7B,EAAM,YAAY,EAAM,UAAU,QAAQ;GAGlD,IAAM,IAAe,EAAM,gBAAgB,CAAO;GAiClD,AAhCK,EAAO,0BAER,EAAO,UAAU,OAAO,GAAc,CAAK,GAIvC,MACA,EAAY,KAAU,EAAS,EAAY,IAAQ,EAAI,KACnD,EAAS,GAAS,EAAI,IACtB,EAAM,UACN,KAAW,EAAY,MAInC,EAAO,UAAU,EAAO,cAAc,IAClC,OAAO,MACH,EAAS,EAAa,CAAC,MAEvB,EAAO,mBAAmB,KAAK,IAEnC,EAAM,IAAI,EAAO,KAAK,EAAa,CAAC,GACpC,EAAM,SAAS,EAAM,WAAW,CAAC,EAAM,QAAQ,GAC3C,EAAO,YACP,EAAO,QAAQ,KAAS,EAAM,KAGlC,CAAC,EAAO,YAAY,EAAO,uBAC3B,EAAM,aAAa,KAEnB,EAAc,eAAe,YAC7B,EAAM,gBAAgB,KAEtB,KACA,EAAM,OAAO,CAAS;EAE9B;EAEA,AAAI,MAAa,KACb,EAAO,IAGP,EAAM,eAAe,UAAU,EAAW,WAAQ,GAAG,CAAM;CAEnE;CAuBA,OAAO,GAAQ,GAAW;EACtB,KAAK,OAAO,YAAY,KAAK,OAAO,KAAK,QAAQ,IAAI,GAAG,GAAQ,CAAS;CAC7E;CAgCA,OAAO,GAAU,GAAY;EACzB,IAAM,IAAQ,MAAM,IAAS,EAAM,QAAQ,IAAQ,EAAO;EAgC1D,AA/BA,IAAW,EAAK,GAAU,CAAC,EAAM,QAAQ,GACzC,KAAK,kBAAkB,GAEvB,EAAM,eAAe,IAAW,WAAW,YAAY,EAAc,cAAW,GAAG,WAAY;GAQ3F,AAPA,EAAM,WAAW,EAAM,QAAQ,WAAW,GACtC,EAAO,QAAQ,SACf,EAAO,QAAQ,KAAK,EAAO,KAAK,QAAQ,CAAK,KACzC,EAAM,UAEd,EAAM,SAAS,KAAY,QAAQ,GAE9B,KACD,EAAM,kBAAkB,CAAC,CAAC,QAAQ,SAAU,GAAW;IACnD,IAAM,IAAa,EAAU,QAAQ,IAAoB,EAAW;IACpE,AAAI,EAAU,YAAY,MAAc,MACpC,EAAU,WAAW,EAAU,QAAQ,WACnC,IACA,EAAkB,SAClB,EAAkB,KAAK,EAAW,KAAK,QAAQ,CAAS,KAAK,EAAU,UAK3E,EAAU,SAAS,EAAM,eACrB,EAAkB,sBAClB,aAAa,EAAE,GACnB,EAAU,eAAe,UAAU;GAE3C,CAAC;EAET,CAAC,GACD,OAAO,KAAK;CAChB;CAUA,YAAY,GAAG;EACX,IAAM,IAAQ,MAA6B,EAAE,aAAU,eAA1B,EAAM,OAAuC;EAC1E,AAAI,MACA,IAAI,IACA,EAAQ,UAAU,CAAC,IAGnB,EAAQ,6BAA6B,GAAO,CAAQ,GACxD,EAAQ,gBAAgB,GAAG,CAAK;CAExC;CAQA,aAAa;EACT,IAAM,IAAQ;EACd,IAAI,CAAC,EAAM,QACP;EAEJ,IAAM,IAAQ,EAAM,OAAO;EAO3B,AANA,EAAM,eAAe,UAAU,GAC1B,EAAM,OAAO,QAAQ,wBACrB,EAAM,eAAe,CAAC,EAAA,CAAG,QAAQ,SAAU,GAAG;GAC3C,EAAE,SAAS;EACf,CAAC,GAEL,EAAM,cAAc,EAAM,aAAa;CAC3C;CAQA,YAAY,GAAW;EACnB,IAAM,IAAQ,MAAkE,IAAlD,EAAM,EAAM,OAAO,QAAQ,OAAO,EAAM,OAA4B,CAAC,CAAC,SAAS;EAC7G,AAAI,EAAW,CAAS,MACnB,CAAC,EAAM,WAAW,MAIf,EAAM,WAAW,EAAU,EAAE,KAAK,MAAO,EAAG,EAAE,CAAC,CAC1C,QAAQ,CAAS,MAAM,OAGhC,EAAM,oBAAoB,GAC1B,EAAM,oBAAoB,EAAS,GAAO,GAAW,CAAS,GAC1D,EAAM,aACN,EAAM,SAAS,EAAU,CAAC,YAAY,OAGrC,EAAM,qBACX,CAAC,KACD,EAAM,WAAW,MACjB,EAAM,WAAW,EAAU,CAAC,cAC5B,EAAY,GAAO,CAAS,GAC5B,OAAO,EAAM,SAAS,IACjB,OAAO,KAAK,EAAM,QAAQ,KAC3B,OAAO,EAAM;CAGzB;CAeA,SAAS,GAAO,GAAM;EAClB,IAAM,IAAQ,MAAM,IAAS,EAAM,QAAQ,IAAgB,EAAM,OAAO,IAAe,EAAO,QAAQ,SAAS,KAAS,aAAa,CAAC,GAAG,IAAiBC,EAAe,cAAc,EAAO,KAAK,EAAE,UACjM,EAAO,QAAQ,QAAS,IAAiB,GAAe,YAAY,IAAO,IAAqB,GAAe,SAAS,KAAS,aACjI,CAAC,GAAG,IAAgB,EAAmB,YAAY,IAAO,IAAc,EAAM,UAAU,CAAC,GAAG,IAAQ,EAAO,OAAO,IAAc,KAAiB,EAAO,eACxJ,IAAO,EAAO,MAAM,GAAe,GAAc,GAAuB,IAAqB,EAAO,oBAAoB;EAE5H,IADA,MAAiB,IAGhB,MAAU,EAAM,SAAS,CAAC,KAEtB,EAAM,YAAY,MAAU,YAE5B,EAAa,YAAY,MAEzB,MAAU,KACN,KAAkB,EAAmB,YAAY,OAErD,KACG,EAAY,SAAS,EAAM,EAAE,YAAY,IAE7C;EAQJ,IANA,EAAM,QAAQ,GACV,MACA,IAAgB,EAAO,cAAc,GAAO,CAAK,IAIjD,EAAM,WAAW,CAAC,EAAM,gBAAgB;GAOxC,IANI,KACA,EAAM,QAAQ,YAAY,sBAAsB,CAAa,GAE7D,KACA,EAAM,QAAQ,SAAS,sBAAsB,CAAK,GAElD,CAAC,EAAM,YAAY;IAEnB,AADA,IAAe,EAAO,aAAa,GAAO,CAAK,GAC/C,IAAyB,EAAM,QAAQ,MAAM,aACzC,EAAa;IACjB,IAAM,IAAU,EAAa;IAc7B,AAXI,EAAO,QAAQ,uBAAuB,EAAS,CAAO,MACrD,EAAM,cAAc,CAAC,EAAA,CAAG,QAAQ,SAAU,GAAO;KAC9C,AAAI,KACA,CAAC,EAAM,SAAS,8BAA8B,MAC9C,EAAM,QAAQ,EAAE,WAAQ,GAAG,CAAqB,GAC5C,EAAM,aACN,EAAM,UAAU,QAAQ,EAAE,WAAQ,GAAG,CAAqB;IAGtE,CAAC,GAEL,EAAM,QAAQ,QAAQ,GAAc,CAAqB;GAC7D;GASA,AARI,KACA,EAAM,QAAQ,QAAQ,GAEtB,EAAM,QAAQ,MAAM,aAChB,EAAmB,aACnB,EAAc,SAAU,GAG5B,KACA,EAAmB,KAAK;EAEhC,OAoCI,AAhCI,KAAS,MACT,IAAY,EAAY,UAAU,EAAO,QAGrC,KACA,EAAmB,kBAAkB,MACrC,IAAqB,EAAmB,QAAQ,IAGhD,MACK,IAWD,EAAmB,IAAO,YAAY,OAAO,CAAC;GAC1C,GAAG,EAAc;GACjB,GAAG,EAAc;EACrB,CAAC,IAbG,MACA,EAAO,qBAAqB,IACxB,EAAM,SACD,OAAO,GAAW,EAAc,GAAG,EAAc,GAAG,EAAc,OAAO,EAAc,QAAQ,EAAM,GAAe,CAAkB,CAAC,CAAC,CACxI,IAAI,EAAO,WAAW,GAC/B,EAAmB,gBAAgB,KAW3C,CAAC,EAAM,cAAc,KACrB,EAAM,UAAU,cAChB,EAAmB,KAAK,EAAO,aAAa,GAAO,CAAK,CAAC,IAG7D,MACA,EAAmB,KAAS,EAAM,WAAW,SAAS,OAAO,CAAC,GAC9D,EAAmB,QAAQ,QAAQ,GACnC,EAAmB,SAAS,EAAM,aAAa,GAAG,EAAI;EAI9D,IAAM,IAAc,EAAS,EAAa,IAAI,IAC1C,EAAa,OACb,CAAC,GACC,IAAiB,EAAM,WAAW,GAClC,IAAmB,GAAe,cAAc;EAoCtD,AAnCI,EAAY,QACZ,KACA,MAAqB,YACrB,CAAC,EAAM,aACF,MACD,EAAO,OAAO,IAAO,EAAM,SAAS,KAAK,CAAC,CAErC,IAAI,EAAc,WAAW,IAEtC,EAAK,KAAK,CAAC,CAAC,IAAO,YAAY,OAAO,CAAC,EACnC,GAAG,EAAM,SAAS,EAAY,IAAI,EACtC,CAAC,GACD,EAAK,KAAK;GACN,OAAS,sCACL,EAAK,EAAM,YAAY,EAAO,UAAU,KACvC,EAAM,YAAY,MAAM,EAAM,YAAY;GAC/C,YAAc;GACd,QAAU;EACd,CAAC,GACD,EAAK,QAAQ,GACR,EAAM,cACP,EAAK,KAAK,EAAO;GACb,MAAQ,EAAM,SAAS,EAAO;GAC9B,gBAAgB,EAAY;EAChC,GAAG,EAAI,qBAAqB,EAAY,cAAc,CAAC,CAAC,CAAC,CAAC,KAGzD,GAAM,OAAO,YAClB,CAAC,EAAK,MAAM,aAEZ,EAAK,QAAQ,EAAE,GAAG,EAAK,MAAM,SAAS,CAAC,EAAE,GAAG,MAG5C,EAAK,IAAI,GAEb,EAAU,GAAO,iBAAiB,EAAE,SAAM,CAAC;CAC/C;CAaA,SAAS,GAAM;EACX,IAAM,IAAM,KAAK,IAAI;EACrB,OAAO,IAAM,KAAK,OAAO,MAAM,SAAS,QAAQ,OAAO,EAAM,EAAI,IAAI,CAAC,IAAI,GAAM,EAAI,KAAK,GAAM,IAAO,GAAG,IAAO,CAAC,IAAI,CAAC;CAC1H;AACJ,GClsCM,EAAE,sBAAmBC,GAQvB;CACH,SAAU,GAAgB;CAUvB,EAAe,cAAcC,EAAE;CAmB/B,SAAS,EAAmB,GAAY,GAAa;EACjD,IAAM,IAAqB,EAAe,eAAe,CAAC,GAAG,IAAgB,EAAY,gBAAgB,IAAc,EAAY;EAYnI,OAXA,EAAY,OAAO,GACnB,AACI,EAAY,eAAa,GAE7B,CAAI,EAAe,YAAY,OAG3B,MACA,EAAmB,KAAc,IAErC,EAAe,YAAY,KAAc,GAClC;CACX;CACA,EAAe,qBAAqB;CA4BpC,SAAS,EAAW,GAAM,GAAQ,GAAS,GAAa,GAAY;EAChE,IAAM,IAAqB,EAAe,eAAe,CAAC;EAK1D,AAJA,MAAmB,IAEnB,EAAmB,KAAQ,EAAM,EAAmB,IAAS,CAAO,GAEpE,OAAO,EAAe,YAAY;EAClC,IAAM,IAAe,EAAe,YAAY,MAC5CA,EAAE;EAIN,IAHA,EAAmB,GADS,EAAY,GAAa,CACnB,CAAC,GACnC,EAAe,YAAY,EAAK,CAAC,UAAU,OAAO,GAE9C,GAAY;GACZ,MAAM,UAAmB,EAAM,CAC/B;GAEA,AADA,EAAO,EAAW,WAAW,CAAU,GACvC,EAAe,YAAY,EAAK,CAAC,UAAU,aAAa;EAC5D;EACA,OAAO,EAAe,YAAY;CACtC;CACA,EAAe,aAAa;AAChC,EAAA,CAAG,AAAmB,MAAiB,CAAC,CAAE;AAM1C,IAAA,IAAe"}
|