@pie-lib/charting 6.2.0-next.0 → 6.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 (59) hide show
  1. package/lib/__tests__/actions-button.test.js +332 -0
  2. package/lib/__tests__/axes.test.js +746 -0
  3. package/lib/__tests__/chart-setup.test.js +796 -0
  4. package/lib/__tests__/chart-type.test.js +25 -0
  5. package/lib/__tests__/chart.test.js +103 -0
  6. package/lib/__tests__/grid.test.js +39 -0
  7. package/lib/__tests__/key-legend.test.js +235 -0
  8. package/lib/__tests__/mark-label.test.js +46 -0
  9. package/lib/__tests__/tool-menu.test.js +627 -0
  10. package/lib/__tests__/utils.js +56 -0
  11. package/lib/__tests__/utils.test.js +186 -0
  12. package/lib/actions-button.js +1 -1
  13. package/lib/axes.js +1 -1
  14. package/lib/bars/__tests__/bar.test.js +53 -0
  15. package/lib/bars/__tests__/histogram.test.js +53 -0
  16. package/lib/bars/__tests__/utils.js +50 -0
  17. package/lib/bars/bar.js +1 -1
  18. package/lib/bars/common/__tests__/bars.test.js +76 -0
  19. package/lib/bars/common/__tests__/utils.js +50 -0
  20. package/lib/bars/common/bars.js +1 -1
  21. package/lib/bars/common/correct-check-icon.js +1 -1
  22. package/lib/bars/histogram.js +1 -1
  23. package/lib/chart-setup.js +1 -1
  24. package/lib/chart-type.js +1 -1
  25. package/lib/chart-types.js +1 -1
  26. package/lib/chart.js +1 -1
  27. package/lib/common/__tests__/correctness-indicators.test.js +887 -0
  28. package/lib/common/__tests__/drag-handle.test.js +73 -0
  29. package/lib/common/__tests__/utils.js +50 -0
  30. package/lib/common/correctness-indicators.js +1 -1
  31. package/lib/common/drag-handle.js +1 -1
  32. package/lib/common/drag-icon.js +1 -1
  33. package/lib/common/styles.js +1 -1
  34. package/lib/grid.js +1 -1
  35. package/lib/index.js +1 -1
  36. package/lib/key-legend.js +1 -1
  37. package/lib/line/__tests__/line-cross.test.js +617 -0
  38. package/lib/line/__tests__/line-dot.test.js +47 -0
  39. package/lib/line/__tests__/utils.js +56 -0
  40. package/lib/line/common/__tests__/drag-handle.test.js +73 -0
  41. package/lib/line/common/__tests__/line.test.js +92 -0
  42. package/lib/line/common/__tests__/utils.js +50 -0
  43. package/lib/line/common/drag-handle.js +1 -1
  44. package/lib/line/common/line.js +1 -1
  45. package/lib/line/line-cross.js +1 -1
  46. package/lib/line/line-dot.js +1 -1
  47. package/lib/mark-label.js +1 -1
  48. package/lib/plot/__tests__/dot.test.js +513 -0
  49. package/lib/plot/__tests__/line.test.js +566 -0
  50. package/lib/plot/__tests__/utils.js +50 -0
  51. package/lib/plot/common/__tests__/plot.test.js +79 -0
  52. package/lib/plot/common/__tests__/utils.js +50 -0
  53. package/lib/plot/common/plot.js +1 -1
  54. package/lib/plot/dot.js +1 -1
  55. package/lib/plot/line.js +1 -1
  56. package/lib/tool-menu.js +1 -1
  57. package/lib/utils.js +1 -1
  58. package/package.json +8 -11
  59. package/LICENSE.md +0 -5
@@ -0,0 +1,746 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
6
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
7
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _testUtils = require("@pie-lib/test-utils");
10
+ var _styles = require("@mui/material/styles");
11
+ var _axes = _interopRequireWildcard(require("../axes"));
12
+ var _utils = require("./utils");
13
+ var _excluded = ["children"],
14
+ _excluded2 = ["children", "tickValues"];
15
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
16
+ 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; }
17
+ 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; }
18
+ jest.mock('@visx/axis', function () {
19
+ return {
20
+ AxisLeft: function AxisLeft(_ref) {
21
+ var children = _ref.children,
22
+ props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
23
+ return /*#__PURE__*/_react["default"].createElement("g", (0, _extends2["default"])({
24
+ "data-testid": "axis-left"
25
+ }, props), typeof children === 'function' ? children({
26
+ formattedValue: '5'
27
+ }) : children);
28
+ },
29
+ AxisBottom: function AxisBottom(_ref2) {
30
+ var children = _ref2.children,
31
+ tickValues = _ref2.tickValues,
32
+ props = (0, _objectWithoutProperties2["default"])(_ref2, _excluded2);
33
+ return /*#__PURE__*/_react["default"].createElement("g", (0, _extends2["default"])({
34
+ "data-testid": "axis-bottom"
35
+ }, props), typeof children === 'function' ? (tickValues || ['0-A', '1-B', '2-C']).map(function (v, i) {
36
+ return children({
37
+ formattedValue: v,
38
+ index: i
39
+ });
40
+ }) : children);
41
+ }
42
+ };
43
+ });
44
+ jest.mock('../mark-label', function () {
45
+ return function MarkLabel(_ref3) {
46
+ var mark = _ref3.mark,
47
+ disabled = _ref3.disabled,
48
+ _onChange = _ref3.onChange,
49
+ error = _ref3.error,
50
+ autoFocus = _ref3.autoFocus,
51
+ inputRef = _ref3.inputRef,
52
+ correctnessIndicator = _ref3.correctnessIndicator;
53
+ return /*#__PURE__*/_react["default"].createElement("div", {
54
+ "data-testid": "mark-label"
55
+ }, /*#__PURE__*/_react["default"].createElement("input", {
56
+ "data-testid": "mark-label-input",
57
+ ref: inputRef,
58
+ value: (mark === null || mark === void 0 ? void 0 : mark.label) || '',
59
+ disabled: disabled,
60
+ onChange: function onChange(e) {
61
+ return _onChange && _onChange(e.target.value);
62
+ },
63
+ autoFocus: autoFocus
64
+ }), error && /*#__PURE__*/_react["default"].createElement("span", {
65
+ "data-testid": "mark-label-error"
66
+ }, error), correctnessIndicator);
67
+ };
68
+ });
69
+ jest.mock('@pie-lib/config-ui', function () {
70
+ return {
71
+ AlertDialog: function AlertDialog(_ref4) {
72
+ var open = _ref4.open,
73
+ title = _ref4.title,
74
+ text = _ref4.text,
75
+ onClose = _ref4.onClose,
76
+ onConfirm = _ref4.onConfirm;
77
+ return open ? /*#__PURE__*/_react["default"].createElement("div", {
78
+ "data-testid": "alert-dialog"
79
+ }, /*#__PURE__*/_react["default"].createElement("h2", null, title), /*#__PURE__*/_react["default"].createElement("p", null, text), /*#__PURE__*/_react["default"].createElement("button", {
80
+ "data-testid": "alert-cancel",
81
+ onClick: onClose
82
+ }, "Cancel"), /*#__PURE__*/_react["default"].createElement("button", {
83
+ "data-testid": "alert-confirm",
84
+ onClick: onConfirm
85
+ }, "Confirm")) : null;
86
+ }
87
+ };
88
+ });
89
+ jest.mock('../common/correctness-indicators', function () {
90
+ return {
91
+ TickCorrectnessIndicator: function TickCorrectnessIndicator(_ref5) {
92
+ var correctness = _ref5.correctness,
93
+ interactive = _ref5.interactive;
94
+ return correctness && interactive ? /*#__PURE__*/_react["default"].createElement("div", {
95
+ "data-testid": "tick-correctness-indicator"
96
+ }, correctness.value === 'correct' ? '✓' : '✗') : null;
97
+ }
98
+ };
99
+ });
100
+ jest.mock('@pie-lib/math-rendering', function () {
101
+ return {
102
+ renderMath: jest.fn(function (text) {
103
+ return text;
104
+ })
105
+ };
106
+ });
107
+ var theme = (0, _styles.createTheme)();
108
+ describe('ChartAxes', function () {
109
+ var renderComponent = function renderComponent(extras) {
110
+ var defaults = {
111
+ classes: {},
112
+ className: 'className',
113
+ graphProps: (0, _utils.graphProps)(),
114
+ xBand: (0, _utils.createBandScale)(['a', 'b', 'c'], [0, 400]),
115
+ categories: []
116
+ };
117
+ var props = _objectSpread(_objectSpread({}, defaults), extras);
118
+ return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
119
+ theme: theme
120
+ }, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_axes["default"], props))));
121
+ };
122
+ describe('rendering', function () {
123
+ it('renders axes container', function () {
124
+ var _renderComponent = renderComponent(),
125
+ container = _renderComponent.container;
126
+ expect(container.firstChild).toBeInTheDocument();
127
+ });
128
+ it('renders SVG with axes group', function () {
129
+ var _renderComponent2 = renderComponent(),
130
+ container = _renderComponent2.container;
131
+ var svg = container.querySelector('svg');
132
+ expect(svg).toBeInTheDocument();
133
+ var axesGroup = container.querySelector('g');
134
+ expect(axesGroup).toBeInTheDocument();
135
+ });
136
+ it('renders axes elements', function () {
137
+ var _renderComponent3 = renderComponent(),
138
+ container = _renderComponent3.container;
139
+ var groups = container.querySelectorAll('g');
140
+ expect(groups.length).toBeGreaterThan(0);
141
+ });
142
+ });
143
+ describe('edge cases', function () {
144
+ it('handles missing xBand', function () {
145
+ var _renderComponent4 = renderComponent({
146
+ xBand: undefined
147
+ }),
148
+ container = _renderComponent4.container;
149
+ expect(container).toBeInTheDocument();
150
+ });
151
+ it('handles empty categories', function () {
152
+ var _renderComponent5 = renderComponent({
153
+ categories: []
154
+ }),
155
+ container = _renderComponent5.container;
156
+ expect(container).toBeInTheDocument();
157
+ });
158
+ it('handles null categories', function () {
159
+ var _renderComponent6 = renderComponent({
160
+ categories: null
161
+ }),
162
+ container = _renderComponent6.container;
163
+ expect(container).toBeInTheDocument();
164
+ });
165
+ });
166
+ });
167
+ describe('RawChartAxes', function () {
168
+ var renderComponent = function renderComponent(extras) {
169
+ var defaults = {
170
+ classes: {},
171
+ className: 'className',
172
+ graphProps: (0, _utils.graphProps)(),
173
+ xBand: (0, _utils.createBandScale)(['a', 'b', 'c'], [0, 400]),
174
+ categories: []
175
+ };
176
+ var props = _objectSpread(_objectSpread({}, defaults), extras);
177
+ return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
178
+ theme: theme
179
+ }, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_axes.RawChartAxes, props))));
180
+ };
181
+ describe('rendering', function () {
182
+ it('renders raw axes container', function () {
183
+ var _renderComponent7 = renderComponent(),
184
+ container = _renderComponent7.container;
185
+ expect(container.firstChild).toBeInTheDocument();
186
+ });
187
+ it('renders SVG with axes group', function () {
188
+ var _renderComponent8 = renderComponent(),
189
+ container = _renderComponent8.container;
190
+ var svg = container.querySelector('svg');
191
+ expect(svg).toBeInTheDocument();
192
+ var axesGroup = container.querySelector('g');
193
+ expect(axesGroup).toBeInTheDocument();
194
+ });
195
+ it('renders both axes when leftAxis is true', function () {
196
+ var _renderComponent9 = renderComponent({
197
+ leftAxis: true
198
+ }),
199
+ getByTestId = _renderComponent9.getByTestId;
200
+ expect(getByTestId('axis-left')).toBeInTheDocument();
201
+ expect(getByTestId('axis-bottom')).toBeInTheDocument();
202
+ });
203
+ it('renders only bottom axis when leftAxis is false', function () {
204
+ var _renderComponent0 = renderComponent({
205
+ leftAxis: false
206
+ }),
207
+ queryByTestId = _renderComponent0.queryByTestId,
208
+ getByTestId = _renderComponent0.getByTestId;
209
+ expect(queryByTestId('axis-left')).not.toBeInTheDocument();
210
+ expect(getByTestId('axis-bottom')).toBeInTheDocument();
211
+ });
212
+ });
213
+ });
214
+ describe('TickComponent', function () {
215
+ var defaultCategories = [{
216
+ value: 1,
217
+ label: 'Category A',
218
+ editable: true,
219
+ interactive: true
220
+ }, {
221
+ value: 2,
222
+ label: 'Category B',
223
+ editable: true,
224
+ interactive: true
225
+ }];
226
+ var renderComponent = function renderComponent(extras) {
227
+ var defaults = {
228
+ graphProps: (0, _utils.graphProps)(),
229
+ xBand: (0, _utils.createBandScale)(['a', 'b', 'c'], [0, 400]),
230
+ categories: defaultCategories,
231
+ formattedValue: '0-Category A',
232
+ bandWidth: 100,
233
+ barWidth: 100,
234
+ x: 50,
235
+ y: 50,
236
+ top: 0,
237
+ onChangeCategory: jest.fn()
238
+ };
239
+ var props = _objectSpread(_objectSpread({}, defaults), extras);
240
+ return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
241
+ theme: theme
242
+ }, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_axes.TickComponent, props))));
243
+ };
244
+ describe('rendering', function () {
245
+ it('renders tick component', function () {
246
+ var _renderComponent1 = renderComponent(),
247
+ container = _renderComponent1.container;
248
+ var svg = container.querySelector('svg');
249
+ expect(svg).toBeInTheDocument();
250
+ expect(container.querySelector('g')).toBeInTheDocument();
251
+ });
252
+ it('renders with categories', function () {
253
+ var _renderComponent10 = renderComponent({
254
+ formattedValue: '0-test',
255
+ categories: [{
256
+ value: 1,
257
+ label: 'test',
258
+ editable: false,
259
+ interactive: false
260
+ }]
261
+ }),
262
+ container = _renderComponent10.container;
263
+ var svg = container.querySelector('svg');
264
+ expect(svg).toBeInTheDocument();
265
+ expect(container.querySelector('g')).toBeInTheDocument();
266
+ });
267
+ it('renders MarkLabel component', function () {
268
+ var _renderComponent11 = renderComponent(),
269
+ getAllByTestId = _renderComponent11.getAllByTestId;
270
+ var markLabels = getAllByTestId('mark-label');
271
+ expect(markLabels.length).toBeGreaterThan(0);
272
+ });
273
+ it('renders foreignObject for labels', function () {
274
+ var _renderComponent12 = renderComponent(),
275
+ container = _renderComponent12.container;
276
+ var foreignObject = container.querySelector('foreignObject');
277
+ expect(foreignObject).toBeInTheDocument();
278
+ });
279
+ it('does not render when formattedValue is null', function () {
280
+ var _renderComponent13 = renderComponent({
281
+ formattedValue: null
282
+ }),
283
+ container = _renderComponent13.container;
284
+ var foreignObject = container.querySelector('foreignObject');
285
+ expect(foreignObject).not.toBeInTheDocument();
286
+ });
287
+ it('does not render when formattedValue is undefined', function () {
288
+ var _renderComponent14 = renderComponent({
289
+ formattedValue: undefined
290
+ }),
291
+ container = _renderComponent14.container;
292
+ var foreignObject = container.querySelector('foreignObject');
293
+ expect(foreignObject).not.toBeInTheDocument();
294
+ });
295
+ it('renders hidden label for longest category', function () {
296
+ var _renderComponent15 = renderComponent(),
297
+ getAllByTestId = _renderComponent15.getAllByTestId;
298
+ var markLabels = getAllByTestId('mark-label');
299
+ expect(markLabels.length).toBeGreaterThan(0);
300
+ });
301
+ });
302
+ describe('category label editing', function () {
303
+ it('allows editing category label', function () {
304
+ var onChangeCategory = jest.fn();
305
+ var _renderComponent16 = renderComponent({
306
+ onChangeCategory: onChangeCategory
307
+ }),
308
+ getAllByTestId = _renderComponent16.getAllByTestId;
309
+ var inputs = getAllByTestId('mark-label-input');
310
+ var input = inputs[inputs.length - 1];
311
+ _testUtils.fireEvent.change(input, {
312
+ target: {
313
+ value: 'New Label'
314
+ }
315
+ });
316
+ expect(onChangeCategory).toHaveBeenCalled();
317
+ });
318
+ it('calls changeCategory with correct parameters', function () {
319
+ var onChangeCategory = jest.fn();
320
+ var _renderComponent17 = renderComponent({
321
+ onChangeCategory: onChangeCategory
322
+ }),
323
+ getAllByTestId = _renderComponent17.getAllByTestId;
324
+ var inputs = getAllByTestId('mark-label-input');
325
+ var input = inputs[inputs.length - 1];
326
+ _testUtils.fireEvent.change(input, {
327
+ target: {
328
+ value: 'Updated'
329
+ }
330
+ });
331
+ expect(onChangeCategory).toHaveBeenCalledWith(0, expect.objectContaining({
332
+ label: 'Updated'
333
+ }));
334
+ });
335
+ it('disables editing when editable is false', function () {
336
+ var categories = [{
337
+ value: 1,
338
+ label: 'test',
339
+ editable: false,
340
+ interactive: true
341
+ }];
342
+ var _renderComponent18 = renderComponent({
343
+ categories: categories,
344
+ formattedValue: '0-test'
345
+ }),
346
+ getAllByTestId = _renderComponent18.getAllByTestId;
347
+ var inputs = getAllByTestId('mark-label-input');
348
+ var input = inputs[inputs.length - 1];
349
+ expect(input).toBeDisabled();
350
+ });
351
+ it('enables editing in define chart mode', function () {
352
+ var categories = [{
353
+ value: 1,
354
+ label: 'test',
355
+ editable: true,
356
+ interactive: true
357
+ }];
358
+ var _renderComponent19 = renderComponent({
359
+ categories: categories,
360
+ formattedValue: '0-test',
361
+ defineChart: true
362
+ }),
363
+ getAllByTestId = _renderComponent19.getAllByTestId;
364
+ var inputs = getAllByTestId('mark-label-input');
365
+ var input = inputs[inputs.length - 1];
366
+ expect(input).not.toBeDisabled();
367
+ });
368
+ it('respects editable property when not in define chart mode', function () {
369
+ var categories = [{
370
+ value: 1,
371
+ label: 'test',
372
+ editable: true,
373
+ interactive: true
374
+ }];
375
+ var _renderComponent20 = renderComponent({
376
+ categories: categories,
377
+ formattedValue: '0-test',
378
+ defineChart: false
379
+ }),
380
+ getAllByTestId = _renderComponent20.getAllByTestId;
381
+ var inputs = getAllByTestId('mark-label-input');
382
+ var input = inputs[inputs.length - 1];
383
+ expect(input).not.toBeDisabled();
384
+ });
385
+ });
386
+ describe('interactive checkbox', function () {
387
+ it('shows warning when disabling interactive with correct answer', function () {
388
+ var categories = [{
389
+ value: 1,
390
+ label: 'test',
391
+ editable: true,
392
+ interactive: true,
393
+ correctness: {
394
+ value: 'correct'
395
+ }
396
+ }];
397
+ var component = new _axes.TickComponent({
398
+ categories: categories,
399
+ onChangeCategory: jest.fn()
400
+ });
401
+ component.setState = jest.fn();
402
+ component.changeInteractive(0, false);
403
+ expect(component.setState).toHaveBeenCalledWith(expect.objectContaining({
404
+ dialog: expect.objectContaining({
405
+ open: true,
406
+ title: 'Warning'
407
+ })
408
+ }));
409
+ });
410
+ it('changes interactive without warning when enabling', function () {
411
+ var onChangeCategory = jest.fn();
412
+ var categories = [{
413
+ value: 1,
414
+ label: 'test',
415
+ editable: true,
416
+ interactive: false
417
+ }];
418
+ var component = new _axes.TickComponent({
419
+ categories: categories,
420
+ onChangeCategory: onChangeCategory
421
+ });
422
+ component.changeInteractive(0, true);
423
+ expect(onChangeCategory).toHaveBeenCalledWith(0, expect.objectContaining({
424
+ interactive: true
425
+ }));
426
+ });
427
+ });
428
+ describe('editable checkbox', function () {
429
+ it('shows warning when disabling editable with correct answer name', function () {
430
+ var categories = [{
431
+ value: 1,
432
+ label: 'test',
433
+ editable: true,
434
+ interactive: true,
435
+ correctness: {
436
+ value: 'correct'
437
+ }
438
+ }];
439
+ var component = new _axes.TickComponent({
440
+ categories: categories,
441
+ onChangeCategory: jest.fn()
442
+ });
443
+ component.setState = jest.fn();
444
+ component.changeEditable(0, false);
445
+ expect(component.setState).toHaveBeenCalledWith(expect.objectContaining({
446
+ dialog: expect.objectContaining({
447
+ open: true,
448
+ title: 'Warning'
449
+ })
450
+ }));
451
+ });
452
+ it('changes editable without warning when enabling', function () {
453
+ var onChangeCategory = jest.fn();
454
+ var categories = [{
455
+ value: 1,
456
+ label: 'test',
457
+ editable: false,
458
+ interactive: true
459
+ }];
460
+ var component = new _axes.TickComponent({
461
+ categories: categories,
462
+ onChangeCategory: onChangeCategory
463
+ });
464
+ component.changeEditable(0, true);
465
+ expect(onChangeCategory).toHaveBeenCalledWith(0, expect.objectContaining({
466
+ editable: true
467
+ }));
468
+ });
469
+ });
470
+ describe('splitText method', function () {
471
+ it('splits text into chunks', function () {
472
+ var component = new _axes.TickComponent({
473
+ categories: []
474
+ });
475
+ var result = component.splitText('This is a long text', 10);
476
+ expect(result.length).toBeGreaterThan(1);
477
+ });
478
+ it('splits at word boundaries', function () {
479
+ var component = new _axes.TickComponent({
480
+ categories: []
481
+ });
482
+ var result = component.splitText('Hello world test', 11);
483
+ expect(result[0]).toBe('Hello world');
484
+ });
485
+ it('handles text shorter than max', function () {
486
+ var component = new _axes.TickComponent({
487
+ categories: []
488
+ });
489
+ var result = component.splitText('Short', 20);
490
+ expect(result).toEqual(['Short']);
491
+ });
492
+ it('handles empty text', function () {
493
+ var component = new _axes.TickComponent({
494
+ categories: []
495
+ });
496
+ var result = component.splitText('', 10);
497
+ expect(result).toEqual([]);
498
+ });
499
+ it('handles null text', function () {
500
+ var component = new _axes.TickComponent({
501
+ categories: []
502
+ });
503
+ var result = component.splitText(null, 10);
504
+ expect(result).toEqual([]);
505
+ });
506
+ it('forces split when no spaces', function () {
507
+ var component = new _axes.TickComponent({
508
+ categories: []
509
+ });
510
+ var result = component.splitText('verylongwordwithoutspaces', 10);
511
+ expect(result.length).toBeGreaterThan(1);
512
+ expect(result[0].length).toBeLessThanOrEqual(10);
513
+ });
514
+ });
515
+ describe('correctness display', function () {
516
+ it('renders correctness indicator when showCorrectness is true', function () {
517
+ var categories = [{
518
+ value: 1,
519
+ label: 'test',
520
+ editable: true,
521
+ interactive: true,
522
+ correctness: {
523
+ value: 'correct',
524
+ label: 'Correct!'
525
+ }
526
+ }];
527
+ var _renderComponent21 = renderComponent({
528
+ categories: categories,
529
+ formattedValue: '0-test',
530
+ showCorrectness: true
531
+ }),
532
+ getByTestId = _renderComponent21.getByTestId;
533
+ expect(getByTestId('tick-correctness-indicator')).toBeInTheDocument();
534
+ });
535
+ it('does not render correctness indicator when showCorrectness is false', function () {
536
+ var categories = [{
537
+ value: 1,
538
+ label: 'test',
539
+ editable: true,
540
+ interactive: true,
541
+ correctness: {
542
+ value: 'correct',
543
+ label: 'Correct!'
544
+ }
545
+ }];
546
+ var _renderComponent22 = renderComponent({
547
+ categories: categories,
548
+ formattedValue: '0-test',
549
+ showCorrectness: false
550
+ }),
551
+ queryByTestId = _renderComponent22.queryByTestId;
552
+ expect(queryByTestId('tick-correctness-indicator')).not.toBeInTheDocument();
553
+ });
554
+ it('does not render correctness indicator when not interactive', function () {
555
+ var categories = [{
556
+ value: 1,
557
+ label: 'test',
558
+ editable: true,
559
+ interactive: false,
560
+ correctness: {
561
+ value: 'correct',
562
+ label: 'Correct!'
563
+ }
564
+ }];
565
+ var _renderComponent23 = renderComponent({
566
+ categories: categories,
567
+ formattedValue: '0-test',
568
+ showCorrectness: true
569
+ }),
570
+ queryByTestId = _renderComponent23.queryByTestId;
571
+ expect(queryByTestId('tick-correctness-indicator')).not.toBeInTheDocument();
572
+ });
573
+ });
574
+ describe('error display', function () {
575
+ it('renders error message for first category', function () {
576
+ var error = {
577
+ 0: 'Error message'
578
+ };
579
+ var _renderComponent24 = renderComponent({
580
+ error: error,
581
+ formattedValue: '0-test'
582
+ }),
583
+ getByTestId = _renderComponent24.getByTestId;
584
+ expect(getByTestId('mark-label-error')).toBeInTheDocument();
585
+ });
586
+ it('renders distinct error messages', function () {
587
+ var error = {
588
+ 0: 'Error 1',
589
+ 1: 'Error 1',
590
+ 2: 'Error 2'
591
+ };
592
+ var _renderComponent25 = renderComponent({
593
+ error: error,
594
+ formattedValue: '0-test'
595
+ }),
596
+ container = _renderComponent25.container;
597
+ var errorText = container.querySelector('text');
598
+ expect(errorText).toBeInTheDocument();
599
+ });
600
+ it('does not render error when no error prop', function () {
601
+ var _renderComponent26 = renderComponent({
602
+ error: null
603
+ }),
604
+ queryByTestId = _renderComponent26.queryByTestId;
605
+ expect(queryByTestId('mark-label-error')).not.toBeInTheDocument();
606
+ });
607
+ });
608
+ describe('autoFocus handling', function () {
609
+ it('handles autoFocus prop', function () {
610
+ var onAutoFocusUsed = jest.fn();
611
+ var _renderComponent27 = renderComponent({
612
+ autoFocus: false,
613
+ onAutoFocusUsed: onAutoFocusUsed
614
+ }),
615
+ rerender = _renderComponent27.rerender;
616
+ rerender(/*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
617
+ theme: theme
618
+ }, /*#__PURE__*/_react["default"].createElement("svg", null, /*#__PURE__*/_react["default"].createElement(_axes.TickComponent, {
619
+ graphProps: (0, _utils.graphProps)(),
620
+ xBand: (0, _utils.createBandScale)(['a', 'b', 'c'], [0, 400]),
621
+ categories: defaultCategories,
622
+ formattedValue: '0-Category A',
623
+ bandWidth: 100,
624
+ barWidth: 100,
625
+ x: 50,
626
+ y: 50,
627
+ top: 0,
628
+ onChangeCategory: jest.fn(),
629
+ autoFocus: true,
630
+ onAutoFocusUsed: onAutoFocusUsed
631
+ }))));
632
+ expect(onAutoFocusUsed).toHaveBeenCalled();
633
+ });
634
+ });
635
+ describe('define chart mode', function () {
636
+ it('renders interactive checkboxes when changeInteractiveEnabled', function () {
637
+ var chartingOptions = {
638
+ changeInteractive: {
639
+ authoringLabel: 'Allow students to change'
640
+ }
641
+ };
642
+ var _renderComponent28 = renderComponent({
643
+ defineChart: true,
644
+ chartingOptions: chartingOptions,
645
+ changeInteractiveEnabled: true,
646
+ formattedValue: '0-test'
647
+ }),
648
+ container = _renderComponent28.container;
649
+ var text = container.querySelector('text');
650
+ expect(text).toBeInTheDocument();
651
+ });
652
+ it('renders editable checkboxes when changeEditableEnabled', function () {
653
+ var chartingOptions = {
654
+ changeEditable: {
655
+ authoringLabel: 'Allow label editing'
656
+ }
657
+ };
658
+ var _renderComponent29 = renderComponent({
659
+ defineChart: true,
660
+ chartingOptions: chartingOptions,
661
+ changeEditableEnabled: true,
662
+ formattedValue: '0-test'
663
+ }),
664
+ container = _renderComponent29.container;
665
+ var text = container.querySelector('text');
666
+ expect(text).toBeInTheDocument();
667
+ });
668
+ it('splits long authoring labels', function () {
669
+ var chartingOptions = {
670
+ changeInteractive: {
671
+ authoringLabel: 'This is a very long label that needs to be split'
672
+ }
673
+ };
674
+ var _renderComponent30 = renderComponent({
675
+ defineChart: true,
676
+ chartingOptions: chartingOptions,
677
+ changeInteractiveEnabled: true,
678
+ formattedValue: '0-test'
679
+ }),
680
+ container = _renderComponent30.container;
681
+ var tspans = container.querySelectorAll('tspan');
682
+ expect(tspans.length).toBeGreaterThan(1);
683
+ });
684
+ });
685
+ describe('edge cases', function () {
686
+ it('handles missing category', function () {
687
+ var _renderComponent31 = renderComponent({
688
+ categories: [],
689
+ formattedValue: '0-missing'
690
+ }),
691
+ container = _renderComponent31.container;
692
+ expect(container).toBeInTheDocument();
693
+ });
694
+ it('handles invalid formattedValue format', function () {
695
+ var _renderComponent32 = renderComponent({
696
+ formattedValue: 'invalid'
697
+ }),
698
+ container = _renderComponent32.container;
699
+ expect(container).toBeInTheDocument();
700
+ });
701
+ it('handles missing graphProps', function () {
702
+ var _renderComponent33 = renderComponent({
703
+ graphProps: null
704
+ }),
705
+ container = _renderComponent33.container;
706
+ expect(container).toBeInTheDocument();
707
+ });
708
+ it('handles zero barWidth', function () {
709
+ var _renderComponent34 = renderComponent({
710
+ barWidth: 0
711
+ }),
712
+ container = _renderComponent34.container;
713
+ expect(container).toBeInTheDocument();
714
+ });
715
+ it('handles negative coordinates', function () {
716
+ var _renderComponent35 = renderComponent({
717
+ x: -10,
718
+ y: -20
719
+ }),
720
+ container = _renderComponent35.container;
721
+ expect(container).toBeInTheDocument();
722
+ });
723
+ });
724
+ describe('componentDidUpdate', function () {
725
+ it('calls onAutoFocusUsed when autoFocus changes to true', function () {
726
+ var onAutoFocusUsed = jest.fn();
727
+ var component = new _axes.TickComponent({
728
+ autoFocus: false,
729
+ onAutoFocusUsed: onAutoFocusUsed
730
+ });
731
+ component.componentDidUpdate({
732
+ autoFocus: false
733
+ });
734
+ expect(onAutoFocusUsed).not.toHaveBeenCalled();
735
+ component.props = {
736
+ autoFocus: true,
737
+ onAutoFocusUsed: onAutoFocusUsed
738
+ };
739
+ component.componentDidUpdate({
740
+ autoFocus: false
741
+ });
742
+ expect(onAutoFocusUsed).toHaveBeenCalled();
743
+ });
744
+ });
745
+ });
746
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl90ZXN0VXRpbHMiLCJfc3R5bGVzIiwiX2F4ZXMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl91dGlscyIsIl9leGNsdWRlZCIsIl9leGNsdWRlZDIiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJfdHlwZW9mIiwiaGFzIiwiZ2V0Iiwic2V0IiwiX3QiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiamVzdCIsIm1vY2siLCJBeGlzTGVmdCIsIl9yZWYiLCJjaGlsZHJlbiIsInByb3BzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsImNyZWF0ZUVsZW1lbnQiLCJfZXh0ZW5kczIiLCJmb3JtYXR0ZWRWYWx1ZSIsIkF4aXNCb3R0b20iLCJfcmVmMiIsInRpY2tWYWx1ZXMiLCJtYXAiLCJ2IiwiaW5kZXgiLCJNYXJrTGFiZWwiLCJfcmVmMyIsIm1hcmsiLCJkaXNhYmxlZCIsIm9uQ2hhbmdlIiwiZXJyb3IiLCJhdXRvRm9jdXMiLCJpbnB1dFJlZiIsImNvcnJlY3RuZXNzSW5kaWNhdG9yIiwicmVmIiwidmFsdWUiLCJsYWJlbCIsInRhcmdldCIsIkFsZXJ0RGlhbG9nIiwiX3JlZjQiLCJvcGVuIiwidGl0bGUiLCJ0ZXh0Iiwib25DbG9zZSIsIm9uQ29uZmlybSIsIm9uQ2xpY2siLCJUaWNrQ29ycmVjdG5lc3NJbmRpY2F0b3IiLCJfcmVmNSIsImNvcnJlY3RuZXNzIiwiaW50ZXJhY3RpdmUiLCJyZW5kZXJNYXRoIiwiZm4iLCJ0aGVtZSIsImNyZWF0ZVRoZW1lIiwiZGVzY3JpYmUiLCJyZW5kZXJDb21wb25lbnQiLCJleHRyYXMiLCJkZWZhdWx0cyIsImNsYXNzZXMiLCJjbGFzc05hbWUiLCJncmFwaFByb3BzIiwieEJhbmQiLCJjcmVhdGVCYW5kU2NhbGUiLCJjYXRlZ29yaWVzIiwicmVuZGVyIiwiVGhlbWVQcm92aWRlciIsIml0IiwiX3JlbmRlckNvbXBvbmVudCIsImNvbnRhaW5lciIsImV4cGVjdCIsImZpcnN0Q2hpbGQiLCJ0b0JlSW5UaGVEb2N1bWVudCIsIl9yZW5kZXJDb21wb25lbnQyIiwic3ZnIiwicXVlcnlTZWxlY3RvciIsImF4ZXNHcm91cCIsIl9yZW5kZXJDb21wb25lbnQzIiwiZ3JvdXBzIiwicXVlcnlTZWxlY3RvckFsbCIsInRvQmVHcmVhdGVyVGhhbiIsIl9yZW5kZXJDb21wb25lbnQ0IiwidW5kZWZpbmVkIiwiX3JlbmRlckNvbXBvbmVudDUiLCJfcmVuZGVyQ29tcG9uZW50NiIsIlJhd0NoYXJ0QXhlcyIsIl9yZW5kZXJDb21wb25lbnQ3IiwiX3JlbmRlckNvbXBvbmVudDgiLCJfcmVuZGVyQ29tcG9uZW50OSIsImxlZnRBeGlzIiwiZ2V0QnlUZXN0SWQiLCJfcmVuZGVyQ29tcG9uZW50MCIsInF1ZXJ5QnlUZXN0SWQiLCJub3QiLCJkZWZhdWx0Q2F0ZWdvcmllcyIsImVkaXRhYmxlIiwiYmFuZFdpZHRoIiwiYmFyV2lkdGgiLCJ4IiwieSIsInRvcCIsIm9uQ2hhbmdlQ2F0ZWdvcnkiLCJUaWNrQ29tcG9uZW50IiwiX3JlbmRlckNvbXBvbmVudDEiLCJfcmVuZGVyQ29tcG9uZW50MTAiLCJfcmVuZGVyQ29tcG9uZW50MTEiLCJnZXRBbGxCeVRlc3RJZCIsIm1hcmtMYWJlbHMiLCJfcmVuZGVyQ29tcG9uZW50MTIiLCJmb3JlaWduT2JqZWN0IiwiX3JlbmRlckNvbXBvbmVudDEzIiwiX3JlbmRlckNvbXBvbmVudDE0IiwiX3JlbmRlckNvbXBvbmVudDE1IiwiX3JlbmRlckNvbXBvbmVudDE2IiwiaW5wdXRzIiwiaW5wdXQiLCJmaXJlRXZlbnQiLCJjaGFuZ2UiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwiX3JlbmRlckNvbXBvbmVudDE3IiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJvYmplY3RDb250YWluaW5nIiwiX3JlbmRlckNvbXBvbmVudDE4IiwidG9CZURpc2FibGVkIiwiX3JlbmRlckNvbXBvbmVudDE5IiwiZGVmaW5lQ2hhcnQiLCJfcmVuZGVyQ29tcG9uZW50MjAiLCJjb21wb25lbnQiLCJzZXRTdGF0ZSIsImNoYW5nZUludGVyYWN0aXZlIiwiZGlhbG9nIiwiY2hhbmdlRWRpdGFibGUiLCJyZXN1bHQiLCJzcGxpdFRleHQiLCJ0b0JlIiwidG9FcXVhbCIsInRvQmVMZXNzVGhhbk9yRXF1YWwiLCJfcmVuZGVyQ29tcG9uZW50MjEiLCJzaG93Q29ycmVjdG5lc3MiLCJfcmVuZGVyQ29tcG9uZW50MjIiLCJfcmVuZGVyQ29tcG9uZW50MjMiLCJfcmVuZGVyQ29tcG9uZW50MjQiLCJfcmVuZGVyQ29tcG9uZW50MjUiLCJlcnJvclRleHQiLCJfcmVuZGVyQ29tcG9uZW50MjYiLCJvbkF1dG9Gb2N1c1VzZWQiLCJfcmVuZGVyQ29tcG9uZW50MjciLCJyZXJlbmRlciIsImNoYXJ0aW5nT3B0aW9ucyIsImF1dGhvcmluZ0xhYmVsIiwiX3JlbmRlckNvbXBvbmVudDI4IiwiY2hhbmdlSW50ZXJhY3RpdmVFbmFibGVkIiwiX3JlbmRlckNvbXBvbmVudDI5IiwiY2hhbmdlRWRpdGFibGVFbmFibGVkIiwiX3JlbmRlckNvbXBvbmVudDMwIiwidHNwYW5zIiwiX3JlbmRlckNvbXBvbmVudDMxIiwiX3JlbmRlckNvbXBvbmVudDMyIiwiX3JlbmRlckNvbXBvbmVudDMzIiwiX3JlbmRlckNvbXBvbmVudDM0IiwiX3JlbmRlckNvbXBvbmVudDM1IiwiY29tcG9uZW50RGlkVXBkYXRlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9heGVzLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmaXJlRXZlbnQsIHJlbmRlciB9IGZyb20gJ0BwaWUtbGliL3Rlc3QtdXRpbHMnO1xuaW1wb3J0IHsgY3JlYXRlVGhlbWUsIFRoZW1lUHJvdmlkZXIgfSBmcm9tICdAbXVpL21hdGVyaWFsL3N0eWxlcyc7XG5pbXBvcnQgQ2hhcnRBeGVzLCB7IFJhd0NoYXJ0QXhlcywgVGlja0NvbXBvbmVudCB9IGZyb20gJy4uL2F4ZXMnO1xuaW1wb3J0IHsgY3JlYXRlQmFuZFNjYWxlLCBncmFwaFByb3BzIH0gZnJvbSAnLi91dGlscyc7XG5cbmplc3QubW9jaygnQHZpc3gvYXhpcycsICgpID0+ICh7XG4gIEF4aXNMZWZ0OiAoeyBjaGlsZHJlbiwgLi4ucHJvcHMgfSkgPT4gKFxuICAgIDxnIGRhdGEtdGVzdGlkPVwiYXhpcy1sZWZ0XCIgey4uLnByb3BzfT5cbiAgICAgIHt0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicgPyBjaGlsZHJlbih7IGZvcm1hdHRlZFZhbHVlOiAnNScgfSkgOiBjaGlsZHJlbn1cbiAgICA8L2c+XG4gICksXG4gIEF4aXNCb3R0b206ICh7IGNoaWxkcmVuLCB0aWNrVmFsdWVzLCAuLi5wcm9wcyB9KSA9PiAoXG4gICAgPGcgZGF0YS10ZXN0aWQ9XCJheGlzLWJvdHRvbVwiIHsuLi5wcm9wc30+XG4gICAgICB7dHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gKHRpY2tWYWx1ZXMgfHwgWycwLUEnLCAnMS1CJywgJzItQyddKS5tYXAoKHYsIGkpID0+IGNoaWxkcmVuKHsgZm9ybWF0dGVkVmFsdWU6IHYsIGluZGV4OiBpIH0pKVxuICAgICAgICA6IGNoaWxkcmVufVxuICAgIDwvZz5cbiAgKSxcbn0pKTtcblxuamVzdC5tb2NrKCcuLi9tYXJrLWxhYmVsJywgKCkgPT4ge1xuICByZXR1cm4gZnVuY3Rpb24gTWFya0xhYmVsKHsgbWFyaywgZGlzYWJsZWQsIG9uQ2hhbmdlLCBlcnJvciwgYXV0b0ZvY3VzLCBpbnB1dFJlZiwgY29ycmVjdG5lc3NJbmRpY2F0b3IgfSkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwibWFyay1sYWJlbFwiPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cIm1hcmstbGFiZWwtaW5wdXRcIlxuICAgICAgICAgIHJlZj17aW5wdXRSZWZ9XG4gICAgICAgICAgdmFsdWU9e21hcms/LmxhYmVsIHx8ICcnfVxuICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IG9uQ2hhbmdlICYmIG9uQ2hhbmdlKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICBhdXRvRm9jdXM9e2F1dG9Gb2N1c31cbiAgICAgICAgLz5cbiAgICAgICAge2Vycm9yICYmIDxzcGFuIGRhdGEtdGVzdGlkPVwibWFyay1sYWJlbC1lcnJvclwiPntlcnJvcn08L3NwYW4+fVxuICAgICAgICB7Y29ycmVjdG5lc3NJbmRpY2F0b3J9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9O1xufSk7XG5cbmplc3QubW9jaygnQHBpZS1saWIvY29uZmlnLXVpJywgKCkgPT4gKHtcbiAgQWxlcnREaWFsb2c6ICh7IG9wZW4sIHRpdGxlLCB0ZXh0LCBvbkNsb3NlLCBvbkNvbmZpcm0gfSkgPT5cbiAgICBvcGVuID8gKFxuICAgICAgPGRpdiBkYXRhLXRlc3RpZD1cImFsZXJ0LWRpYWxvZ1wiPlxuICAgICAgICA8aDI+e3RpdGxlfTwvaDI+XG4gICAgICAgIDxwPnt0ZXh0fTwvcD5cbiAgICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cImFsZXJ0LWNhbmNlbFwiIG9uQ2xpY2s9e29uQ2xvc2V9PlxuICAgICAgICAgIENhbmNlbFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cImFsZXJ0LWNvbmZpcm1cIiBvbkNsaWNrPXtvbkNvbmZpcm19PlxuICAgICAgICAgIENvbmZpcm1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICApIDogbnVsbCxcbn0pKTtcblxuamVzdC5tb2NrKCcuLi9jb21tb24vY29ycmVjdG5lc3MtaW5kaWNhdG9ycycsICgpID0+ICh7XG4gIFRpY2tDb3JyZWN0bmVzc0luZGljYXRvcjogKHsgY29ycmVjdG5lc3MsIGludGVyYWN0aXZlIH0pID0+XG4gICAgY29ycmVjdG5lc3MgJiYgaW50ZXJhY3RpdmUgPyAoXG4gICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwidGljay1jb3JyZWN0bmVzcy1pbmRpY2F0b3JcIj57Y29ycmVjdG5lc3MudmFsdWUgPT09ICdjb3JyZWN0JyA/ICfinJMnIDogJ+Kclyd9PC9kaXY+XG4gICAgKSA6IG51bGwsXG59KSk7XG5cbmplc3QubW9jaygnQHBpZS1saWIvbWF0aC1yZW5kZXJpbmcnLCAoKSA9PiAoe1xuICByZW5kZXJNYXRoOiBqZXN0LmZuKCh0ZXh0KSA9PiB0ZXh0KSxcbn0pKTtcblxuY29uc3QgdGhlbWUgPSBjcmVhdGVUaGVtZSgpO1xuXG5kZXNjcmliZSgnQ2hhcnRBeGVzJywgKCkgPT4ge1xuICBjb25zdCByZW5kZXJDb21wb25lbnQgPSAoZXh0cmFzKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICBjbGFzc2VzOiB7fSxcbiAgICAgIGNsYXNzTmFtZTogJ2NsYXNzTmFtZScsXG4gICAgICBncmFwaFByb3BzOiBncmFwaFByb3BzKCksXG4gICAgICB4QmFuZDogY3JlYXRlQmFuZFNjYWxlKFsnYScsICdiJywgJ2MnXSwgWzAsIDQwMF0pLFxuICAgICAgY2F0ZWdvcmllczogW10sXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdHMsIC4uLmV4dHJhcyB9O1xuICAgIHJldHVybiByZW5kZXIoXG4gICAgICA8VGhlbWVQcm92aWRlciB0aGVtZT17dGhlbWV9PlxuICAgICAgICA8c3ZnPlxuICAgICAgICAgIDxDaGFydEF4ZXMgey4uLnByb3BzfSAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvVGhlbWVQcm92aWRlcj4sXG4gICAgKTtcbiAgfTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIGF4ZXMgY29udGFpbmVyJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgU1ZHIHdpdGggYXhlcyBncm91cCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IHN2ZyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdzdmcnKTtcbiAgICAgIGV4cGVjdChzdmcpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBjb25zdCBheGVzR3JvdXAgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZycpO1xuICAgICAgZXhwZWN0KGF4ZXNHcm91cCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGF4ZXMgZWxlbWVudHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBjb25zdCBncm91cHMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnZycpO1xuICAgICAgZXhwZWN0KGdyb3Vwcy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2VkZ2UgY2FzZXMnLCAoKSA9PiB7XG4gICAgaXQoJ2hhbmRsZXMgbWlzc2luZyB4QmFuZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyB4QmFuZDogdW5kZWZpbmVkIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGVtcHR5IGNhdGVnb3JpZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY2F0ZWdvcmllczogW10gfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgbnVsbCBjYXRlZ29yaWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGNhdGVnb3JpZXM6IG51bGwgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnUmF3Q2hhcnRBeGVzJywgKCkgPT4ge1xuICBjb25zdCByZW5kZXJDb21wb25lbnQgPSAoZXh0cmFzKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICBjbGFzc2VzOiB7fSxcbiAgICAgIGNsYXNzTmFtZTogJ2NsYXNzTmFtZScsXG4gICAgICBncmFwaFByb3BzOiBncmFwaFByb3BzKCksXG4gICAgICB4QmFuZDogY3JlYXRlQmFuZFNjYWxlKFsnYScsICdiJywgJ2MnXSwgWzAsIDQwMF0pLFxuICAgICAgY2F0ZWdvcmllczogW10sXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdHMsIC4uLmV4dHJhcyB9O1xuICAgIHJldHVybiByZW5kZXIoXG4gICAgICA8VGhlbWVQcm92aWRlciB0aGVtZT17dGhlbWV9PlxuICAgICAgICA8c3ZnPlxuICAgICAgICAgIDxSYXdDaGFydEF4ZXMgey4uLnByb3BzfSAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvVGhlbWVQcm92aWRlcj4sXG4gICAgKTtcbiAgfTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHJhdyBheGVzIGNvbnRhaW5lcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIFNWRyB3aXRoIGF4ZXMgZ3JvdXAnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBjb25zdCBzdmcgPSBjb250YWluZXIucXVlcnlTZWxlY3Rvcignc3ZnJyk7XG4gICAgICBleHBlY3Qoc3ZnKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgY29uc3QgYXhlc0dyb3VwID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2cnKTtcbiAgICAgIGV4cGVjdChheGVzR3JvdXApLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBib3RoIGF4ZXMgd2hlbiBsZWZ0QXhpcyBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbGVmdEF4aXM6IHRydWUgfSk7XG4gICAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ2F4aXMtbGVmdCcpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdheGlzLWJvdHRvbScpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgb25seSBib3R0b20gYXhpcyB3aGVuIGxlZnRBeGlzIGlzIGZhbHNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBxdWVyeUJ5VGVzdElkLCBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbGVmdEF4aXM6IGZhbHNlIH0pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2F4aXMtbGVmdCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnYXhpcy1ib3R0b20nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ1RpY2tDb21wb25lbnQnLCAoKSA9PiB7XG4gIGNvbnN0IGRlZmF1bHRDYXRlZ29yaWVzID0gW1xuICAgIHsgdmFsdWU6IDEsIGxhYmVsOiAnQ2F0ZWdvcnkgQScsIGVkaXRhYmxlOiB0cnVlLCBpbnRlcmFjdGl2ZTogdHJ1ZSB9LFxuICAgIHsgdmFsdWU6IDIsIGxhYmVsOiAnQ2F0ZWdvcnkgQicsIGVkaXRhYmxlOiB0cnVlLCBpbnRlcmFjdGl2ZTogdHJ1ZSB9LFxuICBdO1xuXG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChleHRyYXMpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgIGdyYXBoUHJvcHM6IGdyYXBoUHJvcHMoKSxcbiAgICAgIHhCYW5kOiBjcmVhdGVCYW5kU2NhbGUoWydhJywgJ2InLCAnYyddLCBbMCwgNDAwXSksXG4gICAgICBjYXRlZ29yaWVzOiBkZWZhdWx0Q2F0ZWdvcmllcyxcbiAgICAgIGZvcm1hdHRlZFZhbHVlOiAnMC1DYXRlZ29yeSBBJyxcbiAgICAgIGJhbmRXaWR0aDogMTAwLFxuICAgICAgYmFyV2lkdGg6IDEwMCxcbiAgICAgIHg6IDUwLFxuICAgICAgeTogNTAsXG4gICAgICB0b3A6IDAsXG4gICAgICBvbkNoYW5nZUNhdGVnb3J5OiBqZXN0LmZuKCksXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdHMsIC4uLmV4dHJhcyB9O1xuICAgIHJldHVybiByZW5kZXIoXG4gICAgICA8VGhlbWVQcm92aWRlciB0aGVtZT17dGhlbWV9PlxuICAgICAgICA8c3ZnPlxuICAgICAgICAgIDxUaWNrQ29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L1RoZW1lUHJvdmlkZXI+LFxuICAgICk7XG4gIH07XG5cbiAgZGVzY3JpYmUoJ3JlbmRlcmluZycsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyB0aWNrIGNvbXBvbmVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IHN2ZyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdzdmcnKTtcbiAgICAgIGV4cGVjdChzdmcpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2cnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggY2F0ZWdvcmllcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogJzAtdGVzdCcsXG4gICAgICAgIGNhdGVnb3JpZXM6IFt7IHZhbHVlOiAxLCBsYWJlbDogJ3Rlc3QnLCBlZGl0YWJsZTogZmFsc2UsIGludGVyYWN0aXZlOiBmYWxzZSB9XSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc3ZnID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpO1xuICAgICAgZXhwZWN0KHN2ZykudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignZycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgTWFya0xhYmVsIGNvbXBvbmVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgY29uc3QgbWFya0xhYmVscyA9IGdldEFsbEJ5VGVzdElkKCdtYXJrLWxhYmVsJyk7XG4gICAgICBleHBlY3QobWFya0xhYmVscy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGZvcmVpZ25PYmplY3QgZm9yIGxhYmVscycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IGZvcmVpZ25PYmplY3QgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpO1xuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgcmVuZGVyIHdoZW4gZm9ybWF0dGVkVmFsdWUgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBmb3JtYXR0ZWRWYWx1ZTogbnVsbCB9KTtcbiAgICAgIGNvbnN0IGZvcmVpZ25PYmplY3QgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZm9yZWlnbk9iamVjdCcpO1xuICAgICAgZXhwZWN0KGZvcmVpZ25PYmplY3QpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciB3aGVuIGZvcm1hdHRlZFZhbHVlIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBmb3JtYXR0ZWRWYWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdmb3JlaWduT2JqZWN0Jyk7XG4gICAgICBleHBlY3QoZm9yZWlnbk9iamVjdCkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBoaWRkZW4gbGFiZWwgZm9yIGxvbmdlc3QgY2F0ZWdvcnknLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IG1hcmtMYWJlbHMgPSBnZXRBbGxCeVRlc3RJZCgnbWFyay1sYWJlbCcpO1xuICAgICAgZXhwZWN0KG1hcmtMYWJlbHMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjYXRlZ29yeSBsYWJlbCBlZGl0aW5nJywgKCkgPT4ge1xuICAgIGl0KCdhbGxvd3MgZWRpdGluZyBjYXRlZ29yeSBsYWJlbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlQ2F0ZWdvcnkgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoeyBvbkNoYW5nZUNhdGVnb3J5IH0pO1xuXG4gICAgICBjb25zdCBpbnB1dHMgPSBnZXRBbGxCeVRlc3RJZCgnbWFyay1sYWJlbC1pbnB1dCcpO1xuICAgICAgY29uc3QgaW5wdXQgPSBpbnB1dHNbaW5wdXRzLmxlbmd0aCAtIDFdO1xuICAgICAgZmlyZUV2ZW50LmNoYW5nZShpbnB1dCwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdOZXcgTGFiZWwnIH0gfSk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZUNhdGVnb3J5KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgY2hhbmdlQ2F0ZWdvcnkgd2l0aCBjb3JyZWN0IHBhcmFtZXRlcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZUNhdGVnb3J5ID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgeyBnZXRBbGxCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgb25DaGFuZ2VDYXRlZ29yeSB9KTtcblxuICAgICAgY29uc3QgaW5wdXRzID0gZ2V0QWxsQnlUZXN0SWQoJ21hcmstbGFiZWwtaW5wdXQnKTtcbiAgICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzW2lucHV0cy5sZW5ndGggLSAxXTtcbiAgICAgIGZpcmVFdmVudC5jaGFuZ2UoaW5wdXQsIHsgdGFyZ2V0OiB7IHZhbHVlOiAnVXBkYXRlZCcgfSB9KTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlQ2F0ZWdvcnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDAsIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgbGFiZWw6ICdVcGRhdGVkJyB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZGlzYWJsZXMgZWRpdGluZyB3aGVuIGVkaXRhYmxlIGlzIGZhbHNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFt7IHZhbHVlOiAxLCBsYWJlbDogJ3Rlc3QnLCBlZGl0YWJsZTogZmFsc2UsIGludGVyYWN0aXZlOiB0cnVlIH1dO1xuICAgICAgY29uc3QgeyBnZXRBbGxCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY2F0ZWdvcmllcywgZm9ybWF0dGVkVmFsdWU6ICcwLXRlc3QnIH0pO1xuXG4gICAgICBjb25zdCBpbnB1dHMgPSBnZXRBbGxCeVRlc3RJZCgnbWFyay1sYWJlbC1pbnB1dCcpO1xuICAgICAgY29uc3QgaW5wdXQgPSBpbnB1dHNbaW5wdXRzLmxlbmd0aCAtIDFdO1xuICAgICAgZXhwZWN0KGlucHV0KS50b0JlRGlzYWJsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdlbmFibGVzIGVkaXRpbmcgaW4gZGVmaW5lIGNoYXJ0IG1vZGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjYXRlZ29yaWVzID0gW3sgdmFsdWU6IDEsIGxhYmVsOiAndGVzdCcsIGVkaXRhYmxlOiB0cnVlLCBpbnRlcmFjdGl2ZTogdHJ1ZSB9XTtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNhdGVnb3JpZXMsXG4gICAgICAgIGZvcm1hdHRlZFZhbHVlOiAnMC10ZXN0JyxcbiAgICAgICAgZGVmaW5lQ2hhcnQ6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgaW5wdXRzID0gZ2V0QWxsQnlUZXN0SWQoJ21hcmstbGFiZWwtaW5wdXQnKTtcbiAgICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzW2lucHV0cy5sZW5ndGggLSAxXTtcbiAgICAgIGV4cGVjdChpbnB1dCkubm90LnRvQmVEaXNhYmxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Jlc3BlY3RzIGVkaXRhYmxlIHByb3BlcnR5IHdoZW4gbm90IGluIGRlZmluZSBjaGFydCBtb2RlJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFt7IHZhbHVlOiAxLCBsYWJlbDogJ3Rlc3QnLCBlZGl0YWJsZTogdHJ1ZSwgaW50ZXJhY3RpdmU6IHRydWUgfV07XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjYXRlZ29yaWVzLFxuICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogJzAtdGVzdCcsXG4gICAgICAgIGRlZmluZUNoYXJ0OiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBpbnB1dHMgPSBnZXRBbGxCeVRlc3RJZCgnbWFyay1sYWJlbC1pbnB1dCcpO1xuICAgICAgY29uc3QgaW5wdXQgPSBpbnB1dHNbaW5wdXRzLmxlbmd0aCAtIDFdO1xuICAgICAgZXhwZWN0KGlucHV0KS5ub3QudG9CZURpc2FibGVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbnRlcmFjdGl2ZSBjaGVja2JveCcsICgpID0+IHtcbiAgICBpdCgnc2hvd3Mgd2FybmluZyB3aGVuIGRpc2FibGluZyBpbnRlcmFjdGl2ZSB3aXRoIGNvcnJlY3QgYW5zd2VyJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiAxLFxuICAgICAgICAgIGxhYmVsOiAndGVzdCcsXG4gICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgaW50ZXJhY3RpdmU6IHRydWUsXG4gICAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JyB9LFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBUaWNrQ29tcG9uZW50KHtcbiAgICAgICAgY2F0ZWdvcmllcyxcbiAgICAgICAgb25DaGFuZ2VDYXRlZ29yeTogamVzdC5mbigpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5zZXRTdGF0ZSA9IGplc3QuZm4oKTtcbiAgICAgIGNvbXBvbmVudC5jaGFuZ2VJbnRlcmFjdGl2ZSgwLCBmYWxzZSk7XG5cbiAgICAgIGV4cGVjdChjb21wb25lbnQuc2V0U3RhdGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgZGlhbG9nOiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBvcGVuOiB0cnVlLFxuICAgICAgICAgICAgdGl0bGU6ICdXYXJuaW5nJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NoYW5nZXMgaW50ZXJhY3RpdmUgd2l0aG91dCB3YXJuaW5nIHdoZW4gZW5hYmxpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZUNhdGVnb3J5ID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFt7IHZhbHVlOiAxLCBsYWJlbDogJ3Rlc3QnLCBlZGl0YWJsZTogdHJ1ZSwgaW50ZXJhY3RpdmU6IGZhbHNlIH1dO1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IFRpY2tDb21wb25lbnQoe1xuICAgICAgICBjYXRlZ29yaWVzLFxuICAgICAgICBvbkNoYW5nZUNhdGVnb3J5LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5jaGFuZ2VJbnRlcmFjdGl2ZSgwLCB0cnVlKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlQ2F0ZWdvcnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDAsIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgaW50ZXJhY3RpdmU6IHRydWUgfSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZWRpdGFibGUgY2hlY2tib3gnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3dzIHdhcm5pbmcgd2hlbiBkaXNhYmxpbmcgZWRpdGFibGUgd2l0aCBjb3JyZWN0IGFuc3dlciBuYW1lJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiAxLFxuICAgICAgICAgIGxhYmVsOiAndGVzdCcsXG4gICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgaW50ZXJhY3RpdmU6IHRydWUsXG4gICAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JyB9LFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBUaWNrQ29tcG9uZW50KHtcbiAgICAgICAgY2F0ZWdvcmllcyxcbiAgICAgICAgb25DaGFuZ2VDYXRlZ29yeTogamVzdC5mbigpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5zZXRTdGF0ZSA9IGplc3QuZm4oKTtcbiAgICAgIGNvbXBvbmVudC5jaGFuZ2VFZGl0YWJsZSgwLCBmYWxzZSk7XG5cbiAgICAgIGV4cGVjdChjb21wb25lbnQuc2V0U3RhdGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgZGlhbG9nOiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBvcGVuOiB0cnVlLFxuICAgICAgICAgICAgdGl0bGU6ICdXYXJuaW5nJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NoYW5nZXMgZWRpdGFibGUgd2l0aG91dCB3YXJuaW5nIHdoZW4gZW5hYmxpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZUNhdGVnb3J5ID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFt7IHZhbHVlOiAxLCBsYWJlbDogJ3Rlc3QnLCBlZGl0YWJsZTogZmFsc2UsIGludGVyYWN0aXZlOiB0cnVlIH1dO1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IFRpY2tDb21wb25lbnQoe1xuICAgICAgICBjYXRlZ29yaWVzLFxuICAgICAgICBvbkNoYW5nZUNhdGVnb3J5LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5jaGFuZ2VFZGl0YWJsZSgwLCB0cnVlKTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlQ2F0ZWdvcnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDAsIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgZWRpdGFibGU6IHRydWUgfSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc3BsaXRUZXh0IG1ldGhvZCcsICgpID0+IHtcbiAgICBpdCgnc3BsaXRzIHRleHQgaW50byBjaHVua3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgVGlja0NvbXBvbmVudCh7IGNhdGVnb3JpZXM6IFtdIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29tcG9uZW50LnNwbGl0VGV4dCgnVGhpcyBpcyBhIGxvbmcgdGV4dCcsIDEwKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdC5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigxKTtcbiAgICB9KTtcblxuICAgIGl0KCdzcGxpdHMgYXQgd29yZCBib3VuZGFyaWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IFRpY2tDb21wb25lbnQoeyBjYXRlZ29yaWVzOiBbXSB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBvbmVudC5zcGxpdFRleHQoJ0hlbGxvIHdvcmxkIHRlc3QnLCAxMSk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHRbMF0pLnRvQmUoJ0hlbGxvIHdvcmxkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyB0ZXh0IHNob3J0ZXIgdGhhbiBtYXgnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgVGlja0NvbXBvbmVudCh7IGNhdGVnb3JpZXM6IFtdIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29tcG9uZW50LnNwbGl0VGV4dCgnU2hvcnQnLCAyMCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoWydTaG9ydCddKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGVtcHR5IHRleHQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgVGlja0NvbXBvbmVudCh7IGNhdGVnb3JpZXM6IFtdIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29tcG9uZW50LnNwbGl0VGV4dCgnJywgMTApO1xuXG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIG51bGwgdGV4dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBUaWNrQ29tcG9uZW50KHsgY2F0ZWdvcmllczogW10gfSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBjb21wb25lbnQuc3BsaXRUZXh0KG51bGwsIDEwKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZm9yY2VzIHNwbGl0IHdoZW4gbm8gc3BhY2VzJywgKCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IFRpY2tDb21wb25lbnQoeyBjYXRlZ29yaWVzOiBbXSB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBvbmVudC5zcGxpdFRleHQoJ3Zlcnlsb25nd29yZHdpdGhvdXRzcGFjZXMnLCAxMCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMSk7XG4gICAgICBleHBlY3QocmVzdWx0WzBdLmxlbmd0aCkudG9CZUxlc3NUaGFuT3JFcXVhbCgxMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb3JyZWN0bmVzcyBkaXNwbGF5JywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIGNvcnJlY3RuZXNzIGluZGljYXRvciB3aGVuIHNob3dDb3JyZWN0bmVzcyBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiAxLFxuICAgICAgICAgIGxhYmVsOiAndGVzdCcsXG4gICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgaW50ZXJhY3RpdmU6IHRydWUsXG4gICAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdDb3JyZWN0IScgfSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjYXRlZ29yaWVzLFxuICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogJzAtdGVzdCcsXG4gICAgICAgIHNob3dDb3JyZWN0bmVzczogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ3RpY2stY29ycmVjdG5lc3MtaW5kaWNhdG9yJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgcmVuZGVyIGNvcnJlY3RuZXNzIGluZGljYXRvciB3aGVuIHNob3dDb3JyZWN0bmVzcyBpcyBmYWxzZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgICBsYWJlbDogJ3Rlc3QnLFxuICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGludGVyYWN0aXZlOiB0cnVlLFxuICAgICAgICAgIGNvcnJlY3RuZXNzOiB7IHZhbHVlOiAnY29ycmVjdCcsIGxhYmVsOiAnQ29ycmVjdCEnIH0sXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgeyBxdWVyeUJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjYXRlZ29yaWVzLFxuICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogJzAtdGVzdCcsXG4gICAgICAgIHNob3dDb3JyZWN0bmVzczogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ3RpY2stY29ycmVjdG5lc3MtaW5kaWNhdG9yJykpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciBjb3JyZWN0bmVzcyBpbmRpY2F0b3Igd2hlbiBub3QgaW50ZXJhY3RpdmUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjYXRlZ29yaWVzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IDEsXG4gICAgICAgICAgbGFiZWw6ICd0ZXN0JyxcbiAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBpbnRlcmFjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgY29ycmVjdG5lc3M6IHsgdmFsdWU6ICdjb3JyZWN0JywgbGFiZWw6ICdDb3JyZWN0IScgfSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXN0SWQgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNhdGVnb3JpZXMsXG4gICAgICAgIGZvcm1hdHRlZFZhbHVlOiAnMC10ZXN0JyxcbiAgICAgICAgc2hvd0NvcnJlY3RuZXNzOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCd0aWNrLWNvcnJlY3RuZXNzLWluZGljYXRvcicpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Vycm9yIGRpc3BsYXknLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgZXJyb3IgbWVzc2FnZSBmb3IgZmlyc3QgY2F0ZWdvcnknLCAoKSA9PiB7XG4gICAgICBjb25zdCBlcnJvciA9IHsgMDogJ0Vycm9yIG1lc3NhZ2UnIH07XG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBlcnJvcixcbiAgICAgICAgZm9ybWF0dGVkVmFsdWU6ICcwLXRlc3QnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnbWFyay1sYWJlbC1lcnJvcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgZGlzdGluY3QgZXJyb3IgbWVzc2FnZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBlcnJvciA9IHsgMDogJ0Vycm9yIDEnLCAxOiAnRXJyb3IgMScsIDI6ICdFcnJvciAyJyB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGVycm9yLFxuICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogJzAtdGVzdCcsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZXJyb3JUZXh0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3RleHQnKTtcbiAgICAgIGV4cGVjdChlcnJvclRleHQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgcmVuZGVyIGVycm9yIHdoZW4gbm8gZXJyb3IgcHJvcCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgZXJyb3I6IG51bGwgfSk7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnbWFyay1sYWJlbC1lcnJvcicpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2F1dG9Gb2N1cyBoYW5kbGluZycsICgpID0+IHtcbiAgICBpdCgnaGFuZGxlcyBhdXRvRm9jdXMgcHJvcCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9uQXV0b0ZvY3VzVXNlZCA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IHsgcmVyZW5kZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgIG9uQXV0b0ZvY3VzVXNlZCxcbiAgICAgIH0pO1xuXG4gICAgICByZXJlbmRlcihcbiAgICAgICAgPFRoZW1lUHJvdmlkZXIgdGhlbWU9e3RoZW1lfT5cbiAgICAgICAgICA8c3ZnPlxuICAgICAgICAgICAgPFRpY2tDb21wb25lbnRcbiAgICAgICAgICAgICAgey4uLntcbiAgICAgICAgICAgICAgICBncmFwaFByb3BzOiBncmFwaFByb3BzKCksXG4gICAgICAgICAgICAgICAgeEJhbmQ6IGNyZWF0ZUJhbmRTY2FsZShbJ2EnLCAnYicsICdjJ10sIFswLCA0MDBdKSxcbiAgICAgICAgICAgICAgICBjYXRlZ29yaWVzOiBkZWZhdWx0Q2F0ZWdvcmllcyxcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogJzAtQ2F0ZWdvcnkgQScsXG4gICAgICAgICAgICAgICAgYmFuZFdpZHRoOiAxMDAsXG4gICAgICAgICAgICAgICAgYmFyV2lkdGg6IDEwMCxcbiAgICAgICAgICAgICAgICB4OiA1MCxcbiAgICAgICAgICAgICAgICB5OiA1MCxcbiAgICAgICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICAgICAgb25DaGFuZ2VDYXRlZ29yeTogamVzdC5mbigpLFxuICAgICAgICAgICAgICAgIGF1dG9Gb2N1czogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvbkF1dG9Gb2N1c1VzZWQsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L1RoZW1lUHJvdmlkZXI+LFxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KG9uQXV0b0ZvY3VzVXNlZCkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZGVmaW5lIGNoYXJ0IG1vZGUnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgaW50ZXJhY3RpdmUgY2hlY2tib3hlcyB3aGVuIGNoYW5nZUludGVyYWN0aXZlRW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGNoYXJ0aW5nT3B0aW9ucyA9IHtcbiAgICAgICAgY2hhbmdlSW50ZXJhY3RpdmU6IHsgYXV0aG9yaW5nTGFiZWw6ICdBbGxvdyBzdHVkZW50cyB0byBjaGFuZ2UnIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGRlZmluZUNoYXJ0OiB0cnVlLFxuICAgICAgICBjaGFydGluZ09wdGlvbnMsXG4gICAgICAgIGNoYW5nZUludGVyYWN0aXZlRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0dGVkVmFsdWU6ICcwLXRlc3QnLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRleHQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigndGV4dCcpO1xuICAgICAgZXhwZWN0KHRleHQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBlZGl0YWJsZSBjaGVja2JveGVzIHdoZW4gY2hhbmdlRWRpdGFibGVFbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2hhcnRpbmdPcHRpb25zID0ge1xuICAgICAgICBjaGFuZ2VFZGl0YWJsZTogeyBhdXRob3JpbmdMYWJlbDogJ0FsbG93IGxhYmVsIGVkaXRpbmcnIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGRlZmluZUNoYXJ0OiB0cnVlLFxuICAgICAgICBjaGFydGluZ09wdGlvbnMsXG4gICAgICAgIGNoYW5nZUVkaXRhYmxlRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0dGVkVmFsdWU6ICcwLXRlc3QnLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRleHQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigndGV4dCcpO1xuICAgICAgZXhwZWN0KHRleHQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3BsaXRzIGxvbmcgYXV0aG9yaW5nIGxhYmVscycsICgpID0+IHtcbiAgICAgIGNvbnN0IGNoYXJ0aW5nT3B0aW9ucyA9IHtcbiAgICAgICAgY2hhbmdlSW50ZXJhY3RpdmU6IHsgYXV0aG9yaW5nTGFiZWw6ICdUaGlzIGlzIGEgdmVyeSBsb25nIGxhYmVsIHRoYXQgbmVlZHMgdG8gYmUgc3BsaXQnIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGRlZmluZUNoYXJ0OiB0cnVlLFxuICAgICAgICBjaGFydGluZ09wdGlvbnMsXG4gICAgICAgIGNoYW5nZUludGVyYWN0aXZlRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0dGVkVmFsdWU6ICcwLXRlc3QnLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRzcGFucyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCd0c3BhbicpO1xuICAgICAgZXhwZWN0KHRzcGFucy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigxKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2VkZ2UgY2FzZXMnLCAoKSA9PiB7XG4gICAgaXQoJ2hhbmRsZXMgbWlzc2luZyBjYXRlZ29yeScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjYXRlZ29yaWVzOiBbXSxcbiAgICAgICAgZm9ybWF0dGVkVmFsdWU6ICcwLW1pc3NpbmcnLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgaW52YWxpZCBmb3JtYXR0ZWRWYWx1ZSBmb3JtYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZm9ybWF0dGVkVmFsdWU6ICdpbnZhbGlkJyxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIG1pc3NpbmcgZ3JhcGhQcm9wcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBncmFwaFByb3BzOiBudWxsLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgemVybyBiYXJXaWR0aCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBiYXJXaWR0aDogMCxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIG5lZ2F0aXZlIGNvb3JkaW5hdGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIHg6IC0xMCxcbiAgICAgICAgeTogLTIwLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29tcG9uZW50RGlkVXBkYXRlJywgKCkgPT4ge1xuICAgIGl0KCdjYWxscyBvbkF1dG9Gb2N1c1VzZWQgd2hlbiBhdXRvRm9jdXMgY2hhbmdlcyB0byB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb25BdXRvRm9jdXNVc2VkID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IFRpY2tDb21wb25lbnQoe1xuICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICBvbkF1dG9Gb2N1c1VzZWQsXG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50LmNvbXBvbmVudERpZFVwZGF0ZSh7IGF1dG9Gb2N1czogZmFsc2UgfSk7XG4gICAgICBleHBlY3Qob25BdXRvRm9jdXNVc2VkKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuXG4gICAgICBjb21wb25lbnQucHJvcHMgPSB7IGF1dG9Gb2N1czogdHJ1ZSwgb25BdXRvRm9jdXNVc2VkIH07XG4gICAgICBjb21wb25lbnQuY29tcG9uZW50RGlkVXBkYXRlKHsgYXV0b0ZvY3VzOiBmYWxzZSB9KTtcbiAgICAgIGV4cGVjdChvbkF1dG9Gb2N1c1VzZWQpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLEtBQUEsR0FBQUMsdUJBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQUFzRCxJQUFBTSxTQUFBO0VBQUFDLFVBQUE7QUFBQSxTQUFBSCx3QkFBQUksQ0FBQSxFQUFBQyxDQUFBLDZCQUFBQyxPQUFBLE1BQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFB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