@pie-lib/graphing-solution-set 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 (74) 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 +256 -0
  4. package/lib/__tests__/graph.test.js +113 -0
  5. package/lib/__tests__/grid-setup.test.js +729 -0
  6. package/lib/__tests__/grid.test.js +29 -0
  7. package/lib/__tests__/labels.test.js +45 -0
  8. package/lib/__tests__/mark-label.test.js +133 -0
  9. package/lib/__tests__/toggle-bar.test.js +146 -0
  10. package/lib/__tests__/tool-menu.test.js +540 -0
  11. package/lib/__tests__/undo-redo.test.js +31 -0
  12. package/lib/__tests__/use-debounce.test.js +24 -0
  13. package/lib/__tests__/utils.js +70 -0
  14. package/lib/__tests__/utils.test.js +123 -0
  15. package/lib/axis/__tests__/arrow.test.js +60 -0
  16. package/lib/axis/__tests__/axes.test.js +160 -0
  17. package/lib/axis/arrow.js +1 -1
  18. package/lib/axis/axes.js +1 -1
  19. package/lib/axis/index.js +1 -1
  20. package/lib/bg.js +1 -1
  21. package/lib/container/__tests__/actions.test.js +108 -0
  22. package/lib/container/__tests__/index.test.js +346 -0
  23. package/lib/container/__tests__/marks.test.js +259 -0
  24. package/lib/container/__tests__/middleware.test.js +244 -0
  25. package/lib/container/__tests__/reducer.test.js +450 -0
  26. package/lib/container/actions.js +1 -1
  27. package/lib/container/index.js +1 -1
  28. package/lib/container/marks.js +1 -1
  29. package/lib/container/middleware.js +1 -1
  30. package/lib/container/reducer.js +1 -1
  31. package/lib/coordinates-label.js +1 -1
  32. package/lib/graph-with-controls.js +1 -1
  33. package/lib/graph.js +1 -1
  34. package/lib/grid-setup.js +1 -1
  35. package/lib/grid.js +1 -1
  36. package/lib/index.js +1 -1
  37. package/lib/labels.js +1 -1
  38. package/lib/mark-label.js +1 -1
  39. package/lib/toggle-bar.js +1 -1
  40. package/lib/tool-menu.js +1 -1
  41. package/lib/tools/index.js +1 -1
  42. package/lib/tools/line/__tests__/component.test.js +45 -0
  43. package/lib/tools/line/component.js +1 -1
  44. package/lib/tools/line/index.js +1 -1
  45. package/lib/tools/polygon/__tests__/component.test.js +501 -0
  46. package/lib/tools/polygon/__tests__/index.test.js +92 -0
  47. package/lib/tools/polygon/__tests__/line.test.js +30 -0
  48. package/lib/tools/polygon/__tests__/polygon.test.js +61 -0
  49. package/lib/tools/polygon/component.js +1 -1
  50. package/lib/tools/polygon/index.js +1 -1
  51. package/lib/tools/polygon/line.js +1 -1
  52. package/lib/tools/polygon/polygon.js +1 -1
  53. package/lib/tools/shared/__tests__/arrow-head.test.js +45 -0
  54. package/lib/tools/shared/arrow-head.js +1 -1
  55. package/lib/tools/shared/line/__tests__/index.test.js +725 -0
  56. package/lib/tools/shared/line/__tests__/line-path.test.js +64 -0
  57. package/lib/tools/shared/line/__tests__/with-root-edge.test.js +618 -0
  58. package/lib/tools/shared/line/index.js +1 -1
  59. package/lib/tools/shared/line/line-path.js +1 -1
  60. package/lib/tools/shared/line/with-root-edge.js +1 -1
  61. package/lib/tools/shared/point/__tests__/arrow-point.test.js +127 -0
  62. package/lib/tools/shared/point/__tests__/arrow.test.js +619 -0
  63. package/lib/tools/shared/point/__tests__/base-point.test.js +122 -0
  64. package/lib/tools/shared/point/arrow-point.js +1 -1
  65. package/lib/tools/shared/point/arrow.js +1 -1
  66. package/lib/tools/shared/point/base-point.js +1 -1
  67. package/lib/tools/shared/point/index.js +1 -1
  68. package/lib/tools/shared/styles.js +1 -1
  69. package/lib/tools/shared/types.js +1 -1
  70. package/lib/undo-redo.js +1 -1
  71. package/lib/use-debounce.js +1 -1
  72. package/lib/utils.js +1 -1
  73. package/package.json +10 -13
  74. package/LICENSE.md +0 -5
@@ -0,0 +1,619 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
5
+ var _testUtils = require("@pie-lib/test-utils");
6
+ var _react = _interopRequireDefault(require("react"));
7
+ var _arrow = _interopRequireDefault(require("../arrow"));
8
+ var _utils = require("../../../../__tests__/utils");
9
+ var _utils2 = require("../../../../utils");
10
+ 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; }
11
+ 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; }
12
+ jest.mock('../../../../utils', function () {
13
+ return _objectSpread(_objectSpread({}, jest.requireActual('../../../../utils')), {}, {
14
+ thinnerShapesNeeded: jest.fn(function () {
15
+ return false;
16
+ })
17
+ });
18
+ });
19
+ describe('Arrow', function () {
20
+ var onChange = jest.fn();
21
+ var renderComponent = function renderComponent(extras) {
22
+ var defaults = {
23
+ classes: {},
24
+ className: 'arrow-class',
25
+ onChange: onChange,
26
+ graphProps: (0, _utils.graphProps)(),
27
+ x: 5,
28
+ y: 10,
29
+ angle: 45
30
+ };
31
+ var props = _objectSpread(_objectSpread({}, defaults), extras);
32
+ return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_arrow["default"], props));
33
+ };
34
+ beforeEach(function () {
35
+ onChange = jest.fn();
36
+ _utils2.thinnerShapesNeeded.mockReturnValue(false);
37
+ });
38
+ describe('rendering', function () {
39
+ it('renders without crashing', function () {
40
+ var _renderComponent = renderComponent(),
41
+ container = _renderComponent.container;
42
+ expect(container.firstChild).toBeInTheDocument();
43
+ });
44
+ it('renders a g element with correct class names', function () {
45
+ var _renderComponent2 = renderComponent({
46
+ classes: {
47
+ point: 'point-class'
48
+ },
49
+ className: 'custom-class'
50
+ }),
51
+ container = _renderComponent2.container;
52
+ var gElement = container.querySelector('g');
53
+ expect(gElement).toBeInTheDocument();
54
+ expect(gElement).toHaveClass('point-class');
55
+ expect(gElement).toHaveClass('custom-class');
56
+ });
57
+ it('renders ArrowHead component', function () {
58
+ var _renderComponent3 = renderComponent(),
59
+ container = _renderComponent3.container;
60
+ var polygon = container.querySelector('polygon');
61
+ expect(polygon).toBeInTheDocument();
62
+ });
63
+ it('applies disabled class when disabled is true', function () {
64
+ var _renderComponent4 = renderComponent({
65
+ classes: {
66
+ point: 'point-class',
67
+ disabled: 'disabled-class'
68
+ },
69
+ disabled: true
70
+ }),
71
+ container = _renderComponent4.container;
72
+ var gElement = container.querySelector('g');
73
+ expect(gElement).toHaveClass('disabled-class');
74
+ });
75
+ it('does not apply disabled class when disabled is false', function () {
76
+ var _renderComponent5 = renderComponent({
77
+ classes: {
78
+ point: 'point-class',
79
+ disabled: 'disabled-class'
80
+ },
81
+ disabled: false
82
+ }),
83
+ container = _renderComponent5.container;
84
+ var gElement = container.querySelector('g');
85
+ expect(gElement).not.toHaveClass('disabled-class');
86
+ });
87
+ it('applies correctness class when provided', function () {
88
+ var _renderComponent6 = renderComponent({
89
+ classes: {
90
+ point: 'point-class',
91
+ correct: 'correct-class'
92
+ },
93
+ correctness: 'correct'
94
+ }),
95
+ container = _renderComponent6.container;
96
+ var gElement = container.querySelector('g');
97
+ expect(gElement).toHaveClass('correct-class');
98
+ });
99
+ it('applies incorrect correctness class', function () {
100
+ var _renderComponent7 = renderComponent({
101
+ classes: {
102
+ point: 'point-class',
103
+ incorrect: 'incorrect-class'
104
+ },
105
+ correctness: 'incorrect'
106
+ }),
107
+ container = _renderComponent7.container;
108
+ var gElement = container.querySelector('g');
109
+ expect(gElement).toHaveClass('incorrect-class');
110
+ });
111
+ });
112
+ describe('size calculation', function () {
113
+ it('uses size 14 when thinnerShapesNeeded returns false', function () {
114
+ _utils2.thinnerShapesNeeded.mockReturnValue(false);
115
+ var _renderComponent8 = renderComponent({
116
+ x: 0,
117
+ y: 0
118
+ }),
119
+ container = _renderComponent8.container;
120
+ var polygon = container.querySelector('polygon');
121
+
122
+ // Expected points: "0,0 -14,-7 -14,7"
123
+ expect(polygon).toHaveAttribute('points');
124
+ var points = polygon.getAttribute('points');
125
+ expect(points).toContain('-14');
126
+ });
127
+ it('uses size 12 when thinnerShapesNeeded returns true', function () {
128
+ _utils2.thinnerShapesNeeded.mockReturnValue(true);
129
+ var _renderComponent9 = renderComponent({
130
+ x: 0,
131
+ y: 0
132
+ }),
133
+ container = _renderComponent9.container;
134
+ var polygon = container.querySelector('polygon');
135
+
136
+ // Expected points: "0,0 -12,-6 -12,6"
137
+ expect(polygon).toHaveAttribute('points');
138
+ var points = polygon.getAttribute('points');
139
+ expect(points).toContain('-12');
140
+ });
141
+ it('calls thinnerShapesNeeded with graphProps', function () {
142
+ var gp = (0, _utils.graphProps)();
143
+ renderComponent({
144
+ graphProps: gp
145
+ });
146
+ expect(_utils2.thinnerShapesNeeded).toHaveBeenCalledWith(gp);
147
+ });
148
+ });
149
+ describe('coordinate scaling', function () {
150
+ it('scales x and y coordinates using graphProps.scale', function () {
151
+ var mockScale = {
152
+ x: jest.fn(function (n) {
153
+ return n * 10;
154
+ }),
155
+ y: jest.fn(function (n) {
156
+ return n * 20;
157
+ })
158
+ };
159
+ var gp = _objectSpread(_objectSpread({}, (0, _utils.graphProps)()), {}, {
160
+ scale: mockScale
161
+ });
162
+ renderComponent({
163
+ x: 5,
164
+ y: 10,
165
+ graphProps: gp
166
+ });
167
+ expect(mockScale.x).toHaveBeenCalledWith(5);
168
+ expect(mockScale.y).toHaveBeenCalledWith(10);
169
+ });
170
+ it('renders arrow with scaled coordinates', function () {
171
+ var mockScale = {
172
+ x: jest.fn(function (n) {
173
+ return n * 2;
174
+ }),
175
+ y: jest.fn(function (n) {
176
+ return n * 3;
177
+ })
178
+ };
179
+ var gp = _objectSpread(_objectSpread({}, (0, _utils.graphProps)()), {}, {
180
+ scale: mockScale
181
+ });
182
+ var _renderComponent0 = renderComponent({
183
+ x: 5,
184
+ y: 10,
185
+ graphProps: gp,
186
+ angle: 0
187
+ }),
188
+ container = _renderComponent0.container;
189
+ var polygon = container.querySelector('polygon');
190
+
191
+ // scaledX = 5 * 2 = 10, scaledY = 10 * 3 = 30
192
+ // Expected points: "10,30 -4,23 -4,37" (with size 14)
193
+ var points = polygon.getAttribute('points');
194
+ expect(points).toContain('10');
195
+ expect(points).toContain('30');
196
+ });
197
+ });
198
+ describe('angle rotation', function () {
199
+ it('applies rotation transform with negative angle', function () {
200
+ var _renderComponent1 = renderComponent({
201
+ x: 5,
202
+ y: 10,
203
+ angle: 45
204
+ }),
205
+ container = _renderComponent1.container;
206
+ var polygon = container.querySelector('polygon');
207
+ var transform = polygon.getAttribute('transform');
208
+
209
+ // Angle should be negated: rotate(-45, 5, 10)
210
+ expect(transform).toContain('rotate(-45');
211
+ expect(transform).toContain('5');
212
+ expect(transform).toContain('10');
213
+ });
214
+ it('handles zero angle', function () {
215
+ var _renderComponent10 = renderComponent({
216
+ x: 3,
217
+ y: 7,
218
+ angle: 0
219
+ }),
220
+ container = _renderComponent10.container;
221
+ var polygon = container.querySelector('polygon');
222
+ var transform = polygon.getAttribute('transform');
223
+
224
+ // will convert -0 to 0
225
+ expect(transform).toMatch(/rotate\((-)?0/);
226
+ expect(transform).toContain('3');
227
+ expect(transform).toContain('7');
228
+ });
229
+ it('handles negative angle', function () {
230
+ var _renderComponent11 = renderComponent({
231
+ x: 2,
232
+ y: 4,
233
+ angle: -30
234
+ }),
235
+ container = _renderComponent11.container;
236
+ var polygon = container.querySelector('polygon');
237
+ var transform = polygon.getAttribute('transform');
238
+
239
+ // -(-30) = 30
240
+ expect(transform).toContain('rotate(30');
241
+ expect(transform).toContain('2');
242
+ expect(transform).toContain('4');
243
+ });
244
+ it('handles 360 degree angle', function () {
245
+ var _renderComponent12 = renderComponent({
246
+ x: 1,
247
+ y: 1,
248
+ angle: 360
249
+ }),
250
+ container = _renderComponent12.container;
251
+ var polygon = container.querySelector('polygon');
252
+ var transform = polygon.getAttribute('transform');
253
+ expect(transform).toContain('rotate(-360');
254
+ });
255
+ });
256
+ describe('arrow points calculation', function () {
257
+ it('calculates correct points for arrow head', function () {
258
+ _utils2.thinnerShapesNeeded.mockReturnValue(false);
259
+ var _renderComponent13 = renderComponent({
260
+ x: 0,
261
+ y: 0,
262
+ angle: 0
263
+ }),
264
+ container = _renderComponent13.container;
265
+ var polygon = container.querySelector('polygon');
266
+
267
+ // size = 14
268
+ // points = "0,0 -14,-7 -14, 7" (note the space after comma in the template literal)
269
+ var points = polygon.getAttribute('points');
270
+ expect(points).toContain('0,0');
271
+ expect(points).toContain('-14,-7');
272
+ expect(points).toMatch(/-14,\s*7/);
273
+ });
274
+ it('calculates points with scaled coordinates', function () {
275
+ _utils2.thinnerShapesNeeded.mockReturnValue(false);
276
+ var mockScale = {
277
+ x: jest.fn(function (n) {
278
+ return n;
279
+ }),
280
+ y: jest.fn(function (n) {
281
+ return n;
282
+ })
283
+ };
284
+ var gp = _objectSpread(_objectSpread({}, (0, _utils.graphProps)()), {}, {
285
+ scale: mockScale
286
+ });
287
+ var _renderComponent14 = renderComponent({
288
+ x: 10,
289
+ y: 20,
290
+ graphProps: gp
291
+ }),
292
+ container = _renderComponent14.container;
293
+ var polygon = container.querySelector('polygon');
294
+
295
+ // scaledX = 10, scaledY = 20, size = 14
296
+ // points = "10,20 -4,13 -4, 27" (note the space after comma in the template literal)
297
+ var points = polygon.getAttribute('points');
298
+ expect(points).toContain('10,20');
299
+ expect(points).toContain('-4,13');
300
+ expect(points).toMatch(/-4,\s*27/);
301
+ });
302
+ });
303
+ describe('props handling', function () {
304
+ it('passes through additional props to g element', function () {
305
+ var _renderComponent15 = renderComponent({
306
+ 'data-test': 'arrow-test',
307
+ role: 'graphics-symbol'
308
+ }),
309
+ container = _renderComponent15.container;
310
+ var gElement = container.querySelector('g');
311
+ expect(gElement).toHaveAttribute('data-test', 'arrow-test');
312
+ expect(gElement).toHaveAttribute('role', 'graphics-symbol');
313
+ });
314
+ it('excludes filtered props from g element', function () {
315
+ var _renderComponent16 = renderComponent({
316
+ x: 5,
317
+ y: 10,
318
+ angle: 45,
319
+ disabled: false,
320
+ correctness: 'correct',
321
+ graphProps: (0, _utils.graphProps)()
322
+ }),
323
+ container = _renderComponent16.container;
324
+ var gElement = container.querySelector('g');
325
+
326
+ // These props should not be passed to the g element
327
+ expect(gElement).not.toHaveAttribute('x');
328
+ expect(gElement).not.toHaveAttribute('y');
329
+ expect(gElement).not.toHaveAttribute('angle');
330
+ expect(gElement).not.toHaveAttribute('disabled');
331
+ expect(gElement).not.toHaveAttribute('correctness');
332
+ expect(gElement).not.toHaveAttribute('graphProps');
333
+ });
334
+ });
335
+ describe('edge cases', function () {
336
+ it('handles zero coordinates', function () {
337
+ var _renderComponent17 = renderComponent({
338
+ x: 0,
339
+ y: 0,
340
+ angle: 0
341
+ }),
342
+ container = _renderComponent17.container;
343
+ var polygon = container.querySelector('polygon');
344
+ expect(polygon).toBeInTheDocument();
345
+ expect(polygon.getAttribute('points')).toBeTruthy();
346
+ expect(polygon.getAttribute('transform')).toBeTruthy();
347
+ });
348
+ it('handles negative coordinates', function () {
349
+ var _renderComponent18 = renderComponent({
350
+ x: -5,
351
+ y: -10,
352
+ angle: 0
353
+ }),
354
+ container = _renderComponent18.container;
355
+ var polygon = container.querySelector('polygon');
356
+ expect(polygon).toBeInTheDocument();
357
+ expect(polygon.getAttribute('points')).toBeTruthy();
358
+ expect(polygon.getAttribute('transform')).toBeTruthy();
359
+ });
360
+ it('handles large coordinates', function () {
361
+ var _renderComponent19 = renderComponent({
362
+ x: 1000,
363
+ y: 2000,
364
+ angle: 0
365
+ }),
366
+ container = _renderComponent19.container;
367
+ var polygon = container.querySelector('polygon');
368
+ expect(polygon).toBeInTheDocument();
369
+ });
370
+ it('handles fractional coordinates', function () {
371
+ var _renderComponent20 = renderComponent({
372
+ x: 3.5,
373
+ y: 7.25,
374
+ angle: 22.5
375
+ }),
376
+ container = _renderComponent20.container;
377
+ var polygon = container.querySelector('polygon');
378
+ expect(polygon).toBeInTheDocument();
379
+ expect(polygon.getAttribute('transform')).toContain('rotate(-22.5');
380
+ });
381
+ it('renders with empty classes prop', function () {
382
+ var _render = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_arrow["default"], {
383
+ x: 5,
384
+ y: 10,
385
+ angle: 45,
386
+ graphProps: (0, _utils.graphProps)(),
387
+ classes: {}
388
+ })),
389
+ container = _render.container;
390
+ var gElement = container.querySelector('g');
391
+ expect(gElement).toBeInTheDocument();
392
+ });
393
+ it('renders without className prop', function () {
394
+ var _render2 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_arrow["default"], {
395
+ x: 5,
396
+ y: 10,
397
+ angle: 45,
398
+ graphProps: (0, _utils.graphProps)(),
399
+ classes: {}
400
+ })),
401
+ container = _render2.container;
402
+ var gElement = container.querySelector('g');
403
+ expect(gElement).toBeInTheDocument();
404
+ });
405
+ });
406
+ describe('graphProps integration', function () {
407
+ it('works with different domain and range values', function () {
408
+ var gp = (0, _utils.graphProps)(-10, 10, -20, 20);
409
+ var _renderComponent21 = renderComponent({
410
+ graphProps: gp
411
+ }),
412
+ container = _renderComponent21.container;
413
+ expect(container.querySelector('polygon')).toBeInTheDocument();
414
+ expect(_utils2.thinnerShapesNeeded).toHaveBeenCalledWith(gp);
415
+ });
416
+ it('works with custom size in graphProps', function () {
417
+ var gp = _objectSpread(_objectSpread({}, (0, _utils.graphProps)()), {}, {
418
+ size: {
419
+ width: 800,
420
+ height: 600
421
+ }
422
+ });
423
+ var _renderComponent22 = renderComponent({
424
+ graphProps: gp
425
+ }),
426
+ container = _renderComponent22.container;
427
+ expect(container.querySelector('polygon')).toBeInTheDocument();
428
+ });
429
+ it('handles graphProps with small step values', function () {
430
+ var gp = _objectSpread(_objectSpread({}, (0, _utils.graphProps)()), {}, {
431
+ domain: {
432
+ min: 0,
433
+ max: 10,
434
+ step: 0.1
435
+ },
436
+ range: {
437
+ min: 0,
438
+ max: 10,
439
+ step: 0.1
440
+ }
441
+ });
442
+ _utils2.thinnerShapesNeeded.mockReturnValue(true);
443
+ var _renderComponent23 = renderComponent({
444
+ graphProps: gp
445
+ }),
446
+ container = _renderComponent23.container;
447
+ var polygon = container.querySelector('polygon');
448
+
449
+ // Should use size 12 for thinner shapes
450
+ expect(polygon).toBeInTheDocument();
451
+ expect(_utils2.thinnerShapesNeeded).toHaveBeenCalledWith(gp);
452
+ });
453
+ });
454
+ describe('multiple correctness states', function () {
455
+ it('handles partial correctness', function () {
456
+ var _renderComponent24 = renderComponent({
457
+ classes: {
458
+ point: 'point-class',
459
+ partial: 'partial-class'
460
+ },
461
+ correctness: 'partial'
462
+ }),
463
+ container = _renderComponent24.container;
464
+ var gElement = container.querySelector('g');
465
+ expect(gElement).toHaveClass('partial-class');
466
+ });
467
+ it('handles undefined correctness', function () {
468
+ var _renderComponent25 = renderComponent({
469
+ classes: {
470
+ point: 'point-class'
471
+ },
472
+ correctness: undefined
473
+ }),
474
+ container = _renderComponent25.container;
475
+ var gElement = container.querySelector('g');
476
+ expect(gElement).toHaveClass('point-class');
477
+ });
478
+ it('handles null correctness', function () {
479
+ var _renderComponent26 = renderComponent({
480
+ classes: {
481
+ point: 'point-class'
482
+ },
483
+ correctness: null
484
+ }),
485
+ container = _renderComponent26.container;
486
+ var gElement = container.querySelector('g');
487
+ expect(gElement).toHaveClass('point-class');
488
+ });
489
+ });
490
+ describe('combined states', function () {
491
+ it('handles disabled and correct states together', function () {
492
+ var _renderComponent27 = renderComponent({
493
+ classes: {
494
+ point: 'point-class',
495
+ disabled: 'disabled-class',
496
+ correct: 'correct-class'
497
+ },
498
+ disabled: true,
499
+ correctness: 'correct'
500
+ }),
501
+ container = _renderComponent27.container;
502
+ var gElement = container.querySelector('g');
503
+ expect(gElement).toHaveClass('point-class');
504
+ expect(gElement).toHaveClass('disabled-class');
505
+ expect(gElement).toHaveClass('correct-class');
506
+ });
507
+ it('handles disabled and incorrect states together', function () {
508
+ var _renderComponent28 = renderComponent({
509
+ classes: {
510
+ point: 'point-class',
511
+ disabled: 'disabled-class',
512
+ incorrect: 'incorrect-class'
513
+ },
514
+ disabled: true,
515
+ correctness: 'incorrect'
516
+ }),
517
+ container = _renderComponent28.container;
518
+ var gElement = container.querySelector('g');
519
+ expect(gElement).toHaveClass('point-class');
520
+ expect(gElement).toHaveClass('disabled-class');
521
+ expect(gElement).toHaveClass('incorrect-class');
522
+ });
523
+ });
524
+ describe('re-rendering', function () {
525
+ it('updates when x coordinate changes', function () {
526
+ var _renderComponent29 = renderComponent({
527
+ x: 5,
528
+ y: 10,
529
+ angle: 0
530
+ }),
531
+ container = _renderComponent29.container,
532
+ rerender = _renderComponent29.rerender;
533
+ var polygon = container.querySelector('polygon');
534
+ var initialPoints = polygon.getAttribute('points');
535
+ rerender(/*#__PURE__*/_react["default"].createElement(_arrow["default"], {
536
+ x: 15,
537
+ y: 10,
538
+ angle: 0,
539
+ graphProps: (0, _utils.graphProps)(),
540
+ classes: {},
541
+ className: "arrow-class"
542
+ }));
543
+ polygon = container.querySelector('polygon');
544
+ var newPoints = polygon.getAttribute('points');
545
+ expect(newPoints).not.toBe(initialPoints);
546
+ });
547
+ it('updates when y coordinate changes', function () {
548
+ var _renderComponent30 = renderComponent({
549
+ x: 5,
550
+ y: 10,
551
+ angle: 0
552
+ }),
553
+ container = _renderComponent30.container,
554
+ rerender = _renderComponent30.rerender;
555
+ var polygon = container.querySelector('polygon');
556
+ var initialPoints = polygon.getAttribute('points');
557
+ rerender(/*#__PURE__*/_react["default"].createElement(_arrow["default"], {
558
+ x: 5,
559
+ y: 20,
560
+ angle: 0,
561
+ graphProps: (0, _utils.graphProps)(),
562
+ classes: {},
563
+ className: "arrow-class"
564
+ }));
565
+ polygon = container.querySelector('polygon');
566
+ var newPoints = polygon.getAttribute('points');
567
+ expect(newPoints).not.toBe(initialPoints);
568
+ });
569
+ it('updates when angle changes', function () {
570
+ var _renderComponent31 = renderComponent({
571
+ x: 5,
572
+ y: 10,
573
+ angle: 0
574
+ }),
575
+ container = _renderComponent31.container,
576
+ rerender = _renderComponent31.rerender;
577
+ var polygon = container.querySelector('polygon');
578
+ var initialTransform = polygon.getAttribute('transform');
579
+ rerender(/*#__PURE__*/_react["default"].createElement(_arrow["default"], {
580
+ x: 5,
581
+ y: 10,
582
+ angle: 90,
583
+ graphProps: (0, _utils.graphProps)(),
584
+ classes: {},
585
+ className: "arrow-class"
586
+ }));
587
+ polygon = container.querySelector('polygon');
588
+ var newTransform = polygon.getAttribute('transform');
589
+ expect(newTransform).not.toBe(initialTransform);
590
+ expect(newTransform).toContain('rotate(-90');
591
+ });
592
+ it('updates when thinnerShapesNeeded result changes', function () {
593
+ _utils2.thinnerShapesNeeded.mockReturnValue(false);
594
+ var _renderComponent32 = renderComponent({
595
+ x: 0,
596
+ y: 0,
597
+ angle: 0
598
+ }),
599
+ container = _renderComponent32.container,
600
+ rerender = _renderComponent32.rerender;
601
+ var polygon = container.querySelector('polygon');
602
+ var initialPoints = polygon.getAttribute('points');
603
+ _utils2.thinnerShapesNeeded.mockReturnValue(true);
604
+ rerender(/*#__PURE__*/_react["default"].createElement(_arrow["default"], {
605
+ x: 0,
606
+ y: 0,
607
+ angle: 0,
608
+ graphProps: (0, _utils.graphProps)(),
609
+ classes: {},
610
+ className: "arrow-class"
611
+ }));
612
+ polygon = container.querySelector('polygon');
613
+ var newPoints = polygon.getAttribute('points');
614
+ // Points should change due to size change (14 vs 12)
615
+ expect(newPoints).not.toBe(initialPoints);
616
+ });
617
+ });
618
+ });
619
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdGVzdFV0aWxzIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfYXJyb3ciLCJfdXRpbHMiLCJfdXRpbHMyIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJqZXN0IiwibW9jayIsInJlcXVpcmVBY3R1YWwiLCJ0aGlubmVyU2hhcGVzTmVlZGVkIiwiZm4iLCJkZXNjcmliZSIsIm9uQ2hhbmdlIiwicmVuZGVyQ29tcG9uZW50IiwiZXh0cmFzIiwiZGVmYXVsdHMiLCJjbGFzc2VzIiwiY2xhc3NOYW1lIiwiZ3JhcGhQcm9wcyIsIngiLCJ5IiwiYW5nbGUiLCJwcm9wcyIsInJlbmRlciIsImNyZWF0ZUVsZW1lbnQiLCJiZWZvcmVFYWNoIiwibW9ja1JldHVyblZhbHVlIiwiaXQiLCJfcmVuZGVyQ29tcG9uZW50IiwiY29udGFpbmVyIiwiZXhwZWN0IiwiZmlyc3RDaGlsZCIsInRvQmVJblRoZURvY3VtZW50IiwiX3JlbmRlckNvbXBvbmVudDIiLCJwb2ludCIsImdFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsInRvSGF2ZUNsYXNzIiwiX3JlbmRlckNvbXBvbmVudDMiLCJwb2x5Z29uIiwiX3JlbmRlckNvbXBvbmVudDQiLCJkaXNhYmxlZCIsIl9yZW5kZXJDb21wb25lbnQ1Iiwibm90IiwiX3JlbmRlckNvbXBvbmVudDYiLCJjb3JyZWN0IiwiY29ycmVjdG5lc3MiLCJfcmVuZGVyQ29tcG9uZW50NyIsImluY29ycmVjdCIsIl9yZW5kZXJDb21wb25lbnQ4IiwidG9IYXZlQXR0cmlidXRlIiwicG9pbnRzIiwiZ2V0QXR0cmlidXRlIiwidG9Db250YWluIiwiX3JlbmRlckNvbXBvbmVudDkiLCJncCIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwibW9ja1NjYWxlIiwibiIsInNjYWxlIiwiX3JlbmRlckNvbXBvbmVudDAiLCJfcmVuZGVyQ29tcG9uZW50MSIsInRyYW5zZm9ybSIsIl9yZW5kZXJDb21wb25lbnQxMCIsInRvTWF0Y2giLCJfcmVuZGVyQ29tcG9uZW50MTEiLCJfcmVuZGVyQ29tcG9uZW50MTIiLCJfcmVuZGVyQ29tcG9uZW50MTMiLCJfcmVuZGVyQ29tcG9uZW50MTQiLCJfcmVuZGVyQ29tcG9uZW50MTUiLCJyb2xlIiwiX3JlbmRlckNvbXBvbmVudDE2IiwiX3JlbmRlckNvbXBvbmVudDE3IiwidG9CZVRydXRoeSIsIl9yZW5kZXJDb21wb25lbnQxOCIsIl9yZW5kZXJDb21wb25lbnQxOSIsIl9yZW5kZXJDb21wb25lbnQyMCIsIl9yZW5kZXIiLCJfcmVuZGVyMiIsIl9yZW5kZXJDb21wb25lbnQyMSIsInNpemUiLCJ3aWR0aCIsImhlaWdodCIsIl9yZW5kZXJDb21wb25lbnQyMiIsImRvbWFpbiIsIm1pbiIsIm1heCIsInN0ZXAiLCJyYW5nZSIsIl9yZW5kZXJDb21wb25lbnQyMyIsIl9yZW5kZXJDb21wb25lbnQyNCIsInBhcnRpYWwiLCJfcmVuZGVyQ29tcG9uZW50MjUiLCJ1bmRlZmluZWQiLCJfcmVuZGVyQ29tcG9uZW50MjYiLCJfcmVuZGVyQ29tcG9uZW50MjciLCJfcmVuZGVyQ29tcG9uZW50MjgiLCJfcmVuZGVyQ29tcG9uZW50MjkiLCJyZXJlbmRlciIsImluaXRpYWxQb2ludHMiLCJuZXdQb2ludHMiLCJ0b0JlIiwiX3JlbmRlckNvbXBvbmVudDMwIiwiX3JlbmRlckNvbXBvbmVudDMxIiwiaW5pdGlhbFRyYW5zZm9ybSIsIm5ld1RyYW5zZm9ybSIsIl9yZW5kZXJDb21wb25lbnQzMiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy90b29scy9zaGFyZWQvcG9pbnQvX190ZXN0c19fL2Fycm93LnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlbmRlciB9IGZyb20gJ0BwaWUtbGliL3Rlc3QtdXRpbHMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBcnJvdyBmcm9tICcuLi9hcnJvdyc7XG5pbXBvcnQgeyBncmFwaFByb3BzIH0gZnJvbSAnLi4vLi4vLi4vLi4vX190ZXN0c19fL3V0aWxzJztcbmltcG9ydCB7IHRoaW5uZXJTaGFwZXNOZWVkZWQgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmplc3QubW9jaygnLi4vLi4vLi4vLi4vdXRpbHMnLCAoKSA9PiAoe1xuICAuLi5qZXN0LnJlcXVpcmVBY3R1YWwoJy4uLy4uLy4uLy4uL3V0aWxzJyksXG4gIHRoaW5uZXJTaGFwZXNOZWVkZWQ6IGplc3QuZm4oKCkgPT4gZmFsc2UpLFxufSkpO1xuXG5kZXNjcmliZSgnQXJyb3cnLCAoKSA9PiB7XG4gIGxldCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcblxuICBjb25zdCByZW5kZXJDb21wb25lbnQgPSAoZXh0cmFzKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICBjbGFzc2VzOiB7fSxcbiAgICAgIGNsYXNzTmFtZTogJ2Fycm93LWNsYXNzJyxcbiAgICAgIG9uQ2hhbmdlLFxuICAgICAgZ3JhcGhQcm9wczogZ3JhcGhQcm9wcygpLFxuICAgICAgeDogNSxcbiAgICAgIHk6IDEwLFxuICAgICAgYW5nbGU6IDQ1LFxuICAgIH07XG4gICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRzLCAuLi5leHRyYXMgfTtcbiAgICByZXR1cm4gcmVuZGVyKDxBcnJvdyB7Li4ucHJvcHN9IC8+KTtcbiAgfTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICB0aGlubmVyU2hhcGVzTmVlZGVkLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZW5kZXJpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgd2l0aG91dCBjcmFzaGluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGEgZyBlbGVtZW50IHdpdGggY29ycmVjdCBjbGFzcyBuYW1lcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjbGFzc2VzOiB7IHBvaW50OiAncG9pbnQtY2xhc3MnIH0sXG4gICAgICAgIGNsYXNzTmFtZTogJ2N1c3RvbS1jbGFzcycsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGdFbGVtZW50ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2cnKTtcbiAgICAgIGV4cGVjdChnRWxlbWVudCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChnRWxlbWVudCkudG9IYXZlQ2xhc3MoJ3BvaW50LWNsYXNzJyk7XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLnRvSGF2ZUNsYXNzKCdjdXN0b20tY2xhc3MnKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIEFycm93SGVhZCBjb21wb25lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBjb25zdCBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcbiAgICAgIGV4cGVjdChwb2x5Z29uKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FwcGxpZXMgZGlzYWJsZWQgY2xhc3Mgd2hlbiBkaXNhYmxlZCBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNsYXNzZXM6IHsgcG9pbnQ6ICdwb2ludC1jbGFzcycsIGRpc2FibGVkOiAnZGlzYWJsZWQtY2xhc3MnIH0sXG4gICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBnRWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdnJyk7XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLnRvSGF2ZUNsYXNzKCdkaXNhYmxlZC1jbGFzcycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGFwcGx5IGRpc2FibGVkIGNsYXNzIHdoZW4gZGlzYWJsZWQgaXMgZmFsc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY2xhc3NlczogeyBwb2ludDogJ3BvaW50LWNsYXNzJywgZGlzYWJsZWQ6ICdkaXNhYmxlZC1jbGFzcycgfSxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBnRWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdnJyk7XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLm5vdC50b0hhdmVDbGFzcygnZGlzYWJsZWQtY2xhc3MnKTtcbiAgICB9KTtcblxuICAgIGl0KCdhcHBsaWVzIGNvcnJlY3RuZXNzIGNsYXNzIHdoZW4gcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY2xhc3NlczogeyBwb2ludDogJ3BvaW50LWNsYXNzJywgY29ycmVjdDogJ2NvcnJlY3QtY2xhc3MnIH0sXG4gICAgICAgIGNvcnJlY3RuZXNzOiAnY29ycmVjdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGdFbGVtZW50ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2cnKTtcbiAgICAgIGV4cGVjdChnRWxlbWVudCkudG9IYXZlQ2xhc3MoJ2NvcnJlY3QtY2xhc3MnKTtcbiAgICB9KTtcblxuICAgIGl0KCdhcHBsaWVzIGluY29ycmVjdCBjb3JyZWN0bmVzcyBjbGFzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjbGFzc2VzOiB7IHBvaW50OiAncG9pbnQtY2xhc3MnLCBpbmNvcnJlY3Q6ICdpbmNvcnJlY3QtY2xhc3MnIH0sXG4gICAgICAgIGNvcnJlY3RuZXNzOiAnaW5jb3JyZWN0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZ0VsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZycpO1xuICAgICAgZXhwZWN0KGdFbGVtZW50KS50b0hhdmVDbGFzcygnaW5jb3JyZWN0LWNsYXNzJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaXplIGNhbGN1bGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCd1c2VzIHNpemUgMTQgd2hlbiB0aGlubmVyU2hhcGVzTmVlZGVkIHJldHVybnMgZmFsc2UnLCAoKSA9PiB7XG4gICAgICB0aGlubmVyU2hhcGVzTmVlZGVkLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgeDogMCwgeTogMCB9KTtcbiAgICAgIGNvbnN0IHBvbHlnb24gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigncG9seWdvbicpO1xuXG4gICAgICAvLyBFeHBlY3RlZCBwb2ludHM6IFwiMCwwIC0xNCwtNyAtMTQsN1wiXG4gICAgICBleHBlY3QocG9seWdvbikudG9IYXZlQXR0cmlidXRlKCdwb2ludHMnKTtcbiAgICAgIGNvbnN0IHBvaW50cyA9IHBvbHlnb24uZ2V0QXR0cmlidXRlKCdwb2ludHMnKTtcbiAgICAgIGV4cGVjdChwb2ludHMpLnRvQ29udGFpbignLTE0Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgndXNlcyBzaXplIDEyIHdoZW4gdGhpbm5lclNoYXBlc05lZWRlZCByZXR1cm5zIHRydWUnLCAoKSA9PiB7XG4gICAgICB0aGlubmVyU2hhcGVzTmVlZGVkLm1vY2tSZXR1cm5WYWx1ZSh0cnVlKTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyB4OiAwLCB5OiAwIH0pO1xuICAgICAgY29uc3QgcG9seWdvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdwb2x5Z29uJyk7XG5cbiAgICAgIC8vIEV4cGVjdGVkIHBvaW50czogXCIwLDAgLTEyLC02IC0xMiw2XCJcbiAgICAgIGV4cGVjdChwb2x5Z29uKS50b0hhdmVBdHRyaWJ1dGUoJ3BvaW50cycpO1xuICAgICAgY29uc3QgcG9pbnRzID0gcG9seWdvbi5nZXRBdHRyaWJ1dGUoJ3BvaW50cycpO1xuICAgICAgZXhwZWN0KHBvaW50cykudG9Db250YWluKCctMTInKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyB0aGlubmVyU2hhcGVzTmVlZGVkIHdpdGggZ3JhcGhQcm9wcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGdwID0gZ3JhcGhQcm9wcygpO1xuICAgICAgcmVuZGVyQ29tcG9uZW50KHsgZ3JhcGhQcm9wczogZ3AgfSk7XG4gICAgICBleHBlY3QodGhpbm5lclNoYXBlc05lZWRlZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZ3ApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29vcmRpbmF0ZSBzY2FsaW5nJywgKCkgPT4ge1xuICAgIGl0KCdzY2FsZXMgeCBhbmQgeSBjb29yZGluYXRlcyB1c2luZyBncmFwaFByb3BzLnNjYWxlJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9ja1NjYWxlID0ge1xuICAgICAgICB4OiBqZXN0LmZuKChuKSA9PiBuICogMTApLFxuICAgICAgICB5OiBqZXN0LmZuKChuKSA9PiBuICogMjApLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGdwID0ge1xuICAgICAgICAuLi5ncmFwaFByb3BzKCksXG4gICAgICAgIHNjYWxlOiBtb2NrU2NhbGUsXG4gICAgICB9O1xuXG4gICAgICByZW5kZXJDb21wb25lbnQoeyB4OiA1LCB5OiAxMCwgZ3JhcGhQcm9wczogZ3AgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU2NhbGUueCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoNSk7XG4gICAgICBleHBlY3QobW9ja1NjYWxlLnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDEwKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGFycm93IHdpdGggc2NhbGVkIGNvb3JkaW5hdGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9ja1NjYWxlID0ge1xuICAgICAgICB4OiBqZXN0LmZuKChuKSA9PiBuICogMiksXG4gICAgICAgIHk6IGplc3QuZm4oKG4pID0+IG4gKiAzKSxcbiAgICAgIH07XG4gICAgICBjb25zdCBncCA9IHtcbiAgICAgICAgLi4uZ3JhcGhQcm9wcygpLFxuICAgICAgICBzY2FsZTogbW9ja1NjYWxlLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IHg6IDUsIHk6IDEwLCBncmFwaFByb3BzOiBncCwgYW5nbGU6IDAgfSk7XG4gICAgICBjb25zdCBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcblxuICAgICAgLy8gc2NhbGVkWCA9IDUgKiAyID0gMTAsIHNjYWxlZFkgPSAxMCAqIDMgPSAzMFxuICAgICAgLy8gRXhwZWN0ZWQgcG9pbnRzOiBcIjEwLDMwIC00LDIzIC00LDM3XCIgKHdpdGggc2l6ZSAxNClcbiAgICAgIGNvbnN0IHBvaW50cyA9IHBvbHlnb24uZ2V0QXR0cmlidXRlKCdwb2ludHMnKTtcbiAgICAgIGV4cGVjdChwb2ludHMpLnRvQ29udGFpbignMTAnKTtcbiAgICAgIGV4cGVjdChwb2ludHMpLnRvQ29udGFpbignMzAnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FuZ2xlIHJvdGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdhcHBsaWVzIHJvdGF0aW9uIHRyYW5zZm9ybSB3aXRoIG5lZ2F0aXZlIGFuZ2xlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IHg6IDUsIHk6IDEwLCBhbmdsZTogNDUgfSk7XG4gICAgICBjb25zdCBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHBvbHlnb24uZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKTtcblxuICAgICAgLy8gQW5nbGUgc2hvdWxkIGJlIG5lZ2F0ZWQ6IHJvdGF0ZSgtNDUsIDUsIDEwKVxuICAgICAgZXhwZWN0KHRyYW5zZm9ybSkudG9Db250YWluKCdyb3RhdGUoLTQ1Jyk7XG4gICAgICBleHBlY3QodHJhbnNmb3JtKS50b0NvbnRhaW4oJzUnKTtcbiAgICAgIGV4cGVjdCh0cmFuc2Zvcm0pLnRvQ29udGFpbignMTAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIHplcm8gYW5nbGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgeDogMywgeTogNywgYW5nbGU6IDAgfSk7XG4gICAgICBjb25zdCBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHBvbHlnb24uZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKTtcblxuICAgICAgLy8gd2lsbCBjb252ZXJ0IC0wIHRvIDBcbiAgICAgIGV4cGVjdCh0cmFuc2Zvcm0pLnRvTWF0Y2goL3JvdGF0ZVxcKCgtKT8wLyk7XG4gICAgICBleHBlY3QodHJhbnNmb3JtKS50b0NvbnRhaW4oJzMnKTtcbiAgICAgIGV4cGVjdCh0cmFuc2Zvcm0pLnRvQ29udGFpbignNycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgbmVnYXRpdmUgYW5nbGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgeDogMiwgeTogNCwgYW5nbGU6IC0zMCB9KTtcbiAgICAgIGNvbnN0IHBvbHlnb24gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigncG9seWdvbicpO1xuICAgICAgY29uc3QgdHJhbnNmb3JtID0gcG9seWdvbi5nZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScpO1xuXG4gICAgICAvLyAtKC0zMCkgPSAzMFxuICAgICAgZXhwZWN0KHRyYW5zZm9ybSkudG9Db250YWluKCdyb3RhdGUoMzAnKTtcbiAgICAgIGV4cGVjdCh0cmFuc2Zvcm0pLnRvQ29udGFpbignMicpO1xuICAgICAgZXhwZWN0KHRyYW5zZm9ybSkudG9Db250YWluKCc0Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyAzNjAgZGVncmVlIGFuZ2xlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IHg6IDEsIHk6IDEsIGFuZ2xlOiAzNjAgfSk7XG4gICAgICBjb25zdCBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHBvbHlnb24uZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKTtcblxuICAgICAgZXhwZWN0KHRyYW5zZm9ybSkudG9Db250YWluKCdyb3RhdGUoLTM2MCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYXJyb3cgcG9pbnRzIGNhbGN1bGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdjYWxjdWxhdGVzIGNvcnJlY3QgcG9pbnRzIGZvciBhcnJvdyBoZWFkJywgKCkgPT4ge1xuICAgICAgdGhpbm5lclNoYXBlc05lZWRlZC5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IHg6IDAsIHk6IDAsIGFuZ2xlOiAwIH0pO1xuICAgICAgY29uc3QgcG9seWdvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdwb2x5Z29uJyk7XG5cbiAgICAgIC8vIHNpemUgPSAxNFxuICAgICAgLy8gcG9pbnRzID0gXCIwLDAgLTE0LC03IC0xNCwgN1wiIChub3RlIHRoZSBzcGFjZSBhZnRlciBjb21tYSBpbiB0aGUgdGVtcGxhdGUgbGl0ZXJhbClcbiAgICAgIGNvbnN0IHBvaW50cyA9IHBvbHlnb24uZ2V0QXR0cmlidXRlKCdwb2ludHMnKTtcbiAgICAgIGV4cGVjdChwb2ludHMpLnRvQ29udGFpbignMCwwJyk7XG4gICAgICBleHBlY3QocG9pbnRzKS50b0NvbnRhaW4oJy0xNCwtNycpO1xuICAgICAgZXhwZWN0KHBvaW50cykudG9NYXRjaCgvLTE0LFxccyo3Lyk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsY3VsYXRlcyBwb2ludHMgd2l0aCBzY2FsZWQgY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICB0aGlubmVyU2hhcGVzTmVlZGVkLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICBjb25zdCBtb2NrU2NhbGUgPSB7XG4gICAgICAgIHg6IGplc3QuZm4oKG4pID0+IG4pLFxuICAgICAgICB5OiBqZXN0LmZuKChuKSA9PiBuKSxcbiAgICAgIH07XG4gICAgICBjb25zdCBncCA9IHtcbiAgICAgICAgLi4uZ3JhcGhQcm9wcygpLFxuICAgICAgICBzY2FsZTogbW9ja1NjYWxlLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IHg6IDEwLCB5OiAyMCwgZ3JhcGhQcm9wczogZ3AgfSk7XG4gICAgICBjb25zdCBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcblxuICAgICAgLy8gc2NhbGVkWCA9IDEwLCBzY2FsZWRZID0gMjAsIHNpemUgPSAxNFxuICAgICAgLy8gcG9pbnRzID0gXCIxMCwyMCAtNCwxMyAtNCwgMjdcIiAobm90ZSB0aGUgc3BhY2UgYWZ0ZXIgY29tbWEgaW4gdGhlIHRlbXBsYXRlIGxpdGVyYWwpXG4gICAgICBjb25zdCBwb2ludHMgPSBwb2x5Z29uLmdldEF0dHJpYnV0ZSgncG9pbnRzJyk7XG4gICAgICBleHBlY3QocG9pbnRzKS50b0NvbnRhaW4oJzEwLDIwJyk7XG4gICAgICBleHBlY3QocG9pbnRzKS50b0NvbnRhaW4oJy00LDEzJyk7XG4gICAgICBleHBlY3QocG9pbnRzKS50b01hdGNoKC8tNCxcXHMqMjcvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Byb3BzIGhhbmRsaW5nJywgKCkgPT4ge1xuICAgIGl0KCdwYXNzZXMgdGhyb3VnaCBhZGRpdGlvbmFsIHByb3BzIHRvIGcgZWxlbWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICAnZGF0YS10ZXN0JzogJ2Fycm93LXRlc3QnLFxuICAgICAgICByb2xlOiAnZ3JhcGhpY3Mtc3ltYm9sJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZ0VsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZycpO1xuICAgICAgZXhwZWN0KGdFbGVtZW50KS50b0hhdmVBdHRyaWJ1dGUoJ2RhdGEtdGVzdCcsICdhcnJvdy10ZXN0Jyk7XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLnRvSGF2ZUF0dHJpYnV0ZSgncm9sZScsICdncmFwaGljcy1zeW1ib2wnKTtcbiAgICB9KTtcblxuICAgIGl0KCdleGNsdWRlcyBmaWx0ZXJlZCBwcm9wcyBmcm9tIGcgZWxlbWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICB4OiA1LFxuICAgICAgICB5OiAxMCxcbiAgICAgICAgYW5nbGU6IDQ1LFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgIGNvcnJlY3RuZXNzOiAnY29ycmVjdCcsXG4gICAgICAgIGdyYXBoUHJvcHM6IGdyYXBoUHJvcHMoKSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZ0VsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZycpO1xuXG4gICAgICAvLyBUaGVzZSBwcm9wcyBzaG91bGQgbm90IGJlIHBhc3NlZCB0byB0aGUgZyBlbGVtZW50XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLm5vdC50b0hhdmVBdHRyaWJ1dGUoJ3gnKTtcbiAgICAgIGV4cGVjdChnRWxlbWVudCkubm90LnRvSGF2ZUF0dHJpYnV0ZSgneScpO1xuICAgICAgZXhwZWN0KGdFbGVtZW50KS5ub3QudG9IYXZlQXR0cmlidXRlKCdhbmdsZScpO1xuICAgICAgZXhwZWN0KGdFbGVtZW50KS5ub3QudG9IYXZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgZXhwZWN0KGdFbGVtZW50KS5ub3QudG9IYXZlQXR0cmlidXRlKCdjb3JyZWN0bmVzcycpO1xuICAgICAgZXhwZWN0KGdFbGVtZW50KS5ub3QudG9IYXZlQXR0cmlidXRlKCdncmFwaFByb3BzJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlZGdlIGNhc2VzJywgKCkgPT4ge1xuICAgIGl0KCdoYW5kbGVzIHplcm8gY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgeDogMCwgeTogMCwgYW5nbGU6IDAgfSk7XG4gICAgICBjb25zdCBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcbiAgICAgIGV4cGVjdChwb2x5Z29uKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHBvbHlnb24uZ2V0QXR0cmlidXRlKCdwb2ludHMnKSkudG9CZVRydXRoeSgpO1xuICAgICAgZXhwZWN0KHBvbHlnb24uZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgbmVnYXRpdmUgY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgeDogLTUsIHk6IC0xMCwgYW5nbGU6IDAgfSk7XG4gICAgICBjb25zdCBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcbiAgICAgIGV4cGVjdChwb2x5Z29uKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHBvbHlnb24uZ2V0QXR0cmlidXRlKCdwb2ludHMnKSkudG9CZVRydXRoeSgpO1xuICAgICAgZXhwZWN0KHBvbHlnb24uZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgbGFyZ2UgY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgeDogMTAwMCwgeTogMjAwMCwgYW5nbGU6IDAgfSk7XG4gICAgICBjb25zdCBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcbiAgICAgIGV4cGVjdChwb2x5Z29uKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgZnJhY3Rpb25hbCBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyB4OiAzLjUsIHk6IDcuMjUsIGFuZ2xlOiAyMi41IH0pO1xuICAgICAgY29uc3QgcG9seWdvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdwb2x5Z29uJyk7XG4gICAgICBleHBlY3QocG9seWdvbikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChwb2x5Z29uLmdldEF0dHJpYnV0ZSgndHJhbnNmb3JtJykpLnRvQ29udGFpbigncm90YXRlKC0yMi41Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGVtcHR5IGNsYXNzZXMgcHJvcCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEFycm93IHg9ezV9IHk9ezEwfSBhbmdsZT17NDV9IGdyYXBoUHJvcHM9e2dyYXBoUHJvcHMoKX0gY2xhc3Nlcz17e319IC8+KTtcbiAgICAgIGNvbnN0IGdFbGVtZW50ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2cnKTtcbiAgICAgIGV4cGVjdChnRWxlbWVudCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgY2xhc3NOYW1lIHByb3AnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxBcnJvdyB4PXs1fSB5PXsxMH0gYW5nbGU9ezQ1fSBncmFwaFByb3BzPXtncmFwaFByb3BzKCl9IGNsYXNzZXM9e3t9fSAvPik7XG4gICAgICBjb25zdCBnRWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdnJyk7XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdncmFwaFByb3BzIGludGVncmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCd3b3JrcyB3aXRoIGRpZmZlcmVudCBkb21haW4gYW5kIHJhbmdlIHZhbHVlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGdwID0gZ3JhcGhQcm9wcygtMTAsIDEwLCAtMjAsIDIwKTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBncmFwaFByb3BzOiBncCB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcigncG9seWdvbicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHRoaW5uZXJTaGFwZXNOZWVkZWQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGdwKTtcbiAgICB9KTtcblxuICAgIGl0KCd3b3JrcyB3aXRoIGN1c3RvbSBzaXplIGluIGdyYXBoUHJvcHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBncCA9IHtcbiAgICAgICAgLi4uZ3JhcGhQcm9wcygpLFxuICAgICAgICBzaXplOiB7XG4gICAgICAgICAgd2lkdGg6IDgwMCxcbiAgICAgICAgICBoZWlnaHQ6IDYwMCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgZ3JhcGhQcm9wczogZ3AgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGdyYXBoUHJvcHMgd2l0aCBzbWFsbCBzdGVwIHZhbHVlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGdwID0ge1xuICAgICAgICAuLi5ncmFwaFByb3BzKCksXG4gICAgICAgIGRvbWFpbjogeyBtaW46IDAsIG1heDogMTAsIHN0ZXA6IDAuMSB9LFxuICAgICAgICByYW5nZTogeyBtaW46IDAsIG1heDogMTAsIHN0ZXA6IDAuMSB9LFxuICAgICAgfTtcbiAgICAgIHRoaW5uZXJTaGFwZXNOZWVkZWQubW9ja1JldHVyblZhbHVlKHRydWUpO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGdyYXBoUHJvcHM6IGdwIH0pO1xuICAgICAgY29uc3QgcG9seWdvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdwb2x5Z29uJyk7XG5cbiAgICAgIC8vIFNob3VsZCB1c2Ugc2l6ZSAxMiBmb3IgdGhpbm5lciBzaGFwZXNcbiAgICAgIGV4cGVjdChwb2x5Z29uKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHRoaW5uZXJTaGFwZXNOZWVkZWQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGdwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ211bHRpcGxlIGNvcnJlY3RuZXNzIHN0YXRlcycsICgpID0+IHtcbiAgICBpdCgnaGFuZGxlcyBwYXJ0aWFsIGNvcnJlY3RuZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNsYXNzZXM6IHsgcG9pbnQ6ICdwb2ludC1jbGFzcycsIHBhcnRpYWw6ICdwYXJ0aWFsLWNsYXNzJyB9LFxuICAgICAgICBjb3JyZWN0bmVzczogJ3BhcnRpYWwnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBnRWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdnJyk7XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLnRvSGF2ZUNsYXNzKCdwYXJ0aWFsLWNsYXNzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyB1bmRlZmluZWQgY29ycmVjdG5lc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY2xhc3NlczogeyBwb2ludDogJ3BvaW50LWNsYXNzJyB9LFxuICAgICAgICBjb3JyZWN0bmVzczogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBnRWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdnJyk7XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLnRvSGF2ZUNsYXNzKCdwb2ludC1jbGFzcycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgbnVsbCBjb3JyZWN0bmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjbGFzc2VzOiB7IHBvaW50OiAncG9pbnQtY2xhc3MnIH0sXG4gICAgICAgIGNvcnJlY3RuZXNzOiBudWxsLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBnRWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdnJyk7XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLnRvSGF2ZUNsYXNzKCdwb2ludC1jbGFzcycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29tYmluZWQgc3RhdGVzJywgKCkgPT4ge1xuICAgIGl0KCdoYW5kbGVzIGRpc2FibGVkIGFuZCBjb3JyZWN0IHN0YXRlcyB0b2dldGhlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjbGFzc2VzOiB7XG4gICAgICAgICAgcG9pbnQ6ICdwb2ludC1jbGFzcycsXG4gICAgICAgICAgZGlzYWJsZWQ6ICdkaXNhYmxlZC1jbGFzcycsXG4gICAgICAgICAgY29ycmVjdDogJ2NvcnJlY3QtY2xhc3MnLFxuICAgICAgICB9LFxuICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgY29ycmVjdG5lc3M6ICdjb3JyZWN0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZ0VsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZycpO1xuICAgICAgZXhwZWN0KGdFbGVtZW50KS50b0hhdmVDbGFzcygncG9pbnQtY2xhc3MnKTtcbiAgICAgIGV4cGVjdChnRWxlbWVudCkudG9IYXZlQ2xhc3MoJ2Rpc2FibGVkLWNsYXNzJyk7XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLnRvSGF2ZUNsYXNzKCdjb3JyZWN0LWNsYXNzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBkaXNhYmxlZCBhbmQgaW5jb3JyZWN0IHN0YXRlcyB0b2dldGhlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjbGFzc2VzOiB7XG4gICAgICAgICAgcG9pbnQ6ICdwb2ludC1jbGFzcycsXG4gICAgICAgICAgZGlzYWJsZWQ6ICdkaXNhYmxlZC1jbGFzcycsXG4gICAgICAgICAgaW5jb3JyZWN0OiAnaW5jb3JyZWN0LWNsYXNzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICAgIGNvcnJlY3RuZXNzOiAnaW5jb3JyZWN0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZ0VsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZycpO1xuICAgICAgZXhwZWN0KGdFbGVtZW50KS50b0hhdmVDbGFzcygncG9pbnQtY2xhc3MnKTtcbiAgICAgIGV4cGVjdChnRWxlbWVudCkudG9IYXZlQ2xhc3MoJ2Rpc2FibGVkLWNsYXNzJyk7XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLnRvSGF2ZUNsYXNzKCdpbmNvcnJlY3QtY2xhc3MnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlLXJlbmRlcmluZycsICgpID0+IHtcbiAgICBpdCgndXBkYXRlcyB3aGVuIHggY29vcmRpbmF0ZSBjaGFuZ2VzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIsIHJlcmVuZGVyIH0gPSByZW5kZXJDb21wb25lbnQoeyB4OiA1LCB5OiAxMCwgYW5nbGU6IDAgfSk7XG4gICAgICBsZXQgcG9seWdvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdwb2x5Z29uJyk7XG4gICAgICBjb25zdCBpbml0aWFsUG9pbnRzID0gcG9seWdvbi5nZXRBdHRyaWJ1dGUoJ3BvaW50cycpO1xuXG4gICAgICByZXJlbmRlcig8QXJyb3cgeD17MTV9IHk9ezEwfSBhbmdsZT17MH0gZ3JhcGhQcm9wcz17Z3JhcGhQcm9wcygpfSBjbGFzc2VzPXt7fX0gY2xhc3NOYW1lPVwiYXJyb3ctY2xhc3NcIiAvPik7XG5cbiAgICAgIHBvbHlnb24gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigncG9seWdvbicpO1xuICAgICAgY29uc3QgbmV3UG9pbnRzID0gcG9seWdvbi5nZXRBdHRyaWJ1dGUoJ3BvaW50cycpO1xuICAgICAgZXhwZWN0KG5ld1BvaW50cykubm90LnRvQmUoaW5pdGlhbFBvaW50cyk7XG4gICAgfSk7XG5cbiAgICBpdCgndXBkYXRlcyB3aGVuIHkgY29vcmRpbmF0ZSBjaGFuZ2VzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIsIHJlcmVuZGVyIH0gPSByZW5kZXJDb21wb25lbnQoeyB4OiA1LCB5OiAxMCwgYW5nbGU6IDAgfSk7XG4gICAgICBsZXQgcG9seWdvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdwb2x5Z29uJyk7XG4gICAgICBjb25zdCBpbml0aWFsUG9pbnRzID0gcG9seWdvbi5nZXRBdHRyaWJ1dGUoJ3BvaW50cycpO1xuXG4gICAgICByZXJlbmRlcig8QXJyb3cgeD17NX0geT17MjB9IGFuZ2xlPXswfSBncmFwaFByb3BzPXtncmFwaFByb3BzKCl9IGNsYXNzZXM9e3t9fSBjbGFzc05hbWU9XCJhcnJvdy1jbGFzc1wiIC8+KTtcblxuICAgICAgcG9seWdvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdwb2x5Z29uJyk7XG4gICAgICBjb25zdCBuZXdQb2ludHMgPSBwb2x5Z29uLmdldEF0dHJpYnV0ZSgncG9pbnRzJyk7XG4gICAgICBleHBlY3QobmV3UG9pbnRzKS5ub3QudG9CZShpbml0aWFsUG9pbnRzKTtcbiAgICB9KTtcblxuICAgIGl0KCd1cGRhdGVzIHdoZW4gYW5nbGUgY2hhbmdlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyLCByZXJlbmRlciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgeDogNSwgeTogMTAsIGFuZ2xlOiAwIH0pO1xuICAgICAgbGV0IHBvbHlnb24gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigncG9seWdvbicpO1xuICAgICAgY29uc3QgaW5pdGlhbFRyYW5zZm9ybSA9IHBvbHlnb24uZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKTtcblxuICAgICAgcmVyZW5kZXIoPEFycm93IHg9ezV9IHk9ezEwfSBhbmdsZT17OTB9IGdyYXBoUHJvcHM9e2dyYXBoUHJvcHMoKX0gY2xhc3Nlcz17e319IGNsYXNzTmFtZT1cImFycm93LWNsYXNzXCIgLz4pO1xuXG4gICAgICBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcbiAgICAgIGNvbnN0IG5ld1RyYW5zZm9ybSA9IHBvbHlnb24uZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKTtcbiAgICAgIGV4cGVjdChuZXdUcmFuc2Zvcm0pLm5vdC50b0JlKGluaXRpYWxUcmFuc2Zvcm0pO1xuICAgICAgZXhwZWN0KG5ld1RyYW5zZm9ybSkudG9Db250YWluKCdyb3RhdGUoLTkwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgndXBkYXRlcyB3aGVuIHRoaW5uZXJTaGFwZXNOZWVkZWQgcmVzdWx0IGNoYW5nZXMnLCAoKSA9PiB7XG4gICAgICB0aGlubmVyU2hhcGVzTmVlZGVkLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciwgcmVyZW5kZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IHg6IDAsIHk6IDAsIGFuZ2xlOiAwIH0pO1xuICAgICAgbGV0IHBvbHlnb24gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigncG9seWdvbicpO1xuICAgICAgY29uc3QgaW5pdGlhbFBvaW50cyA9IHBvbHlnb24uZ2V0QXR0cmlidXRlKCdwb2ludHMnKTtcblxuICAgICAgdGhpbm5lclNoYXBlc05lZWRlZC5tb2NrUmV0dXJuVmFsdWUodHJ1ZSk7XG4gICAgICByZXJlbmRlcig8QXJyb3cgeD17MH0geT17MH0gYW5nbGU9ezB9IGdyYXBoUHJvcHM9e2dyYXBoUHJvcHMoKX0gY2xhc3Nlcz17e319IGNsYXNzTmFtZT1cImFycm93LWNsYXNzXCIgLz4pO1xuXG4gICAgICBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcbiAgICAgIGNvbnN0IG5ld1BvaW50cyA9IHBvbHlnb24uZ2V0QXR0cmlidXRlKCdwb2ludHMnKTtcbiAgICAgIC8vIFBvaW50cyBzaG91bGQgY2hhbmdlIGR1ZSB0byBzaXplIGNoYW5nZSAoMTQgdnMgMTIpXG4gICAgICBleHBlY3QobmV3UG9pbnRzKS5ub3QudG9CZShpbml0aWFsUG9pbnRzKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQUFBLFVBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUQsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLE9BQUEsR0FBQUwsT0FBQTtBQUF3RCxTQUFBTSxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVksU0FBQSxDQUFBWixDQUFBLFFBQUFBLENBQUEsT0FBQUYsT0FBQSxDQUFBSSxNQUFBLENBQUFELENBQUEsT0FBQWEsT0FBQSxXQUFBZCxD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