@pie-lib/graphing 4.0.24-beta.13 → 4.0.24-beta.15
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.
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
4
5
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
5
6
|
var _testUtils = require("@pie-lib/test-utils");
|
|
6
7
|
var _react = _interopRequireDefault(require("react"));
|
|
@@ -44,6 +45,613 @@ describe('MarkLabel', function () {
|
|
|
44
45
|
});
|
|
45
46
|
});
|
|
46
47
|
});
|
|
48
|
+
describe('MarkLabel - editing', function () {
|
|
49
|
+
var onChange;
|
|
50
|
+
var onBlur;
|
|
51
|
+
beforeEach(function () {
|
|
52
|
+
onChange = jest.fn();
|
|
53
|
+
onBlur = jest.fn();
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// the label input is the only input MarkLabel renders (react-input-autosize)
|
|
57
|
+
var input = function input(container) {
|
|
58
|
+
return container.querySelector('input');
|
|
59
|
+
};
|
|
60
|
+
var renderComponent = function renderComponent(extras) {
|
|
61
|
+
var defaults = {
|
|
62
|
+
onChange: onChange,
|
|
63
|
+
onBlur: onBlur,
|
|
64
|
+
inputRef: jest.fn(),
|
|
65
|
+
mark: {
|
|
66
|
+
x: 1,
|
|
67
|
+
y: 1,
|
|
68
|
+
label: ''
|
|
69
|
+
},
|
|
70
|
+
graphProps: (0, _utils.graphProps)(0, 10, 0, 10)
|
|
71
|
+
};
|
|
72
|
+
var props = _objectSpread(_objectSpread({}, defaults), extras);
|
|
73
|
+
var result = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_markLabel.MarkLabel, props));
|
|
74
|
+
return _objectSpread(_objectSpread({}, result), {}, {
|
|
75
|
+
input: input(result.container),
|
|
76
|
+
rerenderWith: function rerenderWith(next) {
|
|
77
|
+
return result.rerender(/*#__PURE__*/_react["default"].createElement(_markLabel.MarkLabel, (0, _extends2["default"])({}, props, next)));
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
describe('autoFocus', function () {
|
|
82
|
+
it('focuses the input so a new label can be typed into right away', function () {
|
|
83
|
+
var _renderComponent3 = renderComponent({
|
|
84
|
+
autoFocus: true
|
|
85
|
+
}),
|
|
86
|
+
input = _renderComponent3.input;
|
|
87
|
+
expect(document.activeElement).toBe(input);
|
|
88
|
+
});
|
|
89
|
+
it('leaves the caret at the end of an existing label', function () {
|
|
90
|
+
var _renderComponent4 = renderComponent({
|
|
91
|
+
autoFocus: true,
|
|
92
|
+
mark: {
|
|
93
|
+
x: 1,
|
|
94
|
+
y: 1,
|
|
95
|
+
label: 'AB'
|
|
96
|
+
}
|
|
97
|
+
}),
|
|
98
|
+
input = _renderComponent4.input;
|
|
99
|
+
expect(document.activeElement).toBe(input);
|
|
100
|
+
expect(input.selectionStart).toBe(2);
|
|
101
|
+
expect(input.selectionEnd).toBe(2);
|
|
102
|
+
});
|
|
103
|
+
it('does not focus the input of an existing label when autoFocus is not set', function () {
|
|
104
|
+
var _renderComponent5 = renderComponent({
|
|
105
|
+
mark: {
|
|
106
|
+
x: 1,
|
|
107
|
+
y: 1,
|
|
108
|
+
label: 'A'
|
|
109
|
+
}
|
|
110
|
+
}),
|
|
111
|
+
input = _renderComponent5.input;
|
|
112
|
+
expect(document.activeElement).not.toBe(input);
|
|
113
|
+
});
|
|
114
|
+
it('does not focus the input when disabled', function () {
|
|
115
|
+
var _renderComponent6 = renderComponent({
|
|
116
|
+
autoFocus: true,
|
|
117
|
+
disabled: true,
|
|
118
|
+
mark: {
|
|
119
|
+
x: 1,
|
|
120
|
+
y: 1,
|
|
121
|
+
label: 'A'
|
|
122
|
+
}
|
|
123
|
+
}),
|
|
124
|
+
input = _renderComponent6.input;
|
|
125
|
+
expect(document.activeElement).not.toBe(input);
|
|
126
|
+
});
|
|
127
|
+
it('does not focus the input of a disabled mark', function () {
|
|
128
|
+
var _renderComponent7 = renderComponent({
|
|
129
|
+
autoFocus: true,
|
|
130
|
+
mark: {
|
|
131
|
+
x: 1,
|
|
132
|
+
y: 1,
|
|
133
|
+
label: 'A',
|
|
134
|
+
disabled: true
|
|
135
|
+
}
|
|
136
|
+
}),
|
|
137
|
+
input = _renderComponent7.input;
|
|
138
|
+
expect(document.activeElement).not.toBe(input);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
// the focus can go away without this component hearing about it - the input node gets replaced
|
|
142
|
+
// by a render higher up, so no blur is fired and autoFocus is still on
|
|
143
|
+
it('takes the focus back on the next render while it is still being edited', function () {
|
|
144
|
+
var _renderComponent8 = renderComponent({
|
|
145
|
+
autoFocus: true,
|
|
146
|
+
mark: {
|
|
147
|
+
x: 1,
|
|
148
|
+
y: 1,
|
|
149
|
+
label: 'A'
|
|
150
|
+
}
|
|
151
|
+
}),
|
|
152
|
+
input = _renderComponent8.input,
|
|
153
|
+
rerenderWith = _renderComponent8.rerenderWith;
|
|
154
|
+
expect(document.activeElement).toBe(input);
|
|
155
|
+
input.blur();
|
|
156
|
+
expect(document.activeElement).not.toBe(input);
|
|
157
|
+
rerenderWith({
|
|
158
|
+
mark: {
|
|
159
|
+
x: 1,
|
|
160
|
+
y: 1,
|
|
161
|
+
label: 'A'
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
expect(document.activeElement).toBe(input);
|
|
165
|
+
});
|
|
166
|
+
it('leaves the caret where the user put it while the input has the focus', function () {
|
|
167
|
+
var _renderComponent9 = renderComponent({
|
|
168
|
+
autoFocus: true,
|
|
169
|
+
mark: {
|
|
170
|
+
x: 1,
|
|
171
|
+
y: 1,
|
|
172
|
+
label: 'ABC'
|
|
173
|
+
}
|
|
174
|
+
}),
|
|
175
|
+
input = _renderComponent9.input,
|
|
176
|
+
rerenderWith = _renderComponent9.rerenderWith;
|
|
177
|
+
input.setSelectionRange(1, 1);
|
|
178
|
+
rerenderWith({
|
|
179
|
+
mark: {
|
|
180
|
+
x: 1,
|
|
181
|
+
y: 1,
|
|
182
|
+
label: 'ABC'
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
expect(document.activeElement).toBe(input);
|
|
186
|
+
expect(input.selectionStart).toBe(1);
|
|
187
|
+
});
|
|
188
|
+
it('focuses the input once it is no longer disabled', function () {
|
|
189
|
+
var _renderComponent0 = renderComponent({
|
|
190
|
+
autoFocus: true,
|
|
191
|
+
disabled: true
|
|
192
|
+
}),
|
|
193
|
+
rerenderWith = _renderComponent0.rerenderWith,
|
|
194
|
+
container = _renderComponent0.container;
|
|
195
|
+
rerenderWith({
|
|
196
|
+
disabled: false
|
|
197
|
+
});
|
|
198
|
+
expect(document.activeElement).toBe(input(container));
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
// the host saves the model with an api call and the model that comes back can replace the
|
|
202
|
+
// input node - the label has to keep the focus across that remount
|
|
203
|
+
it('re-focuses the input when it is remounted while being edited', function () {
|
|
204
|
+
var props = {
|
|
205
|
+
autoFocus: true,
|
|
206
|
+
onChange: onChange,
|
|
207
|
+
inputRef: jest.fn(),
|
|
208
|
+
mark: {
|
|
209
|
+
x: 1,
|
|
210
|
+
y: 1,
|
|
211
|
+
label: 'A'
|
|
212
|
+
},
|
|
213
|
+
graphProps: (0, _utils.graphProps)(0, 10, 0, 10)
|
|
214
|
+
};
|
|
215
|
+
var _render = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_markLabel.MarkLabel, (0, _extends2["default"])({
|
|
216
|
+
key: "first"
|
|
217
|
+
}, props))),
|
|
218
|
+
container = _render.container,
|
|
219
|
+
rerender = _render.rerender;
|
|
220
|
+
var first = input(container);
|
|
221
|
+
expect(document.activeElement).toBe(first);
|
|
222
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_markLabel.MarkLabel, (0, _extends2["default"])({
|
|
223
|
+
key: "second"
|
|
224
|
+
}, props)));
|
|
225
|
+
var second = input(container);
|
|
226
|
+
expect(second).not.toBe(first);
|
|
227
|
+
expect(document.activeElement).toBe(second);
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
// the tool asks for the focus with autoFocus, but its state can be gone before the input renders:
|
|
232
|
+
// the marks come back from the host asynchronously and can remount the tool. An empty label in
|
|
233
|
+
// label mode is a label the user has just added, so the input can tell on its own.
|
|
234
|
+
describe('a label that was just added', function () {
|
|
235
|
+
it('focuses itself without the tool asking', function () {
|
|
236
|
+
var _renderComponent1 = renderComponent({
|
|
237
|
+
mark: {
|
|
238
|
+
x: 1,
|
|
239
|
+
y: 1,
|
|
240
|
+
label: ''
|
|
241
|
+
}
|
|
242
|
+
}),
|
|
243
|
+
input = _renderComponent1.input;
|
|
244
|
+
expect(document.activeElement).toBe(input);
|
|
245
|
+
});
|
|
246
|
+
it('focuses itself again when it is remounted before it was typed into', function () {
|
|
247
|
+
var props = {
|
|
248
|
+
onChange: onChange,
|
|
249
|
+
onBlur: onBlur,
|
|
250
|
+
inputRef: jest.fn(),
|
|
251
|
+
mark: {
|
|
252
|
+
x: 1,
|
|
253
|
+
y: 1,
|
|
254
|
+
label: ''
|
|
255
|
+
},
|
|
256
|
+
graphProps: (0, _utils.graphProps)(0, 10, 0, 10)
|
|
257
|
+
};
|
|
258
|
+
var _render2 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_markLabel.MarkLabel, (0, _extends2["default"])({
|
|
259
|
+
key: "first"
|
|
260
|
+
}, props))),
|
|
261
|
+
container = _render2.container,
|
|
262
|
+
rerender = _render2.rerender;
|
|
263
|
+
var first = input(container);
|
|
264
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_markLabel.MarkLabel, (0, _extends2["default"])({
|
|
265
|
+
key: "second"
|
|
266
|
+
}, props)));
|
|
267
|
+
var second = input(container);
|
|
268
|
+
expect(second).not.toBe(first);
|
|
269
|
+
expect(document.activeElement).toBe(second);
|
|
270
|
+
});
|
|
271
|
+
it('stops chasing the focus once it has been left', function () {
|
|
272
|
+
var _renderComponent10 = renderComponent({
|
|
273
|
+
mark: {
|
|
274
|
+
x: 1,
|
|
275
|
+
y: 1,
|
|
276
|
+
label: ''
|
|
277
|
+
}
|
|
278
|
+
}),
|
|
279
|
+
input = _renderComponent10.input,
|
|
280
|
+
rerenderWith = _renderComponent10.rerenderWith;
|
|
281
|
+
expect(document.activeElement).toBe(input);
|
|
282
|
+
input.blur();
|
|
283
|
+
rerenderWith({
|
|
284
|
+
mark: {
|
|
285
|
+
x: 1,
|
|
286
|
+
y: 1,
|
|
287
|
+
label: ''
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
expect(document.activeElement).not.toBe(input);
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
// outside of label mode the input is disabled, which is how an empty label that was loaded with
|
|
294
|
+
// the item is told apart from one the user has just added - label mode always starts off
|
|
295
|
+
// the config draws the background marks into the correct answer graphs as disabled marks
|
|
296
|
+
it('is not rendered at all while it cannot be edited', function () {
|
|
297
|
+
var _renderComponent11 = renderComponent({
|
|
298
|
+
disabled: true,
|
|
299
|
+
mark: {
|
|
300
|
+
x: 1,
|
|
301
|
+
y: 1,
|
|
302
|
+
label: ''
|
|
303
|
+
}
|
|
304
|
+
}),
|
|
305
|
+
container = _renderComponent11.container;
|
|
306
|
+
expect(container.querySelector('input')).toBe(null);
|
|
307
|
+
});
|
|
308
|
+
it('is still rendered uneditable once it has text', function () {
|
|
309
|
+
var _renderComponent12 = renderComponent({
|
|
310
|
+
disabled: true,
|
|
311
|
+
mark: {
|
|
312
|
+
x: 1,
|
|
313
|
+
y: 1,
|
|
314
|
+
label: 'A'
|
|
315
|
+
}
|
|
316
|
+
}),
|
|
317
|
+
container = _renderComponent12.container;
|
|
318
|
+
expect(container.querySelector('input').value).toBe('A');
|
|
319
|
+
});
|
|
320
|
+
it('is not focused when label mode is turned on afterwards', function () {
|
|
321
|
+
var _renderComponent13 = renderComponent({
|
|
322
|
+
disabled: true,
|
|
323
|
+
mark: {
|
|
324
|
+
x: 1,
|
|
325
|
+
y: 1,
|
|
326
|
+
label: ''
|
|
327
|
+
}
|
|
328
|
+
}),
|
|
329
|
+
rerenderWith = _renderComponent13.rerenderWith,
|
|
330
|
+
container = _renderComponent13.container;
|
|
331
|
+
rerenderWith({
|
|
332
|
+
disabled: false
|
|
333
|
+
});
|
|
334
|
+
expect(input(container)).not.toBe(null);
|
|
335
|
+
expect(document.activeElement).not.toBe(input(container));
|
|
336
|
+
});
|
|
337
|
+
it('is not rendered for a disabled mark while it is empty', function () {
|
|
338
|
+
var _renderComponent14 = renderComponent({
|
|
339
|
+
mark: {
|
|
340
|
+
x: 1,
|
|
341
|
+
y: 1,
|
|
342
|
+
label: '',
|
|
343
|
+
disabled: true
|
|
344
|
+
}
|
|
345
|
+
}),
|
|
346
|
+
container = _renderComponent14.container;
|
|
347
|
+
expect(container.querySelector('input')).toBe(null);
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
// an input sized to its content is 2px wide while it is empty, and chrome paints the caret of
|
|
351
|
+
// an input inside an svg foreignObject as a hairline that never blinks - so an empty label that
|
|
352
|
+
// has the focus has to be wide enough to be seen as a box waiting for text
|
|
353
|
+
it('is wide enough to be seen while it is empty', function () {
|
|
354
|
+
var _renderComponent15 = renderComponent({
|
|
355
|
+
mark: {
|
|
356
|
+
x: 1,
|
|
357
|
+
y: 1,
|
|
358
|
+
label: ''
|
|
359
|
+
}
|
|
360
|
+
}),
|
|
361
|
+
input = _renderComponent15.input;
|
|
362
|
+
expect(parseInt(input.style.width, 10)).toBeGreaterThanOrEqual(30);
|
|
363
|
+
});
|
|
364
|
+
it('is only as wide as its text once it cannot be edited', function () {
|
|
365
|
+
var _renderComponent16 = renderComponent({
|
|
366
|
+
disabled: true,
|
|
367
|
+
mark: {
|
|
368
|
+
x: 1,
|
|
369
|
+
y: 1,
|
|
370
|
+
label: 'A'
|
|
371
|
+
}
|
|
372
|
+
}),
|
|
373
|
+
container = _renderComponent16.container;
|
|
374
|
+
expect(parseInt(container.querySelector('input').style.width, 10)).toBeLessThan(30);
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
describe('syncing mark.label into the input', function () {
|
|
378
|
+
it('picks up a new mark.label while the input does not have the focus', function () {
|
|
379
|
+
var _renderComponent17 = renderComponent({
|
|
380
|
+
mark: {
|
|
381
|
+
x: 1,
|
|
382
|
+
y: 1,
|
|
383
|
+
label: 'A'
|
|
384
|
+
}
|
|
385
|
+
}),
|
|
386
|
+
rerenderWith = _renderComponent17.rerenderWith,
|
|
387
|
+
container = _renderComponent17.container;
|
|
388
|
+
rerenderWith({
|
|
389
|
+
mark: {
|
|
390
|
+
x: 1,
|
|
391
|
+
y: 1,
|
|
392
|
+
label: 'updated'
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
expect(input(container).value).toBe('updated');
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
// a mark coming back from an (async) model save can carry an older label - applying it would
|
|
399
|
+
// wipe out the characters typed in the meantime
|
|
400
|
+
it('keeps what the user typed while the input has the focus', function () {
|
|
401
|
+
var _renderComponent18 = renderComponent({
|
|
402
|
+
autoFocus: true
|
|
403
|
+
}),
|
|
404
|
+
input = _renderComponent18.input,
|
|
405
|
+
rerenderWith = _renderComponent18.rerenderWith;
|
|
406
|
+
expect(document.activeElement).toBe(input);
|
|
407
|
+
_testUtils.fireEvent.change(input, {
|
|
408
|
+
target: {
|
|
409
|
+
value: 'AB'
|
|
410
|
+
}
|
|
411
|
+
});
|
|
412
|
+
expect(input.value).toBe('AB');
|
|
413
|
+
|
|
414
|
+
// the host echoes back the label as it was one keystroke ago
|
|
415
|
+
rerenderWith({
|
|
416
|
+
mark: {
|
|
417
|
+
x: 1,
|
|
418
|
+
y: 1,
|
|
419
|
+
label: 'A'
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
expect(input.value).toBe('AB');
|
|
423
|
+
});
|
|
424
|
+
});
|
|
425
|
+
|
|
426
|
+
// the characters land at the document's caret, not at the focused node. In the authoring
|
|
427
|
+
// environment the input ends up focused with no caret anywhere: keypress fires and nothing is
|
|
428
|
+
// inserted. jsdom never reports a caret either, so this is that state - the focus cycle that
|
|
429
|
+
// repairs it must not hand the label over to the blur handling.
|
|
430
|
+
describe('a focused input with no caret', function () {
|
|
431
|
+
it('is repaired without reporting the label as removed', function () {
|
|
432
|
+
var _renderComponent19 = renderComponent({
|
|
433
|
+
autoFocus: true,
|
|
434
|
+
mark: {
|
|
435
|
+
x: 1,
|
|
436
|
+
y: 1,
|
|
437
|
+
label: ''
|
|
438
|
+
}
|
|
439
|
+
}),
|
|
440
|
+
input = _renderComponent19.input;
|
|
441
|
+
expect(document.activeElement).toBe(input);
|
|
442
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
443
|
+
expect(onBlur).not.toHaveBeenCalled();
|
|
444
|
+
});
|
|
445
|
+
it('leaves the caret at the end of a label that already has text', function () {
|
|
446
|
+
var _renderComponent20 = renderComponent({
|
|
447
|
+
autoFocus: true,
|
|
448
|
+
mark: {
|
|
449
|
+
x: 1,
|
|
450
|
+
y: 1,
|
|
451
|
+
label: 'AB'
|
|
452
|
+
}
|
|
453
|
+
}),
|
|
454
|
+
input = _renderComponent20.input;
|
|
455
|
+
expect(document.activeElement).toBe(input);
|
|
456
|
+
expect(input.selectionStart).toBe(2);
|
|
457
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
458
|
+
});
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
// clicking another window, the devtools, or the host moving the focus while it saves the model:
|
|
462
|
+
// the label is not being left, so it must survive and take the focus back
|
|
463
|
+
describe('while the window is away', function () {
|
|
464
|
+
var windowGoesAway = function windowGoesAway() {
|
|
465
|
+
return window.dispatchEvent(new Event('blur'));
|
|
466
|
+
};
|
|
467
|
+
var windowComesBack = function windowComesBack() {
|
|
468
|
+
return window.dispatchEvent(new Event('focus'));
|
|
469
|
+
};
|
|
470
|
+
it('keeps an empty label instead of reporting it as removed', function () {
|
|
471
|
+
var _renderComponent21 = renderComponent({
|
|
472
|
+
mark: {
|
|
473
|
+
x: 1,
|
|
474
|
+
y: 1,
|
|
475
|
+
label: ''
|
|
476
|
+
}
|
|
477
|
+
}),
|
|
478
|
+
input = _renderComponent21.input;
|
|
479
|
+
windowGoesAway();
|
|
480
|
+
_testUtils.fireEvent.blur(input);
|
|
481
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
482
|
+
expect(onBlur).not.toHaveBeenCalled();
|
|
483
|
+
});
|
|
484
|
+
it('takes the focus back when the window comes back', function () {
|
|
485
|
+
var _renderComponent22 = renderComponent({
|
|
486
|
+
autoFocus: true,
|
|
487
|
+
mark: {
|
|
488
|
+
x: 1,
|
|
489
|
+
y: 1,
|
|
490
|
+
label: ''
|
|
491
|
+
}
|
|
492
|
+
}),
|
|
493
|
+
input = _renderComponent22.input;
|
|
494
|
+
|
|
495
|
+
// the focus is moved to another input rather than with input.blur(): jsdom fires a window
|
|
496
|
+
// focus event as part of blur(), which is the very thing being tested here
|
|
497
|
+
var elsewhere = document.createElement('input');
|
|
498
|
+
document.body.appendChild(elsewhere);
|
|
499
|
+
windowGoesAway();
|
|
500
|
+
elsewhere.focus();
|
|
501
|
+
expect(document.activeElement).toBe(elsewhere);
|
|
502
|
+
windowComesBack();
|
|
503
|
+
expect(document.activeElement).toBe(input);
|
|
504
|
+
elsewhere.remove();
|
|
505
|
+
});
|
|
506
|
+
it('still reports a label the user leaves once the window is back', function () {
|
|
507
|
+
var _renderComponent23 = renderComponent({
|
|
508
|
+
mark: {
|
|
509
|
+
x: 1,
|
|
510
|
+
y: 1,
|
|
511
|
+
label: ''
|
|
512
|
+
}
|
|
513
|
+
}),
|
|
514
|
+
input = _renderComponent23.input;
|
|
515
|
+
windowGoesAway();
|
|
516
|
+
windowComesBack();
|
|
517
|
+
_testUtils.fireEvent.blur(input);
|
|
518
|
+
expect(onChange).toHaveBeenCalledWith('');
|
|
519
|
+
});
|
|
520
|
+
});
|
|
521
|
+
describe('onBlur', function () {
|
|
522
|
+
it('is called so the tool stops auto focusing the label', function () {
|
|
523
|
+
var _renderComponent24 = renderComponent({
|
|
524
|
+
autoFocus: true,
|
|
525
|
+
mark: {
|
|
526
|
+
x: 1,
|
|
527
|
+
y: 1,
|
|
528
|
+
label: 'A'
|
|
529
|
+
}
|
|
530
|
+
}),
|
|
531
|
+
input = _renderComponent24.input;
|
|
532
|
+
_testUtils.fireEvent.blur(input);
|
|
533
|
+
expect(onBlur).toHaveBeenCalled();
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
// clicking a button or anything else interactive blurs the label while the debounce is pending
|
|
537
|
+
it('saves what was typed straight away', function () {
|
|
538
|
+
var _renderComponent25 = renderComponent({
|
|
539
|
+
mark: {
|
|
540
|
+
x: 1,
|
|
541
|
+
y: 1,
|
|
542
|
+
label: ''
|
|
543
|
+
}
|
|
544
|
+
}),
|
|
545
|
+
input = _renderComponent25.input;
|
|
546
|
+
_testUtils.fireEvent.change(input, {
|
|
547
|
+
target: {
|
|
548
|
+
value: 'AB'
|
|
549
|
+
}
|
|
550
|
+
});
|
|
551
|
+
_testUtils.fireEvent.blur(input);
|
|
552
|
+
expect(onChange).toHaveBeenCalledWith('AB');
|
|
553
|
+
});
|
|
554
|
+
it('does not save it twice when the debounce catches up', function () {
|
|
555
|
+
jest.useFakeTimers();
|
|
556
|
+
var _renderComponent26 = renderComponent({
|
|
557
|
+
mark: {
|
|
558
|
+
x: 1,
|
|
559
|
+
y: 1,
|
|
560
|
+
label: ''
|
|
561
|
+
}
|
|
562
|
+
}),
|
|
563
|
+
input = _renderComponent26.input;
|
|
564
|
+
_testUtils.fireEvent.change(input, {
|
|
565
|
+
target: {
|
|
566
|
+
value: 'AB'
|
|
567
|
+
}
|
|
568
|
+
});
|
|
569
|
+
_testUtils.fireEvent.blur(input);
|
|
570
|
+
(0, _testUtils.act)(function () {
|
|
571
|
+
return jest.advanceTimersByTime(1000);
|
|
572
|
+
});
|
|
573
|
+
expect(onChange).toHaveBeenCalledTimes(1);
|
|
574
|
+
expect(onChange).toHaveBeenCalledWith('AB');
|
|
575
|
+
jest.useRealTimers();
|
|
576
|
+
});
|
|
577
|
+
it('reports an empty label on blur', function () {
|
|
578
|
+
var _renderComponent27 = renderComponent({
|
|
579
|
+
mark: {
|
|
580
|
+
x: 1,
|
|
581
|
+
y: 1,
|
|
582
|
+
label: 'A'
|
|
583
|
+
}
|
|
584
|
+
}),
|
|
585
|
+
input = _renderComponent27.input;
|
|
586
|
+
_testUtils.fireEvent.change(input, {
|
|
587
|
+
target: {
|
|
588
|
+
value: ''
|
|
589
|
+
}
|
|
590
|
+
});
|
|
591
|
+
_testUtils.fireEvent.blur(input);
|
|
592
|
+
expect(onChange).toHaveBeenCalledWith('');
|
|
593
|
+
});
|
|
594
|
+
});
|
|
595
|
+
describe('debounce', function () {
|
|
596
|
+
beforeEach(function () {
|
|
597
|
+
return jest.useFakeTimers();
|
|
598
|
+
});
|
|
599
|
+
afterEach(function () {
|
|
600
|
+
return jest.useRealTimers();
|
|
601
|
+
});
|
|
602
|
+
it('does not report the typed label before the debounce delay elapses', function () {
|
|
603
|
+
var _renderComponent28 = renderComponent({
|
|
604
|
+
autoFocus: true
|
|
605
|
+
}),
|
|
606
|
+
input = _renderComponent28.input;
|
|
607
|
+
_testUtils.fireEvent.change(input, {
|
|
608
|
+
target: {
|
|
609
|
+
value: 'A'
|
|
610
|
+
}
|
|
611
|
+
});
|
|
612
|
+
(0, _testUtils.act)(function () {
|
|
613
|
+
return jest.advanceTimersByTime(499);
|
|
614
|
+
});
|
|
615
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
616
|
+
(0, _testUtils.act)(function () {
|
|
617
|
+
return jest.advanceTimersByTime(1);
|
|
618
|
+
});
|
|
619
|
+
expect(onChange).toHaveBeenCalledWith('A');
|
|
620
|
+
});
|
|
621
|
+
it('reports the label once for a burst of keystrokes', function () {
|
|
622
|
+
var _renderComponent29 = renderComponent({
|
|
623
|
+
autoFocus: true
|
|
624
|
+
}),
|
|
625
|
+
input = _renderComponent29.input;
|
|
626
|
+
_testUtils.fireEvent.change(input, {
|
|
627
|
+
target: {
|
|
628
|
+
value: 'A'
|
|
629
|
+
}
|
|
630
|
+
});
|
|
631
|
+
(0, _testUtils.act)(function () {
|
|
632
|
+
return jest.advanceTimersByTime(300);
|
|
633
|
+
});
|
|
634
|
+
_testUtils.fireEvent.change(input, {
|
|
635
|
+
target: {
|
|
636
|
+
value: 'AB'
|
|
637
|
+
}
|
|
638
|
+
});
|
|
639
|
+
(0, _testUtils.act)(function () {
|
|
640
|
+
return jest.advanceTimersByTime(300);
|
|
641
|
+
});
|
|
642
|
+
_testUtils.fireEvent.change(input, {
|
|
643
|
+
target: {
|
|
644
|
+
value: 'ABC'
|
|
645
|
+
}
|
|
646
|
+
});
|
|
647
|
+
(0, _testUtils.act)(function () {
|
|
648
|
+
return jest.advanceTimersByTime(500);
|
|
649
|
+
});
|
|
650
|
+
expect(onChange).toHaveBeenCalledTimes(1);
|
|
651
|
+
expect(onChange).toHaveBeenCalledWith('ABC');
|
|
652
|
+
});
|
|
653
|
+
});
|
|
654
|
+
});
|
|
47
655
|
describe('position', function () {
|
|
48
656
|
var assertPosition = function assertPosition(mark, rect, expected) {
|
|
49
657
|
it("".concat(mark.x, ",").concat(mark.y, " + ").concat(rect.width, ",").concat(rect.height, " => ").concat(expected), function () {
|
|
@@ -130,4 +738,4 @@ describe('coordinates', function () {
|
|
|
130
738
|
top: 5
|
|
131
739
|
});
|
|
132
740
|
});
|
|
133
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdGVzdFV0aWxzIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbWFya0xhYmVsIiwiX3V0aWxzIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJkZXNjcmliZSIsIm9uQ2hhbmdlIiwiamVzdCIsImZuIiwiaW5wdXRSZWYiLCJyZW5kZXJDb21wb25lbnQiLCJleHRyYXMiLCJkZWZhdWx0cyIsImNsYXNzZXMiLCJjbGFzc05hbWUiLCJtYXJrIiwieCIsInkiLCJncmFwaFByb3BzIiwiZ2V0R3JhcGhQcm9wcyIsInByb3BzIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsIk1hcmtMYWJlbCIsIml0IiwiX3JlbmRlckNvbXBvbmVudCIsImNvbnRhaW5lciIsImV4cGVjdCIsImZpcnN0Q2hpbGQiLCJ0b0JlSW5UaGVEb2N1bWVudCIsIl9yZW5kZXJDb21wb25lbnQyIiwiYXNzZXJ0UG9zaXRpb24iLCJyZWN0IiwiZXhwZWN0ZWQiLCJjb25jYXQiLCJ3aWR0aCIsImhlaWdodCIsInJlc3VsdCIsInBvc2l0aW9uIiwidG9FcXVhbCIsImFzc2VydENvb3JkaW5hdGVzIiwicG9zIiwibGVmdCIsInRvcCIsImNvb3JkaW5hdGVzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9tYXJrLWxhYmVsLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlbmRlciB9IGZyb20gJ0BwaWUtbGliL3Rlc3QtdXRpbHMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNvb3JkaW5hdGVzLCBNYXJrTGFiZWwsIHBvc2l0aW9uIH0gZnJvbSAnLi4vbWFyay1sYWJlbCc7XG5pbXBvcnQgeyBncmFwaFByb3BzIGFzIGdldEdyYXBoUHJvcHMgfSBmcm9tICcuL3V0aWxzJztcblxuZGVzY3JpYmUoJ01hcmtMYWJlbCcsICgpID0+IHtcbiAgbGV0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICBsZXQgaW5wdXRSZWYgPSBqZXN0LmZuKCk7XG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChleHRyYXMpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgY2xhc3NOYW1lOiAnY2xhc3NOYW1lJyxcbiAgICAgIG9uQ2hhbmdlLFxuICAgICAgaW5wdXRSZWYsXG4gICAgICBtYXJrOiB7IHg6IDEsIHk6IDEgfSxcbiAgICAgIGdyYXBoUHJvcHM6IGdldEdyYXBoUHJvcHMoMCwgMTAsIDAsIDEwKSxcbiAgICB9O1xuICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0cywgLi4uZXh0cmFzIH07XG4gICAgcmV0dXJuIHJlbmRlcig8TWFya0xhYmVsIHsuLi5wcm9wc30gLz4pO1xuICB9O1xuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBkaWZmZXJlbnQgbWFyayBwb3NpdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiB7IHg6IDEwLCB5OiAxMCB9IH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgncG9zaXRpb24nLCAoKSA9PiB7XG4gIGNvbnN0IGFzc2VydFBvc2l0aW9uID0gKG1hcmssIHJlY3QsIGV4cGVjdGVkKSA9PiB7XG4gICAgaXQoYCR7bWFyay54fSwke21hcmsueX0gKyAke3JlY3Qud2lkdGh9LCR7cmVjdC5oZWlnaHR9ID0+ICR7ZXhwZWN0ZWR9YCwgKCkgPT4ge1xuICAgICAgLy8gd2Ugc2V0IHJhbmdlLm1pbiB0byBhIHZhbHVlIGJlY2F1c2UgaW4gcGl4ZWxzIC0gdGhlIGdyZWF0ZXIgdGhlIFkgdGhlIGxvd2VyIGRvd24gb24gdGhlIHNjcmVlbi5cbiAgICAgIGNvbnN0IGdyYXBoUHJvcHMgPSBnZXRHcmFwaFByb3BzKDAsIDEyLCAxMiwgMCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBwb3NpdGlvbihncmFwaFByb3BzLCBtYXJrLCByZWN0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9O1xuXG4gIGFzc2VydFBvc2l0aW9uKHsgeDogMCwgeTogMCB9LCB7IHdpZHRoOiAxMCwgaGVpZ2h0OiAxMCB9LCAndG9wLWxlZnQnKTtcbiAgYXNzZXJ0UG9zaXRpb24oeyB4OiAwLCB5OiAwIH0sIHsgd2lkdGg6IDEsIGhlaWdodDogMSB9LCAnYm90dG9tLXJpZ2h0Jyk7XG4gIGFzc2VydFBvc2l0aW9uKHsgeDogMCwgeTogMCB9LCB7IHdpZHRoOiAxMCwgaGVpZ2h0OiAwIH0sICdib3R0b20tbGVmdCcpO1xuICBhc3NlcnRQb3NpdGlvbih7IHg6IDAsIHk6IDAgfSwgeyB3aWR0aDogMCwgaGVpZ2h0OiAxMCB9LCAndG9wLXJpZ2h0Jyk7XG59KTtcblxuZGVzY3JpYmUoJ2Nvb3JkaW5hdGVzJywgKCkgPT4ge1xuICBjb25zdCBhc3NlcnRDb29yZGluYXRlcyA9IChtYXJrLCByZWN0LCBwb3MsIGV4cGVjdGVkKSA9PiB7XG4gICAgaXQoYCR7bWFyay54fSwgJHttYXJrLnl9IC0+ICR7cG9zfSA9ICR7ZXhwZWN0ZWQubGVmdH0sICR7ZXhwZWN0ZWQudG9wfWAsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvb3JkaW5hdGVzKGdldEdyYXBoUHJvcHMoKSwgbWFyaywgcmVjdCwgcG9zKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9O1xuICBhc3NlcnRDb29yZGluYXRlcyh7IHg6IDAsIHk6IDAgfSwgeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0sICd0b3AtbGVmdCcsIHsgbGVmdDogLTUsIHRvcDogLTUgfSk7XG4gIGFzc2VydENvb3JkaW5hdGVzKHsgeDogMCwgeTogMCB9LCB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSwgJ2JvdHRvbS1sZWZ0JywgeyBsZWZ0OiAtNSwgdG9wOiA1IH0pO1xuICBhc3NlcnRDb29yZGluYXRlcyh7IHg6IDAsIHk6IDAgfSwgeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0sICd0b3AtcmlnaHQnLCB7IGxlZnQ6IDUsIHRvcDogLTUgfSk7XG4gIGFzc2VydENvb3JkaW5hdGVzKHsgeDogMCwgeTogMCB9LCB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSwgJ2JvdHRvbS1yaWdodCcsIHtcbiAgICBsZWZ0OiA1LFxuICAgIHRvcDogNSxcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQUFBLFVBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLFVBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQUFzRCxTQUFBSyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFF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
|
|
741
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdGVzdFV0aWxzIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbWFya0xhYmVsIiwiX3V0aWxzIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJkZXNjcmliZSIsIm9uQ2hhbmdlIiwiamVzdCIsImZuIiwiaW5wdXRSZWYiLCJyZW5kZXJDb21wb25lbnQiLCJleHRyYXMiLCJkZWZhdWx0cyIsImNsYXNzZXMiLCJjbGFzc05hbWUiLCJtYXJrIiwieCIsInkiLCJncmFwaFByb3BzIiwiZ2V0R3JhcGhQcm9wcyIsInByb3BzIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsIk1hcmtMYWJlbCIsIml0IiwiX3JlbmRlckNvbXBvbmVudCIsImNvbnRhaW5lciIsImV4cGVjdCIsImZpcnN0Q2hpbGQiLCJ0b0JlSW5UaGVEb2N1bWVudCIsIl9yZW5kZXJDb21wb25lbnQyIiwib25CbHVyIiwiYmVmb3JlRWFjaCIsImlucHV0IiwicXVlcnlTZWxlY3RvciIsImxhYmVsIiwicmVzdWx0IiwicmVyZW5kZXJXaXRoIiwibmV4dCIsInJlcmVuZGVyIiwiX2V4dGVuZHMyIiwiX3JlbmRlckNvbXBvbmVudDMiLCJhdXRvRm9jdXMiLCJkb2N1bWVudCIsImFjdGl2ZUVsZW1lbnQiLCJ0b0JlIiwiX3JlbmRlckNvbXBvbmVudDQiLCJzZWxlY3Rpb25TdGFydCIsInNlbGVjdGlvbkVuZCIsIl9yZW5kZXJDb21wb25lbnQ1Iiwibm90IiwiX3JlbmRlckNvbXBvbmVudDYiLCJkaXNhYmxlZCIsIl9yZW5kZXJDb21wb25lbnQ3IiwiX3JlbmRlckNvbXBvbmVudDgiLCJibHVyIiwiX3JlbmRlckNvbXBvbmVudDkiLCJzZXRTZWxlY3Rpb25SYW5nZSIsIl9yZW5kZXJDb21wb25lbnQwIiwiX3JlbmRlciIsImtleSIsImZpcnN0Iiwic2Vjb25kIiwiX3JlbmRlckNvbXBvbmVudDEiLCJfcmVuZGVyMiIsIl9yZW5kZXJDb21wb25lbnQxMCIsIl9yZW5kZXJDb21wb25lbnQxMSIsIl9yZW5kZXJDb21wb25lbnQxMiIsInZhbHVlIiwiX3JlbmRlckNvbXBvbmVudDEzIiwiX3JlbmRlckNvbXBvbmVudDE0IiwiX3JlbmRlckNvbXBvbmVudDE1IiwicGFyc2VJbnQiLCJzdHlsZSIsIndpZHRoIiwidG9CZUdyZWF0ZXJUaGFuT3JFcXVhbCIsIl9yZW5kZXJDb21wb25lbnQxNiIsInRvQmVMZXNzVGhhbiIsIl9yZW5kZXJDb21wb25lbnQxNyIsIl9yZW5kZXJDb21wb25lbnQxOCIsImZpcmVFdmVudCIsImNoYW5nZSIsInRhcmdldCIsIl9yZW5kZXJDb21wb25lbnQxOSIsInRvSGF2ZUJlZW5DYWxsZWQiLCJfcmVuZGVyQ29tcG9uZW50MjAiLCJ3aW5kb3dHb2VzQXdheSIsIndpbmRvdyIsImRpc3BhdGNoRXZlbnQiLCJFdmVudCIsIndpbmRvd0NvbWVzQmFjayIsIl9yZW5kZXJDb21wb25lbnQyMSIsIl9yZW5kZXJDb21wb25lbnQyMiIsImVsc2V3aGVyZSIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImZvY3VzIiwicmVtb3ZlIiwiX3JlbmRlckNvbXBvbmVudDIzIiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJfcmVuZGVyQ29tcG9uZW50MjQiLCJfcmVuZGVyQ29tcG9uZW50MjUiLCJ1c2VGYWtlVGltZXJzIiwiX3JlbmRlckNvbXBvbmVudDI2IiwiYWN0IiwiYWR2YW5jZVRpbWVyc0J5VGltZSIsInRvSGF2ZUJlZW5DYWxsZWRUaW1lcyIsInVzZVJlYWxUaW1lcnMiLCJfcmVuZGVyQ29tcG9uZW50MjciLCJhZnRlckVhY2giLCJfcmVuZGVyQ29tcG9uZW50MjgiLCJfcmVuZGVyQ29tcG9uZW50MjkiLCJhc3NlcnRQb3NpdGlvbiIsInJlY3QiLCJleHBlY3RlZCIsImNvbmNhdCIsImhlaWdodCIsInBvc2l0aW9uIiwidG9FcXVhbCIsImFzc2VydENvb3JkaW5hdGVzIiwicG9zIiwibGVmdCIsInRvcCIsImNvb3JkaW5hdGVzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9tYXJrLWxhYmVsLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFjdCwgZmlyZUV2ZW50LCByZW5kZXIgfSBmcm9tICdAcGllLWxpYi90ZXN0LXV0aWxzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjb29yZGluYXRlcywgTWFya0xhYmVsLCBwb3NpdGlvbiB9IGZyb20gJy4uL21hcmstbGFiZWwnO1xuaW1wb3J0IHsgZ3JhcGhQcm9wcyBhcyBnZXRHcmFwaFByb3BzIH0gZnJvbSAnLi91dGlscyc7XG5cbmRlc2NyaWJlKCdNYXJrTGFiZWwnLCAoKSA9PiB7XG4gIGxldCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgbGV0IGlucHV0UmVmID0gamVzdC5mbigpO1xuICBjb25zdCByZW5kZXJDb21wb25lbnQgPSAoZXh0cmFzKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICBjbGFzc2VzOiB7fSxcbiAgICAgIGNsYXNzTmFtZTogJ2NsYXNzTmFtZScsXG4gICAgICBvbkNoYW5nZSxcbiAgICAgIGlucHV0UmVmLFxuICAgICAgbWFyazogeyB4OiAxLCB5OiAxIH0sXG4gICAgICBncmFwaFByb3BzOiBnZXRHcmFwaFByb3BzKDAsIDEwLCAwLCAxMCksXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdHMsIC4uLmV4dHJhcyB9O1xuICAgIHJldHVybiByZW5kZXIoPE1hcmtMYWJlbCB7Li4ucHJvcHN9IC8+KTtcbiAgfTtcbiAgZGVzY3JpYmUoJ3JlbmRlcmluZycsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyB3aXRob3V0IGNyYXNoaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICAgIGl0KCdyZW5kZXJzIHdpdGggZGlmZmVyZW50IG1hcmsgcG9zaXRpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbWFyazogeyB4OiAxMCwgeTogMTAgfSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ01hcmtMYWJlbCAtIGVkaXRpbmcnLCAoKSA9PiB7XG4gIGxldCBvbkNoYW5nZTtcbiAgbGV0IG9uQmx1cjtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICBvbkJsdXIgPSBqZXN0LmZuKCk7XG4gIH0pO1xuXG4gIC8vIHRoZSBsYWJlbCBpbnB1dCBpcyB0aGUgb25seSBpbnB1dCBNYXJrTGFiZWwgcmVuZGVycyAocmVhY3QtaW5wdXQtYXV0b3NpemUpXG4gIGNvbnN0IGlucHV0ID0gKGNvbnRhaW5lcikgPT4gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG5cbiAgY29uc3QgcmVuZGVyQ29tcG9uZW50ID0gKGV4dHJhcykgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgICAgb25DaGFuZ2UsXG4gICAgICBvbkJsdXIsXG4gICAgICBpbnB1dFJlZjogamVzdC5mbigpLFxuICAgICAgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJycgfSxcbiAgICAgIGdyYXBoUHJvcHM6IGdldEdyYXBoUHJvcHMoMCwgMTAsIDAsIDEwKSxcbiAgICB9O1xuICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0cywgLi4uZXh0cmFzIH07XG4gICAgY29uc3QgcmVzdWx0ID0gcmVuZGVyKDxNYXJrTGFiZWwgey4uLnByb3BzfSAvPik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzdWx0LFxuICAgICAgaW5wdXQ6IGlucHV0KHJlc3VsdC5jb250YWluZXIpLFxuICAgICAgcmVyZW5kZXJXaXRoOiAobmV4dCkgPT4gcmVzdWx0LnJlcmVuZGVyKDxNYXJrTGFiZWwgey4uLnByb3BzfSB7Li4ubmV4dH0gLz4pLFxuICAgIH07XG4gIH07XG5cbiAgZGVzY3JpYmUoJ2F1dG9Gb2N1cycsICgpID0+IHtcbiAgICBpdCgnZm9jdXNlcyB0aGUgaW5wdXQgc28gYSBuZXcgbGFiZWwgY2FuIGJlIHR5cGVkIGludG8gcmlnaHQgYXdheScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHJlbmRlckNvbXBvbmVudCh7IGF1dG9Gb2N1czogdHJ1ZSB9KTtcblxuICAgICAgZXhwZWN0KGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLnRvQmUoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2xlYXZlcyB0aGUgY2FyZXQgYXQgdGhlIGVuZCBvZiBhbiBleGlzdGluZyBsYWJlbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHJlbmRlckNvbXBvbmVudCh7IGF1dG9Gb2N1czogdHJ1ZSwgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJ0FCJyB9IH0pO1xuXG4gICAgICBleHBlY3QoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkudG9CZShpbnB1dCk7XG4gICAgICBleHBlY3QoaW5wdXQuc2VsZWN0aW9uU3RhcnQpLnRvQmUoMik7XG4gICAgICBleHBlY3QoaW5wdXQuc2VsZWN0aW9uRW5kKS50b0JlKDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGZvY3VzIHRoZSBpbnB1dCBvZiBhbiBleGlzdGluZyBsYWJlbCB3aGVuIGF1dG9Gb2N1cyBpcyBub3Qgc2V0JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJ0EnIH0gfSk7XG5cbiAgICAgIGV4cGVjdChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS5ub3QudG9CZShpbnB1dCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgZm9jdXMgdGhlIGlucHV0IHdoZW4gZGlzYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGlucHV0IH0gPSByZW5kZXJDb21wb25lbnQoeyBhdXRvRm9jdXM6IHRydWUsIGRpc2FibGVkOiB0cnVlLCBtYXJrOiB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnQScgfSB9KTtcblxuICAgICAgZXhwZWN0KGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLm5vdC50b0JlKGlucHV0KTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCBmb2N1cyB0aGUgaW5wdXQgb2YgYSBkaXNhYmxlZCBtYXJrJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgYXV0b0ZvY3VzOiB0cnVlLCBtYXJrOiB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnQScsIGRpc2FibGVkOiB0cnVlIH0gfSk7XG5cbiAgICAgIGV4cGVjdChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS5ub3QudG9CZShpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyB0aGUgZm9jdXMgY2FuIGdvIGF3YXkgd2l0aG91dCB0aGlzIGNvbXBvbmVudCBoZWFyaW5nIGFib3V0IGl0IC0gdGhlIGlucHV0IG5vZGUgZ2V0cyByZXBsYWNlZFxuICAgIC8vIGJ5IGEgcmVuZGVyIGhpZ2hlciB1cCwgc28gbm8gYmx1ciBpcyBmaXJlZCBhbmQgYXV0b0ZvY3VzIGlzIHN0aWxsIG9uXG4gICAgaXQoJ3Rha2VzIHRoZSBmb2N1cyBiYWNrIG9uIHRoZSBuZXh0IHJlbmRlciB3aGlsZSBpdCBpcyBzdGlsbCBiZWluZyBlZGl0ZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGlucHV0LCByZXJlbmRlcldpdGggfSA9IHJlbmRlckNvbXBvbmVudCh7IGF1dG9Gb2N1czogdHJ1ZSwgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJ0EnIH0gfSk7XG5cbiAgICAgIGV4cGVjdChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS50b0JlKGlucHV0KTtcblxuICAgICAgaW5wdXQuYmx1cigpO1xuICAgICAgZXhwZWN0KGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLm5vdC50b0JlKGlucHV0KTtcblxuICAgICAgcmVyZW5kZXJXaXRoKHsgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJ0EnIH0gfSk7XG5cbiAgICAgIGV4cGVjdChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS50b0JlKGlucHV0KTtcbiAgICB9KTtcblxuICAgIGl0KCdsZWF2ZXMgdGhlIGNhcmV0IHdoZXJlIHRoZSB1c2VyIHB1dCBpdCB3aGlsZSB0aGUgaW5wdXQgaGFzIHRoZSBmb2N1cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQsIHJlcmVuZGVyV2l0aCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgYXV0b0ZvY3VzOiB0cnVlLCBtYXJrOiB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnQUJDJyB9IH0pO1xuXG4gICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSgxLCAxKTtcblxuICAgICAgcmVyZW5kZXJXaXRoKHsgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJ0FCQycgfSB9KTtcblxuICAgICAgZXhwZWN0KGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLnRvQmUoaW5wdXQpO1xuICAgICAgZXhwZWN0KGlucHV0LnNlbGVjdGlvblN0YXJ0KS50b0JlKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZvY3VzZXMgdGhlIGlucHV0IG9uY2UgaXQgaXMgbm8gbG9uZ2VyIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyByZXJlbmRlcldpdGgsIGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgYXV0b0ZvY3VzOiB0cnVlLCBkaXNhYmxlZDogdHJ1ZSB9KTtcblxuICAgICAgcmVyZW5kZXJXaXRoKHsgZGlzYWJsZWQ6IGZhbHNlIH0pO1xuXG4gICAgICBleHBlY3QoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkudG9CZShpbnB1dChjb250YWluZXIpKTtcbiAgICB9KTtcblxuICAgIC8vIHRoZSBob3N0IHNhdmVzIHRoZSBtb2RlbCB3aXRoIGFuIGFwaSBjYWxsIGFuZCB0aGUgbW9kZWwgdGhhdCBjb21lcyBiYWNrIGNhbiByZXBsYWNlIHRoZVxuICAgIC8vIGlucHV0IG5vZGUgLSB0aGUgbGFiZWwgaGFzIHRvIGtlZXAgdGhlIGZvY3VzIGFjcm9zcyB0aGF0IHJlbW91bnRcbiAgICBpdCgncmUtZm9jdXNlcyB0aGUgaW5wdXQgd2hlbiBpdCBpcyByZW1vdW50ZWQgd2hpbGUgYmVpbmcgZWRpdGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIGF1dG9Gb2N1czogdHJ1ZSxcbiAgICAgICAgb25DaGFuZ2UsXG4gICAgICAgIGlucHV0UmVmOiBqZXN0LmZuKCksXG4gICAgICAgIG1hcms6IHsgeDogMSwgeTogMSwgbGFiZWw6ICdBJyB9LFxuICAgICAgICBncmFwaFByb3BzOiBnZXRHcmFwaFByb3BzKDAsIDEwLCAwLCAxMCksXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIsIHJlcmVuZGVyIH0gPSByZW5kZXIoPE1hcmtMYWJlbCBrZXk9XCJmaXJzdFwiIHsuLi5wcm9wc30gLz4pO1xuICAgICAgY29uc3QgZmlyc3QgPSBpbnB1dChjb250YWluZXIpO1xuXG4gICAgICBleHBlY3QoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkudG9CZShmaXJzdCk7XG5cbiAgICAgIHJlcmVuZGVyKDxNYXJrTGFiZWwga2V5PVwic2Vjb25kXCIgey4uLnByb3BzfSAvPik7XG4gICAgICBjb25zdCBzZWNvbmQgPSBpbnB1dChjb250YWluZXIpO1xuXG4gICAgICBleHBlY3Qoc2Vjb25kKS5ub3QudG9CZShmaXJzdCk7XG4gICAgICBleHBlY3QoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkudG9CZShzZWNvbmQpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyB0aGUgdG9vbCBhc2tzIGZvciB0aGUgZm9jdXMgd2l0aCBhdXRvRm9jdXMsIGJ1dCBpdHMgc3RhdGUgY2FuIGJlIGdvbmUgYmVmb3JlIHRoZSBpbnB1dCByZW5kZXJzOlxuICAvLyB0aGUgbWFya3MgY29tZSBiYWNrIGZyb20gdGhlIGhvc3QgYXN5bmNocm9ub3VzbHkgYW5kIGNhbiByZW1vdW50IHRoZSB0b29sLiBBbiBlbXB0eSBsYWJlbCBpblxuICAvLyBsYWJlbCBtb2RlIGlzIGEgbGFiZWwgdGhlIHVzZXIgaGFzIGp1c3QgYWRkZWQsIHNvIHRoZSBpbnB1dCBjYW4gdGVsbCBvbiBpdHMgb3duLlxuICBkZXNjcmliZSgnYSBsYWJlbCB0aGF0IHdhcyBqdXN0IGFkZGVkJywgKCkgPT4ge1xuICAgIGl0KCdmb2N1c2VzIGl0c2VsZiB3aXRob3V0IHRoZSB0b29sIGFza2luZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHJlbmRlckNvbXBvbmVudCh7IG1hcms6IHsgeDogMSwgeTogMSwgbGFiZWw6ICcnIH0gfSk7XG5cbiAgICAgIGV4cGVjdChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS50b0JlKGlucHV0KTtcbiAgICB9KTtcblxuICAgIGl0KCdmb2N1c2VzIGl0c2VsZiBhZ2FpbiB3aGVuIGl0IGlzIHJlbW91bnRlZCBiZWZvcmUgaXQgd2FzIHR5cGVkIGludG8nLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgb25DaGFuZ2UsXG4gICAgICAgIG9uQmx1cixcbiAgICAgICAgaW5wdXRSZWY6IGplc3QuZm4oKSxcbiAgICAgICAgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJycgfSxcbiAgICAgICAgZ3JhcGhQcm9wczogZ2V0R3JhcGhQcm9wcygwLCAxMCwgMCwgMTApLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyLCByZXJlbmRlciB9ID0gcmVuZGVyKDxNYXJrTGFiZWwga2V5PVwiZmlyc3RcIiB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGZpcnN0ID0gaW5wdXQoY29udGFpbmVyKTtcblxuICAgICAgcmVyZW5kZXIoPE1hcmtMYWJlbCBrZXk9XCJzZWNvbmRcIiB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IHNlY29uZCA9IGlucHV0KGNvbnRhaW5lcik7XG5cbiAgICAgIGV4cGVjdChzZWNvbmQpLm5vdC50b0JlKGZpcnN0KTtcbiAgICAgIGV4cGVjdChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS50b0JlKHNlY29uZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3RvcHMgY2hhc2luZyB0aGUgZm9jdXMgb25jZSBpdCBoYXMgYmVlbiBsZWZ0JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBpbnB1dCwgcmVyZW5kZXJXaXRoIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnJyB9IH0pO1xuXG4gICAgICBleHBlY3QoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkudG9CZShpbnB1dCk7XG5cbiAgICAgIGlucHV0LmJsdXIoKTtcbiAgICAgIHJlcmVuZGVyV2l0aCh7IG1hcms6IHsgeDogMSwgeTogMSwgbGFiZWw6ICcnIH0gfSk7XG5cbiAgICAgIGV4cGVjdChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS5ub3QudG9CZShpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBvdXRzaWRlIG9mIGxhYmVsIG1vZGUgdGhlIGlucHV0IGlzIGRpc2FibGVkLCB3aGljaCBpcyBob3cgYW4gZW1wdHkgbGFiZWwgdGhhdCB3YXMgbG9hZGVkIHdpdGhcbiAgICAvLyB0aGUgaXRlbSBpcyB0b2xkIGFwYXJ0IGZyb20gb25lIHRoZSB1c2VyIGhhcyBqdXN0IGFkZGVkIC0gbGFiZWwgbW9kZSBhbHdheXMgc3RhcnRzIG9mZlxuICAgIC8vIHRoZSBjb25maWcgZHJhd3MgdGhlIGJhY2tncm91bmQgbWFya3MgaW50byB0aGUgY29ycmVjdCBhbnN3ZXIgZ3JhcGhzIGFzIGRpc2FibGVkIG1hcmtzXG4gICAgaXQoJ2lzIG5vdCByZW5kZXJlZCBhdCBhbGwgd2hpbGUgaXQgY2Fubm90IGJlIGVkaXRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBkaXNhYmxlZDogdHJ1ZSwgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJycgfSB9KTtcblxuICAgICAgZXhwZWN0KGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpKS50b0JlKG51bGwpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIHN0aWxsIHJlbmRlcmVkIHVuZWRpdGFibGUgb25jZSBpdCBoYXMgdGV4dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBkaXNhYmxlZDogdHJ1ZSwgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJ0EnIH0gfSk7XG5cbiAgICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignaW5wdXQnKS52YWx1ZSkudG9CZSgnQScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIG5vdCBmb2N1c2VkIHdoZW4gbGFiZWwgbW9kZSBpcyB0dXJuZWQgb24gYWZ0ZXJ3YXJkcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcmVyZW5kZXJXaXRoLCBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGRpc2FibGVkOiB0cnVlLCBtYXJrOiB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnJyB9IH0pO1xuXG4gICAgICByZXJlbmRlcldpdGgoeyBkaXNhYmxlZDogZmFsc2UgfSk7XG5cbiAgICAgIGV4cGVjdChpbnB1dChjb250YWluZXIpKS5ub3QudG9CZShudWxsKTtcbiAgICAgIGV4cGVjdChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS5ub3QudG9CZShpbnB1dChjb250YWluZXIpKTtcbiAgICB9KTtcblxuICAgIGl0KCdpcyBub3QgcmVuZGVyZWQgZm9yIGEgZGlzYWJsZWQgbWFyayB3aGlsZSBpdCBpcyBlbXB0eScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnJywgZGlzYWJsZWQ6IHRydWUgfSB9KTtcblxuICAgICAgZXhwZWN0KGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpKS50b0JlKG51bGwpO1xuICAgIH0pO1xuXG4gICAgLy8gYW4gaW5wdXQgc2l6ZWQgdG8gaXRzIGNvbnRlbnQgaXMgMnB4IHdpZGUgd2hpbGUgaXQgaXMgZW1wdHksIGFuZCBjaHJvbWUgcGFpbnRzIHRoZSBjYXJldCBvZlxuICAgIC8vIGFuIGlucHV0IGluc2lkZSBhbiBzdmcgZm9yZWlnbk9iamVjdCBhcyBhIGhhaXJsaW5lIHRoYXQgbmV2ZXIgYmxpbmtzIC0gc28gYW4gZW1wdHkgbGFiZWwgdGhhdFxuICAgIC8vIGhhcyB0aGUgZm9jdXMgaGFzIHRvIGJlIHdpZGUgZW5vdWdoIHRvIGJlIHNlZW4gYXMgYSBib3ggd2FpdGluZyBmb3IgdGV4dFxuICAgIGl0KCdpcyB3aWRlIGVub3VnaCB0byBiZSBzZWVuIHdoaWxlIGl0IGlzIGVtcHR5JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJycgfSB9KTtcblxuICAgICAgZXhwZWN0KHBhcnNlSW50KGlucHV0LnN0eWxlLndpZHRoLCAxMCkpLnRvQmVHcmVhdGVyVGhhbk9yRXF1YWwoMzApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIG9ubHkgYXMgd2lkZSBhcyBpdHMgdGV4dCBvbmNlIGl0IGNhbm5vdCBiZSBlZGl0ZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgZGlzYWJsZWQ6IHRydWUsIG1hcms6IHsgeDogMSwgeTogMSwgbGFiZWw6ICdBJyB9IH0pO1xuXG4gICAgICBleHBlY3QocGFyc2VJbnQoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jykuc3R5bGUud2lkdGgsIDEwKSkudG9CZUxlc3NUaGFuKDMwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3N5bmNpbmcgbWFyay5sYWJlbCBpbnRvIHRoZSBpbnB1dCcsICgpID0+IHtcbiAgICBpdCgncGlja3MgdXAgYSBuZXcgbWFyay5sYWJlbCB3aGlsZSB0aGUgaW5wdXQgZG9lcyBub3QgaGF2ZSB0aGUgZm9jdXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHJlcmVuZGVyV2l0aCwgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnQScgfSB9KTtcblxuICAgICAgcmVyZW5kZXJXaXRoKHsgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJ3VwZGF0ZWQnIH0gfSk7XG5cbiAgICAgIGV4cGVjdChpbnB1dChjb250YWluZXIpLnZhbHVlKS50b0JlKCd1cGRhdGVkJyk7XG4gICAgfSk7XG5cbiAgICAvLyBhIG1hcmsgY29taW5nIGJhY2sgZnJvbSBhbiAoYXN5bmMpIG1vZGVsIHNhdmUgY2FuIGNhcnJ5IGFuIG9sZGVyIGxhYmVsIC0gYXBwbHlpbmcgaXQgd291bGRcbiAgICAvLyB3aXBlIG91dCB0aGUgY2hhcmFjdGVycyB0eXBlZCBpbiB0aGUgbWVhbnRpbWVcbiAgICBpdCgna2VlcHMgd2hhdCB0aGUgdXNlciB0eXBlZCB3aGlsZSB0aGUgaW5wdXQgaGFzIHRoZSBmb2N1cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQsIHJlcmVuZGVyV2l0aCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgYXV0b0ZvY3VzOiB0cnVlIH0pO1xuXG4gICAgICBleHBlY3QoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkudG9CZShpbnB1dCk7XG5cbiAgICAgIGZpcmVFdmVudC5jaGFuZ2UoaW5wdXQsIHsgdGFyZ2V0OiB7IHZhbHVlOiAnQUInIH0gfSk7XG4gICAgICBleHBlY3QoaW5wdXQudmFsdWUpLnRvQmUoJ0FCJyk7XG5cbiAgICAgIC8vIHRoZSBob3N0IGVjaG9lcyBiYWNrIHRoZSBsYWJlbCBhcyBpdCB3YXMgb25lIGtleXN0cm9rZSBhZ29cbiAgICAgIHJlcmVuZGVyV2l0aCh7IG1hcms6IHsgeDogMSwgeTogMSwgbGFiZWw6ICdBJyB9IH0pO1xuXG4gICAgICBleHBlY3QoaW5wdXQudmFsdWUpLnRvQmUoJ0FCJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIHRoZSBjaGFyYWN0ZXJzIGxhbmQgYXQgdGhlIGRvY3VtZW50J3MgY2FyZXQsIG5vdCBhdCB0aGUgZm9jdXNlZCBub2RlLiBJbiB0aGUgYXV0aG9yaW5nXG4gIC8vIGVudmlyb25tZW50IHRoZSBpbnB1dCBlbmRzIHVwIGZvY3VzZWQgd2l0aCBubyBjYXJldCBhbnl3aGVyZToga2V5cHJlc3MgZmlyZXMgYW5kIG5vdGhpbmcgaXNcbiAgLy8gaW5zZXJ0ZWQuIGpzZG9tIG5ldmVyIHJlcG9ydHMgYSBjYXJldCBlaXRoZXIsIHNvIHRoaXMgaXMgdGhhdCBzdGF0ZSAtIHRoZSBmb2N1cyBjeWNsZSB0aGF0XG4gIC8vIHJlcGFpcnMgaXQgbXVzdCBub3QgaGFuZCB0aGUgbGFiZWwgb3ZlciB0byB0aGUgYmx1ciBoYW5kbGluZy5cbiAgZGVzY3JpYmUoJ2EgZm9jdXNlZCBpbnB1dCB3aXRoIG5vIGNhcmV0JywgKCkgPT4ge1xuICAgIGl0KCdpcyByZXBhaXJlZCB3aXRob3V0IHJlcG9ydGluZyB0aGUgbGFiZWwgYXMgcmVtb3ZlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHJlbmRlckNvbXBvbmVudCh7IGF1dG9Gb2N1czogdHJ1ZSwgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJycgfSB9KTtcblxuICAgICAgZXhwZWN0KGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLnRvQmUoaW5wdXQpO1xuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgZXhwZWN0KG9uQmx1cikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdsZWF2ZXMgdGhlIGNhcmV0IGF0IHRoZSBlbmQgb2YgYSBsYWJlbCB0aGF0IGFscmVhZHkgaGFzIHRleHQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGlucHV0IH0gPSByZW5kZXJDb21wb25lbnQoeyBhdXRvRm9jdXM6IHRydWUsIG1hcms6IHsgeDogMSwgeTogMSwgbGFiZWw6ICdBQicgfSB9KTtcblxuICAgICAgZXhwZWN0KGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLnRvQmUoaW5wdXQpO1xuICAgICAgZXhwZWN0KGlucHV0LnNlbGVjdGlvblN0YXJ0KS50b0JlKDIpO1xuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBjbGlja2luZyBhbm90aGVyIHdpbmRvdywgdGhlIGRldnRvb2xzLCBvciB0aGUgaG9zdCBtb3ZpbmcgdGhlIGZvY3VzIHdoaWxlIGl0IHNhdmVzIHRoZSBtb2RlbDpcbiAgLy8gdGhlIGxhYmVsIGlzIG5vdCBiZWluZyBsZWZ0LCBzbyBpdCBtdXN0IHN1cnZpdmUgYW5kIHRha2UgdGhlIGZvY3VzIGJhY2tcbiAgZGVzY3JpYmUoJ3doaWxlIHRoZSB3aW5kb3cgaXMgYXdheScsICgpID0+IHtcbiAgICBjb25zdCB3aW5kb3dHb2VzQXdheSA9ICgpID0+IHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnYmx1cicpKTtcbiAgICBjb25zdCB3aW5kb3dDb21lc0JhY2sgPSAoKSA9PiB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2ZvY3VzJykpO1xuXG4gICAgaXQoJ2tlZXBzIGFuIGVtcHR5IGxhYmVsIGluc3RlYWQgb2YgcmVwb3J0aW5nIGl0IGFzIHJlbW92ZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGlucHV0IH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnJyB9IH0pO1xuXG4gICAgICB3aW5kb3dHb2VzQXdheSgpO1xuICAgICAgZmlyZUV2ZW50LmJsdXIoaW5wdXQpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICBleHBlY3Qob25CbHVyKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rha2VzIHRoZSBmb2N1cyBiYWNrIHdoZW4gdGhlIHdpbmRvdyBjb21lcyBiYWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgYXV0b0ZvY3VzOiB0cnVlLCBtYXJrOiB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnJyB9IH0pO1xuXG4gICAgICAvLyB0aGUgZm9jdXMgaXMgbW92ZWQgdG8gYW5vdGhlciBpbnB1dCByYXRoZXIgdGhhbiB3aXRoIGlucHV0LmJsdXIoKToganNkb20gZmlyZXMgYSB3aW5kb3dcbiAgICAgIC8vIGZvY3VzIGV2ZW50IGFzIHBhcnQgb2YgYmx1cigpLCB3aGljaCBpcyB0aGUgdmVyeSB0aGluZyBiZWluZyB0ZXN0ZWQgaGVyZVxuICAgICAgY29uc3QgZWxzZXdoZXJlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcblxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbHNld2hlcmUpO1xuXG4gICAgICB3aW5kb3dHb2VzQXdheSgpO1xuICAgICAgZWxzZXdoZXJlLmZvY3VzKCk7XG4gICAgICBleHBlY3QoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkudG9CZShlbHNld2hlcmUpO1xuXG4gICAgICB3aW5kb3dDb21lc0JhY2soKTtcblxuICAgICAgZXhwZWN0KGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLnRvQmUoaW5wdXQpO1xuXG4gICAgICBlbHNld2hlcmUucmVtb3ZlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3RpbGwgcmVwb3J0cyBhIGxhYmVsIHRoZSB1c2VyIGxlYXZlcyBvbmNlIHRoZSB3aW5kb3cgaXMgYmFjaycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHJlbmRlckNvbXBvbmVudCh7IG1hcms6IHsgeDogMSwgeTogMSwgbGFiZWw6ICcnIH0gfSk7XG5cbiAgICAgIHdpbmRvd0dvZXNBd2F5KCk7XG4gICAgICB3aW5kb3dDb21lc0JhY2soKTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKGlucHV0KTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvbkJsdXInLCAoKSA9PiB7XG4gICAgaXQoJ2lzIGNhbGxlZCBzbyB0aGUgdG9vbCBzdG9wcyBhdXRvIGZvY3VzaW5nIHRoZSBsYWJlbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHJlbmRlckNvbXBvbmVudCh7IGF1dG9Gb2N1czogdHJ1ZSwgbWFyazogeyB4OiAxLCB5OiAxLCBsYWJlbDogJ0EnIH0gfSk7XG5cbiAgICAgIGZpcmVFdmVudC5ibHVyKGlucHV0KTtcblxuICAgICAgZXhwZWN0KG9uQmx1cikudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gY2xpY2tpbmcgYSBidXR0b24gb3IgYW55dGhpbmcgZWxzZSBpbnRlcmFjdGl2ZSBibHVycyB0aGUgbGFiZWwgd2hpbGUgdGhlIGRlYm91bmNlIGlzIHBlbmRpbmdcbiAgICBpdCgnc2F2ZXMgd2hhdCB3YXMgdHlwZWQgc3RyYWlnaHQgYXdheScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHJlbmRlckNvbXBvbmVudCh7IG1hcms6IHsgeDogMSwgeTogMSwgbGFiZWw6ICcnIH0gfSk7XG5cbiAgICAgIGZpcmVFdmVudC5jaGFuZ2UoaW5wdXQsIHsgdGFyZ2V0OiB7IHZhbHVlOiAnQUInIH0gfSk7XG4gICAgICBmaXJlRXZlbnQuYmx1cihpbnB1dCk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ0FCJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3Qgc2F2ZSBpdCB0d2ljZSB3aGVuIHRoZSBkZWJvdW5jZSBjYXRjaGVzIHVwJywgKCkgPT4ge1xuICAgICAgamVzdC51c2VGYWtlVGltZXJzKCk7XG4gICAgICBjb25zdCB7IGlucHV0IH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiB7IHg6IDEsIHk6IDEsIGxhYmVsOiAnJyB9IH0pO1xuXG4gICAgICBmaXJlRXZlbnQuY2hhbmdlKGlucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJ0FCJyB9IH0pO1xuICAgICAgZmlyZUV2ZW50LmJsdXIoaW5wdXQpO1xuICAgICAgYWN0KCgpID0+IGplc3QuYWR2YW5jZVRpbWVyc0J5VGltZSgxMDAwKSk7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnQUInKTtcbiAgICAgIGplc3QudXNlUmVhbFRpbWVycygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlcG9ydHMgYW4gZW1wdHkgbGFiZWwgb24gYmx1cicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHJlbmRlckNvbXBvbmVudCh7IG1hcms6IHsgeDogMSwgeTogMSwgbGFiZWw6ICdBJyB9IH0pO1xuXG4gICAgICBmaXJlRXZlbnQuY2hhbmdlKGlucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJycgfSB9KTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKGlucHV0KTtcblxuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkZWJvdW5jZScsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IGplc3QudXNlRmFrZVRpbWVycygpKTtcbiAgICBhZnRlckVhY2goKCkgPT4gamVzdC51c2VSZWFsVGltZXJzKCkpO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlcG9ydCB0aGUgdHlwZWQgbGFiZWwgYmVmb3JlIHRoZSBkZWJvdW5jZSBkZWxheSBlbGFwc2VzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gcmVuZGVyQ29tcG9uZW50KHsgYXV0b0ZvY3VzOiB0cnVlIH0pO1xuXG4gICAgICBmaXJlRXZlbnQuY2hhbmdlKGlucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJ0EnIH0gfSk7XG5cbiAgICAgIGFjdCgoKSA9PiBqZXN0LmFkdmFuY2VUaW1lcnNCeVRpbWUoNDk5KSk7XG4gICAgICBleHBlY3Qob25DaGFuZ2UpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG5cbiAgICAgIGFjdCgoKSA9PiBqZXN0LmFkdmFuY2VUaW1lcnNCeVRpbWUoMSkpO1xuICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnQScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlcG9ydHMgdGhlIGxhYmVsIG9uY2UgZm9yIGEgYnVyc3Qgb2Yga2V5c3Ryb2tlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHJlbmRlckNvbXBvbmVudCh7IGF1dG9Gb2N1czogdHJ1ZSB9KTtcblxuICAgICAgZmlyZUV2ZW50LmNoYW5nZShpbnB1dCwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdBJyB9IH0pO1xuICAgICAgYWN0KCgpID0+IGplc3QuYWR2YW5jZVRpbWVyc0J5VGltZSgzMDApKTtcbiAgICAgIGZpcmVFdmVudC5jaGFuZ2UoaW5wdXQsIHsgdGFyZ2V0OiB7IHZhbHVlOiAnQUInIH0gfSk7XG4gICAgICBhY3QoKCkgPT4gamVzdC5hZHZhbmNlVGltZXJzQnlUaW1lKDMwMCkpO1xuICAgICAgZmlyZUV2ZW50LmNoYW5nZShpbnB1dCwgeyB0YXJnZXQ6IHsgdmFsdWU6ICdBQkMnIH0gfSk7XG4gICAgICBhY3QoKCkgPT4gamVzdC5hZHZhbmNlVGltZXJzQnlUaW1lKDUwMCkpO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ0FCQycpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgncG9zaXRpb24nLCAoKSA9PiB7XG4gIGNvbnN0IGFzc2VydFBvc2l0aW9uID0gKG1hcmssIHJlY3QsIGV4cGVjdGVkKSA9PiB7XG4gICAgaXQoYCR7bWFyay54fSwke21hcmsueX0gKyAke3JlY3Qud2lkdGh9LCR7cmVjdC5oZWlnaHR9ID0+ICR7ZXhwZWN0ZWR9YCwgKCkgPT4ge1xuICAgICAgLy8gd2Ugc2V0IHJhbmdlLm1pbiB0byBhIHZhbHVlIGJlY2F1c2UgaW4gcGl4ZWxzIC0gdGhlIGdyZWF0ZXIgdGhlIFkgdGhlIGxvd2VyIGRvd24gb24gdGhlIHNjcmVlbi5cbiAgICAgIGNvbnN0IGdyYXBoUHJvcHMgPSBnZXRHcmFwaFByb3BzKDAsIDEyLCAxMiwgMCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBwb3NpdGlvbihncmFwaFByb3BzLCBtYXJrLCByZWN0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9O1xuXG4gIGFzc2VydFBvc2l0aW9uKHsgeDogMCwgeTogMCB9LCB7IHdpZHRoOiAxMCwgaGVpZ2h0OiAxMCB9LCAndG9wLWxlZnQnKTtcbiAgYXNzZXJ0UG9zaXRpb24oeyB4OiAwLCB5OiAwIH0sIHsgd2lkdGg6IDEsIGhlaWdodDogMSB9LCAnYm90dG9tLXJpZ2h0Jyk7XG4gIGFzc2VydFBvc2l0aW9uKHsgeDogMCwgeTogMCB9LCB7IHdpZHRoOiAxMCwgaGVpZ2h0OiAwIH0sICdib3R0b20tbGVmdCcpO1xuICBhc3NlcnRQb3NpdGlvbih7IHg6IDAsIHk6IDAgfSwgeyB3aWR0aDogMCwgaGVpZ2h0OiAxMCB9LCAndG9wLXJpZ2h0Jyk7XG59KTtcblxuZGVzY3JpYmUoJ2Nvb3JkaW5hdGVzJywgKCkgPT4ge1xuICBjb25zdCBhc3NlcnRDb29yZGluYXRlcyA9IChtYXJrLCByZWN0LCBwb3MsIGV4cGVjdGVkKSA9PiB7XG4gICAgaXQoYCR7bWFyay54fSwgJHttYXJrLnl9IC0+ICR7cG9zfSA9ICR7ZXhwZWN0ZWQubGVmdH0sICR7ZXhwZWN0ZWQudG9wfWAsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvb3JkaW5hdGVzKGdldEdyYXBoUHJvcHMoKSwgbWFyaywgcmVjdCwgcG9zKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9O1xuICBhc3NlcnRDb29yZGluYXRlcyh7IHg6IDAsIHk6IDAgfSwgeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0sICd0b3AtbGVmdCcsIHsgbGVmdDogLTUsIHRvcDogLTUgfSk7XG4gIGFzc2VydENvb3JkaW5hdGVzKHsgeDogMCwgeTogMCB9LCB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSwgJ2JvdHRvbS1sZWZ0JywgeyBsZWZ0OiAtNSwgdG9wOiA1IH0pO1xuICBhc3NlcnRDb29yZGluYXRlcyh7IHg6IDAsIHk6IDAgfSwgeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0sICd0b3AtcmlnaHQnLCB7IGxlZnQ6IDUsIHRvcDogLTUgfSk7XG4gIGFzc2VydENvb3JkaW5hdGVzKHsgeDogMCwgeTogMCB9LCB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSwgJ2JvdHRvbS1yaWdodCcsIHtcbiAgICBsZWZ0OiA1LFxuICAgIHRvcDogNSxcbiAgfSk7XG59KTtcbiJdLCJt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
|