@pie-lib/config-ui 12.0.0-next.0 → 12.1.0-next.0

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 (60) hide show
  1. package/lib/__tests__/alert-dialog.test.js +262 -0
  2. package/lib/__tests__/checkbox.test.js +227 -0
  3. package/lib/__tests__/choice-utils.test.js +14 -0
  4. package/lib/__tests__/form-section.test.js +252 -0
  5. package/lib/__tests__/help.test.js +270 -0
  6. package/lib/__tests__/input.test.js +268 -0
  7. package/lib/__tests__/langs.test.js +541 -0
  8. package/lib/__tests__/number-text-field-custom.test.js +362 -0
  9. package/lib/__tests__/number-text-field.test.js +421 -0
  10. package/lib/__tests__/radio-with-label.test.js +233 -0
  11. package/lib/__tests__/settings-panel.test.js +184 -0
  12. package/lib/__tests__/settings.test.js +653 -0
  13. package/lib/__tests__/tabs.test.js +211 -0
  14. package/lib/__tests__/two-choice.test.js +124 -0
  15. package/lib/__tests__/with-stateful-model.test.js +221 -0
  16. package/lib/alert-dialog.js +1 -1
  17. package/lib/checkbox.js +1 -1
  18. package/lib/choice-configuration/__tests__/feedback-menu.test.js +287 -0
  19. package/lib/choice-configuration/__tests__/index.test.js +253 -0
  20. package/lib/choice-configuration/feedback-menu.js +1 -1
  21. package/lib/choice-configuration/index.js +3 -3
  22. package/lib/choice-configuration/index.js.map +1 -1
  23. package/lib/choice-utils.js +1 -1
  24. package/lib/feedback-config/__tests__/feedback-config.test.js +201 -0
  25. package/lib/feedback-config/__tests__/feedback-selector.test.js +177 -0
  26. package/lib/feedback-config/feedback-selector.js +3 -3
  27. package/lib/feedback-config/feedback-selector.js.map +1 -1
  28. package/lib/feedback-config/group.js +1 -1
  29. package/lib/feedback-config/index.js +1 -1
  30. package/lib/form-section.js +1 -1
  31. package/lib/help.js +1 -1
  32. package/lib/index.js +1 -1
  33. package/lib/input.js +1 -1
  34. package/lib/inputs.js +1 -1
  35. package/lib/langs.js +1 -1
  36. package/lib/layout/__tests__/config.layout.test.js +70 -0
  37. package/lib/layout/__tests__/layout-content.test.js +6 -0
  38. package/lib/layout/config-layout.js +1 -1
  39. package/lib/layout/index.js +1 -1
  40. package/lib/layout/layout-contents.js +1 -1
  41. package/lib/layout/settings-box.js +1 -1
  42. package/lib/mui-box/index.js +1 -1
  43. package/lib/number-text-field-custom.js +1 -1
  44. package/lib/number-text-field.js +1 -1
  45. package/lib/radio-with-label.js +1 -1
  46. package/lib/settings/display-size.js +1 -1
  47. package/lib/settings/index.js +1 -1
  48. package/lib/settings/panel.js +1 -1
  49. package/lib/settings/settings-radio-label.js +1 -1
  50. package/lib/settings/toggle.js +1 -1
  51. package/lib/tabs/index.js +1 -1
  52. package/lib/tags-input/__tests__/index.test.js +183 -0
  53. package/lib/tags-input/index.js +1 -1
  54. package/lib/two-choice.js +1 -1
  55. package/lib/with-stateful-model.js +1 -1
  56. package/package.json +5 -13
  57. package/src/choice-configuration/__tests__/index.test.jsx +1 -1
  58. package/src/choice-configuration/index.jsx +68 -75
  59. package/src/feedback-config/__tests__/feedback-selector.test.jsx +3 -13
  60. package/src/feedback-config/feedback-selector.jsx +3 -7
@@ -0,0 +1,653 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
5
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
6
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _react2 = require("@testing-library/react");
9
+ var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
10
+ var _toggle = _interopRequireDefault(require("../settings/toggle"));
11
+ var _displaySize = _interopRequireDefault(require("../settings/display-size"));
12
+ var _settingsRadioLabel = _interopRequireDefault(require("../settings/settings-radio-label"));
13
+ var _panel = require("../settings/panel");
14
+ describe('Settings Components', function () {
15
+ describe('Toggle', function () {
16
+ it('renders toggle with label', function () {
17
+ var toggle = jest.fn();
18
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toggle["default"], {
19
+ label: "Enable Feature",
20
+ checked: false,
21
+ toggle: toggle
22
+ }));
23
+ expect(_react2.screen.getByText('Enable Feature')).toBeInTheDocument();
24
+ });
25
+ });
26
+ describe('DisplaySize', function () {
27
+ var defaultProps = {
28
+ size: {
29
+ width: 500,
30
+ height: 400
31
+ },
32
+ label: 'Display Size',
33
+ onChange: jest.fn()
34
+ };
35
+ beforeEach(function () {
36
+ jest.clearAllMocks();
37
+ });
38
+ it('renders label and input fields', function () {
39
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], defaultProps));
40
+ expect(_react2.screen.getByText('Display Size')).toBeInTheDocument();
41
+ expect(_react2.screen.getByLabelText('Width')).toBeInTheDocument();
42
+ expect(_react2.screen.getByLabelText('Height')).toBeInTheDocument();
43
+ });
44
+ it('displays width and height values', function () {
45
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], defaultProps));
46
+ var widthInput = _react2.screen.getByLabelText('Width');
47
+ var heightInput = _react2.screen.getByLabelText('Height');
48
+ expect(widthInput).toHaveValue(500);
49
+ expect(heightInput).toHaveValue(400);
50
+ });
51
+ it('calls onChange when width changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
52
+ var user, onChange, widthInput;
53
+ return _regenerator["default"].wrap(function (_context) {
54
+ while (1) switch (_context.prev = _context.next) {
55
+ case 0:
56
+ user = _userEvent["default"].setup();
57
+ onChange = jest.fn();
58
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
59
+ onChange: onChange
60
+ })));
61
+ widthInput = _react2.screen.getByLabelText('Width');
62
+ _context.next = 1;
63
+ return user.clear(widthInput);
64
+ case 1:
65
+ _context.next = 2;
66
+ return user.type(widthInput, '600');
67
+ case 2:
68
+ _react2.fireEvent.blur(widthInput);
69
+ expect(onChange).toHaveBeenCalledWith(expect.objectContaining({
70
+ width: 600
71
+ }));
72
+ case 3:
73
+ case "end":
74
+ return _context.stop();
75
+ }
76
+ }, _callee);
77
+ })));
78
+ it('calls onChange when height changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
79
+ var user, onChange, heightInput;
80
+ return _regenerator["default"].wrap(function (_context2) {
81
+ while (1) switch (_context2.prev = _context2.next) {
82
+ case 0:
83
+ user = _userEvent["default"].setup();
84
+ onChange = jest.fn();
85
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
86
+ onChange: onChange
87
+ })));
88
+ heightInput = _react2.screen.getByLabelText('Height');
89
+ _context2.next = 1;
90
+ return user.clear(heightInput);
91
+ case 1:
92
+ _context2.next = 2;
93
+ return user.type(heightInput, '500');
94
+ case 2:
95
+ _react2.fireEvent.blur(heightInput);
96
+ expect(onChange).toHaveBeenCalledWith(expect.objectContaining({
97
+ height: 500
98
+ }));
99
+ case 3:
100
+ case "end":
101
+ return _context2.stop();
102
+ }
103
+ }, _callee2);
104
+ })));
105
+ it('maintains other dimension when one changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
106
+ var user, onChange, widthInput;
107
+ return _regenerator["default"].wrap(function (_context3) {
108
+ while (1) switch (_context3.prev = _context3.next) {
109
+ case 0:
110
+ user = _userEvent["default"].setup();
111
+ onChange = jest.fn();
112
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
113
+ onChange: onChange
114
+ })));
115
+ widthInput = _react2.screen.getByLabelText('Width');
116
+ _context3.next = 1;
117
+ return user.clear(widthInput);
118
+ case 1:
119
+ _context3.next = 2;
120
+ return user.type(widthInput, '700');
121
+ case 2:
122
+ _react2.fireEvent.blur(widthInput);
123
+ expect(onChange).toHaveBeenCalledWith({
124
+ width: 700,
125
+ height: 400
126
+ });
127
+ case 3:
128
+ case "end":
129
+ return _context3.stop();
130
+ }
131
+ }, _callee3);
132
+ })));
133
+ it('enforces min value constraint', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4() {
134
+ var user, onChange, widthInput;
135
+ return _regenerator["default"].wrap(function (_context4) {
136
+ while (1) switch (_context4.prev = _context4.next) {
137
+ case 0:
138
+ user = _userEvent["default"].setup();
139
+ onChange = jest.fn();
140
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
141
+ onChange: onChange
142
+ })));
143
+ widthInput = _react2.screen.getByLabelText('Width');
144
+ _context4.next = 1;
145
+ return user.clear(widthInput);
146
+ case 1:
147
+ _context4.next = 2;
148
+ return user.type(widthInput, '100');
149
+ case 2:
150
+ _react2.fireEvent.blur(widthInput);
151
+
152
+ // Should clamp to minimum 150
153
+ expect(widthInput).toHaveValue(150);
154
+ case 3:
155
+ case "end":
156
+ return _context4.stop();
157
+ }
158
+ }, _callee4);
159
+ })));
160
+ it('enforces max value constraint', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5() {
161
+ var user, onChange, widthInput;
162
+ return _regenerator["default"].wrap(function (_context5) {
163
+ while (1) switch (_context5.prev = _context5.next) {
164
+ case 0:
165
+ user = _userEvent["default"].setup();
166
+ onChange = jest.fn();
167
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
168
+ onChange: onChange
169
+ })));
170
+ widthInput = _react2.screen.getByLabelText('Width');
171
+ _context5.next = 1;
172
+ return user.clear(widthInput);
173
+ case 1:
174
+ _context5.next = 2;
175
+ return user.type(widthInput, '2000');
176
+ case 2:
177
+ _react2.fireEvent.blur(widthInput);
178
+
179
+ // Should clamp to maximum 1000
180
+ expect(widthInput).toHaveValue(1000);
181
+ case 3:
182
+ case "end":
183
+ return _context5.stop();
184
+ }
185
+ }, _callee5);
186
+ })));
187
+ it('updates when size prop changes', function () {
188
+ var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], defaultProps)),
189
+ rerender = _render.rerender;
190
+ var widthInput = _react2.screen.getByLabelText('Width');
191
+ expect(widthInput).toHaveValue(500);
192
+ rerender(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
193
+ size: {
194
+ width: 800,
195
+ height: 600
196
+ }
197
+ })));
198
+ widthInput = _react2.screen.getByLabelText('Width');
199
+ expect(widthInput).toHaveValue(800);
200
+ });
201
+ it('handles boundary values at minimum', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6() {
202
+ var user, onChange, widthInput, heightInput;
203
+ return _regenerator["default"].wrap(function (_context6) {
204
+ while (1) switch (_context6.prev = _context6.next) {
205
+ case 0:
206
+ user = _userEvent["default"].setup();
207
+ onChange = jest.fn();
208
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
209
+ onChange: onChange
210
+ })));
211
+ widthInput = _react2.screen.getByLabelText('Width');
212
+ heightInput = _react2.screen.getByLabelText('Height');
213
+ _context6.next = 1;
214
+ return user.clear(widthInput);
215
+ case 1:
216
+ _context6.next = 2;
217
+ return user.type(widthInput, '150');
218
+ case 2:
219
+ _react2.fireEvent.blur(widthInput);
220
+ _context6.next = 3;
221
+ return user.clear(heightInput);
222
+ case 3:
223
+ _context6.next = 4;
224
+ return user.type(heightInput, '150');
225
+ case 4:
226
+ _react2.fireEvent.blur(heightInput);
227
+ expect(widthInput).toHaveValue(150);
228
+ expect(heightInput).toHaveValue(150);
229
+ case 5:
230
+ case "end":
231
+ return _context6.stop();
232
+ }
233
+ }, _callee6);
234
+ })));
235
+ it('handles boundary values at maximum', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7() {
236
+ var user, onChange, widthInput, heightInput;
237
+ return _regenerator["default"].wrap(function (_context7) {
238
+ while (1) switch (_context7.prev = _context7.next) {
239
+ case 0:
240
+ user = _userEvent["default"].setup();
241
+ onChange = jest.fn();
242
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
243
+ onChange: onChange
244
+ })));
245
+ widthInput = _react2.screen.getByLabelText('Width');
246
+ heightInput = _react2.screen.getByLabelText('Height');
247
+ _context7.next = 1;
248
+ return user.clear(widthInput);
249
+ case 1:
250
+ _context7.next = 2;
251
+ return user.type(widthInput, '1000');
252
+ case 2:
253
+ _react2.fireEvent.blur(widthInput);
254
+ _context7.next = 3;
255
+ return user.clear(heightInput);
256
+ case 3:
257
+ _context7.next = 4;
258
+ return user.type(heightInput, '1000');
259
+ case 4:
260
+ _react2.fireEvent.blur(heightInput);
261
+ expect(widthInput).toHaveValue(1000);
262
+ expect(heightInput).toHaveValue(1000);
263
+ case 5:
264
+ case "end":
265
+ return _context7.stop();
266
+ }
267
+ }, _callee7);
268
+ })));
269
+ it('handles decimal input values', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee8() {
270
+ var user, onChange, widthInput;
271
+ return _regenerator["default"].wrap(function (_context8) {
272
+ while (1) switch (_context8.prev = _context8.next) {
273
+ case 0:
274
+ user = _userEvent["default"].setup();
275
+ onChange = jest.fn();
276
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
277
+ onChange: onChange
278
+ })));
279
+ widthInput = _react2.screen.getByLabelText('Width');
280
+ _context8.next = 1;
281
+ return user.clear(widthInput);
282
+ case 1:
283
+ _context8.next = 2;
284
+ return user.type(widthInput, '500.5');
285
+ case 2:
286
+ _react2.fireEvent.blur(widthInput);
287
+ expect(widthInput).toBeInTheDocument();
288
+ case 3:
289
+ case "end":
290
+ return _context8.stop();
291
+ }
292
+ }, _callee8);
293
+ })));
294
+ it('handles empty input and resets to min', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee9() {
295
+ var user, onChange, widthInput;
296
+ return _regenerator["default"].wrap(function (_context9) {
297
+ while (1) switch (_context9.prev = _context9.next) {
298
+ case 0:
299
+ user = _userEvent["default"].setup();
300
+ onChange = jest.fn();
301
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
302
+ onChange: onChange
303
+ })));
304
+ widthInput = _react2.screen.getByLabelText('Width');
305
+ _context9.next = 1;
306
+ return user.clear(widthInput);
307
+ case 1:
308
+ _react2.fireEvent.blur(widthInput);
309
+
310
+ // Should reset to minimum value
311
+ expect(widthInput).toHaveValue(150);
312
+ case 2:
313
+ case "end":
314
+ return _context9.stop();
315
+ }
316
+ }, _callee9);
317
+ })));
318
+ it('handles rapid width and height changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee0() {
319
+ var user, onChange, widthInput;
320
+ return _regenerator["default"].wrap(function (_context0) {
321
+ while (1) switch (_context0.prev = _context0.next) {
322
+ case 0:
323
+ user = _userEvent["default"].setup();
324
+ onChange = jest.fn();
325
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
326
+ onChange: onChange
327
+ })));
328
+ widthInput = _react2.screen.getByLabelText('Width');
329
+ _context0.next = 1;
330
+ return user.clear(widthInput);
331
+ case 1:
332
+ _context0.next = 2;
333
+ return user.type(widthInput, '6');
334
+ case 2:
335
+ _context0.next = 3;
336
+ return user.type(widthInput, '0');
337
+ case 3:
338
+ _context0.next = 4;
339
+ return user.type(widthInput, '0');
340
+ case 4:
341
+ _react2.fireEvent.blur(widthInput);
342
+ expect(onChange).toHaveBeenCalled();
343
+ case 5:
344
+ case "end":
345
+ return _context0.stop();
346
+ }
347
+ }, _callee0);
348
+ })));
349
+ it('clamps height at both boundaries', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee1() {
350
+ var user, onChange, heightInput;
351
+ return _regenerator["default"].wrap(function (_context1) {
352
+ while (1) switch (_context1.prev = _context1.next) {
353
+ case 0:
354
+ user = _userEvent["default"].setup();
355
+ onChange = jest.fn();
356
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], (0, _extends2["default"])({}, defaultProps, {
357
+ onChange: onChange
358
+ })));
359
+ heightInput = _react2.screen.getByLabelText('Height'); // Test below min
360
+ _context1.next = 1;
361
+ return user.clear(heightInput);
362
+ case 1:
363
+ _context1.next = 2;
364
+ return user.type(heightInput, '50');
365
+ case 2:
366
+ _react2.fireEvent.blur(heightInput);
367
+ expect(heightInput).toHaveValue(150);
368
+
369
+ // Test above max
370
+ _context1.next = 3;
371
+ return user.clear(heightInput);
372
+ case 3:
373
+ _context1.next = 4;
374
+ return user.type(heightInput, '2500');
375
+ case 4:
376
+ _react2.fireEvent.blur(heightInput);
377
+ expect(heightInput).toHaveValue(1000);
378
+ case 5:
379
+ case "end":
380
+ return _context1.stop();
381
+ }
382
+ }, _callee1);
383
+ })));
384
+ it('displays custom label text', function () {
385
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], {
386
+ size: {
387
+ width: 500,
388
+ height: 400
389
+ },
390
+ label: "Custom Size Settings",
391
+ onChange: jest.fn()
392
+ }));
393
+ expect(_react2.screen.getByText('Custom Size Settings')).toBeInTheDocument();
394
+ });
395
+ it('renders with variant outlined', function () {
396
+ var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_displaySize["default"], defaultProps)),
397
+ container = _render2.container;
398
+ var inputs = container.querySelectorAll('input');
399
+ expect(inputs.length).toBe(2);
400
+ });
401
+ });
402
+ describe('SettingsRadioLabel', function () {
403
+ it('renders radio label', function () {
404
+ var onChange = jest.fn();
405
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_settingsRadioLabel["default"], {
406
+ label: "Option 1",
407
+ value: "option1",
408
+ checked: false,
409
+ onChange: onChange
410
+ }));
411
+ expect(_react2.screen.getByText('Option 1')).toBeInTheDocument();
412
+ expect(_react2.screen.getByRole('radio')).toBeInTheDocument();
413
+ });
414
+ it('renders checked state', function () {
415
+ var onChange = jest.fn();
416
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_settingsRadioLabel["default"], {
417
+ label: "Option 1",
418
+ value: "option1",
419
+ checked: true,
420
+ onChange: onChange
421
+ }));
422
+ var radio = _react2.screen.getByRole('radio');
423
+ expect(radio).toBeChecked();
424
+ });
425
+ it('renders unchecked state', function () {
426
+ var onChange = jest.fn();
427
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_settingsRadioLabel["default"], {
428
+ label: "Option 1",
429
+ value: "option1",
430
+ checked: false,
431
+ onChange: onChange
432
+ }));
433
+ var radio = _react2.screen.getByRole('radio');
434
+ expect(radio).not.toBeChecked();
435
+ });
436
+ it('calls onChange when radio is clicked', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee10() {
437
+ var user, onChange, radio;
438
+ return _regenerator["default"].wrap(function (_context10) {
439
+ while (1) switch (_context10.prev = _context10.next) {
440
+ case 0:
441
+ user = _userEvent["default"].setup();
442
+ onChange = jest.fn();
443
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_settingsRadioLabel["default"], {
444
+ label: "Option 1",
445
+ value: "option1",
446
+ checked: false,
447
+ onChange: onChange
448
+ }));
449
+ radio = _react2.screen.getByRole('radio');
450
+ _context10.next = 1;
451
+ return user.click(radio);
452
+ case 1:
453
+ expect(onChange).toHaveBeenCalled();
454
+ case 2:
455
+ case "end":
456
+ return _context10.stop();
457
+ }
458
+ }, _callee10);
459
+ })));
460
+ it('displays label text correctly', function () {
461
+ var onChange = jest.fn();
462
+ var labelText = 'Custom Option Label';
463
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_settingsRadioLabel["default"], {
464
+ label: labelText,
465
+ value: "custom",
466
+ checked: false,
467
+ onChange: onChange
468
+ }));
469
+ expect(_react2.screen.getByText(labelText)).toBeInTheDocument();
470
+ });
471
+ });
472
+ describe('Panel', function () {
473
+ var defaultProps = {
474
+ model: {
475
+ toggleSetting: true,
476
+ numberValue: 5
477
+ },
478
+ configuration: {
479
+ configValue: 'test'
480
+ },
481
+ groups: {
482
+ 'General Settings': {
483
+ toggleSetting: {
484
+ type: 'toggle',
485
+ label: 'Enable Feature'
486
+ }
487
+ }
488
+ },
489
+ onChangeModel: jest.fn(),
490
+ onChangeConfiguration: jest.fn()
491
+ };
492
+ beforeEach(function () {
493
+ jest.clearAllMocks();
494
+ });
495
+ it('renders panel with group label', function () {
496
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, defaultProps));
497
+ expect(_react2.screen.getByText('General Settings')).toBeInTheDocument();
498
+ });
499
+ it('renders empty when groups is undefined', function () {
500
+ var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, (0, _extends2["default"])({}, defaultProps, {
501
+ groups: undefined
502
+ }))),
503
+ container = _render3.container;
504
+ expect(container.firstChild.children.length).toBe(0);
505
+ });
506
+ it('renders empty when groups is empty', function () {
507
+ var _render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, (0, _extends2["default"])({}, defaultProps, {
508
+ groups: {}
509
+ }))),
510
+ container = _render4.container;
511
+ expect(container.firstChild.children.length).toBe(0);
512
+ });
513
+ it('calls onChangeModel when model changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee11() {
514
+ var user, onChangeModel, _render5, container, switchElement;
515
+ return _regenerator["default"].wrap(function (_context11) {
516
+ while (1) switch (_context11.prev = _context11.next) {
517
+ case 0:
518
+ user = _userEvent["default"].setup();
519
+ onChangeModel = jest.fn();
520
+ _render5 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, (0, _extends2["default"])({}, defaultProps, {
521
+ onChangeModel: onChangeModel
522
+ }))), container = _render5.container;
523
+ switchElement = container.querySelector('input[type="checkbox"]');
524
+ _context11.next = 1;
525
+ return user.click(switchElement);
526
+ case 1:
527
+ expect(onChangeModel).toHaveBeenCalled();
528
+ case 2:
529
+ case "end":
530
+ return _context11.stop();
531
+ }
532
+ }, _callee11);
533
+ })));
534
+ it('calls onChangeConfiguration when configuration changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee12() {
535
+ var user, onChangeConfiguration, _render6, container, switchElement;
536
+ return _regenerator["default"].wrap(function (_context12) {
537
+ while (1) switch (_context12.prev = _context12.next) {
538
+ case 0:
539
+ user = _userEvent["default"].setup();
540
+ onChangeConfiguration = jest.fn();
541
+ _render6 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, (0, _extends2["default"])({}, defaultProps, {
542
+ groups: {
543
+ 'Config Group': {
544
+ configValue: {
545
+ type: 'toggle',
546
+ label: 'Config Toggle',
547
+ isConfigProperty: true
548
+ }
549
+ }
550
+ },
551
+ onChangeConfiguration: onChangeConfiguration
552
+ }))), container = _render6.container;
553
+ switchElement = container.querySelector('input[type="checkbox"]');
554
+ _context12.next = 1;
555
+ return user.click(switchElement);
556
+ case 1:
557
+ expect(onChangeConfiguration).toHaveBeenCalled();
558
+ case 2:
559
+ case "end":
560
+ return _context12.stop();
561
+ }
562
+ }, _callee12);
563
+ })));
564
+ it('renders with modal when provided', function () {
565
+ var modal = /*#__PURE__*/_react["default"].createElement("div", {
566
+ "data-testid": "test-modal"
567
+ }, "Modal Content");
568
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, (0, _extends2["default"])({}, defaultProps, {
569
+ modal: modal
570
+ })));
571
+ expect(_react2.screen.getByTestId('test-modal')).toBeInTheDocument();
572
+ expect(_react2.screen.getByText('Modal Content')).toBeInTheDocument();
573
+ });
574
+ it('renders multiple groups', function () {
575
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, (0, _extends2["default"])({}, defaultProps, {
576
+ groups: {
577
+ 'Group One': {
578
+ setting1: {
579
+ type: 'toggle',
580
+ label: 'Setting One'
581
+ }
582
+ },
583
+ 'Group Two': {
584
+ setting2: {
585
+ type: 'toggle',
586
+ label: 'Setting Two'
587
+ }
588
+ }
589
+ },
590
+ model: {
591
+ setting1: true,
592
+ setting2: false
593
+ }
594
+ })));
595
+ expect(_react2.screen.getByText('Group One')).toBeInTheDocument();
596
+ expect(_react2.screen.getByText('Group Two')).toBeInTheDocument();
597
+ });
598
+ it('uses default callbacks when not provided', function () {
599
+ var _render7 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, {
600
+ model: {
601
+ test: true
602
+ },
603
+ groups: {
604
+ 'Test Group': {
605
+ test: {
606
+ type: 'toggle',
607
+ label: 'Test'
608
+ }
609
+ }
610
+ }
611
+ })),
612
+ container = _render7.container;
613
+ expect(container.firstChild).toBeInTheDocument();
614
+ });
615
+ it('filters out empty groups', function () {
616
+ var _render8 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, (0, _extends2["default"])({}, defaultProps, {
617
+ groups: {
618
+ 'Empty Group': {},
619
+ 'General Settings': {
620
+ toggleSetting: {
621
+ type: 'toggle',
622
+ label: 'Enable Feature'
623
+ }
624
+ }
625
+ },
626
+ model: {
627
+ toggleSetting: true
628
+ }
629
+ }))),
630
+ container = _render8.container;
631
+ expect(_react2.screen.getByText('General Settings')).toBeInTheDocument();
632
+ expect(_react2.screen.queryByText('Empty Group')).not.toBeInTheDocument();
633
+ });
634
+ it('renders with null model', function () {
635
+ var _render9 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_panel.Panel, {
636
+ model: null,
637
+ configuration: {},
638
+ groups: {
639
+ 'General Settings': {
640
+ toggleSetting: {
641
+ type: 'toggle',
642
+ label: 'Enable Feature'
643
+ }
644
+ }
645
+ },
646
+ onChangeModel: jest.fn()
647
+ })),
648
+ container = _render9.container;
649
+ expect(_react2.screen.getByText('General Settings')).toBeInTheDocument();
650
+ });
651
+ });
652
+ });
653
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfdXNlckV2ZW50IiwiX3RvZ2dsZSIsIl9kaXNwbGF5U2l6ZSIsIl9zZXR0aW5nc1JhZGlvTGFiZWwiLCJfcGFuZWwiLCJkZXNjcmliZSIsIml0IiwidG9nZ2xlIiwiamVzdCIsImZuIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsImxhYmVsIiwiY2hlY2tlZCIsImV4cGVjdCIsInNjcmVlbiIsImdldEJ5VGV4dCIsInRvQmVJblRoZURvY3VtZW50IiwiZGVmYXVsdFByb3BzIiwic2l6ZSIsIndpZHRoIiwiaGVpZ2h0Iiwib25DaGFuZ2UiLCJiZWZvcmVFYWNoIiwiY2xlYXJBbGxNb2NrcyIsImdldEJ5TGFiZWxUZXh0Iiwid2lkdGhJbnB1dCIsImhlaWdodElucHV0IiwidG9IYXZlVmFsdWUiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsInVzZXIiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsInVzZXJFdmVudCIsInNldHVwIiwiX2V4dGVuZHMyIiwiY2xlYXIiLCJ0eXBlIiwiZmlyZUV2ZW50IiwiYmx1ciIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwib2JqZWN0Q29udGFpbmluZyIsInN0b3AiLCJfY2FsbGVlMiIsIl9jb250ZXh0MiIsIl9jYWxsZWUzIiwiX2NvbnRleHQzIiwiX2NhbGxlZTQiLCJfY29udGV4dDQiLCJfY2FsbGVlNSIsIl9jb250ZXh0NSIsIl9yZW5kZXIiLCJyZXJlbmRlciIsIl9jYWxsZWU2IiwiX2NvbnRleHQ2IiwiX2NhbGxlZTciLCJfY29udGV4dDciLCJfY2FsbGVlOCIsIl9jb250ZXh0OCIsIl9jYWxsZWU5IiwiX2NvbnRleHQ5IiwiX2NhbGxlZTAiLCJfY29udGV4dDAiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwiX2NhbGxlZTEiLCJfY29udGV4dDEiLCJfcmVuZGVyMiIsImNvbnRhaW5lciIsImlucHV0cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJsZW5ndGgiLCJ0b0JlIiwidmFsdWUiLCJnZXRCeVJvbGUiLCJyYWRpbyIsInRvQmVDaGVja2VkIiwibm90IiwiX2NhbGxlZTEwIiwiX2NvbnRleHQxMCIsImNsaWNrIiwibGFiZWxUZXh0IiwibW9kZWwiLCJ0b2dnbGVTZXR0aW5nIiwibnVtYmVyVmFsdWUiLCJjb25maWd1cmF0aW9uIiwiY29uZmlnVmFsdWUiLCJncm91cHMiLCJvbkNoYW5nZU1vZGVsIiwib25DaGFuZ2VDb25maWd1cmF0aW9uIiwiUGFuZWwiLCJfcmVuZGVyMyIsInVuZGVmaW5lZCIsImZpcnN0Q2hpbGQiLCJjaGlsZHJlbiIsIl9yZW5kZXI0IiwiX2NhbGxlZTExIiwiX3JlbmRlcjUiLCJzd2l0Y2hFbGVtZW50IiwiX2NvbnRleHQxMSIsInF1ZXJ5U2VsZWN0b3IiLCJfY2FsbGVlMTIiLCJfcmVuZGVyNiIsIl9jb250ZXh0MTIiLCJpc0NvbmZpZ1Byb3BlcnR5IiwibW9kYWwiLCJnZXRCeVRlc3RJZCIsInNldHRpbmcxIiwic2V0dGluZzIiLCJfcmVuZGVyNyIsInRlc3QiLCJfcmVuZGVyOCIsInF1ZXJ5QnlUZXh0IiwiX3JlbmRlcjkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL3NldHRpbmdzLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXIsIHNjcmVlbiwgZmlyZUV2ZW50IH0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5pbXBvcnQgdXNlckV2ZW50IGZyb20gJ0B0ZXN0aW5nLWxpYnJhcnkvdXNlci1ldmVudCc7XG5pbXBvcnQgVG9nZ2xlIGZyb20gJy4uL3NldHRpbmdzL3RvZ2dsZSc7XG5pbXBvcnQgRGlzcGxheVNpemUgZnJvbSAnLi4vc2V0dGluZ3MvZGlzcGxheS1zaXplJztcbmltcG9ydCBTZXR0aW5nc1JhZGlvTGFiZWwgZnJvbSAnLi4vc2V0dGluZ3Mvc2V0dGluZ3MtcmFkaW8tbGFiZWwnO1xuaW1wb3J0IHsgUGFuZWwgfSBmcm9tICcuLi9zZXR0aW5ncy9wYW5lbCc7XG5cbmRlc2NyaWJlKCdTZXR0aW5ncyBDb21wb25lbnRzJywgKCkgPT4ge1xuICBkZXNjcmliZSgnVG9nZ2xlJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHRvZ2dsZSB3aXRoIGxhYmVsJywgKCkgPT4ge1xuICAgICAgY29uc3QgdG9nZ2xlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxUb2dnbGUgbGFiZWw9XCJFbmFibGUgRmVhdHVyZVwiIGNoZWNrZWQ9e2ZhbHNlfSB0b2dnbGU9e3RvZ2dsZX0gLz4pO1xuXG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnRW5hYmxlIEZlYXR1cmUnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Rpc3BsYXlTaXplJywgKCkgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgIHNpemU6IHsgd2lkdGg6IDUwMCwgaGVpZ2h0OiA0MDAgfSxcbiAgICAgIGxhYmVsOiAnRGlzcGxheSBTaXplJyxcbiAgICAgIG9uQ2hhbmdlOiBqZXN0LmZuKCksXG4gICAgfTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBsYWJlbCBhbmQgaW5wdXQgZmllbGRzJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG5cbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdEaXNwbGF5IFNpemUnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ1dpZHRoJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdIZWlnaHQnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkaXNwbGF5cyB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcycsICgpID0+IHtcbiAgICAgIHJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuXG4gICAgICBjb25zdCB3aWR0aElucHV0ID0gc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdXaWR0aCcpO1xuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ0hlaWdodCcpO1xuXG4gICAgICBleHBlY3Qod2lkdGhJbnB1dCkudG9IYXZlVmFsdWUoNTAwKTtcbiAgICAgIGV4cGVjdChoZWlnaHRJbnB1dCkudG9IYXZlVmFsdWUoNDAwKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIHdpZHRoIGNoYW5nZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICAgIGNvbnN0IHdpZHRoSW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ1dpZHRoJyk7XG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICc2MDAnKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKHdpZHRoSW5wdXQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgd2lkdGg6IDYwMCB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2hlbiBoZWlnaHQgY2hhbmdlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcblxuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ0hlaWdodCcpO1xuICAgICAgYXdhaXQgdXNlci5jbGVhcihoZWlnaHRJbnB1dCk7XG4gICAgICBhd2FpdCB1c2VyLnR5cGUoaGVpZ2h0SW5wdXQsICc1MDAnKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKGhlaWdodElucHV0KTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IGhlaWdodDogNTAwIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdtYWludGFpbnMgb3RoZXIgZGltZW5zaW9uIHdoZW4gb25lIGNoYW5nZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICAgIGNvbnN0IHdpZHRoSW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ1dpZHRoJyk7XG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICc3MDAnKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKHdpZHRoSW5wdXQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgICAgd2lkdGg6IDcwMCxcbiAgICAgICAgaGVpZ2h0OiA0MDAsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdlbmZvcmNlcyBtaW4gdmFsdWUgY29uc3RyYWludCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcblxuICAgICAgY29uc3Qgd2lkdGhJbnB1dCA9IHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnV2lkdGgnKTtcbiAgICAgIGF3YWl0IHVzZXIuY2xlYXIod2lkdGhJbnB1dCk7XG4gICAgICBhd2FpdCB1c2VyLnR5cGUod2lkdGhJbnB1dCwgJzEwMCcpO1xuICAgICAgZmlyZUV2ZW50LmJsdXIod2lkdGhJbnB1dCk7XG5cbiAgICAgIC8vIFNob3VsZCBjbGFtcCB0byBtaW5pbXVtIDE1MFxuICAgICAgZXhwZWN0KHdpZHRoSW5wdXQpLnRvSGF2ZVZhbHVlKDE1MCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZW5mb3JjZXMgbWF4IHZhbHVlIGNvbnN0cmFpbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICAgIGNvbnN0IHdpZHRoSW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ1dpZHRoJyk7XG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICcyMDAwJyk7XG4gICAgICBmaXJlRXZlbnQuYmx1cih3aWR0aElucHV0KTtcblxuICAgICAgLy8gU2hvdWxkIGNsYW1wIHRvIG1heGltdW0gMTAwMFxuICAgICAgZXhwZWN0KHdpZHRoSW5wdXQpLnRvSGF2ZVZhbHVlKDEwMDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3VwZGF0ZXMgd2hlbiBzaXplIHByb3AgY2hhbmdlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcmVyZW5kZXIgfSA9IHJlbmRlcig8RGlzcGxheVNpemUgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuXG4gICAgICBsZXQgd2lkdGhJbnB1dCA9IHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnV2lkdGgnKTtcbiAgICAgIGV4cGVjdCh3aWR0aElucHV0KS50b0hhdmVWYWx1ZSg1MDApO1xuXG4gICAgICByZXJlbmRlcihcbiAgICAgICAgPERpc3BsYXlTaXplIHsuLi5kZWZhdWx0UHJvcHN9IHNpemU9e3sgd2lkdGg6IDgwMCwgaGVpZ2h0OiA2MDAgfX0gLz5cbiAgICAgICk7XG5cbiAgICAgIHdpZHRoSW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ1dpZHRoJyk7XG4gICAgICBleHBlY3Qod2lkdGhJbnB1dCkudG9IYXZlVmFsdWUoODAwKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGJvdW5kYXJ5IHZhbHVlcyBhdCBtaW5pbXVtJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICByZW5kZXIoPERpc3BsYXlTaXplIHsuLi5kZWZhdWx0UHJvcHN9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gLz4pO1xuXG4gICAgICBjb25zdCB3aWR0aElucHV0ID0gc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdXaWR0aCcpO1xuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ0hlaWdodCcpO1xuXG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICcxNTAnKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKHdpZHRoSW5wdXQpO1xuXG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKGhlaWdodElucHV0KTtcbiAgICAgIGF3YWl0IHVzZXIudHlwZShoZWlnaHRJbnB1dCwgJzE1MCcpO1xuICAgICAgZmlyZUV2ZW50LmJsdXIoaGVpZ2h0SW5wdXQpO1xuXG4gICAgICBleHBlY3Qod2lkdGhJbnB1dCkudG9IYXZlVmFsdWUoMTUwKTtcbiAgICAgIGV4cGVjdChoZWlnaHRJbnB1dCkudG9IYXZlVmFsdWUoMTUwKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGJvdW5kYXJ5IHZhbHVlcyBhdCBtYXhpbXVtJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICByZW5kZXIoPERpc3BsYXlTaXplIHsuLi5kZWZhdWx0UHJvcHN9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gLz4pO1xuXG4gICAgICBjb25zdCB3aWR0aElucHV0ID0gc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdXaWR0aCcpO1xuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBzY3JlZW4uZ2V0QnlMYWJlbFRleHQoJ0hlaWdodCcpO1xuXG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICcxMDAwJyk7XG4gICAgICBmaXJlRXZlbnQuYmx1cih3aWR0aElucHV0KTtcblxuICAgICAgYXdhaXQgdXNlci5jbGVhcihoZWlnaHRJbnB1dCk7XG4gICAgICBhd2FpdCB1c2VyLnR5cGUoaGVpZ2h0SW5wdXQsICcxMDAwJyk7XG4gICAgICBmaXJlRXZlbnQuYmx1cihoZWlnaHRJbnB1dCk7XG5cbiAgICAgIGV4cGVjdCh3aWR0aElucHV0KS50b0hhdmVWYWx1ZSgxMDAwKTtcbiAgICAgIGV4cGVjdChoZWlnaHRJbnB1dCkudG9IYXZlVmFsdWUoMTAwMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBkZWNpbWFsIGlucHV0IHZhbHVlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcblxuICAgICAgY29uc3Qgd2lkdGhJbnB1dCA9IHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnV2lkdGgnKTtcbiAgICAgIGF3YWl0IHVzZXIuY2xlYXIod2lkdGhJbnB1dCk7XG4gICAgICBhd2FpdCB1c2VyLnR5cGUod2lkdGhJbnB1dCwgJzUwMC41Jyk7XG4gICAgICBmaXJlRXZlbnQuYmx1cih3aWR0aElucHV0KTtcblxuICAgICAgZXhwZWN0KHdpZHRoSW5wdXQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBlbXB0eSBpbnB1dCBhbmQgcmVzZXRzIHRvIG1pbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcblxuICAgICAgY29uc3Qgd2lkdGhJbnB1dCA9IHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnV2lkdGgnKTtcbiAgICAgIGF3YWl0IHVzZXIuY2xlYXIod2lkdGhJbnB1dCk7XG4gICAgICBmaXJlRXZlbnQuYmx1cih3aWR0aElucHV0KTtcblxuICAgICAgLy8gU2hvdWxkIHJlc2V0IHRvIG1pbmltdW0gdmFsdWVcbiAgICAgIGV4cGVjdCh3aWR0aElucHV0KS50b0hhdmVWYWx1ZSgxNTApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgcmFwaWQgd2lkdGggYW5kIGhlaWdodCBjaGFuZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICByZW5kZXIoPERpc3BsYXlTaXplIHsuLi5kZWZhdWx0UHJvcHN9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gLz4pO1xuXG4gICAgICBjb25zdCB3aWR0aElucHV0ID0gc2NyZWVuLmdldEJ5TGFiZWxUZXh0KCdXaWR0aCcpO1xuXG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKHdpZHRoSW5wdXQpO1xuICAgICAgYXdhaXQgdXNlci50eXBlKHdpZHRoSW5wdXQsICc2Jyk7XG4gICAgICBhd2FpdCB1c2VyLnR5cGUod2lkdGhJbnB1dCwgJzAnKTtcbiAgICAgIGF3YWl0IHVzZXIudHlwZSh3aWR0aElucHV0LCAnMCcpO1xuICAgICAgZmlyZUV2ZW50LmJsdXIod2lkdGhJbnB1dCk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NsYW1wcyBoZWlnaHQgYXQgYm90aCBib3VuZGFyaWVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICByZW5kZXIoPERpc3BsYXlTaXplIHsuLi5kZWZhdWx0UHJvcHN9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gLz4pO1xuXG4gICAgICBjb25zdCBoZWlnaHRJbnB1dCA9IHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnSGVpZ2h0Jyk7XG5cbiAgICAgIC8vIFRlc3QgYmVsb3cgbWluXG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKGhlaWdodElucHV0KTtcbiAgICAgIGF3YWl0IHVzZXIudHlwZShoZWlnaHRJbnB1dCwgJzUwJyk7XG4gICAgICBmaXJlRXZlbnQuYmx1cihoZWlnaHRJbnB1dCk7XG4gICAgICBleHBlY3QoaGVpZ2h0SW5wdXQpLnRvSGF2ZVZhbHVlKDE1MCk7XG5cbiAgICAgIC8vIFRlc3QgYWJvdmUgbWF4XG4gICAgICBhd2FpdCB1c2VyLmNsZWFyKGhlaWdodElucHV0KTtcbiAgICAgIGF3YWl0IHVzZXIudHlwZShoZWlnaHRJbnB1dCwgJzI1MDAnKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKGhlaWdodElucHV0KTtcbiAgICAgIGV4cGVjdChoZWlnaHRJbnB1dCkudG9IYXZlVmFsdWUoMTAwMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZGlzcGxheXMgY3VzdG9tIGxhYmVsIHRleHQnLCAoKSA9PiB7XG4gICAgICByZW5kZXIoXG4gICAgICAgIDxEaXNwbGF5U2l6ZVxuICAgICAgICAgIHNpemU9e3sgd2lkdGg6IDUwMCwgaGVpZ2h0OiA0MDAgfX1cbiAgICAgICAgICBsYWJlbD1cIkN1c3RvbSBTaXplIFNldHRpbmdzXCJcbiAgICAgICAgICBvbkNoYW5nZT17amVzdC5mbigpfVxuICAgICAgICAvPlxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ0N1c3RvbSBTaXplIFNldHRpbmdzJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIHZhcmlhbnQgb3V0bGluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxEaXNwbGF5U2l6ZSB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG5cbiAgICAgIGNvbnN0IGlucHV0cyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpO1xuICAgICAgZXhwZWN0KGlucHV0cy5sZW5ndGgpLnRvQmUoMik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTZXR0aW5nc1JhZGlvTGFiZWwnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgcmFkaW8gbGFiZWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcihcbiAgICAgICAgPFNldHRpbmdzUmFkaW9MYWJlbFxuICAgICAgICAgIGxhYmVsPVwiT3B0aW9uIDFcIlxuICAgICAgICAgIHZhbHVlPVwib3B0aW9uMVwiXG4gICAgICAgICAgY2hlY2tlZD17ZmFsc2V9XG4gICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ09wdGlvbiAxJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5Um9sZSgncmFkaW8nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGNoZWNrZWQgc3RhdGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcihcbiAgICAgICAgPFNldHRpbmdzUmFkaW9MYWJlbFxuICAgICAgICAgIGxhYmVsPVwiT3B0aW9uIDFcIlxuICAgICAgICAgIHZhbHVlPVwib3B0aW9uMVwiXG4gICAgICAgICAgY2hlY2tlZD17dHJ1ZX1cbiAgICAgICAgICBvbkNoYW5nZT17b25DaGFuZ2V9XG4gICAgICAgIC8+XG4gICAgICApO1xuXG4gICAgICBjb25zdCByYWRpbyA9IHNjcmVlbi5nZXRCeVJvbGUoJ3JhZGlvJyk7XG4gICAgICBleHBlY3QocmFkaW8pLnRvQmVDaGVja2VkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB1bmNoZWNrZWQgc3RhdGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcihcbiAgICAgICAgPFNldHRpbmdzUmFkaW9MYWJlbFxuICAgICAgICAgIGxhYmVsPVwiT3B0aW9uIDFcIlxuICAgICAgICAgIHZhbHVlPVwib3B0aW9uMVwiXG4gICAgICAgICAgY2hlY2tlZD17ZmFsc2V9XG4gICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmFkaW8gPSBzY3JlZW4uZ2V0QnlSb2xlKCdyYWRpbycpO1xuICAgICAgZXhwZWN0KHJhZGlvKS5ub3QudG9CZUNoZWNrZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIHJhZGlvIGlzIGNsaWNrZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICAgIHJlbmRlcihcbiAgICAgICAgPFNldHRpbmdzUmFkaW9MYWJlbFxuICAgICAgICAgIGxhYmVsPVwiT3B0aW9uIDFcIlxuICAgICAgICAgIHZhbHVlPVwib3B0aW9uMVwiXG4gICAgICAgICAgY2hlY2tlZD17ZmFsc2V9XG4gICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmFkaW8gPSBzY3JlZW4uZ2V0QnlSb2xlKCdyYWRpbycpO1xuICAgICAgYXdhaXQgdXNlci5jbGljayhyYWRpbyk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Rpc3BsYXlzIGxhYmVsIHRleHQgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCBsYWJlbFRleHQgPSAnQ3VzdG9tIE9wdGlvbiBMYWJlbCc7XG4gICAgICByZW5kZXIoXG4gICAgICAgIDxTZXR0aW5nc1JhZGlvTGFiZWxcbiAgICAgICAgICBsYWJlbD17bGFiZWxUZXh0fVxuICAgICAgICAgIHZhbHVlPVwiY3VzdG9tXCJcbiAgICAgICAgICBjaGVja2VkPXtmYWxzZX1cbiAgICAgICAgICBvbkNoYW5nZT17b25DaGFuZ2V9XG4gICAgICAgIC8+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dChsYWJlbFRleHQpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUGFuZWwnLCAoKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICAgICAgbW9kZWw6IHsgdG9nZ2xlU2V0dGluZzogdHJ1ZSwgbnVtYmVyVmFsdWU6IDUgfSxcbiAgICAgIGNvbmZpZ3VyYXRpb246IHsgY29uZmlnVmFsdWU6ICd0ZXN0JyB9LFxuICAgICAgZ3JvdXBzOiB7XG4gICAgICAgICdHZW5lcmFsIFNldHRpbmdzJzoge1xuICAgICAgICAgIHRvZ2dsZVNldHRpbmc6IHtcbiAgICAgICAgICAgIHR5cGU6ICd0b2dnbGUnLFxuICAgICAgICAgICAgbGFiZWw6ICdFbmFibGUgRmVhdHVyZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvbkNoYW5nZU1vZGVsOiBqZXN0LmZuKCksXG4gICAgICBvbkNoYW5nZUNvbmZpZ3VyYXRpb246IGplc3QuZm4oKSxcbiAgICB9O1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHBhbmVsIHdpdGggZ3JvdXAgbGFiZWwnLCAoKSA9PiB7XG4gICAgICByZW5kZXIoPFBhbmVsIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdHZW5lcmFsIFNldHRpbmdzJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBlbXB0eSB3aGVuIGdyb3VwcyBpcyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKFxuICAgICAgICA8UGFuZWxcbiAgICAgICAgICB7Li4uZGVmYXVsdFByb3BzfVxuICAgICAgICAgIGdyb3Vwcz17dW5kZWZpbmVkfVxuICAgICAgICAvPlxuICAgICAgKTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZC5jaGlsZHJlbi5sZW5ndGgpLnRvQmUoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBlbXB0eSB3aGVuIGdyb3VwcyBpcyBlbXB0eScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoXG4gICAgICAgIDxQYW5lbFxuICAgICAgICAgIHsuLi5kZWZhdWx0UHJvcHN9XG4gICAgICAgICAgZ3JvdXBzPXt7fX1cbiAgICAgICAgLz5cbiAgICAgICk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoKS50b0JlKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlTW9kZWwgd2hlbiBtb2RlbCBjaGFuZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgICAgY29uc3Qgb25DaGFuZ2VNb2RlbCA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoXG4gICAgICAgIDxQYW5lbFxuICAgICAgICAgIHsuLi5kZWZhdWx0UHJvcHN9XG4gICAgICAgICAgb25DaGFuZ2VNb2RlbD17b25DaGFuZ2VNb2RlbH1cbiAgICAgICAgLz5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN3aXRjaEVsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJyk7XG4gICAgICBhd2FpdCB1c2VyLmNsaWNrKHN3aXRjaEVsZW1lbnQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2VNb2RlbCkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlQ29uZmlndXJhdGlvbiB3aGVuIGNvbmZpZ3VyYXRpb24gY2hhbmdlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIGNvbnN0IG9uQ2hhbmdlQ29uZmlndXJhdGlvbiA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoXG4gICAgICAgIDxQYW5lbFxuICAgICAgICAgIHsuLi5kZWZhdWx0UHJvcHN9XG4gICAgICAgICAgZ3JvdXBzPXt7XG4gICAgICAgICAgICAnQ29uZmlnIEdyb3VwJzoge1xuICAgICAgICAgICAgICBjb25maWdWYWx1ZToge1xuICAgICAgICAgICAgICAgIHR5cGU6ICd0b2dnbGUnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnQ29uZmlnIFRvZ2dsZScsXG4gICAgICAgICAgICAgICAgaXNDb25maWdQcm9wZXJ0eTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfX1cbiAgICAgICAgICBvbkNoYW5nZUNvbmZpZ3VyYXRpb249e29uQ2hhbmdlQ29uZmlndXJhdGlvbn1cbiAgICAgICAgLz5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN3aXRjaEVsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJyk7XG4gICAgICBhd2FpdCB1c2VyLmNsaWNrKHN3aXRjaEVsZW1lbnQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2VDb25maWd1cmF0aW9uKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG1vZGFsIHdoZW4gcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RhbCA9IDxkaXYgZGF0YS10ZXN0aWQ9XCJ0ZXN0LW1vZGFsXCI+TW9kYWwgQ29udGVudDwvZGl2PjtcbiAgICAgIHJlbmRlcihcbiAgICAgICAgPFBhbmVsXG4gICAgICAgICAgey4uLmRlZmF1bHRQcm9wc31cbiAgICAgICAgICBtb2RhbD17bW9kYWx9XG4gICAgICAgIC8+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGVzdElkKCd0ZXN0LW1vZGFsJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnTW9kYWwgQ29udGVudCcpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgbXVsdGlwbGUgZ3JvdXBzJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKFxuICAgICAgICA8UGFuZWxcbiAgICAgICAgICB7Li4uZGVmYXVsdFByb3BzfVxuICAgICAgICAgIGdyb3Vwcz17e1xuICAgICAgICAgICAgJ0dyb3VwIE9uZSc6IHtcbiAgICAgICAgICAgICAgc2V0dGluZzE6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAndG9nZ2xlJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1NldHRpbmcgT25lJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnR3JvdXAgVHdvJzoge1xuICAgICAgICAgICAgICBzZXR0aW5nMjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICd0b2dnbGUnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnU2V0dGluZyBUd28nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9fVxuICAgICAgICAgIG1vZGVsPXt7IHNldHRpbmcxOiB0cnVlLCBzZXR0aW5nMjogZmFsc2UgfX1cbiAgICAgICAgLz5cbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdHcm91cCBPbmUnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdHcm91cCBUd28nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCd1c2VzIGRlZmF1bHQgY2FsbGJhY2tzIHdoZW4gbm90IHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcihcbiAgICAgICAgPFBhbmVsXG4gICAgICAgICAgbW9kZWw9e3sgdGVzdDogdHJ1ZSB9fVxuICAgICAgICAgIGdyb3Vwcz17e1xuICAgICAgICAgICAgJ1Rlc3QgR3JvdXAnOiB7XG4gICAgICAgICAgICAgIHRlc3Q6IHsgdHlwZTogJ3RvZ2dsZScsIGxhYmVsOiAnVGVzdCcgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdmaWx0ZXJzIG91dCBlbXB0eSBncm91cHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKFxuICAgICAgICA8UGFuZWxcbiAgICAgICAgICB7Li4uZGVmYXVsdFByb3BzfVxuICAgICAgICAgIGdyb3Vwcz17e1xuICAgICAgICAgICAgJ0VtcHR5IEdyb3VwJzoge30sXG4gICAgICAgICAgICAnR2VuZXJhbCBTZXR0aW5ncyc6IHtcbiAgICAgICAgICAgICAgdG9nZ2xlU2V0dGluZzoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICd0b2dnbGUnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnRW5hYmxlIEZlYXR1cmUnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9fVxuICAgICAgICAgIG1vZGVsPXt7IHRvZ2dsZVNldHRpbmc6IHRydWUgfX1cbiAgICAgICAgLz5cbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdHZW5lcmFsIFNldHRpbmdzJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3Qoc2NyZWVuLnF1ZXJ5QnlUZXh0KCdFbXB0eSBHcm91cCcpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggbnVsbCBtb2RlbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoXG4gICAgICAgIDxQYW5lbFxuICAgICAgICAgIG1vZGVsPXtudWxsfVxuICAgICAgICAgIGNvbmZpZ3VyYXRpb249e3t9fVxuICAgICAgICAgIGdyb3Vwcz17e1xuICAgICAgICAgICAgJ0dlbmVyYWwgU2V0dGluZ3MnOiB7XG4gICAgICAgICAgICAgIHRvZ2dsZVNldHRpbmc6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAndG9nZ2xlJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0VuYWJsZSBGZWF0dXJlJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfX1cbiAgICAgICAgICBvbkNoYW5nZU1vZGVsPXtqZXN0LmZuKCl9XG4gICAgICAgIC8+XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnR2VuZXJhbCBTZXR0aW5ncycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxVQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxPQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxZQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxtQkFBQSxHQUFBTixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFB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