@opentrace/components 0.1.0

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.
Files changed (56) hide show
  1. package/dist/assets/d3LayoutWorker-BMQ60AVN.js +864 -0
  2. package/dist/assets/d3LayoutWorker-BMQ60AVN.js.map +1 -0
  3. package/dist/assets/spacingWorker-hXLGHyRg.js +123 -0
  4. package/dist/assets/spacingWorker-hXLGHyRg.js.map +1 -0
  5. package/dist/components.css +1 -0
  6. package/dist/opentrace-components.cjs +7555 -0
  7. package/dist/opentrace-components.cjs.map +1 -0
  8. package/dist/opentrace-components.js +7555 -0
  9. package/dist/opentrace-components.js.map +1 -0
  10. package/dist/src/GraphCanvas.d.ts +60 -0
  11. package/dist/src/GraphCanvas.d.ts.map +1 -0
  12. package/dist/src/colors/communityColors.d.ts +31 -0
  13. package/dist/src/colors/communityColors.d.ts.map +1 -0
  14. package/dist/src/colors/linkColors.d.ts +2 -0
  15. package/dist/src/colors/linkColors.d.ts.map +1 -0
  16. package/dist/src/colors/nodeColors.d.ts +2 -0
  17. package/dist/src/colors/nodeColors.d.ts.map +1 -0
  18. package/dist/src/config/graphLayout.d.ts +50 -0
  19. package/dist/src/config/graphLayout.d.ts.map +1 -0
  20. package/dist/src/graph/LayoutPipeline.d.ts +26 -0
  21. package/dist/src/graph/LayoutPipeline.d.ts.map +1 -0
  22. package/dist/src/graph/drawNodeHover.d.ts +13 -0
  23. package/dist/src/graph/drawNodeHover.d.ts.map +1 -0
  24. package/dist/src/graph/spacingWorker.d.ts +43 -0
  25. package/dist/src/graph/spacingWorker.d.ts.map +1 -0
  26. package/dist/src/graph/types.d.ts +78 -0
  27. package/dist/src/graph/types.d.ts.map +1 -0
  28. package/dist/src/graph/useCommunities.d.ts +8 -0
  29. package/dist/src/graph/useCommunities.d.ts.map +1 -0
  30. package/dist/src/graph/useGraphFilters.d.ts +19 -0
  31. package/dist/src/graph/useGraphFilters.d.ts.map +1 -0
  32. package/dist/src/graph/useGraphInstance.d.ts +15 -0
  33. package/dist/src/graph/useGraphInstance.d.ts.map +1 -0
  34. package/dist/src/graph/useGraphVisuals.d.ts +9 -0
  35. package/dist/src/graph/useGraphVisuals.d.ts.map +1 -0
  36. package/dist/src/graph/useHighlights.d.ts +16 -0
  37. package/dist/src/graph/useHighlights.d.ts.map +1 -0
  38. package/dist/src/index.d.ts +27 -0
  39. package/dist/src/index.d.ts.map +1 -0
  40. package/dist/src/sigma/zoomToNodes.d.ts +15 -0
  41. package/dist/src/sigma/zoomToNodes.d.ts.map +1 -0
  42. package/dist/src/types/graph.d.ts +33 -0
  43. package/dist/src/types/graph.d.ts.map +1 -0
  44. package/dist/src/utils.d.ts +16 -0
  45. package/dist/src/utils.d.ts.map +1 -0
  46. package/dist/src/workers/d3LayoutWorker.d.ts +22 -0
  47. package/dist/src/workers/d3LayoutWorker.d.ts.map +1 -0
  48. package/dist/useHighlights-BHlafcBH.js +6692 -0
  49. package/dist/useHighlights-BHlafcBH.js.map +1 -0
  50. package/dist/useHighlights-D6Jl6Woe.cjs +6691 -0
  51. package/dist/useHighlights-D6Jl6Woe.cjs.map +1 -0
  52. package/dist/utils.cjs +12 -0
  53. package/dist/utils.cjs.map +1 -0
  54. package/dist/utils.js +12 -0
  55. package/dist/utils.js.map +1 -0
  56. package/package.json +67 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opentrace-components.cjs","sources":["../node_modules/sigma/dist/inherits-d1a1e29b.esm.js","../node_modules/sigma/dist/colors-beb06eb2.esm.js","../node_modules/sigma/dist/index-236c62ad.esm.js","../node_modules/sigma/types/dist/sigma-types.esm.js","../node_modules/sigma/dist/normalization-be445518.esm.js","../node_modules/sigma/dist/data-11df7124.esm.js","../node_modules/sigma/settings/dist/sigma-settings.esm.js","../node_modules/sigma/dist/sigma.esm.js","../node_modules/@react-sigma/core/lib/react-sigma_core.esm.min.js","../node_modules/sigma/rendering/dist/sigma-rendering.esm.js","../node_modules/@sigma/edge-curve/dist/sigma-edge-curve.esm.js","../src/config/graphLayout.ts","../src/graph/useGraphInstance.ts","../src/graph/useGraphVisuals.ts","../node_modules/@react-sigma/layout-core/lib/react-sigma_layout-core.esm.min.js","../node_modules/graphology-layout-forceatlas2/iterate.js","../node_modules/graphology-layout-forceatlas2/helpers.js","../node_modules/graphology-layout-forceatlas2/defaults.js","../node_modules/graphology-layout-forceatlas2/index.js","../node_modules/graphology-layout-forceatlas2/webworker.js","../node_modules/graphology-layout-forceatlas2/worker.js","../node_modules/@react-sigma/layout-forceatlas2/lib/react-sigma_layout-forceatlas2.esm.min.js","../src/sigma/zoomToNodes.ts","../src/graph/LayoutPipeline.tsx","../src/graph/drawNodeHover.ts","../src/GraphCanvas.tsx"],"sourcesContent":["function _toPrimitive(t, r) {\n if (\"object\" != typeof t || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != typeof i) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\n\nfunction _toPropertyKey(t) {\n var i = _toPrimitive(t, \"string\");\n return \"symbol\" == typeof i ? i : i + \"\";\n}\n\nfunction _classCallCheck(a, n) {\n if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\");\n}\n\nfunction _defineProperties(e, r) {\n for (var t = 0; t < r.length; t++) {\n var o = r[t];\n o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o);\n }\n}\nfunction _createClass(e, r, t) {\n return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", {\n writable: !1\n }), e;\n}\n\nfunction _getPrototypeOf(t) {\n return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {\n return t.__proto__ || Object.getPrototypeOf(t);\n }, _getPrototypeOf(t);\n}\n\nfunction _isNativeReflectConstruct() {\n try {\n var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n } catch (t) {}\n return (_isNativeReflectConstruct = function () {\n return !!t;\n })();\n}\n\nfunction _assertThisInitialized(e) {\n if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n return e;\n}\n\nfunction _possibleConstructorReturn(t, e) {\n if (e && (\"object\" == typeof e || \"function\" == typeof e)) return e;\n if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\");\n return _assertThisInitialized(t);\n}\n\nfunction _callSuper(t, o, e) {\n return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e));\n}\n\nfunction _setPrototypeOf(t, e) {\n return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n return t.__proto__ = e, t;\n }, _setPrototypeOf(t, e);\n}\n\nfunction _inherits(t, e) {\n if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\");\n t.prototype = Object.create(e && e.prototype, {\n constructor: {\n value: t,\n writable: !0,\n configurable: !0\n }\n }), Object.defineProperty(t, \"prototype\", {\n writable: !1\n }), e && _setPrototypeOf(t, e);\n}\n\nexport { _inherits as _, _createClass as a, _classCallCheck as b, _callSuper as c, _toPropertyKey as d, _getPrototypeOf as e };\n","function _arrayWithHoles(r) {\n if (Array.isArray(r)) return r;\n}\n\nfunction _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = !0,\n o = !1;\n try {\n if (i = (t = t.call(r)).next, 0 === l) {\n if (Object(t) !== t) return;\n f = !1;\n } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = !0, n = r;\n } finally {\n try {\n if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}\n\nfunction _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\n\nfunction _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n }\n}\n\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nfunction _slicedToArray(r, e) {\n return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();\n}\n\nvar HTML_COLORS = {\n black: \"#000000\",\n silver: \"#C0C0C0\",\n gray: \"#808080\",\n grey: \"#808080\",\n white: \"#FFFFFF\",\n maroon: \"#800000\",\n red: \"#FF0000\",\n purple: \"#800080\",\n fuchsia: \"#FF00FF\",\n green: \"#008000\",\n lime: \"#00FF00\",\n olive: \"#808000\",\n yellow: \"#FFFF00\",\n navy: \"#000080\",\n blue: \"#0000FF\",\n teal: \"#008080\",\n aqua: \"#00FFFF\",\n darkblue: \"#00008B\",\n mediumblue: \"#0000CD\",\n darkgreen: \"#006400\",\n darkcyan: \"#008B8B\",\n deepskyblue: \"#00BFFF\",\n darkturquoise: \"#00CED1\",\n mediumspringgreen: \"#00FA9A\",\n springgreen: \"#00FF7F\",\n cyan: \"#00FFFF\",\n midnightblue: \"#191970\",\n dodgerblue: \"#1E90FF\",\n lightseagreen: \"#20B2AA\",\n forestgreen: \"#228B22\",\n seagreen: \"#2E8B57\",\n darkslategray: \"#2F4F4F\",\n darkslategrey: \"#2F4F4F\",\n limegreen: \"#32CD32\",\n mediumseagreen: \"#3CB371\",\n turquoise: \"#40E0D0\",\n royalblue: \"#4169E1\",\n steelblue: \"#4682B4\",\n darkslateblue: \"#483D8B\",\n mediumturquoise: \"#48D1CC\",\n indigo: \"#4B0082\",\n darkolivegreen: \"#556B2F\",\n cadetblue: \"#5F9EA0\",\n cornflowerblue: \"#6495ED\",\n rebeccapurple: \"#663399\",\n mediumaquamarine: \"#66CDAA\",\n dimgray: \"#696969\",\n dimgrey: \"#696969\",\n slateblue: \"#6A5ACD\",\n olivedrab: \"#6B8E23\",\n slategray: \"#708090\",\n slategrey: \"#708090\",\n lightslategray: \"#778899\",\n lightslategrey: \"#778899\",\n mediumslateblue: \"#7B68EE\",\n lawngreen: \"#7CFC00\",\n chartreuse: \"#7FFF00\",\n aquamarine: \"#7FFFD4\",\n skyblue: \"#87CEEB\",\n lightskyblue: \"#87CEFA\",\n blueviolet: \"#8A2BE2\",\n darkred: \"#8B0000\",\n darkmagenta: \"#8B008B\",\n saddlebrown: \"#8B4513\",\n darkseagreen: \"#8FBC8F\",\n lightgreen: \"#90EE90\",\n mediumpurple: \"#9370DB\",\n darkviolet: \"#9400D3\",\n palegreen: \"#98FB98\",\n darkorchid: \"#9932CC\",\n yellowgreen: \"#9ACD32\",\n sienna: \"#A0522D\",\n brown: \"#A52A2A\",\n darkgray: \"#A9A9A9\",\n darkgrey: \"#A9A9A9\",\n lightblue: \"#ADD8E6\",\n greenyellow: \"#ADFF2F\",\n paleturquoise: \"#AFEEEE\",\n lightsteelblue: \"#B0C4DE\",\n powderblue: \"#B0E0E6\",\n firebrick: \"#B22222\",\n darkgoldenrod: \"#B8860B\",\n mediumorchid: \"#BA55D3\",\n rosybrown: \"#BC8F8F\",\n darkkhaki: \"#BDB76B\",\n mediumvioletred: \"#C71585\",\n indianred: \"#CD5C5C\",\n peru: \"#CD853F\",\n chocolate: \"#D2691E\",\n tan: \"#D2B48C\",\n lightgray: \"#D3D3D3\",\n lightgrey: \"#D3D3D3\",\n thistle: \"#D8BFD8\",\n orchid: \"#DA70D6\",\n goldenrod: \"#DAA520\",\n palevioletred: \"#DB7093\",\n crimson: \"#DC143C\",\n gainsboro: \"#DCDCDC\",\n plum: \"#DDA0DD\",\n burlywood: \"#DEB887\",\n lightcyan: \"#E0FFFF\",\n lavender: \"#E6E6FA\",\n darksalmon: \"#E9967A\",\n violet: \"#EE82EE\",\n palegoldenrod: \"#EEE8AA\",\n lightcoral: \"#F08080\",\n khaki: \"#F0E68C\",\n aliceblue: \"#F0F8FF\",\n honeydew: \"#F0FFF0\",\n azure: \"#F0FFFF\",\n sandybrown: \"#F4A460\",\n wheat: \"#F5DEB3\",\n beige: \"#F5F5DC\",\n whitesmoke: \"#F5F5F5\",\n mintcream: \"#F5FFFA\",\n ghostwhite: \"#F8F8FF\",\n salmon: \"#FA8072\",\n antiquewhite: \"#FAEBD7\",\n linen: \"#FAF0E6\",\n lightgoldenrodyellow: \"#FAFAD2\",\n oldlace: \"#FDF5E6\",\n magenta: \"#FF00FF\",\n deeppink: \"#FF1493\",\n orangered: \"#FF4500\",\n tomato: \"#FF6347\",\n hotpink: \"#FF69B4\",\n coral: \"#FF7F50\",\n darkorange: \"#FF8C00\",\n lightsalmon: \"#FFA07A\",\n orange: \"#FFA500\",\n lightpink: \"#FFB6C1\",\n pink: \"#FFC0CB\",\n gold: \"#FFD700\",\n peachpuff: \"#FFDAB9\",\n navajowhite: \"#FFDEAD\",\n moccasin: \"#FFE4B5\",\n bisque: \"#FFE4C4\",\n mistyrose: \"#FFE4E1\",\n blanchedalmond: \"#FFEBCD\",\n papayawhip: \"#FFEFD5\",\n lavenderblush: \"#FFF0F5\",\n seashell: \"#FFF5EE\",\n cornsilk: \"#FFF8DC\",\n lemonchiffon: \"#FFFACD\",\n floralwhite: \"#FFFAF0\",\n snow: \"#FFFAFA\",\n lightyellow: \"#FFFFE0\",\n ivory: \"#FFFFF0\"\n};\n\n/**\n * Function extracting the color at the given pixel.\n */\nfunction extractPixel(gl, x, y, array) {\n var data = array || new Uint8Array(4);\n gl.readPixels(x, y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, data);\n return data;\n}\n\n/**\n * Memoized function returning a float-encoded color from various string\n * formats describing colors.\n */\nvar INT8 = new Int8Array(4);\nvar INT32 = new Int32Array(INT8.buffer, 0, 1);\nvar FLOAT32 = new Float32Array(INT8.buffer, 0, 1);\nvar RGBA_TEST_REGEX = /^\\s*rgba?\\s*\\(/;\nvar RGBA_EXTRACT_REGEX = /^\\s*rgba?\\s*\\(\\s*([0-9]*)\\s*,\\s*([0-9]*)\\s*,\\s*([0-9]*)(?:\\s*,\\s*(.*)?)?\\)\\s*$/;\nfunction parseColor(val) {\n var r = 0; // byte\n var g = 0; // byte\n var b = 0; // byte\n var a = 1; // float\n\n // Handling hexadecimal notation\n if (val[0] === \"#\") {\n if (val.length === 4) {\n r = parseInt(val.charAt(1) + val.charAt(1), 16);\n g = parseInt(val.charAt(2) + val.charAt(2), 16);\n b = parseInt(val.charAt(3) + val.charAt(3), 16);\n } else {\n r = parseInt(val.charAt(1) + val.charAt(2), 16);\n g = parseInt(val.charAt(3) + val.charAt(4), 16);\n b = parseInt(val.charAt(5) + val.charAt(6), 16);\n }\n if (val.length === 9) {\n a = parseInt(val.charAt(7) + val.charAt(8), 16) / 255;\n }\n }\n\n // Handling rgb notation\n else if (RGBA_TEST_REGEX.test(val)) {\n var match = val.match(RGBA_EXTRACT_REGEX);\n if (match) {\n r = +match[1];\n g = +match[2];\n b = +match[3];\n if (match[4]) a = +match[4];\n }\n }\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nvar FLOAT_COLOR_CACHE = {};\nfor (var htmlColor in HTML_COLORS) {\n FLOAT_COLOR_CACHE[htmlColor] = floatColor(HTML_COLORS[htmlColor]);\n // Replicating cache for hex values for free\n FLOAT_COLOR_CACHE[HTML_COLORS[htmlColor]] = FLOAT_COLOR_CACHE[htmlColor];\n}\nfunction rgbaToFloat(r, g, b, a, masking) {\n INT32[0] = a << 24 | b << 16 | g << 8 | r;\n if (masking) INT32[0] = INT32[0] & 0xfeffffff;\n return FLOAT32[0];\n}\nfunction floatColor(val) {\n // The html color names are case-insensitive\n val = val.toLowerCase();\n\n // If the color is already computed, we yield it\n if (typeof FLOAT_COLOR_CACHE[val] !== \"undefined\") return FLOAT_COLOR_CACHE[val];\n var parsed = parseColor(val);\n var r = parsed.r,\n g = parsed.g,\n b = parsed.b;\n var a = parsed.a;\n a = a * 255 | 0;\n var color = rgbaToFloat(r, g, b, a, true);\n FLOAT_COLOR_CACHE[val] = color;\n return color;\n}\nfunction colorToArray(val, masking) {\n FLOAT32[0] = floatColor(val);\n var intValue = INT32[0];\n if (masking) {\n intValue = intValue | 0x01000000;\n }\n var r = intValue & 0xff;\n var g = intValue >> 8 & 0xff;\n var b = intValue >> 16 & 0xff;\n var a = intValue >> 24 & 0xff;\n return [r, g, b, a];\n}\nvar FLOAT_INDEX_CACHE = {};\nfunction indexToColor(index) {\n // If the index is already computed, we yield it\n if (typeof FLOAT_INDEX_CACHE[index] !== \"undefined\") return FLOAT_INDEX_CACHE[index];\n\n // To address issue #1397, one strategy is to keep encoding 4 bytes colors,\n // but with alpha hard-set to 1.0 (or 255):\n var r = (index & 0x00ff0000) >>> 16;\n var g = (index & 0x0000ff00) >>> 8;\n var b = index & 0x000000ff;\n var a = 0x000000ff;\n\n // The original 4 bytes color encoding was the following:\n // const r = (index & 0xff000000) >>> 24;\n // const g = (index & 0x00ff0000) >>> 16;\n // const b = (index & 0x0000ff00) >>> 8;\n // const a = index & 0x000000ff;\n\n var color = rgbaToFloat(r, g, b, a, true);\n FLOAT_INDEX_CACHE[index] = color;\n return color;\n}\nfunction colorToIndex(r, g, b, _a) {\n // As for the function indexToColor, because of #1397 and the \"alpha is always\n // 1.0\" strategy, we need to fix this function as well:\n return b + (g << 8) + (r << 16);\n\n // The original 4 bytes color decoding is the following:\n // return a + (b << 8) + (g << 16) + (r << 24);\n}\nfunction getPixelColor(gl, frameBuffer, x, y, pixelRatio, downSizingRatio) {\n var bufferX = Math.floor(x / downSizingRatio * pixelRatio);\n var bufferY = Math.floor(gl.drawingBufferHeight / downSizingRatio - y / downSizingRatio * pixelRatio);\n var pixel = new Uint8Array(4);\n gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);\n gl.readPixels(bufferX, bufferY, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel);\n var _pixel = _slicedToArray(pixel, 4),\n r = _pixel[0],\n g = _pixel[1],\n b = _pixel[2],\n a = _pixel[3];\n return [r, g, b, a];\n}\n\nexport { HTML_COLORS as H, _slicedToArray as _, _arrayLikeToArray as a, _unsupportedIterableToArray as b, colorToIndex as c, colorToArray as d, extractPixel as e, floatColor as f, getPixelColor as g, indexToColor as i, parseColor as p, rgbaToFloat as r };\n","import { d as _toPropertyKey, e as _getPrototypeOf, a as _createClass, b as _classCallCheck, _ as _inherits, c as _callSuper } from './inherits-d1a1e29b.esm.js';\nimport { i as indexToColor, f as floatColor } from './colors-beb06eb2.esm.js';\n\nfunction _defineProperty(e, r, t) {\n return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\n\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n _defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\n\nfunction _superPropBase(t, o) {\n for (; !{}.hasOwnProperty.call(t, o) && null !== (t = _getPrototypeOf(t)););\n return t;\n}\n\nfunction _get() {\n return _get = \"undefined\" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) {\n var p = _superPropBase(e, t);\n if (p) {\n var n = Object.getOwnPropertyDescriptor(p, t);\n return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value;\n }\n }, _get.apply(null, arguments);\n}\n\nfunction _superPropGet(t, o, e, r) {\n var p = _get(_getPrototypeOf(1 & r ? t.prototype : t), o, e);\n return 2 & r && \"function\" == typeof p ? function (t) {\n return p.apply(e, t);\n } : p;\n}\n\nfunction getAttributeItemsCount(attr) {\n return attr.normalized ? 1 : attr.size;\n}\nfunction getAttributesItemsCount(attrs) {\n var res = 0;\n attrs.forEach(function (attr) {\n return res += getAttributeItemsCount(attr);\n });\n return res;\n}\nfunction loadShader(type, gl, source) {\n var glType = type === \"VERTEX\" ? gl.VERTEX_SHADER : gl.FRAGMENT_SHADER;\n\n // Creating the shader\n var shader = gl.createShader(glType);\n if (shader === null) {\n throw new Error(\"loadShader: error while creating the shader\");\n }\n\n // Loading source\n gl.shaderSource(shader, source);\n\n // Compiling the shader\n gl.compileShader(shader);\n\n // Retrieving compilation status\n var successfullyCompiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\n // Throwing if something went awry\n if (!successfullyCompiled) {\n var infoLog = gl.getShaderInfoLog(shader);\n gl.deleteShader(shader);\n throw new Error(\"loadShader: error while compiling the shader:\\n\".concat(infoLog, \"\\n\").concat(source));\n }\n return shader;\n}\nfunction loadVertexShader(gl, source) {\n return loadShader(\"VERTEX\", gl, source);\n}\nfunction loadFragmentShader(gl, source) {\n return loadShader(\"FRAGMENT\", gl, source);\n}\n\n/**\n * Function used to load a program.\n */\nfunction loadProgram(gl, shaders) {\n var program = gl.createProgram();\n if (program === null) {\n throw new Error(\"loadProgram: error while creating the program.\");\n }\n var i, l;\n\n // Attaching the shaders\n for (i = 0, l = shaders.length; i < l; i++) gl.attachShader(program, shaders[i]);\n gl.linkProgram(program);\n\n // Checking status\n var successfullyLinked = gl.getProgramParameter(program, gl.LINK_STATUS);\n if (!successfullyLinked) {\n gl.deleteProgram(program);\n throw new Error(\"loadProgram: error while linking the program.\");\n }\n return program;\n}\nfunction killProgram(_ref) {\n var gl = _ref.gl,\n buffer = _ref.buffer,\n program = _ref.program,\n vertexShader = _ref.vertexShader,\n fragmentShader = _ref.fragmentShader;\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n gl.deleteProgram(program);\n gl.deleteBuffer(buffer);\n}\n\n/**\n * Function use to print a float for inserting in a GLSL program.\n */\nfunction numberToGLSLFloat(n) {\n return n % 1 === 0 ? n.toFixed(1) : n.toString();\n}\n\nvar PICKING_PREFIX = \"#define PICKING_MODE\\n\";\nvar SIZE_FACTOR_PER_ATTRIBUTE_TYPE = _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, WebGL2RenderingContext.BOOL, 1), WebGL2RenderingContext.BYTE, 1), WebGL2RenderingContext.UNSIGNED_BYTE, 1), WebGL2RenderingContext.SHORT, 2), WebGL2RenderingContext.UNSIGNED_SHORT, 2), WebGL2RenderingContext.INT, 4), WebGL2RenderingContext.UNSIGNED_INT, 4), WebGL2RenderingContext.FLOAT, 4);\nvar AbstractProgram = /*#__PURE__*/_createClass(function AbstractProgram(_gl, _pickGl, _renderer) {\n _classCallCheck(this, AbstractProgram);\n});\nvar Program = /*#__PURE__*/function () {\n function Program(gl, pickingBuffer, renderer) {\n _classCallCheck(this, Program);\n // GLenum\n _defineProperty(this, \"array\", new Float32Array());\n _defineProperty(this, \"constantArray\", new Float32Array());\n _defineProperty(this, \"capacity\", 0);\n _defineProperty(this, \"verticesCount\", 0);\n // Reading and caching program definition\n var def = this.getDefinition();\n this.VERTICES = def.VERTICES;\n this.VERTEX_SHADER_SOURCE = def.VERTEX_SHADER_SOURCE;\n this.FRAGMENT_SHADER_SOURCE = def.FRAGMENT_SHADER_SOURCE;\n this.UNIFORMS = def.UNIFORMS;\n this.ATTRIBUTES = def.ATTRIBUTES;\n this.METHOD = def.METHOD;\n this.CONSTANT_ATTRIBUTES = \"CONSTANT_ATTRIBUTES\" in def ? def.CONSTANT_ATTRIBUTES : [];\n this.CONSTANT_DATA = \"CONSTANT_DATA\" in def ? def.CONSTANT_DATA : [];\n this.isInstanced = \"CONSTANT_ATTRIBUTES\" in def;\n\n // Computing stride\n this.ATTRIBUTES_ITEMS_COUNT = getAttributesItemsCount(this.ATTRIBUTES);\n this.STRIDE = this.VERTICES * this.ATTRIBUTES_ITEMS_COUNT;\n\n // Members\n this.renderer = renderer;\n this.normalProgram = this.getProgramInfo(\"normal\", gl, def.VERTEX_SHADER_SOURCE, def.FRAGMENT_SHADER_SOURCE, null);\n this.pickProgram = pickingBuffer ? this.getProgramInfo(\"pick\", gl, PICKING_PREFIX + def.VERTEX_SHADER_SOURCE, PICKING_PREFIX + def.FRAGMENT_SHADER_SOURCE, pickingBuffer) : null;\n\n // For instanced programs:\n if (this.isInstanced) {\n var constantAttributesItemsCount = getAttributesItemsCount(this.CONSTANT_ATTRIBUTES);\n if (this.CONSTANT_DATA.length !== this.VERTICES) throw new Error(\"Program: error while getting constant data (expected \".concat(this.VERTICES, \" items, received \").concat(this.CONSTANT_DATA.length, \" instead)\"));\n this.constantArray = new Float32Array(this.CONSTANT_DATA.length * constantAttributesItemsCount);\n for (var i = 0; i < this.CONSTANT_DATA.length; i++) {\n var vector = this.CONSTANT_DATA[i];\n if (vector.length !== constantAttributesItemsCount) throw new Error(\"Program: error while getting constant data (one vector has \".concat(vector.length, \" items instead of \").concat(constantAttributesItemsCount, \")\"));\n for (var j = 0; j < vector.length; j++) this.constantArray[i * constantAttributesItemsCount + j] = vector[j];\n }\n this.STRIDE = this.ATTRIBUTES_ITEMS_COUNT;\n }\n }\n return _createClass(Program, [{\n key: \"kill\",\n value: function kill() {\n killProgram(this.normalProgram);\n if (this.pickProgram) {\n killProgram(this.pickProgram);\n this.pickProgram = null;\n }\n }\n }, {\n key: \"getProgramInfo\",\n value: function getProgramInfo(name, gl, vertexShaderSource, fragmentShaderSource, frameBuffer) {\n var def = this.getDefinition();\n\n // WebGL buffers\n var buffer = gl.createBuffer();\n if (buffer === null) throw new Error(\"Program: error while creating the WebGL buffer.\");\n\n // Shaders and program\n var vertexShader = loadVertexShader(gl, vertexShaderSource);\n var fragmentShader = loadFragmentShader(gl, fragmentShaderSource);\n var program = loadProgram(gl, [vertexShader, fragmentShader]);\n\n // Initializing locations\n var uniformLocations = {};\n def.UNIFORMS.forEach(function (uniformName) {\n var location = gl.getUniformLocation(program, uniformName);\n if (location) uniformLocations[uniformName] = location;\n });\n var attributeLocations = {};\n def.ATTRIBUTES.forEach(function (attr) {\n attributeLocations[attr.name] = gl.getAttribLocation(program, attr.name);\n });\n\n // For instanced programs:\n var constantBuffer;\n if (\"CONSTANT_ATTRIBUTES\" in def) {\n def.CONSTANT_ATTRIBUTES.forEach(function (attr) {\n attributeLocations[attr.name] = gl.getAttribLocation(program, attr.name);\n });\n constantBuffer = gl.createBuffer();\n if (constantBuffer === null) throw new Error(\"Program: error while creating the WebGL constant buffer.\");\n }\n return {\n name: name,\n program: program,\n gl: gl,\n frameBuffer: frameBuffer,\n buffer: buffer,\n constantBuffer: constantBuffer || {},\n uniformLocations: uniformLocations,\n attributeLocations: attributeLocations,\n isPicking: name === \"pick\",\n vertexShader: vertexShader,\n fragmentShader: fragmentShader\n };\n }\n }, {\n key: \"bindProgram\",\n value: function bindProgram(program) {\n var _this = this;\n var offset = 0;\n var gl = program.gl,\n buffer = program.buffer;\n if (!this.isInstanced) {\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n offset = 0;\n this.ATTRIBUTES.forEach(function (attr) {\n return offset += _this.bindAttribute(attr, program, offset);\n });\n gl.bufferData(gl.ARRAY_BUFFER, this.array, gl.DYNAMIC_DRAW);\n } else {\n // Handle constant data (things that remain unchanged for all items):\n gl.bindBuffer(gl.ARRAY_BUFFER, program.constantBuffer);\n offset = 0;\n this.CONSTANT_ATTRIBUTES.forEach(function (attr) {\n return offset += _this.bindAttribute(attr, program, offset, false);\n });\n gl.bufferData(gl.ARRAY_BUFFER, this.constantArray, gl.STATIC_DRAW);\n\n // Handle \"instance specific\" data (things that vary for each item):\n gl.bindBuffer(gl.ARRAY_BUFFER, program.buffer);\n offset = 0;\n this.ATTRIBUTES.forEach(function (attr) {\n return offset += _this.bindAttribute(attr, program, offset, true);\n });\n gl.bufferData(gl.ARRAY_BUFFER, this.array, gl.DYNAMIC_DRAW);\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n }\n }, {\n key: \"unbindProgram\",\n value: function unbindProgram(program) {\n var _this2 = this;\n if (!this.isInstanced) {\n this.ATTRIBUTES.forEach(function (attr) {\n return _this2.unbindAttribute(attr, program);\n });\n } else {\n this.CONSTANT_ATTRIBUTES.forEach(function (attr) {\n return _this2.unbindAttribute(attr, program, false);\n });\n this.ATTRIBUTES.forEach(function (attr) {\n return _this2.unbindAttribute(attr, program, true);\n });\n }\n }\n }, {\n key: \"bindAttribute\",\n value: function bindAttribute(attr, program, offset, setDivisor) {\n var sizeFactor = SIZE_FACTOR_PER_ATTRIBUTE_TYPE[attr.type];\n if (typeof sizeFactor !== \"number\") throw new Error(\"Program.bind: yet unsupported attribute type \\\"\".concat(attr.type, \"\\\"\"));\n var location = program.attributeLocations[attr.name];\n var gl = program.gl;\n if (location !== -1) {\n gl.enableVertexAttribArray(location);\n var stride = !this.isInstanced ? this.ATTRIBUTES_ITEMS_COUNT * Float32Array.BYTES_PER_ELEMENT : (setDivisor ? this.ATTRIBUTES_ITEMS_COUNT : getAttributesItemsCount(this.CONSTANT_ATTRIBUTES)) * Float32Array.BYTES_PER_ELEMENT;\n gl.vertexAttribPointer(location, attr.size, attr.type, attr.normalized || false, stride, offset);\n if (this.isInstanced && setDivisor) {\n if (gl instanceof WebGL2RenderingContext) {\n gl.vertexAttribDivisor(location, 1);\n } else {\n var ext = gl.getExtension(\"ANGLE_instanced_arrays\");\n if (ext) ext.vertexAttribDivisorANGLE(location, 1);\n }\n }\n }\n return attr.size * sizeFactor;\n }\n }, {\n key: \"unbindAttribute\",\n value: function unbindAttribute(attr, program, unsetDivisor) {\n var location = program.attributeLocations[attr.name];\n var gl = program.gl;\n if (location !== -1) {\n gl.disableVertexAttribArray(location);\n if (this.isInstanced && unsetDivisor) {\n if (gl instanceof WebGL2RenderingContext) {\n gl.vertexAttribDivisor(location, 0);\n } else {\n var ext = gl.getExtension(\"ANGLE_instanced_arrays\");\n if (ext) ext.vertexAttribDivisorANGLE(location, 0);\n }\n }\n }\n }\n }, {\n key: \"reallocate\",\n value: function reallocate(capacity) {\n // If desired capacity has not changed we do nothing\n // NOTE: it's possible here to implement more subtle reallocation schemes\n // when the number of rendered items increase or decrease\n if (capacity === this.capacity) return;\n this.capacity = capacity;\n this.verticesCount = this.VERTICES * capacity;\n this.array = new Float32Array(!this.isInstanced ? this.verticesCount * this.ATTRIBUTES_ITEMS_COUNT : this.capacity * this.ATTRIBUTES_ITEMS_COUNT);\n }\n }, {\n key: \"hasNothingToRender\",\n value: function hasNothingToRender() {\n return this.verticesCount === 0;\n }\n }, {\n key: \"renderProgram\",\n value: function renderProgram(params, programInfo) {\n var gl = programInfo.gl,\n program = programInfo.program;\n\n // With the current fix for #1397, the alpha blending is enabled for the\n // picking layer:\n gl.enable(gl.BLEND);\n\n // Original code:\n // if (!isPicking) gl.enable(gl.BLEND);\n // else gl.disable(gl.BLEND);\n\n gl.useProgram(program);\n this.setUniforms(params, programInfo);\n this.drawWebGL(this.METHOD, programInfo);\n }\n }, {\n key: \"render\",\n value: function render(params) {\n if (this.hasNothingToRender()) return;\n if (this.pickProgram) {\n this.pickProgram.gl.viewport(0, 0, params.width * params.pixelRatio / params.downSizingRatio, params.height * params.pixelRatio / params.downSizingRatio);\n this.bindProgram(this.pickProgram);\n this.renderProgram(_objectSpread2(_objectSpread2({}, params), {}, {\n pixelRatio: params.pixelRatio / params.downSizingRatio\n }), this.pickProgram);\n this.unbindProgram(this.pickProgram);\n }\n this.normalProgram.gl.viewport(0, 0, params.width * params.pixelRatio, params.height * params.pixelRatio);\n this.bindProgram(this.normalProgram);\n this.renderProgram(params, this.normalProgram);\n this.unbindProgram(this.normalProgram);\n }\n }, {\n key: \"drawWebGL\",\n value: function drawWebGL(method, _ref) {\n var gl = _ref.gl,\n frameBuffer = _ref.frameBuffer;\n gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);\n if (!this.isInstanced) {\n gl.drawArrays(method, 0, this.verticesCount);\n } else {\n if (gl instanceof WebGL2RenderingContext) {\n gl.drawArraysInstanced(method, 0, this.VERTICES, this.capacity);\n } else {\n var ext = gl.getExtension(\"ANGLE_instanced_arrays\");\n if (ext) ext.drawArraysInstancedANGLE(method, 0, this.VERTICES, this.capacity);\n }\n }\n }\n }]);\n}();\n\nvar AbstractNodeProgram = /*#__PURE__*/function (_AbstractProgram) {\n function AbstractNodeProgram() {\n _classCallCheck(this, AbstractNodeProgram);\n return _callSuper(this, AbstractNodeProgram, arguments);\n }\n _inherits(AbstractNodeProgram, _AbstractProgram);\n return _createClass(AbstractNodeProgram);\n}(AbstractProgram);\nvar NodeProgram = /*#__PURE__*/function (_ref) {\n function NodeProgram() {\n _classCallCheck(this, NodeProgram);\n return _callSuper(this, NodeProgram, arguments);\n }\n _inherits(NodeProgram, _ref);\n return _createClass(NodeProgram, [{\n key: \"kill\",\n value: function kill() {\n _superPropGet(NodeProgram, \"kill\", this, 3)([]);\n }\n }, {\n key: \"process\",\n value: function process(nodeIndex, offset, data) {\n var i = offset * this.STRIDE;\n // NOTE: dealing with hidden items automatically\n if (data.hidden) {\n for (var l = i + this.STRIDE; i < l; i++) {\n this.array[i] = 0;\n }\n return;\n }\n return this.processVisibleItem(indexToColor(nodeIndex), i, data);\n }\n }]);\n}(Program);\n/**\n * Helper function combining two or more programs into a single compound one.\n * Note that this is more a quick & easy way to combine program than a really\n * performant option. More performant programs can be written entirely.\n *\n * @param {array} programClasses - Program classes to combine.\n * @param {function} drawLabel - An optional node \"draw label\" function.\n * @param {function} drawHover - An optional node \"draw hover\" function.\n * @return {function}\n */\nfunction createNodeCompoundProgram(programClasses, drawLabel, drawHover) {\n return /*#__PURE__*/function () {\n function NodeCompoundProgram(gl, pickingBuffer, renderer) {\n _classCallCheck(this, NodeCompoundProgram);\n _defineProperty(this, \"drawLabel\", drawLabel);\n _defineProperty(this, \"drawHover\", drawHover);\n this.programs = programClasses.map(function (Program) {\n return new Program(gl, pickingBuffer, renderer);\n });\n }\n return _createClass(NodeCompoundProgram, [{\n key: \"reallocate\",\n value: function reallocate(capacity) {\n this.programs.forEach(function (program) {\n return program.reallocate(capacity);\n });\n }\n }, {\n key: \"process\",\n value: function process(nodeIndex, offset, data) {\n this.programs.forEach(function (program) {\n return program.process(nodeIndex, offset, data);\n });\n }\n }, {\n key: \"render\",\n value: function render(params) {\n this.programs.forEach(function (program) {\n return program.render(params);\n });\n }\n }, {\n key: \"kill\",\n value: function kill() {\n this.programs.forEach(function (program) {\n return program.kill();\n });\n }\n }]);\n }();\n}\n\nvar AbstractEdgeProgram = /*#__PURE__*/function (_AbstractProgram) {\n function AbstractEdgeProgram() {\n _classCallCheck(this, AbstractEdgeProgram);\n return _callSuper(this, AbstractEdgeProgram, arguments);\n }\n _inherits(AbstractEdgeProgram, _AbstractProgram);\n return _createClass(AbstractEdgeProgram);\n}(AbstractProgram);\nvar EdgeProgram = /*#__PURE__*/function (_ref) {\n function EdgeProgram() {\n var _this;\n _classCallCheck(this, EdgeProgram);\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n _this = _callSuper(this, EdgeProgram, [].concat(args));\n _defineProperty(_this, \"drawLabel\", undefined);\n return _this;\n }\n _inherits(EdgeProgram, _ref);\n return _createClass(EdgeProgram, [{\n key: \"kill\",\n value: function kill() {\n _superPropGet(EdgeProgram, \"kill\", this, 3)([]);\n }\n }, {\n key: \"process\",\n value: function process(edgeIndex, offset, sourceData, targetData, data) {\n var i = offset * this.STRIDE;\n // NOTE: dealing with hidden items automatically\n if (data.hidden || sourceData.hidden || targetData.hidden) {\n for (var l = i + this.STRIDE; i < l; i++) {\n this.array[i] = 0;\n }\n return;\n }\n return this.processVisibleItem(indexToColor(edgeIndex), i, sourceData, targetData, data);\n }\n }]);\n}(Program);\n/**\n * Helper function combining two or more programs into a single compound one.\n * Note that this is more a quick & easy way to combine program than a really\n * performant option. More performant programs can be written entirely.\n *\n * @param {array} programClasses - Program classes to combine.\n * @param {function} drawLabel - An optional edge \"draw label\" function.\n * @return {function}\n */\nfunction createEdgeCompoundProgram(programClasses, drawLabel) {\n return /*#__PURE__*/function () {\n function EdgeCompoundProgram(gl, pickingBuffer, renderer) {\n _classCallCheck(this, EdgeCompoundProgram);\n _defineProperty(this, \"drawLabel\", drawLabel);\n this.programs = programClasses.map(function (Program) {\n return new Program(gl, pickingBuffer, renderer);\n });\n }\n return _createClass(EdgeCompoundProgram, [{\n key: \"reallocate\",\n value: function reallocate(capacity) {\n this.programs.forEach(function (program) {\n return program.reallocate(capacity);\n });\n }\n }, {\n key: \"process\",\n value: function process(edgeIndex, offset, sourceData, targetData, data) {\n this.programs.forEach(function (program) {\n return program.process(edgeIndex, offset, sourceData, targetData, data);\n });\n }\n }, {\n key: \"render\",\n value: function render(params) {\n this.programs.forEach(function (program) {\n return program.render(params);\n });\n }\n }, {\n key: \"kill\",\n value: function kill() {\n this.programs.forEach(function (program) {\n return program.kill();\n });\n }\n }]);\n }();\n}\n\nfunction drawStraightEdgeLabel(context, edgeData, sourceData, targetData, settings) {\n var size = settings.edgeLabelSize,\n font = settings.edgeLabelFont,\n weight = settings.edgeLabelWeight,\n color = settings.edgeLabelColor.attribute ? edgeData[settings.edgeLabelColor.attribute] || settings.edgeLabelColor.color || \"#000\" : settings.edgeLabelColor.color;\n var label = edgeData.label;\n if (!label) return;\n context.fillStyle = color;\n context.font = \"\".concat(weight, \" \").concat(size, \"px \").concat(font);\n\n // Computing positions without considering nodes sizes:\n var sSize = sourceData.size;\n var tSize = targetData.size;\n var sx = sourceData.x;\n var sy = sourceData.y;\n var tx = targetData.x;\n var ty = targetData.y;\n var cx = (sx + tx) / 2;\n var cy = (sy + ty) / 2;\n var dx = tx - sx;\n var dy = ty - sy;\n var d = Math.sqrt(dx * dx + dy * dy);\n if (d < sSize + tSize) return;\n\n // Adding nodes sizes:\n sx += dx * sSize / d;\n sy += dy * sSize / d;\n tx -= dx * tSize / d;\n ty -= dy * tSize / d;\n cx = (sx + tx) / 2;\n cy = (sy + ty) / 2;\n dx = tx - sx;\n dy = ty - sy;\n d = Math.sqrt(dx * dx + dy * dy);\n\n // Handling ellipsis\n var textLength = context.measureText(label).width;\n if (textLength > d) {\n var ellipsis = \"…\";\n label = label + ellipsis;\n textLength = context.measureText(label).width;\n while (textLength > d && label.length > 1) {\n label = label.slice(0, -2) + ellipsis;\n textLength = context.measureText(label).width;\n }\n if (label.length < 4) return;\n }\n var angle;\n if (dx > 0) {\n if (dy > 0) angle = Math.acos(dx / d);else angle = Math.asin(dy / d);\n } else {\n if (dy > 0) angle = Math.acos(dx / d) + Math.PI;else angle = Math.asin(dx / d) + Math.PI / 2;\n }\n context.save();\n context.translate(cx, cy);\n context.rotate(angle);\n context.fillText(label, -textLength / 2, edgeData.size / 2 + size);\n context.restore();\n}\n\nfunction drawDiscNodeLabel(context, data, settings) {\n if (!data.label) return;\n var size = settings.labelSize,\n font = settings.labelFont,\n weight = settings.labelWeight,\n color = settings.labelColor.attribute ? data[settings.labelColor.attribute] || settings.labelColor.color || \"#000\" : settings.labelColor.color;\n context.fillStyle = color;\n context.font = \"\".concat(weight, \" \").concat(size, \"px \").concat(font);\n context.fillText(data.label, data.x + data.size + 3, data.y + size / 3);\n}\n\n/**\n * Draw an hovered node.\n * - if there is no label => display a shadow on the node\n * - if the label box is bigger than node size => display a label box that contains the node with a shadow\n * - else node with shadow and the label box\n */\nfunction drawDiscNodeHover(context, data, settings) {\n var size = settings.labelSize,\n font = settings.labelFont,\n weight = settings.labelWeight;\n context.font = \"\".concat(weight, \" \").concat(size, \"px \").concat(font);\n\n // Then we draw the label background\n context.fillStyle = \"#FFF\";\n context.shadowOffsetX = 0;\n context.shadowOffsetY = 0;\n context.shadowBlur = 8;\n context.shadowColor = \"#000\";\n var PADDING = 2;\n if (typeof data.label === \"string\") {\n var textWidth = context.measureText(data.label).width,\n boxWidth = Math.round(textWidth + 5),\n boxHeight = Math.round(size + 2 * PADDING),\n radius = Math.max(data.size, size / 2) + PADDING;\n var angleRadian = Math.asin(boxHeight / 2 / radius);\n var xDeltaCoord = Math.sqrt(Math.abs(Math.pow(radius, 2) - Math.pow(boxHeight / 2, 2)));\n context.beginPath();\n context.moveTo(data.x + xDeltaCoord, data.y + boxHeight / 2);\n context.lineTo(data.x + radius + boxWidth, data.y + boxHeight / 2);\n context.lineTo(data.x + radius + boxWidth, data.y - boxHeight / 2);\n context.lineTo(data.x + xDeltaCoord, data.y - boxHeight / 2);\n context.arc(data.x, data.y, radius, angleRadian, -angleRadian);\n context.closePath();\n context.fill();\n } else {\n context.beginPath();\n context.arc(data.x, data.y, data.size + PADDING, 0, Math.PI * 2);\n context.closePath();\n context.fill();\n }\n context.shadowOffsetX = 0;\n context.shadowOffsetY = 0;\n context.shadowBlur = 0;\n\n // And finally we draw the label\n drawDiscNodeLabel(context, data, settings);\n}\n\n// language=GLSL\nvar SHADER_SOURCE$6 = /*glsl*/\"\\nprecision highp float;\\n\\nvarying vec4 v_color;\\nvarying vec2 v_diffVector;\\nvarying float v_radius;\\n\\nuniform float u_correctionRatio;\\n\\nconst vec4 transparent = vec4(0.0, 0.0, 0.0, 0.0);\\n\\nvoid main(void) {\\n float border = u_correctionRatio * 2.0;\\n float dist = length(v_diffVector) - v_radius + border;\\n\\n // No antialiasing for picking mode:\\n #ifdef PICKING_MODE\\n if (dist > border)\\n gl_FragColor = transparent;\\n else\\n gl_FragColor = v_color;\\n\\n #else\\n float t = 0.0;\\n if (dist > border)\\n t = 1.0;\\n else if (dist > 0.0)\\n t = dist / border;\\n\\n gl_FragColor = mix(v_color, transparent, t);\\n #endif\\n}\\n\";\nvar FRAGMENT_SHADER_SOURCE$2 = SHADER_SOURCE$6;\n\n// language=GLSL\nvar SHADER_SOURCE$5 = /*glsl*/\"\\nattribute vec4 a_id;\\nattribute vec4 a_color;\\nattribute vec2 a_position;\\nattribute float a_size;\\nattribute float a_angle;\\n\\nuniform mat3 u_matrix;\\nuniform float u_sizeRatio;\\nuniform float u_correctionRatio;\\n\\nvarying vec4 v_color;\\nvarying vec2 v_diffVector;\\nvarying float v_radius;\\nvarying float v_border;\\n\\nconst float bias = 255.0 / 254.0;\\n\\nvoid main() {\\n float size = a_size * u_correctionRatio / u_sizeRatio * 4.0;\\n vec2 diffVector = size * vec2(cos(a_angle), sin(a_angle));\\n vec2 position = a_position + diffVector;\\n gl_Position = vec4(\\n (u_matrix * vec3(position, 1)).xy,\\n 0,\\n 1\\n );\\n\\n v_diffVector = diffVector;\\n v_radius = size / 2.0;\\n\\n #ifdef PICKING_MODE\\n // For picking mode, we use the ID as the color:\\n v_color = a_id;\\n #else\\n // For normal mode, we use the color:\\n v_color = a_color;\\n #endif\\n\\n v_color.a *= bias;\\n}\\n\";\nvar VERTEX_SHADER_SOURCE$3 = SHADER_SOURCE$5;\n\nvar _WebGLRenderingContex$3 = WebGLRenderingContext,\n UNSIGNED_BYTE$3 = _WebGLRenderingContex$3.UNSIGNED_BYTE,\n FLOAT$3 = _WebGLRenderingContex$3.FLOAT;\nvar UNIFORMS$3 = [\"u_sizeRatio\", \"u_correctionRatio\", \"u_matrix\"];\nvar NodeCircleProgram = /*#__PURE__*/function (_NodeProgram) {\n function NodeCircleProgram() {\n _classCallCheck(this, NodeCircleProgram);\n return _callSuper(this, NodeCircleProgram, arguments);\n }\n _inherits(NodeCircleProgram, _NodeProgram);\n return _createClass(NodeCircleProgram, [{\n key: \"getDefinition\",\n value: function getDefinition() {\n return {\n VERTICES: 3,\n VERTEX_SHADER_SOURCE: VERTEX_SHADER_SOURCE$3,\n FRAGMENT_SHADER_SOURCE: FRAGMENT_SHADER_SOURCE$2,\n METHOD: WebGLRenderingContext.TRIANGLES,\n UNIFORMS: UNIFORMS$3,\n ATTRIBUTES: [{\n name: \"a_position\",\n size: 2,\n type: FLOAT$3\n }, {\n name: \"a_size\",\n size: 1,\n type: FLOAT$3\n }, {\n name: \"a_color\",\n size: 4,\n type: UNSIGNED_BYTE$3,\n normalized: true\n }, {\n name: \"a_id\",\n size: 4,\n type: UNSIGNED_BYTE$3,\n normalized: true\n }],\n CONSTANT_ATTRIBUTES: [{\n name: \"a_angle\",\n size: 1,\n type: FLOAT$3\n }],\n CONSTANT_DATA: [[NodeCircleProgram.ANGLE_1], [NodeCircleProgram.ANGLE_2], [NodeCircleProgram.ANGLE_3]]\n };\n }\n }, {\n key: \"processVisibleItem\",\n value: function processVisibleItem(nodeIndex, startIndex, data) {\n var array = this.array;\n var color = floatColor(data.color);\n array[startIndex++] = data.x;\n array[startIndex++] = data.y;\n array[startIndex++] = data.size;\n array[startIndex++] = color;\n array[startIndex++] = nodeIndex;\n }\n }, {\n key: \"setUniforms\",\n value: function setUniforms(params, _ref) {\n var gl = _ref.gl,\n uniformLocations = _ref.uniformLocations;\n var u_sizeRatio = uniformLocations.u_sizeRatio,\n u_correctionRatio = uniformLocations.u_correctionRatio,\n u_matrix = uniformLocations.u_matrix;\n gl.uniform1f(u_correctionRatio, params.correctionRatio);\n gl.uniform1f(u_sizeRatio, params.sizeRatio);\n gl.uniformMatrix3fv(u_matrix, false, params.matrix);\n }\n }]);\n}(NodeProgram);\n_defineProperty(NodeCircleProgram, \"ANGLE_1\", 0);\n_defineProperty(NodeCircleProgram, \"ANGLE_2\", 2 * Math.PI / 3);\n_defineProperty(NodeCircleProgram, \"ANGLE_3\", 4 * Math.PI / 3);\n\n// language=GLSL\nvar SHADER_SOURCE$4 = /*glsl*/\"\\nprecision mediump float;\\n\\nvarying vec4 v_color;\\n\\nvoid main(void) {\\n gl_FragColor = v_color;\\n}\\n\";\nvar FRAGMENT_SHADER_SOURCE$1 = SHADER_SOURCE$4;\n\n// language=GLSL\nvar SHADER_SOURCE$3 = /*glsl*/\"\\nattribute vec2 a_position;\\nattribute vec2 a_normal;\\nattribute float a_radius;\\nattribute vec3 a_barycentric;\\n\\n#ifdef PICKING_MODE\\nattribute vec4 a_id;\\n#else\\nattribute vec4 a_color;\\n#endif\\n\\nuniform mat3 u_matrix;\\nuniform float u_sizeRatio;\\nuniform float u_correctionRatio;\\nuniform float u_minEdgeThickness;\\nuniform float u_lengthToThicknessRatio;\\nuniform float u_widenessToThicknessRatio;\\n\\nvarying vec4 v_color;\\n\\nconst float bias = 255.0 / 254.0;\\n\\nvoid main() {\\n float minThickness = u_minEdgeThickness;\\n\\n float normalLength = length(a_normal);\\n vec2 unitNormal = a_normal / normalLength;\\n\\n // These first computations are taken from edge.vert.glsl and\\n // edge.clamped.vert.glsl. Please read it to get better comments on what's\\n // happening:\\n float pixelsThickness = max(normalLength / u_sizeRatio, minThickness);\\n float webGLThickness = pixelsThickness * u_correctionRatio;\\n float webGLNodeRadius = a_radius * 2.0 * u_correctionRatio / u_sizeRatio;\\n float webGLArrowHeadLength = webGLThickness * u_lengthToThicknessRatio * 2.0;\\n float webGLArrowHeadThickness = webGLThickness * u_widenessToThicknessRatio;\\n\\n float da = a_barycentric.x;\\n float db = a_barycentric.y;\\n float dc = a_barycentric.z;\\n\\n vec2 delta = vec2(\\n da * (webGLNodeRadius * unitNormal.y)\\n + db * ((webGLNodeRadius + webGLArrowHeadLength) * unitNormal.y + webGLArrowHeadThickness * unitNormal.x)\\n + dc * ((webGLNodeRadius + webGLArrowHeadLength) * unitNormal.y - webGLArrowHeadThickness * unitNormal.x),\\n\\n da * (-webGLNodeRadius * unitNormal.x)\\n + db * (-(webGLNodeRadius + webGLArrowHeadLength) * unitNormal.x + webGLArrowHeadThickness * unitNormal.y)\\n + dc * (-(webGLNodeRadius + webGLArrowHeadLength) * unitNormal.x - webGLArrowHeadThickness * unitNormal.y)\\n );\\n\\n vec2 position = (u_matrix * vec3(a_position + delta, 1)).xy;\\n\\n gl_Position = vec4(position, 0, 1);\\n\\n #ifdef PICKING_MODE\\n // For picking mode, we use the ID as the color:\\n v_color = a_id;\\n #else\\n // For normal mode, we use the color:\\n v_color = a_color;\\n #endif\\n\\n v_color.a *= bias;\\n}\\n\";\nvar VERTEX_SHADER_SOURCE$2 = SHADER_SOURCE$3;\n\nvar _WebGLRenderingContex$2 = WebGLRenderingContext,\n UNSIGNED_BYTE$2 = _WebGLRenderingContex$2.UNSIGNED_BYTE,\n FLOAT$2 = _WebGLRenderingContex$2.FLOAT;\nvar UNIFORMS$2 = [\"u_matrix\", \"u_sizeRatio\", \"u_correctionRatio\", \"u_minEdgeThickness\", \"u_lengthToThicknessRatio\", \"u_widenessToThicknessRatio\"];\nvar DEFAULT_EDGE_ARROW_HEAD_PROGRAM_OPTIONS = {\n extremity: \"target\",\n lengthToThicknessRatio: 2.5,\n widenessToThicknessRatio: 2\n};\nfunction createEdgeArrowHeadProgram(inputOptions) {\n var options = _objectSpread2(_objectSpread2({}, DEFAULT_EDGE_ARROW_HEAD_PROGRAM_OPTIONS), inputOptions || {});\n return /*#__PURE__*/function (_EdgeProgram) {\n function EdgeArrowHeadProgram() {\n _classCallCheck(this, EdgeArrowHeadProgram);\n return _callSuper(this, EdgeArrowHeadProgram, arguments);\n }\n _inherits(EdgeArrowHeadProgram, _EdgeProgram);\n return _createClass(EdgeArrowHeadProgram, [{\n key: \"getDefinition\",\n value: function getDefinition() {\n return {\n VERTICES: 3,\n VERTEX_SHADER_SOURCE: VERTEX_SHADER_SOURCE$2,\n FRAGMENT_SHADER_SOURCE: FRAGMENT_SHADER_SOURCE$1,\n METHOD: WebGLRenderingContext.TRIANGLES,\n UNIFORMS: UNIFORMS$2,\n ATTRIBUTES: [{\n name: \"a_position\",\n size: 2,\n type: FLOAT$2\n }, {\n name: \"a_normal\",\n size: 2,\n type: FLOAT$2\n }, {\n name: \"a_radius\",\n size: 1,\n type: FLOAT$2\n }, {\n name: \"a_color\",\n size: 4,\n type: UNSIGNED_BYTE$2,\n normalized: true\n }, {\n name: \"a_id\",\n size: 4,\n type: UNSIGNED_BYTE$2,\n normalized: true\n }],\n CONSTANT_ATTRIBUTES: [{\n name: \"a_barycentric\",\n size: 3,\n type: FLOAT$2\n }],\n CONSTANT_DATA: [[1, 0, 0], [0, 1, 0], [0, 0, 1]]\n };\n }\n }, {\n key: \"processVisibleItem\",\n value: function processVisibleItem(edgeIndex, startIndex, sourceData, targetData, data) {\n if (options.extremity === \"source\") {\n var _ref = [targetData, sourceData];\n sourceData = _ref[0];\n targetData = _ref[1];\n }\n var thickness = data.size || 1;\n var radius = targetData.size || 1;\n var x1 = sourceData.x;\n var y1 = sourceData.y;\n var x2 = targetData.x;\n var y2 = targetData.y;\n var color = floatColor(data.color);\n\n // Computing normals\n var dx = x2 - x1;\n var dy = y2 - y1;\n var len = dx * dx + dy * dy;\n var n1 = 0;\n var n2 = 0;\n if (len) {\n len = 1 / Math.sqrt(len);\n n1 = -dy * len * thickness;\n n2 = dx * len * thickness;\n }\n var array = this.array;\n array[startIndex++] = x2;\n array[startIndex++] = y2;\n array[startIndex++] = -n1;\n array[startIndex++] = -n2;\n array[startIndex++] = radius;\n array[startIndex++] = color;\n array[startIndex++] = edgeIndex;\n }\n }, {\n key: \"setUniforms\",\n value: function setUniforms(params, _ref2) {\n var gl = _ref2.gl,\n uniformLocations = _ref2.uniformLocations;\n var u_matrix = uniformLocations.u_matrix,\n u_sizeRatio = uniformLocations.u_sizeRatio,\n u_correctionRatio = uniformLocations.u_correctionRatio,\n u_minEdgeThickness = uniformLocations.u_minEdgeThickness,\n u_lengthToThicknessRatio = uniformLocations.u_lengthToThicknessRatio,\n u_widenessToThicknessRatio = uniformLocations.u_widenessToThicknessRatio;\n gl.uniformMatrix3fv(u_matrix, false, params.matrix);\n gl.uniform1f(u_sizeRatio, params.sizeRatio);\n gl.uniform1f(u_correctionRatio, params.correctionRatio);\n gl.uniform1f(u_minEdgeThickness, params.minEdgeThickness);\n gl.uniform1f(u_lengthToThicknessRatio, options.lengthToThicknessRatio);\n gl.uniform1f(u_widenessToThicknessRatio, options.widenessToThicknessRatio);\n }\n }]);\n }(EdgeProgram);\n}\nvar EdgeArrowHeadProgram = createEdgeArrowHeadProgram();\nvar EdgeArrowHeadProgram$1 = EdgeArrowHeadProgram;\n\n// language=GLSL\nvar SHADER_SOURCE$2 = /*glsl*/\"\\nprecision mediump float;\\n\\nvarying vec4 v_color;\\nvarying vec2 v_normal;\\nvarying float v_thickness;\\nvarying float v_feather;\\n\\nconst vec4 transparent = vec4(0.0, 0.0, 0.0, 0.0);\\n\\nvoid main(void) {\\n // We only handle antialiasing for normal mode:\\n #ifdef PICKING_MODE\\n gl_FragColor = v_color;\\n #else\\n float dist = length(v_normal) * v_thickness;\\n\\n float t = smoothstep(\\n v_thickness - v_feather,\\n v_thickness,\\n dist\\n );\\n\\n gl_FragColor = mix(v_color, transparent, t);\\n #endif\\n}\\n\";\nvar FRAGMENT_SHADER_SOURCE = SHADER_SOURCE$2;\n\n// language=GLSL\nvar SHADER_SOURCE$1 = /*glsl*/\"\\nattribute vec4 a_id;\\nattribute vec4 a_color;\\nattribute vec2 a_normal;\\nattribute float a_normalCoef;\\nattribute vec2 a_positionStart;\\nattribute vec2 a_positionEnd;\\nattribute float a_positionCoef;\\nattribute float a_radius;\\nattribute float a_radiusCoef;\\n\\nuniform mat3 u_matrix;\\nuniform float u_zoomRatio;\\nuniform float u_sizeRatio;\\nuniform float u_pixelRatio;\\nuniform float u_correctionRatio;\\nuniform float u_minEdgeThickness;\\nuniform float u_lengthToThicknessRatio;\\nuniform float u_feather;\\n\\nvarying vec4 v_color;\\nvarying vec2 v_normal;\\nvarying float v_thickness;\\nvarying float v_feather;\\n\\nconst float bias = 255.0 / 254.0;\\n\\nvoid main() {\\n float minThickness = u_minEdgeThickness;\\n\\n float radius = a_radius * a_radiusCoef;\\n vec2 normal = a_normal * a_normalCoef;\\n vec2 position = a_positionStart * (1.0 - a_positionCoef) + a_positionEnd * a_positionCoef;\\n\\n float normalLength = length(normal);\\n vec2 unitNormal = normal / normalLength;\\n\\n // These first computations are taken from edge.vert.glsl. Please read it to\\n // get better comments on what's happening:\\n float pixelsThickness = max(normalLength, minThickness * u_sizeRatio);\\n float webGLThickness = pixelsThickness * u_correctionRatio / u_sizeRatio;\\n\\n // Here, we move the point to leave space for the arrow head:\\n float direction = sign(radius);\\n float webGLNodeRadius = direction * radius * 2.0 * u_correctionRatio / u_sizeRatio;\\n float webGLArrowHeadLength = webGLThickness * u_lengthToThicknessRatio * 2.0;\\n\\n vec2 compensationVector = vec2(-direction * unitNormal.y, direction * unitNormal.x) * (webGLNodeRadius + webGLArrowHeadLength);\\n\\n // Here is the proper position of the vertex\\n gl_Position = vec4((u_matrix * vec3(position + unitNormal * webGLThickness + compensationVector, 1)).xy, 0, 1);\\n\\n v_thickness = webGLThickness / u_zoomRatio;\\n\\n v_normal = unitNormal;\\n\\n v_feather = u_feather * u_correctionRatio / u_zoomRatio / u_pixelRatio * 2.0;\\n\\n #ifdef PICKING_MODE\\n // For picking mode, we use the ID as the color:\\n v_color = a_id;\\n #else\\n // For normal mode, we use the color:\\n v_color = a_color;\\n #endif\\n\\n v_color.a *= bias;\\n}\\n\";\nvar VERTEX_SHADER_SOURCE$1 = SHADER_SOURCE$1;\n\nvar _WebGLRenderingContex$1 = WebGLRenderingContext,\n UNSIGNED_BYTE$1 = _WebGLRenderingContex$1.UNSIGNED_BYTE,\n FLOAT$1 = _WebGLRenderingContex$1.FLOAT;\nvar UNIFORMS$1 = [\"u_matrix\", \"u_zoomRatio\", \"u_sizeRatio\", \"u_correctionRatio\", \"u_pixelRatio\", \"u_feather\", \"u_minEdgeThickness\", \"u_lengthToThicknessRatio\"];\nvar DEFAULT_EDGE_CLAMPED_PROGRAM_OPTIONS = {\n lengthToThicknessRatio: DEFAULT_EDGE_ARROW_HEAD_PROGRAM_OPTIONS.lengthToThicknessRatio\n};\nfunction createEdgeClampedProgram(inputOptions) {\n var options = _objectSpread2(_objectSpread2({}, DEFAULT_EDGE_CLAMPED_PROGRAM_OPTIONS), inputOptions || {});\n return /*#__PURE__*/function (_EdgeProgram) {\n function EdgeClampedProgram() {\n _classCallCheck(this, EdgeClampedProgram);\n return _callSuper(this, EdgeClampedProgram, arguments);\n }\n _inherits(EdgeClampedProgram, _EdgeProgram);\n return _createClass(EdgeClampedProgram, [{\n key: \"getDefinition\",\n value: function getDefinition() {\n return {\n VERTICES: 6,\n VERTEX_SHADER_SOURCE: VERTEX_SHADER_SOURCE$1,\n FRAGMENT_SHADER_SOURCE: FRAGMENT_SHADER_SOURCE,\n METHOD: WebGLRenderingContext.TRIANGLES,\n UNIFORMS: UNIFORMS$1,\n ATTRIBUTES: [{\n name: \"a_positionStart\",\n size: 2,\n type: FLOAT$1\n }, {\n name: \"a_positionEnd\",\n size: 2,\n type: FLOAT$1\n }, {\n name: \"a_normal\",\n size: 2,\n type: FLOAT$1\n }, {\n name: \"a_color\",\n size: 4,\n type: UNSIGNED_BYTE$1,\n normalized: true\n }, {\n name: \"a_id\",\n size: 4,\n type: UNSIGNED_BYTE$1,\n normalized: true\n }, {\n name: \"a_radius\",\n size: 1,\n type: FLOAT$1\n }],\n CONSTANT_ATTRIBUTES: [\n // If 0, then position will be a_positionStart\n // If 1, then position will be a_positionEnd\n {\n name: \"a_positionCoef\",\n size: 1,\n type: FLOAT$1\n }, {\n name: \"a_normalCoef\",\n size: 1,\n type: FLOAT$1\n }, {\n name: \"a_radiusCoef\",\n size: 1,\n type: FLOAT$1\n }],\n CONSTANT_DATA: [[0, 1, 0], [0, -1, 0], [1, 1, 1], [1, 1, 1], [0, -1, 0], [1, -1, -1]]\n };\n }\n }, {\n key: \"processVisibleItem\",\n value: function processVisibleItem(edgeIndex, startIndex, sourceData, targetData, data) {\n var thickness = data.size || 1;\n var x1 = sourceData.x;\n var y1 = sourceData.y;\n var x2 = targetData.x;\n var y2 = targetData.y;\n var color = floatColor(data.color);\n\n // Computing normals\n var dx = x2 - x1;\n var dy = y2 - y1;\n var radius = targetData.size || 1;\n var len = dx * dx + dy * dy;\n var n1 = 0;\n var n2 = 0;\n if (len) {\n len = 1 / Math.sqrt(len);\n n1 = -dy * len * thickness;\n n2 = dx * len * thickness;\n }\n var array = this.array;\n array[startIndex++] = x1;\n array[startIndex++] = y1;\n array[startIndex++] = x2;\n array[startIndex++] = y2;\n array[startIndex++] = n1;\n array[startIndex++] = n2;\n array[startIndex++] = color;\n array[startIndex++] = edgeIndex;\n array[startIndex++] = radius;\n }\n }, {\n key: \"setUniforms\",\n value: function setUniforms(params, _ref) {\n var gl = _ref.gl,\n uniformLocations = _ref.uniformLocations;\n var u_matrix = uniformLocations.u_matrix,\n u_zoomRatio = uniformLocations.u_zoomRatio,\n u_feather = uniformLocations.u_feather,\n u_pixelRatio = uniformLocations.u_pixelRatio,\n u_correctionRatio = uniformLocations.u_correctionRatio,\n u_sizeRatio = uniformLocations.u_sizeRatio,\n u_minEdgeThickness = uniformLocations.u_minEdgeThickness,\n u_lengthToThicknessRatio = uniformLocations.u_lengthToThicknessRatio;\n gl.uniformMatrix3fv(u_matrix, false, params.matrix);\n gl.uniform1f(u_zoomRatio, params.zoomRatio);\n gl.uniform1f(u_sizeRatio, params.sizeRatio);\n gl.uniform1f(u_correctionRatio, params.correctionRatio);\n gl.uniform1f(u_pixelRatio, params.pixelRatio);\n gl.uniform1f(u_feather, params.antiAliasingFeather);\n gl.uniform1f(u_minEdgeThickness, params.minEdgeThickness);\n gl.uniform1f(u_lengthToThicknessRatio, options.lengthToThicknessRatio);\n }\n }]);\n }(EdgeProgram);\n}\nvar EdgeClampedProgram = createEdgeClampedProgram();\nvar EdgeClampedProgram$1 = EdgeClampedProgram;\n\nfunction createEdgeArrowProgram(inputOptions) {\n return createEdgeCompoundProgram([createEdgeClampedProgram(inputOptions), createEdgeArrowHeadProgram(inputOptions)]);\n}\nvar EdgeArrowProgram = createEdgeArrowProgram();\nvar EdgeArrowProgram$1 = EdgeArrowProgram;\n\n// language=GLSL\nvar SHADER_SOURCE = /*glsl*/\"\\nattribute vec4 a_id;\\nattribute vec4 a_color;\\nattribute vec2 a_normal;\\nattribute float a_normalCoef;\\nattribute vec2 a_positionStart;\\nattribute vec2 a_positionEnd;\\nattribute float a_positionCoef;\\n\\nuniform mat3 u_matrix;\\nuniform float u_sizeRatio;\\nuniform float u_zoomRatio;\\nuniform float u_pixelRatio;\\nuniform float u_correctionRatio;\\nuniform float u_minEdgeThickness;\\nuniform float u_feather;\\n\\nvarying vec4 v_color;\\nvarying vec2 v_normal;\\nvarying float v_thickness;\\nvarying float v_feather;\\n\\nconst float bias = 255.0 / 254.0;\\n\\nvoid main() {\\n float minThickness = u_minEdgeThickness;\\n\\n vec2 normal = a_normal * a_normalCoef;\\n vec2 position = a_positionStart * (1.0 - a_positionCoef) + a_positionEnd * a_positionCoef;\\n\\n float normalLength = length(normal);\\n vec2 unitNormal = normal / normalLength;\\n\\n // We require edges to be at least \\\"minThickness\\\" pixels thick *on screen*\\n // (so we need to compensate the size ratio):\\n float pixelsThickness = max(normalLength, minThickness * u_sizeRatio);\\n\\n // Then, we need to retrieve the normalized thickness of the edge in the WebGL\\n // referential (in a ([0, 1], [0, 1]) space), using our \\\"magic\\\" correction\\n // ratio:\\n float webGLThickness = pixelsThickness * u_correctionRatio / u_sizeRatio;\\n\\n // Here is the proper position of the vertex\\n gl_Position = vec4((u_matrix * vec3(position + unitNormal * webGLThickness, 1)).xy, 0, 1);\\n\\n // For the fragment shader though, we need a thickness that takes the \\\"magic\\\"\\n // correction ratio into account (as in webGLThickness), but so that the\\n // antialiasing effect does not depend on the zoom level. So here's yet\\n // another thickness version:\\n v_thickness = webGLThickness / u_zoomRatio;\\n\\n v_normal = unitNormal;\\n\\n v_feather = u_feather * u_correctionRatio / u_zoomRatio / u_pixelRatio * 2.0;\\n\\n #ifdef PICKING_MODE\\n // For picking mode, we use the ID as the color:\\n v_color = a_id;\\n #else\\n // For normal mode, we use the color:\\n v_color = a_color;\\n #endif\\n\\n v_color.a *= bias;\\n}\\n\";\nvar VERTEX_SHADER_SOURCE = SHADER_SOURCE;\n\nvar _WebGLRenderingContex = WebGLRenderingContext,\n UNSIGNED_BYTE = _WebGLRenderingContex.UNSIGNED_BYTE,\n FLOAT = _WebGLRenderingContex.FLOAT;\nvar UNIFORMS = [\"u_matrix\", \"u_zoomRatio\", \"u_sizeRatio\", \"u_correctionRatio\", \"u_pixelRatio\", \"u_feather\", \"u_minEdgeThickness\"];\nvar EdgeRectangleProgram = /*#__PURE__*/function (_EdgeProgram) {\n function EdgeRectangleProgram() {\n _classCallCheck(this, EdgeRectangleProgram);\n return _callSuper(this, EdgeRectangleProgram, arguments);\n }\n _inherits(EdgeRectangleProgram, _EdgeProgram);\n return _createClass(EdgeRectangleProgram, [{\n key: \"getDefinition\",\n value: function getDefinition() {\n return {\n VERTICES: 6,\n VERTEX_SHADER_SOURCE: VERTEX_SHADER_SOURCE,\n FRAGMENT_SHADER_SOURCE: FRAGMENT_SHADER_SOURCE,\n METHOD: WebGLRenderingContext.TRIANGLES,\n UNIFORMS: UNIFORMS,\n ATTRIBUTES: [{\n name: \"a_positionStart\",\n size: 2,\n type: FLOAT\n }, {\n name: \"a_positionEnd\",\n size: 2,\n type: FLOAT\n }, {\n name: \"a_normal\",\n size: 2,\n type: FLOAT\n }, {\n name: \"a_color\",\n size: 4,\n type: UNSIGNED_BYTE,\n normalized: true\n }, {\n name: \"a_id\",\n size: 4,\n type: UNSIGNED_BYTE,\n normalized: true\n }],\n CONSTANT_ATTRIBUTES: [\n // If 0, then position will be a_positionStart\n // If 2, then position will be a_positionEnd\n {\n name: \"a_positionCoef\",\n size: 1,\n type: FLOAT\n }, {\n name: \"a_normalCoef\",\n size: 1,\n type: FLOAT\n }],\n CONSTANT_DATA: [[0, 1], [0, -1], [1, 1], [1, 1], [0, -1], [1, -1]]\n };\n }\n }, {\n key: \"processVisibleItem\",\n value: function processVisibleItem(edgeIndex, startIndex, sourceData, targetData, data) {\n var thickness = data.size || 1;\n var x1 = sourceData.x;\n var y1 = sourceData.y;\n var x2 = targetData.x;\n var y2 = targetData.y;\n var color = floatColor(data.color);\n\n // Computing normals\n var dx = x2 - x1;\n var dy = y2 - y1;\n var len = dx * dx + dy * dy;\n var n1 = 0;\n var n2 = 0;\n if (len) {\n len = 1 / Math.sqrt(len);\n n1 = -dy * len * thickness;\n n2 = dx * len * thickness;\n }\n var array = this.array;\n array[startIndex++] = x1;\n array[startIndex++] = y1;\n array[startIndex++] = x2;\n array[startIndex++] = y2;\n array[startIndex++] = n1;\n array[startIndex++] = n2;\n array[startIndex++] = color;\n array[startIndex++] = edgeIndex;\n }\n }, {\n key: \"setUniforms\",\n value: function setUniforms(params, _ref) {\n var gl = _ref.gl,\n uniformLocations = _ref.uniformLocations;\n var u_matrix = uniformLocations.u_matrix,\n u_zoomRatio = uniformLocations.u_zoomRatio,\n u_feather = uniformLocations.u_feather,\n u_pixelRatio = uniformLocations.u_pixelRatio,\n u_correctionRatio = uniformLocations.u_correctionRatio,\n u_sizeRatio = uniformLocations.u_sizeRatio,\n u_minEdgeThickness = uniformLocations.u_minEdgeThickness;\n gl.uniformMatrix3fv(u_matrix, false, params.matrix);\n gl.uniform1f(u_zoomRatio, params.zoomRatio);\n gl.uniform1f(u_sizeRatio, params.sizeRatio);\n gl.uniform1f(u_correctionRatio, params.correctionRatio);\n gl.uniform1f(u_pixelRatio, params.pixelRatio);\n gl.uniform1f(u_feather, params.antiAliasingFeather);\n gl.uniform1f(u_minEdgeThickness, params.minEdgeThickness);\n }\n }]);\n}(EdgeProgram);\n\nexport { AbstractNodeProgram as A, DEFAULT_EDGE_ARROW_HEAD_PROGRAM_OPTIONS as D, EdgeArrowProgram$1 as E, FRAGMENT_SHADER_SOURCE as F, NodeCircleProgram as N, Program as P, _objectSpread2 as _, _defineProperty as a, drawDiscNodeLabel as b, drawDiscNodeHover as c, drawStraightEdgeLabel as d, EdgeRectangleProgram as e, NodeProgram as f, EdgeProgram as g, createEdgeCompoundProgram as h, createEdgeArrowHeadProgram as i, createNodeCompoundProgram as j, AbstractEdgeProgram as k, AbstractProgram as l, EdgeArrowHeadProgram$1 as m, EdgeClampedProgram$1 as n, createEdgeClampedProgram as o, DEFAULT_EDGE_CLAMPED_PROGRAM_OPTIONS as p, createEdgeArrowProgram as q, getAttributeItemsCount as r, getAttributesItemsCount as s, loadVertexShader as t, loadFragmentShader as u, loadProgram as v, killProgram as w, numberToGLSLFloat as x };\n","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-236c62ad.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-236c62ad.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","import*as e from\"react\";import t,{createContext as n,useContext as r,useCallback as a,useState as c,useEffect as o,forwardRef as s,useRef as l,useImperativeHandle as i,useMemo as u}from\"react\";import m from\"graphology\";import{Sigma as g}from\"sigma\";const d=n(null),f=d.Provider;function h(){const e=r(d);if(null==e)throw new Error(\"No context provided: useSigmaContext() can only be used in a descendant of <SigmaContainer>\");return e}function v(){return h().sigma}function p(){const{sigma:e}=h();return a((t=>{e&&Object.keys(t).forEach((n=>{e.setSetting(n,t[n])}))}),[e])}function w(e){return new Set(Object.keys(e))}const b=w({clickNode:!0,rightClickNode:!0,downNode:!0,enterNode:!0,leaveNode:!0,doubleClickNode:!0,wheelNode:!0,clickEdge:!0,rightClickEdge:!0,downEdge:!0,enterEdge:!0,leaveEdge:!0,doubleClickEdge:!0,wheelEdge:!0,clickStage:!0,rightClickStage:!0,downStage:!0,doubleClickStage:!0,wheelStage:!0,beforeRender:!0,afterRender:!0,kill:!0,upStage:!0,upEdge:!0,upNode:!0,enterStage:!0,leaveStage:!0,resize:!0,afterClear:!0,afterProcess:!0,beforeClear:!0,beforeProcess:!0,moveBody:!0}),E=w({click:!0,rightClick:!0,doubleClick:!0,mouseup:!0,mousedown:!0,mousemove:!0,mousemovebody:!0,mouseleave:!0,mouseenter:!0,wheel:!0}),_=w({touchup:!0,touchdown:!0,touchmove:!0,touchmovebody:!0,tap:!0,doubletap:!0}),O=w({updated:!0});function y(){const e=v(),t=p(),[n,r]=c({});return o((()=>{if(!e||!n)return;const t=n,r=Object.keys(t);return r.forEach((n=>{const r=t[n];b.has(n)&&e.on(n,r),E.has(n)&&e.getMouseCaptor().on(n,r),_.has(n)&&e.getTouchCaptor().on(n,r),O.has(n)&&e.getCamera().on(n,r)})),()=>{e&&r.forEach((n=>{const r=t[n];b.has(n)&&e.off(n,r),E.has(n)&&e.getMouseCaptor().off(n,r),_.has(n)&&e.getTouchCaptor().off(n,r),O.has(n)&&e.getCamera().off(n,r)}))}}),[e,n,t]),r}function C(){const e=v();return a(((t,n=!0)=>{e&&t&&(n&&e.getGraph().order>0&&e.getGraph().clear(),e.getGraph().import(t),e.refresh())}),[e])}function j(e,t){if(e===t)return!0;if(\"object\"==typeof e&&null!=e&&\"object\"==typeof t&&null!=t){if(Object.keys(e).length!=Object.keys(t).length)return!1;for(const n in e){if(!Object.hasOwn(t,n))return!1;if(!j(e[n],t[n]))return!1}return!0}return!1}function x(e,t){let n;return r=>new Promise((a=>{n&&clearTimeout(n),n=setTimeout((()=>{a(e(r))}),t)}))}function N(e){const t=v(),[n,r]=c(e||{});o((()=>{r((t=>j(t,e||{})?t:e||{}))}),[e]);const s=a((e=>{t.getCamera().animatedZoom(Object.assign(Object.assign({},n),e))}),[t,n]),l=a((e=>{t.getCamera().animatedUnzoom(Object.assign(Object.assign({},n),e))}),[t,n]),i=a((e=>{t.getCamera().animatedReset(Object.assign(Object.assign({},n),e))}),[t,n]),u=a(((e,r)=>{t.getCamera().animate(e,Object.assign(Object.assign({},n),r))}),[t,n]),m=a(((e,r)=>{const a=t.getNodeDisplayData(e);a?t.getCamera().animate(a,Object.assign(Object.assign({},n),r)):console.warn(`Node ${e} not found`)}),[t,n]);return{zoomIn:s,zoomOut:l,reset:i,goto:u,gotoNode:m}}function k(e){const t=h(),[n,r]=c(!1),[s,l]=c(e||t.container),i=a((()=>r((e=>!e))),[]);o((()=>(document.addEventListener(\"fullscreenchange\",i),()=>document.removeEventListener(\"fullscreenchange\",i))),[i]),o((()=>{l(e||t.container)}),[e,t.container]);return{toggle:a((()=>{var e;e=s,document.fullscreenElement!==e?e.requestFullscreen():document.exitFullscreen&&document.exitFullscreen()}),[s]),isFullScreen:n}}const S=s((({graph:e,id:n,className:r,style:a,settings:s={},children:d},h)=>{const v=l(null),p=l(null),w={className:`react-sigma ${r||\"\"}`,id:n,style:a},[b,E]=c(null),[_,O]=c(s);o((()=>{O((e=>j(e,s)?e:s))}),[s]),o((()=>{let t=null;if(null!==p.current){let n=new m;e&&(n=\"function\"==typeof e?new e:e),t=new g(n,p.current,_),E((e=>{let n=null;return e&&(n=e.getCamera().getState()),n&&t.getCamera().setState(n),t}))}return()=>{t&&t.kill()}}),[p,e,_]),i(h,(()=>b),[b]);const y=u((()=>b&&v.current?{sigma:b,container:v.current}:null),[b,v]),C=null!==y?t.createElement(f,{value:y},d):null;return t.createElement(\"div\",Object.assign({},w,{ref:v}),t.createElement(\"div\",{className:\"sigma-container\",ref:p}),C)}));const H=({id:e,className:n,style:r,children:a,position:c=\"bottom-left\"})=>{const o={className:`react-sigma-controls ${n||\"\"} ${c}`,id:e,style:r};return t.createElement(\"div\",Object.assign({},o),a)};var M;function P(){return P=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},P.apply(null,arguments)}var z,V=function(t){return e.createElement(\"svg\",P({xmlns:\"http://www.w3.org/2000/svg\",\"aria-hidden\":\"true\",className:\"dot-circle-regular_svg__svg-inline--fa dot-circle-regular_svg__fa-dot-circle dot-circle-regular_svg__fa-w-16\",\"data-icon\":\"dot-circle\",\"data-prefix\":\"far\",viewBox:\"0 0 512 512\",width:\"1em\",height:\"1em\"},t),M||(M=e.createElement(\"path\",{fill:\"currentColor\",d:\"M256 56c110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200-110.532 0-200-89.451-200-200 0-110.532 89.451-200 200-200m0-48C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8m0 168c-44.183 0-80 35.817-80 80s35.817 80 80 80 80-35.817 80-80-35.817-80-80-80\"})))};function B(){return B=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},B.apply(null,arguments)}var F,$=function(t){return e.createElement(\"svg\",B({xmlns:\"http://www.w3.org/2000/svg\",\"aria-hidden\":\"true\",className:\"minus-solid_svg__svg-inline--fa minus-solid_svg__fa-minus minus-solid_svg__fa-w-14\",\"data-icon\":\"minus\",\"data-prefix\":\"fas\",viewBox:\"0 0 448 512\",width:\"1em\",height:\"1em\"},t),z||(z=e.createElement(\"path\",{fill:\"currentColor\",d:\"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32\"})))};function I(){return I=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},I.apply(null,arguments)}var T=function(t){return e.createElement(\"svg\",I({xmlns:\"http://www.w3.org/2000/svg\",\"aria-hidden\":\"true\",className:\"plus-solid_svg__svg-inline--fa plus-solid_svg__fa-plus plus-solid_svg__fa-w-14\",\"data-icon\":\"plus\",\"data-prefix\":\"fas\",viewBox:\"0 0 448 512\",width:\"1em\",height:\"1em\"},t),F||(F=e.createElement(\"path\",{fill:\"currentColor\",d:\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32\"})))};const D=({className:e,style:n,animationDuration:r=200,children:a,labels:c={}})=>{const{zoomIn:o,zoomOut:s,reset:l}=N({duration:r,factor:1.5}),i={style:n,className:`react-sigma-control ${e||\"\"}`};return t.createElement(t.Fragment,null,t.createElement(\"div\",Object.assign({},i),t.createElement(\"button\",{onClick:()=>o(),title:c.zoomIn||\"Zoom In\"},a?a[0]:t.createElement(T,{style:{width:\"1em\"}}))),t.createElement(\"div\",Object.assign({},i),t.createElement(\"button\",{onClick:()=>s(),title:c.zoomOut||\"Zoom Out\"},a?a[1]:t.createElement($,{style:{width:\"1em\"}}))),t.createElement(\"div\",Object.assign({},i),t.createElement(\"button\",{onClick:()=>l(),title:c.reset||\"See whole graph\"},a?a[2]:t.createElement(V,{style:{width:\"1em\"}}))))};var G;function R(){return R=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},R.apply(null,arguments)}var Z,L=function(t){return e.createElement(\"svg\",R({xmlns:\"http://www.w3.org/2000/svg\",\"aria-hidden\":\"true\",className:\"compress-solid_svg__svg-inline--fa compress-solid_svg__fa-compress compress-solid_svg__fa-w-14\",\"data-icon\":\"compress\",\"data-prefix\":\"fas\",viewBox:\"0 0 448 512\",width:\"1em\",height:\"1em\"},t),G||(G=e.createElement(\"path\",{fill:\"currentColor\",d:\"M436 192H312c-13.3 0-24-10.7-24-24V44c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v84h84c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12m-276-24V44c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v84H12c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h124c13.3 0 24-10.7 24-24m0 300V344c0-13.3-10.7-24-24-24H12c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h84v84c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12m192 0v-84h84c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12H312c-13.3 0-24 10.7-24 24v124c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12\"})))};function q(){return q=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},q.apply(null,arguments)}var U=function(t){return e.createElement(\"svg\",q({xmlns:\"http://www.w3.org/2000/svg\",\"aria-hidden\":\"true\",className:\"expand-solid_svg__svg-inline--fa expand-solid_svg__fa-expand expand-solid_svg__fa-w-14\",\"data-icon\":\"expand\",\"data-prefix\":\"fas\",viewBox:\"0 0 448 512\",width:\"1em\",height:\"1em\"},t),Z||(Z=e.createElement(\"path\",{fill:\"currentColor\",d:\"M0 180V56c0-13.3 10.7-24 24-24h124c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H64v84c0 6.6-5.4 12-12 12H12c-6.6 0-12-5.4-12-12M288 44v40c0 6.6 5.4 12 12 12h84v84c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12V56c0-13.3-10.7-24-24-24H300c-6.6 0-12 5.4-12 12m148 276h-40c-6.6 0-12 5.4-12 12v84h-84c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h124c13.3 0 24-10.7 24-24V332c0-6.6-5.4-12-12-12M160 468v-40c0-6.6-5.4-12-12-12H64v-84c0-6.6-5.4-12-12-12H12c-6.6 0-12 5.4-12 12v124c0 13.3 10.7 24 24 24h124c6.6 0 12-5.4 12-12\"})))};const A=({id:e,className:n,style:r,container:a,children:c,labels:o={}})=>{const{isFullScreen:s,toggle:l}=k(null==a?void 0:a.current),i={className:`react-sigma-control ${n||\"\"}`,id:e,style:r};return document.fullscreenEnabled?t.createElement(\"div\",Object.assign({},i),t.createElement(\"button\",{onClick:l,title:s?o.exit||\"Exit fullscreen\":o.enter||\"Enter fullscreen\"},c&&!s&&c[0],c&&s&&c[1],!c&&!s&&t.createElement(U,{style:{width:\"1em\"}}),!c&&s&&t.createElement(L,{style:{width:\"1em\"}}))):null};export{H as ControlsContainer,A as FullScreenControl,S as SigmaContainer,d as SigmaContext,f as SigmaProvider,D as ZoomControl,x as debounce,j as isEqual,N as useCamera,k as useFullScreen,C as useLoadGraph,y as useRegisterEvents,p as useSetSettings,v as useSigma,h as useSigmaContext};\n//# sourceMappingURL=react-sigma_core.esm.min.js.map\n","import { f as NodeProgram, D as DEFAULT_EDGE_ARROW_HEAD_PROGRAM_OPTIONS, _ as _objectSpread2, F as FRAGMENT_SHADER_SOURCE$3, g as EdgeProgram, h as createEdgeCompoundProgram, i as createEdgeArrowHeadProgram } from '../../dist/index-236c62ad.esm.js';\nexport { k as AbstractEdgeProgram, A as AbstractNodeProgram, l as AbstractProgram, D as DEFAULT_EDGE_ARROW_HEAD_PROGRAM_OPTIONS, p as DEFAULT_EDGE_CLAMPED_PROGRAM_OPTIONS, m as EdgeArrowHeadProgram, E as EdgeArrowProgram, n as EdgeClampedProgram, g as EdgeProgram, e as EdgeRectangleProgram, N as NodeCircleProgram, f as NodeProgram, P as Program, i as createEdgeArrowHeadProgram, q as createEdgeArrowProgram, o as createEdgeClampedProgram, h as createEdgeCompoundProgram, j as createNodeCompoundProgram, c as drawDiscNodeHover, b as drawDiscNodeLabel, d as drawStraightEdgeLabel, r as getAttributeItemsCount, s as getAttributesItemsCount, w as killProgram, u as loadFragmentShader, v as loadProgram, t as loadVertexShader, x as numberToGLSLFloat } from '../../dist/index-236c62ad.esm.js';\nimport { _ as _inherits, a as _createClass, b as _classCallCheck, c as _callSuper } from '../../dist/inherits-d1a1e29b.esm.js';\nimport { f as floatColor } from '../../dist/colors-beb06eb2.esm.js';\n\n// language=GLSL\nvar SHADER_SOURCE$6 = /*glsl*/\"\\nprecision mediump float;\\n\\nvarying vec4 v_color;\\nvarying float v_border;\\n\\nconst float radius = 0.5;\\nconst vec4 transparent = vec4(0.0, 0.0, 0.0, 0.0);\\n\\nvoid main(void) {\\n vec2 m = gl_PointCoord - vec2(0.5, 0.5);\\n float dist = radius - length(m);\\n\\n // No antialiasing for picking mode:\\n #ifdef PICKING_MODE\\n if (dist > v_border)\\n gl_FragColor = v_color;\\n else\\n gl_FragColor = transparent;\\n\\n #else\\n float t = 0.0;\\n if (dist > v_border)\\n t = 1.0;\\n else if (dist > 0.0)\\n t = dist / v_border;\\n\\n gl_FragColor = mix(transparent, v_color, t);\\n #endif\\n}\\n\";\nvar FRAGMENT_SHADER_SOURCE$2 = SHADER_SOURCE$6;\n\n// language=GLSL\nvar SHADER_SOURCE$5 = /*glsl*/\"\\nattribute vec4 a_id;\\nattribute vec4 a_color;\\nattribute vec2 a_position;\\nattribute float a_size;\\n\\nuniform float u_sizeRatio;\\nuniform float u_pixelRatio;\\nuniform mat3 u_matrix;\\n\\nvarying vec4 v_color;\\nvarying float v_border;\\n\\nconst float bias = 255.0 / 254.0;\\n\\nvoid main() {\\n gl_Position = vec4(\\n (u_matrix * vec3(a_position, 1)).xy,\\n 0,\\n 1\\n );\\n\\n // Multiply the point size twice:\\n // - x SCALING_RATIO to correct the canvas scaling\\n // - x 2 to correct the formulae\\n gl_PointSize = a_size / u_sizeRatio * u_pixelRatio * 2.0;\\n\\n v_border = (0.5 / a_size) * u_sizeRatio;\\n\\n #ifdef PICKING_MODE\\n // For picking mode, we use the ID as the color:\\n v_color = a_id;\\n #else\\n // For normal mode, we use the color:\\n v_color = a_color;\\n #endif\\n\\n v_color.a *= bias;\\n}\\n\";\nvar VERTEX_SHADER_SOURCE$3 = SHADER_SOURCE$5;\n\nvar _WebGLRenderingContex$3 = WebGLRenderingContext,\n UNSIGNED_BYTE$3 = _WebGLRenderingContex$3.UNSIGNED_BYTE,\n FLOAT$3 = _WebGLRenderingContex$3.FLOAT;\nvar UNIFORMS$3 = [\"u_sizeRatio\", \"u_pixelRatio\", \"u_matrix\"];\nvar NodePointProgram = /*#__PURE__*/function (_NodeProgram) {\n function NodePointProgram() {\n _classCallCheck(this, NodePointProgram);\n return _callSuper(this, NodePointProgram, arguments);\n }\n _inherits(NodePointProgram, _NodeProgram);\n return _createClass(NodePointProgram, [{\n key: \"getDefinition\",\n value: function getDefinition() {\n return {\n VERTICES: 1,\n VERTEX_SHADER_SOURCE: VERTEX_SHADER_SOURCE$3,\n FRAGMENT_SHADER_SOURCE: FRAGMENT_SHADER_SOURCE$2,\n METHOD: WebGLRenderingContext.POINTS,\n UNIFORMS: UNIFORMS$3,\n ATTRIBUTES: [{\n name: \"a_position\",\n size: 2,\n type: FLOAT$3\n }, {\n name: \"a_size\",\n size: 1,\n type: FLOAT$3\n }, {\n name: \"a_color\",\n size: 4,\n type: UNSIGNED_BYTE$3,\n normalized: true\n }, {\n name: \"a_id\",\n size: 4,\n type: UNSIGNED_BYTE$3,\n normalized: true\n }]\n };\n }\n }, {\n key: \"processVisibleItem\",\n value: function processVisibleItem(nodeIndex, startIndex, data) {\n var array = this.array;\n array[startIndex++] = data.x;\n array[startIndex++] = data.y;\n array[startIndex++] = data.size;\n array[startIndex++] = floatColor(data.color);\n array[startIndex++] = nodeIndex;\n }\n }, {\n key: \"setUniforms\",\n value: function setUniforms(_ref, _ref2) {\n var sizeRatio = _ref.sizeRatio,\n pixelRatio = _ref.pixelRatio,\n matrix = _ref.matrix;\n var gl = _ref2.gl,\n uniformLocations = _ref2.uniformLocations;\n var u_sizeRatio = uniformLocations.u_sizeRatio,\n u_pixelRatio = uniformLocations.u_pixelRatio,\n u_matrix = uniformLocations.u_matrix;\n gl.uniform1f(u_pixelRatio, pixelRatio);\n gl.uniform1f(u_sizeRatio, sizeRatio);\n gl.uniformMatrix3fv(u_matrix, false, matrix);\n }\n }]);\n}(NodeProgram);\n\n// language=GLSL\nvar SHADER_SOURCE$4 = /*glsl*/\"\\nattribute vec4 a_id;\\nattribute vec4 a_color;\\nattribute vec2 a_normal;\\nattribute float a_normalCoef;\\nattribute vec2 a_positionStart;\\nattribute vec2 a_positionEnd;\\nattribute float a_positionCoef;\\nattribute float a_sourceRadius;\\nattribute float a_targetRadius;\\nattribute float a_sourceRadiusCoef;\\nattribute float a_targetRadiusCoef;\\n\\nuniform mat3 u_matrix;\\nuniform float u_zoomRatio;\\nuniform float u_sizeRatio;\\nuniform float u_pixelRatio;\\nuniform float u_correctionRatio;\\nuniform float u_minEdgeThickness;\\nuniform float u_lengthToThicknessRatio;\\nuniform float u_feather;\\n\\nvarying vec4 v_color;\\nvarying vec2 v_normal;\\nvarying float v_thickness;\\nvarying float v_feather;\\n\\nconst float bias = 255.0 / 254.0;\\n\\nvoid main() {\\n float minThickness = u_minEdgeThickness;\\n\\n vec2 normal = a_normal * a_normalCoef;\\n vec2 position = a_positionStart * (1.0 - a_positionCoef) + a_positionEnd * a_positionCoef;\\n\\n float normalLength = length(normal);\\n vec2 unitNormal = normal / normalLength;\\n\\n // These first computations are taken from edge.vert.glsl. Please read it to\\n // get better comments on what's happening:\\n float pixelsThickness = max(normalLength, minThickness * u_sizeRatio);\\n float webGLThickness = pixelsThickness * u_correctionRatio / u_sizeRatio;\\n\\n // Here, we move the point to leave space for the arrow heads:\\n // Source arrow head\\n float sourceRadius = a_sourceRadius * a_sourceRadiusCoef;\\n float sourceDirection = sign(sourceRadius);\\n float webGLSourceRadius = sourceDirection * sourceRadius * 2.0 * u_correctionRatio / u_sizeRatio;\\n float webGLSourceArrowHeadLength = webGLThickness * u_lengthToThicknessRatio * 2.0;\\n vec2 sourceCompensationVector =\\n vec2(-sourceDirection * unitNormal.y, sourceDirection * unitNormal.x)\\n * (webGLSourceRadius + webGLSourceArrowHeadLength);\\n \\n // Target arrow head\\n float targetRadius = a_targetRadius * a_targetRadiusCoef;\\n float targetDirection = sign(targetRadius);\\n float webGLTargetRadius = targetDirection * targetRadius * 2.0 * u_correctionRatio / u_sizeRatio;\\n float webGLTargetArrowHeadLength = webGLThickness * u_lengthToThicknessRatio * 2.0;\\n vec2 targetCompensationVector =\\n vec2(-targetDirection * unitNormal.y, targetDirection * unitNormal.x)\\n * (webGLTargetRadius + webGLTargetArrowHeadLength);\\n\\n // Here is the proper position of the vertex\\n gl_Position = vec4((u_matrix * vec3(position + unitNormal * webGLThickness + sourceCompensationVector + targetCompensationVector, 1)).xy, 0, 1);\\n\\n v_thickness = webGLThickness / u_zoomRatio;\\n\\n v_normal = unitNormal;\\n\\n v_feather = u_feather * u_correctionRatio / u_zoomRatio / u_pixelRatio * 2.0;\\n\\n #ifdef PICKING_MODE\\n // For picking mode, we use the ID as the color:\\n v_color = a_id;\\n #else\\n // For normal mode, we use the color:\\n v_color = a_color;\\n #endif\\n\\n v_color.a *= bias;\\n}\\n\";\nvar VERTEX_SHADER_SOURCE$2 = SHADER_SOURCE$4;\n\nvar _WebGLRenderingContex$2 = WebGLRenderingContext,\n UNSIGNED_BYTE$2 = _WebGLRenderingContex$2.UNSIGNED_BYTE,\n FLOAT$2 = _WebGLRenderingContex$2.FLOAT;\nvar UNIFORMS$2 = [\"u_matrix\", \"u_zoomRatio\", \"u_sizeRatio\", \"u_correctionRatio\", \"u_pixelRatio\", \"u_feather\", \"u_minEdgeThickness\", \"u_lengthToThicknessRatio\"];\nvar DEFAULT_EDGE_DOUBLE_CLAMPED_PROGRAM_OPTIONS = {\n lengthToThicknessRatio: DEFAULT_EDGE_ARROW_HEAD_PROGRAM_OPTIONS.lengthToThicknessRatio\n};\nfunction createEdgeDoubleClampedProgram(inputOptions) {\n var options = _objectSpread2(_objectSpread2({}, DEFAULT_EDGE_DOUBLE_CLAMPED_PROGRAM_OPTIONS), inputOptions || {});\n return /*#__PURE__*/function (_EdgeProgram) {\n function EdgeDoubleClampedProgram() {\n _classCallCheck(this, EdgeDoubleClampedProgram);\n return _callSuper(this, EdgeDoubleClampedProgram, arguments);\n }\n _inherits(EdgeDoubleClampedProgram, _EdgeProgram);\n return _createClass(EdgeDoubleClampedProgram, [{\n key: \"getDefinition\",\n value: function getDefinition() {\n return {\n VERTICES: 6,\n VERTEX_SHADER_SOURCE: VERTEX_SHADER_SOURCE$2,\n FRAGMENT_SHADER_SOURCE: FRAGMENT_SHADER_SOURCE$3,\n METHOD: WebGLRenderingContext.TRIANGLES,\n UNIFORMS: UNIFORMS$2,\n ATTRIBUTES: [{\n name: \"a_positionStart\",\n size: 2,\n type: FLOAT$2\n }, {\n name: \"a_positionEnd\",\n size: 2,\n type: FLOAT$2\n }, {\n name: \"a_normal\",\n size: 2,\n type: FLOAT$2\n }, {\n name: \"a_color\",\n size: 4,\n type: UNSIGNED_BYTE$2,\n normalized: true\n }, {\n name: \"a_id\",\n size: 4,\n type: UNSIGNED_BYTE$2,\n normalized: true\n }, {\n name: \"a_sourceRadius\",\n size: 1,\n type: FLOAT$2\n }, {\n name: \"a_targetRadius\",\n size: 1,\n type: FLOAT$2\n }],\n CONSTANT_ATTRIBUTES: [\n // If 0, then position will be a_positionStart\n // If 1, then position will be a_positionEnd\n {\n name: \"a_positionCoef\",\n size: 1,\n type: FLOAT$2\n }, {\n name: \"a_normalCoef\",\n size: 1,\n type: FLOAT$2\n }, {\n name: \"a_sourceRadiusCoef\",\n size: 1,\n type: FLOAT$2\n }, {\n name: \"a_targetRadiusCoef\",\n size: 1,\n type: FLOAT$2\n }],\n CONSTANT_DATA: [[0, 1, -1, 0], [0, -1, 1, 0], [1, 1, 0, 1], [1, 1, 0, 1], [0, -1, 1, 0], [1, -1, 0, -1]]\n };\n }\n }, {\n key: \"processVisibleItem\",\n value: function processVisibleItem(edgeIndex, startIndex, sourceData, targetData, data) {\n var thickness = data.size || 1;\n var x1 = sourceData.x;\n var y1 = sourceData.y;\n var x2 = targetData.x;\n var y2 = targetData.y;\n var color = floatColor(data.color);\n\n // Computing normals\n var dx = x2 - x1;\n var dy = y2 - y1;\n var sourceRadius = sourceData.size || 1;\n var targetRadius = targetData.size || 1;\n var len = dx * dx + dy * dy;\n var n1 = 0;\n var n2 = 0;\n if (len) {\n len = 1 / Math.sqrt(len);\n n1 = -dy * len * thickness;\n n2 = dx * len * thickness;\n }\n var array = this.array;\n array[startIndex++] = x1;\n array[startIndex++] = y1;\n array[startIndex++] = x2;\n array[startIndex++] = y2;\n array[startIndex++] = n1;\n array[startIndex++] = n2;\n array[startIndex++] = color;\n array[startIndex++] = edgeIndex;\n array[startIndex++] = sourceRadius;\n array[startIndex++] = targetRadius;\n }\n }, {\n key: \"setUniforms\",\n value: function setUniforms(params, _ref) {\n var gl = _ref.gl,\n uniformLocations = _ref.uniformLocations;\n var u_matrix = uniformLocations.u_matrix,\n u_zoomRatio = uniformLocations.u_zoomRatio,\n u_feather = uniformLocations.u_feather,\n u_pixelRatio = uniformLocations.u_pixelRatio,\n u_correctionRatio = uniformLocations.u_correctionRatio,\n u_sizeRatio = uniformLocations.u_sizeRatio,\n u_minEdgeThickness = uniformLocations.u_minEdgeThickness,\n u_lengthToThicknessRatio = uniformLocations.u_lengthToThicknessRatio;\n gl.uniformMatrix3fv(u_matrix, false, params.matrix);\n gl.uniform1f(u_zoomRatio, params.zoomRatio);\n gl.uniform1f(u_sizeRatio, params.sizeRatio);\n gl.uniform1f(u_correctionRatio, params.correctionRatio);\n gl.uniform1f(u_pixelRatio, params.pixelRatio);\n gl.uniform1f(u_feather, params.antiAliasingFeather);\n gl.uniform1f(u_minEdgeThickness, params.minEdgeThickness);\n gl.uniform1f(u_lengthToThicknessRatio, options.lengthToThicknessRatio);\n }\n }]);\n }(EdgeProgram);\n}\nvar EdgeDoubleClampedProgram = createEdgeDoubleClampedProgram();\nvar EdgeDoubleClampedProgram$1 = EdgeDoubleClampedProgram;\n\nfunction createEdgeDoubleArrowProgram(inputOptions) {\n return createEdgeCompoundProgram([createEdgeDoubleClampedProgram(inputOptions), createEdgeArrowHeadProgram(inputOptions), createEdgeArrowHeadProgram(_objectSpread2(_objectSpread2({}, inputOptions), {}, {\n extremity: \"source\"\n }))]);\n}\nvar EdgeDoubleArrowProgram = createEdgeDoubleArrowProgram();\nvar EdgeDoubleArrowProgram$1 = EdgeDoubleArrowProgram;\n\n// language=GLSL\nvar SHADER_SOURCE$3 = /*glsl*/\"\\nprecision mediump float;\\n\\nvarying vec4 v_color;\\n\\nvoid main(void) {\\n gl_FragColor = v_color;\\n}\\n\";\nvar FRAGMENT_SHADER_SOURCE$1 = SHADER_SOURCE$3;\n\n// language=GLSL\nvar SHADER_SOURCE$2 = /*glsl*/\"\\nattribute vec4 a_id;\\nattribute vec4 a_color;\\nattribute vec2 a_position;\\n\\nuniform mat3 u_matrix;\\n\\nvarying vec4 v_color;\\n\\nconst float bias = 255.0 / 254.0;\\n\\nvoid main() {\\n // Scale from [[-1 1] [-1 1]] to the container:\\n gl_Position = vec4(\\n (u_matrix * vec3(a_position, 1)).xy,\\n 0,\\n 1\\n );\\n\\n #ifdef PICKING_MODE\\n // For picking mode, we use the ID as the color:\\n v_color = a_id;\\n #else\\n // For normal mode, we use the color:\\n v_color = a_color;\\n #endif\\n\\n v_color.a *= bias;\\n}\\n\";\nvar VERTEX_SHADER_SOURCE$1 = SHADER_SOURCE$2;\n\nvar _WebGLRenderingContex$1 = WebGLRenderingContext,\n UNSIGNED_BYTE$1 = _WebGLRenderingContex$1.UNSIGNED_BYTE,\n FLOAT$1 = _WebGLRenderingContex$1.FLOAT;\nvar UNIFORMS$1 = [\"u_matrix\"];\nvar EdgeLineProgram = /*#__PURE__*/function (_EdgeProgram) {\n function EdgeLineProgram() {\n _classCallCheck(this, EdgeLineProgram);\n return _callSuper(this, EdgeLineProgram, arguments);\n }\n _inherits(EdgeLineProgram, _EdgeProgram);\n return _createClass(EdgeLineProgram, [{\n key: \"getDefinition\",\n value: function getDefinition() {\n return {\n VERTICES: 2,\n VERTEX_SHADER_SOURCE: VERTEX_SHADER_SOURCE$1,\n FRAGMENT_SHADER_SOURCE: FRAGMENT_SHADER_SOURCE$1,\n METHOD: WebGLRenderingContext.LINES,\n UNIFORMS: UNIFORMS$1,\n ATTRIBUTES: [{\n name: \"a_position\",\n size: 2,\n type: FLOAT$1\n }, {\n name: \"a_color\",\n size: 4,\n type: UNSIGNED_BYTE$1,\n normalized: true\n }, {\n name: \"a_id\",\n size: 4,\n type: UNSIGNED_BYTE$1,\n normalized: true\n }]\n };\n }\n }, {\n key: \"processVisibleItem\",\n value: function processVisibleItem(edgeIndex, startIndex, sourceData, targetData, data) {\n var array = this.array;\n var x1 = sourceData.x;\n var y1 = sourceData.y;\n var x2 = targetData.x;\n var y2 = targetData.y;\n var color = floatColor(data.color);\n\n // First point\n array[startIndex++] = x1;\n array[startIndex++] = y1;\n array[startIndex++] = color;\n array[startIndex++] = edgeIndex;\n\n // Second point\n array[startIndex++] = x2;\n array[startIndex++] = y2;\n array[startIndex++] = color;\n array[startIndex++] = edgeIndex;\n }\n }, {\n key: \"setUniforms\",\n value: function setUniforms(params, _ref) {\n var gl = _ref.gl,\n uniformLocations = _ref.uniformLocations;\n var u_matrix = uniformLocations.u_matrix;\n gl.uniformMatrix3fv(u_matrix, false, params.matrix);\n }\n }]);\n}(EdgeProgram);\n\n// language=GLSL\nvar SHADER_SOURCE$1 = /*glsl*/\"\\nprecision mediump float;\\n\\nvarying vec4 v_color;\\n\\nvoid main(void) {\\n gl_FragColor = v_color;\\n}\\n\";\nvar FRAGMENT_SHADER_SOURCE = SHADER_SOURCE$1;\n\n// language=GLSL\nvar SHADER_SOURCE = /*glsl*/\"\\nattribute vec4 a_id;\\nattribute vec4 a_color;\\nattribute vec2 a_normal;\\nattribute float a_normalCoef;\\nattribute vec2 a_positionStart;\\nattribute vec2 a_positionEnd;\\nattribute float a_positionCoef;\\n\\nuniform mat3 u_matrix;\\nuniform float u_sizeRatio;\\nuniform float u_correctionRatio;\\n\\nvarying vec4 v_color;\\n\\nconst float minThickness = 1.7;\\nconst float bias = 255.0 / 254.0;\\n\\nvoid main() {\\n vec2 normal = a_normal * a_normalCoef;\\n vec2 position = a_positionStart * (1.0 - a_positionCoef) + a_positionEnd * a_positionCoef;\\n\\n // The only different here with edge.vert.glsl is that we need to handle null\\n // input normal vector. Apart from that, you can read edge.vert.glsl more info\\n // on how it works:\\n float normalLength = length(normal);\\n vec2 unitNormal = normal / normalLength;\\n if (normalLength <= 0.0) unitNormal = normal;\\n float pixelsThickness = max(normalLength, minThickness * u_sizeRatio);\\n float webGLThickness = pixelsThickness * u_correctionRatio / u_sizeRatio;\\n\\n gl_Position = vec4((u_matrix * vec3(position + unitNormal * webGLThickness, 1)).xy, 0, 1);\\n\\n #ifdef PICKING_MODE\\n // For picking mode, we use the ID as the color:\\n v_color = a_id;\\n #else\\n // For normal mode, we use the color:\\n v_color = a_color;\\n #endif\\n\\n v_color.a *= bias;\\n}\\n\";\nvar VERTEX_SHADER_SOURCE = SHADER_SOURCE;\n\nvar _WebGLRenderingContex = WebGLRenderingContext,\n UNSIGNED_BYTE = _WebGLRenderingContex.UNSIGNED_BYTE,\n FLOAT = _WebGLRenderingContex.FLOAT;\nvar UNIFORMS = [\"u_matrix\", \"u_sizeRatio\", \"u_correctionRatio\", \"u_minEdgeThickness\"];\nvar EdgeTriangleProgram = /*#__PURE__*/function (_EdgeProgram) {\n function EdgeTriangleProgram() {\n _classCallCheck(this, EdgeTriangleProgram);\n return _callSuper(this, EdgeTriangleProgram, arguments);\n }\n _inherits(EdgeTriangleProgram, _EdgeProgram);\n return _createClass(EdgeTriangleProgram, [{\n key: \"getDefinition\",\n value: function getDefinition() {\n return {\n VERTICES: 3,\n VERTEX_SHADER_SOURCE: VERTEX_SHADER_SOURCE,\n FRAGMENT_SHADER_SOURCE: FRAGMENT_SHADER_SOURCE,\n METHOD: WebGLRenderingContext.TRIANGLES,\n UNIFORMS: UNIFORMS,\n ATTRIBUTES: [{\n name: \"a_positionStart\",\n size: 2,\n type: FLOAT\n }, {\n name: \"a_positionEnd\",\n size: 2,\n type: FLOAT\n }, {\n name: \"a_normal\",\n size: 2,\n type: FLOAT\n }, {\n name: \"a_color\",\n size: 4,\n type: UNSIGNED_BYTE,\n normalized: true\n }, {\n name: \"a_id\",\n size: 4,\n type: UNSIGNED_BYTE,\n normalized: true\n }],\n CONSTANT_ATTRIBUTES: [\n // If 0, then position will be a_positionStart\n // If 1, then position will be a_positionEnd\n {\n name: \"a_positionCoef\",\n size: 1,\n type: FLOAT\n }, {\n name: \"a_normalCoef\",\n size: 1,\n type: FLOAT\n }],\n CONSTANT_DATA: [[0, 1], [0, -1], [1, 0]]\n };\n }\n }, {\n key: \"processVisibleItem\",\n value: function processVisibleItem(edgeIndex, startIndex, sourceData, targetData, data) {\n var thickness = data.size || 1;\n var x1 = sourceData.x;\n var y1 = sourceData.y;\n var x2 = targetData.x;\n var y2 = targetData.y;\n var color = floatColor(data.color);\n\n // Computing normals\n var dx = x2 - x1;\n var dy = y2 - y1;\n var len = dx * dx + dy * dy;\n var n1 = 0;\n var n2 = 0;\n if (len) {\n len = 1 / Math.sqrt(len);\n n1 = -dy * len * thickness;\n n2 = dx * len * thickness;\n }\n var array = this.array;\n\n // First point\n array[startIndex++] = x1;\n array[startIndex++] = y1;\n array[startIndex++] = x2;\n array[startIndex++] = y2;\n array[startIndex++] = n1;\n array[startIndex++] = n2;\n array[startIndex++] = color;\n array[startIndex++] = edgeIndex;\n }\n }, {\n key: \"setUniforms\",\n value: function setUniforms(params, _ref) {\n var gl = _ref.gl,\n uniformLocations = _ref.uniformLocations;\n var u_matrix = uniformLocations.u_matrix,\n u_sizeRatio = uniformLocations.u_sizeRatio,\n u_correctionRatio = uniformLocations.u_correctionRatio,\n u_minEdgeThickness = uniformLocations.u_minEdgeThickness;\n gl.uniformMatrix3fv(u_matrix, false, params.matrix);\n gl.uniform1f(u_sizeRatio, params.sizeRatio);\n gl.uniform1f(u_correctionRatio, params.correctionRatio);\n gl.uniform1f(u_minEdgeThickness, params.minEdgeThickness);\n }\n }]);\n}(EdgeProgram);\n\nexport { DEFAULT_EDGE_DOUBLE_CLAMPED_PROGRAM_OPTIONS, EdgeDoubleArrowProgram$1 as EdgeDoubleArrowProgram, EdgeDoubleClampedProgram$1 as EdgeDoubleClampedProgram, EdgeLineProgram, EdgeTriangleProgram, NodePointProgram, createEdgeDoubleArrowProgram, createEdgeDoubleClampedProgram };\n","import { EdgeProgram, DEFAULT_EDGE_ARROW_HEAD_PROGRAM_OPTIONS } from 'sigma/rendering';\nimport { floatColor } from 'sigma/utils';\n\nfunction _toPrimitive(t, r) {\n if (\"object\" != typeof t || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != typeof i) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\n\nfunction _toPropertyKey(t) {\n var i = _toPrimitive(t, \"string\");\n return \"symbol\" == typeof i ? i : i + \"\";\n}\n\nfunction _defineProperty(e, r, t) {\n return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\n\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n _defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\n\nfunction _classCallCheck(a, n) {\n if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\");\n}\n\nfunction _defineProperties(e, r) {\n for (var t = 0; t < r.length; t++) {\n var o = r[t];\n o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o);\n }\n}\nfunction _createClass(e, r, t) {\n return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", {\n writable: !1\n }), e;\n}\n\nfunction _getPrototypeOf(t) {\n return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {\n return t.__proto__ || Object.getPrototypeOf(t);\n }, _getPrototypeOf(t);\n}\n\nfunction _isNativeReflectConstruct() {\n try {\n var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n } catch (t) {}\n return (_isNativeReflectConstruct = function () {\n return !!t;\n })();\n}\n\nfunction _assertThisInitialized(e) {\n if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n return e;\n}\n\nfunction _possibleConstructorReturn(t, e) {\n if (e && (\"object\" == typeof e || \"function\" == typeof e)) return e;\n if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\");\n return _assertThisInitialized(t);\n}\n\nfunction _callSuper(t, o, e) {\n return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e));\n}\n\nfunction _setPrototypeOf(t, e) {\n return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n return t.__proto__ = e, t;\n }, _setPrototypeOf(t, e);\n}\n\nfunction _inherits(t, e) {\n if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\");\n t.prototype = Object.create(e && e.prototype, {\n constructor: {\n value: t,\n writable: !0,\n configurable: !0\n }\n }), Object.defineProperty(t, \"prototype\", {\n writable: !1\n }), e && _setPrototypeOf(t, e);\n}\n\nfunction _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\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 _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n }\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 getCurvePoint(t, p0, p1, p2) {\n var x = Math.pow(1 - t, 2) * p0.x + 2 * (1 - t) * t * p1.x + Math.pow(t, 2) * p2.x;\n var y = Math.pow(1 - t, 2) * p0.y + 2 * (1 - t) * t * p1.y + Math.pow(t, 2) * p2.y;\n return {\n x: x,\n y: y\n };\n}\nfunction getCurveLength(p0, p1, p2) {\n var steps = 20;\n var length = 0;\n var lastPoint = p0;\n for (var i = 0; i < steps; i++) {\n var point = getCurvePoint((i + 1) / steps, p0, p1, p2);\n length += Math.sqrt(Math.pow(lastPoint.x - point.x, 2) + Math.pow(lastPoint.y - point.y, 2));\n lastPoint = point;\n }\n return length;\n}\nfunction createDrawCurvedEdgeLabel(_ref) {\n var curvatureAttribute = _ref.curvatureAttribute,\n defaultCurvature = _ref.defaultCurvature,\n _ref$keepLabelUpright = _ref.keepLabelUpright,\n keepLabelUpright = _ref$keepLabelUpright === void 0 ? true : _ref$keepLabelUpright;\n return function (context, edgeData, sourceData, targetData, settings) {\n var size = settings.edgeLabelSize,\n curvature = edgeData[curvatureAttribute] || defaultCurvature,\n font = settings.edgeLabelFont,\n weight = settings.edgeLabelWeight,\n color = settings.edgeLabelColor.attribute ? edgeData[settings.edgeLabelColor.attribute] || settings.edgeLabelColor.color || \"#000\" : settings.edgeLabelColor.color;\n var label = edgeData.label;\n if (!label) return;\n context.fillStyle = color;\n context.font = \"\".concat(weight, \" \").concat(size, \"px \").concat(font);\n\n // Computing positions without considering nodes sizes:\n var ltr = !keepLabelUpright || sourceData.x < targetData.x;\n var sourceX = ltr ? sourceData.x : targetData.x;\n var sourceY = ltr ? sourceData.y : targetData.y;\n var targetX = ltr ? targetData.x : sourceData.x;\n var targetY = ltr ? targetData.y : sourceData.y;\n var centerX = (sourceX + targetX) / 2;\n var centerY = (sourceY + targetY) / 2;\n var diffX = targetX - sourceX;\n var diffY = targetY - sourceY;\n var diff = Math.sqrt(Math.pow(diffX, 2) + Math.pow(diffY, 2));\n // Anchor point:\n var orientation = ltr ? 1 : -1;\n var anchorX = centerX + diffY * curvature * orientation;\n var anchorY = centerY - diffX * curvature * orientation;\n\n // Adapt curve points to edge thickness:\n var offset = edgeData.size * 0.7 + 5;\n var sourceOffsetVector = {\n x: anchorY - sourceY,\n y: -(anchorX - sourceX)\n };\n var sourceOffsetVectorLength = Math.sqrt(Math.pow(sourceOffsetVector.x, 2) + Math.pow(sourceOffsetVector.y, 2));\n var targetOffsetVector = {\n x: targetY - anchorY,\n y: -(targetX - anchorX)\n };\n var targetOffsetVectorLength = Math.sqrt(Math.pow(targetOffsetVector.x, 2) + Math.pow(targetOffsetVector.y, 2));\n sourceX += offset * sourceOffsetVector.x / sourceOffsetVectorLength;\n sourceY += offset * sourceOffsetVector.y / sourceOffsetVectorLength;\n targetX += offset * targetOffsetVector.x / targetOffsetVectorLength;\n targetY += offset * targetOffsetVector.y / targetOffsetVectorLength;\n // For anchor, the vector is simpler, so it is inlined:\n anchorX += offset * diffY / diff;\n anchorY -= offset * diffX / diff;\n\n // Compute curve length:\n var anchorPoint = {\n x: anchorX,\n y: anchorY\n };\n var sourcePoint = {\n x: sourceX,\n y: sourceY\n };\n var targetPoint = {\n x: targetX,\n y: targetY\n };\n var curveLength = getCurveLength(sourcePoint, anchorPoint, targetPoint);\n if (curveLength < sourceData.size + targetData.size) return;\n\n // Handling ellipsis\n var textLength = context.measureText(label).width;\n var availableTextLength = curveLength - sourceData.size - targetData.size;\n if (textLength > availableTextLength) {\n var ellipsis = \"…\";\n label = label + ellipsis;\n textLength = context.measureText(label).width;\n while (textLength > availableTextLength && label.length > 1) {\n label = label.slice(0, -2) + ellipsis;\n textLength = context.measureText(label).width;\n }\n if (label.length < 4) return;\n }\n\n // Measure each character:\n var charactersLengthCache = {};\n for (var i = 0, length = label.length; i < length; i++) {\n var character = label[i];\n if (!charactersLengthCache[character]) {\n charactersLengthCache[character] = context.measureText(character).width * (1 + curvature * 0.35);\n }\n }\n\n // Draw each character:\n var t = 0.5 - textLength / curveLength / 2;\n for (var _i = 0, _length = label.length; _i < _length; _i++) {\n var _character = label[_i];\n var point = getCurvePoint(t, sourcePoint, anchorPoint, targetPoint);\n var tangentX = 2 * (1 - t) * (anchorX - sourceX) + 2 * t * (targetX - anchorX);\n var tangentY = 2 * (1 - t) * (anchorY - sourceY) + 2 * t * (targetY - anchorY);\n var angle = Math.atan2(tangentY, tangentX);\n context.save();\n context.translate(point.x, point.y);\n context.rotate(angle);\n\n // Dessiner le caractère\n context.fillText(_character, 0, 0);\n context.restore();\n t += charactersLengthCache[_character] / curveLength;\n }\n };\n}\n\nfunction getFragmentShader(_ref) {\n var arrowHead = _ref.arrowHead;\n var hasTargetArrowHead = (arrowHead === null || arrowHead === void 0 ? void 0 : arrowHead.extremity) === \"target\" || (arrowHead === null || arrowHead === void 0 ? void 0 : arrowHead.extremity) === \"both\";\n var hasSourceArrowHead = (arrowHead === null || arrowHead === void 0 ? void 0 : arrowHead.extremity) === \"source\" || (arrowHead === null || arrowHead === void 0 ? void 0 : arrowHead.extremity) === \"both\";\n\n // language=GLSL\n var SHADER = /*glsl*/\"\\nprecision highp float;\\n\\nvarying vec4 v_color;\\nvarying float v_thickness;\\nvarying float v_feather;\\nvarying vec2 v_cpA;\\nvarying vec2 v_cpB;\\nvarying vec2 v_cpC;\\n\".concat(hasTargetArrowHead ? \"\\nvarying float v_targetSize;\\nvarying vec2 v_targetPoint;\" : \"\", \"\\n\").concat(hasSourceArrowHead ? \"\\nvarying float v_sourceSize;\\nvarying vec2 v_sourcePoint;\" : \"\", \"\\n\").concat(arrowHead ? \"\\nuniform float u_lengthToThicknessRatio;\\nuniform float u_widenessToThicknessRatio;\" : \"\", \"\\n\\nfloat det(vec2 a, vec2 b) {\\n return a.x * b.y - b.x * a.y;\\n}\\n\\nvec2 getDistanceVector(vec2 b0, vec2 b1, vec2 b2) {\\n float a = det(b0, b2), b = 2.0 * det(b1, b0), d = 2.0 * det(b2, b1);\\n float f = b * d - a * a;\\n vec2 d21 = b2 - b1, d10 = b1 - b0, d20 = b2 - b0;\\n vec2 gf = 2.0 * (b * d21 + d * d10 + a * d20);\\n gf = vec2(gf.y, -gf.x);\\n vec2 pp = -f * gf / dot(gf, gf);\\n vec2 d0p = b0 - pp;\\n float ap = det(d0p, d20), bp = 2.0 * det(d10, d0p);\\n float t = clamp((ap + bp) / (2.0 * a + b + d), 0.0, 1.0);\\n return mix(mix(b0, b1, t), mix(b1, b2, t), t);\\n}\\n\\nfloat distToQuadraticBezierCurve(vec2 p, vec2 b0, vec2 b1, vec2 b2) {\\n return length(getDistanceVector(b0 - p, b1 - p, b2 - p));\\n}\\n\\nconst vec4 transparent = vec4(0.0, 0.0, 0.0, 0.0);\\n\\nvoid main(void) {\\n float dist = distToQuadraticBezierCurve(gl_FragCoord.xy, v_cpA, v_cpB, v_cpC);\\n float thickness = v_thickness;\\n\").concat(hasTargetArrowHead ? \"\\n float distToTarget = length(gl_FragCoord.xy - v_targetPoint);\\n float targetArrowLength = v_targetSize + thickness * u_lengthToThicknessRatio;\\n if (distToTarget < targetArrowLength) {\\n thickness = (distToTarget - v_targetSize) / (targetArrowLength - v_targetSize) * u_widenessToThicknessRatio * thickness;\\n }\" : \"\", \"\\n\").concat(hasSourceArrowHead ? \"\\n float distToSource = length(gl_FragCoord.xy - v_sourcePoint);\\n float sourceArrowLength = v_sourceSize + thickness * u_lengthToThicknessRatio;\\n if (distToSource < sourceArrowLength) {\\n thickness = (distToSource - v_sourceSize) / (sourceArrowLength - v_sourceSize) * u_widenessToThicknessRatio * thickness;\\n }\" : \"\", \"\\n\\n float halfThickness = thickness / 2.0;\\n if (dist < halfThickness) {\\n #ifdef PICKING_MODE\\n gl_FragColor = v_color;\\n #else\\n float t = smoothstep(\\n halfThickness - v_feather,\\n halfThickness,\\n dist\\n );\\n\\n gl_FragColor = mix(v_color, transparent, t);\\n #endif\\n } else {\\n gl_FragColor = transparent;\\n }\\n}\\n\");\n return SHADER;\n}\n\nfunction getVertexShader(_ref) {\n var arrowHead = _ref.arrowHead;\n var hasTargetArrowHead = (arrowHead === null || arrowHead === void 0 ? void 0 : arrowHead.extremity) === \"target\" || (arrowHead === null || arrowHead === void 0 ? void 0 : arrowHead.extremity) === \"both\";\n var hasSourceArrowHead = (arrowHead === null || arrowHead === void 0 ? void 0 : arrowHead.extremity) === \"source\" || (arrowHead === null || arrowHead === void 0 ? void 0 : arrowHead.extremity) === \"both\";\n\n // language=GLSL\n var SHADER = /*glsl*/\"\\nattribute vec4 a_id;\\nattribute vec4 a_color;\\nattribute float a_direction;\\nattribute float a_thickness;\\nattribute vec2 a_source;\\nattribute vec2 a_target;\\nattribute float a_current;\\nattribute float a_curvature;\\n\".concat(hasTargetArrowHead ? \"attribute float a_targetSize;\\n\" : \"\", \"\\n\").concat(hasSourceArrowHead ? \"attribute float a_sourceSize;\\n\" : \"\", \"\\n\\nuniform mat3 u_matrix;\\nuniform float u_sizeRatio;\\nuniform float u_pixelRatio;\\nuniform vec2 u_dimensions;\\nuniform float u_minEdgeThickness;\\nuniform float u_feather;\\n\\nvarying vec4 v_color;\\nvarying float v_thickness;\\nvarying float v_feather;\\nvarying vec2 v_cpA;\\nvarying vec2 v_cpB;\\nvarying vec2 v_cpC;\\n\").concat(hasTargetArrowHead ? \"\\nvarying float v_targetSize;\\nvarying vec2 v_targetPoint;\" : \"\", \"\\n\").concat(hasSourceArrowHead ? \"\\nvarying float v_sourceSize;\\nvarying vec2 v_sourcePoint;\" : \"\", \"\\n\").concat(arrowHead ? \"\\nuniform float u_widenessToThicknessRatio;\" : \"\", \"\\n\\nconst float bias = 255.0 / 254.0;\\nconst float epsilon = 0.7;\\n\\nvec2 clipspaceToViewport(vec2 pos, vec2 dimensions) {\\n return vec2(\\n (pos.x + 1.0) * dimensions.x / 2.0,\\n (pos.y + 1.0) * dimensions.y / 2.0\\n );\\n}\\n\\nvec2 viewportToClipspace(vec2 pos, vec2 dimensions) {\\n return vec2(\\n pos.x / dimensions.x * 2.0 - 1.0,\\n pos.y / dimensions.y * 2.0 - 1.0\\n );\\n}\\n\\nvoid main() {\\n float minThickness = u_minEdgeThickness;\\n\\n // Selecting the correct position\\n // Branchless \\\"position = a_source if a_current == 1.0 else a_target\\\"\\n vec2 position = a_source * max(0.0, a_current) + a_target * max(0.0, 1.0 - a_current);\\n position = (u_matrix * vec3(position, 1)).xy;\\n\\n vec2 source = (u_matrix * vec3(a_source, 1)).xy;\\n vec2 target = (u_matrix * vec3(a_target, 1)).xy;\\n\\n vec2 viewportPosition = clipspaceToViewport(position, u_dimensions);\\n vec2 viewportSource = clipspaceToViewport(source, u_dimensions);\\n vec2 viewportTarget = clipspaceToViewport(target, u_dimensions);\\n\\n vec2 delta = viewportTarget.xy - viewportSource.xy;\\n float len = length(delta);\\n vec2 normal = vec2(-delta.y, delta.x) * a_direction;\\n vec2 unitNormal = normal / len;\\n float boundingBoxThickness = len * a_curvature;\\n\\n float curveThickness = max(minThickness, a_thickness / u_sizeRatio);\\n v_thickness = curveThickness * u_pixelRatio;\\n v_feather = u_feather;\\n\\n v_cpA = viewportSource;\\n v_cpB = 0.5 * (viewportSource + viewportTarget) + unitNormal * a_direction * boundingBoxThickness;\\n v_cpC = viewportTarget;\\n\\n vec2 viewportOffsetPosition = (\\n viewportPosition +\\n unitNormal * (boundingBoxThickness / 2.0 + sign(boundingBoxThickness) * (\").concat(arrowHead ? \"curveThickness * u_widenessToThicknessRatio\" : \"curveThickness\", \" + epsilon)) *\\n max(0.0, a_direction) // NOTE: cutting the bounding box in half to avoid overdraw\\n );\\n\\n position = viewportToClipspace(viewportOffsetPosition, u_dimensions);\\n gl_Position = vec4(position, 0, 1);\\n \\n\").concat(hasTargetArrowHead ? \"\\n v_targetSize = a_targetSize * u_pixelRatio / u_sizeRatio;\\n v_targetPoint = viewportTarget;\\n\" : \"\", \"\\n\").concat(hasSourceArrowHead ? \"\\n v_sourceSize = a_sourceSize * u_pixelRatio / u_sizeRatio;\\n v_sourcePoint = viewportSource;\\n\" : \"\", \"\\n\\n #ifdef PICKING_MODE\\n // For picking mode, we use the ID as the color:\\n v_color = a_id;\\n #else\\n // For normal mode, we use the color:\\n v_color = a_color;\\n #endif\\n\\n v_color.a *= bias;\\n}\\n\");\n return SHADER;\n}\n\nvar DEFAULT_EDGE_CURVATURE = 0.25;\nvar DEFAULT_EDGE_CURVE_PROGRAM_OPTIONS = {\n arrowHead: null,\n curvatureAttribute: \"curvature\",\n defaultCurvature: DEFAULT_EDGE_CURVATURE\n};\n\n/**\n * This function helps to identify parallel edges, to adjust their curvatures.\n */\nvar DEFAULT_INDEX_PARALLEL_EDGES_OPTIONS = {\n edgeIndexAttribute: \"parallelIndex\",\n edgeMinIndexAttribute: \"parallelMinIndex\",\n edgeMaxIndexAttribute: \"parallelMaxIndex\"\n};\nfunction indexParallelEdgesIndex(graph, options) {\n var opts = _objectSpread2(_objectSpread2({}, DEFAULT_INDEX_PARALLEL_EDGES_OPTIONS), options || {});\n var nodeIDsMapping = {};\n var edgeDirectedIDsMapping = {};\n var edgeUndirectedIDsMapping = {};\n\n // Normalize IDs:\n var incr = 0;\n graph.forEachNode(function (node) {\n nodeIDsMapping[node] = ++incr + \"\";\n });\n graph.forEachEdge(function (edge, _attrs, source, target) {\n var sourceId = nodeIDsMapping[source];\n var targetId = nodeIDsMapping[target];\n var directedId = [sourceId, targetId].join(\"-\");\n edgeDirectedIDsMapping[edge] = directedId;\n edgeUndirectedIDsMapping[directedId] = [sourceId, targetId].sort().join(\"-\");\n });\n\n // Index edge unique IDs, only based on their extremities:\n var directedIndex = {};\n var undirectedIndex = {};\n graph.forEachEdge(function (edge) {\n var directedId = edgeDirectedIDsMapping[edge];\n var undirectedId = edgeUndirectedIDsMapping[directedId];\n directedIndex[directedId] = directedIndex[directedId] || [];\n directedIndex[directedId].push(edge);\n undirectedIndex[undirectedId] = undirectedIndex[undirectedId] || [];\n undirectedIndex[undirectedId].push(edge);\n });\n\n // Store index attributes:\n for (var directedId in directedIndex) {\n var edges = directedIndex[directedId];\n var directedCount = edges.length;\n var undirectedCount = undirectedIndex[edgeUndirectedIDsMapping[directedId]].length;\n\n // If the edge is alone, in both side:\n if (directedCount === 1 && undirectedCount === 1) {\n var edge = edges[0];\n graph.setEdgeAttribute(edge, opts.edgeIndexAttribute, null);\n graph.setEdgeAttribute(edge, opts.edgeMaxIndexAttribute, null);\n }\n\n // If the edge is alone, but there is at least one edge in the opposite direction:\n else if (directedCount === 1) {\n var _edge = edges[0];\n graph.setEdgeAttribute(_edge, opts.edgeIndexAttribute, 1);\n graph.setEdgeAttribute(_edge, opts.edgeMaxIndexAttribute, 1);\n }\n\n // If the edge is not alone, and all edges are in the same direction:\n else if (directedCount === undirectedCount) {\n var max = (directedCount - 1) / 2;\n var min = -max;\n for (var i = 0; i < directedCount; i++) {\n var _edge2 = edges[i];\n var edgeIndex = -(directedCount - 1) / 2 + i;\n graph.setEdgeAttribute(_edge2, opts.edgeIndexAttribute, edgeIndex);\n graph.setEdgeAttribute(_edge2, opts.edgeMinIndexAttribute, min);\n graph.setEdgeAttribute(_edge2, opts.edgeMaxIndexAttribute, max);\n }\n }\n\n // If the edge is not alone, and there are edges in both directions:\n else {\n for (var _i = 0; _i < directedCount; _i++) {\n var _edge3 = edges[_i];\n graph.setEdgeAttribute(_edge3, opts.edgeIndexAttribute, _i + 1);\n graph.setEdgeAttribute(_edge3, opts.edgeMaxIndexAttribute, directedCount);\n }\n }\n }\n}\n\nvar _WebGLRenderingContex = WebGLRenderingContext,\n UNSIGNED_BYTE = _WebGLRenderingContex.UNSIGNED_BYTE,\n FLOAT = _WebGLRenderingContex.FLOAT;\nfunction createEdgeCurveProgram(inputOptions) {\n var options = _objectSpread2(_objectSpread2({}, DEFAULT_EDGE_CURVE_PROGRAM_OPTIONS), inputOptions || {});\n var _ref = options,\n arrowHead = _ref.arrowHead,\n curvatureAttribute = _ref.curvatureAttribute,\n drawLabel = _ref.drawLabel;\n var hasTargetArrowHead = (arrowHead === null || arrowHead === void 0 ? void 0 : arrowHead.extremity) === \"target\" || (arrowHead === null || arrowHead === void 0 ? void 0 : arrowHead.extremity) === \"both\";\n var hasSourceArrowHead = (arrowHead === null || arrowHead === void 0 ? void 0 : arrowHead.extremity) === \"source\" || (arrowHead === null || arrowHead === void 0 ? void 0 : arrowHead.extremity) === \"both\";\n var UNIFORMS = [\"u_matrix\", \"u_sizeRatio\", \"u_dimensions\", \"u_pixelRatio\", \"u_feather\", \"u_minEdgeThickness\"].concat(_toConsumableArray(arrowHead ? [\"u_lengthToThicknessRatio\", \"u_widenessToThicknessRatio\"] : []));\n return /*#__PURE__*/function (_EdgeProgram) {\n _inherits(EdgeCurveProgram, _EdgeProgram);\n function EdgeCurveProgram() {\n var _this;\n _classCallCheck(this, EdgeCurveProgram);\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n _this = _callSuper(this, EdgeCurveProgram, [].concat(args));\n _defineProperty(_assertThisInitialized(_this), \"drawLabel\", drawLabel || createDrawCurvedEdgeLabel(options));\n return _this;\n }\n _createClass(EdgeCurveProgram, [{\n key: \"getDefinition\",\n value: function getDefinition() {\n return {\n VERTICES: 6,\n VERTEX_SHADER_SOURCE: getVertexShader(options),\n FRAGMENT_SHADER_SOURCE: getFragmentShader(options),\n METHOD: WebGLRenderingContext.TRIANGLES,\n UNIFORMS: UNIFORMS,\n ATTRIBUTES: [{\n name: \"a_source\",\n size: 2,\n type: FLOAT\n }, {\n name: \"a_target\",\n size: 2,\n type: FLOAT\n }].concat(_toConsumableArray(hasTargetArrowHead ? [{\n name: \"a_targetSize\",\n size: 1,\n type: FLOAT\n }] : []), _toConsumableArray(hasSourceArrowHead ? [{\n name: \"a_sourceSize\",\n size: 1,\n type: FLOAT\n }] : []), [{\n name: \"a_thickness\",\n size: 1,\n type: FLOAT\n }, {\n name: \"a_curvature\",\n size: 1,\n type: FLOAT\n }, {\n name: \"a_color\",\n size: 4,\n type: UNSIGNED_BYTE,\n normalized: true\n }, {\n name: \"a_id\",\n size: 4,\n type: UNSIGNED_BYTE,\n normalized: true\n }]),\n CONSTANT_ATTRIBUTES: [{\n name: \"a_current\",\n size: 1,\n type: FLOAT\n },\n // TODO: could optimize to bool\n {\n name: \"a_direction\",\n size: 1,\n type: FLOAT\n } // TODO: could optimize to byte\n ],\n CONSTANT_DATA: [[0, 1], [0, -1], [1, 1], [0, -1], [1, 1], [1, -1]]\n };\n }\n }, {\n key: \"processVisibleItem\",\n value: function processVisibleItem(edgeIndex, startIndex, sourceData, targetData, data) {\n var _data;\n var thickness = data.size || 1;\n var x1 = sourceData.x;\n var y1 = sourceData.y;\n var x2 = targetData.x;\n var y2 = targetData.y;\n var color = floatColor(data.color);\n var curvature = (_data = data[curvatureAttribute]) !== null && _data !== void 0 ? _data : DEFAULT_EDGE_CURVATURE;\n var array = this.array;\n\n // First point\n array[startIndex++] = x1;\n array[startIndex++] = y1;\n array[startIndex++] = x2;\n array[startIndex++] = y2;\n if (hasTargetArrowHead) array[startIndex++] = targetData.size;\n if (hasSourceArrowHead) array[startIndex++] = sourceData.size;\n array[startIndex++] = thickness;\n array[startIndex++] = curvature;\n array[startIndex++] = color;\n array[startIndex++] = edgeIndex;\n }\n }, {\n key: \"setUniforms\",\n value: function setUniforms(params, _ref2) {\n var gl = _ref2.gl,\n uniformLocations = _ref2.uniformLocations;\n var u_matrix = uniformLocations.u_matrix,\n u_pixelRatio = uniformLocations.u_pixelRatio,\n u_feather = uniformLocations.u_feather,\n u_sizeRatio = uniformLocations.u_sizeRatio,\n u_dimensions = uniformLocations.u_dimensions,\n u_minEdgeThickness = uniformLocations.u_minEdgeThickness;\n gl.uniformMatrix3fv(u_matrix, false, params.matrix);\n gl.uniform1f(u_pixelRatio, params.pixelRatio);\n gl.uniform1f(u_sizeRatio, params.sizeRatio);\n gl.uniform1f(u_feather, params.antiAliasingFeather);\n gl.uniform2f(u_dimensions, params.width * params.pixelRatio, params.height * params.pixelRatio);\n gl.uniform1f(u_minEdgeThickness, params.minEdgeThickness);\n if (arrowHead) {\n var u_lengthToThicknessRatio = uniformLocations.u_lengthToThicknessRatio,\n u_widenessToThicknessRatio = uniformLocations.u_widenessToThicknessRatio;\n gl.uniform1f(u_lengthToThicknessRatio, arrowHead.lengthToThicknessRatio);\n gl.uniform1f(u_widenessToThicknessRatio, arrowHead.widenessToThicknessRatio);\n }\n }\n }]);\n return EdgeCurveProgram;\n }(EdgeProgram);\n}\n\nvar EdgeCurveProgram = createEdgeCurveProgram();\nvar EdgeCurvedArrowProgram = createEdgeCurveProgram({\n arrowHead: DEFAULT_EDGE_ARROW_HEAD_PROGRAM_OPTIONS\n});\nvar EdgeCurvedDoubleArrowProgram = createEdgeCurveProgram({\n arrowHead: _objectSpread2(_objectSpread2({}, DEFAULT_EDGE_ARROW_HEAD_PROGRAM_OPTIONS), {}, {\n extremity: \"both\"\n })\n});\n\nexport { DEFAULT_EDGE_CURVATURE, DEFAULT_EDGE_CURVE_PROGRAM_OPTIONS, DEFAULT_INDEX_PARALLEL_EDGES_OPTIONS, EdgeCurvedArrowProgram, EdgeCurvedDoubleArrowProgram, createDrawCurvedEdgeLabel, createEdgeCurveProgram, EdgeCurveProgram as default, indexParallelEdgesIndex };\n","/*\n * Copyright 2026 OpenTrace Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * ═══════════════════════════════════════════════════════════════════════\n * Graph Layout & Rendering Configuration\n *\n * All tunable parameters for graph appearance in one place.\n * Edit values here and see changes immediately on reload.\n * ═══════════════════════════════════════════════════════════════════════\n */\n\n// ─── Node Sizes (screen pixels) ─────────────────────────────────────────\n// Base size is computed as: clamp(NODE_SIZE_MIN, NODE_SIZE_MIN + sqrt(degree) * NODE_SIZE_DEGREE_SCALE, NODE_SIZE_MAX)\n// Then multiplied by the type multiplier below.\n\nexport const NODE_SIZE_MIN = 2;\nexport const NODE_SIZE_MAX = 8;\nexport const NODE_SIZE_DEGREE_SCALE = 1.1; // how much degree (connections) inflates size\n\n// Type-based multipliers applied to the base size\nexport const NODE_SIZE_MULTIPLIERS: Record<string, number> = {\n Repository: 1.0,\n // All other STRUCTURAL_TYPES default to this:\n _structural: 1.0,\n // Everything else gets 1.0 (no multiplier)\n};\n\n// ─── Edge Sizes (screen pixels) ─────────────────────────────────────────\n\nexport const EDGE_SIZE_DEFAULT = 1; // normal state (curved arrows)\nexport const EDGE_SIZE_DEFAULT_LINE = 2; // normal state (straight lines, for large graphs)\nexport const EDGE_SIZE_HIGHLIGHTED = 2.5; // when part of a selected neighborhood\nexport const EDGE_SIZE_DIMMED = 0.5; // when another node is selected\n\n// ─── Edge Opacity ───────────────────────────────────────────────────────\n// Alpha blend against dark background (0 = invisible, 1 = full color)\n\nexport const EDGE_OPACITY_DEFAULT = 0.6; // normal state\nexport const EDGE_OPACITY_HIGHLIGHTED = 1.0; // when part of a selected neighborhood\nexport const EDGE_OPACITY_DIMMED = 0.05; // when another node is selected\n\n// ─── Node Opacity ───────────────────────────────────────────────────────\n\nexport const NODE_OPACITY_DIMMED = 0.15; // when another node is selected\n\n// ─── Zoom Scaling ───────────────────────────────────────────────────────\n// Controls how node sizes scale when zooming out.\n// Default sigma uses Math.sqrt (exponent 0.5). Higher = nodes shrink faster when zooming out.\n\nexport const ZOOM_SIZE_EXPONENT = 0.9;\n\n// ─── d3-Force Layout ────────────────────────────────────────────────────\n// Layout uses only DEFINED_IN edges. These control the force simulation.\n\nexport const FORCE_LINK_DISTANCE = 200; // target distance between linked nodes\nexport const FORCE_CHARGE_STRENGTH = -200; // repulsion between all nodes (negative = repel)\nexport const FORCE_SIMULATION_TICKS = 80; // total simulation iterations (enough to seed FA2)\nexport const FORCE_CLUSTER_STRENGTH = 0.3; // how strongly nodes pull toward community centroid (0-1)\nexport const FORCE_CLUSTER_TICKS = 40; // additional ticks for clustering phase\n\n// ─── ForceAtlas2 Live Physics ───────────────────────────────────────────\n// Runs after d3-force initial positioning to refine the layout.\n// Set FA2_ENABLED = false to skip (static layout only).\n\nexport const FA2_ENABLED = true;\nexport const FA2_GRAVITY = 0.1;\nexport const FA2_SCALING_RATIO = 30;\nexport const FA2_SLOW_DOWN = 2;\nexport const FA2_BARNES_HUT_THRESHOLD = 300; // use Barnes-Hut when nodeCount > this\nexport const FA2_BARNES_HUT_THETA = 0.5;\nexport const FA2_STRONG_GRAVITY = false;\nexport const FA2_LIN_LOG_MODE = true;\nexport const FA2_OUTBOUND_ATTRACTION = true;\nexport const FA2_ADJUST_SIZES = true;\nexport const FA2_DURATION = 3000; // ms to run before auto-stop\n\n// ─── Noverlap Post-Processing ───────────────────────────────────────────\n// Runs after FA2 stops (or after d3-force if FA2 disabled) to push apart remaining overlaps.\n\nexport const NOVERLAP_MAX_ITERATIONS = 50;\nexport const NOVERLAP_RATIO = 1.5;\nexport const NOVERLAP_MARGIN = 10;\nexport const NOVERLAP_EXPANSION = 1.5;\n\n// ─── Sigma Renderer ─────────────────────────────────────────────────────\n\n// Above this edge count, use simple line edges instead of curved arrows\nexport const EDGE_PROGRAM_THRESHOLD = 50000;\n\nexport const LABEL_RENDERED_SIZE_THRESHOLD = 8;\nexport const LABEL_SIZE = 12;\nexport const LABEL_FONT = 'Inter, system-ui, sans-serif';\nexport const LABEL_COLOR = '#e2e8f0';\n\n// ─── Louvain Community Detection ────────────────────────────────────────\n// Resolution >1 produces more communities (finer), <1 produces fewer (coarser).\n\nexport const LOUVAIN_RESOLUTION = 1.0;\n\n// ─── Bundled LayoutConfig ──────────────────────────────────────────────\n// Same values as above, bundled into a single object for passing to hooks/components.\n\nimport type { LayoutConfig } from '../graph/types';\nimport { getNodeColor } from '../colors/nodeColors';\nimport { getLinkColor } from '../colors/linkColors';\nimport {\n buildCommunityColorMap,\n buildCommunityNames,\n getCommunityColor,\n} from '../colors/communityColors';\n\nexport const DEFAULT_LAYOUT_CONFIG: LayoutConfig = {\n linkDistance: FORCE_LINK_DISTANCE,\n chargeStrength: FORCE_CHARGE_STRENGTH,\n simulationTicks: FORCE_SIMULATION_TICKS,\n clusterStrength: FORCE_CLUSTER_STRENGTH,\n clusterTicks: FORCE_CLUSTER_TICKS,\n clusterSeparation: 2.5,\n fa2Enabled: FA2_ENABLED,\n fa2Gravity: FA2_GRAVITY,\n fa2ScalingRatio: FA2_SCALING_RATIO,\n fa2SlowDown: FA2_SLOW_DOWN,\n fa2BarnesHutThreshold: FA2_BARNES_HUT_THRESHOLD,\n fa2BarnesHutTheta: FA2_BARNES_HUT_THETA,\n fa2StrongGravity: FA2_STRONG_GRAVITY,\n fa2LinLogMode: FA2_LIN_LOG_MODE,\n fa2OutboundAttraction: FA2_OUTBOUND_ATTRACTION,\n fa2AdjustSizes: FA2_ADJUST_SIZES,\n fa2Duration: FA2_DURATION,\n noverlapMaxNodes: 3000,\n noverlapMaxIterations: NOVERLAP_MAX_ITERATIONS,\n noverlapRatio: NOVERLAP_RATIO,\n noverlapMargin: NOVERLAP_MARGIN,\n noverlapExpansion: NOVERLAP_EXPANSION,\n louvainResolution: LOUVAIN_RESOLUTION,\n edgeProgramThreshold: 50000,\n // Graph structure\n layoutEdgeType: 'DEFINED_IN',\n structuralTypes: ['Repository', 'Directory', 'Package'],\n // Color functions — OpenTrace palettes\n getNodeColor,\n getLinkColor,\n buildCommunityColorMap,\n buildCommunityNames,\n getCommunityColor,\n};\n","/*\n * Copyright 2026 OpenTrace Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport Graph from 'graphology';\nimport type {\n GraphNode,\n GraphLink,\n CommunityData,\n LayoutConfig,\n} from './types';\nimport type { LayoutRequest, LayoutResponse } from '../workers/d3LayoutWorker';\nimport {\n NODE_SIZE_MIN,\n NODE_SIZE_MAX,\n NODE_SIZE_DEGREE_SCALE,\n NODE_SIZE_MULTIPLIERS,\n EDGE_SIZE_DEFAULT,\n EDGE_SIZE_DEFAULT_LINE,\n} from '../config/graphLayout';\n\n// ─── Helpers ────────────────────────────────────────────────────────────\n\nfunction nodeSize(\n degree: number,\n nodeType: string,\n structuralTypes: Set<string>,\n): number {\n const base = Math.min(\n NODE_SIZE_MAX,\n Math.max(\n NODE_SIZE_MIN,\n NODE_SIZE_MIN + Math.sqrt(degree) * NODE_SIZE_DEGREE_SCALE,\n ),\n );\n const multiplier =\n NODE_SIZE_MULTIPLIERS[nodeType] ??\n (structuralTypes.has(nodeType) ? NODE_SIZE_MULTIPLIERS._structural : 1);\n return base * multiplier;\n}\n\n/** Extract string ID from a link endpoint (handles both string and object forms). */\nfunction endpointId(endpoint: string | number | GraphNode | undefined): string {\n if (typeof endpoint === 'string') return endpoint;\n if (typeof endpoint === 'object' && endpoint !== null)\n return (endpoint as GraphNode).id;\n return String(endpoint);\n}\n\n// ─── Hook ───────────────────────────────────────────────────────────────\n\nexport interface UseGraphInstanceResult {\n graph: Graph;\n /** True once d3-force layout has been applied and positions seeded into the graph */\n layoutReady: boolean;\n}\n\nexport interface UseGraphInstanceOptions {\n allNodes: GraphNode[];\n allLinks: GraphLink[];\n communityData: CommunityData;\n layoutConfig: LayoutConfig;\n}\n\nexport function useGraphInstance({\n allNodes,\n allLinks,\n communityData,\n layoutConfig,\n}: UseGraphInstanceOptions): UseGraphInstanceResult {\n // Stable graph instance — created once, never replaced.\n const graph = useMemo(() => new Graph({ multi: true, type: 'directed' }), []);\n\n // Worker ref — persists across renders, terminated on unmount\n const workerRef = useRef<Worker | null>(null);\n\n // Guard against unmount — worker.onmessage may fire after cleanup\n const unmountedRef = useRef(false);\n\n // Track which dataset the worker is computing for (to discard stale results)\n const requestIdRef = useRef(0);\n\n const [layoutReady, setLayoutReady] = useState(false);\n\n // Derived from config\n const structuralTypes = useMemo(\n () => new Set(layoutConfig.structuralTypes),\n [layoutConfig.structuralTypes],\n );\n\n // Single effect: rebuild graph and run d3-force worker when data changes.\n useEffect(() => {\n graph.clear();\n setLayoutReady(false);\n\n if (allNodes.length === 0) return;\n\n const { assignments, colorMap, names } = communityData;\n const { getNodeColor, getLinkColor, getCommunityColor } = layoutConfig;\n\n // ── Build ALL nodes with initial x:0, y:0 ──────────────────────────\n const nodeIdSet = new Set<string>();\n const serializedNodes = allNodes.map((node) => {\n nodeIdSet.add(node.id);\n const typeColor = getNodeColor(node.type);\n const commColor = getCommunityColor(assignments, colorMap, node.id);\n const cid = assignments[node.id];\n const commName = cid !== undefined ? names.get(cid) : undefined;\n return {\n key: node.id,\n attributes: {\n label: node.name || node.id,\n x: 0,\n y: 0,\n size: nodeSize(0, node.type, structuralTypes),\n nodeType: node.type,\n _graphNode: node,\n _typeColor: typeColor,\n _communityColor: commColor,\n _communityName: commName ?? undefined,\n },\n };\n });\n\n // ── Build ALL edges (deduped by source-label-target key) ────────────\n const seenEdges = new Set<string>();\n const serializedEdges: {\n key: string;\n source: string;\n target: string;\n attributes: Record<string, unknown>;\n }[] = [];\n\n const edgeSize =\n allLinks.length > layoutConfig.edgeProgramThreshold\n ? EDGE_SIZE_DEFAULT_LINE\n : EDGE_SIZE_DEFAULT;\n\n for (const link of allLinks) {\n const source = endpointId(link.source);\n const target = endpointId(link.target);\n if (!nodeIdSet.has(source) || !nodeIdSet.has(target)) continue;\n const edgeKey = `${source}-${link.label}-${target}`;\n if (seenEdges.has(edgeKey)) continue;\n seenEdges.add(edgeKey);\n serializedEdges.push({\n key: edgeKey,\n source,\n target,\n attributes: {\n label: link.label,\n color: getLinkColor(link.label),\n size: edgeSize,\n _graphLink: link,\n },\n });\n }\n\n // Bulk import — single set of graphology events\n graph.import({\n nodes: serializedNodes,\n edges: serializedEdges,\n });\n\n // ── Prepare worker data ─────────────────────────────────────────────\n const nodeIds = allNodes.map((n) => n.id);\n const simLinks: { source: string; target: string }[] = [];\n for (const link of allLinks) {\n if (link.label !== layoutConfig.layoutEdgeType) continue;\n const source = endpointId(link.source);\n const target = endpointId(link.target);\n if (nodeIdSet.has(source) && nodeIdSet.has(target)) {\n simLinks.push({ source, target });\n }\n }\n\n // Terminate any previous worker\n if (workerRef.current) {\n workerRef.current.terminate();\n workerRef.current = null;\n }\n\n const reqId = ++requestIdRef.current;\n\n const worker = new Worker(\n new URL('../workers/d3LayoutWorker.ts', import.meta.url),\n { type: 'module' },\n );\n workerRef.current = worker;\n\n if (process.env.NODE_ENV === 'development') {\n console.time('[graph] d3-force worker layout');\n }\n\n worker.onerror = (err) => {\n if (reqId !== requestIdRef.current || unmountedRef.current) return;\n console.error('[graph] d3-force worker failed:', err);\n setLayoutReady(true);\n if (workerRef.current === worker) workerRef.current = null;\n };\n\n worker.onmessage = (e: MessageEvent<LayoutResponse>) => {\n if (reqId !== requestIdRef.current || unmountedRef.current) return;\n\n // Build position lookup\n const pos = new Map<string, { x: number; y: number }>();\n for (const [id, x, y] of e.data.positions) {\n pos.set(id, { x, y });\n }\n\n if (process.env.NODE_ENV === 'development') {\n console.timeEnd('[graph] d3-force worker layout');\n console.log(`[graph] layout computed for ${pos.size} nodes`);\n }\n\n // Seed positions into graph — batched, single event\n graph.updateEachNodeAttributes((_id, attrs) => {\n const p = pos.get(_id);\n if (p) {\n attrs.x = p.x;\n attrs.y = p.y;\n }\n return attrs;\n });\n\n setLayoutReady(true);\n\n worker.terminate();\n if (workerRef.current === worker) workerRef.current = null;\n };\n\n worker.postMessage({\n nodeIds,\n links: simLinks,\n communities: assignments,\n config: {\n linkDistance: layoutConfig.linkDistance,\n chargeStrength: layoutConfig.chargeStrength,\n ticks: layoutConfig.simulationTicks,\n clusterStrength: layoutConfig.clusterStrength,\n clusterTicks: layoutConfig.clusterTicks,\n clusterSeparation: layoutConfig.clusterSeparation,\n },\n } satisfies LayoutRequest);\n\n return () => {\n if (workerRef.current === worker) {\n worker.terminate();\n workerRef.current = null;\n }\n };\n // Dependencies: allNodes/allLinks/layoutConfig changes trigger full rebuild.\n // communityData is derived from allNodes/allLinks, so it's implicitly tracked.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [allNodes, allLinks, graph, layoutConfig, structuralTypes]);\n\n // Track mount state — reset on each mount (strict mode remounts)\n useEffect(() => {\n unmountedRef.current = false;\n return () => {\n unmountedRef.current = true;\n workerRef.current?.terminate();\n };\n }, []);\n\n return { graph, layoutReady };\n}\n","/*\n * Copyright 2026 OpenTrace Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useEffect } from 'react';\nimport type Graph from 'graphology';\nimport type { VisualState, LayoutConfig } from './types';\nimport {\n EDGE_SIZE_DEFAULT,\n EDGE_SIZE_DEFAULT_LINE,\n EDGE_SIZE_HIGHLIGHTED,\n EDGE_SIZE_DIMMED,\n EDGE_OPACITY_DEFAULT,\n EDGE_OPACITY_DIMMED,\n NODE_OPACITY_DIMMED,\n} from '../config/graphLayout';\n\n// ─── Pre-computed color cache ───────────────────────────────────────────\n\nconst dimColorCache = new Map<string, string>();\n\nfunction dimColor(hex: string, alpha: number): string {\n const key = `${hex}:${alpha}`;\n const cached = dimColorCache.get(key);\n if (cached) return cached;\n\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n // TODO: read from CSS variable for theme support\n const bgR = 0x1a,\n bgG = 0x1b,\n bgB = 0x2e;\n const nr = Math.round(r * alpha + bgR * (1 - alpha));\n const ng = Math.round(g * alpha + bgG * (1 - alpha));\n const nb = Math.round(b * alpha + bgB * (1 - alpha));\n const result = `#${nr.toString(16).padStart(2, '0')}${ng.toString(16).padStart(2, '0')}${nb.toString(16).padStart(2, '0')}`;\n dimColorCache.set(key, result);\n return result;\n}\n\n// ─── Hook ───────────────────────────────────────────────────────────────\n\n/**\n * Updates colors, highlights, and selection state on graph nodes/edges.\n * Color functions are read from layoutConfig to avoid coupling to a specific palette.\n * Never touches x/y positions.\n */\nexport function useGraphVisuals(\n graph: Graph,\n layoutReady: boolean,\n visualState: VisualState,\n layoutConfig: LayoutConfig,\n _degreeMap: Map<string, number>,\n isLargeGraph: boolean,\n): void {\n useEffect(() => {\n if (!layoutReady || graph.order === 0) return;\n\n const {\n colorMode,\n highlightNodes,\n highlightLinks,\n labelNodes,\n selectedNodeId,\n } = visualState;\n\n const { getNodeColor, getLinkColor } = layoutConfig;\n const hasHighlight = highlightNodes.size > 0;\n\n // Batched node update — single event\n graph.updateEachNodeAttributes((_id, attrs) => {\n const isHighlighted = !hasHighlight || highlightNodes.has(_id);\n const isSelected = _id === selectedNodeId;\n const showLabel = !hasHighlight || labelNodes.has(_id);\n const baseColor =\n ((colorMode === 'community'\n ? attrs._communityColor\n : attrs._typeColor) as string | undefined) ??\n getNodeColor(attrs.nodeType as string);\n\n attrs.color = isHighlighted\n ? baseColor\n : dimColor(baseColor, NODE_OPACITY_DIMMED);\n attrs.borderColor = isSelected ? baseColor : undefined;\n attrs.borderSize = isSelected ? 3 : 0;\n attrs.forceLabel = showLabel && hasHighlight;\n return attrs;\n });\n\n // Batched edge update — single event\n const defaultEdgeSize = isLargeGraph\n ? EDGE_SIZE_DEFAULT_LINE\n : EDGE_SIZE_DEFAULT;\n\n graph.updateEachEdgeAttributes((_id, attrs, source, target) => {\n const linkKey = `${source}-${target}`;\n const isHighlighted = highlightLinks.has(linkKey);\n const baseColor = getLinkColor(attrs.label as string);\n\n if (hasHighlight) {\n attrs.color = isHighlighted\n ? baseColor\n : dimColor(baseColor, EDGE_OPACITY_DIMMED);\n attrs.size = isHighlighted ? EDGE_SIZE_HIGHLIGHTED : EDGE_SIZE_DIMMED;\n } else {\n attrs.color = dimColor(baseColor, EDGE_OPACITY_DEFAULT);\n attrs.size = defaultEdgeSize;\n }\n\n return attrs;\n });\n }, [graph, layoutReady, visualState, layoutConfig, isLargeGraph]);\n}\n","import{useSigma as t,isEqual as e}from\"@react-sigma/core\";import*as r from\"react\";import n,{useRef as a,useCallback as l,useState as i,useEffect as s}from\"react\";function o(r,n){const i=t(),s=a(n);e(s.current,n)||(s.current=n);return{positions:l((()=>s.current?r(i.getGraph(),s.current):{}),[i,s,r]),assign:l((()=>{s.current&&r.assign(i.getGraph(),s.current)}),[i,s,r])}}function c(r,n){const o=t(),[c,u]=i(!1),[p,g]=i(null),m=a(n);e(m.current,n)||(m.current=n),s((()=>{u(!1);let t=null;return m.current&&(t=new r(o.getGraph(),m.current)),g(t),()=>{null!==t&&t.kill()}}),[o,m,g,u,r]);return{stop:l((()=>{p&&(p.stop(),u(!1))}),[p,u]),start:l((()=>{p&&(p.start(),u(!0))}),[p,u]),kill:l((()=>{p&&p.kill(),u(!1)}),[p,u]),isRunning:c}}var u;function p(){return p=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var n in r)({}).hasOwnProperty.call(r,n)&&(t[n]=r[n])}return t},p.apply(null,arguments)}var g,m=function(t){return r.createElement(\"svg\",p({xmlns:\"http://www.w3.org/2000/svg\",\"aria-hidden\":\"true\",className:\"play-solid_svg__svg-inline--fa play-solid_svg__fa-play play-solid_svg__fa-w-14\",\"data-icon\":\"play\",\"data-prefix\":\"fas\",viewBox:\"0 0 448 512\",width:\"1em\",height:\"1em\"},t),u||(u=r.createElement(\"path\",{fill:\"currentColor\",d:\"M424.4 214.7 72.4 6.6C43.8-10.3 0 6.1 0 47.9V464c0 37.5 40.7 60.1 72.4 41.3l352-208c31.4-18.5 31.5-64.1 0-82.6\"})))};function d(){return d=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var n in r)({}).hasOwnProperty.call(r,n)&&(t[n]=r[n])}return t},d.apply(null,arguments)}var f=function(t){return r.createElement(\"svg\",d({xmlns:\"http://www.w3.org/2000/svg\",\"aria-hidden\":\"true\",className:\"stop-solid_svg__svg-inline--fa stop-solid_svg__fa-stop stop-solid_svg__fa-w-14\",\"data-icon\":\"stop\",\"data-prefix\":\"fas\",viewBox:\"0 0 448 512\",width:\"1em\",height:\"1em\"},t),g||(g=r.createElement(\"path\",{fill:\"currentColor\",d:\"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48\"})))};function h({id:e,className:r,style:a,layout:l,autoRunFor:i,children:o,labels:c={}}){const u=t(),{stop:p,start:g,isRunning:d}=l,h={className:`react-sigma-control ${r||\"\"}`,id:e,style:a};return s((()=>{if(!u)return;let t=null;return void 0!==i&&i>-1&&u.getGraph().order>0&&(g(),t=i>0?window.setTimeout((()=>{p()}),i):null),()=>{t&&clearTimeout(t)}}),[i,g,p,u]),n.createElement(\"div\",Object.assign({},h),n.createElement(\"button\",{onClick:()=>d?p():g(),title:d?c.stop||\"Stop the layout animation\":c.start||\"Start the layout animation\"},o&&!d&&o[0],o&&d&&o[1],!o&&!d&&n.createElement(m,{style:{width:\"1em\"}}),!o&&d&&n.createElement(f,{style:{width:\"1em\"}})))}export{h as WorkerLayoutControl,o as useLayoutFactory,c as useWorkerLayoutFactory};\n//# sourceMappingURL=react-sigma_layout-core.esm.min.js.map\n","/* eslint no-constant-condition: 0 */\n/**\n * Graphology ForceAtlas2 Iteration\n * =================================\n *\n * Function used to perform a single iteration of the algorithm.\n */\n\n/**\n * Matrices properties accessors.\n */\nvar NODE_X = 0;\nvar NODE_Y = 1;\nvar NODE_DX = 2;\nvar NODE_DY = 3;\nvar NODE_OLD_DX = 4;\nvar NODE_OLD_DY = 5;\nvar NODE_MASS = 6;\nvar NODE_CONVERGENCE = 7;\nvar NODE_SIZE = 8;\nvar NODE_FIXED = 9;\n\nvar EDGE_SOURCE = 0;\nvar EDGE_TARGET = 1;\nvar EDGE_WEIGHT = 2;\n\nvar REGION_NODE = 0;\nvar REGION_CENTER_X = 1;\nvar REGION_CENTER_Y = 2;\nvar REGION_SIZE = 3;\nvar REGION_NEXT_SIBLING = 4;\nvar REGION_FIRST_CHILD = 5;\nvar REGION_MASS = 6;\nvar REGION_MASS_CENTER_X = 7;\nvar REGION_MASS_CENTER_Y = 8;\n\nvar SUBDIVISION_ATTEMPTS = 3;\n\n/**\n * Constants.\n */\nvar PPN = 10;\nvar PPE = 3;\nvar PPR = 9;\n\nvar MAX_FORCE = 10;\n\n/**\n * Function used to perform a single interation of the algorithm.\n *\n * @param {object} options - Layout options.\n * @param {Float32Array} NodeMatrix - Node data.\n * @param {Float32Array} EdgeMatrix - Edge data.\n * @return {object} - Some metadata.\n */\nmodule.exports = function iterate(options, NodeMatrix, EdgeMatrix) {\n // Initializing variables\n var l, r, n, n1, n2, rn, e, w, g, s;\n\n var order = NodeMatrix.length,\n size = EdgeMatrix.length;\n\n var adjustSizes = options.adjustSizes;\n\n var thetaSquared = options.barnesHutTheta * options.barnesHutTheta;\n\n var outboundAttCompensation, coefficient, xDist, yDist, ewc, distance, factor;\n\n var RegionMatrix = [];\n\n // 1) Initializing layout data\n //-----------------------------\n\n // Resetting positions & computing max values\n for (n = 0; n < order; n += PPN) {\n NodeMatrix[n + NODE_OLD_DX] = NodeMatrix[n + NODE_DX];\n NodeMatrix[n + NODE_OLD_DY] = NodeMatrix[n + NODE_DY];\n NodeMatrix[n + NODE_DX] = 0;\n NodeMatrix[n + NODE_DY] = 0;\n }\n\n // If outbound attraction distribution, compensate\n if (options.outboundAttractionDistribution) {\n outboundAttCompensation = 0;\n for (n = 0; n < order; n += PPN) {\n outboundAttCompensation += NodeMatrix[n + NODE_MASS];\n }\n\n outboundAttCompensation /= order / PPN;\n }\n\n // 1.bis) Barnes-Hut computation\n //------------------------------\n\n if (options.barnesHutOptimize) {\n // Setting up\n var minX = Infinity,\n maxX = -Infinity,\n minY = Infinity,\n maxY = -Infinity,\n q,\n q2,\n subdivisionAttempts;\n\n // Computing min and max values\n for (n = 0; n < order; n += PPN) {\n minX = Math.min(minX, NodeMatrix[n + NODE_X]);\n maxX = Math.max(maxX, NodeMatrix[n + NODE_X]);\n minY = Math.min(minY, NodeMatrix[n + NODE_Y]);\n maxY = Math.max(maxY, NodeMatrix[n + NODE_Y]);\n }\n\n // squarify bounds, it's a quadtree\n var dx = maxX - minX,\n dy = maxY - minY;\n if (dx > dy) {\n minY -= (dx - dy) / 2;\n maxY = minY + dx;\n } else {\n minX -= (dy - dx) / 2;\n maxX = minX + dy;\n }\n\n // Build the Barnes Hut root region\n RegionMatrix[0 + REGION_NODE] = -1;\n RegionMatrix[0 + REGION_CENTER_X] = (minX + maxX) / 2;\n RegionMatrix[0 + REGION_CENTER_Y] = (minY + maxY) / 2;\n RegionMatrix[0 + REGION_SIZE] = Math.max(maxX - minX, maxY - minY);\n RegionMatrix[0 + REGION_NEXT_SIBLING] = -1;\n RegionMatrix[0 + REGION_FIRST_CHILD] = -1;\n RegionMatrix[0 + REGION_MASS] = 0;\n RegionMatrix[0 + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[0 + REGION_MASS_CENTER_Y] = 0;\n\n // Add each node in the tree\n l = 1;\n for (n = 0; n < order; n += PPN) {\n // Current region, starting with root\n r = 0;\n subdivisionAttempts = SUBDIVISION_ATTEMPTS;\n\n while (true) {\n // Are there sub-regions?\n\n // We look at first child index\n if (RegionMatrix[r + REGION_FIRST_CHILD] >= 0) {\n // There are sub-regions\n\n // We just iterate to find a \"leaf\" of the tree\n // that is an empty region or a region with a single node\n // (see next case)\n\n // Find the quadrant of n\n if (NodeMatrix[n + NODE_X] < RegionMatrix[r + REGION_CENTER_X]) {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD];\n } else {\n // Bottom Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR;\n }\n } else {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 2;\n } else {\n // Bottom Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 3;\n }\n }\n\n // Update center of mass and mass (we only do it for non-leave regions)\n RegionMatrix[r + REGION_MASS_CENTER_X] =\n (RegionMatrix[r + REGION_MASS_CENTER_X] *\n RegionMatrix[r + REGION_MASS] +\n NodeMatrix[n + NODE_X] * NodeMatrix[n + NODE_MASS]) /\n (RegionMatrix[r + REGION_MASS] + NodeMatrix[n + NODE_MASS]);\n\n RegionMatrix[r + REGION_MASS_CENTER_Y] =\n (RegionMatrix[r + REGION_MASS_CENTER_Y] *\n RegionMatrix[r + REGION_MASS] +\n NodeMatrix[n + NODE_Y] * NodeMatrix[n + NODE_MASS]) /\n (RegionMatrix[r + REGION_MASS] + NodeMatrix[n + NODE_MASS]);\n\n RegionMatrix[r + REGION_MASS] += NodeMatrix[n + NODE_MASS];\n\n // Iterate on the right quadrant\n r = q;\n continue;\n } else {\n // There are no sub-regions: we are in a \"leaf\"\n\n // Is there a node in this leave?\n if (RegionMatrix[r + REGION_NODE] < 0) {\n // There is no node in region:\n // we record node n and go on\n RegionMatrix[r + REGION_NODE] = n;\n break;\n } else {\n // There is a node in this region\n\n // We will need to create sub-regions, stick the two\n // nodes (the old one r[0] and the new one n) in two\n // subregions. If they fall in the same quadrant,\n // we will iterate.\n\n // Create sub-regions\n RegionMatrix[r + REGION_FIRST_CHILD] = l * PPR;\n w = RegionMatrix[r + REGION_SIZE] / 2; // new size (half)\n\n // NOTE: we use screen coordinates\n // from Top Left to Bottom Right\n\n // Top Left sub-region\n g = RegionMatrix[r + REGION_FIRST_CHILD];\n\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] - w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] - w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] = g + PPR;\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n // Bottom Left sub-region\n g += PPR;\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] - w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] + w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] = g + PPR;\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n // Top Right sub-region\n g += PPR;\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] + w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] - w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] = g + PPR;\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n // Bottom Right sub-region\n g += PPR;\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] + w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] + w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] =\n RegionMatrix[r + REGION_NEXT_SIBLING];\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n l += 4;\n\n // Now the goal is to find two different sub-regions\n // for the two nodes: the one previously recorded (r[0])\n // and the one we want to add (n)\n\n // Find the quadrant of the old node\n if (\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_X] <\n RegionMatrix[r + REGION_CENTER_X]\n ) {\n if (\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_Y] <\n RegionMatrix[r + REGION_CENTER_Y]\n ) {\n // Top Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD];\n } else {\n // Bottom Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR;\n }\n } else {\n if (\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_Y] <\n RegionMatrix[r + REGION_CENTER_Y]\n ) {\n // Top Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 2;\n } else {\n // Bottom Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 3;\n }\n }\n\n // We remove r[0] from the region r, add its mass to r and record it in q\n RegionMatrix[r + REGION_MASS] =\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_MASS];\n RegionMatrix[r + REGION_MASS_CENTER_X] =\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_X];\n RegionMatrix[r + REGION_MASS_CENTER_Y] =\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_Y];\n\n RegionMatrix[q + REGION_NODE] = RegionMatrix[r + REGION_NODE];\n RegionMatrix[r + REGION_NODE] = -1;\n\n // Find the quadrant of n\n if (NodeMatrix[n + NODE_X] < RegionMatrix[r + REGION_CENTER_X]) {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Left quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD];\n } else {\n // Bottom Left quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD] + PPR;\n }\n } else {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Right quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 2;\n } else {\n // Bottom Right quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 3;\n }\n }\n\n if (q === q2) {\n // If both nodes are in the same quadrant,\n // we have to try it again on this quadrant\n if (subdivisionAttempts--) {\n r = q;\n continue; // while\n } else {\n // we are out of precision here, and we cannot subdivide anymore\n // but we have to break the loop anyway\n subdivisionAttempts = SUBDIVISION_ATTEMPTS;\n break; // while\n }\n }\n\n // If both quadrants are different, we record n\n // in its quadrant\n RegionMatrix[q2 + REGION_NODE] = n;\n break;\n }\n }\n }\n }\n }\n\n // 2) Repulsion\n //--------------\n // NOTES: adjustSizes = antiCollision & scalingRatio = coefficient\n\n if (options.barnesHutOptimize) {\n coefficient = options.scalingRatio;\n\n // Applying repulsion through regions\n for (n = 0; n < order; n += PPN) {\n // Computing leaf quad nodes iteration\n\n r = 0; // Starting with root region\n while (true) {\n if (RegionMatrix[r + REGION_FIRST_CHILD] >= 0) {\n // The region has sub-regions\n\n // We run the Barnes Hut test to see if we are at the right distance\n distance =\n Math.pow(\n NodeMatrix[n + NODE_X] - RegionMatrix[r + REGION_MASS_CENTER_X],\n 2\n ) +\n Math.pow(\n NodeMatrix[n + NODE_Y] - RegionMatrix[r + REGION_MASS_CENTER_Y],\n 2\n );\n\n s = RegionMatrix[r + REGION_SIZE];\n\n if ((4 * s * s) / distance < thetaSquared) {\n // We treat the region as a single body, and we repulse\n\n xDist =\n NodeMatrix[n + NODE_X] - RegionMatrix[r + REGION_MASS_CENTER_X];\n yDist =\n NodeMatrix[n + NODE_Y] - RegionMatrix[r + REGION_MASS_CENTER_Y];\n\n if (adjustSizes === true) {\n //-- Linear Anti-collision Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n RegionMatrix[r + REGION_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n } else if (distance < 0) {\n factor =\n (-coefficient *\n NodeMatrix[n + NODE_MASS] *\n RegionMatrix[r + REGION_MASS]) /\n Math.sqrt(distance);\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n } else {\n //-- Linear Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n RegionMatrix[r + REGION_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n }\n\n // When this is done, we iterate. We have to look at the next sibling.\n r = RegionMatrix[r + REGION_NEXT_SIBLING];\n if (r < 0) break; // No next sibling: we have finished the tree\n\n continue;\n } else {\n // The region is too close and we have to look at sub-regions\n r = RegionMatrix[r + REGION_FIRST_CHILD];\n continue;\n }\n } else {\n // The region has no sub-region\n // If there is a node r[0] and it is not n, then repulse\n rn = RegionMatrix[r + REGION_NODE];\n\n if (rn >= 0 && rn !== n) {\n xDist = NodeMatrix[n + NODE_X] - NodeMatrix[rn + NODE_X];\n yDist = NodeMatrix[n + NODE_Y] - NodeMatrix[rn + NODE_Y];\n\n distance = xDist * xDist + yDist * yDist;\n\n if (adjustSizes === true) {\n //-- Linear Anti-collision Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n NodeMatrix[rn + NODE_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n } else if (distance < 0) {\n factor =\n (-coefficient *\n NodeMatrix[n + NODE_MASS] *\n NodeMatrix[rn + NODE_MASS]) /\n Math.sqrt(distance);\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n } else {\n //-- Linear Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n NodeMatrix[rn + NODE_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n }\n }\n\n // When this is done, we iterate. We have to look at the next sibling.\n r = RegionMatrix[r + REGION_NEXT_SIBLING];\n\n if (r < 0) break; // No next sibling: we have finished the tree\n\n continue;\n }\n }\n }\n } else {\n coefficient = options.scalingRatio;\n\n // Square iteration\n for (n1 = 0; n1 < order; n1 += PPN) {\n for (n2 = 0; n2 < n1; n2 += PPN) {\n // Common to both methods\n xDist = NodeMatrix[n1 + NODE_X] - NodeMatrix[n2 + NODE_X];\n yDist = NodeMatrix[n1 + NODE_Y] - NodeMatrix[n2 + NODE_Y];\n\n if (adjustSizes === true) {\n //-- Anticollision Linear Repulsion\n distance =\n Math.sqrt(xDist * xDist + yDist * yDist) -\n NodeMatrix[n1 + NODE_SIZE] -\n NodeMatrix[n2 + NODE_SIZE];\n\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n1 + NODE_MASS] *\n NodeMatrix[n2 + NODE_MASS]) /\n distance /\n distance;\n\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n } else if (distance < 0) {\n factor =\n 100 *\n coefficient *\n NodeMatrix[n1 + NODE_MASS] *\n NodeMatrix[n2 + NODE_MASS];\n\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n }\n } else {\n //-- Linear Repulsion\n distance = Math.sqrt(xDist * xDist + yDist * yDist);\n\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n1 + NODE_MASS] *\n NodeMatrix[n2 + NODE_MASS]) /\n distance /\n distance;\n\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n }\n }\n }\n }\n }\n\n // 3) Gravity\n //------------\n g = options.gravity / options.scalingRatio;\n coefficient = options.scalingRatio;\n for (n = 0; n < order; n += PPN) {\n factor = 0;\n\n // Common to both methods\n xDist = NodeMatrix[n + NODE_X];\n yDist = NodeMatrix[n + NODE_Y];\n distance = Math.sqrt(Math.pow(xDist, 2) + Math.pow(yDist, 2));\n\n if (options.strongGravityMode) {\n //-- Strong gravity\n if (distance > 0) factor = coefficient * NodeMatrix[n + NODE_MASS] * g;\n } else {\n //-- Linear Anti-collision Repulsion n\n if (distance > 0)\n factor = (coefficient * NodeMatrix[n + NODE_MASS] * g) / distance;\n }\n\n // Updating node's dx and dy\n NodeMatrix[n + NODE_DX] -= xDist * factor;\n NodeMatrix[n + NODE_DY] -= yDist * factor;\n }\n\n // 4) Attraction\n //---------------\n coefficient =\n 1 * (options.outboundAttractionDistribution ? outboundAttCompensation : 1);\n\n // TODO: simplify distance\n // TODO: coefficient is always used as -c --> optimize?\n for (e = 0; e < size; e += PPE) {\n n1 = EdgeMatrix[e + EDGE_SOURCE];\n n2 = EdgeMatrix[e + EDGE_TARGET];\n w = EdgeMatrix[e + EDGE_WEIGHT];\n\n // Edge weight influence\n ewc = Math.pow(w, options.edgeWeightInfluence);\n\n // Common measures\n xDist = NodeMatrix[n1 + NODE_X] - NodeMatrix[n2 + NODE_X];\n yDist = NodeMatrix[n1 + NODE_Y] - NodeMatrix[n2 + NODE_Y];\n\n // Applying attraction to nodes\n if (adjustSizes === true) {\n distance =\n Math.sqrt(xDist * xDist + yDist * yDist) -\n NodeMatrix[n1 + NODE_SIZE] -\n NodeMatrix[n2 + NODE_SIZE];\n\n if (options.linLogMode) {\n if (options.outboundAttractionDistribution) {\n //-- LinLog Degree Distributed Anti-collision Attraction\n if (distance > 0) {\n factor =\n (-coefficient * ewc * Math.log(1 + distance)) /\n distance /\n NodeMatrix[n1 + NODE_MASS];\n }\n } else {\n //-- LinLog Anti-collision Attraction\n if (distance > 0) {\n factor = (-coefficient * ewc * Math.log(1 + distance)) / distance;\n }\n }\n } else {\n if (options.outboundAttractionDistribution) {\n //-- Linear Degree Distributed Anti-collision Attraction\n if (distance > 0) {\n factor = (-coefficient * ewc) / NodeMatrix[n1 + NODE_MASS];\n }\n } else {\n //-- Linear Anti-collision Attraction\n if (distance > 0) {\n factor = -coefficient * ewc;\n }\n }\n }\n } else {\n distance = Math.sqrt(Math.pow(xDist, 2) + Math.pow(yDist, 2));\n\n if (options.linLogMode) {\n if (options.outboundAttractionDistribution) {\n //-- LinLog Degree Distributed Attraction\n if (distance > 0) {\n factor =\n (-coefficient * ewc * Math.log(1 + distance)) /\n distance /\n NodeMatrix[n1 + NODE_MASS];\n }\n } else {\n //-- LinLog Attraction\n if (distance > 0)\n factor = (-coefficient * ewc * Math.log(1 + distance)) / distance;\n }\n } else {\n if (options.outboundAttractionDistribution) {\n //-- Linear Attraction Mass Distributed\n // NOTE: Distance is set to 1 to override next condition\n distance = 1;\n factor = (-coefficient * ewc) / NodeMatrix[n1 + NODE_MASS];\n } else {\n //-- Linear Attraction\n // NOTE: Distance is set to 1 to override next condition\n distance = 1;\n factor = -coefficient * ewc;\n }\n }\n }\n\n // Updating nodes' dx and dy\n // TODO: if condition or factor = 1?\n if (distance > 0) {\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n }\n }\n\n // 5) Apply Forces\n //-----------------\n var force, swinging, traction, nodespeed, newX, newY;\n\n // MATH: sqrt and square distances\n if (adjustSizes === true) {\n for (n = 0; n < order; n += PPN) {\n if (NodeMatrix[n + NODE_FIXED] !== 1) {\n force = Math.sqrt(\n Math.pow(NodeMatrix[n + NODE_DX], 2) +\n Math.pow(NodeMatrix[n + NODE_DY], 2)\n );\n\n if (force > MAX_FORCE) {\n NodeMatrix[n + NODE_DX] =\n (NodeMatrix[n + NODE_DX] * MAX_FORCE) / force;\n NodeMatrix[n + NODE_DY] =\n (NodeMatrix[n + NODE_DY] * MAX_FORCE) / force;\n }\n\n swinging =\n NodeMatrix[n + NODE_MASS] *\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY])\n );\n\n traction =\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY])\n ) / 2;\n\n nodespeed = (0.1 * Math.log(1 + traction)) / (1 + Math.sqrt(swinging));\n\n // Updating node's positon\n newX =\n NodeMatrix[n + NODE_X] +\n NodeMatrix[n + NODE_DX] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_X] = newX;\n\n newY =\n NodeMatrix[n + NODE_Y] +\n NodeMatrix[n + NODE_DY] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_Y] = newY;\n }\n }\n } else {\n for (n = 0; n < order; n += PPN) {\n if (NodeMatrix[n + NODE_FIXED] !== 1) {\n swinging =\n NodeMatrix[n + NODE_MASS] *\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY])\n );\n\n traction =\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY])\n ) / 2;\n\n nodespeed =\n (NodeMatrix[n + NODE_CONVERGENCE] * Math.log(1 + traction)) /\n (1 + Math.sqrt(swinging));\n\n // Updating node convergence\n NodeMatrix[n + NODE_CONVERGENCE] = Math.min(\n 1,\n Math.sqrt(\n (nodespeed *\n (Math.pow(NodeMatrix[n + NODE_DX], 2) +\n Math.pow(NodeMatrix[n + NODE_DY], 2))) /\n (1 + Math.sqrt(swinging))\n )\n );\n\n // Updating node's positon\n newX =\n NodeMatrix[n + NODE_X] +\n NodeMatrix[n + NODE_DX] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_X] = newX;\n\n newY =\n NodeMatrix[n + NODE_Y] +\n NodeMatrix[n + NODE_DY] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_Y] = newY;\n }\n }\n }\n\n // We return the information about the layout (no need to return the matrices)\n return {};\n};\n","/**\n * Graphology ForceAtlas2 Helpers\n * ===============================\n *\n * Miscellaneous helper functions.\n */\n\n/**\n * Constants.\n */\nvar PPN = 10;\nvar PPE = 3;\n\n/**\n * Very simple Object.assign-like function.\n *\n * @param {object} target - First object.\n * @param {object} [...objects] - Objects to merge.\n * @return {object}\n */\nexports.assign = function (target) {\n target = target || {};\n\n var objects = Array.prototype.slice.call(arguments).slice(1),\n i,\n k,\n l;\n\n for (i = 0, l = objects.length; i < l; i++) {\n if (!objects[i]) continue;\n\n for (k in objects[i]) target[k] = objects[i][k];\n }\n\n return target;\n};\n\n/**\n * Function used to validate the given settings.\n *\n * @param {object} settings - Settings to validate.\n * @return {object|null}\n */\nexports.validateSettings = function (settings) {\n if ('linLogMode' in settings && typeof settings.linLogMode !== 'boolean')\n return {message: 'the `linLogMode` setting should be a boolean.'};\n\n if (\n 'outboundAttractionDistribution' in settings &&\n typeof settings.outboundAttractionDistribution !== 'boolean'\n )\n return {\n message:\n 'the `outboundAttractionDistribution` setting should be a boolean.'\n };\n\n if ('adjustSizes' in settings && typeof settings.adjustSizes !== 'boolean')\n return {message: 'the `adjustSizes` setting should be a boolean.'};\n\n if (\n 'edgeWeightInfluence' in settings &&\n typeof settings.edgeWeightInfluence !== 'number'\n )\n return {\n message: 'the `edgeWeightInfluence` setting should be a number.'\n };\n\n if (\n 'scalingRatio' in settings &&\n !(typeof settings.scalingRatio === 'number' && settings.scalingRatio >= 0)\n )\n return {message: 'the `scalingRatio` setting should be a number >= 0.'};\n\n if (\n 'strongGravityMode' in settings &&\n typeof settings.strongGravityMode !== 'boolean'\n )\n return {message: 'the `strongGravityMode` setting should be a boolean.'};\n\n if (\n 'gravity' in settings &&\n !(typeof settings.gravity === 'number' && settings.gravity >= 0)\n )\n return {message: 'the `gravity` setting should be a number >= 0.'};\n\n if (\n 'slowDown' in settings &&\n !(typeof settings.slowDown === 'number' || settings.slowDown >= 0)\n )\n return {message: 'the `slowDown` setting should be a number >= 0.'};\n\n if (\n 'barnesHutOptimize' in settings &&\n typeof settings.barnesHutOptimize !== 'boolean'\n )\n return {message: 'the `barnesHutOptimize` setting should be a boolean.'};\n\n if (\n 'barnesHutTheta' in settings &&\n !(\n typeof settings.barnesHutTheta === 'number' &&\n settings.barnesHutTheta >= 0\n )\n )\n return {message: 'the `barnesHutTheta` setting should be a number >= 0.'};\n\n return null;\n};\n\n/**\n * Function generating a flat matrix for both nodes & edges of the given graph.\n *\n * @param {Graph} graph - Target graph.\n * @param {function} getEdgeWeight - Edge weight getter function.\n * @return {object} - Both matrices.\n */\nexports.graphToByteArrays = function (graph, getEdgeWeight) {\n var order = graph.order;\n var size = graph.size;\n var index = {};\n var j;\n\n // NOTE: float32 could lead to issues if edge array needs to index large\n // number of nodes.\n var NodeMatrix = new Float32Array(order * PPN);\n var EdgeMatrix = new Float32Array(size * PPE);\n\n // Iterate through nodes\n j = 0;\n graph.forEachNode(function (node, attr) {\n // Node index\n index[node] = j;\n\n // Populating byte array\n NodeMatrix[j] = attr.x;\n NodeMatrix[j + 1] = attr.y;\n NodeMatrix[j + 2] = 0; // dx\n NodeMatrix[j + 3] = 0; // dy\n NodeMatrix[j + 4] = 0; // old_dx\n NodeMatrix[j + 5] = 0; // old_dy\n NodeMatrix[j + 6] = 1; // mass\n NodeMatrix[j + 7] = 1; // convergence\n NodeMatrix[j + 8] = attr.size || 1;\n NodeMatrix[j + 9] = attr.fixed ? 1 : 0;\n j += PPN;\n });\n\n // Iterate through edges\n j = 0;\n graph.forEachEdge(function (edge, attr, source, target, sa, ta, u) {\n var sj = index[source];\n var tj = index[target];\n\n var weight = getEdgeWeight(edge, attr, source, target, sa, ta, u);\n\n // Incrementing mass to be a node's weighted degree\n NodeMatrix[sj + 6] += weight;\n NodeMatrix[tj + 6] += weight;\n\n // Populating byte array\n EdgeMatrix[j] = sj;\n EdgeMatrix[j + 1] = tj;\n EdgeMatrix[j + 2] = weight;\n j += PPE;\n });\n\n return {\n nodes: NodeMatrix,\n edges: EdgeMatrix\n };\n};\n\n/**\n * Function applying the layout back to the graph.\n *\n * @param {Graph} graph - Target graph.\n * @param {Float32Array} NodeMatrix - Node matrix.\n * @param {function|null} outputReducer - A node reducer.\n */\nexports.assignLayoutChanges = function (graph, NodeMatrix, outputReducer) {\n var i = 0;\n\n graph.updateEachNodeAttributes(function (node, attr) {\n attr.x = NodeMatrix[i];\n attr.y = NodeMatrix[i + 1];\n\n i += PPN;\n\n return outputReducer ? outputReducer(node, attr) : attr;\n });\n};\n\n/**\n * Function reading the positions (only) from the graph, to write them in the matrix.\n *\n * @param {Graph} graph - Target graph.\n * @param {Float32Array} NodeMatrix - Node matrix.\n */\nexports.readGraphPositions = function (graph, NodeMatrix) {\n var i = 0;\n\n graph.forEachNode(function (node, attr) {\n NodeMatrix[i] = attr.x;\n NodeMatrix[i + 1] = attr.y;\n\n i += PPN;\n });\n};\n\n/**\n * Function collecting the layout positions.\n *\n * @param {Graph} graph - Target graph.\n * @param {Float32Array} NodeMatrix - Node matrix.\n * @param {function|null} outputReducer - A nodes reducer.\n * @return {object} - Map to node positions.\n */\nexports.collectLayoutChanges = function (graph, NodeMatrix, outputReducer) {\n var nodes = graph.nodes(),\n positions = {};\n\n for (var i = 0, j = 0, l = NodeMatrix.length; i < l; i += PPN) {\n if (outputReducer) {\n var newAttr = Object.assign({}, graph.getNodeAttributes(nodes[j]));\n newAttr.x = NodeMatrix[i];\n newAttr.y = NodeMatrix[i + 1];\n newAttr = outputReducer(nodes[j], newAttr);\n positions[nodes[j]] = {\n x: newAttr.x,\n y: newAttr.y\n };\n } else {\n positions[nodes[j]] = {\n x: NodeMatrix[i],\n y: NodeMatrix[i + 1]\n };\n }\n\n j++;\n }\n\n return positions;\n};\n\n/**\n * Function returning a web worker from the given function.\n *\n * @param {function} fn - Function for the worker.\n * @return {DOMString}\n */\nexports.createWorker = function createWorker(fn) {\n var xURL = window.URL || window.webkitURL;\n var code = fn.toString();\n var objectUrl = xURL.createObjectURL(\n new Blob(['(' + code + ').call(this);'], {type: 'text/javascript'})\n );\n var worker = new Worker(objectUrl);\n xURL.revokeObjectURL(objectUrl);\n\n return worker;\n};\n","/**\n * Graphology ForceAtlas2 Layout Default Settings\n * ===============================================\n */\nmodule.exports = {\n linLogMode: false,\n outboundAttractionDistribution: false,\n adjustSizes: false,\n edgeWeightInfluence: 1,\n scalingRatio: 1,\n strongGravityMode: false,\n gravity: 1,\n slowDown: 1,\n barnesHutOptimize: false,\n barnesHutTheta: 0.5\n};\n","/**\n * Graphology ForceAtlas2 Layout\n * ==============================\n *\n * Library endpoint.\n */\nvar isGraph = require('graphology-utils/is-graph');\nvar createEdgeWeightGetter =\n require('graphology-utils/getters').createEdgeWeightGetter;\nvar iterate = require('./iterate.js');\nvar helpers = require('./helpers.js');\n\nvar DEFAULT_SETTINGS = require('./defaults.js');\n\n/**\n * Asbtract function used to run a certain number of iterations.\n *\n * @param {boolean} assign - Whether to assign positions.\n * @param {Graph} graph - Target graph.\n * @param {object|number} params - If number, params.iterations, else:\n * @param {function} getWeight - Edge weight getter function.\n * @param {number} iterations - Number of iterations.\n * @param {function|null} outputReducer - A node reducer\n * @param {object} [settings] - Settings.\n * @return {object|undefined}\n */\nfunction abstractSynchronousLayout(assign, graph, params) {\n if (!isGraph(graph))\n throw new Error(\n 'graphology-layout-forceatlas2: the given graph is not a valid graphology instance.'\n );\n\n if (typeof params === 'number') params = {iterations: params};\n\n var iterations = params.iterations;\n\n if (typeof iterations !== 'number')\n throw new Error(\n 'graphology-layout-forceatlas2: invalid number of iterations.'\n );\n\n if (iterations <= 0)\n throw new Error(\n 'graphology-layout-forceatlas2: you should provide a positive number of iterations.'\n );\n\n var getEdgeWeight = createEdgeWeightGetter(\n 'getEdgeWeight' in params ? params.getEdgeWeight : 'weight'\n ).fromEntry;\n\n var outputReducer =\n typeof params.outputReducer === 'function' ? params.outputReducer : null;\n\n // Validating settings\n var settings = helpers.assign({}, DEFAULT_SETTINGS, params.settings);\n var validationError = helpers.validateSettings(settings);\n\n if (validationError)\n throw new Error(\n 'graphology-layout-forceatlas2: ' + validationError.message\n );\n\n // Building matrices\n var matrices = helpers.graphToByteArrays(graph, getEdgeWeight);\n\n var i;\n\n // Iterating\n for (i = 0; i < iterations; i++)\n iterate(settings, matrices.nodes, matrices.edges);\n\n // Applying\n if (assign) {\n helpers.assignLayoutChanges(graph, matrices.nodes, outputReducer);\n return;\n }\n\n return helpers.collectLayoutChanges(graph, matrices.nodes);\n}\n\n/**\n * Function returning sane layout settings for the given graph.\n *\n * @param {Graph|number} graph - Target graph or graph order.\n * @return {object}\n */\nfunction inferSettings(graph) {\n var order = typeof graph === 'number' ? graph : graph.order;\n\n return {\n barnesHutOptimize: order > 2000,\n strongGravityMode: true,\n gravity: 0.05,\n scalingRatio: 10,\n slowDown: 1 + Math.log(order)\n };\n}\n\n/**\n * Exporting.\n */\nvar synchronousLayout = abstractSynchronousLayout.bind(null, false);\nsynchronousLayout.assign = abstractSynchronousLayout.bind(null, true);\nsynchronousLayout.inferSettings = inferSettings;\n\nmodule.exports = synchronousLayout;\n","/**\n * Graphology ForceAtlas2 Layout Webworker\n * ========================================\n *\n * Web worker able to run the layout in a separate thread.\n */\nmodule.exports = function worker() {\n var NODES, EDGES;\n\n var moduleShim = {};\n\n (function () {\n /* eslint no-constant-condition: 0 */\n/**\n * Graphology ForceAtlas2 Iteration\n * =================================\n *\n * Function used to perform a single iteration of the algorithm.\n */\n\n/**\n * Matrices properties accessors.\n */\nvar NODE_X = 0;\nvar NODE_Y = 1;\nvar NODE_DX = 2;\nvar NODE_DY = 3;\nvar NODE_OLD_DX = 4;\nvar NODE_OLD_DY = 5;\nvar NODE_MASS = 6;\nvar NODE_CONVERGENCE = 7;\nvar NODE_SIZE = 8;\nvar NODE_FIXED = 9;\n\nvar EDGE_SOURCE = 0;\nvar EDGE_TARGET = 1;\nvar EDGE_WEIGHT = 2;\n\nvar REGION_NODE = 0;\nvar REGION_CENTER_X = 1;\nvar REGION_CENTER_Y = 2;\nvar REGION_SIZE = 3;\nvar REGION_NEXT_SIBLING = 4;\nvar REGION_FIRST_CHILD = 5;\nvar REGION_MASS = 6;\nvar REGION_MASS_CENTER_X = 7;\nvar REGION_MASS_CENTER_Y = 8;\n\nvar SUBDIVISION_ATTEMPTS = 3;\n\n/**\n * Constants.\n */\nvar PPN = 10;\nvar PPE = 3;\nvar PPR = 9;\n\nvar MAX_FORCE = 10;\n\n/**\n * Function used to perform a single interation of the algorithm.\n *\n * @param {object} options - Layout options.\n * @param {Float32Array} NodeMatrix - Node data.\n * @param {Float32Array} EdgeMatrix - Edge data.\n * @return {object} - Some metadata.\n */\nmoduleShim.exports = function iterate(options, NodeMatrix, EdgeMatrix) {\n // Initializing variables\n var l, r, n, n1, n2, rn, e, w, g, s;\n\n var order = NodeMatrix.length,\n size = EdgeMatrix.length;\n\n var adjustSizes = options.adjustSizes;\n\n var thetaSquared = options.barnesHutTheta * options.barnesHutTheta;\n\n var outboundAttCompensation, coefficient, xDist, yDist, ewc, distance, factor;\n\n var RegionMatrix = [];\n\n // 1) Initializing layout data\n //-----------------------------\n\n // Resetting positions & computing max values\n for (n = 0; n < order; n += PPN) {\n NodeMatrix[n + NODE_OLD_DX] = NodeMatrix[n + NODE_DX];\n NodeMatrix[n + NODE_OLD_DY] = NodeMatrix[n + NODE_DY];\n NodeMatrix[n + NODE_DX] = 0;\n NodeMatrix[n + NODE_DY] = 0;\n }\n\n // If outbound attraction distribution, compensate\n if (options.outboundAttractionDistribution) {\n outboundAttCompensation = 0;\n for (n = 0; n < order; n += PPN) {\n outboundAttCompensation += NodeMatrix[n + NODE_MASS];\n }\n\n outboundAttCompensation /= order / PPN;\n }\n\n // 1.bis) Barnes-Hut computation\n //------------------------------\n\n if (options.barnesHutOptimize) {\n // Setting up\n var minX = Infinity,\n maxX = -Infinity,\n minY = Infinity,\n maxY = -Infinity,\n q,\n q2,\n subdivisionAttempts;\n\n // Computing min and max values\n for (n = 0; n < order; n += PPN) {\n minX = Math.min(minX, NodeMatrix[n + NODE_X]);\n maxX = Math.max(maxX, NodeMatrix[n + NODE_X]);\n minY = Math.min(minY, NodeMatrix[n + NODE_Y]);\n maxY = Math.max(maxY, NodeMatrix[n + NODE_Y]);\n }\n\n // squarify bounds, it's a quadtree\n var dx = maxX - minX,\n dy = maxY - minY;\n if (dx > dy) {\n minY -= (dx - dy) / 2;\n maxY = minY + dx;\n } else {\n minX -= (dy - dx) / 2;\n maxX = minX + dy;\n }\n\n // Build the Barnes Hut root region\n RegionMatrix[0 + REGION_NODE] = -1;\n RegionMatrix[0 + REGION_CENTER_X] = (minX + maxX) / 2;\n RegionMatrix[0 + REGION_CENTER_Y] = (minY + maxY) / 2;\n RegionMatrix[0 + REGION_SIZE] = Math.max(maxX - minX, maxY - minY);\n RegionMatrix[0 + REGION_NEXT_SIBLING] = -1;\n RegionMatrix[0 + REGION_FIRST_CHILD] = -1;\n RegionMatrix[0 + REGION_MASS] = 0;\n RegionMatrix[0 + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[0 + REGION_MASS_CENTER_Y] = 0;\n\n // Add each node in the tree\n l = 1;\n for (n = 0; n < order; n += PPN) {\n // Current region, starting with root\n r = 0;\n subdivisionAttempts = SUBDIVISION_ATTEMPTS;\n\n while (true) {\n // Are there sub-regions?\n\n // We look at first child index\n if (RegionMatrix[r + REGION_FIRST_CHILD] >= 0) {\n // There are sub-regions\n\n // We just iterate to find a \"leaf\" of the tree\n // that is an empty region or a region with a single node\n // (see next case)\n\n // Find the quadrant of n\n if (NodeMatrix[n + NODE_X] < RegionMatrix[r + REGION_CENTER_X]) {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD];\n } else {\n // Bottom Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR;\n }\n } else {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 2;\n } else {\n // Bottom Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 3;\n }\n }\n\n // Update center of mass and mass (we only do it for non-leave regions)\n RegionMatrix[r + REGION_MASS_CENTER_X] =\n (RegionMatrix[r + REGION_MASS_CENTER_X] *\n RegionMatrix[r + REGION_MASS] +\n NodeMatrix[n + NODE_X] * NodeMatrix[n + NODE_MASS]) /\n (RegionMatrix[r + REGION_MASS] + NodeMatrix[n + NODE_MASS]);\n\n RegionMatrix[r + REGION_MASS_CENTER_Y] =\n (RegionMatrix[r + REGION_MASS_CENTER_Y] *\n RegionMatrix[r + REGION_MASS] +\n NodeMatrix[n + NODE_Y] * NodeMatrix[n + NODE_MASS]) /\n (RegionMatrix[r + REGION_MASS] + NodeMatrix[n + NODE_MASS]);\n\n RegionMatrix[r + REGION_MASS] += NodeMatrix[n + NODE_MASS];\n\n // Iterate on the right quadrant\n r = q;\n continue;\n } else {\n // There are no sub-regions: we are in a \"leaf\"\n\n // Is there a node in this leave?\n if (RegionMatrix[r + REGION_NODE] < 0) {\n // There is no node in region:\n // we record node n and go on\n RegionMatrix[r + REGION_NODE] = n;\n break;\n } else {\n // There is a node in this region\n\n // We will need to create sub-regions, stick the two\n // nodes (the old one r[0] and the new one n) in two\n // subregions. If they fall in the same quadrant,\n // we will iterate.\n\n // Create sub-regions\n RegionMatrix[r + REGION_FIRST_CHILD] = l * PPR;\n w = RegionMatrix[r + REGION_SIZE] / 2; // new size (half)\n\n // NOTE: we use screen coordinates\n // from Top Left to Bottom Right\n\n // Top Left sub-region\n g = RegionMatrix[r + REGION_FIRST_CHILD];\n\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] - w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] - w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] = g + PPR;\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n // Bottom Left sub-region\n g += PPR;\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] - w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] + w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] = g + PPR;\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n // Top Right sub-region\n g += PPR;\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] + w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] - w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] = g + PPR;\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n // Bottom Right sub-region\n g += PPR;\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] + w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] + w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] =\n RegionMatrix[r + REGION_NEXT_SIBLING];\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n l += 4;\n\n // Now the goal is to find two different sub-regions\n // for the two nodes: the one previously recorded (r[0])\n // and the one we want to add (n)\n\n // Find the quadrant of the old node\n if (\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_X] <\n RegionMatrix[r + REGION_CENTER_X]\n ) {\n if (\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_Y] <\n RegionMatrix[r + REGION_CENTER_Y]\n ) {\n // Top Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD];\n } else {\n // Bottom Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR;\n }\n } else {\n if (\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_Y] <\n RegionMatrix[r + REGION_CENTER_Y]\n ) {\n // Top Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 2;\n } else {\n // Bottom Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 3;\n }\n }\n\n // We remove r[0] from the region r, add its mass to r and record it in q\n RegionMatrix[r + REGION_MASS] =\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_MASS];\n RegionMatrix[r + REGION_MASS_CENTER_X] =\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_X];\n RegionMatrix[r + REGION_MASS_CENTER_Y] =\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_Y];\n\n RegionMatrix[q + REGION_NODE] = RegionMatrix[r + REGION_NODE];\n RegionMatrix[r + REGION_NODE] = -1;\n\n // Find the quadrant of n\n if (NodeMatrix[n + NODE_X] < RegionMatrix[r + REGION_CENTER_X]) {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Left quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD];\n } else {\n // Bottom Left quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD] + PPR;\n }\n } else {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Right quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 2;\n } else {\n // Bottom Right quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 3;\n }\n }\n\n if (q === q2) {\n // If both nodes are in the same quadrant,\n // we have to try it again on this quadrant\n if (subdivisionAttempts--) {\n r = q;\n continue; // while\n } else {\n // we are out of precision here, and we cannot subdivide anymore\n // but we have to break the loop anyway\n subdivisionAttempts = SUBDIVISION_ATTEMPTS;\n break; // while\n }\n }\n\n // If both quadrants are different, we record n\n // in its quadrant\n RegionMatrix[q2 + REGION_NODE] = n;\n break;\n }\n }\n }\n }\n }\n\n // 2) Repulsion\n //--------------\n // NOTES: adjustSizes = antiCollision & scalingRatio = coefficient\n\n if (options.barnesHutOptimize) {\n coefficient = options.scalingRatio;\n\n // Applying repulsion through regions\n for (n = 0; n < order; n += PPN) {\n // Computing leaf quad nodes iteration\n\n r = 0; // Starting with root region\n while (true) {\n if (RegionMatrix[r + REGION_FIRST_CHILD] >= 0) {\n // The region has sub-regions\n\n // We run the Barnes Hut test to see if we are at the right distance\n distance =\n Math.pow(\n NodeMatrix[n + NODE_X] - RegionMatrix[r + REGION_MASS_CENTER_X],\n 2\n ) +\n Math.pow(\n NodeMatrix[n + NODE_Y] - RegionMatrix[r + REGION_MASS_CENTER_Y],\n 2\n );\n\n s = RegionMatrix[r + REGION_SIZE];\n\n if ((4 * s * s) / distance < thetaSquared) {\n // We treat the region as a single body, and we repulse\n\n xDist =\n NodeMatrix[n + NODE_X] - RegionMatrix[r + REGION_MASS_CENTER_X];\n yDist =\n NodeMatrix[n + NODE_Y] - RegionMatrix[r + REGION_MASS_CENTER_Y];\n\n if (adjustSizes === true) {\n //-- Linear Anti-collision Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n RegionMatrix[r + REGION_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n } else if (distance < 0) {\n factor =\n (-coefficient *\n NodeMatrix[n + NODE_MASS] *\n RegionMatrix[r + REGION_MASS]) /\n Math.sqrt(distance);\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n } else {\n //-- Linear Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n RegionMatrix[r + REGION_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n }\n\n // When this is done, we iterate. We have to look at the next sibling.\n r = RegionMatrix[r + REGION_NEXT_SIBLING];\n if (r < 0) break; // No next sibling: we have finished the tree\n\n continue;\n } else {\n // The region is too close and we have to look at sub-regions\n r = RegionMatrix[r + REGION_FIRST_CHILD];\n continue;\n }\n } else {\n // The region has no sub-region\n // If there is a node r[0] and it is not n, then repulse\n rn = RegionMatrix[r + REGION_NODE];\n\n if (rn >= 0 && rn !== n) {\n xDist = NodeMatrix[n + NODE_X] - NodeMatrix[rn + NODE_X];\n yDist = NodeMatrix[n + NODE_Y] - NodeMatrix[rn + NODE_Y];\n\n distance = xDist * xDist + yDist * yDist;\n\n if (adjustSizes === true) {\n //-- Linear Anti-collision Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n NodeMatrix[rn + NODE_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n } else if (distance < 0) {\n factor =\n (-coefficient *\n NodeMatrix[n + NODE_MASS] *\n NodeMatrix[rn + NODE_MASS]) /\n Math.sqrt(distance);\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n } else {\n //-- Linear Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n NodeMatrix[rn + NODE_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n }\n }\n\n // When this is done, we iterate. We have to look at the next sibling.\n r = RegionMatrix[r + REGION_NEXT_SIBLING];\n\n if (r < 0) break; // No next sibling: we have finished the tree\n\n continue;\n }\n }\n }\n } else {\n coefficient = options.scalingRatio;\n\n // Square iteration\n for (n1 = 0; n1 < order; n1 += PPN) {\n for (n2 = 0; n2 < n1; n2 += PPN) {\n // Common to both methods\n xDist = NodeMatrix[n1 + NODE_X] - NodeMatrix[n2 + NODE_X];\n yDist = NodeMatrix[n1 + NODE_Y] - NodeMatrix[n2 + NODE_Y];\n\n if (adjustSizes === true) {\n //-- Anticollision Linear Repulsion\n distance =\n Math.sqrt(xDist * xDist + yDist * yDist) -\n NodeMatrix[n1 + NODE_SIZE] -\n NodeMatrix[n2 + NODE_SIZE];\n\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n1 + NODE_MASS] *\n NodeMatrix[n2 + NODE_MASS]) /\n distance /\n distance;\n\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n } else if (distance < 0) {\n factor =\n 100 *\n coefficient *\n NodeMatrix[n1 + NODE_MASS] *\n NodeMatrix[n2 + NODE_MASS];\n\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n }\n } else {\n //-- Linear Repulsion\n distance = Math.sqrt(xDist * xDist + yDist * yDist);\n\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n1 + NODE_MASS] *\n NodeMatrix[n2 + NODE_MASS]) /\n distance /\n distance;\n\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n }\n }\n }\n }\n }\n\n // 3) Gravity\n //------------\n g = options.gravity / options.scalingRatio;\n coefficient = options.scalingRatio;\n for (n = 0; n < order; n += PPN) {\n factor = 0;\n\n // Common to both methods\n xDist = NodeMatrix[n + NODE_X];\n yDist = NodeMatrix[n + NODE_Y];\n distance = Math.sqrt(Math.pow(xDist, 2) + Math.pow(yDist, 2));\n\n if (options.strongGravityMode) {\n //-- Strong gravity\n if (distance > 0) factor = coefficient * NodeMatrix[n + NODE_MASS] * g;\n } else {\n //-- Linear Anti-collision Repulsion n\n if (distance > 0)\n factor = (coefficient * NodeMatrix[n + NODE_MASS] * g) / distance;\n }\n\n // Updating node's dx and dy\n NodeMatrix[n + NODE_DX] -= xDist * factor;\n NodeMatrix[n + NODE_DY] -= yDist * factor;\n }\n\n // 4) Attraction\n //---------------\n coefficient =\n 1 * (options.outboundAttractionDistribution ? outboundAttCompensation : 1);\n\n // TODO: simplify distance\n // TODO: coefficient is always used as -c --> optimize?\n for (e = 0; e < size; e += PPE) {\n n1 = EdgeMatrix[e + EDGE_SOURCE];\n n2 = EdgeMatrix[e + EDGE_TARGET];\n w = EdgeMatrix[e + EDGE_WEIGHT];\n\n // Edge weight influence\n ewc = Math.pow(w, options.edgeWeightInfluence);\n\n // Common measures\n xDist = NodeMatrix[n1 + NODE_X] - NodeMatrix[n2 + NODE_X];\n yDist = NodeMatrix[n1 + NODE_Y] - NodeMatrix[n2 + NODE_Y];\n\n // Applying attraction to nodes\n if (adjustSizes === true) {\n distance =\n Math.sqrt(xDist * xDist + yDist * yDist) -\n NodeMatrix[n1 + NODE_SIZE] -\n NodeMatrix[n2 + NODE_SIZE];\n\n if (options.linLogMode) {\n if (options.outboundAttractionDistribution) {\n //-- LinLog Degree Distributed Anti-collision Attraction\n if (distance > 0) {\n factor =\n (-coefficient * ewc * Math.log(1 + distance)) /\n distance /\n NodeMatrix[n1 + NODE_MASS];\n }\n } else {\n //-- LinLog Anti-collision Attraction\n if (distance > 0) {\n factor = (-coefficient * ewc * Math.log(1 + distance)) / distance;\n }\n }\n } else {\n if (options.outboundAttractionDistribution) {\n //-- Linear Degree Distributed Anti-collision Attraction\n if (distance > 0) {\n factor = (-coefficient * ewc) / NodeMatrix[n1 + NODE_MASS];\n }\n } else {\n //-- Linear Anti-collision Attraction\n if (distance > 0) {\n factor = -coefficient * ewc;\n }\n }\n }\n } else {\n distance = Math.sqrt(Math.pow(xDist, 2) + Math.pow(yDist, 2));\n\n if (options.linLogMode) {\n if (options.outboundAttractionDistribution) {\n //-- LinLog Degree Distributed Attraction\n if (distance > 0) {\n factor =\n (-coefficient * ewc * Math.log(1 + distance)) /\n distance /\n NodeMatrix[n1 + NODE_MASS];\n }\n } else {\n //-- LinLog Attraction\n if (distance > 0)\n factor = (-coefficient * ewc * Math.log(1 + distance)) / distance;\n }\n } else {\n if (options.outboundAttractionDistribution) {\n //-- Linear Attraction Mass Distributed\n // NOTE: Distance is set to 1 to override next condition\n distance = 1;\n factor = (-coefficient * ewc) / NodeMatrix[n1 + NODE_MASS];\n } else {\n //-- Linear Attraction\n // NOTE: Distance is set to 1 to override next condition\n distance = 1;\n factor = -coefficient * ewc;\n }\n }\n }\n\n // Updating nodes' dx and dy\n // TODO: if condition or factor = 1?\n if (distance > 0) {\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n }\n }\n\n // 5) Apply Forces\n //-----------------\n var force, swinging, traction, nodespeed, newX, newY;\n\n // MATH: sqrt and square distances\n if (adjustSizes === true) {\n for (n = 0; n < order; n += PPN) {\n if (NodeMatrix[n + NODE_FIXED] !== 1) {\n force = Math.sqrt(\n Math.pow(NodeMatrix[n + NODE_DX], 2) +\n Math.pow(NodeMatrix[n + NODE_DY], 2)\n );\n\n if (force > MAX_FORCE) {\n NodeMatrix[n + NODE_DX] =\n (NodeMatrix[n + NODE_DX] * MAX_FORCE) / force;\n NodeMatrix[n + NODE_DY] =\n (NodeMatrix[n + NODE_DY] * MAX_FORCE) / force;\n }\n\n swinging =\n NodeMatrix[n + NODE_MASS] *\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY])\n );\n\n traction =\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY])\n ) / 2;\n\n nodespeed = (0.1 * Math.log(1 + traction)) / (1 + Math.sqrt(swinging));\n\n // Updating node's positon\n newX =\n NodeMatrix[n + NODE_X] +\n NodeMatrix[n + NODE_DX] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_X] = newX;\n\n newY =\n NodeMatrix[n + NODE_Y] +\n NodeMatrix[n + NODE_DY] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_Y] = newY;\n }\n }\n } else {\n for (n = 0; n < order; n += PPN) {\n if (NodeMatrix[n + NODE_FIXED] !== 1) {\n swinging =\n NodeMatrix[n + NODE_MASS] *\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY])\n );\n\n traction =\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY])\n ) / 2;\n\n nodespeed =\n (NodeMatrix[n + NODE_CONVERGENCE] * Math.log(1 + traction)) /\n (1 + Math.sqrt(swinging));\n\n // Updating node convergence\n NodeMatrix[n + NODE_CONVERGENCE] = Math.min(\n 1,\n Math.sqrt(\n (nodespeed *\n (Math.pow(NodeMatrix[n + NODE_DX], 2) +\n Math.pow(NodeMatrix[n + NODE_DY], 2))) /\n (1 + Math.sqrt(swinging))\n )\n );\n\n // Updating node's positon\n newX =\n NodeMatrix[n + NODE_X] +\n NodeMatrix[n + NODE_DX] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_X] = newX;\n\n newY =\n NodeMatrix[n + NODE_Y] +\n NodeMatrix[n + NODE_DY] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_Y] = newY;\n }\n }\n }\n\n // We return the information about the layout (no need to return the matrices)\n return {};\n};\n\n })();\n\n var iterate = moduleShim.exports;\n\n self.addEventListener('message', function (event) {\n var data = event.data;\n\n NODES = new Float32Array(data.nodes);\n\n if (data.edges) EDGES = new Float32Array(data.edges);\n\n // Running the iteration\n iterate(data.settings, NODES, EDGES);\n\n // Sending result to supervisor\n self.postMessage(\n {\n nodes: NODES.buffer\n },\n [NODES.buffer]\n );\n });\n};\n\n","/**\n * Graphology ForceAtlas2 Layout Supervisor\n * =========================================\n *\n * Supervisor class able to spawn a web worker to run the FA2 layout in a\n * separate thread not to block UI with heavy synchronous computations.\n */\nvar workerFunction = require('./webworker.js');\nvar isGraph = require('graphology-utils/is-graph');\nvar createEdgeWeightGetter =\n require('graphology-utils/getters').createEdgeWeightGetter;\nvar helpers = require('./helpers.js');\n\nvar DEFAULT_SETTINGS = require('./defaults.js');\n\n/**\n * Class representing a FA2 layout run by a webworker.\n *\n * @constructor\n * @param {Graph} graph - Target graph.\n * @param {object|number} params - Parameters:\n * @param {object} [settings] - Settings.\n */\nfunction FA2LayoutSupervisor(graph, params) {\n params = params || {};\n\n // Validation\n if (!isGraph(graph))\n throw new Error(\n 'graphology-layout-forceatlas2/worker: the given graph is not a valid graphology instance.'\n );\n\n var getEdgeWeight = createEdgeWeightGetter(\n 'getEdgeWeight' in params ? params.getEdgeWeight : 'weight'\n ).fromEntry;\n\n // Validating settings\n var settings = helpers.assign({}, DEFAULT_SETTINGS, params.settings);\n var validationError = helpers.validateSettings(settings);\n\n if (validationError)\n throw new Error(\n 'graphology-layout-forceatlas2/worker: ' + validationError.message\n );\n\n // Properties\n this.worker = null;\n this.graph = graph;\n this.settings = settings;\n this.getEdgeWeight = getEdgeWeight;\n this.matrices = null;\n this.running = false;\n this.killed = false;\n this.outputReducer =\n typeof params.outputReducer === 'function' ? params.outputReducer : null;\n\n // Binding listeners\n this.handleMessage = this.handleMessage.bind(this);\n\n var respawnFrame = undefined;\n var self = this;\n\n this.handleGraphUpdate = function () {\n if (self.worker) self.worker.terminate();\n\n if (respawnFrame) clearTimeout(respawnFrame);\n\n respawnFrame = setTimeout(function () {\n respawnFrame = undefined;\n self.spawnWorker();\n }, 0);\n };\n\n graph.on('nodeAdded', this.handleGraphUpdate);\n graph.on('edgeAdded', this.handleGraphUpdate);\n graph.on('nodeDropped', this.handleGraphUpdate);\n graph.on('edgeDropped', this.handleGraphUpdate);\n\n // Spawning worker\n this.spawnWorker();\n}\n\nFA2LayoutSupervisor.prototype.isRunning = function () {\n return this.running;\n};\n\n/**\n * Internal method used to spawn the web worker.\n */\nFA2LayoutSupervisor.prototype.spawnWorker = function () {\n if (this.worker) this.worker.terminate();\n\n this.worker = helpers.createWorker(workerFunction);\n this.worker.addEventListener('message', this.handleMessage);\n\n if (this.running) {\n this.running = false;\n this.start();\n }\n};\n\n/**\n * Internal method used to handle the worker's messages.\n *\n * @param {object} event - Event to handle.\n */\nFA2LayoutSupervisor.prototype.handleMessage = function (event) {\n if (!this.running) return;\n\n var matrix = new Float32Array(event.data.nodes);\n\n helpers.assignLayoutChanges(this.graph, matrix, this.outputReducer);\n if (this.outputReducer) helpers.readGraphPositions(this.graph, matrix);\n this.matrices.nodes = matrix;\n\n // Looping\n this.askForIterations();\n};\n\n/**\n * Internal method used to ask for iterations from the worker.\n *\n * @param {boolean} withEdges - Should we send edges along?\n * @return {FA2LayoutSupervisor}\n */\nFA2LayoutSupervisor.prototype.askForIterations = function (withEdges) {\n var matrices = this.matrices;\n\n var payload = {\n settings: this.settings,\n nodes: matrices.nodes.buffer\n };\n\n var buffers = [matrices.nodes.buffer];\n\n if (withEdges) {\n payload.edges = matrices.edges.buffer;\n buffers.push(matrices.edges.buffer);\n }\n\n this.worker.postMessage(payload, buffers);\n\n return this;\n};\n\n/**\n * Method used to start the layout.\n *\n * @return {FA2LayoutSupervisor}\n */\nFA2LayoutSupervisor.prototype.start = function () {\n if (this.killed)\n throw new Error(\n 'graphology-layout-forceatlas2/worker.start: layout was killed.'\n );\n\n if (this.running) return this;\n\n // Building matrices\n this.matrices = helpers.graphToByteArrays(this.graph, this.getEdgeWeight);\n\n this.running = true;\n this.askForIterations(true);\n\n return this;\n};\n\n/**\n * Method used to stop the layout.\n *\n * @return {FA2LayoutSupervisor}\n */\nFA2LayoutSupervisor.prototype.stop = function () {\n this.running = false;\n\n return this;\n};\n\n/**\n * Method used to kill the layout.\n *\n * @return {FA2LayoutSupervisor}\n */\nFA2LayoutSupervisor.prototype.kill = function () {\n if (this.killed) return this;\n\n this.running = false;\n this.killed = true;\n\n // Clearing memory\n this.matrices = null;\n\n // Terminating worker\n this.worker.terminate();\n\n // Unbinding listeners\n this.graph.removeListener('nodeAdded', this.handleGraphUpdate);\n this.graph.removeListener('edgeAdded', this.handleGraphUpdate);\n this.graph.removeListener('nodeDropped', this.handleGraphUpdate);\n this.graph.removeListener('edgeDropped', this.handleGraphUpdate);\n};\n\n/**\n * Exporting.\n */\nmodule.exports = FA2LayoutSupervisor;\n","import{useLayoutFactory as t,useWorkerLayoutFactory as o,WorkerLayoutControl as r}from\"@react-sigma/layout-core\";import a from\"graphology-layout-forceatlas2\";import e from\"graphology-layout-forceatlas2/worker\";import l from\"react\";function s(o={iterations:100}){return t(a,o)}function n(t={}){return o(e,t)}const c=({id:t,className:o,style:a,settings:e={},autoRunFor:s,children:c,labels:i})=>{const u={id:t,className:o,style:a,autoRunFor:s,labels:i,layout:n(e)};return l.createElement(r,Object.assign({},u),c)};export{c as LayoutForceAtlas2Control,s as useLayoutForceAtlas2,n as useWorkerLayoutForceAtlas2};\n//# sourceMappingURL=react-sigma_layout-forceatlas2.esm.min.js.map\n","/*\n * Copyright 2026 OpenTrace Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type Sigma from 'sigma';\n\n/**\n * Zoom the sigma camera to fit a set of node IDs.\n * Replaces `fgRef.current.zoomToFit(duration, padding, predicate)`.\n */\nexport function zoomToNodes(\n sigma: Sigma,\n nodeIds: Iterable<string>,\n duration = 600,\n padding = 0.1,\n): void {\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n let count = 0;\n\n for (const id of nodeIds) {\n const data = sigma.getNodeDisplayData(id);\n if (!data) continue;\n minX = Math.min(minX, data.x);\n maxX = Math.max(maxX, data.x);\n minY = Math.min(minY, data.y);\n maxY = Math.max(maxY, data.y);\n count++;\n }\n\n if (count === 0) return;\n\n const camera = sigma.getCamera();\n\n // Single node — just center on it\n if (count === 1 || (maxX - minX < 1 && maxY - minY < 1)) {\n camera.animate(\n { x: (minX + maxX) / 2, y: (minY + maxY) / 2, ratio: 0.1 },\n { duration },\n );\n return;\n }\n\n // Compute bounding box center and ratio\n const cx = (minX + maxX) / 2;\n const cy = (minY + maxY) / 2;\n\n // Get the container dimensions\n const { width, height } = sigma.getDimensions();\n const graphWidth = maxX - minX;\n const graphHeight = maxY - minY;\n\n // Calculate ratio to fit the bounding box with padding\n const ratioX = graphWidth / (width * (1 - padding * 2));\n const ratioY = graphHeight / (height * (1 - padding * 2));\n const ratio = Math.max(ratioX, ratioY, 0.01);\n\n camera.animate({ x: cx, y: cy, ratio }, { duration });\n}\n\n/**\n * Zoom the camera to fit all nodes in the graph.\n *\n * Sigma normalizes all graph coordinates to [0,1] space internally.\n * Camera state {x: 0.5, y: 0.5, ratio: 1} centers on the full extent —\n * equivalent to a \"reset\" that shows everything.\n */\nexport function zoomToFit(sigma: Sigma, duration = 400): void {\n const camera = sigma.getCamera();\n camera.animate({ x: 0.5, y: 0.5, ratio: 1 }, { duration });\n}\n","/*\n * Copyright 2026 OpenTrace Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useSigma } from '@react-sigma/core';\nimport { useWorkerLayoutForceAtlas2 } from '@react-sigma/layout-forceatlas2';\nimport { zoomToFit } from '../sigma/zoomToNodes';\nimport type { LayoutConfig } from './types';\nimport type {\n SpacingNode,\n SpacingRequest,\n SpacingResponse,\n} from './spacingWorker';\n\ninterface LayoutPipelineProps {\n layoutReady: boolean;\n layoutConfig: LayoutConfig;\n optimizeTick: number;\n /** Community assignments for size-aware community spacing */\n communityAssignments?: Record<string, number>;\n /** Called with the current optimize status for UI display */\n onOptimizeStatus?: (status: OptimizeStatus | null) => void;\n}\n\nexport interface OptimizeStatus {\n phase: 'fa2' | 'noverlap' | 'spacing' | 'optimizing' | 'done';\n iteration?: number;\n cleanRatio?: number;\n totalOverlaps?: number;\n}\n\n/**\n * Renderless component that orchestrates the layout pipeline inside a\n * `<SigmaContainer>`. Requires `useSigma()` context.\n *\n * Pipeline: ForceAtlas2 → Noverlap → Optimize → Zoom-to-fit\n * Optimize button: re-runs FA2 → Noverlap → Optimize\n */\nexport default function LayoutPipeline({\n layoutReady,\n layoutConfig,\n optimizeTick,\n communityAssignments,\n onOptimizeStatus,\n}: LayoutPipelineProps) {\n const sigma = useSigma();\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const spacingWorkerRef = useRef<Worker | null>(null);\n const perCommunityNoverlapCancel = useRef<(() => void) | null>(null);\n\n const { start, stop } = useWorkerLayoutForceAtlas2({\n settings: {\n gravity: layoutConfig.fa2Gravity,\n scalingRatio: layoutConfig.fa2ScalingRatio,\n slowDown: layoutConfig.fa2SlowDown,\n barnesHutOptimize:\n sigma.getGraph().order > layoutConfig.fa2BarnesHutThreshold,\n barnesHutTheta: layoutConfig.fa2BarnesHutTheta,\n strongGravityMode: layoutConfig.fa2StrongGravity,\n linLogMode: layoutConfig.fa2LinLogMode,\n outboundAttractionDistribution: layoutConfig.fa2OutboundAttraction,\n adjustSizes: layoutConfig.fa2AdjustSizes,\n },\n });\n\n // ─── Cleanup helpers ─────────────────────────────────────────────\n\n function cleanup() {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n if (spacingWorkerRef.current) {\n spacingWorkerRef.current.terminate();\n spacingWorkerRef.current = null;\n }\n perCommunityNoverlapCancel.current?.();\n perCommunityNoverlapCancel.current = null;\n stop();\n }\n\n // ─── Community spacing step ───────────────────────────────────────\n // Runs in a Web Worker. Iteratively pushes community centroids apart\n // from each other. Posts position updates after each iteration so the\n // graph updates live. Runs BEFORE FA2.\n\n function runSpacing(onDone: () => void) {\n const graph = sigma.getGraph();\n if (graph.order === 0 || !communityAssignments) {\n onDone();\n return;\n }\n\n onOptimizeStatus?.({ phase: 'spacing' });\n\n const nodes: SpacingNode[] = [];\n graph.forEachNode((id, attrs) => {\n const cid = communityAssignments[id];\n if (cid === undefined) return;\n nodes.push({\n id,\n x: attrs.x as number,\n y: attrs.y as number,\n communityId: cid,\n });\n });\n\n const worker = new Worker(new URL('./spacingWorker.ts', import.meta.url), {\n type: 'module',\n });\n spacingWorkerRef.current = worker;\n\n worker.onmessage = (e: MessageEvent<SpacingResponse>) => {\n const msg = e.data;\n\n if (msg.type === 'progress') {\n if (msg.updates.length > 0) {\n const posMap = new Map<string, { x: number; y: number }>();\n for (const u of msg.updates) posMap.set(u.id, { x: u.x, y: u.y });\n graph.updateEachNodeAttributes((id, attrs) => {\n const pos = posMap.get(id);\n if (pos) {\n attrs.x = pos.x;\n attrs.y = pos.y;\n }\n return attrs;\n });\n }\n\n onOptimizeStatus?.({\n phase: 'spacing',\n iteration: msg.iteration,\n cleanRatio: 1 - msg.maxOverlap,\n });\n\n if (process.env.NODE_ENV === 'development') {\n console.log(\n `%c[spacing]%c iter ${msg.iteration}: overlap ${(msg.maxOverlap * 100).toFixed(0)}%, ${msg.updates.length} nodes moved`,\n 'color: #fbbf24; font-weight: bold',\n 'color: inherit',\n );\n }\n } else if (msg.type === 'done') {\n if (process.env.NODE_ENV === 'development') {\n console.log(\n `%c[spacing]%c done: ${msg.iterations} iters, ${(msg.maxOverlap * 100).toFixed(0)}% max overlap in ${msg.totalMs.toFixed(0)}ms`,\n 'color: #fbbf24; font-weight: bold',\n 'color: inherit',\n );\n }\n worker.terminate();\n spacingWorkerRef.current = null;\n onDone();\n }\n };\n\n worker.onerror = () => {\n worker.terminate();\n spacingWorkerRef.current = null;\n onDone();\n };\n\n worker.postMessage({\n nodes,\n radiusScale: 40,\n gap: 100,\n maxIterations: 50,\n overlapThreshold: 0.05,\n } satisfies SpacingRequest);\n }\n\n /** Compute scale factor to convert screen-pixel sizes to graph-coordinate sizes. */\n function getGraphScaleFactor(): number {\n const graph = sigma.getGraph();\n let minX = Infinity,\n maxX = -Infinity,\n minY = Infinity,\n maxY = -Infinity;\n graph.forEachNode((_, attrs) => {\n const x = attrs.x as number;\n const y = attrs.y as number;\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n });\n return Math.max(maxX - minX, maxY - minY, 1) / 4000;\n }\n\n // ─── Per-community noverlap ─────────────────────────────────────\n // Runs noverlap within each community separately so nodes spread\n // out without drifting across community boundaries. Uses\n // requestIdleCallback to yield between communities.\n\n function runPerCommunityNoverlap(onDone: () => void) {\n const graph = sigma.getGraph();\n if (graph.order === 0 || !communityAssignments) {\n onDone();\n return;\n }\n\n const scale = getGraphScaleFactor();\n\n // Group node IDs by community\n const groups = new Map<number, string[]>();\n graph.forEachNode((id) => {\n const cid = communityAssignments[id];\n if (cid === undefined) return;\n let list = groups.get(cid);\n if (!list) {\n list = [];\n groups.set(cid, list);\n }\n list.push(id);\n });\n\n // Sort largest first for most visual impact early\n const sorted = [...groups.entries()].sort(\n (a, b) => b[1].length - a[1].length,\n );\n\n // Max inline community size — larger communities are skipped (spacing handles them)\n const MAX_INLINE = 500;\n\n let idx = 0;\n let totalMoved = 0;\n let cancelled = false;\n let pendingCallbackId: number | ReturnType<typeof setTimeout> | null = null;\n perCommunityNoverlapCancel.current = () => {\n cancelled = true;\n if (pendingCallbackId !== null) {\n if (typeof cancelIdleCallback === 'function') {\n cancelIdleCallback(pendingCallbackId as number);\n } else {\n clearTimeout(pendingCallbackId);\n }\n pendingCallbackId = null;\n }\n };\n\n function processNext() {\n if (cancelled || idx >= sorted.length) {\n if (process.env.NODE_ENV === 'development') {\n console.log(\n `%c[noverlap]%c per-community done: ${sorted.length} communities, ${totalMoved} nodes moved${cancelled ? ' (cancelled)' : ''}`,\n 'color: #4ade80; font-weight: bold',\n 'color: inherit',\n );\n }\n perCommunityNoverlapCancel.current = null;\n if (!cancelled) onDone();\n return;\n }\n\n const [, nodeIds] = sorted[idx++];\n\n // Skip tiny or too-large communities\n if (nodeIds.length < 3 || nodeIds.length > MAX_INLINE) {\n scheduleNext();\n return;\n }\n\n // Build position map for this community's nodes\n const subGraph = new Map<\n string,\n { x: number; y: number; size: number }\n >();\n for (const nid of nodeIds) {\n const attrs = graph.getNodeAttributes(nid);\n subGraph.set(nid, {\n x: attrs.x as number,\n y: attrs.y as number,\n size: ((attrs.size as number) ?? 3) * scale,\n });\n }\n\n // Simple iterative push-apart within this community (10 iterations)\n const margin = layoutConfig.noverlapMargin * scale;\n const nodeArr = [...subGraph.entries()];\n for (let iter = 0; iter < 10; iter++) {\n for (let i = 0; i < nodeArr.length; i++) {\n const [, a] = nodeArr[i];\n for (let j = i + 1; j < nodeArr.length; j++) {\n const [, b] = nodeArr[j];\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const minDist = a.size + b.size + margin;\n if (dist < minDist && dist > 0.001) {\n const push = (minDist - dist) * 0.5;\n const nx = dx / dist;\n const ny = dy / dist;\n a.x -= nx * push;\n a.y -= ny * push;\n b.x += nx * push;\n b.y += ny * push;\n }\n }\n }\n }\n\n // Write back\n let moved = 0;\n for (const [nid, pos] of subGraph) {\n const attrs = graph.getNodeAttributes(nid);\n if (\n Math.abs(pos.x - (attrs.x as number)) > 0.1 ||\n Math.abs(pos.y - (attrs.y as number)) > 0.1\n ) {\n graph.mergeNodeAttributes(nid, { x: pos.x, y: pos.y });\n moved++;\n }\n }\n totalMoved += moved;\n\n scheduleNext();\n }\n\n function scheduleNext() {\n if (typeof requestIdleCallback === 'function') {\n pendingCallbackId = requestIdleCallback(processNext, { timeout: 50 });\n } else {\n pendingCallbackId = setTimeout(processNext, 0);\n }\n }\n\n processNext();\n }\n\n // ─── Main effect ─────────────────────────────────────────────────\n\n useEffect(() => {\n if (!layoutReady) return;\n\n cleanup();\n\n const sigmaInstance = sigma as unknown as import('sigma').Sigma;\n const graph = sigma.getGraph();\n\n // Pipeline: Spacing → FA2 → Per-community noverlap → Spacing → FA2 (soften) → Zoom\n runSpacing(() => {\n zoomToFit(sigmaInstance, 0);\n\n const runFA2 = (duration: number, onDone: () => void) => {\n if (layoutConfig.fa2Enabled && graph.order > 0) {\n onOptimizeStatus?.({ phase: 'fa2' });\n start();\n timerRef.current = setTimeout(() => {\n stop();\n onDone();\n }, duration);\n } else {\n onDone();\n }\n };\n\n // Step 2: Initial FA2 — establish edge-based structure\n runFA2(layoutConfig.fa2Duration, () => {\n // Step 3: Per-community noverlap — spread stacked nodes\n onOptimizeStatus?.({ phase: 'noverlap' });\n runPerCommunityNoverlap(() => {\n // Step 4: Re-space communities after noverlap expanded them\n runSpacing(() => {\n // Step 5: Short FA2 pass — soften edges after spacing/noverlap moved things\n runFA2(Math.min(layoutConfig.fa2Duration, 1500), () => {\n zoomToFit(sigmaInstance, 600);\n onOptimizeStatus?.(null);\n });\n });\n });\n });\n });\n\n return cleanup;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [layoutReady, optimizeTick, layoutConfig, start, stop, sigma]);\n\n return null;\n}\n","/*\n * Copyright 2026 OpenTrace Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Custom node hover renderer for Sigma.\n *\n * Theme-aware: reads --popover / --popover-foreground CSS variables.\n * Shows the node label + community name in the tooltip.\n */\nimport type { Attributes } from 'graphology-types';\nimport type { NodeDisplayData } from 'sigma/types';\nimport type { Settings } from 'sigma/settings';\n\ntype PartialButFor<T, K extends keyof T> = Pick<T, K> & Partial<T>;\n\n// ─── Theme color cache ──────────────────────────────────────────────\n\ninterface ThemeColors {\n bg: string;\n fg: string;\n muted: string;\n key: string;\n}\n\nlet cached: ThemeColors | null = null;\n\nfunction resolveThemeColors(): ThemeColors {\n const root = document.documentElement;\n const key = `${root.dataset.theme ?? ''}_${root.dataset.mode ?? ''}`;\n if (cached && cached.key === key) return cached;\n\n const style = getComputedStyle(root);\n cached = {\n bg: style.getPropertyValue('--popover').trim() || '#1e293b',\n fg: style.getPropertyValue('--popover-foreground').trim() || '#e2e8f0',\n muted: style.getPropertyValue('--muted-foreground').trim() || '#94a3b8',\n key,\n };\n return cached;\n}\n\n// ─── Hover renderer ─────────────────────────────────────────────────\n\nexport function drawNodeHover<\n N extends Attributes = Attributes,\n E extends Attributes = Attributes,\n G extends Attributes = Attributes,\n>(\n context: CanvasRenderingContext2D,\n data: PartialButFor<NodeDisplayData, 'x' | 'y' | 'size' | 'label' | 'color'>,\n settings: Settings<N, E, G>,\n): void {\n const size = settings.labelSize;\n const font = settings.labelFont;\n const weight = settings.labelWeight;\n const colors = resolveThemeColors();\n const PADDING = 4;\n\n const label = typeof data.label === 'string' ? data.label : '';\n const extras = data as Record<string, unknown>;\n const nodeType = extras.nodeType as string | undefined;\n const communityName = extras._communityName as string | undefined;\n const subtitle = [nodeType, communityName].filter(Boolean).join(' · ');\n\n context.font = `${weight} ${size}px ${font}`;\n\n // Measure text\n const labelWidth = label ? context.measureText(label).width : 0;\n\n let subtitleWidth = 0;\n const smallSize = Math.round(size * 0.8);\n if (subtitle) {\n context.font = `${smallSize}px ${font}`;\n subtitleWidth = context.measureText(subtitle).width;\n }\n\n const textWidth = Math.max(labelWidth, subtitleWidth);\n\n if (textWidth === 0 && !subtitle) {\n // No label — just draw the node circle highlight\n context.beginPath();\n context.arc(data.x, data.y, data.size + PADDING, 0, Math.PI * 2);\n context.closePath();\n context.fillStyle = colors.bg;\n context.shadowBlur = 10;\n context.shadowColor = 'rgba(0,0,0,0.5)';\n context.fill();\n context.shadowBlur = 0;\n\n // Node circle\n context.beginPath();\n context.arc(data.x, data.y, data.size, 0, Math.PI * 2);\n context.closePath();\n context.fillStyle = data.color;\n context.fill();\n return;\n }\n\n // Box dimensions\n const boxWidth = Math.round(textWidth + 8);\n const lineHeight = size + 2;\n const lines = subtitle ? 2 : 1;\n const boxHeight = Math.round(lineHeight * lines + PADDING * 2);\n const nodeRadius = Math.max(data.size, size / 2) + PADDING;\n\n // Draw background box (capsule shape attached to node circle)\n const angleRadian = Math.asin(Math.min(1, boxHeight / 2 / nodeRadius));\n const xDelta = Math.sqrt(\n Math.abs(Math.pow(nodeRadius, 2) - Math.pow(boxHeight / 2, 2)),\n );\n\n context.fillStyle = colors.bg;\n context.shadowOffsetX = 0;\n context.shadowOffsetY = 2;\n context.shadowBlur = 10;\n context.shadowColor = 'rgba(0,0,0,0.5)';\n\n context.beginPath();\n context.moveTo(data.x + xDelta, data.y + boxHeight / 2);\n context.lineTo(data.x + nodeRadius + boxWidth, data.y + boxHeight / 2);\n context.lineTo(data.x + nodeRadius + boxWidth, data.y - boxHeight / 2);\n context.lineTo(data.x + xDelta, data.y - boxHeight / 2);\n context.arc(data.x, data.y, nodeRadius, angleRadian, -angleRadian);\n context.closePath();\n context.fill();\n\n // Reset shadow\n context.shadowOffsetX = 0;\n context.shadowOffsetY = 0;\n context.shadowBlur = 0;\n\n // Draw label text\n const textX = data.x + nodeRadius + 4;\n if (label) {\n context.fillStyle = colors.fg;\n context.font = `${weight} ${size}px ${font}`;\n context.fillText(label, textX, data.y + (subtitle ? -1 : size / 3));\n }\n\n // Draw subtitle (type · community, smaller, muted)\n if (subtitle) {\n context.fillStyle = colors.muted;\n context.font = `${smallSize}px ${font}`;\n context.fillText(subtitle, textX, data.y + lineHeight - 2);\n }\n\n // Draw node circle on top\n context.beginPath();\n context.arc(data.x, data.y, data.size, 0, Math.PI * 2);\n context.closePath();\n context.fillStyle = data.color;\n context.fill();\n}\n","/*\n * Copyright 2026 OpenTrace Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n forwardRef,\n memo,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { SigmaContainer, useSigma } from '@react-sigma/core';\nimport { EdgeCurvedArrowProgram } from '@sigma/edge-curve';\nimport { EdgeLineProgram } from 'sigma/rendering';\nimport '@react-sigma/core/lib/style.css';\n\nimport type { GraphNode, GraphLink, SelectedEdge } from './types/graph';\nimport type { LayoutConfig, FilterState, VisualState } from './graph/types';\nimport { useGraphInstance } from './graph/useGraphInstance';\nimport { useGraphFilters } from './graph/useGraphFilters';\nimport { useGraphVisuals } from './graph/useGraphVisuals';\nimport { useCommunities } from './graph/useCommunities';\nimport { useHighlights } from './graph/useHighlights';\nimport LayoutPipeline, { type OptimizeStatus } from './graph/LayoutPipeline';\nimport { drawNodeHover } from './graph/drawNodeHover';\nimport { zoomToNodes, zoomToFit } from './sigma/zoomToNodes';\nimport {\n ZOOM_SIZE_EXPONENT,\n EDGE_PROGRAM_THRESHOLD,\n LABEL_RENDERED_SIZE_THRESHOLD,\n LABEL_SIZE,\n LABEL_FONT,\n LABEL_COLOR,\n DEFAULT_LAYOUT_CONFIG,\n} from './config/graphLayout';\nimport type { GetSubTypeFn } from './graph/types';\n\n// ─── Types ──────────────────────────────────────────────────────────────\n\nexport interface GraphCanvasProps {\n /** Graph nodes to render. */\n nodes: GraphNode[];\n /** Graph links/edges to render. */\n links: GraphLink[];\n /** Width of the canvas in pixels. */\n width: number;\n /** Height of the canvas in pixels. */\n height: number;\n /** Layout and color configuration. Defaults to DEFAULT_LAYOUT_CONFIG. */\n layoutConfig?: LayoutConfig;\n /** Color mode for nodes — 'type' uses node type colors, 'community' uses Louvain community colors. */\n colorMode?: 'type' | 'community';\n /** Set of node type strings to hide. */\n hiddenNodeTypes?: Set<string>;\n /** Set of link label strings to hide. */\n hiddenLinkTypes?: Set<string>;\n /** Set of \"Type:SubType\" strings to hide. */\n hiddenSubTypes?: Set<string>;\n /** Set of community IDs to hide. */\n hiddenCommunities?: Set<number>;\n /** Search query for highlighting matching nodes. */\n searchQuery?: string;\n /** Currently selected node ID (for BFS highlight). */\n selectedNodeId?: string | null;\n /** Number of hops for BFS neighborhood highlight. Default: 2. */\n hops?: number;\n /** Function to extract sub-type from a node (e.g. file extension). */\n getSubType?: GetSubTypeFn;\n /** Called when a node is clicked. */\n onNodeClick?: (node: GraphNode) => void;\n /** Called when an edge is clicked. */\n onEdgeClick?: (edge: SelectedEdge) => void;\n /** Called when the background (stage) is clicked. */\n onStageClick?: () => void;\n /** Called when the optimize status changes. */\n onOptimizeStatus?: (status: OptimizeStatus | null) => void;\n /** CSS class name for the container div. */\n className?: string;\n /** Inline styles for the container div. */\n style?: React.CSSProperties;\n}\n\nexport interface GraphCanvasHandle {\n /** Select and zoom to a node by ID. */\n selectNode: (nodeId: string, hops?: number) => void;\n /** Zoom to fit all visible nodes. */\n zoomToFit: (duration?: number) => void;\n /** Zoom to specific node IDs. */\n zoomToNodes: (nodeIds: Iterable<string>, duration?: number) => void;\n /** Trigger a layout re-optimization. */\n optimize: () => void;\n}\n\n// ─── Internal components ────────────────────────────────────────────────\n\n/** Captures the sigma instance ref from inside SigmaContainer. */\nfunction SigmaRefCapture({\n onReady,\n}: {\n onReady: (sigma: ReturnType<typeof useSigma>) => void;\n}) {\n const sigma = useSigma();\n const readyRef = useRef(false);\n\n useEffect(() => {\n if (!readyRef.current) {\n readyRef.current = true;\n onReady(sigma);\n }\n }, [sigma, onReady]);\n\n return null;\n}\n\n/** Registers click events inside the SigmaContainer context. */\nfunction GraphEventHandler({\n onNodeClick,\n onEdgeClick,\n onStageClick,\n}: {\n onNodeClick?: (node: GraphNode) => void;\n onEdgeClick?: (edge: SelectedEdge) => void;\n onStageClick?: () => void;\n}) {\n const sigma = useSigma();\n\n useEffect(() => {\n const container = sigma.getContainer();\n const graph = sigma.getGraph();\n\n const handlers = {\n enterNode: () => {\n container.style.cursor = 'pointer';\n },\n leaveNode: () => {\n container.style.cursor = 'default';\n },\n enterEdge: () => {\n container.style.cursor = 'pointer';\n },\n leaveEdge: () => {\n container.style.cursor = 'default';\n },\n clickNode: ({ node }: { node: string }) => {\n if (!onNodeClick) return;\n const attrs = graph.getNodeAttributes(node);\n const graphNode = attrs._graphNode as GraphNode | undefined;\n if (graphNode) onNodeClick(graphNode);\n },\n clickEdge: ({ edge }: { edge: string }) => {\n if (!onEdgeClick) return;\n const attrs = graph.getEdgeAttributes(edge);\n const source = graph.source(edge);\n const target = graph.target(edge);\n const sourceAttrs = graph.getNodeAttributes(source);\n const targetAttrs = graph.getNodeAttributes(target);\n onEdgeClick({\n source,\n target,\n label: (attrs.label as string) || 'unknown',\n properties: (\n attrs._graphLink as { properties?: Record<string, unknown> }\n )?.properties,\n sourceNode: sourceAttrs._graphNode as GraphNode | undefined,\n targetNode: targetAttrs._graphNode as GraphNode | undefined,\n });\n },\n clickStage: () => {\n onStageClick?.();\n },\n };\n\n // Register sigma events\n sigma.on('enterNode', handlers.enterNode);\n sigma.on('leaveNode', handlers.leaveNode);\n sigma.on('enterEdge', handlers.enterEdge);\n sigma.on('leaveEdge', handlers.leaveEdge);\n sigma.on('clickNode', handlers.clickNode);\n sigma.on('clickEdge', handlers.clickEdge);\n sigma.on('clickStage', handlers.clickStage);\n\n return () => {\n sigma.off('enterNode', handlers.enterNode);\n sigma.off('leaveNode', handlers.leaveNode);\n sigma.off('enterEdge', handlers.enterEdge);\n sigma.off('leaveEdge', handlers.leaveEdge);\n sigma.off('clickNode', handlers.clickNode);\n sigma.off('clickEdge', handlers.clickEdge);\n sigma.off('clickStage', handlers.clickStage);\n };\n }, [sigma, onNodeClick, onEdgeClick, onStageClick]);\n\n return null;\n}\n\n// ─── Default sub-type extractor ─────────────────────────────────────────\n\nconst defaultGetSubType: GetSubTypeFn = () => null;\n\n// ─── Main component ─────────────────────────────────────────────────────\n\nconst EMPTY_STRING_SET = new Set<string>();\nconst EMPTY_NUMBER_SET = new Set<number>();\nconst EMPTY_SUB_TYPES = new Map<string, { subType: string; count: number }[]>();\n\nconst GraphCanvas = memo(\n forwardRef<GraphCanvasHandle, GraphCanvasProps>(\n function GraphCanvas(props, ref) {\n const {\n nodes,\n links,\n width,\n height,\n layoutConfig = DEFAULT_LAYOUT_CONFIG,\n colorMode = 'type',\n hiddenNodeTypes = EMPTY_STRING_SET,\n hiddenLinkTypes = EMPTY_STRING_SET,\n hiddenSubTypes = EMPTY_STRING_SET,\n hiddenCommunities = EMPTY_NUMBER_SET,\n searchQuery = '',\n selectedNodeId = null,\n hops = 2,\n getSubType = defaultGetSubType,\n onNodeClick,\n onEdgeClick,\n onStageClick,\n onOptimizeStatus,\n className,\n style,\n } = props;\n\n const sigmaRef = useRef<ReturnType<typeof useSigma> | null>(null);\n const [optimizeTick, setOptimizeTick] = useState(0);\n\n // Community detection\n const communityData = useCommunities(nodes, links, layoutConfig);\n\n // Build filter state\n const filterState: FilterState = useMemo(\n () => ({\n hiddenNodeTypes,\n hiddenLinkTypes,\n hiddenSubTypes,\n hiddenCommunities,\n }),\n [hiddenNodeTypes, hiddenLinkTypes, hiddenSubTypes, hiddenCommunities],\n );\n\n // Graph instance with layout\n const { graph, layoutReady } = useGraphInstance({\n allNodes: nodes,\n allLinks: links,\n communityData,\n layoutConfig,\n });\n\n // Apply filters\n useGraphFilters(\n graph,\n layoutReady,\n filterState,\n communityData.assignments,\n EMPTY_SUB_TYPES,\n getSubType,\n );\n\n // Compute highlights\n const highlights = useHighlights(\n graph,\n layoutReady,\n nodes,\n links,\n searchQuery,\n selectedNodeId ?? null,\n hops,\n filterState,\n );\n\n // Compute degree map for visual sizing\n const degreeMap = useMemo(() => {\n const map = new Map<string, number>();\n links.forEach((l) => {\n const sourceId =\n typeof l.source === 'string'\n ? l.source\n : (l.source as GraphNode).id;\n const targetId =\n typeof l.target === 'string'\n ? l.target\n : (l.target as GraphNode).id;\n map.set(sourceId, (map.get(sourceId) || 0) + 1);\n map.set(targetId, (map.get(targetId) || 0) + 1);\n });\n return map;\n }, [links]);\n\n const isLargeGraph = links.length > EDGE_PROGRAM_THRESHOLD;\n\n // Visual state\n const visualState: VisualState = useMemo(\n () => ({\n colorMode,\n highlightNodes: highlights.highlightNodes,\n highlightLinks: highlights.highlightLinks,\n labelNodes: highlights.labelNodes,\n selectedNodeId: selectedNodeId ?? null,\n }),\n [colorMode, highlights, selectedNodeId],\n );\n\n useGraphVisuals(\n graph,\n layoutReady,\n visualState,\n layoutConfig,\n degreeMap,\n isLargeGraph,\n );\n\n // Sigma settings\n const sigmaSettings = useMemo(\n () => ({\n defaultNodeType: 'circle' as const,\n defaultEdgeType: isLargeGraph\n ? ('line' as const)\n : ('curvedArrow' as const),\n edgeProgramClasses: {\n ...(isLargeGraph\n ? { line: EdgeLineProgram }\n : { curvedArrow: EdgeCurvedArrowProgram }),\n },\n renderEdgeLabels: false,\n enableEdgeEvents: !isLargeGraph,\n labelRenderedSizeThreshold: LABEL_RENDERED_SIZE_THRESHOLD,\n labelFont: LABEL_FONT,\n labelColor: { color: LABEL_COLOR },\n labelSize: LABEL_SIZE,\n defaultDrawNodeHover: drawNodeHover,\n allowInvalidContainer: true,\n zoomToSizeRatioFunction: (ratio: number) =>\n Math.pow(ratio, ZOOM_SIZE_EXPONENT),\n }),\n [isLargeGraph],\n );\n\n const handleSigmaReady = useCallback(\n (sigma: ReturnType<typeof useSigma>) => {\n sigmaRef.current = sigma;\n },\n [],\n );\n\n // Imperative handle\n useImperativeHandle(\n ref,\n () => ({\n selectNode: (nodeId: string, nodeHops?: number) => {\n const node = nodes.find((n) => n.id === nodeId);\n if (node) {\n onNodeClick?.(node);\n if (sigmaRef.current) {\n // BFS to find neighborhood\n const neighborhood = new Set<string>([nodeId]);\n const h = nodeHops ?? hops;\n let frontier = new Set<string>([nodeId]);\n const adj = new Map<string, string[]>();\n for (const l of links) {\n const s =\n typeof l.source === 'string'\n ? l.source\n : (l.source as GraphNode).id;\n const t =\n typeof l.target === 'string'\n ? l.target\n : (l.target as GraphNode).id;\n if (!adj.has(s)) adj.set(s, []);\n if (!adj.has(t)) adj.set(t, []);\n adj.get(s)!.push(t);\n adj.get(t)!.push(s);\n }\n for (let d = 0; d < h && frontier.size > 0; d++) {\n const next = new Set<string>();\n frontier.forEach((id) => {\n adj.get(id)?.forEach((nb) => {\n if (!neighborhood.has(nb)) {\n next.add(nb);\n neighborhood.add(nb);\n }\n });\n });\n frontier = next;\n }\n zoomToNodes(\n sigmaRef.current as unknown as import('sigma').Sigma,\n neighborhood,\n 600,\n );\n }\n }\n },\n zoomToFit: (duration = 400) => {\n if (sigmaRef.current) {\n zoomToFit(\n sigmaRef.current as unknown as import('sigma').Sigma,\n duration,\n );\n }\n },\n zoomToNodes: (nodeIds: Iterable<string>, duration = 600) => {\n if (sigmaRef.current) {\n zoomToNodes(\n sigmaRef.current as unknown as import('sigma').Sigma,\n nodeIds,\n duration,\n );\n }\n },\n optimize: () => {\n setOptimizeTick((t) => t + 1);\n },\n }),\n [nodes, links, hops, onNodeClick],\n );\n\n return (\n <div\n className={className}\n style={{\n position: 'relative',\n width,\n height,\n ...style,\n }}\n >\n {!layoutReady && nodes.length > 0 && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n zIndex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'rgba(0,0,0,0.5)',\n color: '#e2e8f0',\n fontSize: 14,\n }}\n >\n Computing layout ({nodes.length.toLocaleString()} nodes)...\n </div>\n )}\n <SigmaContainer\n graph={graph}\n style={{\n width,\n height,\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n settings={sigmaSettings}\n >\n <GraphEventHandler\n onNodeClick={onNodeClick}\n onEdgeClick={onEdgeClick}\n onStageClick={onStageClick}\n />\n <LayoutPipeline\n layoutReady={layoutReady}\n layoutConfig={layoutConfig}\n optimizeTick={optimizeTick}\n communityAssignments={communityData.assignments}\n onOptimizeStatus={onOptimizeStatus}\n />\n <SigmaRefCapture onReady={handleSigmaReady} />\n </SigmaContainer>\n </div>\n );\n },\n ),\n);\n\nexport default GraphCanvas;\n"],"names":["_toPrimitive","t","e","_toPropertyKey","_classCallCheck","n","_defineProperties","_createClass","_getPrototypeOf","_isNativeReflectConstruct","_assertThisInitialized","_possibleConstructorReturn","_callSuper","_setPrototypeOf","_inherits","f","r","_arrayLikeToArray","_unsupportedIterableToArray","_defineProperty","ownKeys","_objectSpread2","Program","j","NodeProgram","process","EdgeProgram","d","NodeCircleProgram","SHADER_SOURCE$4","FRAGMENT_SHADER_SOURCE$1","SHADER_SOURCE$3","VERTEX_SHADER_SOURCE$2","_WebGLRenderingContex$2","UNSIGNED_BYTE$2","FLOAT$2","UNIFORMS$2","SHADER_SOURCE$2","VERTEX_SHADER_SOURCE$1","_WebGLRenderingContex$1","UNSIGNED_BYTE$1","FLOAT$1","UNIFORMS$1","_WebGLRenderingContex","UNSIGNED_BYTE","FLOAT","EdgeRectangleProgram","TypedEventEmitter","EventEmitter","linear","quadraticIn","quadraticOut","quadraticInOut","cubicIn","cubicOut","cubicInOut","c","fn","o","EdgeArrowProgram","Camera","Captor","MouseCaptor","TouchCaptor","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","_toConsumableArray","LabelCandidate","LabelGrid","createInteractionListener","node","edge","render","type","exitRender","h","s","v","l","w","m","g","i","u","EdgeLineProgram","UNIFORMS","getNodeColor","getLinkColor","buildCommunityColorMap","buildCommunityNames","getCommunityColor","useMemo","Graph","useRef","useState","useEffect","worker","cached","a","iterate","n2","isGraph","require$$0","require$$1","require$$2","helpers","require$$3","DEFAULT_SETTINGS","require$$4","assign","self","useSigma","useWorkerLayoutForceAtlas2","scale","memo","forwardRef","GraphCanvas","useCommunities","useGraphFilters","useHighlights","useCallback","useImperativeHandle","jsxs","SigmaContainer","jsx"],"mappings":";;;;;;AAAA,SAASA,eAAaC,IAAG,GAAG;AAC1B,MAAI,YAAY,OAAOA,MAAK,CAACA,GAAG,QAAOA;AACvC,MAAIC,KAAID,GAAE,OAAO,WAAW;AAC5B,MAAI,WAAWC,IAAG;AAChB,QAAI,IAAIA,GAAE,KAAKD,IAAG,CAAc;AAChC,QAAI,YAAY,OAAO,EAAG,QAAO;AACjC,UAAM,IAAI,UAAU,8CAA8C;AAAA,EACpE;AACA,SAAyB,OAAiBA,EAAC;AAC7C;AAEA,SAASE,iBAAeF,IAAG;AACzB,MAAI,IAAID,eAAaC,IAAG,QAAQ;AAChC,SAAO,YAAY,OAAO,IAAI,IAAI,IAAI;AACxC;AAEA,SAASG,kBAAgB,GAAGC,IAAG;AAC7B,MAAI,EAAE,aAAaA,IAAI,OAAM,IAAI,UAAU,mCAAmC;AAChF;AAEA,SAASC,oBAAkBJ,IAAG,GAAG;AAC/B,WAASD,KAAI,GAAGA,KAAI,EAAE,QAAQA,MAAK;AACjC,QAAI,IAAI,EAAEA,EAAC;AACX,MAAE,aAAa,EAAE,cAAc,OAAI,EAAE,eAAe,MAAI,WAAW,MAAM,EAAE,WAAW,OAAK,OAAO,eAAeC,IAAGC,iBAAe,EAAE,GAAG,GAAG,CAAC;AAAA,EAC9I;AACF;AACA,SAASI,eAAaL,IAAG,GAAGD,IAAG;AAC7B,SAAO,KAAKK,oBAAkBJ,GAAE,WAAW,CAAC,GAAGD,MAAKK,oBAAkBJ,IAAGD,EAAC,GAAG,OAAO,eAAeC,IAAG,aAAa;AAAA,IACjH,UAAU;AAAA,EACd,CAAG,GAAGA;AACN;AAEA,SAASM,kBAAgBP,IAAG;AAC1B,SAAOO,oBAAkB,OAAO,iBAAiB,OAAO,eAAe,KAAI,IAAK,SAAUP,IAAG;AAC3F,WAAOA,GAAE,aAAa,OAAO,eAAeA,EAAC;AAAA,EAC/C,GAAGO,kBAAgBP,EAAC;AACtB;AAEA,SAASQ,8BAA4B;AACnC,MAAI;AACF,QAAIR,KAAI,CAAC,QAAQ,UAAU,QAAQ,KAAK,QAAQ,UAAU,SAAS,CAAA,GAAI,WAAY;AAAA,IAAC,CAAC,CAAC;AAAA,EACxF,SAASA,IAAG;AAAA,EAAC;AACb,UAAQQ,8BAA4B,WAAY;AAC9C,WAAO,CAAC,CAACR;AAAA,EACX,GAAC;AACH;AAEA,SAASS,yBAAuBR,IAAG;AACjC,MAAI,WAAWA,GAAG,OAAM,IAAI,eAAe,2DAA2D;AACtG,SAAOA;AACT;AAEA,SAASS,6BAA2BV,IAAGC,IAAG;AACxC,MAAIA,OAAM,YAAY,OAAOA,MAAK,cAAc,OAAOA,IAAI,QAAOA;AAClE,MAAI,WAAWA,GAAG,OAAM,IAAI,UAAU,0DAA0D;AAChG,SAAOQ,yBAAuBT,EAAC;AACjC;AAEA,SAASW,aAAWX,IAAG,GAAGC,IAAG;AAC3B,SAAO,IAAIM,kBAAgB,CAAC,GAAGG,6BAA2BV,IAAGQ,4BAAyB,IAAK,QAAQ,UAAU,GAAGP,MAAK,CAAA,GAAIM,kBAAgBP,EAAC,EAAE,WAAW,IAAI,EAAE,MAAMA,IAAGC,EAAC,CAAC;AAC1K;AAEA,SAASW,kBAAgBZ,IAAGC,IAAG;AAC7B,SAAOW,oBAAkB,OAAO,iBAAiB,OAAO,eAAe,KAAI,IAAK,SAAUZ,IAAGC,IAAG;AAC9F,WAAOD,GAAE,YAAYC,IAAGD;AAAA,EAC1B,GAAGY,kBAAgBZ,IAAGC,EAAC;AACzB;AAEA,SAASY,YAAUb,IAAGC,IAAG;AACvB,MAAI,cAAc,OAAOA,MAAK,SAASA,GAAG,OAAM,IAAI,UAAU,oDAAoD;AAClH,EAAAD,GAAE,YAAY,OAAO,OAAOC,MAAKA,GAAE,WAAW;AAAA,IAC5C,aAAa;AAAA,MACX,OAAOD;AAAA,MACP,UAAU;AAAA,MACV,cAAc;AAAA,IACpB;AAAA,EACA,CAAG,GAAG,OAAO,eAAeA,IAAG,aAAa;AAAA,IACxC,UAAU;AAAA,EACd,CAAG,GAAGC,MAAKW,kBAAgBZ,IAAGC,EAAC;AAC/B;AC/EA,SAAS,gBAAgB,GAAG;AAC1B,MAAI,MAAM,QAAQ,CAAC,EAAG,QAAO;AAC/B;AAEA,SAAS,sBAAsB,GAAG,GAAG;AACnC,MAAID,KAAI,QAAQ,IAAI,OAAO,eAAe,OAAO,UAAU,EAAE,OAAO,QAAQ,KAAK,EAAE,YAAY;AAC/F,MAAI,QAAQA,IAAG;AACb,QAAIC,IACFG,IACA,GACA,GACA,IAAI,CAAA,GACJU,KAAI,MACJ,IAAI;AACN,QAAI;AACF,UAAI,KAAKd,KAAIA,GAAE,KAAK,CAAC,GAAG,MAAM,MAAM,GAAG;AACrC,YAAI,OAAOA,EAAC,MAAMA,GAAG;AACrB,QAAAc,KAAI;AAAA,MACN,MAAO,QAAO,EAAEA,MAAKb,KAAI,EAAE,KAAKD,EAAC,GAAG,UAAU,EAAE,KAAKC,GAAE,KAAK,GAAG,EAAE,WAAW,IAAIa,KAAI,KAAG;AAAA,IACzF,SAASC,IAAG;AACV,UAAI,MAAIX,KAAIW;AAAA,IACd,UAAC;AACC,UAAI;AACF,YAAI,CAACD,MAAK,QAAQd,GAAE,WAAW,IAAIA,GAAE,OAAM,GAAI,OAAO,CAAC,MAAM,GAAI;AAAA,MACnE,UAAC;AACC,YAAI,EAAG,OAAMI;AAAA,MACf;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAASY,oBAAkB,GAAG,GAAG;AAC/B,GAAC,QAAQ,KAAK,IAAI,EAAE,YAAY,IAAI,EAAE;AACtC,WAASf,KAAI,GAAGG,KAAI,MAAM,CAAC,GAAGH,KAAI,GAAGA,KAAK,CAAAG,GAAEH,EAAC,IAAI,EAAEA,EAAC;AACpD,SAAOG;AACT;AAEA,SAASa,8BAA4B,GAAG,GAAG;AACzC,MAAI,GAAG;AACL,QAAI,YAAY,OAAO,EAAG,QAAOD,oBAAkB,GAAG,CAAC;AACvD,QAAIhB,KAAI,CAAA,EAAG,SAAS,KAAK,CAAC,EAAE,MAAM,GAAG,EAAE;AACvC,WAAO,aAAaA,MAAK,EAAE,gBAAgBA,KAAI,EAAE,YAAY,OAAO,UAAUA,MAAK,UAAUA,KAAI,MAAM,KAAK,CAAC,IAAI,gBAAgBA,MAAK,2CAA2C,KAAKA,EAAC,IAAIgB,oBAAkB,GAAG,CAAC,IAAI;AAAA,EACvN;AACF;AAEA,SAAS,mBAAmB;AAC1B,QAAM,IAAI,UAAU,2IAA2I;AACjK;AAEA,SAAS,eAAe,GAAGf,IAAG;AAC5B,SAAO,gBAAgB,CAAC,KAAK,sBAAsB,GAAGA,EAAC,KAAKgB,8BAA4B,GAAGhB,EAAC,KAAK,iBAAgB;AACnH;AAEA,IAAI,cAAc;AAAA,EAChB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,aAAa;AAAA,EACb,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,MAAM;AAAA,EACN,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,aAAa;AAAA,EACb,UAAU;AAAA,EACV,eAAe;AAAA,EACf,eAAe;AAAA,EACf,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,WAAW;AAAA,EACX,aAAa;AAAA,EACb,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,eAAe;AAAA,EACf,cAAc;AAAA,EACd,WAAW;AAAA,EACX,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,MAAM;AAAA,EACN,WAAW;AAAA,EACX,KAAK;AAAA,EACL,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,eAAe;AAAA,EACf,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,EACN,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,WAAW;AAAA,EACX,UAAU;AAAA,EACV,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,OAAO;AAAA,EACP,sBAAsB;AAAA,EACtB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,MAAM;AAAA,EACN,MAAM;AAAA,EACN,WAAW;AAAA,EACX,aAAa;AAAA,EACb,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,UAAU;AAAA,EACV,UAAU;AAAA,EACV,cAAc;AAAA,EACd,aAAa;AAAA,EACb,MAAM;AAAA,EACN,aAAa;AAAA,EACb,OAAO;AACT;AAeA,IAAI,OAAO,IAAI,UAAU,CAAC;AAC1B,IAAI,QAAQ,IAAI,WAAW,KAAK,QAAQ,GAAG,CAAC;AAC5C,IAAI,UAAU,IAAI,aAAa,KAAK,QAAQ,GAAG,CAAC;AAChD,IAAI,kBAAkB;AACtB,IAAI,qBAAqB;AACzB,SAAS,WAAW,KAAK;AACvB,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI;AAGR,MAAI,IAAI,CAAC,MAAM,KAAK;AAClB,QAAI,IAAI,WAAW,GAAG;AACpB,UAAI,SAAS,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE;AAC9C,UAAI,SAAS,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE;AAC9C,UAAI,SAAS,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE;AAAA,IAChD,OAAO;AACL,UAAI,SAAS,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE;AAC9C,UAAI,SAAS,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE;AAC9C,UAAI,SAAS,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE;AAAA,IAChD;AACA,QAAI,IAAI,WAAW,GAAG;AACpB,UAAI,SAAS,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,IAAI;AAAA,IACpD;AAAA,EACF,WAGS,gBAAgB,KAAK,GAAG,GAAG;AAClC,QAAI,QAAQ,IAAI,MAAM,kBAAkB;AACxC,QAAI,OAAO;AACT,UAAI,CAAC,MAAM,CAAC;AACZ,UAAI,CAAC,MAAM,CAAC;AACZ,UAAI,CAAC,MAAM,CAAC;AACZ,UAAI,MAAM,CAAC,EAAG,KAAI,CAAC,MAAM,CAAC;AAAA,IAC5B;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA;AACA,IAAI,oBAAoB,CAAA;AACxB,SAAS,aAAa,aAAa;AACjC,oBAAkB,SAAS,IAAI,WAAW,YAAY,SAAS,CAAC;AAEhE,oBAAkB,YAAY,SAAS,CAAC,IAAI,kBAAkB,SAAS;AACzE;AACA,SAAS,YAAY,GAAG,GAAG,GAAG,GAAG,SAAS;AACxC,QAAM,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI;AAC3B,QAAM,CAAC,IAAI,MAAM,CAAC,IAAI;AACnC,SAAO,QAAQ,CAAC;AAClB;AACA,SAAS,WAAW,KAAK;AAEvB,QAAM,IAAI,YAAW;AAGrB,MAAI,OAAO,kBAAkB,GAAG,MAAM,YAAa,QAAO,kBAAkB,GAAG;AAC/E,MAAI,SAAS,WAAW,GAAG;AAC3B,MAAI,IAAI,OAAO,GACb,IAAI,OAAO,GACX,IAAI,OAAO;AACb,MAAI,IAAI,OAAO;AACf,MAAI,IAAI,MAAM;AACd,MAAI,QAAQ,YAAY,GAAG,GAAG,GAAG,CAAO;AACxC,oBAAkB,GAAG,IAAI;AACzB,SAAO;AACT;AAaA,IAAI,oBAAoB,CAAA;AACxB,SAAS,aAAa,OAAO;AAE3B,MAAI,OAAO,kBAAkB,KAAK,MAAM,YAAa,QAAO,kBAAkB,KAAK;AAInF,MAAI,KAAK,QAAQ,cAAgB;AACjC,MAAI,KAAK,QAAQ,WAAgB;AACjC,MAAI,IAAI,QAAQ;AAChB,MAAI,IAAI;AAQR,MAAI,QAAQ,YAAY,GAAG,GAAG,GAAG,CAAO;AACxC,oBAAkB,KAAK,IAAI;AAC3B,SAAO;AACT;AACA,SAAS,aAAa,GAAG,GAAG,GAAG,IAAI;AAGjC,SAAO,KAAK,KAAK,MAAM,KAAK;AAI9B;AACA,SAAS,cAAc,IAAI,aAAa,GAAG,GAAG,YAAY,iBAAiB;AACzE,MAAI,UAAU,KAAK,MAAM,IAAI,kBAAkB,UAAU;AACzD,MAAI,UAAU,KAAK,MAAM,GAAG,sBAAsB,kBAAkB,IAAI,kBAAkB,UAAU;AACpG,MAAI,QAAQ,IAAI,WAAW,CAAC;AAC5B,KAAG,gBAAgB,GAAG,aAAa,WAAW;AAC9C,KAAG,WAAW,SAAS,SAAS,GAAG,GAAG,GAAG,MAAM,GAAG,eAAe,KAAK;AACtE,MAAI,SAAS,eAAe,OAAO,CAAC,GAClC,IAAI,OAAO,CAAC,GACZ,IAAI,OAAO,CAAC,GACZ,IAAI,OAAO,CAAC,GACZ,IAAI,OAAO,CAAC;AACd,SAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AACpB;ACpVA,SAASiB,kBAAgBjB,IAAG,GAAGD,IAAG;AAChC,UAAQ,IAAIE,iBAAe,CAAC,MAAMD,KAAI,OAAO,eAAeA,IAAG,GAAG;AAAA,IAChE,OAAOD;AAAA,IACP,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,UAAU;AAAA,EACd,CAAG,IAAIC,GAAE,CAAC,IAAID,IAAGC;AACjB;AAEA,SAASkB,UAAQlB,IAAG,GAAG;AACrB,MAAID,KAAI,OAAO,KAAKC,EAAC;AACrB,MAAI,OAAO,uBAAuB;AAChC,QAAI,IAAI,OAAO,sBAAsBA,EAAC;AACtC,UAAM,IAAI,EAAE,OAAO,SAAUc,IAAG;AAC9B,aAAO,OAAO,yBAAyBd,IAAGc,EAAC,EAAE;AAAA,IAC/C,CAAC,IAAIf,GAAE,KAAK,MAAMA,IAAG,CAAC;AAAA,EACxB;AACA,SAAOA;AACT;AACA,SAASoB,iBAAenB,IAAG;AACzB,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,QAAID,KAAI,QAAQ,UAAU,CAAC,IAAI,UAAU,CAAC,IAAI,CAAA;AAC9C,QAAI,IAAImB,UAAQ,OAAOnB,EAAC,GAAG,IAAE,EAAE,QAAQ,SAAUe,IAAG;AAClDG,wBAAgBjB,IAAGc,IAAGf,GAAEe,EAAC,CAAC;AAAA,IAC5B,CAAC,IAAI,OAAO,4BAA4B,OAAO,iBAAiBd,IAAG,OAAO,0BAA0BD,EAAC,CAAC,IAAImB,UAAQ,OAAOnB,EAAC,CAAC,EAAE,QAAQ,SAAUe,IAAG;AAChJ,aAAO,eAAed,IAAGc,IAAG,OAAO,yBAAyBf,IAAGe,EAAC,CAAC;AAAA,IACnE,CAAC;AAAA,EACH;AACA,SAAOd;AACT;AAEA,SAAS,eAAeD,IAAG,GAAG;AAC5B,SAAO,CAAC,CAAA,EAAG,eAAe,KAAKA,IAAG,CAAC,KAAK,UAAUA,KAAIO,kBAAgBP,EAAC,KAAI;AAC3E,SAAOA;AACT;AAEA,SAAS,OAAO;AACd,SAAO,OAAO,eAAe,OAAO,WAAW,QAAQ,MAAM,QAAQ,IAAI,KAAI,IAAK,SAAUC,IAAGD,IAAG,GAAG;AACnG,QAAI,IAAI,eAAeC,IAAGD,EAAC;AAC3B,QAAI,GAAG;AACL,UAAII,KAAI,OAAO,yBAAyB,GAAGJ,EAAC;AAC5C,aAAOI,GAAE,MAAMA,GAAE,IAAI,KAAK,UAAU,SAAS,IAAIH,KAAI,CAAC,IAAIG,GAAE;AAAA,IAC9D;AAAA,EACF,GAAG,KAAK,MAAM,MAAM,SAAS;AAC/B;AAEA,SAAS,cAAcJ,IAAG,GAAGC,IAAG,GAAG;AACjC,MAAI,IAAI,KAAKM,kBAAwBP,GAAE,SAAa,GAAG,GAAGC,EAAC;AAC3D,SAAgB,cAAc,OAAO,IAAI,SAAUD,IAAG;AACpD,WAAO,EAAE,MAAMC,IAAGD,EAAC;AAAA,EACrB,IAAI;AACN;AAEA,SAAS,uBAAuB,MAAM;AACpC,SAAO,KAAK,aAAa,IAAI,KAAK;AACpC;AACA,SAAS,wBAAwB,OAAO;AACtC,MAAI,MAAM;AACV,QAAM,QAAQ,SAAU,MAAM;AAC5B,WAAO,OAAO,uBAAuB,IAAI;AAAA,EAC3C,CAAC;AACD,SAAO;AACT;AACA,SAAS,WAAW,MAAM,IAAI,QAAQ;AACpC,MAAI,SAAS,SAAS,WAAW,GAAG,gBAAgB,GAAG;AAGvD,MAAI,SAAS,GAAG,aAAa,MAAM;AACnC,MAAI,WAAW,MAAM;AACnB,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AAGA,KAAG,aAAa,QAAQ,MAAM;AAG9B,KAAG,cAAc,MAAM;AAGvB,MAAI,uBAAuB,GAAG,mBAAmB,QAAQ,GAAG,cAAc;AAG1E,MAAI,CAAC,sBAAsB;AACzB,QAAI,UAAU,GAAG,iBAAiB,MAAM;AACxC,OAAG,aAAa,MAAM;AACtB,UAAM,IAAI,MAAM,kDAAkD,OAAO,SAAS,IAAI,EAAE,OAAO,MAAM,CAAC;AAAA,EACxG;AACA,SAAO;AACT;AACA,SAAS,iBAAiB,IAAI,QAAQ;AACpC,SAAO,WAAW,UAAU,IAAI,MAAM;AACxC;AACA,SAAS,mBAAmB,IAAI,QAAQ;AACtC,SAAO,WAAW,YAAY,IAAI,MAAM;AAC1C;AAKA,SAAS,YAAY,IAAI,SAAS;AAChC,MAAI,UAAU,GAAG,cAAa;AAC9B,MAAI,YAAY,MAAM;AACpB,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AACA,MAAI,GAAG;AAGP,OAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,IAAI,GAAG,IAAK,IAAG,aAAa,SAAS,QAAQ,CAAC,CAAC;AAC/E,KAAG,YAAY,OAAO;AAGtB,MAAI,qBAAqB,GAAG,oBAAoB,SAAS,GAAG,WAAW;AACvE,MAAI,CAAC,oBAAoB;AACvB,OAAG,cAAc,OAAO;AACxB,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACA,SAAO;AACT;AACA,SAAS,YAAY,MAAM;AACzB,MAAI,KAAK,KAAK,IACZ,SAAS,KAAK,QACd,UAAU,KAAK,SACf,eAAe,KAAK,cACpB,iBAAiB,KAAK;AACxB,KAAG,aAAa,YAAY;AAC5B,KAAG,aAAa,cAAc;AAC9B,KAAG,cAAc,OAAO;AACxB,KAAG,aAAa,MAAM;AACxB;AASA,IAAI,iBAAiB;AACrB,IAAI,iCAAiCkB,kBAAgBA,kBAAgBA,kBAAgBA,kBAAgBA,kBAAgBA,kBAAgBA,kBAAgBA,kBAAgB,CAAA,GAAI,uBAAuB,MAAM,CAAC,GAAG,uBAAuB,MAAM,CAAC,GAAG,uBAAuB,eAAe,CAAC,GAAG,uBAAuB,OAAO,CAAC,GAAG,uBAAuB,gBAAgB,CAAC,GAAG,uBAAuB,KAAK,CAAC,GAAG,uBAAuB,cAAc,CAAC,GAAG,uBAAuB,OAAO,CAAC;AAI1c,IAAI,UAAuB,4BAAY;AACrC,WAASG,SAAQ,IAAI,eAAe,UAAU;AAC5ClB,sBAAgB,MAAMkB,QAAO;AAE7BH,sBAAgB,MAAM,SAAS,IAAI,aAAY,CAAE;AACjDA,sBAAgB,MAAM,iBAAiB,IAAI,aAAY,CAAE;AACzDA,sBAAgB,MAAM,YAAY,CAAC;AACnCA,sBAAgB,MAAM,iBAAiB,CAAC;AAExC,QAAI,MAAM,KAAK,cAAa;AAC5B,SAAK,WAAW,IAAI;AACpB,SAAK,uBAAuB,IAAI;AAChC,SAAK,yBAAyB,IAAI;AAClC,SAAK,WAAW,IAAI;AACpB,SAAK,aAAa,IAAI;AACtB,SAAK,SAAS,IAAI;AAClB,SAAK,sBAAsB,yBAAyB,MAAM,IAAI,sBAAsB,CAAA;AACpF,SAAK,gBAAgB,mBAAmB,MAAM,IAAI,gBAAgB,CAAA;AAClE,SAAK,cAAc,yBAAyB;AAG5C,SAAK,yBAAyB,wBAAwB,KAAK,UAAU;AACrE,SAAK,SAAS,KAAK,WAAW,KAAK;AAGnC,SAAK,WAAW;AAChB,SAAK,gBAAgB,KAAK,eAAe,UAAU,IAAI,IAAI,sBAAsB,IAAI,wBAAwB,IAAI;AACjH,SAAK,cAAc,gBAAgB,KAAK,eAAe,QAAQ,IAAI,iBAAiB,IAAI,sBAAsB,iBAAiB,IAAI,wBAAwB,aAAa,IAAI;AAG5K,QAAI,KAAK,aAAa;AACpB,UAAI,+BAA+B,wBAAwB,KAAK,mBAAmB;AACnF,UAAI,KAAK,cAAc,WAAW,KAAK,SAAU,OAAM,IAAI,MAAM,wDAAwD,OAAO,KAAK,UAAU,mBAAmB,EAAE,OAAO,KAAK,cAAc,QAAQ,WAAW,CAAC;AAClN,WAAK,gBAAgB,IAAI,aAAa,KAAK,cAAc,SAAS,4BAA4B;AAC9F,eAAS,IAAI,GAAG,IAAI,KAAK,cAAc,QAAQ,KAAK;AAClD,YAAI,SAAS,KAAK,cAAc,CAAC;AACjC,YAAI,OAAO,WAAW,6BAA8B,OAAM,IAAI,MAAM,8DAA8D,OAAO,OAAO,QAAQ,oBAAoB,EAAE,OAAO,8BAA8B,GAAG,CAAC;AACvN,iBAASI,KAAI,GAAGA,KAAI,OAAO,QAAQA,KAAK,MAAK,cAAc,IAAI,+BAA+BA,EAAC,IAAI,OAAOA,EAAC;AAAA,MAC7G;AACA,WAAK,SAAS,KAAK;AAAA,IACrB;AAAA,EACF;AACA,SAAOhB,eAAae,UAAS,CAAC;AAAA,IAC5B,KAAK;AAAA,IACL,OAAO,SAAS,OAAO;AACrB,kBAAY,KAAK,aAAa;AAC9B,UAAI,KAAK,aAAa;AACpB,oBAAY,KAAK,WAAW;AAC5B,aAAK,cAAc;AAAA,MACrB;AAAA,IACF;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,eAAe,MAAM,IAAI,oBAAoB,sBAAsB,aAAa;AAC9F,UAAI,MAAM,KAAK,cAAa;AAG5B,UAAI,SAAS,GAAG,aAAY;AAC5B,UAAI,WAAW,KAAM,OAAM,IAAI,MAAM,iDAAiD;AAGtF,UAAI,eAAe,iBAAiB,IAAI,kBAAkB;AAC1D,UAAI,iBAAiB,mBAAmB,IAAI,oBAAoB;AAChE,UAAI,UAAU,YAAY,IAAI,CAAC,cAAc,cAAc,CAAC;AAG5D,UAAI,mBAAmB,CAAA;AACvB,UAAI,SAAS,QAAQ,SAAU,aAAa;AAC1C,YAAI,WAAW,GAAG,mBAAmB,SAAS,WAAW;AACzD,YAAI,SAAU,kBAAiB,WAAW,IAAI;AAAA,MAChD,CAAC;AACD,UAAI,qBAAqB,CAAA;AACzB,UAAI,WAAW,QAAQ,SAAU,MAAM;AACrC,2BAAmB,KAAK,IAAI,IAAI,GAAG,kBAAkB,SAAS,KAAK,IAAI;AAAA,MACzE,CAAC;AAGD,UAAI;AACJ,UAAI,yBAAyB,KAAK;AAChC,YAAI,oBAAoB,QAAQ,SAAU,MAAM;AAC9C,6BAAmB,KAAK,IAAI,IAAI,GAAG,kBAAkB,SAAS,KAAK,IAAI;AAAA,QACzE,CAAC;AACD,yBAAiB,GAAG,aAAY;AAChC,YAAI,mBAAmB,KAAM,OAAM,IAAI,MAAM,0DAA0D;AAAA,MACzG;AACA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,gBAAgB,kBAAkB,CAAA;AAAA,QAClC;AAAA,QACA;AAAA,QACA,WAAW,SAAS;AAAA,QACpB;AAAA,QACA;AAAA,MACR;AAAA,IACI;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,YAAY,SAAS;AACnC,UAAI,QAAQ;AACZ,UAAI,SAAS;AACb,UAAI,KAAK,QAAQ,IACf,SAAS,QAAQ;AACnB,UAAI,CAAC,KAAK,aAAa;AACrB,WAAG,WAAW,GAAG,cAAc,MAAM;AACrC,iBAAS;AACT,aAAK,WAAW,QAAQ,SAAU,MAAM;AACtC,iBAAO,UAAU,MAAM,cAAc,MAAM,SAAS,MAAM;AAAA,QAC5D,CAAC;AACD,WAAG,WAAW,GAAG,cAAc,KAAK,OAAO,GAAG,YAAY;AAAA,MAC5D,OAAO;AAEL,WAAG,WAAW,GAAG,cAAc,QAAQ,cAAc;AACrD,iBAAS;AACT,aAAK,oBAAoB,QAAQ,SAAU,MAAM;AAC/C,iBAAO,UAAU,MAAM,cAAc,MAAM,SAAS,QAAQ,KAAK;AAAA,QACnE,CAAC;AACD,WAAG,WAAW,GAAG,cAAc,KAAK,eAAe,GAAG,WAAW;AAGjE,WAAG,WAAW,GAAG,cAAc,QAAQ,MAAM;AAC7C,iBAAS;AACT,aAAK,WAAW,QAAQ,SAAU,MAAM;AACtC,iBAAO,UAAU,MAAM,cAAc,MAAM,SAAS,QAAQ,IAAI;AAAA,QAClE,CAAC;AACD,WAAG,WAAW,GAAG,cAAc,KAAK,OAAO,GAAG,YAAY;AAAA,MAC5D;AACA,SAAG,WAAW,GAAG,cAAc,IAAI;AAAA,IACrC;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,cAAc,SAAS;AACrC,UAAI,SAAS;AACb,UAAI,CAAC,KAAK,aAAa;AACrB,aAAK,WAAW,QAAQ,SAAU,MAAM;AACtC,iBAAO,OAAO,gBAAgB,MAAM,OAAO;AAAA,QAC7C,CAAC;AAAA,MACH,OAAO;AACL,aAAK,oBAAoB,QAAQ,SAAU,MAAM;AAC/C,iBAAO,OAAO,gBAAgB,MAAM,SAAS,KAAK;AAAA,QACpD,CAAC;AACD,aAAK,WAAW,QAAQ,SAAU,MAAM;AACtC,iBAAO,OAAO,gBAAgB,MAAM,SAAS,IAAI;AAAA,QACnD,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,cAAc,MAAM,SAAS,QAAQ,YAAY;AAC/D,UAAI,aAAa,+BAA+B,KAAK,IAAI;AACzD,UAAI,OAAO,eAAe,SAAU,OAAM,IAAI,MAAM,iDAAkD,OAAO,KAAK,MAAM,GAAI,CAAC;AAC7H,UAAI,WAAW,QAAQ,mBAAmB,KAAK,IAAI;AACnD,UAAI,KAAK,QAAQ;AACjB,UAAI,aAAa,IAAI;AACnB,WAAG,wBAAwB,QAAQ;AACnC,YAAI,SAAS,CAAC,KAAK,cAAc,KAAK,yBAAyB,aAAa,qBAAqB,aAAa,KAAK,yBAAyB,wBAAwB,KAAK,mBAAmB,KAAK,aAAa;AAC9M,WAAG,oBAAoB,UAAU,KAAK,MAAM,KAAK,MAAM,KAAK,cAAc,OAAO,QAAQ,MAAM;AAC/F,YAAI,KAAK,eAAe,YAAY;AAClC,cAAI,cAAc,wBAAwB;AACxC,eAAG,oBAAoB,UAAU,CAAC;AAAA,UACpC,OAAO;AACL,gBAAI,MAAM,GAAG,aAAa,wBAAwB;AAClD,gBAAI,IAAK,KAAI,yBAAyB,UAAU,CAAC;AAAA,UACnD;AAAA,QACF;AAAA,MACF;AACA,aAAO,KAAK,OAAO;AAAA,IACrB;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,gBAAgB,MAAM,SAAS,cAAc;AAC3D,UAAI,WAAW,QAAQ,mBAAmB,KAAK,IAAI;AACnD,UAAI,KAAK,QAAQ;AACjB,UAAI,aAAa,IAAI;AACnB,WAAG,yBAAyB,QAAQ;AACpC,YAAI,KAAK,eAAe,cAAc;AACpC,cAAI,cAAc,wBAAwB;AACxC,eAAG,oBAAoB,UAAU,CAAC;AAAA,UACpC,OAAO;AACL,gBAAI,MAAM,GAAG,aAAa,wBAAwB;AAClD,gBAAI,IAAK,KAAI,yBAAyB,UAAU,CAAC;AAAA,UACnD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,WAAW,UAAU;AAInC,UAAI,aAAa,KAAK,SAAU;AAChC,WAAK,WAAW;AAChB,WAAK,gBAAgB,KAAK,WAAW;AACrC,WAAK,QAAQ,IAAI,aAAa,CAAC,KAAK,cAAc,KAAK,gBAAgB,KAAK,yBAAyB,KAAK,WAAW,KAAK,sBAAsB;AAAA,IAClJ;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,qBAAqB;AACnC,aAAO,KAAK,kBAAkB;AAAA,IAChC;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,cAAc,QAAQ,aAAa;AACjD,UAAI,KAAK,YAAY,IACnB,UAAU,YAAY;AAIxB,SAAG,OAAO,GAAG,KAAK;AAMlB,SAAG,WAAW,OAAO;AACrB,WAAK,YAAY,QAAQ,WAAW;AACpC,WAAK,UAAU,KAAK,QAAQ,WAAW;AAAA,IACzC;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,OAAO,QAAQ;AAC7B,UAAI,KAAK,qBAAsB;AAC/B,UAAI,KAAK,aAAa;AACpB,aAAK,YAAY,GAAG,SAAS,GAAG,GAAG,OAAO,QAAQ,OAAO,aAAa,OAAO,iBAAiB,OAAO,SAAS,OAAO,aAAa,OAAO,eAAe;AACxJ,aAAK,YAAY,KAAK,WAAW;AACjC,aAAK,cAAcD,iBAAeA,iBAAe,CAAA,GAAI,MAAM,GAAG,IAAI;AAAA,UAChE,YAAY,OAAO,aAAa,OAAO;AAAA,QACjD,CAAS,GAAG,KAAK,WAAW;AACpB,aAAK,cAAc,KAAK,WAAW;AAAA,MACrC;AACA,WAAK,cAAc,GAAG,SAAS,GAAG,GAAG,OAAO,QAAQ,OAAO,YAAY,OAAO,SAAS,OAAO,UAAU;AACxG,WAAK,YAAY,KAAK,aAAa;AACnC,WAAK,cAAc,QAAQ,KAAK,aAAa;AAC7C,WAAK,cAAc,KAAK,aAAa;AAAA,IACvC;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,UAAU,QAAQ,MAAM;AACtC,UAAI,KAAK,KAAK,IACZ,cAAc,KAAK;AACrB,SAAG,gBAAgB,GAAG,aAAa,WAAW;AAC9C,UAAI,CAAC,KAAK,aAAa;AACrB,WAAG,WAAW,QAAQ,GAAG,KAAK,aAAa;AAAA,MAC7C,OAAO;AACL,YAAI,cAAc,wBAAwB;AACxC,aAAG,oBAAoB,QAAQ,GAAG,KAAK,UAAU,KAAK,QAAQ;AAAA,QAChE,OAAO;AACL,cAAI,MAAM,GAAG,aAAa,wBAAwB;AAClD,cAAI,IAAK,KAAI,yBAAyB,QAAQ,GAAG,KAAK,UAAU,KAAK,QAAQ;AAAA,QAC/E;AAAA,MACF;AAAA,IACF;AAAA,EACJ,CAAG,CAAC;AACJ,GAAC;AAUD,IAAI,cAA2B,0BAAU,MAAM;AAC7C,WAASG,eAAc;AACrBpB,sBAAgB,MAAMoB,YAAW;AACjC,WAAOZ,aAAW,MAAMY,cAAa,SAAS;AAAA,EAChD;AACAV,cAAUU,cAAa,IAAI;AAC3B,SAAOjB,eAAaiB,cAAa,CAAC;AAAA,IAChC,KAAK;AAAA,IACL,OAAO,SAAS,OAAO;AACrB,oBAAcA,cAAa,QAAQ,IAAO,EAAE,CAAA,CAAE;AAAA,IAChD;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAASC,SAAQ,WAAW,QAAQ,MAAM;AAC/C,UAAI,IAAI,SAAS,KAAK;AAEtB,UAAI,KAAK,QAAQ;AACf,iBAAS,IAAI,IAAI,KAAK,QAAQ,IAAI,GAAG,KAAK;AACxC,eAAK,MAAM,CAAC,IAAI;AAAA,QAClB;AACA;AAAA,MACF;AACA,aAAO,KAAK,mBAAmB,aAAa,SAAS,GAAG,GAAG,IAAI;AAAA,IACjE;AAAA,EACJ,CAAG,CAAC;AACJ,GAAE,OAAO;AA6DT,IAAI,cAA2B,0BAAU,MAAM;AAC7C,WAASC,eAAc;AACrB,QAAI;AACJtB,sBAAgB,MAAMsB,YAAW;AACjC,aAAS,OAAO,UAAU,QAAQ,OAAO,IAAI,MAAM,IAAI,GAAG,OAAO,GAAG,OAAO,MAAM,QAAQ;AACvF,WAAK,IAAI,IAAI,UAAU,IAAI;AAAA,IAC7B;AACA,YAAQd,aAAW,MAAMc,cAAa,CAAA,EAAG,OAAO,IAAI,CAAC;AACrDP,sBAAgB,OAAO,aAAa,MAAS;AAC7C,WAAO;AAAA,EACT;AACAL,cAAUY,cAAa,IAAI;AAC3B,SAAOnB,eAAamB,cAAa,CAAC;AAAA,IAChC,KAAK;AAAA,IACL,OAAO,SAAS,OAAO;AACrB,oBAAcA,cAAa,QAAQ,IAAO,EAAE,CAAA,CAAE;AAAA,IAChD;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAASD,SAAQ,WAAW,QAAQ,YAAY,YAAY,MAAM;AACvE,UAAI,IAAI,SAAS,KAAK;AAEtB,UAAI,KAAK,UAAU,WAAW,UAAU,WAAW,QAAQ;AACzD,iBAAS,IAAI,IAAI,KAAK,QAAQ,IAAI,GAAG,KAAK;AACxC,eAAK,MAAM,CAAC,IAAI;AAAA,QAClB;AACA;AAAA,MACF;AACA,aAAO,KAAK,mBAAmB,aAAa,SAAS,GAAG,GAAG,YAAY,YAAY,IAAI;AAAA,IACzF;AAAA,EACJ,CAAG,CAAC;AACJ,GAAE,OAAO;AAUT,SAAS,0BAA0B,gBAAgB,WAAW;AAC5D,SAAoB,4BAAY;AAC9B,aAAS,oBAAoB,IAAI,eAAe,UAAU;AACxDrB,wBAAgB,MAAM,mBAAmB;AACzCe,wBAAgB,MAAM,aAAa,SAAS;AAC5C,WAAK,WAAW,eAAe,IAAI,SAAUG,UAAS;AACpD,eAAO,IAAIA,SAAQ,IAAI,eAAe,QAAQ;AAAA,MAChD,CAAC;AAAA,IACH;AACA,WAAOf,eAAa,qBAAqB,CAAC;AAAA,MACxC,KAAK;AAAA,MACL,OAAO,SAAS,WAAW,UAAU;AACnC,aAAK,SAAS,QAAQ,SAAU,SAAS;AACvC,iBAAO,QAAQ,WAAW,QAAQ;AAAA,QACpC,CAAC;AAAA,MACH;AAAA,IACN,GAAO;AAAA,MACD,KAAK;AAAA,MACL,OAAO,SAASkB,SAAQ,WAAW,QAAQ,YAAY,YAAY,MAAM;AACvE,aAAK,SAAS,QAAQ,SAAU,SAAS;AACvC,iBAAO,QAAQ,QAAQ,WAAW,QAAQ,YAAY,YAAY,IAAI;AAAA,QACxE,CAAC;AAAA,MACH;AAAA,IACN,GAAO;AAAA,MACD,KAAK;AAAA,MACL,OAAO,SAAS,OAAO,QAAQ;AAC7B,aAAK,SAAS,QAAQ,SAAU,SAAS;AACvC,iBAAO,QAAQ,OAAO,MAAM;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,IACN,GAAO;AAAA,MACD,KAAK;AAAA,MACL,OAAO,SAAS,OAAO;AACrB,aAAK,SAAS,QAAQ,SAAU,SAAS;AACvC,iBAAO,QAAQ,KAAI;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,IACN,CAAK,CAAC;AAAA,EACJ,GAAC;AACH;AAEA,SAAS,sBAAsB,SAAS,UAAU,YAAY,YAAY,UAAU;AAClF,MAAI,OAAO,SAAS,eAClB,OAAO,SAAS,eAChB,SAAS,SAAS,iBAClB,QAAQ,SAAS,eAAe,YAAY,SAAS,SAAS,eAAe,SAAS,KAAK,SAAS,eAAe,SAAS,SAAS,SAAS,eAAe;AAC/J,MAAI,QAAQ,SAAS;AACrB,MAAI,CAAC,MAAO;AACZ,UAAQ,YAAY;AACpB,UAAQ,OAAO,GAAG,OAAO,QAAQ,GAAG,EAAE,OAAO,MAAM,KAAK,EAAE,OAAO,IAAI;AAGrE,MAAI,QAAQ,WAAW;AACvB,MAAI,QAAQ,WAAW;AACvB,MAAI,KAAK,WAAW;AACpB,MAAI,KAAK,WAAW;AACpB,MAAI,KAAK,WAAW;AACpB,MAAI,KAAK,WAAW;AACpB,MAAI,MAAM,KAAK,MAAM;AACrB,MAAI,MAAM,KAAK,MAAM;AACrB,MAAI,KAAK,KAAK;AACd,MAAI,KAAK,KAAK;AACd,MAAIE,KAAI,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AACnC,MAAIA,KAAI,QAAQ,MAAO;AAGvB,QAAM,KAAK,QAAQA;AACnB,QAAM,KAAK,QAAQA;AACnB,QAAM,KAAK,QAAQA;AACnB,QAAM,KAAK,QAAQA;AACnB,QAAM,KAAK,MAAM;AACjB,QAAM,KAAK,MAAM;AACjB,OAAK,KAAK;AACV,OAAK,KAAK;AACV,EAAAA,KAAI,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAG/B,MAAI,aAAa,QAAQ,YAAY,KAAK,EAAE;AAC5C,MAAI,aAAaA,IAAG;AAClB,QAAI,WAAW;AACf,YAAQ,QAAQ;AAChB,iBAAa,QAAQ,YAAY,KAAK,EAAE;AACxC,WAAO,aAAaA,MAAK,MAAM,SAAS,GAAG;AACzC,cAAQ,MAAM,MAAM,GAAG,EAAE,IAAI;AAC7B,mBAAa,QAAQ,YAAY,KAAK,EAAE;AAAA,IAC1C;AACA,QAAI,MAAM,SAAS,EAAG;AAAA,EACxB;AACA,MAAI;AACJ,MAAI,KAAK,GAAG;AACV,QAAI,KAAK,EAAG,SAAQ,KAAK,KAAK,KAAKA,EAAC;AAAA,QAAO,SAAQ,KAAK,KAAK,KAAKA,EAAC;AAAA,EACrE,OAAO;AACL,QAAI,KAAK,EAAG,SAAQ,KAAK,KAAK,KAAKA,EAAC,IAAI,KAAK;AAAA,QAAQ,SAAQ,KAAK,KAAK,KAAKA,EAAC,IAAI,KAAK,KAAK;AAAA,EAC7F;AACA,UAAQ,KAAI;AACZ,UAAQ,UAAU,IAAI,EAAE;AACxB,UAAQ,OAAO,KAAK;AACpB,UAAQ,SAAS,OAAO,CAAC,aAAa,GAAG,SAAS,OAAO,IAAI,IAAI;AACjE,UAAQ,QAAO;AACjB;AAEA,SAAS,kBAAkB,SAAS,MAAM,UAAU;AAClD,MAAI,CAAC,KAAK,MAAO;AACjB,MAAI,OAAO,SAAS,WAClB,OAAO,SAAS,WAChB,SAAS,SAAS,aAClB,QAAQ,SAAS,WAAW,YAAY,KAAK,SAAS,WAAW,SAAS,KAAK,SAAS,WAAW,SAAS,SAAS,SAAS,WAAW;AAC3I,UAAQ,YAAY;AACpB,UAAQ,OAAO,GAAG,OAAO,QAAQ,GAAG,EAAE,OAAO,MAAM,KAAK,EAAE,OAAO,IAAI;AACrE,UAAQ,SAAS,KAAK,OAAO,KAAK,IAAI,KAAK,OAAO,GAAG,KAAK,IAAI,OAAO,CAAC;AACxE;AAQA,SAAS,kBAAkB,SAAS,MAAM,UAAU;AAClD,MAAI,OAAO,SAAS,WAClB,OAAO,SAAS,WAChB,SAAS,SAAS;AACpB,UAAQ,OAAO,GAAG,OAAO,QAAQ,GAAG,EAAE,OAAO,MAAM,KAAK,EAAE,OAAO,IAAI;AAGrE,UAAQ,YAAY;AACpB,UAAQ,gBAAgB;AACxB,UAAQ,gBAAgB;AACxB,UAAQ,aAAa;AACrB,UAAQ,cAAc;AACtB,MAAI,UAAU;AACd,MAAI,OAAO,KAAK,UAAU,UAAU;AAClC,QAAI,YAAY,QAAQ,YAAY,KAAK,KAAK,EAAE,OAC9C,WAAW,KAAK,MAAM,YAAY,CAAC,GACnC,YAAY,KAAK,MAAM,OAAO,IAAI,OAAO,GACzC,SAAS,KAAK,IAAI,KAAK,MAAM,OAAO,CAAC,IAAI;AAC3C,QAAI,cAAc,KAAK,KAAK,YAAY,IAAI,MAAM;AAClD,QAAI,cAAc,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;AACtF,YAAQ,UAAS;AACjB,YAAQ,OAAO,KAAK,IAAI,aAAa,KAAK,IAAI,YAAY,CAAC;AAC3D,YAAQ,OAAO,KAAK,IAAI,SAAS,UAAU,KAAK,IAAI,YAAY,CAAC;AACjE,YAAQ,OAAO,KAAK,IAAI,SAAS,UAAU,KAAK,IAAI,YAAY,CAAC;AACjE,YAAQ,OAAO,KAAK,IAAI,aAAa,KAAK,IAAI,YAAY,CAAC;AAC3D,YAAQ,IAAI,KAAK,GAAG,KAAK,GAAG,QAAQ,aAAa,CAAC,WAAW;AAC7D,YAAQ,UAAS;AACjB,YAAQ,KAAI;AAAA,EACd,OAAO;AACL,YAAQ,UAAS;AACjB,YAAQ,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,OAAO,SAAS,GAAG,KAAK,KAAK,CAAC;AAC/D,YAAQ,UAAS;AACjB,YAAQ,KAAI;AAAA,EACd;AACA,UAAQ,gBAAgB;AACxB,UAAQ,gBAAgB;AACxB,UAAQ,aAAa;AAGrB,oBAAkB,SAAS,MAAM,QAAQ;AAC3C;AAGA,IAAI;AAAA;AAAA,EAA0B;AAAA;AAC9B,IAAI,2BAA2B;AAG/B,IAAI;AAAA;AAAA,EAA0B;AAAA;AAC9B,IAAI,yBAAyB;AAE7B,IAAI,0BAA0B,uBAC5B,kBAAkB,wBAAwB,eAC1C,UAAU,wBAAwB;AACpC,IAAI,aAAa,CAAC,eAAe,qBAAqB,UAAU;AAChE,IAAI,oBAAiC,0BAAU,cAAc;AAC3D,WAASC,qBAAoB;AAC3BxB,sBAAgB,MAAMwB,kBAAiB;AACvC,WAAOhB,aAAW,MAAMgB,oBAAmB,SAAS;AAAA,EACtD;AACAd,cAAUc,oBAAmB,YAAY;AACzC,SAAOrB,eAAaqB,oBAAmB,CAAC;AAAA,IACtC,KAAK;AAAA,IACL,OAAO,SAAS,gBAAgB;AAC9B,aAAO;AAAA,QACL,UAAU;AAAA,QACV,sBAAsB;AAAA,QACtB,wBAAwB;AAAA,QACxB,QAAQ,sBAAsB;AAAA,QAC9B,UAAU;AAAA,QACV,YAAY,CAAC;AAAA,UACX,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,QAChB,GAAW;AAAA,UACD,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,QAChB,GAAW;AAAA,UACD,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,YAAY;AAAA,QACtB,GAAW;AAAA,UACD,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,YAAY;AAAA,QACtB,CAAS;AAAA,QACD,qBAAqB,CAAC;AAAA,UACpB,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,QAChB,CAAS;AAAA,QACD,eAAe,CAAC,CAACA,mBAAkB,OAAO,GAAG,CAACA,mBAAkB,OAAO,GAAG,CAACA,mBAAkB,OAAO,CAAC;AAAA,MAC7G;AAAA,IACI;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,mBAAmB,WAAW,YAAY,MAAM;AAC9D,UAAI,QAAQ,KAAK;AACjB,UAAI,QAAQ,WAAW,KAAK,KAAK;AACjC,YAAM,YAAY,IAAI,KAAK;AAC3B,YAAM,YAAY,IAAI,KAAK;AAC3B,YAAM,YAAY,IAAI,KAAK;AAC3B,YAAM,YAAY,IAAI;AACtB,YAAM,YAAY,IAAI;AAAA,IACxB;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,YAAY,QAAQ,MAAM;AACxC,UAAI,KAAK,KAAK,IACZ,mBAAmB,KAAK;AAC1B,UAAI,cAAc,iBAAiB,aACjC,oBAAoB,iBAAiB,mBACrC,WAAW,iBAAiB;AAC9B,SAAG,UAAU,mBAAmB,OAAO,eAAe;AACtD,SAAG,UAAU,aAAa,OAAO,SAAS;AAC1C,SAAG,iBAAiB,UAAU,OAAO,OAAO,MAAM;AAAA,IACpD;AAAA,EACJ,CAAG,CAAC;AACJ,GAAE,WAAW;AACbT,kBAAgB,mBAAmB,WAAW,CAAC;AAC/CA,kBAAgB,mBAAmB,WAAW,IAAI,KAAK,KAAK,CAAC;AAC7DA,kBAAgB,mBAAmB,WAAW,IAAI,KAAK,KAAK,CAAC;AAG7D,IAAIU;AAAAA;AAAAA,EAA0B;AAAA;AAC9B,IAAIC,6BAA2BD;AAG/B,IAAIE;AAAAA;AAAAA,EAA0B;AAAA;AAC9B,IAAIC,2BAAyBD;AAE7B,IAAIE,4BAA0B,uBAC5BC,oBAAkBD,0BAAwB,eAC1CE,YAAUF,0BAAwB;AACpC,IAAIG,eAAa,CAAC,YAAY,eAAe,qBAAqB,sBAAsB,4BAA4B,4BAA4B;AAChJ,IAAI,0CAA0C;AAAA,EAC5C,WAAW;AAAA,EACX,wBAAwB;AAAA,EACxB,0BAA0B;AAC5B;AACA,SAAS,2BAA2B,cAAc;AAChD,MAAI,UAAUf,iBAAeA,iBAAe,CAAA,GAAI,uCAAuC,GAAG,gBAAgB,EAAE;AAC5G,SAAoB,0BAAU,cAAc;AAC1C,aAAS,uBAAuB;AAC9BjB,wBAAgB,MAAM,oBAAoB;AAC1C,aAAOQ,aAAW,MAAM,sBAAsB,SAAS;AAAA,IACzD;AACAE,gBAAU,sBAAsB,YAAY;AAC5C,WAAOP,eAAa,sBAAsB,CAAC;AAAA,MACzC,KAAK;AAAA,MACL,OAAO,SAAS,gBAAgB;AAC9B,eAAO;AAAA,UACL,UAAU;AAAA,UACV,sBAAsByB;AAAAA,UACtB,wBAAwBF;AAAAA,UACxB,QAAQ,sBAAsB;AAAA,UAC9B,UAAUM;AAAAA,UACV,YAAY,CAAC;AAAA,YACX,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAMD;AAAAA,UAClB,GAAa;AAAA,YACD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAMA;AAAAA,UAClB,GAAa;AAAA,YACD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAMA;AAAAA,UAClB,GAAa;AAAA,YACD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAMD;AAAAA,YACN,YAAY;AAAA,UACxB,GAAa;AAAA,YACD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAMA;AAAAA,YACN,YAAY;AAAA,UACxB,CAAW;AAAA,UACD,qBAAqB,CAAC;AAAA,YACpB,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAMC;AAAAA,UAClB,CAAW;AAAA,UACD,eAAe,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,QACzD;AAAA,MACM;AAAA,IACN,GAAO;AAAA,MACD,KAAK;AAAA,MACL,OAAO,SAAS,mBAAmB,WAAW,YAAY,YAAY,YAAY,MAAM;AACtF,YAAI,QAAQ,cAAc,UAAU;AAClC,cAAI,OAAO,CAAC,YAAY,UAAU;AAClC,uBAAa,KAAK,CAAC;AACnB,uBAAa,KAAK,CAAC;AAAA,QACrB;AACA,YAAI,YAAY,KAAK,QAAQ;AAC7B,YAAI,SAAS,WAAW,QAAQ;AAChC,YAAI,KAAK,WAAW;AACpB,YAAI,KAAK,WAAW;AACpB,YAAI,KAAK,WAAW;AACpB,YAAI,KAAK,WAAW;AACpB,YAAI,QAAQ,WAAW,KAAK,KAAK;AAGjC,YAAI,KAAK,KAAK;AACd,YAAI,KAAK,KAAK;AACd,YAAI,MAAM,KAAK,KAAK,KAAK;AACzB,YAAI,KAAK;AACT,YAAI,KAAK;AACT,YAAI,KAAK;AACP,gBAAM,IAAI,KAAK,KAAK,GAAG;AACvB,eAAK,CAAC,KAAK,MAAM;AACjB,eAAK,KAAK,MAAM;AAAA,QAClB;AACA,YAAI,QAAQ,KAAK;AACjB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI,CAAC;AACvB,cAAM,YAAY,IAAI,CAAC;AACvB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AAAA,MACxB;AAAA,IACN,GAAO;AAAA,MACD,KAAK;AAAA,MACL,OAAO,SAAS,YAAY,QAAQ,OAAO;AACzC,YAAI,KAAK,MAAM,IACb,mBAAmB,MAAM;AAC3B,YAAI,WAAW,iBAAiB,UAC9B,cAAc,iBAAiB,aAC/B,oBAAoB,iBAAiB,mBACrC,qBAAqB,iBAAiB,oBACtC,2BAA2B,iBAAiB,0BAC5C,6BAA6B,iBAAiB;AAChD,WAAG,iBAAiB,UAAU,OAAO,OAAO,MAAM;AAClD,WAAG,UAAU,aAAa,OAAO,SAAS;AAC1C,WAAG,UAAU,mBAAmB,OAAO,eAAe;AACtD,WAAG,UAAU,oBAAoB,OAAO,gBAAgB;AACxD,WAAG,UAAU,0BAA0B,QAAQ,sBAAsB;AACrE,WAAG,UAAU,4BAA4B,QAAQ,wBAAwB;AAAA,MAC3E;AAAA,IACN,CAAK,CAAC;AAAA,EACJ,GAAE,WAAW;AACf;AAC2B,2BAA0B;AAIrD,IAAIE;AAAAA;AAAAA,EAA0B;AAAA;AAC9B,IAAI,yBAAyBA;AAG7B,IAAI;AAAA;AAAA,EAA0B;AAAA;AAC9B,IAAIC,2BAAyB;AAE7B,IAAIC,4BAA0B,uBAC5BC,oBAAkBD,0BAAwB,eAC1CE,YAAUF,0BAAwB;AACpC,IAAIG,eAAa,CAAC,YAAY,eAAe,eAAe,qBAAqB,gBAAgB,aAAa,sBAAsB,0BAA0B;AAC9J,IAAI,uCAAuC;AAAA,EACzC,wBAAwB,wCAAwC;AAClE;AACA,SAAS,yBAAyB,cAAc;AAC9C,MAAI,UAAUrB,iBAAeA,iBAAe,CAAA,GAAI,oCAAoC,GAAmB,EAAE;AACzG,SAAoB,0BAAU,cAAc;AAC1C,aAAS,qBAAqB;AAC5BjB,wBAAgB,MAAM,kBAAkB;AACxC,aAAOQ,aAAW,MAAM,oBAAoB,SAAS;AAAA,IACvD;AACAE,gBAAU,oBAAoB,YAAY;AAC1C,WAAOP,eAAa,oBAAoB,CAAC;AAAA,MACvC,KAAK;AAAA,MACL,OAAO,SAAS,gBAAgB;AAC9B,eAAO;AAAA,UACL,UAAU;AAAA,UACV,sBAAsB+B;AAAAA,UACtB;AAAA,UACA,QAAQ,sBAAsB;AAAA,UAC9B,UAAUI;AAAAA,UACV,YAAY,CAAC;AAAA,YACX,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAMD;AAAAA,UAClB,GAAa;AAAA,YACD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAMA;AAAAA,UAClB,GAAa;AAAA,YACD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAMA;AAAAA,UAClB,GAAa;AAAA,YACD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAMD;AAAAA,YACN,YAAY;AAAA,UACxB,GAAa;AAAA,YACD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAMA;AAAAA,YACN,YAAY;AAAA,UACxB,GAAa;AAAA,YACD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAMC;AAAAA,UAClB,CAAW;AAAA,UACD,qBAAqB;AAAA;AAAA;AAAA,YAGrB;AAAA,cACE,MAAM;AAAA,cACN,MAAM;AAAA,cACN,MAAMA;AAAAA,YAClB;AAAA,YAAa;AAAA,cACD,MAAM;AAAA,cACN,MAAM;AAAA,cACN,MAAMA;AAAAA,YAClB;AAAA,YAAa;AAAA,cACD,MAAM;AAAA,cACN,MAAM;AAAA,cACN,MAAMA;AAAAA,YAClB;AAAA,UAAW;AAAA,UACD,eAAe,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;AAAA,QAC9F;AAAA,MACM;AAAA,IACN,GAAO;AAAA,MACD,KAAK;AAAA,MACL,OAAO,SAAS,mBAAmB,WAAW,YAAY,YAAY,YAAY,MAAM;AACtF,YAAI,YAAY,KAAK,QAAQ;AAC7B,YAAI,KAAK,WAAW;AACpB,YAAI,KAAK,WAAW;AACpB,YAAI,KAAK,WAAW;AACpB,YAAI,KAAK,WAAW;AACpB,YAAI,QAAQ,WAAW,KAAK,KAAK;AAGjC,YAAI,KAAK,KAAK;AACd,YAAI,KAAK,KAAK;AACd,YAAI,SAAS,WAAW,QAAQ;AAChC,YAAI,MAAM,KAAK,KAAK,KAAK;AACzB,YAAI,KAAK;AACT,YAAI,KAAK;AACT,YAAI,KAAK;AACP,gBAAM,IAAI,KAAK,KAAK,GAAG;AACvB,eAAK,CAAC,KAAK,MAAM;AACjB,eAAK,KAAK,MAAM;AAAA,QAClB;AACA,YAAI,QAAQ,KAAK;AACjB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AAAA,MACxB;AAAA,IACN,GAAO;AAAA,MACD,KAAK;AAAA,MACL,OAAO,SAAS,YAAY,QAAQ,MAAM;AACxC,YAAI,KAAK,KAAK,IACZ,mBAAmB,KAAK;AAC1B,YAAI,WAAW,iBAAiB,UAC9B,cAAc,iBAAiB,aAC/B,YAAY,iBAAiB,WAC7B,eAAe,iBAAiB,cAChC,oBAAoB,iBAAiB,mBACrC,cAAc,iBAAiB,aAC/B,qBAAqB,iBAAiB,oBACtC,2BAA2B,iBAAiB;AAC9C,WAAG,iBAAiB,UAAU,OAAO,OAAO,MAAM;AAClD,WAAG,UAAU,aAAa,OAAO,SAAS;AAC1C,WAAG,UAAU,aAAa,OAAO,SAAS;AAC1C,WAAG,UAAU,mBAAmB,OAAO,eAAe;AACtD,WAAG,UAAU,cAAc,OAAO,UAAU;AAC5C,WAAG,UAAU,WAAW,OAAO,mBAAmB;AAClD,WAAG,UAAU,oBAAoB,OAAO,gBAAgB;AACxD,WAAG,UAAU,0BAA0B,QAAQ,sBAAsB;AAAA,MACvE;AAAA,IACN,CAAK,CAAC;AAAA,EACJ,GAAE,WAAW;AACf;AACyB,yBAAwB;AAGjD,SAAS,uBAAuB,cAAc;AAC5C,SAAO,0BAA0B,CAAC,yBAAqC,GAAG,2BAA2B,YAAY,CAAC,CAAC;AACrH;AACA,IAAI,mBAAmB,uBAAsB;AAC7C,IAAI,qBAAqB;AAGzB,IAAI;AAAA;AAAA,EAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAC5B,IAAI,uBAAuB;AAE3B,IAAIE,0BAAwB,uBAC1BC,kBAAgBD,wBAAsB,eACtCE,UAAQF,wBAAsB;AAChC,IAAI,WAAW,CAAC,YAAY,eAAe,eAAe,qBAAqB,gBAAgB,aAAa,oBAAoB;AAChI,IAAI,uBAAoC,0BAAU,cAAc;AAC9D,WAASG,wBAAuB;AAC9B1C,sBAAgB,MAAM0C,qBAAoB;AAC1C,WAAOlC,aAAW,MAAMkC,uBAAsB,SAAS;AAAA,EACzD;AACAhC,cAAUgC,uBAAsB,YAAY;AAC5C,SAAOvC,eAAauC,uBAAsB,CAAC;AAAA,IACzC,KAAK;AAAA,IACL,OAAO,SAAS,gBAAgB;AAC9B,aAAO;AAAA,QACL,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,QAAQ,sBAAsB;AAAA,QAC9B;AAAA,QACA,YAAY,CAAC;AAAA,UACX,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAMD;AAAAA,QAChB,GAAW;AAAA,UACD,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAMA;AAAAA,QAChB,GAAW;AAAA,UACD,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAMA;AAAAA,QAChB,GAAW;AAAA,UACD,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAMD;AAAAA,UACN,YAAY;AAAA,QACtB,GAAW;AAAA,UACD,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAMA;AAAAA,UACN,YAAY;AAAA,QACtB,CAAS;AAAA,QACD,qBAAqB;AAAA;AAAA;AAAA,UAGrB;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAMC;AAAAA,UAChB;AAAA,UAAW;AAAA,YACD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAMA;AAAAA,UAChB;AAAA,QAAS;AAAA,QACD,eAAe,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;AAAA,MACzE;AAAA,IACI;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,mBAAmB,WAAW,YAAY,YAAY,YAAY,MAAM;AACtF,UAAI,YAAY,KAAK,QAAQ;AAC7B,UAAI,KAAK,WAAW;AACpB,UAAI,KAAK,WAAW;AACpB,UAAI,KAAK,WAAW;AACpB,UAAI,KAAK,WAAW;AACpB,UAAI,QAAQ,WAAW,KAAK,KAAK;AAGjC,UAAI,KAAK,KAAK;AACd,UAAI,KAAK,KAAK;AACd,UAAI,MAAM,KAAK,KAAK,KAAK;AACzB,UAAI,KAAK;AACT,UAAI,KAAK;AACT,UAAI,KAAK;AACP,cAAM,IAAI,KAAK,KAAK,GAAG;AACvB,aAAK,CAAC,KAAK,MAAM;AACjB,aAAK,KAAK,MAAM;AAAA,MAClB;AACA,UAAI,QAAQ,KAAK;AACjB,YAAM,YAAY,IAAI;AACtB,YAAM,YAAY,IAAI;AACtB,YAAM,YAAY,IAAI;AACtB,YAAM,YAAY,IAAI;AACtB,YAAM,YAAY,IAAI;AACtB,YAAM,YAAY,IAAI;AACtB,YAAM,YAAY,IAAI;AACtB,YAAM,YAAY,IAAI;AAAA,IACxB;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,YAAY,QAAQ,MAAM;AACxC,UAAI,KAAK,KAAK,IACZ,mBAAmB,KAAK;AAC1B,UAAI,WAAW,iBAAiB,UAC9B,cAAc,iBAAiB,aAC/B,YAAY,iBAAiB,WAC7B,eAAe,iBAAiB,cAChC,oBAAoB,iBAAiB,mBACrC,cAAc,iBAAiB,aAC/B,qBAAqB,iBAAiB;AACxC,SAAG,iBAAiB,UAAU,OAAO,OAAO,MAAM;AAClD,SAAG,UAAU,aAAa,OAAO,SAAS;AAC1C,SAAG,UAAU,aAAa,OAAO,SAAS;AAC1C,SAAG,UAAU,mBAAmB,OAAO,eAAe;AACtD,SAAG,UAAU,cAAc,OAAO,UAAU;AAC5C,SAAG,UAAU,WAAW,OAAO,mBAAmB;AAClD,SAAG,UAAU,oBAAoB,OAAO,gBAAgB;AAAA,IAC1D;AAAA,EACJ,CAAG,CAAC;AACJ,GAAE,WAAW;ACrnCb,IAAI,oBAAiC,0BAAU,MAAM;AACnD,WAASE,qBAAoB;AAC3B,QAAI;AACJ3C,sBAAgB,MAAM2C,kBAAiB;AACvC,YAAQnC,aAAW,MAAMmC,kBAAiB;AAC1C,UAAM,aAAa;AACnB,WAAO;AAAA,EACT;AACAjC,cAAUiC,oBAAmB,IAAI;AACjC,SAAOxC,eAAawC,kBAAiB;AACvC,GAAEC,wCAAY;;;AC/Bd,IAAI,SAAS,SAASC,QAAO,GAAG;AAC9B,SAAO;AACT;AACA,IAAI,cAAc,SAASC,aAAY,GAAG;AACxC,SAAO,IAAI;AACb;AACA,IAAI,eAAe,SAASC,cAAa,GAAG;AAC1C,SAAO,KAAK,IAAI;AAClB;AACA,IAAI,iBAAiB,SAASC,gBAAe,GAAG;AAC9C,OAAK,KAAK,KAAK,EAAG,QAAO,MAAM,IAAI;AACnC,SAAO,QAAQ,EAAE,KAAK,IAAI,KAAK;AACjC;AACA,IAAI,UAAU,SAASC,SAAQ,GAAG;AAChC,SAAO,IAAI,IAAI;AACjB;AACA,IAAI,WAAW,SAASC,UAAS,GAAG;AAClC,SAAO,EAAE,IAAI,IAAI,IAAI;AACvB;AACA,IAAI,aAAa,SAASC,YAAW,GAAG;AACtC,OAAK,KAAK,KAAK,EAAG,QAAO,MAAM,IAAI,IAAI;AACvC,SAAO,QAAQ,KAAK,KAAK,IAAI,IAAI;AACnC;AACA,IAAI,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMA,IAAI,mBAAmB;AAAA,EACrB,QAAQ;AAAA,EACR,UAAU;AACZ;AA4CA,SAAS,WAAW;AAClB,SAAO,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAClD;AAGA,SAAS,MAAM,GAAG,GAAG,GAAG;AACtB,IAAE,CAAC,IAAI;AACP,IAAE,CAAC,IAAI,OAAO,MAAM,WAAW,IAAI;AACnC,SAAO;AACT;AACA,SAAS,OAAO,GAAG,GAAG;AACpB,MAAI,IAAI,KAAK,IAAI,CAAC,GAChBC,KAAI,KAAK,IAAI,CAAC;AAChB,IAAE,CAAC,IAAIA;AACP,IAAE,CAAC,IAAI;AACP,IAAE,CAAC,IAAI,CAAC;AACR,IAAE,CAAC,IAAIA;AACP,SAAO;AACT;AACA,SAAS,UAAU,GAAG,GAAG,GAAG;AAC1B,IAAE,CAAC,IAAI;AACP,IAAE,CAAC,IAAI;AACP,SAAO;AACT;AACA,SAAS,SAAS,GAAG,GAAG;AACtB,MAAI,MAAM,EAAE,CAAC,GACX,MAAM,EAAE,CAAC,GACT,MAAM,EAAE,CAAC;AACX,MAAI,MAAM,EAAE,CAAC,GACX,MAAM,EAAE,CAAC,GACT,MAAM,EAAE,CAAC;AACX,MAAI,MAAM,EAAE,CAAC,GACX,MAAM,EAAE,CAAC,GACT,MAAM,EAAE,CAAC;AACX,MAAI,MAAM,EAAE,CAAC,GACX,MAAM,EAAE,CAAC,GACT,MAAM,EAAE,CAAC;AACX,MAAI,MAAM,EAAE,CAAC,GACX,MAAM,EAAE,CAAC,GACT,MAAM,EAAE,CAAC;AACX,MAAI,MAAM,EAAE,CAAC,GACX,MAAM,EAAE,CAAC,GACT,MAAM,EAAE,CAAC;AACX,IAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,IAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,IAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,IAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,IAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,IAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,IAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,IAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,IAAE,CAAC,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM;AACrC,SAAO;AACT;AACA,SAAS,aAAa,GAAG,GAAG;AAC1B,MAAI,IAAI,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI;AAC5E,MAAI,MAAM,EAAE,CAAC;AACb,MAAI,MAAM,EAAE,CAAC;AACb,MAAI,MAAM,EAAE,CAAC;AACb,MAAI,MAAM,EAAE,CAAC;AACb,MAAI,MAAM,EAAE,CAAC;AACb,MAAI,MAAM,EAAE,CAAC;AACb,MAAI,KAAK,EAAE;AACX,MAAI,KAAK,EAAE;AACX,SAAO;AAAA,IACL,GAAG,KAAK,MAAM,KAAK,MAAM,MAAM;AAAA,IAC/B,GAAG,KAAK,MAAM,KAAK,MAAM,MAAM;AAAA,EACnC;AACA;AAUA,SAAS,mBAAmB,oBAAoB,iBAAiB;AAC/D,MAAI,gBAAgB,mBAAmB,SAAS,mBAAmB;AACnE,MAAI,aAAa,gBAAgB,SAAS,gBAAgB;AAI1D,MAAI,gBAAgB,KAAK,aAAa,KAAK,gBAAgB,KAAK,aAAa,GAAG;AAC9E,WAAO;AAAA,EACT;AAKA,SAAO,KAAK,IAAI,KAAK,IAAI,YAAY,IAAI,UAAU,GAAG,KAAK,IAAI,IAAI,eAAe,aAAa,CAAC;AAClG;AAKA,SAAS,iBAAiB,OAAO,oBAAoB,iBAAiB,SAAS,SAAS;AAEtF,MAAI,QAAQ,MAAM,OAChB,QAAQ,MAAM,OACd,IAAI,MAAM,GACV,IAAI,MAAM;AACZ,MAAI,QAAQ,mBAAmB,OAC7B,SAAS,mBAAmB;AAC9B,MAAI,SAAS,SAAQ;AACrB,MAAI,oBAAoB,KAAK,IAAI,OAAO,MAAM,IAAI,IAAI;AACtD,MAAI,kBAAkB,mBAAmB,oBAAoB,eAAe;AAC5E,MAAI,CAAC,SAAS;AACZ,aAAS,QAAQ,MAAM,SAAQ,GAAI,KAAK,oBAAoB,SAAS,iBAAiB,KAAK,oBAAoB,UAAU,eAAe,CAAC;AACzI,aAAS,QAAQ,OAAO,SAAQ,GAAI,CAAC,KAAK,CAAC;AAC3C,aAAS,QAAQ,MAAM,SAAQ,GAAI,IAAI,KAAK,CAAC;AAC7C,aAAS,QAAQ,UAAU,SAAQ,GAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAAA,EAChD,OAAO;AACL,aAAS,QAAQ,UAAU,SAAQ,GAAI,GAAG,CAAC,CAAC;AAC5C,aAAS,QAAQ,MAAM,SAAQ,GAAI,KAAK,CAAC;AACzC,aAAS,QAAQ,OAAO,SAAQ,GAAI,KAAK,CAAC;AAC1C,aAAS,QAAQ,MAAM,SAAQ,GAAI,QAAQ,oBAAoB,IAAI,iBAAiB,SAAS,oBAAoB,IAAI,eAAe,CAAC;AAAA,EACvI;AACA,SAAO;AACT;AAmBA,SAAS,gBAAgB,QAAQ,aAAa,oBAAoB;AAChE,MAAI,eAAe,aAAa,QAAQ;AAAA,IACpC,GAAG,KAAK,IAAI,YAAY,KAAK;AAAA,IAC7B,GAAG,KAAK,IAAI,YAAY,KAAK;AAAA,EACnC,GAAO,CAAC,GACJ,IAAI,aAAa,GACjB,IAAI,aAAa;AACnB,SAAO,IAAI,KAAK,KAAK,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,CAAC,IAAI,mBAAmB;AAC7E;AAKA,SAAS,YAAY,OAAO;AAC1B,MAAI,CAAC,MAAM,MAAO,QAAO;AAAA,IACvB,GAAG,CAAC,GAAG,CAAC;AAAA,IACR,GAAG,CAAC,GAAG,CAAC;AAAA,EACZ;AACE,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,OAAO;AACX,QAAM,YAAY,SAAU,GAAG,MAAM;AACnC,QAAI,IAAI,KAAK,GACX,IAAI,KAAK;AACX,QAAI,IAAI,KAAM,QAAO;AACrB,QAAI,IAAI,KAAM,QAAO;AACrB,QAAI,IAAI,KAAM,QAAO;AACrB,QAAI,IAAI,KAAM,QAAO;AAAA,EACvB,CAAC;AACD,SAAO;AAAA,IACL,GAAG,CAAC,MAAM,IAAI;AAAA,IACd,GAAG,CAAC,MAAM,IAAI;AAAA,EAClB;AACA;AAKA,SAAS,cAAc,OAAO;AAE5B,MAAI,CAAC,QAAQ,KAAK,EAAG,OAAM,IAAI,MAAM,gCAAgC;AAGrE,QAAM,YAAY,SAAU,KAAK,YAAY;AAC3C,QAAI,CAAC,OAAO,SAAS,WAAW,CAAC,KAAK,CAAC,OAAO,SAAS,WAAW,CAAC,GAAG;AACpE,YAAM,IAAI,MAAM,8BAA8B,OAAO,KAAK,iEAAiE,CAAC;AAAA,IAC9H;AAAA,EACF,CAAC;AACH;AAKA,SAAS,cAAc,KAAK,OAAO,YAAY;AAC7C,MAAI,UAAU,SAAS,cAAc,GAAG;AACxC,MAAI,OAAO;AACT,aAAS,KAAK,OAAO;AACnB,cAAQ,MAAM,CAAC,IAAI,MAAM,CAAC;AAAA,IAC5B;AAAA,EACF;AACA,MAAI,YAAY;AACd,aAAS,MAAM,YAAY;AACzB,cAAQ,aAAa,IAAI,WAAW,EAAE,CAAC;AAAA,IACzC;AAAA,EACF;AACA,SAAO;AACT;AAKA,SAAS,gBAAgB;AACvB,MAAI,OAAO,OAAO,qBAAqB,YAAa,QAAO,OAAO;AAClE,SAAO;AACT;AAMA,SAAS,eAAe,SAAS,QAAQ,UAAU;AAEjD,SAAO,SAAS,KAAK,SAAU,GAAG,GAAG;AACnC,QAAI,KAAK,OAAO,CAAC,KAAK,GACpB,KAAK,OAAO,CAAC,KAAK;AACpB,QAAI,KAAK,GAAI,QAAO;AACpB,QAAI,KAAK,GAAI,QAAO;AACpB,WAAO;AAAA,EACT,CAAC;AAGH;AAMA,SAAS,4BAA4B,QAAQ;AAC3C,MAAI,YAAY,eAAe,OAAO,GAAG,CAAC,GACxC,OAAO,UAAU,CAAC,GAClB,OAAO,UAAU,CAAC,GAClB,YAAY,eAAe,OAAO,GAAG,CAAC,GACtC,OAAO,UAAU,CAAC,GAClB,OAAO,UAAU,CAAC;AACpB,MAAI,QAAQ,KAAK,IAAI,OAAO,MAAM,OAAO,IAAI,GAC3C,MAAM,OAAO,QAAQ,GACrB,MAAM,OAAO,QAAQ;AACvB,MAAI,UAAU,KAAK,KAAK,IAAI,KAAK,MAAM,YAAY,MAAM,KAAK,EAAG,SAAQ;AACzE,MAAI,MAAM,EAAE,EAAG,MAAK;AACpB,MAAI,MAAM,EAAE,EAAG,MAAK;AACpB,MAAI,KAAK,SAASC,IAAG,MAAM;AACzB,WAAO;AAAA,MACL,GAAG,OAAO,KAAK,IAAI,MAAM;AAAA,MACzB,GAAG,OAAO,KAAK,IAAI,MAAM;AAAA,IAC/B;AAAA,EACE;AAGA,KAAG,UAAU,SAAU,MAAM;AAC3B,SAAK,IAAI,OAAO,KAAK,IAAI,MAAM;AAC/B,SAAK,IAAI,OAAO,KAAK,IAAI,MAAM;AAAA,EACjC;AACA,KAAG,UAAU,SAAU,MAAM;AAC3B,WAAO;AAAA,MACL,GAAG,KAAK,SAAS,KAAK,IAAI;AAAA,MAC1B,GAAG,KAAK,SAAS,KAAK,IAAI;AAAA,IAChC;AAAA,EACE;AACA,KAAG,QAAQ;AACX,SAAO;AACT;ACrWA,SAAS,QAAQ,GAAG;AAClB;AAEA,SAAO,UAAU,cAAc,OAAO,UAAU,YAAY,OAAO,OAAO,WAAW,SAAUC,IAAG;AAChG,WAAO,OAAOA;AAAA,EAChB,IAAI,SAAUA,IAAG;AACf,WAAOA,MAAK,cAAc,OAAO,UAAUA,GAAE,gBAAgB,UAAUA,OAAM,OAAO,YAAY,WAAW,OAAOA;AAAA,EACpH,GAAG,QAAQ,CAAC;AACd;AAKA,SAAS,OAAO,OAAO,QAAQ;AAC7B,MAAI,KAAK,OAAO;AAChB,MAAI,OAAO,EAAG;AACd,MAAI,KAAK,MAAM;AACf,QAAM,UAAU;AAChB,MAAI,IAAI;AACR,SAAO,QAAQ,SAAU,OAAO;AAC9B,UAAM,KAAK,CAAC,IAAI;AAChB;AAAA,EACF,CAAC;AACH;AAYA,SAAS,OAAO,QAAQ;AACtB,WAAS,UAAU,CAAA;AACnB,WAAS,IAAI,GAAG,IAAI,UAAU,UAAU,IAAI,IAAI,UAAU,SAAS,GAAG,IAAI,GAAG,KAAK;AAChF,QAAI,IAAI,IAAI,IAAI,KAAK,UAAU,UAAU,IAAI,IAAI,SAAY,UAAU,IAAI,CAAC;AAC5E,QAAI,CAAC,EAAG;AACR,WAAO,OAAO,QAAQ,CAAC;AAAA,EACzB;AACA,SAAO;AACT;ACzBA,IAAI,mBAAmB;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,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,sBAAsB;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;AACA,IAAI,+BAA+B;AAAA,EACjC,QAAQ;AACV;AACA,IAAI,+BAA+B;AAAA,EACjC,OAAOC;AAAAA,EACP,MAAM;AACR;AACA,SAAS,iBAAiB,UAAU;AAClC,MAAI,OAAO,SAAS,iBAAiB,YAAY,SAAS,eAAe,GAAG;AAC1E,UAAM,IAAI,MAAM,gEAAgE;AAAA,EAClF;AACA,MAAI,iBAAiB,SAAS,gBAC5B,iBAAiB,SAAS;AAC5B,MAAI,OAAO,mBAAmB,YAAY,OAAO,mBAAmB,YAAY,iBAAiB,gBAAgB;AAC/G,UAAM,IAAI,MAAM,4GAA4G;AAAA,EAC9H;AACF;AACA,SAAS,gBAAgB,UAAU;AACjC,MAAI,mBAAmB,OAAO,IAAI,kBAAkB,QAAQ;AAC5D,mBAAiB,qBAAqB,OAAO,CAAA,GAAI,8BAA8B,iBAAiB,kBAAkB;AAClH,mBAAiB,qBAAqB,OAAO,CAAA,GAAI,8BAA8B,iBAAiB,kBAAkB;AAClH,SAAO;AACT;AC/FA,IAAI,wBAAwB;AAQ5B,IAAI,SAAsB,0BAAU,oBAAoB;AACtD,WAASC,UAAS;AAChB,QAAI;AACJxD,sBAAgB,MAAMwD,OAAM;AAC5B,YAAQhD,aAAW,MAAMgD,OAAM;AAG/BzC,sBAAgB,OAAO,KAAK,GAAG;AAC/BA,sBAAgB,OAAO,KAAK,GAAG;AAC/BA,sBAAgB,OAAO,SAAS,CAAC;AACjCA,sBAAgB,OAAO,SAAS,CAAC;AACjCA,sBAAgB,OAAO,YAAY,IAAI;AACvCA,sBAAgB,OAAO,YAAY,IAAI;AACvCA,sBAAgB,OAAO,kBAAkB,IAAI;AAC7CA,sBAAgB,OAAO,kBAAkB,IAAI;AAC7CA,sBAAgB,OAAO,mBAAmB,IAAI;AAC9CA,sBAAgB,OAAO,SAAS,IAAI;AACpCA,sBAAgB,OAAO,aAAa,IAAI;AACxCA,sBAAgB,OAAO,iBAAiB,IAAI;AAC5CA,sBAAgB,OAAO,WAAW,IAAI;AACtC,UAAM,gBAAgB,MAAM,SAAQ;AACpC,WAAO;AAAA,EACT;AAKAL,cAAU8C,SAAQ,kBAAkB;AACpC,SAAOrD,eAAaqD,SAAQ,CAAC;AAAA,IAC3B,KAAK;AAAA,IACL;AAAA;AAAA;AAAA;AAAA,MAIA,SAAS,SAAS;AAChB,aAAK,UAAU;AACf,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,UAAU;AACxB,WAAK,UAAU;AACf,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,WAAW;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,SAAS,SAAS,OAAO;AAC9B,aAAO,KAAK,MAAM,MAAM,KAAK,KAAK,MAAM,MAAM,KAAK,KAAK,UAAU,MAAM,SAAS,KAAK,UAAU,MAAM;AAAA,IACxG;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,mBAAmB;AACjC,UAAI,QAAQ,KAAK;AACjB,UAAI,CAAC,MAAO,QAAO;AACnB,aAAO;AAAA,QACL,GAAG,MAAM;AAAA,QACT,GAAG,MAAM;AAAA,QACT,OAAO,MAAM;AAAA,QACb,OAAO,MAAM;AAAA,MACrB;AAAA,IACI;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,gBAAgB,OAAO;AACrC,UAAI,IAAI;AACR,UAAI,OAAO,KAAK,aAAa,SAAU,KAAI,KAAK,IAAI,GAAG,KAAK,QAAQ;AACpE,UAAI,OAAO,KAAK,aAAa,SAAU,KAAI,KAAK,IAAI,GAAG,KAAK,QAAQ;AACpE,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,cAAc,OAAO;AACnC,UAAI,iBAAiB,CAAA;AACrB,UAAI,KAAK,kBAAkB,OAAO,MAAM,MAAM,SAAU,gBAAe,IAAI,MAAM;AACjF,UAAI,KAAK,kBAAkB,OAAO,MAAM,MAAM,SAAU,gBAAe,IAAI,MAAM;AACjF,UAAI,KAAK,kBAAkB,OAAO,MAAM,UAAU,SAAU,gBAAe,QAAQ,KAAK,gBAAgB,MAAM,KAAK;AACnH,UAAI,KAAK,mBAAmB,OAAO,MAAM,UAAU,SAAU,gBAAe,QAAQ,MAAM;AAC1F,aAAO,KAAK,QAAQ,KAAK,MAAMvC,iBAAeA,iBAAe,CAAA,GAAI,KAAK,SAAQ,CAAE,GAAG,cAAc,CAAC,IAAI;AAAA,IACxG;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,aAAa;AAC3B,aAAO,CAAC,CAAC,KAAK;AAAA,IAChB;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,SAAS,OAAO;AAC9B,UAAI,CAAC,KAAK,QAAS,QAAO;AAG1B,WAAK,gBAAgB,KAAK,SAAQ;AAClC,UAAI,aAAa,KAAK,cAAc,KAAK;AACzC,UAAI,OAAO,WAAW,MAAM,SAAU,MAAK,IAAI,WAAW;AAC1D,UAAI,OAAO,WAAW,MAAM,SAAU,MAAK,IAAI,WAAW;AAC1D,UAAI,OAAO,WAAW,UAAU,SAAU,MAAK,QAAQ,WAAW;AAClE,UAAI,OAAO,WAAW,UAAU,SAAU,MAAK,QAAQ,WAAW;AAGlE,UAAI,CAAC,KAAK,SAAS,KAAK,aAAa,EAAG,MAAK,KAAK,WAAW,KAAK,SAAQ,CAAE;AAC5E,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,YAAY,SAAS;AACnC,WAAK,SAAS,QAAQ,KAAK,SAAQ,CAAE,CAAC;AACtC,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,QAAQ,OAAO;AAC7B,UAAI,SAAS;AACb,UAAI,OAAO,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AAC/E,UAAI,WAAW,UAAU,SAAS,IAAI,UAAU,CAAC,IAAI;AACrD,UAAI,CAAC,SAAU,QAAO,IAAI,QAAQ,SAAU,SAAS;AACnD,eAAO,OAAO,QAAQ,OAAO,MAAM,OAAO;AAAA,MAC5C,CAAC;AACD,UAAI,CAAC,KAAK,QAAS;AACnB,UAAI,UAAUA,iBAAeA,iBAAe,CAAA,GAAI,gBAAgB,GAAG,IAAI;AACvE,UAAI,aAAa,KAAK,cAAc,KAAK;AACzC,UAAI,SAAS,OAAO,QAAQ,WAAW,aAAa,QAAQ,SAAS,QAAQ,QAAQ,MAAM;AAG3F,UAAI,QAAQ,KAAK,IAAG,GAClB,eAAe,KAAK,SAAQ;AAG9B,UAAI,MAAM,SAAS,KAAK;AACtB,YAAIpB,MAAK,KAAK,IAAG,IAAK,SAAS,QAAQ;AAGvC,YAAIA,MAAK,GAAG;AACV,iBAAO,YAAY;AACnB,iBAAO,SAAS,UAAU;AAC1B,cAAI,OAAO,mBAAmB;AAC5B,mBAAO,kBAAkB,KAAK,IAAI;AAClC,mBAAO,oBAAoB;AAAA,UAC7B;AACA;AAAA,QACF;AACA,YAAI,cAAc,OAAOA,EAAC;AAC1B,YAAI,WAAW,CAAA;AACf,YAAI,OAAO,WAAW,MAAM,SAAU,UAAS,IAAI,aAAa,KAAK,WAAW,IAAI,aAAa,KAAK;AACtG,YAAI,OAAO,WAAW,MAAM,SAAU,UAAS,IAAI,aAAa,KAAK,WAAW,IAAI,aAAa,KAAK;AACtG,YAAI,OAAO,mBAAmB,OAAO,WAAW,UAAU,SAAU,UAAS,QAAQ,aAAa,SAAS,WAAW,QAAQ,aAAa,SAAS;AACpJ,YAAI,OAAO,WAAW,UAAU,SAAU,UAAS,QAAQ,aAAa,SAAS,WAAW,QAAQ,aAAa,SAAS;AAC1H,eAAO,SAAS,QAAQ;AACxB,eAAO,YAAY,sBAAsB,GAAG;AAAA,MAC9C;AACA,UAAI,KAAK,WAAW;AAClB,6BAAqB,KAAK,SAAS;AACnC,YAAI,KAAK,kBAAmB,MAAK,kBAAkB,KAAK,IAAI;AAC5D,aAAK,YAAY,sBAAsB,GAAG;AAAA,MAC5C,OAAO;AACL,YAAG;AAAA,MACL;AACA,WAAK,oBAAoB;AAAA,IAC3B;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,aAAa,iBAAiB;AAC5C,UAAI,CAAC,gBAAiB,QAAO,KAAK,QAAQ;AAAA,QACxC,OAAO,KAAK,QAAQ;AAAA,MAC5B,CAAO;AACD,UAAI,OAAO,oBAAoB,SAAU,QAAO,KAAK,QAAQ;AAAA,QAC3D,OAAO,KAAK,QAAQ;AAAA,MAC5B,CAAO;AACD,aAAO,KAAK,QAAQ;AAAA,QAClB,OAAO,KAAK,SAAS,gBAAgB,UAAU;AAAA,MACvD,GAAS,eAAe;AAAA,IACpB;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,eAAe,iBAAiB;AAC9C,UAAI,CAAC,gBAAiB,QAAO,KAAK,QAAQ;AAAA,QACxC,OAAO,KAAK,QAAQ;AAAA,MAC5B,CAAO;AACD,UAAI,OAAO,oBAAoB,SAAU,QAAO,KAAK,QAAQ;AAAA,QAC3D,OAAO,KAAK,QAAQ;AAAA,MAC5B,CAAO;AACD,aAAO,KAAK,QAAQ;AAAA,QAClB,OAAO,KAAK,SAAS,gBAAgB,UAAU;AAAA,MACvD,GAAS,eAAe;AAAA,IACpB;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,cAAc,SAAS;AACrC,aAAO,KAAK,QAAQ;AAAA,QAClB,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAO;AAAA,QACP,OAAO;AAAA,MACf,GAAS,OAAO;AAAA,IACZ;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,OAAO;AACrB,aAAO2D,QAAO,KAAK,KAAK,SAAQ,CAAE;AAAA,IACpC;AAAA,EACJ,CAAG,GAAG,CAAC;AAAA,IACH,KAAK;AAAA,IACL,OAAO,SAAS,KAAK,OAAO;AAC1B,UAAI,SAAS,IAAIA,QAAM;AACvB,aAAO,OAAO,SAAS,KAAK;AAAA,IAC9B;AAAA,EACJ,CAAG,CAAC;AACJ,GAAE,iBAAiB;AAiBnB,SAAS,YAAY1D,IAAG,KAAK;AAC3B,MAAI,OAAO,IAAI,sBAAqB;AACpC,SAAO;AAAA,IACL,GAAGA,GAAE,UAAU,KAAK;AAAA,IACpB,GAAGA,GAAE,UAAU,KAAK;AAAA,EACxB;AACA;AASA,SAAS,eAAeA,IAAG,KAAK;AAC9B,MAAI,MAAMmB,iBAAeA,iBAAe,CAAA,GAAI,YAAYnB,IAAG,GAAG,CAAC,GAAG,IAAI;AAAA,IACpE,uBAAuB;AAAA,IACvB,qBAAqB,SAAS,sBAAsB;AAClD,UAAI,wBAAwB;AAAA,IAC9B;AAAA,IACA,UAAUA;AAAA,EACd,CAAG;AACD,SAAO;AACT;AAKA,SAAS,iBAAiBA,IAAG;AAC3B,MAAI,MAAM,OAAOA,KAAIA,KAAImB,iBAAeA,iBAAe,CAAA,GAAInB,GAAE,QAAQ,CAAC,KAAKA,GAAE,gBAAgB,CAAC,CAAC,GAAG,IAAI;AAAA,IACpG,UAAUA,GAAE;AAAA,IACZ,uBAAuBA,GAAE;AAAA,IACzB,qBAAqB,SAAS,sBAAsB;AAClD,MAAAA,GAAE,wBAAwB;AAC1B,UAAI,wBAAwB;AAAA,IAC9B;AAAA,EACJ,CAAG;AACD,SAAO;AACT;AASA,SAAS,eAAeA,IAAG,KAAK;AAC9B,SAAOmB,iBAAeA,iBAAe,IAAI,eAAenB,IAAG,GAAG,CAAC,GAAG,IAAI;AAAA,IACpE,OAAO,cAAcA,EAAC;AAAA,EAC1B,CAAG;AACH;AACA,IAAI,cAAc;AAClB,SAAS,gBAAgB,SAAS;AAChC,MAAI,MAAM,CAAA;AACV,WAAS,IAAI,GAAG,IAAI,KAAK,IAAI,QAAQ,QAAQ,WAAW,GAAG,IAAI,GAAG,IAAK,KAAI,KAAK,QAAQ,CAAC,CAAC;AAC1F,SAAO;AACT;AAUA,SAAS,eAAeA,IAAG,iBAAiB,KAAK;AAC/C,MAAI,MAAM;AAAA,IACR,SAAS,gBAAgBA,GAAE,OAAO,EAAE,IAAI,SAAU,OAAO;AACvD,aAAO,YAAY,OAAO,GAAG;AAAA,IAC/B,CAAC;AAAA,IACD,iBAAiB,gBAAgB,IAAI,SAAU,OAAO;AACpD,aAAO,YAAY,OAAO,GAAG;AAAA,IAC/B,CAAC;AAAA,IACD,uBAAuB;AAAA,IACvB,qBAAqB,SAAS,sBAAsB;AAClD,UAAI,wBAAwB;AAAA,IAC9B;AAAA,IACA,UAAUA;AAAA,EACd;AACE,SAAO;AACT;AAQA,SAAS,cAAcA,IAAG;AAExB,MAAI,OAAOA,GAAE,WAAW,YAAa,QAAOA,GAAE,SAAS,KAAK;AAC5D,MAAI,OAAOA,GAAE,WAAW,YAAa,QAAOA,GAAE,SAAS;AACvD,QAAM,IAAI,MAAM,6CAA6C;AAC/D;AAKA,IAAI,SAAsB,0BAAU,oBAAoB;AACtD,WAAS2D,QAAO,WAAW,UAAU;AACnC,QAAI;AACJzD,sBAAgB,MAAMyD,OAAM;AAC5B,YAAQjD,aAAW,MAAMiD,OAAM;AAE/B,UAAM,YAAY;AAClB,UAAM,WAAW;AACjB,WAAO;AAAA,EACT;AACA/C,cAAU+C,SAAQ,kBAAkB;AACpC,SAAOtD,eAAasD,OAAM;AAC5B,GAAE,iBAAiB;AAEnB,IAAI,sBAAsB,CAAC,sBAAsB,8BAA8B,2BAA2B,eAAe,0BAA0B,mBAAmB,gBAAgB,gBAAgB,cAAc;AACpN,IAAI,yBAAyB,oBAAoB,OAAO,SAAU,MAAM,KAAK;AAC3E,SAAOxC,iBAAeA,iBAAe,CAAA,GAAI,IAAI,GAAG,CAAA,GAAIF,kBAAgB,CAAA,GAAI,KAAK,iBAAiB,GAAG,CAAC,CAAC;AACrG,GAAG,EAAE;AAUL,IAAI,cAA2B,0BAAU,SAAS;AAChD,WAAS2C,aAAY,WAAW,UAAU;AACxC,QAAI;AACJ1D,sBAAgB,MAAM0D,YAAW;AACjC,YAAQlD,aAAW,MAAMkD,cAAa,CAAC,WAAW,QAAQ,CAAC;AAI3D3C,sBAAgB,OAAO,WAAW,IAAI;AACtCA,sBAAgB,OAAO,iBAAiB,CAAC;AACzCA,sBAAgB,OAAO,iBAAiB,IAAI;AAC5CA,sBAAgB,OAAO,cAAc,IAAI;AACzCA,sBAAgB,OAAO,cAAc,IAAI;AACzCA,sBAAgB,OAAO,eAAe,KAAK;AAC3CA,sBAAgB,OAAO,YAAY,KAAK;AACxCA,sBAAgB,OAAO,iBAAiB,IAAI;AAC5CA,sBAAgB,OAAO,oBAAoB,IAAI;AAC/CA,sBAAgB,OAAO,UAAU,CAAC;AAClCA,sBAAgB,OAAO,sBAAsB,IAAI;AACjDA,sBAAgB,OAAO,yBAAyB,CAAC;AACjDA,sBAAgB,OAAO,YAAY,sBAAsB;AACzD,UAAM,cAAc,MAAM,YAAY,KAAK,KAAK;AAChD,UAAM,mBAAmB,MAAM,iBAAiB,KAAK,KAAK;AAC1D,UAAM,aAAa,MAAM,WAAW,KAAK,KAAK;AAC9C,UAAM,WAAW,MAAM,SAAS,KAAK,KAAK;AAC1C,UAAM,aAAa,MAAM,WAAW,KAAK,KAAK;AAC9C,UAAM,cAAc,MAAM,YAAY,KAAK,KAAK;AAChD,UAAM,cAAc,MAAM,YAAY,KAAK,KAAK;AAChD,UAAM,cAAc,MAAM,YAAY,KAAK,KAAK;AAGhD,cAAU,iBAAiB,SAAS,MAAM,aAAa;AAAA,MACrD,SAAS;AAAA,IACf,CAAK;AACD,cAAU,iBAAiB,eAAe,MAAM,kBAAkB;AAAA,MAChE,SAAS;AAAA,IACf,CAAK;AACD,cAAU,iBAAiB,aAAa,MAAM,YAAY;AAAA,MACxD,SAAS;AAAA,IACf,CAAK;AACD,cAAU,iBAAiB,SAAS,MAAM,aAAa;AAAA,MACrD,SAAS;AAAA,IACf,CAAK;AACD,cAAU,iBAAiB,cAAc,MAAM,aAAa;AAAA,MAC1D,SAAS;AAAA,IACf,CAAK;AACD,cAAU,iBAAiB,cAAc,MAAM,aAAa;AAAA,MAC1D,SAAS;AAAA,IACf,CAAK;AACD,aAAS,iBAAiB,aAAa,MAAM,YAAY;AAAA,MACvD,SAAS;AAAA,IACf,CAAK;AACD,aAAS,iBAAiB,WAAW,MAAM,UAAU;AAAA,MACnD,SAAS;AAAA,IACf,CAAK;AACD,WAAO;AAAA,EACT;AACAL,cAAUgD,cAAa,OAAO;AAC9B,SAAOvD,eAAauD,cAAa,CAAC;AAAA,IAChC,KAAK;AAAA,IACL,OAAO,SAAS,OAAO;AACrB,UAAI,YAAY,KAAK;AACrB,gBAAU,oBAAoB,SAAS,KAAK,WAAW;AACvD,gBAAU,oBAAoB,eAAe,KAAK,gBAAgB;AAClE,gBAAU,oBAAoB,aAAa,KAAK,UAAU;AAC1D,gBAAU,oBAAoB,SAAS,KAAK,WAAW;AACvD,gBAAU,oBAAoB,cAAc,KAAK,WAAW;AAC5D,gBAAU,oBAAoB,cAAc,KAAK,WAAW;AAC5D,eAAS,oBAAoB,aAAa,KAAK,UAAU;AACzD,eAAS,oBAAoB,WAAW,KAAK,QAAQ;AAAA,IACvD;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,YAAY5D,IAAG;AAC7B,UAAI,SAAS;AACb,UAAI,CAAC,KAAK,QAAS;AACnB,WAAK;AACL,UAAI,KAAK,WAAW,GAAG;AACrB,aAAK,SAAS;AACd,YAAI,OAAO,KAAK,uBAAuB,UAAU;AAC/C,uBAAa,KAAK,kBAAkB;AACpC,eAAK,qBAAqB;AAAA,QAC5B;AACA,eAAO,KAAK,kBAAkBA,EAAC;AAAA,MACjC;AACA,iBAAW,WAAY;AACrB,eAAO,SAAS;AAChB,eAAO,qBAAqB;AAAA,MAC9B,GAAG,KAAK,SAAS,kBAAkB;AAGnC,UAAI,KAAK,gBAAgB,KAAK,SAAS,uBAAwB,MAAK,KAAK,SAAS,eAAeA,IAAG,KAAK,SAAS,CAAC;AAAA,IACrH;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,iBAAiBA,IAAG;AAClC,UAAI,CAAC,KAAK,QAAS;AACnB,WAAK,KAAK,cAAc,eAAeA,IAAG,KAAK,SAAS,CAAC;AAAA,IAC3D;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,kBAAkBA,IAAG;AACnC,UAAI,CAAC,KAAK,QAAS;AACnB,MAAAA,GAAE,eAAc;AAChB,MAAAA,GAAE,gBAAe;AACjB,UAAI,cAAc,eAAeA,IAAG,KAAK,SAAS;AAClD,WAAK,KAAK,eAAe,WAAW;AACpC,UAAI,YAAY,sBAAuB;AAGvC,UAAI,SAAS,KAAK,SAAS,UAAS;AACpC,UAAI,WAAW,OAAO,gBAAgB,OAAO,SAAQ,EAAG,QAAQ,KAAK,SAAS,uBAAuB;AACrG,aAAO,QAAQ,KAAK,SAAS,uBAAuB,YAAYA,IAAG,KAAK,SAAS,GAAG,QAAQ,GAAG;AAAA,QAC7F,QAAQ;AAAA,QACR,UAAU,KAAK,SAAS;AAAA,MAChC,CAAO;AAAA,IACH;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,WAAWA,IAAG;AAC5B,UAAI,CAAC,KAAK,QAAS;AAGnB,UAAIA,GAAE,WAAW,GAAG;AAClB,aAAK,mBAAmB,KAAK,SAAS,UAAS,EAAG,SAAQ;AAC1D,YAAI,eAAe,YAAYA,IAAG,KAAK,SAAS,GAC9C,IAAI,aAAa,GACjB,IAAI,aAAa;AACnB,aAAK,aAAa;AAClB,aAAK,aAAa;AAClB,aAAK,gBAAgB;AACrB,aAAK,gBAAgB,KAAK,IAAG;AAC7B,aAAK,cAAc;AAAA,MACrB;AACA,WAAK,KAAK,aAAa,eAAeA,IAAG,KAAK,SAAS,CAAC;AAAA,IAC1D;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,SAASA,IAAG;AAC1B,UAAI,SAAS;AACb,UAAI,CAAC,KAAK,WAAW,CAAC,KAAK,YAAa;AACxC,UAAI,SAAS,KAAK,SAAS,UAAS;AACpC,WAAK,cAAc;AACnB,UAAI,OAAO,KAAK,kBAAkB,UAAU;AAC1C,qBAAa,KAAK,aAAa;AAC/B,aAAK,gBAAgB;AAAA,MACvB;AACA,UAAI,gBAAgB,YAAYA,IAAG,KAAK,SAAS,GAC/C,IAAI,cAAc,GAClB,IAAI,cAAc;AACpB,UAAI,cAAc,OAAO,SAAQ,GAC/B,sBAAsB,OAAO,sBAAsB;AAAA,QACjD,GAAG;AAAA,QACH,GAAG;AAAA,MACb;AACM,UAAI,KAAK,UAAU;AACjB,eAAO,QAAQ;AAAA,UACb,GAAG,YAAY,IAAI,KAAK,SAAS,gBAAgB,YAAY,IAAI,oBAAoB;AAAA,UACrF,GAAG,YAAY,IAAI,KAAK,SAAS,gBAAgB,YAAY,IAAI,oBAAoB;AAAA,QAC/F,GAAW;AAAA,UACD,UAAU,KAAK,SAAS;AAAA,UACxB,QAAQ;AAAA,QAClB,CAAS;AAAA,MACH,WAAW,KAAK,eAAe,KAAK,KAAK,eAAe,GAAG;AACzD,eAAO,SAAS;AAAA,UACd,GAAG,YAAY;AAAA,UACf,GAAG,YAAY;AAAA,QACzB,CAAS;AAAA,MACH;AACA,WAAK,WAAW;AAChB,iBAAW,WAAY;AACrB,YAAI,gBAAgB,OAAO,gBAAgB;AAC3C,eAAO,gBAAgB;AAQvB,YAAI,iBAAiB,OAAO,SAAS,WAAW,iBAAiB,EAAG,QAAO,SAAS,QAAO;AAAA,MAC7F,GAAG,CAAC;AACJ,WAAK,KAAK,WAAW,eAAeA,IAAG,KAAK,SAAS,CAAC;AAAA,IACxD;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,WAAWA,IAAG;AAC5B,UAAI,SAAS;AACb,UAAI,CAAC,KAAK,QAAS;AACnB,UAAI,cAAc,eAAeA,IAAG,KAAK,SAAS;AAKlD,WAAK,KAAK,iBAAiB,WAAW;AAKtC,UAAIA,GAAE,WAAW,KAAK,aAAaA,GAAE,aAAY,EAAG,CAAC,MAAM,KAAK,WAAW;AACzE,aAAK,KAAK,aAAa,WAAW;AAAA,MACpC;AACA,UAAI,YAAY,sBAAuB;AAIvC,UAAI,KAAK,aAAa;AACpB,aAAK,WAAW;AAChB,aAAK;AACL,YAAI,OAAO,KAAK,kBAAkB,UAAU;AAC1C,uBAAa,KAAK,aAAa;AAAA,QACjC;AACA,aAAK,gBAAgB,OAAO,WAAW,WAAY;AACjD,iBAAO,gBAAgB;AACvB,iBAAO,WAAW;AAAA,QACpB,GAAG,KAAK,SAAS,WAAW;AAC5B,YAAI,SAAS,KAAK,SAAS,UAAS;AACpC,YAAI,gBAAgB,YAAYA,IAAG,KAAK,SAAS,GAC/C,KAAK,cAAc,GACnB,KAAK,cAAc;AACrB,YAAI,YAAY,KAAK,SAAS,sBAAsB;AAAA,UAClD,GAAG,KAAK;AAAA,UACR,GAAG,KAAK;AAAA,QAClB,CAAS;AACD,YAAI,QAAQ,KAAK,SAAS,sBAAsB;AAAA,UAC9C,GAAG;AAAA,UACH,GAAG;AAAA,QACb,CAAS;AACD,YAAI,UAAU,UAAU,IAAI,MAAM,GAChC,UAAU,UAAU,IAAI,MAAM;AAChC,YAAI,cAAc,OAAO,SAAQ;AACjC,YAAI,IAAI,YAAY,IAAI,SACtB,IAAI,YAAY,IAAI;AACtB,eAAO,SAAS;AAAA,UACd;AAAA,UACA;AAAA,QACV,CAAS;AACD,aAAK,aAAa;AAClB,aAAK,aAAa;AAClB,QAAAA,GAAE,eAAc;AAChB,QAAAA,GAAE,gBAAe;AAAA,MACnB;AAAA,IACF;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,YAAYA,IAAG;AAC7B,WAAK,KAAK,cAAc,eAAeA,IAAG,KAAK,SAAS,CAAC;AAAA,IAC3D;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,YAAYA,IAAG;AAC7B,WAAK,KAAK,cAAc,eAAeA,IAAG,KAAK,SAAS,CAAC;AAAA,IAC3D;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,YAAYA,IAAG;AAC7B,UAAI,SAAS;AACb,UAAI,SAAS,KAAK,SAAS,UAAS;AACpC,UAAI,CAAC,KAAK,WAAW,CAAC,OAAO,eAAgB;AAC7C,UAAI,QAAQ,cAAcA,EAAC;AAC3B,UAAI,CAAC,MAAO;AACZ,UAAI,cAAc,eAAeA,IAAG,KAAK,SAAS;AAClD,WAAK,KAAK,SAAS,WAAW;AAC9B,UAAI,YAAY,uBAAuB;AACrC,QAAAA,GAAE,eAAc;AAChB,QAAAA,GAAE,gBAAe;AACjB;AAAA,MACF;AAGA,UAAI,eAAe,OAAO,SAAQ,EAAG;AACrC,UAAI,YAAY,QAAQ,IAAI,IAAI,KAAK,SAAS,eAAe,KAAK,SAAS;AAC3E,UAAI,WAAW,OAAO,gBAAgB,eAAe,SAAS;AAC9D,UAAI,iBAAiB,QAAQ,IAAI,IAAI;AACrC,UAAI,MAAM,KAAK,IAAG;AAGlB,UAAI,iBAAiB,SAAU;AAC/B,MAAAA,GAAE,eAAc;AAChB,MAAAA,GAAE,gBAAe;AAGjB,UAAI,KAAK,0BAA0B,kBAAkB,KAAK,wBAAwB,MAAM,KAAK,uBAAuB,KAAK,SAAS,eAAe,GAAG;AAClJ;AAAA,MACF;AACA,aAAO,QAAQ,KAAK,SAAS,uBAAuB,YAAYA,IAAG,KAAK,SAAS,GAAG,QAAQ,GAAG;AAAA,QAC7F,QAAQ;AAAA,QACR,UAAU,KAAK,SAAS;AAAA,MAChC,GAAS,WAAY;AACb,eAAO,wBAAwB;AAAA,MACjC,CAAC;AACD,WAAK,wBAAwB;AAC7B,WAAK,uBAAuB;AAAA,IAC9B;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,YAAY,UAAU;AACpC,WAAK,WAAW;AAAA,IAClB;AAAA,EACJ,CAAG,CAAC;AACJ,GAAE,MAAM;AAER,IAAI,sBAAsB,CAAC,eAAe,mBAAmB,gBAAgB,sBAAsB,2BAA2B,8BAA8B,kBAAkB;AAC9K,IAAI,yBAAyB,oBAAoB,OAAO,SAAU,MAAM,KAAK;AAC3E,SAAOmB,iBAAeA,iBAAe,CAAA,GAAI,IAAI,GAAG,CAAA,GAAIF,kBAAgB,CAAA,GAAI,KAAK,iBAAiB,GAAG,CAAC,CAAC;AACrG,GAAG,EAAE;AAUL,IAAI,cAA2B,0BAAU,SAAS;AAChD,WAAS4C,aAAY,WAAW,UAAU;AACxC,QAAI;AACJ3D,sBAAgB,MAAM2D,YAAW;AACjC,YAAQnD,aAAW,MAAMmD,cAAa,CAAC,WAAW,QAAQ,CAAC;AAG3D5C,sBAAgB,OAAO,WAAW,IAAI;AACtCA,sBAAgB,OAAO,YAAY,KAAK;AACxCA,sBAAgB,OAAO,YAAY,KAAK;AACxCA,sBAAgB,OAAO,aAAa,CAAC;AACrCA,sBAAgB,OAAO,yBAAyB,EAAE;AAClDA,sBAAgB,OAAO,eAAe,EAAE;AACxCA,sBAAgB,OAAO,WAAW,IAAI;AACtCA,sBAAgB,OAAO,YAAY,sBAAsB;AACzD,UAAM,cAAc,MAAM,YAAY,KAAK,KAAK;AAChD,UAAM,cAAc,MAAM,YAAY,KAAK,KAAK;AAChD,UAAM,aAAa,MAAM,WAAW,KAAK,KAAK;AAG9C,cAAU,iBAAiB,cAAc,MAAM,aAAa;AAAA,MAC1D,SAAS;AAAA,IACf,CAAK;AACD,cAAU,iBAAiB,eAAe,MAAM,aAAa;AAAA,MAC3D,SAAS;AAAA,IACf,CAAK;AACD,aAAS,iBAAiB,YAAY,MAAM,aAAa;AAAA,MACvD,SAAS;AAAA,MACT,SAAS;AAAA,IACf,CAAK;AACD,aAAS,iBAAiB,aAAa,MAAM,YAAY;AAAA,MACvD,SAAS;AAAA,MACT,SAAS;AAAA,IACf,CAAK;AACD,WAAO;AAAA,EACT;AACAL,cAAUiD,cAAa,OAAO;AAC9B,SAAOxD,eAAawD,cAAa,CAAC;AAAA,IAChC,KAAK;AAAA,IACL,OAAO,SAAS,OAAO;AACrB,UAAI,YAAY,KAAK;AACrB,gBAAU,oBAAoB,cAAc,KAAK,WAAW;AAC5D,gBAAU,oBAAoB,eAAe,KAAK,WAAW;AAC7D,eAAS,oBAAoB,YAAY,KAAK,WAAW;AACzD,eAAS,oBAAoB,aAAa,KAAK,UAAU;AAAA,IAC3D;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,gBAAgB;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,SAAS,YAAY7D,IAAG;AAC7B,UAAI,SAAS;AACb,UAAI,CAAC,KAAK,QAAS;AACnB,MAAAA,GAAE,eAAc;AAChB,UAAI,UAAU,gBAAgBA,GAAE,OAAO;AACvC,WAAK,YAAY,QAAQ;AACzB,WAAK,mBAAmB,KAAK,SAAS,UAAS,EAAG,SAAQ;AAC1D,WAAK,wBAAwB,QAAQ,IAAI,SAAU,OAAO;AACxD,eAAO,YAAY,OAAO,OAAO,SAAS;AAAA,MAC5C,CAAC;AAGD,UAAI,KAAK,cAAc,GAAG;AACxB,YAAI,wBAAwB,eAAe,KAAK,uBAAuB,CAAC,GACtE,yBAAyB,sBAAsB,CAAC,GAChD,KAAK,uBAAuB,GAC5B,KAAK,uBAAuB,GAC5B,yBAAyB,sBAAsB,CAAC,GAChD,KAAK,uBAAuB,GAC5B,KAAK,uBAAuB;AAC9B,aAAK,oBAAoB,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE;AACpD,aAAK,uBAAuB,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AAAA,MACnF;AACA,WAAK,KAAK,aAAa,eAAeA,IAAG,KAAK,aAAa,KAAK,SAAS,CAAC;AAC1E,WAAK,cAAc;AACnB,WAAK,uBAAuB,KAAK;AAAA,IACnC;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,YAAYA,IAAG;AAC7B,UAAI,CAAC,KAAK,WAAW,CAAC,KAAK,sBAAsB,OAAQ;AACzD,UAAIA,GAAE,WAAY,CAAAA,GAAE,eAAc;AAClC,UAAI,KAAK,eAAe;AACtB,aAAK,WAAW;AAChB,qBAAa,KAAK,aAAa;AAAA,MACjC;AACA,cAAQ,KAAK,WAAS;AAAA;AAAA;AAAA,QAGpB,KAAK;AACH,cAAIA,GAAE,QAAQ,WAAW,GAAG;AAC1B,iBAAK,YAAYA,EAAC;AAClB,YAAAA,GAAE,eAAc;AAChB;AAAA,UACF;AAAA;AAAA,QAEF,KAAK;AACH,cAAI,KAAK,UAAU;AACjB,gBAAI,SAAS,KAAK,SAAS,UAAS;AACpC,gBAAI,cAAc,OAAO,SAAQ,GAC/B,sBAAsB,OAAO,sBAAsB;AAAA,cACjD,GAAG;AAAA,cACH,GAAG;AAAA,YACnB;AACY,mBAAO,QAAQ;AAAA,cACb,GAAG,YAAY,IAAI,KAAK,SAAS,gBAAgB,YAAY,IAAI,oBAAoB;AAAA,cACrF,GAAG,YAAY,IAAI,KAAK,SAAS,gBAAgB,YAAY,IAAI,oBAAoB;AAAA,YACnG,GAAe;AAAA,cACD,UAAU,KAAK,SAAS;AAAA,cACxB,QAAQ;AAAA,YACtB,CAAa;AAAA,UACH;AACA,eAAK,WAAW;AAChB,eAAK,WAAW;AAChB,eAAK,YAAY;AACjB;AAAA,MACV;AACM,WAAK,KAAK,WAAW,eAAeA,IAAG,KAAK,aAAa,KAAK,SAAS,CAAC;AAGxE,UAAI,CAACA,GAAE,QAAQ,QAAQ;AACrB,YAAI,WAAW,YAAY,KAAK,YAAY,CAAC,GAAG,KAAK,SAAS;AAC9D,YAAI,eAAe,KAAK,sBAAsB,CAAC;AAC/C,YAAI,UAAU,KAAK,IAAI,SAAS,IAAI,aAAa,GAAG,CAAC,IAAI,KAAK,IAAI,SAAS,IAAI,aAAa,GAAG,CAAC;AAChG,YAAI,CAACA,GAAE,QAAQ,UAAU,UAAU,KAAK,IAAI,KAAK,SAAS,kBAAkB,CAAC,GAAG;AAE9E,cAAI,KAAK,WAAW,KAAK,IAAG,IAAK,KAAK,QAAQ,OAAO,KAAK,SAAS,oBAAoB;AACrF,gBAAI,cAAc,eAAeA,IAAG,KAAK,aAAa,KAAK,SAAS;AACpE,iBAAK,KAAK,aAAa,WAAW;AAClC,iBAAK,UAAU;AACf,gBAAI,CAAC,YAAY,uBAAuB;AACtC,kBAAI,UAAU,KAAK,SAAS,UAAS;AACrC,kBAAI,WAAW,QAAQ,gBAAgB,QAAQ,SAAQ,EAAG,QAAQ,KAAK,SAAS,uBAAuB;AACvG,sBAAQ,QAAQ,KAAK,SAAS,uBAAuB,UAAU,QAAQ,GAAG;AAAA,gBACxE,QAAQ;AAAA,gBACR,UAAU,KAAK,SAAS;AAAA,cACxC,CAAe;AAAA,YACH;AAAA,UACF,OAEK;AACH,gBAAI,eAAe,eAAeA,IAAG,KAAK,aAAa,KAAK,SAAS;AACrE,iBAAK,KAAK,OAAO,YAAY;AAC7B,iBAAK,UAAU;AAAA,cACb,MAAM,KAAK,IAAG;AAAA,cACd,UAAU,aAAa,QAAQ,CAAC,KAAK,aAAa,gBAAgB,CAAC;AAAA,YACjF;AAAA,UACU;AAAA,QACF;AAAA,MACF;AACA,WAAK,cAAc,gBAAgBA,GAAE,OAAO;AAC5C,WAAK,wBAAwB,CAAA;AAAA,IAC/B;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,WAAWA,IAAG;AAC5B,UAAI,SAAS;AACb,UAAI,CAAC,KAAK,WAAW,CAAC,KAAK,sBAAsB,OAAQ;AACzD,MAAAA,GAAE,eAAc;AAChB,UAAI,UAAU,gBAAgBA,GAAE,OAAO;AACvC,UAAI,mBAAmB,QAAQ,IAAI,SAAU,OAAO;AAClD,eAAO,YAAY,OAAO,OAAO,SAAS;AAAA,MAC5C,CAAC;AACD,UAAI,cAAc,KAAK;AACvB,WAAK,cAAc;AACnB,WAAK,uBAAuB;AAC5B,UAAI,cAAc,eAAeA,IAAG,aAAa,KAAK,SAAS;AAC/D,WAAK,KAAK,aAAa,WAAW;AAClC,UAAI,YAAY,sBAAuB;AAQvC,WAAK,aAAa,KAAK,WAAW,iBAAiB,KAAK,SAAU,UAAU,KAAK;AAC/E,YAAI,gBAAgB,OAAO,sBAAsB,GAAG;AACpD,eAAO,kBAAkB,SAAS,MAAM,cAAc,KAAK,SAAS,MAAM,cAAc;AAAA,MAC1F,CAAC;AAGD,UAAI,CAAC,KAAK,UAAU;AAClB;AAAA,MACF;AACA,WAAK,WAAW;AAChB,UAAI,KAAK,cAAe,cAAa,KAAK,aAAa;AACvD,WAAK,gBAAgB,OAAO,WAAW,WAAY;AACjD,eAAO,WAAW;AAAA,MACpB,GAAG,KAAK,SAAS,WAAW;AAC5B,UAAI,SAAS,KAAK,SAAS,UAAS;AACpC,UAAI,mBAAmB,KAAK;AAC5B,UAAI,UAAU,KAAK,SAAS,WAAW,cAAc;AACrD,cAAQ,KAAK,WAAS;AAAA,QACpB,KAAK,GACH;AACE,cAAI,wBAAwB,KAAK,SAAS,uBAAuB,KAAK,yBAAyB,IAAI,CAAC,CAAC,GACnG,SAAS,sBAAsB,GAC/B,SAAS,sBAAsB;AACjC,cAAI,yBAAyB,KAAK,SAAS,sBAAsB,iBAAiB,CAAC,CAAC,GAClF,IAAI,uBAAuB,GAC3B,IAAI,uBAAuB;AAC7B,iBAAO,SAAS;AAAA,YACd,GAAG,iBAAiB,IAAI,SAAS;AAAA,YACjC,GAAG,iBAAiB,IAAI,SAAS;AAAA,UAC/C,CAAa;AACD;AAAA,QACF;AAAA,QACF,KAAK,GACH;AAWE,cAAI,iBAAiB;AAAA,YACnB,GAAG;AAAA,YACH,GAAG;AAAA,YACH,OAAO;AAAA,YACP,OAAO;AAAA,UACrB;AACY,cAAI,qBAAqB,iBAAiB,CAAC,GACzC,KAAK,mBAAmB,GACxB,KAAK,mBAAmB;AAC1B,cAAI,sBAAsB,iBAAiB,CAAC,GAC1C,KAAK,oBAAoB,GACzB,KAAK,oBAAoB;AAC3B,cAAI,YAAY,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,IAAI,KAAK;AACpD,cAAI,YAAY,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,IAAI,KAAK;AAGpD,cAAI,WAAW,OAAO,gBAAgB,iBAAiB,QAAQ,SAAS;AACxE,yBAAe,QAAQ;AACvB,yBAAe,QAAQ,iBAAiB,QAAQ;AAGhD,cAAI,aAAa,KAAK,cAAa;AACnC,cAAI,qBAAqB,KAAK,SAAS,uBAAuB,KAAK,yBAAyB,IAAI,CAAC,GAAG;AAAA,YAClG,aAAa;AAAA,UAC3B,CAAa;AACD,cAAI,oBAAoB,KAAK,IAAI,WAAW,OAAO,WAAW,MAAM,IAAI,IAAI;AAC5E,cAAI,KAAK,oBAAoB,WAAW;AACxC,cAAI,KAAK,oBAAoB,WAAW;AACxC,cAAI,QAAQ,WAAW;AAGvB,cAAI,KAAK,KAAK,oBAAoB,IAAI;AACtC,cAAI,KAAK,KAAK,oBAAoB,IAAI;AAGtC,cAAI,OAAO,CAAC,KAAK,KAAK,IAAI,CAAC,eAAe,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC,eAAe,KAAK,GAAG,KAAK,KAAK,IAAI,CAAC,eAAe,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC,eAAe,KAAK,CAAC;AACpK,eAAK,KAAK,CAAC;AACX,eAAK,KAAK,CAAC;AACX,yBAAe,IAAI,mBAAmB,IAAI,KAAK;AAC/C,yBAAe,IAAI,mBAAmB,IAAI,KAAK;AAC/C,iBAAO,SAAS,cAAc;AAC9B;AAAA,QACF;AAAA,MACV;AAAA,IACI;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,YAAY,UAAU;AACpC,WAAK,WAAW;AAAA,IAClB;AAAA,EACJ,CAAG,CAAC;AACJ,GAAE,MAAM;AAER,SAAS8D,qBAAmB,GAAG;AAC7B,MAAI,MAAM,QAAQ,CAAC,EAAG,QAAO/C,oBAAkB,CAAC;AAClD;AAEA,SAASgD,mBAAiB,GAAG;AAC3B,MAAI,eAAe,OAAO,UAAU,QAAQ,EAAE,OAAO,QAAQ,KAAK,QAAQ,EAAE,YAAY,EAAG,QAAO,MAAM,KAAK,CAAC;AAChH;AAEA,SAASC,uBAAqB;AAC5B,QAAM,IAAI,UAAU,sIAAsI;AAC5J;AAEA,SAASC,qBAAmB,GAAG;AAC7B,SAAOH,qBAAmB,CAAC,KAAKC,mBAAiB,CAAC,KAAK/C,8BAA4B,CAAC,KAAKgD,qBAAkB;AAC7G;AAEA,SAAS,8BAA8B,GAAGhE,IAAG;AAC3C,MAAI,QAAQ,EAAG,QAAO,CAAA;AACtB,MAAID,KAAI,CAAA;AACR,WAASI,MAAK,EAAG,KAAI,CAAA,EAAG,eAAe,KAAK,GAAGA,EAAC,GAAG;AACjD,QAAI,OAAOH,GAAE,QAAQG,EAAC,EAAG;AACzB,IAAAJ,GAAEI,EAAC,IAAI,EAAEA,EAAC;AAAA,EACZ;AACA,SAAOJ;AACT;AAEA,SAAS,yBAAyBC,IAAGD,IAAG;AACtC,MAAI,QAAQC,GAAG,QAAO,CAAA;AACtB,MAAI,GACF,GACA,IAAI,8BAA8BA,IAAGD,EAAC;AACxC,MAAI,OAAO,uBAAuB;AAChC,QAAII,KAAI,OAAO,sBAAsBH,EAAC;AACtC,SAAK,IAAI,GAAG,IAAIG,GAAE,QAAQ,IAAK,KAAIA,GAAE,CAAC,GAAG,OAAOJ,GAAE,QAAQ,CAAC,KAAK,CAAA,EAAG,qBAAqB,KAAKC,IAAG,CAAC,MAAM,EAAE,CAAC,IAAIA,GAAE,CAAC;AAAA,EACnH;AACA,SAAO;AACT;AAeA,IAAI,iBAA8B,4BAAY;AAC5C,WAASkE,gBAAe,KAAK,MAAM;AACjChE,sBAAgB,MAAMgE,eAAc;AACpC,SAAK,MAAM;AACX,SAAK,OAAO;AAAA,EACd;AACA,SAAO7D,eAAa6D,iBAAgB,MAAM,CAAC;AAAA,IACzC,KAAK;AAAA,IACL,OAAO,SAAS,QAAQ,OAAO,QAAQ;AAErC,UAAI,MAAM,OAAO,OAAO,KAAM,QAAO;AACrC,UAAI,MAAM,OAAO,OAAO,KAAM,QAAO;AAIrC,UAAI,MAAM,MAAM,OAAO,IAAK,QAAO;AAGnC,aAAO;AAAA,IACT;AAAA,EACJ,CAAG,CAAC;AACJ,GAAC;AAID,IAAI,YAAyB,4BAAY;AACvC,WAASC,aAAY;AACnBjE,sBAAgB,MAAMiE,UAAS;AAC/BlD,sBAAgB,MAAM,SAAS,CAAC;AAChCA,sBAAgB,MAAM,UAAU,CAAC;AACjCA,sBAAgB,MAAM,YAAY,CAAC;AACnCA,sBAAgB,MAAM,WAAW,CAAC;AAClCA,sBAAgB,MAAM,QAAQ,CAAC;AAC/BA,sBAAgB,MAAM,SAAS,EAAE;AAAA,EACnC;AACA,SAAOZ,eAAa8D,YAAW,CAAC;AAAA,IAC9B,KAAK;AAAA,IACL,OAAO,SAAS,eAAe,YAAY,UAAU;AACnD,WAAK,QAAQ,WAAW;AACxB,WAAK,SAAS,WAAW;AACzB,WAAK,WAAW;AAChB,WAAK,UAAU,KAAK,KAAK,WAAW,QAAQ,QAAQ;AACpD,WAAK,OAAO,KAAK,KAAK,WAAW,SAAS,QAAQ;AAClD,WAAK,QAAQ,CAAA;AAAA,IACf;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,SAAS,KAAK;AAC5B,UAAI,SAAS,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ;AAC7C,UAAI,SAAS,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ;AAC7C,aAAO,SAAS,KAAK,UAAU;AAAA,IACjC;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,IAAI,KAAK,MAAM,KAAK;AAClC,UAAI,YAAY,IAAI,eAAe,KAAK,IAAI;AAC5C,UAAI,QAAQ,KAAK,SAAS,GAAG;AAC7B,UAAI,OAAO,KAAK,MAAM,KAAK;AAC3B,UAAI,CAAC,MAAM;AACT,eAAO,CAAA;AACP,aAAK,MAAM,KAAK,IAAI;AAAA,MACtB;AACA,WAAK,KAAK,SAAS;AAAA,IACrB;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,WAAW;AACzB,eAAS,KAAK,KAAK,OAAO;AACxB,YAAI,OAAO,KAAK,MAAM,CAAC;AACvB,aAAK,KAAK,eAAe,OAAO;AAAA,MAClC;AAAA,IACF;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,mBAAmB,OAAO,SAAS;AAKjD,UAAI,WAAW,KAAK,WAAW,KAAK;AACpC,UAAI,iBAAiB,WAAW,QAAQ;AACxC,UAAI,gBAAgB,iBAAiB,UAAU;AAC/C,UAAI,yBAAyB,KAAK,KAAK,aAAa;AACpD,UAAI,SAAS,CAAA;AACb,eAAS,KAAK,KAAK,OAAO;AACxB,YAAI,OAAO,KAAK,MAAM,CAAC;AACvB,iBAAS,IAAI,GAAG,IAAI,KAAK,IAAI,wBAAwB,KAAK,MAAM,GAAG,KAAK;AACtE,iBAAO,KAAK,KAAK,CAAC,EAAE,GAAG;AAAA,QACzB;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACJ,CAAG,CAAC;AACJ,GAAC;AAaD,SAAS,6BAA6B,QAAQ;AAC5C,MAAI,QAAQ,OAAO,OACjB,cAAc,OAAO,aACrB,mBAAmB,OAAO,kBAC1B,sBAAsB,OAAO;AAC/B,MAAI,cAAc,CAAA;AAOlB,QAAM,YAAY,SAAU,MAAM,GAAG,QAAQ,QAAQ;AACnD,QAAI,WAAW,eAAe,WAAW,eAAe,iBAAiB,IAAI,MAAM,KAAK,iBAAiB,IAAI,MAAM,KAAK,oBAAoB,IAAI,MAAM,KAAK,oBAAoB,IAAI,MAAM,GAAG;AAC1L,kBAAY,KAAK,IAAI;AAAA,IACvB;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAKA,IAAI,iBAAiB;AACrB,IAAI,iBAAiB;AACrB,IAAI,iBAAiB,OAAO,UAAU;AAKtC,SAAS,kBAAkB,UAAU,KAAK,MAAM;AAC9C,MAAI,CAAC,eAAe,KAAK,MAAM,GAAG,KAAK,CAAC,eAAe,KAAK,MAAM,GAAG,EAAG,OAAM,IAAI,MAAM,2DAA4D,OAAO,KAAK,gJAAuJ,CAAC;AACxT,MAAI,CAAC,KAAK,MAAO,MAAK,QAAQ,SAAS;AACvC,MAAI,CAAC,KAAK,SAAS,KAAK,UAAU,GAAI,MAAK,QAAQ;AACnD,MAAI,KAAK,UAAU,UAAa,KAAK,UAAU,KAAM,MAAK,QAAQ,KAAK,KAAK;AAAA,MAAW,MAAK,QAAQ;AACpG,MAAI,CAAC,KAAK,KAAM,MAAK,OAAO;AAC5B,MAAI,CAAC,eAAe,KAAK,MAAM,QAAQ,EAAG,MAAK,SAAS;AACxD,MAAI,CAAC,eAAe,KAAK,MAAM,aAAa,EAAG,MAAK,cAAc;AAClE,MAAI,CAAC,eAAe,KAAK,MAAM,YAAY,EAAG,MAAK,aAAa;AAChE,MAAI,CAAC,KAAK,QAAQ,KAAK,SAAS,GAAI,MAAK,OAAO,SAAS;AACzD,MAAI,CAAC,KAAK,OAAQ,MAAK,SAAS;AAChC,SAAO;AACT;AACA,SAAS,kBAAkB,UAAU,MAAM,MAAM;AAC/C,MAAI,CAAC,KAAK,MAAO,MAAK,QAAQ,SAAS;AACvC,MAAI,CAAC,KAAK,MAAO,MAAK,QAAQ;AAC9B,MAAI,CAAC,KAAK,KAAM,MAAK,OAAO;AAC5B,MAAI,CAAC,eAAe,KAAK,MAAM,QAAQ,EAAG,MAAK,SAAS;AACxD,MAAI,CAAC,eAAe,KAAK,MAAM,YAAY,EAAG,MAAK,aAAa;AAChE,MAAI,CAAC,KAAK,QAAQ,KAAK,SAAS,GAAI,MAAK,OAAO,SAAS;AACzD,MAAI,CAAC,KAAK,OAAQ,MAAK,SAAS;AAChC,SAAO;AACT;AAUA,IAAI,UAAuB,0BAAU,oBAAoB;AACvD,WAAS,MAAM,OAAO,WAAW;AAC/B,QAAI;AACJ,QAAI,WAAW,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AACnFjE,sBAAgB,MAAM,KAAK;AAC3B,YAAQQ,aAAW,MAAM,KAAK;AAG9BO,sBAAgB,OAAO,YAAY,EAAE;AACrCA,sBAAgB,OAAO,kBAAkB,EAAE;AAC3CA,sBAAgB,OAAO,iBAAiB,EAAE;AAC1CA,sBAAgB,OAAO,iBAAiB,oBAAI,IAAG,CAAE;AACjDA,sBAAgB,OAAO,YAAY,EAAE;AACrCA,sBAAgB,OAAO,gBAAgB,EAAE;AACzCA,sBAAgB,OAAO,mBAAmB,EAAE;AAC5CA,sBAAgB,OAAO,aAAa,IAAI,UAAS,CAAE;AACnDA,sBAAgB,OAAO,iBAAiB,EAAE;AAC1CA,sBAAgB,OAAO,iBAAiB,EAAE;AAE1CA,sBAAgB,OAAO,oBAAoB,EAAE;AAC7CA,sBAAgB,OAAO,oBAAoB,EAAE;AAC7CA,sBAAgB,OAAO,yBAAyB,oBAAI,IAAG,CAAE;AACzDA,sBAAgB,OAAO,yBAAyB,oBAAI,IAAG,CAAE;AACzDA,sBAAgB,OAAO,cAAc;AAAA,MACnC,GAAG,CAAC,GAAG,CAAC;AAAA,MACR,GAAG,CAAC,GAAG,CAAC;AAAA,IACd,CAAK;AACDA,sBAAgB,OAAO,eAAe,CAAC,UAAU,SAAS,CAAC;AAC3DA,sBAAgB,OAAO,eAAe,CAAC,UAAU,SAAS,CAAC;AAC3DA,sBAAgB,OAAO,UAAU,UAAU;AAC3CA,sBAAgB,OAAO,aAAa,UAAU;AAC9CA,sBAAgB,OAAO,mBAAmB,CAAC;AAC3CA,sBAAgB,OAAO,cAAc,IAAI;AACzCA,sBAAgB,OAAO,yBAAyB,4BAA4B;AAAA,MAC1E,GAAG,CAAC,GAAG,CAAC;AAAA,MACR,GAAG,CAAC,GAAG,CAAC;AAAA,IACd,CAAK,CAAC;AAEFA,sBAAgB,OAAO,wBAAwB,CAAC;AAChDA,sBAAgB,OAAO,gBAAgB,EAAE;AACzCA,sBAAgB,OAAO,eAAe,EAAE;AACxCA,sBAAgB,OAAO,eAAe,EAAE;AAExCA,sBAAgB,OAAO,SAAS,CAAC;AACjCA,sBAAgB,OAAO,UAAU,CAAC;AAClCA,sBAAgB,OAAO,cAAc,eAAe;AACpDA,sBAAgB,OAAO,0BAA0B,IAAI,MAAM,UAAU;AAErEA,sBAAgB,OAAO,uBAAuB,oBAAI,IAAG,CAAE;AACvDA,sBAAgB,OAAO,uBAAuB,oBAAI,IAAG,CAAE;AACvDA,sBAAgB,OAAO,oBAAoB,oBAAI,IAAG,CAAE;AACpDA,sBAAgB,OAAO,eAAe,IAAI;AAC1CA,sBAAgB,OAAO,eAAe,IAAI;AAE1CA,sBAAgB,OAAO,eAAe,IAAI;AAC1CA,sBAAgB,OAAO,+BAA+B,IAAI;AAC1DA,sBAAgB,OAAO,iBAAiB,KAAK;AAC7CA,sBAAgB,OAAO,yBAAyB,IAAI;AAEpDA,sBAAgB,OAAO,gBAAgB,EAAE;AACzCA,sBAAgB,OAAO,qBAAqB,EAAE;AAC9CA,sBAAgB,OAAO,gBAAgB,EAAE;AACzC,UAAM,WAAW,gBAAgB,QAAQ;AAGzC,qBAAiB,MAAM,QAAQ;AAC/B,kBAAc,KAAK;AACnB,QAAI,EAAE,qBAAqB,aAAc,OAAM,IAAI,MAAM,6CAA6C;AAGtG,UAAM,QAAQ;AACd,UAAM,YAAY;AAGlB,UAAM,mBAAmB,SAAS;AAAA,MAChC,SAAS,SAAS;AAAA,IACxB,CAAK;AACD,UAAM,oBAAoB,YAAY;AACtC,UAAM,mBAAmB,SAAS;AAAA,MAChC,SAAS;AAAA,IACf,CAAK;AACD,UAAM,oBAAoB,QAAQ;AAClC,UAAM,oBAAoB,QAAQ;AAClC,UAAM,mBAAmB,YAAY;AACrC,UAAM,oBAAoB,SAAS;AAAA,MACjC,OAAO;AAAA,QACL,aAAa;AAAA,QACb,YAAY;AAAA,MACpB;AAAA,IACA,CAAK;AAGD,UAAM,OAAM;AAGZ,aAAS,QAAQ,MAAM,SAAS,oBAAoB;AAClD,YAAM,oBAAoB,MAAM,MAAM,SAAS,mBAAmB,IAAI,GAAG,MAAM,SAAS,wBAAwB,IAAI,CAAC;AAAA,IACvH;AACA,aAAS,SAAS,MAAM,SAAS,oBAAoB;AACnD,YAAM,oBAAoB,OAAO,MAAM,SAAS,mBAAmB,KAAK,CAAC;AAAA,IAC3E;AAGA,UAAM,SAAS,IAAI,OAAM;AAGzB,UAAM,mBAAkB;AAGxB,UAAM,cAAc,IAAI,YAAY,MAAM,SAAS,OAAO,KAAK;AAC/D,UAAM,YAAY,YAAY,MAAM,QAAQ;AAC5C,UAAM,cAAc,IAAI,YAAY,MAAM,SAAS,OAAO,KAAK;AAC/D,UAAM,YAAY,YAAY,MAAM,QAAQ;AAG5C,UAAM,kBAAiB;AAGvB,UAAM,kBAAiB;AAGvB,UAAM,qBAAoB;AAG1B,UAAM,QAAO;AACb,WAAO;AAAA,EACT;AAeAL,cAAU,OAAO,kBAAkB;AACnC,SAAOP,eAAa,OAAO,CAAC;AAAA,IAC1B,KAAK;AAAA,IACL,OAAO,SAAS,oBAAoB,KAAK,kBAAkB,kBAAkB;AAC3E,UAAI,KAAK,aAAa,GAAG,EAAG,MAAK,aAAa,GAAG,EAAE,KAAI;AACvD,UAAI,KAAK,kBAAkB,GAAG,EAAG,MAAK,kBAAkB,GAAG,EAAE,KAAI;AACjE,WAAK,aAAa,GAAG,IAAI,IAAI,iBAAiB,KAAK,cAAc,OAAO,KAAK,aAAa,OAAO,IAAI;AACrG,WAAK,kBAAkB,GAAG,IAAI,KAAK,oBAAoB,kBAAkB,KAAK,cAAc,YAAY,MAAM,IAAI;AAClH,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,oBAAoB,KAAK,kBAAkB;AACzD,UAAI,KAAK,aAAa,GAAG,EAAG,MAAK,aAAa,GAAG,EAAE,KAAI;AACvD,WAAK,aAAa,GAAG,IAAI,IAAI,iBAAiB,KAAK,cAAc,OAAO,KAAK,aAAa,OAAO,IAAI;AACrG,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,sBAAsB,KAAK;AACzC,UAAI,KAAK,aAAa,GAAG,GAAG;AAC1B,YAAI,qBAAqB,KAAK,cAC5B,UAAU,mBAAmB,GAAG,GAChC,WAAW,yBAAyB,oBAAoB,CAAC,GAAG,EAAE,IAAIJ,gBAAc,CAAC;AACnF,gBAAQ,KAAI;AACZ,aAAK,eAAe;AAAA,MACtB;AACA,UAAI,KAAK,kBAAkB,GAAG,GAAG;AAC/B,YAAI,wBAAwB,KAAK,mBAC/B,WAAW,sBAAsB,GAAG,GACpC,YAAY,yBAAyB,uBAAuB,CAAC,GAAG,EAAE,IAAIA,gBAAc,CAAC;AACvF,iBAAS,KAAI;AACb,aAAK,eAAe;AAAA,MACtB;AACA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,sBAAsB,KAAK;AACzC,UAAI,KAAK,aAAa,GAAG,GAAG;AAC1B,YAAI,qBAAqB,KAAK,cAC5B,UAAU,mBAAmB,GAAG,GAChC,WAAW,yBAAyB,oBAAoB,CAAC,GAAG,EAAE,IAAIA,gBAAc,CAAC;AACnF,gBAAQ,KAAI;AACZ,aAAK,eAAe;AAAA,MACtB;AACA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,kBAAkB,IAAI;AACpC,UAAI,KAAK,KAAK,cAAc,EAAE;AAC9B,UAAI,cAAc,KAAK,aAAa,EAAE;AACtC,UAAI,iBAAiB,KAAK,SAAS,EAAE;AACrC,UAAI,eAAgB,IAAG,cAAc,cAAc;AACnD,UAAI,iBAAiB,GAAG,cAAa;AACrC,SAAG,gBAAgB,GAAG,aAAa,WAAW;AAC9C,SAAG,YAAY,GAAG,YAAY,cAAc;AAC5C,SAAG,WAAW,GAAG,YAAY,GAAG,GAAG,MAAM,KAAK,OAAO,KAAK,QAAQ,GAAG,GAAG,MAAM,GAAG,eAAe,IAAI;AACpG,SAAG,qBAAqB,GAAG,aAAa,GAAG,mBAAmB,GAAG,YAAY,gBAAgB,CAAC;AAC9F,WAAK,SAAS,EAAE,IAAI;AACpB,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,qBAAqB;AACnC,UAAI,SAAS;AACb,WAAK,gBAAgB,SAAS,WAAY;AACxC,eAAO,eAAc;AAAA,MACvB;AACA,WAAK,OAAO,GAAG,WAAW,KAAK,gBAAgB,MAAM;AACrD,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,uBAAuB;AACrC,WAAK,OAAO,eAAe,WAAW,KAAK,gBAAgB,MAAM;AACjE,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,EAKJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,kBAAkB,UAAU;AAC1C,UAAI,IAAI,SAAS,GACf,IAAI,SAAS;AACf,UAAI,QAAQ,cAAc,KAAK,cAAc,OAAO,KAAK,aAAa,OAAO,GAAG,GAAG,KAAK,YAAY,KAAK,sBAAsB;AAC/H,UAAI,QAAQ,aAAa,MAAM,QAAQgE,qBAAmB,KAAK,CAAC;AAChE,UAAI,SAAS,KAAK,aAAa,KAAK;AACpC,aAAO,UAAU,OAAO,SAAS,SAAS,OAAO,KAAK;AAAA,IACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,oBAAoB;AAClC,UAAI,SAAS;AAEb,WAAK,gBAAgB,eAAe,WAAY;AAE9C,eAAO,gBAAe;AAAA,MACxB;AACA,aAAO,iBAAiB,UAAU,KAAK,gBAAgB,YAAY;AAGnE,WAAK,gBAAgB,aAAa,SAAUjE,IAAG;AAC7C,YAAI,QAAQ,iBAAiBA,EAAC;AAC9B,YAAI,YAAY;AAAA,UACd;AAAA,UACA,qBAAqB,SAAS,sBAAsB;AAClD,kBAAM,oBAAmB;AAAA,UAC3B;AAAA,QACV;AACQ,YAAI,cAAc,OAAO,kBAAkB,KAAK;AAChD,YAAI,eAAe,OAAO,gBAAgB,eAAe,CAAC,OAAO,cAAc,WAAW,EAAE,QAAQ;AAElG,cAAI,OAAO,YAAa,QAAO,KAAK,aAAamB,iBAAeA,iBAAe,CAAA,GAAI,SAAS,GAAG,CAAA,GAAI;AAAA,YACjG,MAAM,OAAO;AAAA,UACzB,CAAW,CAAC;AACF,iBAAO,cAAc;AACrB,iBAAO,KAAK,aAAaA,iBAAeA,iBAAe,IAAI,SAAS,GAAG,IAAI;AAAA,YACzE,MAAM;AAAA,UAClB,CAAW,CAAC;AACF,iBAAO,+BAA8B;AACrC;AAAA,QACF;AAGA,YAAI,OAAO,aAAa;AACtB,cAAI,OAAO,kBAAkB,KAAK,MAAM,OAAO,aAAa;AAC1D,gBAAI,OAAO,OAAO;AAClB,mBAAO,cAAc;AACrB,mBAAO,KAAK,aAAaA,iBAAeA,iBAAe,IAAI,SAAS,GAAG,IAAI;AAAA,cACzE;AAAA,YACd,CAAa,CAAC;AACF,mBAAO,+BAA8B;AACrC;AAAA,UACF;AAAA,QACF;AACA,YAAI,OAAO,SAAS,kBAAkB;AACpC,cAAI,cAAc,OAAO,cAAc,OAAO,OAAO,eAAe,UAAU,MAAM,GAAG,UAAU,MAAM,CAAC;AACxG,cAAI,gBAAgB,OAAO,aAAa;AACtC,gBAAI,OAAO,YAAa,QAAO,KAAK,aAAaA,iBAAeA,iBAAe,CAAA,GAAI,SAAS,GAAG,CAAA,GAAI;AAAA,cACjG,MAAM,OAAO;AAAA,YAC3B,CAAa,CAAC;AACF,gBAAI,YAAa,QAAO,KAAK,aAAaA,iBAAeA,iBAAe,CAAA,GAAI,SAAS,GAAG,IAAI;AAAA,cAC1F,MAAM;AAAA,YACpB,CAAa,CAAC;AACF,mBAAO,cAAc;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAGA,WAAK,gBAAgB,iBAAiB,SAAUnB,IAAG;AACjD,YAAI,QAAQ,iBAAiBA,EAAC;AAC9B,eAAO,KAAK,YAAY;AAAA,UACtB;AAAA,UACA,qBAAqB,SAAS,sBAAsB;AAClD,kBAAM,oBAAmB;AAAA,UAC3B;AAAA,QACV,CAAS;AAAA,MACH;AAGA,WAAK,gBAAgB,cAAc,SAAUA,IAAG;AAC9C,YAAI,QAAQ,iBAAiBA,EAAC;AAC9B,YAAI,YAAY;AAAA,UACd;AAAA,UACA,qBAAqB,SAAS,sBAAsB;AAClD,kBAAM,oBAAmB;AAAA,UAC3B;AAAA,QACV;AACQ,YAAI,OAAO,aAAa;AACtB,iBAAO,KAAK,aAAamB,iBAAeA,iBAAe,IAAI,SAAS,GAAG,IAAI;AAAA,YACzE,MAAM,OAAO;AAAA,UACzB,CAAW,CAAC;AACF,iBAAO,+BAA8B;AAAA,QACvC;AACA,YAAI,OAAO,SAAS,oBAAoB,OAAO,aAAa;AAC1D,iBAAO,KAAK,aAAaA,iBAAeA,iBAAe,IAAI,SAAS,GAAG,IAAI;AAAA,YACzE,MAAM,OAAO;AAAA,UACzB,CAAW,CAAC;AACF,iBAAO,+BAA8B;AAAA,QACvC;AACA,eAAO,KAAK,cAAcA,iBAAe,CAAA,GAAI,SAAS,CAAC;AAAA,MACzD;AAGA,WAAK,gBAAgB,cAAc,SAAUnB,IAAG;AAC9C,YAAI,QAAQ,iBAAiBA,EAAC;AAC9B,YAAI,YAAY;AAAA,UACd;AAAA,UACA,qBAAqB,SAAS,sBAAsB;AAClD,kBAAM,oBAAmB;AAAA,UAC3B;AAAA,QACV;AACQ,eAAO,KAAK,cAAcmB,iBAAe,CAAA,GAAI,SAAS,CAAC;AAAA,MACzD;AAGA,UAAI,4BAA4B,SAASiD,2BAA0B,WAAW;AAC5E,eAAO,SAAUpE,IAAG;AAClB,cAAI,QAAQ,iBAAiBA,EAAC;AAC9B,cAAI,YAAY;AAAA,YACd;AAAA,YACA,qBAAqB,SAAS,sBAAsB;AAClD,oBAAM,oBAAmB;AAAA,YAC3B;AAAA,UACZ;AACU,cAAI,iBAAiB,OAAO,kBAAkB,KAAK;AACnD,cAAI,eAAgB,QAAO,OAAO,KAAK,GAAG,OAAO,WAAW,MAAM,GAAGmB,iBAAeA,iBAAe,CAAA,GAAI,SAAS,GAAG,CAAA,GAAI;AAAA,YACrH,MAAM;AAAA,UAClB,CAAW,CAAC;AACF,cAAI,OAAO,SAAS,kBAAkB;AACpC,gBAAI,OAAO,OAAO,eAAe,MAAM,GAAG,MAAM,CAAC;AACjD,gBAAI,KAAM,QAAO,OAAO,KAAK,GAAG,OAAO,WAAW,MAAM,GAAGA,iBAAeA,iBAAe,CAAA,GAAI,SAAS,GAAG,CAAA,GAAI;AAAA,cAC3G;AAAA,YACd,CAAa,CAAC;AAAA,UACJ;AACA,iBAAO,OAAO,KAAK,GAAG,OAAO,WAAW,OAAO,GAAG,SAAS;AAAA,QAC7D;AAAA,MACF;AACA,WAAK,gBAAgB,cAAc,0BAA0B,OAAO;AACpE,WAAK,gBAAgB,mBAAmB,0BAA0B,YAAY;AAC9E,WAAK,gBAAgB,oBAAoB,0BAA0B,aAAa;AAChF,WAAK,gBAAgB,cAAc,0BAA0B,OAAO;AACpE,WAAK,gBAAgB,aAAa,0BAA0B,MAAM;AAClE,WAAK,gBAAgB,WAAW,0BAA0B,IAAI;AAC9D,WAAK,YAAY,GAAG,aAAa,KAAK,gBAAgB,UAAU;AAChE,WAAK,YAAY,GAAG,iBAAiB,KAAK,gBAAgB,cAAc;AACxE,WAAK,YAAY,GAAG,SAAS,KAAK,gBAAgB,WAAW;AAC7D,WAAK,YAAY,GAAG,cAAc,KAAK,gBAAgB,gBAAgB;AACvE,WAAK,YAAY,GAAG,eAAe,KAAK,gBAAgB,iBAAiB;AACzE,WAAK,YAAY,GAAG,SAAS,KAAK,gBAAgB,WAAW;AAC7D,WAAK,YAAY,GAAG,aAAa,KAAK,gBAAgB,UAAU;AAChE,WAAK,YAAY,GAAG,WAAW,KAAK,gBAAgB,QAAQ;AAC5D,WAAK,YAAY,GAAG,cAAc,KAAK,gBAAgB,WAAW;AAClE,WAAK,YAAY,GAAG,cAAc,KAAK,gBAAgB,WAAW;AAClE,WAAK,YAAY,GAAG,aAAa,KAAK,gBAAgB,UAAU;AAChE,WAAK,YAAY,GAAG,aAAa,KAAK,gBAAgB,UAAU;AAChE,WAAK,YAAY,GAAG,WAAW,KAAK,gBAAgB,QAAQ;AAC5D,WAAK,YAAY,GAAG,aAAa,KAAK,gBAAgB,UAAU;AAChE,WAAK,YAAY,GAAG,OAAO,KAAK,gBAAgB,WAAW;AAC3D,WAAK,YAAY,GAAG,aAAa,KAAK,gBAAgB,iBAAiB;AACvE,WAAK,YAAY,GAAG,aAAa,KAAK,gBAAgB,cAAc;AACpE,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,oBAAoB;AAClC,UAAI,SAAS;AACb,UAAI,QAAQ,KAAK;AACjB,UAAI,0BAA0B,oBAAI,IAAI,CAAC,KAAK,KAAK,UAAU,MAAM,CAAC;AAClE,WAAK,gBAAgB,uCAAuC,SAAUnB,IAAG;AACvE,YAAI;AACJ,YAAI,iBAAiB,WAAWA,GAAE,WAAW,QAAQ,aAAa,SAAS,SAAS,SAAS;AAE7F,eAAO,MAAM,YAAY,SAAU,MAAM;AACvC,iBAAO,OAAO,WAAW,IAAI;AAAA,QAC/B,CAAC;AAID,YAAI,gBAAgB,CAAC,iBAAiB,cAAc,KAAK,SAAUa,IAAG;AACpE,iBAAO,wBAAwB,IAAIA,EAAC;AAAA,QACtC,CAAC;AACD,eAAO,QAAQ;AAAA,UACb,cAAc;AAAA,YACZ,OAAO,MAAM,MAAK;AAAA,UAC9B;AAAA,UACU,gBAAgB,CAAC;AAAA,UACjB,UAAU;AAAA,QACpB,CAAS;AAAA,MACH;AACA,WAAK,gBAAgB,uCAAuC,SAAUb,IAAG;AACvE,YAAI;AACJ,YAAI,iBAAiB,YAAYA,GAAE,WAAW,QAAQ,cAAc,SAAS,SAAS,UAAU;AAEhG,eAAO,MAAM,YAAY,SAAU,MAAM;AACvC,iBAAO,OAAO,WAAW,IAAI;AAAA,QAC/B,CAAC;AACD,YAAI,gBAAgB,iBAAiB,CAAC,UAAU,MAAM,EAAE,KAAK,SAAUa,IAAG;AACxE,iBAAO,kBAAkB,QAAQ,kBAAkB,SAAS,SAAS,cAAc,SAASA,EAAC;AAAA,QAC/F,CAAC;AACD,eAAO,QAAQ;AAAA,UACb,cAAc;AAAA,YACZ,OAAO,MAAM,MAAK;AAAA,UAC9B;AAAA,UACU,gBAAgB,CAAC;AAAA,UACjB,UAAU;AAAA,QACpB,CAAS;AAAA,MACH;AAGA,WAAK,gBAAgB,qBAAqB,SAAU,SAAS;AAC3D,YAAI,OAAO,QAAQ;AAEnB,eAAO,QAAQ,IAAI;AAEnB,eAAO,QAAQ;AAAA,UACb,cAAc;AAAA,YACZ,OAAO,CAAC,IAAI;AAAA,UACxB;AAAA,UACU,gBAAgB;AAAA,UAChB,UAAU;AAAA,QACpB,CAAS;AAAA,MACH;AAGA,WAAK,gBAAgB,wBAAwB,SAAU,SAAS;AAC9D,YAAI,OAAO,QAAQ;AAEnB,eAAO,QAAQ;AAAA,UACb,cAAc;AAAA,YACZ,OAAO,CAAC,IAAI;AAAA,UACxB;AAAA,UACU,gBAAgB;AAAA,UAChB,UAAU;AAAA,QACpB,CAAS;AAAA,MACH;AAGA,WAAK,gBAAgB,sBAAsB,SAAU,SAAS;AAC5D,YAAI,OAAO,QAAQ;AAEnB,eAAO,WAAW,IAAI;AAEtB,eAAO,QAAQ;AAAA,UACb,UAAU;AAAA,QACpB,CAAS;AAAA,MACH;AAGA,WAAK,gBAAgB,qBAAqB,SAAU,SAAS;AAC3D,YAAI,OAAO,QAAQ;AAEnB,eAAO,QAAQ,IAAI;AAEnB,eAAO,QAAQ;AAAA,UACb,cAAc;AAAA,YACZ,OAAO,CAAC,IAAI;AAAA,UACxB;AAAA,UACU,UAAU;AAAA,QACpB,CAAS;AAAA,MACH;AAGA,WAAK,gBAAgB,wBAAwB,SAAU,SAAS;AAC9D,YAAI,OAAO,QAAQ;AAEnB,eAAO,QAAQ;AAAA,UACb,cAAc;AAAA,YACZ,OAAO,CAAC,IAAI;AAAA,UACxB;AAAA,UACU,gBAAgB;AAAA,UAChB,UAAU;AAAA,QACpB,CAAS;AAAA,MACH;AAGA,WAAK,gBAAgB,sBAAsB,SAAU,SAAS;AAC5D,YAAI,OAAO,QAAQ;AAEnB,eAAO,WAAW,IAAI;AAEtB,eAAO,QAAQ;AAAA,UACb,UAAU;AAAA,QACpB,CAAS;AAAA,MACH;AAGA,WAAK,gBAAgB,wBAAwB,WAAY;AAEvD,eAAO,eAAc;AACrB,eAAO,iBAAgB;AAEvB,eAAO,QAAQ;AAAA,UACb,UAAU;AAAA,QACpB,CAAS;AAAA,MACH;AAGA,WAAK,gBAAgB,mBAAmB,WAAY;AAElD,eAAO,eAAc;AACrB,eAAO,eAAc;AAGrB,eAAO,iBAAgB;AACvB,eAAO,iBAAgB;AAGvB,eAAO,QAAQ;AAAA,UACb,UAAU;AAAA,QACpB,CAAS;AAAA,MACH;AACA,YAAM,GAAG,aAAa,KAAK,gBAAgB,kBAAkB;AAC7D,YAAM,GAAG,eAAe,KAAK,gBAAgB,mBAAmB;AAChE,YAAM,GAAG,yBAAyB,KAAK,gBAAgB,qBAAqB;AAC5E,YAAM,GAAG,6BAA6B,KAAK,gBAAgB,oCAAoC;AAC/F,YAAM,GAAG,aAAa,KAAK,gBAAgB,kBAAkB;AAC7D,YAAM,GAAG,eAAe,KAAK,gBAAgB,mBAAmB;AAChE,YAAM,GAAG,yBAAyB,KAAK,gBAAgB,qBAAqB;AAC5E,YAAM,GAAG,6BAA6B,KAAK,gBAAgB,oCAAoC;AAC/F,YAAM,GAAG,gBAAgB,KAAK,gBAAgB,qBAAqB;AACnE,YAAM,GAAG,WAAW,KAAK,gBAAgB,gBAAgB;AACzD,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,sBAAsB;AACpC,UAAI,QAAQ,KAAK;AACjB,YAAM,eAAe,aAAa,KAAK,gBAAgB,kBAAkB;AACzE,YAAM,eAAe,eAAe,KAAK,gBAAgB,mBAAmB;AAC5E,YAAM,eAAe,yBAAyB,KAAK,gBAAgB,qBAAqB;AACxF,YAAM,eAAe,6BAA6B,KAAK,gBAAgB,oCAAoC;AAC3G,YAAM,eAAe,aAAa,KAAK,gBAAgB,kBAAkB;AACzE,YAAM,eAAe,eAAe,KAAK,gBAAgB,mBAAmB;AAC5E,YAAM,eAAe,yBAAyB,KAAK,gBAAgB,qBAAqB;AACxF,YAAM,eAAe,6BAA6B,KAAK,gBAAgB,oCAAoC;AAC3G,YAAM,eAAe,gBAAgB,KAAK,gBAAgB,qBAAqB;AAC/E,YAAM,eAAe,WAAW,KAAK,gBAAgB,gBAAgB;AAAA,IACvE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,eAAe,GAAG,GAAG;AACnC,UAAI,QAAQ,cAAc,KAAK,cAAc,OAAO,KAAK,aAAa,OAAO,GAAG,GAAG,KAAK,YAAY,KAAK,sBAAsB;AAC/H,UAAI,QAAQ,aAAa,MAAM,QAAQoD,qBAAmB,KAAK,CAAC;AAChE,UAAI,SAAS,KAAK,aAAa,KAAK;AACpC,aAAO,UAAU,OAAO,SAAS,SAAS,OAAO,KAAK;AAAA,IACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS1C,WAAU;AACxB,UAAI,SAAS;AACb,WAAK,KAAK,eAAe;AACzB,UAAI,QAAQ,KAAK;AACjB,UAAI,WAAW,KAAK;AACpB,UAAI,aAAa,KAAK,cAAa;AAKnC,WAAK,aAAa,YAAY,KAAK,KAAK;AACxC,UAAI,CAAC,KAAK,SAAS,aAAa;AAC9B,YAAI,QAAQ,WAAW,OACrB,SAAS,WAAW;AACtB,YAAI,mBAAmB,KAAK,YAC1B,IAAI,iBAAiB,GACrB,IAAI,iBAAiB;AACvB,aAAK,aAAa;AAAA,UAChB,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,QAAQ,CAAC;AAAA,UAChE,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,SAAS,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,SAAS,CAAC;AAAA,QAC5E;AAAA,MACM;AACA,WAAK,wBAAwB,4BAA4B,KAAK,cAAc,KAAK,UAAU;AAI3F,UAAI,aAAa,IAAI,OAAM;AAC3B,UAAI,mBAAmB,iBAAiB,WAAW,SAAQ,GAAI,YAAY,KAAK,mBAAkB,GAAI,KAAK,gBAAe,CAAE;AAG5H,WAAK,UAAU,eAAe,YAAY,SAAS,iBAAiB;AACpE,UAAI,mBAAmB,CAAA;AACvB,UAAI,cAAc,CAAA;AAClB,UAAI,cAAc,CAAA;AAClB,UAAI,eAAe,CAAA;AACnB,UAAI,SAAS;AACb,UAAI,QAAQ,MAAM,MAAK;AAGvB,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAI,GAAG,KAAK;AAC5C,YAAI,OAAO,MAAM,CAAC;AAClB,YAAI,OAAO,KAAK,cAAc,IAAI;AAGlC,YAAI,QAAQ,MAAM,kBAAkB,IAAI;AACxC,aAAK,IAAI,MAAM;AACf,aAAK,IAAI,MAAM;AACf,aAAK,sBAAsB,QAAQ,IAAI;AAGvC,YAAI,OAAO,KAAK,UAAU,YAAY,CAAC,KAAK,OAAQ,MAAK,UAAU,IAAI,MAAM,KAAK,MAAM,KAAK,sBAAsB,MAAM;AAAA,UACvH,QAAQ;AAAA,QAClB,CAAS,CAAC;AAGF,yBAAiB,KAAK,IAAI,KAAK,iBAAiB,KAAK,IAAI,KAAK,KAAK;AAAA,MACrE;AACA,WAAK,UAAU,SAAQ;AAGvB,eAAS,QAAQ,KAAK,cAAc;AAClC,YAAI,CAAC,eAAe,KAAK,KAAK,cAAc,IAAI,GAAG;AACjD,gBAAM,IAAI,MAAM,2DAA4D,OAAO,MAAM,IAAK,CAAC;AAAA,QACjG;AACA,aAAK,aAAa,IAAI,EAAE,WAAW,iBAAiB,IAAI,KAAK,CAAC;AAE9D,yBAAiB,IAAI,IAAI;AAAA,MAC3B;AAGA,UAAI,KAAK,SAAS,UAAU,KAAK,YAAY,CAAC,MAAM,KAAK,YAAY,CAAC,EAAG,SAAQ,eAAe,KAAK,aAAa,SAAU8C,OAAM;AAChI,eAAO,OAAO,cAAcA,KAAI,EAAE;AAAA,MACpC,GAAG,KAAK;AAGR,eAAS,KAAK,GAAG,KAAK,MAAM,QAAQ,KAAK,IAAI,MAAM;AACjD,YAAI,QAAQ,MAAM,EAAE;AACpB,oBAAY,KAAK,IAAI;AACrB,qBAAa,YAAY,KAAK,CAAC,IAAI;AAAA,UACjC,MAAM;AAAA,UACN,IAAI;AAAA,QACd;AACQ;AACA,YAAI,QAAQ,KAAK,cAAc,KAAK;AACpC,aAAK,iBAAiB,OAAO,YAAY,KAAK,GAAG,iBAAiB,MAAM,IAAI,GAAG;AAAA,MACjF;AAMA,UAAI,mBAAmB,CAAA;AACvB,UAAI,QAAQ,MAAM,MAAK;AAGvB,eAAS,MAAM,GAAG,MAAM,MAAM,QAAQ,MAAM,KAAK,OAAO;AACtD,YAAI,OAAO,MAAM,GAAG;AACpB,YAAI,SAAS,KAAK,cAAc,IAAI;AACpC,yBAAiB,OAAO,IAAI,KAAK,iBAAiB,OAAO,IAAI,KAAK,KAAK;AAAA,MACzE;AAGA,UAAI,KAAK,SAAS,UAAU,KAAK,YAAY,CAAC,MAAM,KAAK,YAAY,CAAC,EAAG,SAAQ,eAAe,KAAK,aAAa,SAAUC,OAAM;AAChI,eAAO,OAAO,cAAcA,KAAI,EAAE;AAAA,MACpC,GAAG,KAAK;AACR,eAAS,UAAU,KAAK,cAAc;AACpC,YAAI,CAAC,eAAe,KAAK,KAAK,cAAc,MAAM,GAAG;AACnD,gBAAM,IAAI,MAAM,2DAA4D,OAAO,QAAQ,IAAK,CAAC;AAAA,QACnG;AACA,aAAK,aAAa,MAAM,EAAE,WAAW,iBAAiB,MAAM,KAAK,CAAC;AAElE,yBAAiB,MAAM,IAAI;AAAA,MAC7B;AAGA,eAAS,MAAM,GAAG,MAAM,MAAM,QAAQ,MAAM,KAAK,OAAO;AACtD,YAAI,QAAQ,MAAM,GAAG;AACrB,oBAAY,KAAK,IAAI;AACrB,qBAAa,YAAY,KAAK,CAAC,IAAI;AAAA,UACjC,MAAM;AAAA,UACN,IAAI;AAAA,QACd;AACQ;AACA,YAAI,SAAS,KAAK,cAAc,KAAK;AACrC,aAAK,iBAAiB,OAAO,YAAY,KAAK,GAAG,iBAAiB,OAAO,IAAI,GAAG;AAAA,MAClF;AACA,WAAK,eAAe;AACpB,WAAK,cAAc;AACnB,WAAK,cAAc;AACnB,WAAK,KAAK,cAAc;AACxB,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,qBAAqB,aAAa;AAChD,UAAI,SAAS;AACb,UAAI,WAAW,KAAK;AACpB,WAAK,OAAO,WAAW,SAAS;AAChC,WAAK,OAAO,WAAW,SAAS;AAChC,WAAK,OAAO,iBAAiB,SAAS;AACtC,WAAK,OAAO,iBAAiB,SAAS;AACtC,WAAK,OAAO,kBAAkB,SAAS;AACvC,UAAI,SAAS,qBAAqB;AAChC,aAAK,OAAO,QAAQ,SAAU,OAAO;AACnC,iBAAO,OAAO,iBAAiB,OAAO,SAAS,uBAAuB,QAAQ,SAAS,mBAAmB,MAAM,WAAW,SAAS,sBAAsB,CAAA,CAAE;AAAA,QAC9J;AAAA,MACF,OAAO;AACL,aAAK,OAAO,QAAQ;AAAA,MACtB;AACA,WAAK,OAAO,SAAS,KAAK,OAAO,cAAc,KAAK,OAAO,SAAQ,CAAE,CAAC;AACtE,UAAI,aAAa;AAEf,YAAI,YAAY,uBAAuB,SAAS,oBAAoB;AAClE,mBAAS,QAAQ,SAAS,oBAAoB;AAC5C,gBAAI,SAAS,mBAAmB,IAAI,MAAM,YAAY,mBAAmB,IAAI,GAAG;AAC9E,mBAAK,oBAAoB,MAAM,SAAS,mBAAmB,IAAI,CAAC;AAAA,YAClE;AAAA,UACF;AACA,mBAAS,UAAU,YAAY,oBAAoB;AACjD,gBAAI,CAAC,SAAS,mBAAmB,MAAM,EAAG,MAAK,sBAAsB,MAAM;AAAA,UAC7E;AAAA,QACF;AAGA,YAAI,YAAY,uBAAuB,SAAS,sBAAsB,YAAY,4BAA4B,SAAS,yBAAyB;AAC9I,mBAAS,UAAU,SAAS,oBAAoB;AAC9C,gBAAI,SAAS,mBAAmB,MAAM,MAAM,YAAY,mBAAmB,MAAM,KAAK,SAAS,wBAAwB,MAAM,MAAM,YAAY,wBAAwB,MAAM,GAAG;AAC9K,mBAAK,oBAAoB,QAAQ,SAAS,mBAAmB,MAAM,GAAG,SAAS,wBAAwB,MAAM,CAAC;AAAA,YAChH;AAAA,UACF;AACA,mBAAS,UAAU,YAAY,oBAAoB;AACjD,gBAAI,CAAC,SAAS,mBAAmB,MAAM,EAAG,MAAK,sBAAsB,MAAM;AAAA,UAC7E;AAAA,QACF;AAAA,MACF;AAGA,WAAK,YAAY,YAAY,KAAK,QAAQ;AAC1C,WAAK,YAAY,YAAY,KAAK,QAAQ;AAC1C,aAAO;AAAA,IACT;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,iBAAiB,OAAO;AACtC,UAAI,OAAO,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA,GAC7E,iBAAiB,KAAK,WACtB,YAAY,mBAAmB,SAAS,IAAI,gBAC5C,aAAa,KAAK;AACpB,UAAI,WAAWnD,iBAAe,CAAA,GAAI,KAAK;AAGvC,UAAI,QAAQ,cAAc,KAAK,YAC7B,UAAU,eAAe,MAAM,GAAG,CAAC,GACnC,YAAY,QAAQ,CAAC,GACrB,YAAY,QAAQ,CAAC,GACrB,UAAU,eAAe,MAAM,GAAG,CAAC,GACnC,YAAY,QAAQ,CAAC,GACrB,YAAY,QAAQ,CAAC;AAGvB,UAAI,UAAU,CAAC,KAAK,gBAAgB;AAAA,QAClC,GAAG;AAAA,QACH,GAAG;AAAA,MACX,GAAS;AAAA,QACD,aAAa;AAAA,MACrB,CAAO,GAAG,KAAK,gBAAgB;AAAA,QACvB,GAAG;AAAA,QACH,GAAG;AAAA,MACX,GAAS;AAAA,QACD,aAAa;AAAA,MACrB,CAAO,GAAG,KAAK,gBAAgB;AAAA,QACvB,GAAG;AAAA,QACH,GAAG;AAAA,MACX,GAAS;AAAA,QACD,aAAa;AAAA,MACrB,CAAO,GAAG,KAAK,gBAAgB;AAAA,QACvB,GAAG;AAAA,QACH,GAAG;AAAA,MACX,GAAS;AAAA,QACD,aAAa;AAAA,MACrB,CAAO,CAAC;AAGF,UAAI,OAAO,UACT,OAAO,WACP,OAAO,UACP,OAAO;AACT,cAAQ,QAAQ,SAAU,OAAO;AAC/B,YAAI,IAAI,MAAM,GACZ,IAAI,MAAM;AACZ,eAAO,KAAK,IAAI,MAAM,CAAC;AACvB,eAAO,KAAK,IAAI,MAAM,CAAC;AACvB,eAAO,KAAK,IAAI,MAAM,CAAC;AACvB,eAAO,KAAK,IAAI,MAAM,CAAC;AAAA,MACzB,CAAC;AAGD,UAAI,aAAa,OAAO;AACxB,UAAI,cAAc,OAAO;AACzB,UAAI,sBAAsB,KAAK,cAAa,GAC1C,QAAQ,oBAAoB,OAC5B,SAAS,oBAAoB;AAC/B,UAAI,KAAK;AACT,UAAI,KAAK;AACT,UAAI,cAAc,OAAO;AACvB,YAAI,OAAO,QAAQ,UAAW,MAAK,QAAQ,QAAQ;AAAA,iBAAoB,OAAO,UAAW,MAAK,OAAO;AAAA,MACvG,OAAO;AACL,YAAI,OAAO,QAAQ,UAAW,MAAK,QAAQ,QAAQ;AAAA,iBAAoB,OAAO,CAAC,UAAW,MAAK,OAAO;AAAA,MACxG;AACA,UAAI,eAAe,QAAQ;AACzB,YAAI,OAAO,SAAS,UAAW,MAAK,QAAQ,SAAS;AAAA,iBAAoB,OAAO,UAAW,MAAK,OAAO;AAAA,MACzG,OAAO;AACL,YAAI,OAAO,SAAS,UAAW,MAAK,QAAQ,SAAS;AAAA,iBAAoB,OAAO,CAAC,UAAW,MAAK,OAAO;AAAA,MAC1G;AACA,UAAI,MAAM,IAAI;AAEZ,YAAI,SAAS,KAAK,sBAAsB;AAAA,UACtC,GAAG;AAAA,UACH,GAAG;AAAA,QACb,GAAW;AAAA,UACD,aAAa;AAAA,QACvB,CAAS;AACD,YAAI,QAAQ,KAAK,sBAAsB;AAAA,UACrC,GAAG;AAAA,UACH,GAAG;AAAA,QACb,GAAW;AAAA,UACD,aAAa;AAAA,QACvB,CAAS;AACD,aAAK,MAAM,IAAI,OAAO;AACtB,aAAK,MAAM,IAAI,OAAO;AACtB,iBAAS,KAAK;AACd,iBAAS,KAAK;AAAA,MAChB;AACA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,eAAe;AAC7B,UAAI,CAAC,KAAK,SAAS,aAAc,QAAO;AACxC,UAAI,cAAc,KAAK,OAAO,SAAQ;AAGtC,UAAI,kBAAkB,KAAK,UAAU,mBAAmB,YAAY,OAAO,KAAK,SAAS,YAAY;AACrG,aAAO,iBAAiB,KAAK,qBAAqB;AAClD,WAAK,sBAAsB,oBAAI,IAAG;AAGlC,UAAI,UAAU,KAAK,eAAe;AAClC,eAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,IAAI,GAAG,KAAK;AACtD,YAAI,OAAO,gBAAgB,CAAC;AAC5B,YAAI,OAAO,KAAK,cAAc,IAAI;AAKlC,YAAI,KAAK,oBAAoB,IAAI,IAAI,EAAG;AAGxC,YAAI,KAAK,OAAQ;AACjB,YAAI,wBAAwB,KAAK,sBAAsB,IAAI,GACzD,IAAI,sBAAsB,GAC1B,IAAI,sBAAsB;AAG5B,YAAI,OAAO,KAAK,UAAU,KAAK,IAAI;AAGnC,YAAI,CAAC,KAAK,cAAc,OAAO,KAAK,SAAS,2BAA4B;AAWzE,YAAI,IAAI,CAAC,kBAAkB,IAAI,KAAK,QAAQ,kBAAkB,IAAI,CAAC,kBAAkB,IAAI,KAAK,SAAS,eAAgB;AAOvH,aAAK,oBAAoB,IAAI,IAAI;AACjC,YAAI,uBAAuB,KAAK,SAAS;AACzC,YAAI,cAAc,KAAK,aAAa,KAAK,IAAI;AAC7C,YAAI,aAAa,gBAAgB,QAAQ,gBAAgB,SAAS,SAAS,YAAY,cAAc;AACrG,kBAAU,SAASA,iBAAeA,iBAAe;AAAA,UAC/C,KAAK;AAAA,QACf,GAAW,IAAI,GAAG,IAAI;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,QACV,CAAS,GAAG,KAAK,QAAQ;AAAA,MACnB;AACA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,mBAAmB;AACjC,UAAI,CAAC,KAAK,SAAS,iBAAkB,QAAO;AAC5C,UAAI,UAAU,KAAK,eAAe;AAGlC,cAAQ,UAAU,GAAG,GAAG,KAAK,OAAO,KAAK,MAAM;AAC/C,UAAI,sBAAsB,6BAA6B;AAAA,QACrD,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK;AAAA,QAClB,qBAAqB,KAAK;AAAA,QAC1B,kBAAkB,KAAK;AAAA,MAC/B,CAAO;AACD,aAAO,qBAAqB,KAAK,qBAAqB;AACtD,UAAI,kBAAkB,oBAAI,IAAG;AAC7B,eAAS,IAAI,GAAG,IAAI,oBAAoB,QAAQ,IAAI,GAAG,KAAK;AAC1D,YAAI,OAAO,oBAAoB,CAAC,GAC9B,cAAc,KAAK,MAAM,YAAY,IAAI,GACzC,aAAa,KAAK,cAAc,YAAY,CAAC,CAAC,GAC9C,aAAa,KAAK,cAAc,YAAY,CAAC,CAAC,GAC9C,WAAW,KAAK,cAAc,IAAI;AAIpC,YAAI,gBAAgB,IAAI,IAAI,EAAG;AAI/B,YAAI,SAAS,UAAU,WAAW,UAAU,WAAW,QAAQ;AAC7D;AAAA,QACF;AACA,YAAI,uBAAuB,KAAK,SAAS;AACzC,YAAI,cAAc,KAAK,aAAa,SAAS,IAAI;AACjD,YAAI,aAAa,gBAAgB,QAAQ,gBAAgB,SAAS,SAAS,YAAY,cAAc;AACrG,kBAAU,SAASA,iBAAeA,iBAAe;AAAA,UAC/C,KAAK;AAAA,QACf,GAAW,QAAQ,GAAG,IAAI;AAAA,UAChB,MAAM,KAAK,UAAU,SAAS,IAAI;AAAA,QAC5C,CAAS,GAAGA,iBAAeA,iBAAeA,iBAAe;AAAA,UAC/C,KAAK,YAAY,CAAC;AAAA,QAC5B,GAAW,UAAU,GAAG,KAAK,sBAAsB,UAAU,CAAC,GAAG,IAAI;AAAA,UAC3D,MAAM,KAAK,UAAU,WAAW,IAAI;AAAA,QAC9C,CAAS,GAAGA,iBAAeA,iBAAeA,iBAAe;AAAA,UAC/C,KAAK,YAAY,CAAC;AAAA,QAC5B,GAAW,UAAU,GAAG,KAAK,sBAAsB,UAAU,CAAC,GAAG,IAAI;AAAA,UAC3D,MAAM,KAAK,UAAU,WAAW,IAAI;AAAA,QAC9C,CAAS,GAAG,KAAK,QAAQ;AACjB,wBAAgB,IAAI,IAAI;AAAA,MAC1B;AACA,WAAK,sBAAsB;AAC3B,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,yBAAyB;AACvC,UAAI,SAAS;AACb,UAAI,UAAU,KAAK,eAAe;AAGlC,cAAQ,UAAU,GAAG,GAAG,KAAK,OAAO,KAAK,MAAM;AAG/C,UAAI,SAAS,SAASoD,QAAO,MAAM;AACjC,YAAI,OAAO,OAAO,cAAc,IAAI;AACpC,YAAI,wBAAwB,OAAO,sBAAsB,IAAI,GAC3D,IAAI,sBAAsB,GAC1B,IAAI,sBAAsB;AAC5B,YAAI,OAAO,OAAO,UAAU,KAAK,IAAI;AACrC,YAAI,uBAAuB,OAAO,SAAS;AAC3C,YAAI,cAAc,OAAO,aAAa,KAAK,IAAI;AAC/C,YAAI,aAAa,gBAAgB,QAAQ,gBAAgB,SAAS,SAAS,YAAY,cAAc;AACrG,kBAAU,SAASpD,iBAAeA,iBAAe;AAAA,UAC/C,KAAK;AAAA,QACf,GAAW,IAAI,GAAG,IAAI;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,QACV,CAAS,GAAG,OAAO,QAAQ;AAAA,MACrB;AACA,UAAI,gBAAgB,CAAA;AACpB,UAAI,KAAK,eAAe,CAAC,KAAK,cAAc,KAAK,WAAW,EAAE,QAAQ;AACpE,sBAAc,KAAK,KAAK,WAAW;AAAA,MACrC;AACA,WAAK,iBAAiB,QAAQ,SAAU,MAAM;AAE5C,YAAI,SAAS,OAAO,YAAa,eAAc,KAAK,IAAI;AAAA,MAC1D,CAAC;AAGD,oBAAc,QAAQ,SAAU,MAAM;AACpC,eAAO,OAAO,IAAI;AAAA,MACpB,CAAC;AAGD,UAAI,mBAAmB,CAAA;AAGvB,oBAAc,QAAQ,SAAU,MAAM;AACpC,YAAIqD,QAAO,OAAO,cAAc,IAAI,EAAE;AACtC,yBAAiBA,KAAI,KAAK,iBAAiBA,KAAI,KAAK,KAAK;AAAA,MAC3D,CAAC;AAED,eAAS,QAAQ,KAAK,mBAAmB;AACvC,aAAK,kBAAkB,IAAI,EAAE,WAAW,iBAAiB,IAAI,KAAK,CAAC;AAEnE,yBAAiB,IAAI,IAAI;AAAA,MAC3B;AAEA,oBAAc,QAAQ,SAAU,MAAM;AACpC,YAAI,OAAO,OAAO,cAAc,IAAI;AACpC,eAAO,kBAAkB,KAAK,IAAI,EAAE,QAAQ,GAAG,iBAAiB,KAAK,IAAI,KAAK,IAAI;AAAA,MACpF,CAAC;AAED,WAAK,cAAc,WAAW,MAAM,KAAK,cAAc,WAAW,gBAAgB;AAElF,UAAI,eAAe,KAAK,gBAAe;AACvC,eAAS,UAAU,KAAK,mBAAmB;AACzC,YAAI,UAAU,KAAK,kBAAkB,MAAM;AAC3C,gBAAQ,OAAO,YAAY;AAAA,MAC7B;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,iCAAiC;AAC/C,UAAI,SAAS;AACb,UAAI,KAAK,+BAA+B,KAAK,YAAa;AAC1D,WAAK,8BAA8B,sBAAsB,WAAY;AAEnE,eAAO,8BAA8B;AAGrC,eAAO,uBAAsB;AAC7B,eAAO,iBAAgB;AAAA,MACzB,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,SAAS;AACvB,UAAI,SAAS;AACb,WAAK,KAAK,cAAc;AACxB,UAAI,aAAa,SAASC,cAAa;AACrC,eAAO,KAAK,aAAa;AACzB,eAAO;AAAA,MACT;AAGA,UAAI,KAAK,aAAa;AACpB,6BAAqB,KAAK,WAAW;AACrC,aAAK,cAAc;AAAA,MACrB;AAGA,WAAK,OAAM;AAGX,UAAI,KAAK,cAAe,MAAK,QAAO;AACpC,WAAK,gBAAgB;AAGrB,WAAK,MAAK;AAGV,WAAK,cAAc,QAAQ,SAAU,OAAO;AAC1C,eAAO,OAAO,kBAAkB,KAAK;AAAA,MACvC,CAAC;AAGD,UAAI,CAAC,KAAK,MAAM,MAAO,QAAO,WAAU;AAIxC,UAAI,cAAc,KAAK;AACvB,UAAI,SAAS,KAAK,OAAO,WAAU,KAAM,YAAY,YAAY,YAAY,iBAAiB,YAAY;AAG1G,UAAI,cAAc,KAAK,OAAO,SAAQ;AACtC,UAAI,qBAAqB,KAAK,cAAa;AAC3C,UAAI,kBAAkB,KAAK,mBAAkB;AAC7C,UAAI,UAAU,KAAK,gBAAe;AAClC,WAAK,SAAS,iBAAiB,aAAa,oBAAoB,iBAAiB,OAAO;AACxF,WAAK,YAAY,iBAAiB,aAAa,oBAAoB,iBAAiB,SAAS,IAAI;AACjG,WAAK,kBAAkB,gBAAgB,KAAK,QAAQ,aAAa,kBAAkB;AACnF,WAAK,uBAAuB,KAAK,wBAAuB;AAYxD,UAAI,SAAS,KAAK,gBAAe;AAGjC,eAAS,QAAQ,KAAK,cAAc;AAClC,YAAI,UAAU,KAAK,aAAa,IAAI;AACpC,gBAAQ,OAAO,MAAM;AAAA,MACvB;AAGA,UAAI,CAAC,KAAK,SAAS,mBAAmB,CAAC,QAAQ;AAC7C,iBAAS,UAAU,KAAK,cAAc;AACpC,cAAI,YAAY,KAAK,aAAa,MAAM;AACxC,oBAAU,OAAO,MAAM;AAAA,QACzB;AAAA,MACF;AAGA,UAAI,KAAK,SAAS,oBAAoB,OAAQ,QAAO,WAAU;AAC/D,WAAK,aAAY;AACjB,WAAK,iBAAgB;AACrB,WAAK,uBAAsB;AAC3B,aAAO,WAAU;AAAA,IACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,QAAQ,KAAK;AAQ3B,UAAI,OAAO,OAAO,OAAO,CAAA,GAAI,KAAK,MAAM,kBAAkB,GAAG,CAAC;AAC9D,UAAI,KAAK,SAAS,YAAa,QAAO,KAAK,SAAS,YAAY,KAAK,IAAI;AACzE,UAAI,OAAO,kBAAkB,KAAK,UAAU,KAAK,IAAI;AACrD,WAAK,cAAc,GAAG,IAAI;AAK1B,WAAK,sBAAsB,QAAQ,EAAE,GAAG;AACxC,UAAI,KAAK,cAAc,CAAC,KAAK,OAAQ,MAAK,sBAAsB,IAAI,GAAG;AAKvE,WAAK,iBAAiB,QAAQ,EAAE,GAAG;AACnC,UAAI,KAAK,eAAe,CAAC,KAAK,OAAQ,MAAK,iBAAiB,IAAI,GAAG;AAGnE,UAAI,KAAK,SAAS,QAAQ;AACxB,YAAI,KAAK,SAAS,KAAK,YAAY,CAAC,EAAG,MAAK,YAAY,CAAC,IAAI,KAAK;AAClE,YAAI,KAAK,SAAS,KAAK,YAAY,CAAC,EAAG,MAAK,YAAY,CAAC,IAAI,KAAK;AAAA,MACpE;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,WAAW,KAAK;AAC9B,WAAK,QAAQ,GAAG;AAGhB,UAAI,OAAO,KAAK,cAAc,GAAG;AACjC,WAAK,sBAAsB,QAAQ,IAAI;AAAA,IACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,WAAW,KAAK;AAE9B,aAAO,KAAK,cAAc,GAAG;AAE7B,aAAO,KAAK,iBAAiB,GAAG;AAEhC,WAAK,iBAAiB,QAAQ,EAAE,GAAG;AAEnC,UAAI,KAAK,gBAAgB,IAAK,MAAK,cAAc;AAEjD,WAAK,sBAAsB,QAAQ,EAAE,GAAG;AAAA,IAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,QAAQ,KAAK;AAO3B,UAAI,OAAO,OAAO,OAAO,CAAA,GAAI,KAAK,MAAM,kBAAkB,GAAG,CAAC;AAC9D,UAAI,KAAK,SAAS,YAAa,QAAO,KAAK,SAAS,YAAY,KAAK,IAAI;AACzE,UAAI,OAAO,kBAAkB,KAAK,UAAU,KAAK,IAAI;AACrD,WAAK,cAAc,GAAG,IAAI;AAK1B,WAAK,sBAAsB,QAAQ,EAAE,GAAG;AACxC,UAAI,KAAK,cAAc,CAAC,KAAK,OAAQ,MAAK,sBAAsB,IAAI,GAAG;AAGvE,UAAI,KAAK,SAAS,QAAQ;AACxB,YAAI,KAAK,SAAS,KAAK,YAAY,CAAC,EAAG,MAAK,YAAY,CAAC,IAAI,KAAK;AAClE,YAAI,KAAK,SAAS,KAAK,YAAY,CAAC,EAAG,MAAK,YAAY,CAAC,IAAI,KAAK;AAAA,MACpE;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,WAAW,KAAK;AAC9B,WAAK,QAAQ,GAAG;AAAA,IAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,WAAW,KAAK;AAE9B,aAAO,KAAK,cAAc,GAAG;AAE7B,aAAO,KAAK,iBAAiB,GAAG;AAEhC,UAAI,KAAK,gBAAgB,IAAK,MAAK,cAAc;AAEjD,WAAK,sBAAsB,QAAQ,EAAE,GAAG;AAAA,IAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,mBAAmB;AAEjC,WAAK,YAAY,IAAI,UAAS;AAC9B,WAAK,aAAa;AAAA,QAChB,GAAG,CAAC,GAAG,CAAC;AAAA,QACR,GAAG,CAAC,GAAG,CAAC;AAAA,MAChB;AACM,WAAK,gBAAgB,CAAA;AACrB,WAAK,mBAAmB,CAAA;AACxB,WAAK,wBAAwB,oBAAI,IAAG;AACpC,WAAK,cAAc,CAAC,UAAU,SAAS;AACvC,WAAK,mBAAmB,oBAAI,IAAG;AAAA,IACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,mBAAmB;AACjC,WAAK,gBAAgB,CAAA;AACrB,WAAK,mBAAmB,CAAA;AACxB,WAAK,wBAAwB,oBAAI,IAAG;AACpC,WAAK,cAAc,CAAC,UAAU,SAAS;AAAA,IACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,eAAe;AAC7B,WAAK,iBAAgB;AACrB,WAAK,iBAAgB;AAAA,IACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,iBAAiB;AAC/B,WAAK,sBAAsB,oBAAI,IAAG;AAClC,WAAK,mBAAmB,oBAAI,IAAG;AAC/B,WAAK,cAAc;AAAA,IACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,iBAAiB;AAC/B,WAAK,sBAAsB,oBAAI,IAAG;AAClC,WAAK,mBAAmB,oBAAI,IAAG;AAC/B,WAAK,cAAc;AAAA,IACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,aAAa;AAC3B,WAAK,eAAc;AACnB,WAAK,eAAc;AAAA,IACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,iBAAiB,MAAM,aAAa,UAAU;AAC5D,UAAI,OAAO,KAAK,cAAc,IAAI;AAClC,UAAI,cAAc,KAAK,aAAa,KAAK,IAAI;AAC7C,UAAI,CAAC,YAAa,OAAM,IAAI,MAAM,2DAA4D,OAAO,KAAK,MAAM,IAAK,CAAC;AACtH,kBAAY,QAAQ,aAAa,UAAU,IAAI;AAE/C,WAAK,iBAAiB,IAAI,IAAI;AAAA,IAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,iBAAiB,MAAM,aAAa,UAAU;AAC5D,UAAI,OAAO,KAAK,cAAc,IAAI;AAClC,UAAI,cAAc,KAAK,aAAa,KAAK,IAAI;AAC7C,UAAI,CAAC,YAAa,OAAM,IAAI,MAAM,2DAA4D,OAAO,KAAK,MAAM,IAAK,CAAC;AACtH,UAAI,cAAc,KAAK,MAAM,YAAY,IAAI,GAC3C,aAAa,KAAK,cAAc,YAAY,CAAC,CAAC,GAC9C,aAAa,KAAK,cAAc,YAAY,CAAC,CAAC;AAChD,kBAAY,QAAQ,aAAa,UAAU,YAAY,YAAY,IAAI;AAEvE,WAAK,iBAAiB,IAAI,IAAI;AAAA,IAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,kBAAkB;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,SAAS,kBAAkB;AAChC,UAAI,iBAAiB,KAAK,UACxB,eAAe,eAAe,cAC9B,cAAc,eAAe;AAC/B,aAAO,cAAc,gBAAgB,IAAI;AAAA,IAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,YAAY,IAAI,KAAK;AACnC,UAAI,UAAU,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AAClF,UAAI,KAAK,SAAS,EAAE,EAAG,OAAM,IAAI,MAAM,yBAA0B,OAAO,IAAI,kBAAmB,CAAC;AAChG,UAAI,UAAU,cAAc,KAAK;AAAA,QAC/B,UAAU;AAAA,MAClB,GAAS;AAAA,QACD,SAAS,SAAS,OAAO,EAAE;AAAA,MACnC,CAAO;AACD,UAAI,QAAQ,MAAO,QAAO,OAAO,QAAQ,OAAO,QAAQ,KAAK;AAC7D,WAAK,SAAS,EAAE,IAAI;AACpB,UAAI,iBAAiB,WAAW,QAAQ,aAAa;AACnD,aAAK,SAAS,QAAQ,WAAW,EAAE,OAAO,OAAO;AAAA,MACnD,WAAW,gBAAgB,WAAW,QAAQ,YAAY;AACxD,aAAK,SAAS,QAAQ,UAAU,EAAE,MAAM,OAAO;AAAA,MACjD,OAAO;AACL,aAAK,UAAU,YAAY,OAAO;AAAA,MACpC;AACA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,aAAa,IAAI;AAC/B,UAAI,UAAU,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AAClF,aAAO,KAAK,YAAY,IAAI,UAAU,OAAO;AAAA,IAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,oBAAoB,IAAI;AACtC,UAAI,UAAU,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AAClF,UAAI,SAAS,KAAK,aAAa,IAAI,OAAO;AAC1C,UAAI,iBAAiB;AAAA,QACnB,uBAAuB;AAAA,QACvB,WAAW;AAAA,MACnB;AACM,WAAK,eAAe,EAAE,IAAI,OAAO,WAAW,MAAM,cAAc;AAChE,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,mBAAmB,IAAI;AACrC,UAAI,UAAU,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AAClF,UAAI,UAAU,YAAY,QAAQ,YAAY,SAAS,SAAS,QAAQ,WAAW,KAAK,aAAa,IAAI,OAAO;AAChH,UAAI,QAAQ,OAAQ,QAAO,OAAM;AACjC,UAAI,iBAAiBtD,iBAAe;AAAA,QAClC,uBAAuB;AAAA,QACvB,WAAW;AAAA,MACnB,GAAS,OAAO;AACV,UAAI;AAGJ,gBAAU,OAAO,WAAW,UAAU,cAAc;AAGpD,UAAI,CAAC,QAAS,WAAU,OAAO,WAAW,SAAS,cAAc;AAGjE,UAAI,CAAC,QAAS,WAAU,OAAO,WAAW,sBAAsB,cAAc;AAC9E,UAAI,KAAK;AACT,WAAK,cAAc,EAAE,IAAI;AAGzB,SAAG,UAAU,GAAG,KAAK,GAAG,mBAAmB;AAG3C,UAAI,QAAQ,SAAS;AACnB,aAAK,cAAc,IAAI,EAAE;AACzB,YAAI,iBAAiB,GAAG,kBAAiB;AACzC,YAAI,CAAC,eAAgB,OAAM,IAAI,MAAM,qDAAqD,OAAO,EAAE,CAAC;AACpG,aAAK,aAAa,EAAE,IAAI;AAAA,MAC1B;AACA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,UAAU,IAAI;AAC5B,UAAI,UAAU,KAAK,SAAS,EAAE;AAC9B,UAAI,CAAC,QAAS,OAAM,IAAI,MAAM,4BAA4B,OAAO,IAAI,wBAAwB,CAAC;AAC9F,UAAI,KAAK,cAAc,EAAE,GAAG;AAC1B,YAAI;AACJ,YAAI,KAAK,KAAK,cAAc,EAAE;AAC9B,SAAC,mBAAmB,GAAG,aAAa,oBAAoB,OAAO,QAAQ,qBAAqB,UAAU,iBAAiB,YAAW;AAClI,eAAO,KAAK,cAAc,EAAE;AAAA,MAC9B,WAAW,KAAK,eAAe,EAAE,GAAG;AAClC,eAAO,KAAK,eAAe,EAAE;AAAA,MAC/B;AAGA,cAAQ,OAAM;AACd,aAAO,KAAK,SAAS,EAAE;AACvB,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,YAAY;AAC1B,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,UAAU,QAAQ;AAChC,WAAK,qBAAoB;AACzB,WAAK,SAAS;AACd,WAAK,mBAAkB;AAAA,IACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,eAAe;AAC7B,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,WAAW;AACzB,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,SAAS,OAAO;AAC9B,UAAI,UAAU,KAAK,MAAO;AAG1B,UAAI,KAAK,eAAe,CAAC,MAAM,QAAQ,KAAK,WAAW,EAAG,MAAK,cAAc;AAC7E,UAAI,KAAK,eAAe,CAAC,MAAM,QAAQ,KAAK,WAAW,EAAG,MAAK,cAAc;AAG7E,WAAK,oBAAmB;AACxB,UAAI,KAAK,0BAA0B,MAAM;AACvC,6BAAqB,KAAK,qBAAqB;AAC/C,aAAK,wBAAwB;AAAA,MAC/B;AAGA,WAAK,QAAQ;AAGb,WAAK,kBAAiB;AAGtB,WAAK,QAAO;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,iBAAiB;AAC/B,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,iBAAiB;AAC/B,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,gBAAgB;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,SAAS,qBAAqB;AACnC,UAAI,SAAS,KAAK,cAAc,KAAK;AACrC,aAAO;AAAA,QACL,OAAO,OAAO,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,KAAK;AAAA,QACpC,QAAQ,OAAO,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,KAAK;AAAA,MAC7C;AAAA,IACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,mBAAmB,KAAK;AACtC,UAAI,OAAO,KAAK,cAAc,GAAG;AACjC,aAAO,OAAO,OAAO,OAAO,CAAA,GAAI,IAAI,IAAI;AAAA,IAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,mBAAmB,KAAK;AACtC,UAAI,OAAO,KAAK,cAAc,GAAG;AACjC,aAAO,OAAO,OAAO,OAAO,CAAA,GAAI,IAAI,IAAI;AAAA,IAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,yBAAyB;AACvC,aAAO,IAAI,IAAI,KAAK,mBAAmB;AAAA,IACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,yBAAyB;AACvC,aAAO,IAAI,IAAI,KAAK,mBAAmB;AAAA,IACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,cAAc;AAC5B,aAAOA,iBAAe,CAAA,GAAI,KAAK,QAAQ;AAAA,IACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,WAAW,KAAK;AAC9B,aAAO,KAAK,SAAS,GAAG;AAAA,IAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,WAAW,KAAK,OAAO;AACrC,UAAI,YAAYA,iBAAe,IAAI,KAAK,QAAQ;AAChD,WAAK,SAAS,GAAG,IAAI;AACrB,uBAAiB,KAAK,QAAQ;AAC9B,WAAK,qBAAqB,SAAS;AACnC,WAAK,gBAAe;AACpB,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,cAAc,KAAK,SAAS;AAC1C,WAAK,WAAW,KAAK,QAAQ,KAAK,SAAS,GAAG,CAAC,CAAC;AAChD,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,YAAY,UAAU;AACpC,UAAI,YAAYA,iBAAe,IAAI,KAAK,QAAQ;AAChD,WAAK,WAAWA,iBAAeA,iBAAe,CAAA,GAAI,KAAK,QAAQ,GAAG,QAAQ;AAC1E,uBAAiB,KAAK,QAAQ;AAC9B,WAAK,qBAAqB,SAAS;AACnC,WAAK,gBAAe;AACpB,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,OAAO,OAAO;AAC5B,UAAI,gBAAgB,KAAK,OACvB,iBAAiB,KAAK;AACxB,WAAK,QAAQ,KAAK,UAAU;AAC5B,WAAK,SAAS,KAAK,UAAU;AAC7B,WAAK,aAAa,cAAa;AAC/B,UAAI,KAAK,UAAU,GAAG;AACpB,YAAI,KAAK,SAAS,sBAAuB,MAAK,QAAQ;AAAA,YAAO,OAAM,IAAI,MAAM,iHAAiH;AAAA,MAChM;AACA,UAAI,KAAK,WAAW,GAAG;AACrB,YAAI,KAAK,SAAS,sBAAuB,MAAK,SAAS;AAAA,YAAO,OAAM,IAAI,MAAM,kHAAkH;AAAA,MAClM;AAGA,UAAI,CAAC,SAAS,kBAAkB,KAAK,SAAS,mBAAmB,KAAK,OAAQ,QAAO;AAGrF,eAAS,MAAM,KAAK,UAAU;AAC5B,YAAI,UAAU,KAAK,SAAS,EAAE;AAC9B,gBAAQ,MAAM,QAAQ,KAAK,QAAQ;AACnC,gBAAQ,MAAM,SAAS,KAAK,SAAS;AAAA,MACvC;AAGA,eAAS,OAAO,KAAK,gBAAgB;AACnC,aAAK,SAAS,GAAG,EAAE,aAAa,SAAS,KAAK,QAAQ,KAAK,aAAa,IAAI;AAC5E,aAAK,SAAS,GAAG,EAAE,aAAa,UAAU,KAAK,SAAS,KAAK,aAAa,IAAI;AAC9E,YAAI,KAAK,eAAe,EAAG,MAAK,eAAe,GAAG,EAAE,MAAM,KAAK,YAAY,KAAK,UAAU;AAAA,MAC5F;AAGA,eAAS,QAAQ,KAAK,eAAe;AACnC,aAAK,SAAS,IAAI,EAAE,aAAa,SAAS,KAAK,QAAQ,KAAK,aAAa,IAAI;AAC7E,aAAK,SAAS,IAAI,EAAE,aAAa,UAAU,KAAK,SAAS,KAAK,aAAa,IAAI;AAC/E,YAAI,KAAK,KAAK,cAAc,IAAI;AAChC,WAAG,SAAS,GAAG,GAAG,KAAK,QAAQ,KAAK,YAAY,KAAK,SAAS,KAAK,UAAU;AAG7E,YAAI,KAAK,cAAc,IAAI,IAAI,GAAG;AAChC,cAAI,iBAAiB,KAAK,SAAS,IAAI;AACvC,cAAI,eAAgB,IAAG,cAAc,cAAc;AAAA,QACrD;AAAA,MACF;AACA,WAAK,KAAK,QAAQ;AAClB,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,QAAQ;AACtB,WAAK,KAAK,aAAa;AACvB,WAAK,cAAc,MAAM,gBAAgB,sBAAsB,aAAa,IAAI;AAChF,WAAK,cAAc,MAAM,MAAM,sBAAsB,gBAAgB;AACrE,WAAK,cAAc,MAAM,gBAAgB,sBAAsB,aAAa,IAAI;AAChF,WAAK,cAAc,MAAM,MAAM,sBAAsB,gBAAgB;AACrE,WAAK,cAAc,WAAW,MAAM,sBAAsB,gBAAgB;AAC1E,WAAK,eAAe,OAAO,UAAU,GAAG,GAAG,KAAK,OAAO,KAAK,MAAM;AAClE,WAAK,eAAe,OAAO,UAAU,GAAG,GAAG,KAAK,OAAO,KAAK,MAAM;AAClE,WAAK,eAAe,WAAW,UAAU,GAAG,GAAG,KAAK,OAAO,KAAK,MAAM;AACtE,WAAK,KAAK,YAAY;AACtB,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,QAAQ,MAAM;AAC5B,UAAI,UAAU;AACd,UAAI,kBAAkB,SAAS,QAAQ,SAAS,SAAS,SAAS,KAAK,oBAAoB,SAAY,SAAS,QAAQ,SAAS,SAAS,SAAS,KAAK,iBAAiB;AACzK,UAAI,YAAY,SAAS,QAAQ,SAAS,SAAS,SAAS,KAAK,cAAc,SAAY,KAAK,WAAW;AAC3G,UAAI,cAAc,CAAC,QAAQ,CAAC,KAAK;AACjC,UAAI,aAAa;AAEf,aAAK,iBAAgB;AACrB,aAAK,iBAAgB;AACrB,aAAK,MAAM,YAAY,SAAUkD,OAAM;AACrC,iBAAO,QAAQ,QAAQA,KAAI;AAAA,QAC7B,CAAC;AACD,aAAK,MAAM,YAAY,SAAUC,OAAM;AACrC,iBAAO,QAAQ,QAAQA,KAAI;AAAA,QAC7B,CAAC;AAAA,MACH,OAAO;AACL,YAAI,oBAAoB;AACxB,YAAI,UAAU,qBAAqB,KAAK,kBAAkB,QAAQ,uBAAuB,SAAS,SAAS,mBAAmB,UAAU,CAAA;AACxI,iBAAS,IAAI,GAAG,KAAK,UAAU,QAAQ,UAAU,SAAS,SAAS,MAAM,WAAW,GAAG,IAAI,GAAG,KAAK;AACjG,cAAI,OAAO,MAAM,CAAC;AAElB,eAAK,WAAW,IAAI;AAGpB,cAAI,gBAAgB;AAClB,gBAAI,eAAe,KAAK,iBAAiB,IAAI;AAC7C,gBAAI,iBAAiB,OAAW,OAAM,IAAI,MAAM,gBAAiB,OAAO,MAAM,oBAAqB,CAAC;AACpG,iBAAK,iBAAiB,MAAM,KAAK,YAAY,IAAI,GAAG,YAAY;AAAA,UAClE;AAAA,QACF;AACA,YAAI,SAAS,SAAS,QAAQ,SAAS,WAAW,sBAAsB,KAAK,kBAAkB,QAAQ,wBAAwB,SAAS,SAAS,oBAAoB,UAAU,CAAA;AAC/K,iBAAS,MAAM,GAAG,MAAM,MAAM,QAAQ,MAAM,KAAK,OAAO;AACtD,cAAI,OAAO,MAAM,GAAG;AAEpB,eAAK,WAAW,IAAI;AAGpB,cAAI,gBAAgB;AAClB,gBAAI,gBAAgB,KAAK,iBAAiB,IAAI;AAC9C,gBAAI,kBAAkB,OAAW,OAAM,IAAI,MAAM,gBAAiB,OAAO,MAAM,oBAAqB,CAAC;AACrG,iBAAK,iBAAiB,MAAM,KAAK,YAAY,IAAI,GAAG,aAAa;AAAA,UACnE;AAAA,QACF;AAAA,MACF;AAGA,UAAI,eAAe,CAAC,eAAgB,MAAK,gBAAgB;AACzD,UAAI,SAAU,MAAK,eAAc;AAAA,UAAQ,MAAK,OAAM;AACpD,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,iBAAiB;AAC/B,UAAI,UAAU;AACd,UAAI,CAAC,KAAK,aAAa;AACrB,aAAK,cAAc,sBAAsB,WAAY;AACnD,kBAAQ,OAAM;AAAA,QAChB,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,gBAAgB,MAAM;AACpC,aAAO,KAAK,QAAQnD,iBAAeA,iBAAe,IAAI,IAAI,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,SAAS,uBAAuB,gBAAgB,UAAU;AAC/D,UAAI,wBAAwB,KAAK,OAAO,SAAQ,GAC9C,QAAQ,sBAAsB,OAC9B,QAAQ,sBAAsB,OAC9B,IAAI,sBAAsB,GAC1B,IAAI,sBAAsB;AAC5B,UAAI,kBAAkB,KAAK,UACzB,iBAAiB,gBAAgB,gBACjC,iBAAiB,gBAAgB;AACnC,UAAI,OAAO,mBAAmB,SAAU,YAAW,KAAK,IAAI,UAAU,cAAc;AACpF,UAAI,OAAO,mBAAmB,SAAU,YAAW,KAAK,IAAI,UAAU,cAAc;AACpF,UAAI,YAAY,WAAW;AAC3B,UAAI,SAAS;AAAA,QACX,GAAG,KAAK,QAAQ;AAAA,QAChB,GAAG,KAAK,SAAS;AAAA,MACzB;AACM,UAAI,qBAAqB,KAAK,sBAAsB,cAAc;AAClE,UAAI,sBAAsB,KAAK,sBAAsB,MAAM;AAC3D,aAAO;AAAA,QACL;AAAA,QACA,IAAI,mBAAmB,IAAI,oBAAoB,MAAM,IAAI,aAAa;AAAA,QACtE,IAAI,mBAAmB,IAAI,oBAAoB,MAAM,IAAI,aAAa;AAAA,QACtE,OAAO;AAAA,MACf;AAAA,IACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,gBAAgB;AAC9B,UAAI,KAAK,KAAK,sBAAsB;AAAA,QAChC,GAAG;AAAA,QACH,GAAG;AAAA,MACb,CAAS,GACD,KAAK,KAAK,sBAAsB;AAAA,QAC9B,GAAG,KAAK;AAAA,QACR,GAAG;AAAA,MACb,CAAS,GACDuD,KAAI,KAAK,sBAAsB;AAAA,QAC7B,GAAG;AAAA,QACH,GAAG,KAAK;AAAA,MAClB,CAAS;AACH,aAAO;AAAA,QACL,IAAI,GAAG;AAAA,QACP,IAAI,GAAG;AAAA,QACP,IAAI,GAAG;AAAA,QACP,IAAI,GAAG;AAAA,QACP,QAAQ,GAAG,IAAIA,GAAE;AAAA,MACzB;AAAA,IACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,sBAAsB,aAAa;AACjD,UAAI,WAAW,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AACnF,UAAI,kBAAkB,CAAC,CAAC,SAAS,eAAe,CAAC,CAAC,SAAS,sBAAsB,CAAC,CAAC,SAAS;AAC5F,UAAI,SAAS,SAAS,SAAS,SAAS,SAAS,kBAAkB,iBAAiB,SAAS,eAAe,KAAK,OAAO,SAAQ,GAAI,SAAS,sBAAsB,KAAK,cAAa,GAAI,SAAS,mBAAmB,KAAK,mBAAkB,GAAI,SAAS,WAAW,KAAK,gBAAe,CAAE,IAAI,KAAK;AACnS,UAAI,cAAc,aAAa,QAAQ,WAAW;AAClD,aAAO;AAAA,QACL,IAAI,IAAI,YAAY,KAAK,KAAK,QAAQ;AAAA,QACtC,IAAI,IAAI,YAAY,KAAK,KAAK,SAAS;AAAA,MAC/C;AAAA,IACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,sBAAsB,aAAa;AACjD,UAAI,WAAW,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AACnF,UAAI,kBAAkB,CAAC,CAAC,SAAS,eAAe,CAAC,CAAC,SAAS,sBAAsB,CAAC,SAAS;AAC3F,UAAI,YAAY,SAAS,SAAS,SAAS,SAAS,kBAAkB,iBAAiB,SAAS,eAAe,KAAK,OAAO,SAAQ,GAAI,SAAS,sBAAsB,KAAK,cAAa,GAAI,SAAS,mBAAmB,KAAK,mBAAkB,GAAI,SAAS,WAAW,KAAK,gBAAe,GAAI,IAAI,IAAI,KAAK;AAC5S,UAAI,MAAM,aAAa,WAAW;AAAA,QAChC,GAAG,YAAY,IAAI,KAAK,QAAQ,IAAI;AAAA,QACpC,GAAG,IAAI,YAAY,IAAI,KAAK,SAAS;AAAA,MAC7C,CAAO;AACD,UAAI,MAAM,IAAI,CAAC,EAAG,KAAI,IAAI;AAC1B,UAAI,MAAM,IAAI,CAAC,EAAG,KAAI,IAAI;AAC1B,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,gBAAgB,eAAe;AAC7C,UAAI,WAAW,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AACnF,aAAO,KAAK,sBAAsB,QAAQ,KAAK,sBAAsB,eAAe,QAAQ,CAAC;AAAA,IAC/F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,gBAAgB,YAAY;AAC1C,UAAI,WAAW,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,CAAA;AACnF,aAAO,KAAK,sBAAsB,KAAK,sBAAsB,UAAU,GAAG,QAAQ;AAAA,IACpF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,0BAA0B;AACxC,UAAI,UAAU;AAAA,QACZ,GAAG;AAAA,QACH,GAAG;AAAA,MACX;AACM,UAAI,UAAU;AAAA,QACZ,GAAG;AAAA,QACH,GAAG;AAAA,MACX;AACM,UAAI,SAAS,KAAK,KAAK,KAAK,IAAI,QAAQ,IAAI,QAAQ,GAAG,CAAC,IAAI,KAAK,IAAI,QAAQ,IAAI,QAAQ,GAAG,CAAC,CAAC;AAC9F,UAAI,aAAa,KAAK,gBAAgB,OAAO;AAC7C,UAAI,aAAa,KAAK,gBAAgB,OAAO;AAC7C,UAAI,YAAY,KAAK,KAAK,KAAK,IAAI,WAAW,IAAI,WAAW,GAAG,CAAC,IAAI,KAAK,IAAI,WAAW,IAAI,WAAW,GAAG,CAAC,CAAC;AAC7G,aAAO,YAAY;AAAA,IACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,UAAU;AACxB,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,gBAAgB;AAC9B,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,cAAc,YAAY;AACxC,WAAK,aAAa;AAClB,WAAK,eAAc;AACnB,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,OAAO;AAErB,WAAK,KAAK,MAAM;AAGhB,WAAK,mBAAkB;AAGvB,WAAK,qBAAoB;AAGzB,aAAO,oBAAoB,UAAU,KAAK,gBAAgB,YAAY;AACtE,WAAK,YAAY,KAAI;AACrB,WAAK,YAAY,KAAI;AAGrB,WAAK,oBAAmB;AAGxB,WAAK,aAAY;AACjB,WAAK,WAAU;AACf,WAAK,gBAAgB,CAAA;AACrB,WAAK,gBAAgB,CAAA;AACrB,WAAK,iBAAiB,MAAK;AAG3B,UAAI,KAAK,aAAa;AACpB,6BAAqB,KAAK,WAAW;AACrC,aAAK,cAAc;AAAA,MACrB;AACA,UAAI,KAAK,6BAA6B;AACpC,6BAAqB,KAAK,2BAA2B;AACrD,aAAK,8BAA8B;AAAA,MACrC;AAGA,UAAI,YAAY,KAAK;AACrB,aAAO,UAAU,WAAY,WAAU,YAAY,UAAU,UAAU;AAGvE,eAAS,QAAQ,KAAK,cAAc;AAClC,aAAK,aAAa,IAAI,EAAE,KAAI;AAAA,MAC9B;AACA,eAAS,UAAU,KAAK,mBAAmB;AACzC,aAAK,kBAAkB,MAAM,EAAE,KAAI;AAAA,MACrC;AACA,eAAS,UAAU,KAAK,cAAc;AACpC,aAAK,aAAa,MAAM,EAAE,KAAI;AAAA,MAChC;AACA,WAAK,eAAe,CAAA;AACpB,WAAK,oBAAoB,CAAA;AACzB,WAAK,eAAe,CAAA;AAGpB,eAAS,MAAM,KAAK,UAAU;AAC5B,aAAK,UAAU,EAAE;AAAA,MACnB;AAGA,WAAK,iBAAiB,CAAA;AACtB,WAAK,gBAAgB,CAAA;AACrB,WAAK,WAAW,CAAA;AAAA,IAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,YAAY;AAC1B,UAAI,OAAO,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI;AAC/E,UAAI,cAAc,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM,SAAY,UAAU,CAAC,IAAI,KAAK,OAAO;AAClG,aAAO,OAAO,KAAK,SAAS,wBAAwB,WAAW,KAAK,KAAK,WAAW,oBAAoB,MAAM,cAAc,cAAc,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,SAAS,cAAc;AAC5B,UAAI,MAAM,CAAA;AACV,eAAS,SAAS,KAAK,SAAU,KAAI,KAAK,SAAS,KAAK,aAAa,kBAAmB,KAAI,KAAK,IAAI,KAAK,SAAS,KAAK;AACxH,aAAO;AAAA,IACT;AAAA,EACJ,CAAG,CAAC;AACJ,GAAE,iBAAiB;ACxkHsO,MAAM,IAAEvE,EAAAA,cAAE,IAAI,GAAE,IAAE,EAAE;AAAS,SAAS,IAAG;AAAC,QAAMH,KAAEc,EAAAA,WAAE,CAAC;AAAE,MAAG,QAAMd,GAAE,OAAM,IAAI,MAAM,6FAA6F;AAAE,SAAOA;AAAC;AAAC,SAAS,IAAG;AAAC,SAAO,IAAI;AAAK;AAA6G,SAAS,EAAEA,IAAE;AAAC,SAAO,IAAI,IAAI,OAAO,KAAKA,EAAC,CAAC;AAAC;AAAS,EAAE,EAAC,WAAU,MAAG,gBAAe,MAAG,UAAS,MAAG,WAAU,MAAG,WAAU,MAAG,iBAAgB,MAAG,WAAU,MAAG,WAAU,MAAG,gBAAe,MAAG,UAAS,MAAG,WAAU,MAAG,WAAU,MAAG,iBAAgB,MAAG,WAAU,MAAG,YAAW,MAAG,iBAAgB,MAAG,WAAU,MAAG,kBAAiB,MAAG,YAAW,MAAG,cAAa,MAAG,aAAY,MAAG,MAAK,MAAG,SAAQ,MAAG,QAAO,MAAG,QAAO,MAAG,YAAW,MAAG,YAAW,MAAG,QAAO,MAAG,YAAW,MAAG,cAAa,MAAG,aAAY,MAAG,eAAc,MAAG,UAAS,KAAE,CAAC;AAAI,EAAE,EAAC,OAAM,MAAG,YAAW,MAAG,aAAY,MAAG,SAAQ,MAAG,WAAU,MAAG,WAAU,MAAG,eAAc,MAAG,YAAW,MAAG,YAAW,MAAG,OAAM,KAAE,CAAC;AAAI,EAAE,EAAC,SAAQ,MAAG,WAAU,MAAG,WAAU,MAAG,eAAc,MAAG,KAAI,MAAG,WAAU,KAAE,CAAC;AAAI,EAAE,EAAC,SAAQ,KAAE,CAAC;AAAilB,SAAS,EAAEA,IAAED,IAAE;AAAC,MAAGC,OAAID,GAAE,QAAM;AAAG,MAAG,YAAU,OAAOC,MAAG,QAAMA,MAAG,YAAU,OAAOD,MAAG,QAAMA,IAAE;AAAC,QAAG,OAAO,KAAKC,EAAC,EAAE,UAAQ,OAAO,KAAKD,EAAC,EAAE,OAAO,QAAM;AAAG,eAAUI,MAAKH,IAAE;AAAC,UAAG,CAAC,OAAO,OAAOD,IAAEI,EAAC,EAAE,QAAM;AAAG,UAAG,CAAC,EAAEH,GAAEG,EAAC,GAAEJ,GAAEI,EAAC,CAAC,EAAE;IAAQ;AAAC;EAAQ;AAAC;AAAQ;AAAynC,MAAM,IAAEwE,cAAG,CAAC,EAAC,OAAM3E,IAAE,IAAGG,IAAE,WAAU,GAAE,OAAM,GAAE,UAAS,IAAE,CAAA,GAAG,UAASsB,GAAC,GAAEiD,OAAI;AAAC,QAAME,KAAEC,EAAAA,OAAE,IAAI,GAAE,IAAEA,EAAAA,OAAE,IAAI,GAAEC,KAAE,EAAC,WAAU,eAAe,KAAG,EAAE,IAAG,IAAG3E,IAAE,OAAM,EAAC,GAAE,CAAC,GAAE,CAAC,IAAEmD,WAAE,IAAI,GAAE,CAAC,GAAE,CAAC,IAAEA,EAAAA,SAAE,CAAC;AAAEE,IAAAA,WAAG,MAAI;AAAC,OAAG,CAAAxD,OAAG,EAAEA,IAAE,CAAC,IAAEA,KAAE,EAAC;AAAA,EAAE,IAAG,CAAC,CAAC,CAAC,GAAEwD,EAAAA,WAAG,MAAI;AAAC,QAAIzD,KAAE;AAAK,QAAG,SAAO,EAAE,SAAQ;AAAC,UAAII,KAAE,IAAI4E,cAAAA;AAAE,MAAA/E,OAAIG,KAAE,cAAY,OAAOH,KAAE,IAAIA,OAAEA,KAAGD,KAAE,IAAIiF,QAAE7E,IAAE,EAAE,SAAQ,CAAC,GAAE,GAAG,CAAAH,OAAG;AAAC,YAAIG,KAAE;AAAK,eAAOH,OAAIG,KAAEH,GAAE,UAAS,EAAG,SAAQ,IAAIG,MAAGJ,GAAE,UAAS,EAAG,SAASI,EAAC,GAAEJ;AAAA,MAAC,EAAC;AAAA,IAAE;AAAC,WAAM,MAAI;AAAC,MAAAA,MAAGA,GAAE;IAAM;AAAA,EAAC,IAAG,CAAC,GAAEC,IAAE,CAAC,CAAC,GAAEiF,EAAAA,oBAAEP,KAAG,MAAI,IAAG,CAAC,CAAC,CAAC;AAAE,QAAM,IAAEQ,EAAAA,SAAG,MAAI,KAAGN,GAAE,UAAQ,EAAC,OAAM,GAAE,WAAUA,GAAE,QAAO,IAAE,OAAM,CAAC,GAAEA,EAAC,CAAC,GAAE,IAAE,SAAO,IAAE,EAAE,cAAc,GAAE,EAAC,OAAM,EAAC,GAAEnD,EAAC,IAAE;AAAK,SAAO,EAAE,cAAc,OAAM,OAAO,OAAO,IAAGqD,IAAE,EAAC,KAAIF,GAAC,CAAC,GAAE,EAAE,cAAc,OAAM,EAAC,WAAU,mBAAkB,KAAI,EAAC,CAAC,GAAE,CAAC;AAAC,EAAC;ACkF96H,IAAI;AAAA;AAAA,EAA0B;AAAA;AAC9B,IAAI,yBAAyB;AAE7B,IAAI,0BAA0B,uBAC5B,kBAAkB,wBAAwB,eAC1C,UAAU,wBAAwB;AACpC,IAAI,aAAa,CAAC,YAAY,eAAe,eAAe,qBAAqB,gBAAgB,aAAa,sBAAsB,0BAA0B;AAC9J,IAAI,8CAA8C;AAAA,EAChD,wBAAwB,wCAAwC;AAClE;AACA,SAAS,+BAA+B,cAAc;AACpD,MAAI,UAAUzD,iBAAeA,iBAAe,CAAA,GAAI,2CAA2C,GAAmB,EAAE;AAChH,SAAoB,0BAAU,cAAc;AAC1C,aAAS,2BAA2B;AAClCjB,wBAAgB,MAAM,wBAAwB;AAC9C,aAAOQ,aAAW,MAAM,0BAA0B,SAAS;AAAA,IAC7D;AACAE,gBAAU,0BAA0B,YAAY;AAChD,WAAOP,eAAa,0BAA0B,CAAC;AAAA,MAC7C,KAAK;AAAA,MACL,OAAO,SAAS,gBAAgB;AAC9B,eAAO;AAAA,UACL,UAAU;AAAA,UACV,sBAAsB;AAAA,UACtB;AAAA,UACA,QAAQ,sBAAsB;AAAA,UAC9B,UAAU;AAAA,UACV,YAAY,CAAC;AAAA,YACX,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,UAClB,GAAa;AAAA,YACD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,UAClB,GAAa;AAAA,YACD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,UAClB,GAAa;AAAA,YACD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,YACN,YAAY;AAAA,UACxB,GAAa;AAAA,YACD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,YACN,YAAY;AAAA,UACxB,GAAa;AAAA,YACD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,UAClB,GAAa;AAAA,YACD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,UAClB,CAAW;AAAA,UACD,qBAAqB;AAAA;AAAA;AAAA,YAGrB;AAAA,cACE,MAAM;AAAA,cACN,MAAM;AAAA,cACN,MAAM;AAAA,YAClB;AAAA,YAAa;AAAA,cACD,MAAM;AAAA,cACN,MAAM;AAAA,cACN,MAAM;AAAA,YAClB;AAAA,YAAa;AAAA,cACD,MAAM;AAAA,cACN,MAAM;AAAA,cACN,MAAM;AAAA,YAClB;AAAA,YAAa;AAAA,cACD,MAAM;AAAA,cACN,MAAM;AAAA,cACN,MAAM;AAAA,YAClB;AAAA,UAAW;AAAA,UACD,eAAe,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;AAAA,QACjH;AAAA,MACM;AAAA,IACN,GAAO;AAAA,MACD,KAAK;AAAA,MACL,OAAO,SAAS,mBAAmB,WAAW,YAAY,YAAY,YAAY,MAAM;AACtF,YAAI,YAAY,KAAK,QAAQ;AAC7B,YAAI,KAAK,WAAW;AACpB,YAAI,KAAK,WAAW;AACpB,YAAI,KAAK,WAAW;AACpB,YAAI,KAAK,WAAW;AACpB,YAAI,QAAQ,WAAW,KAAK,KAAK;AAGjC,YAAI,KAAK,KAAK;AACd,YAAI,KAAK,KAAK;AACd,YAAI,eAAe,WAAW,QAAQ;AACtC,YAAI,eAAe,WAAW,QAAQ;AACtC,YAAI,MAAM,KAAK,KAAK,KAAK;AACzB,YAAI,KAAK;AACT,YAAI,KAAK;AACT,YAAI,KAAK;AACP,gBAAM,IAAI,KAAK,KAAK,GAAG;AACvB,eAAK,CAAC,KAAK,MAAM;AACjB,eAAK,KAAK,MAAM;AAAA,QAClB;AACA,YAAI,QAAQ,KAAK;AACjB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AAAA,MACxB;AAAA,IACN,GAAO;AAAA,MACD,KAAK;AAAA,MACL,OAAO,SAAS,YAAY,QAAQ,MAAM;AACxC,YAAI,KAAK,KAAK,IACZ,mBAAmB,KAAK;AAC1B,YAAI,WAAW,iBAAiB,UAC9B,cAAc,iBAAiB,aAC/B,YAAY,iBAAiB,WAC7B,eAAe,iBAAiB,cAChC,oBAAoB,iBAAiB,mBACrC,cAAc,iBAAiB,aAC/B,qBAAqB,iBAAiB,oBACtC,2BAA2B,iBAAiB;AAC9C,WAAG,iBAAiB,UAAU,OAAO,OAAO,MAAM;AAClD,WAAG,UAAU,aAAa,OAAO,SAAS;AAC1C,WAAG,UAAU,aAAa,OAAO,SAAS;AAC1C,WAAG,UAAU,mBAAmB,OAAO,eAAe;AACtD,WAAG,UAAU,cAAc,OAAO,UAAU;AAC5C,WAAG,UAAU,WAAW,OAAO,mBAAmB;AAClD,WAAG,UAAU,oBAAoB,OAAO,gBAAgB;AACxD,WAAG,UAAU,0BAA0B,QAAQ,sBAAsB;AAAA,MACvE;AAAA,IACN,CAAK,CAAC;AAAA,EACJ,GAAE,WAAW;AACf;AAC+B,+BAA8B;AAG7D,SAAS,6BAA6B,cAAc;AAClD,SAAO,0BAA0B,CAAC,+BAA2C,GAAG,2BAA2B,YAAY,GAAG,2BAA2Bc,iBAAeA,iBAAe,CAAA,GAAI,YAAY,GAAG,CAAA,GAAI;AAAA,IACxM,WAAW;AAAA,EACf,CAAG,CAAC,CAAC,CAAC;AACN;AAC6B,6BAA4B;AAIzD,IAAI;AAAA;AAAA,EAA0B;AAAA;AAC9B,IAAI,2BAA2B;AAG/B,IAAI;AAAA;AAAA,EAA0B;AAAA;AAC9B,IAAI,yBAAyB;AAE7B,IAAI,0BAA0B,uBAC5B,kBAAkB,wBAAwB,eAC1C,UAAU,wBAAwB;AACpC,IAAI,aAAa,CAAC,UAAU;AAC5B,IAAI,kBAA+B,0BAAU,cAAc;AACzD,WAASgE,mBAAkB;AACzBjF,sBAAgB,MAAMiF,gBAAe;AACrC,WAAOzE,aAAW,MAAMyE,kBAAiB,SAAS;AAAA,EACpD;AACAvE,cAAUuE,kBAAiB,YAAY;AACvC,SAAO9E,eAAa8E,kBAAiB,CAAC;AAAA,IACpC,KAAK;AAAA,IACL,OAAO,SAAS,gBAAgB;AAC9B,aAAO;AAAA,QACL,UAAU;AAAA,QACV,sBAAsB;AAAA,QACtB,wBAAwB;AAAA,QACxB,QAAQ,sBAAsB;AAAA,QAC9B,UAAU;AAAA,QACV,YAAY,CAAC;AAAA,UACX,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,QAChB,GAAW;AAAA,UACD,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,YAAY;AAAA,QACtB,GAAW;AAAA,UACD,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,YAAY;AAAA,QACtB,CAAS;AAAA,MACT;AAAA,IACI;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,mBAAmB,WAAW,YAAY,YAAY,YAAY,MAAM;AACtF,UAAI,QAAQ,KAAK;AACjB,UAAI,KAAK,WAAW;AACpB,UAAI,KAAK,WAAW;AACpB,UAAI,KAAK,WAAW;AACpB,UAAI,KAAK,WAAW;AACpB,UAAI,QAAQ,WAAW,KAAK,KAAK;AAGjC,YAAM,YAAY,IAAI;AACtB,YAAM,YAAY,IAAI;AACtB,YAAM,YAAY,IAAI;AACtB,YAAM,YAAY,IAAI;AAGtB,YAAM,YAAY,IAAI;AACtB,YAAM,YAAY,IAAI;AACtB,YAAM,YAAY,IAAI;AACtB,YAAM,YAAY,IAAI;AAAA,IACxB;AAAA,EACJ,GAAK;AAAA,IACD,KAAK;AAAA,IACL,OAAO,SAAS,YAAY,QAAQ,MAAM;AACxC,UAAI,KAAK,KAAK,IACZ,mBAAmB,KAAK;AAC1B,UAAI,WAAW,iBAAiB;AAChC,SAAG,iBAAiB,UAAU,OAAO,OAAO,MAAM;AAAA,IACpD;AAAA,EACJ,CAAG,CAAC;AACJ,GAAE,WAAW;AClTb,SAAS,aAAapF,IAAG,GAAG;AAC1B,MAAI,YAAY,OAAOA,MAAK,CAACA,GAAG,QAAOA;AACvC,MAAIC,KAAID,GAAE,OAAO,WAAW;AAC5B,MAAI,WAAWC,IAAG;AAChB,QAAI,IAAIA,GAAE,KAAKD,IAAG,CAAc;AAChC,QAAI,YAAY,OAAO,EAAG,QAAO;AACjC,UAAM,IAAI,UAAU,8CAA8C;AAAA,EACpE;AACA,UAAQ,aAAa,IAAI,SAAS,QAAQA,EAAC;AAC7C;AAEA,SAAS,eAAeA,IAAG;AACzB,MAAI,IAAI,aAAaA,IAAG,QAAQ;AAChC,SAAO,YAAY,OAAO,IAAI,IAAI,IAAI;AACxC;AAEA,SAAS,gBAAgBC,IAAG,GAAGD,IAAG;AAChC,UAAQ,IAAI,eAAe,CAAC,MAAMC,KAAI,OAAO,eAAeA,IAAG,GAAG;AAAA,IAChE,OAAOD;AAAA,IACP,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,UAAU;AAAA,EACd,CAAG,IAAIC,GAAE,CAAC,IAAID,IAAGC;AACjB;AAEA,SAAS,QAAQA,IAAG,GAAG;AACrB,MAAID,KAAI,OAAO,KAAKC,EAAC;AACrB,MAAI,OAAO,uBAAuB;AAChC,QAAI,IAAI,OAAO,sBAAsBA,EAAC;AACtC,UAAM,IAAI,EAAE,OAAO,SAAUc,IAAG;AAC9B,aAAO,OAAO,yBAAyBd,IAAGc,EAAC,EAAE;AAAA,IAC/C,CAAC,IAAIf,GAAE,KAAK,MAAMA,IAAG,CAAC;AAAA,EACxB;AACA,SAAOA;AACT;AACA,SAAS,eAAeC,IAAG;AACzB,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,QAAID,KAAI,QAAQ,UAAU,CAAC,IAAI,UAAU,CAAC,IAAI,CAAA;AAC9C,QAAI,IAAI,QAAQ,OAAOA,EAAC,GAAG,IAAE,EAAE,QAAQ,SAAUe,IAAG;AAClD,sBAAgBd,IAAGc,IAAGf,GAAEe,EAAC,CAAC;AAAA,IAC5B,CAAC,IAAI,OAAO,4BAA4B,OAAO,iBAAiBd,IAAG,OAAO,0BAA0BD,EAAC,CAAC,IAAI,QAAQ,OAAOA,EAAC,CAAC,EAAE,QAAQ,SAAUe,IAAG;AAChJ,aAAO,eAAed,IAAGc,IAAG,OAAO,yBAAyBf,IAAGe,EAAC,CAAC;AAAA,IACnE,CAAC;AAAA,EACH;AACA,SAAOd;AACT;AAEA,SAAS,gBAAgB,GAAGG,IAAG;AAC7B,MAAI,EAAE,aAAaA,IAAI,OAAM,IAAI,UAAU,mCAAmC;AAChF;AAEA,SAAS,kBAAkBH,IAAG,GAAG;AAC/B,WAASD,KAAI,GAAGA,KAAI,EAAE,QAAQA,MAAK;AACjC,QAAI,IAAI,EAAEA,EAAC;AACX,MAAE,aAAa,EAAE,cAAc,OAAI,EAAE,eAAe,MAAI,WAAW,MAAM,EAAE,WAAW,OAAK,OAAO,eAAeC,IAAG,eAAe,EAAE,GAAG,GAAG,CAAC;AAAA,EAC9I;AACF;AACA,SAAS,aAAaA,IAAG,GAAGD,IAAG;AAC7B,SAAO,KAAK,kBAAkBC,GAAE,WAAW,CAAC,GAAiC,OAAO,eAAeA,IAAG,aAAa;AAAA,IACjH,UAAU;AAAA,EACd,CAAG,GAAGA;AACN;AAEA,SAAS,gBAAgBD,IAAG;AAC1B,SAAO,kBAAkB,OAAO,iBAAiB,OAAO,eAAe,KAAI,IAAK,SAAUA,IAAG;AAC3F,WAAOA,GAAE,aAAa,OAAO,eAAeA,EAAC;AAAA,EAC/C,GAAG,gBAAgBA,EAAC;AACtB;AAEA,SAAS,4BAA4B;AACnC,MAAI;AACF,QAAIA,KAAI,CAAC,QAAQ,UAAU,QAAQ,KAAK,QAAQ,UAAU,SAAS,CAAA,GAAI,WAAY;AAAA,IAAC,CAAC,CAAC;AAAA,EACxF,SAASA,IAAG;AAAA,EAAC;AACb,UAAQ,4BAA4B,WAAY;AAC9C,WAAO,CAAC,CAACA;AAAA,EACX,GAAC;AACH;AAEA,SAAS,uBAAuBC,IAAG;AACjC,MAAI,WAAWA,GAAG,OAAM,IAAI,eAAe,2DAA2D;AACtG,SAAOA;AACT;AAEA,SAAS,2BAA2BD,IAAGC,IAAG;AACxC,MAAIA,OAAM,YAAY,OAAOA,MAAK,cAAc,OAAOA,IAAI,QAAOA;AAClE,MAAI,WAAWA,GAAG,OAAM,IAAI,UAAU,0DAA0D;AAChG,SAAO,uBAAuBD,EAAC;AACjC;AAEA,SAAS,WAAWA,IAAG,GAAGC,IAAG;AAC3B,SAAO,IAAI,gBAAgB,CAAC,GAAG,2BAA2BD,IAAG,0BAAyB,IAAK,QAAQ,UAAU,GAAGC,MAAK,CAAA,GAAI,gBAAgBD,EAAC,EAAE,WAAW,IAAI,EAAE,MAAMA,IAAGC,EAAC,CAAC;AAC1K;AAEA,SAAS,gBAAgBD,IAAGC,IAAG;AAC7B,SAAO,kBAAkB,OAAO,iBAAiB,OAAO,eAAe,KAAI,IAAK,SAAUD,IAAGC,IAAG;AAC9F,WAAOD,GAAE,YAAYC,IAAGD;AAAA,EAC1B,GAAG,gBAAgBA,IAAGC,EAAC;AACzB;AAEA,SAAS,UAAUD,IAAGC,IAAG;AACvB,MAAI,cAAc,OAAOA,MAAK,SAASA,GAAG,OAAM,IAAI,UAAU,oDAAoD;AAClH,EAAAD,GAAE,YAAY,OAAO,OAAOC,MAAKA,GAAE,WAAW;AAAA,IAC5C,aAAa;AAAA,MACX,OAAOD;AAAA,MACP,UAAU;AAAA,MACV,cAAc;AAAA,IACpB;AAAA,EACA,CAAG,GAAG,OAAO,eAAeA,IAAG,aAAa;AAAA,IACxC,UAAU;AAAA,EACd,CAAG,GAAGC,MAAK,gBAAgBD,IAAGC,EAAC;AAC/B;AAEA,SAAS,kBAAkB,GAAG,GAAG;AAC/B,GAAC,QAAQ,KAAK,IAAI,EAAE,YAAY,IAAI,EAAE;AACtC,WAASA,KAAI,GAAGG,KAAI,MAAM,CAAC,GAAGH,KAAI,GAAGA,KAAK,CAAAG,GAAEH,EAAC,IAAI,EAAEA,EAAC;AACpD,SAAOG;AACT;AAEA,SAAS,mBAAmB,GAAG;AAC7B,MAAI,MAAM,QAAQ,CAAC,EAAG,QAAO,kBAAkB,CAAC;AAClD;AAEA,SAAS,iBAAiB,GAAG;AAC3B,MAAI,eAAe,OAAO,UAAU,QAAQ,EAAE,OAAO,QAAQ,KAAK,QAAQ,EAAE,YAAY,EAAG,QAAO,MAAM,KAAK,CAAC;AAChH;AAEA,SAAS,4BAA4B,GAAG,GAAG;AACzC,MAAI,GAAG;AACL,QAAI,YAAY,OAAO,EAAG,QAAO,kBAAkB,GAAG,CAAC;AACvD,QAAIJ,KAAI,CAAA,EAAG,SAAS,KAAK,CAAC,EAAE,MAAM,GAAG,EAAE;AACvC,WAAO,aAAaA,MAAK,EAAE,gBAAgBA,KAAI,EAAE,YAAY,OAAO,UAAUA,MAAK,UAAUA,KAAI,MAAM,KAAK,CAAC,IAAI,gBAAgBA,MAAK,2CAA2C,KAAKA,EAAC,IAAI,kBAAkB,GAAG,CAAC,IAAI;AAAA,EACvN;AACF;AAEA,SAAS,qBAAqB;AAC5B,QAAM,IAAI,UAAU,sIAAsI;AAC5J;AAEA,SAAS,mBAAmB,GAAG;AAC7B,SAAO,mBAAmB,CAAC,KAAK,iBAAiB,CAAC,KAAK,4BAA4B,CAAC,KAAK,mBAAkB;AAC7G;AAEA,SAAS,cAAcA,IAAG,IAAI,IAAI,IAAI;AACpC,MAAI,IAAI,KAAK,IAAI,IAAIA,IAAG,CAAC,IAAI,GAAG,IAAI,KAAK,IAAIA,MAAKA,KAAI,GAAG,IAAI,KAAK,IAAIA,IAAG,CAAC,IAAI,GAAG;AACjF,MAAI,IAAI,KAAK,IAAI,IAAIA,IAAG,CAAC,IAAI,GAAG,IAAI,KAAK,IAAIA,MAAKA,KAAI,GAAG,IAAI,KAAK,IAAIA,IAAG,CAAC,IAAI,GAAG;AACjF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACJ;AACA;AACA,SAAS,eAAe,IAAI,IAAI,IAAI;AAClC,MAAI,QAAQ;AACZ,MAAI,SAAS;AACb,MAAI,YAAY;AAChB,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,QAAI,QAAQ,eAAe,IAAI,KAAK,OAAO,IAAI,IAAI,EAAE;AACrD,cAAU,KAAK,KAAK,KAAK,IAAI,UAAU,IAAI,MAAM,GAAG,CAAC,IAAI,KAAK,IAAI,UAAU,IAAI,MAAM,GAAG,CAAC,CAAC;AAC3F,gBAAY;AAAA,EACd;AACA,SAAO;AACT;AACA,SAAS,0BAA0B,MAAM;AACvC,MAAI,qBAAqB,KAAK,oBAC5B,mBAAmB,KAAK,kBACxB,wBAAwB,KAAK,kBAC7B,mBAAmB,0BAA0B,SAAS,OAAO;AAC/D,SAAO,SAAU,SAAS,UAAU,YAAY,YAAY,UAAU;AACpE,QAAI,OAAO,SAAS,eAClB,YAAY,SAAS,kBAAkB,KAAK,kBAC5C,OAAO,SAAS,eAChB,SAAS,SAAS,iBAClB,QAAQ,SAAS,eAAe,YAAY,SAAS,SAAS,eAAe,SAAS,KAAK,SAAS,eAAe,SAAS,SAAS,SAAS,eAAe;AAC/J,QAAI,QAAQ,SAAS;AACrB,QAAI,CAAC,MAAO;AACZ,YAAQ,YAAY;AACpB,YAAQ,OAAO,GAAG,OAAO,QAAQ,GAAG,EAAE,OAAO,MAAM,KAAK,EAAE,OAAO,IAAI;AAGrE,QAAI,MAAM,CAAC,oBAAoB,WAAW,IAAI,WAAW;AACzD,QAAI,UAAU,MAAM,WAAW,IAAI,WAAW;AAC9C,QAAI,UAAU,MAAM,WAAW,IAAI,WAAW;AAC9C,QAAI,UAAU,MAAM,WAAW,IAAI,WAAW;AAC9C,QAAI,UAAU,MAAM,WAAW,IAAI,WAAW;AAC9C,QAAI,WAAW,UAAU,WAAW;AACpC,QAAI,WAAW,UAAU,WAAW;AACpC,QAAI,QAAQ,UAAU;AACtB,QAAI,QAAQ,UAAU;AACtB,QAAI,OAAO,KAAK,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC,CAAC;AAE5D,QAAI,cAAc,MAAM,IAAI;AAC5B,QAAI,UAAU,UAAU,QAAQ,YAAY;AAC5C,QAAI,UAAU,UAAU,QAAQ,YAAY;AAG5C,QAAI,SAAS,SAAS,OAAO,MAAM;AACnC,QAAI,qBAAqB;AAAA,MACvB,GAAG,UAAU;AAAA,MACb,GAAG,EAAE,UAAU;AAAA,IACrB;AACI,QAAI,2BAA2B,KAAK,KAAK,KAAK,IAAI,mBAAmB,GAAG,CAAC,IAAI,KAAK,IAAI,mBAAmB,GAAG,CAAC,CAAC;AAC9G,QAAI,qBAAqB;AAAA,MACvB,GAAG,UAAU;AAAA,MACb,GAAG,EAAE,UAAU;AAAA,IACrB;AACI,QAAI,2BAA2B,KAAK,KAAK,KAAK,IAAI,mBAAmB,GAAG,CAAC,IAAI,KAAK,IAAI,mBAAmB,GAAG,CAAC,CAAC;AAC9G,eAAW,SAAS,mBAAmB,IAAI;AAC3C,eAAW,SAAS,mBAAmB,IAAI;AAC3C,eAAW,SAAS,mBAAmB,IAAI;AAC3C,eAAW,SAAS,mBAAmB,IAAI;AAE3C,eAAW,SAAS,QAAQ;AAC5B,eAAW,SAAS,QAAQ;AAG5B,QAAI,cAAc;AAAA,MAChB,GAAG;AAAA,MACH,GAAG;AAAA,IACT;AACI,QAAI,cAAc;AAAA,MAChB,GAAG;AAAA,MACH,GAAG;AAAA,IACT;AACI,QAAI,cAAc;AAAA,MAChB,GAAG;AAAA,MACH,GAAG;AAAA,IACT;AACI,QAAI,cAAc,eAAe,aAAa,aAAa,WAAW;AACtE,QAAI,cAAc,WAAW,OAAO,WAAW,KAAM;AAGrD,QAAI,aAAa,QAAQ,YAAY,KAAK,EAAE;AAC5C,QAAI,sBAAsB,cAAc,WAAW,OAAO,WAAW;AACrE,QAAI,aAAa,qBAAqB;AACpC,UAAI,WAAW;AACf,cAAQ,QAAQ;AAChB,mBAAa,QAAQ,YAAY,KAAK,EAAE;AACxC,aAAO,aAAa,uBAAuB,MAAM,SAAS,GAAG;AAC3D,gBAAQ,MAAM,MAAM,GAAG,EAAE,IAAI;AAC7B,qBAAa,QAAQ,YAAY,KAAK,EAAE;AAAA,MAC1C;AACA,UAAI,MAAM,SAAS,EAAG;AAAA,IACxB;AAGA,QAAI,wBAAwB,CAAA;AAC5B,aAAS,IAAI,GAAG,SAAS,MAAM,QAAQ,IAAI,QAAQ,KAAK;AACtD,UAAI,YAAY,MAAM,CAAC;AACvB,UAAI,CAAC,sBAAsB,SAAS,GAAG;AACrC,8BAAsB,SAAS,IAAI,QAAQ,YAAY,SAAS,EAAE,SAAS,IAAI,YAAY;AAAA,MAC7F;AAAA,IACF;AAGA,QAAIA,KAAI,MAAM,aAAa,cAAc;AACzC,aAAS,KAAK,GAAG,UAAU,MAAM,QAAQ,KAAK,SAAS,MAAM;AAC3D,UAAI,aAAa,MAAM,EAAE;AACzB,UAAI,QAAQ,cAAcA,IAAG,aAAa,aAAa,WAAW;AAClE,UAAI,WAAW,KAAK,IAAIA,OAAM,UAAU,WAAW,IAAIA,MAAK,UAAU;AACtE,UAAI,WAAW,KAAK,IAAIA,OAAM,UAAU,WAAW,IAAIA,MAAK,UAAU;AACtE,UAAI,QAAQ,KAAK,MAAM,UAAU,QAAQ;AACzC,cAAQ,KAAI;AACZ,cAAQ,UAAU,MAAM,GAAG,MAAM,CAAC;AAClC,cAAQ,OAAO,KAAK;AAGpB,cAAQ,SAAS,YAAY,GAAG,CAAC;AACjC,cAAQ,QAAO;AACf,MAAAA,MAAK,sBAAsB,UAAU,IAAI;AAAA,IAC3C;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,MAAM;AAC/B,MAAI,YAAY,KAAK;AACrB,MAAI,sBAAsB,cAAc,QAAQ,cAAc,SAAS,SAAS,UAAU,eAAe,aAAa,cAAc,QAAQ,cAAc,SAAS,SAAS,UAAU,eAAe;AACrM,MAAI,sBAAsB,cAAc,QAAQ,cAAc,SAAS,SAAS,UAAU,eAAe,aAAa,cAAc,QAAQ,cAAc,SAAS,SAAS,UAAU,eAAe;AAGrM,MAAI;AAAA;AAAA,IAAiB,2KAA2K,OAAO,qBAAqB,+DAA+D,IAAI,IAAI,EAAE,OAAO,qBAAqB,+DAA+D,IAAI,IAAI,EAAE,OAAO,YAAY,yFAAyF,IAAI,g5BAAg5B,EAAE,OAAO,qBAAqB,sUAAsU,IAAI,IAAI,EAAE,OAAO,qBAAqB,sUAAsU,IAAI,4WAA4W;AAAA;AAC18E,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAM;AAC7B,MAAI,YAAY,KAAK;AACrB,MAAI,sBAAsB,cAAc,QAAQ,cAAc,SAAS,SAAS,UAAU,eAAe,aAAa,cAAc,QAAQ,cAAc,SAAS,SAAS,UAAU,eAAe;AACrM,MAAI,sBAAsB,cAAc,QAAQ,cAAc,SAAS,SAAS,UAAU,eAAe,aAAa,cAAc,QAAQ,cAAc,SAAS,SAAS,UAAU,eAAe;AAGrM,MAAI;AAAA;AAAA,IAAiB,8NAA8N,OAAO,qBAAqB,oCAAoC,IAAI,IAAI,EAAE,OAAO,qBAAqB,oCAAoC,IAAI,8TAA8T,EAAE,OAAO,qBAAqB,+DAA+D,IAAI,IAAI,EAAE,OAAO,qBAAqB,+DAA+D,IAAI,IAAI,EAAE,OAAO,YAAY,gDAAgD,IAAI,4pDAA8pD,EAAE,OAAO,YAAY,gDAAgD,kBAAkB,uOAAuO,EAAE,OAAO,qBAAqB,uGAAuG,IAAI,IAAI,EAAE,OAAO,qBAAqB,uGAAuG,IAAI,iNAAiN;AAAA;AACr5G,SAAO;AACT;AAEA,IAAI,yBAAyB;AAC7B,IAAI,qCAAqC;AAAA,EACvC,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB,kBAAkB;AACpB;AAqFA,IAAI,wBAAwB,uBAC1B,gBAAgB,sBAAsB,eACtC,QAAQ,sBAAsB;AAChC,SAAS,uBAAuB,cAAc;AAC5C,MAAI,UAAU,eAAe,eAAe,CAAA,GAAI,kCAAkC,GAAG,gBAAgB,EAAE;AACvG,MAAI,OAAO,SACT,YAAY,KAAK,WACjB,qBAAqB,KAAK,oBAC1B,YAAY,KAAK;AACnB,MAAI,sBAAsB,cAAc,QAAQ,cAAc,SAAS,SAAS,UAAU,eAAe,aAAa,cAAc,QAAQ,cAAc,SAAS,SAAS,UAAU,eAAe;AACrM,MAAI,sBAAsB,cAAc,QAAQ,cAAc,SAAS,SAAS,UAAU,eAAe,aAAa,cAAc,QAAQ,cAAc,SAAS,SAAS,UAAU,eAAe;AACrM,MAAIqF,YAAW,CAAC,YAAY,eAAe,gBAAgB,gBAAgB,aAAa,oBAAoB,EAAE,OAAO,mBAAmB,YAAY,CAAC,4BAA4B,4BAA4B,IAAI,CAAA,CAAE,CAAC;AACpN,SAAoB,0BAAU,cAAc;AAC1C,cAAU,kBAAkB,YAAY;AACxC,aAAS,mBAAmB;AAC1B,UAAI;AACJ,sBAAgB,MAAM,gBAAgB;AACtC,eAAS,OAAO,UAAU,QAAQ,OAAO,IAAI,MAAM,IAAI,GAAG,OAAO,GAAG,OAAO,MAAM,QAAQ;AACvF,aAAK,IAAI,IAAI,UAAU,IAAI;AAAA,MAC7B;AACA,cAAQ,WAAW,MAAM,kBAAkB,CAAA,EAAG,OAAO,IAAI,CAAC;AAC1D,sBAAgB,uBAAuB,KAAK,GAAG,aAAa,aAAa,0BAA0B,OAAO,CAAC;AAC3G,aAAO;AAAA,IACT;AACA,iBAAa,kBAAkB,CAAC;AAAA,MAC9B,KAAK;AAAA,MACL,OAAO,SAAS,gBAAgB;AAC9B,eAAO;AAAA,UACL,UAAU;AAAA,UACV,sBAAsB,gBAAgB,OAAO;AAAA,UAC7C,wBAAwB,kBAAkB,OAAO;AAAA,UACjD,QAAQ,sBAAsB;AAAA,UAC9B,UAAUA;AAAA,UACV,YAAY,CAAC;AAAA,YACX,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,UAClB,GAAa;AAAA,YACD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,UAClB,CAAW,EAAE,OAAO,mBAAmB,qBAAqB,CAAC;AAAA,YACjD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,UAClB,CAAW,IAAI,CAAA,CAAE,GAAG,mBAAmB,qBAAqB,CAAC;AAAA,YACjD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,UAClB,CAAW,IAAI,CAAA,CAAE,GAAG,CAAC;AAAA,YACT,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,UAClB,GAAa;AAAA,YACD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,UAClB,GAAa;AAAA,YACD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,YACN,YAAY;AAAA,UACxB,GAAa;AAAA,YACD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,YACN,YAAY;AAAA,UACxB,CAAW,CAAC;AAAA,UACF,qBAAqB;AAAA,YAAC;AAAA,cACpB,MAAM;AAAA,cACN,MAAM;AAAA,cACN,MAAM;AAAA,YAClB;AAAA;AAAA,YAEU;AAAA,cACE,MAAM;AAAA,cACN,MAAM;AAAA,cACN,MAAM;AAAA,YAClB;AAAA;AAAA,UACA;AAAA,UACU,eAAe,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;AAAA,QAC3E;AAAA,MACM;AAAA,IACN,GAAO;AAAA,MACD,KAAK;AAAA,MACL,OAAO,SAAS,mBAAmB,WAAW,YAAY,YAAY,YAAY,MAAM;AACtF,YAAI;AACJ,YAAI,YAAY,KAAK,QAAQ;AAC7B,YAAI,KAAK,WAAW;AACpB,YAAI,KAAK,WAAW;AACpB,YAAI,KAAK,WAAW;AACpB,YAAI,KAAK,WAAW;AACpB,YAAI,QAAQ,WAAW,KAAK,KAAK;AACjC,YAAI,aAAa,QAAQ,KAAK,kBAAkB,OAAO,QAAQ,UAAU,SAAS,QAAQ;AAC1F,YAAI,QAAQ,KAAK;AAGjB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,YAAI,mBAAoB,OAAM,YAAY,IAAI,WAAW;AACzD,YAAI,mBAAoB,OAAM,YAAY,IAAI,WAAW;AACzD,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AACtB,cAAM,YAAY,IAAI;AAAA,MACxB;AAAA,IACN,GAAO;AAAA,MACD,KAAK;AAAA,MACL,OAAO,SAAS,YAAY,QAAQ,OAAO;AACzC,YAAI,KAAK,MAAM,IACb,mBAAmB,MAAM;AAC3B,YAAI,WAAW,iBAAiB,UAC9B,eAAe,iBAAiB,cAChC,YAAY,iBAAiB,WAC7B,cAAc,iBAAiB,aAC/B,eAAe,iBAAiB,cAChC,qBAAqB,iBAAiB;AACxC,WAAG,iBAAiB,UAAU,OAAO,OAAO,MAAM;AAClD,WAAG,UAAU,cAAc,OAAO,UAAU;AAC5C,WAAG,UAAU,aAAa,OAAO,SAAS;AAC1C,WAAG,UAAU,WAAW,OAAO,mBAAmB;AAClD,WAAG,UAAU,cAAc,OAAO,QAAQ,OAAO,YAAY,OAAO,SAAS,OAAO,UAAU;AAC9F,WAAG,UAAU,oBAAoB,OAAO,gBAAgB;AACxD,YAAI,WAAW;AACb,cAAI,2BAA2B,iBAAiB,0BAC9C,6BAA6B,iBAAiB;AAChD,aAAG,UAAU,0BAA0B,UAAU,sBAAsB;AACvE,aAAG,UAAU,4BAA4B,UAAU,wBAAwB;AAAA,QAC7E;AAAA,MACF;AAAA,IACN,CAAK,CAAC;AACF,WAAO;AAAA,EACT,GAAE,WAAW;AACf;AAEuB,uBAAsB;AAC7C,IAAI,yBAAyB,uBAAuB;AAAA,EAClD,WAAW;AACb,CAAC;AACkC,uBAAuB;AAAA,EACxD,WAAW,eAAe,eAAe,CAAA,GAAI,uCAAuC,GAAG,CAAA,GAAI;AAAA,IACzF,WAAW;AAAA,EACf,CAAG;AACH,CAAC;ACrfM,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AACtB,MAAM,yBAAyB;AAG/B,MAAM,wBAAgD;AAAA,EAC3D,YAAY;AAAA;AAAA,EAEZ,aAAa;AAAA;AAEf;AAIO,MAAM,oBAAoB;AAC1B,MAAM,yBAAyB;AAC/B,MAAM,wBAAwB;AAC9B,MAAM,mBAAmB;AAKzB,MAAM,uBAAuB;AAC7B,MAAM,2BAA2B;AACjC,MAAM,sBAAsB;AAI5B,MAAM,sBAAsB;AAM5B,MAAM,qBAAqB;AAK3B,MAAM,sBAAsB;AAC5B,MAAM,wBAAwB;AAC9B,MAAM,yBAAyB;AAC/B,MAAM,yBAAyB;AAC/B,MAAM,sBAAsB;AAM5B,MAAM,cAAc;AACpB,MAAM,cAAc;AACpB,MAAM,oBAAoB;AAC1B,MAAM,gBAAgB;AACtB,MAAM,2BAA2B;AACjC,MAAM,uBAAuB;AAC7B,MAAM,qBAAqB;AAC3B,MAAM,mBAAmB;AACzB,MAAM,0BAA0B;AAChC,MAAM,mBAAmB;AACzB,MAAM,eAAe;AAKrB,MAAM,0BAA0B;AAChC,MAAM,iBAAiB;AACvB,MAAM,kBAAkB;AACxB,MAAM,qBAAqB;AAK3B,MAAM,yBAAyB;AAE/B,MAAM,gCAAgC;AACtC,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,cAAc;AAKpB,MAAM,qBAAqB;AAc3B,MAAM,wBAAsC;AAAA,EACjD,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,uBAAuB;AAAA,EACvB,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,sBAAsB;AAAA;AAAA,EAEtB,gBAAgB;AAAA,EAChB,iBAAiB,CAAC,cAAc,aAAa,SAAS;AAAA;AAAA,EAAA,cAEtDC,cAAAA;AAAAA,EAAA,cACAC,cAAAA;AAAAA,EAAA,wBACAC,cAAAA;AAAAA,EAAA,qBACAC,cAAAA;AAAAA,EAAA,mBACAC,cAAAA;AACF;AC3HA,SAAS,SACP,QACA,UACA,iBACQ;AACR,QAAM,OAAO,KAAK;AAAA,IAChB;AAAA,IACA,KAAK;AAAA,MACH;AAAA,MACA,gBAAgB,KAAK,KAAK,MAAM,IAAI;AAAA,IAAA;AAAA,EACtC;AAEF,QAAM,aACJ,sBAAsB,QAAQ,MAC7B,gBAAgB,IAAI,QAAQ,IAAI,sBAAsB,cAAc;AACvE,SAAO,OAAO;AAChB;AAGA,SAAS,WAAW,UAA2D;AAC7E,MAAI,OAAO,aAAa,SAAU,QAAO;AACzC,MAAI,OAAO,aAAa,YAAY,aAAa;AAC/C,WAAQ,SAAuB;AACjC,SAAO,OAAO,QAAQ;AACxB;AAiBO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoD;AAElD,QAAM,QAAQC,EAAAA,QAAQ,MAAM,IAAIC,oBAAM,EAAE,OAAO,MAAM,MAAM,WAAA,CAAY,GAAG,CAAA,CAAE;AAG5E,QAAM,YAAYC,EAAAA,OAAsB,IAAI;AAG5C,QAAM,eAAeA,EAAAA,OAAO,KAAK;AAGjC,QAAM,eAAeA,EAAAA,OAAO,CAAC;AAE7B,QAAM,CAAC,aAAa,cAAc,IAAIC,EAAAA,SAAS,KAAK;AAGpD,QAAM,kBAAkBH,EAAAA;AAAAA,IACtB,MAAM,IAAI,IAAI,aAAa,eAAe;AAAA,IAC1C,CAAC,aAAa,eAAe;AAAA,EAAA;AAI/BI,IAAAA,UAAU,MAAM;AACd,UAAM,MAAA;AACN,mBAAe,KAAK;AAEpB,QAAI,SAAS,WAAW,EAAG;AAE3B,UAAM,EAAE,aAAa,UAAU,MAAA,IAAU;AACzC,UAAM,EAAE,cAAc,cAAc,kBAAA,IAAsB;AAG1D,UAAM,gCAAgB,IAAA;AACtB,UAAM,kBAAkB,SAAS,IAAI,CAAC,SAAS;AAC7C,gBAAU,IAAI,KAAK,EAAE;AACrB,YAAM,YAAY,aAAa,KAAK,IAAI;AACxC,YAAM,YAAY,kBAAkB,aAAa,UAAU,KAAK,EAAE;AAClE,YAAM,MAAM,YAAY,KAAK,EAAE;AAC/B,YAAM,WAAW,QAAQ,SAAY,MAAM,IAAI,GAAG,IAAI;AACtD,aAAO;AAAA,QACL,KAAK,KAAK;AAAA,QACV,YAAY;AAAA,UACV,OAAO,KAAK,QAAQ,KAAK;AAAA,UACzB,GAAG;AAAA,UACH,GAAG;AAAA,UACH,MAAM,SAAS,GAAG,KAAK,MAAM,eAAe;AAAA,UAC5C,UAAU,KAAK;AAAA,UACf,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,iBAAiB;AAAA,UACjB,gBAAgB,YAAY;AAAA,QAAA;AAAA,MAC9B;AAAA,IAEJ,CAAC;AAGD,UAAM,gCAAgB,IAAA;AACtB,UAAM,kBAKA,CAAA;AAEN,UAAM,WACJ,SAAS,SAAS,aAAa,uBAC3B,yBACA;AAEN,eAAW,QAAQ,UAAU;AAC3B,YAAM,SAAS,WAAW,KAAK,MAAM;AACrC,YAAM,SAAS,WAAW,KAAK,MAAM;AACrC,UAAI,CAAC,UAAU,IAAI,MAAM,KAAK,CAAC,UAAU,IAAI,MAAM,EAAG;AACtD,YAAM,UAAU,GAAG,MAAM,IAAI,KAAK,KAAK,IAAI,MAAM;AACjD,UAAI,UAAU,IAAI,OAAO,EAAG;AAC5B,gBAAU,IAAI,OAAO;AACrB,sBAAgB,KAAK;AAAA,QACnB,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA,YAAY;AAAA,UACV,OAAO,KAAK;AAAA,UACZ,OAAO,aAAa,KAAK,KAAK;AAAA,UAC9B,MAAM;AAAA,UACN,YAAY;AAAA,QAAA;AAAA,MACd,CACD;AAAA,IACH;AAGA,UAAM,OAAO;AAAA,MACX,OAAO;AAAA,MACP,OAAO;AAAA,IAAA,CACR;AAGD,UAAM,UAAU,SAAS,IAAI,CAAC3F,OAAMA,GAAE,EAAE;AACxC,UAAM,WAAiD,CAAA;AACvD,eAAW,QAAQ,UAAU;AAC3B,UAAI,KAAK,UAAU,aAAa,eAAgB;AAChD,YAAM,SAAS,WAAW,KAAK,MAAM;AACrC,YAAM,SAAS,WAAW,KAAK,MAAM;AACrC,UAAI,UAAU,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,GAAG;AAClD,iBAAS,KAAK,EAAE,QAAQ,OAAA,CAAQ;AAAA,MAClC;AAAA,IACF;AAGA,QAAI,UAAU,SAAS;AACrB,gBAAU,QAAQ,UAAA;AAClB,gBAAU,UAAU;AAAA,IACtB;AAEA,UAAM,QAAQ,EAAE,aAAa;AAE7B,UAAM4F,UAAS,IAAI;AAAA,MACjB,IAAA;AAAA;AAAA,QAAA;AAAA;MAAA;AAAA,MACA,EAAE,MAAM,SAAA;AAAA,IAAS;AAEnB,cAAU,UAAUA;AAEpB,QAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,cAAQ,KAAK,gCAAgC;AAAA,IAC/C;AAEA,IAAAA,QAAO,UAAU,CAAC,QAAQ;AACxB,UAAI,UAAU,aAAa,WAAW,aAAa,QAAS;AAC5D,cAAQ,MAAM,mCAAmC,GAAG;AACpD,qBAAe,IAAI;AACnB,UAAI,UAAU,YAAYA,QAAQ,WAAU,UAAU;AAAA,IACxD;AAEA,IAAAA,QAAO,YAAY,CAAC/F,OAAoC;AACtD,UAAI,UAAU,aAAa,WAAW,aAAa,QAAS;AAG5D,YAAM,0BAAU,IAAA;AAChB,iBAAW,CAAC,IAAI,GAAG,CAAC,KAAKA,GAAE,KAAK,WAAW;AACzC,YAAI,IAAI,IAAI,EAAE,GAAG,GAAG;AAAA,MACtB;AAEA,UAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,gBAAQ,QAAQ,gCAAgC;AAChD,gBAAQ,IAAI,+BAA+B,IAAI,IAAI,QAAQ;AAAA,MAC7D;AAGA,YAAM,yBAAyB,CAAC,KAAK,UAAU;AAC7C,cAAM,IAAI,IAAI,IAAI,GAAG;AACrB,YAAI,GAAG;AACL,gBAAM,IAAI,EAAE;AACZ,gBAAM,IAAI,EAAE;AAAA,QACd;AACA,eAAO;AAAA,MACT,CAAC;AAED,qBAAe,IAAI;AAEnB,MAAA+F,QAAO,UAAA;AACP,UAAI,UAAU,YAAYA,QAAQ,WAAU,UAAU;AAAA,IACxD;AAEA,IAAAA,QAAO,YAAY;AAAA,MACjB;AAAA,MACA,OAAO;AAAA,MACP,aAAa;AAAA,MACb,QAAQ;AAAA,QACN,cAAc,aAAa;AAAA,QAC3B,gBAAgB,aAAa;AAAA,QAC7B,OAAO,aAAa;AAAA,QACpB,iBAAiB,aAAa;AAAA,QAC9B,cAAc,aAAa;AAAA,QAC3B,mBAAmB,aAAa;AAAA,MAAA;AAAA,IAClC,CACuB;AAEzB,WAAO,MAAM;AACX,UAAI,UAAU,YAAYA,SAAQ;AAChC,QAAAA,QAAO,UAAA;AACP,kBAAU,UAAU;AAAA,MACtB;AAAA,IACF;AAAA,EAIF,GAAG,CAAC,UAAU,UAAU,OAAO,cAAc,eAAe,CAAC;AAG7DD,IAAAA,UAAU,MAAM;AACd,iBAAa,UAAU;AACvB,WAAO,MAAM;AACX,mBAAa,UAAU;AACvB,gBAAU,SAAS,UAAA;AAAA,IACrB;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,SAAO,EAAE,OAAO,YAAA;AAClB;ACxPA,MAAM,oCAAoB,IAAA;AAE1B,SAAS,SAAS,KAAa,OAAuB;AACpD,QAAM,MAAM,GAAG,GAAG,IAAI,KAAK;AAC3B,QAAME,UAAS,cAAc,IAAI,GAAG;AACpC,MAAIA,QAAQ,QAAOA;AAEnB,QAAM,IAAI,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AACtC,QAAM,IAAI,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AACtC,QAAM,IAAI,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AAEtC,QAAM,MAAM,IACV,MAAM,IACN,MAAM;AACR,QAAM,KAAK,KAAK,MAAM,IAAI,QAAQ,OAAO,IAAI,MAAM;AACnD,QAAM,KAAK,KAAK,MAAM,IAAI,QAAQ,OAAO,IAAI,MAAM;AACnD,QAAM,KAAK,KAAK,MAAM,IAAI,QAAQ,OAAO,IAAI,MAAM;AACnD,QAAM,SAAS,IAAI,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,GAAG,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,GAAG,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AACzH,gBAAc,IAAI,KAAK,MAAM;AAC7B,SAAO;AACT;AASO,SAAS,gBACd,OACA,aACA,aACA,cACA,YACA,cACM;AACNF,IAAAA,UAAU,MAAM;AACd,QAAI,CAAC,eAAe,MAAM,UAAU,EAAG;AAEvC,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,IACE;AAEJ,UAAM,EAAE,cAAc,aAAA,IAAiB;AACvC,UAAM,eAAe,eAAe,OAAO;AAG3C,UAAM,yBAAyB,CAAC,KAAK,UAAU;AAC7C,YAAM,gBAAgB,CAAC,gBAAgB,eAAe,IAAI,GAAG;AAC7D,YAAM,aAAa,QAAQ;AAC3B,YAAM,YAAY,CAAC,gBAAgB,WAAW,IAAI,GAAG;AACrD,YAAM,aACF,cAAc,cACZ,MAAM,kBACN,MAAM,eACV,aAAa,MAAM,QAAkB;AAEvC,YAAM,QAAQ,gBACV,YACA,SAAS,WAAW,mBAAmB;AAC3C,YAAM,cAAc,aAAa,YAAY;AAC7C,YAAM,aAAa,aAAa,IAAI;AACpC,YAAM,aAAa,aAAa;AAChC,aAAO;AAAA,IACT,CAAC;AAGD,UAAM,kBAAkB,eACpB,yBACA;AAEJ,UAAM,yBAAyB,CAAC,KAAK,OAAO,QAAQ,WAAW;AAC7D,YAAM,UAAU,GAAG,MAAM,IAAI,MAAM;AACnC,YAAM,gBAAgB,eAAe,IAAI,OAAO;AAChD,YAAM,YAAY,aAAa,MAAM,KAAe;AAEpD,UAAI,cAAc;AAChB,cAAM,QAAQ,gBACV,YACA,SAAS,WAAW,mBAAmB;AAC3C,cAAM,OAAO,gBAAgB,wBAAwB;AAAA,MACvD,OAAO;AACL,cAAM,QAAQ,SAAS,WAAW,oBAAoB;AACtD,cAAM,OAAO;AAAA,MACf;AAEA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,OAAO,aAAa,aAAa,cAAc,YAAY,CAAC;AAClE;AC7HmX,SAAS,EAAE,GAAE3F,IAAE;AAAC,QAAM,IAAEJ,KAAI,CAACuD,IAAE,CAAC,IAAE2B,EAAAA,SAAE,KAAE,GAAE,CAAC,GAAE,CAAC,IAAEA,WAAE,IAAI,GAAE,IAAEgB,SAAE9F,EAAC;AAAEH,IAAE,EAAE,SAAQG,EAAC,MAAI,EAAE,UAAQA,KAAGwE,EAAAA,WAAG,MAAI;AAAC,MAAE,KAAE;AAAE,QAAI5E,KAAE;AAAK,WAAO,EAAE,YAAUA,KAAE,IAAI,EAAE,EAAE,SAAQ,GAAG,EAAE,OAAO,IAAG,EAAEA,EAAC,GAAE,MAAI;AAAC,eAAOA,MAAGA,GAAE;IAAM;AAAA,EAAC,IAAG,CAAC,GAAE,GAAE,GAAE,GAAE,CAAC,CAAC;AAAE,SAAM,EAAC,MAAK8E,EAAAA,aAAG,MAAI;AAAC,UAAI,EAAE,KAAI,GAAG,EAAE,KAAE;AAAA,EAAE,IAAG,CAAC,GAAE,CAAC,CAAC,GAAE,OAAMA,EAAAA,aAAG,MAAI;AAAC,UAAI,EAAE,MAAK,GAAG,EAAE,IAAE;AAAA,EAAE,IAAG,CAAC,GAAE,CAAC,CAAC,GAAE,MAAKA,EAAAA,aAAG,MAAI;AAAC,SAAG,EAAE,KAAI,GAAG,EAAE,KAAE;AAAA,EAAC,IAAG,CAAC,GAAE,CAAC,CAAC,GAAE,WAAUvB,GAAC;AAAC;;;;;;ACWztB,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,cAAc;AAClB,MAAI,cAAc;AAClB,MAAI,YAAY;AAChB,MAAI,mBAAmB;AACvB,MAAI,YAAY;AAChB,MAAI,aAAa;AAEjB,MAAI,cAAc;AAClB,MAAI,cAAc;AAClB,MAAI,cAAc;AAElB,MAAI,cAAc;AAClB,MAAI,kBAAkB;AACtB,MAAI,kBAAkB;AACtB,MAAI,cAAc;AAClB,MAAI,sBAAsB;AAC1B,MAAI,qBAAqB;AACzB,MAAI,cAAc;AAClB,MAAI,uBAAuB;AAC3B,MAAI,uBAAuB;AAE3B,MAAI,uBAAuB;AAK3B,MAAI,MAAM;AACV,MAAI,MAAM;AACV,MAAI,MAAM;AAEV,MAAI,YAAY;AAUhB,YAAiB,SAAS4C,SAAQ,SAAS,YAAY,YAAY;AAEjE,QAAI,GAAG,GAAG/F,IAAG,IAAIgG,KAAI,IAAInG,IAAG8E,IAAG,GAAG;AAElC,QAAI,QAAQ,WAAW,QACrB,OAAO,WAAW;AAEpB,QAAI,cAAc,QAAQ;AAE1B,QAAI,eAAe,QAAQ,iBAAiB,QAAQ;AAEpD,QAAI,yBAAyB,aAAa,OAAO,OAAO,KAAK,UAAU;AAEvE,QAAI,eAAe,CAAA;AAMnB,SAAK3E,KAAI,GAAGA,KAAI,OAAOA,MAAK,KAAK;AAC/B,iBAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO;AACpD,iBAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO;AACpD,iBAAWA,KAAI,OAAO,IAAI;AAC1B,iBAAWA,KAAI,OAAO,IAAI;AAAA,IAC9B;AAGE,QAAI,QAAQ,gCAAgC;AAC1C,gCAA0B;AAC1B,WAAKA,KAAI,GAAGA,KAAI,OAAOA,MAAK,KAAK;AAC/B,mCAA2B,WAAWA,KAAI,SAAS;AAAA,MACzD;AAEI,iCAA2B,QAAQ;AAAA,IACvC;AAKE,QAAI,QAAQ,mBAAmB;AAE7B,UAAI,OAAO,UACT,OAAO,WACP,OAAO,UACP,OAAO,WACP,GACA,IACA;AAGF,WAAKA,KAAI,GAAGA,KAAI,OAAOA,MAAK,KAAK;AAC/B,eAAO,KAAK,IAAI,MAAM,WAAWA,KAAI,MAAM,CAAC;AAC5C,eAAO,KAAK,IAAI,MAAM,WAAWA,KAAI,MAAM,CAAC;AAC5C,eAAO,KAAK,IAAI,MAAM,WAAWA,KAAI,MAAM,CAAC;AAC5C,eAAO,KAAK,IAAI,MAAM,WAAWA,KAAI,MAAM,CAAC;AAAA,MAClD;AAGI,UAAI,KAAK,OAAO,MACd,KAAK,OAAO;AACd,UAAI,KAAK,IAAI;AACX,iBAAS,KAAK,MAAM;AACpB,eAAO,OAAO;AAAA,MACpB,OAAW;AACL,iBAAS,KAAK,MAAM;AACpB,eAAO,OAAO;AAAA,MACpB;AAGI,mBAAa,IAAI,WAAW,IAAI;AAChC,mBAAa,IAAI,eAAe,KAAK,OAAO,QAAQ;AACpD,mBAAa,IAAI,eAAe,KAAK,OAAO,QAAQ;AACpD,mBAAa,IAAI,WAAW,IAAI,KAAK,IAAI,OAAO,MAAM,OAAO,IAAI;AACjE,mBAAa,IAAI,mBAAmB,IAAI;AACxC,mBAAa,IAAI,kBAAkB,IAAI;AACvC,mBAAa,IAAI,WAAW,IAAI;AAChC,mBAAa,IAAI,oBAAoB,IAAI;AACzC,mBAAa,IAAI,oBAAoB,IAAI;AAGzC,UAAI;AACJ,WAAKA,KAAI,GAAGA,KAAI,OAAOA,MAAK,KAAK;AAE/B,YAAI;AACJ,8BAAsB;AAEtB,eAAO,MAAM;AAIX,cAAI,aAAa,IAAI,kBAAkB,KAAK,GAAG;AAQ7C,gBAAI,WAAWA,KAAI,MAAM,IAAI,aAAa,IAAI,eAAe,GAAG;AAC9D,kBAAI,WAAWA,KAAI,MAAM,IAAI,aAAa,IAAI,eAAe,GAAG;AAE9D,oBAAI,aAAa,IAAI,kBAAkB;AAAA,cACrD,OAAmB;AAEL,oBAAI,aAAa,IAAI,kBAAkB,IAAI;AAAA,cACzD;AAAA,YACA,OAAiB;AACL,kBAAI,WAAWA,KAAI,MAAM,IAAI,aAAa,IAAI,eAAe,GAAG;AAE9D,oBAAI,aAAa,IAAI,kBAAkB,IAAI,MAAM;AAAA,cAC/D,OAAmB;AAEL,oBAAI,aAAa,IAAI,kBAAkB,IAAI,MAAM;AAAA,cAC/D;AAAA,YACA;AAGU,yBAAa,IAAI,oBAAoB,KAClC,aAAa,IAAI,oBAAoB,IACpC,aAAa,IAAI,WAAW,IAC5B,WAAWA,KAAI,MAAM,IAAI,WAAWA,KAAI,SAAS,MAClD,aAAa,IAAI,WAAW,IAAI,WAAWA,KAAI,SAAS;AAE3D,yBAAa,IAAI,oBAAoB,KAClC,aAAa,IAAI,oBAAoB,IACpC,aAAa,IAAI,WAAW,IAC5B,WAAWA,KAAI,MAAM,IAAI,WAAWA,KAAI,SAAS,MAClD,aAAa,IAAI,WAAW,IAAI,WAAWA,KAAI,SAAS;AAE3D,yBAAa,IAAI,WAAW,KAAK,WAAWA,KAAI,SAAS;AAGzD,gBAAI;AACJ;AAAA,UACV,OAAe;AAIL,gBAAI,aAAa,IAAI,WAAW,IAAI,GAAG;AAGrC,2BAAa,IAAI,WAAW,IAAIA;AAChC;AAAA,YACZ,OAAiB;AASL,2BAAa,IAAI,kBAAkB,IAAI,IAAI;AAC3C,cAAA2E,KAAI,aAAa,IAAI,WAAW,IAAI;AAMpC,kBAAI,aAAa,IAAI,kBAAkB;AAEvC,2BAAa,IAAI,WAAW,IAAI;AAChC,2BAAa,IAAI,eAAe,IAC9B,aAAa,IAAI,eAAe,IAAIA;AACtC,2BAAa,IAAI,eAAe,IAC9B,aAAa,IAAI,eAAe,IAAIA;AACtC,2BAAa,IAAI,WAAW,IAAIA;AAChC,2BAAa,IAAI,mBAAmB,IAAI,IAAI;AAC5C,2BAAa,IAAI,kBAAkB,IAAI;AACvC,2BAAa,IAAI,WAAW,IAAI;AAChC,2BAAa,IAAI,oBAAoB,IAAI;AACzC,2BAAa,IAAI,oBAAoB,IAAI;AAGzC,mBAAK;AACL,2BAAa,IAAI,WAAW,IAAI;AAChC,2BAAa,IAAI,eAAe,IAC9B,aAAa,IAAI,eAAe,IAAIA;AACtC,2BAAa,IAAI,eAAe,IAC9B,aAAa,IAAI,eAAe,IAAIA;AACtC,2BAAa,IAAI,WAAW,IAAIA;AAChC,2BAAa,IAAI,mBAAmB,IAAI,IAAI;AAC5C,2BAAa,IAAI,kBAAkB,IAAI;AACvC,2BAAa,IAAI,WAAW,IAAI;AAChC,2BAAa,IAAI,oBAAoB,IAAI;AACzC,2BAAa,IAAI,oBAAoB,IAAI;AAGzC,mBAAK;AACL,2BAAa,IAAI,WAAW,IAAI;AAChC,2BAAa,IAAI,eAAe,IAC9B,aAAa,IAAI,eAAe,IAAIA;AACtC,2BAAa,IAAI,eAAe,IAC9B,aAAa,IAAI,eAAe,IAAIA;AACtC,2BAAa,IAAI,WAAW,IAAIA;AAChC,2BAAa,IAAI,mBAAmB,IAAI,IAAI;AAC5C,2BAAa,IAAI,kBAAkB,IAAI;AACvC,2BAAa,IAAI,WAAW,IAAI;AAChC,2BAAa,IAAI,oBAAoB,IAAI;AACzC,2BAAa,IAAI,oBAAoB,IAAI;AAGzC,mBAAK;AACL,2BAAa,IAAI,WAAW,IAAI;AAChC,2BAAa,IAAI,eAAe,IAC9B,aAAa,IAAI,eAAe,IAAIA;AACtC,2BAAa,IAAI,eAAe,IAC9B,aAAa,IAAI,eAAe,IAAIA;AACtC,2BAAa,IAAI,WAAW,IAAIA;AAChC,2BAAa,IAAI,mBAAmB,IAClC,aAAa,IAAI,mBAAmB;AACtC,2BAAa,IAAI,kBAAkB,IAAI;AACvC,2BAAa,IAAI,WAAW,IAAI;AAChC,2BAAa,IAAI,oBAAoB,IAAI;AACzC,2BAAa,IAAI,oBAAoB,IAAI;AAEzC,mBAAK;AAOL,kBACE,WAAW,aAAa,IAAI,WAAW,IAAI,MAAM,IACjD,aAAa,IAAI,eAAe,GAChC;AACA,oBACE,WAAW,aAAa,IAAI,WAAW,IAAI,MAAM,IACjD,aAAa,IAAI,eAAe,GAChC;AAEA,sBAAI,aAAa,IAAI,kBAAkB;AAAA,gBACvD,OAAqB;AAEL,sBAAI,aAAa,IAAI,kBAAkB,IAAI;AAAA,gBAC3D;AAAA,cACA,OAAmB;AACL,oBACE,WAAW,aAAa,IAAI,WAAW,IAAI,MAAM,IACjD,aAAa,IAAI,eAAe,GAChC;AAEA,sBAAI,aAAa,IAAI,kBAAkB,IAAI,MAAM;AAAA,gBACjE,OAAqB;AAEL,sBAAI,aAAa,IAAI,kBAAkB,IAAI,MAAM;AAAA,gBACjE;AAAA,cACA;AAGY,2BAAa,IAAI,WAAW,IAC1B,WAAW,aAAa,IAAI,WAAW,IAAI,SAAS;AACtD,2BAAa,IAAI,oBAAoB,IACnC,WAAW,aAAa,IAAI,WAAW,IAAI,MAAM;AACnD,2BAAa,IAAI,oBAAoB,IACnC,WAAW,aAAa,IAAI,WAAW,IAAI,MAAM;AAEnD,2BAAa,IAAI,WAAW,IAAI,aAAa,IAAI,WAAW;AAC5D,2BAAa,IAAI,WAAW,IAAI;AAGhC,kBAAI,WAAW3E,KAAI,MAAM,IAAI,aAAa,IAAI,eAAe,GAAG;AAC9D,oBAAI,WAAWA,KAAI,MAAM,IAAI,aAAa,IAAI,eAAe,GAAG;AAE9D,uBAAK,aAAa,IAAI,kBAAkB;AAAA,gBACxD,OAAqB;AAEL,uBAAK,aAAa,IAAI,kBAAkB,IAAI;AAAA,gBAC5D;AAAA,cACA,OAAmB;AACL,oBAAI,WAAWA,KAAI,MAAM,IAAI,aAAa,IAAI,eAAe,GAAG;AAE9D,uBAAK,aAAa,IAAI,kBAAkB,IAAI,MAAM;AAAA,gBAClE,OAAqB;AAEL,uBAAK,aAAa,IAAI,kBAAkB,IAAI,MAAM;AAAA,gBAClE;AAAA,cACA;AAEY,kBAAI,MAAM,IAAI;AAGZ,oBAAI,uBAAuB;AACzB,sBAAI;AACJ;AAAA,gBAChB,OAAqB;AAGL,wCAAsB;AACtB;AAAA,gBAChB;AAAA,cACA;AAIY,2BAAa,KAAK,WAAW,IAAIA;AACjC;AAAA,YACZ;AAAA,UACA;AAAA,QACA;AAAA,MACA;AAAA,IACA;AAME,QAAI,QAAQ,mBAAmB;AAC7B,oBAAc,QAAQ;AAGtB,WAAKA,KAAI,GAAGA,KAAI,OAAOA,MAAK,KAAK;AAG/B,YAAI;AACJ,eAAO,MAAM;AACX,cAAI,aAAa,IAAI,kBAAkB,KAAK,GAAG;AAI7C,uBACE,KAAK;AAAA,cACH,WAAWA,KAAI,MAAM,IAAI,aAAa,IAAI,oBAAoB;AAAA,cAC9D;AAAA,gBAEF,KAAK;AAAA,cACH,WAAWA,KAAI,MAAM,IAAI,aAAa,IAAI,oBAAoB;AAAA,cAC9D;AAAA;AAGJ,gBAAI,aAAa,IAAI,WAAW;AAEhC,gBAAK,IAAI,IAAI,IAAK,WAAW,cAAc;AAGzC,sBACE,WAAWA,KAAI,MAAM,IAAI,aAAa,IAAI,oBAAoB;AAChE,sBACE,WAAWA,KAAI,MAAM,IAAI,aAAa,IAAI,oBAAoB;AAEhE,kBAAI,gBAAgB,MAAM;AAExB,oBAAI,WAAW,GAAG;AAChB,2BACG,cACC,WAAWA,KAAI,SAAS,IACxB,aAAa,IAAI,WAAW,IAC9B;AAEF,6BAAWA,KAAI,OAAO,KAAK,QAAQ;AACnC,6BAAWA,KAAI,OAAO,KAAK,QAAQ;AAAA,gBACnD,WAAyB,WAAW,GAAG;AACvB,2BACG,CAAC,cACA,WAAWA,KAAI,SAAS,IACxB,aAAa,IAAI,WAAW,IAC9B,KAAK,KAAK,QAAQ;AAEpB,6BAAWA,KAAI,OAAO,KAAK,QAAQ;AACnC,6BAAWA,KAAI,OAAO,KAAK,QAAQ;AAAA,gBACnD;AAAA,cACA,OAAmB;AAEL,oBAAI,WAAW,GAAG;AAChB,2BACG,cACC,WAAWA,KAAI,SAAS,IACxB,aAAa,IAAI,WAAW,IAC9B;AAEF,6BAAWA,KAAI,OAAO,KAAK,QAAQ;AACnC,6BAAWA,KAAI,OAAO,KAAK,QAAQ;AAAA,gBACnD;AAAA,cACA;AAGY,kBAAI,aAAa,IAAI,mBAAmB;AACxC,kBAAI,IAAI,EAAG;AAEX;AAAA,YACZ,OAAiB;AAEL,kBAAI,aAAa,IAAI,kBAAkB;AACvC;AAAA,YACZ;AAAA,UACA,OAAe;AAGL,iBAAK,aAAa,IAAI,WAAW;AAEjC,gBAAI,MAAM,KAAK,OAAOA,IAAG;AACvB,sBAAQ,WAAWA,KAAI,MAAM,IAAI,WAAW,KAAK,MAAM;AACvD,sBAAQ,WAAWA,KAAI,MAAM,IAAI,WAAW,KAAK,MAAM;AAEvD,yBAAW,QAAQ,QAAQ,QAAQ;AAEnC,kBAAI,gBAAgB,MAAM;AAExB,oBAAI,WAAW,GAAG;AAChB,2BACG,cACC,WAAWA,KAAI,SAAS,IACxB,WAAW,KAAK,SAAS,IAC3B;AAEF,6BAAWA,KAAI,OAAO,KAAK,QAAQ;AACnC,6BAAWA,KAAI,OAAO,KAAK,QAAQ;AAAA,gBACnD,WAAyB,WAAW,GAAG;AACvB,2BACG,CAAC,cACA,WAAWA,KAAI,SAAS,IACxB,WAAW,KAAK,SAAS,IAC3B,KAAK,KAAK,QAAQ;AAEpB,6BAAWA,KAAI,OAAO,KAAK,QAAQ;AACnC,6BAAWA,KAAI,OAAO,KAAK,QAAQ;AAAA,gBACnD;AAAA,cACA,OAAmB;AAEL,oBAAI,WAAW,GAAG;AAChB,2BACG,cACC,WAAWA,KAAI,SAAS,IACxB,WAAW,KAAK,SAAS,IAC3B;AAEF,6BAAWA,KAAI,OAAO,KAAK,QAAQ;AACnC,6BAAWA,KAAI,OAAO,KAAK,QAAQ;AAAA,gBACnD;AAAA,cACA;AAAA,YACA;AAGU,gBAAI,aAAa,IAAI,mBAAmB;AAExC,gBAAI,IAAI,EAAG;AAEX;AAAA,UACV;AAAA,QACA;AAAA,MACA;AAAA,IACA,OAAS;AACL,oBAAc,QAAQ;AAGtB,WAAK,KAAK,GAAG,KAAK,OAAO,MAAM,KAAK;AAClC,aAAKgG,MAAK,GAAGA,MAAK,IAAIA,OAAM,KAAK;AAE/B,kBAAQ,WAAW,KAAK,MAAM,IAAI,WAAWA,MAAK,MAAM;AACxD,kBAAQ,WAAW,KAAK,MAAM,IAAI,WAAWA,MAAK,MAAM;AAExD,cAAI,gBAAgB,MAAM;AAExB,uBACE,KAAK,KAAK,QAAQ,QAAQ,QAAQ,KAAK,IACvC,WAAW,KAAK,SAAS,IACzB,WAAWA,MAAK,SAAS;AAE3B,gBAAI,WAAW,GAAG;AAChB,uBACG,cACC,WAAW,KAAK,SAAS,IACzB,WAAWA,MAAK,SAAS,IAC3B,WACA;AAGF,yBAAW,KAAK,OAAO,KAAK,QAAQ;AACpC,yBAAW,KAAK,OAAO,KAAK,QAAQ;AAEpC,yBAAWA,MAAK,OAAO,KAAK,QAAQ;AACpC,yBAAWA,MAAK,OAAO,KAAK,QAAQ;AAAA,YAChD,WAAqB,WAAW,GAAG;AACvB,uBACE,MACA,cACA,WAAW,KAAK,SAAS,IACzB,WAAWA,MAAK,SAAS;AAG3B,yBAAW,KAAK,OAAO,KAAK,QAAQ;AACpC,yBAAW,KAAK,OAAO,KAAK,QAAQ;AAEpC,yBAAWA,MAAK,OAAO,KAAK,QAAQ;AACpC,yBAAWA,MAAK,OAAO,KAAK,QAAQ;AAAA,YAChD;AAAA,UACA,OAAe;AAEL,uBAAW,KAAK,KAAK,QAAQ,QAAQ,QAAQ,KAAK;AAElD,gBAAI,WAAW,GAAG;AAChB,uBACG,cACC,WAAW,KAAK,SAAS,IACzB,WAAWA,MAAK,SAAS,IAC3B,WACA;AAGF,yBAAW,KAAK,OAAO,KAAK,QAAQ;AACpC,yBAAW,KAAK,OAAO,KAAK,QAAQ;AAEpC,yBAAWA,MAAK,OAAO,KAAK,QAAQ;AACpC,yBAAWA,MAAK,OAAO,KAAK,QAAQ;AAAA,YAChD;AAAA,UACA;AAAA,QACA;AAAA,MACA;AAAA,IACA;AAIE,QAAI,QAAQ,UAAU,QAAQ;AAC9B,kBAAc,QAAQ;AACtB,SAAKhG,KAAI,GAAGA,KAAI,OAAOA,MAAK,KAAK;AAC/B,eAAS;AAGT,cAAQ,WAAWA,KAAI,MAAM;AAC7B,cAAQ,WAAWA,KAAI,MAAM;AAC7B,iBAAW,KAAK,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC,CAAC;AAE5D,UAAI,QAAQ,mBAAmB;AAE7B,YAAI,WAAW,EAAG,UAAS,cAAc,WAAWA,KAAI,SAAS,IAAI;AAAA,MAC3E,OAAW;AAEL,YAAI,WAAW;AACb,mBAAU,cAAc,WAAWA,KAAI,SAAS,IAAI,IAAK;AAAA,MACjE;AAGI,iBAAWA,KAAI,OAAO,KAAK,QAAQ;AACnC,iBAAWA,KAAI,OAAO,KAAK,QAAQ;AAAA,IACvC;AAIE,kBACE,KAAK,QAAQ,iCAAiC,0BAA0B;AAI1E,SAAKH,KAAI,GAAGA,KAAI,MAAMA,MAAK,KAAK;AAC9B,WAAK,WAAWA,KAAI,WAAW;AAC/B,MAAAmG,MAAK,WAAWnG,KAAI,WAAW;AAC/B,MAAA8E,KAAI,WAAW9E,KAAI,WAAW;AAG9B,YAAM,KAAK,IAAI8E,IAAG,QAAQ,mBAAmB;AAG7C,cAAQ,WAAW,KAAK,MAAM,IAAI,WAAWqB,MAAK,MAAM;AACxD,cAAQ,WAAW,KAAK,MAAM,IAAI,WAAWA,MAAK,MAAM;AAGxD,UAAI,gBAAgB,MAAM;AACxB,mBACE,KAAK,KAAK,QAAQ,QAAQ,QAAQ,KAAK,IACvC,WAAW,KAAK,SAAS,IACzB,WAAWA,MAAK,SAAS;AAE3B,YAAI,QAAQ,YAAY;AACtB,cAAI,QAAQ,gCAAgC;AAE1C,gBAAI,WAAW,GAAG;AAChB,uBACG,CAAC,cAAc,MAAM,KAAK,IAAI,IAAI,QAAQ,IAC3C,WACA,WAAW,KAAK,SAAS;AAAA,YACvC;AAAA,UACA,OAAe;AAEL,gBAAI,WAAW,GAAG;AAChB,uBAAU,CAAC,cAAc,MAAM,KAAK,IAAI,IAAI,QAAQ,IAAK;AAAA,YACrE;AAAA,UACA;AAAA,QACA,OAAa;AACL,cAAI,QAAQ,gCAAgC;AAE1C,gBAAI,WAAW,GAAG;AAChB,uBAAU,CAAC,cAAc,MAAO,WAAW,KAAK,SAAS;AAAA,YACrE;AAAA,UACA,OAAe;AAEL,gBAAI,WAAW,GAAG;AAChB,uBAAS,CAAC,cAAc;AAAA,YACpC;AAAA,UACA;AAAA,QACA;AAAA,MACA,OAAW;AACL,mBAAW,KAAK,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC,CAAC;AAE5D,YAAI,QAAQ,YAAY;AACtB,cAAI,QAAQ,gCAAgC;AAE1C,gBAAI,WAAW,GAAG;AAChB,uBACG,CAAC,cAAc,MAAM,KAAK,IAAI,IAAI,QAAQ,IAC3C,WACA,WAAW,KAAK,SAAS;AAAA,YACvC;AAAA,UACA,OAAe;AAEL,gBAAI,WAAW;AACb,uBAAU,CAAC,cAAc,MAAM,KAAK,IAAI,IAAI,QAAQ,IAAK;AAAA,UACrE;AAAA,QACA,OAAa;AACL,cAAI,QAAQ,gCAAgC;AAG1C,uBAAW;AACX,qBAAU,CAAC,cAAc,MAAO,WAAW,KAAK,SAAS;AAAA,UACnE,OAAe;AAGL,uBAAW;AACX,qBAAS,CAAC,cAAc;AAAA,UAClC;AAAA,QACA;AAAA,MACA;AAII,UAAI,WAAW,GAAG;AAEhB,mBAAW,KAAK,OAAO,KAAK,QAAQ;AACpC,mBAAW,KAAK,OAAO,KAAK,QAAQ;AAEpC,mBAAWA,MAAK,OAAO,KAAK,QAAQ;AACpC,mBAAWA,MAAK,OAAO,KAAK,QAAQ;AAAA,MAC1C;AAAA,IACA;AAIE,QAAI,OAAO,UAAU,UAAU,WAAW,MAAM;AAGhD,QAAI,gBAAgB,MAAM;AACxB,WAAKhG,KAAI,GAAGA,KAAI,OAAOA,MAAK,KAAK;AAC/B,YAAI,WAAWA,KAAI,UAAU,MAAM,GAAG;AACpC,kBAAQ,KAAK;AAAA,YACX,KAAK,IAAI,WAAWA,KAAI,OAAO,GAAG,CAAC,IACjC,KAAK,IAAI,WAAWA,KAAI,OAAO,GAAG,CAAC;AAAA;AAGvC,cAAI,QAAQ,WAAW;AACrB,uBAAWA,KAAI,OAAO,IACnB,WAAWA,KAAI,OAAO,IAAI,YAAa;AAC1C,uBAAWA,KAAI,OAAO,IACnB,WAAWA,KAAI,OAAO,IAAI,YAAa;AAAA,UACpD;AAEQ,qBACE,WAAWA,KAAI,SAAS,IACxB,KAAK;AAAA,aACF,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MAClD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MACpD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MAClD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO;AAAA;AAG7D,qBACE,KAAK;AAAA,aACF,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MAClD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MACpD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MAClD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO;AAAA,UACrE,IAAc;AAEN,sBAAa,MAAM,KAAK,IAAI,IAAI,QAAQ,KAAM,IAAI,KAAK,KAAK,QAAQ;AAGpE,iBACE,WAAWA,KAAI,MAAM,IACrB,WAAWA,KAAI,OAAO,KAAK,YAAY,QAAQ;AACjD,qBAAWA,KAAI,MAAM,IAAI;AAEzB,iBACE,WAAWA,KAAI,MAAM,IACrB,WAAWA,KAAI,OAAO,KAAK,YAAY,QAAQ;AACjD,qBAAWA,KAAI,MAAM,IAAI;AAAA,QACjC;AAAA,MACA;AAAA,IACA,OAAS;AACL,WAAKA,KAAI,GAAGA,KAAI,OAAOA,MAAK,KAAK;AAC/B,YAAI,WAAWA,KAAI,UAAU,MAAM,GAAG;AACpC,qBACE,WAAWA,KAAI,SAAS,IACxB,KAAK;AAAA,aACF,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MAClD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MACpD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MAClD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO;AAAA;AAG7D,qBACE,KAAK;AAAA,aACF,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MAClD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MACpD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MAClD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO;AAAA,UACrE,IAAc;AAEN,sBACG,WAAWA,KAAI,gBAAgB,IAAI,KAAK,IAAI,IAAI,QAAQ,KACxD,IAAI,KAAK,KAAK,QAAQ;AAGzB,qBAAWA,KAAI,gBAAgB,IAAI,KAAK;AAAA,YACtC;AAAA,YACA,KAAK;AAAA,cACF,aACE,KAAK,IAAI,WAAWA,KAAI,OAAO,GAAG,CAAC,IAClC,KAAK,IAAI,WAAWA,KAAI,OAAO,GAAG,CAAC,MACpC,IAAI,KAAK,KAAK,QAAQ;AAAA,YACrC;AAAA;AAIQ,iBACE,WAAWA,KAAI,MAAM,IACrB,WAAWA,KAAI,OAAO,KAAK,YAAY,QAAQ;AACjD,qBAAWA,KAAI,MAAM,IAAI;AAEzB,iBACE,WAAWA,KAAI,MAAM,IACrB,WAAWA,KAAI,OAAO,KAAK,YAAY,QAAQ;AACjD,qBAAWA,KAAI,MAAM,IAAI;AAAA,QACjC;AAAA,MACA;AAAA,IACA;AAGE,WAAO,CAAA;AAAA,EACT;;;;;;;;AC9wBA,MAAI,MAAM;AACV,MAAI,MAAM;AASV,UAAA,SAAiB,SAAU,QAAQ;AACjC,aAAS,UAAU,CAAA;AAEnB,QAAI,UAAU,MAAM,UAAU,MAAM,KAAK,SAAS,EAAE,MAAM,CAAC,GACzD,GACA,GACA;AAEF,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,IAAI,GAAG,KAAK;AAC1C,UAAI,CAAC,QAAQ,CAAC,EAAG;AAEjB,WAAK,KAAK,QAAQ,CAAC,EAAG,QAAO,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC;AAAA,IAClD;AAEE,WAAO;AAAA,EACT;AAQA,UAAA,mBAA2B,SAAU,UAAU;AAC7C,QAAI,gBAAgB,YAAY,OAAO,SAAS,eAAe;AAC7D,aAAO,EAAC,SAAS,gDAA+C;AAElE,QACE,oCAAoC,YACpC,OAAO,SAAS,mCAAmC;AAEnD,aAAO;AAAA,QACL,SACE;AAAA;AAGN,QAAI,iBAAiB,YAAY,OAAO,SAAS,gBAAgB;AAC/D,aAAO,EAAC,SAAS,iDAAgD;AAEnE,QACE,yBAAyB,YACzB,OAAO,SAAS,wBAAwB;AAExC,aAAO;AAAA,QACL,SAAS;AAAA;AAGb,QACE,kBAAkB,YAClB,EAAE,OAAO,SAAS,iBAAiB,YAAY,SAAS,gBAAgB;AAExE,aAAO,EAAC,SAAS,sDAAqD;AAExE,QACE,uBAAuB,YACvB,OAAO,SAAS,sBAAsB;AAEtC,aAAO,EAAC,SAAS,uDAAsD;AAEzE,QACE,aAAa,YACb,EAAE,OAAO,SAAS,YAAY,YAAY,SAAS,WAAW;AAE9D,aAAO,EAAC,SAAS,iDAAgD;AAEnE,QACE,cAAc,YACd,EAAE,OAAO,SAAS,aAAa,YAAY,SAAS,YAAY;AAEhE,aAAO,EAAC,SAAS,kDAAiD;AAEpE,QACE,uBAAuB,YACvB,OAAO,SAAS,sBAAsB;AAEtC,aAAO,EAAC,SAAS,uDAAsD;AAEzE,QACE,oBAAoB,YACpB,EACE,OAAO,SAAS,mBAAmB,YACnC,SAAS,kBAAkB;AAG7B,aAAO,EAAC,SAAS,wDAAuD;AAE1E,WAAO;AAAA,EACT;AASA,UAAA,oBAA4B,SAAU,OAAO,eAAe;AAC1D,QAAI,QAAQ,MAAM;AAClB,QAAI,OAAO,MAAM;AACjB,QAAI,QAAQ,CAAA;AACZ,QAAIkB;AAIJ,QAAI,aAAa,IAAI,aAAa,QAAQ,GAAG;AAC7C,QAAI,aAAa,IAAI,aAAa,OAAO,GAAG;AAG5C,IAAAA,KAAI;AACJ,UAAM,YAAY,SAAU,MAAM,MAAM;AAEtC,YAAM,IAAI,IAAIA;AAGd,iBAAWA,EAAC,IAAI,KAAK;AACrB,iBAAWA,KAAI,CAAC,IAAI,KAAK;AACzB,iBAAWA,KAAI,CAAC,IAAI;AACpB,iBAAWA,KAAI,CAAC,IAAI;AACpB,iBAAWA,KAAI,CAAC,IAAI;AACpB,iBAAWA,KAAI,CAAC,IAAI;AACpB,iBAAWA,KAAI,CAAC,IAAI;AACpB,iBAAWA,KAAI,CAAC,IAAI;AACpB,iBAAWA,KAAI,CAAC,IAAI,KAAK,QAAQ;AACjC,iBAAWA,KAAI,CAAC,IAAI,KAAK,QAAQ,IAAI;AACrC,MAAAA,MAAK;AAAA,IACT,CAAG;AAGD,IAAAA,KAAI;AACJ,UAAM,YAAY,SAAU,MAAM,MAAM,QAAQ,QAAQ,IAAI,IAAI,GAAG;AACjE,UAAI,KAAK,MAAM,MAAM;AACrB,UAAI,KAAK,MAAM,MAAM;AAErB,UAAI,SAAS,cAAc,MAAM,MAAM,QAAQ,QAAQ,IAAI,IAAI,CAAC;AAGhE,iBAAW,KAAK,CAAC,KAAK;AACtB,iBAAW,KAAK,CAAC,KAAK;AAGtB,iBAAWA,EAAC,IAAI;AAChB,iBAAWA,KAAI,CAAC,IAAI;AACpB,iBAAWA,KAAI,CAAC,IAAI;AACpB,MAAAA,MAAK;AAAA,IACT,CAAG;AAED,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA;EAEX;AASA,UAAA,sBAA8B,SAAU,OAAO,YAAY,eAAe;AACxE,QAAI,IAAI;AAER,UAAM,yBAAyB,SAAU,MAAM,MAAM;AACnD,WAAK,IAAI,WAAW,CAAC;AACrB,WAAK,IAAI,WAAW,IAAI,CAAC;AAEzB,WAAK;AAEL,aAAO,gBAAgB,cAAc,MAAM,IAAI,IAAI;AAAA,IACvD,CAAG;AAAA,EACH;AAQA,UAAA,qBAA6B,SAAU,OAAO,YAAY;AACxD,QAAI,IAAI;AAER,UAAM,YAAY,SAAU,MAAM,MAAM;AACtC,iBAAW,CAAC,IAAI,KAAK;AACrB,iBAAW,IAAI,CAAC,IAAI,KAAK;AAEzB,WAAK;AAAA,IACT,CAAG;AAAA,EACH;AAUA,UAAA,uBAA+B,SAAU,OAAO,YAAY,eAAe;AACzE,QAAI,QAAQ,MAAM,MAAK,GACrB,YAAY,CAAA;AAEd,aAAS,IAAI,GAAGA,KAAI,GAAG,IAAI,WAAW,QAAQ,IAAI,GAAG,KAAK,KAAK;AAC7D,UAAI,eAAe;AACjB,YAAI,UAAU,OAAO,OAAO,CAAA,GAAI,MAAM,kBAAkB,MAAMA,EAAC,CAAC,CAAC;AACjE,gBAAQ,IAAI,WAAW,CAAC;AACxB,gBAAQ,IAAI,WAAW,IAAI,CAAC;AAC5B,kBAAU,cAAc,MAAMA,EAAC,GAAG,OAAO;AACzC,kBAAU,MAAMA,EAAC,CAAC,IAAI;AAAA,UACpB,GAAG,QAAQ;AAAA,UACX,GAAG,QAAQ;AAAA;MAEnB,OAAW;AACL,kBAAU,MAAMA,EAAC,CAAC,IAAI;AAAA,UACpB,GAAG,WAAW,CAAC;AAAA,UACf,GAAG,WAAW,IAAI,CAAC;AAAA;MAE3B;AAEI,MAAAA;AAAA,IACJ;AAEE,WAAO;AAAA,EACT;AAQA,UAAA,eAAuB,SAAS,aAAa,IAAI;AAC/C,QAAI,OAAO,OAAO,OAAO,OAAO;AAChC,QAAI,OAAO,GAAG,SAAQ;AACtB,QAAI,YAAY,KAAK;AAAA,MACnB,IAAI,KAAK,CAAC,MAAM,OAAO,eAAe,GAAG,EAAC,MAAM,kBAAiB,CAAC;AAAA;AAEpE,QAAI0E,UAAS,IAAI,OAAO,SAAS;AACjC,SAAK,gBAAgB,SAAS;AAE9B,WAAOA;AAAA,EACT;;;;;;;;AChQA,aAAiB;AAAA,IACf,YAAY;AAAA,IACZ,gCAAgC;AAAA,IAChC,aAAa;AAAA,IACb,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,SAAS;AAAA,IACT,UAAU;AAAA,IACV,mBAAmB;AAAA,IACnB,gBAAgB;AAAA;;;;;;;;ACRlB,MAAIK,WAAUC,cAAAA,eAAA;AACd,MAAI,yBACFC,cAAAA,eAAA,EAAoC;AACtC,MAAIJ,WAAUK,eAAA;AACd,MAAIC,WAAUC,eAAA;AAEd,MAAIC,oBAAmBC,gBAAA;AAcvB,WAAS,0BAA0BC,SAAQ,OAAO,QAAQ;AACxD,QAAI,CAACR,SAAQ,KAAK;AAChB,YAAM,IAAI;AAAA,QACR;AAAA;AAGJ,QAAI,OAAO,WAAW,SAAU,UAAS,EAAC,YAAY,OAAM;AAE5D,QAAI,aAAa,OAAO;AAExB,QAAI,OAAO,eAAe;AACxB,YAAM,IAAI;AAAA,QACR;AAAA;AAGJ,QAAI,cAAc;AAChB,YAAM,IAAI;AAAA,QACR;AAAA;AAGJ,QAAI,gBAAgB;AAAA,MAClB,mBAAmB,SAAS,OAAO,gBAAgB;AAAA,IACvD,EAAI;AAEF,QAAI,gBACF,OAAO,OAAO,kBAAkB,aAAa,OAAO,gBAAgB;AAGtE,QAAI,WAAWI,SAAQ,OAAO,CAAA,GAAIE,mBAAkB,OAAO,QAAQ;AACnE,QAAI,kBAAkBF,SAAQ,iBAAiB,QAAQ;AAEvD,QAAI;AACF,YAAM,IAAI;AAAA,QACR,oCAAoC,gBAAgB;AAAA;AAIxD,QAAI,WAAWA,SAAQ,kBAAkB,OAAO,aAAa;AAE7D,QAAI;AAGJ,SAAK,IAAI,GAAG,IAAI,YAAY;AAC1B,MAAAN,SAAQ,UAAU,SAAS,OAAO,SAAS,KAAK;AAGlD,QAAIU,SAAQ;AACV,MAAAJ,SAAQ,oBAAoB,OAAO,SAAS,OAAO,aAAa;AAChE;AAAA,IACJ;AAEE,WAAOA,SAAQ,qBAAqB,OAAO,SAAS,KAAK;AAAA,EAC3D;AAQA,WAAS,cAAc,OAAO;AAC5B,QAAI,QAAQ,OAAO,UAAU,WAAW,QAAQ,MAAM;AAEtD,WAAO;AAAA,MACL,mBAAmB,QAAQ;AAAA,MAC3B,mBAAmB;AAAA,MACnB,SAAS;AAAA,MACT,cAAc;AAAA,MACd,UAAU,IAAI,KAAK,IAAI,KAAK;AAAA;EAEhC;AAKA,MAAI,oBAAoB,0BAA0B,KAAK,MAAM,KAAK;AAClE,oBAAkB,SAAS,0BAA0B,KAAK,MAAM,IAAI;AACpE,oBAAkB,gBAAgB;AAElC,gCAAiB;;;;;;;;;ACnGjB,cAAiB,SAAST,UAAS;AACjC,QAAI,OAAO;AAEX,QAAI,aAAa,CAAA;AAEjB,KAAC,WAAY;AAYf,UAAI,SAAS;AACb,UAAI,SAAS;AACb,UAAI,UAAU;AACd,UAAI,UAAU;AACd,UAAI,cAAc;AAClB,UAAI,cAAc;AAClB,UAAI,YAAY;AAChB,UAAI,mBAAmB;AACvB,UAAI,YAAY;AAChB,UAAI,aAAa;AAEjB,UAAI,cAAc;AAClB,UAAI,cAAc;AAClB,UAAI,cAAc;AAElB,UAAI,cAAc;AAClB,UAAI,kBAAkB;AACtB,UAAI,kBAAkB;AACtB,UAAI,cAAc;AAClB,UAAI,sBAAsB;AAC1B,UAAI,qBAAqB;AACzB,UAAI,cAAc;AAClB,UAAI,uBAAuB;AAC3B,UAAI,uBAAuB;AAE3B,UAAI,uBAAuB;AAK3B,UAAI,MAAM;AACV,UAAI,MAAM;AACV,UAAI,MAAM;AAEV,UAAI,YAAY;AAUhB,iBAAW,UAAU,SAASG,SAAQ,SAAS,YAAY,YAAY;AAErE,YAAI,GAAG,GAAG/F,IAAG,IAAIgG,KAAI,IAAInG,IAAG8E,IAAG,GAAG;AAElC,YAAI,QAAQ,WAAW,QACrB,OAAO,WAAW;AAEpB,YAAI,cAAc,QAAQ;AAE1B,YAAI,eAAe,QAAQ,iBAAiB,QAAQ;AAEpD,YAAI,yBAAyB,aAAa,OAAO,OAAO,KAAK,UAAU;AAEvE,YAAI,eAAe,CAAA;AAMnB,aAAK3E,KAAI,GAAGA,KAAI,OAAOA,MAAK,KAAK;AAC/B,qBAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO;AACpD,qBAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO;AACpD,qBAAWA,KAAI,OAAO,IAAI;AAC1B,qBAAWA,KAAI,OAAO,IAAI;AAAA,QAC9B;AAGE,YAAI,QAAQ,gCAAgC;AAC1C,oCAA0B;AAC1B,eAAKA,KAAI,GAAGA,KAAI,OAAOA,MAAK,KAAK;AAC/B,uCAA2B,WAAWA,KAAI,SAAS;AAAA,UACzD;AAEI,qCAA2B,QAAQ;AAAA,QACvC;AAKE,YAAI,QAAQ,mBAAmB;AAE7B,cAAI,OAAO,UACT,OAAO,WACP,OAAO,UACP,OAAO,WACP,GACA,IACA;AAGF,eAAKA,KAAI,GAAGA,KAAI,OAAOA,MAAK,KAAK;AAC/B,mBAAO,KAAK,IAAI,MAAM,WAAWA,KAAI,MAAM,CAAC;AAC5C,mBAAO,KAAK,IAAI,MAAM,WAAWA,KAAI,MAAM,CAAC;AAC5C,mBAAO,KAAK,IAAI,MAAM,WAAWA,KAAI,MAAM,CAAC;AAC5C,mBAAO,KAAK,IAAI,MAAM,WAAWA,KAAI,MAAM,CAAC;AAAA,UAClD;AAGI,cAAI,KAAK,OAAO,MACd,KAAK,OAAO;AACd,cAAI,KAAK,IAAI;AACX,qBAAS,KAAK,MAAM;AACpB,mBAAO,OAAO;AAAA,UACpB,OAAW;AACL,qBAAS,KAAK,MAAM;AACpB,mBAAO,OAAO;AAAA,UACpB;AAGI,uBAAa,IAAI,WAAW,IAAI;AAChC,uBAAa,IAAI,eAAe,KAAK,OAAO,QAAQ;AACpD,uBAAa,IAAI,eAAe,KAAK,OAAO,QAAQ;AACpD,uBAAa,IAAI,WAAW,IAAI,KAAK,IAAI,OAAO,MAAM,OAAO,IAAI;AACjE,uBAAa,IAAI,mBAAmB,IAAI;AACxC,uBAAa,IAAI,kBAAkB,IAAI;AACvC,uBAAa,IAAI,WAAW,IAAI;AAChC,uBAAa,IAAI,oBAAoB,IAAI;AACzC,uBAAa,IAAI,oBAAoB,IAAI;AAGzC,cAAI;AACJ,eAAKA,KAAI,GAAGA,KAAI,OAAOA,MAAK,KAAK;AAE/B,gBAAI;AACJ,kCAAsB;AAEtB,mBAAO,MAAM;AAIX,kBAAI,aAAa,IAAI,kBAAkB,KAAK,GAAG;AAQ7C,oBAAI,WAAWA,KAAI,MAAM,IAAI,aAAa,IAAI,eAAe,GAAG;AAC9D,sBAAI,WAAWA,KAAI,MAAM,IAAI,aAAa,IAAI,eAAe,GAAG;AAE9D,wBAAI,aAAa,IAAI,kBAAkB;AAAA,kBACrD,OAAmB;AAEL,wBAAI,aAAa,IAAI,kBAAkB,IAAI;AAAA,kBACzD;AAAA,gBACA,OAAiB;AACL,sBAAI,WAAWA,KAAI,MAAM,IAAI,aAAa,IAAI,eAAe,GAAG;AAE9D,wBAAI,aAAa,IAAI,kBAAkB,IAAI,MAAM;AAAA,kBAC/D,OAAmB;AAEL,wBAAI,aAAa,IAAI,kBAAkB,IAAI,MAAM;AAAA,kBAC/D;AAAA,gBACA;AAGU,6BAAa,IAAI,oBAAoB,KAClC,aAAa,IAAI,oBAAoB,IACpC,aAAa,IAAI,WAAW,IAC5B,WAAWA,KAAI,MAAM,IAAI,WAAWA,KAAI,SAAS,MAClD,aAAa,IAAI,WAAW,IAAI,WAAWA,KAAI,SAAS;AAE3D,6BAAa,IAAI,oBAAoB,KAClC,aAAa,IAAI,oBAAoB,IACpC,aAAa,IAAI,WAAW,IAC5B,WAAWA,KAAI,MAAM,IAAI,WAAWA,KAAI,SAAS,MAClD,aAAa,IAAI,WAAW,IAAI,WAAWA,KAAI,SAAS;AAE3D,6BAAa,IAAI,WAAW,KAAK,WAAWA,KAAI,SAAS;AAGzD,oBAAI;AACJ;AAAA,cACV,OAAe;AAIL,oBAAI,aAAa,IAAI,WAAW,IAAI,GAAG;AAGrC,+BAAa,IAAI,WAAW,IAAIA;AAChC;AAAA,gBACZ,OAAiB;AASL,+BAAa,IAAI,kBAAkB,IAAI,IAAI;AAC3C,kBAAA2E,KAAI,aAAa,IAAI,WAAW,IAAI;AAMpC,sBAAI,aAAa,IAAI,kBAAkB;AAEvC,+BAAa,IAAI,WAAW,IAAI;AAChC,+BAAa,IAAI,eAAe,IAC9B,aAAa,IAAI,eAAe,IAAIA;AACtC,+BAAa,IAAI,eAAe,IAC9B,aAAa,IAAI,eAAe,IAAIA;AACtC,+BAAa,IAAI,WAAW,IAAIA;AAChC,+BAAa,IAAI,mBAAmB,IAAI,IAAI;AAC5C,+BAAa,IAAI,kBAAkB,IAAI;AACvC,+BAAa,IAAI,WAAW,IAAI;AAChC,+BAAa,IAAI,oBAAoB,IAAI;AACzC,+BAAa,IAAI,oBAAoB,IAAI;AAGzC,uBAAK;AACL,+BAAa,IAAI,WAAW,IAAI;AAChC,+BAAa,IAAI,eAAe,IAC9B,aAAa,IAAI,eAAe,IAAIA;AACtC,+BAAa,IAAI,eAAe,IAC9B,aAAa,IAAI,eAAe,IAAIA;AACtC,+BAAa,IAAI,WAAW,IAAIA;AAChC,+BAAa,IAAI,mBAAmB,IAAI,IAAI;AAC5C,+BAAa,IAAI,kBAAkB,IAAI;AACvC,+BAAa,IAAI,WAAW,IAAI;AAChC,+BAAa,IAAI,oBAAoB,IAAI;AACzC,+BAAa,IAAI,oBAAoB,IAAI;AAGzC,uBAAK;AACL,+BAAa,IAAI,WAAW,IAAI;AAChC,+BAAa,IAAI,eAAe,IAC9B,aAAa,IAAI,eAAe,IAAIA;AACtC,+BAAa,IAAI,eAAe,IAC9B,aAAa,IAAI,eAAe,IAAIA;AACtC,+BAAa,IAAI,WAAW,IAAIA;AAChC,+BAAa,IAAI,mBAAmB,IAAI,IAAI;AAC5C,+BAAa,IAAI,kBAAkB,IAAI;AACvC,+BAAa,IAAI,WAAW,IAAI;AAChC,+BAAa,IAAI,oBAAoB,IAAI;AACzC,+BAAa,IAAI,oBAAoB,IAAI;AAGzC,uBAAK;AACL,+BAAa,IAAI,WAAW,IAAI;AAChC,+BAAa,IAAI,eAAe,IAC9B,aAAa,IAAI,eAAe,IAAIA;AACtC,+BAAa,IAAI,eAAe,IAC9B,aAAa,IAAI,eAAe,IAAIA;AACtC,+BAAa,IAAI,WAAW,IAAIA;AAChC,+BAAa,IAAI,mBAAmB,IAClC,aAAa,IAAI,mBAAmB;AACtC,+BAAa,IAAI,kBAAkB,IAAI;AACvC,+BAAa,IAAI,WAAW,IAAI;AAChC,+BAAa,IAAI,oBAAoB,IAAI;AACzC,+BAAa,IAAI,oBAAoB,IAAI;AAEzC,uBAAK;AAOL,sBACE,WAAW,aAAa,IAAI,WAAW,IAAI,MAAM,IACjD,aAAa,IAAI,eAAe,GAChC;AACA,wBACE,WAAW,aAAa,IAAI,WAAW,IAAI,MAAM,IACjD,aAAa,IAAI,eAAe,GAChC;AAEA,0BAAI,aAAa,IAAI,kBAAkB;AAAA,oBACvD,OAAqB;AAEL,0BAAI,aAAa,IAAI,kBAAkB,IAAI;AAAA,oBAC3D;AAAA,kBACA,OAAmB;AACL,wBACE,WAAW,aAAa,IAAI,WAAW,IAAI,MAAM,IACjD,aAAa,IAAI,eAAe,GAChC;AAEA,0BAAI,aAAa,IAAI,kBAAkB,IAAI,MAAM;AAAA,oBACjE,OAAqB;AAEL,0BAAI,aAAa,IAAI,kBAAkB,IAAI,MAAM;AAAA,oBACjE;AAAA,kBACA;AAGY,+BAAa,IAAI,WAAW,IAC1B,WAAW,aAAa,IAAI,WAAW,IAAI,SAAS;AACtD,+BAAa,IAAI,oBAAoB,IACnC,WAAW,aAAa,IAAI,WAAW,IAAI,MAAM;AACnD,+BAAa,IAAI,oBAAoB,IACnC,WAAW,aAAa,IAAI,WAAW,IAAI,MAAM;AAEnD,+BAAa,IAAI,WAAW,IAAI,aAAa,IAAI,WAAW;AAC5D,+BAAa,IAAI,WAAW,IAAI;AAGhC,sBAAI,WAAW3E,KAAI,MAAM,IAAI,aAAa,IAAI,eAAe,GAAG;AAC9D,wBAAI,WAAWA,KAAI,MAAM,IAAI,aAAa,IAAI,eAAe,GAAG;AAE9D,2BAAK,aAAa,IAAI,kBAAkB;AAAA,oBACxD,OAAqB;AAEL,2BAAK,aAAa,IAAI,kBAAkB,IAAI;AAAA,oBAC5D;AAAA,kBACA,OAAmB;AACL,wBAAI,WAAWA,KAAI,MAAM,IAAI,aAAa,IAAI,eAAe,GAAG;AAE9D,2BAAK,aAAa,IAAI,kBAAkB,IAAI,MAAM;AAAA,oBAClE,OAAqB;AAEL,2BAAK,aAAa,IAAI,kBAAkB,IAAI,MAAM;AAAA,oBAClE;AAAA,kBACA;AAEY,sBAAI,MAAM,IAAI;AAGZ,wBAAI,uBAAuB;AACzB,0BAAI;AACJ;AAAA,oBAChB,OAAqB;AAGL,4CAAsB;AACtB;AAAA,oBAChB;AAAA,kBACA;AAIY,+BAAa,KAAK,WAAW,IAAIA;AACjC;AAAA,gBACZ;AAAA,cACA;AAAA,YACA;AAAA,UACA;AAAA,QACA;AAME,YAAI,QAAQ,mBAAmB;AAC7B,wBAAc,QAAQ;AAGtB,eAAKA,KAAI,GAAGA,KAAI,OAAOA,MAAK,KAAK;AAG/B,gBAAI;AACJ,mBAAO,MAAM;AACX,kBAAI,aAAa,IAAI,kBAAkB,KAAK,GAAG;AAI7C,2BACE,KAAK;AAAA,kBACH,WAAWA,KAAI,MAAM,IAAI,aAAa,IAAI,oBAAoB;AAAA,kBAC9D;AAAA,oBAEF,KAAK;AAAA,kBACH,WAAWA,KAAI,MAAM,IAAI,aAAa,IAAI,oBAAoB;AAAA,kBAC9D;AAAA;AAGJ,oBAAI,aAAa,IAAI,WAAW;AAEhC,oBAAK,IAAI,IAAI,IAAK,WAAW,cAAc;AAGzC,0BACE,WAAWA,KAAI,MAAM,IAAI,aAAa,IAAI,oBAAoB;AAChE,0BACE,WAAWA,KAAI,MAAM,IAAI,aAAa,IAAI,oBAAoB;AAEhE,sBAAI,gBAAgB,MAAM;AAExB,wBAAI,WAAW,GAAG;AAChB,+BACG,cACC,WAAWA,KAAI,SAAS,IACxB,aAAa,IAAI,WAAW,IAC9B;AAEF,iCAAWA,KAAI,OAAO,KAAK,QAAQ;AACnC,iCAAWA,KAAI,OAAO,KAAK,QAAQ;AAAA,oBACnD,WAAyB,WAAW,GAAG;AACvB,+BACG,CAAC,cACA,WAAWA,KAAI,SAAS,IACxB,aAAa,IAAI,WAAW,IAC9B,KAAK,KAAK,QAAQ;AAEpB,iCAAWA,KAAI,OAAO,KAAK,QAAQ;AACnC,iCAAWA,KAAI,OAAO,KAAK,QAAQ;AAAA,oBACnD;AAAA,kBACA,OAAmB;AAEL,wBAAI,WAAW,GAAG;AAChB,+BACG,cACC,WAAWA,KAAI,SAAS,IACxB,aAAa,IAAI,WAAW,IAC9B;AAEF,iCAAWA,KAAI,OAAO,KAAK,QAAQ;AACnC,iCAAWA,KAAI,OAAO,KAAK,QAAQ;AAAA,oBACnD;AAAA,kBACA;AAGY,sBAAI,aAAa,IAAI,mBAAmB;AACxC,sBAAI,IAAI,EAAG;AAEX;AAAA,gBACZ,OAAiB;AAEL,sBAAI,aAAa,IAAI,kBAAkB;AACvC;AAAA,gBACZ;AAAA,cACA,OAAe;AAGL,qBAAK,aAAa,IAAI,WAAW;AAEjC,oBAAI,MAAM,KAAK,OAAOA,IAAG;AACvB,0BAAQ,WAAWA,KAAI,MAAM,IAAI,WAAW,KAAK,MAAM;AACvD,0BAAQ,WAAWA,KAAI,MAAM,IAAI,WAAW,KAAK,MAAM;AAEvD,6BAAW,QAAQ,QAAQ,QAAQ;AAEnC,sBAAI,gBAAgB,MAAM;AAExB,wBAAI,WAAW,GAAG;AAChB,+BACG,cACC,WAAWA,KAAI,SAAS,IACxB,WAAW,KAAK,SAAS,IAC3B;AAEF,iCAAWA,KAAI,OAAO,KAAK,QAAQ;AACnC,iCAAWA,KAAI,OAAO,KAAK,QAAQ;AAAA,oBACnD,WAAyB,WAAW,GAAG;AACvB,+BACG,CAAC,cACA,WAAWA,KAAI,SAAS,IACxB,WAAW,KAAK,SAAS,IAC3B,KAAK,KAAK,QAAQ;AAEpB,iCAAWA,KAAI,OAAO,KAAK,QAAQ;AACnC,iCAAWA,KAAI,OAAO,KAAK,QAAQ;AAAA,oBACnD;AAAA,kBACA,OAAmB;AAEL,wBAAI,WAAW,GAAG;AAChB,+BACG,cACC,WAAWA,KAAI,SAAS,IACxB,WAAW,KAAK,SAAS,IAC3B;AAEF,iCAAWA,KAAI,OAAO,KAAK,QAAQ;AACnC,iCAAWA,KAAI,OAAO,KAAK,QAAQ;AAAA,oBACnD;AAAA,kBACA;AAAA,gBACA;AAGU,oBAAI,aAAa,IAAI,mBAAmB;AAExC,oBAAI,IAAI,EAAG;AAEX;AAAA,cACV;AAAA,YACA;AAAA,UACA;AAAA,QACA,OAAS;AACL,wBAAc,QAAQ;AAGtB,eAAK,KAAK,GAAG,KAAK,OAAO,MAAM,KAAK;AAClC,iBAAKgG,MAAK,GAAGA,MAAK,IAAIA,OAAM,KAAK;AAE/B,sBAAQ,WAAW,KAAK,MAAM,IAAI,WAAWA,MAAK,MAAM;AACxD,sBAAQ,WAAW,KAAK,MAAM,IAAI,WAAWA,MAAK,MAAM;AAExD,kBAAI,gBAAgB,MAAM;AAExB,2BACE,KAAK,KAAK,QAAQ,QAAQ,QAAQ,KAAK,IACvC,WAAW,KAAK,SAAS,IACzB,WAAWA,MAAK,SAAS;AAE3B,oBAAI,WAAW,GAAG;AAChB,2BACG,cACC,WAAW,KAAK,SAAS,IACzB,WAAWA,MAAK,SAAS,IAC3B,WACA;AAGF,6BAAW,KAAK,OAAO,KAAK,QAAQ;AACpC,6BAAW,KAAK,OAAO,KAAK,QAAQ;AAEpC,6BAAWA,MAAK,OAAO,KAAK,QAAQ;AACpC,6BAAWA,MAAK,OAAO,KAAK,QAAQ;AAAA,gBAChD,WAAqB,WAAW,GAAG;AACvB,2BACE,MACA,cACA,WAAW,KAAK,SAAS,IACzB,WAAWA,MAAK,SAAS;AAG3B,6BAAW,KAAK,OAAO,KAAK,QAAQ;AACpC,6BAAW,KAAK,OAAO,KAAK,QAAQ;AAEpC,6BAAWA,MAAK,OAAO,KAAK,QAAQ;AACpC,6BAAWA,MAAK,OAAO,KAAK,QAAQ;AAAA,gBAChD;AAAA,cACA,OAAe;AAEL,2BAAW,KAAK,KAAK,QAAQ,QAAQ,QAAQ,KAAK;AAElD,oBAAI,WAAW,GAAG;AAChB,2BACG,cACC,WAAW,KAAK,SAAS,IACzB,WAAWA,MAAK,SAAS,IAC3B,WACA;AAGF,6BAAW,KAAK,OAAO,KAAK,QAAQ;AACpC,6BAAW,KAAK,OAAO,KAAK,QAAQ;AAEpC,6BAAWA,MAAK,OAAO,KAAK,QAAQ;AACpC,6BAAWA,MAAK,OAAO,KAAK,QAAQ;AAAA,gBAChD;AAAA,cACA;AAAA,YACA;AAAA,UACA;AAAA,QACA;AAIE,YAAI,QAAQ,UAAU,QAAQ;AAC9B,sBAAc,QAAQ;AACtB,aAAKhG,KAAI,GAAGA,KAAI,OAAOA,MAAK,KAAK;AAC/B,mBAAS;AAGT,kBAAQ,WAAWA,KAAI,MAAM;AAC7B,kBAAQ,WAAWA,KAAI,MAAM;AAC7B,qBAAW,KAAK,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC,CAAC;AAE5D,cAAI,QAAQ,mBAAmB;AAE7B,gBAAI,WAAW,EAAG,UAAS,cAAc,WAAWA,KAAI,SAAS,IAAI;AAAA,UAC3E,OAAW;AAEL,gBAAI,WAAW;AACb,uBAAU,cAAc,WAAWA,KAAI,SAAS,IAAI,IAAK;AAAA,UACjE;AAGI,qBAAWA,KAAI,OAAO,KAAK,QAAQ;AACnC,qBAAWA,KAAI,OAAO,KAAK,QAAQ;AAAA,QACvC;AAIE,sBACE,KAAK,QAAQ,iCAAiC,0BAA0B;AAI1E,aAAKH,KAAI,GAAGA,KAAI,MAAMA,MAAK,KAAK;AAC9B,eAAK,WAAWA,KAAI,WAAW;AAC/B,UAAAmG,MAAK,WAAWnG,KAAI,WAAW;AAC/B,UAAA8E,KAAI,WAAW9E,KAAI,WAAW;AAG9B,gBAAM,KAAK,IAAI8E,IAAG,QAAQ,mBAAmB;AAG7C,kBAAQ,WAAW,KAAK,MAAM,IAAI,WAAWqB,MAAK,MAAM;AACxD,kBAAQ,WAAW,KAAK,MAAM,IAAI,WAAWA,MAAK,MAAM;AAGxD,cAAI,gBAAgB,MAAM;AACxB,uBACE,KAAK,KAAK,QAAQ,QAAQ,QAAQ,KAAK,IACvC,WAAW,KAAK,SAAS,IACzB,WAAWA,MAAK,SAAS;AAE3B,gBAAI,QAAQ,YAAY;AACtB,kBAAI,QAAQ,gCAAgC;AAE1C,oBAAI,WAAW,GAAG;AAChB,2BACG,CAAC,cAAc,MAAM,KAAK,IAAI,IAAI,QAAQ,IAC3C,WACA,WAAW,KAAK,SAAS;AAAA,gBACvC;AAAA,cACA,OAAe;AAEL,oBAAI,WAAW,GAAG;AAChB,2BAAU,CAAC,cAAc,MAAM,KAAK,IAAI,IAAI,QAAQ,IAAK;AAAA,gBACrE;AAAA,cACA;AAAA,YACA,OAAa;AACL,kBAAI,QAAQ,gCAAgC;AAE1C,oBAAI,WAAW,GAAG;AAChB,2BAAU,CAAC,cAAc,MAAO,WAAW,KAAK,SAAS;AAAA,gBACrE;AAAA,cACA,OAAe;AAEL,oBAAI,WAAW,GAAG;AAChB,2BAAS,CAAC,cAAc;AAAA,gBACpC;AAAA,cACA;AAAA,YACA;AAAA,UACA,OAAW;AACL,uBAAW,KAAK,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC,CAAC;AAE5D,gBAAI,QAAQ,YAAY;AACtB,kBAAI,QAAQ,gCAAgC;AAE1C,oBAAI,WAAW,GAAG;AAChB,2BACG,CAAC,cAAc,MAAM,KAAK,IAAI,IAAI,QAAQ,IAC3C,WACA,WAAW,KAAK,SAAS;AAAA,gBACvC;AAAA,cACA,OAAe;AAEL,oBAAI,WAAW;AACb,2BAAU,CAAC,cAAc,MAAM,KAAK,IAAI,IAAI,QAAQ,IAAK;AAAA,cACrE;AAAA,YACA,OAAa;AACL,kBAAI,QAAQ,gCAAgC;AAG1C,2BAAW;AACX,yBAAU,CAAC,cAAc,MAAO,WAAW,KAAK,SAAS;AAAA,cACnE,OAAe;AAGL,2BAAW;AACX,yBAAS,CAAC,cAAc;AAAA,cAClC;AAAA,YACA;AAAA,UACA;AAII,cAAI,WAAW,GAAG;AAEhB,uBAAW,KAAK,OAAO,KAAK,QAAQ;AACpC,uBAAW,KAAK,OAAO,KAAK,QAAQ;AAEpC,uBAAWA,MAAK,OAAO,KAAK,QAAQ;AACpC,uBAAWA,MAAK,OAAO,KAAK,QAAQ;AAAA,UAC1C;AAAA,QACA;AAIE,YAAI,OAAO,UAAU,UAAU,WAAW,MAAM;AAGhD,YAAI,gBAAgB,MAAM;AACxB,eAAKhG,KAAI,GAAGA,KAAI,OAAOA,MAAK,KAAK;AAC/B,gBAAI,WAAWA,KAAI,UAAU,MAAM,GAAG;AACpC,sBAAQ,KAAK;AAAA,gBACX,KAAK,IAAI,WAAWA,KAAI,OAAO,GAAG,CAAC,IACjC,KAAK,IAAI,WAAWA,KAAI,OAAO,GAAG,CAAC;AAAA;AAGvC,kBAAI,QAAQ,WAAW;AACrB,2BAAWA,KAAI,OAAO,IACnB,WAAWA,KAAI,OAAO,IAAI,YAAa;AAC1C,2BAAWA,KAAI,OAAO,IACnB,WAAWA,KAAI,OAAO,IAAI,YAAa;AAAA,cACpD;AAEQ,yBACE,WAAWA,KAAI,SAAS,IACxB,KAAK;AAAA,iBACF,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MAClD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MACpD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MAClD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO;AAAA;AAG7D,yBACE,KAAK;AAAA,iBACF,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MAClD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MACpD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MAClD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO;AAAA,cACrE,IAAc;AAEN,0BAAa,MAAM,KAAK,IAAI,IAAI,QAAQ,KAAM,IAAI,KAAK,KAAK,QAAQ;AAGpE,qBACE,WAAWA,KAAI,MAAM,IACrB,WAAWA,KAAI,OAAO,KAAK,YAAY,QAAQ;AACjD,yBAAWA,KAAI,MAAM,IAAI;AAEzB,qBACE,WAAWA,KAAI,MAAM,IACrB,WAAWA,KAAI,OAAO,KAAK,YAAY,QAAQ;AACjD,yBAAWA,KAAI,MAAM,IAAI;AAAA,YACjC;AAAA,UACA;AAAA,QACA,OAAS;AACL,eAAKA,KAAI,GAAGA,KAAI,OAAOA,MAAK,KAAK;AAC/B,gBAAI,WAAWA,KAAI,UAAU,MAAM,GAAG;AACpC,yBACE,WAAWA,KAAI,SAAS,IACxB,KAAK;AAAA,iBACF,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MAClD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MACpD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MAClD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO;AAAA;AAG7D,yBACE,KAAK;AAAA,iBACF,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MAClD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MACpD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO,MAClD,WAAWA,KAAI,WAAW,IAAI,WAAWA,KAAI,OAAO;AAAA,cACrE,IAAc;AAEN,0BACG,WAAWA,KAAI,gBAAgB,IAAI,KAAK,IAAI,IAAI,QAAQ,KACxD,IAAI,KAAK,KAAK,QAAQ;AAGzB,yBAAWA,KAAI,gBAAgB,IAAI,KAAK;AAAA,gBACtC;AAAA,gBACA,KAAK;AAAA,kBACF,aACE,KAAK,IAAI,WAAWA,KAAI,OAAO,GAAG,CAAC,IAClC,KAAK,IAAI,WAAWA,KAAI,OAAO,GAAG,CAAC,MACpC,IAAI,KAAK,KAAK,QAAQ;AAAA,gBACrC;AAAA;AAIQ,qBACE,WAAWA,KAAI,MAAM,IACrB,WAAWA,KAAI,OAAO,KAAK,YAAY,QAAQ;AACjD,yBAAWA,KAAI,MAAM,IAAI;AAEzB,qBACE,WAAWA,KAAI,MAAM,IACrB,WAAWA,KAAI,OAAO,KAAK,YAAY,QAAQ;AACjD,yBAAWA,KAAI,MAAM,IAAI;AAAA,YACjC;AAAA,UACA;AAAA,QACA;AAGE,eAAO,CAAA;AAAA,MACT;AAAA,IAEA,GAAG;AAED,QAAI+F,WAAU,WAAW;AAEzB,SAAK,iBAAiB,WAAW,SAAU,OAAO;AAChD,UAAI,OAAO,MAAM;AAEjB,cAAQ,IAAI,aAAa,KAAK,KAAK;AAEnC,UAAI,KAAK,MAAO,SAAQ,IAAI,aAAa,KAAK,KAAK;AAGnD,MAAAA,SAAQ,KAAK,UAAU,OAAO,KAAK;AAGnC,WAAK;AAAA,QACH;AAAA,UACE,OAAO,MAAM;AAAA;QAEf,CAAC,MAAM,MAAM;AAAA;IAEnB,CAAG;AAAA,EACH;;;;;;;;ACrzBA,MAAI,iBAAiBG,iBAAA;AACrB,MAAID,WAAUE,cAAAA,eAAA;AACd,MAAI,yBACFC,cAAAA,eAAA,EAAoC;AACtC,MAAIC,WAAUC,eAAA;AAEd,MAAIC,oBAAmBC,gBAAA;AAUvB,WAAS,oBAAoB,OAAO,QAAQ;AAC1C,aAAS,UAAU,CAAA;AAGnB,QAAI,CAACP,SAAQ,KAAK;AAChB,YAAM,IAAI;AAAA,QACR;AAAA;AAGJ,QAAI,gBAAgB;AAAA,MAClB,mBAAmB,SAAS,OAAO,gBAAgB;AAAA,IACvD,EAAI;AAGF,QAAI,WAAWI,SAAQ,OAAO,CAAA,GAAIE,mBAAkB,OAAO,QAAQ;AACnE,QAAI,kBAAkBF,SAAQ,iBAAiB,QAAQ;AAEvD,QAAI;AACF,YAAM,IAAI;AAAA,QACR,2CAA2C,gBAAgB;AAAA;AAI/D,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,SAAK,WAAW;AAChB,SAAK,gBAAgB;AACrB,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,SAAS;AACd,SAAK,gBACH,OAAO,OAAO,kBAAkB,aAAa,OAAO,gBAAgB;AAGtE,SAAK,gBAAgB,KAAK,cAAc,KAAK,IAAI;AAEjD,QAAI,eAAe;AACnB,QAAIK,QAAO;AAEX,SAAK,oBAAoB,WAAY;AACnC,UAAIA,MAAK,OAAQ,CAAAA,MAAK,OAAO,UAAS;AAEtC,UAAI,aAAc,cAAa,YAAY;AAE3C,qBAAe,WAAW,WAAY;AACpC,uBAAe;AACf,QAAAA,MAAK,YAAW;AAAA,MACtB,GAAO,CAAC;AAAA,IACR;AAEE,UAAM,GAAG,aAAa,KAAK,iBAAiB;AAC5C,UAAM,GAAG,aAAa,KAAK,iBAAiB;AAC5C,UAAM,GAAG,eAAe,KAAK,iBAAiB;AAC9C,UAAM,GAAG,eAAe,KAAK,iBAAiB;AAG9C,SAAK,YAAW;AAAA,EAClB;AAEA,sBAAoB,UAAU,YAAY,WAAY;AACpD,WAAO,KAAK;AAAA,EACd;AAKA,sBAAoB,UAAU,cAAc,WAAY;AACtD,QAAI,KAAK,OAAQ,MAAK,OAAO,UAAS;AAEtC,SAAK,SAASL,SAAQ,aAAa,cAAc;AACjD,SAAK,OAAO,iBAAiB,WAAW,KAAK,aAAa;AAE1D,QAAI,KAAK,SAAS;AAChB,WAAK,UAAU;AACf,WAAK,MAAK;AAAA,IACd;AAAA,EACA;AAOA,sBAAoB,UAAU,gBAAgB,SAAU,OAAO;AAC7D,QAAI,CAAC,KAAK,QAAS;AAEnB,QAAI,SAAS,IAAI,aAAa,MAAM,KAAK,KAAK;AAE9C,IAAAA,SAAQ,oBAAoB,KAAK,OAAO,QAAQ,KAAK,aAAa;AAClE,QAAI,KAAK,cAAe,CAAAA,SAAQ,mBAAmB,KAAK,OAAO,MAAM;AACrE,SAAK,SAAS,QAAQ;AAGtB,SAAK,iBAAgB;AAAA,EACvB;AAQA,sBAAoB,UAAU,mBAAmB,SAAU,WAAW;AACpE,QAAI,WAAW,KAAK;AAEpB,QAAI,UAAU;AAAA,MACZ,UAAU,KAAK;AAAA,MACf,OAAO,SAAS,MAAM;AAAA;AAGxB,QAAI,UAAU,CAAC,SAAS,MAAM,MAAM;AAEpC,QAAI,WAAW;AACb,cAAQ,QAAQ,SAAS,MAAM;AAC/B,cAAQ,KAAK,SAAS,MAAM,MAAM;AAAA,IACtC;AAEE,SAAK,OAAO,YAAY,SAAS,OAAO;AAExC,WAAO;AAAA,EACT;AAOA,sBAAoB,UAAU,QAAQ,WAAY;AAChD,QAAI,KAAK;AACP,YAAM,IAAI;AAAA,QACR;AAAA;AAGJ,QAAI,KAAK,QAAS,QAAO;AAGzB,SAAK,WAAWA,SAAQ,kBAAkB,KAAK,OAAO,KAAK,aAAa;AAExE,SAAK,UAAU;AACf,SAAK,iBAAiB,IAAI;AAE1B,WAAO;AAAA,EACT;AAOA,sBAAoB,UAAU,OAAO,WAAY;AAC/C,SAAK,UAAU;AAEf,WAAO;AAAA,EACT;AAOA,sBAAoB,UAAU,OAAO,WAAY;AAC/C,QAAI,KAAK,OAAQ,QAAO;AAExB,SAAK,UAAU;AACf,SAAK,SAAS;AAGd,SAAK,WAAW;AAGhB,SAAK,OAAO,UAAS;AAGrB,SAAK,MAAM,eAAe,aAAa,KAAK,iBAAiB;AAC7D,SAAK,MAAM,eAAe,aAAa,KAAK,iBAAiB;AAC7D,SAAK,MAAM,eAAe,eAAe,KAAK,iBAAiB;AAC/D,SAAK,MAAM,eAAe,eAAe,KAAK,iBAAiB;AAAA,EACjE;AAKA,WAAiB;;;;;AC7MmQ,SAAS,EAAEzG,KAAE,CAAA,GAAG;AAAC,SAAOyD,EAAE,GAAEzD,EAAC;AAAC;ACsB3S,SAAS,YACd,OACA,SACA,WAAW,KACX,UAAU,KACJ;AACN,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,QAAQ;AAEZ,aAAW,MAAM,SAAS;AACxB,UAAM,OAAO,MAAM,mBAAmB,EAAE;AACxC,QAAI,CAAC,KAAM;AACX,WAAO,KAAK,IAAI,MAAM,KAAK,CAAC;AAC5B,WAAO,KAAK,IAAI,MAAM,KAAK,CAAC;AAC5B,WAAO,KAAK,IAAI,MAAM,KAAK,CAAC;AAC5B,WAAO,KAAK,IAAI,MAAM,KAAK,CAAC;AAC5B;AAAA,EACF;AAEA,MAAI,UAAU,EAAG;AAEjB,QAAM,SAAS,MAAM,UAAA;AAGrB,MAAI,UAAU,KAAM,OAAO,OAAO,KAAK,OAAO,OAAO,GAAI;AACvD,WAAO;AAAA,MACL,EAAE,IAAI,OAAO,QAAQ,GAAG,IAAI,OAAO,QAAQ,GAAG,OAAO,IAAA;AAAA,MACrD,EAAE,SAAA;AAAA,IAAS;AAEb;AAAA,EACF;AAGA,QAAM,MAAM,OAAO,QAAQ;AAC3B,QAAM,MAAM,OAAO,QAAQ;AAG3B,QAAM,EAAE,OAAO,WAAW,MAAM,cAAA;AAChC,QAAM,aAAa,OAAO;AAC1B,QAAM,cAAc,OAAO;AAG3B,QAAM,SAAS,cAAc,SAAS,IAAI,UAAU;AACpD,QAAM,SAAS,eAAe,UAAU,IAAI,UAAU;AACtD,QAAM,QAAQ,KAAK,IAAI,QAAQ,QAAQ,IAAI;AAE3C,SAAO,QAAQ,EAAE,GAAG,IAAI,GAAG,IAAI,MAAA,GAAS,EAAE,UAAU;AACtD;AASO,SAAS,UAAU,OAAc,WAAW,KAAW;AAC5D,QAAM,SAAS,MAAM,UAAA;AACrB,SAAO,QAAQ,EAAE,GAAG,KAAK,GAAG,KAAK,OAAO,KAAK,EAAE,SAAA,CAAU;AAC3D;ACjCA,SAAwB,eAAe;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,QAAM,QAAQ+G,EAAA;AACd,QAAM,WAAWlB,EAAAA,OAA6C,IAAI;AAClE,QAAM,mBAAmBA,EAAAA,OAAsB,IAAI;AACnD,QAAM,6BAA6BA,EAAAA,OAA4B,IAAI;AAEnE,QAAM,EAAE,OAAO,KAAA,IAASmB,EAA2B;AAAA,IACjD,UAAU;AAAA,MACR,SAAS,aAAa;AAAA,MACtB,cAAc,aAAa;AAAA,MAC3B,UAAU,aAAa;AAAA,MACvB,mBACE,MAAM,SAAA,EAAW,QAAQ,aAAa;AAAA,MACxC,gBAAgB,aAAa;AAAA,MAC7B,mBAAmB,aAAa;AAAA,MAChC,YAAY,aAAa;AAAA,MACzB,gCAAgC,aAAa;AAAA,MAC7C,aAAa,aAAa;AAAA,IAAA;AAAA,EAC5B,CACD;AAID,WAAS,UAAU;AACjB,QAAI,SAAS,SAAS;AACpB,mBAAa,SAAS,OAAO;AAC7B,eAAS,UAAU;AAAA,IACrB;AACA,QAAI,iBAAiB,SAAS;AAC5B,uBAAiB,QAAQ,UAAA;AACzB,uBAAiB,UAAU;AAAA,IAC7B;AACA,+BAA2B,UAAA;AAC3B,+BAA2B,UAAU;AACrC,SAAA;AAAA,EACF;AAOA,WAAS,WAAW,QAAoB;AACtC,UAAM,QAAQ,MAAM,SAAA;AACpB,QAAI,MAAM,UAAU,KAAK,CAAC,sBAAsB;AAC9C,aAAA;AACA;AAAA,IACF;AAEA,uBAAmB,EAAE,OAAO,WAAW;AAEvC,UAAM,QAAuB,CAAA;AAC7B,UAAM,YAAY,CAAC,IAAI,UAAU;AAC/B,YAAM,MAAM,qBAAqB,EAAE;AACnC,UAAI,QAAQ,OAAW;AACvB,YAAM,KAAK;AAAA,QACT;AAAA,QACA,GAAG,MAAM;AAAA,QACT,GAAG,MAAM;AAAA,QACT,aAAa;AAAA,MAAA,CACd;AAAA,IACH,CAAC;AAED,UAAMhB,UAAS,IAAI,OAAO,IAAA;AAAA;AAAA,MAAA;AAAA,MAAA,OAAA,aAAA,cAAA,QAAA,KAAA,EAAA,cAAA,UAAA,EAAA,OAAA,0BAAA,uBAAA,QAAA,YAAA,MAAA,YAAA,uBAAA,OAAA,IAAA,IAAA,4BAAA,SAAA,OAAA,EAAA;AAAA,IAAA,GAAgD;AAAA,MACxE,MAAM;AAAA,IAAA,CACP;AACD,qBAAiB,UAAUA;AAE3B,IAAAA,QAAO,YAAY,CAAC/F,OAAqC;AACvD,YAAM,MAAMA,GAAE;AAEd,UAAI,IAAI,SAAS,YAAY;AAC3B,YAAI,IAAI,QAAQ,SAAS,GAAG;AAC1B,gBAAM,6BAAa,IAAA;AACnB,qBAAW,KAAK,IAAI,QAAS,QAAO,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG;AAChE,gBAAM,yBAAyB,CAAC,IAAI,UAAU;AAC5C,kBAAM,MAAM,OAAO,IAAI,EAAE;AACzB,gBAAI,KAAK;AACP,oBAAM,IAAI,IAAI;AACd,oBAAM,IAAI,IAAI;AAAA,YAChB;AACA,mBAAO;AAAA,UACT,CAAC;AAAA,QACH;AAEA,2BAAmB;AAAA,UACjB,OAAO;AAAA,UACP,WAAW,IAAI;AAAA,UACf,YAAY,IAAI,IAAI;AAAA,QAAA,CACrB;AAED,YAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,kBAAQ;AAAA,YACN,sBAAsB,IAAI,SAAS,cAAc,IAAI,aAAa,KAAK,QAAQ,CAAC,CAAC,MAAM,IAAI,QAAQ,MAAM;AAAA,YACzG;AAAA,YACA;AAAA,UAAA;AAAA,QAEJ;AAAA,MACF,WAAW,IAAI,SAAS,QAAQ;AAC9B,YAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,kBAAQ;AAAA,YACN,uBAAuB,IAAI,UAAU,YAAY,IAAI,aAAa,KAAK,QAAQ,CAAC,CAAC,oBAAoB,IAAI,QAAQ,QAAQ,CAAC,CAAC;AAAA,YAC3H;AAAA,YACA;AAAA,UAAA;AAAA,QAEJ;AACA,QAAA+F,QAAO,UAAA;AACP,yBAAiB,UAAU;AAC3B,eAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAAA,QAAO,UAAU,MAAM;AACrB,MAAAA,QAAO,UAAA;AACP,uBAAiB,UAAU;AAC3B,aAAA;AAAA,IACF;AAEA,IAAAA,QAAO,YAAY;AAAA,MACjB;AAAA,MACA,aAAa;AAAA,MACb,KAAK;AAAA,MACL,eAAe;AAAA,MACf,kBAAkB;AAAA,IAAA,CACM;AAAA,EAC5B;AAGA,WAAS,sBAA8B;AACrC,UAAM,QAAQ,MAAM,SAAA;AACpB,QAAI,OAAO,UACT,OAAO,WACP,OAAO,UACP,OAAO;AACT,UAAM,YAAY,CAAC,GAAG,UAAU;AAC9B,YAAM,IAAI,MAAM;AAChB,YAAM,IAAI,MAAM;AAChB,UAAI,IAAI,KAAM,QAAO;AACrB,UAAI,IAAI,KAAM,QAAO;AACrB,UAAI,IAAI,KAAM,QAAO;AACrB,UAAI,IAAI,KAAM,QAAO;AAAA,IACvB,CAAC;AACD,WAAO,KAAK,IAAI,OAAO,MAAM,OAAO,MAAM,CAAC,IAAI;AAAA,EACjD;AAOA,WAAS,wBAAwB,QAAoB;AACnD,UAAM,QAAQ,MAAM,SAAA;AACpB,QAAI,MAAM,UAAU,KAAK,CAAC,sBAAsB;AAC9C,aAAA;AACA;AAAA,IACF;AAEA,UAAMiB,SAAQ,oBAAA;AAGd,UAAM,6BAAa,IAAA;AACnB,UAAM,YAAY,CAAC,OAAO;AACxB,YAAM,MAAM,qBAAqB,EAAE;AACnC,UAAI,QAAQ,OAAW;AACvB,UAAI,OAAO,OAAO,IAAI,GAAG;AACzB,UAAI,CAAC,MAAM;AACT,eAAO,CAAA;AACP,eAAO,IAAI,KAAK,IAAI;AAAA,MACtB;AACA,WAAK,KAAK,EAAE;AAAA,IACd,CAAC;AAGD,UAAM,SAAS,CAAC,GAAG,OAAO,QAAA,CAAS,EAAE;AAAA,MACnC,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;AAAA,IAAA;AAI/B,UAAM,aAAa;AAEnB,QAAI,MAAM;AACV,QAAI,aAAa;AACjB,QAAI,YAAY;AAChB,QAAI,oBAAmE;AACvE,+BAA2B,UAAU,MAAM;AACzC,kBAAY;AACZ,UAAI,sBAAsB,MAAM;AAC9B,YAAI,OAAO,uBAAuB,YAAY;AAC5C,6BAAmB,iBAA2B;AAAA,QAChD,OAAO;AACL,uBAAa,iBAAiB;AAAA,QAChC;AACA,4BAAoB;AAAA,MACtB;AAAA,IACF;AAEA,aAAS,cAAc;AACrB,UAAI,aAAa,OAAO,OAAO,QAAQ;AACrC,YAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,kBAAQ;AAAA,YACN,sCAAsC,OAAO,MAAM,iBAAiB,UAAU,eAAe,YAAY,iBAAiB,EAAE;AAAA,YAC5H;AAAA,YACA;AAAA,UAAA;AAAA,QAEJ;AACA,mCAA2B,UAAU;AACrC,YAAI,CAAC,UAAW,QAAA;AAChB;AAAA,MACF;AAEA,YAAM,GAAG,OAAO,IAAI,OAAO,KAAK;AAGhC,UAAI,QAAQ,SAAS,KAAK,QAAQ,SAAS,YAAY;AACrD,qBAAA;AACA;AAAA,MACF;AAGA,YAAM,+BAAe,IAAA;AAIrB,iBAAW,OAAO,SAAS;AACzB,cAAM,QAAQ,MAAM,kBAAkB,GAAG;AACzC,iBAAS,IAAI,KAAK;AAAA,UAChB,GAAG,MAAM;AAAA,UACT,GAAG,MAAM;AAAA,UACT,OAAQ,MAAM,QAAmB,KAAKA;AAAA,QAAA,CACvC;AAAA,MACH;AAGA,YAAM,SAAS,aAAa,iBAAiBA;AAC7C,YAAM,UAAU,CAAC,GAAG,SAAS,SAAS;AACtC,eAAS,OAAO,GAAG,OAAO,IAAI,QAAQ;AACpC,iBAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,gBAAM,GAAG,CAAC,IAAI,QAAQ,CAAC;AACvB,mBAAS3F,KAAI,IAAI,GAAGA,KAAI,QAAQ,QAAQA,MAAK;AAC3C,kBAAM,GAAG,CAAC,IAAI,QAAQA,EAAC;AACvB,kBAAM,KAAK,EAAE,IAAI,EAAE;AACnB,kBAAM,KAAK,EAAE,IAAI,EAAE;AACnB,kBAAM,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AACxC,kBAAM,UAAU,EAAE,OAAO,EAAE,OAAO;AAClC,gBAAI,OAAO,WAAW,OAAO,MAAO;AAClC,oBAAM,QAAQ,UAAU,QAAQ;AAChC,oBAAM,KAAK,KAAK;AAChB,oBAAM,KAAK,KAAK;AAChB,gBAAE,KAAK,KAAK;AACZ,gBAAE,KAAK,KAAK;AACZ,gBAAE,KAAK,KAAK;AACZ,gBAAE,KAAK,KAAK;AAAA,YACd;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,UAAI,QAAQ;AACZ,iBAAW,CAAC,KAAK,GAAG,KAAK,UAAU;AACjC,cAAM,QAAQ,MAAM,kBAAkB,GAAG;AACzC,YACE,KAAK,IAAI,IAAI,IAAK,MAAM,CAAY,IAAI,OACxC,KAAK,IAAI,IAAI,IAAK,MAAM,CAAY,IAAI,KACxC;AACA,gBAAM,oBAAoB,KAAK,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG;AACrD;AAAA,QACF;AAAA,MACF;AACA,oBAAc;AAEd,mBAAA;AAAA,IACF;AAEA,aAAS,eAAe;AACtB,UAAI,OAAO,wBAAwB,YAAY;AAC7C,4BAAoB,oBAAoB,aAAa,EAAE,SAAS,IAAI;AAAA,MACtE,OAAO;AACL,4BAAoB,WAAW,aAAa,CAAC;AAAA,MAC/C;AAAA,IACF;AAEA,gBAAA;AAAA,EACF;AAIAyE,IAAAA,UAAU,MAAM;AACd,QAAI,CAAC,YAAa;AAElB,YAAA;AAEA,UAAM,gBAAgB;AACtB,UAAM,QAAQ,MAAM,SAAA;AAGpB,eAAW,MAAM;AACf,gBAAU,eAAe,CAAC;AAE1B,YAAM,SAAS,CAAC,UAAkB,WAAuB;AACvD,YAAI,aAAa,cAAc,MAAM,QAAQ,GAAG;AAC9C,6BAAmB,EAAE,OAAO,OAAO;AACnC,gBAAA;AACA,mBAAS,UAAU,WAAW,MAAM;AAClC,iBAAA;AACA,mBAAA;AAAA,UACF,GAAG,QAAQ;AAAA,QACb,OAAO;AACL,iBAAA;AAAA,QACF;AAAA,MACF;AAGA,aAAO,aAAa,aAAa,MAAM;AAErC,2BAAmB,EAAE,OAAO,YAAY;AACxC,gCAAwB,MAAM;AAE5B,qBAAW,MAAM;AAEf,mBAAO,KAAK,IAAI,aAAa,aAAa,IAAI,GAAG,MAAM;AACrD,wBAAU,eAAe,GAAG;AAC5B,iCAAmB,IAAI;AAAA,YACzB,CAAC;AAAA,UACH,CAAC;AAAA,QACH,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAED,WAAO;AAAA,EAET,GAAG,CAAC,aAAa,cAAc,cAAc,OAAO,MAAM,KAAK,CAAC;AAEhE,SAAO;AACT;AClWA,IAAI,SAA6B;AAEjC,SAAS,qBAAkC;AACzC,QAAM,OAAO,SAAS;AACtB,QAAM,MAAM,GAAG,KAAK,QAAQ,SAAS,EAAE,IAAI,KAAK,QAAQ,QAAQ,EAAE;AAClE,MAAI,UAAU,OAAO,QAAQ,IAAK,QAAO;AAEzC,QAAM,QAAQ,iBAAiB,IAAI;AACnC,WAAS;AAAA,IACP,IAAI,MAAM,iBAAiB,WAAW,EAAE,UAAU;AAAA,IAClD,IAAI,MAAM,iBAAiB,sBAAsB,EAAE,UAAU;AAAA,IAC7D,OAAO,MAAM,iBAAiB,oBAAoB,EAAE,UAAU;AAAA,IAC9D;AAAA,EAAA;AAEF,SAAO;AACT;AAIO,SAAS,cAKd,SACA,MACA,UACM;AACN,QAAM,OAAO,SAAS;AACtB,QAAM,OAAO,SAAS;AACtB,QAAM,SAAS,SAAS;AACxB,QAAM,SAAS,mBAAA;AACf,QAAM,UAAU;AAEhB,QAAM,QAAQ,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAC5D,QAAM,SAAS;AACf,QAAM,WAAW,OAAO;AACxB,QAAM,gBAAgB,OAAO;AAC7B,QAAM,WAAW,CAAC,UAAU,aAAa,EAAE,OAAO,OAAO,EAAE,KAAK,KAAK;AAErE,UAAQ,OAAO,GAAG,MAAM,IAAI,IAAI,MAAM,IAAI;AAG1C,QAAM,aAAa,QAAQ,QAAQ,YAAY,KAAK,EAAE,QAAQ;AAE9D,MAAI,gBAAgB;AACpB,QAAM,YAAY,KAAK,MAAM,OAAO,GAAG;AACvC,MAAI,UAAU;AACZ,YAAQ,OAAO,GAAG,SAAS,MAAM,IAAI;AACrC,oBAAgB,QAAQ,YAAY,QAAQ,EAAE;AAAA,EAChD;AAEA,QAAM,YAAY,KAAK,IAAI,YAAY,aAAa;AAEpD,MAAI,cAAc,KAAK,CAAC,UAAU;AAEhC,YAAQ,UAAA;AACR,YAAQ,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,OAAO,SAAS,GAAG,KAAK,KAAK,CAAC;AAC/D,YAAQ,UAAA;AACR,YAAQ,YAAY,OAAO;AAC3B,YAAQ,aAAa;AACrB,YAAQ,cAAc;AACtB,YAAQ,KAAA;AACR,YAAQ,aAAa;AAGrB,YAAQ,UAAA;AACR,YAAQ,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,MAAM,GAAG,KAAK,KAAK,CAAC;AACrD,YAAQ,UAAA;AACR,YAAQ,YAAY,KAAK;AACzB,YAAQ,KAAA;AACR;AAAA,EACF;AAGA,QAAM,WAAW,KAAK,MAAM,YAAY,CAAC;AACzC,QAAM,aAAa,OAAO;AAC1B,QAAM,QAAQ,WAAW,IAAI;AAC7B,QAAM,YAAY,KAAK,MAAM,aAAa,QAAQ,UAAU,CAAC;AAC7D,QAAM,aAAa,KAAK,IAAI,KAAK,MAAM,OAAO,CAAC,IAAI;AAGnD,QAAM,cAAc,KAAK,KAAK,KAAK,IAAI,GAAG,YAAY,IAAI,UAAU,CAAC;AACrE,QAAM,SAAS,KAAK;AAAA,IAClB,KAAK,IAAI,KAAK,IAAI,YAAY,CAAC,IAAI,KAAK,IAAI,YAAY,GAAG,CAAC,CAAC;AAAA,EAAA;AAG/D,UAAQ,YAAY,OAAO;AAC3B,UAAQ,gBAAgB;AACxB,UAAQ,gBAAgB;AACxB,UAAQ,aAAa;AACrB,UAAQ,cAAc;AAEtB,UAAQ,UAAA;AACR,UAAQ,OAAO,KAAK,IAAI,QAAQ,KAAK,IAAI,YAAY,CAAC;AACtD,UAAQ,OAAO,KAAK,IAAI,aAAa,UAAU,KAAK,IAAI,YAAY,CAAC;AACrE,UAAQ,OAAO,KAAK,IAAI,aAAa,UAAU,KAAK,IAAI,YAAY,CAAC;AACrE,UAAQ,OAAO,KAAK,IAAI,QAAQ,KAAK,IAAI,YAAY,CAAC;AACtD,UAAQ,IAAI,KAAK,GAAG,KAAK,GAAG,YAAY,aAAa,CAAC,WAAW;AACjE,UAAQ,UAAA;AACR,UAAQ,KAAA;AAGR,UAAQ,gBAAgB;AACxB,UAAQ,gBAAgB;AACxB,UAAQ,aAAa;AAGrB,QAAM,QAAQ,KAAK,IAAI,aAAa;AACpC,MAAI,OAAO;AACT,YAAQ,YAAY,OAAO;AAC3B,YAAQ,OAAO,GAAG,MAAM,IAAI,IAAI,MAAM,IAAI;AAC1C,YAAQ,SAAS,OAAO,OAAO,KAAK,KAAK,WAAW,KAAK,OAAO,EAAE;AAAA,EACpE;AAGA,MAAI,UAAU;AACZ,YAAQ,YAAY,OAAO;AAC3B,YAAQ,OAAO,GAAG,SAAS,MAAM,IAAI;AACrC,YAAQ,SAAS,UAAU,OAAO,KAAK,IAAI,aAAa,CAAC;AAAA,EAC3D;AAGA,UAAQ,UAAA;AACR,UAAQ,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,MAAM,GAAG,KAAK,KAAK,CAAC;AACrD,UAAQ,UAAA;AACR,UAAQ,YAAY,KAAK;AACzB,UAAQ,KAAA;AACV;ACtDA,SAAS,gBAAgB;AAAA,EACvB;AACF,GAEG;AACD,QAAM,QAAQgB,EAAA;AACd,QAAM,WAAWlB,EAAAA,OAAO,KAAK;AAE7BE,IAAAA,UAAU,MAAM;AACd,QAAI,CAAC,SAAS,SAAS;AACrB,eAAS,UAAU;AACnB,cAAQ,KAAK;AAAA,IACf;AAAA,EACF,GAAG,CAAC,OAAO,OAAO,CAAC;AAEnB,SAAO;AACT;AAGA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,QAAQgB,EAAA;AAEdhB,IAAAA,UAAU,MAAM;AACd,UAAM,YAAY,MAAM,aAAA;AACxB,UAAM,QAAQ,MAAM,SAAA;AAEpB,UAAM,WAAW;AAAA,MACf,WAAW,MAAM;AACf,kBAAU,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA,WAAW,MAAM;AACf,kBAAU,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA,WAAW,MAAM;AACf,kBAAU,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA,WAAW,MAAM;AACf,kBAAU,MAAM,SAAS;AAAA,MAC3B;AAAA,MACA,WAAW,CAAC,EAAE,WAA6B;AACzC,YAAI,CAAC,YAAa;AAClB,cAAM,QAAQ,MAAM,kBAAkB,IAAI;AAC1C,cAAM,YAAY,MAAM;AACxB,YAAI,uBAAuB,SAAS;AAAA,MACtC;AAAA,MACA,WAAW,CAAC,EAAE,WAA6B;AACzC,YAAI,CAAC,YAAa;AAClB,cAAM,QAAQ,MAAM,kBAAkB,IAAI;AAC1C,cAAM,SAAS,MAAM,OAAO,IAAI;AAChC,cAAM,SAAS,MAAM,OAAO,IAAI;AAChC,cAAM,cAAc,MAAM,kBAAkB,MAAM;AAClD,cAAM,cAAc,MAAM,kBAAkB,MAAM;AAClD,oBAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA,OAAQ,MAAM,SAAoB;AAAA,UAClC,YACE,MAAM,YACL;AAAA,UACH,YAAY,YAAY;AAAA,UACxB,YAAY,YAAY;AAAA,QAAA,CACzB;AAAA,MACH;AAAA,MACA,YAAY,MAAM;AAChB,uBAAA;AAAA,MACF;AAAA,IAAA;AAIF,UAAM,GAAG,aAAa,SAAS,SAAS;AACxC,UAAM,GAAG,aAAa,SAAS,SAAS;AACxC,UAAM,GAAG,aAAa,SAAS,SAAS;AACxC,UAAM,GAAG,aAAa,SAAS,SAAS;AACxC,UAAM,GAAG,aAAa,SAAS,SAAS;AACxC,UAAM,GAAG,aAAa,SAAS,SAAS;AACxC,UAAM,GAAG,cAAc,SAAS,UAAU;AAE1C,WAAO,MAAM;AACX,YAAM,IAAI,aAAa,SAAS,SAAS;AACzC,YAAM,IAAI,aAAa,SAAS,SAAS;AACzC,YAAM,IAAI,aAAa,SAAS,SAAS;AACzC,YAAM,IAAI,aAAa,SAAS,SAAS;AACzC,YAAM,IAAI,aAAa,SAAS,SAAS;AACzC,YAAM,IAAI,aAAa,SAAS,SAAS;AACzC,YAAM,IAAI,cAAc,SAAS,UAAU;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,OAAO,aAAa,aAAa,YAAY,CAAC;AAElD,SAAO;AACT;AAIA,MAAM,oBAAkC,MAAM;AAI9C,MAAM,uCAAuB,IAAA;AAC7B,MAAM,uCAAuB,IAAA;AAC7B,MAAM,sCAAsB,IAAA;AAE5B,MAAM,cAAcmB,EAAAA;AAAAA,EAClBC,EAAAA;AAAAA,IACE,SAASC,aAAY,OAAO,KAAK;AAC/B,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,kBAAkB;AAAA,QAClB,kBAAkB;AAAA,QAClB,iBAAiB;AAAA,QACjB,oBAAoB;AAAA,QACpB,cAAc;AAAA,QACd,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,aAAa;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,IACE;AAEJ,YAAM,WAAWvB,EAAAA,OAA2C,IAAI;AAChE,YAAM,CAAC,cAAc,eAAe,IAAIC,EAAAA,SAAS,CAAC;AAGlD,YAAM,gBAAgBuB,cAAAA,eAAe,OAAO,OAAO,YAAY;AAG/D,YAAM,cAA2B1B,EAAAA;AAAAA,QAC/B,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,QAEF,CAAC,iBAAiB,iBAAiB,gBAAgB,iBAAiB;AAAA,MAAA;AAItE,YAAM,EAAE,OAAO,YAAA,IAAgB,iBAAiB;AAAA,QAC9C,UAAU;AAAA,QACV,UAAU;AAAA,QACV;AAAA,QACA;AAAA,MAAA,CACD;AAGD2B,oBAAAA;AAAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc;AAAA,QACd;AAAA,QACA;AAAA,MAAA;AAIF,YAAM,aAAaC,cAAAA;AAAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,kBAAkB;AAAA,QAClB;AAAA,QACA;AAAA,MAAA;AAIF,YAAM,YAAY5B,EAAAA,QAAQ,MAAM;AAC9B,cAAM,0BAAU,IAAA;AAChB,cAAM,QAAQ,CAAC,MAAM;AACnB,gBAAM,WACJ,OAAO,EAAE,WAAW,WAChB,EAAE,SACD,EAAE,OAAqB;AAC9B,gBAAM,WACJ,OAAO,EAAE,WAAW,WAChB,EAAE,SACD,EAAE,OAAqB;AAC9B,cAAI,IAAI,WAAW,IAAI,IAAI,QAAQ,KAAK,KAAK,CAAC;AAC9C,cAAI,IAAI,WAAW,IAAI,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,QAChD,CAAC;AACD,eAAO;AAAA,MACT,GAAG,CAAC,KAAK,CAAC;AAEV,YAAM,eAAe,MAAM,SAAS;AAGpC,YAAM,cAA2BA,EAAAA;AAAAA,QAC/B,OAAO;AAAA,UACL;AAAA,UACA,gBAAgB,WAAW;AAAA,UAC3B,gBAAgB,WAAW;AAAA,UAC3B,YAAY,WAAW;AAAA,UACvB,gBAAgB,kBAAkB;AAAA,QAAA;AAAA,QAEpC,CAAC,WAAW,YAAY,cAAc;AAAA,MAAA;AAGxC;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAIF,YAAM,gBAAgBA,EAAAA;AAAAA,QACpB,OAAO;AAAA,UACL,iBAAiB;AAAA,UACjB,iBAAiB,eACZ,SACA;AAAA,UACL,oBAAoB;AAAA,YAClB,GAAI,eACA,EAAE,MAAM,oBACR,EAAE,aAAa,uBAAA;AAAA,UAAuB;AAAA,UAE5C,kBAAkB;AAAA,UAClB,kBAAkB,CAAC;AAAA,UACnB,4BAA4B;AAAA,UAC5B,WAAW;AAAA,UACX,YAAY,EAAE,OAAO,YAAA;AAAA,UACrB,WAAW;AAAA,UACX,sBAAsB;AAAA,UACtB,uBAAuB;AAAA,UACvB,yBAAyB,CAAC,UACxB,KAAK,IAAI,OAAO,kBAAkB;AAAA,QAAA;AAAA,QAEtC,CAAC,YAAY;AAAA,MAAA;AAGf,YAAM,mBAAmB6B,EAAAA;AAAAA,QACvB,CAAC,UAAuC;AACtC,mBAAS,UAAU;AAAA,QACrB;AAAA,QACA,CAAA;AAAA,MAAC;AAIHC,QAAAA;AAAAA,QACE;AAAA,QACA,OAAO;AAAA,UACL,YAAY,CAAC,QAAgB,aAAsB;AACjD,kBAAM,OAAO,MAAM,KAAK,CAACrH,OAAMA,GAAE,OAAO,MAAM;AAC9C,gBAAI,MAAM;AACR,4BAAc,IAAI;AAClB,kBAAI,SAAS,SAAS;AAEpB,sBAAM,eAAe,oBAAI,IAAY,CAAC,MAAM,CAAC;AAC7C,sBAAMuE,KAAI,YAAY;AACtB,oBAAI,WAAW,oBAAI,IAAY,CAAC,MAAM,CAAC;AACvC,sBAAM,0BAAU,IAAA;AAChB,2BAAW,KAAK,OAAO;AACrB,wBAAM,IACJ,OAAO,EAAE,WAAW,WAChB,EAAE,SACD,EAAE,OAAqB;AAC9B,wBAAM3E,KACJ,OAAO,EAAE,WAAW,WAChB,EAAE,SACD,EAAE,OAAqB;AAC9B,sBAAI,CAAC,IAAI,IAAI,CAAC,EAAG,KAAI,IAAI,GAAG,EAAE;AAC9B,sBAAI,CAAC,IAAI,IAAIA,EAAC,EAAG,KAAI,IAAIA,IAAG,EAAE;AAC9B,sBAAI,IAAI,CAAC,EAAG,KAAKA,EAAC;AAClB,sBAAI,IAAIA,EAAC,EAAG,KAAK,CAAC;AAAA,gBACpB;AACA,yBAAS0B,KAAI,GAAGA,KAAIiD,MAAK,SAAS,OAAO,GAAGjD,MAAK;AAC/C,wBAAM,2BAAW,IAAA;AACjB,2BAAS,QAAQ,CAAC,OAAO;AACvB,wBAAI,IAAI,EAAE,GAAG,QAAQ,CAAC,OAAO;AAC3B,0BAAI,CAAC,aAAa,IAAI,EAAE,GAAG;AACzB,6BAAK,IAAI,EAAE;AACX,qCAAa,IAAI,EAAE;AAAA,sBACrB;AAAA,oBACF,CAAC;AAAA,kBACH,CAAC;AACD,6BAAW;AAAA,gBACb;AACA;AAAA,kBACE,SAAS;AAAA,kBACT;AAAA,kBACA;AAAA,gBAAA;AAAA,cAEJ;AAAA,YACF;AAAA,UACF;AAAA,UACA,WAAW,CAAC,WAAW,QAAQ;AAC7B,gBAAI,SAAS,SAAS;AACpB;AAAA,gBACE,SAAS;AAAA,gBACT;AAAA,cAAA;AAAA,YAEJ;AAAA,UACF;AAAA,UACA,aAAa,CAAC,SAA2B,WAAW,QAAQ;AAC1D,gBAAI,SAAS,SAAS;AACpB;AAAA,gBACE,SAAS;AAAA,gBACT;AAAA,gBACA;AAAA,cAAA;AAAA,YAEJ;AAAA,UACF;AAAA,UACA,UAAU,MAAM;AACd,4BAAgB,CAAC1B,OAAMA,KAAI,CAAC;AAAA,UAC9B;AAAA,QAAA;AAAA,QAEF,CAAC,OAAO,OAAO,MAAM,WAAW;AAAA,MAAA;AAGlC,aACE0H,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA,OAAO;AAAA,YACL,UAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA,GAAG;AAAA,UAAA;AAAA,UAGJ,UAAA;AAAA,YAAA,CAAC,eAAe,MAAM,SAAS,KAC9BA,2BAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,gBAAgB;AAAA,kBAChB,YAAY;AAAA,kBACZ,OAAO;AAAA,kBACP,UAAU;AAAA,gBAAA;AAAA,gBAEb,UAAA;AAAA,kBAAA;AAAA,kBACoB,MAAM,OAAO,eAAA;AAAA,kBAAiB;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAGrDA,2BAAAA;AAAAA,cAACC;AAAAA,cAAA;AAAA,gBACC;AAAA,gBACA,OAAO;AAAA,kBACL;AAAA,kBACA;AAAA,kBACA,UAAU;AAAA,kBACV,KAAK;AAAA,kBACL,MAAM;AAAA,gBAAA;AAAA,gBAER,UAAU;AAAA,gBAEV,UAAA;AAAA,kBAAAC,2BAAAA;AAAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC;AAAA,sBACA;AAAA,sBACA;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAEFA,2BAAAA;AAAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA,sBAAsB,cAAc;AAAA,sBACpC;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAEFA,2BAAAA,IAAC,iBAAA,EAAgB,SAAS,iBAAA,CAAkB;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAC9C;AAAA,QAAA;AAAA,MAAA;AAAA,IAGN;AAAA,EAAA;AAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,14,15,16,17,18,19,20,21]}