@pie-lib/graphing 3.2.0-next.0 → 3.2.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 (113) hide show
  1. package/lib/__tests__/bg.test.js +282 -0
  2. package/lib/__tests__/coordinates-label.test.js +276 -0
  3. package/lib/__tests__/graph-with-controls.test.js +275 -0
  4. package/lib/__tests__/graph.test.js +927 -0
  5. package/lib/__tests__/grid-setup.test.js +729 -0
  6. package/lib/__tests__/grid.test.js +29 -0
  7. package/lib/__tests__/key-legend.test.js +321 -0
  8. package/lib/__tests__/label-svg-icon.test.js +373 -0
  9. package/lib/__tests__/labels.test.js +61 -0
  10. package/lib/__tests__/mark-label.test.js +133 -0
  11. package/lib/__tests__/toggle-bar.test.js +197 -0
  12. package/lib/__tests__/tool-menu.test.js +151 -0
  13. package/lib/__tests__/undo-redo.test.js +31 -0
  14. package/lib/__tests__/use-debounce.test.js +24 -0
  15. package/lib/__tests__/utils.js +70 -0
  16. package/lib/__tests__/utils.test.js +123 -0
  17. package/lib/axis/__tests__/arrow.test.js +60 -0
  18. package/lib/axis/__tests__/axes.test.js +195 -0
  19. package/lib/axis/arrow.js +1 -1
  20. package/lib/axis/axes.js +1 -1
  21. package/lib/axis/index.js +1 -1
  22. package/lib/bg.js +1 -1
  23. package/lib/container/__tests__/actions.test.js +108 -0
  24. package/lib/container/__tests__/index.test.js +503 -0
  25. package/lib/container/__tests__/marks.test.js +259 -0
  26. package/lib/container/__tests__/middleware.test.js +244 -0
  27. package/lib/container/__tests__/reducer.test.js +450 -0
  28. package/lib/container/actions.js +1 -1
  29. package/lib/container/index.js +1 -1
  30. package/lib/container/marks.js +1 -1
  31. package/lib/container/middleware.js +1 -1
  32. package/lib/container/reducer.js +1 -1
  33. package/lib/coordinates-label.js +1 -1
  34. package/lib/graph-with-controls.js +1 -1
  35. package/lib/graph.js +1 -1
  36. package/lib/grid-setup.js +1 -1
  37. package/lib/grid.js +1 -1
  38. package/lib/index.js +1 -1
  39. package/lib/key-legend.js +1 -1
  40. package/lib/label-svg-icon.js +1 -1
  41. package/lib/labels.js +1 -1
  42. package/lib/mark-label.js +1 -1
  43. package/lib/toggle-bar.js +1 -1
  44. package/lib/tool-menu.js +1 -1
  45. package/lib/tools/absolute/__tests__/component.test.js +65 -0
  46. package/lib/tools/absolute/component.js +1 -1
  47. package/lib/tools/absolute/index.js +1 -1
  48. package/lib/tools/circle/__tests__/bg-circle.test.js +33 -0
  49. package/lib/tools/circle/__tests__/component.test.js +615 -0
  50. package/lib/tools/circle/__tests__/index.test.js +576 -0
  51. package/lib/tools/circle/bg-circle.js +1 -1
  52. package/lib/tools/circle/component.js +1 -1
  53. package/lib/tools/circle/index.js +1 -1
  54. package/lib/tools/exponential/__tests__/component.test.js +64 -0
  55. package/lib/tools/exponential/__tests__/index.test.js +828 -0
  56. package/lib/tools/exponential/component.js +1 -1
  57. package/lib/tools/exponential/index.js +1 -1
  58. package/lib/tools/index.js +1 -1
  59. package/lib/tools/line/__tests__/component.test.js +45 -0
  60. package/lib/tools/line/component.js +1 -1
  61. package/lib/tools/line/index.js +1 -1
  62. package/lib/tools/parabola/__tests__/component.test.js +64 -0
  63. package/lib/tools/parabola/__tests__/index.test.js +564 -0
  64. package/lib/tools/parabola/component.js +1 -1
  65. package/lib/tools/parabola/index.js +1 -1
  66. package/lib/tools/point/__tests__/component.test.js +434 -0
  67. package/lib/tools/point/__tests__/index.test.js +262 -0
  68. package/lib/tools/point/component.js +1 -1
  69. package/lib/tools/point/index.js +1 -1
  70. package/lib/tools/polygon/__tests__/component.test.js +485 -0
  71. package/lib/tools/polygon/__tests__/index.test.js +303 -0
  72. package/lib/tools/polygon/__tests__/line.test.js +50 -0
  73. package/lib/tools/polygon/__tests__/polygon.test.js +85 -0
  74. package/lib/tools/polygon/component.js +1 -1
  75. package/lib/tools/polygon/index.js +1 -1
  76. package/lib/tools/polygon/line.js +1 -1
  77. package/lib/tools/polygon/polygon.js +1 -1
  78. package/lib/tools/ray/__tests__/component.test.js +35 -0
  79. package/lib/tools/ray/component.js +1 -1
  80. package/lib/tools/ray/index.js +1 -1
  81. package/lib/tools/segment/__tests__/component.test.js +35 -0
  82. package/lib/tools/segment/component.js +1 -1
  83. package/lib/tools/segment/index.js +1 -1
  84. package/lib/tools/shared/__tests__/arrow-head.test.js +45 -0
  85. package/lib/tools/shared/arrow-head.js +1 -1
  86. package/lib/tools/shared/icons/CorrectSVG.js +1 -1
  87. package/lib/tools/shared/icons/IncorrectSVG.js +1 -1
  88. package/lib/tools/shared/icons/MissingSVG.js +1 -1
  89. package/lib/tools/shared/line/__tests__/index.test.js +124 -0
  90. package/lib/tools/shared/line/__tests__/line-path.test.js +62 -0
  91. package/lib/tools/shared/line/__tests__/with-root-edge.test.js +90 -0
  92. package/lib/tools/shared/line/index.js +1 -1
  93. package/lib/tools/shared/line/line-path.js +1 -1
  94. package/lib/tools/shared/line/with-root-edge.js +1 -1
  95. package/lib/tools/shared/point/__tests__/arrow-point.test.js +127 -0
  96. package/lib/tools/shared/point/__tests__/base-point.test.js +122 -0
  97. package/lib/tools/shared/point/arrow-point.js +1 -1
  98. package/lib/tools/shared/point/arrow.js +1 -1
  99. package/lib/tools/shared/point/base-point.js +1 -1
  100. package/lib/tools/shared/point/index.js +1 -1
  101. package/lib/tools/shared/styles.js +1 -1
  102. package/lib/tools/shared/types.js +1 -1
  103. package/lib/tools/sine/__tests__/component.test.js +72 -0
  104. package/lib/tools/sine/component.js +1 -1
  105. package/lib/tools/sine/index.js +1 -1
  106. package/lib/tools/vector/__tests__/component.test.js +32 -0
  107. package/lib/tools/vector/component.js +1 -1
  108. package/lib/tools/vector/index.js +1 -1
  109. package/lib/undo-redo.js +1 -1
  110. package/lib/use-debounce.js +1 -1
  111. package/lib/utils.js +1 -1
  112. package/package.json +9 -12
  113. package/LICENSE.md +0 -5
@@ -0,0 +1,927 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
6
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _testUtils = require("@pie-lib/test-utils");
9
+ var _utils = require("./utils");
10
+ var _graph = _interopRequireWildcard(require("../graph"));
11
+ var _tools = require("../tools");
12
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
13
+ 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; }
14
+ 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; }
15
+ describe('removeBuildingToolIfCurrentToolDiffers', function () {
16
+ var marks = [{
17
+ type: 'point',
18
+ x: 2,
19
+ y: 2,
20
+ label: 'Point',
21
+ showLabel: true
22
+ }, {
23
+ type: 'line',
24
+ from: {
25
+ x: 0,
26
+ y: 0
27
+ },
28
+ to: {
29
+ x: 1,
30
+ y: 1
31
+ },
32
+ label: 'Line',
33
+ building: true
34
+ }];
35
+ it('keeps all marks if currentTool is the same', function () {
36
+ expect((0, _graph.removeBuildingToolIfCurrentToolDiffers)({
37
+ marks: marks,
38
+ currentTool: {
39
+ type: 'line'
40
+ }
41
+ })).toEqual(marks);
42
+ });
43
+ it('removes building marks if currentTool is different', function () {
44
+ expect((0, _graph.removeBuildingToolIfCurrentToolDiffers)({
45
+ marks: marks,
46
+ currentTool: {
47
+ type: 'different'
48
+ }
49
+ })).toEqual([marks[0]]);
50
+ });
51
+ });
52
+ describe('Graph', function () {
53
+ var onChangeMarks = jest.fn();
54
+ var defaultProps = _objectSpread({
55
+ className: 'className',
56
+ onChangeMarks: onChangeMarks,
57
+ tools: _tools.toolsArr,
58
+ domain: {
59
+ min: 0,
60
+ max: 1,
61
+ step: 1
62
+ },
63
+ range: {
64
+ min: 0,
65
+ max: 1,
66
+ step: 1
67
+ },
68
+ size: {
69
+ width: 400,
70
+ height: 400
71
+ },
72
+ marks: [{
73
+ type: 'point',
74
+ x: 2,
75
+ y: 2,
76
+ label: 'Point',
77
+ showLabel: true
78
+ }, {
79
+ type: 'line',
80
+ from: {
81
+ x: 0,
82
+ y: 0
83
+ },
84
+ to: {
85
+ x: 1,
86
+ y: 1
87
+ },
88
+ label: 'Line'
89
+ }]
90
+ }, (0, _utils.graphProps)());
91
+ beforeEach(function () {
92
+ onChangeMarks.mockClear();
93
+ });
94
+ describe('rendering', function () {
95
+ it('renders without crashing', function () {
96
+ var _render = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
97
+ container = _render.container;
98
+ expect(container.firstChild).toBeInTheDocument();
99
+ });
100
+ it('renders with currentTool', function () {
101
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
102
+ currentTool: _tools.toolsArr[0]
103
+ });
104
+ var _render2 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], props)),
105
+ container = _render2.container;
106
+ expect(container.firstChild).toBeInTheDocument();
107
+ });
108
+ it('renders with marks', function () {
109
+ var _render3 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
110
+ container = _render3.container;
111
+ expect(container.firstChild).toBeInTheDocument();
112
+ });
113
+ it('renders with empty marks array', function () {
114
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
115
+ marks: []
116
+ });
117
+ var _render4 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], props)),
118
+ container = _render4.container;
119
+ expect(container.firstChild).toBeInTheDocument();
120
+ });
121
+ it('renders with labelModeEnabled', function () {
122
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
123
+ labelModeEnabled: true
124
+ });
125
+ var _render5 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], props)),
126
+ container = _render5.container;
127
+ expect(container.firstChild).toBeInTheDocument();
128
+ });
129
+ });
130
+ describe('props handling', function () {
131
+ it('calls onChangeMarks when marks prop changes', function () {
132
+ var _render6 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
133
+ rerender = _render6.rerender;
134
+ var newMarks = [{
135
+ type: 'point',
136
+ x: 3,
137
+ y: 3,
138
+ label: 'New Point',
139
+ showLabel: true
140
+ }];
141
+ rerender(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
142
+ marks: newMarks
143
+ })));
144
+
145
+ // Component should render with new marks
146
+ // Note: onChangeMarks is called internally when marks are changed through user interaction,
147
+ // not when props change, so we just verify the component renders correctly
148
+ expect(onChangeMarks).not.toHaveBeenCalled();
149
+ });
150
+ it('handles undefined onChangeMarks gracefully', function () {
151
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
152
+ onChangeMarks: undefined
153
+ });
154
+ var _render7 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], props)),
155
+ container = _render7.container;
156
+ expect(container.firstChild).toBeInTheDocument();
157
+ });
158
+ });
159
+ describe('removeBuildingToolIfCurrentToolDiffers integration', function () {
160
+ it('removes building marks when currentTool changes', function () {
161
+ var marksWithBuilding = [{
162
+ type: 'point',
163
+ x: 2,
164
+ y: 2,
165
+ label: 'Point',
166
+ showLabel: true
167
+ }, {
168
+ type: 'line',
169
+ from: {
170
+ x: 0,
171
+ y: 0
172
+ },
173
+ to: {
174
+ x: 1,
175
+ y: 1
176
+ },
177
+ building: true
178
+ }];
179
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
180
+ marks: marksWithBuilding,
181
+ currentTool: {
182
+ type: 'point'
183
+ } // Different from building mark type
184
+ });
185
+ var _render8 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], props)),
186
+ container = _render8.container;
187
+ expect(container.firstChild).toBeInTheDocument();
188
+ });
189
+ });
190
+ describe('updateMarks method', function () {
191
+ it('updates an existing mark', function () {
192
+ var wrapper = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps));
193
+ var rerender = wrapper.rerender;
194
+ var updatedMarks = [{
195
+ type: 'point',
196
+ x: 3,
197
+ y: 3,
198
+ label: 'Updated Point',
199
+ showLabel: true
200
+ }, {
201
+ type: 'line',
202
+ from: {
203
+ x: 0,
204
+ y: 0
205
+ },
206
+ to: {
207
+ x: 1,
208
+ y: 1
209
+ },
210
+ label: 'Line'
211
+ }];
212
+ rerender(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
213
+ marks: updatedMarks
214
+ })));
215
+
216
+ // Component should render with updated marks
217
+ expect(wrapper.container.firstChild).toBeInTheDocument();
218
+ });
219
+ it('does not update if mark is duplicated', function () {
220
+ var duplicatedMarks = [{
221
+ type: 'point',
222
+ x: 2,
223
+ y: 2,
224
+ label: 'Point',
225
+ showLabel: true
226
+ }, {
227
+ type: 'point',
228
+ x: 2,
229
+ y: 2,
230
+ label: 'Point',
231
+ showLabel: true
232
+ }];
233
+ var _render9 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
234
+ marks: duplicatedMarks
235
+ }))),
236
+ container = _render9.container;
237
+ expect(container.firstChild).toBeInTheDocument();
238
+ });
239
+ it('adds mark if addIfMissing is true and mark does not exist', function () {
240
+ var _render0 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
241
+ container = _render0.container;
242
+
243
+ // The component should handle adding new marks through user interaction
244
+ expect(container.firstChild).toBeInTheDocument();
245
+ });
246
+ it('does not update if mark has no building flag and is duplicated', function () {
247
+ var marks = [{
248
+ type: 'point',
249
+ x: 2,
250
+ y: 2,
251
+ label: 'Point',
252
+ showLabel: true
253
+ }];
254
+ var _render1 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
255
+ marks: marks
256
+ }))),
257
+ container = _render1.container;
258
+ expect(container.firstChild).toBeInTheDocument();
259
+ });
260
+ it('handles building marks correctly', function () {
261
+ var marksWithBuilding = [{
262
+ type: 'line',
263
+ from: {
264
+ x: 0,
265
+ y: 0
266
+ },
267
+ building: true
268
+ }];
269
+ var _render10 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
270
+ marks: marksWithBuilding
271
+ }))),
272
+ container = _render10.container;
273
+ expect(container.firstChild).toBeInTheDocument();
274
+ });
275
+ it('updates building mark to completed mark', function () {
276
+ var marksWithBuilding = [{
277
+ type: 'line',
278
+ from: {
279
+ x: 0,
280
+ y: 0
281
+ },
282
+ building: true
283
+ }];
284
+ var _render11 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
285
+ marks: marksWithBuilding
286
+ }))),
287
+ rerender = _render11.rerender,
288
+ container = _render11.container;
289
+ var completedMarks = [{
290
+ type: 'line',
291
+ from: {
292
+ x: 0,
293
+ y: 0
294
+ },
295
+ to: {
296
+ x: 1,
297
+ y: 1
298
+ },
299
+ building: false
300
+ }];
301
+ rerender(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
302
+ marks: completedMarks
303
+ })));
304
+ expect(container.firstChild).toBeInTheDocument();
305
+ });
306
+ it('does not call onChangeMarks if update is undefined', function () {
307
+ var _render12 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
308
+ container = _render12.container;
309
+
310
+ // If update is undefined, onChangeMarks should not be called
311
+ // This is handled internally by the component
312
+ expect(container.firstChild).toBeInTheDocument();
313
+ });
314
+ it('does not add mark if existing is not found and addIfMissing is false', function () {
315
+ var _render13 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
316
+ container = _render13.container;
317
+
318
+ // By default, marks are not added if they don't exist and addIfMissing is false
319
+ expect(container.firstChild).toBeInTheDocument();
320
+ });
321
+ it('calls onChangeMarks with correct marks when updating', function () {
322
+ var marks = [{
323
+ type: 'point',
324
+ x: 2,
325
+ y: 2,
326
+ label: 'Point',
327
+ showLabel: true
328
+ }];
329
+ var _render14 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
330
+ marks: marks
331
+ }))),
332
+ rerender = _render14.rerender;
333
+ var updatedMarks = [{
334
+ type: 'point',
335
+ x: 3,
336
+ y: 3,
337
+ label: 'Updated Point',
338
+ showLabel: true
339
+ }];
340
+ rerender(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
341
+ marks: updatedMarks
342
+ })));
343
+
344
+ // The component handles mark updates internally
345
+ // onChangeMarks is called through user interactions
346
+ });
347
+ it('preserves other marks when updating a specific mark', function () {
348
+ var marks = [{
349
+ type: 'point',
350
+ x: 2,
351
+ y: 2,
352
+ label: 'Point 1',
353
+ showLabel: true
354
+ }, {
355
+ type: 'point',
356
+ x: 3,
357
+ y: 3,
358
+ label: 'Point 2',
359
+ showLabel: true
360
+ }];
361
+ var _render15 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
362
+ marks: marks
363
+ }))),
364
+ container = _render15.container;
365
+ expect(container.firstChild).toBeInTheDocument();
366
+ });
367
+ });
368
+ describe('getComponent method', function () {
369
+ it('returns null if mark is null', function () {
370
+ var _render16 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
371
+ container = _render16.container;
372
+
373
+ // getComponent returns null for null marks
374
+ // This is tested by rendering with undefined marks
375
+ var propsWithoutMarks = _objectSpread(_objectSpread({}, defaultProps), {}, {
376
+ marks: []
377
+ });
378
+ var _render17 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], propsWithoutMarks)),
379
+ emptyContainer = _render17.container;
380
+ expect(emptyContainer.firstChild).toBeInTheDocument();
381
+ });
382
+ it('returns null if mark is undefined', function () {
383
+ var _render18 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], defaultProps)),
384
+ container = _render18.container;
385
+ expect(container.firstChild).toBeInTheDocument();
386
+ });
387
+ it('returns null if tools is undefined', function () {
388
+ var propsWithUndefinedTools = _objectSpread(_objectSpread({}, defaultProps), {}, {
389
+ tools: undefined
390
+ });
391
+ var graphInstance = new _graph["default"](propsWithUndefinedTools);
392
+ var mark = {
393
+ type: 'point',
394
+ x: 1,
395
+ y: 1
396
+ };
397
+ var component = graphInstance.getComponent(mark);
398
+ expect(component).toBeNull();
399
+ });
400
+ it('returns null if tools is empty array', function () {
401
+ var propsWithEmptyTools = _objectSpread(_objectSpread({}, defaultProps), {}, {
402
+ tools: []
403
+ });
404
+ var graphInstance = new _graph["default"](propsWithEmptyTools);
405
+ var mark = {
406
+ type: 'point',
407
+ x: 1,
408
+ y: 1
409
+ };
410
+ var component = graphInstance.getComponent(mark);
411
+ expect(component).toBeNull();
412
+ });
413
+ it('returns null if mark type is not found in tools', function () {
414
+ var graphInstance = new _graph["default"](defaultProps);
415
+ var mark = {
416
+ type: 'nonexistent-type',
417
+ x: 1,
418
+ y: 1
419
+ };
420
+ var component = graphInstance.getComponent(mark);
421
+ expect(component).toBeNull();
422
+ });
423
+ it('returns component if tool has no Component property', function () {
424
+ var toolWithoutComponent = [{
425
+ type: 'custom',
426
+ label: 'Custom'
427
+ }];
428
+ var propsWithCustomTool = _objectSpread(_objectSpread({}, defaultProps), {}, {
429
+ tools: toolWithoutComponent
430
+ });
431
+ var graphInstance = new _graph["default"](propsWithCustomTool);
432
+ var mark = {
433
+ type: 'custom',
434
+ x: 1,
435
+ y: 1
436
+ };
437
+ var component = graphInstance.getComponent(mark);
438
+ expect(component).toBeNull();
439
+ });
440
+ it('returns correct component for point mark', function () {
441
+ var graphInstance = new _graph["default"](defaultProps);
442
+ var mark = {
443
+ type: 'point',
444
+ x: 1,
445
+ y: 1
446
+ };
447
+ var component = graphInstance.getComponent(mark);
448
+ expect(component).toBeTruthy();
449
+ });
450
+ it('returns correct component for line mark', function () {
451
+ var graphInstance = new _graph["default"](defaultProps);
452
+ var mark = {
453
+ type: 'line',
454
+ from: {
455
+ x: 0,
456
+ y: 0
457
+ },
458
+ to: {
459
+ x: 1,
460
+ y: 1
461
+ }
462
+ };
463
+ var component = graphInstance.getComponent(mark);
464
+ expect(component).toBeTruthy();
465
+ });
466
+ it('returns correct component for different mark types', function () {
467
+ var graphInstance = new _graph["default"](defaultProps);
468
+ var pointMark = {
469
+ type: 'point',
470
+ x: 1,
471
+ y: 1
472
+ };
473
+ var lineMark = {
474
+ type: 'line',
475
+ from: {
476
+ x: 0,
477
+ y: 0
478
+ },
479
+ to: {
480
+ x: 1,
481
+ y: 1
482
+ }
483
+ };
484
+ var circleMark = {
485
+ type: 'circle',
486
+ center: {
487
+ x: 0,
488
+ y: 0
489
+ },
490
+ edge: {
491
+ x: 1,
492
+ y: 1
493
+ }
494
+ };
495
+ var pointComponent = graphInstance.getComponent(pointMark);
496
+ var lineComponent = graphInstance.getComponent(lineMark);
497
+ var circleComponent = graphInstance.getComponent(circleMark);
498
+ expect(pointComponent).toBeTruthy();
499
+ expect(lineComponent).toBeTruthy();
500
+ expect(circleComponent).toBeTruthy();
501
+ });
502
+ });
503
+ describe('getComponent method - unit tests', function () {
504
+ it('returns null if mark is null', function () {
505
+ var graphInstance = new _graph["default"](defaultProps);
506
+ var component = graphInstance.getComponent(null);
507
+ expect(component).toBeNull();
508
+ });
509
+ it('returns null if mark is undefined', function () {
510
+ var graphInstance = new _graph["default"](defaultProps);
511
+ var component = graphInstance.getComponent(undefined);
512
+ expect(component).toBeNull();
513
+ });
514
+ it('returns null if tools is undefined', function () {
515
+ var propsWithUndefinedTools = _objectSpread(_objectSpread({}, defaultProps), {}, {
516
+ tools: undefined
517
+ });
518
+ var graphInstance = new _graph["default"](propsWithUndefinedTools);
519
+ var mark = {
520
+ type: 'point',
521
+ x: 1,
522
+ y: 1
523
+ };
524
+ var component = graphInstance.getComponent(mark);
525
+ expect(component).toBeNull();
526
+ });
527
+ it('returns null if tools is empty array', function () {
528
+ var propsWithEmptyTools = _objectSpread(_objectSpread({}, defaultProps), {}, {
529
+ tools: []
530
+ });
531
+ var graphInstance = new _graph["default"](propsWithEmptyTools);
532
+ var mark = {
533
+ type: 'point',
534
+ x: 1,
535
+ y: 1
536
+ };
537
+ var component = graphInstance.getComponent(mark);
538
+ expect(component).toBeNull();
539
+ });
540
+ it('returns null if mark type is not found in tools', function () {
541
+ var graphInstance = new _graph["default"](defaultProps);
542
+ var mark = {
543
+ type: 'nonexistent-type',
544
+ x: 1,
545
+ y: 1
546
+ };
547
+ var component = graphInstance.getComponent(mark);
548
+ expect(component).toBeNull();
549
+ });
550
+ it('returns component if tool has no Component property', function () {
551
+ var toolWithoutComponent = [{
552
+ type: 'custom',
553
+ label: 'Custom'
554
+ }];
555
+ var propsWithCustomTool = _objectSpread(_objectSpread({}, defaultProps), {}, {
556
+ tools: toolWithoutComponent
557
+ });
558
+ var graphInstance = new _graph["default"](propsWithCustomTool);
559
+ var mark = {
560
+ type: 'custom',
561
+ x: 1,
562
+ y: 1
563
+ };
564
+ var component = graphInstance.getComponent(mark);
565
+ expect(component).toBeNull();
566
+ });
567
+ it('returns correct component for point mark', function () {
568
+ var graphInstance = new _graph["default"](defaultProps);
569
+ var mark = {
570
+ type: 'point',
571
+ x: 1,
572
+ y: 1
573
+ };
574
+ var component = graphInstance.getComponent(mark);
575
+ expect(component).toBeTruthy();
576
+ });
577
+ it('returns correct component for line mark', function () {
578
+ var graphInstance = new _graph["default"](defaultProps);
579
+ var mark = {
580
+ type: 'line',
581
+ from: {
582
+ x: 0,
583
+ y: 0
584
+ },
585
+ to: {
586
+ x: 1,
587
+ y: 1
588
+ }
589
+ };
590
+ var component = graphInstance.getComponent(mark);
591
+ expect(component).toBeTruthy();
592
+ });
593
+ it('returns correct component for different mark types', function () {
594
+ var graphInstance = new _graph["default"](defaultProps);
595
+ var pointMark = {
596
+ type: 'point',
597
+ x: 1,
598
+ y: 1
599
+ };
600
+ var lineMark = {
601
+ type: 'line',
602
+ from: {
603
+ x: 0,
604
+ y: 0
605
+ },
606
+ to: {
607
+ x: 1,
608
+ y: 1
609
+ }
610
+ };
611
+ var circleMark = {
612
+ type: 'circle',
613
+ center: {
614
+ x: 0,
615
+ y: 0
616
+ },
617
+ edge: {
618
+ x: 1,
619
+ y: 1
620
+ }
621
+ };
622
+ var pointComponent = graphInstance.getComponent(pointMark);
623
+ var lineComponent = graphInstance.getComponent(lineMark);
624
+ var circleComponent = graphInstance.getComponent(circleMark);
625
+ expect(pointComponent).toBeTruthy();
626
+ expect(lineComponent).toBeTruthy();
627
+ expect(circleComponent).toBeTruthy();
628
+ });
629
+ });
630
+ describe('updateMarks method - unit tests', function () {
631
+ it('does not update if update parameter is null', function () {
632
+ var onChangeMarks = jest.fn();
633
+ var marks = [{
634
+ type: 'point',
635
+ x: 1,
636
+ y: 1
637
+ }];
638
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
639
+ onChangeMarks: onChangeMarks,
640
+ marks: marks
641
+ });
642
+ var graphInstance = new _graph["default"](props);
643
+ var existing = marks[0];
644
+ graphInstance.updateMarks(existing, null);
645
+ expect(onChangeMarks).not.toHaveBeenCalled();
646
+ });
647
+ it('does not update if update parameter is undefined', function () {
648
+ var onChangeMarks = jest.fn();
649
+ var marks = [{
650
+ type: 'point',
651
+ x: 1,
652
+ y: 1
653
+ }];
654
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
655
+ onChangeMarks: onChangeMarks,
656
+ marks: marks
657
+ });
658
+ var graphInstance = new _graph["default"](props);
659
+ var existing = marks[0];
660
+ graphInstance.updateMarks(existing, undefined);
661
+ expect(onChangeMarks).not.toHaveBeenCalled();
662
+ });
663
+ it('updates existing mark when found', function () {
664
+ var onChangeMarks = jest.fn();
665
+ var marks = [{
666
+ type: 'point',
667
+ x: 1,
668
+ y: 1
669
+ }, {
670
+ type: 'point',
671
+ x: 2,
672
+ y: 2
673
+ }];
674
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
675
+ onChangeMarks: onChangeMarks,
676
+ marks: marks
677
+ });
678
+ var graphInstance = new _graph["default"](props);
679
+ var existing = marks[0];
680
+ var updated = {
681
+ type: 'point',
682
+ x: 1,
683
+ y: 3
684
+ };
685
+ graphInstance.updateMarks(existing, updated);
686
+ expect(onChangeMarks).toHaveBeenCalledTimes(1);
687
+ var updatedMarks = onChangeMarks.mock.calls[0][0];
688
+ expect(updatedMarks[0]).toEqual(updated);
689
+ expect(updatedMarks[1]).toEqual(marks[1]);
690
+ });
691
+ it('adds mark if addIfMissing is true and mark not found', function () {
692
+ var onChangeMarks = jest.fn();
693
+ var marks = [{
694
+ type: 'point',
695
+ x: 1,
696
+ y: 1
697
+ }];
698
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
699
+ onChangeMarks: onChangeMarks,
700
+ marks: marks
701
+ });
702
+ var graphInstance = new _graph["default"](props);
703
+ var existing = {
704
+ type: 'point',
705
+ x: 5,
706
+ y: 5
707
+ };
708
+ var updated = {
709
+ type: 'point',
710
+ x: 2,
711
+ y: 2
712
+ };
713
+ graphInstance.updateMarks(existing, updated, true);
714
+ expect(onChangeMarks).toHaveBeenCalledTimes(1);
715
+ var updatedMarks = onChangeMarks.mock.calls[0][0];
716
+ expect(updatedMarks.length).toBe(2);
717
+ expect(updatedMarks[1]).toEqual(updated);
718
+ });
719
+ it('does not add mark if addIfMissing is false and mark not found', function () {
720
+ var onChangeMarks = jest.fn();
721
+ var marks = [{
722
+ type: 'point',
723
+ x: 1,
724
+ y: 1
725
+ }];
726
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
727
+ onChangeMarks: onChangeMarks,
728
+ marks: marks
729
+ });
730
+ var graphInstance = new _graph["default"](props);
731
+ var existing = {
732
+ type: 'point',
733
+ x: 5,
734
+ y: 5
735
+ };
736
+ var updated = {
737
+ type: 'point',
738
+ x: 2,
739
+ y: 2
740
+ };
741
+ graphInstance.updateMarks(existing, updated, false);
742
+ expect(onChangeMarks).not.toHaveBeenCalled();
743
+ });
744
+ it('does not update if mark is still building', function () {
745
+ var onChangeMarks = jest.fn();
746
+ var marks = [{
747
+ type: 'point',
748
+ x: 1,
749
+ y: 1,
750
+ building: true
751
+ }];
752
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
753
+ onChangeMarks: onChangeMarks,
754
+ marks: marks
755
+ });
756
+ var graphInstance = new _graph["default"](props);
757
+ var existing = marks[0];
758
+ var updated = {
759
+ type: 'point',
760
+ x: 2,
761
+ y: 2
762
+ };
763
+ graphInstance.updateMarks(existing, updated);
764
+ expect(onChangeMarks).toHaveBeenCalled();
765
+ });
766
+ it('preserves mark order when updating', function () {
767
+ var onChangeMarks = jest.fn();
768
+ var marks = [{
769
+ type: 'point',
770
+ x: 1,
771
+ y: 1
772
+ }, {
773
+ type: 'point',
774
+ x: 2,
775
+ y: 2
776
+ }, {
777
+ type: 'point',
778
+ x: 3,
779
+ y: 3
780
+ }];
781
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
782
+ onChangeMarks: onChangeMarks,
783
+ marks: marks
784
+ });
785
+ var graphInstance = new _graph["default"](props);
786
+ var existing = marks[1];
787
+ var updated = {
788
+ type: 'point',
789
+ x: 2,
790
+ y: 5
791
+ };
792
+ graphInstance.updateMarks(existing, updated);
793
+ var updatedMarks = onChangeMarks.mock.calls[0][0];
794
+ expect(updatedMarks[0]).toEqual(marks[0]);
795
+ expect(updatedMarks[1]).toEqual(updated);
796
+ expect(updatedMarks[2]).toEqual(marks[2]);
797
+ });
798
+ it('handles empty marks array', function () {
799
+ var onChangeMarks = jest.fn();
800
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
801
+ onChangeMarks: onChangeMarks,
802
+ marks: []
803
+ });
804
+ var graphInstance = new _graph["default"](props);
805
+ var existing = {
806
+ type: 'point',
807
+ x: 1,
808
+ y: 1
809
+ };
810
+ var updated = {
811
+ type: 'point',
812
+ x: 2,
813
+ y: 2
814
+ };
815
+ graphInstance.updateMarks(existing, updated, true);
816
+ expect(onChangeMarks).toHaveBeenCalledTimes(1);
817
+ var updatedMarks = onChangeMarks.mock.calls[0][0];
818
+ expect(updatedMarks.length).toBe(1);
819
+ expect(updatedMarks[0]).toEqual(updated);
820
+ });
821
+ });
822
+ describe('updateMarks and getComponent integration', function () {
823
+ it('updates marks and renders with correct components', function () {
824
+ var initialMarks = [{
825
+ type: 'point',
826
+ x: 2,
827
+ y: 2,
828
+ label: 'Point',
829
+ showLabel: true
830
+ }];
831
+ var _render19 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
832
+ marks: initialMarks
833
+ }))),
834
+ rerender = _render19.rerender,
835
+ container = _render19.container;
836
+ var updatedMarks = [{
837
+ type: 'line',
838
+ from: {
839
+ x: 0,
840
+ y: 0
841
+ },
842
+ to: {
843
+ x: 1,
844
+ y: 1
845
+ },
846
+ label: 'Line'
847
+ }];
848
+ rerender(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
849
+ marks: updatedMarks
850
+ })));
851
+ expect(container.querySelector('#marks')).toBeInTheDocument();
852
+ });
853
+ it('handles adding new marks with different types', function () {
854
+ var initialMarks = [{
855
+ type: 'point',
856
+ x: 2,
857
+ y: 2,
858
+ label: 'Point',
859
+ showLabel: true
860
+ }];
861
+ var _render20 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
862
+ marks: initialMarks
863
+ }))),
864
+ rerender = _render20.rerender,
865
+ container = _render20.container;
866
+ var updatedMarks = [{
867
+ type: 'point',
868
+ x: 2,
869
+ y: 2,
870
+ label: 'Point',
871
+ showLabel: true
872
+ }, {
873
+ type: 'line',
874
+ from: {
875
+ x: 0,
876
+ y: 0
877
+ },
878
+ to: {
879
+ x: 1,
880
+ y: 1
881
+ },
882
+ label: 'Line'
883
+ }];
884
+ rerender(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
885
+ marks: updatedMarks
886
+ })));
887
+ expect(container.querySelector('#marks')).toBeInTheDocument();
888
+ });
889
+ it('handles removing marks', function () {
890
+ var initialMarks = [{
891
+ type: 'point',
892
+ x: 2,
893
+ y: 2,
894
+ label: 'Point',
895
+ showLabel: true
896
+ }, {
897
+ type: 'line',
898
+ from: {
899
+ x: 0,
900
+ y: 0
901
+ },
902
+ to: {
903
+ x: 1,
904
+ y: 1
905
+ },
906
+ label: 'Line'
907
+ }];
908
+ var _render21 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
909
+ marks: initialMarks
910
+ }))),
911
+ rerender = _render21.rerender,
912
+ container = _render21.container;
913
+ var updatedMarks = [{
914
+ type: 'point',
915
+ x: 2,
916
+ y: 2,
917
+ label: 'Point',
918
+ showLabel: true
919
+ }];
920
+ rerender(/*#__PURE__*/_react["default"].createElement(_graph["default"], (0, _extends2["default"])({}, defaultProps, {
921
+ marks: updatedMarks
922
+ })));
923
+ expect(container.querySelector('#marks')).toBeInTheDocument();
924
+ });
925
+ });
926
+ });
927
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl90ZXN0VXRpbHMiLCJfdXRpbHMiLCJfZ3JhcGgiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl90b29scyIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJzZXQiLCJfdCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZXNjcmliZSIsIm1hcmtzIiwidHlwZSIsIngiLCJ5IiwibGFiZWwiLCJzaG93TGFiZWwiLCJmcm9tIiwidG8iLCJidWlsZGluZyIsIml0IiwiZXhwZWN0IiwicmVtb3ZlQnVpbGRpbmdUb29sSWZDdXJyZW50VG9vbERpZmZlcnMiLCJjdXJyZW50VG9vbCIsInRvRXF1YWwiLCJvbkNoYW5nZU1hcmtzIiwiamVzdCIsImZuIiwiZGVmYXVsdFByb3BzIiwiY2xhc3NOYW1lIiwidG9vbHMiLCJ0b29sc0FyciIsImRvbWFpbiIsIm1pbiIsIm1heCIsInN0ZXAiLCJyYW5nZSIsInNpemUiLCJ3aWR0aCIsImhlaWdodCIsImdyYXBoUHJvcHMiLCJiZWZvcmVFYWNoIiwibW9ja0NsZWFyIiwiX3JlbmRlciIsInJlbmRlciIsImNyZWF0ZUVsZW1lbnQiLCJjb250YWluZXIiLCJmaXJzdENoaWxkIiwidG9CZUluVGhlRG9jdW1lbnQiLCJwcm9wcyIsIl9yZW5kZXIyIiwiX3JlbmRlcjMiLCJfcmVuZGVyNCIsImxhYmVsTW9kZUVuYWJsZWQiLCJfcmVuZGVyNSIsIl9yZW5kZXI2IiwicmVyZW5kZXIiLCJuZXdNYXJrcyIsIl9leHRlbmRzMiIsIm5vdCIsInRvSGF2ZUJlZW5DYWxsZWQiLCJ1bmRlZmluZWQiLCJfcmVuZGVyNyIsIm1hcmtzV2l0aEJ1aWxkaW5nIiwiX3JlbmRlcjgiLCJ3cmFwcGVyIiwidXBkYXRlZE1hcmtzIiwiZHVwbGljYXRlZE1hcmtzIiwiX3JlbmRlcjkiLCJfcmVuZGVyMCIsIl9yZW5kZXIxIiwiX3JlbmRlcjEwIiwiX3JlbmRlcjExIiwiY29tcGxldGVkTWFya3MiLCJfcmVuZGVyMTIiLCJfcmVuZGVyMTMiLCJfcmVuZGVyMTQiLCJfcmVuZGVyMTUiLCJfcmVuZGVyMTYiLCJwcm9wc1dpdGhvdXRNYXJrcyIsIl9yZW5kZXIxNyIsImVtcHR5Q29udGFpbmVyIiwiX3JlbmRlcjE4IiwicHJvcHNXaXRoVW5kZWZpbmVkVG9vbHMiLCJncmFwaEluc3RhbmNlIiwiR3JhcGgiLCJtYXJrIiwiY29tcG9uZW50IiwiZ2V0Q29tcG9uZW50IiwidG9CZU51bGwiLCJwcm9wc1dpdGhFbXB0eVRvb2xzIiwidG9vbFdpdGhvdXRDb21wb25lbnQiLCJwcm9wc1dpdGhDdXN0b21Ub29sIiwidG9CZVRydXRoeSIsInBvaW50TWFyayIsImxpbmVNYXJrIiwiY2lyY2xlTWFyayIsImNlbnRlciIsImVkZ2UiLCJwb2ludENvbXBvbmVudCIsImxpbmVDb21wb25lbnQiLCJjaXJjbGVDb21wb25lbnQiLCJleGlzdGluZyIsInVwZGF0ZU1hcmtzIiwidXBkYXRlZCIsInRvSGF2ZUJlZW5DYWxsZWRUaW1lcyIsIm1vY2siLCJjYWxscyIsInRvQmUiLCJpbml0aWFsTWFya3MiLCJfcmVuZGVyMTkiLCJxdWVyeVNlbGVjdG9yIiwiX3JlbmRlcjIwIiwiX3JlbmRlcjIxIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9ncmFwaC50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSAnQHBpZS1saWIvdGVzdC11dGlscyc7XG5pbXBvcnQgeyBncmFwaFByb3BzIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgR3JhcGgsIHsgcmVtb3ZlQnVpbGRpbmdUb29sSWZDdXJyZW50VG9vbERpZmZlcnMgfSBmcm9tICcuLi9ncmFwaCc7XG5pbXBvcnQgeyB0b29sc0FyciB9IGZyb20gJy4uL3Rvb2xzJztcblxuZGVzY3JpYmUoJ3JlbW92ZUJ1aWxkaW5nVG9vbElmQ3VycmVudFRvb2xEaWZmZXJzJywgKCkgPT4ge1xuICBsZXQgbWFya3MgPSBbXG4gICAge1xuICAgICAgdHlwZTogJ3BvaW50JyxcbiAgICAgIHg6IDIsXG4gICAgICB5OiAyLFxuICAgICAgbGFiZWw6ICdQb2ludCcsXG4gICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnbGluZScsXG4gICAgICBmcm9tOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgIHRvOiB7IHg6IDEsIHk6IDEgfSxcbiAgICAgIGxhYmVsOiAnTGluZScsXG4gICAgICBidWlsZGluZzogdHJ1ZSxcbiAgICB9LFxuICBdO1xuXG4gIGl0KCdrZWVwcyBhbGwgbWFya3MgaWYgY3VycmVudFRvb2wgaXMgdGhlIHNhbWUnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHJlbW92ZUJ1aWxkaW5nVG9vbElmQ3VycmVudFRvb2xEaWZmZXJzKHsgbWFya3MsIGN1cnJlbnRUb29sOiB7IHR5cGU6ICdsaW5lJyB9IH0pKS50b0VxdWFsKG1hcmtzKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbW92ZXMgYnVpbGRpbmcgbWFya3MgaWYgY3VycmVudFRvb2wgaXMgZGlmZmVyZW50JywgKCkgPT4ge1xuICAgIGV4cGVjdChyZW1vdmVCdWlsZGluZ1Rvb2xJZkN1cnJlbnRUb29sRGlmZmVycyh7IG1hcmtzLCBjdXJyZW50VG9vbDogeyB0eXBlOiAnZGlmZmVyZW50JyB9IH0pKS50b0VxdWFsKFttYXJrc1swXV0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnR3JhcGgnLCAoKSA9PiB7XG4gIGxldCBvbkNoYW5nZU1hcmtzID0gamVzdC5mbigpO1xuXG4gIGNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgICBjbGFzc05hbWU6ICdjbGFzc05hbWUnLFxuICAgIG9uQ2hhbmdlTWFya3MsXG4gICAgdG9vbHM6IHRvb2xzQXJyLFxuICAgIGRvbWFpbjogeyBtaW46IDAsIG1heDogMSwgc3RlcDogMSB9LFxuICAgIHJhbmdlOiB7IG1pbjogMCwgbWF4OiAxLCBzdGVwOiAxIH0sXG4gICAgc2l6ZTogeyB3aWR0aDogNDAwLCBoZWlnaHQ6IDQwMCB9LFxuICAgIG1hcmtzOiBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgIHg6IDIsXG4gICAgICAgIHk6IDIsXG4gICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0eXBlOiAnbGluZScsXG4gICAgICAgIGZyb206IHsgeDogMCwgeTogMCB9LFxuICAgICAgICB0bzogeyB4OiAxLCB5OiAxIH0sXG4gICAgICAgIGxhYmVsOiAnTGluZScsXG4gICAgICB9LFxuICAgIF0sXG4gICAgLi4uZ3JhcGhQcm9wcygpLFxuICB9O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIG9uQ2hhbmdlTWFya3MubW9ja0NsZWFyKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZW5kZXJpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgd2l0aG91dCBjcmFzaGluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyYXBoIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggY3VycmVudFRvb2wnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBjdXJyZW50VG9vbDogdG9vbHNBcnJbMF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLnByb3BzfSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG1hcmtzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBlbXB0eSBtYXJrcyBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIG1hcmtzOiBbXSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggbGFiZWxNb2RlRW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGxhYmVsTW9kZUVuYWJsZWQ6IHRydWUsXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLnByb3BzfSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwcm9wcyBoYW5kbGluZycsICgpID0+IHtcbiAgICBpdCgnY2FsbHMgb25DaGFuZ2VNYXJrcyB3aGVuIG1hcmtzIHByb3AgY2hhbmdlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcmVyZW5kZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuXG4gICAgICBjb25zdCBuZXdNYXJrcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMyxcbiAgICAgICAgICB5OiAzLFxuICAgICAgICAgIGxhYmVsOiAnTmV3IFBvaW50JyxcbiAgICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICByZXJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gbWFya3M9e25ld01hcmtzfSAvPik7XG5cbiAgICAgIC8vIENvbXBvbmVudCBzaG91bGQgcmVuZGVyIHdpdGggbmV3IG1hcmtzXG4gICAgICAvLyBOb3RlOiBvbkNoYW5nZU1hcmtzIGlzIGNhbGxlZCBpbnRlcm5hbGx5IHdoZW4gbWFya3MgYXJlIGNoYW5nZWQgdGhyb3VnaCB1c2VyIGludGVyYWN0aW9uLFxuICAgICAgLy8gbm90IHdoZW4gcHJvcHMgY2hhbmdlLCBzbyB3ZSBqdXN0IHZlcmlmeSB0aGUgY29tcG9uZW50IHJlbmRlcnMgY29ycmVjdGx5XG4gICAgICBleHBlY3Qob25DaGFuZ2VNYXJrcykubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIHVuZGVmaW5lZCBvbkNoYW5nZU1hcmtzIGdyYWNlZnVsbHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBvbkNoYW5nZU1hcmtzOiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLnByb3BzfSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZW1vdmVCdWlsZGluZ1Rvb2xJZkN1cnJlbnRUb29sRGlmZmVycyBpbnRlZ3JhdGlvbicsICgpID0+IHtcbiAgICBpdCgncmVtb3ZlcyBidWlsZGluZyBtYXJrcyB3aGVuIGN1cnJlbnRUb29sIGNoYW5nZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtYXJrc1dpdGhCdWlsZGluZyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAyLFxuICAgICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdsaW5lJyxcbiAgICAgICAgICBmcm9tOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgICB0bzogeyB4OiAxLCB5OiAxIH0sXG4gICAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBtYXJrczogbWFya3NXaXRoQnVpbGRpbmcsXG4gICAgICAgIGN1cnJlbnRUb29sOiB7IHR5cGU6ICdwb2ludCcgfSwgLy8gRGlmZmVyZW50IGZyb20gYnVpbGRpbmcgbWFyayB0eXBlXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3VwZGF0ZU1hcmtzIG1ldGhvZCcsICgpID0+IHtcbiAgICBpdCgndXBkYXRlcyBhbiBleGlzdGluZyBtYXJrJywgKCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuXG4gICAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSB3cmFwcGVyO1xuXG4gICAgICBjb25zdCB1cGRhdGVkTWFya3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICAgIHg6IDMsXG4gICAgICAgICAgeTogMyxcbiAgICAgICAgICBsYWJlbDogJ1VwZGF0ZWQgUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdsaW5lJyxcbiAgICAgICAgICBmcm9tOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgICB0bzogeyB4OiAxLCB5OiAxIH0sXG4gICAgICAgICAgbGFiZWw6ICdMaW5lJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHJlcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSBtYXJrcz17dXBkYXRlZE1hcmtzfSAvPik7XG5cbiAgICAgIC8vIENvbXBvbmVudCBzaG91bGQgcmVuZGVyIHdpdGggdXBkYXRlZCBtYXJrc1xuICAgICAgZXhwZWN0KHdyYXBwZXIuY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgdXBkYXRlIGlmIG1hcmsgaXMgZHVwbGljYXRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZWRNYXJrcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAyLFxuICAgICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAyLFxuICAgICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyYXBoIHsuLi5kZWZhdWx0UHJvcHN9IG1hcmtzPXtkdXBsaWNhdGVkTWFya3N9IC8+KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdhZGRzIG1hcmsgaWYgYWRkSWZNaXNzaW5nIGlzIHRydWUgYW5kIG1hcmsgZG9lcyBub3QgZXhpc3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG5cbiAgICAgIC8vIFRoZSBjb21wb25lbnQgc2hvdWxkIGhhbmRsZSBhZGRpbmcgbmV3IG1hcmtzIHRocm91Z2ggdXNlciBpbnRlcmFjdGlvblxuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHVwZGF0ZSBpZiBtYXJrIGhhcyBubyBidWlsZGluZyBmbGFnIGFuZCBpcyBkdXBsaWNhdGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWFya3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICAgIHg6IDIsXG4gICAgICAgICAgeTogMixcbiAgICAgICAgICBsYWJlbDogJ1BvaW50JyxcbiAgICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSBtYXJrcz17bWFya3N9IC8+KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGJ1aWxkaW5nIG1hcmtzIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1hcmtzV2l0aEJ1aWxkaW5nID0gW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgICAgIGZyb206IHsgeDogMCwgeTogMCB9LFxuICAgICAgICAgIGJ1aWxkaW5nOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gbWFya3M9e21hcmtzV2l0aEJ1aWxkaW5nfSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgndXBkYXRlcyBidWlsZGluZyBtYXJrIHRvIGNvbXBsZXRlZCBtYXJrJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWFya3NXaXRoQnVpbGRpbmcgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnbGluZScsXG4gICAgICAgICAgZnJvbTogeyB4OiAwLCB5OiAwIH0sXG4gICAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCB7IHJlcmVuZGVyLCBjb250YWluZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gbWFya3M9e21hcmtzV2l0aEJ1aWxkaW5nfSAvPik7XG5cbiAgICAgIGNvbnN0IGNvbXBsZXRlZE1hcmtzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgICAgIGZyb206IHsgeDogMCwgeTogMCB9LFxuICAgICAgICAgIHRvOiB7IHg6IDEsIHk6IDEgfSxcbiAgICAgICAgICBidWlsZGluZzogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICByZXJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gbWFya3M9e2NvbXBsZXRlZE1hcmtzfSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgY2FsbCBvbkNoYW5nZU1hcmtzIGlmIHVwZGF0ZSBpcyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG5cbiAgICAgIC8vIElmIHVwZGF0ZSBpcyB1bmRlZmluZWQsIG9uQ2hhbmdlTWFya3Mgc2hvdWxkIG5vdCBiZSBjYWxsZWRcbiAgICAgIC8vIFRoaXMgaXMgaGFuZGxlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb21wb25lbnRcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCBhZGQgbWFyayBpZiBleGlzdGluZyBpcyBub3QgZm91bmQgYW5kIGFkZElmTWlzc2luZyBpcyBmYWxzZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyYXBoIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcblxuICAgICAgLy8gQnkgZGVmYXVsdCwgbWFya3MgYXJlIG5vdCBhZGRlZCBpZiB0aGV5IGRvbid0IGV4aXN0IGFuZCBhZGRJZk1pc3NpbmcgaXMgZmFsc2VcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZU1hcmtzIHdpdGggY29ycmVjdCBtYXJrcyB3aGVuIHVwZGF0aW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWFya3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICAgIHg6IDIsXG4gICAgICAgICAgeTogMixcbiAgICAgICAgICBsYWJlbDogJ1BvaW50JyxcbiAgICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSByZW5kZXIoPEdyYXBoIHsuLi5kZWZhdWx0UHJvcHN9IG1hcmtzPXttYXJrc30gLz4pO1xuXG4gICAgICBjb25zdCB1cGRhdGVkTWFya3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICAgIHg6IDMsXG4gICAgICAgICAgeTogMyxcbiAgICAgICAgICBsYWJlbDogJ1VwZGF0ZWQgUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHJlcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSBtYXJrcz17dXBkYXRlZE1hcmtzfSAvPik7XG5cbiAgICAgIC8vIFRoZSBjb21wb25lbnQgaGFuZGxlcyBtYXJrIHVwZGF0ZXMgaW50ZXJuYWxseVxuICAgICAgLy8gb25DaGFuZ2VNYXJrcyBpcyBjYWxsZWQgdGhyb3VnaCB1c2VyIGludGVyYWN0aW9uc1xuICAgIH0pO1xuXG4gICAgaXQoJ3ByZXNlcnZlcyBvdGhlciBtYXJrcyB3aGVuIHVwZGF0aW5nIGEgc3BlY2lmaWMgbWFyaycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1hcmtzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3BvaW50JyxcbiAgICAgICAgICB4OiAyLFxuICAgICAgICAgIHk6IDIsXG4gICAgICAgICAgbGFiZWw6ICdQb2ludCAxJyxcbiAgICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICAgIHg6IDMsXG4gICAgICAgICAgeTogMyxcbiAgICAgICAgICBsYWJlbDogJ1BvaW50IDInLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyYXBoIHsuLi5kZWZhdWx0UHJvcHN9IG1hcmtzPXttYXJrc30gLz4pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0Q29tcG9uZW50IG1ldGhvZCcsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBudWxsIGlmIG1hcmsgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyYXBoIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcblxuICAgICAgLy8gZ2V0Q29tcG9uZW50IHJldHVybnMgbnVsbCBmb3IgbnVsbCBtYXJrc1xuICAgICAgLy8gVGhpcyBpcyB0ZXN0ZWQgYnkgcmVuZGVyaW5nIHdpdGggdW5kZWZpbmVkIG1hcmtzXG4gICAgICBjb25zdCBwcm9wc1dpdGhvdXRNYXJrcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBtYXJrczogW10gfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyOiBlbXB0eUNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4ucHJvcHNXaXRob3V0TWFya3N9IC8+KTtcbiAgICAgIGV4cGVjdChlbXB0eUNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiBtYXJrIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyYXBoIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIG51bGwgaWYgdG9vbHMgaXMgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHNXaXRoVW5kZWZpbmVkVG9vbHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgdG9vbHM6IHVuZGVmaW5lZCB9O1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChwcm9wc1dpdGhVbmRlZmluZWRUb29scyk7XG4gICAgICBjb25zdCBtYXJrID0geyB0eXBlOiAncG9pbnQnLCB4OiAxLCB5OiAxIH07XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChtYXJrKTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBudWxsIGlmIHRvb2xzIGlzIGVtcHR5IGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHNXaXRoRW1wdHlUb29scyA9IHsgLi4uZGVmYXVsdFByb3BzLCB0b29sczogW10gfTtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgocHJvcHNXaXRoRW1wdHlUb29scyk7XG4gICAgICBjb25zdCBtYXJrID0geyB0eXBlOiAncG9pbnQnLCB4OiAxLCB5OiAxIH07XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChtYXJrKTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBudWxsIGlmIG1hcmsgdHlwZSBpcyBub3QgZm91bmQgaW4gdG9vbHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBncmFwaEluc3RhbmNlID0gbmV3IEdyYXBoKGRlZmF1bHRQcm9wcyk7XG4gICAgICBjb25zdCBtYXJrID0geyB0eXBlOiAnbm9uZXhpc3RlbnQtdHlwZScsIHg6IDEsIHk6IDEgfTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGdyYXBoSW5zdGFuY2UuZ2V0Q29tcG9uZW50KG1hcmspO1xuICAgICAgZXhwZWN0KGNvbXBvbmVudCkudG9CZU51bGwoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGNvbXBvbmVudCBpZiB0b29sIGhhcyBubyBDb21wb25lbnQgcHJvcGVydHknLCAoKSA9PiB7XG4gICAgICBjb25zdCB0b29sV2l0aG91dENvbXBvbmVudCA9IFt7IHR5cGU6ICdjdXN0b20nLCBsYWJlbDogJ0N1c3RvbScgfV07XG4gICAgICBjb25zdCBwcm9wc1dpdGhDdXN0b21Ub29sID0geyAuLi5kZWZhdWx0UHJvcHMsIHRvb2xzOiB0b29sV2l0aG91dENvbXBvbmVudCB9O1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChwcm9wc1dpdGhDdXN0b21Ub29sKTtcbiAgICAgIGNvbnN0IG1hcmsgPSB7IHR5cGU6ICdjdXN0b20nLCB4OiAxLCB5OiAxIH07XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChtYXJrKTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBjb3JyZWN0IGNvbXBvbmVudCBmb3IgcG9pbnQgbWFyaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgoZGVmYXVsdFByb3BzKTtcbiAgICAgIGNvbnN0IG1hcmsgPSB7IHR5cGU6ICdwb2ludCcsIHg6IDEsIHk6IDEgfTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGdyYXBoSW5zdGFuY2UuZ2V0Q29tcG9uZW50KG1hcmspO1xuICAgICAgZXhwZWN0KGNvbXBvbmVudCkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgY29ycmVjdCBjb21wb25lbnQgZm9yIGxpbmUgbWFyaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgoZGVmYXVsdFByb3BzKTtcbiAgICAgIGNvbnN0IG1hcmsgPSB7IHR5cGU6ICdsaW5lJywgZnJvbTogeyB4OiAwLCB5OiAwIH0sIHRvOiB7IHg6IDEsIHk6IDEgfSB9O1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQobWFyayk7XG4gICAgICBleHBlY3QoY29tcG9uZW50KS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBjb3JyZWN0IGNvbXBvbmVudCBmb3IgZGlmZmVyZW50IG1hcmsgdHlwZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBncmFwaEluc3RhbmNlID0gbmV3IEdyYXBoKGRlZmF1bHRQcm9wcyk7XG5cbiAgICAgIGNvbnN0IHBvaW50TWFyayA9IHsgdHlwZTogJ3BvaW50JywgeDogMSwgeTogMSB9O1xuICAgICAgY29uc3QgbGluZU1hcmsgPSB7IHR5cGU6ICdsaW5lJywgZnJvbTogeyB4OiAwLCB5OiAwIH0sIHRvOiB7IHg6IDEsIHk6IDEgfSB9O1xuICAgICAgY29uc3QgY2lyY2xlTWFyayA9IHsgdHlwZTogJ2NpcmNsZScsIGNlbnRlcjogeyB4OiAwLCB5OiAwIH0sIGVkZ2U6IHsgeDogMSwgeTogMSB9IH07XG5cbiAgICAgIGNvbnN0IHBvaW50Q29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQocG9pbnRNYXJrKTtcbiAgICAgIGNvbnN0IGxpbmVDb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChsaW5lTWFyayk7XG4gICAgICBjb25zdCBjaXJjbGVDb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChjaXJjbGVNYXJrKTtcblxuICAgICAgZXhwZWN0KHBvaW50Q29tcG9uZW50KS50b0JlVHJ1dGh5KCk7XG4gICAgICBleHBlY3QobGluZUNvbXBvbmVudCkudG9CZVRydXRoeSgpO1xuICAgICAgZXhwZWN0KGNpcmNsZUNvbXBvbmVudCkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0Q29tcG9uZW50IG1ldGhvZCAtIHVuaXQgdGVzdHMnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiBtYXJrIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBncmFwaEluc3RhbmNlID0gbmV3IEdyYXBoKGRlZmF1bHRQcm9wcyk7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChudWxsKTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBudWxsIGlmIG1hcmsgaXMgdW5kZWZpbmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChkZWZhdWx0UHJvcHMpO1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQodW5kZWZpbmVkKTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBudWxsIGlmIHRvb2xzIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzV2l0aFVuZGVmaW5lZFRvb2xzID0geyAuLi5kZWZhdWx0UHJvcHMsIHRvb2xzOiB1bmRlZmluZWQgfTtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgocHJvcHNXaXRoVW5kZWZpbmVkVG9vbHMpO1xuICAgICAgY29uc3QgbWFyayA9IHsgdHlwZTogJ3BvaW50JywgeDogMSwgeTogMSB9O1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQobWFyayk7XG4gICAgICBleHBlY3QoY29tcG9uZW50KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiB0b29scyBpcyBlbXB0eSBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzV2l0aEVtcHR5VG9vbHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgdG9vbHM6IFtdIH07XG4gICAgICBjb25zdCBncmFwaEluc3RhbmNlID0gbmV3IEdyYXBoKHByb3BzV2l0aEVtcHR5VG9vbHMpO1xuICAgICAgY29uc3QgbWFyayA9IHsgdHlwZTogJ3BvaW50JywgeDogMSwgeTogMSB9O1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQobWFyayk7XG4gICAgICBleHBlY3QoY29tcG9uZW50KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiBtYXJrIHR5cGUgaXMgbm90IGZvdW5kIGluIHRvb2xzJywgKCkgPT4ge1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChkZWZhdWx0UHJvcHMpO1xuICAgICAgY29uc3QgbWFyayA9IHsgdHlwZTogJ25vbmV4aXN0ZW50LXR5cGUnLCB4OiAxLCB5OiAxIH07XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChtYXJrKTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBjb21wb25lbnQgaWYgdG9vbCBoYXMgbm8gQ29tcG9uZW50IHByb3BlcnR5JywgKCkgPT4ge1xuICAgICAgY29uc3QgdG9vbFdpdGhvdXRDb21wb25lbnQgPSBbeyB0eXBlOiAnY3VzdG9tJywgbGFiZWw6ICdDdXN0b20nIH1dO1xuICAgICAgY29uc3QgcHJvcHNXaXRoQ3VzdG9tVG9vbCA9IHsgLi4uZGVmYXVsdFByb3BzLCB0b29sczogdG9vbFdpdGhvdXRDb21wb25lbnQgfTtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgocHJvcHNXaXRoQ3VzdG9tVG9vbCk7XG4gICAgICBjb25zdCBtYXJrID0geyB0eXBlOiAnY3VzdG9tJywgeDogMSwgeTogMSB9O1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQobWFyayk7XG4gICAgICBleHBlY3QoY29tcG9uZW50KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgY29ycmVjdCBjb21wb25lbnQgZm9yIHBvaW50IG1hcmsnLCAoKSA9PiB7XG4gICAgICBjb25zdCBncmFwaEluc3RhbmNlID0gbmV3IEdyYXBoKGRlZmF1bHRQcm9wcyk7XG4gICAgICBjb25zdCBtYXJrID0geyB0eXBlOiAncG9pbnQnLCB4OiAxLCB5OiAxIH07XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBncmFwaEluc3RhbmNlLmdldENvbXBvbmVudChtYXJrKTtcbiAgICAgIGV4cGVjdChjb21wb25lbnQpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGNvcnJlY3QgY29tcG9uZW50IGZvciBsaW5lIG1hcmsnLCAoKSA9PiB7XG4gICAgICBjb25zdCBncmFwaEluc3RhbmNlID0gbmV3IEdyYXBoKGRlZmF1bHRQcm9wcyk7XG4gICAgICBjb25zdCBtYXJrID0geyB0eXBlOiAnbGluZScsIGZyb206IHsgeDogMCwgeTogMCB9LCB0bzogeyB4OiAxLCB5OiAxIH0gfTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGdyYXBoSW5zdGFuY2UuZ2V0Q29tcG9uZW50KG1hcmspO1xuICAgICAgZXhwZWN0KGNvbXBvbmVudCkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgY29ycmVjdCBjb21wb25lbnQgZm9yIGRpZmZlcmVudCBtYXJrIHR5cGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChkZWZhdWx0UHJvcHMpO1xuXG4gICAgICBjb25zdCBwb2ludE1hcmsgPSB7IHR5cGU6ICdwb2ludCcsIHg6IDEsIHk6IDEgfTtcbiAgICAgIGNvbnN0IGxpbmVNYXJrID0geyB0eXBlOiAnbGluZScsIGZyb206IHsgeDogMCwgeTogMCB9LCB0bzogeyB4OiAxLCB5OiAxIH0gfTtcbiAgICAgIGNvbnN0IGNpcmNsZU1hcmsgPSB7IHR5cGU6ICdjaXJjbGUnLCBjZW50ZXI6IHsgeDogMCwgeTogMCB9LCBlZGdlOiB7IHg6IDEsIHk6IDEgfSB9O1xuXG4gICAgICBjb25zdCBwb2ludENvbXBvbmVudCA9IGdyYXBoSW5zdGFuY2UuZ2V0Q29tcG9uZW50KHBvaW50TWFyayk7XG4gICAgICBjb25zdCBsaW5lQ29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQobGluZU1hcmspO1xuICAgICAgY29uc3QgY2lyY2xlQ29tcG9uZW50ID0gZ3JhcGhJbnN0YW5jZS5nZXRDb21wb25lbnQoY2lyY2xlTWFyayk7XG5cbiAgICAgIGV4cGVjdChwb2ludENvbXBvbmVudCkudG9CZVRydXRoeSgpO1xuICAgICAgZXhwZWN0KGxpbmVDb21wb25lbnQpLnRvQmVUcnV0aHkoKTtcbiAgICAgIGV4cGVjdChjaXJjbGVDb21wb25lbnQpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3VwZGF0ZU1hcmtzIG1ldGhvZCAtIHVuaXQgdGVzdHMnLCAoKSA9PiB7XG4gICAgaXQoJ2RvZXMgbm90IHVwZGF0ZSBpZiB1cGRhdGUgcGFyYW1ldGVyIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZU1hcmtzID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgbWFya3MgPSBbeyB0eXBlOiAncG9pbnQnLCB4OiAxLCB5OiAxIH1dO1xuICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgb25DaGFuZ2VNYXJrcywgbWFya3MgfTtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgocHJvcHMpO1xuXG4gICAgICBjb25zdCBleGlzdGluZyA9IG1hcmtzWzBdO1xuICAgICAgZ3JhcGhJbnN0YW5jZS51cGRhdGVNYXJrcyhleGlzdGluZywgbnVsbCk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZU1hcmtzKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHVwZGF0ZSBpZiB1cGRhdGUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlTWFya3MgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCBtYXJrcyA9IFt7IHR5cGU6ICdwb2ludCcsIHg6IDEsIHk6IDEgfV07XG4gICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkNoYW5nZU1hcmtzLCBtYXJrcyB9O1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChwcm9wcyk7XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gbWFya3NbMF07XG4gICAgICBncmFwaEluc3RhbmNlLnVwZGF0ZU1hcmtzKGV4aXN0aW5nLCB1bmRlZmluZWQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2VNYXJrcykubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCd1cGRhdGVzIGV4aXN0aW5nIG1hcmsgd2hlbiBmb3VuZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlTWFya3MgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCBtYXJrcyA9IFtcbiAgICAgICAgeyB0eXBlOiAncG9pbnQnLCB4OiAxLCB5OiAxIH0sXG4gICAgICAgIHsgdHlwZTogJ3BvaW50JywgeDogMiwgeTogMiB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0UHJvcHMsIG9uQ2hhbmdlTWFya3MsIG1hcmtzIH07XG4gICAgICBjb25zdCBncmFwaEluc3RhbmNlID0gbmV3IEdyYXBoKHByb3BzKTtcblxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBtYXJrc1swXTtcbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSB7IHR5cGU6ICdwb2ludCcsIHg6IDEsIHk6IDMgfTtcblxuICAgICAgZ3JhcGhJbnN0YW5jZS51cGRhdGVNYXJrcyhleGlzdGluZywgdXBkYXRlZCk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZU1hcmtzKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICBjb25zdCB1cGRhdGVkTWFya3MgPSBvbkNoYW5nZU1hcmtzLm1vY2suY2FsbHNbMF1bMF07XG4gICAgICBleHBlY3QodXBkYXRlZE1hcmtzWzBdKS50b0VxdWFsKHVwZGF0ZWQpO1xuICAgICAgZXhwZWN0KHVwZGF0ZWRNYXJrc1sxXSkudG9FcXVhbChtYXJrc1sxXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYWRkcyBtYXJrIGlmIGFkZElmTWlzc2luZyBpcyB0cnVlIGFuZCBtYXJrIG5vdCBmb3VuZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlTWFya3MgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCBtYXJrcyA9IFt7IHR5cGU6ICdwb2ludCcsIHg6IDEsIHk6IDEgfV07XG4gICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkNoYW5nZU1hcmtzLCBtYXJrcyB9O1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChwcm9wcyk7XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0geyB0eXBlOiAncG9pbnQnLCB4OiA1LCB5OiA1IH07XG4gICAgICBjb25zdCB1cGRhdGVkID0geyB0eXBlOiAncG9pbnQnLCB4OiAyLCB5OiAyIH07XG5cbiAgICAgIGdyYXBoSW5zdGFuY2UudXBkYXRlTWFya3MoZXhpc3RpbmcsIHVwZGF0ZWQsIHRydWUpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2VNYXJrcykudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgY29uc3QgdXBkYXRlZE1hcmtzID0gb25DaGFuZ2VNYXJrcy5tb2NrLmNhbGxzWzBdWzBdO1xuICAgICAgZXhwZWN0KHVwZGF0ZWRNYXJrcy5sZW5ndGgpLnRvQmUoMik7XG4gICAgICBleHBlY3QodXBkYXRlZE1hcmtzWzFdKS50b0VxdWFsKHVwZGF0ZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGFkZCBtYXJrIGlmIGFkZElmTWlzc2luZyBpcyBmYWxzZSBhbmQgbWFyayBub3QgZm91bmQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZU1hcmtzID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgbWFya3MgPSBbeyB0eXBlOiAncG9pbnQnLCB4OiAxLCB5OiAxIH1dO1xuICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgb25DaGFuZ2VNYXJrcywgbWFya3MgfTtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgocHJvcHMpO1xuXG4gICAgICBjb25zdCBleGlzdGluZyA9IHsgdHlwZTogJ3BvaW50JywgeDogNSwgeTogNSB9O1xuICAgICAgY29uc3QgdXBkYXRlZCA9IHsgdHlwZTogJ3BvaW50JywgeDogMiwgeTogMiB9O1xuXG4gICAgICBncmFwaEluc3RhbmNlLnVwZGF0ZU1hcmtzKGV4aXN0aW5nLCB1cGRhdGVkLCBmYWxzZSk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZU1hcmtzKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHVwZGF0ZSBpZiBtYXJrIGlzIHN0aWxsIGJ1aWxkaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb25DaGFuZ2VNYXJrcyA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IG1hcmtzID0gW3sgdHlwZTogJ3BvaW50JywgeDogMSwgeTogMSwgYnVpbGRpbmc6IHRydWUgfV07XG4gICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkNoYW5nZU1hcmtzLCBtYXJrcyB9O1xuICAgICAgY29uc3QgZ3JhcGhJbnN0YW5jZSA9IG5ldyBHcmFwaChwcm9wcyk7XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gbWFya3NbMF07XG4gICAgICBjb25zdCB1cGRhdGVkID0geyB0eXBlOiAncG9pbnQnLCB4OiAyLCB5OiAyIH07XG5cbiAgICAgIGdyYXBoSW5zdGFuY2UudXBkYXRlTWFya3MoZXhpc3RpbmcsIHVwZGF0ZWQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2VNYXJrcykudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ByZXNlcnZlcyBtYXJrIG9yZGVyIHdoZW4gdXBkYXRpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZU1hcmtzID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgbWFya3MgPSBbXG4gICAgICAgIHsgdHlwZTogJ3BvaW50JywgeDogMSwgeTogMSB9LFxuICAgICAgICB7IHR5cGU6ICdwb2ludCcsIHg6IDIsIHk6IDIgfSxcbiAgICAgICAgeyB0eXBlOiAncG9pbnQnLCB4OiAzLCB5OiAzIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgb25DaGFuZ2VNYXJrcywgbWFya3MgfTtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgocHJvcHMpO1xuXG4gICAgICBjb25zdCBleGlzdGluZyA9IG1hcmtzWzFdO1xuICAgICAgY29uc3QgdXBkYXRlZCA9IHsgdHlwZTogJ3BvaW50JywgeDogMiwgeTogNSB9O1xuXG4gICAgICBncmFwaEluc3RhbmNlLnVwZGF0ZU1hcmtzKGV4aXN0aW5nLCB1cGRhdGVkKTtcblxuICAgICAgY29uc3QgdXBkYXRlZE1hcmtzID0gb25DaGFuZ2VNYXJrcy5tb2NrLmNhbGxzWzBdWzBdO1xuICAgICAgZXhwZWN0KHVwZGF0ZWRNYXJrc1swXSkudG9FcXVhbChtYXJrc1swXSk7XG4gICAgICBleHBlY3QodXBkYXRlZE1hcmtzWzFdKS50b0VxdWFsKHVwZGF0ZWQpO1xuICAgICAgZXhwZWN0KHVwZGF0ZWRNYXJrc1syXSkudG9FcXVhbChtYXJrc1syXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBlbXB0eSBtYXJrcyBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlTWFya3MgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkNoYW5nZU1hcmtzLCBtYXJrczogW10gfTtcbiAgICAgIGNvbnN0IGdyYXBoSW5zdGFuY2UgPSBuZXcgR3JhcGgocHJvcHMpO1xuXG4gICAgICBjb25zdCBleGlzdGluZyA9IHsgdHlwZTogJ3BvaW50JywgeDogMSwgeTogMSB9O1xuICAgICAgY29uc3QgdXBkYXRlZCA9IHsgdHlwZTogJ3BvaW50JywgeDogMiwgeTogMiB9O1xuXG4gICAgICBncmFwaEluc3RhbmNlLnVwZGF0ZU1hcmtzKGV4aXN0aW5nLCB1cGRhdGVkLCB0cnVlKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlTWFya3MpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRNYXJrcyA9IG9uQ2hhbmdlTWFya3MubW9jay5jYWxsc1swXVswXTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkTWFya3MubGVuZ3RoKS50b0JlKDEpO1xuICAgICAgZXhwZWN0KHVwZGF0ZWRNYXJrc1swXSkudG9FcXVhbCh1cGRhdGVkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3VwZGF0ZU1hcmtzIGFuZCBnZXRDb21wb25lbnQgaW50ZWdyYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3VwZGF0ZXMgbWFya3MgYW5kIHJlbmRlcnMgd2l0aCBjb3JyZWN0IGNvbXBvbmVudHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbml0aWFsTWFya3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICAgIHg6IDIsXG4gICAgICAgICAgeTogMixcbiAgICAgICAgICBsYWJlbDogJ1BvaW50JyxcbiAgICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCB7IHJlcmVuZGVyLCBjb250YWluZXIgfSA9IHJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gbWFya3M9e2luaXRpYWxNYXJrc30gLz4pO1xuXG4gICAgICBjb25zdCB1cGRhdGVkTWFya3MgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnbGluZScsXG4gICAgICAgICAgZnJvbTogeyB4OiAwLCB5OiAwIH0sXG4gICAgICAgICAgdG86IHsgeDogMSwgeTogMSB9LFxuICAgICAgICAgIGxhYmVsOiAnTGluZScsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICByZXJlbmRlcig8R3JhcGggey4uLmRlZmF1bHRQcm9wc30gbWFya3M9e3VwZGF0ZWRNYXJrc30gLz4pO1xuXG4gICAgICBleHBlY3QoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNtYXJrcycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgYWRkaW5nIG5ldyBtYXJrcyB3aXRoIGRpZmZlcmVudCB0eXBlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGluaXRpYWxNYXJrcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAyLFxuICAgICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHsgcmVyZW5kZXIsIGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSBtYXJrcz17aW5pdGlhbE1hcmtzfSAvPik7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZWRNYXJrcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAyLFxuICAgICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdsaW5lJyxcbiAgICAgICAgICBmcm9tOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgICB0bzogeyB4OiAxLCB5OiAxIH0sXG4gICAgICAgICAgbGFiZWw6ICdMaW5lJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHJlcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSBtYXJrcz17dXBkYXRlZE1hcmtzfSAvPik7XG5cbiAgICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignI21hcmtzJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyByZW1vdmluZyBtYXJrcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGluaXRpYWxNYXJrcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAyLFxuICAgICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdsaW5lJyxcbiAgICAgICAgICBmcm9tOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgICB0bzogeyB4OiAxLCB5OiAxIH0sXG4gICAgICAgICAgbGFiZWw6ICdMaW5lJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHsgcmVyZW5kZXIsIGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSBtYXJrcz17aW5pdGlhbE1hcmtzfSAvPik7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZWRNYXJrcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgeDogMixcbiAgICAgICAgICB5OiAyLFxuICAgICAgICAgIGxhYmVsOiAnUG9pbnQnLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHJlcmVuZGVyKDxHcmFwaCB7Li4uZGVmYXVsdFByb3BzfSBtYXJrcz17dXBkYXRlZE1hcmtzfSAvPik7XG5cbiAgICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignI21hcmtzJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQUFvQyxTQUFBSSx3QkFBQUUsQ0FBQSxFQUFBQyxDQUFBLDZCQUFBQyxPQUFBLE1BQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUosdUJBQUEsWUFBQUEsd0JBQUFFLENBQUEsRUFBQUMsQ0FBQSxTQUFBQSxDQUFBLElBQUFELENBQUEsSUFBQUEsQ0FBQSxDQUFBSyxVQUFBLFNBQUFMLENBQUEsTUFBQU0sQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEs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