@pie-lib/graphing 3.1.0-next.0 → 3.1.0-next.2

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 (162) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/package.json +8 -8
  3. package/lib/__tests__/graph-with-controls.test.js +0 -226
  4. package/lib/__tests__/graph.test.js +0 -187
  5. package/lib/__tests__/grid.test.js +0 -29
  6. package/lib/__tests__/labels.test.js +0 -61
  7. package/lib/__tests__/mark-label.test.js +0 -133
  8. package/lib/__tests__/toggle-bar.test.js +0 -150
  9. package/lib/__tests__/tool-menu.test.js +0 -101
  10. package/lib/__tests__/undo-redo.test.js +0 -31
  11. package/lib/__tests__/use-debounce.test.js +0 -24
  12. package/lib/__tests__/utils.js +0 -70
  13. package/lib/__tests__/utils.test.js +0 -123
  14. package/lib/axis/__tests__/arrow.test.js +0 -60
  15. package/lib/axis/__tests__/axes.test.js +0 -195
  16. package/lib/axis/arrow.js +0 -79
  17. package/lib/axis/arrow.js.map +0 -1
  18. package/lib/axis/axes.js +0 -327
  19. package/lib/axis/axes.js.map +0 -1
  20. package/lib/axis/index.js +0 -21
  21. package/lib/axis/index.js.map +0 -1
  22. package/lib/bg.js +0 -111
  23. package/lib/bg.js.map +0 -1
  24. package/lib/container/actions.js +0 -18
  25. package/lib/container/actions.js.map +0 -1
  26. package/lib/container/index.js +0 -118
  27. package/lib/container/index.js.map +0 -1
  28. package/lib/container/marks.js +0 -22
  29. package/lib/container/marks.js.map +0 -1
  30. package/lib/container/middleware.js +0 -19
  31. package/lib/container/middleware.js.map +0 -1
  32. package/lib/container/reducer.js +0 -18
  33. package/lib/container/reducer.js.map +0 -1
  34. package/lib/coordinates-label.js +0 -79
  35. package/lib/coordinates-label.js.map +0 -1
  36. package/lib/graph-with-controls.js +0 -295
  37. package/lib/graph-with-controls.js.map +0 -1
  38. package/lib/graph.js +0 -314
  39. package/lib/graph.js.map +0 -1
  40. package/lib/grid-setup.js +0 -406
  41. package/lib/grid-setup.js.map +0 -1
  42. package/lib/grid.js +0 -131
  43. package/lib/grid.js.map +0 -1
  44. package/lib/index.js +0 -47
  45. package/lib/index.js.map +0 -1
  46. package/lib/key-legend.js +0 -201
  47. package/lib/key-legend.js.map +0 -1
  48. package/lib/label-svg-icon.js +0 -50
  49. package/lib/label-svg-icon.js.map +0 -1
  50. package/lib/labels.js +0 -243
  51. package/lib/labels.js.map +0 -1
  52. package/lib/mark-label.js +0 -278
  53. package/lib/mark-label.js.map +0 -1
  54. package/lib/toggle-bar.js +0 -248
  55. package/lib/toggle-bar.js.map +0 -1
  56. package/lib/tool-menu.js +0 -78
  57. package/lib/tool-menu.js.map +0 -1
  58. package/lib/tools/absolute/__tests__/component.test.js +0 -67
  59. package/lib/tools/absolute/component.js +0 -29
  60. package/lib/tools/absolute/component.js.map +0 -1
  61. package/lib/tools/absolute/index.js +0 -50
  62. package/lib/tools/absolute/index.js.map +0 -1
  63. package/lib/tools/circle/__tests__/bg-circle.test.js +0 -33
  64. package/lib/tools/circle/__tests__/component.test.js +0 -68
  65. package/lib/tools/circle/bg-circle.js +0 -123
  66. package/lib/tools/circle/bg-circle.js.map +0 -1
  67. package/lib/tools/circle/component.js +0 -319
  68. package/lib/tools/circle/component.js.map +0 -1
  69. package/lib/tools/circle/index.js +0 -41
  70. package/lib/tools/circle/index.js.map +0 -1
  71. package/lib/tools/exponential/__tests__/component.test.js +0 -66
  72. package/lib/tools/exponential/component.js +0 -28
  73. package/lib/tools/exponential/component.js.map +0 -1
  74. package/lib/tools/exponential/index.js +0 -56
  75. package/lib/tools/exponential/index.js.map +0 -1
  76. package/lib/tools/index.js +0 -86
  77. package/lib/tools/index.js.map +0 -1
  78. package/lib/tools/line/__tests__/component.test.js +0 -45
  79. package/lib/tools/line/component.js +0 -82
  80. package/lib/tools/line/component.js.map +0 -1
  81. package/lib/tools/line/index.js +0 -11
  82. package/lib/tools/line/index.js.map +0 -1
  83. package/lib/tools/parabola/__tests__/component.test.js +0 -66
  84. package/lib/tools/parabola/component.js +0 -28
  85. package/lib/tools/parabola/component.js.map +0 -1
  86. package/lib/tools/parabola/index.js +0 -50
  87. package/lib/tools/parabola/index.js.map +0 -1
  88. package/lib/tools/point/__tests__/component.test.js +0 -50
  89. package/lib/tools/point/component.js +0 -139
  90. package/lib/tools/point/component.js.map +0 -1
  91. package/lib/tools/point/index.js +0 -24
  92. package/lib/tools/point/index.js.map +0 -1
  93. package/lib/tools/polygon/__tests__/component.test.js +0 -85
  94. package/lib/tools/polygon/__tests__/index.test.js +0 -92
  95. package/lib/tools/polygon/__tests__/line.test.js +0 -29
  96. package/lib/tools/polygon/__tests__/polygon.test.js +0 -59
  97. package/lib/tools/polygon/component.js +0 -417
  98. package/lib/tools/polygon/component.js.map +0 -1
  99. package/lib/tools/polygon/index.js +0 -89
  100. package/lib/tools/polygon/index.js.map +0 -1
  101. package/lib/tools/polygon/line.js +0 -114
  102. package/lib/tools/polygon/line.js.map +0 -1
  103. package/lib/tools/polygon/polygon.js +0 -132
  104. package/lib/tools/polygon/polygon.js.map +0 -1
  105. package/lib/tools/ray/__tests__/component.test.js +0 -35
  106. package/lib/tools/ray/component.js +0 -83
  107. package/lib/tools/ray/component.js.map +0 -1
  108. package/lib/tools/ray/index.js +0 -11
  109. package/lib/tools/ray/index.js.map +0 -1
  110. package/lib/tools/segment/__tests__/component.test.js +0 -35
  111. package/lib/tools/segment/component.js +0 -57
  112. package/lib/tools/segment/component.js.map +0 -1
  113. package/lib/tools/segment/index.js +0 -11
  114. package/lib/tools/segment/index.js.map +0 -1
  115. package/lib/tools/shared/__tests__/arrow-head.test.js +0 -45
  116. package/lib/tools/shared/arrow-head.js +0 -111
  117. package/lib/tools/shared/arrow-head.js.map +0 -1
  118. package/lib/tools/shared/icons/CorrectSVG.js +0 -40
  119. package/lib/tools/shared/icons/CorrectSVG.js.map +0 -1
  120. package/lib/tools/shared/icons/IncorrectSVG.js +0 -40
  121. package/lib/tools/shared/icons/IncorrectSVG.js.map +0 -1
  122. package/lib/tools/shared/icons/MissingSVG.js +0 -39
  123. package/lib/tools/shared/icons/MissingSVG.js.map +0 -1
  124. package/lib/tools/shared/line/__tests__/index.test.js +0 -124
  125. package/lib/tools/shared/line/__tests__/line-path.test.js +0 -62
  126. package/lib/tools/shared/line/__tests__/with-root-edge.test.js +0 -91
  127. package/lib/tools/shared/line/index.js +0 -546
  128. package/lib/tools/shared/line/index.js.map +0 -1
  129. package/lib/tools/shared/line/line-path.js +0 -120
  130. package/lib/tools/shared/line/line-path.js.map +0 -1
  131. package/lib/tools/shared/line/with-root-edge.js +0 -121
  132. package/lib/tools/shared/line/with-root-edge.js.map +0 -1
  133. package/lib/tools/shared/point/__tests__/arrow-point.test.js +0 -127
  134. package/lib/tools/shared/point/__tests__/base-point.test.js +0 -122
  135. package/lib/tools/shared/point/arrow-point.js +0 -72
  136. package/lib/tools/shared/point/arrow-point.js.map +0 -1
  137. package/lib/tools/shared/point/arrow.js +0 -67
  138. package/lib/tools/shared/point/arrow.js.map +0 -1
  139. package/lib/tools/shared/point/base-point.js +0 -157
  140. package/lib/tools/shared/point/base-point.js.map +0 -1
  141. package/lib/tools/shared/point/index.js +0 -62
  142. package/lib/tools/shared/point/index.js.map +0 -1
  143. package/lib/tools/shared/styles.js +0 -30
  144. package/lib/tools/shared/styles.js.map +0 -1
  145. package/lib/tools/shared/types.js +0 -16
  146. package/lib/tools/shared/types.js.map +0 -1
  147. package/lib/tools/sine/__tests__/component.test.js +0 -72
  148. package/lib/tools/sine/component.js +0 -40
  149. package/lib/tools/sine/component.js.map +0 -1
  150. package/lib/tools/sine/index.js +0 -50
  151. package/lib/tools/sine/index.js.map +0 -1
  152. package/lib/tools/vector/__tests__/component.test.js +0 -32
  153. package/lib/tools/vector/component.js +0 -68
  154. package/lib/tools/vector/component.js.map +0 -1
  155. package/lib/tools/vector/index.js +0 -11
  156. package/lib/tools/vector/index.js.map +0 -1
  157. package/lib/undo-redo.js +0 -83
  158. package/lib/undo-redo.js.map +0 -1
  159. package/lib/use-debounce.js +0 -25
  160. package/lib/use-debounce.js.map +0 -1
  161. package/lib/utils.js +0 -230
  162. package/lib/utils.js.map +0 -1
@@ -1,546 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.styles = exports.lineToolComponent = exports.lineTool = exports.lineBase = void 0;
8
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
11
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
12
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
13
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
14
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
- var _react = _interopRequireDefault(require("react"));
16
- var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
17
- var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
18
- var _point = require("../point");
19
- var _plot = require("@pie-lib/plot");
20
- var _propTypes = _interopRequireDefault(require("prop-types"));
21
- var _styles = require("../styles");
22
- var _reactDom = _interopRequireDefault(require("react-dom"));
23
- var _markLabel = _interopRequireDefault(require("../../../mark-label"));
24
- var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
25
- var _renderUi = require("@pie-lib/render-ui");
26
- var _utils = require("../../../utils");
27
- var _styles2 = require("@mui/material/styles");
28
- function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
29
- function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
30
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
31
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
32
- var StyledLineGroup = (0, _styles2.styled)('g')(function (_ref) {
33
- var disabled = _ref.disabled,
34
- correctness = _ref.correctness;
35
- return _objectSpread(_objectSpread(_objectSpread(_objectSpread({
36
- '& line': {
37
- fill: 'transparent',
38
- stroke: _renderUi.color.defaults.BLACK,
39
- strokeWidth: 3,
40
- transition: 'stroke 200ms ease-in, stroke-width 200ms ease-in',
41
- '&:hover': {
42
- strokeWidth: 6,
43
- stroke: _renderUi.color.defaults.PRIMARY_DARK
44
- }
45
- }
46
- }, disabled && {
47
- '& line': _objectSpread(_objectSpread({}, (0, _styles.disabledSecondary)('stroke')), {}, {
48
- strokeWidth: 2
49
- })
50
- }), correctness === 'correct' && {
51
- '& line': _objectSpread({}, (0, _styles.correct)('stroke'))
52
- }), correctness === 'incorrect' && {
53
- '& line': _objectSpread({}, (0, _styles.incorrect)('stroke'))
54
- }), correctness === 'missing' && {
55
- '& line': _objectSpread(_objectSpread({}, (0, _styles.missing)('stroke')), {}, {
56
- strokeWidth: 1,
57
- strokeDasharray: '4 3'
58
- })
59
- });
60
- });
61
- var lineTool = exports.lineTool = function lineTool(type, Component) {
62
- return function () {
63
- return {
64
- type: type,
65
- Component: Component,
66
- addPoint: function addPoint(point, mark) {
67
- if (mark && (0, _utils.equalPoints)(mark.root, point)) {
68
- return mark;
69
- }
70
- if (!mark) {
71
- return {
72
- type: type,
73
- building: true,
74
- from: point
75
- };
76
- }
77
- if ((0, _utils.equalPoints)(point, mark.from)) {
78
- return _objectSpread({}, mark);
79
- }
80
- return _objectSpread(_objectSpread({}, mark), {}, {
81
- building: false,
82
- to: point
83
- });
84
- }
85
- };
86
- };
87
- };
88
- var lineToolComponent = exports.lineToolComponent = function lineToolComponent(Component) {
89
- var _LineToolComponent;
90
- return _LineToolComponent = /*#__PURE__*/function (_React$Component) {
91
- function LineToolComponent(props) {
92
- var _this;
93
- (0, _classCallCheck2["default"])(this, LineToolComponent);
94
- _this = _callSuper(this, LineToolComponent, [props]);
95
- (0, _defineProperty2["default"])(_this, "startDrag", function () {
96
- return _this.setState({
97
- mark: _objectSpread({}, _this.props.mark)
98
- });
99
- });
100
- (0, _defineProperty2["default"])(_this, "stopDrag", function () {
101
- var _this$props = _this.props,
102
- onChange = _this$props.onChange,
103
- mark = _this$props.mark;
104
- var update = _objectSpread({}, _this.state.mark);
105
- _this.setState({
106
- mark: undefined
107
- }, function () {
108
- var type = update.type;
109
- var shouldNotChange = type && (type === 'parabola' || type === 'sine' || type === 'absolute' || type === 'exponential') && (0, _utils.sameAxes)(update.from, update.to);
110
- if (!shouldNotChange && type && type === 'exponential' && update.from && update.to) {
111
- shouldNotChange = update.from.y === 0 || update.to.y === 0 || update.from.y * update.to.y < 0;
112
- }
113
- if (!(0, _isEqual["default"])(mark, update) && !shouldNotChange) {
114
- onChange(mark, update);
115
- }
116
- });
117
- });
118
- (0, _defineProperty2["default"])(_this, "changeMark", function (_ref2) {
119
- var from = _ref2.from,
120
- to = _ref2.to,
121
- middle = _ref2.middle;
122
- var mark = _objectSpread(_objectSpread({}, _this.state.mark), {}, {
123
- from: from,
124
- to: to
125
- });
126
- if (middle) {
127
- mark = _objectSpread(_objectSpread({}, mark), {}, {
128
- middle: middle
129
- });
130
- }
131
- _this.setState({
132
- mark: mark
133
- });
134
- });
135
- (0, _defineProperty2["default"])(_this, "changeMarkProps", function (_ref3) {
136
- var from = _ref3.from,
137
- to = _ref3.to,
138
- middle = _ref3.middle;
139
- var _this$props2 = _this.props,
140
- onChange = _this$props2.onChange,
141
- mark = _this$props2.mark;
142
- var update = _objectSpread(_objectSpread({}, mark), _this.state.mark);
143
- if (from) {
144
- update = _objectSpread(_objectSpread({}, update), {}, {
145
- from: from
146
- });
147
- }
148
- if (to) {
149
- update = _objectSpread(_objectSpread({}, update), {}, {
150
- to: to
151
- });
152
- }
153
- if (middle) {
154
- update = _objectSpread(_objectSpread({}, update), {}, {
155
- middle: middle
156
- });
157
- }
158
- if (!(0, _isEqual["default"])(mark, update)) {
159
- onChange(mark, update);
160
- }
161
- });
162
- _this.state = {};
163
- return _this;
164
- }
165
- (0, _inherits2["default"])(LineToolComponent, _React$Component);
166
- return (0, _createClass2["default"])(LineToolComponent, [{
167
- key: "render",
168
- value: function render() {
169
- var _this$props3 = this.props,
170
- graphProps = _this$props3.graphProps,
171
- onClick = _this$props3.onClick,
172
- labelNode = _this$props3.labelNode,
173
- labelModeEnabled = _this$props3.labelModeEnabled,
174
- coordinatesOnHover = _this$props3.coordinatesOnHover,
175
- limitLabeling = _this$props3.limitLabeling;
176
- var mark = this.state.mark ? this.state.mark : this.props.mark;
177
- var from = (0, _cloneDeep["default"])(mark.from);
178
- var to = (0, _cloneDeep["default"])(mark.to);
179
- var middle = (0, _cloneDeep["default"])(mark.middle);
180
-
181
- // SET DISABLED
182
- // if it's a background mark, we need to force disable it
183
- if (from && mark.isBackground) {
184
- from.disabled = true;
185
- }
186
- if (to && mark.isBackground) {
187
- to.disabled = true;
188
- }
189
- if (middle && mark.isBackground) {
190
- middle.disabled = true;
191
- }
192
- return /*#__PURE__*/_react["default"].createElement(Component, {
193
- disabled: mark.disabled,
194
- coordinatesOnHover: coordinatesOnHover,
195
- correctness: mark.correctness,
196
- from: from,
197
- to: to,
198
- middle: middle,
199
- graphProps: graphProps,
200
- onChange: this.changeMark,
201
- changeMarkProps: this.changeMarkProps,
202
- onClick: onClick,
203
- onDragStart: this.startDrag,
204
- onDragStop: this.stopDrag,
205
- labelNode: labelNode,
206
- labelModeEnabled: labelModeEnabled,
207
- limitLabeling: limitLabeling
208
- });
209
- }
210
- }]);
211
- }(_react["default"].Component), (0, _defineProperty2["default"])(_LineToolComponent, "propTypes", _objectSpread(_objectSpread({}, _plot.types.ToolPropTypeFields), {}, {
212
- graphProps: _plot.types.GraphPropsType.isRequired,
213
- limitLabeling: _propTypes["default"].bool,
214
- changeMarkProps: _propTypes["default"].func,
215
- disabled: _propTypes["default"].bool,
216
- from: _plot.types.PointType,
217
- to: _plot.types.PointType,
218
- labelModeEnabled: _propTypes["default"].bool,
219
- onClick: _propTypes["default"].func
220
- })), _LineToolComponent;
221
- };
222
- var dragOpts = function dragOpts() {
223
- return {
224
- bounds: function bounds(props, _ref4) {
225
- var domain = _ref4.domain,
226
- range = _ref4.range;
227
- var area = _plot.utils.lineToArea(props.from, props.to);
228
- return _plot.utils.bounds(area, domain, range);
229
- },
230
- anchorPoint: function anchorPoint(props) {
231
- var from = props.from;
232
- return from;
233
- },
234
- fromDelta: function fromDelta(props, delta) {
235
- var from = props.from,
236
- to = props.to;
237
- return {
238
- from: _plot.utils.point(from).add(_plot.utils.point(delta)),
239
- to: _plot.utils.point(to).add(_plot.utils.point(delta))
240
- };
241
- }
242
- };
243
- };
244
- var lineBase = exports.lineBase = function lineBase(Comp, opts) {
245
- var DraggableComp = (0, _plot.gridDraggable)(dragOpts())(Comp);
246
- var FromPoint = opts && opts.from ? opts.from : _point.BasePoint;
247
- var ToPoint = opts && opts.to ? opts.to : _point.BasePoint;
248
- var LineBase = /*#__PURE__*/function (_React$Component2) {
249
- function LineBase() {
250
- var _this2;
251
- (0, _classCallCheck2["default"])(this, LineBase);
252
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
253
- args[_key] = arguments[_key];
254
- }
255
- _this2 = _callSuper(this, LineBase, [].concat(args));
256
- (0, _defineProperty2["default"])(_this2, "onChangePoint", function (point) {
257
- var _this2$props = _this2.props,
258
- middle = _this2$props.middle,
259
- onChange = _this2$props.onChange;
260
- var from = point.from,
261
- to = point.to;
262
-
263
- // because point.from.label and point.to.label can be different
264
- if (!(0, _utils.equalPoints)(from, to)) {
265
- if (middle) {
266
- point.middle = _objectSpread(_objectSpread({}, middle), (0, _utils.getMiddleOfTwoPoints)(from, to));
267
- }
268
- onChange(point);
269
- }
270
- });
271
- (0, _defineProperty2["default"])(_this2, "dragComp", function (_ref5) {
272
- var draggedFrom = _ref5.from,
273
- draggedTo = _ref5.to;
274
- var _this2$props2 = _this2.props,
275
- from = _this2$props2.from,
276
- to = _this2$props2.to,
277
- onChange = _this2$props2.onChange,
278
- middle = _this2$props2.middle;
279
- if (from.label) {
280
- draggedFrom.label = from.label;
281
- }
282
- if (to.label) {
283
- draggedTo.label = to.label;
284
- }
285
- var updated = {
286
- from: draggedFrom,
287
- to: draggedTo
288
- };
289
- if (middle) {
290
- updated.middle = _objectSpread(_objectSpread({}, middle), (0, _utils.getMiddleOfTwoPoints)(draggedFrom, draggedTo));
291
- }
292
- onChange(updated);
293
- });
294
- (0, _defineProperty2["default"])(_this2, "dragFrom", function (draggedFrom) {
295
- var _this2$props3 = _this2.props,
296
- from = _this2$props3.from,
297
- to = _this2$props3.to;
298
- if (from.label) {
299
- draggedFrom.label = from.label;
300
- }
301
- if (!(0, _utils.equalPoints)(draggedFrom, to)) {
302
- _this2.onChangePoint({
303
- from: draggedFrom,
304
- to: to
305
- });
306
- }
307
- });
308
- (0, _defineProperty2["default"])(_this2, "dragTo", function (draggedTo) {
309
- var _this2$props4 = _this2.props,
310
- from = _this2$props4.from,
311
- to = _this2$props4.to;
312
- if (to.label) {
313
- draggedTo.label = to.label;
314
- }
315
- if (!(0, _utils.equalPoints)(from, draggedTo)) {
316
- _this2.onChangePoint({
317
- from: from,
318
- to: draggedTo
319
- });
320
- }
321
- });
322
- (0, _defineProperty2["default"])(_this2, "labelChange", function (point, type) {
323
- var changeMarkProps = _this2.props.changeMarkProps;
324
- var update = _objectSpread({}, point);
325
- if (!point.label || (0, _isEmpty["default"])(point.label)) {
326
- delete update.label;
327
- }
328
- changeMarkProps((0, _defineProperty2["default"])({}, type, update));
329
- });
330
- (0, _defineProperty2["default"])(_this2, "clickPoint", function (point, type, data) {
331
- var _this2$props5 = _this2.props,
332
- changeMarkProps = _this2$props5.changeMarkProps,
333
- disabled = _this2$props5.disabled,
334
- from = _this2$props5.from,
335
- to = _this2$props5.to,
336
- labelModeEnabled = _this2$props5.labelModeEnabled,
337
- limitLabeling = _this2$props5.limitLabeling,
338
- onClick = _this2$props5.onClick;
339
- if (!labelModeEnabled) {
340
- onClick(point || data);
341
- return;
342
- }
343
- if (disabled) {
344
- return;
345
- }
346
-
347
- // limit labeling the points of the line
348
- if (limitLabeling) {
349
- return;
350
- }
351
- if (type === 'middle' && !point && from && to) {
352
- point = _objectSpread(_objectSpread({}, point), (0, _utils.getMiddleOfTwoPoints)(from, to));
353
- }
354
- changeMarkProps((0, _defineProperty2["default"])({
355
- from: from,
356
- to: to
357
- }, type, _objectSpread({
358
- label: ''
359
- }, point)));
360
- if (_this2.input[type]) {
361
- _this2.input[type].focus();
362
- }
363
- });
364
- // IMPORTANT, do not remove
365
- (0, _defineProperty2["default"])(_this2, "input", {});
366
- return _this2;
367
- }
368
- (0, _inherits2["default"])(LineBase, _React$Component2);
369
- return (0, _createClass2["default"])(LineBase, [{
370
- key: "render",
371
- value: function render() {
372
- var _this3 = this;
373
- var _this$props4 = this.props,
374
- coordinatesOnHover = _this$props4.coordinatesOnHover,
375
- graphProps = _this$props4.graphProps,
376
- onDragStart = _this$props4.onDragStart,
377
- onDragStop = _this$props4.onDragStop,
378
- from = _this$props4.from,
379
- to = _this$props4.to,
380
- middle = _this$props4.middle,
381
- disabled = _this$props4.disabled,
382
- correctness = _this$props4.correctness,
383
- onClick = _this$props4.onClick,
384
- labelNode = _this$props4.labelNode,
385
- labelModeEnabled = _this$props4.labelModeEnabled;
386
- var common = {
387
- graphProps: graphProps,
388
- onDragStart: onDragStart,
389
- onDragStop: onDragStop,
390
- disabled: disabled,
391
- correctness: correctness,
392
- onClick: onClick
393
- };
394
- var angle = to ? _plot.trig.toDegrees(_plot.trig.angle(from, to)) : 0;
395
- var fromLabelNode = null;
396
- var toLabelNode = null;
397
- var lineLabelNode = null;
398
- if (labelNode) {
399
- if (from && Object.prototype.hasOwnProperty.call(from, 'label')) {
400
- fromLabelNode = /*#__PURE__*/_reactDom["default"].createPortal(/*#__PURE__*/_react["default"].createElement(_markLabel["default"], {
401
- inputRef: function inputRef(r) {
402
- return _this3.input.from = r;
403
- },
404
- disabled: !labelModeEnabled,
405
- mark: from,
406
- graphProps: graphProps,
407
- onChange: function onChange(label) {
408
- return _this3.labelChange(_objectSpread(_objectSpread({}, from), {}, {
409
- label: label
410
- }), 'from');
411
- }
412
- }), labelNode);
413
- }
414
- if (to && Object.prototype.hasOwnProperty.call(to, 'label')) {
415
- toLabelNode = /*#__PURE__*/_reactDom["default"].createPortal(/*#__PURE__*/_react["default"].createElement(_markLabel["default"], {
416
- inputRef: function inputRef(r) {
417
- return _this3.input.to = r;
418
- },
419
- disabled: !labelModeEnabled,
420
- mark: to,
421
- graphProps: graphProps,
422
- onChange: function onChange(label) {
423
- return _this3.labelChange(_objectSpread(_objectSpread({}, to), {}, {
424
- label: label
425
- }), 'to');
426
- }
427
- }), labelNode);
428
- }
429
- if (middle && Object.prototype.hasOwnProperty.call(middle, 'label')) {
430
- lineLabelNode = /*#__PURE__*/_reactDom["default"].createPortal(/*#__PURE__*/_react["default"].createElement(_markLabel["default"], {
431
- inputRef: function inputRef(r) {
432
- return _this3.input.middle = r;
433
- },
434
- disabled: !labelModeEnabled,
435
- mark: middle,
436
- graphProps: graphProps,
437
- onChange: function onChange(label) {
438
- return _this3.labelChange(_objectSpread(_objectSpread({}, middle), {}, {
439
- label: label
440
- }), 'middle');
441
- }
442
- }), labelNode);
443
- }
444
- }
445
- return /*#__PURE__*/_react["default"].createElement(StyledLineGroup, {
446
- disabled: disabled,
447
- correctness: correctness
448
- }, to && /*#__PURE__*/_react["default"].createElement(DraggableComp, (0, _extends2["default"])({
449
- from: from,
450
- to: to,
451
- middle: middle,
452
- onDrag: this.dragComp
453
- }, common, {
454
- onClick: function onClick(data) {
455
- return _this3.clickPoint(middle, 'middle', data);
456
- }
457
- })), lineLabelNode, /*#__PURE__*/_react["default"].createElement(FromPoint, (0, _extends2["default"])({
458
- x: from.x,
459
- y: from.y,
460
- labelNode: labelNode,
461
- coordinatesOnHover: coordinatesOnHover,
462
- onDrag: this.dragFrom
463
- }, common, {
464
- onClick: function onClick(data) {
465
- return _this3.clickPoint(from, 'from', data);
466
- }
467
- })), fromLabelNode, to && /*#__PURE__*/_react["default"].createElement(ToPoint, (0, _extends2["default"])({
468
- x: to.x,
469
- y: to.y,
470
- angle: angle //angle + 45}
471
- ,
472
- labelNode: labelNode,
473
- coordinatesOnHover: coordinatesOnHover,
474
- onDrag: this.dragTo
475
- }, common, {
476
- onClick: function onClick(data) {
477
- return _this3.clickPoint(to, 'to', data);
478
- }
479
- })), toLabelNode);
480
- }
481
- }]);
482
- }(_react["default"].Component);
483
- (0, _defineProperty2["default"])(LineBase, "propTypes", {
484
- coordinatesOnHover: _propTypes["default"].bool,
485
- graphProps: _plot.types.GraphPropsType,
486
- from: _plot.types.PointType,
487
- to: _plot.types.PointType,
488
- middle: _plot.types.PointType,
489
- onChange: _propTypes["default"].func,
490
- onDragStart: _propTypes["default"].func,
491
- onDragStop: _propTypes["default"].func,
492
- onClick: _propTypes["default"].func,
493
- correctness: _propTypes["default"].string,
494
- disabled: _propTypes["default"].bool,
495
- limitLabeling: _propTypes["default"].bool,
496
- changeMarkProps: _propTypes["default"].func,
497
- labelModeEnabled: _propTypes["default"].bool,
498
- labelNode: _propTypes["default"].object
499
- });
500
- return LineBase;
501
- };
502
- var styles = exports.styles = {
503
- line: function line() {
504
- return {
505
- fill: 'transparent',
506
- stroke: _renderUi.color.defaults.BLACK,
507
- strokeWidth: 3,
508
- transition: 'stroke 200ms ease-in, stroke-width 200ms ease-in',
509
- '&:hover': {
510
- strokeWidth: 6,
511
- stroke: _renderUi.color.defaults.PRIMARY_DARK
512
- }
513
- };
514
- },
515
- arrow: function arrow() {
516
- return {
517
- fill: _renderUi.color.defaults.BLACK
518
- };
519
- },
520
- disabledArrow: function disabledArrow() {
521
- return _objectSpread({}, (0, _styles.disabledSecondary)());
522
- },
523
- disabledSecondary: function disabledSecondary() {
524
- return _objectSpread(_objectSpread({}, (0, _styles.disabledSecondary)('stroke')), {}, {
525
- strokeWidth: 2
526
- });
527
- },
528
- disabled: function disabled() {
529
- return _objectSpread(_objectSpread({}, (0, _styles.disabled)('stroke')), {}, {
530
- strokeWidth: 2
531
- });
532
- },
533
- correct: function correct(theme, key) {
534
- return _objectSpread({}, (0, _styles.correct)(key));
535
- },
536
- incorrect: function incorrect(theme, key) {
537
- return _objectSpread({}, (0, _styles.incorrect)(key));
538
- },
539
- missing: function missing(theme, key) {
540
- return _objectSpread(_objectSpread({}, (0, _styles.missing)(key)), {}, {
541
- strokeWidth: 1,
542
- strokeDasharray: '4 3'
543
- });
544
- }
545
- };
546
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9pc0VxdWFsIiwiX2Nsb25lRGVlcCIsIl9wb2ludCIsIl9wbG90IiwiX3Byb3BUeXBlcyIsIl9zdHlsZXMiLCJfcmVhY3REb20iLCJfbWFya0xhYmVsIiwiX2lzRW1wdHkiLCJfcmVuZGVyVWkiLCJfdXRpbHMiLCJfc3R5bGVzMiIsIl9jYWxsU3VwZXIiLCJ0IiwibyIsImUiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsImFwcGx5IiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJjYWxsIiwib3duS2V5cyIsInIiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiU3R5bGVkTGluZUdyb3VwIiwic3R5bGVkIiwiX3JlZiIsImRpc2FibGVkIiwiY29ycmVjdG5lc3MiLCJmaWxsIiwic3Ryb2tlIiwiY29sb3IiLCJkZWZhdWx0cyIsIkJMQUNLIiwic3Ryb2tlV2lkdGgiLCJ0cmFuc2l0aW9uIiwiUFJJTUFSWV9EQVJLIiwiZGlzYWJsZWRTZWNvbmRhcnkiLCJjb3JyZWN0IiwiaW5jb3JyZWN0IiwibWlzc2luZyIsInN0cm9rZURhc2hhcnJheSIsImxpbmVUb29sIiwiZXhwb3J0cyIsInR5cGUiLCJDb21wb25lbnQiLCJhZGRQb2ludCIsInBvaW50IiwibWFyayIsImVxdWFsUG9pbnRzIiwicm9vdCIsImJ1aWxkaW5nIiwiZnJvbSIsInRvIiwibGluZVRvb2xDb21wb25lbnQiLCJfTGluZVRvb2xDb21wb25lbnQiLCJfUmVhY3QkQ29tcG9uZW50IiwiTGluZVRvb2xDb21wb25lbnQiLCJwcm9wcyIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsInNldFN0YXRlIiwiX3RoaXMkcHJvcHMiLCJvbkNoYW5nZSIsInVwZGF0ZSIsInN0YXRlIiwidW5kZWZpbmVkIiwic2hvdWxkTm90Q2hhbmdlIiwic2FtZUF4ZXMiLCJ5IiwiaXNFcXVhbCIsIl9yZWYyIiwibWlkZGxlIiwiX3JlZjMiLCJfdGhpcyRwcm9wczIiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsInZhbHVlIiwicmVuZGVyIiwiX3RoaXMkcHJvcHMzIiwiZ3JhcGhQcm9wcyIsIm9uQ2xpY2siLCJsYWJlbE5vZGUiLCJsYWJlbE1vZGVFbmFibGVkIiwiY29vcmRpbmF0ZXNPbkhvdmVyIiwibGltaXRMYWJlbGluZyIsImNsb25lRGVlcCIsImlzQmFja2dyb3VuZCIsImNyZWF0ZUVsZW1lbnQiLCJjaGFuZ2VNYXJrIiwiY2hhbmdlTWFya1Byb3BzIiwib25EcmFnU3RhcnQiLCJzdGFydERyYWciLCJvbkRyYWdTdG9wIiwic3RvcERyYWciLCJSZWFjdCIsInR5cGVzIiwiVG9vbFByb3BUeXBlRmllbGRzIiwiR3JhcGhQcm9wc1R5cGUiLCJpc1JlcXVpcmVkIiwiUHJvcFR5cGVzIiwiYm9vbCIsImZ1bmMiLCJQb2ludFR5cGUiLCJkcmFnT3B0cyIsImJvdW5kcyIsIl9yZWY0IiwiZG9tYWluIiwicmFuZ2UiLCJhcmVhIiwidXRpbHMiLCJsaW5lVG9BcmVhIiwiYW5jaG9yUG9pbnQiLCJmcm9tRGVsdGEiLCJkZWx0YSIsImFkZCIsImxpbmVCYXNlIiwiQ29tcCIsIm9wdHMiLCJEcmFnZ2FibGVDb21wIiwiZ3JpZERyYWdnYWJsZSIsIkZyb21Qb2ludCIsIkJhc2VQb2ludCIsIlRvUG9pbnQiLCJMaW5lQmFzZSIsIl9SZWFjdCRDb21wb25lbnQyIiwiX3RoaXMyIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJjb25jYXQiLCJfdGhpczIkcHJvcHMiLCJnZXRNaWRkbGVPZlR3b1BvaW50cyIsIl9yZWY1IiwiZHJhZ2dlZEZyb20iLCJkcmFnZ2VkVG8iLCJfdGhpczIkcHJvcHMyIiwibGFiZWwiLCJ1cGRhdGVkIiwiX3RoaXMyJHByb3BzMyIsIm9uQ2hhbmdlUG9pbnQiLCJfdGhpczIkcHJvcHM0IiwiaXNFbXB0eSIsImRhdGEiLCJfdGhpczIkcHJvcHM1IiwiaW5wdXQiLCJmb2N1cyIsIl90aGlzMyIsIl90aGlzJHByb3BzNCIsImNvbW1vbiIsImFuZ2xlIiwidHJpZyIsInRvRGVncmVlcyIsImZyb21MYWJlbE5vZGUiLCJ0b0xhYmVsTm9kZSIsImxpbmVMYWJlbE5vZGUiLCJoYXNPd25Qcm9wZXJ0eSIsIlJlYWN0RE9NIiwiY3JlYXRlUG9ydGFsIiwiaW5wdXRSZWYiLCJsYWJlbENoYW5nZSIsIl9leHRlbmRzMiIsIm9uRHJhZyIsImRyYWdDb21wIiwiY2xpY2tQb2ludCIsIngiLCJkcmFnRnJvbSIsImRyYWdUbyIsInN0cmluZyIsIm9iamVjdCIsInN0eWxlcyIsImxpbmUiLCJhcnJvdyIsImRpc2FibGVkQXJyb3ciLCJ0aGVtZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90b29scy9zaGFyZWQvbGluZS9pbmRleC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2xvZGFzaC9pc0VxdWFsJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoL2Nsb25lRGVlcCc7XG5pbXBvcnQgeyBCYXNlUG9pbnQgfSBmcm9tICcuLi9wb2ludCc7XG5pbXBvcnQgeyB0eXBlcywgdXRpbHMsIGdyaWREcmFnZ2FibGUsIHRyaWcgfSBmcm9tICdAcGllLWxpYi9wbG90JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBkaXNhYmxlZCwgZGlzYWJsZWRTZWNvbmRhcnksIGNvcnJlY3QsIGluY29ycmVjdCwgbWlzc2luZyB9IGZyb20gJy4uL3N0eWxlcyc7XG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCBNYXJrTGFiZWwgZnJvbSAnLi4vLi4vLi4vbWFyay1sYWJlbCc7XG5pbXBvcnQgaXNFbXB0eSBmcm9tICdsb2Rhc2gvaXNFbXB0eSc7XG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ0BwaWUtbGliL3JlbmRlci11aSc7XG5pbXBvcnQgeyBnZXRNaWRkbGVPZlR3b1BvaW50cywgZXF1YWxQb2ludHMsIHNhbWVBeGVzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9zdHlsZXMnO1xuXG5jb25zdCBTdHlsZWRMaW5lR3JvdXAgPSBzdHlsZWQoJ2cnKSgoeyBkaXNhYmxlZCwgY29ycmVjdG5lc3MgfSkgPT4gKHtcbiAgJyYgbGluZSc6IHtcbiAgICBmaWxsOiAndHJhbnNwYXJlbnQnLFxuICAgIHN0cm9rZTogY29sb3IuZGVmYXVsdHMuQkxBQ0ssXG4gICAgc3Ryb2tlV2lkdGg6IDMsXG4gICAgdHJhbnNpdGlvbjogJ3N0cm9rZSAyMDBtcyBlYXNlLWluLCBzdHJva2Utd2lkdGggMjAwbXMgZWFzZS1pbicsXG4gICAgJyY6aG92ZXInOiB7XG4gICAgICBzdHJva2VXaWR0aDogNixcbiAgICAgIHN0cm9rZTogY29sb3IuZGVmYXVsdHMuUFJJTUFSWV9EQVJLLFxuICAgIH0sXG4gIH0sXG4gIC4uLihkaXNhYmxlZCAmJiB7XG4gICAgJyYgbGluZSc6IHtcbiAgICAgIC4uLmRpc2FibGVkU2Vjb25kYXJ5KCdzdHJva2UnKSxcbiAgICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgIH0sXG4gIH0pLFxuICAuLi4oY29ycmVjdG5lc3MgPT09ICdjb3JyZWN0JyAmJiB7XG4gICAgJyYgbGluZSc6IHtcbiAgICAgIC4uLmNvcnJlY3QoJ3N0cm9rZScpLFxuICAgIH0sXG4gIH0pLFxuICAuLi4oY29ycmVjdG5lc3MgPT09ICdpbmNvcnJlY3QnICYmIHtcbiAgICAnJiBsaW5lJzoge1xuICAgICAgLi4uaW5jb3JyZWN0KCdzdHJva2UnKSxcbiAgICB9LFxuICB9KSxcbiAgLi4uKGNvcnJlY3RuZXNzID09PSAnbWlzc2luZycgJiYge1xuICAgICcmIGxpbmUnOiB7XG4gICAgICAuLi5taXNzaW5nKCdzdHJva2UnKSxcbiAgICAgIHN0cm9rZVdpZHRoOiAxLFxuICAgICAgc3Ryb2tlRGFzaGFycmF5OiAnNCAzJyxcbiAgICB9LFxuICB9KSxcbn0pKTtcblxuZXhwb3J0IGNvbnN0IGxpbmVUb29sID0gKHR5cGUsIENvbXBvbmVudCkgPT4gKCkgPT4gKHtcbiAgdHlwZSxcbiAgQ29tcG9uZW50LFxuICBhZGRQb2ludDogKHBvaW50LCBtYXJrKSA9PiB7XG4gICAgaWYgKG1hcmsgJiYgZXF1YWxQb2ludHMobWFyay5yb290LCBwb2ludCkpIHtcbiAgICAgIHJldHVybiBtYXJrO1xuICAgIH1cblxuICAgIGlmICghbWFyaykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIGZyb206IHBvaW50LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZXF1YWxQb2ludHMocG9pbnQsIG1hcmsuZnJvbSkpIHtcbiAgICAgIHJldHVybiB7IC4uLm1hcmsgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyAuLi5tYXJrLCBidWlsZGluZzogZmFsc2UsIHRvOiBwb2ludCB9O1xuICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBsaW5lVG9vbENvbXBvbmVudCA9IChDb21wb25lbnQpID0+IHtcbiAgcmV0dXJuIGNsYXNzIExpbmVUb29sQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgLi4udHlwZXMuVG9vbFByb3BUeXBlRmllbGRzLFxuICAgICAgZ3JhcGhQcm9wczogdHlwZXMuR3JhcGhQcm9wc1R5cGUuaXNSZXF1aXJlZCxcbiAgICAgIGxpbWl0TGFiZWxpbmc6IFByb3BUeXBlcy5ib29sLFxuICAgICAgY2hhbmdlTWFya1Byb3BzOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIGZyb206IHR5cGVzLlBvaW50VHlwZSxcbiAgICAgIHRvOiB0eXBlcy5Qb2ludFR5cGUsXG4gICAgICBsYWJlbE1vZGVFbmFibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgdGhpcy5zdGF0ZSA9IHt9O1xuICAgIH1cblxuICAgIHN0YXJ0RHJhZyA9ICgpID0+IHRoaXMuc2V0U3RhdGUoeyBtYXJrOiB7IC4uLnRoaXMucHJvcHMubWFyayB9IH0pO1xuXG4gICAgc3RvcERyYWcgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7IG9uQ2hhbmdlLCBtYXJrIH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgdXBkYXRlID0geyAuLi50aGlzLnN0YXRlLm1hcmsgfTtcblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7IG1hcms6IHVuZGVmaW5lZCB9LCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdHlwZSB9ID0gdXBkYXRlO1xuICAgICAgICBsZXQgc2hvdWxkTm90Q2hhbmdlID1cbiAgICAgICAgICB0eXBlICYmXG4gICAgICAgICAgKHR5cGUgPT09ICdwYXJhYm9sYScgfHwgdHlwZSA9PT0gJ3NpbmUnIHx8IHR5cGUgPT09ICdhYnNvbHV0ZScgfHwgdHlwZSA9PT0gJ2V4cG9uZW50aWFsJykgJiZcbiAgICAgICAgICBzYW1lQXhlcyh1cGRhdGUuZnJvbSwgdXBkYXRlLnRvKTtcbiAgICAgICAgaWYgKCFzaG91bGROb3RDaGFuZ2UgJiYgdHlwZSAmJiB0eXBlID09PSAnZXhwb25lbnRpYWwnICYmIHVwZGF0ZS5mcm9tICYmIHVwZGF0ZS50bykge1xuICAgICAgICAgIHNob3VsZE5vdENoYW5nZSA9IHVwZGF0ZS5mcm9tLnkgPT09IDAgfHwgdXBkYXRlLnRvLnkgPT09IDAgfHwgdXBkYXRlLmZyb20ueSAqIHVwZGF0ZS50by55IDwgMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwobWFyaywgdXBkYXRlKSAmJiAhc2hvdWxkTm90Q2hhbmdlKSB7XG4gICAgICAgICAgb25DaGFuZ2UobWFyaywgdXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNoYW5nZU1hcmsgPSAoeyBmcm9tLCB0bywgbWlkZGxlIH0pID0+IHtcbiAgICAgIGxldCBtYXJrID0geyAuLi50aGlzLnN0YXRlLm1hcmssIGZyb20sIHRvIH07XG5cbiAgICAgIGlmIChtaWRkbGUpIHtcbiAgICAgICAgbWFyayA9IHsgLi4ubWFyaywgbWlkZGxlIH07XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBtYXJrIH0pO1xuICAgIH07XG5cbiAgICBjaGFuZ2VNYXJrUHJvcHMgPSAoeyBmcm9tLCB0bywgbWlkZGxlIH0pID0+IHtcbiAgICAgIGNvbnN0IHsgb25DaGFuZ2UsIG1hcmsgfSA9IHRoaXMucHJvcHM7XG4gICAgICBsZXQgdXBkYXRlID0geyAuLi5tYXJrLCAuLi50aGlzLnN0YXRlLm1hcmsgfTtcblxuICAgICAgaWYgKGZyb20pIHtcbiAgICAgICAgdXBkYXRlID0geyAuLi51cGRhdGUsIGZyb20gfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRvKSB7XG4gICAgICAgIHVwZGF0ZSA9IHsgLi4udXBkYXRlLCB0byB9O1xuICAgICAgfVxuXG4gICAgICBpZiAobWlkZGxlKSB7XG4gICAgICAgIHVwZGF0ZSA9IHsgLi4udXBkYXRlLCBtaWRkbGUgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0VxdWFsKG1hcmssIHVwZGF0ZSkpIHtcbiAgICAgICAgb25DaGFuZ2UobWFyaywgdXBkYXRlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3QgeyBncmFwaFByb3BzLCBvbkNsaWNrLCBsYWJlbE5vZGUsIGxhYmVsTW9kZUVuYWJsZWQsIGNvb3JkaW5hdGVzT25Ib3ZlciwgbGltaXRMYWJlbGluZyB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IG1hcmsgPSB0aGlzLnN0YXRlLm1hcmsgPyB0aGlzLnN0YXRlLm1hcmsgOiB0aGlzLnByb3BzLm1hcms7XG5cbiAgICAgIGNvbnN0IGZyb20gPSBjbG9uZURlZXAobWFyay5mcm9tKTtcbiAgICAgIGNvbnN0IHRvID0gY2xvbmVEZWVwKG1hcmsudG8pO1xuICAgICAgY29uc3QgbWlkZGxlID0gY2xvbmVEZWVwKG1hcmsubWlkZGxlKTtcblxuICAgICAgLy8gU0VUIERJU0FCTEVEXG4gICAgICAvLyBpZiBpdCdzIGEgYmFja2dyb3VuZCBtYXJrLCB3ZSBuZWVkIHRvIGZvcmNlIGRpc2FibGUgaXRcbiAgICAgIGlmIChmcm9tICYmIG1hcmsuaXNCYWNrZ3JvdW5kKSB7XG4gICAgICAgIGZyb20uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodG8gJiYgbWFyay5pc0JhY2tncm91bmQpIHtcbiAgICAgICAgdG8uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobWlkZGxlICYmIG1hcmsuaXNCYWNrZ3JvdW5kKSB7XG4gICAgICAgIG1pZGRsZS5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxDb21wb25lbnRcbiAgICAgICAgICBkaXNhYmxlZD17bWFyay5kaXNhYmxlZH1cbiAgICAgICAgICBjb29yZGluYXRlc09uSG92ZXI9e2Nvb3JkaW5hdGVzT25Ib3Zlcn1cbiAgICAgICAgICBjb3JyZWN0bmVzcz17bWFyay5jb3JyZWN0bmVzc31cbiAgICAgICAgICBmcm9tPXtmcm9tfVxuICAgICAgICAgIHRvPXt0b31cbiAgICAgICAgICBtaWRkbGU9e21pZGRsZX1cbiAgICAgICAgICBncmFwaFByb3BzPXtncmFwaFByb3BzfVxuICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmNoYW5nZU1hcmt9XG4gICAgICAgICAgY2hhbmdlTWFya1Byb3BzPXt0aGlzLmNoYW5nZU1hcmtQcm9wc31cbiAgICAgICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgICAgIG9uRHJhZ1N0YXJ0PXt0aGlzLnN0YXJ0RHJhZ31cbiAgICAgICAgICBvbkRyYWdTdG9wPXt0aGlzLnN0b3BEcmFnfVxuICAgICAgICAgIGxhYmVsTm9kZT17bGFiZWxOb2RlfVxuICAgICAgICAgIGxhYmVsTW9kZUVuYWJsZWQ9e2xhYmVsTW9kZUVuYWJsZWR9XG4gICAgICAgICAgbGltaXRMYWJlbGluZz17bGltaXRMYWJlbGluZ31cbiAgICAgICAgLz5cbiAgICAgICk7XG4gICAgfVxuICB9O1xufTtcblxuY29uc3QgZHJhZ09wdHMgPSAoKSA9PiAoe1xuICBib3VuZHM6IChwcm9wcywgeyBkb21haW4sIHJhbmdlIH0pID0+IHtcbiAgICBjb25zdCBhcmVhID0gdXRpbHMubGluZVRvQXJlYShwcm9wcy5mcm9tLCBwcm9wcy50byk7XG4gICAgcmV0dXJuIHV0aWxzLmJvdW5kcyhhcmVhLCBkb21haW4sIHJhbmdlKTtcbiAgfSxcbiAgYW5jaG9yUG9pbnQ6IChwcm9wcykgPT4ge1xuICAgIGNvbnN0IHsgZnJvbSB9ID0gcHJvcHM7XG4gICAgcmV0dXJuIGZyb207XG4gIH0sXG4gIGZyb21EZWx0YTogKHByb3BzLCBkZWx0YSkgPT4ge1xuICAgIGNvbnN0IHsgZnJvbSwgdG8gfSA9IHByb3BzO1xuICAgIHJldHVybiB7XG4gICAgICBmcm9tOiB1dGlscy5wb2ludChmcm9tKS5hZGQodXRpbHMucG9pbnQoZGVsdGEpKSxcbiAgICAgIHRvOiB1dGlscy5wb2ludCh0bykuYWRkKHV0aWxzLnBvaW50KGRlbHRhKSksXG4gICAgfTtcbiAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgbGluZUJhc2UgPSAoQ29tcCwgb3B0cykgPT4ge1xuICBjb25zdCBEcmFnZ2FibGVDb21wID0gZ3JpZERyYWdnYWJsZShkcmFnT3B0cygpKShDb21wKTtcblxuICBjb25zdCBGcm9tUG9pbnQgPSBvcHRzICYmIG9wdHMuZnJvbSA/IG9wdHMuZnJvbSA6IEJhc2VQb2ludDtcbiAgY29uc3QgVG9Qb2ludCA9IG9wdHMgJiYgb3B0cy50byA/IG9wdHMudG8gOiBCYXNlUG9pbnQ7XG5cbiAgY2xhc3MgTGluZUJhc2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICBjb29yZGluYXRlc09uSG92ZXI6IFByb3BUeXBlcy5ib29sLFxuICAgICAgZ3JhcGhQcm9wczogdHlwZXMuR3JhcGhQcm9wc1R5cGUsXG4gICAgICBmcm9tOiB0eXBlcy5Qb2ludFR5cGUsXG4gICAgICB0bzogdHlwZXMuUG9pbnRUeXBlLFxuICAgICAgbWlkZGxlOiB0eXBlcy5Qb2ludFR5cGUsXG4gICAgICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICBvbkRyYWdTdGFydDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICBvbkRyYWdTdG9wOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgY29ycmVjdG5lc3M6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG4gICAgICBsaW1pdExhYmVsaW5nOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIGNoYW5nZU1hcmtQcm9wczogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICBsYWJlbE1vZGVFbmFibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIGxhYmVsTm9kZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICB9O1xuXG4gICAgb25DaGFuZ2VQb2ludCA9IChwb2ludCkgPT4ge1xuICAgICAgY29uc3QgeyBtaWRkbGUsIG9uQ2hhbmdlIH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgeyBmcm9tLCB0byB9ID0gcG9pbnQ7XG5cbiAgICAgIC8vIGJlY2F1c2UgcG9pbnQuZnJvbS5sYWJlbCBhbmQgcG9pbnQudG8ubGFiZWwgY2FuIGJlIGRpZmZlcmVudFxuICAgICAgaWYgKCFlcXVhbFBvaW50cyhmcm9tLCB0bykpIHtcbiAgICAgICAgaWYgKG1pZGRsZSkge1xuICAgICAgICAgIHBvaW50Lm1pZGRsZSA9IHsgLi4ubWlkZGxlLCAuLi5nZXRNaWRkbGVPZlR3b1BvaW50cyhmcm9tLCB0bykgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9uQ2hhbmdlKHBvaW50KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZHJhZ0NvbXAgPSAoeyBmcm9tOiBkcmFnZ2VkRnJvbSwgdG86IGRyYWdnZWRUbyB9KSA9PiB7XG4gICAgICBjb25zdCB7IGZyb20sIHRvLCBvbkNoYW5nZSwgbWlkZGxlIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICBpZiAoZnJvbS5sYWJlbCkge1xuICAgICAgICBkcmFnZ2VkRnJvbS5sYWJlbCA9IGZyb20ubGFiZWw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0by5sYWJlbCkge1xuICAgICAgICBkcmFnZ2VkVG8ubGFiZWwgPSB0by5sYWJlbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdXBkYXRlZCA9IHsgZnJvbTogZHJhZ2dlZEZyb20sIHRvOiBkcmFnZ2VkVG8gfTtcblxuICAgICAgaWYgKG1pZGRsZSkge1xuICAgICAgICB1cGRhdGVkLm1pZGRsZSA9IHsgLi4ubWlkZGxlLCAuLi5nZXRNaWRkbGVPZlR3b1BvaW50cyhkcmFnZ2VkRnJvbSwgZHJhZ2dlZFRvKSB9O1xuICAgICAgfVxuXG4gICAgICBvbkNoYW5nZSh1cGRhdGVkKTtcbiAgICB9O1xuXG4gICAgZHJhZ0Zyb20gPSAoZHJhZ2dlZEZyb20pID0+IHtcbiAgICAgIGNvbnN0IHsgZnJvbSwgdG8gfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgIGlmIChmcm9tLmxhYmVsKSB7XG4gICAgICAgIGRyYWdnZWRGcm9tLmxhYmVsID0gZnJvbS5sYWJlbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlcXVhbFBvaW50cyhkcmFnZ2VkRnJvbSwgdG8pKSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2VQb2ludCh7IGZyb206IGRyYWdnZWRGcm9tLCB0bzogdG8gfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGRyYWdUbyA9IChkcmFnZ2VkVG8pID0+IHtcbiAgICAgIGNvbnN0IHsgZnJvbSwgdG8gfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgIGlmICh0by5sYWJlbCkge1xuICAgICAgICBkcmFnZ2VkVG8ubGFiZWwgPSB0by5sYWJlbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlcXVhbFBvaW50cyhmcm9tLCBkcmFnZ2VkVG8pKSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2VQb2ludCh7IGZyb206IGZyb20sIHRvOiBkcmFnZ2VkVG8gfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxhYmVsQ2hhbmdlID0gKHBvaW50LCB0eXBlKSA9PiB7XG4gICAgICBjb25zdCB7IGNoYW5nZU1hcmtQcm9wcyB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IHVwZGF0ZSA9IHsgLi4ucG9pbnQgfTtcblxuICAgICAgaWYgKCFwb2ludC5sYWJlbCB8fCBpc0VtcHR5KHBvaW50LmxhYmVsKSkge1xuICAgICAgICBkZWxldGUgdXBkYXRlLmxhYmVsO1xuICAgICAgfVxuXG4gICAgICBjaGFuZ2VNYXJrUHJvcHMoeyBbdHlwZV06IHVwZGF0ZSB9KTtcbiAgICB9O1xuXG4gICAgY2xpY2tQb2ludCA9IChwb2ludCwgdHlwZSwgZGF0YSkgPT4ge1xuICAgICAgY29uc3QgeyBjaGFuZ2VNYXJrUHJvcHMsIGRpc2FibGVkLCBmcm9tLCB0bywgbGFiZWxNb2RlRW5hYmxlZCwgbGltaXRMYWJlbGluZywgb25DbGljayB9ID0gdGhpcy5wcm9wcztcblxuICAgICAgaWYgKCFsYWJlbE1vZGVFbmFibGVkKSB7XG4gICAgICAgIG9uQ2xpY2socG9pbnQgfHwgZGF0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gbGltaXQgbGFiZWxpbmcgdGhlIHBvaW50cyBvZiB0aGUgbGluZVxuICAgICAgaWYgKGxpbWl0TGFiZWxpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZSA9PT0gJ21pZGRsZScgJiYgIXBvaW50ICYmIGZyb20gJiYgdG8pIHtcbiAgICAgICAgcG9pbnQgPSB7IC4uLnBvaW50LCAuLi5nZXRNaWRkbGVPZlR3b1BvaW50cyhmcm9tLCB0bykgfTtcbiAgICAgIH1cblxuICAgICAgY2hhbmdlTWFya1Byb3BzKHsgZnJvbSwgdG8sIFt0eXBlXTogeyBsYWJlbDogJycsIC4uLnBvaW50IH0gfSk7XG5cbiAgICAgIGlmICh0aGlzLmlucHV0W3R5cGVdKSB7XG4gICAgICAgIHRoaXMuaW5wdXRbdHlwZV0uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gSU1QT1JUQU5ULCBkbyBub3QgcmVtb3ZlXG4gICAgaW5wdXQgPSB7fTtcblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY29vcmRpbmF0ZXNPbkhvdmVyLFxuICAgICAgICBncmFwaFByb3BzLFxuICAgICAgICBvbkRyYWdTdGFydCxcbiAgICAgICAgb25EcmFnU3RvcCxcbiAgICAgICAgZnJvbSxcbiAgICAgICAgdG8sXG4gICAgICAgIG1pZGRsZSxcbiAgICAgICAgZGlzYWJsZWQsXG4gICAgICAgIGNvcnJlY3RuZXNzLFxuICAgICAgICBvbkNsaWNrLFxuICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgIGxhYmVsTW9kZUVuYWJsZWQsXG4gICAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IGNvbW1vbiA9IHsgZ3JhcGhQcm9wcywgb25EcmFnU3RhcnQsIG9uRHJhZ1N0b3AsIGRpc2FibGVkLCBjb3JyZWN0bmVzcywgb25DbGljayB9O1xuICAgICAgY29uc3QgYW5nbGUgPSB0byA/IHRyaWcudG9EZWdyZWVzKHRyaWcuYW5nbGUoZnJvbSwgdG8pKSA6IDA7XG5cbiAgICAgIGxldCBmcm9tTGFiZWxOb2RlID0gbnVsbDtcbiAgICAgIGxldCB0b0xhYmVsTm9kZSA9IG51bGw7XG4gICAgICBsZXQgbGluZUxhYmVsTm9kZSA9IG51bGw7XG5cbiAgICAgIGlmIChsYWJlbE5vZGUpIHtcbiAgICAgICAgaWYgKGZyb20gJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sICdsYWJlbCcpKSB7XG4gICAgICAgICAgZnJvbUxhYmVsTm9kZSA9IFJlYWN0RE9NLmNyZWF0ZVBvcnRhbChcbiAgICAgICAgICAgIDxNYXJrTGFiZWxcbiAgICAgICAgICAgICAgaW5wdXRSZWY9eyhyKSA9PiAodGhpcy5pbnB1dC5mcm9tID0gcil9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXshbGFiZWxNb2RlRW5hYmxlZH1cbiAgICAgICAgICAgICAgbWFyaz17ZnJvbX1cbiAgICAgICAgICAgICAgZ3JhcGhQcm9wcz17Z3JhcGhQcm9wc31cbiAgICAgICAgICAgICAgb25DaGFuZ2U9eyhsYWJlbCkgPT4gdGhpcy5sYWJlbENoYW5nZSh7IC4uLmZyb20sIGxhYmVsIH0sICdmcm9tJyl9XG4gICAgICAgICAgICAvPixcbiAgICAgICAgICAgIGxhYmVsTm9kZSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0bywgJ2xhYmVsJykpIHtcbiAgICAgICAgICB0b0xhYmVsTm9kZSA9IFJlYWN0RE9NLmNyZWF0ZVBvcnRhbChcbiAgICAgICAgICAgIDxNYXJrTGFiZWxcbiAgICAgICAgICAgICAgaW5wdXRSZWY9eyhyKSA9PiAodGhpcy5pbnB1dC50byA9IHIpfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17IWxhYmVsTW9kZUVuYWJsZWR9XG4gICAgICAgICAgICAgIG1hcms9e3RvfVxuICAgICAgICAgICAgICBncmFwaFByb3BzPXtncmFwaFByb3BzfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17KGxhYmVsKSA9PiB0aGlzLmxhYmVsQ2hhbmdlKHsgLi4udG8sIGxhYmVsIH0sICd0bycpfVxuICAgICAgICAgICAgLz4sXG4gICAgICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtaWRkbGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1pZGRsZSwgJ2xhYmVsJykpIHtcbiAgICAgICAgICBsaW5lTGFiZWxOb2RlID0gUmVhY3RET00uY3JlYXRlUG9ydGFsKFxuICAgICAgICAgICAgPE1hcmtMYWJlbFxuICAgICAgICAgICAgICBpbnB1dFJlZj17KHIpID0+ICh0aGlzLmlucHV0Lm1pZGRsZSA9IHIpfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17IWxhYmVsTW9kZUVuYWJsZWR9XG4gICAgICAgICAgICAgIG1hcms9e21pZGRsZX1cbiAgICAgICAgICAgICAgZ3JhcGhQcm9wcz17Z3JhcGhQcm9wc31cbiAgICAgICAgICAgICAgb25DaGFuZ2U9eyhsYWJlbCkgPT4gdGhpcy5sYWJlbENoYW5nZSh7IC4uLm1pZGRsZSwgbGFiZWwgfSwgJ21pZGRsZScpfVxuICAgICAgICAgICAgLz4sXG4gICAgICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8U3R5bGVkTGluZUdyb3VwIGRpc2FibGVkPXtkaXNhYmxlZH0gY29ycmVjdG5lc3M9e2NvcnJlY3RuZXNzfT5cbiAgICAgICAgICB7dG8gJiYgKFxuICAgICAgICAgICAgPERyYWdnYWJsZUNvbXBcbiAgICAgICAgICAgICAgZnJvbT17ZnJvbX1cbiAgICAgICAgICAgICAgdG89e3RvfVxuICAgICAgICAgICAgICBtaWRkbGU9e21pZGRsZX1cbiAgICAgICAgICAgICAgb25EcmFnPXt0aGlzLmRyYWdDb21wfVxuICAgICAgICAgICAgICB7Li4uY29tbW9ufVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoZGF0YSkgPT4gdGhpcy5jbGlja1BvaW50KG1pZGRsZSwgJ21pZGRsZScsIGRhdGEpfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgICAgIHtsaW5lTGFiZWxOb2RlfVxuXG4gICAgICAgICAgPEZyb21Qb2ludFxuICAgICAgICAgICAgeD17ZnJvbS54fVxuICAgICAgICAgICAgeT17ZnJvbS55fVxuICAgICAgICAgICAgbGFiZWxOb2RlPXtsYWJlbE5vZGV9XG4gICAgICAgICAgICBjb29yZGluYXRlc09uSG92ZXI9e2Nvb3JkaW5hdGVzT25Ib3Zlcn1cbiAgICAgICAgICAgIG9uRHJhZz17dGhpcy5kcmFnRnJvbX1cbiAgICAgICAgICAgIHsuLi5jb21tb259XG4gICAgICAgICAgICBvbkNsaWNrPXsoZGF0YSkgPT4gdGhpcy5jbGlja1BvaW50KGZyb20sICdmcm9tJywgZGF0YSl9XG4gICAgICAgICAgLz5cbiAgICAgICAgICB7ZnJvbUxhYmVsTm9kZX1cblxuICAgICAgICAgIHt0byAmJiAoXG4gICAgICAgICAgICA8VG9Qb2ludFxuICAgICAgICAgICAgICB4PXt0by54fVxuICAgICAgICAgICAgICB5PXt0by55fVxuICAgICAgICAgICAgICBhbmdsZT17YW5nbGV9IC8vYW5nbGUgKyA0NX1cbiAgICAgICAgICAgICAgbGFiZWxOb2RlPXtsYWJlbE5vZGV9XG4gICAgICAgICAgICAgIGNvb3JkaW5hdGVzT25Ib3Zlcj17Y29vcmRpbmF0ZXNPbkhvdmVyfVxuICAgICAgICAgICAgICBvbkRyYWc9e3RoaXMuZHJhZ1RvfVxuICAgICAgICAgICAgICB7Li4uY29tbW9ufVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoZGF0YSkgPT4gdGhpcy5jbGlja1BvaW50KHRvLCAndG8nLCBkYXRhKX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgICB7dG9MYWJlbE5vZGV9XG4gICAgICAgIDwvU3R5bGVkTGluZUdyb3VwPlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gTGluZUJhc2U7XG59O1xuXG5leHBvcnQgY29uc3Qgc3R5bGVzID0ge1xuICBsaW5lOiAoKSA9PiAoe1xuICAgIGZpbGw6ICd0cmFuc3BhcmVudCcsXG4gICAgc3Ryb2tlOiBjb2xvci5kZWZhdWx0cy5CTEFDSyxcbiAgICBzdHJva2VXaWR0aDogMyxcbiAgICB0cmFuc2l0aW9uOiAnc3Ryb2tlIDIwMG1zIGVhc2UtaW4sIHN0cm9rZS13aWR0aCAyMDBtcyBlYXNlLWluJyxcbiAgICAnJjpob3Zlcic6IHtcbiAgICAgIHN0cm9rZVdpZHRoOiA2LFxuICAgICAgc3Ryb2tlOiBjb2xvci5kZWZhdWx0cy5QUklNQVJZX0RBUkssXG4gICAgfSxcbiAgfSksXG4gIGFycm93OiAoKSA9PiAoe1xuICAgIGZpbGw6IGNvbG9yLmRlZmF1bHRzLkJMQUNLLFxuICB9KSxcbiAgZGlzYWJsZWRBcnJvdzogKCkgPT4gKHtcbiAgICAuLi5kaXNhYmxlZFNlY29uZGFyeSgpLFxuICB9KSxcbiAgZGlzYWJsZWRTZWNvbmRhcnk6ICgpID0+ICh7XG4gICAgLi4uZGlzYWJsZWRTZWNvbmRhcnkoJ3N0cm9rZScpLFxuICAgIHN0cm9rZVdpZHRoOiAyLFxuICB9KSxcbiAgZGlzYWJsZWQ6ICgpID0+ICh7XG4gICAgLi4uZGlzYWJsZWQoJ3N0cm9rZScpLFxuICAgIHN0cm9rZVdpZHRoOiAyLFxuICB9KSxcbiAgY29ycmVjdDogKHRoZW1lLCBrZXkpID0+ICh7XG4gICAgLi4uY29ycmVjdChrZXkpLFxuICB9KSxcbiAgaW5jb3JyZWN0OiAodGhlbWUsIGtleSkgPT4gKHtcbiAgICAuLi5pbmNvcnJlY3Qoa2V5KSxcbiAgfSksXG4gIG1pc3Npbmc6ICh0aGVtZSwga2V5KSA9PiAoe1xuICAgIC4uLm1pc3Npbmcoa2V5KSxcbiAgICBzdHJva2VXaWR0aDogMSxcbiAgICBzdHJva2VEYXNoYXJyYXk6ICc0IDMnLFxuICB9KSxcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsUUFBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsVUFBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUcsTUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksS0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssVUFBQSxHQUFBTixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU0sT0FBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sU0FBQSxHQUFBUixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVEsVUFBQSxHQUFBVCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVMsUUFBQSxHQUFBVixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVUsU0FBQSxHQUFBVixPQUFBO0FBQ0EsSUFBQVcsTUFBQSxHQUFBWCxPQUFBO0FBQ0EsSUFBQVksUUFBQSxHQUFBWixPQUFBO0FBQThDLFNBQUFhLFdBQUFDLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFdBQUFELENBQUEsT0FBQUUsZ0JBQUEsYUFBQUYsQ0FBQSxPQUFBRywyQkFBQSxhQUFBSixDQUFBLEVBQUFLLHlCQUFBLEtBQUFDLE9BQUEsQ0FBQUMsU0FBQSxDQUFBTixDQUFBLEVBQUFDLENBQUEsWUFBQUMsZ0JBQUEsYUFBQUgsQ0FBQSxFQUFBUSxXQUFBLElBQUFQLENBQUEsQ0FBQVEsS0FBQSxDQUFBVCxDQUFBLEVBQUFFLENBQUE7QUFBQSxTQUFBRyww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