@pie-lib/plot 3.1.0-next.0 → 3.1.0-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,773 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
5
- var _react = require("@testing-library/react");
6
- var _react2 = _interopRequireDefault(require("react"));
7
- var _gridDraggable = require("../grid-draggable");
8
- var _utils = require("../utils");
9
- var _d3Selection = require("d3-selection");
10
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
11
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
12
- jest.mock('d3-selection', function () {
13
- return {
14
- clientPoint: jest.fn().mockReturnValue([0, 0])
15
- };
16
- });
17
- var mockDraggableCoreProps;
18
- jest.mock('../draggable', function () {
19
- return {
20
- DraggableCore: function DraggableCore(props) {
21
- // Store the props so tests can call the handlers
22
- mockDraggableCoreProps = props;
23
- return props.children;
24
- }
25
- };
26
- });
27
- jest.mock('../utils', function () {
28
- return {
29
- getDelta: jest.fn()
30
- };
31
- });
32
- var xyFn = function xyFn() {
33
- var out = jest.fn(function (n) {
34
- return n;
35
- });
36
- out.invert = jest.fn(function (n) {
37
- return n;
38
- });
39
- return out;
40
- };
41
- var getGraphProps = function getGraphProps() {
42
- return {
43
- scale: {
44
- x: xyFn(),
45
- y: xyFn()
46
- },
47
- snap: {
48
- x: xyFn(),
49
- y: xyFn()
50
- },
51
- domain: {
52
- min: 0,
53
- max: 1,
54
- step: 1
55
- },
56
- range: {
57
- min: 0,
58
- max: 1,
59
- step: 1
60
- },
61
- size: {
62
- width: 500,
63
- height: 500
64
- },
65
- getRootNode: function getRootNode() {
66
- return {
67
- ownerSVGElement: null,
68
- getBoundingClientRect: function getBoundingClientRect() {
69
- return {
70
- left: 0,
71
- top: 0,
72
- right: 100,
73
- bottom: 100
74
- };
75
- }
76
- };
77
- }
78
- };
79
- };
80
- describe('gridDraggable', function () {
81
- var defaultOptions;
82
- var defaultProps;
83
- beforeEach(function () {
84
- mockDraggableCoreProps = null;
85
- defaultOptions = {
86
- anchorPoint: jest.fn().mockReturnValue({
87
- x: 0,
88
- y: 0
89
- }),
90
- bounds: jest.fn().mockReturnValue({
91
- left: 0,
92
- top: 0,
93
- bottom: 0,
94
- right: 0
95
- }),
96
- fromDelta: jest.fn()
97
- };
98
- defaultProps = {
99
- graphProps: getGraphProps()
100
- };
101
- });
102
- it('renders regular component', function () {
103
- var Comp = (0, _gridDraggable.gridDraggable)(defaultOptions)(function () {
104
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
105
- });
106
- var _render = (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, defaultProps)),
107
- container = _render.container;
108
- expect(container.firstChild).toBeInTheDocument();
109
- });
110
- it('renders with decimal domain and range', function () {
111
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
112
- graphProps: _objectSpread(_objectSpread({}, getGraphProps()), {}, {
113
- domain: {
114
- min: -1.5,
115
- max: 1.6,
116
- step: 0.3
117
- },
118
- range: {
119
- min: -2,
120
- max: 3,
121
- step: 0.2
122
- }
123
- })
124
- });
125
- var Comp = (0, _gridDraggable.gridDraggable)(defaultOptions)(function () {
126
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
127
- });
128
- var _render2 = (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props)),
129
- container = _render2.container;
130
- expect(container.firstChild).toBeInTheDocument();
131
- });
132
- describe('logic', function () {
133
- describe('grid calculation', function () {
134
- it('passes correct grid to DraggableCore based on domain and range step', function () {
135
- var Comp = (0, _gridDraggable.gridDraggable)(defaultOptions)(function () {
136
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
137
- });
138
- (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, defaultProps));
139
-
140
- // Grid is calculated as: scale.x(domain.step) - scale.x(0)
141
- // With our mock xyFn that returns n, this is: step - 0 = step
142
- expect(mockDraggableCoreProps.grid).toEqual([1, 1]);
143
- });
144
- it('calculates grid with decimal steps', function () {
145
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
146
- graphProps: _objectSpread(_objectSpread({}, getGraphProps()), {}, {
147
- domain: {
148
- min: -1.5,
149
- max: 1.6,
150
- step: 0.3
151
- },
152
- range: {
153
- min: -2,
154
- max: 3,
155
- step: 0.2
156
- }
157
- })
158
- });
159
- var Comp = (0, _gridDraggable.gridDraggable)(defaultOptions)(function () {
160
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
161
- });
162
- (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
163
- expect(mockDraggableCoreProps.grid).toEqual([0.3, 0.2]);
164
- });
165
- });
166
- describe('onStart', function () {
167
- it('calls onDragStart handler when drag starts', function () {
168
- var onDragStart = jest.fn();
169
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
170
- onDragStart: onDragStart
171
- });
172
- var Comp = (0, _gridDraggable.gridDraggable)(defaultOptions)(function () {
173
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
174
- });
175
- (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
176
-
177
- // Simulate drag start
178
- mockDraggableCoreProps.onStart({
179
- clientX: 100,
180
- clientY: 100
181
- });
182
- expect(onDragStart).toHaveBeenCalled();
183
- });
184
- });
185
- describe('onDrag', function () {
186
- it('calls onDrag callback with result from fromDelta', function () {
187
- var onDrag = jest.fn();
188
- var fromDelta = jest.fn().mockReturnValue('delta-result');
189
- var bounds = jest.fn().mockReturnValue({
190
- left: -100,
191
- top: -100,
192
- bottom: 100,
193
- right: 100
194
- });
195
- var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
196
- fromDelta: fromDelta,
197
- bounds: bounds
198
- });
199
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
200
- onDrag: onDrag
201
- });
202
- var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
203
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
204
- });
205
- (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
206
-
207
- // Set up drag start state
208
- mockDraggableCoreProps.onStart({
209
- clientX: 0,
210
- clientY: 0
211
- });
212
-
213
- // Simulate drag
214
- mockDraggableCoreProps.onDrag({}, {
215
- deltaX: 10,
216
- deltaY: 10
217
- });
218
- expect(fromDelta).toHaveBeenCalled();
219
- expect(onDrag).toHaveBeenCalledWith('delta-result');
220
- });
221
- it('does not call onDrag when no onDrag handler is provided', function () {
222
- var fromDelta = jest.fn();
223
- var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
224
- fromDelta: fromDelta
225
- });
226
- var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
227
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
228
- });
229
- (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, defaultProps));
230
- mockDraggableCoreProps.onStart({
231
- clientX: 0,
232
- clientY: 0
233
- });
234
- mockDraggableCoreProps.onDrag({}, {
235
- deltaX: 10,
236
- deltaY: 10
237
- });
238
- expect(fromDelta).not.toHaveBeenCalled();
239
- });
240
- describe('bounds checking', function () {
241
- it('does not call onDrag when dragging left beyond left bound', function () {
242
- var onDrag = jest.fn();
243
- var bounds = jest.fn().mockReturnValue({
244
- left: 0,
245
- top: 0,
246
- bottom: 0,
247
- right: 0
248
- });
249
- var fromDelta = jest.fn().mockReturnValue('result');
250
- var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
251
- bounds: bounds,
252
- fromDelta: fromDelta
253
- });
254
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
255
- onDrag: onDrag
256
- });
257
- var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
258
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
259
- });
260
- (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
261
- mockDraggableCoreProps.onStart({
262
- clientX: 0,
263
- clientY: 0
264
- });
265
- // deltaX < 0 and deltaX < scaled bounds.left (0), so -10 < 0 triggers early return
266
- mockDraggableCoreProps.onDrag({}, {
267
- deltaX: -10,
268
- deltaY: 0
269
- });
270
- expect(onDrag).not.toHaveBeenCalled();
271
- });
272
- it('does not call onDrag when dragging right beyond right bound', function () {
273
- var onDrag = jest.fn();
274
- var bounds = jest.fn().mockReturnValue({
275
- left: 0,
276
- top: 0,
277
- bottom: 0,
278
- right: 0
279
- });
280
- var fromDelta = jest.fn().mockReturnValue('result');
281
- var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
282
- bounds: bounds,
283
- fromDelta: fromDelta
284
- });
285
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
286
- onDrag: onDrag
287
- });
288
- var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
289
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
290
- });
291
- (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
292
- mockDraggableCoreProps.onStart({
293
- clientX: 0,
294
- clientY: 0
295
- });
296
- // deltaX > 0 and deltaX > scaled bounds.right (0), so 10 > 0 triggers early return
297
- mockDraggableCoreProps.onDrag({}, {
298
- deltaX: 10,
299
- deltaY: 0
300
- });
301
- expect(onDrag).not.toHaveBeenCalled();
302
- });
303
- it('does not call onDrag when dragging up beyond top bound', function () {
304
- var onDrag = jest.fn();
305
- var bounds = jest.fn().mockReturnValue({
306
- left: -100,
307
- top: 0,
308
- bottom: 0,
309
- right: 100
310
- });
311
- var fromDelta = jest.fn().mockReturnValue('result');
312
- var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
313
- bounds: bounds,
314
- fromDelta: fromDelta
315
- });
316
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
317
- onDrag: onDrag
318
- });
319
- var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
320
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
321
- });
322
- (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
323
- mockDraggableCoreProps.onStart({
324
- clientX: 0,
325
- clientY: 0
326
- });
327
- // deltaY < 0 and deltaY < scaled bounds.top (0), so -10 < 0 triggers early return
328
- mockDraggableCoreProps.onDrag({}, {
329
- deltaX: 0,
330
- deltaY: -10
331
- });
332
- expect(onDrag).not.toHaveBeenCalled();
333
- });
334
- it('does not call onDrag when dragging down beyond bottom bound', function () {
335
- var onDrag = jest.fn();
336
- var bounds = jest.fn().mockReturnValue({
337
- left: -100,
338
- top: -100,
339
- bottom: 0,
340
- right: 100
341
- });
342
- var fromDelta = jest.fn().mockReturnValue('result');
343
- var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
344
- bounds: bounds,
345
- fromDelta: fromDelta
346
- });
347
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
348
- onDrag: onDrag
349
- });
350
- var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
351
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
352
- });
353
- (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
354
- mockDraggableCoreProps.onStart({
355
- clientX: 0,
356
- clientY: 0
357
- });
358
- // deltaY > 0 and deltaY > scaled bounds.bottom (0), so 10 > 0 triggers early return
359
- mockDraggableCoreProps.onDrag({}, {
360
- deltaX: 0,
361
- deltaY: 10
362
- });
363
- expect(onDrag).not.toHaveBeenCalled();
364
- });
365
- it('calls onDrag when dragging within bounds', function () {
366
- var onDrag = jest.fn();
367
- var bounds = jest.fn().mockReturnValue({
368
- left: -100,
369
- top: -100,
370
- bottom: 100,
371
- right: 100
372
- });
373
- var fromDelta = jest.fn().mockReturnValue('result');
374
- var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
375
- bounds: bounds,
376
- fromDelta: fromDelta
377
- });
378
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
379
- onDrag: onDrag
380
- });
381
- var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
382
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
383
- });
384
- (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
385
- mockDraggableCoreProps.onStart({
386
- clientX: 0,
387
- clientY: 0
388
- });
389
- // All bound checks pass: deltaX (-10) is NOT < bounds.left (-100) and NOT > bounds.right (100)
390
- // Similarly for deltaY
391
- mockDraggableCoreProps.onDrag({}, {
392
- deltaX: -10,
393
- deltaY: 10
394
- });
395
- expect(onDrag).toHaveBeenCalled();
396
- });
397
- });
398
- describe('skipDragOutsideOfBounds', function () {
399
- it('skips drag when moving left and x is below domain.min', function () {
400
- var onDrag = jest.fn();
401
- var graphProps = _objectSpread(_objectSpread({}, getGraphProps()), {}, {
402
- domain: {
403
- min: -5,
404
- max: 5,
405
- step: 1
406
- },
407
- range: {
408
- min: -5,
409
- max: 5,
410
- step: 1
411
- }
412
- });
413
- graphProps.scale.x.invert = jest.fn().mockReturnValue(-6); // Below min
414
-
415
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
416
- graphProps: graphProps,
417
- onDrag: onDrag
418
- });
419
- var bounds = jest.fn().mockReturnValue({
420
- left: 100,
421
- top: 100,
422
- bottom: 100,
423
- right: 100
424
- });
425
- var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
426
- bounds: bounds
427
- });
428
- var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
429
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
430
- });
431
- (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
432
- mockDraggableCoreProps.onStart({
433
- clientX: 0,
434
- clientY: 0
435
- });
436
- mockDraggableCoreProps.onDrag({}, {
437
- deltaX: 1,
438
- deltaY: 0
439
- });
440
- expect(onDrag).not.toHaveBeenCalled();
441
- });
442
- it('skips drag when moving right and x is above domain.max', function () {
443
- var onDrag = jest.fn();
444
- var graphProps = _objectSpread(_objectSpread({}, getGraphProps()), {}, {
445
- domain: {
446
- min: -5,
447
- max: 5,
448
- step: 1
449
- },
450
- range: {
451
- min: -5,
452
- max: 5,
453
- step: 1
454
- }
455
- });
456
- graphProps.scale.x.invert = jest.fn().mockReturnValue(6); // Above max
457
-
458
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
459
- graphProps: graphProps,
460
- onDrag: onDrag
461
- });
462
- var bounds = jest.fn().mockReturnValue({
463
- left: 100,
464
- top: 100,
465
- bottom: 100,
466
- right: 100
467
- });
468
- var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
469
- bounds: bounds
470
- });
471
- var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
472
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
473
- });
474
- (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
475
- mockDraggableCoreProps.onStart({
476
- clientX: 0,
477
- clientY: 0
478
- });
479
- mockDraggableCoreProps.onDrag({}, {
480
- deltaX: -1,
481
- deltaY: 0
482
- });
483
- expect(onDrag).not.toHaveBeenCalled();
484
- });
485
- it('skips drag when moving up and y is above range.max', function () {
486
- var onDrag = jest.fn();
487
- var graphProps = _objectSpread(_objectSpread({}, getGraphProps()), {}, {
488
- domain: {
489
- min: -5,
490
- max: 5,
491
- step: 1
492
- },
493
- range: {
494
- min: -5,
495
- max: 5,
496
- step: 1
497
- }
498
- });
499
- graphProps.scale.y.invert = jest.fn().mockReturnValue(6); // Above max
500
-
501
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
502
- graphProps: graphProps,
503
- onDrag: onDrag
504
- });
505
- var bounds = jest.fn().mockReturnValue({
506
- left: 100,
507
- top: 100,
508
- bottom: 100,
509
- right: 100
510
- });
511
- var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
512
- bounds: bounds
513
- });
514
- var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
515
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
516
- });
517
- (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
518
- mockDraggableCoreProps.onStart({
519
- clientX: 0,
520
- clientY: 0
521
- });
522
- mockDraggableCoreProps.onDrag({}, {
523
- deltaX: 0,
524
- deltaY: 1
525
- });
526
- expect(onDrag).not.toHaveBeenCalled();
527
- });
528
- it('skips drag when moving down and y is below range.min', function () {
529
- var onDrag = jest.fn();
530
- var graphProps = _objectSpread(_objectSpread({}, getGraphProps()), {}, {
531
- domain: {
532
- min: -5,
533
- max: 5,
534
- step: 1
535
- },
536
- range: {
537
- min: -5,
538
- max: 5,
539
- step: 1
540
- }
541
- });
542
- graphProps.scale.y.invert = jest.fn().mockReturnValue(-6); // Below min
543
-
544
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
545
- graphProps: graphProps,
546
- onDrag: onDrag
547
- });
548
- var bounds = jest.fn().mockReturnValue({
549
- left: 100,
550
- top: 100,
551
- bottom: 100,
552
- right: 100
553
- });
554
- var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
555
- bounds: bounds
556
- });
557
- var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
558
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
559
- });
560
- (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
561
- mockDraggableCoreProps.onStart({
562
- clientX: 0,
563
- clientY: 0
564
- });
565
- mockDraggableCoreProps.onDrag({}, {
566
- deltaX: 0,
567
- deltaY: -1
568
- });
569
- expect(onDrag).not.toHaveBeenCalled();
570
- });
571
- it('allows drag when within domain and range', function () {
572
- var onDrag = jest.fn();
573
- var graphProps = _objectSpread(_objectSpread({}, getGraphProps()), {}, {
574
- domain: {
575
- min: -5,
576
- max: 5,
577
- step: 1
578
- },
579
- range: {
580
- min: -5,
581
- max: 5,
582
- step: 1
583
- }
584
- });
585
- graphProps.scale.x.invert = jest.fn().mockReturnValue(3); // Within bounds
586
- graphProps.scale.y.invert = jest.fn().mockReturnValue(2); // Within bounds
587
-
588
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
589
- graphProps: graphProps,
590
- onDrag: onDrag
591
- });
592
- var bounds = jest.fn().mockReturnValue({
593
- left: -100,
594
- top: -100,
595
- bottom: 100,
596
- right: 100
597
- });
598
- var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
599
- bounds: bounds
600
- });
601
- var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
602
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
603
- });
604
- (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
605
- mockDraggableCoreProps.onStart({
606
- clientX: 0,
607
- clientY: 0
608
- });
609
- mockDraggableCoreProps.onDrag({}, {
610
- deltaX: 1,
611
- deltaY: -1
612
- });
613
- expect(onDrag).toHaveBeenCalled();
614
- });
615
- });
616
- });
617
- describe('getDelta and applyDelta', function () {
618
- it('calls utils.getDelta when processing drag', function () {
619
- _utils.getDelta.mockClear();
620
- var onDrag = jest.fn();
621
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
622
- onDrag: onDrag
623
- });
624
- var bounds = jest.fn().mockReturnValue({
625
- left: -100,
626
- top: -100,
627
- bottom: 100,
628
- right: 100
629
- });
630
- var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
631
- bounds: bounds
632
- });
633
- var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
634
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
635
- });
636
- (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
637
- mockDraggableCoreProps.onStart({
638
- clientX: 0,
639
- clientY: 0
640
- });
641
- mockDraggableCoreProps.onDrag({}, {
642
- deltaX: 10,
643
- deltaY: 10
644
- });
645
- expect(_utils.getDelta).toHaveBeenCalled();
646
- });
647
- it('calls fromDelta with result from getDelta', function () {
648
- var fromDelta = jest.fn();
649
- _utils.getDelta.mockReturnValue({
650
- x: 5,
651
- y: 5
652
- });
653
- var bounds = jest.fn().mockReturnValue({
654
- left: -100,
655
- top: -100,
656
- bottom: 100,
657
- right: 100
658
- });
659
- var options = _objectSpread(_objectSpread({}, defaultOptions), {}, {
660
- fromDelta: fromDelta,
661
- bounds: bounds
662
- });
663
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
664
- onDrag: jest.fn()
665
- });
666
- var Comp = (0, _gridDraggable.gridDraggable)(options)(function () {
667
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
668
- });
669
- (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
670
- mockDraggableCoreProps.onStart({
671
- clientX: 0,
672
- clientY: 0
673
- });
674
- mockDraggableCoreProps.onDrag({}, {
675
- deltaX: 10,
676
- deltaY: 10
677
- });
678
- expect(fromDelta).toHaveBeenCalled();
679
- });
680
- });
681
- describe('onStop', function () {
682
- it('calls onDragStop when drag stops', function () {
683
- var onDragStop = jest.fn();
684
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
685
- onDragStop: onDragStop
686
- });
687
- var Comp = (0, _gridDraggable.gridDraggable)(defaultOptions)(function () {
688
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
689
- });
690
- (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
691
-
692
- // Start to set up state
693
- mockDraggableCoreProps.onStart({
694
- clientX: 0,
695
- clientY: 0
696
- });
697
-
698
- // Stop with large movement (not tiny)
699
- mockDraggableCoreProps.onStop({
700
- clientX: 100,
701
- clientY: 100
702
- }, {});
703
- expect(onDragStop).toHaveBeenCalled();
704
- });
705
- it('calls onClick instead of onDragStop when movement is tiny', function () {
706
- var onClick = jest.fn();
707
- var onDragStop = jest.fn();
708
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
709
- onClick: onClick,
710
- onDragStop: onDragStop
711
- });
712
- _d3Selection.clientPoint.mockReturnValue([0, 0]);
713
- var Comp = (0, _gridDraggable.gridDraggable)(defaultOptions)(function () {
714
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
715
- });
716
- (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, props));
717
-
718
- // Start and stop at almost the same position (tiny movement)
719
- // Grid is 1x1, tiny threshold is grid/10 = 0.1
720
- mockDraggableCoreProps.onStart({
721
- clientX: 0,
722
- clientY: 0
723
- });
724
- mockDraggableCoreProps.onStop({
725
- clientX: 0.05,
726
- clientY: 0.05,
727
- target: {}
728
- }, {});
729
- expect(onClick).toHaveBeenCalledWith({
730
- x: 0,
731
- y: 0
732
- });
733
- });
734
- it('calls onClick with snapped coordinates', function () {
735
- var onClick = jest.fn();
736
- var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
737
- onClick: onClick
738
- });
739
- var graphProps = getGraphProps();
740
- graphProps.scale.x.invert = jest.fn().mockReturnValue(1.7);
741
- graphProps.scale.y.invert = jest.fn().mockReturnValue(2.3);
742
- graphProps.snap.x = jest.fn().mockReturnValue(2);
743
- graphProps.snap.y = jest.fn().mockReturnValue(2);
744
- _d3Selection.clientPoint.mockReturnValue([1.7, 2.3]);
745
- var propsWithGraphProps = _objectSpread(_objectSpread({}, props), {}, {
746
- graphProps: graphProps
747
- });
748
- var Comp = (0, _gridDraggable.gridDraggable)(defaultOptions)(function () {
749
- return /*#__PURE__*/_react2["default"].createElement("div", null, "Test");
750
- });
751
- (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(Comp, propsWithGraphProps));
752
-
753
- // Start and stop at almost the same position (tiny movement)
754
- mockDraggableCoreProps.onStart({
755
- clientX: 0,
756
- clientY: 0
757
- });
758
- mockDraggableCoreProps.onStop({
759
- clientX: 0.05,
760
- clientY: 0.05,
761
- target: {}
762
- }, {});
763
- expect(graphProps.snap.x).toHaveBeenCalledWith(1.7);
764
- expect(graphProps.snap.y).toHaveBeenCalledWith(2.3);
765
- expect(onClick).toHaveBeenCalledWith({
766
- x: 2,
767
- y: 2
768
- });
769
- });
770
- });
771
- });
772
- });
773
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX3JlYWN0MiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfZ3JpZERyYWdnYWJsZSIsIl91dGlscyIsIl9kM1NlbGVjdGlvbiIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiamVzdCIsIm1vY2siLCJjbGllbnRQb2ludCIsImZuIiwibW9ja1JldHVyblZhbHVlIiwibW9ja0RyYWdnYWJsZUNvcmVQcm9wcyIsIkRyYWdnYWJsZUNvcmUiLCJwcm9wcyIsImNoaWxkcmVuIiwiZ2V0RGVsdGEiLCJ4eUZuIiwib3V0IiwibiIsImludmVydCIsImdldEdyYXBoUHJvcHMiLCJzY2FsZSIsIngiLCJ5Iiwic25hcCIsImRvbWFpbiIsIm1pbiIsIm1heCIsInN0ZXAiLCJyYW5nZSIsInNpemUiLCJ3aWR0aCIsImhlaWdodCIsImdldFJvb3ROb2RlIiwib3duZXJTVkdFbGVtZW50IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwibGVmdCIsInRvcCIsInJpZ2h0IiwiYm90dG9tIiwiZGVzY3JpYmUiLCJkZWZhdWx0T3B0aW9ucyIsImRlZmF1bHRQcm9wcyIsImJlZm9yZUVhY2giLCJhbmNob3JQb2ludCIsImJvdW5kcyIsImZyb21EZWx0YSIsImdyYXBoUHJvcHMiLCJpdCIsIkNvbXAiLCJncmlkRHJhZ2dhYmxlIiwiY3JlYXRlRWxlbWVudCIsIl9yZW5kZXIiLCJyZW5kZXIiLCJjb250YWluZXIiLCJleHBlY3QiLCJmaXJzdENoaWxkIiwidG9CZUluVGhlRG9jdW1lbnQiLCJfcmVuZGVyMiIsImdyaWQiLCJ0b0VxdWFsIiwib25EcmFnU3RhcnQiLCJvblN0YXJ0IiwiY2xpZW50WCIsImNsaWVudFkiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwib25EcmFnIiwib3B0aW9ucyIsImRlbHRhWCIsImRlbHRhWSIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwibm90IiwibW9ja0NsZWFyIiwib25EcmFnU3RvcCIsIm9uU3RvcCIsIm9uQ2xpY2siLCJ0YXJnZXQiLCJwcm9wc1dpdGhHcmFwaFByb3BzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9ncmlkLWRyYWdnYWJsZS50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZW5kZXIgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBncmlkRHJhZ2dhYmxlIH0gZnJvbSAnLi4vZ3JpZC1kcmFnZ2FibGUnO1xuaW1wb3J0IHsgZ2V0RGVsdGEgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBjbGllbnRQb2ludCB9IGZyb20gJ2QzLXNlbGVjdGlvbic7XG5cbmplc3QubW9jaygnZDMtc2VsZWN0aW9uJywgKCkgPT4gKHtcbiAgY2xpZW50UG9pbnQ6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoWzAsIDBdKSxcbn0pKTtcblxubGV0IG1vY2tEcmFnZ2FibGVDb3JlUHJvcHM7XG5qZXN0Lm1vY2soJy4uL2RyYWdnYWJsZScsICgpID0+ICh7XG4gIERyYWdnYWJsZUNvcmU6IChwcm9wcykgPT4ge1xuICAgIC8vIFN0b3JlIHRoZSBwcm9wcyBzbyB0ZXN0cyBjYW4gY2FsbCB0aGUgaGFuZGxlcnNcbiAgICBtb2NrRHJhZ2dhYmxlQ29yZVByb3BzID0gcHJvcHM7XG4gICAgcmV0dXJuIHByb3BzLmNoaWxkcmVuO1xuICB9LFxufSkpO1xuXG5qZXN0Lm1vY2soJy4uL3V0aWxzJywgKCkgPT4gKHtcbiAgZ2V0RGVsdGE6IGplc3QuZm4oKSxcbn0pKTtcblxuY29uc3QgeHlGbiA9ICgpID0+IHtcbiAgY29uc3Qgb3V0ID0gamVzdC5mbigobikgPT4gbik7XG4gIG91dC5pbnZlcnQgPSBqZXN0LmZuKChuKSA9PiBuKTtcbiAgcmV0dXJuIG91dDtcbn07XG5cbmNvbnN0IGdldEdyYXBoUHJvcHMgPSAoKSA9PiAoe1xuICBzY2FsZToge1xuICAgIHg6IHh5Rm4oKSxcbiAgICB5OiB4eUZuKCksXG4gIH0sXG4gIHNuYXA6IHtcbiAgICB4OiB4eUZuKCksXG4gICAgeTogeHlGbigpLFxuICB9LFxuICBkb21haW46IHtcbiAgICBtaW46IDAsXG4gICAgbWF4OiAxLFxuICAgIHN0ZXA6IDEsXG4gIH0sXG4gIHJhbmdlOiB7XG4gICAgbWluOiAwLFxuICAgIG1heDogMSxcbiAgICBzdGVwOiAxLFxuICB9LFxuICBzaXplOiB7XG4gICAgd2lkdGg6IDUwMCxcbiAgICBoZWlnaHQ6IDUwMCxcbiAgfSxcbiAgZ2V0Um9vdE5vZGU6ICgpID0+ICh7XG4gICAgb3duZXJTVkdFbGVtZW50OiBudWxsLFxuICAgIGdldEJvdW5kaW5nQ2xpZW50UmVjdDogKCkgPT4gKHtcbiAgICAgIGxlZnQ6IDAsXG4gICAgICB0b3A6IDAsXG4gICAgICByaWdodDogMTAwLFxuICAgICAgYm90dG9tOiAxMDAsXG4gICAgfSksXG4gIH0pLFxufSk7XG5cbmRlc2NyaWJlKCdncmlkRHJhZ2dhYmxlJywgKCkgPT4ge1xuICBsZXQgZGVmYXVsdE9wdGlvbnM7XG4gIGxldCBkZWZhdWx0UHJvcHM7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcyA9IG51bGw7XG4gICAgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgICBhbmNob3JQb2ludDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7IHg6IDAsIHk6IDAgfSksXG4gICAgICBib3VuZHM6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoeyBsZWZ0OiAwLCB0b3A6IDAsIGJvdHRvbTogMCwgcmlnaHQ6IDAgfSksXG4gICAgICBmcm9tRGVsdGE6IGplc3QuZm4oKSxcbiAgICB9O1xuXG4gICAgZGVmYXVsdFByb3BzID0ge1xuICAgICAgZ3JhcGhQcm9wczogZ2V0R3JhcGhQcm9wcygpLFxuICAgIH07XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIHJlZ3VsYXIgY29tcG9uZW50JywgKCkgPT4ge1xuICAgIGNvbnN0IENvbXAgPSBncmlkRHJhZ2dhYmxlKGRlZmF1bHRPcHRpb25zKSgoKSA9PiA8ZGl2PlRlc3Q8L2Rpdj4pO1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPENvbXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbmRlcnMgd2l0aCBkZWNpbWFsIGRvbWFpbiBhbmQgcmFuZ2UnLCAoKSA9PiB7XG4gICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICBncmFwaFByb3BzOiB7XG4gICAgICAgIC4uLmdldEdyYXBoUHJvcHMoKSxcbiAgICAgICAgZG9tYWluOiB7XG4gICAgICAgICAgbWluOiAtMS41LFxuICAgICAgICAgIG1heDogMS42LFxuICAgICAgICAgIHN0ZXA6IDAuMyxcbiAgICAgICAgfSxcbiAgICAgICAgcmFuZ2U6IHtcbiAgICAgICAgICBtaW46IC0yLFxuICAgICAgICAgIG1heDogMyxcbiAgICAgICAgICBzdGVwOiAwLjIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgQ29tcCA9IGdyaWREcmFnZ2FibGUoZGVmYXVsdE9wdGlvbnMpKCgpID0+IDxkaXY+VGVzdDwvZGl2Pik7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8Q29tcCB7Li4ucHJvcHN9IC8+KTtcbiAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdsb2dpYycsICgpID0+IHtcbiAgICBkZXNjcmliZSgnZ3JpZCBjYWxjdWxhdGlvbicsICgpID0+IHtcbiAgICAgIGl0KCdwYXNzZXMgY29ycmVjdCBncmlkIHRvIERyYWdnYWJsZUNvcmUgYmFzZWQgb24gZG9tYWluIGFuZCByYW5nZSBzdGVwJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBDb21wID0gZ3JpZERyYWdnYWJsZShkZWZhdWx0T3B0aW9ucykoKCkgPT4gPGRpdj5UZXN0PC9kaXY+KTtcbiAgICAgICAgcmVuZGVyKDxDb21wIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcblxuICAgICAgICAvLyBHcmlkIGlzIGNhbGN1bGF0ZWQgYXM6IHNjYWxlLngoZG9tYWluLnN0ZXApIC0gc2NhbGUueCgwKVxuICAgICAgICAvLyBXaXRoIG91ciBtb2NrIHh5Rm4gdGhhdCByZXR1cm5zIG4sIHRoaXMgaXM6IHN0ZXAgLSAwID0gc3RlcFxuICAgICAgICBleHBlY3QobW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5ncmlkKS50b0VxdWFsKFsxLCAxXSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NhbGN1bGF0ZXMgZ3JpZCB3aXRoIGRlY2ltYWwgc3RlcHMnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgICBncmFwaFByb3BzOiB7XG4gICAgICAgICAgICAuLi5nZXRHcmFwaFByb3BzKCksXG4gICAgICAgICAgICBkb21haW46IHsgbWluOiAtMS41LCBtYXg6IDEuNiwgc3RlcDogMC4zIH0sXG4gICAgICAgICAgICByYW5nZTogeyBtaW46IC0yLCBtYXg6IDMsIHN0ZXA6IDAuMiB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IENvbXAgPSBncmlkRHJhZ2dhYmxlKGRlZmF1bHRPcHRpb25zKSgoKSA9PiA8ZGl2PlRlc3Q8L2Rpdj4pO1xuICAgICAgICByZW5kZXIoPENvbXAgey4uLnByb3BzfSAvPik7XG5cbiAgICAgICAgZXhwZWN0KG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMuZ3JpZCkudG9FcXVhbChbMC4zLCAwLjJdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uU3RhcnQnLCAoKSA9PiB7XG4gICAgICBpdCgnY2FsbHMgb25EcmFnU3RhcnQgaGFuZGxlciB3aGVuIGRyYWcgc3RhcnRzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbkRyYWdTdGFydCA9IGplc3QuZm4oKTtcbiAgICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgb25EcmFnU3RhcnQgfTtcbiAgICAgICAgY29uc3QgQ29tcCA9IGdyaWREcmFnZ2FibGUoZGVmYXVsdE9wdGlvbnMpKCgpID0+IDxkaXY+VGVzdDwvZGl2Pik7XG4gICAgICAgIHJlbmRlcig8Q29tcCB7Li4ucHJvcHN9IC8+KTtcblxuICAgICAgICAvLyBTaW11bGF0ZSBkcmFnIHN0YXJ0XG4gICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25TdGFydCh7IGNsaWVudFg6IDEwMCwgY2xpZW50WTogMTAwIH0pO1xuXG4gICAgICAgIGV4cGVjdChvbkRyYWdTdGFydCkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25EcmFnJywgKCkgPT4ge1xuICAgICAgaXQoJ2NhbGxzIG9uRHJhZyBjYWxsYmFjayB3aXRoIHJlc3VsdCBmcm9tIGZyb21EZWx0YScsICgpID0+IHtcbiAgICAgICAgY29uc3Qgb25EcmFnID0gamVzdC5mbigpO1xuICAgICAgICBjb25zdCBmcm9tRGVsdGEgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKCdkZWx0YS1yZXN1bHQnKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7IGxlZnQ6IC0xMDAsIHRvcDogLTEwMCwgYm90dG9tOiAxMDAsIHJpZ2h0OiAxMDAgfSk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLmRlZmF1bHRPcHRpb25zLCBmcm9tRGVsdGEsIGJvdW5kcyB9O1xuICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkRyYWcgfTtcblxuICAgICAgICBjb25zdCBDb21wID0gZ3JpZERyYWdnYWJsZShvcHRpb25zKSgoKSA9PiA8ZGl2PlRlc3Q8L2Rpdj4pO1xuICAgICAgICByZW5kZXIoPENvbXAgey4uLnByb3BzfSAvPik7XG5cbiAgICAgICAgLy8gU2V0IHVwIGRyYWcgc3RhcnQgc3RhdGVcbiAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vblN0YXJ0KHsgY2xpZW50WDogMCwgY2xpZW50WTogMCB9KTtcblxuICAgICAgICAvLyBTaW11bGF0ZSBkcmFnXG4gICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25EcmFnKHt9LCB7IGRlbHRhWDogMTAsIGRlbHRhWTogMTAgfSk7XG5cbiAgICAgICAgZXhwZWN0KGZyb21EZWx0YSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICBleHBlY3Qob25EcmFnKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnZGVsdGEtcmVzdWx0Jyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2RvZXMgbm90IGNhbGwgb25EcmFnIHdoZW4gbm8gb25EcmFnIGhhbmRsZXIgaXMgcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZyb21EZWx0YSA9IGplc3QuZm4oKTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHsgLi4uZGVmYXVsdE9wdGlvbnMsIGZyb21EZWx0YSB9O1xuICAgICAgICBjb25zdCBDb21wID0gZ3JpZERyYWdnYWJsZShvcHRpb25zKSgoKSA9PiA8ZGl2PlRlc3Q8L2Rpdj4pO1xuICAgICAgICByZW5kZXIoPENvbXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuXG4gICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25TdGFydCh7IGNsaWVudFg6IDAsIGNsaWVudFk6IDAgfSk7XG4gICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25EcmFnKHt9LCB7IGRlbHRhWDogMTAsIGRlbHRhWTogMTAgfSk7XG5cbiAgICAgICAgZXhwZWN0KGZyb21EZWx0YSkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnYm91bmRzIGNoZWNraW5nJywgKCkgPT4ge1xuICAgICAgICBpdCgnZG9lcyBub3QgY2FsbCBvbkRyYWcgd2hlbiBkcmFnZ2luZyBsZWZ0IGJleW9uZCBsZWZ0IGJvdW5kJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uRHJhZyA9IGplc3QuZm4oKTtcbiAgICAgICAgICBjb25zdCBib3VuZHMgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHsgbGVmdDogMCwgdG9wOiAwLCBib3R0b206IDAsIHJpZ2h0OiAwIH0pO1xuICAgICAgICAgIGNvbnN0IGZyb21EZWx0YSA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoJ3Jlc3VsdCcpO1xuICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLmRlZmF1bHRPcHRpb25zLCBib3VuZHMsIGZyb21EZWx0YSB9O1xuICAgICAgICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0UHJvcHMsIG9uRHJhZyB9O1xuXG4gICAgICAgICAgY29uc3QgQ29tcCA9IGdyaWREcmFnZ2FibGUob3B0aW9ucykoKCkgPT4gPGRpdj5UZXN0PC9kaXY+KTtcbiAgICAgICAgICByZW5kZXIoPENvbXAgey4uLnByb3BzfSAvPik7XG5cbiAgICAgICAgICBtb2NrRHJhZ2dhYmxlQ29yZVByb3BzLm9uU3RhcnQoeyBjbGllbnRYOiAwLCBjbGllbnRZOiAwIH0pO1xuICAgICAgICAgIC8vIGRlbHRhWCA8IDAgYW5kIGRlbHRhWCA8IHNjYWxlZCBib3VuZHMubGVmdCAoMCksIHNvIC0xMCA8IDAgdHJpZ2dlcnMgZWFybHkgcmV0dXJuXG4gICAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vbkRyYWcoe30sIHsgZGVsdGFYOiAtMTAsIGRlbHRhWTogMCB9KTtcblxuICAgICAgICAgIGV4cGVjdChvbkRyYWcpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdkb2VzIG5vdCBjYWxsIG9uRHJhZyB3aGVuIGRyYWdnaW5nIHJpZ2h0IGJleW9uZCByaWdodCBib3VuZCcsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBvbkRyYWcgPSBqZXN0LmZuKCk7XG4gICAgICAgICAgY29uc3QgYm91bmRzID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7IGxlZnQ6IDAsIHRvcDogMCwgYm90dG9tOiAwLCByaWdodDogMCB9KTtcbiAgICAgICAgICBjb25zdCBmcm9tRGVsdGEgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKCdyZXN1bHQnKTtcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0geyAuLi5kZWZhdWx0T3B0aW9ucywgYm91bmRzLCBmcm9tRGVsdGEgfTtcbiAgICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkRyYWcgfTtcblxuICAgICAgICAgIGNvbnN0IENvbXAgPSBncmlkRHJhZ2dhYmxlKG9wdGlvbnMpKCgpID0+IDxkaXY+VGVzdDwvZGl2Pik7XG4gICAgICAgICAgcmVuZGVyKDxDb21wIHsuLi5wcm9wc30gLz4pO1xuXG4gICAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vblN0YXJ0KHsgY2xpZW50WDogMCwgY2xpZW50WTogMCB9KTtcbiAgICAgICAgICAvLyBkZWx0YVggPiAwIGFuZCBkZWx0YVggPiBzY2FsZWQgYm91bmRzLnJpZ2h0ICgwKSwgc28gMTAgPiAwIHRyaWdnZXJzIGVhcmx5IHJldHVyblxuICAgICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25EcmFnKHt9LCB7IGRlbHRhWDogMTAsIGRlbHRhWTogMCB9KTtcblxuICAgICAgICAgIGV4cGVjdChvbkRyYWcpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdkb2VzIG5vdCBjYWxsIG9uRHJhZyB3aGVuIGRyYWdnaW5nIHVwIGJleW9uZCB0b3AgYm91bmQnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb25EcmFnID0gamVzdC5mbigpO1xuICAgICAgICAgIGNvbnN0IGJvdW5kcyA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoeyBsZWZ0OiAtMTAwLCB0b3A6IDAsIGJvdHRvbTogMCwgcmlnaHQ6IDEwMCB9KTtcbiAgICAgICAgICBjb25zdCBmcm9tRGVsdGEgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKCdyZXN1bHQnKTtcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0geyAuLi5kZWZhdWx0T3B0aW9ucywgYm91bmRzLCBmcm9tRGVsdGEgfTtcbiAgICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkRyYWcgfTtcblxuICAgICAgICAgIGNvbnN0IENvbXAgPSBncmlkRHJhZ2dhYmxlKG9wdGlvbnMpKCgpID0+IDxkaXY+VGVzdDwvZGl2Pik7XG4gICAgICAgICAgcmVuZGVyKDxDb21wIHsuLi5wcm9wc30gLz4pO1xuXG4gICAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vblN0YXJ0KHsgY2xpZW50WDogMCwgY2xpZW50WTogMCB9KTtcbiAgICAgICAgICAvLyBkZWx0YVkgPCAwIGFuZCBkZWx0YVkgPCBzY2FsZWQgYm91bmRzLnRvcCAoMCksIHNvIC0xMCA8IDAgdHJpZ2dlcnMgZWFybHkgcmV0dXJuXG4gICAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vbkRyYWcoe30sIHsgZGVsdGFYOiAwLCBkZWx0YVk6IC0xMCB9KTtcblxuICAgICAgICAgIGV4cGVjdChvbkRyYWcpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdkb2VzIG5vdCBjYWxsIG9uRHJhZyB3aGVuIGRyYWdnaW5nIGRvd24gYmV5b25kIGJvdHRvbSBib3VuZCcsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBvbkRyYWcgPSBqZXN0LmZuKCk7XG4gICAgICAgICAgY29uc3QgYm91bmRzID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7IGxlZnQ6IC0xMDAsIHRvcDogLTEwMCwgYm90dG9tOiAwLCByaWdodDogMTAwIH0pO1xuICAgICAgICAgIGNvbnN0IGZyb21EZWx0YSA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoJ3Jlc3VsdCcpO1xuICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLmRlZmF1bHRPcHRpb25zLCBib3VuZHMsIGZyb21EZWx0YSB9O1xuICAgICAgICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0UHJvcHMsIG9uRHJhZyB9O1xuXG4gICAgICAgICAgY29uc3QgQ29tcCA9IGdyaWREcmFnZ2FibGUob3B0aW9ucykoKCkgPT4gPGRpdj5UZXN0PC9kaXY+KTtcbiAgICAgICAgICByZW5kZXIoPENvbXAgey4uLnByb3BzfSAvPik7XG5cbiAgICAgICAgICBtb2NrRHJhZ2dhYmxlQ29yZVByb3BzLm9uU3RhcnQoeyBjbGllbnRYOiAwLCBjbGllbnRZOiAwIH0pO1xuICAgICAgICAgIC8vIGRlbHRhWSA+IDAgYW5kIGRlbHRhWSA+IHNjYWxlZCBib3VuZHMuYm90dG9tICgwKSwgc28gMTAgPiAwIHRyaWdnZXJzIGVhcmx5IHJldHVyblxuICAgICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25EcmFnKHt9LCB7IGRlbHRhWDogMCwgZGVsdGFZOiAxMCB9KTtcblxuICAgICAgICAgIGV4cGVjdChvbkRyYWcpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdjYWxscyBvbkRyYWcgd2hlbiBkcmFnZ2luZyB3aXRoaW4gYm91bmRzJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uRHJhZyA9IGplc3QuZm4oKTtcbiAgICAgICAgICBjb25zdCBib3VuZHMgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHsgbGVmdDogLTEwMCwgdG9wOiAtMTAwLCBib3R0b206IDEwMCwgcmlnaHQ6IDEwMCB9KTtcbiAgICAgICAgICBjb25zdCBmcm9tRGVsdGEgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKCdyZXN1bHQnKTtcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0geyAuLi5kZWZhdWx0T3B0aW9ucywgYm91bmRzLCBmcm9tRGVsdGEgfTtcbiAgICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkRyYWcgfTtcblxuICAgICAgICAgIGNvbnN0IENvbXAgPSBncmlkRHJhZ2dhYmxlKG9wdGlvbnMpKCgpID0+IDxkaXY+VGVzdDwvZGl2Pik7XG4gICAgICAgICAgcmVuZGVyKDxDb21wIHsuLi5wcm9wc30gLz4pO1xuXG4gICAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vblN0YXJ0KHsgY2xpZW50WDogMCwgY2xpZW50WTogMCB9KTtcbiAgICAgICAgICAvLyBBbGwgYm91bmQgY2hlY2tzIHBhc3M6IGRlbHRhWCAoLTEwKSBpcyBOT1QgPCBib3VuZHMubGVmdCAoLTEwMCkgYW5kIE5PVCA+IGJvdW5kcy5yaWdodCAoMTAwKVxuICAgICAgICAgIC8vIFNpbWlsYXJseSBmb3IgZGVsdGFZXG4gICAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vbkRyYWcoe30sIHsgZGVsdGFYOiAtMTAsIGRlbHRhWTogMTAgfSk7XG5cbiAgICAgICAgICBleHBlY3Qob25EcmFnKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCdza2lwRHJhZ091dHNpZGVPZkJvdW5kcycsICgpID0+IHtcbiAgICAgICAgaXQoJ3NraXBzIGRyYWcgd2hlbiBtb3ZpbmcgbGVmdCBhbmQgeCBpcyBiZWxvdyBkb21haW4ubWluJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uRHJhZyA9IGplc3QuZm4oKTtcbiAgICAgICAgICBjb25zdCBncmFwaFByb3BzID0ge1xuICAgICAgICAgICAgLi4uZ2V0R3JhcGhQcm9wcygpLFxuICAgICAgICAgICAgZG9tYWluOiB7IG1pbjogLTUsIG1heDogNSwgc3RlcDogMSB9LFxuICAgICAgICAgICAgcmFuZ2U6IHsgbWluOiAtNSwgbWF4OiA1LCBzdGVwOiAxIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBncmFwaFByb3BzLnNjYWxlLnguaW52ZXJ0ID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgtNik7IC8vIEJlbG93IG1pblxuXG4gICAgICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgZ3JhcGhQcm9wcywgb25EcmFnIH07XG4gICAgICAgICAgY29uc3QgYm91bmRzID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7IGxlZnQ6IDEwMCwgdG9wOiAxMDAsIGJvdHRvbTogMTAwLCByaWdodDogMTAwIH0pO1xuICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLmRlZmF1bHRPcHRpb25zLCBib3VuZHMgfTtcblxuICAgICAgICAgIGNvbnN0IENvbXAgPSBncmlkRHJhZ2dhYmxlKG9wdGlvbnMpKCgpID0+IDxkaXY+VGVzdDwvZGl2Pik7XG4gICAgICAgICAgcmVuZGVyKDxDb21wIHsuLi5wcm9wc30gLz4pO1xuXG4gICAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vblN0YXJ0KHsgY2xpZW50WDogMCwgY2xpZW50WTogMCB9KTtcbiAgICAgICAgICBtb2NrRHJhZ2dhYmxlQ29yZVByb3BzLm9uRHJhZyh7fSwgeyBkZWx0YVg6IDEsIGRlbHRhWTogMCB9KTtcblxuICAgICAgICAgIGV4cGVjdChvbkRyYWcpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdza2lwcyBkcmFnIHdoZW4gbW92aW5nIHJpZ2h0IGFuZCB4IGlzIGFib3ZlIGRvbWFpbi5tYXgnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb25EcmFnID0gamVzdC5mbigpO1xuICAgICAgICAgIGNvbnN0IGdyYXBoUHJvcHMgPSB7XG4gICAgICAgICAgICAuLi5nZXRHcmFwaFByb3BzKCksXG4gICAgICAgICAgICBkb21haW46IHsgbWluOiAtNSwgbWF4OiA1LCBzdGVwOiAxIH0sXG4gICAgICAgICAgICByYW5nZTogeyBtaW46IC01LCBtYXg6IDUsIHN0ZXA6IDEgfSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGdyYXBoUHJvcHMuc2NhbGUueC5pbnZlcnQgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDYpOyAvLyBBYm92ZSBtYXhcblxuICAgICAgICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0UHJvcHMsIGdyYXBoUHJvcHMsIG9uRHJhZyB9O1xuICAgICAgICAgIGNvbnN0IGJvdW5kcyA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoeyBsZWZ0OiAxMDAsIHRvcDogMTAwLCBib3R0b206IDEwMCwgcmlnaHQ6IDEwMCB9KTtcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0geyAuLi5kZWZhdWx0T3B0aW9ucywgYm91bmRzIH07XG5cbiAgICAgICAgICBjb25zdCBDb21wID0gZ3JpZERyYWdnYWJsZShvcHRpb25zKSgoKSA9PiA8ZGl2PlRlc3Q8L2Rpdj4pO1xuICAgICAgICAgIHJlbmRlcig8Q29tcCB7Li4ucHJvcHN9IC8+KTtcblxuICAgICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25TdGFydCh7IGNsaWVudFg6IDAsIGNsaWVudFk6IDAgfSk7XG4gICAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vbkRyYWcoe30sIHsgZGVsdGFYOiAtMSwgZGVsdGFZOiAwIH0pO1xuXG4gICAgICAgICAgZXhwZWN0KG9uRHJhZykubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3NraXBzIGRyYWcgd2hlbiBtb3ZpbmcgdXAgYW5kIHkgaXMgYWJvdmUgcmFuZ2UubWF4JywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uRHJhZyA9IGplc3QuZm4oKTtcbiAgICAgICAgICBjb25zdCBncmFwaFByb3BzID0ge1xuICAgICAgICAgICAgLi4uZ2V0R3JhcGhQcm9wcygpLFxuICAgICAgICAgICAgZG9tYWluOiB7IG1pbjogLTUsIG1heDogNSwgc3RlcDogMSB9LFxuICAgICAgICAgICAgcmFuZ2U6IHsgbWluOiAtNSwgbWF4OiA1LCBzdGVwOiAxIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBncmFwaFByb3BzLnNjYWxlLnkuaW52ZXJ0ID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSg2KTsgLy8gQWJvdmUgbWF4XG5cbiAgICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBncmFwaFByb3BzLCBvbkRyYWcgfTtcbiAgICAgICAgICBjb25zdCBib3VuZHMgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHsgbGVmdDogMTAwLCB0b3A6IDEwMCwgYm90dG9tOiAxMDAsIHJpZ2h0OiAxMDAgfSk7XG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHsgLi4uZGVmYXVsdE9wdGlvbnMsIGJvdW5kcyB9O1xuXG4gICAgICAgICAgY29uc3QgQ29tcCA9IGdyaWREcmFnZ2FibGUob3B0aW9ucykoKCkgPT4gPGRpdj5UZXN0PC9kaXY+KTtcbiAgICAgICAgICByZW5kZXIoPENvbXAgey4uLnByb3BzfSAvPik7XG5cbiAgICAgICAgICBtb2NrRHJhZ2dhYmxlQ29yZVByb3BzLm9uU3RhcnQoeyBjbGllbnRYOiAwLCBjbGllbnRZOiAwIH0pO1xuICAgICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25EcmFnKHt9LCB7IGRlbHRhWDogMCwgZGVsdGFZOiAxIH0pO1xuXG4gICAgICAgICAgZXhwZWN0KG9uRHJhZykubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3NraXBzIGRyYWcgd2hlbiBtb3ZpbmcgZG93biBhbmQgeSBpcyBiZWxvdyByYW5nZS5taW4nLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb25EcmFnID0gamVzdC5mbigpO1xuICAgICAgICAgIGNvbnN0IGdyYXBoUHJvcHMgPSB7XG4gICAgICAgICAgICAuLi5nZXRHcmFwaFByb3BzKCksXG4gICAgICAgICAgICBkb21haW46IHsgbWluOiAtNSwgbWF4OiA1LCBzdGVwOiAxIH0sXG4gICAgICAgICAgICByYW5nZTogeyBtaW46IC01LCBtYXg6IDUsIHN0ZXA6IDEgfSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGdyYXBoUHJvcHMuc2NhbGUueS5pbnZlcnQgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKC02KTsgLy8gQmVsb3cgbWluXG5cbiAgICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBncmFwaFByb3BzLCBvbkRyYWcgfTtcbiAgICAgICAgICBjb25zdCBib3VuZHMgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHsgbGVmdDogMTAwLCB0b3A6IDEwMCwgYm90dG9tOiAxMDAsIHJpZ2h0OiAxMDAgfSk7XG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHsgLi4uZGVmYXVsdE9wdGlvbnMsIGJvdW5kcyB9O1xuXG4gICAgICAgICAgY29uc3QgQ29tcCA9IGdyaWREcmFnZ2FibGUob3B0aW9ucykoKCkgPT4gPGRpdj5UZXN0PC9kaXY+KTtcbiAgICAgICAgICByZW5kZXIoPENvbXAgey4uLnByb3BzfSAvPik7XG5cbiAgICAgICAgICBtb2NrRHJhZ2dhYmxlQ29yZVByb3BzLm9uU3RhcnQoeyBjbGllbnRYOiAwLCBjbGllbnRZOiAwIH0pO1xuICAgICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25EcmFnKHt9LCB7IGRlbHRhWDogMCwgZGVsdGFZOiAtMSB9KTtcblxuICAgICAgICAgIGV4cGVjdChvbkRyYWcpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdhbGxvd3MgZHJhZyB3aGVuIHdpdGhpbiBkb21haW4gYW5kIHJhbmdlJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uRHJhZyA9IGplc3QuZm4oKTtcbiAgICAgICAgICBjb25zdCBncmFwaFByb3BzID0ge1xuICAgICAgICAgICAgLi4uZ2V0R3JhcGhQcm9wcygpLFxuICAgICAgICAgICAgZG9tYWluOiB7IG1pbjogLTUsIG1heDogNSwgc3RlcDogMSB9LFxuICAgICAgICAgICAgcmFuZ2U6IHsgbWluOiAtNSwgbWF4OiA1LCBzdGVwOiAxIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBncmFwaFByb3BzLnNjYWxlLnguaW52ZXJ0ID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSgzKTsgLy8gV2l0aGluIGJvdW5kc1xuICAgICAgICAgIGdyYXBoUHJvcHMuc2NhbGUueS5pbnZlcnQgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDIpOyAvLyBXaXRoaW4gYm91bmRzXG5cbiAgICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBncmFwaFByb3BzLCBvbkRyYWcgfTtcbiAgICAgICAgICBjb25zdCBib3VuZHMgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHsgbGVmdDogLTEwMCwgdG9wOiAtMTAwLCBib3R0b206IDEwMCwgcmlnaHQ6IDEwMCB9KTtcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0geyAuLi5kZWZhdWx0T3B0aW9ucywgYm91bmRzIH07XG5cbiAgICAgICAgICBjb25zdCBDb21wID0gZ3JpZERyYWdnYWJsZShvcHRpb25zKSgoKSA9PiA8ZGl2PlRlc3Q8L2Rpdj4pO1xuICAgICAgICAgIHJlbmRlcig8Q29tcCB7Li4ucHJvcHN9IC8+KTtcblxuICAgICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25TdGFydCh7IGNsaWVudFg6IDAsIGNsaWVudFk6IDAgfSk7XG4gICAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vbkRyYWcoe30sIHsgZGVsdGFYOiAxLCBkZWx0YVk6IC0xIH0pO1xuXG4gICAgICAgICAgZXhwZWN0KG9uRHJhZykudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2dldERlbHRhIGFuZCBhcHBseURlbHRhJywgKCkgPT4ge1xuICAgICAgaXQoJ2NhbGxzIHV0aWxzLmdldERlbHRhIHdoZW4gcHJvY2Vzc2luZyBkcmFnJywgKCkgPT4ge1xuICAgICAgICBnZXREZWx0YS5tb2NrQ2xlYXIoKTtcbiAgICAgICAgY29uc3Qgb25EcmFnID0gamVzdC5mbigpO1xuICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkRyYWcgfTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7IGxlZnQ6IC0xMDAsIHRvcDogLTEwMCwgYm90dG9tOiAxMDAsIHJpZ2h0OiAxMDAgfSk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLmRlZmF1bHRPcHRpb25zLCBib3VuZHMgfTtcblxuICAgICAgICBjb25zdCBDb21wID0gZ3JpZERyYWdnYWJsZShvcHRpb25zKSgoKSA9PiA8ZGl2PlRlc3Q8L2Rpdj4pO1xuICAgICAgICByZW5kZXIoPENvbXAgey4uLnByb3BzfSAvPik7XG5cbiAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vblN0YXJ0KHsgY2xpZW50WDogMCwgY2xpZW50WTogMCB9KTtcbiAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vbkRyYWcoe30sIHsgZGVsdGFYOiAxMCwgZGVsdGFZOiAxMCB9KTtcblxuICAgICAgICBleHBlY3QoZ2V0RGVsdGEpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2FsbHMgZnJvbURlbHRhIHdpdGggcmVzdWx0IGZyb20gZ2V0RGVsdGEnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZyb21EZWx0YSA9IGplc3QuZm4oKTtcbiAgICAgICAgZ2V0RGVsdGEubW9ja1JldHVyblZhbHVlKHsgeDogNSwgeTogNSB9KTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7IGxlZnQ6IC0xMDAsIHRvcDogLTEwMCwgYm90dG9tOiAxMDAsIHJpZ2h0OiAxMDAgfSk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLmRlZmF1bHRPcHRpb25zLCBmcm9tRGVsdGEsIGJvdW5kcyB9O1xuICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkRyYWc6IGplc3QuZm4oKSB9O1xuXG4gICAgICAgIGNvbnN0IENvbXAgPSBncmlkRHJhZ2dhYmxlKG9wdGlvbnMpKCgpID0+IDxkaXY+VGVzdDwvZGl2Pik7XG4gICAgICAgIHJlbmRlcig8Q29tcCB7Li4ucHJvcHN9IC8+KTtcblxuICAgICAgICBtb2NrRHJhZ2dhYmxlQ29yZVByb3BzLm9uU3RhcnQoeyBjbGllbnRYOiAwLCBjbGllbnRZOiAwIH0pO1xuICAgICAgICBtb2NrRHJhZ2dhYmxlQ29yZVByb3BzLm9uRHJhZyh7fSwgeyBkZWx0YVg6IDEwLCBkZWx0YVk6IDEwIH0pO1xuXG4gICAgICAgIGV4cGVjdChmcm9tRGVsdGEpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uU3RvcCcsICgpID0+IHtcbiAgICAgIGl0KCdjYWxscyBvbkRyYWdTdG9wIHdoZW4gZHJhZyBzdG9wcycsICgpID0+IHtcbiAgICAgICAgY29uc3Qgb25EcmFnU3RvcCA9IGplc3QuZm4oKTtcbiAgICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRQcm9wcywgb25EcmFnU3RvcCB9O1xuXG4gICAgICAgIGNvbnN0IENvbXAgPSBncmlkRHJhZ2dhYmxlKGRlZmF1bHRPcHRpb25zKSgoKSA9PiA8ZGl2PlRlc3Q8L2Rpdj4pO1xuICAgICAgICByZW5kZXIoPENvbXAgey4uLnByb3BzfSAvPik7XG5cbiAgICAgICAgLy8gU3RhcnQgdG8gc2V0IHVwIHN0YXRlXG4gICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25TdGFydCh7IGNsaWVudFg6IDAsIGNsaWVudFk6IDAgfSk7XG5cbiAgICAgICAgLy8gU3RvcCB3aXRoIGxhcmdlIG1vdmVtZW50IChub3QgdGlueSlcbiAgICAgICAgbW9ja0RyYWdnYWJsZUNvcmVQcm9wcy5vblN0b3AoeyBjbGllbnRYOiAxMDAsIGNsaWVudFk6IDEwMCB9LCB7fSk7XG5cbiAgICAgICAgZXhwZWN0KG9uRHJhZ1N0b3ApLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2FsbHMgb25DbGljayBpbnN0ZWFkIG9mIG9uRHJhZ1N0b3Agd2hlbiBtb3ZlbWVudCBpcyB0aW55JywgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbkNsaWNrID0gamVzdC5mbigpO1xuICAgICAgICBjb25zdCBvbkRyYWdTdG9wID0gamVzdC5mbigpO1xuICAgICAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdFByb3BzLCBvbkNsaWNrLCBvbkRyYWdTdG9wIH07XG5cbiAgICAgICAgY2xpZW50UG9pbnQubW9ja1JldHVyblZhbHVlKFswLCAwXSk7XG5cbiAgICAgICAgY29uc3QgQ29tcCA9IGdyaWREcmFnZ2FibGUoZGVmYXVsdE9wdGlvbnMpKCgpID0+IDxkaXY+VGVzdDwvZGl2Pik7XG4gICAgICAgIHJlbmRlcig8Q29tcCB7Li4ucHJvcHN9IC8+KTtcblxuICAgICAgICAvLyBTdGFydCBhbmQgc3RvcCBhdCBhbG1vc3QgdGhlIHNhbWUgcG9zaXRpb24gKHRpbnkgbW92ZW1lbnQpXG4gICAgICAgIC8vIEdyaWQgaXMgMXgxLCB0aW55IHRocmVzaG9sZCBpcyBncmlkLzEwID0gMC4xXG4gICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25TdGFydCh7IGNsaWVudFg6IDAsIGNsaWVudFk6IDAgfSk7XG4gICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25TdG9wKHsgY2xpZW50WDogMC4wNSwgY2xpZW50WTogMC4wNSwgdGFyZ2V0OiB7fSB9LCB7fSk7XG5cbiAgICAgICAgZXhwZWN0KG9uQ2xpY2spLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHsgeDogMCwgeTogMCB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY2FsbHMgb25DbGljayB3aXRoIHNuYXBwZWQgY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9uQ2xpY2sgPSBqZXN0LmZuKCk7XG4gICAgICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0UHJvcHMsIG9uQ2xpY2sgfTtcbiAgICAgICAgY29uc3QgZ3JhcGhQcm9wcyA9IGdldEdyYXBoUHJvcHMoKTtcbiAgICAgICAgZ3JhcGhQcm9wcy5zY2FsZS54LmludmVydCA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoMS43KTtcbiAgICAgICAgZ3JhcGhQcm9wcy5zY2FsZS55LmludmVydCA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoMi4zKTtcbiAgICAgICAgZ3JhcGhQcm9wcy5zbmFwLnggPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDIpO1xuICAgICAgICBncmFwaFByb3BzLnNuYXAueSA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoMik7XG5cbiAgICAgICAgY2xpZW50UG9pbnQubW9ja1JldHVyblZhbHVlKFsxLjcsIDIuM10pO1xuXG4gICAgICAgIGNvbnN0IHByb3BzV2l0aEdyYXBoUHJvcHMgPSB7IC4uLnByb3BzLCBncmFwaFByb3BzIH07XG4gICAgICAgIGNvbnN0IENvbXAgPSBncmlkRHJhZ2dhYmxlKGRlZmF1bHRPcHRpb25zKSgoKSA9PiA8ZGl2PlRlc3Q8L2Rpdj4pO1xuICAgICAgICByZW5kZXIoPENvbXAgey4uLnByb3BzV2l0aEdyYXBoUHJvcHN9IC8+KTtcblxuICAgICAgICAvLyBTdGFydCBhbmQgc3RvcCBhdCBhbG1vc3QgdGhlIHNhbWUgcG9zaXRpb24gKHRpbnkgbW92ZW1lbnQpXG4gICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25TdGFydCh7IGNsaWVudFg6IDAsIGNsaWVudFk6IDAgfSk7XG4gICAgICAgIG1vY2tEcmFnZ2FibGVDb3JlUHJvcHMub25TdG9wKHsgY2xpZW50WDogMC4wNSwgY2xpZW50WTogMC4wNSwgdGFyZ2V0OiB7fSB9LCB7fSk7XG5cbiAgICAgICAgZXhwZWN0KGdyYXBoUHJvcHMuc25hcC54KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgxLjcpO1xuICAgICAgICBleHBlY3QoZ3JhcGhQcm9wcy5zbmFwLnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDIuMyk7XG4gICAgICAgIGV4cGVjdChvbkNsaWNrKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh7IHg6IDIsIHk6IDIgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLGNBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFlBQUEsR0FBQUwsT0FBQTtBQUEyQyxTQUFBTSxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxX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