@reddb-io/ui 0.4.0 → 0.4.1
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/build/_app/immutable/chunks/{Bf0kgHHV.js → BOm0dWBE.js} +1 -1
- package/build/_app/immutable/chunks/{DkihsTT_.js → BjiIDQc5.js} +1 -1
- package/build/_app/immutable/chunks/{CQUazLlV.js → CraBVUa8.js} +1 -1
- package/build/_app/immutable/chunks/{DxlrWGyf.js → Dc8lKBnh.js} +6 -6
- package/build/_app/immutable/chunks/{kA3Jql_0.js → kV8hsQzl.js} +1 -1
- package/build/_app/immutable/chunks/{DEXJoNrJ.js → tI1T3IGL.js} +4 -4
- package/build/_app/immutable/entry/{app.DsWyVHHY.js → app.CqnCbx3-.js} +2 -2
- package/build/_app/immutable/entry/start.BHO_MY7Q.js +1 -0
- package/build/_app/immutable/nodes/{0.B3B9dr1W.js → 0.B0qC983k.js} +1 -1
- package/build/_app/immutable/nodes/{1.BRHK3-aW.js → 1.BALgKrlb.js} +1 -1
- package/build/_app/immutable/nodes/{10.DO83djGy.js → 10.Dg8SyeBS.js} +1 -1
- package/build/_app/immutable/nodes/{15.BMQezBh7.js → 15.UGiFEthu.js} +1 -1
- package/build/_app/version.json +1 -1
- package/build/index.html +10 -10
- package/dist/embed/{AnalyticsView-C_h8ScpB.js → AnalyticsView-g7iZKS88.js} +4 -4
- package/dist/embed/{AnalyticsView-C_h8ScpB.js.map → AnalyticsView-g7iZKS88.js.map} +1 -1
- package/dist/embed/{RedUiEmbedRoot-BlduSCNM.js → RedUiEmbedRoot-B0chjnkm.js} +5 -5
- package/dist/embed/{RedUiEmbedRoot-BlduSCNM.js.map → RedUiEmbedRoot-B0chjnkm.js.map} +1 -1
- package/dist/embed/{index-client-DelkELqi.js → index-client-DqhuzUPo.js} +2 -2
- package/dist/embed/{index-client-DelkELqi.js.map → index-client-DqhuzUPo.js.map} +1 -1
- package/dist/embed/{index-BSBRHtH4.js → index-dKxVhrdf.js} +161 -156
- package/dist/embed/{index-BSBRHtH4.js.map → index-dKxVhrdf.js.map} +1 -1
- package/dist/embed/index.js +1 -1
- package/dist/embed/{sigma.esm-D9VpQHRm.js → sigma.esm-BFfaH_Ia.js} +2 -2
- package/dist/embed/{sigma.esm-D9VpQHRm.js.map → sigma.esm-BFfaH_Ia.js.map} +1 -1
- package/package.json +3 -3
- package/src/lib/reddb/client.ts +20 -14
- package/build/_app/immutable/entry/start.JTS2dMkh.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sigma.esm-D9VpQHRm.js","sources":["../../../../node_modules/.pnpm/sigma@3.0.3_graphology-types@0.24.8/node_modules/sigma/types/dist/sigma-types.esm.js","../../../../node_modules/.pnpm/sigma@3.0.3_graphology-types@0.24.8/node_modules/sigma/dist/normalization-be445518.esm.js","../../../../node_modules/.pnpm/sigma@3.0.3_graphology-types@0.24.8/node_modules/sigma/dist/data-11df7124.esm.js","../../../../node_modules/.pnpm/sigma@3.0.3_graphology-types@0.24.8/node_modules/sigma/settings/dist/sigma-settings.esm.js","../../../../node_modules/.pnpm/sigma@3.0.3_graphology-types@0.24.8/node_modules/sigma/dist/sigma.esm.js"],"sourcesContent":["import { _ as _inherits, a as _createClass, b as _classCallCheck, c as _callSuper } from '../../dist/inherits-d1a1e29b.esm.js';\nimport { EventEmitter } from 'events';\n\n/**\n * Util type to represent maps of typed elements, but implemented with\n * JavaScript objects.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n/**\n * Returns a type similar to T, but with the K set of properties of the type\n * T *required*, and the rest optional.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n/**\n * Returns a type similar to Partial<T>, but with at least one key set.\n */\n\n/**\n * Custom event emitter types.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\nvar TypedEventEmitter = /*#__PURE__*/function (_ref) {\n function TypedEventEmitter() {\n var _this;\n _classCallCheck(this, TypedEventEmitter);\n _this = _callSuper(this, TypedEventEmitter);\n _this.rawEmitter = _this;\n return _this;\n }\n _inherits(TypedEventEmitter, _ref);\n return _createClass(TypedEventEmitter);\n}(EventEmitter);\n\n/**\n * Event types.\n */\n\n/**\n * Export various other types:\n */\n\nexport { TypedEventEmitter };\n","import isGraph from 'graphology-utils/is-graph';\nimport { _ as _slicedToArray } from './colors-beb06eb2.esm.js';\n\nvar linear = function linear(k) {\n return k;\n};\nvar quadraticIn = function quadraticIn(k) {\n return k * k;\n};\nvar quadraticOut = function quadraticOut(k) {\n return k * (2 - k);\n};\nvar quadraticInOut = function quadraticInOut(k) {\n if ((k *= 2) < 1) return 0.5 * k * k;\n return -0.5 * (--k * (k - 2) - 1);\n};\nvar cubicIn = function cubicIn(k) {\n return k * k * k;\n};\nvar cubicOut = function cubicOut(k) {\n return --k * k * k + 1;\n};\nvar cubicInOut = function cubicInOut(k) {\n if ((k *= 2) < 1) return 0.5 * k * k * k;\n return 0.5 * ((k -= 2) * k * k + 2);\n};\nvar easings = {\n linear: linear,\n quadraticIn: quadraticIn,\n quadraticOut: quadraticOut,\n quadraticInOut: quadraticInOut,\n cubicIn: cubicIn,\n cubicOut: cubicOut,\n cubicInOut: cubicInOut\n};\n\n/**\n * Defaults.\n */\n\nvar ANIMATE_DEFAULTS = {\n easing: \"quadraticInOut\",\n duration: 150\n};\n\n/**\n * Function used to animate the nodes.\n */\nfunction animateNodes(graph, targets, opts, callback) {\n var options = Object.assign({}, ANIMATE_DEFAULTS, opts);\n var easing = typeof options.easing === \"function\" ? options.easing : easings[options.easing];\n var start = Date.now();\n var startPositions = {};\n for (var node in targets) {\n var attrs = targets[node];\n startPositions[node] = {};\n for (var _k in attrs) startPositions[node][_k] = graph.getNodeAttribute(node, _k);\n }\n var frame = null;\n var _step = function step() {\n frame = null;\n var p = (Date.now() - start) / options.duration;\n if (p >= 1) {\n // Animation is done\n for (var _node in targets) {\n var _attrs = targets[_node];\n\n // We use given values to avoid precision issues and for convenience\n for (var _k2 in _attrs) graph.setNodeAttribute(_node, _k2, _attrs[_k2]);\n }\n if (typeof callback === \"function\") callback();\n return;\n }\n p = easing(p);\n for (var _node2 in targets) {\n var _attrs2 = targets[_node2];\n var s = startPositions[_node2];\n for (var _k3 in _attrs2) graph.setNodeAttribute(_node2, _k3, _attrs2[_k3] * p + s[_k3] * (1 - p));\n }\n frame = requestAnimationFrame(_step);\n };\n _step();\n return function () {\n if (frame) cancelAnimationFrame(frame);\n };\n}\n\nfunction identity() {\n return Float32Array.of(1, 0, 0, 0, 1, 0, 0, 0, 1);\n}\n\n// TODO: optimize\nfunction scale(m, x, y) {\n m[0] = x;\n m[4] = typeof y === \"number\" ? y : x;\n return m;\n}\nfunction rotate(m, r) {\n var s = Math.sin(r),\n c = Math.cos(r);\n m[0] = c;\n m[1] = s;\n m[3] = -s;\n m[4] = c;\n return m;\n}\nfunction translate(m, x, y) {\n m[6] = x;\n m[7] = y;\n return m;\n}\nfunction multiply(a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b00 = b[0],\n b01 = b[1],\n b02 = b[2];\n var b10 = b[3],\n b11 = b[4],\n b12 = b[5];\n var b20 = b[6],\n b21 = b[7],\n b22 = b[8];\n a[0] = b00 * a00 + b01 * a10 + b02 * a20;\n a[1] = b00 * a01 + b01 * a11 + b02 * a21;\n a[2] = b00 * a02 + b01 * a12 + b02 * a22;\n a[3] = b10 * a00 + b11 * a10 + b12 * a20;\n a[4] = b10 * a01 + b11 * a11 + b12 * a21;\n a[5] = b10 * a02 + b11 * a12 + b12 * a22;\n a[6] = b20 * a00 + b21 * a10 + b22 * a20;\n a[7] = b20 * a01 + b21 * a11 + b22 * a21;\n a[8] = b20 * a02 + b21 * a12 + b22 * a22;\n return a;\n}\nfunction multiplyVec2(a, b) {\n var z = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n var a00 = a[0];\n var a01 = a[1];\n var a10 = a[3];\n var a11 = a[4];\n var a20 = a[6];\n var a21 = a[7];\n var b0 = b.x;\n var b1 = b.y;\n return {\n x: b0 * a00 + b1 * a10 + a20 * z,\n y: b0 * a01 + b1 * a11 + a21 * z\n };\n}\n\n/**\n * In sigma, the graph is normalized into a [0, 1], [0, 1] square, before being given to the various renderers. This\n * helps to deal with quadtree in particular.\n * But at some point, we need to rescale it so that it takes the best place in the screen, i.e. we always want to see two\n * nodes \"touching\" opposite sides of the graph, with the camera being at its default state.\n *\n * This function determines this ratio.\n */\nfunction getCorrectionRatio(viewportDimensions, graphDimensions) {\n var viewportRatio = viewportDimensions.height / viewportDimensions.width;\n var graphRatio = graphDimensions.height / graphDimensions.width;\n\n // If the stage and the graphs are in different directions (such as the graph being wider that tall while the stage\n // is taller than wide), we can stop here to have indeed nodes touching opposite sides:\n if (viewportRatio < 1 && graphRatio > 1 || viewportRatio > 1 && graphRatio < 1) {\n return 1;\n }\n\n // Else, we need to fit the graph inside the stage:\n // 1. If the graph is \"squarer\" (i.e. with a ratio closer to 1), we need to make the largest sides touch;\n // 2. If the stage is \"squarer\", we need to make the smallest sides touch.\n return Math.min(Math.max(graphRatio, 1 / graphRatio), Math.max(1 / viewportRatio, viewportRatio));\n}\n\n/**\n * Function returning a matrix from the current state of the camera.\n */\nfunction matrixFromCamera(state, viewportDimensions, graphDimensions, padding, inverse) {\n // TODO: it's possible to optimize this drastically!\n var angle = state.angle,\n ratio = state.ratio,\n x = state.x,\n y = state.y;\n var width = viewportDimensions.width,\n height = viewportDimensions.height;\n var matrix = identity();\n var smallestDimension = Math.min(width, height) - 2 * padding;\n var correctionRatio = getCorrectionRatio(viewportDimensions, graphDimensions);\n if (!inverse) {\n multiply(matrix, scale(identity(), 2 * (smallestDimension / width) * correctionRatio, 2 * (smallestDimension / height) * correctionRatio));\n multiply(matrix, rotate(identity(), -angle));\n multiply(matrix, scale(identity(), 1 / ratio));\n multiply(matrix, translate(identity(), -x, -y));\n } else {\n multiply(matrix, translate(identity(), x, y));\n multiply(matrix, scale(identity(), ratio));\n multiply(matrix, rotate(identity(), angle));\n multiply(matrix, scale(identity(), width / smallestDimension / 2 / correctionRatio, height / smallestDimension / 2 / correctionRatio));\n }\n return matrix;\n}\n\n/**\n * All these transformations we apply on the matrix to get it rescale the graph\n * as we want make it very hard to get pixel-perfect distances in WebGL. This\n * function returns a factor that properly cancels the matrix effect on lengths.\n *\n * [jacomyal]\n * To be fully honest, I can't really explain happens here... I notice that the\n * following ratio works (i.e. it correctly compensates the matrix impact on all\n * camera states I could try):\n * > `R = size(V) / size(M * V) / W`\n * as long as `M * V` is in the direction of W (ie. parallel to (Ox)). It works\n * as well with H and a vector that transforms into something parallel to (Oy).\n *\n * Also, note that we use `angle` and not `-angle` (that would seem logical,\n * since we want to anticipate the rotation), because the image is vertically\n * swapped in WebGL.\n */\nfunction getMatrixImpact(matrix, cameraState, viewportDimensions) {\n var _multiplyVec = multiplyVec2(matrix, {\n x: Math.cos(cameraState.angle),\n y: Math.sin(cameraState.angle)\n }, 0),\n x = _multiplyVec.x,\n y = _multiplyVec.y;\n return 1 / Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) / viewportDimensions.width;\n}\n\n/**\n * Function returning the graph's node extent in x & y.\n */\nfunction graphExtent(graph) {\n if (!graph.order) return {\n x: [0, 1],\n y: [0, 1]\n };\n var xMin = Infinity;\n var xMax = -Infinity;\n var yMin = Infinity;\n var yMax = -Infinity;\n graph.forEachNode(function (_, attr) {\n var x = attr.x,\n y = attr.y;\n if (x < xMin) xMin = x;\n if (x > xMax) xMax = x;\n if (y < yMin) yMin = y;\n if (y > yMax) yMax = y;\n });\n return {\n x: [xMin, xMax],\n y: [yMin, yMax]\n };\n}\n\n/**\n * Check if the graph variable is a valid graph, and if sigma can render it.\n */\nfunction validateGraph(graph) {\n // check if it's a valid graphology instance\n if (!isGraph(graph)) throw new Error(\"Sigma: invalid graph instance.\");\n\n // check if nodes have x/y attributes\n graph.forEachNode(function (key, attributes) {\n if (!Number.isFinite(attributes.x) || !Number.isFinite(attributes.y)) {\n throw new Error(\"Sigma: Coordinates of node \".concat(key, \" are invalid. A node must have a numeric 'x' and 'y' attribute.\"));\n }\n });\n}\n\n/**\n * Function used to create DOM elements easily.\n */\nfunction createElement(tag, style, attributes) {\n var element = document.createElement(tag);\n if (style) {\n for (var k in style) {\n element.style[k] = style[k];\n }\n }\n if (attributes) {\n for (var _k in attributes) {\n element.setAttribute(_k, attributes[_k]);\n }\n }\n return element;\n}\n\n/**\n * Function returning the browser's pixel ratio.\n */\nfunction getPixelRatio() {\n if (typeof window.devicePixelRatio !== \"undefined\") return window.devicePixelRatio;\n return 1;\n}\n\n/**\n * Function ordering the given elements in reverse z-order so they drawn\n * the correct way.\n */\nfunction zIndexOrdering(_extent, getter, elements) {\n // If k is > n, we'll use a standard sort\n return elements.sort(function (a, b) {\n var zA = getter(a) || 0,\n zB = getter(b) || 0;\n if (zA < zB) return -1;\n if (zA > zB) return 1;\n return 0;\n });\n\n // TODO: counting sort optimization\n}\n\n/**\n * Factory returning a function normalizing the given node's position & size.\n */\n\nfunction createNormalizationFunction(extent) {\n var _extent$x = _slicedToArray(extent.x, 2),\n minX = _extent$x[0],\n maxX = _extent$x[1],\n _extent$y = _slicedToArray(extent.y, 2),\n minY = _extent$y[0],\n maxY = _extent$y[1];\n var ratio = Math.max(maxX - minX, maxY - minY),\n dX = (maxX + minX) / 2,\n dY = (maxY + minY) / 2;\n if (ratio === 0 || Math.abs(ratio) === Infinity || isNaN(ratio)) ratio = 1;\n if (isNaN(dX)) dX = 0;\n if (isNaN(dY)) dY = 0;\n var fn = function fn(data) {\n return {\n x: 0.5 + (data.x - dX) / ratio,\n y: 0.5 + (data.y - dY) / ratio\n };\n };\n\n // TODO: possibility to apply this in batch over array of indices\n fn.applyTo = function (data) {\n data.x = 0.5 + (data.x - dX) / ratio;\n data.y = 0.5 + (data.y - dY) / ratio;\n };\n fn.inverse = function (data) {\n return {\n x: dX + ratio * (data.x - 0.5),\n y: dY + ratio * (data.y - 0.5)\n };\n };\n fn.ratio = ratio;\n return fn;\n}\n\nexport { ANIMATE_DEFAULTS as A, getMatrixImpact as a, createElement as b, createNormalizationFunction as c, getPixelRatio as d, easings as e, multiplyVec2 as f, graphExtent as g, animateNodes as h, identity as i, getCorrectionRatio as j, quadraticOut as k, linear as l, matrixFromCamera as m, quadraticInOut as n, cubicIn as o, cubicOut as p, quadraticIn as q, cubicInOut as r, scale as s, rotate as t, translate as u, validateGraph as v, multiply as w, zIndexOrdering as z };\n","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\n\n/**\n * Extends the target array with the given values.\n */\nfunction extend(array, values) {\n var l2 = values.size;\n if (l2 === 0) return;\n var l1 = array.length;\n array.length += l2;\n var i = 0;\n values.forEach(function (value) {\n array[l1 + i] = value;\n i++;\n });\n}\n\n/**\n * Checks whether the given value is a plain object.\n */\nfunction isPlainObject(value) {\n return _typeof(value) === \"object\" && value !== null && value.constructor === Object;\n}\n\n/**\n * Helper to use `Object.assign` with more than two objects.\n */\nfunction assign(target) {\n target = target || {};\n for (var i = 0, l = arguments.length <= 1 ? 0 : arguments.length - 1; i < l; i++) {\n var o = i + 1 < 1 || arguments.length <= i + 1 ? undefined : arguments[i + 1];\n if (!o) continue;\n Object.assign(target, o);\n }\n return target;\n}\n\n/**\n * Very simple recursive `Object.assign` like function.\n */\nfunction assignDeep(target) {\n target = target || {};\n for (var i = 0, l = arguments.length <= 1 ? 0 : arguments.length - 1; i < l; i++) {\n var o = i + 1 < 1 || arguments.length <= i + 1 ? undefined : arguments[i + 1];\n if (!o) continue;\n for (var k in o) {\n if (isPlainObject(o[k])) {\n target[k] = assignDeep(target[k], o[k]);\n } else {\n target[k] = o[k];\n }\n }\n }\n return target;\n}\n\nexport { _typeof as _, assign as a, assignDeep as b, extend as e, isPlainObject as i };\n","import { d as drawStraightEdgeLabel, b as drawDiscNodeLabel, c as drawDiscNodeHover, N as NodeCircleProgram, E as EdgeArrowProgram, e as EdgeRectangleProgram } from '../../dist/index-fad77a13.esm.js';\nimport { a as assign } from '../../dist/data-11df7124.esm.js';\nimport '../../dist/inherits-d1a1e29b.esm.js';\nimport '../../dist/colors-beb06eb2.esm.js';\n\n/**\n * Sigma.js Settings\n * =================================\n *\n * The list of settings and some handy functions.\n * @module\n */\n\n/**\n * Sigma.js settings\n * =================================\n */\n\nvar DEFAULT_SETTINGS = {\n // Performance\n hideEdgesOnMove: false,\n hideLabelsOnMove: false,\n renderLabels: true,\n renderEdgeLabels: false,\n enableEdgeEvents: false,\n // Component rendering\n defaultNodeColor: \"#999\",\n defaultNodeType: \"circle\",\n defaultEdgeColor: \"#ccc\",\n defaultEdgeType: \"line\",\n labelFont: \"Arial\",\n labelSize: 14,\n labelWeight: \"normal\",\n labelColor: {\n color: \"#000\"\n },\n edgeLabelFont: \"Arial\",\n edgeLabelSize: 14,\n edgeLabelWeight: \"normal\",\n edgeLabelColor: {\n attribute: \"color\"\n },\n stagePadding: 30,\n defaultDrawEdgeLabel: drawStraightEdgeLabel,\n defaultDrawNodeLabel: drawDiscNodeLabel,\n defaultDrawNodeHover: drawDiscNodeHover,\n minEdgeThickness: 1.7,\n antiAliasingFeather: 1,\n // Mouse and touch settings\n dragTimeout: 100,\n draggedEventsTolerance: 3,\n inertiaDuration: 200,\n inertiaRatio: 3,\n zoomDuration: 250,\n zoomingRatio: 1.7,\n doubleClickTimeout: 300,\n doubleClickZoomingRatio: 2.2,\n doubleClickZoomingDuration: 200,\n tapMoveTolerance: 10,\n // Size and scaling\n zoomToSizeRatioFunction: Math.sqrt,\n itemSizesReference: \"screen\",\n autoRescale: true,\n autoCenter: true,\n // Labels\n labelDensity: 1,\n labelGridCellSize: 100,\n labelRenderedSizeThreshold: 6,\n // Reducers\n nodeReducer: null,\n edgeReducer: null,\n // Features\n zIndex: false,\n minCameraRatio: null,\n maxCameraRatio: null,\n enableCameraZooming: true,\n enableCameraPanning: true,\n enableCameraRotation: true,\n cameraPanBoundaries: null,\n // Lifecycle\n allowInvalidContainer: false,\n // Program classes\n nodeProgramClasses: {},\n nodeHoverProgramClasses: {},\n edgeProgramClasses: {}\n};\nvar DEFAULT_NODE_PROGRAM_CLASSES = {\n circle: NodeCircleProgram\n};\nvar DEFAULT_EDGE_PROGRAM_CLASSES = {\n arrow: EdgeArrowProgram,\n line: EdgeRectangleProgram\n};\nfunction validateSettings(settings) {\n if (typeof settings.labelDensity !== \"number\" || settings.labelDensity < 0) {\n throw new Error(\"Settings: invalid `labelDensity`. Expecting a positive number.\");\n }\n var minCameraRatio = settings.minCameraRatio,\n maxCameraRatio = settings.maxCameraRatio;\n if (typeof minCameraRatio === \"number\" && typeof maxCameraRatio === \"number\" && maxCameraRatio < minCameraRatio) {\n throw new Error(\"Settings: invalid camera ratio boundaries. Expecting `maxCameraRatio` to be greater than `minCameraRatio`.\");\n }\n}\nfunction resolveSettings(settings) {\n var resolvedSettings = assign({}, DEFAULT_SETTINGS, settings);\n resolvedSettings.nodeProgramClasses = assign({}, DEFAULT_NODE_PROGRAM_CLASSES, resolvedSettings.nodeProgramClasses);\n resolvedSettings.edgeProgramClasses = assign({}, DEFAULT_EDGE_PROGRAM_CLASSES, resolvedSettings.edgeProgramClasses);\n return resolvedSettings;\n}\n\nexport { DEFAULT_EDGE_PROGRAM_CLASSES, DEFAULT_NODE_PROGRAM_CLASSES, DEFAULT_SETTINGS, resolveSettings, validateSettings };\n","import { _ as _objectSpread2, a as _defineProperty } from './index-fad77a13.esm.js';\nimport { _ as _inherits, a as _createClass, b as _classCallCheck, c as _callSuper, d as _toPropertyKey } from './inherits-d1a1e29b.esm.js';\nimport { TypedEventEmitter } from '../types/dist/sigma-types.esm.js';\nimport { A as ANIMATE_DEFAULTS, e as easings, g as graphExtent, c as createNormalizationFunction, m as matrixFromCamera, z as zIndexOrdering, a as getMatrixImpact, b as createElement, d as getPixelRatio, f as multiplyVec2, i as identity, v as validateGraph } from './normalization-be445518.esm.js';\nimport { DEFAULT_SETTINGS, validateSettings, resolveSettings } from '../settings/dist/sigma-settings.esm.js';\nimport { _ as _slicedToArray, a as _arrayLikeToArray, b as _unsupportedIterableToArray, g as getPixelColor, c as colorToIndex } from './colors-beb06eb2.esm.js';\nimport { _ as _typeof, e as extend } from './data-11df7124.esm.js';\nimport 'events';\nimport 'graphology-utils/is-graph';\n\n/**\n * Defaults.\n */\nvar DEFAULT_ZOOMING_RATIO = 1.5;\n\n/**\n * Event types.\n */\n/**\n * Camera class\n */\nvar Camera = /*#__PURE__*/function (_TypedEventEmitter) {\n function Camera() {\n var _this;\n _classCallCheck(this, Camera);\n _this = _callSuper(this, Camera);\n\n // State\n _defineProperty(_this, \"x\", 0.5);\n _defineProperty(_this, \"y\", 0.5);\n _defineProperty(_this, \"angle\", 0);\n _defineProperty(_this, \"ratio\", 1);\n _defineProperty(_this, \"minRatio\", null);\n _defineProperty(_this, \"maxRatio\", null);\n _defineProperty(_this, \"enabledZooming\", true);\n _defineProperty(_this, \"enabledPanning\", true);\n _defineProperty(_this, \"enabledRotation\", true);\n _defineProperty(_this, \"clean\", null);\n _defineProperty(_this, \"nextFrame\", null);\n _defineProperty(_this, \"previousState\", null);\n _defineProperty(_this, \"enabled\", true);\n _this.previousState = _this.getState();\n return _this;\n }\n\n /**\n * Static method used to create a Camera object with a given state.\n */\n _inherits(Camera, _TypedEventEmitter);\n return _createClass(Camera, [{\n key: \"enable\",\n value:\n /**\n * Method used to enable the camera.\n */\n function enable() {\n this.enabled = true;\n return this;\n }\n\n /**\n * Method used to disable the camera.\n */\n }, {\n key: \"disable\",\n value: function disable() {\n this.enabled = false;\n return this;\n }\n\n /**\n * Method used to retrieve the camera's current state.\n */\n }, {\n key: \"getState\",\n value: function getState() {\n return {\n x: this.x,\n y: this.y,\n angle: this.angle,\n ratio: this.ratio\n };\n }\n\n /**\n * Method used to check whether the camera has the given state.\n */\n }, {\n key: \"hasState\",\n value: function hasState(state) {\n return this.x === state.x && this.y === state.y && this.ratio === state.ratio && this.angle === state.angle;\n }\n\n /**\n * Method used to retrieve the camera's previous state.\n */\n }, {\n key: \"getPreviousState\",\n value: function getPreviousState() {\n var state = this.previousState;\n if (!state) return null;\n return {\n x: state.x,\n y: state.y,\n angle: state.angle,\n ratio: state.ratio\n };\n }\n\n /**\n * Method used to check minRatio and maxRatio values.\n */\n }, {\n key: \"getBoundedRatio\",\n value: function getBoundedRatio(ratio) {\n var r = ratio;\n if (typeof this.minRatio === \"number\") r = Math.max(r, this.minRatio);\n if (typeof this.maxRatio === \"number\") r = Math.min(r, this.maxRatio);\n return r;\n }\n\n /**\n * Method used to check various things to return a legit state candidate.\n */\n }, {\n key: \"validateState\",\n value: function validateState(state) {\n var validatedState = {};\n if (this.enabledPanning && typeof state.x === \"number\") validatedState.x = state.x;\n if (this.enabledPanning && typeof state.y === \"number\") validatedState.y = state.y;\n if (this.enabledZooming && typeof state.ratio === \"number\") validatedState.ratio = this.getBoundedRatio(state.ratio);\n if (this.enabledRotation && typeof state.angle === \"number\") validatedState.angle = state.angle;\n return this.clean ? this.clean(_objectSpread2(_objectSpread2({}, this.getState()), validatedState)) : validatedState;\n }\n\n /**\n * Method used to check whether the camera is currently being animated.\n */\n }, {\n key: \"isAnimated\",\n value: function isAnimated() {\n return !!this.nextFrame;\n }\n\n /**\n * Method used to set the camera's state.\n */\n }, {\n key: \"setState\",\n value: function setState(state) {\n if (!this.enabled) return this;\n\n // Keeping track of last state\n this.previousState = this.getState();\n var validState = this.validateState(state);\n if (typeof validState.x === \"number\") this.x = validState.x;\n if (typeof validState.y === \"number\") this.y = validState.y;\n if (typeof validState.ratio === \"number\") this.ratio = validState.ratio;\n if (typeof validState.angle === \"number\") this.angle = validState.angle;\n\n // Emitting\n if (!this.hasState(this.previousState)) this.emit(\"updated\", this.getState());\n return this;\n }\n\n /**\n * Method used to update the camera's state using a function.\n */\n }, {\n key: \"updateState\",\n value: function updateState(updater) {\n this.setState(updater(this.getState()));\n return this;\n }\n\n /**\n * Method used to animate the camera.\n */\n }, {\n key: \"animate\",\n value: function animate(state) {\n var _this2 = this;\n var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n if (!callback) return new Promise(function (resolve) {\n return _this2.animate(state, opts, resolve);\n });\n if (!this.enabled) return;\n var options = _objectSpread2(_objectSpread2({}, ANIMATE_DEFAULTS), opts);\n var validState = this.validateState(state);\n var easing = typeof options.easing === \"function\" ? options.easing : easings[options.easing];\n\n // State\n var start = Date.now(),\n initialState = this.getState();\n\n // Function performing the animation\n var _fn = function fn() {\n var t = (Date.now() - start) / options.duration;\n\n // The animation is over:\n if (t >= 1) {\n _this2.nextFrame = null;\n _this2.setState(validState);\n if (_this2.animationCallback) {\n _this2.animationCallback.call(null);\n _this2.animationCallback = undefined;\n }\n return;\n }\n var coefficient = easing(t);\n var newState = {};\n if (typeof validState.x === \"number\") newState.x = initialState.x + (validState.x - initialState.x) * coefficient;\n if (typeof validState.y === \"number\") newState.y = initialState.y + (validState.y - initialState.y) * coefficient;\n if (_this2.enabledRotation && typeof validState.angle === \"number\") newState.angle = initialState.angle + (validState.angle - initialState.angle) * coefficient;\n if (typeof validState.ratio === \"number\") newState.ratio = initialState.ratio + (validState.ratio - initialState.ratio) * coefficient;\n _this2.setState(newState);\n _this2.nextFrame = requestAnimationFrame(_fn);\n };\n if (this.nextFrame) {\n cancelAnimationFrame(this.nextFrame);\n if (this.animationCallback) this.animationCallback.call(null);\n this.nextFrame = requestAnimationFrame(_fn);\n } else {\n _fn();\n }\n this.animationCallback = callback;\n }\n\n /**\n * Method used to zoom the camera.\n */\n }, {\n key: \"animatedZoom\",\n value: function animatedZoom(factorOrOptions) {\n if (!factorOrOptions) return this.animate({\n ratio: this.ratio / DEFAULT_ZOOMING_RATIO\n });\n if (typeof factorOrOptions === \"number\") return this.animate({\n ratio: this.ratio / factorOrOptions\n });\n return this.animate({\n ratio: this.ratio / (factorOrOptions.factor || DEFAULT_ZOOMING_RATIO)\n }, factorOrOptions);\n }\n\n /**\n * Method used to unzoom the camera.\n */\n }, {\n key: \"animatedUnzoom\",\n value: function animatedUnzoom(factorOrOptions) {\n if (!factorOrOptions) return this.animate({\n ratio: this.ratio * DEFAULT_ZOOMING_RATIO\n });\n if (typeof factorOrOptions === \"number\") return this.animate({\n ratio: this.ratio * factorOrOptions\n });\n return this.animate({\n ratio: this.ratio * (factorOrOptions.factor || DEFAULT_ZOOMING_RATIO)\n }, factorOrOptions);\n }\n\n /**\n * Method used to reset the camera.\n */\n }, {\n key: \"animatedReset\",\n value: function animatedReset(options) {\n return this.animate({\n x: 0.5,\n y: 0.5,\n ratio: 1,\n angle: 0\n }, options);\n }\n\n /**\n * Returns a new Camera instance, with the same state as the current camera.\n */\n }, {\n key: \"copy\",\n value: function copy() {\n return Camera.from(this.getState());\n }\n }], [{\n key: \"from\",\n value: function from(state) {\n var camera = new Camera();\n return camera.setState(state);\n }\n }]);\n}(TypedEventEmitter);\n\n/**\n * Captor utils functions\n * ======================\n */\n\n/**\n * Extract the local X and Y coordinates from a mouse event or touch object. If\n * a DOM element is given, it uses this element's offset to compute the position\n * (this allows using events that are not bound to the container itself and\n * still have a proper position).\n *\n * @param {event} e - A mouse event or touch object.\n * @param {HTMLElement} dom - A DOM element to compute offset relatively to.\n * @return {number} The local Y value of the mouse.\n */\nfunction getPosition(e, dom) {\n var bbox = dom.getBoundingClientRect();\n return {\n x: e.clientX - bbox.left,\n y: e.clientY - bbox.top\n };\n}\n\n/**\n * Convert mouse coords to sigma coords.\n *\n * @param {event} e - A mouse event or touch object.\n * @param {HTMLElement} dom - A DOM element to compute offset relatively to.\n * @return {object}\n */\nfunction getMouseCoords(e, dom) {\n var res = _objectSpread2(_objectSpread2({}, getPosition(e, dom)), {}, {\n sigmaDefaultPrevented: false,\n preventSigmaDefault: function preventSigmaDefault() {\n res.sigmaDefaultPrevented = true;\n },\n original: e\n });\n return res;\n}\n\n/**\n * Takes a touch coords or a mouse coords, and always returns a clean mouse coords object.\n */\nfunction cleanMouseCoords(e) {\n var res = \"x\" in e ? e : _objectSpread2(_objectSpread2({}, e.touches[0] || e.previousTouches[0]), {}, {\n original: e.original,\n sigmaDefaultPrevented: e.sigmaDefaultPrevented,\n preventSigmaDefault: function preventSigmaDefault() {\n e.sigmaDefaultPrevented = true;\n res.sigmaDefaultPrevented = true;\n }\n });\n return res;\n}\n\n/**\n * Convert mouse wheel event coords to sigma coords.\n *\n * @param {event} e - A wheel mouse event.\n * @param {HTMLElement} dom - A DOM element to compute offset relatively to.\n * @return {object}\n */\nfunction getWheelCoords(e, dom) {\n return _objectSpread2(_objectSpread2({}, getMouseCoords(e, dom)), {}, {\n delta: getWheelDelta(e)\n });\n}\nvar MAX_TOUCHES = 2;\nfunction getTouchesArray(touches) {\n var arr = [];\n for (var i = 0, l = Math.min(touches.length, MAX_TOUCHES); i < l; i++) arr.push(touches[i]);\n return arr;\n}\n\n/**\n * Convert touch coords to sigma coords.\n *\n * @param {event} e - A touch event.\n * @param {Touch[]} previousTouches - An array of the previously stored touches.\n * @param {HTMLElement} dom - A DOM element to compute offset relatively to.\n * @return {object}\n */\nfunction getTouchCoords(e, previousTouches, dom) {\n var res = {\n touches: getTouchesArray(e.touches).map(function (touch) {\n return getPosition(touch, dom);\n }),\n previousTouches: previousTouches.map(function (touch) {\n return getPosition(touch, dom);\n }),\n sigmaDefaultPrevented: false,\n preventSigmaDefault: function preventSigmaDefault() {\n res.sigmaDefaultPrevented = true;\n },\n original: e\n };\n return res;\n}\n\n/**\n * Extract the wheel delta from a mouse event or touch object.\n *\n * @param {event} e - A mouse event or touch object.\n * @return {number} The wheel delta of the mouse.\n */\nfunction getWheelDelta(e) {\n // TODO: check those ratios again to ensure a clean Chrome/Firefox compat\n if (typeof e.deltaY !== \"undefined\") return e.deltaY * -3 / 360;\n if (typeof e.detail !== \"undefined\") return e.detail / -9;\n throw new Error(\"Captor: could not extract delta from event.\");\n}\n\n/**\n * Abstract class representing a captor like the user's mouse or touch controls.\n */\nvar Captor = /*#__PURE__*/function (_TypedEventEmitter) {\n function Captor(container, renderer) {\n var _this;\n _classCallCheck(this, Captor);\n _this = _callSuper(this, Captor);\n // Properties\n _this.container = container;\n _this.renderer = renderer;\n return _this;\n }\n _inherits(Captor, _TypedEventEmitter);\n return _createClass(Captor);\n}(TypedEventEmitter);\n\nvar MOUSE_SETTINGS_KEYS = [\"doubleClickTimeout\", \"doubleClickZoomingDuration\", \"doubleClickZoomingRatio\", \"dragTimeout\", \"draggedEventsTolerance\", \"inertiaDuration\", \"inertiaRatio\", \"zoomDuration\", \"zoomingRatio\"];\nvar DEFAULT_MOUSE_SETTINGS = MOUSE_SETTINGS_KEYS.reduce(function (iter, key) {\n return _objectSpread2(_objectSpread2({}, iter), {}, _defineProperty({}, key, DEFAULT_SETTINGS[key]));\n}, {});\n\n/**\n * Event types.\n */\n/**\n * Mouse captor class.\n *\n * @constructor\n */\nvar MouseCaptor = /*#__PURE__*/function (_Captor) {\n function MouseCaptor(container, renderer) {\n var _this;\n _classCallCheck(this, MouseCaptor);\n _this = _callSuper(this, MouseCaptor, [container, renderer]);\n\n // Binding methods\n // State\n _defineProperty(_this, \"enabled\", true);\n _defineProperty(_this, \"draggedEvents\", 0);\n _defineProperty(_this, \"downStartTime\", null);\n _defineProperty(_this, \"lastMouseX\", null);\n _defineProperty(_this, \"lastMouseY\", null);\n _defineProperty(_this, \"isMouseDown\", false);\n _defineProperty(_this, \"isMoving\", false);\n _defineProperty(_this, \"movingTimeout\", null);\n _defineProperty(_this, \"startCameraState\", null);\n _defineProperty(_this, \"clicks\", 0);\n _defineProperty(_this, \"doubleClickTimeout\", null);\n _defineProperty(_this, \"currentWheelDirection\", 0);\n _defineProperty(_this, \"settings\", DEFAULT_MOUSE_SETTINGS);\n _this.handleClick = _this.handleClick.bind(_this);\n _this.handleRightClick = _this.handleRightClick.bind(_this);\n _this.handleDown = _this.handleDown.bind(_this);\n _this.handleUp = _this.handleUp.bind(_this);\n _this.handleMove = _this.handleMove.bind(_this);\n _this.handleWheel = _this.handleWheel.bind(_this);\n _this.handleLeave = _this.handleLeave.bind(_this);\n _this.handleEnter = _this.handleEnter.bind(_this);\n\n // Binding events\n container.addEventListener(\"click\", _this.handleClick, {\n capture: false\n });\n container.addEventListener(\"contextmenu\", _this.handleRightClick, {\n capture: false\n });\n container.addEventListener(\"mousedown\", _this.handleDown, {\n capture: false\n });\n container.addEventListener(\"wheel\", _this.handleWheel, {\n capture: false\n });\n container.addEventListener(\"mouseleave\", _this.handleLeave, {\n capture: false\n });\n container.addEventListener(\"mouseenter\", _this.handleEnter, {\n capture: false\n });\n document.addEventListener(\"mousemove\", _this.handleMove, {\n capture: false\n });\n document.addEventListener(\"mouseup\", _this.handleUp, {\n capture: false\n });\n return _this;\n }\n _inherits(MouseCaptor, _Captor);\n return _createClass(MouseCaptor, [{\n key: \"kill\",\n value: function kill() {\n var container = this.container;\n container.removeEventListener(\"click\", this.handleClick);\n container.removeEventListener(\"contextmenu\", this.handleRightClick);\n container.removeEventListener(\"mousedown\", this.handleDown);\n container.removeEventListener(\"wheel\", this.handleWheel);\n container.removeEventListener(\"mouseleave\", this.handleLeave);\n container.removeEventListener(\"mouseenter\", this.handleEnter);\n document.removeEventListener(\"mousemove\", this.handleMove);\n document.removeEventListener(\"mouseup\", this.handleUp);\n }\n }, {\n key: \"handleClick\",\n value: function handleClick(e) {\n var _this2 = this;\n if (!this.enabled) return;\n this.clicks++;\n if (this.clicks === 2) {\n this.clicks = 0;\n if (typeof this.doubleClickTimeout === \"number\") {\n clearTimeout(this.doubleClickTimeout);\n this.doubleClickTimeout = null;\n }\n return this.handleDoubleClick(e);\n }\n setTimeout(function () {\n _this2.clicks = 0;\n _this2.doubleClickTimeout = null;\n }, this.settings.doubleClickTimeout);\n\n // NOTE: this is here to prevent click events on drag\n if (this.draggedEvents < this.settings.draggedEventsTolerance) this.emit(\"click\", getMouseCoords(e, this.container));\n }\n }, {\n key: \"handleRightClick\",\n value: function handleRightClick(e) {\n if (!this.enabled) return;\n this.emit(\"rightClick\", getMouseCoords(e, this.container));\n }\n }, {\n key: \"handleDoubleClick\",\n value: function handleDoubleClick(e) {\n if (!this.enabled) return;\n e.preventDefault();\n e.stopPropagation();\n var mouseCoords = getMouseCoords(e, this.container);\n this.emit(\"doubleClick\", mouseCoords);\n if (mouseCoords.sigmaDefaultPrevented) return;\n\n // default behavior\n var camera = this.renderer.getCamera();\n var newRatio = camera.getBoundedRatio(camera.getState().ratio / this.settings.doubleClickZoomingRatio);\n camera.animate(this.renderer.getViewportZoomedState(getPosition(e, this.container), newRatio), {\n easing: \"quadraticInOut\",\n duration: this.settings.doubleClickZoomingDuration\n });\n }\n }, {\n key: \"handleDown\",\n value: function handleDown(e) {\n if (!this.enabled) return;\n\n // We only start dragging on left button\n if (e.button === 0) {\n this.startCameraState = this.renderer.getCamera().getState();\n var _getPosition = getPosition(e, this.container),\n x = _getPosition.x,\n y = _getPosition.y;\n this.lastMouseX = x;\n this.lastMouseY = y;\n this.draggedEvents = 0;\n this.downStartTime = Date.now();\n this.isMouseDown = true;\n }\n this.emit(\"mousedown\", getMouseCoords(e, this.container));\n }\n }, {\n key: \"handleUp\",\n value: function handleUp(e) {\n var _this3 = this;\n if (!this.enabled || !this.isMouseDown) return;\n var camera = this.renderer.getCamera();\n this.isMouseDown = false;\n if (typeof this.movingTimeout === \"number\") {\n clearTimeout(this.movingTimeout);\n this.movingTimeout = null;\n }\n var _getPosition2 = getPosition(e, this.container),\n x = _getPosition2.x,\n y = _getPosition2.y;\n var cameraState = camera.getState(),\n previousCameraState = camera.getPreviousState() || {\n x: 0,\n y: 0\n };\n if (this.isMoving) {\n camera.animate({\n x: cameraState.x + this.settings.inertiaRatio * (cameraState.x - previousCameraState.x),\n y: cameraState.y + this.settings.inertiaRatio * (cameraState.y - previousCameraState.y)\n }, {\n duration: this.settings.inertiaDuration,\n easing: \"quadraticOut\"\n });\n } else if (this.lastMouseX !== x || this.lastMouseY !== y) {\n camera.setState({\n x: cameraState.x,\n y: cameraState.y\n });\n }\n this.isMoving = false;\n setTimeout(function () {\n var shouldRefresh = _this3.draggedEvents > 0;\n _this3.draggedEvents = 0;\n\n // NOTE: this refresh is here to make sure `hideEdgesOnMove` can work\n // when someone releases camera pan drag after having stopped moving.\n // See commit: https://github.com/jacomyal/sigma.js/commit/cfd9197f70319109db6b675dd7c82be493ca95a2\n // See also issue: https://github.com/jacomyal/sigma.js/issues/1290\n // It could be possible to render instead of scheduling a refresh but for\n // now it seems good enough.\n if (shouldRefresh && _this3.renderer.getSetting(\"hideEdgesOnMove\")) _this3.renderer.refresh();\n }, 0);\n this.emit(\"mouseup\", getMouseCoords(e, this.container));\n }\n }, {\n key: \"handleMove\",\n value: function handleMove(e) {\n var _this4 = this;\n if (!this.enabled) return;\n var mouseCoords = getMouseCoords(e, this.container);\n\n // Always trigger a \"mousemovebody\" event, so that it is possible to develop\n // a drag-and-drop effect that works even when the mouse is out of the\n // container:\n this.emit(\"mousemovebody\", mouseCoords);\n\n // Only trigger the \"mousemove\" event when the mouse is actually hovering\n // the container, to avoid weirdly hovering nodes and/or edges when the\n // mouse is not hover the container:\n if (e.target === this.container || e.composedPath()[0] === this.container) {\n this.emit(\"mousemove\", mouseCoords);\n }\n if (mouseCoords.sigmaDefaultPrevented) return;\n\n // Handle the case when \"isMouseDown\" all the time, to allow dragging the\n // stage while the mouse is not hover the container:\n if (this.isMouseDown) {\n this.isMoving = true;\n this.draggedEvents++;\n if (typeof this.movingTimeout === \"number\") {\n clearTimeout(this.movingTimeout);\n }\n this.movingTimeout = window.setTimeout(function () {\n _this4.movingTimeout = null;\n _this4.isMoving = false;\n }, this.settings.dragTimeout);\n var camera = this.renderer.getCamera();\n var _getPosition3 = getPosition(e, this.container),\n eX = _getPosition3.x,\n eY = _getPosition3.y;\n var lastMouse = this.renderer.viewportToFramedGraph({\n x: this.lastMouseX,\n y: this.lastMouseY\n });\n var mouse = this.renderer.viewportToFramedGraph({\n x: eX,\n y: eY\n });\n var offsetX = lastMouse.x - mouse.x,\n offsetY = lastMouse.y - mouse.y;\n var cameraState = camera.getState();\n var x = cameraState.x + offsetX,\n y = cameraState.y + offsetY;\n camera.setState({\n x: x,\n y: y\n });\n this.lastMouseX = eX;\n this.lastMouseY = eY;\n e.preventDefault();\n e.stopPropagation();\n }\n }\n }, {\n key: \"handleLeave\",\n value: function handleLeave(e) {\n this.emit(\"mouseleave\", getMouseCoords(e, this.container));\n }\n }, {\n key: \"handleEnter\",\n value: function handleEnter(e) {\n this.emit(\"mouseenter\", getMouseCoords(e, this.container));\n }\n }, {\n key: \"handleWheel\",\n value: function handleWheel(e) {\n var _this5 = this;\n var camera = this.renderer.getCamera();\n if (!this.enabled || !camera.enabledZooming) return;\n var delta = getWheelDelta(e);\n if (!delta) return;\n var wheelCoords = getWheelCoords(e, this.container);\n this.emit(\"wheel\", wheelCoords);\n if (wheelCoords.sigmaDefaultPrevented) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n // Default behavior\n var currentRatio = camera.getState().ratio;\n var ratioDiff = delta > 0 ? 1 / this.settings.zoomingRatio : this.settings.zoomingRatio;\n var newRatio = camera.getBoundedRatio(currentRatio * ratioDiff);\n var wheelDirection = delta > 0 ? 1 : -1;\n var now = Date.now();\n\n // Exit early without preventing default behavior when ratio doesn't change:\n if (currentRatio === newRatio) return;\n e.preventDefault();\n e.stopPropagation();\n\n // Cancel events that are too close each other and in the same direction:\n if (this.currentWheelDirection === wheelDirection && this.lastWheelTriggerTime && now - this.lastWheelTriggerTime < this.settings.zoomDuration / 5) {\n return;\n }\n camera.animate(this.renderer.getViewportZoomedState(getPosition(e, this.container), newRatio), {\n easing: \"quadraticOut\",\n duration: this.settings.zoomDuration\n }, function () {\n _this5.currentWheelDirection = 0;\n });\n this.currentWheelDirection = wheelDirection;\n this.lastWheelTriggerTime = now;\n }\n }, {\n key: \"setSettings\",\n value: function setSettings(settings) {\n this.settings = settings;\n }\n }]);\n}(Captor);\n\nvar TOUCH_SETTINGS_KEYS = [\"dragTimeout\", \"inertiaDuration\", \"inertiaRatio\", \"doubleClickTimeout\", \"doubleClickZoomingRatio\", \"doubleClickZoomingDuration\", \"tapMoveTolerance\"];\nvar DEFAULT_TOUCH_SETTINGS = TOUCH_SETTINGS_KEYS.reduce(function (iter, key) {\n return _objectSpread2(_objectSpread2({}, iter), {}, _defineProperty({}, key, DEFAULT_SETTINGS[key]));\n}, {});\n\n/**\n * Event types.\n */\n/**\n * Touch captor class.\n *\n * @constructor\n */\nvar TouchCaptor = /*#__PURE__*/function (_Captor) {\n function TouchCaptor(container, renderer) {\n var _this;\n _classCallCheck(this, TouchCaptor);\n _this = _callSuper(this, TouchCaptor, [container, renderer]);\n\n // Binding methods:\n _defineProperty(_this, \"enabled\", true);\n _defineProperty(_this, \"isMoving\", false);\n _defineProperty(_this, \"hasMoved\", false);\n _defineProperty(_this, \"touchMode\", 0);\n _defineProperty(_this, \"startTouchesPositions\", []);\n _defineProperty(_this, \"lastTouches\", []);\n _defineProperty(_this, \"lastTap\", null);\n _defineProperty(_this, \"settings\", DEFAULT_TOUCH_SETTINGS);\n _this.handleStart = _this.handleStart.bind(_this);\n _this.handleLeave = _this.handleLeave.bind(_this);\n _this.handleMove = _this.handleMove.bind(_this);\n\n // Binding events\n container.addEventListener(\"touchstart\", _this.handleStart, {\n capture: false\n });\n container.addEventListener(\"touchcancel\", _this.handleLeave, {\n capture: false\n });\n document.addEventListener(\"touchend\", _this.handleLeave, {\n capture: false,\n passive: false\n });\n document.addEventListener(\"touchmove\", _this.handleMove, {\n capture: false,\n passive: false\n });\n return _this;\n }\n _inherits(TouchCaptor, _Captor);\n return _createClass(TouchCaptor, [{\n key: \"kill\",\n value: function kill() {\n var container = this.container;\n container.removeEventListener(\"touchstart\", this.handleStart);\n container.removeEventListener(\"touchcancel\", this.handleLeave);\n document.removeEventListener(\"touchend\", this.handleLeave);\n document.removeEventListener(\"touchmove\", this.handleMove);\n }\n }, {\n key: \"getDimensions\",\n value: function getDimensions() {\n return {\n width: this.container.offsetWidth,\n height: this.container.offsetHeight\n };\n }\n }, {\n key: \"handleStart\",\n value: function handleStart(e) {\n var _this2 = this;\n if (!this.enabled) return;\n e.preventDefault();\n var touches = getTouchesArray(e.touches);\n this.touchMode = touches.length;\n this.startCameraState = this.renderer.getCamera().getState();\n this.startTouchesPositions = touches.map(function (touch) {\n return getPosition(touch, _this2.container);\n });\n\n // When there are two touches down, let's record distance and angle as well:\n if (this.touchMode === 2) {\n var _this$startTouchesPos = _slicedToArray(this.startTouchesPositions, 2),\n _this$startTouchesPos2 = _this$startTouchesPos[0],\n x0 = _this$startTouchesPos2.x,\n y0 = _this$startTouchesPos2.y,\n _this$startTouchesPos3 = _this$startTouchesPos[1],\n x1 = _this$startTouchesPos3.x,\n y1 = _this$startTouchesPos3.y;\n this.startTouchesAngle = Math.atan2(y1 - y0, x1 - x0);\n this.startTouchesDistance = Math.sqrt(Math.pow(x1 - x0, 2) + Math.pow(y1 - y0, 2));\n }\n this.emit(\"touchdown\", getTouchCoords(e, this.lastTouches, this.container));\n this.lastTouches = touches;\n this.lastTouchesPositions = this.startTouchesPositions;\n }\n }, {\n key: \"handleLeave\",\n value: function handleLeave(e) {\n if (!this.enabled || !this.startTouchesPositions.length) return;\n if (e.cancelable) e.preventDefault();\n if (this.movingTimeout) {\n this.isMoving = false;\n clearTimeout(this.movingTimeout);\n }\n switch (this.touchMode) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n case 2:\n if (e.touches.length === 1) {\n this.handleStart(e);\n e.preventDefault();\n break;\n }\n /* falls through */\n case 1:\n if (this.isMoving) {\n var camera = this.renderer.getCamera();\n var cameraState = camera.getState(),\n previousCameraState = camera.getPreviousState() || {\n x: 0,\n y: 0\n };\n camera.animate({\n x: cameraState.x + this.settings.inertiaRatio * (cameraState.x - previousCameraState.x),\n y: cameraState.y + this.settings.inertiaRatio * (cameraState.y - previousCameraState.y)\n }, {\n duration: this.settings.inertiaDuration,\n easing: \"quadraticOut\"\n });\n }\n this.hasMoved = false;\n this.isMoving = false;\n this.touchMode = 0;\n break;\n }\n this.emit(\"touchup\", getTouchCoords(e, this.lastTouches, this.container));\n\n // When the last touch ends and there hasn't been too much movement, trigger a \"tap\" or \"doubletap\" event:\n if (!e.touches.length) {\n var position = getPosition(this.lastTouches[0], this.container);\n var downPosition = this.startTouchesPositions[0];\n var dSquare = Math.pow(position.x - downPosition.x, 2) + Math.pow(position.y - downPosition.y, 2);\n if (!e.touches.length && dSquare < Math.pow(this.settings.tapMoveTolerance, 2)) {\n // Only trigger \"doubletap\" when the last tap is recent enough:\n if (this.lastTap && Date.now() - this.lastTap.time < this.settings.doubleClickTimeout) {\n var touchCoords = getTouchCoords(e, this.lastTouches, this.container);\n this.emit(\"doubletap\", touchCoords);\n this.lastTap = null;\n if (!touchCoords.sigmaDefaultPrevented) {\n var _camera = this.renderer.getCamera();\n var newRatio = _camera.getBoundedRatio(_camera.getState().ratio / this.settings.doubleClickZoomingRatio);\n _camera.animate(this.renderer.getViewportZoomedState(position, newRatio), {\n easing: \"quadraticInOut\",\n duration: this.settings.doubleClickZoomingDuration\n });\n }\n }\n // Else, trigger a normal \"tap\" event:\n else {\n var _touchCoords = getTouchCoords(e, this.lastTouches, this.container);\n this.emit(\"tap\", _touchCoords);\n this.lastTap = {\n time: Date.now(),\n position: _touchCoords.touches[0] || _touchCoords.previousTouches[0]\n };\n }\n }\n }\n this.lastTouches = getTouchesArray(e.touches);\n this.startTouchesPositions = [];\n }\n }, {\n key: \"handleMove\",\n value: function handleMove(e) {\n var _this3 = this;\n if (!this.enabled || !this.startTouchesPositions.length) return;\n e.preventDefault();\n var touches = getTouchesArray(e.touches);\n var touchesPositions = touches.map(function (touch) {\n return getPosition(touch, _this3.container);\n });\n var lastTouches = this.lastTouches;\n this.lastTouches = touches;\n this.lastTouchesPositions = touchesPositions;\n var touchCoords = getTouchCoords(e, lastTouches, this.container);\n this.emit(\"touchmove\", touchCoords);\n if (touchCoords.sigmaDefaultPrevented) return;\n\n // If a move was initiated at some point, and we get back to start point,\n // we should still consider that we did move (which also happens after a\n // multiple touch when only one touch remains in which case handleStart\n // is recalled within handleLeave).\n // Now, some mobile browsers report zero-distance moves so we also check that\n // one of the touches did actually move from the origin position.\n this.hasMoved || (this.hasMoved = touchesPositions.some(function (position, idx) {\n var startPosition = _this3.startTouchesPositions[idx];\n return startPosition && (position.x !== startPosition.x || position.y !== startPosition.y);\n }));\n\n // If there was no move, do not trigger touch moves behavior\n if (!this.hasMoved) {\n return;\n }\n this.isMoving = true;\n if (this.movingTimeout) clearTimeout(this.movingTimeout);\n this.movingTimeout = window.setTimeout(function () {\n _this3.isMoving = false;\n }, this.settings.dragTimeout);\n var camera = this.renderer.getCamera();\n var startCameraState = this.startCameraState;\n var padding = this.renderer.getSetting(\"stagePadding\");\n switch (this.touchMode) {\n case 1:\n {\n var _this$renderer$viewpo = this.renderer.viewportToFramedGraph((this.startTouchesPositions || [])[0]),\n xStart = _this$renderer$viewpo.x,\n yStart = _this$renderer$viewpo.y;\n var _this$renderer$viewpo2 = this.renderer.viewportToFramedGraph(touchesPositions[0]),\n x = _this$renderer$viewpo2.x,\n y = _this$renderer$viewpo2.y;\n camera.setState({\n x: startCameraState.x + xStart - x,\n y: startCameraState.y + yStart - y\n });\n break;\n }\n case 2:\n {\n /**\n * Here is the thinking here:\n *\n * 1. We can find the new angle and ratio, by comparing the vector from \"touch one\" to \"touch two\" at the start\n * of the d'n'd and now\n *\n * 2. We can use `Camera#viewportToGraph` inside formula to retrieve the new camera position, using the graph\n * position of a touch at the beginning of the d'n'd (using `startCamera.viewportToGraph`) and the viewport\n * position of this same touch now\n */\n var newCameraState = {\n x: 0.5,\n y: 0.5,\n angle: 0,\n ratio: 1\n };\n var _touchesPositions$ = touchesPositions[0],\n x0 = _touchesPositions$.x,\n y0 = _touchesPositions$.y;\n var _touchesPositions$2 = touchesPositions[1],\n x1 = _touchesPositions$2.x,\n y1 = _touchesPositions$2.y;\n var angleDiff = Math.atan2(y1 - y0, x1 - x0) - this.startTouchesAngle;\n var ratioDiff = Math.hypot(y1 - y0, x1 - x0) / this.startTouchesDistance;\n\n // 1.\n var newRatio = camera.getBoundedRatio(startCameraState.ratio / ratioDiff);\n newCameraState.ratio = newRatio;\n newCameraState.angle = startCameraState.angle + angleDiff;\n\n // 2.\n var dimensions = this.getDimensions();\n var touchGraphPosition = this.renderer.viewportToFramedGraph((this.startTouchesPositions || [])[0], {\n cameraState: startCameraState\n });\n var smallestDimension = Math.min(dimensions.width, dimensions.height) - 2 * padding;\n var dx = smallestDimension / dimensions.width;\n var dy = smallestDimension / dimensions.height;\n var ratio = newRatio / smallestDimension;\n\n // Align with center of the graph:\n var _x = x0 - smallestDimension / 2 / dx;\n var _y = y0 - smallestDimension / 2 / dy;\n\n // Rotate:\n var _ref = [_x * Math.cos(-newCameraState.angle) - _y * Math.sin(-newCameraState.angle), _y * Math.cos(-newCameraState.angle) + _x * Math.sin(-newCameraState.angle)];\n _x = _ref[0];\n _y = _ref[1];\n newCameraState.x = touchGraphPosition.x - _x * ratio;\n newCameraState.y = touchGraphPosition.y + _y * ratio;\n camera.setState(newCameraState);\n break;\n }\n }\n }\n }, {\n key: \"setSettings\",\n value: function setSettings(settings) {\n this.settings = settings;\n }\n }]);\n}(Captor);\n\nfunction _arrayWithoutHoles(r) {\n if (Array.isArray(r)) return _arrayLikeToArray(r);\n}\n\nfunction _iterableToArray(r) {\n if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r);\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nfunction _toConsumableArray(r) {\n return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();\n}\n\nfunction _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\n\nfunction _objectWithoutProperties(e, t) {\n if (null == e) return {};\n var o,\n r,\n i = _objectWithoutPropertiesLoose(e, t);\n if (Object.getOwnPropertySymbols) {\n var n = Object.getOwnPropertySymbols(e);\n for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]);\n }\n return i;\n}\n\n/**\n * Sigma.js Labels Heuristics\n * ===========================\n *\n * Miscellaneous heuristics related to label display.\n * @module\n */\n/**\n * Class representing a single candidate for the label grid selection.\n *\n * It also describes a deterministic way to compare two candidates to assess\n * which one is better.\n */\nvar LabelCandidate = /*#__PURE__*/function () {\n function LabelCandidate(key, size) {\n _classCallCheck(this, LabelCandidate);\n this.key = key;\n this.size = size;\n }\n return _createClass(LabelCandidate, null, [{\n key: \"compare\",\n value: function compare(first, second) {\n // First we compare by size\n if (first.size > second.size) return -1;\n if (first.size < second.size) return 1;\n\n // Then since no two nodes can have the same key, we use it to\n // deterministically tie-break by key\n if (first.key > second.key) return 1;\n\n // NOTE: this comparator cannot return 0\n return -1;\n }\n }]);\n}();\n/**\n * Class representing a 2D spatial grid divided into constant-size cells.\n */\nvar LabelGrid = /*#__PURE__*/function () {\n function LabelGrid() {\n _classCallCheck(this, LabelGrid);\n _defineProperty(this, \"width\", 0);\n _defineProperty(this, \"height\", 0);\n _defineProperty(this, \"cellSize\", 0);\n _defineProperty(this, \"columns\", 0);\n _defineProperty(this, \"rows\", 0);\n _defineProperty(this, \"cells\", {});\n }\n return _createClass(LabelGrid, [{\n key: \"resizeAndClear\",\n value: function resizeAndClear(dimensions, cellSize) {\n this.width = dimensions.width;\n this.height = dimensions.height;\n this.cellSize = cellSize;\n this.columns = Math.ceil(dimensions.width / cellSize);\n this.rows = Math.ceil(dimensions.height / cellSize);\n this.cells = {};\n }\n }, {\n key: \"getIndex\",\n value: function getIndex(pos) {\n var xIndex = Math.floor(pos.x / this.cellSize);\n var yIndex = Math.floor(pos.y / this.cellSize);\n return yIndex * this.columns + xIndex;\n }\n }, {\n key: \"add\",\n value: function add(key, size, pos) {\n var candidate = new LabelCandidate(key, size);\n var index = this.getIndex(pos);\n var cell = this.cells[index];\n if (!cell) {\n cell = [];\n this.cells[index] = cell;\n }\n cell.push(candidate);\n }\n }, {\n key: \"organize\",\n value: function organize() {\n for (var k in this.cells) {\n var cell = this.cells[k];\n cell.sort(LabelCandidate.compare);\n }\n }\n }, {\n key: \"getLabelsToDisplay\",\n value: function getLabelsToDisplay(ratio, density) {\n // TODO: work on visible nodes to optimize? ^ -> threshold outside so that memoization works?\n // TODO: adjust threshold lower, but increase cells a bit?\n // TODO: hunt for geom issue in disguise\n // TODO: memoize while ratio does not move. method to force recompute\n var cellArea = this.cellSize * this.cellSize;\n var scaledCellArea = cellArea / ratio / ratio;\n var scaledDensity = scaledCellArea * density / cellArea;\n var labelsToDisplayPerCell = Math.ceil(scaledDensity);\n var labels = [];\n for (var k in this.cells) {\n var cell = this.cells[k];\n for (var i = 0; i < Math.min(labelsToDisplayPerCell, cell.length); i++) {\n labels.push(cell[i].key);\n }\n }\n return labels;\n }\n }]);\n}();\n\n/**\n * Label heuristic selecting edge labels to display, based on displayed node\n * labels\n *\n * @param {object} params - Parameters:\n * @param {Set} displayedNodeLabels - Currently displayed node labels.\n * @param {Set} highlightedNodes - Highlighted nodes.\n * @param {Graph} graph - The rendered graph.\n * @param {string} hoveredNode - Hovered node (optional)\n * @return {Array} - The selected labels.\n */\nfunction edgeLabelsToDisplayFromNodes(params) {\n var graph = params.graph,\n hoveredNode = params.hoveredNode,\n highlightedNodes = params.highlightedNodes,\n displayedNodeLabels = params.displayedNodeLabels;\n var worthyEdges = [];\n\n // TODO: the code below can be optimized using #.forEach and batching the code per adj\n\n // We should display an edge's label if:\n // - Any of its extremities is highlighted or hovered\n // - Both of its extremities has its label shown\n graph.forEachEdge(function (edge, _, source, target) {\n if (source === hoveredNode || target === hoveredNode || highlightedNodes.has(source) || highlightedNodes.has(target) || displayedNodeLabels.has(source) && displayedNodeLabels.has(target)) {\n worthyEdges.push(edge);\n }\n });\n return worthyEdges;\n}\n\n/**\n * Constants.\n */\nvar X_LABEL_MARGIN = 150;\nvar Y_LABEL_MARGIN = 50;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/**\n * Important functions.\n */\nfunction applyNodeDefaults(settings, key, data) {\n if (!hasOwnProperty.call(data, \"x\") || !hasOwnProperty.call(data, \"y\")) throw new Error(\"Sigma: could not find a valid position (x, y) for node \\\"\".concat(key, \"\\\". All your nodes must have a number \\\"x\\\" and \\\"y\\\". Maybe your forgot to apply a layout or your \\\"nodeReducer\\\" is not returning the correct data?\"));\n if (!data.color) data.color = settings.defaultNodeColor;\n if (!data.label && data.label !== \"\") data.label = null;\n if (data.label !== undefined && data.label !== null) data.label = \"\" + data.label;else data.label = null;\n if (!data.size) data.size = 2;\n if (!hasOwnProperty.call(data, \"hidden\")) data.hidden = false;\n if (!hasOwnProperty.call(data, \"highlighted\")) data.highlighted = false;\n if (!hasOwnProperty.call(data, \"forceLabel\")) data.forceLabel = false;\n if (!data.type || data.type === \"\") data.type = settings.defaultNodeType;\n if (!data.zIndex) data.zIndex = 0;\n return data;\n}\nfunction applyEdgeDefaults(settings, _key, data) {\n if (!data.color) data.color = settings.defaultEdgeColor;\n if (!data.label) data.label = \"\";\n if (!data.size) data.size = 0.5;\n if (!hasOwnProperty.call(data, \"hidden\")) data.hidden = false;\n if (!hasOwnProperty.call(data, \"forceLabel\")) data.forceLabel = false;\n if (!data.type || data.type === \"\") data.type = settings.defaultEdgeType;\n if (!data.zIndex) data.zIndex = 0;\n return data;\n}\n\n/**\n * Main class.\n *\n * @constructor\n * @param {Graph} graph - Graph to render.\n * @param {HTMLElement} container - DOM container in which to render.\n * @param {object} settings - Optional settings.\n */\nvar Sigma$1 = /*#__PURE__*/function (_TypedEventEmitter) {\n function Sigma(graph, container) {\n var _this;\n var settings = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _classCallCheck(this, Sigma);\n _this = _callSuper(this, Sigma);\n\n // Resolving settings\n _defineProperty(_this, \"elements\", {});\n _defineProperty(_this, \"canvasContexts\", {});\n _defineProperty(_this, \"webGLContexts\", {});\n _defineProperty(_this, \"pickingLayers\", new Set());\n _defineProperty(_this, \"textures\", {});\n _defineProperty(_this, \"frameBuffers\", {});\n _defineProperty(_this, \"activeListeners\", {});\n _defineProperty(_this, \"labelGrid\", new LabelGrid());\n _defineProperty(_this, \"nodeDataCache\", {});\n _defineProperty(_this, \"edgeDataCache\", {});\n // Indices to keep track of the index of the item inside programs\n _defineProperty(_this, \"nodeProgramIndex\", {});\n _defineProperty(_this, \"edgeProgramIndex\", {});\n _defineProperty(_this, \"nodesWithForcedLabels\", new Set());\n _defineProperty(_this, \"edgesWithForcedLabels\", new Set());\n _defineProperty(_this, \"nodeExtent\", {\n x: [0, 1],\n y: [0, 1]\n });\n _defineProperty(_this, \"nodeZExtent\", [Infinity, -Infinity]);\n _defineProperty(_this, \"edgeZExtent\", [Infinity, -Infinity]);\n _defineProperty(_this, \"matrix\", identity());\n _defineProperty(_this, \"invMatrix\", identity());\n _defineProperty(_this, \"correctionRatio\", 1);\n _defineProperty(_this, \"customBBox\", null);\n _defineProperty(_this, \"normalizationFunction\", createNormalizationFunction({\n x: [0, 1],\n y: [0, 1]\n }));\n // Cache:\n _defineProperty(_this, \"graphToViewportRatio\", 1);\n _defineProperty(_this, \"itemIDsIndex\", {});\n _defineProperty(_this, \"nodeIndices\", {});\n _defineProperty(_this, \"edgeIndices\", {});\n // Starting dimensions and pixel ratio\n _defineProperty(_this, \"width\", 0);\n _defineProperty(_this, \"height\", 0);\n _defineProperty(_this, \"pixelRatio\", getPixelRatio());\n _defineProperty(_this, \"pickingDownSizingRatio\", 2 * _this.pixelRatio);\n // Graph State\n _defineProperty(_this, \"displayedNodeLabels\", new Set());\n _defineProperty(_this, \"displayedEdgeLabels\", new Set());\n _defineProperty(_this, \"highlightedNodes\", new Set());\n _defineProperty(_this, \"hoveredNode\", null);\n _defineProperty(_this, \"hoveredEdge\", null);\n // Internal states\n _defineProperty(_this, \"renderFrame\", null);\n _defineProperty(_this, \"renderHighlightedNodesFrame\", null);\n _defineProperty(_this, \"needToProcess\", false);\n _defineProperty(_this, \"checkEdgesEventsFrame\", null);\n // Programs\n _defineProperty(_this, \"nodePrograms\", {});\n _defineProperty(_this, \"nodeHoverPrograms\", {});\n _defineProperty(_this, \"edgePrograms\", {});\n _this.settings = resolveSettings(settings);\n\n // Validating\n validateSettings(_this.settings);\n validateGraph(graph);\n if (!(container instanceof HTMLElement)) throw new Error(\"Sigma: container should be an html element.\");\n\n // Properties\n _this.graph = graph;\n _this.container = container;\n\n // Initializing contexts\n _this.createWebGLContext(\"edges\", {\n picking: settings.enableEdgeEvents\n });\n _this.createCanvasContext(\"edgeLabels\");\n _this.createWebGLContext(\"nodes\", {\n picking: true\n });\n _this.createCanvasContext(\"labels\");\n _this.createCanvasContext(\"hovers\");\n _this.createWebGLContext(\"hoverNodes\");\n _this.createCanvasContext(\"mouse\", {\n style: {\n touchAction: \"none\",\n userSelect: \"none\"\n }\n });\n\n // Initial resize\n _this.resize();\n\n // Loading programs\n for (var type in _this.settings.nodeProgramClasses) {\n _this.registerNodeProgram(type, _this.settings.nodeProgramClasses[type], _this.settings.nodeHoverProgramClasses[type]);\n }\n for (var _type in _this.settings.edgeProgramClasses) {\n _this.registerEdgeProgram(_type, _this.settings.edgeProgramClasses[_type]);\n }\n\n // Initializing the camera\n _this.camera = new Camera();\n\n // Binding camera events\n _this.bindCameraHandlers();\n\n // Initializing captors\n _this.mouseCaptor = new MouseCaptor(_this.elements.mouse, _this);\n _this.mouseCaptor.setSettings(_this.settings);\n _this.touchCaptor = new TouchCaptor(_this.elements.mouse, _this);\n _this.touchCaptor.setSettings(_this.settings);\n\n // Binding event handlers\n _this.bindEventHandlers();\n\n // Binding graph handlers\n _this.bindGraphHandlers();\n\n // Trigger eventual settings-related things\n _this.handleSettingsUpdate();\n\n // Processing data for the first time & render\n _this.refresh();\n return _this;\n }\n\n /**---------------------------------------------------------------------------\n * Internal methods.\n **---------------------------------------------------------------------------\n */\n\n /**\n * Internal function used to register a node program\n *\n * @param {string} key - The program's key, matching the related nodes \"type\" values.\n * @param {NodeProgramType} NodeProgramClass - A nodes program class.\n * @param {NodeProgramType?} NodeHoverProgram - A nodes program class to render hovered nodes (optional).\n * @return {Sigma}\n */\n _inherits(Sigma, _TypedEventEmitter);\n return _createClass(Sigma, [{\n key: \"registerNodeProgram\",\n value: function registerNodeProgram(key, NodeProgramClass, NodeHoverProgram) {\n if (this.nodePrograms[key]) this.nodePrograms[key].kill();\n if (this.nodeHoverPrograms[key]) this.nodeHoverPrograms[key].kill();\n this.nodePrograms[key] = new NodeProgramClass(this.webGLContexts.nodes, this.frameBuffers.nodes, this);\n this.nodeHoverPrograms[key] = new (NodeHoverProgram || NodeProgramClass)(this.webGLContexts.hoverNodes, null, this);\n return this;\n }\n\n /**\n * Internal function used to register an edge program\n *\n * @param {string} key - The program's key, matching the related edges \"type\" values.\n * @param {EdgeProgramType} EdgeProgramClass - An edges program class.\n * @return {Sigma}\n */\n }, {\n key: \"registerEdgeProgram\",\n value: function registerEdgeProgram(key, EdgeProgramClass) {\n if (this.edgePrograms[key]) this.edgePrograms[key].kill();\n this.edgePrograms[key] = new EdgeProgramClass(this.webGLContexts.edges, this.frameBuffers.edges, this);\n return this;\n }\n\n /**\n * Internal function used to unregister a node program\n *\n * @param {string} key - The program's key, matching the related nodes \"type\" values.\n * @return {Sigma}\n */\n }, {\n key: \"unregisterNodeProgram\",\n value: function unregisterNodeProgram(key) {\n if (this.nodePrograms[key]) {\n var _this$nodePrograms = this.nodePrograms,\n program = _this$nodePrograms[key],\n programs = _objectWithoutProperties(_this$nodePrograms, [key].map(_toPropertyKey));\n program.kill();\n this.nodePrograms = programs;\n }\n if (this.nodeHoverPrograms[key]) {\n var _this$nodeHoverProgra = this.nodeHoverPrograms,\n _program = _this$nodeHoverProgra[key],\n _programs = _objectWithoutProperties(_this$nodeHoverProgra, [key].map(_toPropertyKey));\n _program.kill();\n this.nodePrograms = _programs;\n }\n return this;\n }\n\n /**\n * Internal function used to unregister an edge program\n *\n * @param {string} key - The program's key, matching the related edges \"type\" values.\n * @return {Sigma}\n */\n }, {\n key: \"unregisterEdgeProgram\",\n value: function unregisterEdgeProgram(key) {\n if (this.edgePrograms[key]) {\n var _this$edgePrograms = this.edgePrograms,\n program = _this$edgePrograms[key],\n programs = _objectWithoutProperties(_this$edgePrograms, [key].map(_toPropertyKey));\n program.kill();\n this.edgePrograms = programs;\n }\n return this;\n }\n\n /**\n * Method (re)binding WebGL texture (for picking).\n *\n * @return {Sigma}\n */\n }, {\n key: \"resetWebGLTexture\",\n value: function resetWebGLTexture(id) {\n var gl = this.webGLContexts[id];\n var frameBuffer = this.frameBuffers[id];\n var currentTexture = this.textures[id];\n if (currentTexture) gl.deleteTexture(currentTexture);\n var pickingTexture = gl.createTexture();\n gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);\n gl.bindTexture(gl.TEXTURE_2D, pickingTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, pickingTexture, 0);\n this.textures[id] = pickingTexture;\n return this;\n }\n\n /**\n * Method binding camera handlers.\n *\n * @return {Sigma}\n */\n }, {\n key: \"bindCameraHandlers\",\n value: function bindCameraHandlers() {\n var _this2 = this;\n this.activeListeners.camera = function () {\n _this2.scheduleRender();\n };\n this.camera.on(\"updated\", this.activeListeners.camera);\n return this;\n }\n\n /**\n * Method unbinding camera handlers.\n *\n * @return {Sigma}\n */\n }, {\n key: \"unbindCameraHandlers\",\n value: function unbindCameraHandlers() {\n this.camera.removeListener(\"updated\", this.activeListeners.camera);\n return this;\n }\n\n /**\n * Method that returns the closest node to a given position.\n */\n }, {\n key: \"getNodeAtPosition\",\n value: function getNodeAtPosition(position) {\n var x = position.x,\n y = position.y;\n var color = getPixelColor(this.webGLContexts.nodes, this.frameBuffers.nodes, x, y, this.pixelRatio, this.pickingDownSizingRatio);\n var index = colorToIndex.apply(void 0, _toConsumableArray(color));\n var itemAt = this.itemIDsIndex[index];\n return itemAt && itemAt.type === \"node\" ? itemAt.id : null;\n }\n\n /**\n * Method binding event handlers.\n *\n * @return {Sigma}\n */\n }, {\n key: \"bindEventHandlers\",\n value: function bindEventHandlers() {\n var _this3 = this;\n // Handling window resize\n this.activeListeners.handleResize = function () {\n // need to call a refresh to rebuild the labelgrid\n _this3.scheduleRefresh();\n };\n window.addEventListener(\"resize\", this.activeListeners.handleResize);\n\n // Handling mouse move\n this.activeListeners.handleMove = function (e) {\n var event = cleanMouseCoords(e);\n var baseEvent = {\n event: event,\n preventSigmaDefault: function preventSigmaDefault() {\n event.preventSigmaDefault();\n }\n };\n var nodeToHover = _this3.getNodeAtPosition(event);\n if (nodeToHover && _this3.hoveredNode !== nodeToHover && !_this3.nodeDataCache[nodeToHover].hidden) {\n // Handling passing from one node to the other directly\n if (_this3.hoveredNode) _this3.emit(\"leaveNode\", _objectSpread2(_objectSpread2({}, baseEvent), {}, {\n node: _this3.hoveredNode\n }));\n _this3.hoveredNode = nodeToHover;\n _this3.emit(\"enterNode\", _objectSpread2(_objectSpread2({}, baseEvent), {}, {\n node: nodeToHover\n }));\n _this3.scheduleHighlightedNodesRender();\n return;\n }\n\n // Checking if the hovered node is still hovered\n if (_this3.hoveredNode) {\n if (_this3.getNodeAtPosition(event) !== _this3.hoveredNode) {\n var node = _this3.hoveredNode;\n _this3.hoveredNode = null;\n _this3.emit(\"leaveNode\", _objectSpread2(_objectSpread2({}, baseEvent), {}, {\n node: node\n }));\n _this3.scheduleHighlightedNodesRender();\n return;\n }\n }\n if (_this3.settings.enableEdgeEvents) {\n var edgeToHover = _this3.hoveredNode ? null : _this3.getEdgeAtPoint(baseEvent.event.x, baseEvent.event.y);\n if (edgeToHover !== _this3.hoveredEdge) {\n if (_this3.hoveredEdge) _this3.emit(\"leaveEdge\", _objectSpread2(_objectSpread2({}, baseEvent), {}, {\n edge: _this3.hoveredEdge\n }));\n if (edgeToHover) _this3.emit(\"enterEdge\", _objectSpread2(_objectSpread2({}, baseEvent), {}, {\n edge: edgeToHover\n }));\n _this3.hoveredEdge = edgeToHover;\n }\n }\n };\n\n // Handling mouse move over body (only to dispatch the proper event):\n this.activeListeners.handleMoveBody = function (e) {\n var event = cleanMouseCoords(e);\n _this3.emit(\"moveBody\", {\n event: event,\n preventSigmaDefault: function preventSigmaDefault() {\n event.preventSigmaDefault();\n }\n });\n };\n\n // Handling mouse leave stage:\n this.activeListeners.handleLeave = function (e) {\n var event = cleanMouseCoords(e);\n var baseEvent = {\n event: event,\n preventSigmaDefault: function preventSigmaDefault() {\n event.preventSigmaDefault();\n }\n };\n if (_this3.hoveredNode) {\n _this3.emit(\"leaveNode\", _objectSpread2(_objectSpread2({}, baseEvent), {}, {\n node: _this3.hoveredNode\n }));\n _this3.scheduleHighlightedNodesRender();\n }\n if (_this3.settings.enableEdgeEvents && _this3.hoveredEdge) {\n _this3.emit(\"leaveEdge\", _objectSpread2(_objectSpread2({}, baseEvent), {}, {\n edge: _this3.hoveredEdge\n }));\n _this3.scheduleHighlightedNodesRender();\n }\n _this3.emit(\"leaveStage\", _objectSpread2({}, baseEvent));\n };\n\n // Handling mouse enter stage:\n this.activeListeners.handleEnter = function (e) {\n var event = cleanMouseCoords(e);\n var baseEvent = {\n event: event,\n preventSigmaDefault: function preventSigmaDefault() {\n event.preventSigmaDefault();\n }\n };\n _this3.emit(\"enterStage\", _objectSpread2({}, baseEvent));\n };\n\n // Handling click\n var createInteractionListener = function createInteractionListener(eventType) {\n return function (e) {\n var event = cleanMouseCoords(e);\n var baseEvent = {\n event: event,\n preventSigmaDefault: function preventSigmaDefault() {\n event.preventSigmaDefault();\n }\n };\n var nodeAtPosition = _this3.getNodeAtPosition(event);\n if (nodeAtPosition) return _this3.emit(\"\".concat(eventType, \"Node\"), _objectSpread2(_objectSpread2({}, baseEvent), {}, {\n node: nodeAtPosition\n }));\n if (_this3.settings.enableEdgeEvents) {\n var edge = _this3.getEdgeAtPoint(event.x, event.y);\n if (edge) return _this3.emit(\"\".concat(eventType, \"Edge\"), _objectSpread2(_objectSpread2({}, baseEvent), {}, {\n edge: edge\n }));\n }\n return _this3.emit(\"\".concat(eventType, \"Stage\"), baseEvent);\n };\n };\n this.activeListeners.handleClick = createInteractionListener(\"click\");\n this.activeListeners.handleRightClick = createInteractionListener(\"rightClick\");\n this.activeListeners.handleDoubleClick = createInteractionListener(\"doubleClick\");\n this.activeListeners.handleWheel = createInteractionListener(\"wheel\");\n this.activeListeners.handleDown = createInteractionListener(\"down\");\n this.activeListeners.handleUp = createInteractionListener(\"up\");\n this.mouseCaptor.on(\"mousemove\", this.activeListeners.handleMove);\n this.mouseCaptor.on(\"mousemovebody\", this.activeListeners.handleMoveBody);\n this.mouseCaptor.on(\"click\", this.activeListeners.handleClick);\n this.mouseCaptor.on(\"rightClick\", this.activeListeners.handleRightClick);\n this.mouseCaptor.on(\"doubleClick\", this.activeListeners.handleDoubleClick);\n this.mouseCaptor.on(\"wheel\", this.activeListeners.handleWheel);\n this.mouseCaptor.on(\"mousedown\", this.activeListeners.handleDown);\n this.mouseCaptor.on(\"mouseup\", this.activeListeners.handleUp);\n this.mouseCaptor.on(\"mouseleave\", this.activeListeners.handleLeave);\n this.mouseCaptor.on(\"mouseenter\", this.activeListeners.handleEnter);\n this.touchCaptor.on(\"touchdown\", this.activeListeners.handleDown);\n this.touchCaptor.on(\"touchdown\", this.activeListeners.handleMove);\n this.touchCaptor.on(\"touchup\", this.activeListeners.handleUp);\n this.touchCaptor.on(\"touchmove\", this.activeListeners.handleMove);\n this.touchCaptor.on(\"tap\", this.activeListeners.handleClick);\n this.touchCaptor.on(\"doubletap\", this.activeListeners.handleDoubleClick);\n this.touchCaptor.on(\"touchmove\", this.activeListeners.handleMoveBody);\n return this;\n }\n\n /**\n * Method binding graph handlers\n *\n * @return {Sigma}\n */\n }, {\n key: \"bindGraphHandlers\",\n value: function bindGraphHandlers() {\n var _this4 = this;\n var graph = this.graph;\n var LAYOUT_IMPACTING_FIELDS = new Set([\"x\", \"y\", \"zIndex\", \"type\"]);\n this.activeListeners.eachNodeAttributesUpdatedGraphUpdate = function (e) {\n var _e$hints;\n var updatedFields = (_e$hints = e.hints) === null || _e$hints === void 0 ? void 0 : _e$hints.attributes;\n // we process all nodes\n _this4.graph.forEachNode(function (node) {\n return _this4.updateNode(node);\n });\n\n // if coord, type or zIndex have changed, we need to schedule a render\n // (zIndex for the programIndex)\n var layoutChanged = !updatedFields || updatedFields.some(function (f) {\n return LAYOUT_IMPACTING_FIELDS.has(f);\n });\n _this4.refresh({\n partialGraph: {\n nodes: graph.nodes()\n },\n skipIndexation: !layoutChanged,\n schedule: true\n });\n };\n this.activeListeners.eachEdgeAttributesUpdatedGraphUpdate = function (e) {\n var _e$hints2;\n var updatedFields = (_e$hints2 = e.hints) === null || _e$hints2 === void 0 ? void 0 : _e$hints2.attributes;\n // we process all edges\n _this4.graph.forEachEdge(function (edge) {\n return _this4.updateEdge(edge);\n });\n var layoutChanged = updatedFields && [\"zIndex\", \"type\"].some(function (f) {\n return updatedFields === null || updatedFields === void 0 ? void 0 : updatedFields.includes(f);\n });\n _this4.refresh({\n partialGraph: {\n edges: graph.edges()\n },\n skipIndexation: !layoutChanged,\n schedule: true\n });\n };\n\n // On add node, we add the node in indices and then call for a render\n this.activeListeners.addNodeGraphUpdate = function (payload) {\n var node = payload.key;\n // we process the node\n _this4.addNode(node);\n // schedule a render for the node\n _this4.refresh({\n partialGraph: {\n nodes: [node]\n },\n skipIndexation: false,\n schedule: true\n });\n };\n\n // On update node, we update indices and then call for a render\n this.activeListeners.updateNodeGraphUpdate = function (payload) {\n var node = payload.key;\n // schedule a render for the node\n _this4.refresh({\n partialGraph: {\n nodes: [node]\n },\n skipIndexation: false,\n schedule: true\n });\n };\n\n // On drop node, we remove the node from indices and then call for a refresh\n this.activeListeners.dropNodeGraphUpdate = function (payload) {\n var node = payload.key;\n // we process the node\n _this4.removeNode(node);\n // schedule a render for everything\n _this4.refresh({\n schedule: true\n });\n };\n\n // On add edge, we remove the edge from indices and then call for a refresh\n this.activeListeners.addEdgeGraphUpdate = function (payload) {\n var edge = payload.key;\n // we process the edge\n _this4.addEdge(edge);\n // schedule a render for the edge\n _this4.refresh({\n partialGraph: {\n edges: [edge]\n },\n schedule: true\n });\n };\n\n // On update edge, we update indices and then call for a refresh\n this.activeListeners.updateEdgeGraphUpdate = function (payload) {\n var edge = payload.key;\n // schedule a repaint for the edge\n _this4.refresh({\n partialGraph: {\n edges: [edge]\n },\n skipIndexation: false,\n schedule: true\n });\n };\n\n // On drop edge, we remove the edge from indices and then call for a refresh\n this.activeListeners.dropEdgeGraphUpdate = function (payload) {\n var edge = payload.key;\n // we process the edge\n _this4.removeEdge(edge);\n // schedule a render for all edges\n _this4.refresh({\n schedule: true\n });\n };\n\n // On clear edges, we clear the edge indices and then call for a refresh\n this.activeListeners.clearEdgesGraphUpdate = function () {\n // we clear the edge data structures\n _this4.clearEdgeState();\n _this4.clearEdgeIndices();\n // schedule a render for all edges\n _this4.refresh({\n schedule: true\n });\n };\n\n // On graph clear, we clear indices and then call for a refresh\n this.activeListeners.clearGraphUpdate = function () {\n // clear graph state\n _this4.clearEdgeState();\n _this4.clearNodeState();\n\n // clear graph indices\n _this4.clearEdgeIndices();\n _this4.clearNodeIndices();\n\n // schedule a render for all\n _this4.refresh({\n schedule: true\n });\n };\n graph.on(\"nodeAdded\", this.activeListeners.addNodeGraphUpdate);\n graph.on(\"nodeDropped\", this.activeListeners.dropNodeGraphUpdate);\n graph.on(\"nodeAttributesUpdated\", this.activeListeners.updateNodeGraphUpdate);\n graph.on(\"eachNodeAttributesUpdated\", this.activeListeners.eachNodeAttributesUpdatedGraphUpdate);\n graph.on(\"edgeAdded\", this.activeListeners.addEdgeGraphUpdate);\n graph.on(\"edgeDropped\", this.activeListeners.dropEdgeGraphUpdate);\n graph.on(\"edgeAttributesUpdated\", this.activeListeners.updateEdgeGraphUpdate);\n graph.on(\"eachEdgeAttributesUpdated\", this.activeListeners.eachEdgeAttributesUpdatedGraphUpdate);\n graph.on(\"edgesCleared\", this.activeListeners.clearEdgesGraphUpdate);\n graph.on(\"cleared\", this.activeListeners.clearGraphUpdate);\n return this;\n }\n\n /**\n * Method used to unbind handlers from the graph.\n *\n * @return {undefined}\n */\n }, {\n key: \"unbindGraphHandlers\",\n value: function unbindGraphHandlers() {\n var graph = this.graph;\n graph.removeListener(\"nodeAdded\", this.activeListeners.addNodeGraphUpdate);\n graph.removeListener(\"nodeDropped\", this.activeListeners.dropNodeGraphUpdate);\n graph.removeListener(\"nodeAttributesUpdated\", this.activeListeners.updateNodeGraphUpdate);\n graph.removeListener(\"eachNodeAttributesUpdated\", this.activeListeners.eachNodeAttributesUpdatedGraphUpdate);\n graph.removeListener(\"edgeAdded\", this.activeListeners.addEdgeGraphUpdate);\n graph.removeListener(\"edgeDropped\", this.activeListeners.dropEdgeGraphUpdate);\n graph.removeListener(\"edgeAttributesUpdated\", this.activeListeners.updateEdgeGraphUpdate);\n graph.removeListener(\"eachEdgeAttributesUpdated\", this.activeListeners.eachEdgeAttributesUpdatedGraphUpdate);\n graph.removeListener(\"edgesCleared\", this.activeListeners.clearEdgesGraphUpdate);\n graph.removeListener(\"cleared\", this.activeListeners.clearGraphUpdate);\n }\n\n /**\n * Method looking for an edge colliding with a given point at (x, y). Returns\n * the key of the edge if any, or null else.\n */\n }, {\n key: \"getEdgeAtPoint\",\n value: function getEdgeAtPoint(x, y) {\n var color = getPixelColor(this.webGLContexts.edges, this.frameBuffers.edges, x, y, this.pixelRatio, this.pickingDownSizingRatio);\n var index = colorToIndex.apply(void 0, _toConsumableArray(color));\n var itemAt = this.itemIDsIndex[index];\n return itemAt && itemAt.type === \"edge\" ? itemAt.id : null;\n }\n\n /**\n * Method used to process the whole graph's data.\n * - extent\n * - normalizationFunction\n * - compute node's coordinate\n * - labelgrid\n * - program data allocation\n * @return {Sigma}\n */\n }, {\n key: \"process\",\n value: function process() {\n var _this5 = this;\n this.emit(\"beforeProcess\");\n var graph = this.graph;\n var settings = this.settings;\n var dimensions = this.getDimensions();\n\n //\n // NODES\n //\n this.nodeExtent = graphExtent(this.graph);\n if (!this.settings.autoRescale) {\n var width = dimensions.width,\n height = dimensions.height;\n var _this$nodeExtent = this.nodeExtent,\n x = _this$nodeExtent.x,\n y = _this$nodeExtent.y;\n this.nodeExtent = {\n x: [(x[0] + x[1]) / 2 - width / 2, (x[0] + x[1]) / 2 + width / 2],\n y: [(y[0] + y[1]) / 2 - height / 2, (y[0] + y[1]) / 2 + height / 2]\n };\n }\n this.normalizationFunction = createNormalizationFunction(this.customBBox || this.nodeExtent);\n\n // NOTE: it is important to compute this matrix after computing the node's extent\n // because #.getGraphDimensions relies on it\n var nullCamera = new Camera();\n var nullCameraMatrix = matrixFromCamera(nullCamera.getState(), dimensions, this.getGraphDimensions(), this.getStagePadding());\n // Resetting the label grid\n // TODO: it's probably better to do this explicitly or on resizes for layout and anims\n this.labelGrid.resizeAndClear(dimensions, settings.labelGridCellSize);\n var nodesPerPrograms = {};\n var nodeIndices = {};\n var edgeIndices = {};\n var itemIDsIndex = {};\n var incrID = 1;\n var nodes = graph.nodes();\n\n // Do some indexation on the whole graph\n for (var i = 0, l = nodes.length; i < l; i++) {\n var node = nodes[i];\n var data = this.nodeDataCache[node];\n\n // Get initial coordinates\n var attrs = graph.getNodeAttributes(node);\n data.x = attrs.x;\n data.y = attrs.y;\n this.normalizationFunction.applyTo(data);\n\n // labelgrid\n if (typeof data.label === \"string\" && !data.hidden) this.labelGrid.add(node, data.size, this.framedGraphToViewport(data, {\n matrix: nullCameraMatrix\n }));\n\n // update count per program\n nodesPerPrograms[data.type] = (nodesPerPrograms[data.type] || 0) + 1;\n }\n this.labelGrid.organize();\n\n // Allocate memory to programs\n for (var type in this.nodePrograms) {\n if (!hasOwnProperty.call(this.nodePrograms, type)) {\n throw new Error(\"Sigma: could not find a suitable program for node type \\\"\".concat(type, \"\\\"!\"));\n }\n this.nodePrograms[type].reallocate(nodesPerPrograms[type] || 0);\n // We reset that count here, so that we can reuse it while calling the Program#process methods:\n nodesPerPrograms[type] = 0;\n }\n\n // Order nodes by zIndex before to add them to program\n if (this.settings.zIndex && this.nodeZExtent[0] !== this.nodeZExtent[1]) nodes = zIndexOrdering(this.nodeZExtent, function (node) {\n return _this5.nodeDataCache[node].zIndex;\n }, nodes);\n\n // Add data to programs\n for (var _i = 0, _l = nodes.length; _i < _l; _i++) {\n var _node = nodes[_i];\n nodeIndices[_node] = incrID;\n itemIDsIndex[nodeIndices[_node]] = {\n type: \"node\",\n id: _node\n };\n incrID++;\n var _data = this.nodeDataCache[_node];\n this.addNodeToProgram(_node, nodeIndices[_node], nodesPerPrograms[_data.type]++);\n }\n\n //\n // EDGES\n //\n\n var edgesPerPrograms = {};\n var edges = graph.edges();\n\n // Allocate memory to programs\n for (var _i2 = 0, _l2 = edges.length; _i2 < _l2; _i2++) {\n var edge = edges[_i2];\n var _data2 = this.edgeDataCache[edge];\n edgesPerPrograms[_data2.type] = (edgesPerPrograms[_data2.type] || 0) + 1;\n }\n\n // Order edges by zIndex before to add them to program\n if (this.settings.zIndex && this.edgeZExtent[0] !== this.edgeZExtent[1]) edges = zIndexOrdering(this.edgeZExtent, function (edge) {\n return _this5.edgeDataCache[edge].zIndex;\n }, edges);\n for (var _type2 in this.edgePrograms) {\n if (!hasOwnProperty.call(this.edgePrograms, _type2)) {\n throw new Error(\"Sigma: could not find a suitable program for edge type \\\"\".concat(_type2, \"\\\"!\"));\n }\n this.edgePrograms[_type2].reallocate(edgesPerPrograms[_type2] || 0);\n // We reset that count here, so that we can reuse it while calling the Program#process methods:\n edgesPerPrograms[_type2] = 0;\n }\n\n // Add data to programs\n for (var _i3 = 0, _l3 = edges.length; _i3 < _l3; _i3++) {\n var _edge = edges[_i3];\n edgeIndices[_edge] = incrID;\n itemIDsIndex[edgeIndices[_edge]] = {\n type: \"edge\",\n id: _edge\n };\n incrID++;\n var _data3 = this.edgeDataCache[_edge];\n this.addEdgeToProgram(_edge, edgeIndices[_edge], edgesPerPrograms[_data3.type]++);\n }\n this.itemIDsIndex = itemIDsIndex;\n this.nodeIndices = nodeIndices;\n this.edgeIndices = edgeIndices;\n this.emit(\"afterProcess\");\n return this;\n }\n\n /**\n * Method that backports potential settings updates where it's needed.\n * @private\n */\n }, {\n key: \"handleSettingsUpdate\",\n value: function handleSettingsUpdate(oldSettings) {\n var _this6 = this;\n var settings = this.settings;\n this.camera.minRatio = settings.minCameraRatio;\n this.camera.maxRatio = settings.maxCameraRatio;\n this.camera.enabledZooming = settings.enableCameraZooming;\n this.camera.enabledPanning = settings.enableCameraPanning;\n this.camera.enabledRotation = settings.enableCameraRotation;\n if (settings.cameraPanBoundaries) {\n this.camera.clean = function (state) {\n return _this6.cleanCameraState(state, settings.cameraPanBoundaries && _typeof(settings.cameraPanBoundaries) === \"object\" ? settings.cameraPanBoundaries : {});\n };\n } else {\n this.camera.clean = null;\n }\n this.camera.setState(this.camera.validateState(this.camera.getState()));\n if (oldSettings) {\n // Check edge programs:\n if (oldSettings.edgeProgramClasses !== settings.edgeProgramClasses) {\n for (var type in settings.edgeProgramClasses) {\n if (settings.edgeProgramClasses[type] !== oldSettings.edgeProgramClasses[type]) {\n this.registerEdgeProgram(type, settings.edgeProgramClasses[type]);\n }\n }\n for (var _type3 in oldSettings.edgeProgramClasses) {\n if (!settings.edgeProgramClasses[_type3]) this.unregisterEdgeProgram(_type3);\n }\n }\n\n // Check node programs:\n if (oldSettings.nodeProgramClasses !== settings.nodeProgramClasses || oldSettings.nodeHoverProgramClasses !== settings.nodeHoverProgramClasses) {\n for (var _type4 in settings.nodeProgramClasses) {\n if (settings.nodeProgramClasses[_type4] !== oldSettings.nodeProgramClasses[_type4] || settings.nodeHoverProgramClasses[_type4] !== oldSettings.nodeHoverProgramClasses[_type4]) {\n this.registerNodeProgram(_type4, settings.nodeProgramClasses[_type4], settings.nodeHoverProgramClasses[_type4]);\n }\n }\n for (var _type5 in oldSettings.nodeProgramClasses) {\n if (!settings.nodeProgramClasses[_type5]) this.unregisterNodeProgram(_type5);\n }\n }\n }\n\n // Update captors settings:\n this.mouseCaptor.setSettings(this.settings);\n this.touchCaptor.setSettings(this.settings);\n return this;\n }\n }, {\n key: \"cleanCameraState\",\n value: function cleanCameraState(state) {\n var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n _ref$tolerance = _ref.tolerance,\n tolerance = _ref$tolerance === void 0 ? 0 : _ref$tolerance,\n boundaries = _ref.boundaries;\n var newState = _objectSpread2({}, state);\n\n // Extract necessary properties\n var _ref2 = boundaries || this.nodeExtent,\n _ref2$x = _slicedToArray(_ref2.x, 2),\n xMinGraph = _ref2$x[0],\n xMaxGraph = _ref2$x[1],\n _ref2$y = _slicedToArray(_ref2.y, 2),\n yMinGraph = _ref2$y[0],\n yMaxGraph = _ref2$y[1];\n\n // Transform the four corners of the graph rectangle using the provided camera state\n var corners = [this.graphToViewport({\n x: xMinGraph,\n y: yMinGraph\n }, {\n cameraState: state\n }), this.graphToViewport({\n x: xMaxGraph,\n y: yMinGraph\n }, {\n cameraState: state\n }), this.graphToViewport({\n x: xMinGraph,\n y: yMaxGraph\n }, {\n cameraState: state\n }), this.graphToViewport({\n x: xMaxGraph,\n y: yMaxGraph\n }, {\n cameraState: state\n })];\n\n // Look for new extents, based on these four corners\n var xMin = Infinity,\n xMax = -Infinity,\n yMin = Infinity,\n yMax = -Infinity;\n corners.forEach(function (_ref3) {\n var x = _ref3.x,\n y = _ref3.y;\n xMin = Math.min(xMin, x);\n xMax = Math.max(xMax, x);\n yMin = Math.min(yMin, y);\n yMax = Math.max(yMax, y);\n });\n\n // For each dimension, constraint the smaller element (camera or graph) to fit in the larger one:\n var graphWidth = xMax - xMin;\n var graphHeight = yMax - yMin;\n var _this$getDimensions = this.getDimensions(),\n width = _this$getDimensions.width,\n height = _this$getDimensions.height;\n var dx = 0;\n var dy = 0;\n if (graphWidth >= width) {\n if (xMax < width - tolerance) dx = xMax - (width - tolerance);else if (xMin > tolerance) dx = xMin - tolerance;\n } else {\n if (xMax > width + tolerance) dx = xMax - (width + tolerance);else if (xMin < -tolerance) dx = xMin + tolerance;\n }\n if (graphHeight >= height) {\n if (yMax < height - tolerance) dy = yMax - (height - tolerance);else if (yMin > tolerance) dy = yMin - tolerance;\n } else {\n if (yMax > height + tolerance) dy = yMax - (height + tolerance);else if (yMin < -tolerance) dy = yMin + tolerance;\n }\n if (dx || dy) {\n // Transform [dx, dy] from viewport to graph (using two different point to transform that vector):\n var origin = this.viewportToFramedGraph({\n x: 0,\n y: 0\n }, {\n cameraState: state\n });\n var delta = this.viewportToFramedGraph({\n x: dx,\n y: dy\n }, {\n cameraState: state\n });\n dx = delta.x - origin.x;\n dy = delta.y - origin.y;\n newState.x += dx;\n newState.y += dy;\n }\n return newState;\n }\n\n /**\n * Method used to render labels.\n *\n * @return {Sigma}\n */\n }, {\n key: \"renderLabels\",\n value: function renderLabels() {\n if (!this.settings.renderLabels) return this;\n var cameraState = this.camera.getState();\n\n // Selecting labels to draw\n var labelsToDisplay = this.labelGrid.getLabelsToDisplay(cameraState.ratio, this.settings.labelDensity);\n extend(labelsToDisplay, this.nodesWithForcedLabels);\n this.displayedNodeLabels = new Set();\n\n // Drawing labels\n var context = this.canvasContexts.labels;\n for (var i = 0, l = labelsToDisplay.length; i < l; i++) {\n var node = labelsToDisplay[i];\n var data = this.nodeDataCache[node];\n\n // If the node was already drawn (like if it is eligible AND has\n // `forceLabel`), we don't want to draw it again\n // NOTE: we can do better probably\n if (this.displayedNodeLabels.has(node)) continue;\n\n // If the node is hidden, we don't need to display its label obviously\n if (data.hidden) continue;\n var _this$framedGraphToVi = this.framedGraphToViewport(data),\n x = _this$framedGraphToVi.x,\n y = _this$framedGraphToVi.y;\n\n // NOTE: we can cache the labels we need to render until the camera's ratio changes\n var size = this.scaleSize(data.size);\n\n // Is node big enough?\n if (!data.forceLabel && size < this.settings.labelRenderedSizeThreshold) continue;\n\n // Is node actually on screen (with some margin)\n // NOTE: we used to rely on the quadtree for this, but the coordinates\n // conversion make it unreliable and at that point we already converted\n // to viewport coordinates and since the label grid already culls the\n // number of potential labels to display this looks like a good\n // performance compromise.\n // NOTE: labelGrid.getLabelsToDisplay could probably optimize by not\n // considering cells obviously outside of the range of the current\n // view rectangle.\n if (x < -X_LABEL_MARGIN || x > this.width + X_LABEL_MARGIN || y < -Y_LABEL_MARGIN || y > this.height + Y_LABEL_MARGIN) continue;\n\n // Because displayed edge labels depend directly on actually rendered node\n // labels, we need to only add to this.displayedNodeLabels nodes whose label\n // is rendered.\n // This makes this.displayedNodeLabels depend on viewport, which might become\n // an issue once we start memoizing getLabelsToDisplay.\n this.displayedNodeLabels.add(node);\n var defaultDrawNodeLabel = this.settings.defaultDrawNodeLabel;\n var nodeProgram = this.nodePrograms[data.type];\n var drawLabel = (nodeProgram === null || nodeProgram === void 0 ? void 0 : nodeProgram.drawLabel) || defaultDrawNodeLabel;\n drawLabel(context, _objectSpread2(_objectSpread2({\n key: node\n }, data), {}, {\n size: size,\n x: x,\n y: y\n }), this.settings);\n }\n return this;\n }\n\n /**\n * Method used to render edge labels, based on which node labels were\n * rendered.\n *\n * @return {Sigma}\n */\n }, {\n key: \"renderEdgeLabels\",\n value: function renderEdgeLabels() {\n if (!this.settings.renderEdgeLabels) return this;\n var context = this.canvasContexts.edgeLabels;\n\n // Clearing\n context.clearRect(0, 0, this.width, this.height);\n var edgeLabelsToDisplay = edgeLabelsToDisplayFromNodes({\n graph: this.graph,\n hoveredNode: this.hoveredNode,\n displayedNodeLabels: this.displayedNodeLabels,\n highlightedNodes: this.highlightedNodes\n });\n extend(edgeLabelsToDisplay, this.edgesWithForcedLabels);\n var displayedLabels = new Set();\n for (var i = 0, l = edgeLabelsToDisplay.length; i < l; i++) {\n var edge = edgeLabelsToDisplay[i],\n extremities = this.graph.extremities(edge),\n sourceData = this.nodeDataCache[extremities[0]],\n targetData = this.nodeDataCache[extremities[1]],\n edgeData = this.edgeDataCache[edge];\n\n // If the edge was already drawn (like if it is eligible AND has\n // `forceLabel`), we don't want to draw it again\n if (displayedLabels.has(edge)) continue;\n\n // If the edge is hidden we don't need to display its label\n // NOTE: the test on sourceData & targetData is probably paranoid at this point?\n if (edgeData.hidden || sourceData.hidden || targetData.hidden) {\n continue;\n }\n var defaultDrawEdgeLabel = this.settings.defaultDrawEdgeLabel;\n var edgeProgram = this.edgePrograms[edgeData.type];\n var drawLabel = (edgeProgram === null || edgeProgram === void 0 ? void 0 : edgeProgram.drawLabel) || defaultDrawEdgeLabel;\n drawLabel(context, _objectSpread2(_objectSpread2({\n key: edge\n }, edgeData), {}, {\n size: this.scaleSize(edgeData.size)\n }), _objectSpread2(_objectSpread2(_objectSpread2({\n key: extremities[0]\n }, sourceData), this.framedGraphToViewport(sourceData)), {}, {\n size: this.scaleSize(sourceData.size)\n }), _objectSpread2(_objectSpread2(_objectSpread2({\n key: extremities[1]\n }, targetData), this.framedGraphToViewport(targetData)), {}, {\n size: this.scaleSize(targetData.size)\n }), this.settings);\n displayedLabels.add(edge);\n }\n this.displayedEdgeLabels = displayedLabels;\n return this;\n }\n\n /**\n * Method used to render the highlighted nodes.\n *\n * @return {Sigma}\n */\n }, {\n key: \"renderHighlightedNodes\",\n value: function renderHighlightedNodes() {\n var _this7 = this;\n var context = this.canvasContexts.hovers;\n\n // Clearing\n context.clearRect(0, 0, this.width, this.height);\n\n // Rendering\n var render = function render(node) {\n var data = _this7.nodeDataCache[node];\n var _this7$framedGraphToV = _this7.framedGraphToViewport(data),\n x = _this7$framedGraphToV.x,\n y = _this7$framedGraphToV.y;\n var size = _this7.scaleSize(data.size);\n var defaultDrawNodeHover = _this7.settings.defaultDrawNodeHover;\n var nodeProgram = _this7.nodePrograms[data.type];\n var drawHover = (nodeProgram === null || nodeProgram === void 0 ? void 0 : nodeProgram.drawHover) || defaultDrawNodeHover;\n drawHover(context, _objectSpread2(_objectSpread2({\n key: node\n }, data), {}, {\n size: size,\n x: x,\n y: y\n }), _this7.settings);\n };\n var nodesToRender = [];\n if (this.hoveredNode && !this.nodeDataCache[this.hoveredNode].hidden) {\n nodesToRender.push(this.hoveredNode);\n }\n this.highlightedNodes.forEach(function (node) {\n // The hovered node has already been highlighted\n if (node !== _this7.hoveredNode) nodesToRender.push(node);\n });\n\n // Draw labels:\n nodesToRender.forEach(function (node) {\n return render(node);\n });\n\n // Draw WebGL nodes on top of the labels:\n var nodesPerPrograms = {};\n\n // 1. Count nodes per type:\n nodesToRender.forEach(function (node) {\n var type = _this7.nodeDataCache[node].type;\n nodesPerPrograms[type] = (nodesPerPrograms[type] || 0) + 1;\n });\n // 2. Allocate for each type for the proper number of nodes\n for (var type in this.nodeHoverPrograms) {\n this.nodeHoverPrograms[type].reallocate(nodesPerPrograms[type] || 0);\n // Also reset count, to use when rendering:\n nodesPerPrograms[type] = 0;\n }\n // 3. Process all nodes to render:\n nodesToRender.forEach(function (node) {\n var data = _this7.nodeDataCache[node];\n _this7.nodeHoverPrograms[data.type].process(0, nodesPerPrograms[data.type]++, data);\n });\n // 4. Clear hovered nodes layer:\n this.webGLContexts.hoverNodes.clear(this.webGLContexts.hoverNodes.COLOR_BUFFER_BIT);\n // 5. Render:\n var renderParams = this.getRenderParams();\n for (var _type6 in this.nodeHoverPrograms) {\n var program = this.nodeHoverPrograms[_type6];\n program.render(renderParams);\n }\n }\n\n /**\n * Method used to schedule a hover render.\n *\n */\n }, {\n key: \"scheduleHighlightedNodesRender\",\n value: function scheduleHighlightedNodesRender() {\n var _this8 = this;\n if (this.renderHighlightedNodesFrame || this.renderFrame) return;\n this.renderHighlightedNodesFrame = requestAnimationFrame(function () {\n // Resetting state\n _this8.renderHighlightedNodesFrame = null;\n\n // Rendering\n _this8.renderHighlightedNodes();\n _this8.renderEdgeLabels();\n });\n }\n\n /**\n * Method used to render.\n *\n * @return {Sigma}\n */\n }, {\n key: \"render\",\n value: function render() {\n var _this9 = this;\n this.emit(\"beforeRender\");\n var exitRender = function exitRender() {\n _this9.emit(\"afterRender\");\n return _this9;\n };\n\n // If a render was scheduled, we cancel it\n if (this.renderFrame) {\n cancelAnimationFrame(this.renderFrame);\n this.renderFrame = null;\n }\n\n // First we need to resize\n this.resize();\n\n // Do we need to reprocess data?\n if (this.needToProcess) this.process();\n this.needToProcess = false;\n\n // Clearing the canvases\n this.clear();\n\n // Prepare the textures\n this.pickingLayers.forEach(function (layer) {\n return _this9.resetWebGLTexture(layer);\n });\n\n // If we have no nodes we can stop right there\n if (!this.graph.order) return exitRender();\n\n // TODO: improve this heuristic or move to the captor itself?\n // TODO: deal with the touch captor here as well\n var mouseCaptor = this.mouseCaptor;\n var moving = this.camera.isAnimated() || mouseCaptor.isMoving || mouseCaptor.draggedEvents || mouseCaptor.currentWheelDirection;\n\n // Then we need to extract a matrix from the camera\n var cameraState = this.camera.getState();\n var viewportDimensions = this.getDimensions();\n var graphDimensions = this.getGraphDimensions();\n var padding = this.getStagePadding();\n this.matrix = matrixFromCamera(cameraState, viewportDimensions, graphDimensions, padding);\n this.invMatrix = matrixFromCamera(cameraState, viewportDimensions, graphDimensions, padding, true);\n this.correctionRatio = getMatrixImpact(this.matrix, cameraState, viewportDimensions);\n this.graphToViewportRatio = this.getGraphToViewportRatio();\n\n // [jacomyal]\n // This comment is related to the one above the `getMatrixImpact` definition:\n // - `this.correctionRatio` is somehow not completely explained\n // - `this.graphToViewportRatio` is the ratio of a distance in the viewport divided by the same distance in the\n // graph\n // - `this.normalizationFunction.ratio` is basically `Math.max(graphDX, graphDY)`\n // And now, I observe that if I multiply these three ratios, I have something constant, which value remains 2, even\n // when I change the graph, the viewport or the camera. It might be useful later, so I prefer to let this comment:\n // console.log(this.graphToViewportRatio * this.correctionRatio * this.normalizationFunction.ratio * 2);\n\n var params = this.getRenderParams();\n\n // Drawing nodes\n for (var type in this.nodePrograms) {\n var program = this.nodePrograms[type];\n program.render(params);\n }\n\n // Drawing edges\n if (!this.settings.hideEdgesOnMove || !moving) {\n for (var _type7 in this.edgePrograms) {\n var _program2 = this.edgePrograms[_type7];\n _program2.render(params);\n }\n }\n\n // Do not display labels on move per setting\n if (this.settings.hideLabelsOnMove && moving) return exitRender();\n this.renderLabels();\n this.renderEdgeLabels();\n this.renderHighlightedNodes();\n return exitRender();\n }\n\n /**\n * Add a node in the internal data structures.\n * @private\n * @param key The node's graphology ID\n */\n }, {\n key: \"addNode\",\n value: function addNode(key) {\n // Node display data resolution:\n // 1. First we get the node's attributes\n // 2. We optionally reduce them using the function provided by the user\n // Note that this function must return a total object and won't be merged\n // 3. We apply our defaults, while running some vital checks\n // 4. We apply the normalization function\n // We shallow copy node data to avoid dangerous behaviors from reducers\n var attr = Object.assign({}, this.graph.getNodeAttributes(key));\n if (this.settings.nodeReducer) attr = this.settings.nodeReducer(key, attr);\n var data = applyNodeDefaults(this.settings, key, attr);\n this.nodeDataCache[key] = data;\n\n // Label:\n // We delete and add if needed because this function is also used from\n // update\n this.nodesWithForcedLabels[\"delete\"](key);\n if (data.forceLabel && !data.hidden) this.nodesWithForcedLabels.add(key);\n\n // Highlighted:\n // We remove and re add if needed because this function is also used from\n // update\n this.highlightedNodes[\"delete\"](key);\n if (data.highlighted && !data.hidden) this.highlightedNodes.add(key);\n\n // zIndex\n if (this.settings.zIndex) {\n if (data.zIndex < this.nodeZExtent[0]) this.nodeZExtent[0] = data.zIndex;\n if (data.zIndex > this.nodeZExtent[1]) this.nodeZExtent[1] = data.zIndex;\n }\n }\n\n /**\n * Update a node the internal data structures.\n * @private\n * @param key The node's graphology ID\n */\n }, {\n key: \"updateNode\",\n value: function updateNode(key) {\n this.addNode(key);\n\n // Re-apply normalization on the node\n var data = this.nodeDataCache[key];\n this.normalizationFunction.applyTo(data);\n }\n\n /**\n * Remove a node from the internal data structures.\n * @private\n * @param key The node's graphology ID\n */\n }, {\n key: \"removeNode\",\n value: function removeNode(key) {\n // Remove from node cache\n delete this.nodeDataCache[key];\n // Remove from node program index\n delete this.nodeProgramIndex[key];\n // Remove from higlighted nodes\n this.highlightedNodes[\"delete\"](key);\n // Remove from hovered\n if (this.hoveredNode === key) this.hoveredNode = null;\n // Remove from forced label\n this.nodesWithForcedLabels[\"delete\"](key);\n }\n\n /**\n * Add an edge into the internal data structures.\n * @private\n * @param key The edge's graphology ID\n */\n }, {\n key: \"addEdge\",\n value: function addEdge(key) {\n // Edge display data resolution:\n // 1. First we get the edge's attributes\n // 2. We optionally reduce them using the function provided by the user\n // 3. Note that this function must return a total object and won't be merged\n // 4. We apply our defaults, while running some vital checks\n // We shallow copy edge data to avoid dangerous behaviors from reducers\n var attr = Object.assign({}, this.graph.getEdgeAttributes(key));\n if (this.settings.edgeReducer) attr = this.settings.edgeReducer(key, attr);\n var data = applyEdgeDefaults(this.settings, key, attr);\n this.edgeDataCache[key] = data;\n\n // Forced label\n // we filter and re push if needed because this function is also used from\n // update\n this.edgesWithForcedLabels[\"delete\"](key);\n if (data.forceLabel && !data.hidden) this.edgesWithForcedLabels.add(key);\n\n // Check zIndex\n if (this.settings.zIndex) {\n if (data.zIndex < this.edgeZExtent[0]) this.edgeZExtent[0] = data.zIndex;\n if (data.zIndex > this.edgeZExtent[1]) this.edgeZExtent[1] = data.zIndex;\n }\n }\n\n /**\n * Update an edge in the internal data structures.\n * @private\n * @param key The edge's graphology ID\n */\n }, {\n key: \"updateEdge\",\n value: function updateEdge(key) {\n this.addEdge(key);\n }\n\n /**\n * Remove an edge from the internal data structures.\n * @private\n * @param key The edge's graphology ID\n */\n }, {\n key: \"removeEdge\",\n value: function removeEdge(key) {\n // Remove from edge cache\n delete this.edgeDataCache[key];\n // Remove from programId index\n delete this.edgeProgramIndex[key];\n // Remove from hovered\n if (this.hoveredEdge === key) this.hoveredEdge = null;\n // Remove from forced label\n this.edgesWithForcedLabels[\"delete\"](key);\n }\n\n /**\n * Clear all indices related to nodes.\n * @private\n */\n }, {\n key: \"clearNodeIndices\",\n value: function clearNodeIndices() {\n // LabelGrid & nodeExtent are only manage/populated in the process function\n this.labelGrid = new LabelGrid();\n this.nodeExtent = {\n x: [0, 1],\n y: [0, 1]\n };\n this.nodeDataCache = {};\n this.edgeProgramIndex = {};\n this.nodesWithForcedLabels = new Set();\n this.nodeZExtent = [Infinity, -Infinity];\n this.highlightedNodes = new Set();\n }\n\n /**\n * Clear all indices related to edges.\n * @private\n */\n }, {\n key: \"clearEdgeIndices\",\n value: function clearEdgeIndices() {\n this.edgeDataCache = {};\n this.edgeProgramIndex = {};\n this.edgesWithForcedLabels = new Set();\n this.edgeZExtent = [Infinity, -Infinity];\n }\n\n /**\n * Clear all indices.\n * @private\n */\n }, {\n key: \"clearIndices\",\n value: function clearIndices() {\n this.clearEdgeIndices();\n this.clearNodeIndices();\n }\n\n /**\n * Clear all graph state related to nodes.\n * @private\n */\n }, {\n key: \"clearNodeState\",\n value: function clearNodeState() {\n this.displayedNodeLabels = new Set();\n this.highlightedNodes = new Set();\n this.hoveredNode = null;\n }\n\n /**\n * Clear all graph state related to edges.\n * @private\n */\n }, {\n key: \"clearEdgeState\",\n value: function clearEdgeState() {\n this.displayedEdgeLabels = new Set();\n this.highlightedNodes = new Set();\n this.hoveredEdge = null;\n }\n\n /**\n * Clear all graph state.\n * @private\n */\n }, {\n key: \"clearState\",\n value: function clearState() {\n this.clearEdgeState();\n this.clearNodeState();\n }\n\n /**\n * Add the node data to its program.\n * @private\n * @param node The node's graphology ID\n * @param fingerprint A fingerprint used to identity the node with picking\n * @param position The index where to place the node in the program\n */\n }, {\n key: \"addNodeToProgram\",\n value: function addNodeToProgram(node, fingerprint, position) {\n var data = this.nodeDataCache[node];\n var nodeProgram = this.nodePrograms[data.type];\n if (!nodeProgram) throw new Error(\"Sigma: could not find a suitable program for node type \\\"\".concat(data.type, \"\\\"!\"));\n nodeProgram.process(fingerprint, position, data);\n // Saving program index\n this.nodeProgramIndex[node] = position;\n }\n\n /**\n * Add the edge data to its program.\n * @private\n * @param edge The edge's graphology ID\n * @param fingerprint A fingerprint used to identity the edge with picking\n * @param position The index where to place the edge in the program\n */\n }, {\n key: \"addEdgeToProgram\",\n value: function addEdgeToProgram(edge, fingerprint, position) {\n var data = this.edgeDataCache[edge];\n var edgeProgram = this.edgePrograms[data.type];\n if (!edgeProgram) throw new Error(\"Sigma: could not find a suitable program for edge type \\\"\".concat(data.type, \"\\\"!\"));\n var extremities = this.graph.extremities(edge),\n sourceData = this.nodeDataCache[extremities[0]],\n targetData = this.nodeDataCache[extremities[1]];\n edgeProgram.process(fingerprint, position, sourceData, targetData, data);\n // Saving program index\n this.edgeProgramIndex[edge] = position;\n }\n\n /**---------------------------------------------------------------------------\n * Public API.\n **---------------------------------------------------------------------------\n */\n\n /**\n * Function used to get the render params.\n *\n * @return {RenderParams}\n */\n }, {\n key: \"getRenderParams\",\n value: function getRenderParams() {\n return {\n matrix: this.matrix,\n invMatrix: this.invMatrix,\n width: this.width,\n height: this.height,\n pixelRatio: this.pixelRatio,\n zoomRatio: this.camera.ratio,\n cameraAngle: this.camera.angle,\n sizeRatio: 1 / this.scaleSize(),\n correctionRatio: this.correctionRatio,\n downSizingRatio: this.pickingDownSizingRatio,\n minEdgeThickness: this.settings.minEdgeThickness,\n antiAliasingFeather: this.settings.antiAliasingFeather\n };\n }\n\n /**\n * Function used to retrieve the actual stage padding value.\n *\n * @return {number}\n */\n }, {\n key: \"getStagePadding\",\n value: function getStagePadding() {\n var _this$settings = this.settings,\n stagePadding = _this$settings.stagePadding,\n autoRescale = _this$settings.autoRescale;\n return autoRescale ? stagePadding || 0 : 0;\n }\n\n /**\n * Function used to create a layer element.\n *\n * @param {string} id - Context's id.\n * @param {string} tag - The HTML tag to use.\n * @param options\n * @return {Sigma}\n */\n }, {\n key: \"createLayer\",\n value: function createLayer(id, tag) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n if (this.elements[id]) throw new Error(\"Sigma: a layer named \\\"\".concat(id, \"\\\" already exists\"));\n var element = createElement(tag, {\n position: \"absolute\"\n }, {\n \"class\": \"sigma-\".concat(id)\n });\n if (options.style) Object.assign(element.style, options.style);\n this.elements[id] = element;\n if (\"beforeLayer\" in options && options.beforeLayer) {\n this.elements[options.beforeLayer].before(element);\n } else if (\"afterLayer\" in options && options.afterLayer) {\n this.elements[options.afterLayer].after(element);\n } else {\n this.container.appendChild(element);\n }\n return element;\n }\n\n /**\n * Function used to create a canvas element.\n *\n * @param {string} id - Context's id.\n * @param options\n * @return {Sigma}\n */\n }, {\n key: \"createCanvas\",\n value: function createCanvas(id) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return this.createLayer(id, \"canvas\", options);\n }\n\n /**\n * Function used to create a canvas context and add the relevant DOM elements.\n *\n * @param {string} id - Context's id.\n * @param options\n * @return {Sigma}\n */\n }, {\n key: \"createCanvasContext\",\n value: function createCanvasContext(id) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var canvas = this.createCanvas(id, options);\n var contextOptions = {\n preserveDrawingBuffer: false,\n antialias: false\n };\n this.canvasContexts[id] = canvas.getContext(\"2d\", contextOptions);\n return this;\n }\n\n /**\n * Function used to create a WebGL context and add the relevant DOM\n * elements.\n *\n * @param {string} id - Context's id.\n * @param {object?} options - #getContext params to override (optional)\n * @return {WebGLRenderingContext}\n */\n }, {\n key: \"createWebGLContext\",\n value: function createWebGLContext(id) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var canvas = (options === null || options === void 0 ? void 0 : options.canvas) || this.createCanvas(id, options);\n if (options.hidden) canvas.remove();\n var contextOptions = _objectSpread2({\n preserveDrawingBuffer: false,\n antialias: false\n }, options);\n var context;\n\n // First we try webgl2 for an easy performance boost\n context = canvas.getContext(\"webgl2\", contextOptions);\n\n // Else we fall back to webgl\n if (!context) context = canvas.getContext(\"webgl\", contextOptions);\n\n // Edge, I am looking right at you...\n if (!context) context = canvas.getContext(\"experimental-webgl\", contextOptions);\n var gl = context;\n this.webGLContexts[id] = gl;\n\n // Blending:\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n\n // Prepare frame buffer for picking layers:\n if (options.picking) {\n this.pickingLayers.add(id);\n var newFrameBuffer = gl.createFramebuffer();\n if (!newFrameBuffer) throw new Error(\"Sigma: cannot create a new frame buffer for layer \".concat(id));\n this.frameBuffers[id] = newFrameBuffer;\n }\n return gl;\n }\n\n /**\n * Function used to properly kill a layer.\n *\n * @param {string} id - Layer id.\n * @return {Sigma}\n */\n }, {\n key: \"killLayer\",\n value: function killLayer(id) {\n var element = this.elements[id];\n if (!element) throw new Error(\"Sigma: cannot kill layer \".concat(id, \", which does not exist\"));\n if (this.webGLContexts[id]) {\n var _gl$getExtension;\n var gl = this.webGLContexts[id];\n (_gl$getExtension = gl.getExtension(\"WEBGL_lose_context\")) === null || _gl$getExtension === void 0 || _gl$getExtension.loseContext();\n delete this.webGLContexts[id];\n } else if (this.canvasContexts[id]) {\n delete this.canvasContexts[id];\n }\n\n // Delete layer element\n element.remove();\n delete this.elements[id];\n return this;\n }\n\n /**\n * Method returning the renderer's camera.\n *\n * @return {Camera}\n */\n }, {\n key: \"getCamera\",\n value: function getCamera() {\n return this.camera;\n }\n\n /**\n * Method setting the renderer's camera.\n *\n * @param {Camera} camera - New camera.\n * @return {Sigma}\n */\n }, {\n key: \"setCamera\",\n value: function setCamera(camera) {\n this.unbindCameraHandlers();\n this.camera = camera;\n this.bindCameraHandlers();\n }\n\n /**\n * Method returning the container DOM element.\n *\n * @return {HTMLElement}\n */\n }, {\n key: \"getContainer\",\n value: function getContainer() {\n return this.container;\n }\n\n /**\n * Method returning the renderer's graph.\n *\n * @return {Graph}\n */\n }, {\n key: \"getGraph\",\n value: function getGraph() {\n return this.graph;\n }\n\n /**\n * Method used to set the renderer's graph.\n *\n * @return {Graph}\n */\n }, {\n key: \"setGraph\",\n value: function setGraph(graph) {\n if (graph === this.graph) return;\n\n // Check hoveredNode and hoveredEdge\n if (this.hoveredNode && !graph.hasNode(this.hoveredNode)) this.hoveredNode = null;\n if (this.hoveredEdge && !graph.hasEdge(this.hoveredEdge)) this.hoveredEdge = null;\n\n // Unbinding handlers on the current graph\n this.unbindGraphHandlers();\n if (this.checkEdgesEventsFrame !== null) {\n cancelAnimationFrame(this.checkEdgesEventsFrame);\n this.checkEdgesEventsFrame = null;\n }\n\n // Installing new graph\n this.graph = graph;\n\n // Binding new handlers\n this.bindGraphHandlers();\n\n // Re-rendering now to avoid discrepancies from now to next frame\n this.refresh();\n }\n\n /**\n * Method returning the mouse captor.\n *\n * @return {MouseCaptor}\n */\n }, {\n key: \"getMouseCaptor\",\n value: function getMouseCaptor() {\n return this.mouseCaptor;\n }\n\n /**\n * Method returning the touch captor.\n *\n * @return {TouchCaptor}\n */\n }, {\n key: \"getTouchCaptor\",\n value: function getTouchCaptor() {\n return this.touchCaptor;\n }\n\n /**\n * Method returning the current renderer's dimensions.\n *\n * @return {Dimensions}\n */\n }, {\n key: \"getDimensions\",\n value: function getDimensions() {\n return {\n width: this.width,\n height: this.height\n };\n }\n\n /**\n * Method returning the current graph's dimensions.\n *\n * @return {Dimensions}\n */\n }, {\n key: \"getGraphDimensions\",\n value: function getGraphDimensions() {\n var extent = this.customBBox || this.nodeExtent;\n return {\n width: extent.x[1] - extent.x[0] || 1,\n height: extent.y[1] - extent.y[0] || 1\n };\n }\n\n /**\n * Method used to get all the sigma node attributes.\n * It's useful for example to get the position of a node\n * and to get values that are set by the nodeReducer\n *\n * @param {string} key - The node's key.\n * @return {NodeDisplayData | undefined} A copy of the desired node's attribute or undefined if not found\n */\n }, {\n key: \"getNodeDisplayData\",\n value: function getNodeDisplayData(key) {\n var node = this.nodeDataCache[key];\n return node ? Object.assign({}, node) : undefined;\n }\n\n /**\n * Method used to get all the sigma edge attributes.\n * It's useful for example to get values that are set by the edgeReducer.\n *\n * @param {string} key - The edge's key.\n * @return {EdgeDisplayData | undefined} A copy of the desired edge's attribute or undefined if not found\n */\n }, {\n key: \"getEdgeDisplayData\",\n value: function getEdgeDisplayData(key) {\n var edge = this.edgeDataCache[key];\n return edge ? Object.assign({}, edge) : undefined;\n }\n\n /**\n * Method used to get the set of currently displayed node labels.\n *\n * @return {Set<string>} A set of node keys whose label is displayed.\n */\n }, {\n key: \"getNodeDisplayedLabels\",\n value: function getNodeDisplayedLabels() {\n return new Set(this.displayedNodeLabels);\n }\n\n /**\n * Method used to get the set of currently displayed edge labels.\n *\n * @return {Set<string>} A set of edge keys whose label is displayed.\n */\n }, {\n key: \"getEdgeDisplayedLabels\",\n value: function getEdgeDisplayedLabels() {\n return new Set(this.displayedEdgeLabels);\n }\n\n /**\n * Method returning a copy of the settings collection.\n *\n * @return {Settings} A copy of the settings collection.\n */\n }, {\n key: \"getSettings\",\n value: function getSettings() {\n return _objectSpread2({}, this.settings);\n }\n\n /**\n * Method returning the current value for a given setting key.\n *\n * @param {string} key - The setting key to get.\n * @return {any} The value attached to this setting key or undefined if not found\n */\n }, {\n key: \"getSetting\",\n value: function getSetting(key) {\n return this.settings[key];\n }\n\n /**\n * Method setting the value of a given setting key. Note that this will schedule\n * a new render next frame.\n *\n * @param {string} key - The setting key to set.\n * @param {any} value - The value to set.\n * @return {Sigma}\n */\n }, {\n key: \"setSetting\",\n value: function setSetting(key, value) {\n var oldValues = _objectSpread2({}, this.settings);\n this.settings[key] = value;\n validateSettings(this.settings);\n this.handleSettingsUpdate(oldValues);\n this.scheduleRefresh();\n return this;\n }\n\n /**\n * Method updating the value of a given setting key using the provided function.\n * Note that this will schedule a new render next frame.\n *\n * @param {string} key - The setting key to set.\n * @param {function} updater - The update function.\n * @return {Sigma}\n */\n }, {\n key: \"updateSetting\",\n value: function updateSetting(key, updater) {\n this.setSetting(key, updater(this.settings[key]));\n return this;\n }\n\n /**\n * Method setting multiple settings at once.\n *\n * @param {Partial<Settings>} settings - The settings to set.\n * @return {Sigma}\n */\n }, {\n key: \"setSettings\",\n value: function setSettings(settings) {\n var oldValues = _objectSpread2({}, this.settings);\n this.settings = _objectSpread2(_objectSpread2({}, this.settings), settings);\n validateSettings(this.settings);\n this.handleSettingsUpdate(oldValues);\n this.scheduleRefresh();\n return this;\n }\n\n /**\n * Method used to resize the renderer.\n *\n * @param {boolean} force - If true, then resize is processed even if size is unchanged (optional).\n * @return {Sigma}\n */\n }, {\n key: \"resize\",\n value: function resize(force) {\n var previousWidth = this.width,\n previousHeight = this.height;\n this.width = this.container.offsetWidth;\n this.height = this.container.offsetHeight;\n this.pixelRatio = getPixelRatio();\n if (this.width === 0) {\n if (this.settings.allowInvalidContainer) this.width = 1;else throw new Error(\"Sigma: Container has no width. You can set the allowInvalidContainer setting to true to stop seeing this error.\");\n }\n if (this.height === 0) {\n if (this.settings.allowInvalidContainer) this.height = 1;else throw new Error(\"Sigma: Container has no height. You can set the allowInvalidContainer setting to true to stop seeing this error.\");\n }\n\n // If nothing has changed, we can stop right here\n if (!force && previousWidth === this.width && previousHeight === this.height) return this;\n\n // Sizing dom elements\n for (var id in this.elements) {\n var element = this.elements[id];\n element.style.width = this.width + \"px\";\n element.style.height = this.height + \"px\";\n }\n\n // Sizing canvas contexts\n for (var _id in this.canvasContexts) {\n this.elements[_id].setAttribute(\"width\", this.width * this.pixelRatio + \"px\");\n this.elements[_id].setAttribute(\"height\", this.height * this.pixelRatio + \"px\");\n if (this.pixelRatio !== 1) this.canvasContexts[_id].scale(this.pixelRatio, this.pixelRatio);\n }\n\n // Sizing WebGL contexts\n for (var _id2 in this.webGLContexts) {\n this.elements[_id2].setAttribute(\"width\", this.width * this.pixelRatio + \"px\");\n this.elements[_id2].setAttribute(\"height\", this.height * this.pixelRatio + \"px\");\n var gl = this.webGLContexts[_id2];\n gl.viewport(0, 0, this.width * this.pixelRatio, this.height * this.pixelRatio);\n\n // Clear picking texture if needed\n if (this.pickingLayers.has(_id2)) {\n var currentTexture = this.textures[_id2];\n if (currentTexture) gl.deleteTexture(currentTexture);\n }\n }\n this.emit(\"resize\");\n return this;\n }\n\n /**\n * Method used to clear all the canvases.\n *\n * @return {Sigma}\n */\n }, {\n key: \"clear\",\n value: function clear() {\n this.emit(\"beforeClear\");\n this.webGLContexts.nodes.bindFramebuffer(WebGLRenderingContext.FRAMEBUFFER, null);\n this.webGLContexts.nodes.clear(WebGLRenderingContext.COLOR_BUFFER_BIT);\n this.webGLContexts.edges.bindFramebuffer(WebGLRenderingContext.FRAMEBUFFER, null);\n this.webGLContexts.edges.clear(WebGLRenderingContext.COLOR_BUFFER_BIT);\n this.webGLContexts.hoverNodes.clear(WebGLRenderingContext.COLOR_BUFFER_BIT);\n this.canvasContexts.labels.clearRect(0, 0, this.width, this.height);\n this.canvasContexts.hovers.clearRect(0, 0, this.width, this.height);\n this.canvasContexts.edgeLabels.clearRect(0, 0, this.width, this.height);\n this.emit(\"afterClear\");\n return this;\n }\n\n /**\n * Method used to refresh, i.e. force the renderer to reprocess graph\n * data and render, but keep the state.\n * - if a partialGraph is provided, we only reprocess those nodes & edges.\n * - if schedule is TRUE, we schedule a render instead of sync render\n * - if skipIndexation is TRUE, then labelGrid & program indexation are skipped (can be used if you haven't modify x, y, zIndex & size)\n *\n * @return {Sigma}\n */\n }, {\n key: \"refresh\",\n value: function refresh(opts) {\n var _this10 = this;\n var skipIndexation = (opts === null || opts === void 0 ? void 0 : opts.skipIndexation) !== undefined ? opts === null || opts === void 0 ? void 0 : opts.skipIndexation : false;\n var schedule = (opts === null || opts === void 0 ? void 0 : opts.schedule) !== undefined ? opts.schedule : false;\n var fullRefresh = !opts || !opts.partialGraph;\n if (fullRefresh) {\n // Re-index graph data\n this.clearEdgeIndices();\n this.clearNodeIndices();\n this.graph.forEachNode(function (node) {\n return _this10.addNode(node);\n });\n this.graph.forEachEdge(function (edge) {\n return _this10.addEdge(edge);\n });\n } else {\n var _opts$partialGraph, _opts$partialGraph2;\n var nodes = ((_opts$partialGraph = opts.partialGraph) === null || _opts$partialGraph === void 0 ? void 0 : _opts$partialGraph.nodes) || [];\n for (var i = 0, l = (nodes === null || nodes === void 0 ? void 0 : nodes.length) || 0; i < l; i++) {\n var node = nodes[i];\n // Recompute node's data (ie. apply reducer)\n this.updateNode(node);\n // Add node to the program if layout is unchanged.\n // otherwise it will be done in the process function\n if (skipIndexation) {\n var programIndex = this.nodeProgramIndex[node];\n if (programIndex === undefined) throw new Error(\"Sigma: node \\\"\".concat(node, \"\\\" can't be repaint\"));\n this.addNodeToProgram(node, this.nodeIndices[node], programIndex);\n }\n }\n var edges = (opts === null || opts === void 0 || (_opts$partialGraph2 = opts.partialGraph) === null || _opts$partialGraph2 === void 0 ? void 0 : _opts$partialGraph2.edges) || [];\n for (var _i4 = 0, _l4 = edges.length; _i4 < _l4; _i4++) {\n var edge = edges[_i4];\n // Recompute edge's data (ie. apply reducer)\n this.updateEdge(edge);\n // Add edge to the program\n // otherwise it will be done in the process function\n if (skipIndexation) {\n var _programIndex = this.edgeProgramIndex[edge];\n if (_programIndex === undefined) throw new Error(\"Sigma: edge \\\"\".concat(edge, \"\\\" can't be repaint\"));\n this.addEdgeToProgram(edge, this.edgeIndices[edge], _programIndex);\n }\n }\n }\n\n // Do we need to call the process function ?\n if (fullRefresh || !skipIndexation) this.needToProcess = true;\n if (schedule) this.scheduleRender();else this.render();\n return this;\n }\n\n /**\n * Method used to schedule a render at the next available frame.\n * This method can be safely called on a same frame because it basically\n * debounces refresh to the next frame.\n *\n * @return {Sigma}\n */\n }, {\n key: \"scheduleRender\",\n value: function scheduleRender() {\n var _this11 = this;\n if (!this.renderFrame) {\n this.renderFrame = requestAnimationFrame(function () {\n _this11.render();\n });\n }\n return this;\n }\n\n /**\n * Method used to schedule a refresh (i.e. fully reprocess graph data and render)\n * at the next available frame.\n * This method can be safely called on a same frame because it basically\n * debounces refresh to the next frame.\n *\n * @return {Sigma}\n */\n }, {\n key: \"scheduleRefresh\",\n value: function scheduleRefresh(opts) {\n return this.refresh(_objectSpread2(_objectSpread2({}, opts), {}, {\n schedule: true\n }));\n }\n\n /**\n * Method used to (un)zoom, while preserving the position of a viewport point.\n * Used for instance to zoom \"on the mouse cursor\".\n *\n * @param viewportTarget\n * @param newRatio\n * @return {CameraState}\n */\n }, {\n key: \"getViewportZoomedState\",\n value: function getViewportZoomedState(viewportTarget, newRatio) {\n var _this$camera$getState = this.camera.getState(),\n ratio = _this$camera$getState.ratio,\n angle = _this$camera$getState.angle,\n x = _this$camera$getState.x,\n y = _this$camera$getState.y;\n var _this$settings2 = this.settings,\n minCameraRatio = _this$settings2.minCameraRatio,\n maxCameraRatio = _this$settings2.maxCameraRatio;\n if (typeof maxCameraRatio === \"number\") newRatio = Math.min(newRatio, maxCameraRatio);\n if (typeof minCameraRatio === \"number\") newRatio = Math.max(newRatio, minCameraRatio);\n var ratioDiff = newRatio / ratio;\n var center = {\n x: this.width / 2,\n y: this.height / 2\n };\n var graphMousePosition = this.viewportToFramedGraph(viewportTarget);\n var graphCenterPosition = this.viewportToFramedGraph(center);\n return {\n angle: angle,\n x: (graphMousePosition.x - graphCenterPosition.x) * (1 - ratioDiff) + x,\n y: (graphMousePosition.y - graphCenterPosition.y) * (1 - ratioDiff) + y,\n ratio: newRatio\n };\n }\n\n /**\n * Method returning the abstract rectangle containing the graph according\n * to the camera's state.\n *\n * @return {object} - The view's rectangle.\n */\n }, {\n key: \"viewRectangle\",\n value: function viewRectangle() {\n var p1 = this.viewportToFramedGraph({\n x: 0,\n y: 0\n }),\n p2 = this.viewportToFramedGraph({\n x: this.width,\n y: 0\n }),\n h = this.viewportToFramedGraph({\n x: 0,\n y: this.height\n });\n return {\n x1: p1.x,\n y1: p1.y,\n x2: p2.x,\n y2: p2.y,\n height: p2.y - h.y\n };\n }\n\n /**\n * Method returning the coordinates of a point from the framed graph system to the viewport system. It allows\n * overriding anything that is used to get the translation matrix, or even the matrix itself.\n *\n * Be careful if overriding dimensions, padding or cameraState, as the computation of the matrix is not the lightest\n * of computations.\n */\n }, {\n key: \"framedGraphToViewport\",\n value: function framedGraphToViewport(coordinates) {\n var override = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var recomputeMatrix = !!override.cameraState || !!override.viewportDimensions || !!override.graphDimensions;\n var matrix = override.matrix ? override.matrix : recomputeMatrix ? matrixFromCamera(override.cameraState || this.camera.getState(), override.viewportDimensions || this.getDimensions(), override.graphDimensions || this.getGraphDimensions(), override.padding || this.getStagePadding()) : this.matrix;\n var viewportPos = multiplyVec2(matrix, coordinates);\n return {\n x: (1 + viewportPos.x) * this.width / 2,\n y: (1 - viewportPos.y) * this.height / 2\n };\n }\n\n /**\n * Method returning the coordinates of a point from the viewport system to the framed graph system. It allows\n * overriding anything that is used to get the translation matrix, or even the matrix itself.\n *\n * Be careful if overriding dimensions, padding or cameraState, as the computation of the matrix is not the lightest\n * of computations.\n */\n }, {\n key: \"viewportToFramedGraph\",\n value: function viewportToFramedGraph(coordinates) {\n var override = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var recomputeMatrix = !!override.cameraState || !!override.viewportDimensions || !override.graphDimensions;\n var invMatrix = override.matrix ? override.matrix : recomputeMatrix ? matrixFromCamera(override.cameraState || this.camera.getState(), override.viewportDimensions || this.getDimensions(), override.graphDimensions || this.getGraphDimensions(), override.padding || this.getStagePadding(), true) : this.invMatrix;\n var res = multiplyVec2(invMatrix, {\n x: coordinates.x / this.width * 2 - 1,\n y: 1 - coordinates.y / this.height * 2\n });\n if (isNaN(res.x)) res.x = 0;\n if (isNaN(res.y)) res.y = 0;\n return res;\n }\n\n /**\n * Method used to translate a point's coordinates from the viewport system (pixel distance from the top-left of the\n * stage) to the graph system (the reference system of data as they are in the given graph instance).\n *\n * This method accepts an optional camera which can be useful if you need to translate coordinates\n * based on a different view than the one being currently being displayed on screen.\n *\n * @param {Coordinates} viewportPoint\n * @param {CoordinateConversionOverride} override\n */\n }, {\n key: \"viewportToGraph\",\n value: function viewportToGraph(viewportPoint) {\n var override = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return this.normalizationFunction.inverse(this.viewportToFramedGraph(viewportPoint, override));\n }\n\n /**\n * Method used to translate a point's coordinates from the graph system (the reference system of data as they are in\n * the given graph instance) to the viewport system (pixel distance from the top-left of the stage).\n *\n * This method accepts an optional camera which can be useful if you need to translate coordinates\n * based on a different view than the one being currently being displayed on screen.\n *\n * @param {Coordinates} graphPoint\n * @param {CoordinateConversionOverride} override\n */\n }, {\n key: \"graphToViewport\",\n value: function graphToViewport(graphPoint) {\n var override = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return this.framedGraphToViewport(this.normalizationFunction(graphPoint), override);\n }\n\n /**\n * Method returning the distance multiplier between the graph system and the\n * viewport system.\n */\n }, {\n key: \"getGraphToViewportRatio\",\n value: function getGraphToViewportRatio() {\n var graphP1 = {\n x: 0,\n y: 0\n };\n var graphP2 = {\n x: 1,\n y: 1\n };\n var graphD = Math.sqrt(Math.pow(graphP1.x - graphP2.x, 2) + Math.pow(graphP1.y - graphP2.y, 2));\n var viewportP1 = this.graphToViewport(graphP1);\n var viewportP2 = this.graphToViewport(graphP2);\n var viewportD = Math.sqrt(Math.pow(viewportP1.x - viewportP2.x, 2) + Math.pow(viewportP1.y - viewportP2.y, 2));\n return viewportD / graphD;\n }\n\n /**\n * Method returning the graph's bounding box.\n *\n * @return {{ x: Extent, y: Extent }}\n */\n }, {\n key: \"getBBox\",\n value: function getBBox() {\n return this.nodeExtent;\n }\n\n /**\n * Method returning the graph's custom bounding box, if any.\n *\n * @return {{ x: Extent, y: Extent } | null}\n */\n }, {\n key: \"getCustomBBox\",\n value: function getCustomBBox() {\n return this.customBBox;\n }\n\n /**\n * Method used to override the graph's bounding box with a custom one. Give `null` as the argument to stop overriding.\n *\n * @return {Sigma}\n */\n }, {\n key: \"setCustomBBox\",\n value: function setCustomBBox(customBBox) {\n this.customBBox = customBBox;\n this.scheduleRender();\n return this;\n }\n\n /**\n * Method used to shut the container & release event listeners.\n *\n * @return {undefined}\n */\n }, {\n key: \"kill\",\n value: function kill() {\n // Emitting \"kill\" events so that plugins and such can cleanup\n this.emit(\"kill\");\n\n // Releasing events\n this.removeAllListeners();\n\n // Releasing camera handlers\n this.unbindCameraHandlers();\n\n // Releasing DOM events & captors\n window.removeEventListener(\"resize\", this.activeListeners.handleResize);\n this.mouseCaptor.kill();\n this.touchCaptor.kill();\n\n // Releasing graph handlers\n this.unbindGraphHandlers();\n\n // Releasing cache & state\n this.clearIndices();\n this.clearState();\n this.nodeDataCache = {};\n this.edgeDataCache = {};\n this.highlightedNodes.clear();\n\n // Clearing frames\n if (this.renderFrame) {\n cancelAnimationFrame(this.renderFrame);\n this.renderFrame = null;\n }\n if (this.renderHighlightedNodesFrame) {\n cancelAnimationFrame(this.renderHighlightedNodesFrame);\n this.renderHighlightedNodesFrame = null;\n }\n\n // Destroying canvases\n var container = this.container;\n while (container.firstChild) container.removeChild(container.firstChild);\n\n // Kill programs:\n for (var type in this.nodePrograms) {\n this.nodePrograms[type].kill();\n }\n for (var _type8 in this.nodeHoverPrograms) {\n this.nodeHoverPrograms[_type8].kill();\n }\n for (var _type9 in this.edgePrograms) {\n this.edgePrograms[_type9].kill();\n }\n this.nodePrograms = {};\n this.nodeHoverPrograms = {};\n this.edgePrograms = {};\n\n // Kill all canvas/WebGL contexts\n for (var id in this.elements) {\n this.killLayer(id);\n }\n\n // Destroying remaining collections\n this.canvasContexts = {};\n this.webGLContexts = {};\n this.elements = {};\n }\n\n /**\n * Method used to scale the given size according to the camera's ratio, i.e.\n * zooming state.\n *\n * @param {number?} size - The size to scale (node size, edge thickness etc.).\n * @param {number?} cameraRatio - A camera ratio (defaults to the actual camera ratio).\n * @return {number} - The scaled size.\n */\n }, {\n key: \"scaleSize\",\n value: function scaleSize() {\n var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n var cameraRatio = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.camera.ratio;\n return size / this.settings.zoomToSizeRatioFunction(cameraRatio) * (this.getSetting(\"itemSizesReference\") === \"positions\" ? cameraRatio * this.graphToViewportRatio : 1);\n }\n\n /**\n * Method that returns the collection of all used canvases.\n * At the moment, the instantiated canvases are the following, and in the\n * following order in the DOM:\n * - `edges`\n * - `nodes`\n * - `edgeLabels`\n * - `labels`\n * - `hovers`\n * - `hoverNodes`\n * - `mouse`\n *\n * @return {PlainObject<HTMLCanvasElement>} - The collection of canvases.\n */\n }, {\n key: \"getCanvases\",\n value: function getCanvases() {\n var res = {};\n for (var layer in this.elements) if (this.elements[layer] instanceof HTMLCanvasElement) res[layer] = this.elements[layer];\n return res;\n }\n }]);\n}(TypedEventEmitter);\n\n/**\n * Sigma.js Library Endpoint\n * =========================\n *\n * The library endpoint.\n * @module\n */\nvar Sigma = Sigma$1;\n\nexport { Camera, MouseCaptor, Sigma$1 as Sigma, TouchCaptor, Sigma as default };\n"],"names":["TypedEventEmitter","_ref","_this","_classCallCheck","_callSuper","_inherits","_createClass","EventEmitter","linear","k","quadraticIn","quadraticOut","quadraticInOut","cubicIn","cubicOut","cubicInOut","easings","ANIMATE_DEFAULTS","identity","scale","m","x","y","rotate","r","s","c","translate","multiply","a","b","a00","a01","a02","a10","a11","a12","a20","a21","a22","b00","b01","b02","b10","b11","b12","b20","b21","b22","multiplyVec2","z","b0","b1","getCorrectionRatio","viewportDimensions","graphDimensions","viewportRatio","graphRatio","matrixFromCamera","state","padding","inverse","angle","ratio","width","height","matrix","smallestDimension","correctionRatio","getMatrixImpact","cameraState","_multiplyVec","graphExtent","graph","xMin","xMax","yMin","yMax","_","attr","validateGraph","isGraph","key","attributes","createElement","tag","style","element","_k","getPixelRatio","zIndexOrdering","_extent","getter","elements","zA","zB","createNormalizationFunction","extent","_extent$x","_slicedToArray","minX","maxX","_extent$y","minY","maxY","dX","dY","fn","data","_typeof","o","extend","array","values","l2","l1","i","value","assign","target","l","DEFAULT_SETTINGS","drawStraightEdgeLabel","drawDiscNodeLabel","drawDiscNodeHover","DEFAULT_NODE_PROGRAM_CLASSES","NodeCircleProgram","DEFAULT_EDGE_PROGRAM_CLASSES","EdgeArrowProgram","EdgeRectangleProgram","validateSettings","settings","minCameraRatio","maxCameraRatio","resolveSettings","resolvedSettings","DEFAULT_ZOOMING_RATIO","Camera","_TypedEventEmitter","_defineProperty","validatedState","_objectSpread2","validState","updater","_this2","opts","callback","resolve","options","easing","start","initialState","_fn","t","coefficient","newState","factorOrOptions","camera","getPosition","e","dom","bbox","getMouseCoords","res","cleanMouseCoords","getWheelCoords","getWheelDelta","MAX_TOUCHES","getTouchesArray","touches","arr","getTouchCoords","previousTouches","touch","Captor","container","renderer","MOUSE_SETTINGS_KEYS","DEFAULT_MOUSE_SETTINGS","iter","MouseCaptor","_Captor","mouseCoords","newRatio","_getPosition","_this3","_getPosition2","previousCameraState","shouldRefresh","_this4","_getPosition3","eX","eY","lastMouse","mouse","offsetX","offsetY","_this5","delta","wheelCoords","currentRatio","ratioDiff","wheelDirection","now","TOUCH_SETTINGS_KEYS","DEFAULT_TOUCH_SETTINGS","TouchCaptor","_this$startTouchesPos","_this$startTouchesPos2","x0","y0","_this$startTouchesPos3","x1","y1","position","downPosition","dSquare","touchCoords","_camera","_touchCoords","touchesPositions","lastTouches","idx","startPosition","startCameraState","_this$renderer$viewpo","xStart","yStart","_this$renderer$viewpo2","newCameraState","_touchesPositions$","_touchesPositions$2","angleDiff","dimensions","touchGraphPosition","dx","dy","_x","_y","_arrayWithoutHoles","_arrayLikeToArray","_iterableToArray","_nonIterableSpread","_toConsumableArray","_unsupportedIterableToArray","_objectWithoutPropertiesLoose","n","_objectWithoutProperties","LabelCandidate","size","first","second","LabelGrid","cellSize","pos","xIndex","yIndex","candidate","index","cell","density","cellArea","scaledCellArea","scaledDensity","labelsToDisplayPerCell","labels","edgeLabelsToDisplayFromNodes","params","hoveredNode","highlightedNodes","displayedNodeLabels","worthyEdges","edge","source","X_LABEL_MARGIN","Y_LABEL_MARGIN","hasOwnProperty","applyNodeDefaults","applyEdgeDefaults","_key","Sigma$1","Sigma","type","_type","NodeProgramClass","NodeHoverProgram","EdgeProgramClass","_this$nodePrograms","program","programs","_toPropertyKey","_this$nodeHoverProgra","_program","_programs","_this$edgePrograms","id","gl","frameBuffer","currentTexture","pickingTexture","color","getPixelColor","colorToIndex","itemAt","event","baseEvent","nodeToHover","node","edgeToHover","createInteractionListener","eventType","nodeAtPosition","LAYOUT_IMPACTING_FIELDS","_e$hints","updatedFields","layoutChanged","f","_e$hints2","payload","_this$nodeExtent","nullCamera","nullCameraMatrix","nodesPerPrograms","nodeIndices","edgeIndices","itemIDsIndex","incrID","nodes","attrs","_i","_l","_node","_data","edgesPerPrograms","edges","_i2","_l2","_data2","_type2","_i3","_l3","_edge","_data3","oldSettings","_this6","_type3","_type4","_type5","_ref$tolerance","tolerance","boundaries","_ref2","_ref2$x","xMinGraph","xMaxGraph","_ref2$y","yMinGraph","yMaxGraph","corners","_ref3","graphWidth","graphHeight","_this$getDimensions","origin","labelsToDisplay","context","_this$framedGraphToVi","defaultDrawNodeLabel","nodeProgram","drawLabel","edgeLabelsToDisplay","displayedLabels","extremities","sourceData","targetData","edgeData","defaultDrawEdgeLabel","edgeProgram","_this7","render","_this7$framedGraphToV","defaultDrawNodeHover","drawHover","nodesToRender","renderParams","_type6","_this8","_this9","exitRender","layer","mouseCaptor","moving","_type7","_program2","fingerprint","_this$settings","stagePadding","autoRescale","canvas","contextOptions","newFrameBuffer","_gl$getExtension","oldValues","force","previousWidth","previousHeight","_id","_id2","_this10","skipIndexation","schedule","fullRefresh","_opts$partialGraph","_opts$partialGraph2","programIndex","_i4","_l4","_programIndex","_this11","viewportTarget","_this$camera$getState","_this$settings2","center","graphMousePosition","graphCenterPosition","p1","p2","h","coordinates","override","recomputeMatrix","viewportPos","invMatrix","viewportPoint","graphPoint","graphP1","graphP2","graphD","viewportP1","viewportP2","viewportD","customBBox","_type8","_type9","cameraRatio"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4]}
|
|
1
|
+
{"version":3,"file":"sigma.esm-BFfaH_Ia.js","sources":["../../../../node_modules/.pnpm/sigma@3.0.3_graphology-types@0.24.8/node_modules/sigma/types/dist/sigma-types.esm.js","../../../../node_modules/.pnpm/sigma@3.0.3_graphology-types@0.24.8/node_modules/sigma/dist/normalization-be445518.esm.js","../../../../node_modules/.pnpm/sigma@3.0.3_graphology-types@0.24.8/node_modules/sigma/dist/data-11df7124.esm.js","../../../../node_modules/.pnpm/sigma@3.0.3_graphology-types@0.24.8/node_modules/sigma/settings/dist/sigma-settings.esm.js","../../../../node_modules/.pnpm/sigma@3.0.3_graphology-types@0.24.8/node_modules/sigma/dist/sigma.esm.js"],"sourcesContent":["import { _ as _inherits, a as _createClass, b as _classCallCheck, c as _callSuper } from '../../dist/inherits-d1a1e29b.esm.js';\nimport { EventEmitter } from 'events';\n\n/**\n * Util type to represent maps of typed elements, but implemented with\n * JavaScript objects.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n/**\n * Returns a type similar to T, but with the K set of properties of the type\n * T *required*, and the rest optional.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n/**\n * Returns a type similar to Partial<T>, but with at least one key set.\n */\n\n/**\n * Custom event emitter types.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\nvar TypedEventEmitter = /*#__PURE__*/function (_ref) {\n function TypedEventEmitter() {\n var _this;\n _classCallCheck(this, TypedEventEmitter);\n _this = _callSuper(this, TypedEventEmitter);\n _this.rawEmitter = _this;\n return _this;\n }\n _inherits(TypedEventEmitter, _ref);\n return _createClass(TypedEventEmitter);\n}(EventEmitter);\n\n/**\n * Event types.\n */\n\n/**\n * Export various other types:\n */\n\nexport { TypedEventEmitter };\n","import isGraph from 'graphology-utils/is-graph';\nimport { _ as _slicedToArray } from './colors-beb06eb2.esm.js';\n\nvar linear = function linear(k) {\n return k;\n};\nvar quadraticIn = function quadraticIn(k) {\n return k * k;\n};\nvar quadraticOut = function quadraticOut(k) {\n return k * (2 - k);\n};\nvar quadraticInOut = function quadraticInOut(k) {\n if ((k *= 2) < 1) return 0.5 * k * k;\n return -0.5 * (--k * (k - 2) - 1);\n};\nvar cubicIn = function cubicIn(k) {\n return k * k * k;\n};\nvar cubicOut = function cubicOut(k) {\n return --k * k * k + 1;\n};\nvar cubicInOut = function cubicInOut(k) {\n if ((k *= 2) < 1) return 0.5 * k * k * k;\n return 0.5 * ((k -= 2) * k * k + 2);\n};\nvar easings = {\n linear: linear,\n quadraticIn: quadraticIn,\n quadraticOut: quadraticOut,\n quadraticInOut: quadraticInOut,\n cubicIn: cubicIn,\n cubicOut: cubicOut,\n cubicInOut: cubicInOut\n};\n\n/**\n * Defaults.\n */\n\nvar ANIMATE_DEFAULTS = {\n easing: \"quadraticInOut\",\n duration: 150\n};\n\n/**\n * Function used to animate the nodes.\n */\nfunction animateNodes(graph, targets, opts, callback) {\n var options = Object.assign({}, ANIMATE_DEFAULTS, opts);\n var easing = typeof options.easing === \"function\" ? options.easing : easings[options.easing];\n var start = Date.now();\n var startPositions = {};\n for (var node in targets) {\n var attrs = targets[node];\n startPositions[node] = {};\n for (var _k in attrs) startPositions[node][_k] = graph.getNodeAttribute(node, _k);\n }\n var frame = null;\n var _step = function step() {\n frame = null;\n var p = (Date.now() - start) / options.duration;\n if (p >= 1) {\n // Animation is done\n for (var _node in targets) {\n var _attrs = targets[_node];\n\n // We use given values to avoid precision issues and for convenience\n for (var _k2 in _attrs) graph.setNodeAttribute(_node, _k2, _attrs[_k2]);\n }\n if (typeof callback === \"function\") callback();\n return;\n }\n p = easing(p);\n for (var _node2 in targets) {\n var _attrs2 = targets[_node2];\n var s = startPositions[_node2];\n for (var _k3 in _attrs2) graph.setNodeAttribute(_node2, _k3, _attrs2[_k3] * p + s[_k3] * (1 - p));\n }\n frame = requestAnimationFrame(_step);\n };\n _step();\n return function () {\n if (frame) cancelAnimationFrame(frame);\n };\n}\n\nfunction identity() {\n return Float32Array.of(1, 0, 0, 0, 1, 0, 0, 0, 1);\n}\n\n// TODO: optimize\nfunction scale(m, x, y) {\n m[0] = x;\n m[4] = typeof y === \"number\" ? y : x;\n return m;\n}\nfunction rotate(m, r) {\n var s = Math.sin(r),\n c = Math.cos(r);\n m[0] = c;\n m[1] = s;\n m[3] = -s;\n m[4] = c;\n return m;\n}\nfunction translate(m, x, y) {\n m[6] = x;\n m[7] = y;\n return m;\n}\nfunction multiply(a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b00 = b[0],\n b01 = b[1],\n b02 = b[2];\n var b10 = b[3],\n b11 = b[4],\n b12 = b[5];\n var b20 = b[6],\n b21 = b[7],\n b22 = b[8];\n a[0] = b00 * a00 + b01 * a10 + b02 * a20;\n a[1] = b00 * a01 + b01 * a11 + b02 * a21;\n a[2] = b00 * a02 + b01 * a12 + b02 * a22;\n a[3] = b10 * a00 + b11 * a10 + b12 * a20;\n a[4] = b10 * a01 + b11 * a11 + b12 * a21;\n a[5] = b10 * a02 + b11 * a12 + b12 * a22;\n a[6] = b20 * a00 + b21 * a10 + b22 * a20;\n a[7] = b20 * a01 + b21 * a11 + b22 * a21;\n a[8] = b20 * a02 + b21 * a12 + b22 * a22;\n return a;\n}\nfunction multiplyVec2(a, b) {\n var z = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n var a00 = a[0];\n var a01 = a[1];\n var a10 = a[3];\n var a11 = a[4];\n var a20 = a[6];\n var a21 = a[7];\n var b0 = b.x;\n var b1 = b.y;\n return {\n x: b0 * a00 + b1 * a10 + a20 * z,\n y: b0 * a01 + b1 * a11 + a21 * z\n };\n}\n\n/**\n * In sigma, the graph is normalized into a [0, 1], [0, 1] square, before being given to the various renderers. This\n * helps to deal with quadtree in particular.\n * But at some point, we need to rescale it so that it takes the best place in the screen, i.e. we always want to see two\n * nodes \"touching\" opposite sides of the graph, with the camera being at its default state.\n *\n * This function determines this ratio.\n */\nfunction getCorrectionRatio(viewportDimensions, graphDimensions) {\n var viewportRatio = viewportDimensions.height / viewportDimensions.width;\n var graphRatio = graphDimensions.height / graphDimensions.width;\n\n // If the stage and the graphs are in different directions (such as the graph being wider that tall while the stage\n // is taller than wide), we can stop here to have indeed nodes touching opposite sides:\n if (viewportRatio < 1 && graphRatio > 1 || viewportRatio > 1 && graphRatio < 1) {\n return 1;\n }\n\n // Else, we need to fit the graph inside the stage:\n // 1. If the graph is \"squarer\" (i.e. with a ratio closer to 1), we need to make the largest sides touch;\n // 2. If the stage is \"squarer\", we need to make the smallest sides touch.\n return Math.min(Math.max(graphRatio, 1 / graphRatio), Math.max(1 / viewportRatio, viewportRatio));\n}\n\n/**\n * Function returning a matrix from the current state of the camera.\n */\nfunction matrixFromCamera(state, viewportDimensions, graphDimensions, padding, inverse) {\n // TODO: it's possible to optimize this drastically!\n var angle = state.angle,\n ratio = state.ratio,\n x = state.x,\n y = state.y;\n var width = viewportDimensions.width,\n height = viewportDimensions.height;\n var matrix = identity();\n var smallestDimension = Math.min(width, height) - 2 * padding;\n var correctionRatio = getCorrectionRatio(viewportDimensions, graphDimensions);\n if (!inverse) {\n multiply(matrix, scale(identity(), 2 * (smallestDimension / width) * correctionRatio, 2 * (smallestDimension / height) * correctionRatio));\n multiply(matrix, rotate(identity(), -angle));\n multiply(matrix, scale(identity(), 1 / ratio));\n multiply(matrix, translate(identity(), -x, -y));\n } else {\n multiply(matrix, translate(identity(), x, y));\n multiply(matrix, scale(identity(), ratio));\n multiply(matrix, rotate(identity(), angle));\n multiply(matrix, scale(identity(), width / smallestDimension / 2 / correctionRatio, height / smallestDimension / 2 / correctionRatio));\n }\n return matrix;\n}\n\n/**\n * All these transformations we apply on the matrix to get it rescale the graph\n * as we want make it very hard to get pixel-perfect distances in WebGL. This\n * function returns a factor that properly cancels the matrix effect on lengths.\n *\n * [jacomyal]\n * To be fully honest, I can't really explain happens here... I notice that the\n * following ratio works (i.e. it correctly compensates the matrix impact on all\n * camera states I could try):\n * > `R = size(V) / size(M * V) / W`\n * as long as `M * V` is in the direction of W (ie. parallel to (Ox)). It works\n * as well with H and a vector that transforms into something parallel to (Oy).\n *\n * Also, note that we use `angle` and not `-angle` (that would seem logical,\n * since we want to anticipate the rotation), because the image is vertically\n * swapped in WebGL.\n */\nfunction getMatrixImpact(matrix, cameraState, viewportDimensions) {\n var _multiplyVec = multiplyVec2(matrix, {\n x: Math.cos(cameraState.angle),\n y: Math.sin(cameraState.angle)\n }, 0),\n x = _multiplyVec.x,\n y = _multiplyVec.y;\n return 1 / Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) / viewportDimensions.width;\n}\n\n/**\n * Function returning the graph's node extent in x & y.\n */\nfunction graphExtent(graph) {\n if (!graph.order) return {\n x: [0, 1],\n y: [0, 1]\n };\n var xMin = Infinity;\n var xMax = -Infinity;\n var yMin = Infinity;\n var yMax = -Infinity;\n graph.forEachNode(function (_, attr) {\n var x = attr.x,\n y = attr.y;\n if (x < xMin) xMin = x;\n if (x > xMax) xMax = x;\n if (y < yMin) yMin = y;\n if (y > yMax) yMax = y;\n });\n return {\n x: [xMin, xMax],\n y: [yMin, yMax]\n };\n}\n\n/**\n * Check if the graph variable is a valid graph, and if sigma can render it.\n */\nfunction validateGraph(graph) {\n // check if it's a valid graphology instance\n if (!isGraph(graph)) throw new Error(\"Sigma: invalid graph instance.\");\n\n // check if nodes have x/y attributes\n graph.forEachNode(function (key, attributes) {\n if (!Number.isFinite(attributes.x) || !Number.isFinite(attributes.y)) {\n throw new Error(\"Sigma: Coordinates of node \".concat(key, \" are invalid. A node must have a numeric 'x' and 'y' attribute.\"));\n }\n });\n}\n\n/**\n * Function used to create DOM elements easily.\n */\nfunction createElement(tag, style, attributes) {\n var element = document.createElement(tag);\n if (style) {\n for (var k in style) {\n element.style[k] = style[k];\n }\n }\n if (attributes) {\n for (var _k in attributes) {\n element.setAttribute(_k, attributes[_k]);\n }\n }\n return element;\n}\n\n/**\n * Function returning the browser's pixel ratio.\n */\nfunction getPixelRatio() {\n if (typeof window.devicePixelRatio !== \"undefined\") return window.devicePixelRatio;\n return 1;\n}\n\n/**\n * Function ordering the given elements in reverse z-order so they drawn\n * the correct way.\n */\nfunction zIndexOrdering(_extent, getter, elements) {\n // If k is > n, we'll use a standard sort\n return elements.sort(function (a, b) {\n var zA = getter(a) || 0,\n zB = getter(b) || 0;\n if (zA < zB) return -1;\n if (zA > zB) return 1;\n return 0;\n });\n\n // TODO: counting sort optimization\n}\n\n/**\n * Factory returning a function normalizing the given node's position & size.\n */\n\nfunction createNormalizationFunction(extent) {\n var _extent$x = _slicedToArray(extent.x, 2),\n minX = _extent$x[0],\n maxX = _extent$x[1],\n _extent$y = _slicedToArray(extent.y, 2),\n minY = _extent$y[0],\n maxY = _extent$y[1];\n var ratio = Math.max(maxX - minX, maxY - minY),\n dX = (maxX + minX) / 2,\n dY = (maxY + minY) / 2;\n if (ratio === 0 || Math.abs(ratio) === Infinity || isNaN(ratio)) ratio = 1;\n if (isNaN(dX)) dX = 0;\n if (isNaN(dY)) dY = 0;\n var fn = function fn(data) {\n return {\n x: 0.5 + (data.x - dX) / ratio,\n y: 0.5 + (data.y - dY) / ratio\n };\n };\n\n // TODO: possibility to apply this in batch over array of indices\n fn.applyTo = function (data) {\n data.x = 0.5 + (data.x - dX) / ratio;\n data.y = 0.5 + (data.y - dY) / ratio;\n };\n fn.inverse = function (data) {\n return {\n x: dX + ratio * (data.x - 0.5),\n y: dY + ratio * (data.y - 0.5)\n };\n };\n fn.ratio = ratio;\n return fn;\n}\n\nexport { ANIMATE_DEFAULTS as A, getMatrixImpact as a, createElement as b, createNormalizationFunction as c, getPixelRatio as d, easings as e, multiplyVec2 as f, graphExtent as g, animateNodes as h, identity as i, getCorrectionRatio as j, quadraticOut as k, linear as l, matrixFromCamera as m, quadraticInOut as n, cubicIn as o, cubicOut as p, quadraticIn as q, cubicInOut as r, scale as s, rotate as t, translate as u, validateGraph as v, multiply as w, zIndexOrdering as z };\n","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\n\n/**\n * Extends the target array with the given values.\n */\nfunction extend(array, values) {\n var l2 = values.size;\n if (l2 === 0) return;\n var l1 = array.length;\n array.length += l2;\n var i = 0;\n values.forEach(function (value) {\n array[l1 + i] = value;\n i++;\n });\n}\n\n/**\n * Checks whether the given value is a plain object.\n */\nfunction isPlainObject(value) {\n return _typeof(value) === \"object\" && value !== null && value.constructor === Object;\n}\n\n/**\n * Helper to use `Object.assign` with more than two objects.\n */\nfunction assign(target) {\n target = target || {};\n for (var i = 0, l = arguments.length <= 1 ? 0 : arguments.length - 1; i < l; i++) {\n var o = i + 1 < 1 || arguments.length <= i + 1 ? undefined : arguments[i + 1];\n if (!o) continue;\n Object.assign(target, o);\n }\n return target;\n}\n\n/**\n * Very simple recursive `Object.assign` like function.\n */\nfunction assignDeep(target) {\n target = target || {};\n for (var i = 0, l = arguments.length <= 1 ? 0 : arguments.length - 1; i < l; i++) {\n var o = i + 1 < 1 || arguments.length <= i + 1 ? undefined : arguments[i + 1];\n if (!o) continue;\n for (var k in o) {\n if (isPlainObject(o[k])) {\n target[k] = assignDeep(target[k], o[k]);\n } else {\n target[k] = o[k];\n }\n }\n }\n return target;\n}\n\nexport { _typeof as _, assign as a, assignDeep as b, extend as e, isPlainObject as i };\n","import { d as drawStraightEdgeLabel, b as drawDiscNodeLabel, c as drawDiscNodeHover, N as NodeCircleProgram, E as EdgeArrowProgram, e as EdgeRectangleProgram } from '../../dist/index-fad77a13.esm.js';\nimport { a as assign } from '../../dist/data-11df7124.esm.js';\nimport '../../dist/inherits-d1a1e29b.esm.js';\nimport '../../dist/colors-beb06eb2.esm.js';\n\n/**\n * Sigma.js Settings\n * =================================\n *\n * The list of settings and some handy functions.\n * @module\n */\n\n/**\n * Sigma.js settings\n * =================================\n */\n\nvar DEFAULT_SETTINGS = {\n // Performance\n hideEdgesOnMove: false,\n hideLabelsOnMove: false,\n renderLabels: true,\n renderEdgeLabels: false,\n enableEdgeEvents: false,\n // Component rendering\n defaultNodeColor: \"#999\",\n defaultNodeType: \"circle\",\n defaultEdgeColor: \"#ccc\",\n defaultEdgeType: \"line\",\n labelFont: \"Arial\",\n labelSize: 14,\n labelWeight: \"normal\",\n labelColor: {\n color: \"#000\"\n },\n edgeLabelFont: \"Arial\",\n edgeLabelSize: 14,\n edgeLabelWeight: \"normal\",\n edgeLabelColor: {\n attribute: \"color\"\n },\n stagePadding: 30,\n defaultDrawEdgeLabel: drawStraightEdgeLabel,\n defaultDrawNodeLabel: drawDiscNodeLabel,\n defaultDrawNodeHover: drawDiscNodeHover,\n minEdgeThickness: 1.7,\n antiAliasingFeather: 1,\n // Mouse and touch settings\n dragTimeout: 100,\n draggedEventsTolerance: 3,\n inertiaDuration: 200,\n inertiaRatio: 3,\n zoomDuration: 250,\n zoomingRatio: 1.7,\n doubleClickTimeout: 300,\n doubleClickZoomingRatio: 2.2,\n doubleClickZoomingDuration: 200,\n tapMoveTolerance: 10,\n // Size and scaling\n zoomToSizeRatioFunction: Math.sqrt,\n itemSizesReference: \"screen\",\n autoRescale: true,\n autoCenter: true,\n // Labels\n labelDensity: 1,\n labelGridCellSize: 100,\n labelRenderedSizeThreshold: 6,\n // Reducers\n nodeReducer: null,\n edgeReducer: null,\n // Features\n zIndex: false,\n minCameraRatio: null,\n maxCameraRatio: null,\n enableCameraZooming: true,\n enableCameraPanning: true,\n enableCameraRotation: true,\n cameraPanBoundaries: null,\n // Lifecycle\n allowInvalidContainer: false,\n // Program classes\n nodeProgramClasses: {},\n nodeHoverProgramClasses: {},\n edgeProgramClasses: {}\n};\nvar DEFAULT_NODE_PROGRAM_CLASSES = {\n circle: NodeCircleProgram\n};\nvar DEFAULT_EDGE_PROGRAM_CLASSES = {\n arrow: EdgeArrowProgram,\n line: EdgeRectangleProgram\n};\nfunction validateSettings(settings) {\n if (typeof settings.labelDensity !== \"number\" || settings.labelDensity < 0) {\n throw new Error(\"Settings: invalid `labelDensity`. Expecting a positive number.\");\n }\n var minCameraRatio = settings.minCameraRatio,\n maxCameraRatio = settings.maxCameraRatio;\n if (typeof minCameraRatio === \"number\" && typeof maxCameraRatio === \"number\" && maxCameraRatio < minCameraRatio) {\n throw new Error(\"Settings: invalid camera ratio boundaries. Expecting `maxCameraRatio` to be greater than `minCameraRatio`.\");\n }\n}\nfunction resolveSettings(settings) {\n var resolvedSettings = assign({}, DEFAULT_SETTINGS, settings);\n resolvedSettings.nodeProgramClasses = assign({}, DEFAULT_NODE_PROGRAM_CLASSES, resolvedSettings.nodeProgramClasses);\n resolvedSettings.edgeProgramClasses = assign({}, DEFAULT_EDGE_PROGRAM_CLASSES, resolvedSettings.edgeProgramClasses);\n return resolvedSettings;\n}\n\nexport { DEFAULT_EDGE_PROGRAM_CLASSES, DEFAULT_NODE_PROGRAM_CLASSES, DEFAULT_SETTINGS, resolveSettings, validateSettings };\n","import { _ as _objectSpread2, a as _defineProperty } from './index-fad77a13.esm.js';\nimport { _ as _inherits, a as _createClass, b as _classCallCheck, c as _callSuper, d as _toPropertyKey } from './inherits-d1a1e29b.esm.js';\nimport { TypedEventEmitter } from '../types/dist/sigma-types.esm.js';\nimport { A as ANIMATE_DEFAULTS, e as easings, g as graphExtent, c as createNormalizationFunction, m as matrixFromCamera, z as zIndexOrdering, a as getMatrixImpact, b as createElement, d as getPixelRatio, f as multiplyVec2, i as identity, v as validateGraph } from './normalization-be445518.esm.js';\nimport { DEFAULT_SETTINGS, validateSettings, resolveSettings } from '../settings/dist/sigma-settings.esm.js';\nimport { _ as _slicedToArray, a as _arrayLikeToArray, b as _unsupportedIterableToArray, g as getPixelColor, c as colorToIndex } from './colors-beb06eb2.esm.js';\nimport { _ as _typeof, e as extend } from './data-11df7124.esm.js';\nimport 'events';\nimport 'graphology-utils/is-graph';\n\n/**\n * Defaults.\n */\nvar DEFAULT_ZOOMING_RATIO = 1.5;\n\n/**\n * Event types.\n */\n/**\n * Camera class\n */\nvar Camera = /*#__PURE__*/function (_TypedEventEmitter) {\n function Camera() {\n var _this;\n _classCallCheck(this, Camera);\n _this = _callSuper(this, Camera);\n\n // State\n _defineProperty(_this, \"x\", 0.5);\n _defineProperty(_this, \"y\", 0.5);\n _defineProperty(_this, \"angle\", 0);\n _defineProperty(_this, \"ratio\", 1);\n _defineProperty(_this, \"minRatio\", null);\n _defineProperty(_this, \"maxRatio\", null);\n _defineProperty(_this, \"enabledZooming\", true);\n _defineProperty(_this, \"enabledPanning\", true);\n _defineProperty(_this, \"enabledRotation\", true);\n _defineProperty(_this, \"clean\", null);\n _defineProperty(_this, \"nextFrame\", null);\n _defineProperty(_this, \"previousState\", null);\n _defineProperty(_this, \"enabled\", true);\n _this.previousState = _this.getState();\n return _this;\n }\n\n /**\n * Static method used to create a Camera object with a given state.\n */\n _inherits(Camera, _TypedEventEmitter);\n return _createClass(Camera, [{\n key: \"enable\",\n value:\n /**\n * Method used to enable the camera.\n */\n function enable() {\n this.enabled = true;\n return this;\n }\n\n /**\n * Method used to disable the camera.\n */\n }, {\n key: \"disable\",\n value: function disable() {\n this.enabled = false;\n return this;\n }\n\n /**\n * Method used to retrieve the camera's current state.\n */\n }, {\n key: \"getState\",\n value: function getState() {\n return {\n x: this.x,\n y: this.y,\n angle: this.angle,\n ratio: this.ratio\n };\n }\n\n /**\n * Method used to check whether the camera has the given state.\n */\n }, {\n key: \"hasState\",\n value: function hasState(state) {\n return this.x === state.x && this.y === state.y && this.ratio === state.ratio && this.angle === state.angle;\n }\n\n /**\n * Method used to retrieve the camera's previous state.\n */\n }, {\n key: \"getPreviousState\",\n value: function getPreviousState() {\n var state = this.previousState;\n if (!state) return null;\n return {\n x: state.x,\n y: state.y,\n angle: state.angle,\n ratio: state.ratio\n };\n }\n\n /**\n * Method used to check minRatio and maxRatio values.\n */\n }, {\n key: \"getBoundedRatio\",\n value: function getBoundedRatio(ratio) {\n var r = ratio;\n if (typeof this.minRatio === \"number\") r = Math.max(r, this.minRatio);\n if (typeof this.maxRatio === \"number\") r = Math.min(r, this.maxRatio);\n return r;\n }\n\n /**\n * Method used to check various things to return a legit state candidate.\n */\n }, {\n key: \"validateState\",\n value: function validateState(state) {\n var validatedState = {};\n if (this.enabledPanning && typeof state.x === \"number\") validatedState.x = state.x;\n if (this.enabledPanning && typeof state.y === \"number\") validatedState.y = state.y;\n if (this.enabledZooming && typeof state.ratio === \"number\") validatedState.ratio = this.getBoundedRatio(state.ratio);\n if (this.enabledRotation && typeof state.angle === \"number\") validatedState.angle = state.angle;\n return this.clean ? this.clean(_objectSpread2(_objectSpread2({}, this.getState()), validatedState)) : validatedState;\n }\n\n /**\n * Method used to check whether the camera is currently being animated.\n */\n }, {\n key: \"isAnimated\",\n value: function isAnimated() {\n return !!this.nextFrame;\n }\n\n /**\n * Method used to set the camera's state.\n */\n }, {\n key: \"setState\",\n value: function setState(state) {\n if (!this.enabled) return this;\n\n // Keeping track of last state\n this.previousState = this.getState();\n var validState = this.validateState(state);\n if (typeof validState.x === \"number\") this.x = validState.x;\n if (typeof validState.y === \"number\") this.y = validState.y;\n if (typeof validState.ratio === \"number\") this.ratio = validState.ratio;\n if (typeof validState.angle === \"number\") this.angle = validState.angle;\n\n // Emitting\n if (!this.hasState(this.previousState)) this.emit(\"updated\", this.getState());\n return this;\n }\n\n /**\n * Method used to update the camera's state using a function.\n */\n }, {\n key: \"updateState\",\n value: function updateState(updater) {\n this.setState(updater(this.getState()));\n return this;\n }\n\n /**\n * Method used to animate the camera.\n */\n }, {\n key: \"animate\",\n value: function animate(state) {\n var _this2 = this;\n var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n if (!callback) return new Promise(function (resolve) {\n return _this2.animate(state, opts, resolve);\n });\n if (!this.enabled) return;\n var options = _objectSpread2(_objectSpread2({}, ANIMATE_DEFAULTS), opts);\n var validState = this.validateState(state);\n var easing = typeof options.easing === \"function\" ? options.easing : easings[options.easing];\n\n // State\n var start = Date.now(),\n initialState = this.getState();\n\n // Function performing the animation\n var _fn = function fn() {\n var t = (Date.now() - start) / options.duration;\n\n // The animation is over:\n if (t >= 1) {\n _this2.nextFrame = null;\n _this2.setState(validState);\n if (_this2.animationCallback) {\n _this2.animationCallback.call(null);\n _this2.animationCallback = undefined;\n }\n return;\n }\n var coefficient = easing(t);\n var newState = {};\n if (typeof validState.x === \"number\") newState.x = initialState.x + (validState.x - initialState.x) * coefficient;\n if (typeof validState.y === \"number\") newState.y = initialState.y + (validState.y - initialState.y) * coefficient;\n if (_this2.enabledRotation && typeof validState.angle === \"number\") newState.angle = initialState.angle + (validState.angle - initialState.angle) * coefficient;\n if (typeof validState.ratio === \"number\") newState.ratio = initialState.ratio + (validState.ratio - initialState.ratio) * coefficient;\n _this2.setState(newState);\n _this2.nextFrame = requestAnimationFrame(_fn);\n };\n if (this.nextFrame) {\n cancelAnimationFrame(this.nextFrame);\n if (this.animationCallback) this.animationCallback.call(null);\n this.nextFrame = requestAnimationFrame(_fn);\n } else {\n _fn();\n }\n this.animationCallback = callback;\n }\n\n /**\n * Method used to zoom the camera.\n */\n }, {\n key: \"animatedZoom\",\n value: function animatedZoom(factorOrOptions) {\n if (!factorOrOptions) return this.animate({\n ratio: this.ratio / DEFAULT_ZOOMING_RATIO\n });\n if (typeof factorOrOptions === \"number\") return this.animate({\n ratio: this.ratio / factorOrOptions\n });\n return this.animate({\n ratio: this.ratio / (factorOrOptions.factor || DEFAULT_ZOOMING_RATIO)\n }, factorOrOptions);\n }\n\n /**\n * Method used to unzoom the camera.\n */\n }, {\n key: \"animatedUnzoom\",\n value: function animatedUnzoom(factorOrOptions) {\n if (!factorOrOptions) return this.animate({\n ratio: this.ratio * DEFAULT_ZOOMING_RATIO\n });\n if (typeof factorOrOptions === \"number\") return this.animate({\n ratio: this.ratio * factorOrOptions\n });\n return this.animate({\n ratio: this.ratio * (factorOrOptions.factor || DEFAULT_ZOOMING_RATIO)\n }, factorOrOptions);\n }\n\n /**\n * Method used to reset the camera.\n */\n }, {\n key: \"animatedReset\",\n value: function animatedReset(options) {\n return this.animate({\n x: 0.5,\n y: 0.5,\n ratio: 1,\n angle: 0\n }, options);\n }\n\n /**\n * Returns a new Camera instance, with the same state as the current camera.\n */\n }, {\n key: \"copy\",\n value: function copy() {\n return Camera.from(this.getState());\n }\n }], [{\n key: \"from\",\n value: function from(state) {\n var camera = new Camera();\n return camera.setState(state);\n }\n }]);\n}(TypedEventEmitter);\n\n/**\n * Captor utils functions\n * ======================\n */\n\n/**\n * Extract the local X and Y coordinates from a mouse event or touch object. If\n * a DOM element is given, it uses this element's offset to compute the position\n * (this allows using events that are not bound to the container itself and\n * still have a proper position).\n *\n * @param {event} e - A mouse event or touch object.\n * @param {HTMLElement} dom - A DOM element to compute offset relatively to.\n * @return {number} The local Y value of the mouse.\n */\nfunction getPosition(e, dom) {\n var bbox = dom.getBoundingClientRect();\n return {\n x: e.clientX - bbox.left,\n y: e.clientY - bbox.top\n };\n}\n\n/**\n * Convert mouse coords to sigma coords.\n *\n * @param {event} e - A mouse event or touch object.\n * @param {HTMLElement} dom - A DOM element to compute offset relatively to.\n * @return {object}\n */\nfunction getMouseCoords(e, dom) {\n var res = _objectSpread2(_objectSpread2({}, getPosition(e, dom)), {}, {\n sigmaDefaultPrevented: false,\n preventSigmaDefault: function preventSigmaDefault() {\n res.sigmaDefaultPrevented = true;\n },\n original: e\n });\n return res;\n}\n\n/**\n * Takes a touch coords or a mouse coords, and always returns a clean mouse coords object.\n */\nfunction cleanMouseCoords(e) {\n var res = \"x\" in e ? e : _objectSpread2(_objectSpread2({}, e.touches[0] || e.previousTouches[0]), {}, {\n original: e.original,\n sigmaDefaultPrevented: e.sigmaDefaultPrevented,\n preventSigmaDefault: function preventSigmaDefault() {\n e.sigmaDefaultPrevented = true;\n res.sigmaDefaultPrevented = true;\n }\n });\n return res;\n}\n\n/**\n * Convert mouse wheel event coords to sigma coords.\n *\n * @param {event} e - A wheel mouse event.\n * @param {HTMLElement} dom - A DOM element to compute offset relatively to.\n * @return {object}\n */\nfunction getWheelCoords(e, dom) {\n return _objectSpread2(_objectSpread2({}, getMouseCoords(e, dom)), {}, {\n delta: getWheelDelta(e)\n });\n}\nvar MAX_TOUCHES = 2;\nfunction getTouchesArray(touches) {\n var arr = [];\n for (var i = 0, l = Math.min(touches.length, MAX_TOUCHES); i < l; i++) arr.push(touches[i]);\n return arr;\n}\n\n/**\n * Convert touch coords to sigma coords.\n *\n * @param {event} e - A touch event.\n * @param {Touch[]} previousTouches - An array of the previously stored touches.\n * @param {HTMLElement} dom - A DOM element to compute offset relatively to.\n * @return {object}\n */\nfunction getTouchCoords(e, previousTouches, dom) {\n var res = {\n touches: getTouchesArray(e.touches).map(function (touch) {\n return getPosition(touch, dom);\n }),\n previousTouches: previousTouches.map(function (touch) {\n return getPosition(touch, dom);\n }),\n sigmaDefaultPrevented: false,\n preventSigmaDefault: function preventSigmaDefault() {\n res.sigmaDefaultPrevented = true;\n },\n original: e\n };\n return res;\n}\n\n/**\n * Extract the wheel delta from a mouse event or touch object.\n *\n * @param {event} e - A mouse event or touch object.\n * @return {number} The wheel delta of the mouse.\n */\nfunction getWheelDelta(e) {\n // TODO: check those ratios again to ensure a clean Chrome/Firefox compat\n if (typeof e.deltaY !== \"undefined\") return e.deltaY * -3 / 360;\n if (typeof e.detail !== \"undefined\") return e.detail / -9;\n throw new Error(\"Captor: could not extract delta from event.\");\n}\n\n/**\n * Abstract class representing a captor like the user's mouse or touch controls.\n */\nvar Captor = /*#__PURE__*/function (_TypedEventEmitter) {\n function Captor(container, renderer) {\n var _this;\n _classCallCheck(this, Captor);\n _this = _callSuper(this, Captor);\n // Properties\n _this.container = container;\n _this.renderer = renderer;\n return _this;\n }\n _inherits(Captor, _TypedEventEmitter);\n return _createClass(Captor);\n}(TypedEventEmitter);\n\nvar MOUSE_SETTINGS_KEYS = [\"doubleClickTimeout\", \"doubleClickZoomingDuration\", \"doubleClickZoomingRatio\", \"dragTimeout\", \"draggedEventsTolerance\", \"inertiaDuration\", \"inertiaRatio\", \"zoomDuration\", \"zoomingRatio\"];\nvar DEFAULT_MOUSE_SETTINGS = MOUSE_SETTINGS_KEYS.reduce(function (iter, key) {\n return _objectSpread2(_objectSpread2({}, iter), {}, _defineProperty({}, key, DEFAULT_SETTINGS[key]));\n}, {});\n\n/**\n * Event types.\n */\n/**\n * Mouse captor class.\n *\n * @constructor\n */\nvar MouseCaptor = /*#__PURE__*/function (_Captor) {\n function MouseCaptor(container, renderer) {\n var _this;\n _classCallCheck(this, MouseCaptor);\n _this = _callSuper(this, MouseCaptor, [container, renderer]);\n\n // Binding methods\n // State\n _defineProperty(_this, \"enabled\", true);\n _defineProperty(_this, \"draggedEvents\", 0);\n _defineProperty(_this, \"downStartTime\", null);\n _defineProperty(_this, \"lastMouseX\", null);\n _defineProperty(_this, \"lastMouseY\", null);\n _defineProperty(_this, \"isMouseDown\", false);\n _defineProperty(_this, \"isMoving\", false);\n _defineProperty(_this, \"movingTimeout\", null);\n _defineProperty(_this, \"startCameraState\", null);\n _defineProperty(_this, \"clicks\", 0);\n _defineProperty(_this, \"doubleClickTimeout\", null);\n _defineProperty(_this, \"currentWheelDirection\", 0);\n _defineProperty(_this, \"settings\", DEFAULT_MOUSE_SETTINGS);\n _this.handleClick = _this.handleClick.bind(_this);\n _this.handleRightClick = _this.handleRightClick.bind(_this);\n _this.handleDown = _this.handleDown.bind(_this);\n _this.handleUp = _this.handleUp.bind(_this);\n _this.handleMove = _this.handleMove.bind(_this);\n _this.handleWheel = _this.handleWheel.bind(_this);\n _this.handleLeave = _this.handleLeave.bind(_this);\n _this.handleEnter = _this.handleEnter.bind(_this);\n\n // Binding events\n container.addEventListener(\"click\", _this.handleClick, {\n capture: false\n });\n container.addEventListener(\"contextmenu\", _this.handleRightClick, {\n capture: false\n });\n container.addEventListener(\"mousedown\", _this.handleDown, {\n capture: false\n });\n container.addEventListener(\"wheel\", _this.handleWheel, {\n capture: false\n });\n container.addEventListener(\"mouseleave\", _this.handleLeave, {\n capture: false\n });\n container.addEventListener(\"mouseenter\", _this.handleEnter, {\n capture: false\n });\n document.addEventListener(\"mousemove\", _this.handleMove, {\n capture: false\n });\n document.addEventListener(\"mouseup\", _this.handleUp, {\n capture: false\n });\n return _this;\n }\n _inherits(MouseCaptor, _Captor);\n return _createClass(MouseCaptor, [{\n key: \"kill\",\n value: function kill() {\n var container = this.container;\n container.removeEventListener(\"click\", this.handleClick);\n container.removeEventListener(\"contextmenu\", this.handleRightClick);\n container.removeEventListener(\"mousedown\", this.handleDown);\n container.removeEventListener(\"wheel\", this.handleWheel);\n container.removeEventListener(\"mouseleave\", this.handleLeave);\n container.removeEventListener(\"mouseenter\", this.handleEnter);\n document.removeEventListener(\"mousemove\", this.handleMove);\n document.removeEventListener(\"mouseup\", this.handleUp);\n }\n }, {\n key: \"handleClick\",\n value: function handleClick(e) {\n var _this2 = this;\n if (!this.enabled) return;\n this.clicks++;\n if (this.clicks === 2) {\n this.clicks = 0;\n if (typeof this.doubleClickTimeout === \"number\") {\n clearTimeout(this.doubleClickTimeout);\n this.doubleClickTimeout = null;\n }\n return this.handleDoubleClick(e);\n }\n setTimeout(function () {\n _this2.clicks = 0;\n _this2.doubleClickTimeout = null;\n }, this.settings.doubleClickTimeout);\n\n // NOTE: this is here to prevent click events on drag\n if (this.draggedEvents < this.settings.draggedEventsTolerance) this.emit(\"click\", getMouseCoords(e, this.container));\n }\n }, {\n key: \"handleRightClick\",\n value: function handleRightClick(e) {\n if (!this.enabled) return;\n this.emit(\"rightClick\", getMouseCoords(e, this.container));\n }\n }, {\n key: \"handleDoubleClick\",\n value: function handleDoubleClick(e) {\n if (!this.enabled) return;\n e.preventDefault();\n e.stopPropagation();\n var mouseCoords = getMouseCoords(e, this.container);\n this.emit(\"doubleClick\", mouseCoords);\n if (mouseCoords.sigmaDefaultPrevented) return;\n\n // default behavior\n var camera = this.renderer.getCamera();\n var newRatio = camera.getBoundedRatio(camera.getState().ratio / this.settings.doubleClickZoomingRatio);\n camera.animate(this.renderer.getViewportZoomedState(getPosition(e, this.container), newRatio), {\n easing: \"quadraticInOut\",\n duration: this.settings.doubleClickZoomingDuration\n });\n }\n }, {\n key: \"handleDown\",\n value: function handleDown(e) {\n if (!this.enabled) return;\n\n // We only start dragging on left button\n if (e.button === 0) {\n this.startCameraState = this.renderer.getCamera().getState();\n var _getPosition = getPosition(e, this.container),\n x = _getPosition.x,\n y = _getPosition.y;\n this.lastMouseX = x;\n this.lastMouseY = y;\n this.draggedEvents = 0;\n this.downStartTime = Date.now();\n this.isMouseDown = true;\n }\n this.emit(\"mousedown\", getMouseCoords(e, this.container));\n }\n }, {\n key: \"handleUp\",\n value: function handleUp(e) {\n var _this3 = this;\n if (!this.enabled || !this.isMouseDown) return;\n var camera = this.renderer.getCamera();\n this.isMouseDown = false;\n if (typeof this.movingTimeout === \"number\") {\n clearTimeout(this.movingTimeout);\n this.movingTimeout = null;\n }\n var _getPosition2 = getPosition(e, this.container),\n x = _getPosition2.x,\n y = _getPosition2.y;\n var cameraState = camera.getState(),\n previousCameraState = camera.getPreviousState() || {\n x: 0,\n y: 0\n };\n if (this.isMoving) {\n camera.animate({\n x: cameraState.x + this.settings.inertiaRatio * (cameraState.x - previousCameraState.x),\n y: cameraState.y + this.settings.inertiaRatio * (cameraState.y - previousCameraState.y)\n }, {\n duration: this.settings.inertiaDuration,\n easing: \"quadraticOut\"\n });\n } else if (this.lastMouseX !== x || this.lastMouseY !== y) {\n camera.setState({\n x: cameraState.x,\n y: cameraState.y\n });\n }\n this.isMoving = false;\n setTimeout(function () {\n var shouldRefresh = _this3.draggedEvents > 0;\n _this3.draggedEvents = 0;\n\n // NOTE: this refresh is here to make sure `hideEdgesOnMove` can work\n // when someone releases camera pan drag after having stopped moving.\n // See commit: https://github.com/jacomyal/sigma.js/commit/cfd9197f70319109db6b675dd7c82be493ca95a2\n // See also issue: https://github.com/jacomyal/sigma.js/issues/1290\n // It could be possible to render instead of scheduling a refresh but for\n // now it seems good enough.\n if (shouldRefresh && _this3.renderer.getSetting(\"hideEdgesOnMove\")) _this3.renderer.refresh();\n }, 0);\n this.emit(\"mouseup\", getMouseCoords(e, this.container));\n }\n }, {\n key: \"handleMove\",\n value: function handleMove(e) {\n var _this4 = this;\n if (!this.enabled) return;\n var mouseCoords = getMouseCoords(e, this.container);\n\n // Always trigger a \"mousemovebody\" event, so that it is possible to develop\n // a drag-and-drop effect that works even when the mouse is out of the\n // container:\n this.emit(\"mousemovebody\", mouseCoords);\n\n // Only trigger the \"mousemove\" event when the mouse is actually hovering\n // the container, to avoid weirdly hovering nodes and/or edges when the\n // mouse is not hover the container:\n if (e.target === this.container || e.composedPath()[0] === this.container) {\n this.emit(\"mousemove\", mouseCoords);\n }\n if (mouseCoords.sigmaDefaultPrevented) return;\n\n // Handle the case when \"isMouseDown\" all the time, to allow dragging the\n // stage while the mouse is not hover the container:\n if (this.isMouseDown) {\n this.isMoving = true;\n this.draggedEvents++;\n if (typeof this.movingTimeout === \"number\") {\n clearTimeout(this.movingTimeout);\n }\n this.movingTimeout = window.setTimeout(function () {\n _this4.movingTimeout = null;\n _this4.isMoving = false;\n }, this.settings.dragTimeout);\n var camera = this.renderer.getCamera();\n var _getPosition3 = getPosition(e, this.container),\n eX = _getPosition3.x,\n eY = _getPosition3.y;\n var lastMouse = this.renderer.viewportToFramedGraph({\n x: this.lastMouseX,\n y: this.lastMouseY\n });\n var mouse = this.renderer.viewportToFramedGraph({\n x: eX,\n y: eY\n });\n var offsetX = lastMouse.x - mouse.x,\n offsetY = lastMouse.y - mouse.y;\n var cameraState = camera.getState();\n var x = cameraState.x + offsetX,\n y = cameraState.y + offsetY;\n camera.setState({\n x: x,\n y: y\n });\n this.lastMouseX = eX;\n this.lastMouseY = eY;\n e.preventDefault();\n e.stopPropagation();\n }\n }\n }, {\n key: \"handleLeave\",\n value: function handleLeave(e) {\n this.emit(\"mouseleave\", getMouseCoords(e, this.container));\n }\n }, {\n key: \"handleEnter\",\n value: function handleEnter(e) {\n this.emit(\"mouseenter\", getMouseCoords(e, this.container));\n }\n }, {\n key: \"handleWheel\",\n value: function handleWheel(e) {\n var _this5 = this;\n var camera = this.renderer.getCamera();\n if (!this.enabled || !camera.enabledZooming) return;\n var delta = getWheelDelta(e);\n if (!delta) return;\n var wheelCoords = getWheelCoords(e, this.container);\n this.emit(\"wheel\", wheelCoords);\n if (wheelCoords.sigmaDefaultPrevented) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n // Default behavior\n var currentRatio = camera.getState().ratio;\n var ratioDiff = delta > 0 ? 1 / this.settings.zoomingRatio : this.settings.zoomingRatio;\n var newRatio = camera.getBoundedRatio(currentRatio * ratioDiff);\n var wheelDirection = delta > 0 ? 1 : -1;\n var now = Date.now();\n\n // Exit early without preventing default behavior when ratio doesn't change:\n if (currentRatio === newRatio) return;\n e.preventDefault();\n e.stopPropagation();\n\n // Cancel events that are too close each other and in the same direction:\n if (this.currentWheelDirection === wheelDirection && this.lastWheelTriggerTime && now - this.lastWheelTriggerTime < this.settings.zoomDuration / 5) {\n return;\n }\n camera.animate(this.renderer.getViewportZoomedState(getPosition(e, this.container), newRatio), {\n easing: \"quadraticOut\",\n duration: this.settings.zoomDuration\n }, function () {\n _this5.currentWheelDirection = 0;\n });\n this.currentWheelDirection = wheelDirection;\n this.lastWheelTriggerTime = now;\n }\n }, {\n key: \"setSettings\",\n value: function setSettings(settings) {\n this.settings = settings;\n }\n }]);\n}(Captor);\n\nvar TOUCH_SETTINGS_KEYS = [\"dragTimeout\", \"inertiaDuration\", \"inertiaRatio\", \"doubleClickTimeout\", \"doubleClickZoomingRatio\", \"doubleClickZoomingDuration\", \"tapMoveTolerance\"];\nvar DEFAULT_TOUCH_SETTINGS = TOUCH_SETTINGS_KEYS.reduce(function (iter, key) {\n return _objectSpread2(_objectSpread2({}, iter), {}, _defineProperty({}, key, DEFAULT_SETTINGS[key]));\n}, {});\n\n/**\n * Event types.\n */\n/**\n * Touch captor class.\n *\n * @constructor\n */\nvar TouchCaptor = /*#__PURE__*/function (_Captor) {\n function TouchCaptor(container, renderer) {\n var _this;\n _classCallCheck(this, TouchCaptor);\n _this = _callSuper(this, TouchCaptor, [container, renderer]);\n\n // Binding methods:\n _defineProperty(_this, \"enabled\", true);\n _defineProperty(_this, \"isMoving\", false);\n _defineProperty(_this, \"hasMoved\", false);\n _defineProperty(_this, \"touchMode\", 0);\n _defineProperty(_this, \"startTouchesPositions\", []);\n _defineProperty(_this, \"lastTouches\", []);\n _defineProperty(_this, \"lastTap\", null);\n _defineProperty(_this, \"settings\", DEFAULT_TOUCH_SETTINGS);\n _this.handleStart = _this.handleStart.bind(_this);\n _this.handleLeave = _this.handleLeave.bind(_this);\n _this.handleMove = _this.handleMove.bind(_this);\n\n // Binding events\n container.addEventListener(\"touchstart\", _this.handleStart, {\n capture: false\n });\n container.addEventListener(\"touchcancel\", _this.handleLeave, {\n capture: false\n });\n document.addEventListener(\"touchend\", _this.handleLeave, {\n capture: false,\n passive: false\n });\n document.addEventListener(\"touchmove\", _this.handleMove, {\n capture: false,\n passive: false\n });\n return _this;\n }\n _inherits(TouchCaptor, _Captor);\n return _createClass(TouchCaptor, [{\n key: \"kill\",\n value: function kill() {\n var container = this.container;\n container.removeEventListener(\"touchstart\", this.handleStart);\n container.removeEventListener(\"touchcancel\", this.handleLeave);\n document.removeEventListener(\"touchend\", this.handleLeave);\n document.removeEventListener(\"touchmove\", this.handleMove);\n }\n }, {\n key: \"getDimensions\",\n value: function getDimensions() {\n return {\n width: this.container.offsetWidth,\n height: this.container.offsetHeight\n };\n }\n }, {\n key: \"handleStart\",\n value: function handleStart(e) {\n var _this2 = this;\n if (!this.enabled) return;\n e.preventDefault();\n var touches = getTouchesArray(e.touches);\n this.touchMode = touches.length;\n this.startCameraState = this.renderer.getCamera().getState();\n this.startTouchesPositions = touches.map(function (touch) {\n return getPosition(touch, _this2.container);\n });\n\n // When there are two touches down, let's record distance and angle as well:\n if (this.touchMode === 2) {\n var _this$startTouchesPos = _slicedToArray(this.startTouchesPositions, 2),\n _this$startTouchesPos2 = _this$startTouchesPos[0],\n x0 = _this$startTouchesPos2.x,\n y0 = _this$startTouchesPos2.y,\n _this$startTouchesPos3 = _this$startTouchesPos[1],\n x1 = _this$startTouchesPos3.x,\n y1 = _this$startTouchesPos3.y;\n this.startTouchesAngle = Math.atan2(y1 - y0, x1 - x0);\n this.startTouchesDistance = Math.sqrt(Math.pow(x1 - x0, 2) + Math.pow(y1 - y0, 2));\n }\n this.emit(\"touchdown\", getTouchCoords(e, this.lastTouches, this.container));\n this.lastTouches = touches;\n this.lastTouchesPositions = this.startTouchesPositions;\n }\n }, {\n key: \"handleLeave\",\n value: function handleLeave(e) {\n if (!this.enabled || !this.startTouchesPositions.length) return;\n if (e.cancelable) e.preventDefault();\n if (this.movingTimeout) {\n this.isMoving = false;\n clearTimeout(this.movingTimeout);\n }\n switch (this.touchMode) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n case 2:\n if (e.touches.length === 1) {\n this.handleStart(e);\n e.preventDefault();\n break;\n }\n /* falls through */\n case 1:\n if (this.isMoving) {\n var camera = this.renderer.getCamera();\n var cameraState = camera.getState(),\n previousCameraState = camera.getPreviousState() || {\n x: 0,\n y: 0\n };\n camera.animate({\n x: cameraState.x + this.settings.inertiaRatio * (cameraState.x - previousCameraState.x),\n y: cameraState.y + this.settings.inertiaRatio * (cameraState.y - previousCameraState.y)\n }, {\n duration: this.settings.inertiaDuration,\n easing: \"quadraticOut\"\n });\n }\n this.hasMoved = false;\n this.isMoving = false;\n this.touchMode = 0;\n break;\n }\n this.emit(\"touchup\", getTouchCoords(e, this.lastTouches, this.container));\n\n // When the last touch ends and there hasn't been too much movement, trigger a \"tap\" or \"doubletap\" event:\n if (!e.touches.length) {\n var position = getPosition(this.lastTouches[0], this.container);\n var downPosition = this.startTouchesPositions[0];\n var dSquare = Math.pow(position.x - downPosition.x, 2) + Math.pow(position.y - downPosition.y, 2);\n if (!e.touches.length && dSquare < Math.pow(this.settings.tapMoveTolerance, 2)) {\n // Only trigger \"doubletap\" when the last tap is recent enough:\n if (this.lastTap && Date.now() - this.lastTap.time < this.settings.doubleClickTimeout) {\n var touchCoords = getTouchCoords(e, this.lastTouches, this.container);\n this.emit(\"doubletap\", touchCoords);\n this.lastTap = null;\n if (!touchCoords.sigmaDefaultPrevented) {\n var _camera = this.renderer.getCamera();\n var newRatio = _camera.getBoundedRatio(_camera.getState().ratio / this.settings.doubleClickZoomingRatio);\n _camera.animate(this.renderer.getViewportZoomedState(position, newRatio), {\n easing: \"quadraticInOut\",\n duration: this.settings.doubleClickZoomingDuration\n });\n }\n }\n // Else, trigger a normal \"tap\" event:\n else {\n var _touchCoords = getTouchCoords(e, this.lastTouches, this.container);\n this.emit(\"tap\", _touchCoords);\n this.lastTap = {\n time: Date.now(),\n position: _touchCoords.touches[0] || _touchCoords.previousTouches[0]\n };\n }\n }\n }\n this.lastTouches = getTouchesArray(e.touches);\n this.startTouchesPositions = [];\n }\n }, {\n key: \"handleMove\",\n value: function handleMove(e) {\n var _this3 = this;\n if (!this.enabled || !this.startTouchesPositions.length) return;\n e.preventDefault();\n var touches = getTouchesArray(e.touches);\n var touchesPositions = touches.map(function (touch) {\n return getPosition(touch, _this3.container);\n });\n var lastTouches = this.lastTouches;\n this.lastTouches = touches;\n this.lastTouchesPositions = touchesPositions;\n var touchCoords = getTouchCoords(e, lastTouches, this.container);\n this.emit(\"touchmove\", touchCoords);\n if (touchCoords.sigmaDefaultPrevented) return;\n\n // If a move was initiated at some point, and we get back to start point,\n // we should still consider that we did move (which also happens after a\n // multiple touch when only one touch remains in which case handleStart\n // is recalled within handleLeave).\n // Now, some mobile browsers report zero-distance moves so we also check that\n // one of the touches did actually move from the origin position.\n this.hasMoved || (this.hasMoved = touchesPositions.some(function (position, idx) {\n var startPosition = _this3.startTouchesPositions[idx];\n return startPosition && (position.x !== startPosition.x || position.y !== startPosition.y);\n }));\n\n // If there was no move, do not trigger touch moves behavior\n if (!this.hasMoved) {\n return;\n }\n this.isMoving = true;\n if (this.movingTimeout) clearTimeout(this.movingTimeout);\n this.movingTimeout = window.setTimeout(function () {\n _this3.isMoving = false;\n }, this.settings.dragTimeout);\n var camera = this.renderer.getCamera();\n var startCameraState = this.startCameraState;\n var padding = this.renderer.getSetting(\"stagePadding\");\n switch (this.touchMode) {\n case 1:\n {\n var _this$renderer$viewpo = this.renderer.viewportToFramedGraph((this.startTouchesPositions || [])[0]),\n xStart = _this$renderer$viewpo.x,\n yStart = _this$renderer$viewpo.y;\n var _this$renderer$viewpo2 = this.renderer.viewportToFramedGraph(touchesPositions[0]),\n x = _this$renderer$viewpo2.x,\n y = _this$renderer$viewpo2.y;\n camera.setState({\n x: startCameraState.x + xStart - x,\n y: startCameraState.y + yStart - y\n });\n break;\n }\n case 2:\n {\n /**\n * Here is the thinking here:\n *\n * 1. We can find the new angle and ratio, by comparing the vector from \"touch one\" to \"touch two\" at the start\n * of the d'n'd and now\n *\n * 2. We can use `Camera#viewportToGraph` inside formula to retrieve the new camera position, using the graph\n * position of a touch at the beginning of the d'n'd (using `startCamera.viewportToGraph`) and the viewport\n * position of this same touch now\n */\n var newCameraState = {\n x: 0.5,\n y: 0.5,\n angle: 0,\n ratio: 1\n };\n var _touchesPositions$ = touchesPositions[0],\n x0 = _touchesPositions$.x,\n y0 = _touchesPositions$.y;\n var _touchesPositions$2 = touchesPositions[1],\n x1 = _touchesPositions$2.x,\n y1 = _touchesPositions$2.y;\n var angleDiff = Math.atan2(y1 - y0, x1 - x0) - this.startTouchesAngle;\n var ratioDiff = Math.hypot(y1 - y0, x1 - x0) / this.startTouchesDistance;\n\n // 1.\n var newRatio = camera.getBoundedRatio(startCameraState.ratio / ratioDiff);\n newCameraState.ratio = newRatio;\n newCameraState.angle = startCameraState.angle + angleDiff;\n\n // 2.\n var dimensions = this.getDimensions();\n var touchGraphPosition = this.renderer.viewportToFramedGraph((this.startTouchesPositions || [])[0], {\n cameraState: startCameraState\n });\n var smallestDimension = Math.min(dimensions.width, dimensions.height) - 2 * padding;\n var dx = smallestDimension / dimensions.width;\n var dy = smallestDimension / dimensions.height;\n var ratio = newRatio / smallestDimension;\n\n // Align with center of the graph:\n var _x = x0 - smallestDimension / 2 / dx;\n var _y = y0 - smallestDimension / 2 / dy;\n\n // Rotate:\n var _ref = [_x * Math.cos(-newCameraState.angle) - _y * Math.sin(-newCameraState.angle), _y * Math.cos(-newCameraState.angle) + _x * Math.sin(-newCameraState.angle)];\n _x = _ref[0];\n _y = _ref[1];\n newCameraState.x = touchGraphPosition.x - _x * ratio;\n newCameraState.y = touchGraphPosition.y + _y * ratio;\n camera.setState(newCameraState);\n break;\n }\n }\n }\n }, {\n key: \"setSettings\",\n value: function setSettings(settings) {\n this.settings = settings;\n }\n }]);\n}(Captor);\n\nfunction _arrayWithoutHoles(r) {\n if (Array.isArray(r)) return _arrayLikeToArray(r);\n}\n\nfunction _iterableToArray(r) {\n if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r);\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nfunction _toConsumableArray(r) {\n return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();\n}\n\nfunction _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\n\nfunction _objectWithoutProperties(e, t) {\n if (null == e) return {};\n var o,\n r,\n i = _objectWithoutPropertiesLoose(e, t);\n if (Object.getOwnPropertySymbols) {\n var n = Object.getOwnPropertySymbols(e);\n for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]);\n }\n return i;\n}\n\n/**\n * Sigma.js Labels Heuristics\n * ===========================\n *\n * Miscellaneous heuristics related to label display.\n * @module\n */\n/**\n * Class representing a single candidate for the label grid selection.\n *\n * It also describes a deterministic way to compare two candidates to assess\n * which one is better.\n */\nvar LabelCandidate = /*#__PURE__*/function () {\n function LabelCandidate(key, size) {\n _classCallCheck(this, LabelCandidate);\n this.key = key;\n this.size = size;\n }\n return _createClass(LabelCandidate, null, [{\n key: \"compare\",\n value: function compare(first, second) {\n // First we compare by size\n if (first.size > second.size) return -1;\n if (first.size < second.size) return 1;\n\n // Then since no two nodes can have the same key, we use it to\n // deterministically tie-break by key\n if (first.key > second.key) return 1;\n\n // NOTE: this comparator cannot return 0\n return -1;\n }\n }]);\n}();\n/**\n * Class representing a 2D spatial grid divided into constant-size cells.\n */\nvar LabelGrid = /*#__PURE__*/function () {\n function LabelGrid() {\n _classCallCheck(this, LabelGrid);\n _defineProperty(this, \"width\", 0);\n _defineProperty(this, \"height\", 0);\n _defineProperty(this, \"cellSize\", 0);\n _defineProperty(this, \"columns\", 0);\n _defineProperty(this, \"rows\", 0);\n _defineProperty(this, \"cells\", {});\n }\n return _createClass(LabelGrid, [{\n key: \"resizeAndClear\",\n value: function resizeAndClear(dimensions, cellSize) {\n this.width = dimensions.width;\n this.height = dimensions.height;\n this.cellSize = cellSize;\n this.columns = Math.ceil(dimensions.width / cellSize);\n this.rows = Math.ceil(dimensions.height / cellSize);\n this.cells = {};\n }\n }, {\n key: \"getIndex\",\n value: function getIndex(pos) {\n var xIndex = Math.floor(pos.x / this.cellSize);\n var yIndex = Math.floor(pos.y / this.cellSize);\n return yIndex * this.columns + xIndex;\n }\n }, {\n key: \"add\",\n value: function add(key, size, pos) {\n var candidate = new LabelCandidate(key, size);\n var index = this.getIndex(pos);\n var cell = this.cells[index];\n if (!cell) {\n cell = [];\n this.cells[index] = cell;\n }\n cell.push(candidate);\n }\n }, {\n key: \"organize\",\n value: function organize() {\n for (var k in this.cells) {\n var cell = this.cells[k];\n cell.sort(LabelCandidate.compare);\n }\n }\n }, {\n key: \"getLabelsToDisplay\",\n value: function getLabelsToDisplay(ratio, density) {\n // TODO: work on visible nodes to optimize? ^ -> threshold outside so that memoization works?\n // TODO: adjust threshold lower, but increase cells a bit?\n // TODO: hunt for geom issue in disguise\n // TODO: memoize while ratio does not move. method to force recompute\n var cellArea = this.cellSize * this.cellSize;\n var scaledCellArea = cellArea / ratio / ratio;\n var scaledDensity = scaledCellArea * density / cellArea;\n var labelsToDisplayPerCell = Math.ceil(scaledDensity);\n var labels = [];\n for (var k in this.cells) {\n var cell = this.cells[k];\n for (var i = 0; i < Math.min(labelsToDisplayPerCell, cell.length); i++) {\n labels.push(cell[i].key);\n }\n }\n return labels;\n }\n }]);\n}();\n\n/**\n * Label heuristic selecting edge labels to display, based on displayed node\n * labels\n *\n * @param {object} params - Parameters:\n * @param {Set} displayedNodeLabels - Currently displayed node labels.\n * @param {Set} highlightedNodes - Highlighted nodes.\n * @param {Graph} graph - The rendered graph.\n * @param {string} hoveredNode - Hovered node (optional)\n * @return {Array} - The selected labels.\n */\nfunction edgeLabelsToDisplayFromNodes(params) {\n var graph = params.graph,\n hoveredNode = params.hoveredNode,\n highlightedNodes = params.highlightedNodes,\n displayedNodeLabels = params.displayedNodeLabels;\n var worthyEdges = [];\n\n // TODO: the code below can be optimized using #.forEach and batching the code per adj\n\n // We should display an edge's label if:\n // - Any of its extremities is highlighted or hovered\n // - Both of its extremities has its label shown\n graph.forEachEdge(function (edge, _, source, target) {\n if (source === hoveredNode || target === hoveredNode || highlightedNodes.has(source) || highlightedNodes.has(target) || displayedNodeLabels.has(source) && displayedNodeLabels.has(target)) {\n worthyEdges.push(edge);\n }\n });\n return worthyEdges;\n}\n\n/**\n * Constants.\n */\nvar X_LABEL_MARGIN = 150;\nvar Y_LABEL_MARGIN = 50;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/**\n * Important functions.\n */\nfunction applyNodeDefaults(settings, key, data) {\n if (!hasOwnProperty.call(data, \"x\") || !hasOwnProperty.call(data, \"y\")) throw new Error(\"Sigma: could not find a valid position (x, y) for node \\\"\".concat(key, \"\\\". All your nodes must have a number \\\"x\\\" and \\\"y\\\". Maybe your forgot to apply a layout or your \\\"nodeReducer\\\" is not returning the correct data?\"));\n if (!data.color) data.color = settings.defaultNodeColor;\n if (!data.label && data.label !== \"\") data.label = null;\n if (data.label !== undefined && data.label !== null) data.label = \"\" + data.label;else data.label = null;\n if (!data.size) data.size = 2;\n if (!hasOwnProperty.call(data, \"hidden\")) data.hidden = false;\n if (!hasOwnProperty.call(data, \"highlighted\")) data.highlighted = false;\n if (!hasOwnProperty.call(data, \"forceLabel\")) data.forceLabel = false;\n if (!data.type || data.type === \"\") data.type = settings.defaultNodeType;\n if (!data.zIndex) data.zIndex = 0;\n return data;\n}\nfunction applyEdgeDefaults(settings, _key, data) {\n if (!data.color) data.color = settings.defaultEdgeColor;\n if (!data.label) data.label = \"\";\n if (!data.size) data.size = 0.5;\n if (!hasOwnProperty.call(data, \"hidden\")) data.hidden = false;\n if (!hasOwnProperty.call(data, \"forceLabel\")) data.forceLabel = false;\n if (!data.type || data.type === \"\") data.type = settings.defaultEdgeType;\n if (!data.zIndex) data.zIndex = 0;\n return data;\n}\n\n/**\n * Main class.\n *\n * @constructor\n * @param {Graph} graph - Graph to render.\n * @param {HTMLElement} container - DOM container in which to render.\n * @param {object} settings - Optional settings.\n */\nvar Sigma$1 = /*#__PURE__*/function (_TypedEventEmitter) {\n function Sigma(graph, container) {\n var _this;\n var settings = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _classCallCheck(this, Sigma);\n _this = _callSuper(this, Sigma);\n\n // Resolving settings\n _defineProperty(_this, \"elements\", {});\n _defineProperty(_this, \"canvasContexts\", {});\n _defineProperty(_this, \"webGLContexts\", {});\n _defineProperty(_this, \"pickingLayers\", new Set());\n _defineProperty(_this, \"textures\", {});\n _defineProperty(_this, \"frameBuffers\", {});\n _defineProperty(_this, \"activeListeners\", {});\n _defineProperty(_this, \"labelGrid\", new LabelGrid());\n _defineProperty(_this, \"nodeDataCache\", {});\n _defineProperty(_this, \"edgeDataCache\", {});\n // Indices to keep track of the index of the item inside programs\n _defineProperty(_this, \"nodeProgramIndex\", {});\n _defineProperty(_this, \"edgeProgramIndex\", {});\n _defineProperty(_this, \"nodesWithForcedLabels\", new Set());\n _defineProperty(_this, \"edgesWithForcedLabels\", new Set());\n _defineProperty(_this, \"nodeExtent\", {\n x: [0, 1],\n y: [0, 1]\n });\n _defineProperty(_this, \"nodeZExtent\", [Infinity, -Infinity]);\n _defineProperty(_this, \"edgeZExtent\", [Infinity, -Infinity]);\n _defineProperty(_this, \"matrix\", identity());\n _defineProperty(_this, \"invMatrix\", identity());\n _defineProperty(_this, \"correctionRatio\", 1);\n _defineProperty(_this, \"customBBox\", null);\n _defineProperty(_this, \"normalizationFunction\", createNormalizationFunction({\n x: [0, 1],\n y: [0, 1]\n }));\n // Cache:\n _defineProperty(_this, \"graphToViewportRatio\", 1);\n _defineProperty(_this, \"itemIDsIndex\", {});\n _defineProperty(_this, \"nodeIndices\", {});\n _defineProperty(_this, \"edgeIndices\", {});\n // Starting dimensions and pixel ratio\n _defineProperty(_this, \"width\", 0);\n _defineProperty(_this, \"height\", 0);\n _defineProperty(_this, \"pixelRatio\", getPixelRatio());\n _defineProperty(_this, \"pickingDownSizingRatio\", 2 * _this.pixelRatio);\n // Graph State\n _defineProperty(_this, \"displayedNodeLabels\", new Set());\n _defineProperty(_this, \"displayedEdgeLabels\", new Set());\n _defineProperty(_this, \"highlightedNodes\", new Set());\n _defineProperty(_this, \"hoveredNode\", null);\n _defineProperty(_this, \"hoveredEdge\", null);\n // Internal states\n _defineProperty(_this, \"renderFrame\", null);\n _defineProperty(_this, \"renderHighlightedNodesFrame\", null);\n _defineProperty(_this, \"needToProcess\", false);\n _defineProperty(_this, \"checkEdgesEventsFrame\", null);\n // Programs\n _defineProperty(_this, \"nodePrograms\", {});\n _defineProperty(_this, \"nodeHoverPrograms\", {});\n _defineProperty(_this, \"edgePrograms\", {});\n _this.settings = resolveSettings(settings);\n\n // Validating\n validateSettings(_this.settings);\n validateGraph(graph);\n if (!(container instanceof HTMLElement)) throw new Error(\"Sigma: container should be an html element.\");\n\n // Properties\n _this.graph = graph;\n _this.container = container;\n\n // Initializing contexts\n _this.createWebGLContext(\"edges\", {\n picking: settings.enableEdgeEvents\n });\n _this.createCanvasContext(\"edgeLabels\");\n _this.createWebGLContext(\"nodes\", {\n picking: true\n });\n _this.createCanvasContext(\"labels\");\n _this.createCanvasContext(\"hovers\");\n _this.createWebGLContext(\"hoverNodes\");\n _this.createCanvasContext(\"mouse\", {\n style: {\n touchAction: \"none\",\n userSelect: \"none\"\n }\n });\n\n // Initial resize\n _this.resize();\n\n // Loading programs\n for (var type in _this.settings.nodeProgramClasses) {\n _this.registerNodeProgram(type, _this.settings.nodeProgramClasses[type], _this.settings.nodeHoverProgramClasses[type]);\n }\n for (var _type in _this.settings.edgeProgramClasses) {\n _this.registerEdgeProgram(_type, _this.settings.edgeProgramClasses[_type]);\n }\n\n // Initializing the camera\n _this.camera = new Camera();\n\n // Binding camera events\n _this.bindCameraHandlers();\n\n // Initializing captors\n _this.mouseCaptor = new MouseCaptor(_this.elements.mouse, _this);\n _this.mouseCaptor.setSettings(_this.settings);\n _this.touchCaptor = new TouchCaptor(_this.elements.mouse, _this);\n _this.touchCaptor.setSettings(_this.settings);\n\n // Binding event handlers\n _this.bindEventHandlers();\n\n // Binding graph handlers\n _this.bindGraphHandlers();\n\n // Trigger eventual settings-related things\n _this.handleSettingsUpdate();\n\n // Processing data for the first time & render\n _this.refresh();\n return _this;\n }\n\n /**---------------------------------------------------------------------------\n * Internal methods.\n **---------------------------------------------------------------------------\n */\n\n /**\n * Internal function used to register a node program\n *\n * @param {string} key - The program's key, matching the related nodes \"type\" values.\n * @param {NodeProgramType} NodeProgramClass - A nodes program class.\n * @param {NodeProgramType?} NodeHoverProgram - A nodes program class to render hovered nodes (optional).\n * @return {Sigma}\n */\n _inherits(Sigma, _TypedEventEmitter);\n return _createClass(Sigma, [{\n key: \"registerNodeProgram\",\n value: function registerNodeProgram(key, NodeProgramClass, NodeHoverProgram) {\n if (this.nodePrograms[key]) this.nodePrograms[key].kill();\n if (this.nodeHoverPrograms[key]) this.nodeHoverPrograms[key].kill();\n this.nodePrograms[key] = new NodeProgramClass(this.webGLContexts.nodes, this.frameBuffers.nodes, this);\n this.nodeHoverPrograms[key] = new (NodeHoverProgram || NodeProgramClass)(this.webGLContexts.hoverNodes, null, this);\n return this;\n }\n\n /**\n * Internal function used to register an edge program\n *\n * @param {string} key - The program's key, matching the related edges \"type\" values.\n * @param {EdgeProgramType} EdgeProgramClass - An edges program class.\n * @return {Sigma}\n */\n }, {\n key: \"registerEdgeProgram\",\n value: function registerEdgeProgram(key, EdgeProgramClass) {\n if (this.edgePrograms[key]) this.edgePrograms[key].kill();\n this.edgePrograms[key] = new EdgeProgramClass(this.webGLContexts.edges, this.frameBuffers.edges, this);\n return this;\n }\n\n /**\n * Internal function used to unregister a node program\n *\n * @param {string} key - The program's key, matching the related nodes \"type\" values.\n * @return {Sigma}\n */\n }, {\n key: \"unregisterNodeProgram\",\n value: function unregisterNodeProgram(key) {\n if (this.nodePrograms[key]) {\n var _this$nodePrograms = this.nodePrograms,\n program = _this$nodePrograms[key],\n programs = _objectWithoutProperties(_this$nodePrograms, [key].map(_toPropertyKey));\n program.kill();\n this.nodePrograms = programs;\n }\n if (this.nodeHoverPrograms[key]) {\n var _this$nodeHoverProgra = this.nodeHoverPrograms,\n _program = _this$nodeHoverProgra[key],\n _programs = _objectWithoutProperties(_this$nodeHoverProgra, [key].map(_toPropertyKey));\n _program.kill();\n this.nodePrograms = _programs;\n }\n return this;\n }\n\n /**\n * Internal function used to unregister an edge program\n *\n * @param {string} key - The program's key, matching the related edges \"type\" values.\n * @return {Sigma}\n */\n }, {\n key: \"unregisterEdgeProgram\",\n value: function unregisterEdgeProgram(key) {\n if (this.edgePrograms[key]) {\n var _this$edgePrograms = this.edgePrograms,\n program = _this$edgePrograms[key],\n programs = _objectWithoutProperties(_this$edgePrograms, [key].map(_toPropertyKey));\n program.kill();\n this.edgePrograms = programs;\n }\n return this;\n }\n\n /**\n * Method (re)binding WebGL texture (for picking).\n *\n * @return {Sigma}\n */\n }, {\n key: \"resetWebGLTexture\",\n value: function resetWebGLTexture(id) {\n var gl = this.webGLContexts[id];\n var frameBuffer = this.frameBuffers[id];\n var currentTexture = this.textures[id];\n if (currentTexture) gl.deleteTexture(currentTexture);\n var pickingTexture = gl.createTexture();\n gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);\n gl.bindTexture(gl.TEXTURE_2D, pickingTexture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, pickingTexture, 0);\n this.textures[id] = pickingTexture;\n return this;\n }\n\n /**\n * Method binding camera handlers.\n *\n * @return {Sigma}\n */\n }, {\n key: \"bindCameraHandlers\",\n value: function bindCameraHandlers() {\n var _this2 = this;\n this.activeListeners.camera = function () {\n _this2.scheduleRender();\n };\n this.camera.on(\"updated\", this.activeListeners.camera);\n return this;\n }\n\n /**\n * Method unbinding camera handlers.\n *\n * @return {Sigma}\n */\n }, {\n key: \"unbindCameraHandlers\",\n value: function unbindCameraHandlers() {\n this.camera.removeListener(\"updated\", this.activeListeners.camera);\n return this;\n }\n\n /**\n * Method that returns the closest node to a given position.\n */\n }, {\n key: \"getNodeAtPosition\",\n value: function getNodeAtPosition(position) {\n var x = position.x,\n y = position.y;\n var color = getPixelColor(this.webGLContexts.nodes, this.frameBuffers.nodes, x, y, this.pixelRatio, this.pickingDownSizingRatio);\n var index = colorToIndex.apply(void 0, _toConsumableArray(color));\n var itemAt = this.itemIDsIndex[index];\n return itemAt && itemAt.type === \"node\" ? itemAt.id : null;\n }\n\n /**\n * Method binding event handlers.\n *\n * @return {Sigma}\n */\n }, {\n key: \"bindEventHandlers\",\n value: function bindEventHandlers() {\n var _this3 = this;\n // Handling window resize\n this.activeListeners.handleResize = function () {\n // need to call a refresh to rebuild the labelgrid\n _this3.scheduleRefresh();\n };\n window.addEventListener(\"resize\", this.activeListeners.handleResize);\n\n // Handling mouse move\n this.activeListeners.handleMove = function (e) {\n var event = cleanMouseCoords(e);\n var baseEvent = {\n event: event,\n preventSigmaDefault: function preventSigmaDefault() {\n event.preventSigmaDefault();\n }\n };\n var nodeToHover = _this3.getNodeAtPosition(event);\n if (nodeToHover && _this3.hoveredNode !== nodeToHover && !_this3.nodeDataCache[nodeToHover].hidden) {\n // Handling passing from one node to the other directly\n if (_this3.hoveredNode) _this3.emit(\"leaveNode\", _objectSpread2(_objectSpread2({}, baseEvent), {}, {\n node: _this3.hoveredNode\n }));\n _this3.hoveredNode = nodeToHover;\n _this3.emit(\"enterNode\", _objectSpread2(_objectSpread2({}, baseEvent), {}, {\n node: nodeToHover\n }));\n _this3.scheduleHighlightedNodesRender();\n return;\n }\n\n // Checking if the hovered node is still hovered\n if (_this3.hoveredNode) {\n if (_this3.getNodeAtPosition(event) !== _this3.hoveredNode) {\n var node = _this3.hoveredNode;\n _this3.hoveredNode = null;\n _this3.emit(\"leaveNode\", _objectSpread2(_objectSpread2({}, baseEvent), {}, {\n node: node\n }));\n _this3.scheduleHighlightedNodesRender();\n return;\n }\n }\n if (_this3.settings.enableEdgeEvents) {\n var edgeToHover = _this3.hoveredNode ? null : _this3.getEdgeAtPoint(baseEvent.event.x, baseEvent.event.y);\n if (edgeToHover !== _this3.hoveredEdge) {\n if (_this3.hoveredEdge) _this3.emit(\"leaveEdge\", _objectSpread2(_objectSpread2({}, baseEvent), {}, {\n edge: _this3.hoveredEdge\n }));\n if (edgeToHover) _this3.emit(\"enterEdge\", _objectSpread2(_objectSpread2({}, baseEvent), {}, {\n edge: edgeToHover\n }));\n _this3.hoveredEdge = edgeToHover;\n }\n }\n };\n\n // Handling mouse move over body (only to dispatch the proper event):\n this.activeListeners.handleMoveBody = function (e) {\n var event = cleanMouseCoords(e);\n _this3.emit(\"moveBody\", {\n event: event,\n preventSigmaDefault: function preventSigmaDefault() {\n event.preventSigmaDefault();\n }\n });\n };\n\n // Handling mouse leave stage:\n this.activeListeners.handleLeave = function (e) {\n var event = cleanMouseCoords(e);\n var baseEvent = {\n event: event,\n preventSigmaDefault: function preventSigmaDefault() {\n event.preventSigmaDefault();\n }\n };\n if (_this3.hoveredNode) {\n _this3.emit(\"leaveNode\", _objectSpread2(_objectSpread2({}, baseEvent), {}, {\n node: _this3.hoveredNode\n }));\n _this3.scheduleHighlightedNodesRender();\n }\n if (_this3.settings.enableEdgeEvents && _this3.hoveredEdge) {\n _this3.emit(\"leaveEdge\", _objectSpread2(_objectSpread2({}, baseEvent), {}, {\n edge: _this3.hoveredEdge\n }));\n _this3.scheduleHighlightedNodesRender();\n }\n _this3.emit(\"leaveStage\", _objectSpread2({}, baseEvent));\n };\n\n // Handling mouse enter stage:\n this.activeListeners.handleEnter = function (e) {\n var event = cleanMouseCoords(e);\n var baseEvent = {\n event: event,\n preventSigmaDefault: function preventSigmaDefault() {\n event.preventSigmaDefault();\n }\n };\n _this3.emit(\"enterStage\", _objectSpread2({}, baseEvent));\n };\n\n // Handling click\n var createInteractionListener = function createInteractionListener(eventType) {\n return function (e) {\n var event = cleanMouseCoords(e);\n var baseEvent = {\n event: event,\n preventSigmaDefault: function preventSigmaDefault() {\n event.preventSigmaDefault();\n }\n };\n var nodeAtPosition = _this3.getNodeAtPosition(event);\n if (nodeAtPosition) return _this3.emit(\"\".concat(eventType, \"Node\"), _objectSpread2(_objectSpread2({}, baseEvent), {}, {\n node: nodeAtPosition\n }));\n if (_this3.settings.enableEdgeEvents) {\n var edge = _this3.getEdgeAtPoint(event.x, event.y);\n if (edge) return _this3.emit(\"\".concat(eventType, \"Edge\"), _objectSpread2(_objectSpread2({}, baseEvent), {}, {\n edge: edge\n }));\n }\n return _this3.emit(\"\".concat(eventType, \"Stage\"), baseEvent);\n };\n };\n this.activeListeners.handleClick = createInteractionListener(\"click\");\n this.activeListeners.handleRightClick = createInteractionListener(\"rightClick\");\n this.activeListeners.handleDoubleClick = createInteractionListener(\"doubleClick\");\n this.activeListeners.handleWheel = createInteractionListener(\"wheel\");\n this.activeListeners.handleDown = createInteractionListener(\"down\");\n this.activeListeners.handleUp = createInteractionListener(\"up\");\n this.mouseCaptor.on(\"mousemove\", this.activeListeners.handleMove);\n this.mouseCaptor.on(\"mousemovebody\", this.activeListeners.handleMoveBody);\n this.mouseCaptor.on(\"click\", this.activeListeners.handleClick);\n this.mouseCaptor.on(\"rightClick\", this.activeListeners.handleRightClick);\n this.mouseCaptor.on(\"doubleClick\", this.activeListeners.handleDoubleClick);\n this.mouseCaptor.on(\"wheel\", this.activeListeners.handleWheel);\n this.mouseCaptor.on(\"mousedown\", this.activeListeners.handleDown);\n this.mouseCaptor.on(\"mouseup\", this.activeListeners.handleUp);\n this.mouseCaptor.on(\"mouseleave\", this.activeListeners.handleLeave);\n this.mouseCaptor.on(\"mouseenter\", this.activeListeners.handleEnter);\n this.touchCaptor.on(\"touchdown\", this.activeListeners.handleDown);\n this.touchCaptor.on(\"touchdown\", this.activeListeners.handleMove);\n this.touchCaptor.on(\"touchup\", this.activeListeners.handleUp);\n this.touchCaptor.on(\"touchmove\", this.activeListeners.handleMove);\n this.touchCaptor.on(\"tap\", this.activeListeners.handleClick);\n this.touchCaptor.on(\"doubletap\", this.activeListeners.handleDoubleClick);\n this.touchCaptor.on(\"touchmove\", this.activeListeners.handleMoveBody);\n return this;\n }\n\n /**\n * Method binding graph handlers\n *\n * @return {Sigma}\n */\n }, {\n key: \"bindGraphHandlers\",\n value: function bindGraphHandlers() {\n var _this4 = this;\n var graph = this.graph;\n var LAYOUT_IMPACTING_FIELDS = new Set([\"x\", \"y\", \"zIndex\", \"type\"]);\n this.activeListeners.eachNodeAttributesUpdatedGraphUpdate = function (e) {\n var _e$hints;\n var updatedFields = (_e$hints = e.hints) === null || _e$hints === void 0 ? void 0 : _e$hints.attributes;\n // we process all nodes\n _this4.graph.forEachNode(function (node) {\n return _this4.updateNode(node);\n });\n\n // if coord, type or zIndex have changed, we need to schedule a render\n // (zIndex for the programIndex)\n var layoutChanged = !updatedFields || updatedFields.some(function (f) {\n return LAYOUT_IMPACTING_FIELDS.has(f);\n });\n _this4.refresh({\n partialGraph: {\n nodes: graph.nodes()\n },\n skipIndexation: !layoutChanged,\n schedule: true\n });\n };\n this.activeListeners.eachEdgeAttributesUpdatedGraphUpdate = function (e) {\n var _e$hints2;\n var updatedFields = (_e$hints2 = e.hints) === null || _e$hints2 === void 0 ? void 0 : _e$hints2.attributes;\n // we process all edges\n _this4.graph.forEachEdge(function (edge) {\n return _this4.updateEdge(edge);\n });\n var layoutChanged = updatedFields && [\"zIndex\", \"type\"].some(function (f) {\n return updatedFields === null || updatedFields === void 0 ? void 0 : updatedFields.includes(f);\n });\n _this4.refresh({\n partialGraph: {\n edges: graph.edges()\n },\n skipIndexation: !layoutChanged,\n schedule: true\n });\n };\n\n // On add node, we add the node in indices and then call for a render\n this.activeListeners.addNodeGraphUpdate = function (payload) {\n var node = payload.key;\n // we process the node\n _this4.addNode(node);\n // schedule a render for the node\n _this4.refresh({\n partialGraph: {\n nodes: [node]\n },\n skipIndexation: false,\n schedule: true\n });\n };\n\n // On update node, we update indices and then call for a render\n this.activeListeners.updateNodeGraphUpdate = function (payload) {\n var node = payload.key;\n // schedule a render for the node\n _this4.refresh({\n partialGraph: {\n nodes: [node]\n },\n skipIndexation: false,\n schedule: true\n });\n };\n\n // On drop node, we remove the node from indices and then call for a refresh\n this.activeListeners.dropNodeGraphUpdate = function (payload) {\n var node = payload.key;\n // we process the node\n _this4.removeNode(node);\n // schedule a render for everything\n _this4.refresh({\n schedule: true\n });\n };\n\n // On add edge, we remove the edge from indices and then call for a refresh\n this.activeListeners.addEdgeGraphUpdate = function (payload) {\n var edge = payload.key;\n // we process the edge\n _this4.addEdge(edge);\n // schedule a render for the edge\n _this4.refresh({\n partialGraph: {\n edges: [edge]\n },\n schedule: true\n });\n };\n\n // On update edge, we update indices and then call for a refresh\n this.activeListeners.updateEdgeGraphUpdate = function (payload) {\n var edge = payload.key;\n // schedule a repaint for the edge\n _this4.refresh({\n partialGraph: {\n edges: [edge]\n },\n skipIndexation: false,\n schedule: true\n });\n };\n\n // On drop edge, we remove the edge from indices and then call for a refresh\n this.activeListeners.dropEdgeGraphUpdate = function (payload) {\n var edge = payload.key;\n // we process the edge\n _this4.removeEdge(edge);\n // schedule a render for all edges\n _this4.refresh({\n schedule: true\n });\n };\n\n // On clear edges, we clear the edge indices and then call for a refresh\n this.activeListeners.clearEdgesGraphUpdate = function () {\n // we clear the edge data structures\n _this4.clearEdgeState();\n _this4.clearEdgeIndices();\n // schedule a render for all edges\n _this4.refresh({\n schedule: true\n });\n };\n\n // On graph clear, we clear indices and then call for a refresh\n this.activeListeners.clearGraphUpdate = function () {\n // clear graph state\n _this4.clearEdgeState();\n _this4.clearNodeState();\n\n // clear graph indices\n _this4.clearEdgeIndices();\n _this4.clearNodeIndices();\n\n // schedule a render for all\n _this4.refresh({\n schedule: true\n });\n };\n graph.on(\"nodeAdded\", this.activeListeners.addNodeGraphUpdate);\n graph.on(\"nodeDropped\", this.activeListeners.dropNodeGraphUpdate);\n graph.on(\"nodeAttributesUpdated\", this.activeListeners.updateNodeGraphUpdate);\n graph.on(\"eachNodeAttributesUpdated\", this.activeListeners.eachNodeAttributesUpdatedGraphUpdate);\n graph.on(\"edgeAdded\", this.activeListeners.addEdgeGraphUpdate);\n graph.on(\"edgeDropped\", this.activeListeners.dropEdgeGraphUpdate);\n graph.on(\"edgeAttributesUpdated\", this.activeListeners.updateEdgeGraphUpdate);\n graph.on(\"eachEdgeAttributesUpdated\", this.activeListeners.eachEdgeAttributesUpdatedGraphUpdate);\n graph.on(\"edgesCleared\", this.activeListeners.clearEdgesGraphUpdate);\n graph.on(\"cleared\", this.activeListeners.clearGraphUpdate);\n return this;\n }\n\n /**\n * Method used to unbind handlers from the graph.\n *\n * @return {undefined}\n */\n }, {\n key: \"unbindGraphHandlers\",\n value: function unbindGraphHandlers() {\n var graph = this.graph;\n graph.removeListener(\"nodeAdded\", this.activeListeners.addNodeGraphUpdate);\n graph.removeListener(\"nodeDropped\", this.activeListeners.dropNodeGraphUpdate);\n graph.removeListener(\"nodeAttributesUpdated\", this.activeListeners.updateNodeGraphUpdate);\n graph.removeListener(\"eachNodeAttributesUpdated\", this.activeListeners.eachNodeAttributesUpdatedGraphUpdate);\n graph.removeListener(\"edgeAdded\", this.activeListeners.addEdgeGraphUpdate);\n graph.removeListener(\"edgeDropped\", this.activeListeners.dropEdgeGraphUpdate);\n graph.removeListener(\"edgeAttributesUpdated\", this.activeListeners.updateEdgeGraphUpdate);\n graph.removeListener(\"eachEdgeAttributesUpdated\", this.activeListeners.eachEdgeAttributesUpdatedGraphUpdate);\n graph.removeListener(\"edgesCleared\", this.activeListeners.clearEdgesGraphUpdate);\n graph.removeListener(\"cleared\", this.activeListeners.clearGraphUpdate);\n }\n\n /**\n * Method looking for an edge colliding with a given point at (x, y). Returns\n * the key of the edge if any, or null else.\n */\n }, {\n key: \"getEdgeAtPoint\",\n value: function getEdgeAtPoint(x, y) {\n var color = getPixelColor(this.webGLContexts.edges, this.frameBuffers.edges, x, y, this.pixelRatio, this.pickingDownSizingRatio);\n var index = colorToIndex.apply(void 0, _toConsumableArray(color));\n var itemAt = this.itemIDsIndex[index];\n return itemAt && itemAt.type === \"edge\" ? itemAt.id : null;\n }\n\n /**\n * Method used to process the whole graph's data.\n * - extent\n * - normalizationFunction\n * - compute node's coordinate\n * - labelgrid\n * - program data allocation\n * @return {Sigma}\n */\n }, {\n key: \"process\",\n value: function process() {\n var _this5 = this;\n this.emit(\"beforeProcess\");\n var graph = this.graph;\n var settings = this.settings;\n var dimensions = this.getDimensions();\n\n //\n // NODES\n //\n this.nodeExtent = graphExtent(this.graph);\n if (!this.settings.autoRescale) {\n var width = dimensions.width,\n height = dimensions.height;\n var _this$nodeExtent = this.nodeExtent,\n x = _this$nodeExtent.x,\n y = _this$nodeExtent.y;\n this.nodeExtent = {\n x: [(x[0] + x[1]) / 2 - width / 2, (x[0] + x[1]) / 2 + width / 2],\n y: [(y[0] + y[1]) / 2 - height / 2, (y[0] + y[1]) / 2 + height / 2]\n };\n }\n this.normalizationFunction = createNormalizationFunction(this.customBBox || this.nodeExtent);\n\n // NOTE: it is important to compute this matrix after computing the node's extent\n // because #.getGraphDimensions relies on it\n var nullCamera = new Camera();\n var nullCameraMatrix = matrixFromCamera(nullCamera.getState(), dimensions, this.getGraphDimensions(), this.getStagePadding());\n // Resetting the label grid\n // TODO: it's probably better to do this explicitly or on resizes for layout and anims\n this.labelGrid.resizeAndClear(dimensions, settings.labelGridCellSize);\n var nodesPerPrograms = {};\n var nodeIndices = {};\n var edgeIndices = {};\n var itemIDsIndex = {};\n var incrID = 1;\n var nodes = graph.nodes();\n\n // Do some indexation on the whole graph\n for (var i = 0, l = nodes.length; i < l; i++) {\n var node = nodes[i];\n var data = this.nodeDataCache[node];\n\n // Get initial coordinates\n var attrs = graph.getNodeAttributes(node);\n data.x = attrs.x;\n data.y = attrs.y;\n this.normalizationFunction.applyTo(data);\n\n // labelgrid\n if (typeof data.label === \"string\" && !data.hidden) this.labelGrid.add(node, data.size, this.framedGraphToViewport(data, {\n matrix: nullCameraMatrix\n }));\n\n // update count per program\n nodesPerPrograms[data.type] = (nodesPerPrograms[data.type] || 0) + 1;\n }\n this.labelGrid.organize();\n\n // Allocate memory to programs\n for (var type in this.nodePrograms) {\n if (!hasOwnProperty.call(this.nodePrograms, type)) {\n throw new Error(\"Sigma: could not find a suitable program for node type \\\"\".concat(type, \"\\\"!\"));\n }\n this.nodePrograms[type].reallocate(nodesPerPrograms[type] || 0);\n // We reset that count here, so that we can reuse it while calling the Program#process methods:\n nodesPerPrograms[type] = 0;\n }\n\n // Order nodes by zIndex before to add them to program\n if (this.settings.zIndex && this.nodeZExtent[0] !== this.nodeZExtent[1]) nodes = zIndexOrdering(this.nodeZExtent, function (node) {\n return _this5.nodeDataCache[node].zIndex;\n }, nodes);\n\n // Add data to programs\n for (var _i = 0, _l = nodes.length; _i < _l; _i++) {\n var _node = nodes[_i];\n nodeIndices[_node] = incrID;\n itemIDsIndex[nodeIndices[_node]] = {\n type: \"node\",\n id: _node\n };\n incrID++;\n var _data = this.nodeDataCache[_node];\n this.addNodeToProgram(_node, nodeIndices[_node], nodesPerPrograms[_data.type]++);\n }\n\n //\n // EDGES\n //\n\n var edgesPerPrograms = {};\n var edges = graph.edges();\n\n // Allocate memory to programs\n for (var _i2 = 0, _l2 = edges.length; _i2 < _l2; _i2++) {\n var edge = edges[_i2];\n var _data2 = this.edgeDataCache[edge];\n edgesPerPrograms[_data2.type] = (edgesPerPrograms[_data2.type] || 0) + 1;\n }\n\n // Order edges by zIndex before to add them to program\n if (this.settings.zIndex && this.edgeZExtent[0] !== this.edgeZExtent[1]) edges = zIndexOrdering(this.edgeZExtent, function (edge) {\n return _this5.edgeDataCache[edge].zIndex;\n }, edges);\n for (var _type2 in this.edgePrograms) {\n if (!hasOwnProperty.call(this.edgePrograms, _type2)) {\n throw new Error(\"Sigma: could not find a suitable program for edge type \\\"\".concat(_type2, \"\\\"!\"));\n }\n this.edgePrograms[_type2].reallocate(edgesPerPrograms[_type2] || 0);\n // We reset that count here, so that we can reuse it while calling the Program#process methods:\n edgesPerPrograms[_type2] = 0;\n }\n\n // Add data to programs\n for (var _i3 = 0, _l3 = edges.length; _i3 < _l3; _i3++) {\n var _edge = edges[_i3];\n edgeIndices[_edge] = incrID;\n itemIDsIndex[edgeIndices[_edge]] = {\n type: \"edge\",\n id: _edge\n };\n incrID++;\n var _data3 = this.edgeDataCache[_edge];\n this.addEdgeToProgram(_edge, edgeIndices[_edge], edgesPerPrograms[_data3.type]++);\n }\n this.itemIDsIndex = itemIDsIndex;\n this.nodeIndices = nodeIndices;\n this.edgeIndices = edgeIndices;\n this.emit(\"afterProcess\");\n return this;\n }\n\n /**\n * Method that backports potential settings updates where it's needed.\n * @private\n */\n }, {\n key: \"handleSettingsUpdate\",\n value: function handleSettingsUpdate(oldSettings) {\n var _this6 = this;\n var settings = this.settings;\n this.camera.minRatio = settings.minCameraRatio;\n this.camera.maxRatio = settings.maxCameraRatio;\n this.camera.enabledZooming = settings.enableCameraZooming;\n this.camera.enabledPanning = settings.enableCameraPanning;\n this.camera.enabledRotation = settings.enableCameraRotation;\n if (settings.cameraPanBoundaries) {\n this.camera.clean = function (state) {\n return _this6.cleanCameraState(state, settings.cameraPanBoundaries && _typeof(settings.cameraPanBoundaries) === \"object\" ? settings.cameraPanBoundaries : {});\n };\n } else {\n this.camera.clean = null;\n }\n this.camera.setState(this.camera.validateState(this.camera.getState()));\n if (oldSettings) {\n // Check edge programs:\n if (oldSettings.edgeProgramClasses !== settings.edgeProgramClasses) {\n for (var type in settings.edgeProgramClasses) {\n if (settings.edgeProgramClasses[type] !== oldSettings.edgeProgramClasses[type]) {\n this.registerEdgeProgram(type, settings.edgeProgramClasses[type]);\n }\n }\n for (var _type3 in oldSettings.edgeProgramClasses) {\n if (!settings.edgeProgramClasses[_type3]) this.unregisterEdgeProgram(_type3);\n }\n }\n\n // Check node programs:\n if (oldSettings.nodeProgramClasses !== settings.nodeProgramClasses || oldSettings.nodeHoverProgramClasses !== settings.nodeHoverProgramClasses) {\n for (var _type4 in settings.nodeProgramClasses) {\n if (settings.nodeProgramClasses[_type4] !== oldSettings.nodeProgramClasses[_type4] || settings.nodeHoverProgramClasses[_type4] !== oldSettings.nodeHoverProgramClasses[_type4]) {\n this.registerNodeProgram(_type4, settings.nodeProgramClasses[_type4], settings.nodeHoverProgramClasses[_type4]);\n }\n }\n for (var _type5 in oldSettings.nodeProgramClasses) {\n if (!settings.nodeProgramClasses[_type5]) this.unregisterNodeProgram(_type5);\n }\n }\n }\n\n // Update captors settings:\n this.mouseCaptor.setSettings(this.settings);\n this.touchCaptor.setSettings(this.settings);\n return this;\n }\n }, {\n key: \"cleanCameraState\",\n value: function cleanCameraState(state) {\n var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n _ref$tolerance = _ref.tolerance,\n tolerance = _ref$tolerance === void 0 ? 0 : _ref$tolerance,\n boundaries = _ref.boundaries;\n var newState = _objectSpread2({}, state);\n\n // Extract necessary properties\n var _ref2 = boundaries || this.nodeExtent,\n _ref2$x = _slicedToArray(_ref2.x, 2),\n xMinGraph = _ref2$x[0],\n xMaxGraph = _ref2$x[1],\n _ref2$y = _slicedToArray(_ref2.y, 2),\n yMinGraph = _ref2$y[0],\n yMaxGraph = _ref2$y[1];\n\n // Transform the four corners of the graph rectangle using the provided camera state\n var corners = [this.graphToViewport({\n x: xMinGraph,\n y: yMinGraph\n }, {\n cameraState: state\n }), this.graphToViewport({\n x: xMaxGraph,\n y: yMinGraph\n }, {\n cameraState: state\n }), this.graphToViewport({\n x: xMinGraph,\n y: yMaxGraph\n }, {\n cameraState: state\n }), this.graphToViewport({\n x: xMaxGraph,\n y: yMaxGraph\n }, {\n cameraState: state\n })];\n\n // Look for new extents, based on these four corners\n var xMin = Infinity,\n xMax = -Infinity,\n yMin = Infinity,\n yMax = -Infinity;\n corners.forEach(function (_ref3) {\n var x = _ref3.x,\n y = _ref3.y;\n xMin = Math.min(xMin, x);\n xMax = Math.max(xMax, x);\n yMin = Math.min(yMin, y);\n yMax = Math.max(yMax, y);\n });\n\n // For each dimension, constraint the smaller element (camera or graph) to fit in the larger one:\n var graphWidth = xMax - xMin;\n var graphHeight = yMax - yMin;\n var _this$getDimensions = this.getDimensions(),\n width = _this$getDimensions.width,\n height = _this$getDimensions.height;\n var dx = 0;\n var dy = 0;\n if (graphWidth >= width) {\n if (xMax < width - tolerance) dx = xMax - (width - tolerance);else if (xMin > tolerance) dx = xMin - tolerance;\n } else {\n if (xMax > width + tolerance) dx = xMax - (width + tolerance);else if (xMin < -tolerance) dx = xMin + tolerance;\n }\n if (graphHeight >= height) {\n if (yMax < height - tolerance) dy = yMax - (height - tolerance);else if (yMin > tolerance) dy = yMin - tolerance;\n } else {\n if (yMax > height + tolerance) dy = yMax - (height + tolerance);else if (yMin < -tolerance) dy = yMin + tolerance;\n }\n if (dx || dy) {\n // Transform [dx, dy] from viewport to graph (using two different point to transform that vector):\n var origin = this.viewportToFramedGraph({\n x: 0,\n y: 0\n }, {\n cameraState: state\n });\n var delta = this.viewportToFramedGraph({\n x: dx,\n y: dy\n }, {\n cameraState: state\n });\n dx = delta.x - origin.x;\n dy = delta.y - origin.y;\n newState.x += dx;\n newState.y += dy;\n }\n return newState;\n }\n\n /**\n * Method used to render labels.\n *\n * @return {Sigma}\n */\n }, {\n key: \"renderLabels\",\n value: function renderLabels() {\n if (!this.settings.renderLabels) return this;\n var cameraState = this.camera.getState();\n\n // Selecting labels to draw\n var labelsToDisplay = this.labelGrid.getLabelsToDisplay(cameraState.ratio, this.settings.labelDensity);\n extend(labelsToDisplay, this.nodesWithForcedLabels);\n this.displayedNodeLabels = new Set();\n\n // Drawing labels\n var context = this.canvasContexts.labels;\n for (var i = 0, l = labelsToDisplay.length; i < l; i++) {\n var node = labelsToDisplay[i];\n var data = this.nodeDataCache[node];\n\n // If the node was already drawn (like if it is eligible AND has\n // `forceLabel`), we don't want to draw it again\n // NOTE: we can do better probably\n if (this.displayedNodeLabels.has(node)) continue;\n\n // If the node is hidden, we don't need to display its label obviously\n if (data.hidden) continue;\n var _this$framedGraphToVi = this.framedGraphToViewport(data),\n x = _this$framedGraphToVi.x,\n y = _this$framedGraphToVi.y;\n\n // NOTE: we can cache the labels we need to render until the camera's ratio changes\n var size = this.scaleSize(data.size);\n\n // Is node big enough?\n if (!data.forceLabel && size < this.settings.labelRenderedSizeThreshold) continue;\n\n // Is node actually on screen (with some margin)\n // NOTE: we used to rely on the quadtree for this, but the coordinates\n // conversion make it unreliable and at that point we already converted\n // to viewport coordinates and since the label grid already culls the\n // number of potential labels to display this looks like a good\n // performance compromise.\n // NOTE: labelGrid.getLabelsToDisplay could probably optimize by not\n // considering cells obviously outside of the range of the current\n // view rectangle.\n if (x < -X_LABEL_MARGIN || x > this.width + X_LABEL_MARGIN || y < -Y_LABEL_MARGIN || y > this.height + Y_LABEL_MARGIN) continue;\n\n // Because displayed edge labels depend directly on actually rendered node\n // labels, we need to only add to this.displayedNodeLabels nodes whose label\n // is rendered.\n // This makes this.displayedNodeLabels depend on viewport, which might become\n // an issue once we start memoizing getLabelsToDisplay.\n this.displayedNodeLabels.add(node);\n var defaultDrawNodeLabel = this.settings.defaultDrawNodeLabel;\n var nodeProgram = this.nodePrograms[data.type];\n var drawLabel = (nodeProgram === null || nodeProgram === void 0 ? void 0 : nodeProgram.drawLabel) || defaultDrawNodeLabel;\n drawLabel(context, _objectSpread2(_objectSpread2({\n key: node\n }, data), {}, {\n size: size,\n x: x,\n y: y\n }), this.settings);\n }\n return this;\n }\n\n /**\n * Method used to render edge labels, based on which node labels were\n * rendered.\n *\n * @return {Sigma}\n */\n }, {\n key: \"renderEdgeLabels\",\n value: function renderEdgeLabels() {\n if (!this.settings.renderEdgeLabels) return this;\n var context = this.canvasContexts.edgeLabels;\n\n // Clearing\n context.clearRect(0, 0, this.width, this.height);\n var edgeLabelsToDisplay = edgeLabelsToDisplayFromNodes({\n graph: this.graph,\n hoveredNode: this.hoveredNode,\n displayedNodeLabels: this.displayedNodeLabels,\n highlightedNodes: this.highlightedNodes\n });\n extend(edgeLabelsToDisplay, this.edgesWithForcedLabels);\n var displayedLabels = new Set();\n for (var i = 0, l = edgeLabelsToDisplay.length; i < l; i++) {\n var edge = edgeLabelsToDisplay[i],\n extremities = this.graph.extremities(edge),\n sourceData = this.nodeDataCache[extremities[0]],\n targetData = this.nodeDataCache[extremities[1]],\n edgeData = this.edgeDataCache[edge];\n\n // If the edge was already drawn (like if it is eligible AND has\n // `forceLabel`), we don't want to draw it again\n if (displayedLabels.has(edge)) continue;\n\n // If the edge is hidden we don't need to display its label\n // NOTE: the test on sourceData & targetData is probably paranoid at this point?\n if (edgeData.hidden || sourceData.hidden || targetData.hidden) {\n continue;\n }\n var defaultDrawEdgeLabel = this.settings.defaultDrawEdgeLabel;\n var edgeProgram = this.edgePrograms[edgeData.type];\n var drawLabel = (edgeProgram === null || edgeProgram === void 0 ? void 0 : edgeProgram.drawLabel) || defaultDrawEdgeLabel;\n drawLabel(context, _objectSpread2(_objectSpread2({\n key: edge\n }, edgeData), {}, {\n size: this.scaleSize(edgeData.size)\n }), _objectSpread2(_objectSpread2(_objectSpread2({\n key: extremities[0]\n }, sourceData), this.framedGraphToViewport(sourceData)), {}, {\n size: this.scaleSize(sourceData.size)\n }), _objectSpread2(_objectSpread2(_objectSpread2({\n key: extremities[1]\n }, targetData), this.framedGraphToViewport(targetData)), {}, {\n size: this.scaleSize(targetData.size)\n }), this.settings);\n displayedLabels.add(edge);\n }\n this.displayedEdgeLabels = displayedLabels;\n return this;\n }\n\n /**\n * Method used to render the highlighted nodes.\n *\n * @return {Sigma}\n */\n }, {\n key: \"renderHighlightedNodes\",\n value: function renderHighlightedNodes() {\n var _this7 = this;\n var context = this.canvasContexts.hovers;\n\n // Clearing\n context.clearRect(0, 0, this.width, this.height);\n\n // Rendering\n var render = function render(node) {\n var data = _this7.nodeDataCache[node];\n var _this7$framedGraphToV = _this7.framedGraphToViewport(data),\n x = _this7$framedGraphToV.x,\n y = _this7$framedGraphToV.y;\n var size = _this7.scaleSize(data.size);\n var defaultDrawNodeHover = _this7.settings.defaultDrawNodeHover;\n var nodeProgram = _this7.nodePrograms[data.type];\n var drawHover = (nodeProgram === null || nodeProgram === void 0 ? void 0 : nodeProgram.drawHover) || defaultDrawNodeHover;\n drawHover(context, _objectSpread2(_objectSpread2({\n key: node\n }, data), {}, {\n size: size,\n x: x,\n y: y\n }), _this7.settings);\n };\n var nodesToRender = [];\n if (this.hoveredNode && !this.nodeDataCache[this.hoveredNode].hidden) {\n nodesToRender.push(this.hoveredNode);\n }\n this.highlightedNodes.forEach(function (node) {\n // The hovered node has already been highlighted\n if (node !== _this7.hoveredNode) nodesToRender.push(node);\n });\n\n // Draw labels:\n nodesToRender.forEach(function (node) {\n return render(node);\n });\n\n // Draw WebGL nodes on top of the labels:\n var nodesPerPrograms = {};\n\n // 1. Count nodes per type:\n nodesToRender.forEach(function (node) {\n var type = _this7.nodeDataCache[node].type;\n nodesPerPrograms[type] = (nodesPerPrograms[type] || 0) + 1;\n });\n // 2. Allocate for each type for the proper number of nodes\n for (var type in this.nodeHoverPrograms) {\n this.nodeHoverPrograms[type].reallocate(nodesPerPrograms[type] || 0);\n // Also reset count, to use when rendering:\n nodesPerPrograms[type] = 0;\n }\n // 3. Process all nodes to render:\n nodesToRender.forEach(function (node) {\n var data = _this7.nodeDataCache[node];\n _this7.nodeHoverPrograms[data.type].process(0, nodesPerPrograms[data.type]++, data);\n });\n // 4. Clear hovered nodes layer:\n this.webGLContexts.hoverNodes.clear(this.webGLContexts.hoverNodes.COLOR_BUFFER_BIT);\n // 5. Render:\n var renderParams = this.getRenderParams();\n for (var _type6 in this.nodeHoverPrograms) {\n var program = this.nodeHoverPrograms[_type6];\n program.render(renderParams);\n }\n }\n\n /**\n * Method used to schedule a hover render.\n *\n */\n }, {\n key: \"scheduleHighlightedNodesRender\",\n value: function scheduleHighlightedNodesRender() {\n var _this8 = this;\n if (this.renderHighlightedNodesFrame || this.renderFrame) return;\n this.renderHighlightedNodesFrame = requestAnimationFrame(function () {\n // Resetting state\n _this8.renderHighlightedNodesFrame = null;\n\n // Rendering\n _this8.renderHighlightedNodes();\n _this8.renderEdgeLabels();\n });\n }\n\n /**\n * Method used to render.\n *\n * @return {Sigma}\n */\n }, {\n key: \"render\",\n value: function render() {\n var _this9 = this;\n this.emit(\"beforeRender\");\n var exitRender = function exitRender() {\n _this9.emit(\"afterRender\");\n return _this9;\n };\n\n // If a render was scheduled, we cancel it\n if (this.renderFrame) {\n cancelAnimationFrame(this.renderFrame);\n this.renderFrame = null;\n }\n\n // First we need to resize\n this.resize();\n\n // Do we need to reprocess data?\n if (this.needToProcess) this.process();\n this.needToProcess = false;\n\n // Clearing the canvases\n this.clear();\n\n // Prepare the textures\n this.pickingLayers.forEach(function (layer) {\n return _this9.resetWebGLTexture(layer);\n });\n\n // If we have no nodes we can stop right there\n if (!this.graph.order) return exitRender();\n\n // TODO: improve this heuristic or move to the captor itself?\n // TODO: deal with the touch captor here as well\n var mouseCaptor = this.mouseCaptor;\n var moving = this.camera.isAnimated() || mouseCaptor.isMoving || mouseCaptor.draggedEvents || mouseCaptor.currentWheelDirection;\n\n // Then we need to extract a matrix from the camera\n var cameraState = this.camera.getState();\n var viewportDimensions = this.getDimensions();\n var graphDimensions = this.getGraphDimensions();\n var padding = this.getStagePadding();\n this.matrix = matrixFromCamera(cameraState, viewportDimensions, graphDimensions, padding);\n this.invMatrix = matrixFromCamera(cameraState, viewportDimensions, graphDimensions, padding, true);\n this.correctionRatio = getMatrixImpact(this.matrix, cameraState, viewportDimensions);\n this.graphToViewportRatio = this.getGraphToViewportRatio();\n\n // [jacomyal]\n // This comment is related to the one above the `getMatrixImpact` definition:\n // - `this.correctionRatio` is somehow not completely explained\n // - `this.graphToViewportRatio` is the ratio of a distance in the viewport divided by the same distance in the\n // graph\n // - `this.normalizationFunction.ratio` is basically `Math.max(graphDX, graphDY)`\n // And now, I observe that if I multiply these three ratios, I have something constant, which value remains 2, even\n // when I change the graph, the viewport or the camera. It might be useful later, so I prefer to let this comment:\n // console.log(this.graphToViewportRatio * this.correctionRatio * this.normalizationFunction.ratio * 2);\n\n var params = this.getRenderParams();\n\n // Drawing nodes\n for (var type in this.nodePrograms) {\n var program = this.nodePrograms[type];\n program.render(params);\n }\n\n // Drawing edges\n if (!this.settings.hideEdgesOnMove || !moving) {\n for (var _type7 in this.edgePrograms) {\n var _program2 = this.edgePrograms[_type7];\n _program2.render(params);\n }\n }\n\n // Do not display labels on move per setting\n if (this.settings.hideLabelsOnMove && moving) return exitRender();\n this.renderLabels();\n this.renderEdgeLabels();\n this.renderHighlightedNodes();\n return exitRender();\n }\n\n /**\n * Add a node in the internal data structures.\n * @private\n * @param key The node's graphology ID\n */\n }, {\n key: \"addNode\",\n value: function addNode(key) {\n // Node display data resolution:\n // 1. First we get the node's attributes\n // 2. We optionally reduce them using the function provided by the user\n // Note that this function must return a total object and won't be merged\n // 3. We apply our defaults, while running some vital checks\n // 4. We apply the normalization function\n // We shallow copy node data to avoid dangerous behaviors from reducers\n var attr = Object.assign({}, this.graph.getNodeAttributes(key));\n if (this.settings.nodeReducer) attr = this.settings.nodeReducer(key, attr);\n var data = applyNodeDefaults(this.settings, key, attr);\n this.nodeDataCache[key] = data;\n\n // Label:\n // We delete and add if needed because this function is also used from\n // update\n this.nodesWithForcedLabels[\"delete\"](key);\n if (data.forceLabel && !data.hidden) this.nodesWithForcedLabels.add(key);\n\n // Highlighted:\n // We remove and re add if needed because this function is also used from\n // update\n this.highlightedNodes[\"delete\"](key);\n if (data.highlighted && !data.hidden) this.highlightedNodes.add(key);\n\n // zIndex\n if (this.settings.zIndex) {\n if (data.zIndex < this.nodeZExtent[0]) this.nodeZExtent[0] = data.zIndex;\n if (data.zIndex > this.nodeZExtent[1]) this.nodeZExtent[1] = data.zIndex;\n }\n }\n\n /**\n * Update a node the internal data structures.\n * @private\n * @param key The node's graphology ID\n */\n }, {\n key: \"updateNode\",\n value: function updateNode(key) {\n this.addNode(key);\n\n // Re-apply normalization on the node\n var data = this.nodeDataCache[key];\n this.normalizationFunction.applyTo(data);\n }\n\n /**\n * Remove a node from the internal data structures.\n * @private\n * @param key The node's graphology ID\n */\n }, {\n key: \"removeNode\",\n value: function removeNode(key) {\n // Remove from node cache\n delete this.nodeDataCache[key];\n // Remove from node program index\n delete this.nodeProgramIndex[key];\n // Remove from higlighted nodes\n this.highlightedNodes[\"delete\"](key);\n // Remove from hovered\n if (this.hoveredNode === key) this.hoveredNode = null;\n // Remove from forced label\n this.nodesWithForcedLabels[\"delete\"](key);\n }\n\n /**\n * Add an edge into the internal data structures.\n * @private\n * @param key The edge's graphology ID\n */\n }, {\n key: \"addEdge\",\n value: function addEdge(key) {\n // Edge display data resolution:\n // 1. First we get the edge's attributes\n // 2. We optionally reduce them using the function provided by the user\n // 3. Note that this function must return a total object and won't be merged\n // 4. We apply our defaults, while running some vital checks\n // We shallow copy edge data to avoid dangerous behaviors from reducers\n var attr = Object.assign({}, this.graph.getEdgeAttributes(key));\n if (this.settings.edgeReducer) attr = this.settings.edgeReducer(key, attr);\n var data = applyEdgeDefaults(this.settings, key, attr);\n this.edgeDataCache[key] = data;\n\n // Forced label\n // we filter and re push if needed because this function is also used from\n // update\n this.edgesWithForcedLabels[\"delete\"](key);\n if (data.forceLabel && !data.hidden) this.edgesWithForcedLabels.add(key);\n\n // Check zIndex\n if (this.settings.zIndex) {\n if (data.zIndex < this.edgeZExtent[0]) this.edgeZExtent[0] = data.zIndex;\n if (data.zIndex > this.edgeZExtent[1]) this.edgeZExtent[1] = data.zIndex;\n }\n }\n\n /**\n * Update an edge in the internal data structures.\n * @private\n * @param key The edge's graphology ID\n */\n }, {\n key: \"updateEdge\",\n value: function updateEdge(key) {\n this.addEdge(key);\n }\n\n /**\n * Remove an edge from the internal data structures.\n * @private\n * @param key The edge's graphology ID\n */\n }, {\n key: \"removeEdge\",\n value: function removeEdge(key) {\n // Remove from edge cache\n delete this.edgeDataCache[key];\n // Remove from programId index\n delete this.edgeProgramIndex[key];\n // Remove from hovered\n if (this.hoveredEdge === key) this.hoveredEdge = null;\n // Remove from forced label\n this.edgesWithForcedLabels[\"delete\"](key);\n }\n\n /**\n * Clear all indices related to nodes.\n * @private\n */\n }, {\n key: \"clearNodeIndices\",\n value: function clearNodeIndices() {\n // LabelGrid & nodeExtent are only manage/populated in the process function\n this.labelGrid = new LabelGrid();\n this.nodeExtent = {\n x: [0, 1],\n y: [0, 1]\n };\n this.nodeDataCache = {};\n this.edgeProgramIndex = {};\n this.nodesWithForcedLabels = new Set();\n this.nodeZExtent = [Infinity, -Infinity];\n this.highlightedNodes = new Set();\n }\n\n /**\n * Clear all indices related to edges.\n * @private\n */\n }, {\n key: \"clearEdgeIndices\",\n value: function clearEdgeIndices() {\n this.edgeDataCache = {};\n this.edgeProgramIndex = {};\n this.edgesWithForcedLabels = new Set();\n this.edgeZExtent = [Infinity, -Infinity];\n }\n\n /**\n * Clear all indices.\n * @private\n */\n }, {\n key: \"clearIndices\",\n value: function clearIndices() {\n this.clearEdgeIndices();\n this.clearNodeIndices();\n }\n\n /**\n * Clear all graph state related to nodes.\n * @private\n */\n }, {\n key: \"clearNodeState\",\n value: function clearNodeState() {\n this.displayedNodeLabels = new Set();\n this.highlightedNodes = new Set();\n this.hoveredNode = null;\n }\n\n /**\n * Clear all graph state related to edges.\n * @private\n */\n }, {\n key: \"clearEdgeState\",\n value: function clearEdgeState() {\n this.displayedEdgeLabels = new Set();\n this.highlightedNodes = new Set();\n this.hoveredEdge = null;\n }\n\n /**\n * Clear all graph state.\n * @private\n */\n }, {\n key: \"clearState\",\n value: function clearState() {\n this.clearEdgeState();\n this.clearNodeState();\n }\n\n /**\n * Add the node data to its program.\n * @private\n * @param node The node's graphology ID\n * @param fingerprint A fingerprint used to identity the node with picking\n * @param position The index where to place the node in the program\n */\n }, {\n key: \"addNodeToProgram\",\n value: function addNodeToProgram(node, fingerprint, position) {\n var data = this.nodeDataCache[node];\n var nodeProgram = this.nodePrograms[data.type];\n if (!nodeProgram) throw new Error(\"Sigma: could not find a suitable program for node type \\\"\".concat(data.type, \"\\\"!\"));\n nodeProgram.process(fingerprint, position, data);\n // Saving program index\n this.nodeProgramIndex[node] = position;\n }\n\n /**\n * Add the edge data to its program.\n * @private\n * @param edge The edge's graphology ID\n * @param fingerprint A fingerprint used to identity the edge with picking\n * @param position The index where to place the edge in the program\n */\n }, {\n key: \"addEdgeToProgram\",\n value: function addEdgeToProgram(edge, fingerprint, position) {\n var data = this.edgeDataCache[edge];\n var edgeProgram = this.edgePrograms[data.type];\n if (!edgeProgram) throw new Error(\"Sigma: could not find a suitable program for edge type \\\"\".concat(data.type, \"\\\"!\"));\n var extremities = this.graph.extremities(edge),\n sourceData = this.nodeDataCache[extremities[0]],\n targetData = this.nodeDataCache[extremities[1]];\n edgeProgram.process(fingerprint, position, sourceData, targetData, data);\n // Saving program index\n this.edgeProgramIndex[edge] = position;\n }\n\n /**---------------------------------------------------------------------------\n * Public API.\n **---------------------------------------------------------------------------\n */\n\n /**\n * Function used to get the render params.\n *\n * @return {RenderParams}\n */\n }, {\n key: \"getRenderParams\",\n value: function getRenderParams() {\n return {\n matrix: this.matrix,\n invMatrix: this.invMatrix,\n width: this.width,\n height: this.height,\n pixelRatio: this.pixelRatio,\n zoomRatio: this.camera.ratio,\n cameraAngle: this.camera.angle,\n sizeRatio: 1 / this.scaleSize(),\n correctionRatio: this.correctionRatio,\n downSizingRatio: this.pickingDownSizingRatio,\n minEdgeThickness: this.settings.minEdgeThickness,\n antiAliasingFeather: this.settings.antiAliasingFeather\n };\n }\n\n /**\n * Function used to retrieve the actual stage padding value.\n *\n * @return {number}\n */\n }, {\n key: \"getStagePadding\",\n value: function getStagePadding() {\n var _this$settings = this.settings,\n stagePadding = _this$settings.stagePadding,\n autoRescale = _this$settings.autoRescale;\n return autoRescale ? stagePadding || 0 : 0;\n }\n\n /**\n * Function used to create a layer element.\n *\n * @param {string} id - Context's id.\n * @param {string} tag - The HTML tag to use.\n * @param options\n * @return {Sigma}\n */\n }, {\n key: \"createLayer\",\n value: function createLayer(id, tag) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n if (this.elements[id]) throw new Error(\"Sigma: a layer named \\\"\".concat(id, \"\\\" already exists\"));\n var element = createElement(tag, {\n position: \"absolute\"\n }, {\n \"class\": \"sigma-\".concat(id)\n });\n if (options.style) Object.assign(element.style, options.style);\n this.elements[id] = element;\n if (\"beforeLayer\" in options && options.beforeLayer) {\n this.elements[options.beforeLayer].before(element);\n } else if (\"afterLayer\" in options && options.afterLayer) {\n this.elements[options.afterLayer].after(element);\n } else {\n this.container.appendChild(element);\n }\n return element;\n }\n\n /**\n * Function used to create a canvas element.\n *\n * @param {string} id - Context's id.\n * @param options\n * @return {Sigma}\n */\n }, {\n key: \"createCanvas\",\n value: function createCanvas(id) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return this.createLayer(id, \"canvas\", options);\n }\n\n /**\n * Function used to create a canvas context and add the relevant DOM elements.\n *\n * @param {string} id - Context's id.\n * @param options\n * @return {Sigma}\n */\n }, {\n key: \"createCanvasContext\",\n value: function createCanvasContext(id) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var canvas = this.createCanvas(id, options);\n var contextOptions = {\n preserveDrawingBuffer: false,\n antialias: false\n };\n this.canvasContexts[id] = canvas.getContext(\"2d\", contextOptions);\n return this;\n }\n\n /**\n * Function used to create a WebGL context and add the relevant DOM\n * elements.\n *\n * @param {string} id - Context's id.\n * @param {object?} options - #getContext params to override (optional)\n * @return {WebGLRenderingContext}\n */\n }, {\n key: \"createWebGLContext\",\n value: function createWebGLContext(id) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var canvas = (options === null || options === void 0 ? void 0 : options.canvas) || this.createCanvas(id, options);\n if (options.hidden) canvas.remove();\n var contextOptions = _objectSpread2({\n preserveDrawingBuffer: false,\n antialias: false\n }, options);\n var context;\n\n // First we try webgl2 for an easy performance boost\n context = canvas.getContext(\"webgl2\", contextOptions);\n\n // Else we fall back to webgl\n if (!context) context = canvas.getContext(\"webgl\", contextOptions);\n\n // Edge, I am looking right at you...\n if (!context) context = canvas.getContext(\"experimental-webgl\", contextOptions);\n var gl = context;\n this.webGLContexts[id] = gl;\n\n // Blending:\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n\n // Prepare frame buffer for picking layers:\n if (options.picking) {\n this.pickingLayers.add(id);\n var newFrameBuffer = gl.createFramebuffer();\n if (!newFrameBuffer) throw new Error(\"Sigma: cannot create a new frame buffer for layer \".concat(id));\n this.frameBuffers[id] = newFrameBuffer;\n }\n return gl;\n }\n\n /**\n * Function used to properly kill a layer.\n *\n * @param {string} id - Layer id.\n * @return {Sigma}\n */\n }, {\n key: \"killLayer\",\n value: function killLayer(id) {\n var element = this.elements[id];\n if (!element) throw new Error(\"Sigma: cannot kill layer \".concat(id, \", which does not exist\"));\n if (this.webGLContexts[id]) {\n var _gl$getExtension;\n var gl = this.webGLContexts[id];\n (_gl$getExtension = gl.getExtension(\"WEBGL_lose_context\")) === null || _gl$getExtension === void 0 || _gl$getExtension.loseContext();\n delete this.webGLContexts[id];\n } else if (this.canvasContexts[id]) {\n delete this.canvasContexts[id];\n }\n\n // Delete layer element\n element.remove();\n delete this.elements[id];\n return this;\n }\n\n /**\n * Method returning the renderer's camera.\n *\n * @return {Camera}\n */\n }, {\n key: \"getCamera\",\n value: function getCamera() {\n return this.camera;\n }\n\n /**\n * Method setting the renderer's camera.\n *\n * @param {Camera} camera - New camera.\n * @return {Sigma}\n */\n }, {\n key: \"setCamera\",\n value: function setCamera(camera) {\n this.unbindCameraHandlers();\n this.camera = camera;\n this.bindCameraHandlers();\n }\n\n /**\n * Method returning the container DOM element.\n *\n * @return {HTMLElement}\n */\n }, {\n key: \"getContainer\",\n value: function getContainer() {\n return this.container;\n }\n\n /**\n * Method returning the renderer's graph.\n *\n * @return {Graph}\n */\n }, {\n key: \"getGraph\",\n value: function getGraph() {\n return this.graph;\n }\n\n /**\n * Method used to set the renderer's graph.\n *\n * @return {Graph}\n */\n }, {\n key: \"setGraph\",\n value: function setGraph(graph) {\n if (graph === this.graph) return;\n\n // Check hoveredNode and hoveredEdge\n if (this.hoveredNode && !graph.hasNode(this.hoveredNode)) this.hoveredNode = null;\n if (this.hoveredEdge && !graph.hasEdge(this.hoveredEdge)) this.hoveredEdge = null;\n\n // Unbinding handlers on the current graph\n this.unbindGraphHandlers();\n if (this.checkEdgesEventsFrame !== null) {\n cancelAnimationFrame(this.checkEdgesEventsFrame);\n this.checkEdgesEventsFrame = null;\n }\n\n // Installing new graph\n this.graph = graph;\n\n // Binding new handlers\n this.bindGraphHandlers();\n\n // Re-rendering now to avoid discrepancies from now to next frame\n this.refresh();\n }\n\n /**\n * Method returning the mouse captor.\n *\n * @return {MouseCaptor}\n */\n }, {\n key: \"getMouseCaptor\",\n value: function getMouseCaptor() {\n return this.mouseCaptor;\n }\n\n /**\n * Method returning the touch captor.\n *\n * @return {TouchCaptor}\n */\n }, {\n key: \"getTouchCaptor\",\n value: function getTouchCaptor() {\n return this.touchCaptor;\n }\n\n /**\n * Method returning the current renderer's dimensions.\n *\n * @return {Dimensions}\n */\n }, {\n key: \"getDimensions\",\n value: function getDimensions() {\n return {\n width: this.width,\n height: this.height\n };\n }\n\n /**\n * Method returning the current graph's dimensions.\n *\n * @return {Dimensions}\n */\n }, {\n key: \"getGraphDimensions\",\n value: function getGraphDimensions() {\n var extent = this.customBBox || this.nodeExtent;\n return {\n width: extent.x[1] - extent.x[0] || 1,\n height: extent.y[1] - extent.y[0] || 1\n };\n }\n\n /**\n * Method used to get all the sigma node attributes.\n * It's useful for example to get the position of a node\n * and to get values that are set by the nodeReducer\n *\n * @param {string} key - The node's key.\n * @return {NodeDisplayData | undefined} A copy of the desired node's attribute or undefined if not found\n */\n }, {\n key: \"getNodeDisplayData\",\n value: function getNodeDisplayData(key) {\n var node = this.nodeDataCache[key];\n return node ? Object.assign({}, node) : undefined;\n }\n\n /**\n * Method used to get all the sigma edge attributes.\n * It's useful for example to get values that are set by the edgeReducer.\n *\n * @param {string} key - The edge's key.\n * @return {EdgeDisplayData | undefined} A copy of the desired edge's attribute or undefined if not found\n */\n }, {\n key: \"getEdgeDisplayData\",\n value: function getEdgeDisplayData(key) {\n var edge = this.edgeDataCache[key];\n return edge ? Object.assign({}, edge) : undefined;\n }\n\n /**\n * Method used to get the set of currently displayed node labels.\n *\n * @return {Set<string>} A set of node keys whose label is displayed.\n */\n }, {\n key: \"getNodeDisplayedLabels\",\n value: function getNodeDisplayedLabels() {\n return new Set(this.displayedNodeLabels);\n }\n\n /**\n * Method used to get the set of currently displayed edge labels.\n *\n * @return {Set<string>} A set of edge keys whose label is displayed.\n */\n }, {\n key: \"getEdgeDisplayedLabels\",\n value: function getEdgeDisplayedLabels() {\n return new Set(this.displayedEdgeLabels);\n }\n\n /**\n * Method returning a copy of the settings collection.\n *\n * @return {Settings} A copy of the settings collection.\n */\n }, {\n key: \"getSettings\",\n value: function getSettings() {\n return _objectSpread2({}, this.settings);\n }\n\n /**\n * Method returning the current value for a given setting key.\n *\n * @param {string} key - The setting key to get.\n * @return {any} The value attached to this setting key or undefined if not found\n */\n }, {\n key: \"getSetting\",\n value: function getSetting(key) {\n return this.settings[key];\n }\n\n /**\n * Method setting the value of a given setting key. Note that this will schedule\n * a new render next frame.\n *\n * @param {string} key - The setting key to set.\n * @param {any} value - The value to set.\n * @return {Sigma}\n */\n }, {\n key: \"setSetting\",\n value: function setSetting(key, value) {\n var oldValues = _objectSpread2({}, this.settings);\n this.settings[key] = value;\n validateSettings(this.settings);\n this.handleSettingsUpdate(oldValues);\n this.scheduleRefresh();\n return this;\n }\n\n /**\n * Method updating the value of a given setting key using the provided function.\n * Note that this will schedule a new render next frame.\n *\n * @param {string} key - The setting key to set.\n * @param {function} updater - The update function.\n * @return {Sigma}\n */\n }, {\n key: \"updateSetting\",\n value: function updateSetting(key, updater) {\n this.setSetting(key, updater(this.settings[key]));\n return this;\n }\n\n /**\n * Method setting multiple settings at once.\n *\n * @param {Partial<Settings>} settings - The settings to set.\n * @return {Sigma}\n */\n }, {\n key: \"setSettings\",\n value: function setSettings(settings) {\n var oldValues = _objectSpread2({}, this.settings);\n this.settings = _objectSpread2(_objectSpread2({}, this.settings), settings);\n validateSettings(this.settings);\n this.handleSettingsUpdate(oldValues);\n this.scheduleRefresh();\n return this;\n }\n\n /**\n * Method used to resize the renderer.\n *\n * @param {boolean} force - If true, then resize is processed even if size is unchanged (optional).\n * @return {Sigma}\n */\n }, {\n key: \"resize\",\n value: function resize(force) {\n var previousWidth = this.width,\n previousHeight = this.height;\n this.width = this.container.offsetWidth;\n this.height = this.container.offsetHeight;\n this.pixelRatio = getPixelRatio();\n if (this.width === 0) {\n if (this.settings.allowInvalidContainer) this.width = 1;else throw new Error(\"Sigma: Container has no width. You can set the allowInvalidContainer setting to true to stop seeing this error.\");\n }\n if (this.height === 0) {\n if (this.settings.allowInvalidContainer) this.height = 1;else throw new Error(\"Sigma: Container has no height. You can set the allowInvalidContainer setting to true to stop seeing this error.\");\n }\n\n // If nothing has changed, we can stop right here\n if (!force && previousWidth === this.width && previousHeight === this.height) return this;\n\n // Sizing dom elements\n for (var id in this.elements) {\n var element = this.elements[id];\n element.style.width = this.width + \"px\";\n element.style.height = this.height + \"px\";\n }\n\n // Sizing canvas contexts\n for (var _id in this.canvasContexts) {\n this.elements[_id].setAttribute(\"width\", this.width * this.pixelRatio + \"px\");\n this.elements[_id].setAttribute(\"height\", this.height * this.pixelRatio + \"px\");\n if (this.pixelRatio !== 1) this.canvasContexts[_id].scale(this.pixelRatio, this.pixelRatio);\n }\n\n // Sizing WebGL contexts\n for (var _id2 in this.webGLContexts) {\n this.elements[_id2].setAttribute(\"width\", this.width * this.pixelRatio + \"px\");\n this.elements[_id2].setAttribute(\"height\", this.height * this.pixelRatio + \"px\");\n var gl = this.webGLContexts[_id2];\n gl.viewport(0, 0, this.width * this.pixelRatio, this.height * this.pixelRatio);\n\n // Clear picking texture if needed\n if (this.pickingLayers.has(_id2)) {\n var currentTexture = this.textures[_id2];\n if (currentTexture) gl.deleteTexture(currentTexture);\n }\n }\n this.emit(\"resize\");\n return this;\n }\n\n /**\n * Method used to clear all the canvases.\n *\n * @return {Sigma}\n */\n }, {\n key: \"clear\",\n value: function clear() {\n this.emit(\"beforeClear\");\n this.webGLContexts.nodes.bindFramebuffer(WebGLRenderingContext.FRAMEBUFFER, null);\n this.webGLContexts.nodes.clear(WebGLRenderingContext.COLOR_BUFFER_BIT);\n this.webGLContexts.edges.bindFramebuffer(WebGLRenderingContext.FRAMEBUFFER, null);\n this.webGLContexts.edges.clear(WebGLRenderingContext.COLOR_BUFFER_BIT);\n this.webGLContexts.hoverNodes.clear(WebGLRenderingContext.COLOR_BUFFER_BIT);\n this.canvasContexts.labels.clearRect(0, 0, this.width, this.height);\n this.canvasContexts.hovers.clearRect(0, 0, this.width, this.height);\n this.canvasContexts.edgeLabels.clearRect(0, 0, this.width, this.height);\n this.emit(\"afterClear\");\n return this;\n }\n\n /**\n * Method used to refresh, i.e. force the renderer to reprocess graph\n * data and render, but keep the state.\n * - if a partialGraph is provided, we only reprocess those nodes & edges.\n * - if schedule is TRUE, we schedule a render instead of sync render\n * - if skipIndexation is TRUE, then labelGrid & program indexation are skipped (can be used if you haven't modify x, y, zIndex & size)\n *\n * @return {Sigma}\n */\n }, {\n key: \"refresh\",\n value: function refresh(opts) {\n var _this10 = this;\n var skipIndexation = (opts === null || opts === void 0 ? void 0 : opts.skipIndexation) !== undefined ? opts === null || opts === void 0 ? void 0 : opts.skipIndexation : false;\n var schedule = (opts === null || opts === void 0 ? void 0 : opts.schedule) !== undefined ? opts.schedule : false;\n var fullRefresh = !opts || !opts.partialGraph;\n if (fullRefresh) {\n // Re-index graph data\n this.clearEdgeIndices();\n this.clearNodeIndices();\n this.graph.forEachNode(function (node) {\n return _this10.addNode(node);\n });\n this.graph.forEachEdge(function (edge) {\n return _this10.addEdge(edge);\n });\n } else {\n var _opts$partialGraph, _opts$partialGraph2;\n var nodes = ((_opts$partialGraph = opts.partialGraph) === null || _opts$partialGraph === void 0 ? void 0 : _opts$partialGraph.nodes) || [];\n for (var i = 0, l = (nodes === null || nodes === void 0 ? void 0 : nodes.length) || 0; i < l; i++) {\n var node = nodes[i];\n // Recompute node's data (ie. apply reducer)\n this.updateNode(node);\n // Add node to the program if layout is unchanged.\n // otherwise it will be done in the process function\n if (skipIndexation) {\n var programIndex = this.nodeProgramIndex[node];\n if (programIndex === undefined) throw new Error(\"Sigma: node \\\"\".concat(node, \"\\\" can't be repaint\"));\n this.addNodeToProgram(node, this.nodeIndices[node], programIndex);\n }\n }\n var edges = (opts === null || opts === void 0 || (_opts$partialGraph2 = opts.partialGraph) === null || _opts$partialGraph2 === void 0 ? void 0 : _opts$partialGraph2.edges) || [];\n for (var _i4 = 0, _l4 = edges.length; _i4 < _l4; _i4++) {\n var edge = edges[_i4];\n // Recompute edge's data (ie. apply reducer)\n this.updateEdge(edge);\n // Add edge to the program\n // otherwise it will be done in the process function\n if (skipIndexation) {\n var _programIndex = this.edgeProgramIndex[edge];\n if (_programIndex === undefined) throw new Error(\"Sigma: edge \\\"\".concat(edge, \"\\\" can't be repaint\"));\n this.addEdgeToProgram(edge, this.edgeIndices[edge], _programIndex);\n }\n }\n }\n\n // Do we need to call the process function ?\n if (fullRefresh || !skipIndexation) this.needToProcess = true;\n if (schedule) this.scheduleRender();else this.render();\n return this;\n }\n\n /**\n * Method used to schedule a render at the next available frame.\n * This method can be safely called on a same frame because it basically\n * debounces refresh to the next frame.\n *\n * @return {Sigma}\n */\n }, {\n key: \"scheduleRender\",\n value: function scheduleRender() {\n var _this11 = this;\n if (!this.renderFrame) {\n this.renderFrame = requestAnimationFrame(function () {\n _this11.render();\n });\n }\n return this;\n }\n\n /**\n * Method used to schedule a refresh (i.e. fully reprocess graph data and render)\n * at the next available frame.\n * This method can be safely called on a same frame because it basically\n * debounces refresh to the next frame.\n *\n * @return {Sigma}\n */\n }, {\n key: \"scheduleRefresh\",\n value: function scheduleRefresh(opts) {\n return this.refresh(_objectSpread2(_objectSpread2({}, opts), {}, {\n schedule: true\n }));\n }\n\n /**\n * Method used to (un)zoom, while preserving the position of a viewport point.\n * Used for instance to zoom \"on the mouse cursor\".\n *\n * @param viewportTarget\n * @param newRatio\n * @return {CameraState}\n */\n }, {\n key: \"getViewportZoomedState\",\n value: function getViewportZoomedState(viewportTarget, newRatio) {\n var _this$camera$getState = this.camera.getState(),\n ratio = _this$camera$getState.ratio,\n angle = _this$camera$getState.angle,\n x = _this$camera$getState.x,\n y = _this$camera$getState.y;\n var _this$settings2 = this.settings,\n minCameraRatio = _this$settings2.minCameraRatio,\n maxCameraRatio = _this$settings2.maxCameraRatio;\n if (typeof maxCameraRatio === \"number\") newRatio = Math.min(newRatio, maxCameraRatio);\n if (typeof minCameraRatio === \"number\") newRatio = Math.max(newRatio, minCameraRatio);\n var ratioDiff = newRatio / ratio;\n var center = {\n x: this.width / 2,\n y: this.height / 2\n };\n var graphMousePosition = this.viewportToFramedGraph(viewportTarget);\n var graphCenterPosition = this.viewportToFramedGraph(center);\n return {\n angle: angle,\n x: (graphMousePosition.x - graphCenterPosition.x) * (1 - ratioDiff) + x,\n y: (graphMousePosition.y - graphCenterPosition.y) * (1 - ratioDiff) + y,\n ratio: newRatio\n };\n }\n\n /**\n * Method returning the abstract rectangle containing the graph according\n * to the camera's state.\n *\n * @return {object} - The view's rectangle.\n */\n }, {\n key: \"viewRectangle\",\n value: function viewRectangle() {\n var p1 = this.viewportToFramedGraph({\n x: 0,\n y: 0\n }),\n p2 = this.viewportToFramedGraph({\n x: this.width,\n y: 0\n }),\n h = this.viewportToFramedGraph({\n x: 0,\n y: this.height\n });\n return {\n x1: p1.x,\n y1: p1.y,\n x2: p2.x,\n y2: p2.y,\n height: p2.y - h.y\n };\n }\n\n /**\n * Method returning the coordinates of a point from the framed graph system to the viewport system. It allows\n * overriding anything that is used to get the translation matrix, or even the matrix itself.\n *\n * Be careful if overriding dimensions, padding or cameraState, as the computation of the matrix is not the lightest\n * of computations.\n */\n }, {\n key: \"framedGraphToViewport\",\n value: function framedGraphToViewport(coordinates) {\n var override = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var recomputeMatrix = !!override.cameraState || !!override.viewportDimensions || !!override.graphDimensions;\n var matrix = override.matrix ? override.matrix : recomputeMatrix ? matrixFromCamera(override.cameraState || this.camera.getState(), override.viewportDimensions || this.getDimensions(), override.graphDimensions || this.getGraphDimensions(), override.padding || this.getStagePadding()) : this.matrix;\n var viewportPos = multiplyVec2(matrix, coordinates);\n return {\n x: (1 + viewportPos.x) * this.width / 2,\n y: (1 - viewportPos.y) * this.height / 2\n };\n }\n\n /**\n * Method returning the coordinates of a point from the viewport system to the framed graph system. It allows\n * overriding anything that is used to get the translation matrix, or even the matrix itself.\n *\n * Be careful if overriding dimensions, padding or cameraState, as the computation of the matrix is not the lightest\n * of computations.\n */\n }, {\n key: \"viewportToFramedGraph\",\n value: function viewportToFramedGraph(coordinates) {\n var override = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var recomputeMatrix = !!override.cameraState || !!override.viewportDimensions || !override.graphDimensions;\n var invMatrix = override.matrix ? override.matrix : recomputeMatrix ? matrixFromCamera(override.cameraState || this.camera.getState(), override.viewportDimensions || this.getDimensions(), override.graphDimensions || this.getGraphDimensions(), override.padding || this.getStagePadding(), true) : this.invMatrix;\n var res = multiplyVec2(invMatrix, {\n x: coordinates.x / this.width * 2 - 1,\n y: 1 - coordinates.y / this.height * 2\n });\n if (isNaN(res.x)) res.x = 0;\n if (isNaN(res.y)) res.y = 0;\n return res;\n }\n\n /**\n * Method used to translate a point's coordinates from the viewport system (pixel distance from the top-left of the\n * stage) to the graph system (the reference system of data as they are in the given graph instance).\n *\n * This method accepts an optional camera which can be useful if you need to translate coordinates\n * based on a different view than the one being currently being displayed on screen.\n *\n * @param {Coordinates} viewportPoint\n * @param {CoordinateConversionOverride} override\n */\n }, {\n key: \"viewportToGraph\",\n value: function viewportToGraph(viewportPoint) {\n var override = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return this.normalizationFunction.inverse(this.viewportToFramedGraph(viewportPoint, override));\n }\n\n /**\n * Method used to translate a point's coordinates from the graph system (the reference system of data as they are in\n * the given graph instance) to the viewport system (pixel distance from the top-left of the stage).\n *\n * This method accepts an optional camera which can be useful if you need to translate coordinates\n * based on a different view than the one being currently being displayed on screen.\n *\n * @param {Coordinates} graphPoint\n * @param {CoordinateConversionOverride} override\n */\n }, {\n key: \"graphToViewport\",\n value: function graphToViewport(graphPoint) {\n var override = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return this.framedGraphToViewport(this.normalizationFunction(graphPoint), override);\n }\n\n /**\n * Method returning the distance multiplier between the graph system and the\n * viewport system.\n */\n }, {\n key: \"getGraphToViewportRatio\",\n value: function getGraphToViewportRatio() {\n var graphP1 = {\n x: 0,\n y: 0\n };\n var graphP2 = {\n x: 1,\n y: 1\n };\n var graphD = Math.sqrt(Math.pow(graphP1.x - graphP2.x, 2) + Math.pow(graphP1.y - graphP2.y, 2));\n var viewportP1 = this.graphToViewport(graphP1);\n var viewportP2 = this.graphToViewport(graphP2);\n var viewportD = Math.sqrt(Math.pow(viewportP1.x - viewportP2.x, 2) + Math.pow(viewportP1.y - viewportP2.y, 2));\n return viewportD / graphD;\n }\n\n /**\n * Method returning the graph's bounding box.\n *\n * @return {{ x: Extent, y: Extent }}\n */\n }, {\n key: \"getBBox\",\n value: function getBBox() {\n return this.nodeExtent;\n }\n\n /**\n * Method returning the graph's custom bounding box, if any.\n *\n * @return {{ x: Extent, y: Extent } | null}\n */\n }, {\n key: \"getCustomBBox\",\n value: function getCustomBBox() {\n return this.customBBox;\n }\n\n /**\n * Method used to override the graph's bounding box with a custom one. Give `null` as the argument to stop overriding.\n *\n * @return {Sigma}\n */\n }, {\n key: \"setCustomBBox\",\n value: function setCustomBBox(customBBox) {\n this.customBBox = customBBox;\n this.scheduleRender();\n return this;\n }\n\n /**\n * Method used to shut the container & release event listeners.\n *\n * @return {undefined}\n */\n }, {\n key: \"kill\",\n value: function kill() {\n // Emitting \"kill\" events so that plugins and such can cleanup\n this.emit(\"kill\");\n\n // Releasing events\n this.removeAllListeners();\n\n // Releasing camera handlers\n this.unbindCameraHandlers();\n\n // Releasing DOM events & captors\n window.removeEventListener(\"resize\", this.activeListeners.handleResize);\n this.mouseCaptor.kill();\n this.touchCaptor.kill();\n\n // Releasing graph handlers\n this.unbindGraphHandlers();\n\n // Releasing cache & state\n this.clearIndices();\n this.clearState();\n this.nodeDataCache = {};\n this.edgeDataCache = {};\n this.highlightedNodes.clear();\n\n // Clearing frames\n if (this.renderFrame) {\n cancelAnimationFrame(this.renderFrame);\n this.renderFrame = null;\n }\n if (this.renderHighlightedNodesFrame) {\n cancelAnimationFrame(this.renderHighlightedNodesFrame);\n this.renderHighlightedNodesFrame = null;\n }\n\n // Destroying canvases\n var container = this.container;\n while (container.firstChild) container.removeChild(container.firstChild);\n\n // Kill programs:\n for (var type in this.nodePrograms) {\n this.nodePrograms[type].kill();\n }\n for (var _type8 in this.nodeHoverPrograms) {\n this.nodeHoverPrograms[_type8].kill();\n }\n for (var _type9 in this.edgePrograms) {\n this.edgePrograms[_type9].kill();\n }\n this.nodePrograms = {};\n this.nodeHoverPrograms = {};\n this.edgePrograms = {};\n\n // Kill all canvas/WebGL contexts\n for (var id in this.elements) {\n this.killLayer(id);\n }\n\n // Destroying remaining collections\n this.canvasContexts = {};\n this.webGLContexts = {};\n this.elements = {};\n }\n\n /**\n * Method used to scale the given size according to the camera's ratio, i.e.\n * zooming state.\n *\n * @param {number?} size - The size to scale (node size, edge thickness etc.).\n * @param {number?} cameraRatio - A camera ratio (defaults to the actual camera ratio).\n * @return {number} - The scaled size.\n */\n }, {\n key: \"scaleSize\",\n value: function scaleSize() {\n var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n var cameraRatio = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.camera.ratio;\n return size / this.settings.zoomToSizeRatioFunction(cameraRatio) * (this.getSetting(\"itemSizesReference\") === \"positions\" ? cameraRatio * this.graphToViewportRatio : 1);\n }\n\n /**\n * Method that returns the collection of all used canvases.\n * At the moment, the instantiated canvases are the following, and in the\n * following order in the DOM:\n * - `edges`\n * - `nodes`\n * - `edgeLabels`\n * - `labels`\n * - `hovers`\n * - `hoverNodes`\n * - `mouse`\n *\n * @return {PlainObject<HTMLCanvasElement>} - The collection of canvases.\n */\n }, {\n key: \"getCanvases\",\n value: function getCanvases() {\n var res = {};\n for (var layer in this.elements) if (this.elements[layer] instanceof HTMLCanvasElement) res[layer] = this.elements[layer];\n return res;\n }\n }]);\n}(TypedEventEmitter);\n\n/**\n * Sigma.js Library Endpoint\n * =========================\n *\n * The library endpoint.\n * @module\n */\nvar Sigma = Sigma$1;\n\nexport { Camera, MouseCaptor, Sigma$1 as Sigma, TouchCaptor, Sigma as default };\n"],"names":["TypedEventEmitter","_ref","_this","_classCallCheck","_callSuper","_inherits","_createClass","EventEmitter","linear","k","quadraticIn","quadraticOut","quadraticInOut","cubicIn","cubicOut","cubicInOut","easings","ANIMATE_DEFAULTS","identity","scale","m","x","y","rotate","r","s","c","translate","multiply","a","b","a00","a01","a02","a10","a11","a12","a20","a21","a22","b00","b01","b02","b10","b11","b12","b20","b21","b22","multiplyVec2","z","b0","b1","getCorrectionRatio","viewportDimensions","graphDimensions","viewportRatio","graphRatio","matrixFromCamera","state","padding","inverse","angle","ratio","width","height","matrix","smallestDimension","correctionRatio","getMatrixImpact","cameraState","_multiplyVec","graphExtent","graph","xMin","xMax","yMin","yMax","_","attr","validateGraph","isGraph","key","attributes","createElement","tag","style","element","_k","getPixelRatio","zIndexOrdering","_extent","getter","elements","zA","zB","createNormalizationFunction","extent","_extent$x","_slicedToArray","minX","maxX","_extent$y","minY","maxY","dX","dY","fn","data","_typeof","o","extend","array","values","l2","l1","i","value","assign","target","l","DEFAULT_SETTINGS","drawStraightEdgeLabel","drawDiscNodeLabel","drawDiscNodeHover","DEFAULT_NODE_PROGRAM_CLASSES","NodeCircleProgram","DEFAULT_EDGE_PROGRAM_CLASSES","EdgeArrowProgram","EdgeRectangleProgram","validateSettings","settings","minCameraRatio","maxCameraRatio","resolveSettings","resolvedSettings","DEFAULT_ZOOMING_RATIO","Camera","_TypedEventEmitter","_defineProperty","validatedState","_objectSpread2","validState","updater","_this2","opts","callback","resolve","options","easing","start","initialState","_fn","t","coefficient","newState","factorOrOptions","camera","getPosition","e","dom","bbox","getMouseCoords","res","cleanMouseCoords","getWheelCoords","getWheelDelta","MAX_TOUCHES","getTouchesArray","touches","arr","getTouchCoords","previousTouches","touch","Captor","container","renderer","MOUSE_SETTINGS_KEYS","DEFAULT_MOUSE_SETTINGS","iter","MouseCaptor","_Captor","mouseCoords","newRatio","_getPosition","_this3","_getPosition2","previousCameraState","shouldRefresh","_this4","_getPosition3","eX","eY","lastMouse","mouse","offsetX","offsetY","_this5","delta","wheelCoords","currentRatio","ratioDiff","wheelDirection","now","TOUCH_SETTINGS_KEYS","DEFAULT_TOUCH_SETTINGS","TouchCaptor","_this$startTouchesPos","_this$startTouchesPos2","x0","y0","_this$startTouchesPos3","x1","y1","position","downPosition","dSquare","touchCoords","_camera","_touchCoords","touchesPositions","lastTouches","idx","startPosition","startCameraState","_this$renderer$viewpo","xStart","yStart","_this$renderer$viewpo2","newCameraState","_touchesPositions$","_touchesPositions$2","angleDiff","dimensions","touchGraphPosition","dx","dy","_x","_y","_arrayWithoutHoles","_arrayLikeToArray","_iterableToArray","_nonIterableSpread","_toConsumableArray","_unsupportedIterableToArray","_objectWithoutPropertiesLoose","n","_objectWithoutProperties","LabelCandidate","size","first","second","LabelGrid","cellSize","pos","xIndex","yIndex","candidate","index","cell","density","cellArea","scaledCellArea","scaledDensity","labelsToDisplayPerCell","labels","edgeLabelsToDisplayFromNodes","params","hoveredNode","highlightedNodes","displayedNodeLabels","worthyEdges","edge","source","X_LABEL_MARGIN","Y_LABEL_MARGIN","hasOwnProperty","applyNodeDefaults","applyEdgeDefaults","_key","Sigma$1","Sigma","type","_type","NodeProgramClass","NodeHoverProgram","EdgeProgramClass","_this$nodePrograms","program","programs","_toPropertyKey","_this$nodeHoverProgra","_program","_programs","_this$edgePrograms","id","gl","frameBuffer","currentTexture","pickingTexture","color","getPixelColor","colorToIndex","itemAt","event","baseEvent","nodeToHover","node","edgeToHover","createInteractionListener","eventType","nodeAtPosition","LAYOUT_IMPACTING_FIELDS","_e$hints","updatedFields","layoutChanged","f","_e$hints2","payload","_this$nodeExtent","nullCamera","nullCameraMatrix","nodesPerPrograms","nodeIndices","edgeIndices","itemIDsIndex","incrID","nodes","attrs","_i","_l","_node","_data","edgesPerPrograms","edges","_i2","_l2","_data2","_type2","_i3","_l3","_edge","_data3","oldSettings","_this6","_type3","_type4","_type5","_ref$tolerance","tolerance","boundaries","_ref2","_ref2$x","xMinGraph","xMaxGraph","_ref2$y","yMinGraph","yMaxGraph","corners","_ref3","graphWidth","graphHeight","_this$getDimensions","origin","labelsToDisplay","context","_this$framedGraphToVi","defaultDrawNodeLabel","nodeProgram","drawLabel","edgeLabelsToDisplay","displayedLabels","extremities","sourceData","targetData","edgeData","defaultDrawEdgeLabel","edgeProgram","_this7","render","_this7$framedGraphToV","defaultDrawNodeHover","drawHover","nodesToRender","renderParams","_type6","_this8","_this9","exitRender","layer","mouseCaptor","moving","_type7","_program2","fingerprint","_this$settings","stagePadding","autoRescale","canvas","contextOptions","newFrameBuffer","_gl$getExtension","oldValues","force","previousWidth","previousHeight","_id","_id2","_this10","skipIndexation","schedule","fullRefresh","_opts$partialGraph","_opts$partialGraph2","programIndex","_i4","_l4","_programIndex","_this11","viewportTarget","_this$camera$getState","_this$settings2","center","graphMousePosition","graphCenterPosition","p1","p2","h","coordinates","override","recomputeMatrix","viewportPos","invMatrix","viewportPoint","graphPoint","graphP1","graphP2","graphD","viewportP1","viewportP2","viewportD","customBBox","_type8","_type9","cameraRatio"],"mappings":";;AAwBA,IAAIA,KAAiC,0BAAUC,GAAM;AACnD,WAASD,IAAoB;AAC3B,QAAIE;AACJ,WAAAC,EAAgB,MAAMH,CAAiB,GACvCE,IAAQE,EAAW,MAAMJ,CAAiB,GAC1CE,EAAM,aAAaA,GACZA;AAAA,EACT;AACA,SAAAG,EAAUL,GAAmBC,CAAI,GAC1BK,EAAaN,CAAiB;AACvC,GAAEO,eAAY;;AC/Bd,IAAIC,KAAS,SAAgBC,GAAG;AAC9B,SAAOA;AACT,GACIC,KAAc,SAAqBD,GAAG;AACxC,SAAOA,IAAIA;AACb,GACIE,KAAe,SAAsBF,GAAG;AAC1C,SAAOA,KAAK,IAAIA;AAClB,GACIG,KAAiB,SAAwBH,GAAG;AAC9C,UAAKA,KAAK,KAAK,IAAU,MAAMA,IAAIA,IAC5B,QAAQ,EAAEA,KAAKA,IAAI,KAAK;AACjC,GACII,KAAU,SAAiBJ,GAAG;AAChC,SAAOA,IAAIA,IAAIA;AACjB,GACIK,KAAW,SAAkBL,GAAG;AAClC,SAAO,EAAEA,IAAIA,IAAIA,IAAI;AACvB,GACIM,KAAa,SAAoBN,GAAG;AACtC,UAAKA,KAAK,KAAK,IAAU,MAAMA,IAAIA,IAAIA,IAChC,QAAQA,KAAK,KAAKA,IAAIA,IAAI;AACnC,GACIO,KAAU;AAAA,EACZ,QAAQR;AAAA,EACR,aAAaE;AAAA,EACb,cAAcC;AAAA,EACd,gBAAgBC;AAAA,EAChB,SAASC;AAAA,EACT,UAAUC;AAAA,EACV,YAAYC;AACd,GAMIE,KAAmB;AAAA,EACrB,QAAQ;AAAA,EACR,UAAU;AACZ;AA4CA,SAASC,IAAW;AAClB,SAAO,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAClD;AAGA,SAASC,GAAMC,GAAGC,GAAGC,GAAG;AACtB,SAAAF,EAAE,CAAC,IAAIC,GACPD,EAAE,CAAC,IAAI,OAAOE,KAAM,WAAWA,IAAID,GAC5BD;AACT;AACA,SAASG,GAAOH,GAAGI,GAAG;AACpB,MAAIC,IAAI,KAAK,IAAID,CAAC,GAChBE,IAAI,KAAK,IAAIF,CAAC;AAChB,SAAAJ,EAAE,CAAC,IAAIM,GACPN,EAAE,CAAC,IAAIK,GACPL,EAAE,CAAC,IAAI,CAACK,GACRL,EAAE,CAAC,IAAIM,GACAN;AACT;AACA,SAASO,GAAUP,GAAGC,GAAGC,GAAG;AAC1B,SAAAF,EAAE,CAAC,IAAIC,GACPD,EAAE,CAAC,IAAIE,GACAF;AACT;AACA,SAASQ,EAASC,GAAGC,GAAG;AACtB,MAAIC,IAAMF,EAAE,CAAC,GACXG,IAAMH,EAAE,CAAC,GACTI,IAAMJ,EAAE,CAAC,GACPK,IAAML,EAAE,CAAC,GACXM,IAAMN,EAAE,CAAC,GACTO,IAAMP,EAAE,CAAC,GACPQ,IAAMR,EAAE,CAAC,GACXS,IAAMT,EAAE,CAAC,GACTU,IAAMV,EAAE,CAAC,GACPW,IAAMV,EAAE,CAAC,GACXW,IAAMX,EAAE,CAAC,GACTY,IAAMZ,EAAE,CAAC,GACPa,IAAMb,EAAE,CAAC,GACXc,IAAMd,EAAE,CAAC,GACTe,IAAMf,EAAE,CAAC,GACPgB,IAAMhB,EAAE,CAAC,GACXiB,IAAMjB,EAAE,CAAC,GACTkB,IAAMlB,EAAE,CAAC;AACX,SAAAD,EAAE,CAAC,IAAIW,IAAMT,IAAMU,IAAMP,IAAMQ,IAAML,GACrCR,EAAE,CAAC,IAAIW,IAAMR,IAAMS,IAAMN,IAAMO,IAAMJ,GACrCT,EAAE,CAAC,IAAIW,IAAMP,IAAMQ,IAAML,IAAMM,IAAMH,GACrCV,EAAE,CAAC,IAAIc,IAAMZ,IAAMa,IAAMV,IAAMW,IAAMR,GACrCR,EAAE,CAAC,IAAIc,IAAMX,IAAMY,IAAMT,IAAMU,IAAMP,GACrCT,EAAE,CAAC,IAAIc,IAAMV,IAAMW,IAAMR,IAAMS,IAAMN,GACrCV,EAAE,CAAC,IAAIiB,IAAMf,IAAMgB,IAAMb,IAAMc,IAAMX,GACrCR,EAAE,CAAC,IAAIiB,IAAMd,IAAMe,IAAMZ,IAAMa,IAAMV,GACrCT,EAAE,CAAC,IAAIiB,IAAMb,IAAMc,IAAMX,IAAMY,IAAMT,GAC9BV;AACT;AACA,SAASoB,GAAapB,GAAGC,GAAG;AAC1B,MAAIoB,IAAI,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,GACxEnB,IAAMF,EAAE,CAAC,GACTG,IAAMH,EAAE,CAAC,GACTK,IAAML,EAAE,CAAC,GACTM,IAAMN,EAAE,CAAC,GACTQ,IAAMR,EAAE,CAAC,GACTS,IAAMT,EAAE,CAAC,GACTsB,IAAKrB,EAAE,GACPsB,IAAKtB,EAAE;AACX,SAAO;AAAA,IACL,GAAGqB,IAAKpB,IAAMqB,IAAKlB,IAAMG,IAAMa;AAAA,IAC/B,GAAGC,IAAKnB,IAAMoB,IAAKjB,IAAMG,IAAMY;AAAA,EACnC;AACA;AAUA,SAASG,GAAmBC,GAAoBC,GAAiB;AAC/D,MAAIC,IAAgBF,EAAmB,SAASA,EAAmB,OAC/DG,IAAaF,EAAgB,SAASA,EAAgB;AAI1D,SAAIC,IAAgB,KAAKC,IAAa,KAAKD,IAAgB,KAAKC,IAAa,IACpE,IAMF,KAAK,IAAI,KAAK,IAAIA,GAAY,IAAIA,CAAU,GAAG,KAAK,IAAI,IAAID,GAAeA,CAAa,CAAC;AAClG;AAKA,SAASE,EAAiBC,GAAOL,GAAoBC,GAAiBK,GAASC,GAAS;AAEtF,MAAIC,IAAQH,EAAM,OAChBI,IAAQJ,EAAM,OACdtC,IAAIsC,EAAM,GACVrC,IAAIqC,EAAM,GACRK,IAAQV,EAAmB,OAC7BW,IAASX,EAAmB,QAC1BY,IAAShD,EAAQ,GACjBiD,IAAoB,KAAK,IAAIH,GAAOC,CAAM,IAAI,IAAIL,GAClDQ,IAAkBf,GAAmBC,GAAoBC,CAAe;AAC5E,SAAKM,KAMHjC,EAASsC,GAAQvC,GAAUT,EAAQ,GAAIG,GAAGC,CAAC,CAAC,GAC5CM,EAASsC,GAAQ/C,GAAMD,EAAQ,GAAI6C,CAAK,CAAC,GACzCnC,EAASsC,GAAQ3C,GAAOL,EAAQ,GAAI4C,CAAK,CAAC,GAC1ClC,EAASsC,GAAQ/C,GAAMD,EAAQ,GAAI8C,IAAQG,IAAoB,IAAIC,GAAiBH,IAASE,IAAoB,IAAIC,CAAe,CAAC,MARrIxC,EAASsC,GAAQ/C,GAAMD,EAAQ,GAAI,KAAKiD,IAAoBH,KAASI,GAAiB,KAAKD,IAAoBF,KAAUG,CAAe,CAAC,GACzIxC,EAASsC,GAAQ3C,GAAOL,EAAQ,GAAI,CAAC4C,CAAK,CAAC,GAC3ClC,EAASsC,GAAQ/C,GAAMD,EAAQ,GAAI,IAAI6C,CAAK,CAAC,GAC7CnC,EAASsC,GAAQvC,GAAUT,EAAQ,GAAI,CAACG,GAAG,CAACC,CAAC,CAAC,IAOzC4C;AACT;AAmBA,SAASG,GAAgBH,GAAQI,GAAahB,GAAoB;AAChE,MAAIiB,IAAetB,GAAaiB,GAAQ;AAAA,IACpC,GAAG,KAAK,IAAII,EAAY,KAAK;AAAA,IAC7B,GAAG,KAAK,IAAIA,EAAY,KAAK;AAAA,EACnC,GAAO,CAAC,GACJjD,IAAIkD,EAAa,GACjBjD,IAAIiD,EAAa;AACnB,SAAO,IAAI,KAAK,KAAK,KAAK,IAAIlD,GAAG,CAAC,IAAI,KAAK,IAAIC,GAAG,CAAC,CAAC,IAAIgC,EAAmB;AAC7E;AAKA,SAASkB,GAAYC,GAAO;AAC1B,MAAI,CAACA,EAAM,MAAO,QAAO;AAAA,IACvB,GAAG,CAAC,GAAG,CAAC;AAAA,IACR,GAAG,CAAC,GAAG,CAAC;AAAA,EACZ;AACE,MAAIC,IAAO,OACPC,IAAO,QACPC,IAAO,OACPC,IAAO;AACX,SAAAJ,EAAM,YAAY,SAAUK,GAAGC,GAAM;AACnC,QAAI1D,IAAI0D,EAAK,GACXzD,IAAIyD,EAAK;AACX,IAAI1D,IAAIqD,MAAMA,IAAOrD,IACjBA,IAAIsD,MAAMA,IAAOtD,IACjBC,IAAIsD,MAAMA,IAAOtD,IACjBA,IAAIuD,MAAMA,IAAOvD;AAAA,EACvB,CAAC,GACM;AAAA,IACL,GAAG,CAACoD,GAAMC,CAAI;AAAA,IACd,GAAG,CAACC,GAAMC,CAAI;AAAA,EAClB;AACA;AAKA,SAASG,GAAcP,GAAO;AAE5B,MAAI,CAACQ,GAAQR,CAAK,EAAG,OAAM,IAAI,MAAM,gCAAgC;AAGrE,EAAAA,EAAM,YAAY,SAAUS,GAAKC,GAAY;AAC3C,QAAI,CAAC,OAAO,SAASA,EAAW,CAAC,KAAK,CAAC,OAAO,SAASA,EAAW,CAAC;AACjE,YAAM,IAAI,MAAM,8BAA8B,OAAOD,GAAK,iEAAiE,CAAC;AAAA,EAEhI,CAAC;AACH;AAKA,SAASE,GAAcC,GAAKC,GAAOH,GAAY;AAC7C,MAAII,IAAU,SAAS,cAAcF,CAAG;AACxC,MAAIC;AACF,aAAS7E,KAAK6E;AACZ,MAAAC,EAAQ,MAAM9E,CAAC,IAAI6E,EAAM7E,CAAC;AAG9B,MAAI0E;AACF,aAASK,KAAML;AACb,MAAAI,EAAQ,aAAaC,GAAIL,EAAWK,CAAE,CAAC;AAG3C,SAAOD;AACT;AAKA,SAASE,KAAgB;AACvB,SAAI,OAAO,OAAO,mBAAqB,MAAoB,OAAO,mBAC3D;AACT;AAMA,SAASC,GAAeC,GAASC,GAAQC,GAAU;AAEjD,SAAOA,EAAS,KAAK,SAAUhE,GAAGC,GAAG;AACnC,QAAIgE,IAAKF,EAAO/D,CAAC,KAAK,GACpBkE,IAAKH,EAAO9D,CAAC,KAAK;AACpB,WAAIgE,IAAKC,IAAW,KAChBD,IAAKC,IAAW,IACb;AAAA,EACT,CAAC;AAGH;AAMA,SAASC,GAA4BC,GAAQ;AAC3C,MAAIC,IAAYC,EAAeF,EAAO,GAAG,CAAC,GACxCG,IAAOF,EAAU,CAAC,GAClBG,IAAOH,EAAU,CAAC,GAClBI,IAAYH,EAAeF,EAAO,GAAG,CAAC,GACtCM,IAAOD,EAAU,CAAC,GAClBE,IAAOF,EAAU,CAAC,GAChBvC,IAAQ,KAAK,IAAIsC,IAAOD,GAAMI,IAAOD,CAAI,GAC3CE,KAAMJ,IAAOD,KAAQ,GACrBM,KAAMF,IAAOD,KAAQ;AACvB,GAAIxC,MAAU,KAAK,KAAK,IAAIA,CAAK,MAAM,SAAY,MAAMA,CAAK,OAAGA,IAAQ,IACrE,MAAM0C,CAAE,MAAGA,IAAK,IAChB,MAAMC,CAAE,MAAGA,IAAK;AACpB,MAAIC,IAAK,SAAYC,GAAM;AACzB,WAAO;AAAA,MACL,GAAG,OAAOA,EAAK,IAAIH,KAAM1C;AAAA,MACzB,GAAG,OAAO6C,EAAK,IAAIF,KAAM3C;AAAA,IAC/B;AAAA,EACE;AAGA,SAAA4C,EAAG,UAAU,SAAUC,GAAM;AAC3B,IAAAA,EAAK,IAAI,OAAOA,EAAK,IAAIH,KAAM1C,GAC/B6C,EAAK,IAAI,OAAOA,EAAK,IAAIF,KAAM3C;AAAA,EACjC,GACA4C,EAAG,UAAU,SAAUC,GAAM;AAC3B,WAAO;AAAA,MACL,GAAGH,IAAK1C,KAAS6C,EAAK,IAAI;AAAA,MAC1B,GAAGF,IAAK3C,KAAS6C,EAAK,IAAI;AAAA,IAChC;AAAA,EACE,GACAD,EAAG,QAAQ5C,GACJ4C;AACT;ACrWA,SAASE,GAAQC,GAAG;AAClB;AAEA,SAAOD,KAAwB,OAAO,UAArB,cAA2C,OAAO,OAAO,YAA1B,WAAqC,SAAUC,GAAG;AAChG,WAAO,OAAOA;AAAA,EAChB,IAAI,SAAUA,GAAG;AACf,WAAOA,KAAmB,OAAO,UAArB,cAA+BA,EAAE,gBAAgB,UAAUA,MAAM,OAAO,YAAY,WAAW,OAAOA;AAAA,EACpH,GAAGD,GAAQC,CAAC;AACd;AAKA,SAASC,GAAOC,GAAOC,GAAQ;AAC7B,MAAIC,IAAKD,EAAO;AAChB,MAAIC,MAAO,GACX;AAAA,QAAIC,IAAKH,EAAM;AACf,IAAAA,EAAM,UAAUE;AAChB,QAAIE,IAAI;AACR,IAAAH,EAAO,QAAQ,SAAUI,GAAO;AAC9B,MAAAL,EAAMG,IAAKC,CAAC,IAAIC,GAChBD;AAAA,IACF,CAAC;AAAA;AACH;AAYA,SAASE,GAAOC,GAAQ;AACtB,EAAAA,IAASA,KAAU,CAAA;AACnB,WAASH,IAAI,GAAGI,IAAI,UAAU,UAAU,IAAI,IAAI,UAAU,SAAS,GAAGJ,IAAII,GAAGJ,KAAK;AAChF,QAAIN,IAAIM,IAAI,IAAI,KAAK,UAAU,UAAUA,IAAI,IAAI,SAAY,UAAUA,IAAI,CAAC;AAC5E,IAAKN,KACL,OAAO,OAAOS,GAAQT,CAAC;AAAA,EACzB;AACA,SAAOS;AACT;ACzBA,IAAIE,KAAmB;AAAA;AAAA,EAErB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,kBAAkB;AAAA;AAAA,EAElB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,YAAY;AAAA,IACV,OAAO;AAAA,EACX;AAAA,EACE,eAAe;AAAA,EACf,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,IACd,WAAW;AAAA,EACf;AAAA,EACE,cAAc;AAAA,EACd,sBAAsBC;AAAA,EACtB,sBAAsBC;AAAA,EACtB,sBAAsBC;AAAA,EACtB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA;AAAA,EAErB,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,4BAA4B;AAAA,EAC5B,kBAAkB;AAAA;AAAA,EAElB,yBAAyB,KAAK;AAAA,EAC9B,oBAAoB;AAAA,EACpB,aAAa;AAAA,EACb,YAAY;AAAA;AAAA,EAEZ,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,4BAA4B;AAAA;AAAA,EAE5B,aAAa;AAAA,EACb,aAAa;AAAA;AAAA,EAEb,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA;AAAA,EAErB,uBAAuB;AAAA;AAAA,EAEvB,oBAAoB,CAAA;AAAA,EACpB,yBAAyB,CAAA;AAAA,EACzB,oBAAoB,CAAA;AACtB,GACIC,KAA+B;AAAA,EACjC,QAAQC;AACV,GACIC,KAA+B;AAAA,EACjC,OAAOC;AAAAA,EACP,MAAMC;AACR;AACA,SAASC,GAAiBC,GAAU;AAClC,MAAI,OAAOA,EAAS,gBAAiB,YAAYA,EAAS,eAAe;AACvE,UAAM,IAAI,MAAM,gEAAgE;AAElF,MAAIC,IAAiBD,EAAS,gBAC5BE,IAAiBF,EAAS;AAC5B,MAAI,OAAOC,KAAmB,YAAY,OAAOC,KAAmB,YAAYA,IAAiBD;AAC/F,UAAM,IAAI,MAAM,4GAA4G;AAEhI;AACA,SAASE,GAAgBH,GAAU;AACjC,MAAII,IAAmBjB,GAAO,IAAIG,IAAkBU,CAAQ;AAC5D,SAAAI,EAAiB,qBAAqBjB,GAAO,CAAA,GAAIO,IAA8BU,EAAiB,kBAAkB,GAClHA,EAAiB,qBAAqBjB,GAAO,CAAA,GAAIS,IAA8BQ,EAAiB,kBAAkB,GAC3GA;AACT;AC/FA,IAAIC,KAAwB,KAQxBC,KAAsB,0BAAUC,GAAoB;AACtD,WAASD,IAAS;AAChB,QAAIvI;AACJ,WAAAC,EAAgB,MAAMsI,CAAM,GAC5BvI,IAAQE,EAAW,MAAMqI,CAAM,GAG/BE,EAAgBzI,GAAO,KAAK,GAAG,GAC/ByI,EAAgBzI,GAAO,KAAK,GAAG,GAC/ByI,EAAgBzI,GAAO,SAAS,CAAC,GACjCyI,EAAgBzI,GAAO,SAAS,CAAC,GACjCyI,EAAgBzI,GAAO,YAAY,IAAI,GACvCyI,EAAgBzI,GAAO,YAAY,IAAI,GACvCyI,EAAgBzI,GAAO,kBAAkB,EAAI,GAC7CyI,EAAgBzI,GAAO,kBAAkB,EAAI,GAC7CyI,EAAgBzI,GAAO,mBAAmB,EAAI,GAC9CyI,EAAgBzI,GAAO,SAAS,IAAI,GACpCyI,EAAgBzI,GAAO,aAAa,IAAI,GACxCyI,EAAgBzI,GAAO,iBAAiB,IAAI,GAC5CyI,EAAgBzI,GAAO,WAAW,EAAI,GACtCA,EAAM,gBAAgBA,EAAM,SAAQ,GAC7BA;AAAA,EACT;AAKA,SAAAG,EAAUoI,GAAQC,CAAkB,GAC7BpI,EAAamI,GAAQ,CAAC;AAAA,IAC3B,KAAK;AAAA,IACL;AAAA;AAAA;AAAA;AAAA,MAIA,WAAkB;AAChB,oBAAK,UAAU,IACR;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAmB;AACxB,kBAAK,UAAU,IACR;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAoB;AACzB,aAAO;AAAA,QACL,GAAG,KAAK;AAAA,QACR,GAAG,KAAK;AAAA,QACR,OAAO,KAAK;AAAA,QACZ,OAAO,KAAK;AAAA,MACpB;AAAA,IACI;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAkB9E,GAAO;AAC9B,aAAO,KAAK,MAAMA,EAAM,KAAK,KAAK,MAAMA,EAAM,KAAK,KAAK,UAAUA,EAAM,SAAS,KAAK,UAAUA,EAAM;AAAA,IACxG;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAA4B;AACjC,UAAIA,IAAQ,KAAK;AACjB,aAAKA,IACE;AAAA,QACL,GAAGA,EAAM;AAAA,QACT,GAAGA,EAAM;AAAA,QACT,OAAOA,EAAM;AAAA,QACb,OAAOA,EAAM;AAAA,MACrB,IANyB;AAAA,IAOrB;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAyBI,GAAO;AACrC,UAAIvC,IAAIuC;AACR,aAAI,OAAO,KAAK,YAAa,aAAUvC,IAAI,KAAK,IAAIA,GAAG,KAAK,QAAQ,IAChE,OAAO,KAAK,YAAa,aAAUA,IAAI,KAAK,IAAIA,GAAG,KAAK,QAAQ,IAC7DA;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAuBmC,GAAO;AACnC,UAAIiF,IAAiB,CAAA;AACrB,aAAI,KAAK,kBAAkB,OAAOjF,EAAM,KAAM,aAAUiF,EAAe,IAAIjF,EAAM,IAC7E,KAAK,kBAAkB,OAAOA,EAAM,KAAM,aAAUiF,EAAe,IAAIjF,EAAM,IAC7E,KAAK,kBAAkB,OAAOA,EAAM,SAAU,aAAUiF,EAAe,QAAQ,KAAK,gBAAgBjF,EAAM,KAAK,IAC/G,KAAK,mBAAmB,OAAOA,EAAM,SAAU,aAAUiF,EAAe,QAAQjF,EAAM,QACnF,KAAK,QAAQ,KAAK,MAAMkF,EAAeA,EAAe,CAAA,GAAI,KAAK,SAAQ,CAAE,GAAGD,CAAc,CAAC,IAAIA;AAAA,IACxG;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAsB;AAC3B,aAAO,CAAC,CAAC,KAAK;AAAA,IAChB;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAkBjF,GAAO;AAC9B,UAAI,CAAC,KAAK,QAAS,QAAO;AAG1B,WAAK,gBAAgB,KAAK,SAAQ;AAClC,UAAImF,IAAa,KAAK,cAAcnF,CAAK;AACzC,aAAI,OAAOmF,EAAW,KAAM,aAAU,KAAK,IAAIA,EAAW,IACtD,OAAOA,EAAW,KAAM,aAAU,KAAK,IAAIA,EAAW,IACtD,OAAOA,EAAW,SAAU,aAAU,KAAK,QAAQA,EAAW,QAC9D,OAAOA,EAAW,SAAU,aAAU,KAAK,QAAQA,EAAW,QAG7D,KAAK,SAAS,KAAK,aAAa,KAAG,KAAK,KAAK,WAAW,KAAK,SAAQ,CAAE,GACrE;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAqBC,GAAS;AACnC,kBAAK,SAASA,EAAQ,KAAK,SAAQ,CAAE,CAAC,GAC/B;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAiBpF,GAAO;AAC7B,UAAIqF,IAAS,MACTC,IAAO,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA,GAC3EC,IAAW,UAAU,SAAS,IAAI,UAAU,CAAC,IAAI;AACrD,UAAI,CAACA,EAAU,QAAO,IAAI,QAAQ,SAAUC,GAAS;AACnD,eAAOH,EAAO,QAAQrF,GAAOsF,GAAME,CAAO;AAAA,MAC5C,CAAC;AACD,UAAK,KAAK,SACV;AAAA,YAAIC,IAAUP,EAAeA,EAAe,CAAA,GAAI5H,EAAgB,GAAGgI,CAAI,GACnEH,IAAa,KAAK,cAAcnF,CAAK,GACrC0F,IAAS,OAAOD,EAAQ,UAAW,aAAaA,EAAQ,SAASpI,GAAQoI,EAAQ,MAAM,GAGvFE,IAAQ,KAAK,IAAG,GAClBC,IAAe,KAAK,SAAQ,GAG1BC,IAAM,WAAc;AACtB,cAAIC,KAAK,KAAK,IAAG,IAAKH,KAASF,EAAQ;AAGvC,cAAIK,KAAK,GAAG;AACV,YAAAT,EAAO,YAAY,MACnBA,EAAO,SAASF,CAAU,GACtBE,EAAO,sBACTA,EAAO,kBAAkB,KAAK,IAAI,GAClCA,EAAO,oBAAoB;AAE7B;AAAA,UACF;AACA,cAAIU,IAAcL,EAAOI,CAAC,GACtBE,IAAW,CAAA;AACf,UAAI,OAAOb,EAAW,KAAM,aAAUa,EAAS,IAAIJ,EAAa,KAAKT,EAAW,IAAIS,EAAa,KAAKG,IAClG,OAAOZ,EAAW,KAAM,aAAUa,EAAS,IAAIJ,EAAa,KAAKT,EAAW,IAAIS,EAAa,KAAKG,IAClGV,EAAO,mBAAmB,OAAOF,EAAW,SAAU,aAAUa,EAAS,QAAQJ,EAAa,SAAST,EAAW,QAAQS,EAAa,SAASG,IAChJ,OAAOZ,EAAW,SAAU,aAAUa,EAAS,QAAQJ,EAAa,SAAST,EAAW,QAAQS,EAAa,SAASG,IAC1HV,EAAO,SAASW,CAAQ,GACxBX,EAAO,YAAY,sBAAsBQ,CAAG;AAAA,QAC9C;AACA,QAAI,KAAK,aACP,qBAAqB,KAAK,SAAS,GAC/B,KAAK,qBAAmB,KAAK,kBAAkB,KAAK,IAAI,GAC5D,KAAK,YAAY,sBAAsBA,CAAG,KAE1CA,EAAG,GAEL,KAAK,oBAAoBN;AAAA;AAAA,IAC3B;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAsBU,GAAiB;AAC5C,aAAKA,IAGD,OAAOA,KAAoB,WAAiB,KAAK,QAAQ;AAAA,QAC3D,OAAO,KAAK,QAAQA;AAAA,MAC5B,CAAO,IACM,KAAK,QAAQ;AAAA,QAClB,OAAO,KAAK,SAASA,EAAgB,UAAUpB;AAAA,MACvD,GAASoB,CAAe,IARW,KAAK,QAAQ;AAAA,QACxC,OAAO,KAAK,QAAQpB;AAAA,MAC5B,CAAO;AAAA,IAOH;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAwBoB,GAAiB;AAC9C,aAAKA,IAGD,OAAOA,KAAoB,WAAiB,KAAK,QAAQ;AAAA,QAC3D,OAAO,KAAK,QAAQA;AAAA,MAC5B,CAAO,IACM,KAAK,QAAQ;AAAA,QAClB,OAAO,KAAK,SAASA,EAAgB,UAAUpB;AAAA,MACvD,GAASoB,CAAe,IARW,KAAK,QAAQ;AAAA,QACxC,OAAO,KAAK,QAAQpB;AAAA,MAC5B,CAAO;AAAA,IAOH;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAuBY,GAAS;AACrC,aAAO,KAAK,QAAQ;AAAA,QAClB,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAO;AAAA,QACP,OAAO;AAAA,MACf,GAASA,CAAO;AAAA,IACZ;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAgB;AACrB,aAAOX,EAAO,KAAK,KAAK,SAAQ,CAAE;AAAA,IACpC;AAAA,EACJ,CAAG,GAAG,CAAC;AAAA,IACH,KAAK;AAAA,IACL,OAAO,SAAc9E,GAAO;AAC1B,UAAIkG,IAAS,IAAIpB,EAAM;AACvB,aAAOoB,EAAO,SAASlG,CAAK;AAAA,IAC9B;AAAA,EACJ,CAAG,CAAC;AACJ,GAAE3D,EAAiB;AAiBnB,SAAS8J,EAAYC,GAAGC,GAAK;AAC3B,MAAIC,IAAOD,EAAI,sBAAqB;AACpC,SAAO;AAAA,IACL,GAAGD,EAAE,UAAUE,EAAK;AAAA,IACpB,GAAGF,EAAE,UAAUE,EAAK;AAAA,EACxB;AACA;AASA,SAASC,EAAeH,GAAGC,GAAK;AAC9B,MAAIG,IAAMtB,EAAeA,EAAe,CAAA,GAAIiB,EAAYC,GAAGC,CAAG,CAAC,GAAG,IAAI;AAAA,IACpE,uBAAuB;AAAA,IACvB,qBAAqB,WAA+B;AAClD,MAAAG,EAAI,wBAAwB;AAAA,IAC9B;AAAA,IACA,UAAUJ;AAAA,EACd,CAAG;AACD,SAAOI;AACT;AAKA,SAASC,EAAiBL,GAAG;AAC3B,MAAII,IAAM,OAAOJ,IAAIA,IAAIlB,EAAeA,EAAe,CAAA,GAAIkB,EAAE,QAAQ,CAAC,KAAKA,EAAE,gBAAgB,CAAC,CAAC,GAAG,IAAI;AAAA,IACpG,UAAUA,EAAE;AAAA,IACZ,uBAAuBA,EAAE;AAAA,IACzB,qBAAqB,WAA+B;AAClD,MAAAA,EAAE,wBAAwB,IAC1BI,EAAI,wBAAwB;AAAA,IAC9B;AAAA,EACJ,CAAG;AACD,SAAOA;AACT;AASA,SAASE,GAAeN,GAAGC,GAAK;AAC9B,SAAOnB,EAAeA,EAAe,IAAIqB,EAAeH,GAAGC,CAAG,CAAC,GAAG,IAAI;AAAA,IACpE,OAAOM,GAAcP,CAAC;AAAA,EAC1B,CAAG;AACH;AACA,IAAIQ,KAAc;AAClB,SAASC,GAAgBC,GAAS;AAEhC,WADIC,IAAM,CAAA,GACD,IAAI,GAAGlD,IAAI,KAAK,IAAIiD,EAAQ,QAAQF,EAAW,GAAG,IAAI/C,GAAG,IAAK,CAAAkD,EAAI,KAAKD,EAAQ,CAAC,CAAC;AAC1F,SAAOC;AACT;AAUA,SAASC,EAAeZ,GAAGa,GAAiBZ,GAAK;AAC/C,MAAIG,IAAM;AAAA,IACR,SAASK,GAAgBT,EAAE,OAAO,EAAE,IAAI,SAAUc,GAAO;AACvD,aAAOf,EAAYe,GAAOb,CAAG;AAAA,IAC/B,CAAC;AAAA,IACD,iBAAiBY,EAAgB,IAAI,SAAUC,GAAO;AACpD,aAAOf,EAAYe,GAAOb,CAAG;AAAA,IAC/B,CAAC;AAAA,IACD,uBAAuB;AAAA,IACvB,qBAAqB,WAA+B;AAClD,MAAAG,EAAI,wBAAwB;AAAA,IAC9B;AAAA,IACA,UAAUJ;AAAA,EACd;AACE,SAAOI;AACT;AAQA,SAASG,GAAcP,GAAG;AAExB,MAAI,OAAOA,EAAE,SAAW,IAAa,QAAOA,EAAE,SAAS,KAAK;AAC5D,MAAI,OAAOA,EAAE,SAAW,IAAa,QAAOA,EAAE,SAAS;AACvD,QAAM,IAAI,MAAM,6CAA6C;AAC/D;AAKA,IAAIe,KAAsB,0BAAUpC,GAAoB;AACtD,WAASoC,EAAOC,GAAWC,GAAU;AACnC,QAAI9K;AACJ,WAAAC,EAAgB,MAAM2K,CAAM,GAC5B5K,IAAQE,EAAW,MAAM0K,CAAM,GAE/B5K,EAAM,YAAY6K,GAClB7K,EAAM,WAAW8K,GACV9K;AAAA,EACT;AACA,SAAAG,EAAUyK,GAAQpC,CAAkB,GAC7BpI,EAAawK,CAAM;AAC5B,GAAE9K,EAAiB,GAEfiL,KAAsB,CAAC,sBAAsB,8BAA8B,2BAA2B,eAAe,0BAA0B,mBAAmB,gBAAgB,gBAAgB,cAAc,GAChNC,KAAyBD,GAAoB,OAAO,SAAUE,GAAMjG,GAAK;AAC3E,SAAO2D,EAAeA,EAAe,CAAA,GAAIsC,CAAI,GAAG,CAAA,GAAIxC,EAAgB,CAAA,GAAIzD,GAAKuC,GAAiBvC,CAAG,CAAC,CAAC;AACrG,GAAG,EAAE,GAUDkG,KAA2B,0BAAUC,GAAS;AAChD,WAASD,EAAYL,GAAWC,GAAU;AACxC,QAAI9K;AACJ,WAAAC,EAAgB,MAAMiL,CAAW,GACjClL,IAAQE,EAAW,MAAMgL,GAAa,CAACL,GAAWC,CAAQ,CAAC,GAI3DrC,EAAgBzI,GAAO,WAAW,EAAI,GACtCyI,EAAgBzI,GAAO,iBAAiB,CAAC,GACzCyI,EAAgBzI,GAAO,iBAAiB,IAAI,GAC5CyI,EAAgBzI,GAAO,cAAc,IAAI,GACzCyI,EAAgBzI,GAAO,cAAc,IAAI,GACzCyI,EAAgBzI,GAAO,eAAe,EAAK,GAC3CyI,EAAgBzI,GAAO,YAAY,EAAK,GACxCyI,EAAgBzI,GAAO,iBAAiB,IAAI,GAC5CyI,EAAgBzI,GAAO,oBAAoB,IAAI,GAC/CyI,EAAgBzI,GAAO,UAAU,CAAC,GAClCyI,EAAgBzI,GAAO,sBAAsB,IAAI,GACjDyI,EAAgBzI,GAAO,yBAAyB,CAAC,GACjDyI,EAAgBzI,GAAO,YAAYgL,EAAsB,GACzDhL,EAAM,cAAcA,EAAM,YAAY,KAAKA,CAAK,GAChDA,EAAM,mBAAmBA,EAAM,iBAAiB,KAAKA,CAAK,GAC1DA,EAAM,aAAaA,EAAM,WAAW,KAAKA,CAAK,GAC9CA,EAAM,WAAWA,EAAM,SAAS,KAAKA,CAAK,GAC1CA,EAAM,aAAaA,EAAM,WAAW,KAAKA,CAAK,GAC9CA,EAAM,cAAcA,EAAM,YAAY,KAAKA,CAAK,GAChDA,EAAM,cAAcA,EAAM,YAAY,KAAKA,CAAK,GAChDA,EAAM,cAAcA,EAAM,YAAY,KAAKA,CAAK,GAGhD6K,EAAU,iBAAiB,SAAS7K,EAAM,aAAa;AAAA,MACrD,SAAS;AAAA,IACf,CAAK,GACD6K,EAAU,iBAAiB,eAAe7K,EAAM,kBAAkB;AAAA,MAChE,SAAS;AAAA,IACf,CAAK,GACD6K,EAAU,iBAAiB,aAAa7K,EAAM,YAAY;AAAA,MACxD,SAAS;AAAA,IACf,CAAK,GACD6K,EAAU,iBAAiB,SAAS7K,EAAM,aAAa;AAAA,MACrD,SAAS;AAAA,IACf,CAAK,GACD6K,EAAU,iBAAiB,cAAc7K,EAAM,aAAa;AAAA,MAC1D,SAAS;AAAA,IACf,CAAK,GACD6K,EAAU,iBAAiB,cAAc7K,EAAM,aAAa;AAAA,MAC1D,SAAS;AAAA,IACf,CAAK,GACD,SAAS,iBAAiB,aAAaA,EAAM,YAAY;AAAA,MACvD,SAAS;AAAA,IACf,CAAK,GACD,SAAS,iBAAiB,WAAWA,EAAM,UAAU;AAAA,MACnD,SAAS;AAAA,IACf,CAAK,GACMA;AAAA,EACT;AACA,SAAAG,EAAU+K,GAAaC,CAAO,GACvB/K,EAAa8K,GAAa,CAAC;AAAA,IAChC,KAAK;AAAA,IACL,OAAO,WAAgB;AACrB,UAAIL,IAAY,KAAK;AACrB,MAAAA,EAAU,oBAAoB,SAAS,KAAK,WAAW,GACvDA,EAAU,oBAAoB,eAAe,KAAK,gBAAgB,GAClEA,EAAU,oBAAoB,aAAa,KAAK,UAAU,GAC1DA,EAAU,oBAAoB,SAAS,KAAK,WAAW,GACvDA,EAAU,oBAAoB,cAAc,KAAK,WAAW,GAC5DA,EAAU,oBAAoB,cAAc,KAAK,WAAW,GAC5D,SAAS,oBAAoB,aAAa,KAAK,UAAU,GACzD,SAAS,oBAAoB,WAAW,KAAK,QAAQ;AAAA,IACvD;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAqB,GAAG;AAC7B,UAAI/B,IAAS;AACb,UAAK,KAAK,SAEV;AAAA,YADA,KAAK,UACD,KAAK,WAAW;AAClB,sBAAK,SAAS,GACV,OAAO,KAAK,sBAAuB,aACrC,aAAa,KAAK,kBAAkB,GACpC,KAAK,qBAAqB,OAErB,KAAK,kBAAkB,CAAC;AAEjC,mBAAW,WAAY;AACrB,UAAAA,EAAO,SAAS,GAChBA,EAAO,qBAAqB;AAAA,QAC9B,GAAG,KAAK,SAAS,kBAAkB,GAG/B,KAAK,gBAAgB,KAAK,SAAS,0BAAwB,KAAK,KAAK,SAASkB,EAAe,GAAG,KAAK,SAAS,CAAC;AAAA;AAAA,IACrH;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAA0B,GAAG;AAClC,MAAK,KAAK,WACV,KAAK,KAAK,cAAcA,EAAe,GAAG,KAAK,SAAS,CAAC;AAAA,IAC3D;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAA2B,GAAG;AACnC,UAAK,KAAK,SACV;AAAA,UAAE,eAAc,GAChB,EAAE,gBAAe;AACjB,YAAIoB,IAAcpB,EAAe,GAAG,KAAK,SAAS;AAElD,YADA,KAAK,KAAK,eAAeoB,CAAW,GAChC,CAAAA,EAAY,uBAGhB;AAAA,cAAIzB,IAAS,KAAK,SAAS,UAAS,GAChC0B,IAAW1B,EAAO,gBAAgBA,EAAO,SAAQ,EAAG,QAAQ,KAAK,SAAS,uBAAuB;AACrG,UAAAA,EAAO,QAAQ,KAAK,SAAS,uBAAuBC,EAAY,GAAG,KAAK,SAAS,GAAGyB,CAAQ,GAAG;AAAA,YAC7F,QAAQ;AAAA,YACR,UAAU,KAAK,SAAS;AAAA,UAChC,CAAO;AAAA;AAAA;AAAA,IACH;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAoB,GAAG;AAC5B,UAAK,KAAK,SAGV;AAAA,YAAI,EAAE,WAAW,GAAG;AAClB,eAAK,mBAAmB,KAAK,SAAS,UAAS,EAAG,SAAQ;AAC1D,cAAIC,IAAe1B,EAAY,GAAG,KAAK,SAAS,GAC9CzI,IAAImK,EAAa,GACjBlK,IAAIkK,EAAa;AACnB,eAAK,aAAanK,GAClB,KAAK,aAAaC,GAClB,KAAK,gBAAgB,GACrB,KAAK,gBAAgB,KAAK,IAAG,GAC7B,KAAK,cAAc;AAAA,QACrB;AACA,aAAK,KAAK,aAAa4I,EAAe,GAAG,KAAK,SAAS,CAAC;AAAA;AAAA,IAC1D;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAkB,GAAG;AAC1B,UAAIuB,IAAS;AACb,UAAI,GAAC,KAAK,WAAW,CAAC,KAAK,cAC3B;AAAA,YAAI5B,IAAS,KAAK,SAAS,UAAS;AACpC,aAAK,cAAc,IACf,OAAO,KAAK,iBAAkB,aAChC,aAAa,KAAK,aAAa,GAC/B,KAAK,gBAAgB;AAEvB,YAAI6B,IAAgB5B,EAAY,GAAG,KAAK,SAAS,GAC/CzI,IAAIqK,EAAc,GAClBpK,IAAIoK,EAAc,GAChBpH,IAAcuF,EAAO,SAAQ,GAC/B8B,IAAsB9B,EAAO,sBAAsB;AAAA,UACjD,GAAG;AAAA,UACH,GAAG;AAAA,QACb;AACM,QAAI,KAAK,WACPA,EAAO,QAAQ;AAAA,UACb,GAAGvF,EAAY,IAAI,KAAK,SAAS,gBAAgBA,EAAY,IAAIqH,EAAoB;AAAA,UACrF,GAAGrH,EAAY,IAAI,KAAK,SAAS,gBAAgBA,EAAY,IAAIqH,EAAoB;AAAA,QAC/F,GAAW;AAAA,UACD,UAAU,KAAK,SAAS;AAAA,UACxB,QAAQ;AAAA,QAClB,CAAS,KACQ,KAAK,eAAetK,KAAK,KAAK,eAAeC,MACtDuI,EAAO,SAAS;AAAA,UACd,GAAGvF,EAAY;AAAA,UACf,GAAGA,EAAY;AAAA,QACzB,CAAS,GAEH,KAAK,WAAW,IAChB,WAAW,WAAY;AACrB,cAAIsH,IAAgBH,EAAO,gBAAgB;AAC3C,UAAAA,EAAO,gBAAgB,GAQnBG,KAAiBH,EAAO,SAAS,WAAW,iBAAiB,KAAGA,EAAO,SAAS,QAAO;AAAA,QAC7F,GAAG,CAAC,GACJ,KAAK,KAAK,WAAWvB,EAAe,GAAG,KAAK,SAAS,CAAC;AAAA;AAAA,IACxD;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAoB,GAAG;AAC5B,UAAI2B,IAAS;AACb,UAAK,KAAK,SACV;AAAA,YAAIP,IAAcpB,EAAe,GAAG,KAAK,SAAS;AAalD,YARA,KAAK,KAAK,iBAAiBoB,CAAW,IAKlC,EAAE,WAAW,KAAK,aAAa,EAAE,aAAY,EAAG,CAAC,MAAM,KAAK,cAC9D,KAAK,KAAK,aAAaA,CAAW,GAEhC,CAAAA,EAAY,yBAIZ,KAAK,aAAa;AACpB,eAAK,WAAW,IAChB,KAAK,iBACD,OAAO,KAAK,iBAAkB,YAChC,aAAa,KAAK,aAAa,GAEjC,KAAK,gBAAgB,OAAO,WAAW,WAAY;AACjD,YAAAO,EAAO,gBAAgB,MACvBA,EAAO,WAAW;AAAA,UACpB,GAAG,KAAK,SAAS,WAAW;AAC5B,cAAIhC,IAAS,KAAK,SAAS,UAAS,GAChCiC,IAAgBhC,EAAY,GAAG,KAAK,SAAS,GAC/CiC,IAAKD,EAAc,GACnBE,IAAKF,EAAc,GACjBG,IAAY,KAAK,SAAS,sBAAsB;AAAA,YAClD,GAAG,KAAK;AAAA,YACR,GAAG,KAAK;AAAA,UAClB,CAAS,GACGC,IAAQ,KAAK,SAAS,sBAAsB;AAAA,YAC9C,GAAGH;AAAA,YACH,GAAGC;AAAA,UACb,CAAS,GACGG,IAAUF,EAAU,IAAIC,EAAM,GAChCE,IAAUH,EAAU,IAAIC,EAAM,GAC5B5H,IAAcuF,EAAO,SAAQ,GAC7BxI,IAAIiD,EAAY,IAAI6H,GACtB,IAAI7H,EAAY,IAAI8H;AACtB,UAAAvC,EAAO,SAAS;AAAA,YACd,GAAGxI;AAAA,YACH;AAAA,UACV,CAAS,GACD,KAAK,aAAa0K,GAClB,KAAK,aAAaC,GAClB,EAAE,eAAc,GAChB,EAAE,gBAAe;AAAA,QACnB;AAAA;AAAA,IACF;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAqB,GAAG;AAC7B,WAAK,KAAK,cAAc9B,EAAe,GAAG,KAAK,SAAS,CAAC;AAAA,IAC3D;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAqB,GAAG;AAC7B,WAAK,KAAK,cAAcA,EAAe,GAAG,KAAK,SAAS,CAAC;AAAA,IAC3D;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAqB,GAAG;AAC7B,UAAImC,IAAS,MACTxC,IAAS,KAAK,SAAS,UAAS;AACpC,UAAI,GAAC,KAAK,WAAW,CAACA,EAAO,iBAC7B;AAAA,YAAIyC,IAAQhC,GAAc,CAAC;AAC3B,YAAKgC,GACL;AAAA,cAAIC,IAAclC,GAAe,GAAG,KAAK,SAAS;AAElD,cADA,KAAK,KAAK,SAASkC,CAAW,GAC1BA,EAAY,uBAAuB;AACrC,cAAE,eAAc,GAChB,EAAE,gBAAe;AACjB;AAAA,UACF;AAGA,cAAIC,IAAe3C,EAAO,SAAQ,EAAG,OACjC4C,IAAYH,IAAQ,IAAI,IAAI,KAAK,SAAS,eAAe,KAAK,SAAS,cACvEf,IAAW1B,EAAO,gBAAgB2C,IAAeC,CAAS,GAC1DC,IAAiBJ,IAAQ,IAAI,IAAI,IACjCK,IAAM,KAAK,IAAG;AAGlB,UAAIH,MAAiBjB,MACrB,EAAE,eAAc,GAChB,EAAE,gBAAe,GAGb,OAAK,0BAA0BmB,KAAkB,KAAK,wBAAwBC,IAAM,KAAK,uBAAuB,KAAK,SAAS,eAAe,OAGjJ9C,EAAO,QAAQ,KAAK,SAAS,uBAAuBC,EAAY,GAAG,KAAK,SAAS,GAAGyB,CAAQ,GAAG;AAAA,YAC7F,QAAQ;AAAA,YACR,UAAU,KAAK,SAAS;AAAA,UAChC,GAAS,WAAY;AACb,YAAAc,EAAO,wBAAwB;AAAA,UACjC,CAAC,GACD,KAAK,wBAAwBK,GAC7B,KAAK,uBAAuBC;AAAA;AAAA;AAAA,IAC9B;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAqBxE,GAAU;AACpC,WAAK,WAAWA;AAAA,IAClB;AAAA,EACJ,CAAG,CAAC;AACJ,GAAE2C,EAAM,GAEJ8B,KAAsB,CAAC,eAAe,mBAAmB,gBAAgB,sBAAsB,2BAA2B,8BAA8B,kBAAkB,GAC1KC,KAAyBD,GAAoB,OAAO,SAAUzB,GAAMjG,GAAK;AAC3E,SAAO2D,EAAeA,EAAe,CAAA,GAAIsC,CAAI,GAAG,CAAA,GAAIxC,EAAgB,CAAA,GAAIzD,GAAKuC,GAAiBvC,CAAG,CAAC,CAAC;AACrG,GAAG,EAAE,GAUD4H,KAA2B,0BAAUzB,GAAS;AAChD,WAASyB,EAAY/B,GAAWC,GAAU;AACxC,QAAI9K;AACJ,WAAAC,EAAgB,MAAM2M,CAAW,GACjC5M,IAAQE,EAAW,MAAM0M,GAAa,CAAC/B,GAAWC,CAAQ,CAAC,GAG3DrC,EAAgBzI,GAAO,WAAW,EAAI,GACtCyI,EAAgBzI,GAAO,YAAY,EAAK,GACxCyI,EAAgBzI,GAAO,YAAY,EAAK,GACxCyI,EAAgBzI,GAAO,aAAa,CAAC,GACrCyI,EAAgBzI,GAAO,yBAAyB,EAAE,GAClDyI,EAAgBzI,GAAO,eAAe,EAAE,GACxCyI,EAAgBzI,GAAO,WAAW,IAAI,GACtCyI,EAAgBzI,GAAO,YAAY2M,EAAsB,GACzD3M,EAAM,cAAcA,EAAM,YAAY,KAAKA,CAAK,GAChDA,EAAM,cAAcA,EAAM,YAAY,KAAKA,CAAK,GAChDA,EAAM,aAAaA,EAAM,WAAW,KAAKA,CAAK,GAG9C6K,EAAU,iBAAiB,cAAc7K,EAAM,aAAa;AAAA,MAC1D,SAAS;AAAA,IACf,CAAK,GACD6K,EAAU,iBAAiB,eAAe7K,EAAM,aAAa;AAAA,MAC3D,SAAS;AAAA,IACf,CAAK,GACD,SAAS,iBAAiB,YAAYA,EAAM,aAAa;AAAA,MACvD,SAAS;AAAA,MACT,SAAS;AAAA,IACf,CAAK,GACD,SAAS,iBAAiB,aAAaA,EAAM,YAAY;AAAA,MACvD,SAAS;AAAA,MACT,SAAS;AAAA,IACf,CAAK,GACMA;AAAA,EACT;AACA,SAAAG,EAAUyM,GAAazB,CAAO,GACvB/K,EAAawM,GAAa,CAAC;AAAA,IAChC,KAAK;AAAA,IACL,OAAO,WAAgB;AACrB,UAAI/B,IAAY,KAAK;AACrB,MAAAA,EAAU,oBAAoB,cAAc,KAAK,WAAW,GAC5DA,EAAU,oBAAoB,eAAe,KAAK,WAAW,GAC7D,SAAS,oBAAoB,YAAY,KAAK,WAAW,GACzD,SAAS,oBAAoB,aAAa,KAAK,UAAU;AAAA,IAC3D;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAyB;AAC9B,aAAO;AAAA,QACL,OAAO,KAAK,UAAU;AAAA,QACtB,QAAQ,KAAK,UAAU;AAAA,MAC/B;AAAA,IACI;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAqB,GAAG;AAC7B,UAAI/B,IAAS;AACb,UAAK,KAAK,SACV;AAAA,UAAE,eAAc;AAChB,YAAIyB,IAAUD,GAAgB,EAAE,OAAO;AAQvC,YAPA,KAAK,YAAYC,EAAQ,QACzB,KAAK,mBAAmB,KAAK,SAAS,UAAS,EAAG,SAAQ,GAC1D,KAAK,wBAAwBA,EAAQ,IAAI,SAAUI,GAAO;AACxD,iBAAOf,EAAYe,GAAO7B,EAAO,SAAS;AAAA,QAC5C,CAAC,GAGG,KAAK,cAAc,GAAG;AACxB,cAAI+D,IAAwB5G,EAAe,KAAK,uBAAuB,CAAC,GACtE6G,IAAyBD,EAAsB,CAAC,GAChDE,IAAKD,EAAuB,GAC5BE,IAAKF,EAAuB,GAC5BG,IAAyBJ,EAAsB,CAAC,GAChDK,IAAKD,EAAuB,GAC5BE,IAAKF,EAAuB;AAC9B,eAAK,oBAAoB,KAAK,MAAME,IAAKH,GAAIE,IAAKH,CAAE,GACpD,KAAK,uBAAuB,KAAK,KAAK,KAAK,IAAIG,IAAKH,GAAI,CAAC,IAAI,KAAK,IAAII,IAAKH,GAAI,CAAC,CAAC;AAAA,QACnF;AACA,aAAK,KAAK,aAAavC,EAAe,GAAG,KAAK,aAAa,KAAK,SAAS,CAAC,GAC1E,KAAK,cAAcF,GACnB,KAAK,uBAAuB,KAAK;AAAA;AAAA,IACnC;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAqB,GAAG;AAC7B,UAAI,GAAC,KAAK,WAAW,CAAC,KAAK,sBAAsB,SAMjD;AAAA,gBALI,EAAE,cAAY,EAAE,eAAc,GAC9B,KAAK,kBACP,KAAK,WAAW,IAChB,aAAa,KAAK,aAAa,IAEzB,KAAK,WAAS;AAAA;AAAA;AAAA,UAGpB,KAAK;AACH,gBAAI,EAAE,QAAQ,WAAW,GAAG;AAC1B,mBAAK,YAAY,CAAC,GAClB,EAAE,eAAc;AAChB;AAAA,YACF;AAAA;AAAA,UAEF,KAAK;AACH,gBAAI,KAAK,UAAU;AACjB,kBAAIZ,IAAS,KAAK,SAAS,UAAS,GAChCvF,IAAcuF,EAAO,SAAQ,GAC/B8B,IAAsB9B,EAAO,sBAAsB;AAAA,gBACjD,GAAG;AAAA,gBACH,GAAG;AAAA,cACnB;AACY,cAAAA,EAAO,QAAQ;AAAA,gBACb,GAAGvF,EAAY,IAAI,KAAK,SAAS,gBAAgBA,EAAY,IAAIqH,EAAoB;AAAA,gBACrF,GAAGrH,EAAY,IAAI,KAAK,SAAS,gBAAgBA,EAAY,IAAIqH,EAAoB;AAAA,cACnG,GAAe;AAAA,gBACD,UAAU,KAAK,SAAS;AAAA,gBACxB,QAAQ;AAAA,cACtB,CAAa;AAAA,YACH;AACA,iBAAK,WAAW,IAChB,KAAK,WAAW,IAChB,KAAK,YAAY;AACjB;AAAA,QACV;AAIM,YAHA,KAAK,KAAK,WAAWhB,EAAe,GAAG,KAAK,aAAa,KAAK,SAAS,CAAC,GAGpE,CAAC,EAAE,QAAQ,QAAQ;AACrB,cAAI2C,IAAWxD,EAAY,KAAK,YAAY,CAAC,GAAG,KAAK,SAAS,GAC1DyD,IAAe,KAAK,sBAAsB,CAAC,GAC3CC,IAAU,KAAK,IAAIF,EAAS,IAAIC,EAAa,GAAG,CAAC,IAAI,KAAK,IAAID,EAAS,IAAIC,EAAa,GAAG,CAAC;AAChG,cAAI,CAAC,EAAE,QAAQ,UAAUC,IAAU,KAAK,IAAI,KAAK,SAAS,kBAAkB,CAAC;AAE3E,gBAAI,KAAK,WAAW,KAAK,IAAG,IAAK,KAAK,QAAQ,OAAO,KAAK,SAAS,oBAAoB;AACrF,kBAAIC,IAAc9C,EAAe,GAAG,KAAK,aAAa,KAAK,SAAS;AAGpE,kBAFA,KAAK,KAAK,aAAa8C,CAAW,GAClC,KAAK,UAAU,MACX,CAACA,EAAY,uBAAuB;AACtC,oBAAIC,IAAU,KAAK,SAAS,UAAS,GACjCnC,IAAWmC,EAAQ,gBAAgBA,EAAQ,SAAQ,EAAG,QAAQ,KAAK,SAAS,uBAAuB;AACvG,gBAAAA,EAAQ,QAAQ,KAAK,SAAS,uBAAuBJ,GAAU/B,CAAQ,GAAG;AAAA,kBACxE,QAAQ;AAAA,kBACR,UAAU,KAAK,SAAS;AAAA,gBACxC,CAAe;AAAA,cACH;AAAA,YACF,OAEK;AACH,kBAAIoC,IAAehD,EAAe,GAAG,KAAK,aAAa,KAAK,SAAS;AACrE,mBAAK,KAAK,OAAOgD,CAAY,GAC7B,KAAK,UAAU;AAAA,gBACb,MAAM,KAAK,IAAG;AAAA,gBACd,UAAUA,EAAa,QAAQ,CAAC,KAAKA,EAAa,gBAAgB,CAAC;AAAA,cACjF;AAAA,YACU;AAAA,QAEJ;AACA,aAAK,cAAcnD,GAAgB,EAAE,OAAO,GAC5C,KAAK,wBAAwB,CAAA;AAAA;AAAA,IAC/B;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAoB,GAAG;AAC5B,UAAIiB,IAAS;AACb,UAAI,GAAC,KAAK,WAAW,CAAC,KAAK,sBAAsB,SACjD;AAAA,UAAE,eAAc;AAChB,YAAIhB,IAAUD,GAAgB,EAAE,OAAO,GACnCoD,IAAmBnD,EAAQ,IAAI,SAAUI,GAAO;AAClD,iBAAOf,EAAYe,GAAOY,EAAO,SAAS;AAAA,QAC5C,CAAC,GACGoC,IAAc,KAAK;AACvB,aAAK,cAAcpD,GACnB,KAAK,uBAAuBmD;AAC5B,YAAIH,IAAc9C,EAAe,GAAGkD,GAAa,KAAK,SAAS;AAE/D,YADA,KAAK,KAAK,aAAaJ,CAAW,GAC9B,CAAAA,EAAY,0BAQhB,KAAK,aAAa,KAAK,WAAWG,EAAiB,KAAK,SAAUN,GAAUQ,IAAK;AAC/E,cAAIC,IAAgBtC,EAAO,sBAAsBqC,EAAG;AACpD,iBAAOC,MAAkBT,EAAS,MAAMS,EAAc,KAAKT,EAAS,MAAMS,EAAc;AAAA,QAC1F,CAAC,IAGG,EAAC,KAAK,WAGV;AAAA,eAAK,WAAW,IACZ,KAAK,iBAAe,aAAa,KAAK,aAAa,GACvD,KAAK,gBAAgB,OAAO,WAAW,WAAY;AACjD,YAAAtC,EAAO,WAAW;AAAA,UACpB,GAAG,KAAK,SAAS,WAAW;AAC5B,cAAI5B,IAAS,KAAK,SAAS,UAAS,GAChCmE,IAAmB,KAAK,kBACxBpK,IAAU,KAAK,SAAS,WAAW,cAAc;AACrD,kBAAQ,KAAK,WAAS;AAAA,YACpB,KAAK,GACH;AACE,kBAAIqK,IAAwB,KAAK,SAAS,uBAAuB,KAAK,yBAAyB,IAAI,CAAC,CAAC,GACnGC,IAASD,EAAsB,GAC/BE,IAASF,EAAsB,GAC7BG,IAAyB,KAAK,SAAS,sBAAsBR,EAAiB,CAAC,CAAC,GAClFvM,IAAI+M,EAAuB,GAC3B9M,IAAI8M,EAAuB;AAC7B,cAAAvE,EAAO,SAAS;AAAA,gBACd,GAAGmE,EAAiB,IAAIE,IAAS7M;AAAA,gBACjC,GAAG2M,EAAiB,IAAIG,IAAS7M;AAAA,cAC/C,CAAa;AACD;AAAA,YACF;AAAA,YACF,KAAK,GACH;AAWE,kBAAI+M,IAAiB;AAAA,gBACnB,GAAG;AAAA,gBACH,GAAG;AAAA,gBACH,OAAO;AAAA,gBACP,OAAO;AAAA,cACrB,GACgBC,IAAqBV,EAAiB,CAAC,GACzCX,IAAKqB,EAAmB,GACxBpB,IAAKoB,EAAmB,GACtBC,IAAsBX,EAAiB,CAAC,GAC1CR,IAAKmB,EAAoB,GACzBlB,IAAKkB,EAAoB,GACvBC,IAAY,KAAK,MAAMnB,IAAKH,GAAIE,IAAKH,CAAE,IAAI,KAAK,mBAChDR,IAAY,KAAK,MAAMY,IAAKH,GAAIE,IAAKH,CAAE,IAAI,KAAK,sBAGhD1B,IAAW1B,EAAO,gBAAgBmE,EAAiB,QAAQvB,CAAS;AACxE,cAAA4B,EAAe,QAAQ9C,GACvB8C,EAAe,QAAQL,EAAiB,QAAQQ;AAGhD,kBAAIC,IAAa,KAAK,cAAa,GAC/BC,IAAqB,KAAK,SAAS,uBAAuB,KAAK,yBAAyB,IAAI,CAAC,GAAG;AAAA,gBAClG,aAAaV;AAAA,cAC3B,CAAa,GACG7J,IAAoB,KAAK,IAAIsK,EAAW,OAAOA,EAAW,MAAM,IAAI,IAAI7K,GACxE+K,IAAKxK,IAAoBsK,EAAW,OACpCG,IAAKzK,IAAoBsK,EAAW,QACpC1K,IAAQwH,IAAWpH,GAGnB0K,IAAK5B,IAAK9I,IAAoB,IAAIwK,GAClCG,IAAK5B,IAAK/I,IAAoB,IAAIyK,GAGlC3O,IAAO,CAAC4O,IAAK,KAAK,IAAI,CAACR,EAAe,KAAK,IAAIS,IAAK,KAAK,IAAI,CAACT,EAAe,KAAK,GAAGS,IAAK,KAAK,IAAI,CAACT,EAAe,KAAK,IAAIQ,IAAK,KAAK,IAAI,CAACR,EAAe,KAAK,CAAC;AACpK,cAAAQ,IAAK5O,EAAK,CAAC,GACX6O,IAAK7O,EAAK,CAAC,GACXoO,EAAe,IAAIK,EAAmB,IAAIG,IAAK9K,GAC/CsK,EAAe,IAAIK,EAAmB,IAAII,IAAK/K,GAC/C8F,EAAO,SAASwE,CAAc;AAC9B;AAAA,YACF;AAAA,UACV;AAAA;AAAA;AAAA,IACI;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAqBlG,GAAU;AACpC,WAAK,WAAWA;AAAA,IAClB;AAAA,EACJ,CAAG,CAAC;AACJ,GAAE2C,EAAM;AAER,SAASiE,GAAmBvN,GAAG;AAC7B,MAAI,MAAM,QAAQA,CAAC,EAAG,QAAOwN,GAAkBxN,CAAC;AAClD;AAEA,SAASyN,GAAiBzN,GAAG;AAC3B,MAAmB,OAAO,SAAtB,OAAwCA,EAAE,OAAO,QAAQ,KAAzB,QAAsCA,EAAE,YAAY,KAAtB,KAAyB,QAAO,MAAM,KAAKA,CAAC;AAChH;AAEA,SAAS0N,KAAqB;AAC5B,QAAM,IAAI,UAAU;AAAA,mFAAsI;AAC5J;AAEA,SAASC,GAAmB3N,GAAG;AAC7B,SAAOuN,GAAmBvN,CAAC,KAAKyN,GAAiBzN,CAAC,KAAK4N,GAA4B5N,CAAC,KAAK0N,GAAkB;AAC7G;AAEA,SAASG,GAA8B7N,GAAGuI,GAAG;AAC3C,MAAYvI,KAAR,KAAW,QAAO,CAAA;AACtB,MAAIiI,IAAI,CAAA;AACR,WAAS6F,KAAK9N,EAAG,KAAI,CAAA,EAAG,eAAe,KAAKA,GAAG8N,CAAC,GAAG;AACjD,QAAWvF,EAAE,QAAQuF,CAAC,MAAlB,GAAqB;AACzB,IAAA7F,EAAE6F,CAAC,IAAI9N,EAAE8N,CAAC;AAAA,EACZ;AACA,SAAO7F;AACT;AAEA,SAAS8F,GAAyBxF,GAAGN,GAAG;AACtC,MAAYM,KAAR,KAAW,QAAO,CAAA;AACtB,MAAIjD,GACFtF,GACA4F,IAAIiI,GAA8BtF,GAAGN,CAAC;AACxC,MAAI,OAAO,uBAAuB;AAChC,QAAI6F,IAAI,OAAO,sBAAsBvF,CAAC;AACtC,SAAKvI,IAAI,GAAGA,IAAI8N,EAAE,QAAQ9N,IAAK,CAAAsF,IAAIwI,EAAE9N,CAAC,GAAUiI,EAAE,QAAQ3C,CAAC,MAAlB,MAAuB,CAAA,EAAG,qBAAqB,KAAKiD,GAAGjD,CAAC,MAAMM,EAAEN,CAAC,IAAIiD,EAAEjD,CAAC;AAAA,EACnH;AACA,SAAOM;AACT;AAeA,IAAIoI,KAA8B,4BAAY;AAC5C,WAASA,EAAetK,GAAKuK,GAAM;AACjC,IAAAtP,EAAgB,MAAMqP,CAAc,GACpC,KAAK,MAAMtK,GACX,KAAK,OAAOuK;AAAA,EACd;AACA,SAAOnP,EAAakP,GAAgB,MAAM,CAAC;AAAA,IACzC,KAAK;AAAA,IACL,OAAO,SAAiBE,GAAOC,GAAQ;AAErC,aAAID,EAAM,OAAOC,EAAO,OAAa,KACjCD,EAAM,OAAOC,EAAO,QAIpBD,EAAM,MAAMC,EAAO,MAAY,IAG5B;AAAA,IACT;AAAA,EACJ,CAAG,CAAC;AACJ,GAAC,GAIGC,KAAyB,4BAAY;AACvC,WAASA,IAAY;AACnB,IAAAzP,EAAgB,MAAMyP,CAAS,GAC/BjH,EAAgB,MAAM,SAAS,CAAC,GAChCA,EAAgB,MAAM,UAAU,CAAC,GACjCA,EAAgB,MAAM,YAAY,CAAC,GACnCA,EAAgB,MAAM,WAAW,CAAC,GAClCA,EAAgB,MAAM,QAAQ,CAAC,GAC/BA,EAAgB,MAAM,SAAS,EAAE;AAAA,EACnC;AACA,SAAOrI,EAAasP,GAAW,CAAC;AAAA,IAC9B,KAAK;AAAA,IACL,OAAO,SAAwBnB,GAAYoB,GAAU;AACnD,WAAK,QAAQpB,EAAW,OACxB,KAAK,SAASA,EAAW,QACzB,KAAK,WAAWoB,GAChB,KAAK,UAAU,KAAK,KAAKpB,EAAW,QAAQoB,CAAQ,GACpD,KAAK,OAAO,KAAK,KAAKpB,EAAW,SAASoB,CAAQ,GAClD,KAAK,QAAQ,CAAA;AAAA,IACf;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAkBC,GAAK;AAC5B,UAAIC,IAAS,KAAK,MAAMD,EAAI,IAAI,KAAK,QAAQ,GACzCE,IAAS,KAAK,MAAMF,EAAI,IAAI,KAAK,QAAQ;AAC7C,aAAOE,IAAS,KAAK,UAAUD;AAAA,IACjC;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAa7K,GAAKuK,GAAMK,GAAK;AAClC,UAAIG,IAAY,IAAIT,GAAetK,GAAKuK,CAAI,GACxCS,IAAQ,KAAK,SAASJ,CAAG,GACzBK,IAAO,KAAK,MAAMD,CAAK;AAC3B,MAAKC,MACHA,IAAO,CAAA,GACP,KAAK,MAAMD,CAAK,IAAIC,IAEtBA,EAAK,KAAKF,CAAS;AAAA,IACrB;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAoB;AACzB,eAASxP,KAAK,KAAK,OAAO;AACxB,YAAI0P,IAAO,KAAK,MAAM1P,CAAC;AACvB,QAAA0P,EAAK,KAAKX,GAAe,OAAO;AAAA,MAClC;AAAA,IACF;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAA4BzL,GAAOqM,GAAS;AAKjD,UAAIC,IAAW,KAAK,WAAW,KAAK,UAChCC,IAAiBD,IAAWtM,IAAQA,GACpCwM,IAAgBD,IAAiBF,IAAUC,GAC3CG,IAAyB,KAAK,KAAKD,CAAa,GAChDE,IAAS,CAAA;AACb,eAAShQ,KAAK,KAAK;AAEjB,iBADI0P,IAAO,KAAK,MAAM1P,CAAC,GACd2G,IAAI,GAAGA,IAAI,KAAK,IAAIoJ,GAAwBL,EAAK,MAAM,GAAG/I;AACjE,UAAAqJ,EAAO,KAAKN,EAAK/I,CAAC,EAAE,GAAG;AAG3B,aAAOqJ;AAAA,IACT;AAAA,EACJ,CAAG,CAAC;AACJ,GAAC;AAaD,SAASC,GAA6BC,GAAQ;AAC5C,MAAIlM,IAAQkM,EAAO,OACjBC,IAAcD,EAAO,aACrBE,IAAmBF,EAAO,kBAC1BG,IAAsBH,EAAO,qBAC3BI,IAAc,CAAA;AAOlB,SAAAtM,EAAM,YAAY,SAAUuM,GAAMlM,GAAGmM,GAAQ1J,GAAQ;AACnD,KAAI0J,MAAWL,KAAerJ,MAAWqJ,KAAeC,EAAiB,IAAII,CAAM,KAAKJ,EAAiB,IAAItJ,CAAM,KAAKuJ,EAAoB,IAAIG,CAAM,KAAKH,EAAoB,IAAIvJ,CAAM,MACvLwJ,EAAY,KAAKC,CAAI;AAAA,EAEzB,CAAC,GACMD;AACT;AAKA,IAAIG,KAAiB,KACjBC,KAAiB,IACjBC,IAAiB,OAAO,UAAU;AAKtC,SAASC,GAAkBlJ,GAAUjD,GAAK0B,GAAM;AAC9C,MAAI,CAACwK,EAAe,KAAKxK,GAAM,GAAG,KAAK,CAACwK,EAAe,KAAKxK,GAAM,GAAG,EAAG,OAAM,IAAI,MAAM,2DAA4D,OAAO1B,GAAK,gJAAuJ,CAAC;AACxT,SAAK0B,EAAK,UAAOA,EAAK,QAAQuB,EAAS,mBACnC,CAACvB,EAAK,SAASA,EAAK,UAAU,OAAIA,EAAK,QAAQ,OAC/CA,EAAK,UAAU,UAAaA,EAAK,UAAU,OAAMA,EAAK,QAAQ,KAAKA,EAAK,QAAWA,EAAK,QAAQ,MAC/FA,EAAK,SAAMA,EAAK,OAAO,IACvBwK,EAAe,KAAKxK,GAAM,QAAQ,MAAGA,EAAK,SAAS,KACnDwK,EAAe,KAAKxK,GAAM,aAAa,MAAGA,EAAK,cAAc,KAC7DwK,EAAe,KAAKxK,GAAM,YAAY,MAAGA,EAAK,aAAa,MAC5D,CAACA,EAAK,QAAQA,EAAK,SAAS,QAAIA,EAAK,OAAOuB,EAAS,kBACpDvB,EAAK,WAAQA,EAAK,SAAS,IACzBA;AACT;AACA,SAAS0K,GAAkBnJ,GAAUoJ,GAAM3K,GAAM;AAC/C,SAAKA,EAAK,UAAOA,EAAK,QAAQuB,EAAS,mBAClCvB,EAAK,UAAOA,EAAK,QAAQ,KACzBA,EAAK,SAAMA,EAAK,OAAO,MACvBwK,EAAe,KAAKxK,GAAM,QAAQ,MAAGA,EAAK,SAAS,KACnDwK,EAAe,KAAKxK,GAAM,YAAY,MAAGA,EAAK,aAAa,MAC5D,CAACA,EAAK,QAAQA,EAAK,SAAS,QAAIA,EAAK,OAAOuB,EAAS,kBACpDvB,EAAK,WAAQA,EAAK,SAAS,IACzBA;AACT;AAUG,IAAC4K,KAAuB,0BAAU9I,GAAoB;AACvD,WAAS+I,EAAMhN,GAAOsG,GAAW;AAC/B,QAAI7K,GACAiI,IAAW,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AAgEnF,QA/DAhI,EAAgB,MAAMsR,CAAK,GAC3BvR,IAAQE,EAAW,MAAMqR,CAAK,GAG9B9I,EAAgBzI,GAAO,YAAY,EAAE,GACrCyI,EAAgBzI,GAAO,kBAAkB,EAAE,GAC3CyI,EAAgBzI,GAAO,iBAAiB,EAAE,GAC1CyI,EAAgBzI,GAAO,iBAAiB,oBAAI,IAAG,CAAE,GACjDyI,EAAgBzI,GAAO,YAAY,EAAE,GACrCyI,EAAgBzI,GAAO,gBAAgB,EAAE,GACzCyI,EAAgBzI,GAAO,mBAAmB,EAAE,GAC5CyI,EAAgBzI,GAAO,aAAa,IAAI0P,GAAS,CAAE,GACnDjH,EAAgBzI,GAAO,iBAAiB,EAAE,GAC1CyI,EAAgBzI,GAAO,iBAAiB,EAAE,GAE1CyI,EAAgBzI,GAAO,oBAAoB,EAAE,GAC7CyI,EAAgBzI,GAAO,oBAAoB,EAAE,GAC7CyI,EAAgBzI,GAAO,yBAAyB,oBAAI,IAAG,CAAE,GACzDyI,EAAgBzI,GAAO,yBAAyB,oBAAI,IAAG,CAAE,GACzDyI,EAAgBzI,GAAO,cAAc;AAAA,MACnC,GAAG,CAAC,GAAG,CAAC;AAAA,MACR,GAAG,CAAC,GAAG,CAAC;AAAA,IACd,CAAK,GACDyI,EAAgBzI,GAAO,eAAe,CAAC,OAAU,MAAS,CAAC,GAC3DyI,EAAgBzI,GAAO,eAAe,CAAC,OAAU,MAAS,CAAC,GAC3DyI,EAAgBzI,GAAO,UAAUgB,GAAU,GAC3CyH,EAAgBzI,GAAO,aAAagB,GAAU,GAC9CyH,EAAgBzI,GAAO,mBAAmB,CAAC,GAC3CyI,EAAgBzI,GAAO,cAAc,IAAI,GACzCyI,EAAgBzI,GAAO,yBAAyB8F,GAA4B;AAAA,MAC1E,GAAG,CAAC,GAAG,CAAC;AAAA,MACR,GAAG,CAAC,GAAG,CAAC;AAAA,IACd,CAAK,CAAC,GAEF2C,EAAgBzI,GAAO,wBAAwB,CAAC,GAChDyI,EAAgBzI,GAAO,gBAAgB,EAAE,GACzCyI,EAAgBzI,GAAO,eAAe,EAAE,GACxCyI,EAAgBzI,GAAO,eAAe,EAAE,GAExCyI,EAAgBzI,GAAO,SAAS,CAAC,GACjCyI,EAAgBzI,GAAO,UAAU,CAAC,GAClCyI,EAAgBzI,GAAO,cAAcuF,IAAe,GACpDkD,EAAgBzI,GAAO,0BAA0B,IAAIA,EAAM,UAAU,GAErEyI,EAAgBzI,GAAO,uBAAuB,oBAAI,IAAG,CAAE,GACvDyI,EAAgBzI,GAAO,uBAAuB,oBAAI,IAAG,CAAE,GACvDyI,EAAgBzI,GAAO,oBAAoB,oBAAI,IAAG,CAAE,GACpDyI,EAAgBzI,GAAO,eAAe,IAAI,GAC1CyI,EAAgBzI,GAAO,eAAe,IAAI,GAE1CyI,EAAgBzI,GAAO,eAAe,IAAI,GAC1CyI,EAAgBzI,GAAO,+BAA+B,IAAI,GAC1DyI,EAAgBzI,GAAO,iBAAiB,EAAK,GAC7CyI,EAAgBzI,GAAO,yBAAyB,IAAI,GAEpDyI,EAAgBzI,GAAO,gBAAgB,EAAE,GACzCyI,EAAgBzI,GAAO,qBAAqB,EAAE,GAC9CyI,EAAgBzI,GAAO,gBAAgB,EAAE,GACzCA,EAAM,WAAWoI,GAAgBH,CAAQ,GAGzCD,GAAiBhI,EAAM,QAAQ,GAC/B8E,GAAcP,CAAK,GACf,EAAEsG,aAAqB,aAAc,OAAM,IAAI,MAAM,6CAA6C;AAGtG,IAAA7K,EAAM,QAAQuE,GACdvE,EAAM,YAAY6K,GAGlB7K,EAAM,mBAAmB,SAAS;AAAA,MAChC,SAASiI,EAAS;AAAA,IACxB,CAAK,GACDjI,EAAM,oBAAoB,YAAY,GACtCA,EAAM,mBAAmB,SAAS;AAAA,MAChC,SAAS;AAAA,IACf,CAAK,GACDA,EAAM,oBAAoB,QAAQ,GAClCA,EAAM,oBAAoB,QAAQ,GAClCA,EAAM,mBAAmB,YAAY,GACrCA,EAAM,oBAAoB,SAAS;AAAA,MACjC,OAAO;AAAA,QACL,aAAa;AAAA,QACb,YAAY;AAAA,MACpB;AAAA,IACA,CAAK,GAGDA,EAAM,OAAM;AAGZ,aAASwR,KAAQxR,EAAM,SAAS;AAC9B,MAAAA,EAAM,oBAAoBwR,GAAMxR,EAAM,SAAS,mBAAmBwR,CAAI,GAAGxR,EAAM,SAAS,wBAAwBwR,CAAI,CAAC;AAEvH,aAASC,KAASzR,EAAM,SAAS;AAC/B,MAAAA,EAAM,oBAAoByR,GAAOzR,EAAM,SAAS,mBAAmByR,CAAK,CAAC;AAI3E,WAAAzR,EAAM,SAAS,IAAIuI,GAAM,GAGzBvI,EAAM,mBAAkB,GAGxBA,EAAM,cAAc,IAAIkL,GAAYlL,EAAM,SAAS,OAAOA,CAAK,GAC/DA,EAAM,YAAY,YAAYA,EAAM,QAAQ,GAC5CA,EAAM,cAAc,IAAI4M,GAAY5M,EAAM,SAAS,OAAOA,CAAK,GAC/DA,EAAM,YAAY,YAAYA,EAAM,QAAQ,GAG5CA,EAAM,kBAAiB,GAGvBA,EAAM,kBAAiB,GAGvBA,EAAM,qBAAoB,GAG1BA,EAAM,QAAO,GACNA;AAAA,EACT;AAeA,SAAAG,EAAUoR,GAAO/I,CAAkB,GAC5BpI,EAAamR,GAAO,CAAC;AAAA,IAC1B,KAAK;AAAA,IACL,OAAO,SAA6BvM,GAAK0M,GAAkBC,GAAkB;AAC3E,aAAI,KAAK,aAAa3M,CAAG,KAAG,KAAK,aAAaA,CAAG,EAAE,KAAI,GACnD,KAAK,kBAAkBA,CAAG,KAAG,KAAK,kBAAkBA,CAAG,EAAE,KAAI,GACjE,KAAK,aAAaA,CAAG,IAAI,IAAI0M,EAAiB,KAAK,cAAc,OAAO,KAAK,aAAa,OAAO,IAAI,GACrG,KAAK,kBAAkB1M,CAAG,IAAI,KAAK2M,KAAoBD,GAAkB,KAAK,cAAc,YAAY,MAAM,IAAI,GAC3G;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAA6B1M,GAAK4M,GAAkB;AACzD,aAAI,KAAK,aAAa5M,CAAG,KAAG,KAAK,aAAaA,CAAG,EAAE,KAAI,GACvD,KAAK,aAAaA,CAAG,IAAI,IAAI4M,EAAiB,KAAK,cAAc,OAAO,KAAK,aAAa,OAAO,IAAI,GAC9F;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAA+B5M,GAAK;AACzC,UAAI,KAAK,aAAaA,CAAG,GAAG;AAC1B,YAAI6M,IAAqB,KAAK,cAC5BC,IAAUD,EAAmB7M,CAAG,GAChC+M,IAAW1C,GAAyBwC,GAAoB,CAAC7M,CAAG,EAAE,IAAIgN,EAAc,CAAC;AACnF,QAAAF,EAAQ,KAAI,GACZ,KAAK,eAAeC;AAAA,MACtB;AACA,UAAI,KAAK,kBAAkB/M,CAAG,GAAG;AAC/B,YAAIiN,IAAwB,KAAK,mBAC/BC,IAAWD,EAAsBjN,CAAG,GACpCmN,IAAY9C,GAAyB4C,GAAuB,CAACjN,CAAG,EAAE,IAAIgN,EAAc,CAAC;AACvF,QAAAE,EAAS,KAAI,GACb,KAAK,eAAeC;AAAA,MACtB;AACA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAA+BnN,GAAK;AACzC,UAAI,KAAK,aAAaA,CAAG,GAAG;AAC1B,YAAIoN,IAAqB,KAAK,cAC5BN,IAAUM,EAAmBpN,CAAG,GAChC+M,IAAW1C,GAAyB+C,GAAoB,CAACpN,CAAG,EAAE,IAAIgN,EAAc,CAAC;AACnF,QAAAF,EAAQ,KAAI,GACZ,KAAK,eAAeC;AAAA,MACtB;AACA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAA2BM,GAAI;AACpC,UAAIC,IAAK,KAAK,cAAcD,CAAE,GAC1BE,IAAc,KAAK,aAAaF,CAAE,GAClCG,IAAiB,KAAK,SAASH,CAAE;AACrC,MAAIG,KAAgBF,EAAG,cAAcE,CAAc;AACnD,UAAIC,IAAiBH,EAAG,cAAa;AACrC,aAAAA,EAAG,gBAAgBA,EAAG,aAAaC,CAAW,GAC9CD,EAAG,YAAYA,EAAG,YAAYG,CAAc,GAC5CH,EAAG,WAAWA,EAAG,YAAY,GAAGA,EAAG,MAAM,KAAK,OAAO,KAAK,QAAQ,GAAGA,EAAG,MAAMA,EAAG,eAAe,IAAI,GACpGA,EAAG,qBAAqBA,EAAG,aAAaA,EAAG,mBAAmBA,EAAG,YAAYG,GAAgB,CAAC,GAC9F,KAAK,SAASJ,CAAE,IAAII,GACb;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAA8B;AACnC,UAAI3J,IAAS;AACb,kBAAK,gBAAgB,SAAS,WAAY;AACxC,QAAAA,EAAO,eAAc;AAAA,MACvB,GACA,KAAK,OAAO,GAAG,WAAW,KAAK,gBAAgB,MAAM,GAC9C;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAgC;AACrC,kBAAK,OAAO,eAAe,WAAW,KAAK,gBAAgB,MAAM,GAC1D;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAA2BsE,GAAU;AAC1C,UAAIjM,IAAIiM,EAAS,GACfhM,IAAIgM,EAAS,GACXsF,IAAQC,GAAc,KAAK,cAAc,OAAO,KAAK,aAAa,OAAOxR,GAAGC,GAAG,KAAK,YAAY,KAAK,sBAAsB,GAC3H4O,IAAQ4C,GAAa,MAAM,QAAQ3D,GAAmByD,CAAK,CAAC,GAC5DG,IAAS,KAAK,aAAa7C,CAAK;AACpC,aAAO6C,KAAUA,EAAO,SAAS,SAASA,EAAO,KAAK;AAAA,IACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAA6B;AAClC,UAAItH,IAAS;AAEb,WAAK,gBAAgB,eAAe,WAAY;AAE9C,QAAAA,EAAO,gBAAe;AAAA,MACxB,GACA,OAAO,iBAAiB,UAAU,KAAK,gBAAgB,YAAY,GAGnE,KAAK,gBAAgB,aAAa,SAAU1B,GAAG;AAC7C,YAAIiJ,IAAQ5I,EAAiBL,CAAC,GAC1BkJ,IAAY;AAAA,UACd,OAAOD;AAAA,UACP,qBAAqB,WAA+B;AAClD,YAAAA,EAAM,oBAAmB;AAAA,UAC3B;AAAA,QACV,GACYE,IAAczH,EAAO,kBAAkBuH,CAAK;AAChD,YAAIE,KAAezH,EAAO,gBAAgByH,KAAe,CAACzH,EAAO,cAAcyH,CAAW,EAAE,QAAQ;AAElG,UAAIzH,EAAO,eAAaA,EAAO,KAAK,aAAa5C,EAAeA,EAAe,CAAA,GAAIoK,CAAS,GAAG,CAAA,GAAI;AAAA,YACjG,MAAMxH,EAAO;AAAA,UACzB,CAAW,CAAC,GACFA,EAAO,cAAcyH,GACrBzH,EAAO,KAAK,aAAa5C,EAAeA,EAAe,IAAIoK,CAAS,GAAG,IAAI;AAAA,YACzE,MAAMC;AAAA,UAClB,CAAW,CAAC,GACFzH,EAAO,+BAA8B;AACrC;AAAA,QACF;AAGA,YAAIA,EAAO,eACLA,EAAO,kBAAkBuH,CAAK,MAAMvH,EAAO,aAAa;AAC1D,cAAI0H,IAAO1H,EAAO;AAClB,UAAAA,EAAO,cAAc,MACrBA,EAAO,KAAK,aAAa5C,EAAeA,EAAe,IAAIoK,CAAS,GAAG,IAAI;AAAA,YACzE,MAAME;AAAA,UACpB,CAAa,CAAC,GACF1H,EAAO,+BAA8B;AACrC;AAAA,QACF;AAEF,YAAIA,EAAO,SAAS,kBAAkB;AACpC,cAAI2H,IAAc3H,EAAO,cAAc,OAAOA,EAAO,eAAewH,EAAU,MAAM,GAAGA,EAAU,MAAM,CAAC;AACxG,UAAIG,MAAgB3H,EAAO,gBACrBA,EAAO,eAAaA,EAAO,KAAK,aAAa5C,EAAeA,EAAe,CAAA,GAAIoK,CAAS,GAAG,CAAA,GAAI;AAAA,YACjG,MAAMxH,EAAO;AAAA,UAC3B,CAAa,CAAC,GACE2H,KAAa3H,EAAO,KAAK,aAAa5C,EAAeA,EAAe,CAAA,GAAIoK,CAAS,GAAG,IAAI;AAAA,YAC1F,MAAMG;AAAA,UACpB,CAAa,CAAC,GACF3H,EAAO,cAAc2H;AAAA,QAEzB;AAAA,MACF,GAGA,KAAK,gBAAgB,iBAAiB,SAAUrJ,GAAG;AACjD,YAAIiJ,IAAQ5I,EAAiBL,CAAC;AAC9B,QAAA0B,EAAO,KAAK,YAAY;AAAA,UACtB,OAAOuH;AAAA,UACP,qBAAqB,WAA+B;AAClD,YAAAA,EAAM,oBAAmB;AAAA,UAC3B;AAAA,QACV,CAAS;AAAA,MACH,GAGA,KAAK,gBAAgB,cAAc,SAAUjJ,GAAG;AAC9C,YAAIiJ,IAAQ5I,EAAiBL,CAAC,GAC1BkJ,IAAY;AAAA,UACd,OAAOD;AAAA,UACP,qBAAqB,WAA+B;AAClD,YAAAA,EAAM,oBAAmB;AAAA,UAC3B;AAAA,QACV;AACQ,QAAIvH,EAAO,gBACTA,EAAO,KAAK,aAAa5C,EAAeA,EAAe,IAAIoK,CAAS,GAAG,IAAI;AAAA,UACzE,MAAMxH,EAAO;AAAA,QACzB,CAAW,CAAC,GACFA,EAAO,+BAA8B,IAEnCA,EAAO,SAAS,oBAAoBA,EAAO,gBAC7CA,EAAO,KAAK,aAAa5C,EAAeA,EAAe,IAAIoK,CAAS,GAAG,IAAI;AAAA,UACzE,MAAMxH,EAAO;AAAA,QACzB,CAAW,CAAC,GACFA,EAAO,+BAA8B,IAEvCA,EAAO,KAAK,cAAc5C,EAAe,CAAA,GAAIoK,CAAS,CAAC;AAAA,MACzD,GAGA,KAAK,gBAAgB,cAAc,SAAUlJ,GAAG;AAC9C,YAAIiJ,IAAQ5I,EAAiBL,CAAC,GAC1BkJ,IAAY;AAAA,UACd,OAAOD;AAAA,UACP,qBAAqB,WAA+B;AAClD,YAAAA,EAAM,oBAAmB;AAAA,UAC3B;AAAA,QACV;AACQ,QAAAvH,EAAO,KAAK,cAAc5C,EAAe,CAAA,GAAIoK,CAAS,CAAC;AAAA,MACzD;AAGA,UAAII,IAA4B,SAAmCC,GAAW;AAC5E,eAAO,SAAUvJ,GAAG;AAClB,cAAIiJ,IAAQ5I,EAAiBL,CAAC,GAC1BkJ,IAAY;AAAA,YACd,OAAOD;AAAA,YACP,qBAAqB,WAA+B;AAClD,cAAAA,EAAM,oBAAmB;AAAA,YAC3B;AAAA,UACZ,GACcO,IAAiB9H,EAAO,kBAAkBuH,CAAK;AACnD,cAAIO,EAAgB,QAAO9H,EAAO,KAAK,GAAG,OAAO6H,GAAW,MAAM,GAAGzK,EAAeA,EAAe,CAAA,GAAIoK,CAAS,GAAG,CAAA,GAAI;AAAA,YACrH,MAAMM;AAAA,UAClB,CAAW,CAAC;AACF,cAAI9H,EAAO,SAAS,kBAAkB;AACpC,gBAAIuF,IAAOvF,EAAO,eAAeuH,EAAM,GAAGA,EAAM,CAAC;AACjD,gBAAIhC,EAAM,QAAOvF,EAAO,KAAK,GAAG,OAAO6H,GAAW,MAAM,GAAGzK,EAAeA,EAAe,CAAA,GAAIoK,CAAS,GAAG,CAAA,GAAI;AAAA,cAC3G,MAAMjC;AAAA,YACpB,CAAa,CAAC;AAAA,UACJ;AACA,iBAAOvF,EAAO,KAAK,GAAG,OAAO6H,GAAW,OAAO,GAAGL,CAAS;AAAA,QAC7D;AAAA,MACF;AACA,kBAAK,gBAAgB,cAAcI,EAA0B,OAAO,GACpE,KAAK,gBAAgB,mBAAmBA,EAA0B,YAAY,GAC9E,KAAK,gBAAgB,oBAAoBA,EAA0B,aAAa,GAChF,KAAK,gBAAgB,cAAcA,EAA0B,OAAO,GACpE,KAAK,gBAAgB,aAAaA,EAA0B,MAAM,GAClE,KAAK,gBAAgB,WAAWA,EAA0B,IAAI,GAC9D,KAAK,YAAY,GAAG,aAAa,KAAK,gBAAgB,UAAU,GAChE,KAAK,YAAY,GAAG,iBAAiB,KAAK,gBAAgB,cAAc,GACxE,KAAK,YAAY,GAAG,SAAS,KAAK,gBAAgB,WAAW,GAC7D,KAAK,YAAY,GAAG,cAAc,KAAK,gBAAgB,gBAAgB,GACvE,KAAK,YAAY,GAAG,eAAe,KAAK,gBAAgB,iBAAiB,GACzE,KAAK,YAAY,GAAG,SAAS,KAAK,gBAAgB,WAAW,GAC7D,KAAK,YAAY,GAAG,aAAa,KAAK,gBAAgB,UAAU,GAChE,KAAK,YAAY,GAAG,WAAW,KAAK,gBAAgB,QAAQ,GAC5D,KAAK,YAAY,GAAG,cAAc,KAAK,gBAAgB,WAAW,GAClE,KAAK,YAAY,GAAG,cAAc,KAAK,gBAAgB,WAAW,GAClE,KAAK,YAAY,GAAG,aAAa,KAAK,gBAAgB,UAAU,GAChE,KAAK,YAAY,GAAG,aAAa,KAAK,gBAAgB,UAAU,GAChE,KAAK,YAAY,GAAG,WAAW,KAAK,gBAAgB,QAAQ,GAC5D,KAAK,YAAY,GAAG,aAAa,KAAK,gBAAgB,UAAU,GAChE,KAAK,YAAY,GAAG,OAAO,KAAK,gBAAgB,WAAW,GAC3D,KAAK,YAAY,GAAG,aAAa,KAAK,gBAAgB,iBAAiB,GACvE,KAAK,YAAY,GAAG,aAAa,KAAK,gBAAgB,cAAc,GAC7D;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAA6B;AAClC,UAAIxH,IAAS,MACTpH,IAAQ,KAAK,OACb+O,IAA0B,oBAAI,IAAI,CAAC,KAAK,KAAK,UAAU,MAAM,CAAC;AAClE,kBAAK,gBAAgB,uCAAuC,SAAUzJ,GAAG;AACvE,YAAI0J,GACAC,KAAiBD,IAAW1J,EAAE,WAAW,QAAQ0J,MAAa,SAAS,SAASA,EAAS;AAE7F,QAAA5H,EAAO,MAAM,YAAY,SAAUsH,GAAM;AACvC,iBAAOtH,EAAO,WAAWsH,CAAI;AAAA,QAC/B,CAAC;AAID,YAAIQ,IAAgB,CAACD,KAAiBA,EAAc,KAAK,SAAUE,GAAG;AACpE,iBAAOJ,EAAwB,IAAII,CAAC;AAAA,QACtC,CAAC;AACD,QAAA/H,EAAO,QAAQ;AAAA,UACb,cAAc;AAAA,YACZ,OAAOpH,EAAM,MAAK;AAAA,UAC9B;AAAA,UACU,gBAAgB,CAACkP;AAAA,UACjB,UAAU;AAAA,QACpB,CAAS;AAAA,MACH,GACA,KAAK,gBAAgB,uCAAuC,SAAU5J,GAAG;AACvE,YAAI8J,GACAH,KAAiBG,IAAY9J,EAAE,WAAW,QAAQ8J,MAAc,SAAS,SAASA,EAAU;AAEhG,QAAAhI,EAAO,MAAM,YAAY,SAAUmF,GAAM;AACvC,iBAAOnF,EAAO,WAAWmF,CAAI;AAAA,QAC/B,CAAC;AACD,YAAI2C,IAAgBD,KAAiB,CAAC,UAAU,MAAM,EAAE,KAAK,SAAUE,GAAG;AACxE,iBAAOF,KAAkB,OAAmC,SAASA,EAAc,SAASE,CAAC;AAAA,QAC/F,CAAC;AACD,QAAA/H,EAAO,QAAQ;AAAA,UACb,cAAc;AAAA,YACZ,OAAOpH,EAAM,MAAK;AAAA,UAC9B;AAAA,UACU,gBAAgB,CAACkP;AAAA,UACjB,UAAU;AAAA,QACpB,CAAS;AAAA,MACH,GAGA,KAAK,gBAAgB,qBAAqB,SAAUG,GAAS;AAC3D,YAAIX,IAAOW,EAAQ;AAEnB,QAAAjI,EAAO,QAAQsH,CAAI,GAEnBtH,EAAO,QAAQ;AAAA,UACb,cAAc;AAAA,YACZ,OAAO,CAACsH,CAAI;AAAA,UACxB;AAAA,UACU,gBAAgB;AAAA,UAChB,UAAU;AAAA,QACpB,CAAS;AAAA,MACH,GAGA,KAAK,gBAAgB,wBAAwB,SAAUW,GAAS;AAC9D,YAAIX,IAAOW,EAAQ;AAEnB,QAAAjI,EAAO,QAAQ;AAAA,UACb,cAAc;AAAA,YACZ,OAAO,CAACsH,CAAI;AAAA,UACxB;AAAA,UACU,gBAAgB;AAAA,UAChB,UAAU;AAAA,QACpB,CAAS;AAAA,MACH,GAGA,KAAK,gBAAgB,sBAAsB,SAAUW,GAAS;AAC5D,YAAIX,IAAOW,EAAQ;AAEnB,QAAAjI,EAAO,WAAWsH,CAAI,GAEtBtH,EAAO,QAAQ;AAAA,UACb,UAAU;AAAA,QACpB,CAAS;AAAA,MACH,GAGA,KAAK,gBAAgB,qBAAqB,SAAUiI,GAAS;AAC3D,YAAI9C,IAAO8C,EAAQ;AAEnB,QAAAjI,EAAO,QAAQmF,CAAI,GAEnBnF,EAAO,QAAQ;AAAA,UACb,cAAc;AAAA,YACZ,OAAO,CAACmF,CAAI;AAAA,UACxB;AAAA,UACU,UAAU;AAAA,QACpB,CAAS;AAAA,MACH,GAGA,KAAK,gBAAgB,wBAAwB,SAAU8C,GAAS;AAC9D,YAAI9C,IAAO8C,EAAQ;AAEnB,QAAAjI,EAAO,QAAQ;AAAA,UACb,cAAc;AAAA,YACZ,OAAO,CAACmF,CAAI;AAAA,UACxB;AAAA,UACU,gBAAgB;AAAA,UAChB,UAAU;AAAA,QACpB,CAAS;AAAA,MACH,GAGA,KAAK,gBAAgB,sBAAsB,SAAU8C,GAAS;AAC5D,YAAI9C,IAAO8C,EAAQ;AAEnB,QAAAjI,EAAO,WAAWmF,CAAI,GAEtBnF,EAAO,QAAQ;AAAA,UACb,UAAU;AAAA,QACpB,CAAS;AAAA,MACH,GAGA,KAAK,gBAAgB,wBAAwB,WAAY;AAEvD,QAAAA,EAAO,eAAc,GACrBA,EAAO,iBAAgB,GAEvBA,EAAO,QAAQ;AAAA,UACb,UAAU;AAAA,QACpB,CAAS;AAAA,MACH,GAGA,KAAK,gBAAgB,mBAAmB,WAAY;AAElD,QAAAA,EAAO,eAAc,GACrBA,EAAO,eAAc,GAGrBA,EAAO,iBAAgB,GACvBA,EAAO,iBAAgB,GAGvBA,EAAO,QAAQ;AAAA,UACb,UAAU;AAAA,QACpB,CAAS;AAAA,MACH,GACApH,EAAM,GAAG,aAAa,KAAK,gBAAgB,kBAAkB,GAC7DA,EAAM,GAAG,eAAe,KAAK,gBAAgB,mBAAmB,GAChEA,EAAM,GAAG,yBAAyB,KAAK,gBAAgB,qBAAqB,GAC5EA,EAAM,GAAG,6BAA6B,KAAK,gBAAgB,oCAAoC,GAC/FA,EAAM,GAAG,aAAa,KAAK,gBAAgB,kBAAkB,GAC7DA,EAAM,GAAG,eAAe,KAAK,gBAAgB,mBAAmB,GAChEA,EAAM,GAAG,yBAAyB,KAAK,gBAAgB,qBAAqB,GAC5EA,EAAM,GAAG,6BAA6B,KAAK,gBAAgB,oCAAoC,GAC/FA,EAAM,GAAG,gBAAgB,KAAK,gBAAgB,qBAAqB,GACnEA,EAAM,GAAG,WAAW,KAAK,gBAAgB,gBAAgB,GAClD;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAA+B;AACpC,UAAIA,IAAQ,KAAK;AACjB,MAAAA,EAAM,eAAe,aAAa,KAAK,gBAAgB,kBAAkB,GACzEA,EAAM,eAAe,eAAe,KAAK,gBAAgB,mBAAmB,GAC5EA,EAAM,eAAe,yBAAyB,KAAK,gBAAgB,qBAAqB,GACxFA,EAAM,eAAe,6BAA6B,KAAK,gBAAgB,oCAAoC,GAC3GA,EAAM,eAAe,aAAa,KAAK,gBAAgB,kBAAkB,GACzEA,EAAM,eAAe,eAAe,KAAK,gBAAgB,mBAAmB,GAC5EA,EAAM,eAAe,yBAAyB,KAAK,gBAAgB,qBAAqB,GACxFA,EAAM,eAAe,6BAA6B,KAAK,gBAAgB,oCAAoC,GAC3GA,EAAM,eAAe,gBAAgB,KAAK,gBAAgB,qBAAqB,GAC/EA,EAAM,eAAe,WAAW,KAAK,gBAAgB,gBAAgB;AAAA,IACvE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAwBpD,GAAGC,GAAG;AACnC,UAAIsR,IAAQC,GAAc,KAAK,cAAc,OAAO,KAAK,aAAa,OAAOxR,GAAGC,GAAG,KAAK,YAAY,KAAK,sBAAsB,GAC3H4O,IAAQ4C,GAAa,MAAM,QAAQ3D,GAAmByD,CAAK,CAAC,GAC5DG,IAAS,KAAK,aAAa7C,CAAK;AACpC,aAAO6C,KAAUA,EAAO,SAAS,SAASA,EAAO,KAAK;AAAA,IACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAmB;AACxB,UAAI1G,IAAS;AACb,WAAK,KAAK,eAAe;AACzB,UAAI5H,IAAQ,KAAK,OACb0D,IAAW,KAAK,UAChBsG,IAAa,KAAK,cAAa;AAMnC,UADA,KAAK,aAAajK,GAAY,KAAK,KAAK,GACpC,CAAC,KAAK,SAAS,aAAa;AAC9B,YAAIR,IAAQyK,EAAW,OACrBxK,IAASwK,EAAW,QAClBsF,IAAmB,KAAK,YAC1B1S,IAAI0S,EAAiB,GACrBzS,IAAIyS,EAAiB;AACvB,aAAK,aAAa;AAAA,UAChB,GAAG,EAAE1S,EAAE,CAAC,IAAIA,EAAE,CAAC,KAAK,IAAI2C,IAAQ,IAAI3C,EAAE,CAAC,IAAIA,EAAE,CAAC,KAAK,IAAI2C,IAAQ,CAAC;AAAA,UAChE,GAAG,EAAE1C,EAAE,CAAC,IAAIA,EAAE,CAAC,KAAK,IAAI2C,IAAS,IAAI3C,EAAE,CAAC,IAAIA,EAAE,CAAC,KAAK,IAAI2C,IAAS,CAAC;AAAA,QAC5E;AAAA,MACM;AACA,WAAK,wBAAwB+B,GAA4B,KAAK,cAAc,KAAK,UAAU;AAI3F,UAAIgO,IAAa,IAAIvL,GAAM,GACvBwL,IAAmBvQ,EAAiBsQ,EAAW,SAAQ,GAAIvF,GAAY,KAAK,mBAAkB,GAAI,KAAK,gBAAe,CAAE;AAG5H,WAAK,UAAU,eAAeA,GAAYtG,EAAS,iBAAiB;AASpE,eARI+L,IAAmB,CAAA,GACnBC,IAAc,CAAA,GACdC,IAAc,CAAA,GACdC,IAAe,CAAA,GACfC,IAAS,GACTC,IAAQ9P,EAAM,MAAK,GAGd2C,IAAI,GAAGI,IAAI+M,EAAM,QAAQnN,IAAII,GAAGJ,KAAK;AAC5C,YAAI+L,IAAOoB,EAAMnN,CAAC,GACdR,IAAO,KAAK,cAAcuM,CAAI,GAG9BqB,IAAQ/P,EAAM,kBAAkB0O,CAAI;AACxC,QAAAvM,EAAK,IAAI4N,EAAM,GACf5N,EAAK,IAAI4N,EAAM,GACf,KAAK,sBAAsB,QAAQ5N,CAAI,GAGnC,OAAOA,EAAK,SAAU,YAAY,CAACA,EAAK,UAAQ,KAAK,UAAU,IAAIuM,GAAMvM,EAAK,MAAM,KAAK,sBAAsBA,GAAM;AAAA,UACvH,QAAQqN;AAAA,QAClB,CAAS,CAAC,GAGFC,EAAiBtN,EAAK,IAAI,KAAKsN,EAAiBtN,EAAK,IAAI,KAAK,KAAK;AAAA,MACrE;AACA,WAAK,UAAU,SAAQ;AAGvB,eAAS8K,KAAQ,KAAK,cAAc;AAClC,YAAI,CAACN,EAAe,KAAK,KAAK,cAAcM,CAAI;AAC9C,gBAAM,IAAI,MAAM,2DAA4D,OAAOA,GAAM,IAAK,CAAC;AAEjG,aAAK,aAAaA,CAAI,EAAE,WAAWwC,EAAiBxC,CAAI,KAAK,CAAC,GAE9DwC,EAAiBxC,CAAI,IAAI;AAAA,MAC3B;AAGA,MAAI,KAAK,SAAS,UAAU,KAAK,YAAY,CAAC,MAAM,KAAK,YAAY,CAAC,MAAG6C,IAAQ7O,GAAe,KAAK,aAAa,SAAUyN,IAAM;AAChI,eAAO9G,EAAO,cAAc8G,EAAI,EAAE;AAAA,MACpC,GAAGoB,CAAK;AAGR,eAASE,IAAK,GAAGC,IAAKH,EAAM,QAAQE,IAAKC,GAAID,KAAM;AACjD,YAAIE,IAAQJ,EAAME,CAAE;AACpB,QAAAN,EAAYQ,CAAK,IAAIL,GACrBD,EAAaF,EAAYQ,CAAK,CAAC,IAAI;AAAA,UACjC,MAAM;AAAA,UACN,IAAIA;AAAA,QACd,GACQL;AACA,YAAIM,IAAQ,KAAK,cAAcD,CAAK;AACpC,aAAK,iBAAiBA,GAAOR,EAAYQ,CAAK,GAAGT,EAAiBU,EAAM,IAAI,GAAG;AAAA,MACjF;AAUA,eAJIC,IAAmB,CAAA,GACnBC,IAAQrQ,EAAM,MAAK,GAGdsQ,IAAM,GAAGC,IAAMF,EAAM,QAAQC,IAAMC,GAAKD,KAAO;AACtD,YAAI/D,IAAO8D,EAAMC,CAAG,GAChBE,IAAS,KAAK,cAAcjE,CAAI;AACpC,QAAA6D,EAAiBI,EAAO,IAAI,KAAKJ,EAAiBI,EAAO,IAAI,KAAK,KAAK;AAAA,MACzE;AAGA,MAAI,KAAK,SAAS,UAAU,KAAK,YAAY,CAAC,MAAM,KAAK,YAAY,CAAC,MAAGH,IAAQpP,GAAe,KAAK,aAAa,SAAUsL,IAAM;AAChI,eAAO3E,EAAO,cAAc2E,EAAI,EAAE;AAAA,MACpC,GAAG8D,CAAK;AACR,eAASI,KAAU,KAAK,cAAc;AACpC,YAAI,CAAC9D,EAAe,KAAK,KAAK,cAAc8D,CAAM;AAChD,gBAAM,IAAI,MAAM,2DAA4D,OAAOA,GAAQ,IAAK,CAAC;AAEnG,aAAK,aAAaA,CAAM,EAAE,WAAWL,EAAiBK,CAAM,KAAK,CAAC,GAElEL,EAAiBK,CAAM,IAAI;AAAA,MAC7B;AAGA,eAASC,IAAM,GAAGC,KAAMN,EAAM,QAAQK,IAAMC,IAAKD,KAAO;AACtD,YAAIE,IAAQP,EAAMK,CAAG;AACrB,QAAAf,EAAYiB,CAAK,IAAIf,GACrBD,EAAaD,EAAYiB,CAAK,CAAC,IAAI;AAAA,UACjC,MAAM;AAAA,UACN,IAAIA;AAAA,QACd,GACQf;AACA,YAAIgB,KAAS,KAAK,cAAcD,CAAK;AACrC,aAAK,iBAAiBA,GAAOjB,EAAYiB,CAAK,GAAGR,EAAiBS,GAAO,IAAI,GAAG;AAAA,MAClF;AACA,kBAAK,eAAejB,GACpB,KAAK,cAAcF,GACnB,KAAK,cAAcC,GACnB,KAAK,KAAK,cAAc,GACjB;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAA8BmB,GAAa;AAChD,UAAIC,IAAS,MACTrN,IAAW,KAAK;AAcpB,UAbA,KAAK,OAAO,WAAWA,EAAS,gBAChC,KAAK,OAAO,WAAWA,EAAS,gBAChC,KAAK,OAAO,iBAAiBA,EAAS,qBACtC,KAAK,OAAO,iBAAiBA,EAAS,qBACtC,KAAK,OAAO,kBAAkBA,EAAS,sBACnCA,EAAS,sBACX,KAAK,OAAO,QAAQ,SAAUxE,GAAO;AACnC,eAAO6R,EAAO,iBAAiB7R,GAAOwE,EAAS,uBAAuBtB,GAAQsB,EAAS,mBAAmB,MAAM,WAAWA,EAAS,sBAAsB,CAAA,CAAE;AAAA,MAC9J,IAEA,KAAK,OAAO,QAAQ,MAEtB,KAAK,OAAO,SAAS,KAAK,OAAO,cAAc,KAAK,OAAO,SAAQ,CAAE,CAAC,GAClEoN,GAAa;AAEf,YAAIA,EAAY,uBAAuBpN,EAAS,oBAAoB;AAClE,mBAASuJ,KAAQvJ,EAAS;AACxB,YAAIA,EAAS,mBAAmBuJ,CAAI,MAAM6D,EAAY,mBAAmB7D,CAAI,KAC3E,KAAK,oBAAoBA,GAAMvJ,EAAS,mBAAmBuJ,CAAI,CAAC;AAGpE,mBAAS+D,KAAUF,EAAY;AAC7B,YAAKpN,EAAS,mBAAmBsN,CAAM,KAAG,KAAK,sBAAsBA,CAAM;AAAA,QAE/E;AAGA,YAAIF,EAAY,uBAAuBpN,EAAS,sBAAsBoN,EAAY,4BAA4BpN,EAAS,yBAAyB;AAC9I,mBAASuN,KAAUvN,EAAS;AAC1B,aAAIA,EAAS,mBAAmBuN,CAAM,MAAMH,EAAY,mBAAmBG,CAAM,KAAKvN,EAAS,wBAAwBuN,CAAM,MAAMH,EAAY,wBAAwBG,CAAM,MAC3K,KAAK,oBAAoBA,GAAQvN,EAAS,mBAAmBuN,CAAM,GAAGvN,EAAS,wBAAwBuN,CAAM,CAAC;AAGlH,mBAASC,KAAUJ,EAAY;AAC7B,YAAKpN,EAAS,mBAAmBwN,CAAM,KAAG,KAAK,sBAAsBA,CAAM;AAAA,QAE/E;AAAA,MACF;AAGA,kBAAK,YAAY,YAAY,KAAK,QAAQ,GAC1C,KAAK,YAAY,YAAY,KAAK,QAAQ,GACnC;AAAA,IACT;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAA0BhS,GAAO;AACtC,UAAI1D,IAAO,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA,GAC7E2V,IAAiB3V,EAAK,WACtB4V,IAAYD,MAAmB,SAAS,IAAIA,GAC5CE,IAAa7V,EAAK,YAChB0J,IAAWd,EAAe,CAAA,GAAIlF,CAAK,GAGnCoS,IAAQD,KAAc,KAAK,YAC7BE,IAAU7P,EAAe4P,EAAM,GAAG,CAAC,GACnCE,IAAYD,EAAQ,CAAC,GACrBE,IAAYF,EAAQ,CAAC,GACrBG,IAAUhQ,EAAe4P,EAAM,GAAG,CAAC,GACnCK,IAAYD,EAAQ,CAAC,GACrBE,IAAYF,EAAQ,CAAC,GAGnBG,IAAU,CAAC,KAAK,gBAAgB;AAAA,QAClC,GAAGL;AAAA,QACH,GAAGG;AAAA,MACX,GAAS;AAAA,QACD,aAAazS;AAAA,MACrB,CAAO,GAAG,KAAK,gBAAgB;AAAA,QACvB,GAAGuS;AAAA,QACH,GAAGE;AAAA,MACX,GAAS;AAAA,QACD,aAAazS;AAAA,MACrB,CAAO,GAAG,KAAK,gBAAgB;AAAA,QACvB,GAAGsS;AAAA,QACH,GAAGI;AAAA,MACX,GAAS;AAAA,QACD,aAAa1S;AAAA,MACrB,CAAO,GAAG,KAAK,gBAAgB;AAAA,QACvB,GAAGuS;AAAA,QACH,GAAGG;AAAA,MACX,GAAS;AAAA,QACD,aAAa1S;AAAA,MACrB,CAAO,CAAC,GAGEe,IAAO,OACTC,IAAO,QACPC,IAAO,OACPC,IAAO;AACT,MAAAyR,EAAQ,QAAQ,SAAUC,GAAO;AAC/B,YAAIlV,IAAIkV,EAAM,GACZjV,IAAIiV,EAAM;AACZ,QAAA7R,IAAO,KAAK,IAAIA,GAAMrD,CAAC,GACvBsD,IAAO,KAAK,IAAIA,GAAMtD,CAAC,GACvBuD,IAAO,KAAK,IAAIA,GAAMtD,CAAC,GACvBuD,IAAO,KAAK,IAAIA,GAAMvD,CAAC;AAAA,MACzB,CAAC;AAGD,UAAIkV,IAAa7R,IAAOD,GACpB+R,IAAc5R,IAAOD,GACrB8R,IAAsB,KAAK,cAAa,GAC1C1S,IAAQ0S,EAAoB,OAC5BzS,IAASyS,EAAoB,QAC3B/H,IAAK,GACLC,IAAK;AAWT,UAVI4H,KAAcxS,IACZW,IAAOX,IAAQ6R,IAAWlH,IAAKhK,KAAQX,IAAQ6R,KAAoBnR,IAAOmR,MAAWlH,IAAKjK,IAAOmR,KAEjGlR,IAAOX,IAAQ6R,IAAWlH,IAAKhK,KAAQX,IAAQ6R,KAAoBnR,IAAO,CAACmR,MAAWlH,IAAKjK,IAAOmR,IAEpGY,KAAexS,IACbY,IAAOZ,IAAS4R,IAAWjH,IAAK/J,KAAQZ,IAAS4R,KAAoBjR,IAAOiR,MAAWjH,IAAKhK,IAAOiR,KAEnGhR,IAAOZ,IAAS4R,IAAWjH,IAAK/J,KAAQZ,IAAS4R,KAAoBjR,IAAO,CAACiR,MAAWjH,IAAKhK,IAAOiR,IAEtGlH,KAAMC,GAAI;AAEZ,YAAI+H,IAAS,KAAK,sBAAsB;AAAA,UACtC,GAAG;AAAA,UACH,GAAG;AAAA,QACb,GAAW;AAAA,UACD,aAAahT;AAAA,QACvB,CAAS,GACG2I,IAAQ,KAAK,sBAAsB;AAAA,UACrC,GAAGqC;AAAA,UACH,GAAGC;AAAA,QACb,GAAW;AAAA,UACD,aAAajL;AAAA,QACvB,CAAS;AACD,QAAAgL,IAAKrC,EAAM,IAAIqK,EAAO,GACtB/H,IAAKtC,EAAM,IAAIqK,EAAO,GACtBhN,EAAS,KAAKgF,GACdhF,EAAS,KAAKiF;AAAA,MAChB;AACA,aAAOjF;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAwB;AAC7B,UAAI,CAAC,KAAK,SAAS,aAAc,QAAO;AACxC,UAAIrF,IAAc,KAAK,OAAO,SAAQ,GAGlCsS,IAAkB,KAAK,UAAU,mBAAmBtS,EAAY,OAAO,KAAK,SAAS,YAAY;AACrG,MAAAyC,GAAO6P,GAAiB,KAAK,qBAAqB,GAClD,KAAK,sBAAsB,oBAAI,IAAG;AAIlC,eADIC,IAAU,KAAK,eAAe,QACzBzP,IAAI,GAAGI,IAAIoP,EAAgB,QAAQxP,IAAII,GAAGJ,KAAK;AACtD,YAAI+L,IAAOyD,EAAgBxP,CAAC,GACxBR,IAAO,KAAK,cAAcuM,CAAI;AAKlC,YAAI,MAAK,oBAAoB,IAAIA,CAAI,KAGjC,CAAAvM,EAAK,QACT;AAAA,cAAIkQ,IAAwB,KAAK,sBAAsBlQ,CAAI,GACzDvF,IAAIyV,EAAsB,GAC1BxV,IAAIwV,EAAsB,GAGxBrH,IAAO,KAAK,UAAU7I,EAAK,IAAI;AAGnC,cAAI,GAACA,EAAK,cAAc6I,IAAO,KAAK,SAAS,+BAWzC,EAAApO,IAAI,CAAC6P,MAAkB7P,IAAI,KAAK,QAAQ6P,MAAkB5P,IAAI,CAAC6P,MAAkB7P,IAAI,KAAK,SAAS6P,KAOvG;AAAA,iBAAK,oBAAoB,IAAIgC,CAAI;AACjC,gBAAI4D,IAAuB,KAAK,SAAS,sBACrCC,IAAc,KAAK,aAAapQ,EAAK,IAAI,GACzCqQ,KAAaD,KAAgB,OAAiC,SAASA,EAAY,cAAcD;AACrG,YAAAE,EAAUJ,GAAShO,EAAeA,EAAe;AAAA,cAC/C,KAAKsK;AAAA,YACf,GAAWvM,CAAI,GAAG,IAAI;AAAA,cACZ,MAAM6I;AAAA,cACN,GAAGpO;AAAA,cACH,GAAGC;AAAA,YACb,CAAS,GAAG,KAAK,QAAQ;AAAA;AAAA;AAAA,MACnB;AACA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAA4B;AACjC,UAAI,CAAC,KAAK,SAAS,iBAAkB,QAAO;AAC5C,UAAIuV,IAAU,KAAK,eAAe;AAGlC,MAAAA,EAAQ,UAAU,GAAG,GAAG,KAAK,OAAO,KAAK,MAAM;AAC/C,UAAIK,IAAsBxG,GAA6B;AAAA,QACrD,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK;AAAA,QAClB,qBAAqB,KAAK;AAAA,QAC1B,kBAAkB,KAAK;AAAA,MAC/B,CAAO;AACD,MAAA3J,GAAOmQ,GAAqB,KAAK,qBAAqB;AAEtD,eADIC,IAAkB,oBAAI,IAAG,GACpB/P,IAAI,GAAGI,IAAI0P,EAAoB,QAAQ9P,IAAII,GAAGJ,KAAK;AAC1D,YAAI4J,IAAOkG,EAAoB9P,CAAC,GAC9BgQ,IAAc,KAAK,MAAM,YAAYpG,CAAI,GACzCqG,IAAa,KAAK,cAAcD,EAAY,CAAC,CAAC,GAC9CE,IAAa,KAAK,cAAcF,EAAY,CAAC,CAAC,GAC9CG,IAAW,KAAK,cAAcvG,CAAI;AAIpC,YAAI,CAAAmG,EAAgB,IAAInG,CAAI,KAIxB,EAAAuG,EAAS,UAAUF,EAAW,UAAUC,EAAW,SAGvD;AAAA,cAAIE,IAAuB,KAAK,SAAS,sBACrCC,IAAc,KAAK,aAAaF,EAAS,IAAI,GAC7CN,KAAaQ,KAAgB,OAAiC,SAASA,EAAY,cAAcD;AACrG,UAAAP,EAAUJ,GAAShO,EAAeA,EAAe;AAAA,YAC/C,KAAKmI;AAAA,UACf,GAAWuG,CAAQ,GAAG,IAAI;AAAA,YAChB,MAAM,KAAK,UAAUA,EAAS,IAAI;AAAA,UAC5C,CAAS,GAAG1O,EAAeA,EAAeA,EAAe;AAAA,YAC/C,KAAKuO,EAAY,CAAC;AAAA,UAC5B,GAAWC,CAAU,GAAG,KAAK,sBAAsBA,CAAU,CAAC,GAAG,IAAI;AAAA,YAC3D,MAAM,KAAK,UAAUA,EAAW,IAAI;AAAA,UAC9C,CAAS,GAAGxO,EAAeA,EAAeA,EAAe;AAAA,YAC/C,KAAKuO,EAAY,CAAC;AAAA,UAC5B,GAAWE,CAAU,GAAG,KAAK,sBAAsBA,CAAU,CAAC,GAAG,IAAI;AAAA,YAC3D,MAAM,KAAK,UAAUA,EAAW,IAAI;AAAA,UAC9C,CAAS,GAAG,KAAK,QAAQ,GACjBH,EAAgB,IAAInG,CAAI;AAAA;AAAA,MAC1B;AACA,kBAAK,sBAAsBmG,GACpB;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAkC;AACvC,UAAIO,IAAS,MACTb,IAAU,KAAK,eAAe;AAGlC,MAAAA,EAAQ,UAAU,GAAG,GAAG,KAAK,OAAO,KAAK,MAAM;AAG/C,UAAIc,IAAS,SAAgBxE,GAAM;AACjC,YAAIvM,IAAO8Q,EAAO,cAAcvE,CAAI,GAChCyE,IAAwBF,EAAO,sBAAsB9Q,CAAI,GAC3DvF,IAAIuW,EAAsB,GAC1BtW,IAAIsW,EAAsB,GACxBnI,IAAOiI,EAAO,UAAU9Q,EAAK,IAAI,GACjCiR,IAAuBH,EAAO,SAAS,sBACvCV,IAAcU,EAAO,aAAa9Q,EAAK,IAAI,GAC3CkR,KAAad,KAAgB,OAAiC,SAASA,EAAY,cAAca;AACrG,QAAAC,EAAUjB,GAAShO,EAAeA,EAAe;AAAA,UAC/C,KAAKsK;AAAA,QACf,GAAWvM,CAAI,GAAG,IAAI;AAAA,UACZ,MAAM6I;AAAA,UACN,GAAGpO;AAAA,UACH,GAAGC;AAAA,QACb,CAAS,GAAGoW,EAAO,QAAQ;AAAA,MACrB,GACIK,IAAgB,CAAA;AACpB,MAAI,KAAK,eAAe,CAAC,KAAK,cAAc,KAAK,WAAW,EAAE,UAC5DA,EAAc,KAAK,KAAK,WAAW,GAErC,KAAK,iBAAiB,QAAQ,SAAU5E,GAAM;AAE5C,QAAIA,MAASuE,EAAO,eAAaK,EAAc,KAAK5E,CAAI;AAAA,MAC1D,CAAC,GAGD4E,EAAc,QAAQ,SAAU5E,GAAM;AACpC,eAAOwE,EAAOxE,CAAI;AAAA,MACpB,CAAC;AAGD,UAAIe,IAAmB,CAAA;AAGvB,MAAA6D,EAAc,QAAQ,SAAU5E,GAAM;AACpC,YAAIzB,IAAOgG,EAAO,cAAcvE,CAAI,EAAE;AACtC,QAAAe,EAAiBxC,CAAI,KAAKwC,EAAiBxC,CAAI,KAAK,KAAK;AAAA,MAC3D,CAAC;AAED,eAASA,KAAQ,KAAK;AACpB,aAAK,kBAAkBA,CAAI,EAAE,WAAWwC,EAAiBxC,CAAI,KAAK,CAAC,GAEnEwC,EAAiBxC,CAAI,IAAI;AAG3B,MAAAqG,EAAc,QAAQ,SAAU5E,GAAM;AACpC,YAAIvM,IAAO8Q,EAAO,cAAcvE,CAAI;AACpC,QAAAuE,EAAO,kBAAkB9Q,EAAK,IAAI,EAAE,QAAQ,GAAGsN,EAAiBtN,EAAK,IAAI,KAAKA,CAAI;AAAA,MACpF,CAAC,GAED,KAAK,cAAc,WAAW,MAAM,KAAK,cAAc,WAAW,gBAAgB;AAElF,UAAIoR,IAAe,KAAK,gBAAe;AACvC,eAASC,KAAU,KAAK,mBAAmB;AACzC,YAAIjG,IAAU,KAAK,kBAAkBiG,CAAM;AAC3C,QAAAjG,EAAQ,OAAOgG,CAAY;AAAA,MAC7B;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAA0C;AAC/C,UAAIE,IAAS;AACb,MAAI,KAAK,+BAA+B,KAAK,gBAC7C,KAAK,8BAA8B,sBAAsB,WAAY;AAEnE,QAAAA,EAAO,8BAA8B,MAGrCA,EAAO,uBAAsB,GAC7BA,EAAO,iBAAgB;AAAA,MACzB,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAkB;AACvB,UAAIC,IAAS;AACb,WAAK,KAAK,cAAc;AACxB,UAAIC,IAAa,WAAsB;AACrC,eAAAD,EAAO,KAAK,aAAa,GAClBA;AAAA,MACT;AAwBA,UArBI,KAAK,gBACP,qBAAqB,KAAK,WAAW,GACrC,KAAK,cAAc,OAIrB,KAAK,OAAM,GAGP,KAAK,iBAAe,KAAK,QAAO,GACpC,KAAK,gBAAgB,IAGrB,KAAK,MAAK,GAGV,KAAK,cAAc,QAAQ,SAAUE,GAAO;AAC1C,eAAOF,EAAO,kBAAkBE,CAAK;AAAA,MACvC,CAAC,GAGG,CAAC,KAAK,MAAM,MAAO,QAAOD,EAAU;AAIxC,UAAIE,IAAc,KAAK,aACnBC,IAAS,KAAK,OAAO,WAAU,KAAMD,EAAY,YAAYA,EAAY,iBAAiBA,EAAY,uBAGtGhU,IAAc,KAAK,OAAO,SAAQ,GAClChB,IAAqB,KAAK,cAAa,GACvCC,IAAkB,KAAK,mBAAkB,GACzCK,IAAU,KAAK,gBAAe;AAClC,WAAK,SAASF,EAAiBY,GAAahB,GAAoBC,GAAiBK,CAAO,GACxF,KAAK,YAAYF,EAAiBY,GAAahB,GAAoBC,GAAiBK,GAAS,EAAI,GACjG,KAAK,kBAAkBS,GAAgB,KAAK,QAAQC,GAAahB,CAAkB,GACnF,KAAK,uBAAuB,KAAK,wBAAuB;AAYxD,UAAIqN,IAAS,KAAK,gBAAe;AAGjC,eAASe,KAAQ,KAAK,cAAc;AAClC,YAAIM,IAAU,KAAK,aAAaN,CAAI;AACpC,QAAAM,EAAQ,OAAOrB,CAAM;AAAA,MACvB;AAGA,UAAI,CAAC,KAAK,SAAS,mBAAmB,CAAC4H;AACrC,iBAASC,KAAU,KAAK,cAAc;AACpC,cAAIC,IAAY,KAAK,aAAaD,CAAM;AACxC,UAAAC,EAAU,OAAO9H,CAAM;AAAA,QACzB;AAIF,aAAI,KAAK,SAAS,oBAAoB4H,MACtC,KAAK,aAAY,GACjB,KAAK,iBAAgB,GACrB,KAAK,uBAAsB,IACpBH,EAAU;AAAA,IACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAiBlT,GAAK;AAQ3B,UAAIH,IAAO,OAAO,OAAO,CAAA,GAAI,KAAK,MAAM,kBAAkBG,CAAG,CAAC;AAC9D,MAAI,KAAK,SAAS,gBAAaH,IAAO,KAAK,SAAS,YAAYG,GAAKH,CAAI;AACzE,UAAI6B,IAAOyK,GAAkB,KAAK,UAAUnM,GAAKH,CAAI;AACrD,WAAK,cAAcG,CAAG,IAAI0B,GAK1B,KAAK,sBAAsB,OAAU1B,CAAG,GACpC0B,EAAK,cAAc,CAACA,EAAK,UAAQ,KAAK,sBAAsB,IAAI1B,CAAG,GAKvE,KAAK,iBAAiB,OAAUA,CAAG,GAC/B0B,EAAK,eAAe,CAACA,EAAK,UAAQ,KAAK,iBAAiB,IAAI1B,CAAG,GAG/D,KAAK,SAAS,WACZ0B,EAAK,SAAS,KAAK,YAAY,CAAC,MAAG,KAAK,YAAY,CAAC,IAAIA,EAAK,SAC9DA,EAAK,SAAS,KAAK,YAAY,CAAC,MAAG,KAAK,YAAY,CAAC,IAAIA,EAAK;AAAA,IAEtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAoB1B,GAAK;AAC9B,WAAK,QAAQA,CAAG;AAGhB,UAAI0B,IAAO,KAAK,cAAc1B,CAAG;AACjC,WAAK,sBAAsB,QAAQ0B,CAAI;AAAA,IACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAoB1B,GAAK;AAE9B,aAAO,KAAK,cAAcA,CAAG,GAE7B,OAAO,KAAK,iBAAiBA,CAAG,GAEhC,KAAK,iBAAiB,OAAUA,CAAG,GAE/B,KAAK,gBAAgBA,MAAK,KAAK,cAAc,OAEjD,KAAK,sBAAsB,OAAUA,CAAG;AAAA,IAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAiBA,GAAK;AAO3B,UAAIH,IAAO,OAAO,OAAO,CAAA,GAAI,KAAK,MAAM,kBAAkBG,CAAG,CAAC;AAC9D,MAAI,KAAK,SAAS,gBAAaH,IAAO,KAAK,SAAS,YAAYG,GAAKH,CAAI;AACzE,UAAI6B,IAAO0K,GAAkB,KAAK,UAAUpM,GAAKH,CAAI;AACrD,WAAK,cAAcG,CAAG,IAAI0B,GAK1B,KAAK,sBAAsB,OAAU1B,CAAG,GACpC0B,EAAK,cAAc,CAACA,EAAK,UAAQ,KAAK,sBAAsB,IAAI1B,CAAG,GAGnE,KAAK,SAAS,WACZ0B,EAAK,SAAS,KAAK,YAAY,CAAC,MAAG,KAAK,YAAY,CAAC,IAAIA,EAAK,SAC9DA,EAAK,SAAS,KAAK,YAAY,CAAC,MAAG,KAAK,YAAY,CAAC,IAAIA,EAAK;AAAA,IAEtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAoB1B,GAAK;AAC9B,WAAK,QAAQA,CAAG;AAAA,IAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAoBA,GAAK;AAE9B,aAAO,KAAK,cAAcA,CAAG,GAE7B,OAAO,KAAK,iBAAiBA,CAAG,GAE5B,KAAK,gBAAgBA,MAAK,KAAK,cAAc,OAEjD,KAAK,sBAAsB,OAAUA,CAAG;AAAA,IAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAA4B;AAEjC,WAAK,YAAY,IAAI0K,GAAS,GAC9B,KAAK,aAAa;AAAA,QAChB,GAAG,CAAC,GAAG,CAAC;AAAA,QACR,GAAG,CAAC,GAAG,CAAC;AAAA,MAChB,GACM,KAAK,gBAAgB,CAAA,GACrB,KAAK,mBAAmB,CAAA,GACxB,KAAK,wBAAwB,oBAAI,IAAG,GACpC,KAAK,cAAc,CAAC,OAAU,MAAS,GACvC,KAAK,mBAAmB,oBAAI,IAAG;AAAA,IACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAA4B;AACjC,WAAK,gBAAgB,CAAA,GACrB,KAAK,mBAAmB,CAAA,GACxB,KAAK,wBAAwB,oBAAI,IAAG,GACpC,KAAK,cAAc,CAAC,OAAU,MAAS;AAAA,IACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAwB;AAC7B,WAAK,iBAAgB,GACrB,KAAK,iBAAgB;AAAA,IACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAA0B;AAC/B,WAAK,sBAAsB,oBAAI,IAAG,GAClC,KAAK,mBAAmB,oBAAI,IAAG,GAC/B,KAAK,cAAc;AAAA,IACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAA0B;AAC/B,WAAK,sBAAsB,oBAAI,IAAG,GAClC,KAAK,mBAAmB,oBAAI,IAAG,GAC/B,KAAK,cAAc;AAAA,IACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAsB;AAC3B,WAAK,eAAc,GACnB,KAAK,eAAc;AAAA,IACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAA0BuD,GAAMuF,GAAapL,GAAU;AAC5D,UAAI1G,IAAO,KAAK,cAAcuM,CAAI,GAC9B6D,IAAc,KAAK,aAAapQ,EAAK,IAAI;AAC7C,UAAI,CAACoQ,EAAa,OAAM,IAAI,MAAM,2DAA4D,OAAOpQ,EAAK,MAAM,IAAK,CAAC;AACtH,MAAAoQ,EAAY,QAAQ0B,GAAapL,GAAU1G,CAAI,GAE/C,KAAK,iBAAiBuM,CAAI,IAAI7F;AAAA,IAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAA0B0D,GAAM0H,GAAapL,GAAU;AAC5D,UAAI1G,IAAO,KAAK,cAAcoK,CAAI,GAC9ByG,IAAc,KAAK,aAAa7Q,EAAK,IAAI;AAC7C,UAAI,CAAC6Q,EAAa,OAAM,IAAI,MAAM,2DAA4D,OAAO7Q,EAAK,MAAM,IAAK,CAAC;AACtH,UAAIwQ,IAAc,KAAK,MAAM,YAAYpG,CAAI,GAC3CqG,IAAa,KAAK,cAAcD,EAAY,CAAC,CAAC,GAC9CE,IAAa,KAAK,cAAcF,EAAY,CAAC,CAAC;AAChD,MAAAK,EAAY,QAAQiB,GAAapL,GAAU+J,GAAYC,GAAY1Q,CAAI,GAEvE,KAAK,iBAAiBoK,CAAI,IAAI1D;AAAA,IAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAA2B;AAChC,aAAO;AAAA,QACL,QAAQ,KAAK;AAAA,QACb,WAAW,KAAK;AAAA,QAChB,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,YAAY,KAAK;AAAA,QACjB,WAAW,KAAK,OAAO;AAAA,QACvB,aAAa,KAAK,OAAO;AAAA,QACzB,WAAW,IAAI,KAAK,UAAS;AAAA,QAC7B,iBAAiB,KAAK;AAAA,QACtB,iBAAiB,KAAK;AAAA,QACtB,kBAAkB,KAAK,SAAS;AAAA,QAChC,qBAAqB,KAAK,SAAS;AAAA,MAC3C;AAAA,IACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAA2B;AAChC,UAAIqL,IAAiB,KAAK,UACxBC,IAAeD,EAAe,cAC9BE,IAAcF,EAAe;AAC/B,aAAOE,KAAcD,KAAgB;AAAA,IACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAqBrG,GAAIlN,GAAK;AACnC,UAAI+D,IAAU,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AAClF,UAAI,KAAK,SAASmJ,CAAE,EAAG,OAAM,IAAI,MAAM,yBAA0B,OAAOA,GAAI,kBAAmB,CAAC;AAChG,UAAIhN,IAAUH,GAAcC,GAAK;AAAA,QAC/B,UAAU;AAAA,MAClB,GAAS;AAAA,QACD,OAAS,SAAS,OAAOkN,CAAE;AAAA,MACnC,CAAO;AACD,aAAInJ,EAAQ,SAAO,OAAO,OAAO7D,EAAQ,OAAO6D,EAAQ,KAAK,GAC7D,KAAK,SAASmJ,CAAE,IAAIhN,GAChB,iBAAiB6D,KAAWA,EAAQ,cACtC,KAAK,SAASA,EAAQ,WAAW,EAAE,OAAO7D,CAAO,IACxC,gBAAgB6D,KAAWA,EAAQ,aAC5C,KAAK,SAASA,EAAQ,UAAU,EAAE,MAAM7D,CAAO,IAE/C,KAAK,UAAU,YAAYA,CAAO,GAE7BA;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAsBgN,GAAI;AAC/B,UAAInJ,IAAU,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AAClF,aAAO,KAAK,YAAYmJ,GAAI,UAAUnJ,CAAO;AAAA,IAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAA6BmJ,GAAI;AACtC,UAAInJ,IAAU,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA,GAC9E0P,IAAS,KAAK,aAAavG,GAAInJ,CAAO,GACtC2P,IAAiB;AAAA,QACnB,uBAAuB;AAAA,QACvB,WAAW;AAAA,MACnB;AACM,kBAAK,eAAexG,CAAE,IAAIuG,EAAO,WAAW,MAAMC,CAAc,GACzD;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAA4BxG,GAAI;AACrC,UAAInJ,IAAU,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA,GAC9E0P,KAAU1P,KAAY,OAA6B,SAASA,EAAQ,WAAW,KAAK,aAAamJ,GAAInJ,CAAO;AAChH,MAAIA,EAAQ,UAAQ0P,EAAO,OAAM;AACjC,UAAIC,IAAiBlQ,EAAe;AAAA,QAClC,uBAAuB;AAAA,QACvB,WAAW;AAAA,MACnB,GAASO,CAAO,GACNyN;AAGJ,MAAAA,IAAUiC,EAAO,WAAW,UAAUC,CAAc,GAG/ClC,MAASA,IAAUiC,EAAO,WAAW,SAASC,CAAc,IAG5DlC,MAASA,IAAUiC,EAAO,WAAW,sBAAsBC,CAAc;AAC9E,UAAIvG,IAAKqE;AAOT,UANA,KAAK,cAActE,CAAE,IAAIC,GAGzBA,EAAG,UAAUA,EAAG,KAAKA,EAAG,mBAAmB,GAGvCpJ,EAAQ,SAAS;AACnB,aAAK,cAAc,IAAImJ,CAAE;AACzB,YAAIyG,IAAiBxG,EAAG,kBAAiB;AACzC,YAAI,CAACwG,EAAgB,OAAM,IAAI,MAAM,qDAAqD,OAAOzG,CAAE,CAAC;AACpG,aAAK,aAAaA,CAAE,IAAIyG;AAAA,MAC1B;AACA,aAAOxG;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAmBD,GAAI;AAC5B,UAAIhN,IAAU,KAAK,SAASgN,CAAE;AAC9B,UAAI,CAAChN,EAAS,OAAM,IAAI,MAAM,4BAA4B,OAAOgN,GAAI,wBAAwB,CAAC;AAC9F,UAAI,KAAK,cAAcA,CAAE,GAAG;AAC1B,YAAI0G,GACAzG,IAAK,KAAK,cAAcD,CAAE;AAC9B,SAAC0G,IAAmBzG,EAAG,aAAa,oBAAoB,OAAO,QAAQyG,MAAqB,UAAUA,EAAiB,YAAW,GAClI,OAAO,KAAK,cAAc1G,CAAE;AAAA,MAC9B,MAAO,CAAI,KAAK,eAAeA,CAAE,KAC/B,OAAO,KAAK,eAAeA,CAAE;AAI/B,aAAAhN,EAAQ,OAAM,GACd,OAAO,KAAK,SAASgN,CAAE,GAChB;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAqB;AAC1B,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAmB1I,GAAQ;AAChC,WAAK,qBAAoB,GACzB,KAAK,SAASA,GACd,KAAK,mBAAkB;AAAA,IACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAwB;AAC7B,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAoB;AACzB,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAkBpF,GAAO;AAC9B,MAAIA,MAAU,KAAK,UAGf,KAAK,eAAe,CAACA,EAAM,QAAQ,KAAK,WAAW,MAAG,KAAK,cAAc,OACzE,KAAK,eAAe,CAACA,EAAM,QAAQ,KAAK,WAAW,MAAG,KAAK,cAAc,OAG7E,KAAK,oBAAmB,GACpB,KAAK,0BAA0B,SACjC,qBAAqB,KAAK,qBAAqB,GAC/C,KAAK,wBAAwB,OAI/B,KAAK,QAAQA,GAGb,KAAK,kBAAiB,GAGtB,KAAK,QAAO;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAA0B;AAC/B,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAA0B;AAC/B,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAyB;AAC9B,aAAO;AAAA,QACL,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,MACrB;AAAA,IACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAA8B;AACnC,UAAIwB,IAAS,KAAK,cAAc,KAAK;AACrC,aAAO;AAAA,QACL,OAAOA,EAAO,EAAE,CAAC,IAAIA,EAAO,EAAE,CAAC,KAAK;AAAA,QACpC,QAAQA,EAAO,EAAE,CAAC,IAAIA,EAAO,EAAE,CAAC,KAAK;AAAA,MAC7C;AAAA,IACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAA4Bf,GAAK;AACtC,UAAIiO,IAAO,KAAK,cAAcjO,CAAG;AACjC,aAAOiO,IAAO,OAAO,OAAO,CAAA,GAAIA,CAAI,IAAI;AAAA,IAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAA4BjO,GAAK;AACtC,UAAI8L,IAAO,KAAK,cAAc9L,CAAG;AACjC,aAAO8L,IAAO,OAAO,OAAO,CAAA,GAAIA,CAAI,IAAI;AAAA,IAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAkC;AACvC,aAAO,IAAI,IAAI,KAAK,mBAAmB;AAAA,IACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAkC;AACvC,aAAO,IAAI,IAAI,KAAK,mBAAmB;AAAA,IACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAuB;AAC5B,aAAOnI,EAAe,CAAA,GAAI,KAAK,QAAQ;AAAA,IACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAoB3D,GAAK;AAC9B,aAAO,KAAK,SAASA,CAAG;AAAA,IAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAoBA,GAAKmC,GAAO;AACrC,UAAI6R,IAAYrQ,EAAe,IAAI,KAAK,QAAQ;AAChD,kBAAK,SAAS3D,CAAG,IAAImC,GACrBa,GAAiB,KAAK,QAAQ,GAC9B,KAAK,qBAAqBgR,CAAS,GACnC,KAAK,gBAAe,GACb;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAuBhU,GAAK6D,GAAS;AAC1C,kBAAK,WAAW7D,GAAK6D,EAAQ,KAAK,SAAS7D,CAAG,CAAC,CAAC,GACzC;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAqBiD,GAAU;AACpC,UAAI+Q,IAAYrQ,EAAe,IAAI,KAAK,QAAQ;AAChD,kBAAK,WAAWA,EAAeA,EAAe,CAAA,GAAI,KAAK,QAAQ,GAAGV,CAAQ,GAC1ED,GAAiB,KAAK,QAAQ,GAC9B,KAAK,qBAAqBgR,CAAS,GACnC,KAAK,gBAAe,GACb;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAgBC,GAAO;AAC5B,UAAIC,IAAgB,KAAK,OACvBC,IAAiB,KAAK;AAIxB,UAHA,KAAK,QAAQ,KAAK,UAAU,aAC5B,KAAK,SAAS,KAAK,UAAU,cAC7B,KAAK,aAAa5T,GAAa,GAC3B,KAAK,UAAU;AACjB,YAAI,KAAK,SAAS,sBAAuB,MAAK,QAAQ;AAAA,YAAO,OAAM,IAAI,MAAM,iHAAiH;AAEhM,UAAI,KAAK,WAAW;AAClB,YAAI,KAAK,SAAS,sBAAuB,MAAK,SAAS;AAAA,YAAO,OAAM,IAAI,MAAM,kHAAkH;AAIlM,UAAI,CAAC0T,KAASC,MAAkB,KAAK,SAASC,MAAmB,KAAK,OAAQ,QAAO;AAGrF,eAAS9G,KAAM,KAAK,UAAU;AAC5B,YAAIhN,IAAU,KAAK,SAASgN,CAAE;AAC9B,QAAAhN,EAAQ,MAAM,QAAQ,KAAK,QAAQ,MACnCA,EAAQ,MAAM,SAAS,KAAK,SAAS;AAAA,MACvC;AAGA,eAAS+T,KAAO,KAAK;AACnB,aAAK,SAASA,CAAG,EAAE,aAAa,SAAS,KAAK,QAAQ,KAAK,aAAa,IAAI,GAC5E,KAAK,SAASA,CAAG,EAAE,aAAa,UAAU,KAAK,SAAS,KAAK,aAAa,IAAI,GAC1E,KAAK,eAAe,KAAG,KAAK,eAAeA,CAAG,EAAE,MAAM,KAAK,YAAY,KAAK,UAAU;AAI5F,eAASC,KAAQ,KAAK,eAAe;AACnC,aAAK,SAASA,CAAI,EAAE,aAAa,SAAS,KAAK,QAAQ,KAAK,aAAa,IAAI,GAC7E,KAAK,SAASA,CAAI,EAAE,aAAa,UAAU,KAAK,SAAS,KAAK,aAAa,IAAI;AAC/E,YAAI/G,IAAK,KAAK,cAAc+G,CAAI;AAIhC,YAHA/G,EAAG,SAAS,GAAG,GAAG,KAAK,QAAQ,KAAK,YAAY,KAAK,SAAS,KAAK,UAAU,GAGzE,KAAK,cAAc,IAAI+G,CAAI,GAAG;AAChC,cAAI7G,IAAiB,KAAK,SAAS6G,CAAI;AACvC,UAAI7G,KAAgBF,EAAG,cAAcE,CAAc;AAAA,QACrD;AAAA,MACF;AACA,kBAAK,KAAK,QAAQ,GACX;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAiB;AACtB,kBAAK,KAAK,aAAa,GACvB,KAAK,cAAc,MAAM,gBAAgB,sBAAsB,aAAa,IAAI,GAChF,KAAK,cAAc,MAAM,MAAM,sBAAsB,gBAAgB,GACrE,KAAK,cAAc,MAAM,gBAAgB,sBAAsB,aAAa,IAAI,GAChF,KAAK,cAAc,MAAM,MAAM,sBAAsB,gBAAgB,GACrE,KAAK,cAAc,WAAW,MAAM,sBAAsB,gBAAgB,GAC1E,KAAK,eAAe,OAAO,UAAU,GAAG,GAAG,KAAK,OAAO,KAAK,MAAM,GAClE,KAAK,eAAe,OAAO,UAAU,GAAG,GAAG,KAAK,OAAO,KAAK,MAAM,GAClE,KAAK,eAAe,WAAW,UAAU,GAAG,GAAG,KAAK,OAAO,KAAK,MAAM,GACtE,KAAK,KAAK,YAAY,GACf;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAiBzJ,GAAM;AAC5B,UAAIuQ,IAAU,MACVC,KAAkBxQ,KAAS,OAA0B,SAASA,EAAK,oBAAoB,SAAYA,KAAS,OAA0B,SAASA,EAAK,iBAAiB,IACrKyQ,KAAYzQ,KAAS,OAA0B,SAASA,EAAK,cAAc,SAAYA,EAAK,WAAW,IACvG0Q,IAAc,CAAC1Q,KAAQ,CAACA,EAAK;AACjC,UAAI0Q;AAEF,aAAK,iBAAgB,GACrB,KAAK,iBAAgB,GACrB,KAAK,MAAM,YAAY,SAAUxG,GAAM;AACrC,iBAAOqG,EAAQ,QAAQrG,CAAI;AAAA,QAC7B,CAAC,GACD,KAAK,MAAM,YAAY,SAAUnC,GAAM;AACrC,iBAAOwI,EAAQ,QAAQxI,CAAI;AAAA,QAC7B,CAAC;AAAA,WACI;AAGL,iBAFI4I,GAAoBC,GACpBtF,MAAUqF,IAAqB3Q,EAAK,kBAAkB,QAAQ2Q,MAAuB,SAAS,SAASA,EAAmB,UAAU,CAAA,GAC/HxS,IAAI,GAAGI,KAAK+M,KAAU,OAA2B,SAASA,EAAM,WAAW,GAAGnN,IAAII,GAAGJ,KAAK;AACjG,cAAI+L,IAAOoB,EAAMnN,CAAC;AAKlB,cAHA,KAAK,WAAW+L,CAAI,GAGhBsG,GAAgB;AAClB,gBAAIK,IAAe,KAAK,iBAAiB3G,CAAI;AAC7C,gBAAI2G,MAAiB,OAAW,OAAM,IAAI,MAAM,gBAAiB,OAAO3G,GAAM,oBAAqB,CAAC;AACpG,iBAAK,iBAAiBA,GAAM,KAAK,YAAYA,CAAI,GAAG2G,CAAY;AAAA,UAClE;AAAA,QACF;AAEA,iBADIhF,KAAS7L,KAAS,SAA4B4Q,IAAsB5Q,EAAK,kBAAkB,QAAQ4Q,MAAwB,SAAS,SAASA,EAAoB,UAAU,CAAA,GACtKE,IAAM,GAAGC,IAAMlF,EAAM,QAAQiF,IAAMC,GAAKD,KAAO;AACtD,cAAI/I,IAAO8D,EAAMiF,CAAG;AAKpB,cAHA,KAAK,WAAW/I,CAAI,GAGhByI,GAAgB;AAClB,gBAAIQ,IAAgB,KAAK,iBAAiBjJ,CAAI;AAC9C,gBAAIiJ,MAAkB,OAAW,OAAM,IAAI,MAAM,gBAAiB,OAAOjJ,GAAM,oBAAqB,CAAC;AACrG,iBAAK,iBAAiBA,GAAM,KAAK,YAAYA,CAAI,GAAGiJ,CAAa;AAAA,UACnE;AAAA,QACF;AAAA,MACF;AAGA,cAAIN,KAAe,CAACF,OAAgB,KAAK,gBAAgB,KACrDC,IAAU,KAAK,eAAc,IAAQ,KAAK,OAAM,GAC7C;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAA0B;AAC/B,UAAIQ,IAAU;AACd,aAAK,KAAK,gBACR,KAAK,cAAc,sBAAsB,WAAY;AACnD,QAAAA,EAAQ,OAAM;AAAA,MAChB,CAAC,IAEI;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAyBjR,GAAM;AACpC,aAAO,KAAK,QAAQJ,EAAeA,EAAe,IAAII,CAAI,GAAG,IAAI;AAAA,QAC/D,UAAU;AAAA,MAClB,CAAO,CAAC;AAAA,IACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAgCkR,GAAgB5O,GAAU;AAC/D,UAAI6O,IAAwB,KAAK,OAAO,SAAQ,GAC9CrW,IAAQqW,EAAsB,OAC9BtW,IAAQsW,EAAsB,OAC9B/Y,IAAI+Y,EAAsB,GAC1B9Y,IAAI8Y,EAAsB,GACxBC,IAAkB,KAAK,UACzBjS,IAAiBiS,EAAgB,gBACjChS,IAAiBgS,EAAgB;AACnC,MAAI,OAAOhS,KAAmB,aAAUkD,IAAW,KAAK,IAAIA,GAAUlD,CAAc,IAChF,OAAOD,KAAmB,aAAUmD,IAAW,KAAK,IAAIA,GAAUnD,CAAc;AACpF,UAAIqE,IAAYlB,IAAWxH,GACvBuW,IAAS;AAAA,QACX,GAAG,KAAK,QAAQ;AAAA,QAChB,GAAG,KAAK,SAAS;AAAA,MACzB,GACUC,IAAqB,KAAK,sBAAsBJ,CAAc,GAC9DK,IAAsB,KAAK,sBAAsBF,CAAM;AAC3D,aAAO;AAAA,QACL,OAAOxW;AAAA,QACP,IAAIyW,EAAmB,IAAIC,EAAoB,MAAM,IAAI/N,KAAapL;AAAA,QACtE,IAAIkZ,EAAmB,IAAIC,EAAoB,MAAM,IAAI/N,KAAanL;AAAA,QACtE,OAAOiK;AAAA,MACf;AAAA,IACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAyB;AAC9B,UAAIkP,IAAK,KAAK,sBAAsB;AAAA,QAChC,GAAG;AAAA,QACH,GAAG;AAAA,MACb,CAAS,GACDC,IAAK,KAAK,sBAAsB;AAAA,QAC9B,GAAG,KAAK;AAAA,QACR,GAAG;AAAA,MACb,CAAS,GACDC,IAAI,KAAK,sBAAsB;AAAA,QAC7B,GAAG;AAAA,QACH,GAAG,KAAK;AAAA,MAClB,CAAS;AACH,aAAO;AAAA,QACL,IAAIF,EAAG;AAAA,QACP,IAAIA,EAAG;AAAA,QACP,IAAIC,EAAG;AAAA,QACP,IAAIA,EAAG;AAAA,QACP,QAAQA,EAAG,IAAIC,EAAE;AAAA,MACzB;AAAA,IACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAA+BC,GAAa;AACjD,UAAIC,IAAW,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA,GAC/EC,IAAkB,CAAC,CAACD,EAAS,eAAe,CAAC,CAACA,EAAS,sBAAsB,CAAC,CAACA,EAAS,iBACxF3W,IAAS2W,EAAS,SAASA,EAAS,SAASC,IAAkBpX,EAAiBmX,EAAS,eAAe,KAAK,OAAO,SAAQ,GAAIA,EAAS,sBAAsB,KAAK,cAAa,GAAIA,EAAS,mBAAmB,KAAK,mBAAkB,GAAIA,EAAS,WAAW,KAAK,gBAAe,CAAE,IAAI,KAAK,QAC/RE,IAAc9X,GAAaiB,GAAQ0W,CAAW;AAClD,aAAO;AAAA,QACL,IAAI,IAAIG,EAAY,KAAK,KAAK,QAAQ;AAAA,QACtC,IAAI,IAAIA,EAAY,KAAK,KAAK,SAAS;AAAA,MAC/C;AAAA,IACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAA+BH,GAAa;AACjD,UAAIC,IAAW,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA,GAC/EC,IAAkB,CAAC,CAACD,EAAS,eAAe,CAAC,CAACA,EAAS,sBAAsB,CAACA,EAAS,iBACvFG,IAAYH,EAAS,SAASA,EAAS,SAASC,IAAkBpX,EAAiBmX,EAAS,eAAe,KAAK,OAAO,SAAQ,GAAIA,EAAS,sBAAsB,KAAK,cAAa,GAAIA,EAAS,mBAAmB,KAAK,mBAAkB,GAAIA,EAAS,WAAW,KAAK,gBAAe,GAAI,EAAI,IAAI,KAAK,WACxS1Q,IAAMlH,GAAa+X,GAAW;AAAA,QAChC,GAAGJ,EAAY,IAAI,KAAK,QAAQ,IAAI;AAAA,QACpC,GAAG,IAAIA,EAAY,IAAI,KAAK,SAAS;AAAA,MAC7C,CAAO;AACD,aAAI,MAAMzQ,EAAI,CAAC,MAAGA,EAAI,IAAI,IACtB,MAAMA,EAAI,CAAC,MAAGA,EAAI,IAAI,IACnBA;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAyB8Q,GAAe;AAC7C,UAAIJ,IAAW,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AACnF,aAAO,KAAK,sBAAsB,QAAQ,KAAK,sBAAsBI,GAAeJ,CAAQ,CAAC;AAAA,IAC/F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAyBK,GAAY;AAC1C,UAAIL,IAAW,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AACnF,aAAO,KAAK,sBAAsB,KAAK,sBAAsBK,CAAU,GAAGL,CAAQ;AAAA,IACpF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAmC;AACxC,UAAIM,IAAU;AAAA,QACZ,GAAG;AAAA,QACH,GAAG;AAAA,MACX,GACUC,IAAU;AAAA,QACZ,GAAG;AAAA,QACH,GAAG;AAAA,MACX,GACUC,IAAS,KAAK,KAAK,KAAK,IAAIF,EAAQ,IAAIC,EAAQ,GAAG,CAAC,IAAI,KAAK,IAAID,EAAQ,IAAIC,EAAQ,GAAG,CAAC,CAAC,GAC1FE,IAAa,KAAK,gBAAgBH,CAAO,GACzCI,IAAa,KAAK,gBAAgBH,CAAO,GACzCI,IAAY,KAAK,KAAK,KAAK,IAAIF,EAAW,IAAIC,EAAW,GAAG,CAAC,IAAI,KAAK,IAAID,EAAW,IAAIC,EAAW,GAAG,CAAC,CAAC;AAC7G,aAAOC,IAAYH;AAAA,IACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAmB;AACxB,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAyB;AAC9B,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAuBI,GAAY;AACxC,kBAAK,aAAaA,GAClB,KAAK,eAAc,GACZ;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAgB;AAErB,WAAK,KAAK,MAAM,GAGhB,KAAK,mBAAkB,GAGvB,KAAK,qBAAoB,GAGzB,OAAO,oBAAoB,UAAU,KAAK,gBAAgB,YAAY,GACtE,KAAK,YAAY,KAAI,GACrB,KAAK,YAAY,KAAI,GAGrB,KAAK,oBAAmB,GAGxB,KAAK,aAAY,GACjB,KAAK,WAAU,GACf,KAAK,gBAAgB,CAAA,GACrB,KAAK,gBAAgB,CAAA,GACrB,KAAK,iBAAiB,MAAK,GAGvB,KAAK,gBACP,qBAAqB,KAAK,WAAW,GACrC,KAAK,cAAc,OAEjB,KAAK,gCACP,qBAAqB,KAAK,2BAA2B,GACrD,KAAK,8BAA8B;AAKrC,eADI1Q,IAAY,KAAK,WACdA,EAAU,aAAY,CAAAA,EAAU,YAAYA,EAAU,UAAU;AAGvE,eAAS2G,KAAQ,KAAK;AACpB,aAAK,aAAaA,CAAI,EAAE,KAAI;AAE9B,eAASgK,KAAU,KAAK;AACtB,aAAK,kBAAkBA,CAAM,EAAE,KAAI;AAErC,eAASC,KAAU,KAAK;AACtB,aAAK,aAAaA,CAAM,EAAE,KAAI;AAEhC,WAAK,eAAe,CAAA,GACpB,KAAK,oBAAoB,CAAA,GACzB,KAAK,eAAe,CAAA;AAGpB,eAASpJ,KAAM,KAAK;AAClB,aAAK,UAAUA,CAAE;AAInB,WAAK,iBAAiB,CAAA,GACtB,KAAK,gBAAgB,CAAA,GACrB,KAAK,WAAW,CAAA;AAAA,IAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAqB;AAC1B,UAAI9C,IAAO,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,GAC3EmM,IAAc,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,KAAK,OAAO;AAClG,aAAOnM,IAAO,KAAK,SAAS,wBAAwBmM,CAAW,KAAK,KAAK,WAAW,oBAAoB,MAAM,cAAcA,IAAc,KAAK,uBAAuB;AAAA,IACxK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,WAAuB;AAC5B,UAAIzR,IAAM,CAAA;AACV,eAASkO,KAAS,KAAK,SAAU,CAAI,KAAK,SAASA,CAAK,aAAa,sBAAmBlO,EAAIkO,CAAK,IAAI,KAAK,SAASA,CAAK;AACxH,aAAOlO;AAAA,IACT;AAAA,EACJ,CAAG,CAAC;AACJ,GAAEnK,EAAiB,GASfyR,KAAQD;","x_google_ignoreList":[0,1,2,3,4]}
|