@pie-lib/graphing-solution-set 3.2.0-next.2 → 3.2.0-next.4

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 (75) hide show
  1. package/CHANGELOG.md +19 -32
  2. package/LICENSE.md +5 -0
  3. package/lib/axis/arrow.js +1 -1
  4. package/lib/axis/axes.js +1 -1
  5. package/lib/axis/index.js +1 -1
  6. package/lib/bg.js +1 -1
  7. package/lib/container/actions.js +1 -1
  8. package/lib/container/index.js +1 -1
  9. package/lib/container/marks.js +1 -1
  10. package/lib/container/middleware.js +1 -1
  11. package/lib/container/reducer.js +1 -1
  12. package/lib/coordinates-label.js +1 -1
  13. package/lib/graph-with-controls.js +1 -1
  14. package/lib/graph.js +1 -1
  15. package/lib/grid-setup.js +1 -1
  16. package/lib/grid.js +1 -1
  17. package/lib/index.js +1 -1
  18. package/lib/labels.js +1 -1
  19. package/lib/mark-label.js +1 -1
  20. package/lib/toggle-bar.js +1 -1
  21. package/lib/tool-menu.js +1 -1
  22. package/lib/tools/index.js +1 -1
  23. package/lib/tools/line/component.js +1 -1
  24. package/lib/tools/line/index.js +1 -1
  25. package/lib/tools/polygon/component.js +1 -1
  26. package/lib/tools/polygon/index.js +1 -1
  27. package/lib/tools/polygon/line.js +1 -1
  28. package/lib/tools/polygon/polygon.js +1 -1
  29. package/lib/tools/shared/arrow-head.js +1 -1
  30. package/lib/tools/shared/line/index.js +1 -1
  31. package/lib/tools/shared/line/line-path.js +1 -1
  32. package/lib/tools/shared/line/with-root-edge.js +1 -1
  33. package/lib/tools/shared/point/arrow-point.js +1 -1
  34. package/lib/tools/shared/point/arrow.js +1 -1
  35. package/lib/tools/shared/point/base-point.js +1 -1
  36. package/lib/tools/shared/point/index.js +1 -1
  37. package/lib/tools/shared/styles.js +1 -1
  38. package/lib/tools/shared/types.js +1 -1
  39. package/lib/undo-redo.js +1 -1
  40. package/lib/use-debounce.js +1 -1
  41. package/lib/utils.js +1 -1
  42. package/package.json +4 -4
  43. package/lib/__tests__/bg.test.js +0 -282
  44. package/lib/__tests__/coordinates-label.test.js +0 -276
  45. package/lib/__tests__/graph-with-controls.test.js +0 -256
  46. package/lib/__tests__/graph.test.js +0 -113
  47. package/lib/__tests__/grid-setup.test.js +0 -729
  48. package/lib/__tests__/grid.test.js +0 -29
  49. package/lib/__tests__/labels.test.js +0 -45
  50. package/lib/__tests__/mark-label.test.js +0 -133
  51. package/lib/__tests__/toggle-bar.test.js +0 -146
  52. package/lib/__tests__/tool-menu.test.js +0 -540
  53. package/lib/__tests__/undo-redo.test.js +0 -31
  54. package/lib/__tests__/use-debounce.test.js +0 -24
  55. package/lib/__tests__/utils.js +0 -70
  56. package/lib/__tests__/utils.test.js +0 -123
  57. package/lib/axis/__tests__/arrow.test.js +0 -60
  58. package/lib/axis/__tests__/axes.test.js +0 -160
  59. package/lib/container/__tests__/actions.test.js +0 -108
  60. package/lib/container/__tests__/index.test.js +0 -346
  61. package/lib/container/__tests__/marks.test.js +0 -259
  62. package/lib/container/__tests__/middleware.test.js +0 -244
  63. package/lib/container/__tests__/reducer.test.js +0 -450
  64. package/lib/tools/line/__tests__/component.test.js +0 -45
  65. package/lib/tools/polygon/__tests__/component.test.js +0 -501
  66. package/lib/tools/polygon/__tests__/index.test.js +0 -92
  67. package/lib/tools/polygon/__tests__/line.test.js +0 -30
  68. package/lib/tools/polygon/__tests__/polygon.test.js +0 -61
  69. package/lib/tools/shared/__tests__/arrow-head.test.js +0 -45
  70. package/lib/tools/shared/line/__tests__/index.test.js +0 -725
  71. package/lib/tools/shared/line/__tests__/line-path.test.js +0 -64
  72. package/lib/tools/shared/line/__tests__/with-root-edge.test.js +0 -618
  73. package/lib/tools/shared/point/__tests__/arrow-point.test.js +0 -127
  74. package/lib/tools/shared/point/__tests__/arrow.test.js +0 -619
  75. package/lib/tools/shared/point/__tests__/base-point.test.js +0 -122
@@ -1,619 +0,0 @@
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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