@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,540 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
5
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
6
+ var _testUtils = require("@pie-lib/test-utils");
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _toolMenu = _interopRequireDefault(require("../tool-menu"));
9
+ 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; }
10
+ 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; }
11
+ describe('ToolMenu', function () {
12
+ var onChange;
13
+ var tools = ['one', 'two'];
14
+ beforeEach(function () {
15
+ onChange = jest.fn();
16
+ });
17
+ var renderComponent = function renderComponent(extras) {
18
+ var defaults = {
19
+ classes: {},
20
+ className: 'className',
21
+ onChange: onChange,
22
+ currentTool: tools[0],
23
+ tools: tools,
24
+ gssLineData: {
25
+ selectedTool: 'lineA',
26
+ numberOfLines: 2,
27
+ lineA: {
28
+ lineType: 'Solid'
29
+ },
30
+ lineB: {
31
+ lineType: 'Solid'
32
+ }
33
+ }
34
+ };
35
+ var props = _objectSpread(_objectSpread({}, defaults), extras);
36
+ return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_toolMenu["default"], props));
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 Line A radio button', function () {
45
+ var _renderComponent2 = renderComponent(),
46
+ getByText = _renderComponent2.getByText;
47
+ expect(getByText('Line A')).toBeInTheDocument();
48
+ });
49
+ it('renders Line B radio button when numberOfLines is 2', function () {
50
+ var _renderComponent3 = renderComponent(),
51
+ getByText = _renderComponent3.getByText;
52
+ expect(getByText('Line B')).toBeInTheDocument();
53
+ });
54
+ it('does not render Line B radio button when numberOfLines is 1', function () {
55
+ var _renderComponent4 = renderComponent({
56
+ gssLineData: {
57
+ selectedTool: 'lineA',
58
+ numberOfLines: 1,
59
+ lineA: {
60
+ lineType: 'Solid'
61
+ },
62
+ lineB: {
63
+ lineType: 'Solid'
64
+ }
65
+ }
66
+ }),
67
+ queryByText = _renderComponent4.queryByText;
68
+ expect(queryByText('Line B')).not.toBeInTheDocument();
69
+ });
70
+ it('renders Solution Set radio button', function () {
71
+ var _renderComponent5 = renderComponent(),
72
+ getByText = _renderComponent5.getByText;
73
+ expect(getByText('Solution Set')).toBeInTheDocument();
74
+ });
75
+ it('renders Solid and Dashed buttons for Line A', function () {
76
+ var _renderComponent6 = renderComponent(),
77
+ getAllByText = _renderComponent6.getAllByText;
78
+ var solidButtons = getAllByText(/Solid/);
79
+ var dashedButtons = getAllByText(/Dashed/);
80
+ expect(solidButtons.length).toBeGreaterThan(0);
81
+ expect(dashedButtons.length).toBeGreaterThan(0);
82
+ });
83
+ it('shows checkmark on selected line type for Line A', function () {
84
+ var _renderComponent7 = renderComponent({
85
+ gssLineData: {
86
+ selectedTool: 'lineA',
87
+ numberOfLines: 2,
88
+ lineA: {
89
+ lineType: 'Solid'
90
+ },
91
+ lineB: {
92
+ lineType: 'Dashed'
93
+ }
94
+ }
95
+ }),
96
+ getAllByText = _renderComponent7.getAllByText;
97
+ var solidButtons = getAllByText(/✔ Solid/);
98
+ expect(solidButtons.length).toBeGreaterThan(0);
99
+ });
100
+ it('disables all controls when disabled prop is true', function () {
101
+ var _renderComponent8 = renderComponent({
102
+ disabled: true
103
+ }),
104
+ getAllByRole = _renderComponent8.getAllByRole;
105
+ var radios = getAllByRole('radio');
106
+ var buttons = getAllByRole('button');
107
+ radios.forEach(function (radio) {
108
+ expect(radio).toBeDisabled();
109
+ });
110
+ buttons.forEach(function (button) {
111
+ expect(button).toBeDisabled();
112
+ });
113
+ });
114
+ });
115
+ describe('onChangeRadioValue', function () {
116
+ it('calls onChange with updated selectedTool when lineA radio is clicked', function () {
117
+ var _renderComponent9 = renderComponent({
118
+ gssLineData: {
119
+ selectedTool: 'solutionSet',
120
+ numberOfLines: 2,
121
+ lineA: {
122
+ lineType: 'Solid'
123
+ },
124
+ lineB: {
125
+ lineType: 'Solid'
126
+ }
127
+ }
128
+ }),
129
+ getAllByRole = _renderComponent9.getAllByRole;
130
+ var radios = getAllByRole('radio');
131
+ var lineARadio = radios.find(function (r) {
132
+ return r.value === 'lineA';
133
+ });
134
+ _testUtils.fireEvent.click(lineARadio);
135
+ expect(onChange).toHaveBeenCalledTimes(1);
136
+ var _onChange$mock$calls$ = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 2),
137
+ updatedData = _onChange$mock$calls$[0],
138
+ oldSelectedTool = _onChange$mock$calls$[1];
139
+ expect(updatedData.selectedTool).toBe('lineA');
140
+ expect(oldSelectedTool).toBe('solutionSet');
141
+ });
142
+ it('calls onChange with updated selectedTool when lineB radio is clicked', function () {
143
+ var _renderComponent0 = renderComponent({
144
+ gssLineData: {
145
+ selectedTool: 'lineA',
146
+ numberOfLines: 2,
147
+ lineA: {
148
+ lineType: 'Solid'
149
+ },
150
+ lineB: {
151
+ lineType: 'Solid'
152
+ }
153
+ }
154
+ }),
155
+ getAllByRole = _renderComponent0.getAllByRole;
156
+ var radios = getAllByRole('radio');
157
+ var lineBRadio = radios.find(function (r) {
158
+ return r.value === 'lineB';
159
+ });
160
+ _testUtils.fireEvent.click(lineBRadio);
161
+ expect(onChange).toHaveBeenCalledTimes(1);
162
+ var _onChange$mock$calls$2 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 2),
163
+ updatedData = _onChange$mock$calls$2[0],
164
+ oldSelectedTool = _onChange$mock$calls$2[1];
165
+ expect(updatedData.selectedTool).toBe('lineB');
166
+ expect(oldSelectedTool).toBe('lineA');
167
+ });
168
+ it('calls onChange with updated selectedTool when solutionSet radio is clicked', function () {
169
+ var _renderComponent1 = renderComponent({
170
+ gssLineData: {
171
+ selectedTool: 'lineA',
172
+ numberOfLines: 2,
173
+ lineA: {
174
+ lineType: 'Solid'
175
+ },
176
+ lineB: {
177
+ lineType: 'Solid'
178
+ }
179
+ }
180
+ }),
181
+ getAllByRole = _renderComponent1.getAllByRole;
182
+ var radios = getAllByRole('radio');
183
+ var solutionSetRadio = radios.find(function (r) {
184
+ return r.value === 'solutionSet';
185
+ });
186
+ _testUtils.fireEvent.click(solutionSetRadio);
187
+ expect(onChange).toHaveBeenCalledTimes(1);
188
+ var _onChange$mock$calls$3 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 2),
189
+ updatedData = _onChange$mock$calls$3[0],
190
+ oldSelectedTool = _onChange$mock$calls$3[1];
191
+ expect(updatedData.selectedTool).toBe('solutionSet');
192
+ expect(oldSelectedTool).toBe('lineA');
193
+ });
194
+ it('preserves other gssLineData properties when changing selectedTool', function () {
195
+ var _renderComponent10 = renderComponent({
196
+ gssLineData: {
197
+ selectedTool: 'lineA',
198
+ numberOfLines: 2,
199
+ lineA: {
200
+ lineType: 'Dashed'
201
+ },
202
+ lineB: {
203
+ lineType: 'Solid'
204
+ }
205
+ }
206
+ }),
207
+ getAllByRole = _renderComponent10.getAllByRole;
208
+ var radios = getAllByRole('radio');
209
+ var lineBRadio = radios.find(function (r) {
210
+ return r.value === 'lineB';
211
+ });
212
+ _testUtils.fireEvent.click(lineBRadio);
213
+ var _onChange$mock$calls$4 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 1),
214
+ updatedData = _onChange$mock$calls$4[0];
215
+ expect(updatedData.lineA.lineType).toBe('Dashed');
216
+ expect(updatedData.lineB.lineType).toBe('Solid');
217
+ expect(updatedData.numberOfLines).toBe(2);
218
+ });
219
+ it('does not call onChange when disabled', function () {
220
+ var _renderComponent11 = renderComponent({
221
+ disabled: true,
222
+ gssLineData: {
223
+ selectedTool: 'lineA',
224
+ numberOfLines: 2,
225
+ lineA: {
226
+ lineType: 'Solid'
227
+ },
228
+ lineB: {
229
+ lineType: 'Solid'
230
+ }
231
+ }
232
+ }),
233
+ getAllByRole = _renderComponent11.getAllByRole;
234
+ var radios = getAllByRole('radio');
235
+ var lineBRadio = radios.find(function (r) {
236
+ return r.value === 'lineB';
237
+ });
238
+
239
+ // Disabled radios should not fire change events
240
+ expect(lineBRadio).toBeDisabled();
241
+ });
242
+ });
243
+ describe('lineTypeChange', function () {
244
+ it('calls onChange with updated lineType for Line A when Solid button is clicked', function () {
245
+ var _renderComponent12 = renderComponent({
246
+ gssLineData: {
247
+ selectedTool: 'lineA',
248
+ numberOfLines: 2,
249
+ lineA: {
250
+ lineType: 'Dashed'
251
+ },
252
+ lineB: {
253
+ lineType: 'Solid'
254
+ }
255
+ }
256
+ }),
257
+ getAllByText = _renderComponent12.getAllByText;
258
+ var solidButtons = getAllByText(/Solid/);
259
+ // First solid button should be for Line A
260
+ _testUtils.fireEvent.click(solidButtons[0]);
261
+ expect(onChange).toHaveBeenCalledTimes(1);
262
+ var _onChange$mock$calls$5 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 2),
263
+ updatedData = _onChange$mock$calls$5[0],
264
+ oldSelectedTool = _onChange$mock$calls$5[1];
265
+ expect(updatedData.lineA.lineType).toBe('Solid');
266
+ expect(oldSelectedTool).toBe('lineA');
267
+ });
268
+ it('calls onChange with updated lineType for Line A when Dashed button is clicked', function () {
269
+ var _renderComponent13 = renderComponent({
270
+ gssLineData: {
271
+ selectedTool: 'lineA',
272
+ numberOfLines: 2,
273
+ lineA: {
274
+ lineType: 'Solid'
275
+ },
276
+ lineB: {
277
+ lineType: 'Solid'
278
+ }
279
+ }
280
+ }),
281
+ getAllByText = _renderComponent13.getAllByText;
282
+ var dashedButtons = getAllByText(/Dashed/);
283
+ // First dashed button should be for Line A
284
+ _testUtils.fireEvent.click(dashedButtons[0]);
285
+ expect(onChange).toHaveBeenCalledTimes(1);
286
+ var _onChange$mock$calls$6 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 2),
287
+ updatedData = _onChange$mock$calls$6[0],
288
+ oldSelectedTool = _onChange$mock$calls$6[1];
289
+ expect(updatedData.lineA.lineType).toBe('Dashed');
290
+ expect(oldSelectedTool).toBe('lineA');
291
+ });
292
+ it('calls onChange with updated lineType for Line B when Solid button is clicked', function () {
293
+ var _renderComponent14 = renderComponent({
294
+ gssLineData: {
295
+ selectedTool: 'lineB',
296
+ numberOfLines: 2,
297
+ lineA: {
298
+ lineType: 'Solid'
299
+ },
300
+ lineB: {
301
+ lineType: 'Dashed'
302
+ }
303
+ }
304
+ }),
305
+ getAllByText = _renderComponent14.getAllByText;
306
+ var solidButtons = getAllByText(/Solid/);
307
+ // Second solid button should be for Line B
308
+ _testUtils.fireEvent.click(solidButtons[1]);
309
+ expect(onChange).toHaveBeenCalledTimes(1);
310
+ var _onChange$mock$calls$7 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 2),
311
+ updatedData = _onChange$mock$calls$7[0],
312
+ oldSelectedTool = _onChange$mock$calls$7[1];
313
+ expect(updatedData.lineB.lineType).toBe('Solid');
314
+ expect(oldSelectedTool).toBe('lineB');
315
+ });
316
+ it('calls onChange with updated lineType for Line B when Dashed button is clicked', function () {
317
+ var _renderComponent15 = renderComponent({
318
+ gssLineData: {
319
+ selectedTool: 'lineB',
320
+ numberOfLines: 2,
321
+ lineA: {
322
+ lineType: 'Solid'
323
+ },
324
+ lineB: {
325
+ lineType: 'Solid'
326
+ }
327
+ }
328
+ }),
329
+ getAllByText = _renderComponent15.getAllByText;
330
+ var dashedButtons = getAllByText(/Dashed/);
331
+ // Second dashed button should be for Line B
332
+ _testUtils.fireEvent.click(dashedButtons[1]);
333
+ expect(onChange).toHaveBeenCalledTimes(1);
334
+ var _onChange$mock$calls$8 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 2),
335
+ updatedData = _onChange$mock$calls$8[0],
336
+ oldSelectedTool = _onChange$mock$calls$8[1];
337
+ expect(updatedData.lineB.lineType).toBe('Dashed');
338
+ expect(oldSelectedTool).toBe('lineB');
339
+ });
340
+ it('preserves other line properties when changing Line A lineType', function () {
341
+ var _renderComponent16 = renderComponent({
342
+ gssLineData: {
343
+ selectedTool: 'lineA',
344
+ numberOfLines: 2,
345
+ lineA: {
346
+ lineType: 'Solid'
347
+ },
348
+ lineB: {
349
+ lineType: 'Dashed'
350
+ }
351
+ }
352
+ }),
353
+ getAllByText = _renderComponent16.getAllByText;
354
+ var dashedButtons = getAllByText(/Dashed/);
355
+ _testUtils.fireEvent.click(dashedButtons[0]);
356
+ var _onChange$mock$calls$9 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 1),
357
+ updatedData = _onChange$mock$calls$9[0];
358
+ expect(updatedData.lineA.lineType).toBe('Dashed');
359
+ expect(updatedData.lineB.lineType).toBe('Dashed');
360
+ expect(updatedData.selectedTool).toBe('lineA');
361
+ expect(updatedData.numberOfLines).toBe(2);
362
+ });
363
+ it('preserves other line properties when changing Line B lineType', function () {
364
+ var _renderComponent17 = renderComponent({
365
+ gssLineData: {
366
+ selectedTool: 'lineB',
367
+ numberOfLines: 2,
368
+ lineA: {
369
+ lineType: 'Dashed'
370
+ },
371
+ lineB: {
372
+ lineType: 'Solid'
373
+ }
374
+ }
375
+ }),
376
+ getAllByText = _renderComponent17.getAllByText;
377
+ var dashedButtons = getAllByText(/Dashed/);
378
+ _testUtils.fireEvent.click(dashedButtons[1]);
379
+ var _onChange$mock$calls$0 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 1),
380
+ updatedData = _onChange$mock$calls$0[0];
381
+ expect(updatedData.lineA.lineType).toBe('Dashed');
382
+ expect(updatedData.lineB.lineType).toBe('Dashed');
383
+ expect(updatedData.selectedTool).toBe('lineB');
384
+ expect(updatedData.numberOfLines).toBe(2);
385
+ });
386
+ it('handles multiple line type changes correctly', function () {
387
+ var _renderComponent18 = renderComponent({
388
+ gssLineData: {
389
+ selectedTool: 'lineA',
390
+ numberOfLines: 2,
391
+ lineA: {
392
+ lineType: 'Solid'
393
+ },
394
+ lineB: {
395
+ lineType: 'Solid'
396
+ }
397
+ }
398
+ }),
399
+ getAllByText = _renderComponent18.getAllByText;
400
+
401
+ // Change Line A to Dashed
402
+ var dashedButtons = getAllByText(/Dashed/);
403
+ _testUtils.fireEvent.click(dashedButtons[0]);
404
+ expect(onChange).toHaveBeenCalledTimes(1);
405
+ var _onChange$mock$calls$1 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 1),
406
+ updatedData = _onChange$mock$calls$1[0];
407
+ expect(updatedData.lineA.lineType).toBe('Dashed');
408
+
409
+ // Change Line B to Dashed
410
+ dashedButtons = getAllByText(/Dashed/);
411
+ _testUtils.fireEvent.click(dashedButtons[1]);
412
+ expect(onChange).toHaveBeenCalledTimes(2);
413
+ var _onChange$mock$calls$10 = (0, _slicedToArray2["default"])(onChange.mock.calls[1], 1);
414
+ updatedData = _onChange$mock$calls$10[0];
415
+ expect(updatedData.lineB.lineType).toBe('Dashed');
416
+ });
417
+ it('does not call onChange when line type button is disabled', function () {
418
+ var _renderComponent19 = renderComponent({
419
+ disabled: true,
420
+ gssLineData: {
421
+ selectedTool: 'lineA',
422
+ numberOfLines: 2,
423
+ lineA: {
424
+ lineType: 'Solid'
425
+ },
426
+ lineB: {
427
+ lineType: 'Solid'
428
+ }
429
+ }
430
+ }),
431
+ getAllByRole = _renderComponent19.getAllByRole;
432
+ var buttons = getAllByRole('button');
433
+ buttons.forEach(function (button) {
434
+ expect(button).toBeDisabled();
435
+ });
436
+ });
437
+ it('maintains correct state when clicking same line type that is already selected', function () {
438
+ var _renderComponent20 = renderComponent({
439
+ gssLineData: {
440
+ selectedTool: 'lineA',
441
+ numberOfLines: 2,
442
+ lineA: {
443
+ lineType: 'Solid'
444
+ },
445
+ lineB: {
446
+ lineType: 'Solid'
447
+ }
448
+ }
449
+ }),
450
+ getAllByText = _renderComponent20.getAllByText;
451
+ var solidButtons = getAllByText(/Solid/);
452
+ _testUtils.fireEvent.click(solidButtons[0]); // Click Solid when already Solid
453
+
454
+ expect(onChange).toHaveBeenCalledTimes(1);
455
+ var _onChange$mock$calls$11 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 1),
456
+ updatedData = _onChange$mock$calls$11[0];
457
+ expect(updatedData.lineA.lineType).toBe('Solid');
458
+ });
459
+ });
460
+ describe('integration tests', function () {
461
+ it('allows switching selected tool and changing line type in sequence', function () {
462
+ var _renderComponent21 = renderComponent({
463
+ gssLineData: {
464
+ selectedTool: 'lineA',
465
+ numberOfLines: 2,
466
+ lineA: {
467
+ lineType: 'Solid'
468
+ },
469
+ lineB: {
470
+ lineType: 'Solid'
471
+ }
472
+ }
473
+ }),
474
+ getAllByRole = _renderComponent21.getAllByRole,
475
+ getAllByText = _renderComponent21.getAllByText;
476
+
477
+ // Switch to Line B
478
+ var radios = getAllByRole('radio');
479
+ var lineBRadio = radios.find(function (r) {
480
+ return r.value === 'lineB';
481
+ });
482
+ _testUtils.fireEvent.click(lineBRadio);
483
+ expect(onChange).toHaveBeenCalledTimes(1);
484
+ var _onChange$mock$calls$12 = (0, _slicedToArray2["default"])(onChange.mock.calls[0], 1),
485
+ updatedData = _onChange$mock$calls$12[0];
486
+ expect(updatedData.selectedTool).toBe('lineB');
487
+
488
+ // Change Line B to Dashed
489
+ var dashedButtons = getAllByText(/Dashed/);
490
+ _testUtils.fireEvent.click(dashedButtons[1]);
491
+ expect(onChange).toHaveBeenCalledTimes(2);
492
+ var _onChange$mock$calls$13 = (0, _slicedToArray2["default"])(onChange.mock.calls[1], 1);
493
+ updatedData = _onChange$mock$calls$13[0];
494
+ expect(updatedData.lineB.lineType).toBe('Dashed');
495
+ });
496
+ it('handles complete workflow of switching between all tools and changing line types', function () {
497
+ var _renderComponent22 = renderComponent({
498
+ gssLineData: {
499
+ selectedTool: 'lineA',
500
+ numberOfLines: 2,
501
+ lineA: {
502
+ lineType: 'Solid'
503
+ },
504
+ lineB: {
505
+ lineType: 'Solid'
506
+ }
507
+ }
508
+ }),
509
+ getAllByRole = _renderComponent22.getAllByRole,
510
+ getAllByText = _renderComponent22.getAllByText;
511
+
512
+ // Change Line A to Dashed
513
+ var dashedButtons = getAllByText(/Dashed/);
514
+ _testUtils.fireEvent.click(dashedButtons[0]);
515
+ expect(onChange.mock.calls[0][0].lineA.lineType).toBe('Dashed');
516
+
517
+ // Switch to Line B
518
+ var radios = getAllByRole('radio');
519
+ var lineBRadio = radios.find(function (r) {
520
+ return r.value === 'lineB';
521
+ });
522
+ _testUtils.fireEvent.click(lineBRadio);
523
+ expect(onChange.mock.calls[1][0].selectedTool).toBe('lineB');
524
+
525
+ // Change Line B to Dashed
526
+ dashedButtons = getAllByText(/Dashed/);
527
+ _testUtils.fireEvent.click(dashedButtons[1]);
528
+ expect(onChange.mock.calls[2][0].lineB.lineType).toBe('Dashed');
529
+
530
+ // Switch to Solution Set
531
+ var solutionSetRadio = radios.find(function (r) {
532
+ return r.value === 'solutionSet';
533
+ });
534
+ _testUtils.fireEvent.click(solutionSetRadio);
535
+ expect(onChange.mock.calls[3][0].selectedTool).toBe('solutionSet');
536
+ expect(onChange).toHaveBeenCalledTimes(4);
537
+ });
538
+ });
539
+ });
540
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdGVzdFV0aWxzIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfdG9vbE1lbnUiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImRlc2NyaWJlIiwib25DaGFuZ2UiLCJ0b29scyIsImJlZm9yZUVhY2giLCJqZXN0IiwiZm4iLCJyZW5kZXJDb21wb25lbnQiLCJleHRyYXMiLCJkZWZhdWx0cyIsImNsYXNzZXMiLCJjbGFzc05hbWUiLCJjdXJyZW50VG9vbCIsImdzc0xpbmVEYXRhIiwic2VsZWN0ZWRUb29sIiwibnVtYmVyT2ZMaW5lcyIsImxpbmVBIiwibGluZVR5cGUiLCJsaW5lQiIsInByb3BzIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsIml0IiwiX3JlbmRlckNvbXBvbmVudCIsImNvbnRhaW5lciIsImV4cGVjdCIsImZpcnN0Q2hpbGQiLCJ0b0JlSW5UaGVEb2N1bWVudCIsIl9yZW5kZXJDb21wb25lbnQyIiwiZ2V0QnlUZXh0IiwiX3JlbmRlckNvbXBvbmVudDMiLCJfcmVuZGVyQ29tcG9uZW50NCIsInF1ZXJ5QnlUZXh0Iiwibm90IiwiX3JlbmRlckNvbXBvbmVudDUiLCJfcmVuZGVyQ29tcG9uZW50NiIsImdldEFsbEJ5VGV4dCIsInNvbGlkQnV0dG9ucyIsImRhc2hlZEJ1dHRvbnMiLCJ0b0JlR3JlYXRlclRoYW4iLCJfcmVuZGVyQ29tcG9uZW50NyIsIl9yZW5kZXJDb21wb25lbnQ4IiwiZGlzYWJsZWQiLCJnZXRBbGxCeVJvbGUiLCJyYWRpb3MiLCJidXR0b25zIiwicmFkaW8iLCJ0b0JlRGlzYWJsZWQiLCJidXR0b24iLCJfcmVuZGVyQ29tcG9uZW50OSIsImxpbmVBUmFkaW8iLCJmaW5kIiwidmFsdWUiLCJmaXJlRXZlbnQiLCJjbGljayIsInRvSGF2ZUJlZW5DYWxsZWRUaW1lcyIsIl9vbkNoYW5nZSRtb2NrJGNhbGxzJCIsIl9zbGljZWRUb0FycmF5MiIsIm1vY2siLCJjYWxscyIsInVwZGF0ZWREYXRhIiwib2xkU2VsZWN0ZWRUb29sIiwidG9CZSIsIl9yZW5kZXJDb21wb25lbnQwIiwibGluZUJSYWRpbyIsIl9vbkNoYW5nZSRtb2NrJGNhbGxzJDIiLCJfcmVuZGVyQ29tcG9uZW50MSIsInNvbHV0aW9uU2V0UmFkaW8iLCJfb25DaGFuZ2UkbW9jayRjYWxscyQzIiwiX3JlbmRlckNvbXBvbmVudDEwIiwiX29uQ2hhbmdlJG1vY2skY2FsbHMkNCIsIl9yZW5kZXJDb21wb25lbnQxMSIsIl9yZW5kZXJDb21wb25lbnQxMiIsIl9vbkNoYW5nZSRtb2NrJGNhbGxzJDUiLCJfcmVuZGVyQ29tcG9uZW50MTMiLCJfb25DaGFuZ2UkbW9jayRjYWxscyQ2IiwiX3JlbmRlckNvbXBvbmVudDE0IiwiX29uQ2hhbmdlJG1vY2skY2FsbHMkNyIsIl9yZW5kZXJDb21wb25lbnQxNSIsIl9vbkNoYW5nZSRtb2NrJGNhbGxzJDgiLCJfcmVuZGVyQ29tcG9uZW50MTYiLCJfb25DaGFuZ2UkbW9jayRjYWxscyQ5IiwiX3JlbmRlckNvbXBvbmVudDE3IiwiX29uQ2hhbmdlJG1vY2skY2FsbHMkMCIsIl9yZW5kZXJDb21wb25lbnQxOCIsIl9vbkNoYW5nZSRtb2NrJGNhbGxzJDEiLCJfb25DaGFuZ2UkbW9jayRjYWxscyQxMCIsIl9yZW5kZXJDb21wb25lbnQxOSIsIl9yZW5kZXJDb21wb25lbnQyMCIsIl9vbkNoYW5nZSRtb2NrJGNhbGxzJDExIiwiX3JlbmRlckNvbXBvbmVudDIxIiwiX29uQ2hhbmdlJG1vY2skY2FsbHMkMTIiLCJfb25DaGFuZ2UkbW9jayRjYWxscyQxMyIsIl9yZW5kZXJDb21wb25lbnQyMiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vdG9vbC1tZW51LnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpcmVFdmVudCwgcmVuZGVyIH0gZnJvbSAnQHBpZS1saWIvdGVzdC11dGlscyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgVG9vbE1lbnUgZnJvbSAnLi4vdG9vbC1tZW51JztcblxuZGVzY3JpYmUoJ1Rvb2xNZW51JywgKCkgPT4ge1xuICBsZXQgb25DaGFuZ2U7XG4gIGNvbnN0IHRvb2xzID0gWydvbmUnLCAndHdvJ107XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gIH0pO1xuXG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChleHRyYXMpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgY2xhc3NOYW1lOiAnY2xhc3NOYW1lJyxcbiAgICAgIG9uQ2hhbmdlLFxuICAgICAgY3VycmVudFRvb2w6IHRvb2xzWzBdLFxuICAgICAgdG9vbHMsXG4gICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICBzZWxlY3RlZFRvb2w6ICdsaW5lQScsXG4gICAgICAgIG51bWJlck9mTGluZXM6IDIsXG4gICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgIGxpbmVCOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRzLCAuLi5leHRyYXMgfTtcbiAgICByZXR1cm4gcmVuZGVyKDxUb29sTWVudSB7Li4ucHJvcHN9IC8+KTtcbiAgfTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBMaW5lIEEgcmFkaW8gYnV0dG9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KGdldEJ5VGV4dCgnTGluZSBBJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBMaW5lIEIgcmFkaW8gYnV0dG9uIHdoZW4gbnVtYmVyT2ZMaW5lcyBpcyAyJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KGdldEJ5VGV4dCgnTGluZSBCJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgcmVuZGVyIExpbmUgQiByYWRpbyBidXR0b24gd2hlbiBudW1iZXJPZkxpbmVzIGlzIDEnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAxLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXh0KCdMaW5lIEInKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBTb2x1dGlvbiBTZXQgcmFkaW8gYnV0dG9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KGdldEJ5VGV4dCgnU29sdXRpb24gU2V0JykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBTb2xpZCBhbmQgRGFzaGVkIGJ1dHRvbnMgZm9yIExpbmUgQScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IHNvbGlkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvU29saWQvKTtcbiAgICAgIGNvbnN0IGRhc2hlZEJ1dHRvbnMgPSBnZXRBbGxCeVRleHQoL0Rhc2hlZC8pO1xuICAgICAgZXhwZWN0KHNvbGlkQnV0dG9ucy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICAgIGV4cGVjdChkYXNoZWRCdXR0b25zLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3dzIGNoZWNrbWFyayBvbiBzZWxlY3RlZCBsaW5lIHR5cGUgZm9yIExpbmUgQScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdEYXNoZWQnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNvbGlkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgv4pyUIFNvbGlkLyk7XG4gICAgICBleHBlY3Qoc29saWRCdXR0b25zLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Rpc2FibGVzIGFsbCBjb250cm9scyB3aGVuIGRpc2FibGVkIHByb3AgaXMgdHJ1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlSb2xlIH0gPSByZW5kZXJDb21wb25lbnQoeyBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IHJhZGlvcyA9IGdldEFsbEJ5Um9sZSgncmFkaW8nKTtcbiAgICAgIGNvbnN0IGJ1dHRvbnMgPSBnZXRBbGxCeVJvbGUoJ2J1dHRvbicpO1xuXG4gICAgICByYWRpb3MuZm9yRWFjaCgocmFkaW8pID0+IHtcbiAgICAgICAgZXhwZWN0KHJhZGlvKS50b0JlRGlzYWJsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBidXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgICBleHBlY3QoYnV0dG9uKS50b0JlRGlzYWJsZWQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnb25DaGFuZ2VSYWRpb1ZhbHVlJywgKCkgPT4ge1xuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aXRoIHVwZGF0ZWQgc2VsZWN0ZWRUb29sIHdoZW4gbGluZUEgcmFkaW8gaXMgY2xpY2tlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlSb2xlIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ3NvbHV0aW9uU2V0JyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByYWRpb3MgPSBnZXRBbGxCeVJvbGUoJ3JhZGlvJyk7XG4gICAgICBjb25zdCBsaW5lQVJhZGlvID0gcmFkaW9zLmZpbmQoKHIpID0+IHIudmFsdWUgPT09ICdsaW5lQScpO1xuXG4gICAgICBmaXJlRXZlbnQuY2xpY2sobGluZUFSYWRpbyk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgY29uc3QgW3VwZGF0ZWREYXRhLCBvbGRTZWxlY3RlZFRvb2xdID0gb25DaGFuZ2UubW9jay5jYWxsc1swXTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5zZWxlY3RlZFRvb2wpLnRvQmUoJ2xpbmVBJyk7XG4gICAgICBleHBlY3Qob2xkU2VsZWN0ZWRUb29sKS50b0JlKCdzb2x1dGlvblNldCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlIHdpdGggdXBkYXRlZCBzZWxlY3RlZFRvb2wgd2hlbiBsaW5lQiByYWRpbyBpcyBjbGlja2VkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeVJvbGUgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGdzc0xpbmVEYXRhOiB7XG4gICAgICAgICAgc2VsZWN0ZWRUb29sOiAnbGluZUEnLFxuICAgICAgICAgIG51bWJlck9mTGluZXM6IDIsXG4gICAgICAgICAgbGluZUE6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgICBsaW5lQjogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJhZGlvcyA9IGdldEFsbEJ5Um9sZSgncmFkaW8nKTtcbiAgICAgIGNvbnN0IGxpbmVCUmFkaW8gPSByYWRpb3MuZmluZCgocikgPT4gci52YWx1ZSA9PT0gJ2xpbmVCJyk7XG5cbiAgICAgIGZpcmVFdmVudC5jbGljayhsaW5lQlJhZGlvKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICBjb25zdCBbdXBkYXRlZERhdGEsIG9sZFNlbGVjdGVkVG9vbF0gPSBvbkNoYW5nZS5tb2NrLmNhbGxzWzBdO1xuICAgICAgZXhwZWN0KHVwZGF0ZWREYXRhLnNlbGVjdGVkVG9vbCkudG9CZSgnbGluZUInKTtcbiAgICAgIGV4cGVjdChvbGRTZWxlY3RlZFRvb2wpLnRvQmUoJ2xpbmVBJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2l0aCB1cGRhdGVkIHNlbGVjdGVkVG9vbCB3aGVuIHNvbHV0aW9uU2V0IHJhZGlvIGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5Um9sZSB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZ3NzTGluZURhdGE6IHtcbiAgICAgICAgICBzZWxlY3RlZFRvb2w6ICdsaW5lQScsXG4gICAgICAgICAgbnVtYmVyT2ZMaW5lczogMixcbiAgICAgICAgICBsaW5lQTogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICAgIGxpbmVCOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmFkaW9zID0gZ2V0QWxsQnlSb2xlKCdyYWRpbycpO1xuICAgICAgY29uc3Qgc29sdXRpb25TZXRSYWRpbyA9IHJhZGlvcy5maW5kKChyKSA9PiByLnZhbHVlID09PSAnc29sdXRpb25TZXQnKTtcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKHNvbHV0aW9uU2V0UmFkaW8pO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgIGNvbnN0IFt1cGRhdGVkRGF0YSwgb2xkU2VsZWN0ZWRUb29sXSA9IG9uQ2hhbmdlLm1vY2suY2FsbHNbMF07XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEuc2VsZWN0ZWRUb29sKS50b0JlKCdzb2x1dGlvblNldCcpO1xuICAgICAgZXhwZWN0KG9sZFNlbGVjdGVkVG9vbCkudG9CZSgnbGluZUEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdwcmVzZXJ2ZXMgb3RoZXIgZ3NzTGluZURhdGEgcHJvcGVydGllcyB3aGVuIGNoYW5naW5nIHNlbGVjdGVkVG9vbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlSb2xlIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnRGFzaGVkJyB9LFxuICAgICAgICAgIGxpbmVCOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmFkaW9zID0gZ2V0QWxsQnlSb2xlKCdyYWRpbycpO1xuICAgICAgY29uc3QgbGluZUJSYWRpbyA9IHJhZGlvcy5maW5kKChyKSA9PiByLnZhbHVlID09PSAnbGluZUInKTtcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGxpbmVCUmFkaW8pO1xuXG4gICAgICBjb25zdCBbdXBkYXRlZERhdGFdID0gb25DaGFuZ2UubW9jay5jYWxsc1swXTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5saW5lQS5saW5lVHlwZSkudG9CZSgnRGFzaGVkJyk7XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEubGluZUIubGluZVR5cGUpLnRvQmUoJ1NvbGlkJyk7XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEubnVtYmVyT2ZMaW5lcykudG9CZSgyKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCBjYWxsIG9uQ2hhbmdlIHdoZW4gZGlzYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5Um9sZSB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICAgIGdzc0xpbmVEYXRhOiB7XG4gICAgICAgICAgc2VsZWN0ZWRUb29sOiAnbGluZUEnLFxuICAgICAgICAgIG51bWJlck9mTGluZXM6IDIsXG4gICAgICAgICAgbGluZUE6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgICBsaW5lQjogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJhZGlvcyA9IGdldEFsbEJ5Um9sZSgncmFkaW8nKTtcbiAgICAgIGNvbnN0IGxpbmVCUmFkaW8gPSByYWRpb3MuZmluZCgocikgPT4gci52YWx1ZSA9PT0gJ2xpbmVCJyk7XG5cbiAgICAgIC8vIERpc2FibGVkIHJhZGlvcyBzaG91bGQgbm90IGZpcmUgY2hhbmdlIGV2ZW50c1xuICAgICAgZXhwZWN0KGxpbmVCUmFkaW8pLnRvQmVEaXNhYmxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbGluZVR5cGVDaGFuZ2UnLCAoKSA9PiB7XG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlIHdpdGggdXBkYXRlZCBsaW5lVHlwZSBmb3IgTGluZSBBIHdoZW4gU29saWQgYnV0dG9uIGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGV4dCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZ3NzTGluZURhdGE6IHtcbiAgICAgICAgICBzZWxlY3RlZFRvb2w6ICdsaW5lQScsXG4gICAgICAgICAgbnVtYmVyT2ZMaW5lczogMixcbiAgICAgICAgICBsaW5lQTogeyBsaW5lVHlwZTogJ0Rhc2hlZCcgfSxcbiAgICAgICAgICBsaW5lQjogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNvbGlkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvU29saWQvKTtcbiAgICAgIC8vIEZpcnN0IHNvbGlkIGJ1dHRvbiBzaG91bGQgYmUgZm9yIExpbmUgQVxuICAgICAgZmlyZUV2ZW50LmNsaWNrKHNvbGlkQnV0dG9uc1swXSk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgY29uc3QgW3VwZGF0ZWREYXRhLCBvbGRTZWxlY3RlZFRvb2xdID0gb25DaGFuZ2UubW9jay5jYWxsc1swXTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5saW5lQS5saW5lVHlwZSkudG9CZSgnU29saWQnKTtcbiAgICAgIGV4cGVjdChvbGRTZWxlY3RlZFRvb2wpLnRvQmUoJ2xpbmVBJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2l0aCB1cGRhdGVkIGxpbmVUeXBlIGZvciBMaW5lIEEgd2hlbiBEYXNoZWQgYnV0dG9uIGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGV4dCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZ3NzTGluZURhdGE6IHtcbiAgICAgICAgICBzZWxlY3RlZFRvb2w6ICdsaW5lQScsXG4gICAgICAgICAgbnVtYmVyT2ZMaW5lczogMixcbiAgICAgICAgICBsaW5lQTogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICAgIGxpbmVCOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGFzaGVkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvRGFzaGVkLyk7XG4gICAgICAvLyBGaXJzdCBkYXNoZWQgYnV0dG9uIHNob3VsZCBiZSBmb3IgTGluZSBBXG4gICAgICBmaXJlRXZlbnQuY2xpY2soZGFzaGVkQnV0dG9uc1swXSk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgY29uc3QgW3VwZGF0ZWREYXRhLCBvbGRTZWxlY3RlZFRvb2xdID0gb25DaGFuZ2UubW9jay5jYWxsc1swXTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5saW5lQS5saW5lVHlwZSkudG9CZSgnRGFzaGVkJyk7XG4gICAgICBleHBlY3Qob2xkU2VsZWN0ZWRUb29sKS50b0JlKCdsaW5lQScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlIHdpdGggdXBkYXRlZCBsaW5lVHlwZSBmb3IgTGluZSBCIHdoZW4gU29saWQgYnV0dG9uIGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGV4dCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZ3NzTGluZURhdGE6IHtcbiAgICAgICAgICBzZWxlY3RlZFRvb2w6ICdsaW5lQicsXG4gICAgICAgICAgbnVtYmVyT2ZMaW5lczogMixcbiAgICAgICAgICBsaW5lQTogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICAgIGxpbmVCOiB7IGxpbmVUeXBlOiAnRGFzaGVkJyB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNvbGlkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvU29saWQvKTtcbiAgICAgIC8vIFNlY29uZCBzb2xpZCBidXR0b24gc2hvdWxkIGJlIGZvciBMaW5lIEJcbiAgICAgIGZpcmVFdmVudC5jbGljayhzb2xpZEJ1dHRvbnNbMV0pO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgIGNvbnN0IFt1cGRhdGVkRGF0YSwgb2xkU2VsZWN0ZWRUb29sXSA9IG9uQ2hhbmdlLm1vY2suY2FsbHNbMF07XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEubGluZUIubGluZVR5cGUpLnRvQmUoJ1NvbGlkJyk7XG4gICAgICBleHBlY3Qob2xkU2VsZWN0ZWRUb29sKS50b0JlKCdsaW5lQicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlIHdpdGggdXBkYXRlZCBsaW5lVHlwZSBmb3IgTGluZSBCIHdoZW4gRGFzaGVkIGJ1dHRvbiBpcyBjbGlja2VkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeVRleHQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGdzc0xpbmVEYXRhOiB7XG4gICAgICAgICAgc2VsZWN0ZWRUb29sOiAnbGluZUInLFxuICAgICAgICAgIG51bWJlck9mTGluZXM6IDIsXG4gICAgICAgICAgbGluZUE6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgICBsaW5lQjogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRhc2hlZEJ1dHRvbnMgPSBnZXRBbGxCeVRleHQoL0Rhc2hlZC8pO1xuICAgICAgLy8gU2Vjb25kIGRhc2hlZCBidXR0b24gc2hvdWxkIGJlIGZvciBMaW5lIEJcbiAgICAgIGZpcmVFdmVudC5jbGljayhkYXNoZWRCdXR0b25zWzFdKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICBjb25zdCBbdXBkYXRlZERhdGEsIG9sZFNlbGVjdGVkVG9vbF0gPSBvbkNoYW5nZS5tb2NrLmNhbGxzWzBdO1xuICAgICAgZXhwZWN0KHVwZGF0ZWREYXRhLmxpbmVCLmxpbmVUeXBlKS50b0JlKCdEYXNoZWQnKTtcbiAgICAgIGV4cGVjdChvbGRTZWxlY3RlZFRvb2wpLnRvQmUoJ2xpbmVCJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncHJlc2VydmVzIG90aGVyIGxpbmUgcHJvcGVydGllcyB3aGVuIGNoYW5naW5nIExpbmUgQSBsaW5lVHlwZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdEYXNoZWQnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGFzaGVkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvRGFzaGVkLyk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soZGFzaGVkQnV0dG9uc1swXSk7XG5cbiAgICAgIGNvbnN0IFt1cGRhdGVkRGF0YV0gPSBvbkNoYW5nZS5tb2NrLmNhbGxzWzBdO1xuICAgICAgZXhwZWN0KHVwZGF0ZWREYXRhLmxpbmVBLmxpbmVUeXBlKS50b0JlKCdEYXNoZWQnKTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5saW5lQi5saW5lVHlwZSkudG9CZSgnRGFzaGVkJyk7XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEuc2VsZWN0ZWRUb29sKS50b0JlKCdsaW5lQScpO1xuICAgICAgZXhwZWN0KHVwZGF0ZWREYXRhLm51bWJlck9mTGluZXMpLnRvQmUoMik7XG4gICAgfSk7XG5cbiAgICBpdCgncHJlc2VydmVzIG90aGVyIGxpbmUgcHJvcGVydGllcyB3aGVuIGNoYW5naW5nIExpbmUgQiBsaW5lVHlwZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVCJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnRGFzaGVkJyB9LFxuICAgICAgICAgIGxpbmVCOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGFzaGVkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvRGFzaGVkLyk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soZGFzaGVkQnV0dG9uc1sxXSk7XG5cbiAgICAgIGNvbnN0IFt1cGRhdGVkRGF0YV0gPSBvbkNoYW5nZS5tb2NrLmNhbGxzWzBdO1xuICAgICAgZXhwZWN0KHVwZGF0ZWREYXRhLmxpbmVBLmxpbmVUeXBlKS50b0JlKCdEYXNoZWQnKTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5saW5lQi5saW5lVHlwZSkudG9CZSgnRGFzaGVkJyk7XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEuc2VsZWN0ZWRUb29sKS50b0JlKCdsaW5lQicpO1xuICAgICAgZXhwZWN0KHVwZGF0ZWREYXRhLm51bWJlck9mTGluZXMpLnRvQmUoMik7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBtdWx0aXBsZSBsaW5lIHR5cGUgY2hhbmdlcyBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGV4dCB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZ3NzTGluZURhdGE6IHtcbiAgICAgICAgICBzZWxlY3RlZFRvb2w6ICdsaW5lQScsXG4gICAgICAgICAgbnVtYmVyT2ZMaW5lczogMixcbiAgICAgICAgICBsaW5lQTogeyBsaW5lVHlwZTogJ1NvbGlkJyB9LFxuICAgICAgICAgIGxpbmVCOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gQ2hhbmdlIExpbmUgQSB0byBEYXNoZWRcbiAgICAgIGxldCBkYXNoZWRCdXR0b25zID0gZ2V0QWxsQnlUZXh0KC9EYXNoZWQvKTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhkYXNoZWRCdXR0b25zWzBdKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgICBsZXQgW3VwZGF0ZWREYXRhXSA9IG9uQ2hhbmdlLm1vY2suY2FsbHNbMF07XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEubGluZUEubGluZVR5cGUpLnRvQmUoJ0Rhc2hlZCcpO1xuXG4gICAgICAvLyBDaGFuZ2UgTGluZSBCIHRvIERhc2hlZFxuICAgICAgZGFzaGVkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvRGFzaGVkLyk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soZGFzaGVkQnV0dG9uc1sxXSk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICAgICAgW3VwZGF0ZWREYXRhXSA9IG9uQ2hhbmdlLm1vY2suY2FsbHNbMV07XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEubGluZUIubGluZVR5cGUpLnRvQmUoJ0Rhc2hlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGNhbGwgb25DaGFuZ2Ugd2hlbiBsaW5lIHR5cGUgYnV0dG9uIGlzIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeVJvbGUgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBidXR0b25zID0gZ2V0QWxsQnlSb2xlKCdidXR0b24nKTtcblxuICAgICAgYnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHtcbiAgICAgICAgZXhwZWN0KGJ1dHRvbikudG9CZURpc2FibGVkKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdtYWludGFpbnMgY29ycmVjdCBzdGF0ZSB3aGVuIGNsaWNraW5nIHNhbWUgbGluZSB0eXBlIHRoYXQgaXMgYWxyZWFkeSBzZWxlY3RlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzb2xpZEJ1dHRvbnMgPSBnZXRBbGxCeVRleHQoL1NvbGlkLyk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soc29saWRCdXR0b25zWzBdKTsgLy8gQ2xpY2sgU29saWQgd2hlbiBhbHJlYWR5IFNvbGlkXG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgY29uc3QgW3VwZGF0ZWREYXRhXSA9IG9uQ2hhbmdlLm1vY2suY2FsbHNbMF07XG4gICAgICBleHBlY3QodXBkYXRlZERhdGEubGluZUEubGluZVR5cGUpLnRvQmUoJ1NvbGlkJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbnRlZ3JhdGlvbiB0ZXN0cycsICgpID0+IHtcbiAgICBpdCgnYWxsb3dzIHN3aXRjaGluZyBzZWxlY3RlZCB0b29sIGFuZCBjaGFuZ2luZyBsaW5lIHR5cGUgaW4gc2VxdWVuY2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5Um9sZSwgZ2V0QWxsQnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTd2l0Y2ggdG8gTGluZSBCXG4gICAgICBjb25zdCByYWRpb3MgPSBnZXRBbGxCeVJvbGUoJ3JhZGlvJyk7XG4gICAgICBjb25zdCBsaW5lQlJhZGlvID0gcmFkaW9zLmZpbmQoKHIpID0+IHIudmFsdWUgPT09ICdsaW5lQicpO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGxpbmVCUmFkaW8pO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgIGxldCBbdXBkYXRlZERhdGFdID0gb25DaGFuZ2UubW9jay5jYWxsc1swXTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5zZWxlY3RlZFRvb2wpLnRvQmUoJ2xpbmVCJyk7XG5cbiAgICAgIC8vIENoYW5nZSBMaW5lIEIgdG8gRGFzaGVkXG4gICAgICBjb25zdCBkYXNoZWRCdXR0b25zID0gZ2V0QWxsQnlUZXh0KC9EYXNoZWQvKTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhkYXNoZWRCdXR0b25zWzFdKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG4gICAgICBbdXBkYXRlZERhdGFdID0gb25DaGFuZ2UubW9jay5jYWxsc1sxXTtcbiAgICAgIGV4cGVjdCh1cGRhdGVkRGF0YS5saW5lQi5saW5lVHlwZSkudG9CZSgnRGFzaGVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBjb21wbGV0ZSB3b3JrZmxvdyBvZiBzd2l0Y2hpbmcgYmV0d2VlbiBhbGwgdG9vbHMgYW5kIGNoYW5naW5nIGxpbmUgdHlwZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5Um9sZSwgZ2V0QWxsQnlUZXh0IH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBnc3NMaW5lRGF0YToge1xuICAgICAgICAgIHNlbGVjdGVkVG9vbDogJ2xpbmVBJyxcbiAgICAgICAgICBudW1iZXJPZkxpbmVzOiAyLFxuICAgICAgICAgIGxpbmVBOiB7IGxpbmVUeXBlOiAnU29saWQnIH0sXG4gICAgICAgICAgbGluZUI6IHsgbGluZVR5cGU6ICdTb2xpZCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDaGFuZ2UgTGluZSBBIHRvIERhc2hlZFxuICAgICAgbGV0IGRhc2hlZEJ1dHRvbnMgPSBnZXRBbGxCeVRleHQoL0Rhc2hlZC8pO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGRhc2hlZEJ1dHRvbnNbMF0pO1xuICAgICAgZXhwZWN0KG9uQ2hhbmdlLm1vY2suY2FsbHNbMF1bMF0ubGluZUEubGluZVR5cGUpLnRvQmUoJ0Rhc2hlZCcpO1xuXG4gICAgICAvLyBTd2l0Y2ggdG8gTGluZSBCXG4gICAgICBjb25zdCByYWRpb3MgPSBnZXRBbGxCeVJvbGUoJ3JhZGlvJyk7XG4gICAgICBjb25zdCBsaW5lQlJhZGlvID0gcmFkaW9zLmZpbmQoKHIpID0+IHIudmFsdWUgPT09ICdsaW5lQicpO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGxpbmVCUmFkaW8pO1xuICAgICAgZXhwZWN0KG9uQ2hhbmdlLm1vY2suY2FsbHNbMV1bMF0uc2VsZWN0ZWRUb29sKS50b0JlKCdsaW5lQicpO1xuXG4gICAgICAvLyBDaGFuZ2UgTGluZSBCIHRvIERhc2hlZFxuICAgICAgZGFzaGVkQnV0dG9ucyA9IGdldEFsbEJ5VGV4dCgvRGFzaGVkLyk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soZGFzaGVkQnV0dG9uc1sxXSk7XG4gICAgICBleHBlY3Qob25DaGFuZ2UubW9jay5jYWxsc1syXVswXS5saW5lQi5saW5lVHlwZSkudG9CZSgnRGFzaGVkJyk7XG5cbiAgICAgIC8vIFN3aXRjaCB0byBTb2x1dGlvbiBTZXRcbiAgICAgIGNvbnN0IHNvbHV0aW9uU2V0UmFkaW8gPSByYWRpb3MuZmluZCgocikgPT4gci52YWx1ZSA9PT0gJ3NvbHV0aW9uU2V0Jyk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soc29sdXRpb25TZXRSYWRpbyk7XG4gICAgICBleHBlY3Qob25DaGFuZ2UubW9jay5jYWxsc1szXVswXS5zZWxlY3RlZFRvb2wpLnRvQmUoJ3NvbHV0aW9uU2V0Jyk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5n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