@pie-lib/graphing 3.2.0-next.2 → 3.2.0-next.4
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.
- package/CHANGELOG.md +18 -30
- package/LICENSE.md +5 -0
- package/lib/axis/arrow.js +1 -1
- package/lib/axis/axes.js +1 -1
- package/lib/axis/index.js +1 -1
- package/lib/bg.js +1 -1
- package/lib/container/actions.js +1 -1
- package/lib/container/index.js +1 -1
- package/lib/container/marks.js +1 -1
- package/lib/container/middleware.js +1 -1
- package/lib/container/reducer.js +1 -1
- package/lib/coordinates-label.js +1 -1
- package/lib/graph-with-controls.js +1 -1
- package/lib/graph.js +1 -1
- package/lib/grid-setup.js +1 -1
- package/lib/grid.js +1 -1
- package/lib/index.js +1 -1
- package/lib/key-legend.js +1 -1
- package/lib/label-svg-icon.js +1 -1
- package/lib/labels.js +1 -1
- package/lib/mark-label.js +1 -1
- package/lib/toggle-bar.js +1 -1
- package/lib/tool-menu.js +1 -1
- package/lib/tools/absolute/component.js +1 -1
- package/lib/tools/absolute/index.js +1 -1
- package/lib/tools/circle/bg-circle.js +1 -1
- package/lib/tools/circle/component.js +1 -1
- package/lib/tools/circle/index.js +1 -1
- package/lib/tools/exponential/component.js +1 -1
- package/lib/tools/exponential/index.js +1 -1
- package/lib/tools/index.js +1 -1
- package/lib/tools/line/component.js +1 -1
- package/lib/tools/line/index.js +1 -1
- package/lib/tools/parabola/component.js +1 -1
- package/lib/tools/parabola/index.js +1 -1
- package/lib/tools/point/component.js +1 -1
- package/lib/tools/point/index.js +1 -1
- package/lib/tools/polygon/component.js +1 -1
- package/lib/tools/polygon/index.js +1 -1
- package/lib/tools/polygon/line.js +1 -1
- package/lib/tools/polygon/polygon.js +1 -1
- package/lib/tools/ray/component.js +1 -1
- package/lib/tools/ray/index.js +1 -1
- package/lib/tools/segment/component.js +1 -1
- package/lib/tools/segment/index.js +1 -1
- package/lib/tools/shared/arrow-head.js +1 -1
- package/lib/tools/shared/icons/CorrectSVG.js +1 -1
- package/lib/tools/shared/icons/IncorrectSVG.js +1 -1
- package/lib/tools/shared/icons/MissingSVG.js +1 -1
- package/lib/tools/shared/line/index.js +1 -1
- package/lib/tools/shared/line/line-path.js +1 -1
- package/lib/tools/shared/line/with-root-edge.js +1 -1
- package/lib/tools/shared/point/arrow-point.js +1 -1
- package/lib/tools/shared/point/arrow.js +1 -1
- package/lib/tools/shared/point/base-point.js +1 -1
- package/lib/tools/shared/point/index.js +1 -1
- package/lib/tools/shared/styles.js +1 -1
- package/lib/tools/shared/types.js +1 -1
- package/lib/tools/sine/component.js +1 -1
- package/lib/tools/sine/index.js +1 -1
- package/lib/tools/vector/component.js +1 -1
- package/lib/tools/vector/index.js +1 -1
- package/lib/undo-redo.js +1 -1
- package/lib/use-debounce.js +1 -1
- package/lib/utils.js +1 -1
- package/package.json +4 -4
- package/lib/__tests__/bg.test.js +0 -282
- package/lib/__tests__/coordinates-label.test.js +0 -276
- package/lib/__tests__/graph-with-controls.test.js +0 -275
- package/lib/__tests__/graph.test.js +0 -927
- package/lib/__tests__/grid-setup.test.js +0 -729
- package/lib/__tests__/grid.test.js +0 -29
- package/lib/__tests__/key-legend.test.js +0 -321
- package/lib/__tests__/label-svg-icon.test.js +0 -373
- package/lib/__tests__/labels.test.js +0 -61
- package/lib/__tests__/mark-label.test.js +0 -133
- package/lib/__tests__/toggle-bar.test.js +0 -197
- package/lib/__tests__/tool-menu.test.js +0 -151
- package/lib/__tests__/undo-redo.test.js +0 -31
- package/lib/__tests__/use-debounce.test.js +0 -24
- package/lib/__tests__/utils.js +0 -70
- package/lib/__tests__/utils.test.js +0 -123
- package/lib/axis/__tests__/arrow.test.js +0 -60
- package/lib/axis/__tests__/axes.test.js +0 -195
- package/lib/container/__tests__/actions.test.js +0 -108
- package/lib/container/__tests__/index.test.js +0 -503
- package/lib/container/__tests__/marks.test.js +0 -259
- package/lib/container/__tests__/middleware.test.js +0 -244
- package/lib/container/__tests__/reducer.test.js +0 -450
- package/lib/tools/absolute/__tests__/component.test.js +0 -65
- package/lib/tools/circle/__tests__/bg-circle.test.js +0 -33
- package/lib/tools/circle/__tests__/component.test.js +0 -615
- package/lib/tools/circle/__tests__/index.test.js +0 -576
- package/lib/tools/exponential/__tests__/component.test.js +0 -64
- package/lib/tools/exponential/__tests__/index.test.js +0 -828
- package/lib/tools/line/__tests__/component.test.js +0 -45
- package/lib/tools/parabola/__tests__/component.test.js +0 -64
- package/lib/tools/parabola/__tests__/index.test.js +0 -564
- package/lib/tools/point/__tests__/component.test.js +0 -434
- package/lib/tools/point/__tests__/index.test.js +0 -262
- package/lib/tools/polygon/__tests__/component.test.js +0 -485
- package/lib/tools/polygon/__tests__/index.test.js +0 -303
- package/lib/tools/polygon/__tests__/line.test.js +0 -50
- package/lib/tools/polygon/__tests__/polygon.test.js +0 -85
- package/lib/tools/ray/__tests__/component.test.js +0 -35
- package/lib/tools/segment/__tests__/component.test.js +0 -35
- package/lib/tools/shared/__tests__/arrow-head.test.js +0 -45
- package/lib/tools/shared/line/__tests__/index.test.js +0 -124
- package/lib/tools/shared/line/__tests__/line-path.test.js +0 -62
- package/lib/tools/shared/line/__tests__/with-root-edge.test.js +0 -90
- package/lib/tools/shared/point/__tests__/arrow-point.test.js +0 -127
- package/lib/tools/shared/point/__tests__/base-point.test.js +0 -122
- package/lib/tools/sine/__tests__/component.test.js +0 -72
- package/lib/tools/vector/__tests__/component.test.js +0 -32
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
var _index = require("../index");
|
|
5
|
-
var _component = _interopRequireDefault(require("../component"));
|
|
6
|
-
describe('point tool', function () {
|
|
7
|
-
var pointTool;
|
|
8
|
-
beforeEach(function () {
|
|
9
|
-
pointTool = (0, _index.tool)();
|
|
10
|
-
});
|
|
11
|
-
describe('tool structure', function () {
|
|
12
|
-
it('returns an object with required properties', function () {
|
|
13
|
-
expect(pointTool).toHaveProperty('label', 'Point');
|
|
14
|
-
expect(pointTool).toHaveProperty('type', 'point');
|
|
15
|
-
expect(pointTool).toHaveProperty('Component', _component["default"]);
|
|
16
|
-
expect(pointTool).toHaveProperty('addPoint');
|
|
17
|
-
});
|
|
18
|
-
it('has correct label', function () {
|
|
19
|
-
expect(pointTool.label).toBe('Point');
|
|
20
|
-
});
|
|
21
|
-
it('has correct type', function () {
|
|
22
|
-
expect(pointTool.type).toBe('point');
|
|
23
|
-
});
|
|
24
|
-
it('uses Point component', function () {
|
|
25
|
-
expect(pointTool.Component).toBe(_component["default"]);
|
|
26
|
-
});
|
|
27
|
-
it('does not have complete method', function () {
|
|
28
|
-
expect(pointTool.complete).toBeUndefined();
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
describe('addPoint', function () {
|
|
32
|
-
it('creates a point mark from coordinates', function () {
|
|
33
|
-
var point = {
|
|
34
|
-
x: 1,
|
|
35
|
-
y: 2
|
|
36
|
-
};
|
|
37
|
-
var result = pointTool.addPoint(point);
|
|
38
|
-
expect(result).toEqual({
|
|
39
|
-
type: 'point',
|
|
40
|
-
x: 1,
|
|
41
|
-
y: 2
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
it('creates point with integer coordinates', function () {
|
|
45
|
-
var point = {
|
|
46
|
-
x: 5,
|
|
47
|
-
y: 10
|
|
48
|
-
};
|
|
49
|
-
var result = pointTool.addPoint(point);
|
|
50
|
-
expect(result).toEqual({
|
|
51
|
-
type: 'point',
|
|
52
|
-
x: 5,
|
|
53
|
-
y: 10
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
it('creates point with decimal coordinates', function () {
|
|
57
|
-
var point = {
|
|
58
|
-
x: 1.5,
|
|
59
|
-
y: 2.75
|
|
60
|
-
};
|
|
61
|
-
var result = pointTool.addPoint(point);
|
|
62
|
-
expect(result).toEqual({
|
|
63
|
-
type: 'point',
|
|
64
|
-
x: 1.5,
|
|
65
|
-
y: 2.75
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
it('creates point with negative coordinates', function () {
|
|
69
|
-
var point = {
|
|
70
|
-
x: -3,
|
|
71
|
-
y: -7
|
|
72
|
-
};
|
|
73
|
-
var result = pointTool.addPoint(point);
|
|
74
|
-
expect(result).toEqual({
|
|
75
|
-
type: 'point',
|
|
76
|
-
x: -3,
|
|
77
|
-
y: -7
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
it('creates point with zero coordinates', function () {
|
|
81
|
-
var point = {
|
|
82
|
-
x: 0,
|
|
83
|
-
y: 0
|
|
84
|
-
};
|
|
85
|
-
var result = pointTool.addPoint(point);
|
|
86
|
-
expect(result).toEqual({
|
|
87
|
-
type: 'point',
|
|
88
|
-
x: 0,
|
|
89
|
-
y: 0
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
it('creates point at origin', function () {
|
|
93
|
-
var result = pointTool.addPoint({
|
|
94
|
-
x: 0,
|
|
95
|
-
y: 0
|
|
96
|
-
});
|
|
97
|
-
expect(result.x).toBe(0);
|
|
98
|
-
expect(result.y).toBe(0);
|
|
99
|
-
});
|
|
100
|
-
it('spreads all point properties', function () {
|
|
101
|
-
var point = {
|
|
102
|
-
x: 1,
|
|
103
|
-
y: 2,
|
|
104
|
-
label: 'A',
|
|
105
|
-
color: 'red'
|
|
106
|
-
};
|
|
107
|
-
var result = pointTool.addPoint(point);
|
|
108
|
-
expect(result).toEqual({
|
|
109
|
-
type: 'point',
|
|
110
|
-
x: 1,
|
|
111
|
-
y: 2,
|
|
112
|
-
label: 'A',
|
|
113
|
-
color: 'red'
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
it('preserves additional properties from point object', function () {
|
|
117
|
-
var point = {
|
|
118
|
-
x: 3,
|
|
119
|
-
y: 4,
|
|
120
|
-
id: 'point-1',
|
|
121
|
-
fill: 'blue',
|
|
122
|
-
stroke: 'black'
|
|
123
|
-
};
|
|
124
|
-
var result = pointTool.addPoint(point);
|
|
125
|
-
expect(result.type).toBe('point');
|
|
126
|
-
expect(result.x).toBe(3);
|
|
127
|
-
expect(result.y).toBe(4);
|
|
128
|
-
expect(result.id).toBe('point-1');
|
|
129
|
-
expect(result.fill).toBe('blue');
|
|
130
|
-
expect(result.stroke).toBe('black');
|
|
131
|
-
});
|
|
132
|
-
it('ignores existing mark parameter', function () {
|
|
133
|
-
var point = {
|
|
134
|
-
x: 1,
|
|
135
|
-
y: 2
|
|
136
|
-
};
|
|
137
|
-
var existingMark = {
|
|
138
|
-
type: 'point',
|
|
139
|
-
x: 5,
|
|
140
|
-
y: 5
|
|
141
|
-
};
|
|
142
|
-
var result = pointTool.addPoint(point, existingMark);
|
|
143
|
-
|
|
144
|
-
// Point tool always creates new mark, ignoring existing
|
|
145
|
-
expect(result).toEqual({
|
|
146
|
-
type: 'point',
|
|
147
|
-
x: 1,
|
|
148
|
-
y: 2
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
it('creates new point even with same coordinates', function () {
|
|
152
|
-
var point = {
|
|
153
|
-
x: 1,
|
|
154
|
-
y: 2
|
|
155
|
-
};
|
|
156
|
-
var result1 = pointTool.addPoint(point);
|
|
157
|
-
var result2 = pointTool.addPoint(point);
|
|
158
|
-
expect(result1).toEqual(result2);
|
|
159
|
-
expect(result1).not.toBe(result2); // Different object references
|
|
160
|
-
});
|
|
161
|
-
it('handles very large coordinates', function () {
|
|
162
|
-
var point = {
|
|
163
|
-
x: 1000000,
|
|
164
|
-
y: -1000000
|
|
165
|
-
};
|
|
166
|
-
var result = pointTool.addPoint(point);
|
|
167
|
-
expect(result.x).toBe(1000000);
|
|
168
|
-
expect(result.y).toBe(-1000000);
|
|
169
|
-
});
|
|
170
|
-
it('handles very small coordinates', function () {
|
|
171
|
-
var point = {
|
|
172
|
-
x: 0.0001,
|
|
173
|
-
y: 0.0002
|
|
174
|
-
};
|
|
175
|
-
var result = pointTool.addPoint(point);
|
|
176
|
-
expect(result.x).toBe(0.0001);
|
|
177
|
-
expect(result.y).toBe(0.0002);
|
|
178
|
-
});
|
|
179
|
-
});
|
|
180
|
-
describe('edge cases', function () {
|
|
181
|
-
it('handles point with only x coordinate', function () {
|
|
182
|
-
var point = {
|
|
183
|
-
x: 5
|
|
184
|
-
};
|
|
185
|
-
var result = pointTool.addPoint(point);
|
|
186
|
-
expect(result.type).toBe('point');
|
|
187
|
-
expect(result.x).toBe(5);
|
|
188
|
-
expect(result.y).toBeUndefined();
|
|
189
|
-
});
|
|
190
|
-
it('handles point with only y coordinate', function () {
|
|
191
|
-
var point = {
|
|
192
|
-
y: 5
|
|
193
|
-
};
|
|
194
|
-
var result = pointTool.addPoint(point);
|
|
195
|
-
expect(result.type).toBe('point');
|
|
196
|
-
expect(result.x).toBeUndefined();
|
|
197
|
-
expect(result.y).toBe(5);
|
|
198
|
-
});
|
|
199
|
-
it('handles empty point object', function () {
|
|
200
|
-
var point = {};
|
|
201
|
-
var result = pointTool.addPoint(point);
|
|
202
|
-
expect(result).toEqual({
|
|
203
|
-
type: 'point'
|
|
204
|
-
});
|
|
205
|
-
});
|
|
206
|
-
it('handles NaN coordinates', function () {
|
|
207
|
-
var point = {
|
|
208
|
-
x: NaN,
|
|
209
|
-
y: NaN
|
|
210
|
-
};
|
|
211
|
-
var result = pointTool.addPoint(point);
|
|
212
|
-
expect(result.type).toBe('point');
|
|
213
|
-
expect(Number.isNaN(result.x)).toBe(true);
|
|
214
|
-
expect(Number.isNaN(result.y)).toBe(true);
|
|
215
|
-
});
|
|
216
|
-
it('handles Infinity coordinates', function () {
|
|
217
|
-
var point = {
|
|
218
|
-
x: Infinity,
|
|
219
|
-
y: -Infinity
|
|
220
|
-
};
|
|
221
|
-
var result = pointTool.addPoint(point);
|
|
222
|
-
expect(result.x).toBe(Infinity);
|
|
223
|
-
expect(result.y).toBe(-Infinity);
|
|
224
|
-
});
|
|
225
|
-
});
|
|
226
|
-
describe('multiple points', function () {
|
|
227
|
-
it('creates multiple distinct points', function () {
|
|
228
|
-
var points = [{
|
|
229
|
-
x: 1,
|
|
230
|
-
y: 1
|
|
231
|
-
}, {
|
|
232
|
-
x: 2,
|
|
233
|
-
y: 2
|
|
234
|
-
}, {
|
|
235
|
-
x: 3,
|
|
236
|
-
y: 3
|
|
237
|
-
}];
|
|
238
|
-
var results = points.map(function (p) {
|
|
239
|
-
return pointTool.addPoint(p);
|
|
240
|
-
});
|
|
241
|
-
expect(results).toHaveLength(3);
|
|
242
|
-
results.forEach(function (result, i) {
|
|
243
|
-
expect(result.type).toBe('point');
|
|
244
|
-
expect(result.x).toBe(points[i].x);
|
|
245
|
-
expect(result.y).toBe(points[i].y);
|
|
246
|
-
});
|
|
247
|
-
});
|
|
248
|
-
it('each point is independent', function () {
|
|
249
|
-
var point1 = pointTool.addPoint({
|
|
250
|
-
x: 1,
|
|
251
|
-
y: 1
|
|
252
|
-
});
|
|
253
|
-
var point2 = pointTool.addPoint({
|
|
254
|
-
x: 2,
|
|
255
|
-
y: 2
|
|
256
|
-
});
|
|
257
|
-
point1.label = 'A';
|
|
258
|
-
expect(point2.label).toBeUndefined();
|
|
259
|
-
});
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaW5kZXgiLCJyZXF1aXJlIiwiX2NvbXBvbmVudCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJkZXNjcmliZSIsInBvaW50VG9vbCIsImJlZm9yZUVhY2giLCJ0b29sIiwiaXQiLCJleHBlY3QiLCJ0b0hhdmVQcm9wZXJ0eSIsIlBvaW50IiwibGFiZWwiLCJ0b0JlIiwidHlwZSIsIkNvbXBvbmVudCIsImNvbXBsZXRlIiwidG9CZVVuZGVmaW5lZCIsInBvaW50IiwieCIsInkiLCJyZXN1bHQiLCJhZGRQb2ludCIsInRvRXF1YWwiLCJjb2xvciIsImlkIiwiZmlsbCIsInN0cm9rZSIsImV4aXN0aW5nTWFyayIsInJlc3VsdDEiLCJyZXN1bHQyIiwibm90IiwiTmFOIiwiTnVtYmVyIiwiaXNOYU4iLCJJbmZpbml0eSIsInBvaW50cyIsInJlc3VsdHMiLCJtYXAiLCJwIiwidG9IYXZlTGVuZ3RoIiwiZm9yRWFjaCIsImkiLCJwb2ludDEiLCJwb2ludDIiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdG9vbHMvcG9pbnQvX190ZXN0c19fL2luZGV4LnRlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdG9vbCB9IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCBQb2ludCBmcm9tICcuLi9jb21wb25lbnQnO1xuXG5kZXNjcmliZSgncG9pbnQgdG9vbCcsICgpID0+IHtcbiAgbGV0IHBvaW50VG9vbDtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBwb2ludFRvb2wgPSB0b29sKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd0b29sIHN0cnVjdHVyZScsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBhbiBvYmplY3Qgd2l0aCByZXF1aXJlZCBwcm9wZXJ0aWVzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHBvaW50VG9vbCkudG9IYXZlUHJvcGVydHkoJ2xhYmVsJywgJ1BvaW50Jyk7XG4gICAgICBleHBlY3QocG9pbnRUb29sKS50b0hhdmVQcm9wZXJ0eSgndHlwZScsICdwb2ludCcpO1xuICAgICAgZXhwZWN0KHBvaW50VG9vbCkudG9IYXZlUHJvcGVydHkoJ0NvbXBvbmVudCcsIFBvaW50KTtcbiAgICAgIGV4cGVjdChwb2ludFRvb2wpLnRvSGF2ZVByb3BlcnR5KCdhZGRQb2ludCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhcyBjb3JyZWN0IGxhYmVsJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHBvaW50VG9vbC5sYWJlbCkudG9CZSgnUG9pbnQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYXMgY29ycmVjdCB0eXBlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHBvaW50VG9vbC50eXBlKS50b0JlKCdwb2ludCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3VzZXMgUG9pbnQgY29tcG9uZW50JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHBvaW50VG9vbC5Db21wb25lbnQpLnRvQmUoUG9pbnQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGhhdmUgY29tcGxldGUgbWV0aG9kJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHBvaW50VG9vbC5jb21wbGV0ZSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkUG9pbnQnLCAoKSA9PiB7XG4gICAgaXQoJ2NyZWF0ZXMgYSBwb2ludCBtYXJrIGZyb20gY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwb2ludCA9IHsgeDogMSwgeTogMiB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gcG9pbnRUb29sLmFkZFBvaW50KHBvaW50KTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgIHg6IDEsXG4gICAgICAgIHk6IDIsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdjcmVhdGVzIHBvaW50IHdpdGggaW50ZWdlciBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHBvaW50ID0geyB4OiA1LCB5OiAxMCB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gcG9pbnRUb29sLmFkZFBvaW50KHBvaW50KTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgIHg6IDUsXG4gICAgICAgIHk6IDEwLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY3JlYXRlcyBwb2ludCB3aXRoIGRlY2ltYWwgY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwb2ludCA9IHsgeDogMS41LCB5OiAyLjc1IH07XG4gICAgICBjb25zdCByZXN1bHQgPSBwb2ludFRvb2wuYWRkUG9pbnQocG9pbnQpO1xuXG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHtcbiAgICAgICAgdHlwZTogJ3BvaW50JyxcbiAgICAgICAgeDogMS41LFxuICAgICAgICB5OiAyLjc1LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY3JlYXRlcyBwb2ludCB3aXRoIG5lZ2F0aXZlIGNvb3JkaW5hdGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IC0zLCB5OiAtNyB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gcG9pbnRUb29sLmFkZFBvaW50KHBvaW50KTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgIHg6IC0zLFxuICAgICAgICB5OiAtNyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NyZWF0ZXMgcG9pbnQgd2l0aCB6ZXJvIGNvb3JkaW5hdGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50VG9vbC5hZGRQb2ludChwb2ludCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY3JlYXRlcyBwb2ludCBhdCBvcmlnaW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBwb2ludFRvb2wuYWRkUG9pbnQoeyB4OiAwLCB5OiAwIH0pO1xuXG4gICAgICBleHBlY3QocmVzdWx0LngpLnRvQmUoMCk7XG4gICAgICBleHBlY3QocmVzdWx0LnkpLnRvQmUoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3ByZWFkcyBhbGwgcG9pbnQgcHJvcGVydGllcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHBvaW50ID0geyB4OiAxLCB5OiAyLCBsYWJlbDogJ0EnLCBjb2xvcjogJ3JlZCcgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50VG9vbC5hZGRQb2ludChwb2ludCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICB4OiAxLFxuICAgICAgICB5OiAyLFxuICAgICAgICBsYWJlbDogJ0EnLFxuICAgICAgICBjb2xvcjogJ3JlZCcsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdwcmVzZXJ2ZXMgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZyb20gcG9pbnQgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcG9pbnQgPSB7XG4gICAgICAgIHg6IDMsXG4gICAgICAgIHk6IDQsXG4gICAgICAgIGlkOiAncG9pbnQtMScsXG4gICAgICAgIGZpbGw6ICdibHVlJyxcbiAgICAgICAgc3Ryb2tlOiAnYmxhY2snLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50VG9vbC5hZGRQb2ludChwb2ludCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQudHlwZSkudG9CZSgncG9pbnQnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQueCkudG9CZSgzKTtcbiAgICAgIGV4cGVjdChyZXN1bHQueSkudG9CZSg0KTtcbiAgICAgIGV4cGVjdChyZXN1bHQuaWQpLnRvQmUoJ3BvaW50LTEnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuZmlsbCkudG9CZSgnYmx1ZScpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5zdHJva2UpLnRvQmUoJ2JsYWNrJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaWdub3JlcyBleGlzdGluZyBtYXJrIHBhcmFtZXRlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHBvaW50ID0geyB4OiAxLCB5OiAyIH07XG4gICAgICBjb25zdCBleGlzdGluZ01hcmsgPSB7IHR5cGU6ICdwb2ludCcsIHg6IDUsIHk6IDUgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50VG9vbC5hZGRQb2ludChwb2ludCwgZXhpc3RpbmdNYXJrKTtcblxuICAgICAgLy8gUG9pbnQgdG9vbCBhbHdheXMgY3JlYXRlcyBuZXcgbWFyaywgaWdub3JpbmcgZXhpc3RpbmdcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICB4OiAxLFxuICAgICAgICB5OiAyLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY3JlYXRlcyBuZXcgcG9pbnQgZXZlbiB3aXRoIHNhbWUgY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwb2ludCA9IHsgeDogMSwgeTogMiB9O1xuICAgICAgY29uc3QgcmVzdWx0MSA9IHBvaW50VG9vbC5hZGRQb2ludChwb2ludCk7XG4gICAgICBjb25zdCByZXN1bHQyID0gcG9pbnRUb29sLmFkZFBvaW50KHBvaW50KTtcblxuICAgICAgZXhwZWN0KHJlc3VsdDEpLnRvRXF1YWwocmVzdWx0Mik7XG4gICAgICBleHBlY3QocmVzdWx0MSkubm90LnRvQmUocmVzdWx0Mik7IC8vIERpZmZlcmVudCBvYmplY3QgcmVmZXJlbmNlc1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgdmVyeSBsYXJnZSBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHBvaW50ID0geyB4OiAxMDAwMDAwLCB5OiAtMTAwMDAwMCB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gcG9pbnRUb29sLmFkZFBvaW50KHBvaW50KTtcblxuICAgICAgZXhwZWN0KHJlc3VsdC54KS50b0JlKDEwMDAwMDApO1xuICAgICAgZXhwZWN0KHJlc3VsdC55KS50b0JlKC0xMDAwMDAwKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIHZlcnkgc21hbGwgY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwb2ludCA9IHsgeDogMC4wMDAxLCB5OiAwLjAwMDIgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50VG9vbC5hZGRQb2ludChwb2ludCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQueCkudG9CZSgwLjAwMDEpO1xuICAgICAgZXhwZWN0KHJlc3VsdC55KS50b0JlKDAuMDAwMik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlZGdlIGNhc2VzJywgKCkgPT4ge1xuICAgIGl0KCdoYW5kbGVzIHBvaW50IHdpdGggb25seSB4IGNvb3JkaW5hdGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwb2ludCA9IHsgeDogNSB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gcG9pbnRUb29sLmFkZFBvaW50KHBvaW50KTtcblxuICAgICAgZXhwZWN0KHJlc3VsdC50eXBlKS50b0JlKCdwb2ludCcpO1xuICAgICAgZXhwZWN0KHJlc3VsdC54KS50b0JlKDUpO1xuICAgICAgZXhwZWN0KHJlc3VsdC55KS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBwb2ludCB3aXRoIG9ubHkgeSBjb29yZGluYXRlJywgKCkgPT4ge1xuICAgICAgY29uc3QgcG9pbnQgPSB7IHk6IDUgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50VG9vbC5hZGRQb2ludChwb2ludCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQudHlwZSkudG9CZSgncG9pbnQnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQueCkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHJlc3VsdC55KS50b0JlKDUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgZW1wdHkgcG9pbnQgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcG9pbnQgPSB7fTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50VG9vbC5hZGRQb2ludChwb2ludCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBOYU4gY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwb2ludCA9IHsgeDogTmFOLCB5OiBOYU4gfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBvaW50VG9vbC5hZGRQb2ludChwb2ludCk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQudHlwZSkudG9CZSgncG9pbnQnKTtcbiAgICAgIGV4cGVjdChOdW1iZXIuaXNOYU4ocmVzdWx0LngpKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KE51bWJlci5pc05hTihyZXN1bHQueSkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBJbmZpbml0eSBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHBvaW50ID0geyB4OiBJbmZpbml0eSwgeTogLUluZmluaXR5IH07XG4gICAgICBjb25zdCByZXN1bHQgPSBwb2ludFRvb2wuYWRkUG9pbnQocG9pbnQpO1xuXG4gICAgICBleHBlY3QocmVzdWx0LngpLnRvQmUoSW5maW5pdHkpO1xuICAgICAgZXhwZWN0KHJlc3VsdC55KS50b0JlKC1JbmZpbml0eSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdtdWx0aXBsZSBwb2ludHMnLCAoKSA9PiB7XG4gICAgaXQoJ2NyZWF0ZXMgbXVsdGlwbGUgZGlzdGluY3QgcG9pbnRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcG9pbnRzID0gW1xuICAgICAgICB7IHg6IDEsIHk6IDEgfSxcbiAgICAgICAgeyB4OiAyLCB5OiAyIH0sXG4gICAgICAgIHsgeDogMywgeTogMyB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgcmVzdWx0cyA9IHBvaW50cy5tYXAoKHApID0+IHBvaW50VG9vbC5hZGRQb2ludChwKSk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHRzKS50b0hhdmVMZW5ndGgoMyk7XG4gICAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaSkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LnR5cGUpLnRvQmUoJ3BvaW50Jyk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQueCkudG9CZShwb2ludHNbaV0ueCk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQueSkudG9CZShwb2ludHNbaV0ueSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdlYWNoIHBvaW50IGlzIGluZGVwZW5kZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcG9pbnQxID0gcG9pbnRUb29sLmFkZFBvaW50KHsgeDogMSwgeTogMSB9KTtcbiAgICAgIGNvbnN0IHBvaW50MiA9IHBvaW50VG9vbC5hZGRQb2ludCh7IHg6IDIsIHk6IDIgfSk7XG5cbiAgICAgIHBvaW50MS5sYWJlbCA9ICdBJztcbiAgICAgIGV4cGVjdChwb2ludDIubGFiZWwpLnRvQmVVbmRlZmluZWQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsVUFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBRUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsWUFBTTtFQUMzQixJQUFJQyxTQUFTO0VBRWJDLFVBQVUsQ0FBQyxZQUFNO0lBQ2ZELFNBQVMsR0FBRyxJQUFB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
|