@pie-lib/graphing 3.2.0-next.2 → 3.2.0-next.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/CHANGELOG.md +21 -29
  2. package/LICENSE.md +5 -0
  3. package/lib/axis/arrow.js +1 -1
  4. package/lib/axis/axes.js +1 -1
  5. package/lib/axis/index.js +1 -1
  6. package/lib/bg.js +1 -1
  7. package/lib/container/actions.js +1 -1
  8. package/lib/container/index.js +1 -1
  9. package/lib/container/marks.js +1 -1
  10. package/lib/container/middleware.js +1 -1
  11. package/lib/container/reducer.js +1 -1
  12. package/lib/coordinates-label.js +1 -1
  13. package/lib/graph-with-controls.js +1 -1
  14. package/lib/graph.js +1 -1
  15. package/lib/grid-setup.js +1 -1
  16. package/lib/grid.js +1 -1
  17. package/lib/index.js +1 -1
  18. package/lib/key-legend.js +1 -1
  19. package/lib/label-svg-icon.js +1 -1
  20. package/lib/labels.js +1 -1
  21. package/lib/mark-label.js +1 -1
  22. package/lib/toggle-bar.js +1 -1
  23. package/lib/tool-menu.js +1 -1
  24. package/lib/tools/absolute/component.js +1 -1
  25. package/lib/tools/absolute/index.js +1 -1
  26. package/lib/tools/circle/bg-circle.js +1 -1
  27. package/lib/tools/circle/component.js +1 -1
  28. package/lib/tools/circle/index.js +1 -1
  29. package/lib/tools/exponential/component.js +1 -1
  30. package/lib/tools/exponential/index.js +1 -1
  31. package/lib/tools/index.js +1 -1
  32. package/lib/tools/line/component.js +1 -1
  33. package/lib/tools/line/index.js +1 -1
  34. package/lib/tools/parabola/component.js +1 -1
  35. package/lib/tools/parabola/index.js +1 -1
  36. package/lib/tools/point/component.js +1 -1
  37. package/lib/tools/point/index.js +1 -1
  38. package/lib/tools/polygon/component.js +1 -1
  39. package/lib/tools/polygon/index.js +1 -1
  40. package/lib/tools/polygon/line.js +1 -1
  41. package/lib/tools/polygon/polygon.js +1 -1
  42. package/lib/tools/ray/component.js +1 -1
  43. package/lib/tools/ray/index.js +1 -1
  44. package/lib/tools/segment/component.js +1 -1
  45. package/lib/tools/segment/index.js +1 -1
  46. package/lib/tools/shared/arrow-head.js +1 -1
  47. package/lib/tools/shared/icons/CorrectSVG.js +1 -1
  48. package/lib/tools/shared/icons/IncorrectSVG.js +1 -1
  49. package/lib/tools/shared/icons/MissingSVG.js +1 -1
  50. package/lib/tools/shared/line/index.js +1 -1
  51. package/lib/tools/shared/line/line-path.js +1 -1
  52. package/lib/tools/shared/line/with-root-edge.js +1 -1
  53. package/lib/tools/shared/point/arrow-point.js +1 -1
  54. package/lib/tools/shared/point/arrow.js +1 -1
  55. package/lib/tools/shared/point/base-point.js +1 -1
  56. package/lib/tools/shared/point/index.js +1 -1
  57. package/lib/tools/shared/styles.js +1 -1
  58. package/lib/tools/shared/types.js +1 -1
  59. package/lib/tools/sine/component.js +1 -1
  60. package/lib/tools/sine/index.js +1 -1
  61. package/lib/tools/vector/component.js +1 -1
  62. package/lib/tools/vector/index.js +1 -1
  63. package/lib/undo-redo.js +1 -1
  64. package/lib/use-debounce.js +1 -1
  65. package/lib/utils.js +1 -1
  66. package/package.json +4 -4
  67. package/lib/__tests__/bg.test.js +0 -282
  68. package/lib/__tests__/coordinates-label.test.js +0 -276
  69. package/lib/__tests__/graph-with-controls.test.js +0 -275
  70. package/lib/__tests__/graph.test.js +0 -927
  71. package/lib/__tests__/grid-setup.test.js +0 -729
  72. package/lib/__tests__/grid.test.js +0 -29
  73. package/lib/__tests__/key-legend.test.js +0 -321
  74. package/lib/__tests__/label-svg-icon.test.js +0 -373
  75. package/lib/__tests__/labels.test.js +0 -61
  76. package/lib/__tests__/mark-label.test.js +0 -133
  77. package/lib/__tests__/toggle-bar.test.js +0 -197
  78. package/lib/__tests__/tool-menu.test.js +0 -151
  79. package/lib/__tests__/undo-redo.test.js +0 -31
  80. package/lib/__tests__/use-debounce.test.js +0 -24
  81. package/lib/__tests__/utils.js +0 -70
  82. package/lib/__tests__/utils.test.js +0 -123
  83. package/lib/axis/__tests__/arrow.test.js +0 -60
  84. package/lib/axis/__tests__/axes.test.js +0 -195
  85. package/lib/container/__tests__/actions.test.js +0 -108
  86. package/lib/container/__tests__/index.test.js +0 -503
  87. package/lib/container/__tests__/marks.test.js +0 -259
  88. package/lib/container/__tests__/middleware.test.js +0 -244
  89. package/lib/container/__tests__/reducer.test.js +0 -450
  90. package/lib/tools/absolute/__tests__/component.test.js +0 -65
  91. package/lib/tools/circle/__tests__/bg-circle.test.js +0 -33
  92. package/lib/tools/circle/__tests__/component.test.js +0 -615
  93. package/lib/tools/circle/__tests__/index.test.js +0 -576
  94. package/lib/tools/exponential/__tests__/component.test.js +0 -64
  95. package/lib/tools/exponential/__tests__/index.test.js +0 -828
  96. package/lib/tools/line/__tests__/component.test.js +0 -45
  97. package/lib/tools/parabola/__tests__/component.test.js +0 -64
  98. package/lib/tools/parabola/__tests__/index.test.js +0 -564
  99. package/lib/tools/point/__tests__/component.test.js +0 -434
  100. package/lib/tools/point/__tests__/index.test.js +0 -262
  101. package/lib/tools/polygon/__tests__/component.test.js +0 -485
  102. package/lib/tools/polygon/__tests__/index.test.js +0 -303
  103. package/lib/tools/polygon/__tests__/line.test.js +0 -50
  104. package/lib/tools/polygon/__tests__/polygon.test.js +0 -85
  105. package/lib/tools/ray/__tests__/component.test.js +0 -35
  106. package/lib/tools/segment/__tests__/component.test.js +0 -35
  107. package/lib/tools/shared/__tests__/arrow-head.test.js +0 -45
  108. package/lib/tools/shared/line/__tests__/index.test.js +0 -124
  109. package/lib/tools/shared/line/__tests__/line-path.test.js +0 -62
  110. package/lib/tools/shared/line/__tests__/with-root-edge.test.js +0 -90
  111. package/lib/tools/shared/point/__tests__/arrow-point.test.js +0 -127
  112. package/lib/tools/shared/point/__tests__/base-point.test.js +0 -122
  113. package/lib/tools/sine/__tests__/component.test.js +0 -72
  114. package/lib/tools/vector/__tests__/component.test.js +0 -32
@@ -1,485 +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 _testUtils = require("@pie-lib/test-utils");
6
- var _react = _interopRequireDefault(require("react"));
7
- var _utils = require("../../../__tests__/utils");
8
- var _component = require("../component");
9
- 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; }
10
- 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; }
11
- var xyLabel = function xyLabel(x, y, index, label) {
12
- return _objectSpread(_objectSpread({}, (0, _utils.xy)(x, y, index)), {}, {
13
- label: label
14
- });
15
- };
16
- describe('buildLines', function () {
17
- var defaultPoints = [(0, _utils.xy)(0, 0), (0, _utils.xy)(1, 1), (0, _utils.xy)(1, 0)];
18
- var assertBuildLines = function assertBuildLines(points, closed, expected) {
19
- it("builds points and lines for ".concat(points, " = ").concat(expected), function () {
20
- var result = (0, _component.buildLines)(points);
21
- expect(result).toMatchObject([{
22
- from: (0, _utils.xy)(0, 0, 0),
23
- to: (0, _utils.xy)(1, 1, 1)
24
- }, {
25
- from: (0, _utils.xy)(1, 1, 1),
26
- to: (0, _utils.xy)(1, 0, 2)
27
- }]);
28
- });
29
- };
30
- assertBuildLines(defaultPoints, true, []);
31
- });
32
- describe('swap', function () {
33
- it('swaps pairs', function () {
34
- var result = (0, _component.swap)([(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(1, 1, 1), (0, _utils.xy)(2, 2, 2)], (0, _utils.xy)(0, 0, 0), (0, _utils.xy)(3, 3, 0));
35
- expect(result).toEqual([(0, _utils.xy)(3, 3, 0), (0, _utils.xy)(1, 1, 1), (0, _utils.xy)(2, 2, 2)]);
36
- });
37
- });
38
- describe('RawBaseComponent', function () {
39
- var onChange = jest.fn();
40
- var onChangeProps = jest.fn();
41
- var renderComponent = function renderComponent(extras) {
42
- var defaults = {
43
- classes: {},
44
- className: 'className',
45
- onChange: onChange,
46
- onChangeProps: onChangeProps,
47
- onClosePolygon: jest.fn(),
48
- graphProps: (0, _utils.graphProps)(),
49
- points: []
50
- };
51
- var props = _objectSpread(_objectSpread({}, defaults), extras);
52
- return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_component.RawBaseComponent, props));
53
- };
54
-
55
- // used to test items that have labels attached to points
56
- var labelNode = document.createElement('foreignObject');
57
- var points = [xyLabel(0, 0, 0, 'A'), xyLabel(2, 2, 1, 'B'), xyLabel(0, 2, 2, 'C')];
58
- var renderWithLabels = function renderWithLabels(extras) {
59
- return renderComponent(_objectSpread({
60
- labelNode: labelNode,
61
- points: points
62
- }, extras));
63
- };
64
- describe('rendering', function () {
65
- it('renders without crashing', function () {
66
- var _renderComponent = renderComponent(),
67
- container = _renderComponent.container;
68
- expect(container.firstChild).toBeInTheDocument();
69
- });
70
- it('renders with labels', function () {
71
- var _renderWithLabels = renderWithLabels(),
72
- container = _renderWithLabels.container;
73
- expect(container.firstChild).toBeInTheDocument();
74
- });
75
- it('renders with multiple points', function () {
76
- var _renderComponent2 = renderComponent({
77
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(1, 1, 1), (0, _utils.xy)(2, 0, 2)]
78
- }),
79
- container = _renderComponent2.container;
80
- expect(container.firstChild).toBeInTheDocument();
81
- });
82
- it('renders with closed polygon', function () {
83
- var _renderComponent3 = renderComponent({
84
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(1, 1, 1), (0, _utils.xy)(2, 0, 2)],
85
- closed: true
86
- }),
87
- container = _renderComponent3.container;
88
- expect(container.firstChild).toBeInTheDocument();
89
- });
90
- it('renders with single point', function () {
91
- var _renderComponent4 = renderComponent({
92
- points: [(0, _utils.xy)(0, 0, 0)]
93
- }),
94
- container = _renderComponent4.container;
95
- expect(container.firstChild).toBeInTheDocument();
96
- });
97
- it('renders with two points', function () {
98
- var _renderComponent5 = renderComponent({
99
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(1, 1, 1)]
100
- }),
101
- container = _renderComponent5.container;
102
- expect(container.firstChild).toBeInTheDocument();
103
- });
104
- it('renders with many points', function () {
105
- var manyPoints = Array.from({
106
- length: 10
107
- }, function (_, i) {
108
- return (0, _utils.xy)(i, i, i);
109
- });
110
- var _renderComponent6 = renderComponent({
111
- points: manyPoints
112
- }),
113
- container = _renderComponent6.container;
114
- expect(container.firstChild).toBeInTheDocument();
115
- });
116
- it('renders with negative coordinates', function () {
117
- var _renderComponent7 = renderComponent({
118
- points: [(0, _utils.xy)(-5, -5, 0), (0, _utils.xy)(-1, -1, 1), (0, _utils.xy)(-3, -2, 2)]
119
- }),
120
- container = _renderComponent7.container;
121
- expect(container.firstChild).toBeInTheDocument();
122
- });
123
- it('renders with decimal coordinates', function () {
124
- var _renderComponent8 = renderComponent({
125
- points: [(0, _utils.xy)(0.5, 0.5, 0), (0, _utils.xy)(1.5, 1.5, 1), (0, _utils.xy)(2.5, 0.5, 2)]
126
- }),
127
- container = _renderComponent8.container;
128
- expect(container.firstChild).toBeInTheDocument();
129
- });
130
- it('renders with zero coordinates', function () {
131
- var _renderComponent9 = renderComponent({
132
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(0, 0, 1), (0, _utils.xy)(0, 0, 2)]
133
- }),
134
- container = _renderComponent9.container;
135
- expect(container.firstChild).toBeInTheDocument();
136
- });
137
- });
138
- describe('states', function () {
139
- it('renders in disabled state', function () {
140
- var _renderComponent0 = renderComponent({
141
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(1, 1, 1), (0, _utils.xy)(2, 0, 2)],
142
- disabled: true
143
- }),
144
- container = _renderComponent0.container;
145
- expect(container.firstChild).toBeInTheDocument();
146
- });
147
- it('renders in enabled state', function () {
148
- var _renderComponent1 = renderComponent({
149
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(1, 1, 1), (0, _utils.xy)(2, 0, 2)],
150
- disabled: false
151
- }),
152
- container = _renderComponent1.container;
153
- expect(container.firstChild).toBeInTheDocument();
154
- });
155
- it('renders with correctness correct', function () {
156
- var _renderComponent10 = renderComponent({
157
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(1, 1, 1), (0, _utils.xy)(2, 0, 2)],
158
- correctness: 'correct'
159
- }),
160
- container = _renderComponent10.container;
161
- expect(container.firstChild).toBeInTheDocument();
162
- });
163
- it('renders with correctness incorrect', function () {
164
- var _renderComponent11 = renderComponent({
165
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(1, 1, 1), (0, _utils.xy)(2, 0, 2)],
166
- correctness: 'incorrect'
167
- }),
168
- container = _renderComponent11.container;
169
- expect(container.firstChild).toBeInTheDocument();
170
- });
171
- it('renders with correctness partial', function () {
172
- var _renderComponent12 = renderComponent({
173
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(1, 1, 1), (0, _utils.xy)(2, 0, 2)],
174
- correctness: 'partial'
175
- }),
176
- container = _renderComponent12.container;
177
- expect(container.firstChild).toBeInTheDocument();
178
- });
179
- it('renders with building state', function () {
180
- var _renderComponent13 = renderComponent({
181
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(1, 1, 1)],
182
- building: true
183
- }),
184
- container = _renderComponent13.container;
185
- expect(container.firstChild).toBeInTheDocument();
186
- });
187
- });
188
- describe('labels', function () {
189
- it('renders with all points labeled', function () {
190
- var _renderWithLabels2 = renderWithLabels(),
191
- container = _renderWithLabels2.container;
192
- expect(container.firstChild).toBeInTheDocument();
193
- });
194
- it('renders with some points labeled', function () {
195
- var partialLabels = [xyLabel(0, 0, 0, 'A'), (0, _utils.xy)(2, 2, 1), xyLabel(0, 2, 2, 'C')];
196
- var _renderComponent14 = renderComponent({
197
- labelNode: labelNode,
198
- points: partialLabels
199
- }),
200
- container = _renderComponent14.container;
201
- expect(container.firstChild).toBeInTheDocument();
202
- });
203
- it('renders with empty labels', function () {
204
- var emptyLabels = [xyLabel(0, 0, 0, ''), xyLabel(2, 2, 1, ''), xyLabel(0, 2, 2, '')];
205
- var _renderComponent15 = renderComponent({
206
- labelNode: labelNode,
207
- points: emptyLabels
208
- }),
209
- container = _renderComponent15.container;
210
- expect(container.firstChild).toBeInTheDocument();
211
- });
212
- it('renders with long labels', function () {
213
- var longLabels = [xyLabel(0, 0, 0, 'Very Long Label A'), xyLabel(2, 2, 1, 'Very Long Label B'), xyLabel(0, 2, 2, 'Very Long Label C')];
214
- var _renderComponent16 = renderComponent({
215
- labelNode: labelNode,
216
- points: longLabels
217
- }),
218
- container = _renderComponent16.container;
219
- expect(container.firstChild).toBeInTheDocument();
220
- });
221
- it('renders without labelNode', function () {
222
- var _renderComponent17 = renderComponent({
223
- points: [xyLabel(0, 0, 0, 'A'), xyLabel(2, 2, 1, 'B')]
224
- }),
225
- container = _renderComponent17.container;
226
- expect(container.firstChild).toBeInTheDocument();
227
- });
228
- it('renders with labelModeEnabled', function () {
229
- var _renderWithLabels3 = renderWithLabels({
230
- labelModeEnabled: true
231
- }),
232
- container = _renderWithLabels3.container;
233
- expect(container.firstChild).toBeInTheDocument();
234
- });
235
- it('renders with labelModeEnabled disabled', function () {
236
- var _renderWithLabels4 = renderWithLabels({
237
- labelModeEnabled: false
238
- }),
239
- container = _renderWithLabels4.container;
240
- expect(container.firstChild).toBeInTheDocument();
241
- });
242
- });
243
- describe('props', function () {
244
- it('passes onChange callback', function () {
245
- var customOnChange = jest.fn();
246
- var _renderComponent18 = renderComponent({
247
- onChange: customOnChange,
248
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(1, 1, 1)]
249
- }),
250
- container = _renderComponent18.container;
251
- expect(container.firstChild).toBeInTheDocument();
252
- });
253
- it('passes onChangeProps callback', function () {
254
- var customOnChangeProps = jest.fn();
255
- var _renderComponent19 = renderComponent({
256
- onChangeProps: customOnChangeProps,
257
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(1, 1, 1)]
258
- }),
259
- container = _renderComponent19.container;
260
- expect(container.firstChild).toBeInTheDocument();
261
- });
262
- it('passes onClick callback', function () {
263
- var onClick = jest.fn();
264
- var _renderComponent20 = renderComponent({
265
- onClick: onClick,
266
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(1, 1, 1)]
267
- }),
268
- container = _renderComponent20.container;
269
- expect(container.firstChild).toBeInTheDocument();
270
- });
271
- it('passes onClosePolygon callback', function () {
272
- var onClosePolygon = jest.fn();
273
- var _renderComponent21 = renderComponent({
274
- onClosePolygon: onClosePolygon,
275
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(1, 1, 1), (0, _utils.xy)(2, 0, 2)]
276
- }),
277
- container = _renderComponent21.container;
278
- expect(container.firstChild).toBeInTheDocument();
279
- });
280
- it('passes onDragStart callback', function () {
281
- var onDragStart = jest.fn();
282
- var _renderComponent22 = renderComponent({
283
- onDragStart: onDragStart,
284
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(1, 1, 1)]
285
- }),
286
- container = _renderComponent22.container;
287
- expect(container.firstChild).toBeInTheDocument();
288
- });
289
- it('passes onDragStop callback', function () {
290
- var onDragStop = jest.fn();
291
- var _renderComponent23 = renderComponent({
292
- onDragStop: onDragStop,
293
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(1, 1, 1)]
294
- }),
295
- container = _renderComponent23.container;
296
- expect(container.firstChild).toBeInTheDocument();
297
- });
298
- it('passes coordinatesOnHover', function () {
299
- var _renderComponent24 = renderComponent({
300
- coordinatesOnHover: true,
301
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(1, 1, 1)]
302
- }),
303
- container = _renderComponent24.container;
304
- expect(container.firstChild).toBeInTheDocument();
305
- });
306
- it('passes graphProps', function () {
307
- var customGraphProps = (0, _utils.graphProps)(0, 10, 0, 10);
308
- var _renderComponent25 = renderComponent({
309
- graphProps: customGraphProps,
310
- points: [(0, _utils.xy)(5, 5, 0), (0, _utils.xy)(7, 7, 1)]
311
- }),
312
- container = _renderComponent25.container;
313
- expect(container.firstChild).toBeInTheDocument();
314
- });
315
- });
316
- describe('polygon shapes', function () {
317
- it('renders triangle', function () {
318
- var _renderComponent26 = renderComponent({
319
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(2, 0, 1), (0, _utils.xy)(1, 2, 2)],
320
- closed: true
321
- }),
322
- container = _renderComponent26.container;
323
- expect(container.firstChild).toBeInTheDocument();
324
- });
325
- it('renders square', function () {
326
- var _renderComponent27 = renderComponent({
327
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(2, 0, 1), (0, _utils.xy)(2, 2, 2), (0, _utils.xy)(0, 2, 3)],
328
- closed: true
329
- }),
330
- container = _renderComponent27.container;
331
- expect(container.firstChild).toBeInTheDocument();
332
- });
333
- it('renders pentagon', function () {
334
- var _renderComponent28 = renderComponent({
335
- points: [(0, _utils.xy)(1, 0, 0), (0, _utils.xy)(2, 1, 1), (0, _utils.xy)(1.5, 2.5, 2), (0, _utils.xy)(0.5, 2.5, 3), (0, _utils.xy)(0, 1, 4)],
336
- closed: true
337
- }),
338
- container = _renderComponent28.container;
339
- expect(container.firstChild).toBeInTheDocument();
340
- });
341
- it('renders hexagon', function () {
342
- var _renderComponent29 = renderComponent({
343
- points: [(0, _utils.xy)(1, 0, 0), (0, _utils.xy)(2, 0.5, 1), (0, _utils.xy)(2, 1.5, 2), (0, _utils.xy)(1, 2, 3), (0, _utils.xy)(0, 1.5, 4), (0, _utils.xy)(0, 0.5, 5)],
344
- closed: true
345
- }),
346
- container = _renderComponent29.container;
347
- expect(container.firstChild).toBeInTheDocument();
348
- });
349
- it('renders irregular polygon', function () {
350
- var _renderComponent30 = renderComponent({
351
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(3, 1, 1), (0, _utils.xy)(2, 4, 2), (0, _utils.xy)(-1, 3, 3)],
352
- closed: true
353
- }),
354
- container = _renderComponent30.container;
355
- expect(container.firstChild).toBeInTheDocument();
356
- });
357
- it('renders concave polygon', function () {
358
- var _renderComponent31 = renderComponent({
359
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(2, 0, 1), (0, _utils.xy)(2, 2, 2), (0, _utils.xy)(1, 1, 3), (0, _utils.xy)(0, 2, 4)],
360
- closed: true
361
- }),
362
- container = _renderComponent31.container;
363
- expect(container.firstChild).toBeInTheDocument();
364
- });
365
- });
366
- describe('edge cases', function () {
367
- it('handles empty points array', function () {
368
- var _renderComponent32 = renderComponent({
369
- points: []
370
- }),
371
- container = _renderComponent32.container;
372
- expect(container.firstChild).toBeInTheDocument();
373
- });
374
- it('handles points with same coordinates', function () {
375
- var _renderComponent33 = renderComponent({
376
- points: [(0, _utils.xy)(1, 1, 0), (0, _utils.xy)(1, 1, 1), (0, _utils.xy)(1, 1, 2)]
377
- }),
378
- container = _renderComponent33.container;
379
- expect(container.firstChild).toBeInTheDocument();
380
- });
381
- it('handles collinear points', function () {
382
- var _renderComponent34 = renderComponent({
383
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(1, 1, 1), (0, _utils.xy)(2, 2, 2)]
384
- }),
385
- container = _renderComponent34.container;
386
- expect(container.firstChild).toBeInTheDocument();
387
- });
388
- it('handles very close points', function () {
389
- var _renderComponent35 = renderComponent({
390
- points: [(0, _utils.xy)(1, 1, 0), (0, _utils.xy)(1.001, 1.001, 1), (0, _utils.xy)(1.002, 1.002, 2)]
391
- }),
392
- container = _renderComponent35.container;
393
- expect(container.firstChild).toBeInTheDocument();
394
- });
395
- it('handles large coordinate values', function () {
396
- var _renderComponent36 = renderComponent({
397
- points: [(0, _utils.xy)(1000, 1000, 0), (0, _utils.xy)(2000, 1000, 1), (0, _utils.xy)(1500, 2000, 2)]
398
- }),
399
- container = _renderComponent36.container;
400
- expect(container.firstChild).toBeInTheDocument();
401
- });
402
- it('handles mixed positive and negative coordinates', function () {
403
- var _renderComponent37 = renderComponent({
404
- points: [(0, _utils.xy)(-5, 5, 0), (0, _utils.xy)(5, 5, 1), (0, _utils.xy)(5, -5, 2), (0, _utils.xy)(-5, -5, 3)],
405
- closed: true
406
- }),
407
- container = _renderComponent37.container;
408
- expect(container.firstChild).toBeInTheDocument();
409
- });
410
- it('handles points without index', function () {
411
- var _renderComponent38 = renderComponent({
412
- points: [{
413
- x: 0,
414
- y: 0
415
- }, {
416
- x: 1,
417
- y: 1
418
- }, {
419
- x: 2,
420
- y: 0
421
- }]
422
- }),
423
- container = _renderComponent38.container;
424
- expect(container.firstChild).toBeInTheDocument();
425
- });
426
- });
427
- describe('integration', function () {
428
- it('renders complete closed polygon with all features', function () {
429
- var _renderComponent39 = renderComponent({
430
- points: points,
431
- closed: true,
432
- labelNode: labelNode,
433
- labelModeEnabled: true,
434
- coordinatesOnHover: true,
435
- correctness: 'correct',
436
- disabled: false,
437
- onChange: jest.fn(),
438
- onChangeProps: jest.fn(),
439
- onClosePolygon: jest.fn(),
440
- onClick: jest.fn(),
441
- onDragStart: jest.fn(),
442
- onDragStop: jest.fn()
443
- }),
444
- container = _renderComponent39.container;
445
- expect(container.firstChild).toBeInTheDocument();
446
- });
447
- it('renders building polygon', function () {
448
- var _renderComponent40 = renderComponent({
449
- points: [(0, _utils.xy)(0, 0, 0), (0, _utils.xy)(1, 1, 1)],
450
- building: true,
451
- closed: false
452
- }),
453
- container = _renderComponent40.container;
454
- expect(container.firstChild).toBeInTheDocument();
455
- });
456
- it('renders disabled polygon with labels', function () {
457
- var _renderComponent41 = renderComponent({
458
- points: points,
459
- labelNode: labelNode,
460
- disabled: true,
461
- closed: true
462
- }),
463
- container = _renderComponent41.container;
464
- expect(container.firstChild).toBeInTheDocument();
465
- });
466
- it('renders polygon with incorrect correctness', function () {
467
- var _renderComponent42 = renderComponent({
468
- points: points,
469
- closed: true,
470
- correctness: 'incorrect'
471
- }),
472
- container = _renderComponent42.container;
473
- expect(container.firstChild).toBeInTheDocument();
474
- });
475
- });
476
-
477
- // Note: Instance method tests (dragPoint, dragLine, dragPoly, labelChange, clickPoint)
478
- // have been removed as they test internal implementation details.
479
- // These behaviors should be tested through:
480
- // 1. User interaction tests (drag-and-drop, clicks) - requires complex setup with @dnd-kit
481
- // 2. Integration/E2E tests
482
- // 3. Testing the pure logic functions (buildLines, swap) which are already tested above
483
- // The component's public API (onChange, onChangeProps callbacks) is what matters for RTL testing.
484
- });
485
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdGVzdFV0aWxzIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfdXRpbHMiLCJfY29tcG9uZW50Iiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJ4eUxhYmVsIiwieCIsInkiLCJpbmRleCIsImxhYmVsIiwieHkiLCJkZXNjcmliZSIsImRlZmF1bHRQb2ludHMiLCJhc3NlcnRCdWlsZExpbmVzIiwicG9pbnRzIiwiY2xvc2VkIiwiZXhwZWN0ZWQiLCJpdCIsImNvbmNhdCIsInJlc3VsdCIsImJ1aWxkTGluZXMiLCJleHBlY3QiLCJ0b01hdGNoT2JqZWN0IiwiZnJvbSIsInRvIiwic3dhcCIsInRvRXF1YWwiLCJvbkNoYW5nZSIsImplc3QiLCJmbiIsIm9uQ2hhbmdlUHJvcHMiLCJyZW5kZXJDb21wb25lbnQiLCJleHRyYXMiLCJkZWZhdWx0cyIsImNsYXNzZXMiLCJjbGFzc05hbWUiLCJvbkNsb3NlUG9seWdvbiIsImdyYXBoUHJvcHMiLCJwcm9wcyIsInJlbmRlciIsImNyZWF0ZUVsZW1lbnQiLCJSYXdCYXNlQ29tcG9uZW50IiwibGFiZWxOb2RlIiwiZG9jdW1lbnQiLCJyZW5kZXJXaXRoTGFiZWxzIiwiX3JlbmRlckNvbXBvbmVudCIsImNvbnRhaW5lciIsImZpcnN0Q2hpbGQiLCJ0b0JlSW5UaGVEb2N1bWVudCIsIl9yZW5kZXJXaXRoTGFiZWxzIiwiX3JlbmRlckNvbXBvbmVudDIiLCJfcmVuZGVyQ29tcG9uZW50MyIsIl9yZW5kZXJDb21wb25lbnQ0IiwiX3JlbmRlckNvbXBvbmVudDUiLCJtYW55UG9pbnRzIiwiQXJyYXkiLCJfIiwiaSIsIl9yZW5kZXJDb21wb25lbnQ2IiwiX3JlbmRlckNvbXBvbmVudDciLCJfcmVuZGVyQ29tcG9uZW50OCIsIl9yZW5kZXJDb21wb25lbnQ5IiwiX3JlbmRlckNvbXBvbmVudDAiLCJkaXNhYmxlZCIsIl9yZW5kZXJDb21wb25lbnQxIiwiX3JlbmRlckNvbXBvbmVudDEwIiwiY29ycmVjdG5lc3MiLCJfcmVuZGVyQ29tcG9uZW50MTEiLCJfcmVuZGVyQ29tcG9uZW50MTIiLCJfcmVuZGVyQ29tcG9uZW50MTMiLCJidWlsZGluZyIsIl9yZW5kZXJXaXRoTGFiZWxzMiIsInBhcnRpYWxMYWJlbHMiLCJfcmVuZGVyQ29tcG9uZW50MTQiLCJlbXB0eUxhYmVscyIsIl9yZW5kZXJDb21wb25lbnQxNSIsImxvbmdMYWJlbHMiLCJfcmVuZGVyQ29tcG9uZW50MTYiLCJfcmVuZGVyQ29tcG9uZW50MTciLCJfcmVuZGVyV2l0aExhYmVsczMiLCJsYWJlbE1vZGVFbmFibGVkIiwiX3JlbmRlcldpdGhMYWJlbHM0IiwiY3VzdG9tT25DaGFuZ2UiLCJfcmVuZGVyQ29tcG9uZW50MTgiLCJjdXN0b21PbkNoYW5nZVByb3BzIiwiX3JlbmRlckNvbXBvbmVudDE5Iiwib25DbGljayIsIl9yZW5kZXJDb21wb25lbnQyMCIsIl9yZW5kZXJDb21wb25lbnQyMSIsIm9uRHJhZ1N0YXJ0IiwiX3JlbmRlckNvbXBvbmVudDIyIiwib25EcmFnU3RvcCIsIl9yZW5kZXJDb21wb25lbnQyMyIsIl9yZW5kZXJDb21wb25lbnQyNCIsImNvb3JkaW5hdGVzT25Ib3ZlciIsImN1c3RvbUdyYXBoUHJvcHMiLCJfcmVuZGVyQ29tcG9uZW50MjUiLCJfcmVuZGVyQ29tcG9uZW50MjYiLCJfcmVuZGVyQ29tcG9uZW50MjciLCJfcmVuZGVyQ29tcG9uZW50MjgiLCJfcmVuZGVyQ29tcG9uZW50MjkiLCJfcmVuZGVyQ29tcG9uZW50MzAiLCJfcmVuZGVyQ29tcG9uZW50MzEiLCJfcmVuZGVyQ29tcG9uZW50MzIiLCJfcmVuZGVyQ29tcG9uZW50MzMiLCJfcmVuZGVyQ29tcG9uZW50MzQiLCJfcmVuZGVyQ29tcG9uZW50MzUiLCJfcmVuZGVyQ29tcG9uZW50MzYiLCJfcmVuZGVyQ29tcG9uZW50MzciLCJfcmVuZGVyQ29tcG9uZW50MzgiLCJfcmVuZGVyQ29tcG9uZW50MzkiLCJfcmVuZGVyQ29tcG9uZW50NDAiLCJfcmVuZGVyQ29tcG9uZW50NDEiLCJfcmVuZGVyQ29tcG9uZW50NDIiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdG9vbHMvcG9seWdvbi9fX3Rlc3RzX18vY29tcG9uZW50LnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlbmRlciB9IGZyb20gJ0BwaWUtbGliL3Rlc3QtdXRpbHMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdyYXBoUHJvcHMsIHh5IH0gZnJvbSAnLi4vLi4vLi4vX190ZXN0c19fL3V0aWxzJztcblxuaW1wb3J0IHsgYnVpbGRMaW5lcywgUmF3QmFzZUNvbXBvbmVudCwgc3dhcCB9IGZyb20gJy4uL2NvbXBvbmVudCc7XG5cbmNvbnN0IHh5TGFiZWwgPSAoeCwgeSwgaW5kZXgsIGxhYmVsKSA9PiAoe1xuICAuLi54eSh4LCB5LCBpbmRleCksXG4gIGxhYmVsLFxufSk7XG5cbmRlc2NyaWJlKCdidWlsZExpbmVzJywgKCkgPT4ge1xuICBjb25zdCBkZWZhdWx0UG9pbnRzID0gW3h5KDAsIDApLCB4eSgxLCAxKSwgeHkoMSwgMCldO1xuXG4gIGNvbnN0IGFzc2VydEJ1aWxkTGluZXMgPSAocG9pbnRzLCBjbG9zZWQsIGV4cGVjdGVkKSA9PiB7XG4gICAgaXQoYGJ1aWxkcyBwb2ludHMgYW5kIGxpbmVzIGZvciAke3BvaW50c30gPSAke2V4cGVjdGVkfWAsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkTGluZXMocG9pbnRzKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvTWF0Y2hPYmplY3QoW1xuICAgICAgICB7IGZyb206IHh5KDAsIDAsIDApLCB0bzogeHkoMSwgMSwgMSkgfSxcbiAgICAgICAgeyBmcm9tOiB4eSgxLCAxLCAxKSwgdG86IHh5KDEsIDAsIDIpIH0sXG4gICAgICBdKTtcbiAgICB9KTtcbiAgfTtcblxuICBhc3NlcnRCdWlsZExpbmVzKGRlZmF1bHRQb2ludHMsIHRydWUsIFtdKTtcbn0pO1xuXG5kZXNjcmliZSgnc3dhcCcsICgpID0+IHtcbiAgaXQoJ3N3YXBzIHBhaXJzJywgKCkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHN3YXAoW3h5KDAsIDAsIDApLCB4eSgxLCAxLCAxKSwgeHkoMiwgMiwgMildLCB4eSgwLCAwLCAwKSwgeHkoMywgMywgMCkpO1xuICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoW3h5KDMsIDMsIDApLCB4eSgxLCAxLCAxKSwgeHkoMiwgMiwgMildKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ1Jhd0Jhc2VDb21wb25lbnQnLCAoKSA9PiB7XG4gIGxldCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgbGV0IG9uQ2hhbmdlUHJvcHMgPSBqZXN0LmZuKCk7XG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChleHRyYXMpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgY2xhc3NOYW1lOiAnY2xhc3NOYW1lJyxcbiAgICAgIG9uQ2hhbmdlLFxuICAgICAgb25DaGFuZ2VQcm9wcyxcbiAgICAgIG9uQ2xvc2VQb2x5Z29uOiBqZXN0LmZuKCksXG4gICAgICBncmFwaFByb3BzOiBncmFwaFByb3BzKCksXG4gICAgICBwb2ludHM6IFtdLFxuICAgIH07XG4gICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRzLCAuLi5leHRyYXMgfTtcblxuICAgIHJldHVybiByZW5kZXIoPFJhd0Jhc2VDb21wb25lbnQgey4uLnByb3BzfSAvPik7XG4gIH07XG5cbiAgLy8gdXNlZCB0byB0ZXN0IGl0ZW1zIHRoYXQgaGF2ZSBsYWJlbHMgYXR0YWNoZWQgdG8gcG9pbnRzXG4gIGNvbnN0IGxhYmVsTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ZvcmVpZ25PYmplY3QnKTtcbiAgY29uc3QgcG9pbnRzID0gW3h5TGFiZWwoMCwgMCwgMCwgJ0EnKSwgeHlMYWJlbCgyLCAyLCAxLCAnQicpLCB4eUxhYmVsKDAsIDIsIDIsICdDJyldO1xuICBjb25zdCByZW5kZXJXaXRoTGFiZWxzID0gKGV4dHJhcykgPT5cbiAgICByZW5kZXJDb21wb25lbnQoe1xuICAgICAgbGFiZWxOb2RlOiBsYWJlbE5vZGUsXG4gICAgICBwb2ludHM6IHBvaW50cyxcbiAgICAgIC4uLmV4dHJhcyxcbiAgICB9KTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGxhYmVscycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoTGFiZWxzKCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG11bHRpcGxlIHBvaW50cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBwb2ludHM6IFt4eSgwLCAwLCAwKSwgeHkoMSwgMSwgMSksIHh5KDIsIDAsIDIpXSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBjbG9zZWQgcG9seWdvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBwb2ludHM6IFt4eSgwLCAwLCAwKSwgeHkoMSwgMSwgMSksIHh5KDIsIDAsIDIpXSxcbiAgICAgICAgY2xvc2VkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIHNpbmdsZSBwb2ludCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBwb2ludHM6IFt4eSgwLCAwLCAwKV0sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggdHdvIHBvaW50cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBwb2ludHM6IFt4eSgwLCAwLCAwKSwgeHkoMSwgMSwgMSldLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG1hbnkgcG9pbnRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWFueVBvaW50cyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDEwIH0sIChfLCBpKSA9PiB4eShpLCBpLCBpKSk7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgcG9pbnRzOiBtYW55UG9pbnRzLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG5lZ2F0aXZlIGNvb3JkaW5hdGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIHBvaW50czogW3h5KC01LCAtNSwgMCksIHh5KC0xLCAtMSwgMSksIHh5KC0zLCAtMiwgMildLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGRlY2ltYWwgY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgcG9pbnRzOiBbeHkoMC41LCAwLjUsIDApLCB4eSgxLjUsIDEuNSwgMSksIHh5KDIuNSwgMC41LCAyKV0sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggemVybyBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBwb2ludHM6IFt4eSgwLCAwLCAwKSwgeHkoMCwgMCwgMSksIHh5KDAsIDAsIDIpXSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc3RhdGVzJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIGluIGRpc2FibGVkIHN0YXRlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIHBvaW50czogW3h5KDAsIDAsIDApLCB4eSgxLCAxLCAxKSwgeHkoMiwgMCwgMildLFxuICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgaW4gZW5hYmxlZCBzdGF0ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBwb2ludHM6IFt4eSgwLCAwLCAwKSwgeHkoMSwgMSwgMSksIHh5KDIsIDAsIDIpXSxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGNvcnJlY3RuZXNzIGNvcnJlY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgcG9pbnRzOiBbeHkoMCwgMCwgMCksIHh5KDEsIDEsIDEpLCB4eSgyLCAwLCAyKV0sXG4gICAgICAgIGNvcnJlY3RuZXNzOiAnY29ycmVjdCcsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggY29ycmVjdG5lc3MgaW5jb3JyZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIHBvaW50czogW3h5KDAsIDAsIDApLCB4eSgxLCAxLCAxKSwgeHkoMiwgMCwgMildLFxuICAgICAgICBjb3JyZWN0bmVzczogJ2luY29ycmVjdCcsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggY29ycmVjdG5lc3MgcGFydGlhbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBwb2ludHM6IFt4eSgwLCAwLCAwKSwgeHkoMSwgMSwgMSksIHh5KDIsIDAsIDIpXSxcbiAgICAgICAgY29ycmVjdG5lc3M6ICdwYXJ0aWFsJyxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBidWlsZGluZyBzdGF0ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBwb2ludHM6IFt4eSgwLCAwLCAwKSwgeHkoMSwgMSwgMSldLFxuICAgICAgICBidWlsZGluZzogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbGFiZWxzJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGggYWxsIHBvaW50cyBsYWJlbGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhMYWJlbHMoKTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggc29tZSBwb2ludHMgbGFiZWxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHBhcnRpYWxMYWJlbHMgPSBbeHlMYWJlbCgwLCAwLCAwLCAnQScpLCB4eSgyLCAyLCAxKSwgeHlMYWJlbCgwLCAyLCAyLCAnQycpXTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgIHBvaW50czogcGFydGlhbExhYmVscyxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBlbXB0eSBsYWJlbHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbXB0eUxhYmVscyA9IFt4eUxhYmVsKDAsIDAsIDAsICcnKSwgeHlMYWJlbCgyLCAyLCAxLCAnJyksIHh5TGFiZWwoMCwgMiwgMiwgJycpXTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgIHBvaW50czogZW1wdHlMYWJlbHMsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggbG9uZyBsYWJlbHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBsb25nTGFiZWxzID0gW1xuICAgICAgICB4eUxhYmVsKDAsIDAsIDAsICdWZXJ5IExvbmcgTGFiZWwgQScpLFxuICAgICAgICB4eUxhYmVsKDIsIDIsIDEsICdWZXJ5IExvbmcgTGFiZWwgQicpLFxuICAgICAgICB4eUxhYmVsKDAsIDIsIDIsICdWZXJ5IExvbmcgTGFiZWwgQycpLFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgIHBvaW50czogbG9uZ0xhYmVscyxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aG91dCBsYWJlbE5vZGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgcG9pbnRzOiBbeHlMYWJlbCgwLCAwLCAwLCAnQScpLCB4eUxhYmVsKDIsIDIsIDEsICdCJyldLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGxhYmVsTW9kZUVuYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyV2l0aExhYmVscyh7IGxhYmVsTW9kZUVuYWJsZWQ6IHRydWUgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGxhYmVsTW9kZUVuYWJsZWQgZGlzYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyV2l0aExhYmVscyh7IGxhYmVsTW9kZUVuYWJsZWQ6IGZhbHNlIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncHJvcHMnLCAoKSA9PiB7XG4gICAgaXQoJ3Bhc3NlcyBvbkNoYW5nZSBjYWxsYmFjaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbU9uQ2hhbmdlID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIG9uQ2hhbmdlOiBjdXN0b21PbkNoYW5nZSxcbiAgICAgICAgcG9pbnRzOiBbeHkoMCwgMCwgMCksIHh5KDEsIDEsIDEpXSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Bhc3NlcyBvbkNoYW5nZVByb3BzIGNhbGxiYWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tT25DaGFuZ2VQcm9wcyA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBvbkNoYW5nZVByb3BzOiBjdXN0b21PbkNoYW5nZVByb3BzLFxuICAgICAgICBwb2ludHM6IFt4eSgwLCAwLCAwKSwgeHkoMSwgMSwgMSldLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncGFzc2VzIG9uQ2xpY2sgY2FsbGJhY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNsaWNrID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIG9uQ2xpY2ssXG4gICAgICAgIHBvaW50czogW3h5KDAsIDAsIDApLCB4eSgxLCAxLCAxKV0sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdwYXNzZXMgb25DbG9zZVBvbHlnb24gY2FsbGJhY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkNsb3NlUG9seWdvbiA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBvbkNsb3NlUG9seWdvbixcbiAgICAgICAgcG9pbnRzOiBbeHkoMCwgMCwgMCksIHh5KDEsIDEsIDEpLCB4eSgyLCAwLCAyKV0sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdwYXNzZXMgb25EcmFnU3RhcnQgY2FsbGJhY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkRyYWdTdGFydCA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBvbkRyYWdTdGFydCxcbiAgICAgICAgcG9pbnRzOiBbeHkoMCwgMCwgMCksIHh5KDEsIDEsIDEpXSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Bhc3NlcyBvbkRyYWdTdG9wIGNhbGxiYWNrJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb25EcmFnU3RvcCA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBvbkRyYWdTdG9wLFxuICAgICAgICBwb2ludHM6IFt4eSgwLCAwLCAwKSwgeHkoMSwgMSwgMSldLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncGFzc2VzIGNvb3JkaW5hdGVzT25Ib3ZlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjb29yZGluYXRlc09uSG92ZXI6IHRydWUsXG4gICAgICAgIHBvaW50czogW3h5KDAsIDAsIDApLCB4eSgxLCAxLCAxKV0sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdwYXNzZXMgZ3JhcGhQcm9wcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbUdyYXBoUHJvcHMgPSBncmFwaFByb3BzKDAsIDEwLCAwLCAxMCk7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZ3JhcGhQcm9wczogY3VzdG9tR3JhcGhQcm9wcyxcbiAgICAgICAgcG9pbnRzOiBbeHkoNSwgNSwgMCksIHh5KDcsIDcsIDEpXSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncG9seWdvbiBzaGFwZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgdHJpYW5nbGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgcG9pbnRzOiBbeHkoMCwgMCwgMCksIHh5KDIsIDAsIDEpLCB4eSgxLCAyLCAyKV0sXG4gICAgICAgIGNsb3NlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgc3F1YXJlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIHBvaW50czogW3h5KDAsIDAsIDApLCB4eSgyLCAwLCAxKSwgeHkoMiwgMiwgMiksIHh5KDAsIDIsIDMpXSxcbiAgICAgICAgY2xvc2VkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBwZW50YWdvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBwb2ludHM6IFt4eSgxLCAwLCAwKSwgeHkoMiwgMSwgMSksIHh5KDEuNSwgMi41LCAyKSwgeHkoMC41LCAyLjUsIDMpLCB4eSgwLCAxLCA0KV0sXG4gICAgICAgIGNsb3NlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgaGV4YWdvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBwb2ludHM6IFt4eSgxLCAwLCAwKSwgeHkoMiwgMC41LCAxKSwgeHkoMiwgMS41LCAyKSwgeHkoMSwgMiwgMyksIHh5KDAsIDEuNSwgNCksIHh5KDAsIDAuNSwgNSldLFxuICAgICAgICBjbG9zZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGlycmVndWxhciBwb2x5Z29uJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIHBvaW50czogW3h5KDAsIDAsIDApLCB4eSgzLCAxLCAxKSwgeHkoMiwgNCwgMiksIHh5KC0xLCAzLCAzKV0sXG4gICAgICAgIGNsb3NlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgY29uY2F2ZSBwb2x5Z29uJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIHBvaW50czogW3h5KDAsIDAsIDApLCB4eSgyLCAwLCAxKSwgeHkoMiwgMiwgMiksIHh5KDEsIDEsIDMpLCB4eSgwLCAyLCA0KV0sXG4gICAgICAgIGNsb3NlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZWRnZSBjYXNlcycsICgpID0+IHtcbiAgICBpdCgnaGFuZGxlcyBlbXB0eSBwb2ludHMgYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgcG9pbnRzOiBbXSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIHBvaW50cyB3aXRoIHNhbWUgY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgcG9pbnRzOiBbeHkoMSwgMSwgMCksIHh5KDEsIDEsIDEpLCB4eSgxLCAxLCAyKV0sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGNvbGxpbmVhciBwb2ludHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgcG9pbnRzOiBbeHkoMCwgMCwgMCksIHh5KDEsIDEsIDEpLCB4eSgyLCAyLCAyKV0sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIHZlcnkgY2xvc2UgcG9pbnRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIHBvaW50czogW3h5KDEsIDEsIDApLCB4eSgxLjAwMSwgMS4wMDEsIDEpLCB4eSgxLjAwMiwgMS4wMDIsIDIpXSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgbGFyZ2UgY29vcmRpbmF0ZSB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgcG9pbnRzOiBbeHkoMTAwMCwgMTAwMCwgMCksIHh5KDIwMDAsIDEwMDAsIDEpLCB4eSgxNTAwLCAyMDAwLCAyKV0sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIG1peGVkIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBwb2ludHM6IFt4eSgtNSwgNSwgMCksIHh5KDUsIDUsIDEpLCB4eSg1LCAtNSwgMiksIHh5KC01LCAtNSwgMyldLFxuICAgICAgICBjbG9zZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIHBvaW50cyB3aXRob3V0IGluZGV4JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIHBvaW50czogW1xuICAgICAgICAgIHsgeDogMCwgeTogMCB9LFxuICAgICAgICAgIHsgeDogMSwgeTogMSB9LFxuICAgICAgICAgIHsgeDogMiwgeTogMCB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbnRlZ3JhdGlvbicsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyBjb21wbGV0ZSBjbG9zZWQgcG9seWdvbiB3aXRoIGFsbCBmZWF0dXJlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBwb2ludHM6IHBvaW50cyxcbiAgICAgICAgY2xvc2VkOiB0cnVlLFxuICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgIGxhYmVsTW9kZUVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGNvb3JkaW5hdGVzT25Ib3ZlcjogdHJ1ZSxcbiAgICAgICAgY29ycmVjdG5lc3M6ICdjb3JyZWN0JyxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICBvbkNoYW5nZTogamVzdC5mbigpLFxuICAgICAgICBvbkNoYW5nZVByb3BzOiBqZXN0LmZuKCksXG4gICAgICAgIG9uQ2xvc2VQb2x5Z29uOiBqZXN0LmZuKCksXG4gICAgICAgIG9uQ2xpY2s6IGplc3QuZm4oKSxcbiAgICAgICAgb25EcmFnU3RhcnQ6IGplc3QuZm4oKSxcbiAgICAgICAgb25EcmFnU3RvcDogamVzdC5mbigpLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBidWlsZGluZyBwb2x5Z29uJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIHBvaW50czogW3h5KDAsIDAsIDApLCB4eSgxLCAxLCAxKV0sXG4gICAgICAgIGJ1aWxkaW5nOiB0cnVlLFxuICAgICAgICBjbG9zZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBkaXNhYmxlZCBwb2x5Z29uIHdpdGggbGFiZWxzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIHBvaW50czogcG9pbnRzLFxuICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgICBjbG9zZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHBvbHlnb24gd2l0aCBpbmNvcnJlY3QgY29ycmVjdG5lc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgcG9pbnRzOiBwb2ludHMsXG4gICAgICAgIGNsb3NlZDogdHJ1ZSxcbiAgICAgICAgY29ycmVjdG5lc3M6ICdpbmNvcnJlY3QnLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIE5vdGU6IEluc3RhbmNlIG1ldGhvZCB0ZXN0cyAoZHJhZ1BvaW50LCBkcmFnTGluZSwgZHJhZ1BvbHksIGxhYmVsQ2hhbmdlLCBjbGlja1BvaW50KVxuICAvLyBoYXZlIGJlZW4gcmVtb3ZlZCBhcyB0aGV5IHRlc3QgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlscy5cbiAgLy8gVGhlc2UgYmVoYXZpb3JzIHNob3VsZCBiZSB0ZXN0ZWQgdGhyb3VnaDpcbiAgLy8gMS4gVXNlciBpbnRlcmFjdGlvbiB0ZXN0cyAoZHJhZy1hbmQtZHJvcCwgY2xpY2tzKSAtIHJlcXVpcmVzIGNvbXBsZXggc2V0dXAgd2l0aCBAZG5kLWtpdFxuICAvLyAyLiBJbnRlZ3JhdGlvbi9FMkUgdGVzdHNcbiAgLy8gMy4gVGVzdGluZyB0aGUgcHVyZSBsb2dpYyBmdW5jdGlvbnMgKGJ1aWxkTGluZXMsIHN3YXApIHdoaWNoIGFyZSBhbHJlYWR5IHRlc3RlZCBhYm92ZVxuICAvLyBUaGUgY29tcG9uZW50J3MgcHVibGljIEFQSSAob25DaGFuZ2UsIG9uQ2hhbmdlUHJvcHMgY2FsbGJhY2tzKSBpcyB3aGF0IG1hdHRlcnMgZm9yIFJUTCB0ZXN0aW5nLlxufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxJQUFBQSxVQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxNQUFBLEdBQUFILE9BQUE7QUFFQSxJQUFBSSxVQUFBLEdBQUFKLE9BQUE7QUFBa0UsU0FBQUssUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFBLElBQUFZLFNBQUEsQ0FBQVosQ0FB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