@pie-lib/graphing 3.2.0-next.0 → 3.2.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.
- package/lib/__tests__/bg.test.js +282 -0
- package/lib/__tests__/coordinates-label.test.js +276 -0
- package/lib/__tests__/graph-with-controls.test.js +275 -0
- package/lib/__tests__/graph.test.js +927 -0
- package/lib/__tests__/grid-setup.test.js +729 -0
- package/lib/__tests__/grid.test.js +29 -0
- package/lib/__tests__/key-legend.test.js +321 -0
- package/lib/__tests__/label-svg-icon.test.js +373 -0
- package/lib/__tests__/labels.test.js +61 -0
- package/lib/__tests__/mark-label.test.js +133 -0
- package/lib/__tests__/toggle-bar.test.js +197 -0
- package/lib/__tests__/tool-menu.test.js +151 -0
- package/lib/__tests__/undo-redo.test.js +31 -0
- package/lib/__tests__/use-debounce.test.js +24 -0
- package/lib/__tests__/utils.js +70 -0
- package/lib/__tests__/utils.test.js +123 -0
- package/lib/axis/__tests__/arrow.test.js +60 -0
- package/lib/axis/__tests__/axes.test.js +195 -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/__tests__/actions.test.js +108 -0
- package/lib/container/__tests__/index.test.js +503 -0
- package/lib/container/__tests__/marks.test.js +259 -0
- package/lib/container/__tests__/middleware.test.js +244 -0
- package/lib/container/__tests__/reducer.test.js +450 -0
- 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/__tests__/component.test.js +65 -0
- package/lib/tools/absolute/component.js +1 -1
- package/lib/tools/absolute/index.js +1 -1
- package/lib/tools/circle/__tests__/bg-circle.test.js +33 -0
- package/lib/tools/circle/__tests__/component.test.js +615 -0
- package/lib/tools/circle/__tests__/index.test.js +576 -0
- 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/__tests__/component.test.js +64 -0
- package/lib/tools/exponential/__tests__/index.test.js +828 -0
- 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/__tests__/component.test.js +45 -0
- package/lib/tools/line/component.js +1 -1
- package/lib/tools/line/index.js +1 -1
- package/lib/tools/parabola/__tests__/component.test.js +64 -0
- package/lib/tools/parabola/__tests__/index.test.js +564 -0
- package/lib/tools/parabola/component.js +1 -1
- package/lib/tools/parabola/index.js +1 -1
- package/lib/tools/point/__tests__/component.test.js +434 -0
- package/lib/tools/point/__tests__/index.test.js +262 -0
- package/lib/tools/point/component.js +1 -1
- package/lib/tools/point/index.js +1 -1
- package/lib/tools/polygon/__tests__/component.test.js +485 -0
- package/lib/tools/polygon/__tests__/index.test.js +303 -0
- package/lib/tools/polygon/__tests__/line.test.js +50 -0
- package/lib/tools/polygon/__tests__/polygon.test.js +85 -0
- 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/__tests__/component.test.js +35 -0
- package/lib/tools/ray/component.js +1 -1
- package/lib/tools/ray/index.js +1 -1
- package/lib/tools/segment/__tests__/component.test.js +35 -0
- package/lib/tools/segment/component.js +1 -1
- package/lib/tools/segment/index.js +1 -1
- package/lib/tools/shared/__tests__/arrow-head.test.js +45 -0
- 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/__tests__/index.test.js +124 -0
- package/lib/tools/shared/line/__tests__/line-path.test.js +62 -0
- package/lib/tools/shared/line/__tests__/with-root-edge.test.js +90 -0
- 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/__tests__/arrow-point.test.js +127 -0
- package/lib/tools/shared/point/__tests__/base-point.test.js +122 -0
- 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/__tests__/component.test.js +72 -0
- package/lib/tools/sine/component.js +1 -1
- package/lib/tools/sine/index.js +1 -1
- package/lib/tools/vector/__tests__/component.test.js +32 -0
- 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 +9 -12
- package/LICENSE.md +0 -5
|
@@ -0,0 +1,729 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
5
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
6
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
7
|
+
var _react = _interopRequireDefault(require("react"));
|
|
8
|
+
var _testUtils = require("@pie-lib/test-utils");
|
|
9
|
+
var _gridSetup = _interopRequireDefault(require("../grid-setup"));
|
|
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
|
+
var mockOnChange = jest.fn();
|
|
13
|
+
var mockOnChangeView = jest.fn();
|
|
14
|
+
var defaultProps = {
|
|
15
|
+
domain: {
|
|
16
|
+
min: -5,
|
|
17
|
+
max: 5,
|
|
18
|
+
step: 1,
|
|
19
|
+
labelStep: 1,
|
|
20
|
+
axisLabel: 'x'
|
|
21
|
+
},
|
|
22
|
+
range: {
|
|
23
|
+
min: -5,
|
|
24
|
+
max: 5,
|
|
25
|
+
step: 1,
|
|
26
|
+
labelStep: 1,
|
|
27
|
+
axisLabel: 'y'
|
|
28
|
+
},
|
|
29
|
+
size: {
|
|
30
|
+
width: 480,
|
|
31
|
+
height: 480
|
|
32
|
+
},
|
|
33
|
+
sizeConstraints: {
|
|
34
|
+
min: 300,
|
|
35
|
+
max: 900,
|
|
36
|
+
step: 10
|
|
37
|
+
},
|
|
38
|
+
includeAxes: true,
|
|
39
|
+
standardGrid: false,
|
|
40
|
+
displayedFields: {
|
|
41
|
+
axisLabel: {
|
|
42
|
+
enabled: true,
|
|
43
|
+
label: 'Axis Label'
|
|
44
|
+
},
|
|
45
|
+
min: {
|
|
46
|
+
enabled: true,
|
|
47
|
+
label: 'Min'
|
|
48
|
+
},
|
|
49
|
+
max: {
|
|
50
|
+
enabled: true,
|
|
51
|
+
label: 'Max'
|
|
52
|
+
},
|
|
53
|
+
step: {
|
|
54
|
+
enabled: true,
|
|
55
|
+
label: 'Interval'
|
|
56
|
+
},
|
|
57
|
+
labelStep: {
|
|
58
|
+
enabled: true,
|
|
59
|
+
label: 'Label Interval'
|
|
60
|
+
},
|
|
61
|
+
dimensionsEnabled: true,
|
|
62
|
+
includeAxesEnabled: true,
|
|
63
|
+
standardGridEnabled: true
|
|
64
|
+
},
|
|
65
|
+
gridValues: {
|
|
66
|
+
domain: [1, 2, 5, 10],
|
|
67
|
+
range: [1, 2, 5, 10]
|
|
68
|
+
},
|
|
69
|
+
labelValues: {
|
|
70
|
+
domain: [0, 1, 2],
|
|
71
|
+
range: [0, 1, 2]
|
|
72
|
+
},
|
|
73
|
+
onChange: mockOnChange,
|
|
74
|
+
onChangeView: mockOnChangeView
|
|
75
|
+
};
|
|
76
|
+
describe('GridSetup', function () {
|
|
77
|
+
beforeEach(function () {
|
|
78
|
+
jest.clearAllMocks();
|
|
79
|
+
});
|
|
80
|
+
describe('rendering', function () {
|
|
81
|
+
it('renders without crashing', function () {
|
|
82
|
+
var _render = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
|
|
83
|
+
container = _render.container;
|
|
84
|
+
expect(container).toBeTruthy();
|
|
85
|
+
});
|
|
86
|
+
it('renders accordion with title', function () {
|
|
87
|
+
var _render2 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
|
|
88
|
+
getByText = _render2.getByText;
|
|
89
|
+
expect(getByText('Customize Grid Setup')).toBeTruthy();
|
|
90
|
+
});
|
|
91
|
+
it('renders Include axes toggle when enabled', function () {
|
|
92
|
+
var _render3 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
|
|
93
|
+
getByText = _render3.getByText;
|
|
94
|
+
expect(getByText('Include axes and labels?')).toBeTruthy();
|
|
95
|
+
});
|
|
96
|
+
it('does not render Include axes toggle when disabled', function () {
|
|
97
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
98
|
+
displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
|
|
99
|
+
includeAxesEnabled: false
|
|
100
|
+
})
|
|
101
|
+
});
|
|
102
|
+
var _render4 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
|
|
103
|
+
queryByText = _render4.queryByText;
|
|
104
|
+
expect(queryByText('Include axes and labels?')).toBeFalsy();
|
|
105
|
+
});
|
|
106
|
+
it('renders standard grid toggle when enabled', function () {
|
|
107
|
+
var _render5 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
|
|
108
|
+
getByText = _render5.getByText;
|
|
109
|
+
expect(getByText('Constrain to standard coordinate grid?')).toBeTruthy();
|
|
110
|
+
});
|
|
111
|
+
it('does not render standard grid toggle when disabled', function () {
|
|
112
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
113
|
+
displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
|
|
114
|
+
standardGridEnabled: false
|
|
115
|
+
})
|
|
116
|
+
});
|
|
117
|
+
var _render6 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
|
|
118
|
+
queryByText = _render6.queryByText;
|
|
119
|
+
expect(queryByText('Constrain to standard coordinate grid?')).toBeFalsy();
|
|
120
|
+
});
|
|
121
|
+
it('renders dimensions section when enabled', function () {
|
|
122
|
+
var _render7 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
|
|
123
|
+
getByText = _render7.getByText;
|
|
124
|
+
expect(getByText('Dimensions(px)')).toBeTruthy();
|
|
125
|
+
expect(getByText(/Min 300, Max 900/)).toBeTruthy();
|
|
126
|
+
});
|
|
127
|
+
it('does not render dimensions section when disabled', function () {
|
|
128
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
129
|
+
displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
|
|
130
|
+
dimensionsEnabled: false
|
|
131
|
+
})
|
|
132
|
+
});
|
|
133
|
+
var _render8 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
|
|
134
|
+
queryByText = _render8.queryByText;
|
|
135
|
+
expect(queryByText('Dimensions(px)')).toBeFalsy();
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
describe('axes configuration', function () {
|
|
139
|
+
it('renders axis headers when includeAxes is true', function () {
|
|
140
|
+
var _render9 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
|
|
141
|
+
container = _render9.container;
|
|
142
|
+
var xAxisHeader = container.querySelector('i');
|
|
143
|
+
expect(xAxisHeader === null || xAxisHeader === void 0 ? void 0 : xAxisHeader.textContent).toBe('x');
|
|
144
|
+
});
|
|
145
|
+
it('renders min/max fields when enabled', function () {
|
|
146
|
+
var _render0 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
|
|
147
|
+
getAllByLabelText = _render0.getAllByLabelText;
|
|
148
|
+
var minFields = getAllByLabelText('Min');
|
|
149
|
+
var maxFields = getAllByLabelText('Max');
|
|
150
|
+
expect(minFields.length).toBe(2); // domain and range
|
|
151
|
+
expect(maxFields.length).toBe(2); // domain and range
|
|
152
|
+
});
|
|
153
|
+
it('does not render min/max fields when disabled', function () {
|
|
154
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
155
|
+
displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
|
|
156
|
+
min: {
|
|
157
|
+
enabled: false
|
|
158
|
+
},
|
|
159
|
+
max: {
|
|
160
|
+
enabled: false
|
|
161
|
+
}
|
|
162
|
+
})
|
|
163
|
+
});
|
|
164
|
+
var _render1 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
|
|
165
|
+
queryByLabelText = _render1.queryByLabelText;
|
|
166
|
+
expect(queryByLabelText('Min')).toBeFalsy();
|
|
167
|
+
expect(queryByLabelText('Max')).toBeFalsy();
|
|
168
|
+
});
|
|
169
|
+
it('renders axis label fields when enabled', function () {
|
|
170
|
+
var _render10 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
|
|
171
|
+
getAllByText = _render10.getAllByText;
|
|
172
|
+
var axisLabelFields = getAllByText('Axis Label');
|
|
173
|
+
expect(axisLabelFields.length).toBe(2); // domain and range
|
|
174
|
+
});
|
|
175
|
+
it('does not render axis label fields when disabled', function () {
|
|
176
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
177
|
+
displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
|
|
178
|
+
axisLabel: {
|
|
179
|
+
enabled: false
|
|
180
|
+
}
|
|
181
|
+
})
|
|
182
|
+
});
|
|
183
|
+
var _render11 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
|
|
184
|
+
queryByText = _render11.queryByText;
|
|
185
|
+
expect(queryByText('Axis Label')).toBeFalsy();
|
|
186
|
+
});
|
|
187
|
+
it('renders step and labelStep fields when enabled', function () {
|
|
188
|
+
var _render12 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
|
|
189
|
+
getAllByLabelText = _render12.getAllByLabelText;
|
|
190
|
+
var intervalFields = getAllByLabelText('Interval');
|
|
191
|
+
var labelIntervalFields = getAllByLabelText('Label Interval');
|
|
192
|
+
expect(intervalFields.length).toBe(2); // domain and range
|
|
193
|
+
expect(labelIntervalFields.length).toBe(2); // domain and range
|
|
194
|
+
});
|
|
195
|
+
it('does not render step fields when disabled', function () {
|
|
196
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
197
|
+
displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
|
|
198
|
+
step: {
|
|
199
|
+
enabled: false
|
|
200
|
+
}
|
|
201
|
+
})
|
|
202
|
+
});
|
|
203
|
+
var _render13 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
|
|
204
|
+
queryByLabelText = _render13.queryByLabelText;
|
|
205
|
+
expect(queryByLabelText('Interval')).toBeFalsy();
|
|
206
|
+
});
|
|
207
|
+
it('does not render labelStep fields when disabled', function () {
|
|
208
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
209
|
+
displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
|
|
210
|
+
labelStep: {
|
|
211
|
+
enabled: false
|
|
212
|
+
}
|
|
213
|
+
})
|
|
214
|
+
});
|
|
215
|
+
var _render14 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
|
|
216
|
+
queryByLabelText = _render14.queryByLabelText;
|
|
217
|
+
expect(queryByLabelText('Label Interval')).toBeFalsy();
|
|
218
|
+
});
|
|
219
|
+
it('displays axis visibility hint when min/max enabled', function () {
|
|
220
|
+
var _render15 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
|
|
221
|
+
getByText = _render15.getByText;
|
|
222
|
+
expect(getByText('If you want the axis to be visible, use a zero or negative Min Value, and a positive Max Value')).toBeTruthy();
|
|
223
|
+
});
|
|
224
|
+
it('displays unnumbered gridlines hint when labelStep enabled', function () {
|
|
225
|
+
var _render16 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
|
|
226
|
+
getByText = _render16.getByText;
|
|
227
|
+
expect(getByText('For unnumbered gridlines, enter a label interval of 0')).toBeTruthy();
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
describe('gridlines configuration', function () {
|
|
231
|
+
it('renders gridlines config when includeAxes is false', function () {
|
|
232
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
233
|
+
includeAxes: false
|
|
234
|
+
});
|
|
235
|
+
var _render17 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
|
|
236
|
+
getByLabelText = _render17.getByLabelText;
|
|
237
|
+
expect(getByLabelText('Number of Vertical Gridlines')).toBeTruthy();
|
|
238
|
+
expect(getByLabelText('Number of Horizontal Gridlines')).toBeTruthy();
|
|
239
|
+
});
|
|
240
|
+
it('does not render axes config when includeAxes is false', function () {
|
|
241
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
242
|
+
includeAxes: false
|
|
243
|
+
});
|
|
244
|
+
var _render18 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
|
|
245
|
+
queryByText = _render18.queryByText;
|
|
246
|
+
expect(queryByText('Axis Label')).toBeFalsy();
|
|
247
|
+
});
|
|
248
|
+
it('does not render gridlines config when max is disabled', function () {
|
|
249
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
250
|
+
includeAxes: false,
|
|
251
|
+
displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
|
|
252
|
+
max: {
|
|
253
|
+
enabled: false
|
|
254
|
+
}
|
|
255
|
+
})
|
|
256
|
+
});
|
|
257
|
+
var _render19 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
|
|
258
|
+
queryByLabelText = _render19.queryByLabelText;
|
|
259
|
+
expect(queryByLabelText('Number of Vertical Gridlines')).toBeFalsy();
|
|
260
|
+
expect(queryByLabelText('Number of Horizontal Gridlines')).toBeFalsy();
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
describe('user interactions', function () {
|
|
264
|
+
it('calls onChange when includeAxes toggle is clicked', function () {
|
|
265
|
+
var _render20 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
|
|
266
|
+
container = _render20.container;
|
|
267
|
+
var toggleInput = container.querySelector('input[type="checkbox"]');
|
|
268
|
+
_testUtils.fireEvent.click(toggleInput);
|
|
269
|
+
expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
|
|
270
|
+
includeAxes: false
|
|
271
|
+
}));
|
|
272
|
+
});
|
|
273
|
+
it('calls onChange with proper config when includeAxes is disabled', function () {
|
|
274
|
+
var _render21 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
|
|
275
|
+
container = _render21.container;
|
|
276
|
+
var toggleInput = container.querySelector('input[type="checkbox"]');
|
|
277
|
+
_testUtils.fireEvent.click(toggleInput);
|
|
278
|
+
expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
|
|
279
|
+
includeAxes: false,
|
|
280
|
+
domain: expect.objectContaining({
|
|
281
|
+
min: 1,
|
|
282
|
+
max: 5,
|
|
283
|
+
step: 1,
|
|
284
|
+
labelStep: 0
|
|
285
|
+
}),
|
|
286
|
+
range: expect.objectContaining({
|
|
287
|
+
min: 1,
|
|
288
|
+
max: 5,
|
|
289
|
+
step: 1,
|
|
290
|
+
labelStep: 0
|
|
291
|
+
})
|
|
292
|
+
}));
|
|
293
|
+
});
|
|
294
|
+
it('calls onChange with proper config when includeAxes is enabled', function () {
|
|
295
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
296
|
+
includeAxes: false
|
|
297
|
+
});
|
|
298
|
+
var _render22 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
|
|
299
|
+
container = _render22.container;
|
|
300
|
+
var toggleInputs = container.querySelectorAll('input[type="checkbox"]');
|
|
301
|
+
var includeAxesToggle = toggleInputs[0]; // First toggle is includeAxes
|
|
302
|
+
|
|
303
|
+
_testUtils.fireEvent.click(includeAxesToggle);
|
|
304
|
+
expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
|
|
305
|
+
includeAxes: true,
|
|
306
|
+
domain: expect.objectContaining({
|
|
307
|
+
labelStep: 1
|
|
308
|
+
}),
|
|
309
|
+
range: expect.objectContaining({
|
|
310
|
+
labelStep: 1
|
|
311
|
+
})
|
|
312
|
+
}));
|
|
313
|
+
});
|
|
314
|
+
it('calls onChange when standardGrid toggle is clicked', function () {
|
|
315
|
+
var _render23 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
|
|
316
|
+
container = _render23.container;
|
|
317
|
+
var toggleInputs = container.querySelectorAll('input[type="checkbox"]');
|
|
318
|
+
var standardGridToggle = toggleInputs[1]; // Second toggle is standardGrid
|
|
319
|
+
|
|
320
|
+
_testUtils.fireEvent.click(standardGridToggle);
|
|
321
|
+
expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
|
|
322
|
+
standardGrid: true,
|
|
323
|
+
graph: expect.objectContaining({
|
|
324
|
+
width: 480,
|
|
325
|
+
height: 480
|
|
326
|
+
})
|
|
327
|
+
}));
|
|
328
|
+
});
|
|
329
|
+
it('calls onChange when width is changed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
330
|
+
var _render24, getAllByLabelText, widthInput;
|
|
331
|
+
return _regenerator["default"].wrap(function (_context) {
|
|
332
|
+
while (1) switch (_context.prev = _context.next) {
|
|
333
|
+
case 0:
|
|
334
|
+
_render24 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)), getAllByLabelText = _render24.getAllByLabelText;
|
|
335
|
+
widthInput = getAllByLabelText('Width')[0];
|
|
336
|
+
_testUtils.fireEvent.change(widthInput, {
|
|
337
|
+
target: {
|
|
338
|
+
value: '500'
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
_testUtils.fireEvent.blur(widthInput);
|
|
342
|
+
_context.next = 1;
|
|
343
|
+
return (0, _testUtils.waitFor)(function () {
|
|
344
|
+
expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
|
|
345
|
+
graph: expect.objectContaining({
|
|
346
|
+
width: 500
|
|
347
|
+
})
|
|
348
|
+
}));
|
|
349
|
+
});
|
|
350
|
+
case 1:
|
|
351
|
+
case "end":
|
|
352
|
+
return _context.stop();
|
|
353
|
+
}
|
|
354
|
+
}, _callee);
|
|
355
|
+
})));
|
|
356
|
+
it('calls onChange when height is changed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
|
357
|
+
var _render25, getAllByLabelText, heightInput;
|
|
358
|
+
return _regenerator["default"].wrap(function (_context2) {
|
|
359
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
360
|
+
case 0:
|
|
361
|
+
_render25 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)), getAllByLabelText = _render25.getAllByLabelText;
|
|
362
|
+
heightInput = getAllByLabelText('Height')[0];
|
|
363
|
+
_testUtils.fireEvent.change(heightInput, {
|
|
364
|
+
target: {
|
|
365
|
+
value: '520'
|
|
366
|
+
}
|
|
367
|
+
});
|
|
368
|
+
_testUtils.fireEvent.blur(heightInput);
|
|
369
|
+
_context2.next = 1;
|
|
370
|
+
return (0, _testUtils.waitFor)(function () {
|
|
371
|
+
expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
|
|
372
|
+
graph: expect.objectContaining({
|
|
373
|
+
height: 520
|
|
374
|
+
})
|
|
375
|
+
}));
|
|
376
|
+
});
|
|
377
|
+
case 1:
|
|
378
|
+
case "end":
|
|
379
|
+
return _context2.stop();
|
|
380
|
+
}
|
|
381
|
+
}, _callee2);
|
|
382
|
+
})));
|
|
383
|
+
it('updates both width and height when standardGrid is true', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
|
|
384
|
+
var props, _render26, getAllByLabelText, widthInput;
|
|
385
|
+
return _regenerator["default"].wrap(function (_context3) {
|
|
386
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
387
|
+
case 0:
|
|
388
|
+
props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
389
|
+
standardGrid: true
|
|
390
|
+
});
|
|
391
|
+
_render26 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)), getAllByLabelText = _render26.getAllByLabelText;
|
|
392
|
+
widthInput = getAllByLabelText('Width')[0];
|
|
393
|
+
_testUtils.fireEvent.change(widthInput, {
|
|
394
|
+
target: {
|
|
395
|
+
value: '600'
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
_testUtils.fireEvent.blur(widthInput);
|
|
399
|
+
_context3.next = 1;
|
|
400
|
+
return (0, _testUtils.waitFor)(function () {
|
|
401
|
+
expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
|
|
402
|
+
graph: expect.objectContaining({
|
|
403
|
+
width: 600,
|
|
404
|
+
height: 600
|
|
405
|
+
})
|
|
406
|
+
}));
|
|
407
|
+
});
|
|
408
|
+
case 1:
|
|
409
|
+
case "end":
|
|
410
|
+
return _context3.stop();
|
|
411
|
+
}
|
|
412
|
+
}, _callee3);
|
|
413
|
+
})));
|
|
414
|
+
it('calls onChange when domain min is changed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4() {
|
|
415
|
+
var _render27, getAllByLabelText, minInputs, domainMinInput;
|
|
416
|
+
return _regenerator["default"].wrap(function (_context4) {
|
|
417
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
418
|
+
case 0:
|
|
419
|
+
_render27 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)), getAllByLabelText = _render27.getAllByLabelText;
|
|
420
|
+
minInputs = getAllByLabelText('Min');
|
|
421
|
+
domainMinInput = minInputs[0];
|
|
422
|
+
_testUtils.fireEvent.change(domainMinInput, {
|
|
423
|
+
target: {
|
|
424
|
+
value: '-10'
|
|
425
|
+
}
|
|
426
|
+
});
|
|
427
|
+
_testUtils.fireEvent.blur(domainMinInput);
|
|
428
|
+
_context4.next = 1;
|
|
429
|
+
return (0, _testUtils.waitFor)(function () {
|
|
430
|
+
expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
|
|
431
|
+
domain: expect.objectContaining({
|
|
432
|
+
min: -10
|
|
433
|
+
})
|
|
434
|
+
}));
|
|
435
|
+
});
|
|
436
|
+
case 1:
|
|
437
|
+
case "end":
|
|
438
|
+
return _context4.stop();
|
|
439
|
+
}
|
|
440
|
+
}, _callee4);
|
|
441
|
+
})));
|
|
442
|
+
it('calls onChange when domain max is changed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5() {
|
|
443
|
+
var _render28, getAllByLabelText, maxInputs, domainMaxInput;
|
|
444
|
+
return _regenerator["default"].wrap(function (_context5) {
|
|
445
|
+
while (1) switch (_context5.prev = _context5.next) {
|
|
446
|
+
case 0:
|
|
447
|
+
_render28 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)), getAllByLabelText = _render28.getAllByLabelText;
|
|
448
|
+
maxInputs = getAllByLabelText('Max');
|
|
449
|
+
domainMaxInput = maxInputs[0];
|
|
450
|
+
_testUtils.fireEvent.change(domainMaxInput, {
|
|
451
|
+
target: {
|
|
452
|
+
value: '10'
|
|
453
|
+
}
|
|
454
|
+
});
|
|
455
|
+
_testUtils.fireEvent.blur(domainMaxInput);
|
|
456
|
+
_context5.next = 1;
|
|
457
|
+
return (0, _testUtils.waitFor)(function () {
|
|
458
|
+
expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
|
|
459
|
+
domain: expect.objectContaining({
|
|
460
|
+
max: 10
|
|
461
|
+
})
|
|
462
|
+
}));
|
|
463
|
+
});
|
|
464
|
+
case 1:
|
|
465
|
+
case "end":
|
|
466
|
+
return _context5.stop();
|
|
467
|
+
}
|
|
468
|
+
}, _callee5);
|
|
469
|
+
})));
|
|
470
|
+
it('calls onChange when range min is changed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6() {
|
|
471
|
+
var _render29, getAllByLabelText, minInputs, rangeMinInput;
|
|
472
|
+
return _regenerator["default"].wrap(function (_context6) {
|
|
473
|
+
while (1) switch (_context6.prev = _context6.next) {
|
|
474
|
+
case 0:
|
|
475
|
+
_render29 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)), getAllByLabelText = _render29.getAllByLabelText;
|
|
476
|
+
minInputs = getAllByLabelText('Min');
|
|
477
|
+
rangeMinInput = minInputs[1];
|
|
478
|
+
_testUtils.fireEvent.change(rangeMinInput, {
|
|
479
|
+
target: {
|
|
480
|
+
value: '-8'
|
|
481
|
+
}
|
|
482
|
+
});
|
|
483
|
+
_testUtils.fireEvent.blur(rangeMinInput);
|
|
484
|
+
_context6.next = 1;
|
|
485
|
+
return (0, _testUtils.waitFor)(function () {
|
|
486
|
+
expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
|
|
487
|
+
range: expect.objectContaining({
|
|
488
|
+
min: -8
|
|
489
|
+
})
|
|
490
|
+
}));
|
|
491
|
+
});
|
|
492
|
+
case 1:
|
|
493
|
+
case "end":
|
|
494
|
+
return _context6.stop();
|
|
495
|
+
}
|
|
496
|
+
}, _callee6);
|
|
497
|
+
})));
|
|
498
|
+
it('calls onChange when range max is changed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7() {
|
|
499
|
+
var _render30, getAllByLabelText, maxInputs, rangeMaxInput;
|
|
500
|
+
return _regenerator["default"].wrap(function (_context7) {
|
|
501
|
+
while (1) switch (_context7.prev = _context7.next) {
|
|
502
|
+
case 0:
|
|
503
|
+
_render30 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)), getAllByLabelText = _render30.getAllByLabelText;
|
|
504
|
+
maxInputs = getAllByLabelText('Max');
|
|
505
|
+
rangeMaxInput = maxInputs[1];
|
|
506
|
+
_testUtils.fireEvent.change(rangeMaxInput, {
|
|
507
|
+
target: {
|
|
508
|
+
value: '12'
|
|
509
|
+
}
|
|
510
|
+
});
|
|
511
|
+
_testUtils.fireEvent.blur(rangeMaxInput);
|
|
512
|
+
_context7.next = 1;
|
|
513
|
+
return (0, _testUtils.waitFor)(function () {
|
|
514
|
+
expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
|
|
515
|
+
range: expect.objectContaining({
|
|
516
|
+
max: 12
|
|
517
|
+
})
|
|
518
|
+
}));
|
|
519
|
+
});
|
|
520
|
+
case 1:
|
|
521
|
+
case "end":
|
|
522
|
+
return _context7.stop();
|
|
523
|
+
}
|
|
524
|
+
}, _callee7);
|
|
525
|
+
})));
|
|
526
|
+
it('updates both domain and range when standardGrid is true and domain changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee8() {
|
|
527
|
+
var props, _render31, getAllByLabelText, minInputs, domainMinInput;
|
|
528
|
+
return _regenerator["default"].wrap(function (_context8) {
|
|
529
|
+
while (1) switch (_context8.prev = _context8.next) {
|
|
530
|
+
case 0:
|
|
531
|
+
props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
532
|
+
standardGrid: true
|
|
533
|
+
});
|
|
534
|
+
_render31 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)), getAllByLabelText = _render31.getAllByLabelText;
|
|
535
|
+
minInputs = getAllByLabelText('Min');
|
|
536
|
+
domainMinInput = minInputs[0];
|
|
537
|
+
_testUtils.fireEvent.change(domainMinInput, {
|
|
538
|
+
target: {
|
|
539
|
+
value: '-15'
|
|
540
|
+
}
|
|
541
|
+
});
|
|
542
|
+
_testUtils.fireEvent.blur(domainMinInput);
|
|
543
|
+
_context8.next = 1;
|
|
544
|
+
return (0, _testUtils.waitFor)(function () {
|
|
545
|
+
expect(mockOnChange).toHaveBeenCalledWith(expect.objectContaining({
|
|
546
|
+
domain: expect.objectContaining({
|
|
547
|
+
min: -15
|
|
548
|
+
}),
|
|
549
|
+
range: expect.objectContaining({
|
|
550
|
+
min: -15
|
|
551
|
+
})
|
|
552
|
+
}));
|
|
553
|
+
});
|
|
554
|
+
case 1:
|
|
555
|
+
case "end":
|
|
556
|
+
return _context8.stop();
|
|
557
|
+
}
|
|
558
|
+
}, _callee8);
|
|
559
|
+
})));
|
|
560
|
+
it('does not update range when domain axisLabel changes with standardGrid', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee9() {
|
|
561
|
+
var props, _render32, container, axisLabelInputs;
|
|
562
|
+
return _regenerator["default"].wrap(function (_context9) {
|
|
563
|
+
while (1) switch (_context9.prev = _context9.next) {
|
|
564
|
+
case 0:
|
|
565
|
+
props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
566
|
+
standardGrid: true
|
|
567
|
+
});
|
|
568
|
+
_render32 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)), container = _render32.container; // EditableHTML change is harder to trigger, but we can test the handler directly
|
|
569
|
+
// by verifying the range doesn't get the axisLabel value from domain
|
|
570
|
+
axisLabelInputs = container.querySelectorAll('[contenteditable="true"]');
|
|
571
|
+
if (!(axisLabelInputs.length > 0)) {
|
|
572
|
+
_context9.next = 1;
|
|
573
|
+
break;
|
|
574
|
+
}
|
|
575
|
+
_testUtils.fireEvent.input(axisLabelInputs[0], {
|
|
576
|
+
target: {
|
|
577
|
+
innerHTML: 'X-Axis'
|
|
578
|
+
}
|
|
579
|
+
});
|
|
580
|
+
_context9.next = 1;
|
|
581
|
+
return (0, _testUtils.waitFor)(function () {
|
|
582
|
+
if (mockOnChange.mock.calls.length > 0) {
|
|
583
|
+
var _lastCall$range;
|
|
584
|
+
var lastCall = mockOnChange.mock.calls[mockOnChange.mock.calls.length - 1][0];
|
|
585
|
+
// range.axisLabel should not be 'X-Axis', it should keep its original value
|
|
586
|
+
expect((_lastCall$range = lastCall.range) === null || _lastCall$range === void 0 ? void 0 : _lastCall$range.axisLabel).not.toBe('X-Axis');
|
|
587
|
+
}
|
|
588
|
+
});
|
|
589
|
+
case 1:
|
|
590
|
+
case "end":
|
|
591
|
+
return _context9.stop();
|
|
592
|
+
}
|
|
593
|
+
}, _callee9);
|
|
594
|
+
})));
|
|
595
|
+
it('calls onChangeView when accordion is toggled', function () {
|
|
596
|
+
var _render33 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
|
|
597
|
+
container = _render33.container;
|
|
598
|
+
var accordionSummary = container.querySelector('[aria-expanded]');
|
|
599
|
+
_testUtils.fireEvent.click(accordionSummary);
|
|
600
|
+
expect(mockOnChangeView).toHaveBeenCalled();
|
|
601
|
+
});
|
|
602
|
+
});
|
|
603
|
+
describe('disabled states', function () {
|
|
604
|
+
it('disables range fields when standardGrid is true', function () {
|
|
605
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
606
|
+
standardGrid: true
|
|
607
|
+
});
|
|
608
|
+
var _render34 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
|
|
609
|
+
getAllByLabelText = _render34.getAllByLabelText;
|
|
610
|
+
var minInputs = getAllByLabelText('Min');
|
|
611
|
+
var rangeMinInput = minInputs[1];
|
|
612
|
+
expect(rangeMinInput).toBeDisabled();
|
|
613
|
+
});
|
|
614
|
+
it('disables height field when standardGrid is true', function () {
|
|
615
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
616
|
+
standardGrid: true
|
|
617
|
+
});
|
|
618
|
+
var _render35 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
|
|
619
|
+
getAllByLabelText = _render35.getAllByLabelText;
|
|
620
|
+
var heightInput = getAllByLabelText('Height')[0];
|
|
621
|
+
expect(heightInput).toBeDisabled();
|
|
622
|
+
});
|
|
623
|
+
it('disables horizontal gridlines field when standardGrid is true and includeAxes is false', function () {
|
|
624
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
625
|
+
includeAxes: false,
|
|
626
|
+
standardGrid: true
|
|
627
|
+
});
|
|
628
|
+
var _render36 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
|
|
629
|
+
getByLabelText = _render36.getByLabelText;
|
|
630
|
+
var horizontalGridlinesInput = getByLabelText('Number of Horizontal Gridlines');
|
|
631
|
+
expect(horizontalGridlinesInput).toBeDisabled();
|
|
632
|
+
});
|
|
633
|
+
});
|
|
634
|
+
describe('GridConfig component', function () {
|
|
635
|
+
it('renders step field when enabled', function () {
|
|
636
|
+
var _render37 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
|
|
637
|
+
getAllByLabelText = _render37.getAllByLabelText;
|
|
638
|
+
var intervalFields = getAllByLabelText('Interval');
|
|
639
|
+
expect(intervalFields.length).toBeGreaterThan(0);
|
|
640
|
+
});
|
|
641
|
+
it('renders labelStep field when enabled', function () {
|
|
642
|
+
var _render38 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
|
|
643
|
+
getAllByLabelText = _render38.getAllByLabelText;
|
|
644
|
+
var labelIntervalFields = getAllByLabelText('Label Interval');
|
|
645
|
+
expect(labelIntervalFields.length).toBeGreaterThan(0);
|
|
646
|
+
});
|
|
647
|
+
it('does not render when both step and labelStep are disabled', function () {
|
|
648
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
649
|
+
displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
|
|
650
|
+
step: {
|
|
651
|
+
enabled: false
|
|
652
|
+
},
|
|
653
|
+
labelStep: {
|
|
654
|
+
enabled: false
|
|
655
|
+
}
|
|
656
|
+
})
|
|
657
|
+
});
|
|
658
|
+
var _render39 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
|
|
659
|
+
queryByLabelText = _render39.queryByLabelText;
|
|
660
|
+
expect(queryByLabelText('Interval')).toBeFalsy();
|
|
661
|
+
expect(queryByLabelText('Label Interval')).toBeFalsy();
|
|
662
|
+
});
|
|
663
|
+
});
|
|
664
|
+
describe('AxisConfig component', function () {
|
|
665
|
+
it('renders x-axis header', function () {
|
|
666
|
+
var _render40 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
|
|
667
|
+
container = _render40.container;
|
|
668
|
+
var headers = container.querySelectorAll('i');
|
|
669
|
+
var xAxisHeader = Array.from(headers).find(function (h) {
|
|
670
|
+
return h.textContent === 'x';
|
|
671
|
+
});
|
|
672
|
+
expect(xAxisHeader).toBeTruthy();
|
|
673
|
+
});
|
|
674
|
+
it('renders y-axis header', function () {
|
|
675
|
+
var _render41 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
|
|
676
|
+
container = _render41.container;
|
|
677
|
+
var headers = container.querySelectorAll('i');
|
|
678
|
+
var yAxisHeader = Array.from(headers).find(function (h) {
|
|
679
|
+
return h.textContent === 'y';
|
|
680
|
+
});
|
|
681
|
+
expect(yAxisHeader).toBeTruthy();
|
|
682
|
+
});
|
|
683
|
+
it('does not render headers when all fields are disabled', function () {
|
|
684
|
+
var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
|
|
685
|
+
displayedFields: _objectSpread(_objectSpread({}, defaultProps.displayedFields), {}, {
|
|
686
|
+
min: {
|
|
687
|
+
enabled: false
|
|
688
|
+
},
|
|
689
|
+
max: {
|
|
690
|
+
enabled: false
|
|
691
|
+
},
|
|
692
|
+
axisLabel: {
|
|
693
|
+
enabled: false
|
|
694
|
+
},
|
|
695
|
+
step: {
|
|
696
|
+
enabled: false
|
|
697
|
+
},
|
|
698
|
+
labelStep: {
|
|
699
|
+
enabled: false
|
|
700
|
+
}
|
|
701
|
+
})
|
|
702
|
+
});
|
|
703
|
+
var _render42 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], props)),
|
|
704
|
+
container = _render42.container;
|
|
705
|
+
var headers = container.querySelectorAll('i');
|
|
706
|
+
var axisHeaders = Array.from(headers).filter(function (h) {
|
|
707
|
+
return h.textContent === 'x' || h.textContent === 'y';
|
|
708
|
+
});
|
|
709
|
+
expect(axisHeaders.length).toBe(0);
|
|
710
|
+
});
|
|
711
|
+
});
|
|
712
|
+
describe('Accordion behavior', function () {
|
|
713
|
+
it('renders with correct transition props', function () {
|
|
714
|
+
var _render43 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
|
|
715
|
+
container = _render43.container;
|
|
716
|
+
var accordion = container.querySelector('.MuiAccordion-root');
|
|
717
|
+
expect(accordion).toBeTruthy();
|
|
718
|
+
});
|
|
719
|
+
it('expands and collapses accordion', function () {
|
|
720
|
+
var _render44 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_gridSetup["default"], defaultProps)),
|
|
721
|
+
container = _render44.container;
|
|
722
|
+
var accordionSummary = container.querySelector('[aria-expanded]');
|
|
723
|
+
expect(accordionSummary.getAttribute('aria-expanded')).toBe('false');
|
|
724
|
+
_testUtils.fireEvent.click(accordionSummary);
|
|
725
|
+
expect(mockOnChangeView).toHaveBeenCalled();
|
|
726
|
+
});
|
|
727
|
+
});
|
|
728
|
+
});
|
|
729
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl90ZXN0VXRpbHMiLCJfZ3JpZFNldHVwIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJtb2NrT25DaGFuZ2UiLCJqZXN0IiwiZm4iLCJtb2NrT25DaGFuZ2VWaWV3IiwiZGVmYXVsdFByb3BzIiwiZG9tYWluIiwibWluIiwibWF4Iiwic3RlcCIsImxhYmVsU3RlcCIsImF4aXNMYWJlbCIsInJhbmdlIiwic2l6ZSIsIndpZHRoIiwiaGVpZ2h0Iiwic2l6ZUNvbnN0cmFpbnRzIiwiaW5jbHVkZUF4ZXMiLCJzdGFuZGFyZEdyaWQiLCJkaXNwbGF5ZWRGaWVsZHMiLCJlbmFibGVkIiwibGFiZWwiLCJkaW1lbnNpb25zRW5hYmxlZCIsImluY2x1ZGVBeGVzRW5hYmxlZCIsInN0YW5kYXJkR3JpZEVuYWJsZWQiLCJncmlkVmFsdWVzIiwibGFiZWxWYWx1ZXMiLCJvbkNoYW5nZSIsIm9uQ2hhbmdlVmlldyIsImRlc2NyaWJlIiwiYmVmb3JlRWFjaCIsImNsZWFyQWxsTW9ja3MiLCJpdCIsIl9yZW5kZXIiLCJyZW5kZXIiLCJjcmVhdGVFbGVtZW50IiwiY29udGFpbmVyIiwiZXhwZWN0IiwidG9CZVRydXRoeSIsIl9yZW5kZXIyIiwiZ2V0QnlUZXh0IiwiX3JlbmRlcjMiLCJwcm9wcyIsIl9yZW5kZXI0IiwicXVlcnlCeVRleHQiLCJ0b0JlRmFsc3kiLCJfcmVuZGVyNSIsIl9yZW5kZXI2IiwiX3JlbmRlcjciLCJfcmVuZGVyOCIsIl9yZW5kZXI5IiwieEF4aXNIZWFkZXIiLCJxdWVyeVNlbGVjdG9yIiwidGV4dENvbnRlbnQiLCJ0b0JlIiwiX3JlbmRlcjAiLCJnZXRBbGxCeUxhYmVsVGV4dCIsIm1pbkZpZWxkcyIsIm1heEZpZWxkcyIsIl9yZW5kZXIxIiwicXVlcnlCeUxhYmVsVGV4dCIsIl9yZW5kZXIxMCIsImdldEFsbEJ5VGV4dCIsImF4aXNMYWJlbEZpZWxkcyIsIl9yZW5kZXIxMSIsIl9yZW5kZXIxMiIsImludGVydmFsRmllbGRzIiwibGFiZWxJbnRlcnZhbEZpZWxkcyIsIl9yZW5kZXIxMyIsIl9yZW5kZXIxNCIsIl9yZW5kZXIxNSIsIl9yZW5kZXIxNiIsIl9yZW5kZXIxNyIsImdldEJ5TGFiZWxUZXh0IiwiX3JlbmRlcjE4IiwiX3JlbmRlcjE5IiwiX3JlbmRlcjIwIiwidG9nZ2xlSW5wdXQiLCJmaXJlRXZlbnQiLCJjbGljayIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwib2JqZWN0Q29udGFpbmluZyIsIl9yZW5kZXIyMSIsIl9yZW5kZXIyMiIsInRvZ2dsZUlucHV0cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJpbmNsdWRlQXhlc1RvZ2dsZSIsIl9yZW5kZXIyMyIsInN0YW5kYXJkR3JpZFRvZ2dsZSIsImdyYXBoIiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJfcmVuZGVyMjQiLCJ3aWR0aElucHV0Iiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJjaGFuZ2UiLCJ0YXJnZXQiLCJ2YWx1ZSIsImJsdXIiLCJ3YWl0Rm9yIiwic3RvcCIsIl9jYWxsZWUyIiwiX3JlbmRlcjI1IiwiaGVpZ2h0SW5wdXQiLCJfY29udGV4dDIiLCJfY2FsbGVlMyIsIl9yZW5kZXIyNiIsIl9jb250ZXh0MyIsIl9jYWxsZWU0IiwiX3JlbmRlcjI3IiwibWluSW5wdXRzIiwiZG9tYWluTWluSW5wdXQiLCJfY29udGV4dDQiLCJfY2FsbGVlNSIsIl9yZW5kZXIyOCIsIm1heElucHV0cyIsImRvbWFpbk1heElucHV0IiwiX2NvbnRleHQ1IiwiX2NhbGxlZTYiLCJfcmVuZGVyMjkiLCJyYW5nZU1pbklucHV0IiwiX2NvbnRleHQ2IiwiX2NhbGxlZTciLCJfcmVuZGVyMzAiLCJyYW5nZU1heElucHV0IiwiX2NvbnRleHQ3IiwiX2NhbGxlZTgiLCJfcmVuZGVyMzEiLCJfY29udGV4dDgiLCJfY2FsbGVlOSIsIl9yZW5kZXIzMiIsImF4aXNMYWJlbElucHV0cyIsIl9jb250ZXh0OSIsImlucHV0IiwiaW5uZXJIVE1MIiwibW9jayIsImNhbGxzIiwiX2xhc3RDYWxsJHJhbmdlIiwibGFzdENhbGwiLCJub3QiLCJfcmVuZGVyMzMiLCJhY2NvcmRpb25TdW1tYXJ5IiwidG9IYXZlQmVlbkNhbGxlZCIsIl9yZW5kZXIzNCIsInRvQmVEaXNhYmxlZCIsIl9yZW5kZXIzNSIsIl9yZW5kZXIzNiIsImhvcml6b250YWxHcmlkbGluZXNJbnB1dCIsIl9yZW5kZXIzNyIsInRvQmVHcmVhdGVyVGhhbiIsIl9yZW5kZXIzOCIsIl9yZW5kZXIzOSIsIl9yZW5kZXI0MCIsImhlYWRlcnMiLCJBcnJheSIsImZyb20iLCJmaW5kIiwiaCIsIl9yZW5kZXI0MSIsInlBeGlzSGVhZGVyIiwiX3JlbmRlcjQyIiwiYXhpc0hlYWRlcnMiLCJfcmVuZGVyNDMiLCJhY2NvcmRpb24iLCJfcmVuZGVyNDQiLCJnZXRBdHRyaWJ1dGUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2dyaWQtc2V0dXAudGVzdC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGZpcmVFdmVudCwgcmVuZGVyLCB3YWl0Rm9yIH0gZnJvbSAnQHBpZS1saWIvdGVzdC11dGlscyc7XG5pbXBvcnQgR3JpZFNldHVwIGZyb20gJy4uL2dyaWQtc2V0dXAnO1xuXG5jb25zdCBtb2NrT25DaGFuZ2UgPSBqZXN0LmZuKCk7XG5jb25zdCBtb2NrT25DaGFuZ2VWaWV3ID0gamVzdC5mbigpO1xuXG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGRvbWFpbjoge1xuICAgIG1pbjogLTUsXG4gICAgbWF4OiA1LFxuICAgIHN0ZXA6IDEsXG4gICAgbGFiZWxTdGVwOiAxLFxuICAgIGF4aXNMYWJlbDogJ3gnLFxuICB9LFxuICByYW5nZToge1xuICAgIG1pbjogLTUsXG4gICAgbWF4OiA1LFxuICAgIHN0ZXA6IDEsXG4gICAgbGFiZWxTdGVwOiAxLFxuICAgIGF4aXNMYWJlbDogJ3knLFxuICB9LFxuICBzaXplOiB7XG4gICAgd2lkdGg6IDQ4MCxcbiAgICBoZWlnaHQ6IDQ4MCxcbiAgfSxcbiAgc2l6ZUNvbnN0cmFpbnRzOiB7XG4gICAgbWluOiAzMDAsXG4gICAgbWF4OiA5MDAsXG4gICAgc3RlcDogMTAsXG4gIH0sXG4gIGluY2x1ZGVBeGVzOiB0cnVlLFxuICBzdGFuZGFyZEdyaWQ6IGZhbHNlLFxuICBkaXNwbGF5ZWRGaWVsZHM6IHtcbiAgICBheGlzTGFiZWw6IHsgZW5hYmxlZDogdHJ1ZSwgbGFiZWw6ICdBeGlzIExhYmVsJyB9LFxuICAgIG1pbjogeyBlbmFibGVkOiB0cnVlLCBsYWJlbDogJ01pbicgfSxcbiAgICBtYXg6IHsgZW5hYmxlZDogdHJ1ZSwgbGFiZWw6ICdNYXgnIH0sXG4gICAgc3RlcDogeyBlbmFibGVkOiB0cnVlLCBsYWJlbDogJ0ludGVydmFsJyB9LFxuICAgIGxhYmVsU3RlcDogeyBlbmFibGVkOiB0cnVlLCBsYWJlbDogJ0xhYmVsIEludGVydmFsJyB9LFxuICAgIGRpbWVuc2lvbnNFbmFibGVkOiB0cnVlLFxuICAgIGluY2x1ZGVBeGVzRW5hYmxlZDogdHJ1ZSxcbiAgICBzdGFuZGFyZEdyaWRFbmFibGVkOiB0cnVlLFxuICB9LFxuICBncmlkVmFsdWVzOiB7XG4gICAgZG9tYWluOiBbMSwgMiwgNSwgMTBdLFxuICAgIHJhbmdlOiBbMSwgMiwgNSwgMTBdLFxuICB9LFxuICBsYWJlbFZhbHVlczoge1xuICAgIGRvbWFpbjogWzAsIDEsIDJdLFxuICAgIHJhbmdlOiBbMCwgMSwgMl0sXG4gIH0sXG4gIG9uQ2hhbmdlOiBtb2NrT25DaGFuZ2UsXG4gIG9uQ2hhbmdlVmlldzogbW9ja09uQ2hhbmdlVmlldyxcbn07XG5cbmRlc2NyaWJlKCdHcmlkU2V0dXAnLCAoKSA9PiB7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGplc3QuY2xlYXJBbGxNb2NrcygpO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgYWNjb3JkaW9uIHdpdGggdGl0bGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGdldEJ5VGV4dCgnQ3VzdG9taXplIEdyaWQgU2V0dXAnKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgSW5jbHVkZSBheGVzIHRvZ2dsZSB3aGVuIGVuYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGdldEJ5VGV4dCgnSW5jbHVkZSBheGVzIGFuZCBsYWJlbHM/JykpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCByZW5kZXIgSW5jbHVkZSBheGVzIHRvZ2dsZSB3aGVuIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBpbmNsdWRlQXhlc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXh0KCdJbmNsdWRlIGF4ZXMgYW5kIGxhYmVscz8nKSkudG9CZUZhbHN5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBzdGFuZGFyZCBncmlkIHRvZ2dsZSB3aGVuIGVuYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGdldEJ5VGV4dCgnQ29uc3RyYWluIHRvIHN0YW5kYXJkIGNvb3JkaW5hdGUgZ3JpZD8nKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciBzdGFuZGFyZCBncmlkIHRvZ2dsZSB3aGVuIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBzdGFuZGFyZEdyaWRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGV4dCgnQ29uc3RyYWluIHRvIHN0YW5kYXJkIGNvb3JkaW5hdGUgZ3JpZD8nKSkudG9CZUZhbHN5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBkaW1lbnNpb25zIHNlY3Rpb24gd2hlbiBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChnZXRCeVRleHQoJ0RpbWVuc2lvbnMocHgpJykpLnRvQmVUcnV0aHkoKTtcbiAgICAgIGV4cGVjdChnZXRCeVRleHQoL01pbiAzMDAsIE1heCA5MDAvKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciBkaW1lbnNpb25zIHNlY3Rpb24gd2hlbiBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGRpc3BsYXllZEZpZWxkczoge1xuICAgICAgICAgIC4uLmRlZmF1bHRQcm9wcy5kaXNwbGF5ZWRGaWVsZHMsXG4gICAgICAgICAgZGltZW5zaW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXh0KCdEaW1lbnNpb25zKHB4KScpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2F4ZXMgY29uZmlndXJhdGlvbicsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyBheGlzIGhlYWRlcnMgd2hlbiBpbmNsdWRlQXhlcyBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IHhBeGlzSGVhZGVyID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2knKTtcbiAgICAgIGV4cGVjdCh4QXhpc0hlYWRlcj8udGV4dENvbnRlbnQpLnRvQmUoJ3gnKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIG1pbi9tYXggZmllbGRzIHdoZW4gZW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IG1pbkZpZWxkcyA9IGdldEFsbEJ5TGFiZWxUZXh0KCdNaW4nKTtcbiAgICAgIGNvbnN0IG1heEZpZWxkcyA9IGdldEFsbEJ5TGFiZWxUZXh0KCdNYXgnKTtcbiAgICAgIGV4cGVjdChtaW5GaWVsZHMubGVuZ3RoKS50b0JlKDIpOyAvLyBkb21haW4gYW5kIHJhbmdlXG4gICAgICBleHBlY3QobWF4RmllbGRzLmxlbmd0aCkudG9CZSgyKTsgLy8gZG9tYWluIGFuZCByYW5nZVxuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciBtaW4vbWF4IGZpZWxkcyB3aGVuIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBtaW46IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgICBtYXg6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlMYWJlbFRleHQoJ01pbicpKS50b0JlRmFsc3koKTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5TGFiZWxUZXh0KCdNYXgnKSkudG9CZUZhbHN5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBheGlzIGxhYmVsIGZpZWxkcyB3aGVuIGVuYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgYXhpc0xhYmVsRmllbGRzID0gZ2V0QWxsQnlUZXh0KCdBeGlzIExhYmVsJyk7XG4gICAgICBleHBlY3QoYXhpc0xhYmVsRmllbGRzLmxlbmd0aCkudG9CZSgyKTsgLy8gZG9tYWluIGFuZCByYW5nZVxuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciBheGlzIGxhYmVsIGZpZWxkcyB3aGVuIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBheGlzTGFiZWw6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGV4dCgnQXhpcyBMYWJlbCcpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHN0ZXAgYW5kIGxhYmVsU3RlcCBmaWVsZHMgd2hlbiBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgaW50ZXJ2YWxGaWVsZHMgPSBnZXRBbGxCeUxhYmVsVGV4dCgnSW50ZXJ2YWwnKTtcbiAgICAgIGNvbnN0IGxhYmVsSW50ZXJ2YWxGaWVsZHMgPSBnZXRBbGxCeUxhYmVsVGV4dCgnTGFiZWwgSW50ZXJ2YWwnKTtcbiAgICAgIGV4cGVjdChpbnRlcnZhbEZpZWxkcy5sZW5ndGgpLnRvQmUoMik7IC8vIGRvbWFpbiBhbmQgcmFuZ2VcbiAgICAgIGV4cGVjdChsYWJlbEludGVydmFsRmllbGRzLmxlbmd0aCkudG9CZSgyKTsgLy8gZG9tYWluIGFuZCByYW5nZVxuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHJlbmRlciBzdGVwIGZpZWxkcyB3aGVuIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBzdGVwOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBxdWVyeUJ5TGFiZWxUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5TGFiZWxUZXh0KCdJbnRlcnZhbCcpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCByZW5kZXIgbGFiZWxTdGVwIGZpZWxkcyB3aGVuIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBsYWJlbFN0ZXA6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlMYWJlbFRleHQoJ0xhYmVsIEludGVydmFsJykpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Rpc3BsYXlzIGF4aXMgdmlzaWJpbGl0eSBoaW50IHdoZW4gbWluL21heCBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgZ2V0QnlUZXh0KCdJZiB5b3Ugd2FudCB0aGUgYXhpcyB0byBiZSB2aXNpYmxlLCB1c2UgYSB6ZXJvIG9yIG5lZ2F0aXZlIE1pbiBWYWx1ZSwgYW5kIGEgcG9zaXRpdmUgTWF4IFZhbHVlJyksXG4gICAgICApLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkaXNwbGF5cyB1bm51bWJlcmVkIGdyaWRsaW5lcyBoaW50IHdoZW4gbGFiZWxTdGVwIGVuYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGdldEJ5VGV4dCgnRm9yIHVubnVtYmVyZWQgZ3JpZGxpbmVzLCBlbnRlciBhIGxhYmVsIGludGVydmFsIG9mIDAnKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ3JpZGxpbmVzIGNvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgZ3JpZGxpbmVzIGNvbmZpZyB3aGVuIGluY2x1ZGVBeGVzIGlzIGZhbHNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgaW5jbHVkZUF4ZXM6IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgZ2V0QnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KGdldEJ5TGFiZWxUZXh0KCdOdW1iZXIgb2YgVmVydGljYWwgR3JpZGxpbmVzJykpLnRvQmVUcnV0aHkoKTtcbiAgICAgIGV4cGVjdChnZXRCeUxhYmVsVGV4dCgnTnVtYmVyIG9mIEhvcml6b250YWwgR3JpZGxpbmVzJykpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCByZW5kZXIgYXhlcyBjb25maWcgd2hlbiBpbmNsdWRlQXhlcyBpcyBmYWxzZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGluY2x1ZGVBeGVzOiBmYWxzZSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGV4dCgnQXhpcyBMYWJlbCcpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCByZW5kZXIgZ3JpZGxpbmVzIGNvbmZpZyB3aGVuIG1heCBpcyBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGluY2x1ZGVBeGVzOiBmYWxzZSxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBtYXg6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IHF1ZXJ5QnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlMYWJlbFRleHQoJ051bWJlciBvZiBWZXJ0aWNhbCBHcmlkbGluZXMnKSkudG9CZUZhbHN5KCk7XG4gICAgICBleHBlY3QocXVlcnlCeUxhYmVsVGV4dCgnTnVtYmVyIG9mIEhvcml6b250YWwgR3JpZGxpbmVzJykpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndXNlciBpbnRlcmFjdGlvbnMnLCAoKSA9PiB7XG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlIHdoZW4gaW5jbHVkZUF4ZXMgdG9nZ2xlIGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgdG9nZ2xlSW5wdXQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJyk7XG5cbiAgICAgIGZpcmVFdmVudC5jbGljayh0b2dnbGVJbnB1dCk7XG5cbiAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgaW5jbHVkZUF4ZXM6IGZhbHNlLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2l0aCBwcm9wZXIgY29uZmlnIHdoZW4gaW5jbHVkZUF4ZXMgaXMgZGlzYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgdG9nZ2xlSW5wdXQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJyk7XG5cbiAgICAgIGZpcmVFdmVudC5jbGljayh0b2dnbGVJbnB1dCk7XG5cbiAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgaW5jbHVkZUF4ZXM6IGZhbHNlLFxuICAgICAgICAgIGRvbWFpbjogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgbWF4OiA1LFxuICAgICAgICAgICAgc3RlcDogMSxcbiAgICAgICAgICAgIGxhYmVsU3RlcDogMCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICByYW5nZTogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgbWF4OiA1LFxuICAgICAgICAgICAgc3RlcDogMSxcbiAgICAgICAgICAgIGxhYmVsU3RlcDogMCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbGxzIG9uQ2hhbmdlIHdpdGggcHJvcGVyIGNvbmZpZyB3aGVuIGluY2x1ZGVBeGVzIGlzIGVuYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBpbmNsdWRlQXhlczogZmFsc2UsXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgY29uc3QgdG9nZ2xlSW5wdXRzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXScpO1xuICAgICAgY29uc3QgaW5jbHVkZUF4ZXNUb2dnbGUgPSB0b2dnbGVJbnB1dHNbMF07IC8vIEZpcnN0IHRvZ2dsZSBpcyBpbmNsdWRlQXhlc1xuXG4gICAgICBmaXJlRXZlbnQuY2xpY2soaW5jbHVkZUF4ZXNUb2dnbGUpO1xuXG4gICAgICBleHBlY3QobW9ja09uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIGluY2x1ZGVBeGVzOiB0cnVlLFxuICAgICAgICAgIGRvbWFpbjogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgbGFiZWxTdGVwOiAxLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHJhbmdlOiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBsYWJlbFN0ZXA6IDEsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIHN0YW5kYXJkR3JpZCB0b2dnbGUgaXMgY2xpY2tlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBjb25zdCB0b2dnbGVJbnB1dHMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJyk7XG4gICAgICBjb25zdCBzdGFuZGFyZEdyaWRUb2dnbGUgPSB0b2dnbGVJbnB1dHNbMV07IC8vIFNlY29uZCB0b2dnbGUgaXMgc3RhbmRhcmRHcmlkXG5cbiAgICAgIGZpcmVFdmVudC5jbGljayhzdGFuZGFyZEdyaWRUb2dnbGUpO1xuXG4gICAgICBleHBlY3QobW9ja09uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIHN0YW5kYXJkR3JpZDogdHJ1ZSxcbiAgICAgICAgICBncmFwaDogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgd2lkdGg6IDQ4MCxcbiAgICAgICAgICAgIGhlaWdodDogNDgwLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2hlbiB3aWR0aCBpcyBjaGFuZ2VkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3Qgd2lkdGhJbnB1dCA9IGdldEFsbEJ5TGFiZWxUZXh0KCdXaWR0aCcpWzBdO1xuXG4gICAgICBmaXJlRXZlbnQuY2hhbmdlKHdpZHRoSW5wdXQsIHsgdGFyZ2V0OiB7IHZhbHVlOiAnNTAwJyB9IH0pO1xuICAgICAgZmlyZUV2ZW50LmJsdXIod2lkdGhJbnB1dCk7XG5cbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBleHBlY3QobW9ja09uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBncmFwaDogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICB3aWR0aDogNTAwLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIGhlaWdodCBpcyBjaGFuZ2VkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBnZXRBbGxCeUxhYmVsVGV4dCgnSGVpZ2h0JylbMF07XG5cbiAgICAgIGZpcmVFdmVudC5jaGFuZ2UoaGVpZ2h0SW5wdXQsIHsgdGFyZ2V0OiB7IHZhbHVlOiAnNTIwJyB9IH0pO1xuICAgICAgZmlyZUV2ZW50LmJsdXIoaGVpZ2h0SW5wdXQpO1xuXG4gICAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KG1vY2tPbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgZ3JhcGg6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgICAgaGVpZ2h0OiA1MjAsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3VwZGF0ZXMgYm90aCB3aWR0aCBhbmQgaGVpZ2h0IHdoZW4gc3RhbmRhcmRHcmlkIGlzIHRydWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBzdGFuZGFyZEdyaWQ6IHRydWUsXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBnZXRBbGxCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLnByb3BzfSAvPik7XG4gICAgICBjb25zdCB3aWR0aElucHV0ID0gZ2V0QWxsQnlMYWJlbFRleHQoJ1dpZHRoJylbMF07XG5cbiAgICAgIGZpcmVFdmVudC5jaGFuZ2Uod2lkdGhJbnB1dCwgeyB0YXJnZXQ6IHsgdmFsdWU6ICc2MDAnIH0gfSk7XG4gICAgICBmaXJlRXZlbnQuYmx1cih3aWR0aElucHV0KTtcblxuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGdyYXBoOiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgIHdpZHRoOiA2MDAsXG4gICAgICAgICAgICAgIGhlaWdodDogNjAwLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIGRvbWFpbiBtaW4gaXMgY2hhbmdlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IG1pbklucHV0cyA9IGdldEFsbEJ5TGFiZWxUZXh0KCdNaW4nKTtcbiAgICAgIGNvbnN0IGRvbWFpbk1pbklucHV0ID0gbWluSW5wdXRzWzBdO1xuXG4gICAgICBmaXJlRXZlbnQuY2hhbmdlKGRvbWFpbk1pbklucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJy0xMCcgfSB9KTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKGRvbWFpbk1pbklucHV0KTtcblxuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGRvbWFpbjogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICBtaW46IC0xMCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2hlbiBkb21haW4gbWF4IGlzIGNoYW5nZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5TGFiZWxUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBjb25zdCBtYXhJbnB1dHMgPSBnZXRBbGxCeUxhYmVsVGV4dCgnTWF4Jyk7XG4gICAgICBjb25zdCBkb21haW5NYXhJbnB1dCA9IG1heElucHV0c1swXTtcblxuICAgICAgZmlyZUV2ZW50LmNoYW5nZShkb21haW5NYXhJbnB1dCwgeyB0YXJnZXQ6IHsgdmFsdWU6ICcxMCcgfSB9KTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKGRvbWFpbk1heElucHV0KTtcblxuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGRvbWFpbjogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICBtYXg6IDEwLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIHJhbmdlIG1pbiBpcyBjaGFuZ2VkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgbWluSW5wdXRzID0gZ2V0QWxsQnlMYWJlbFRleHQoJ01pbicpO1xuICAgICAgY29uc3QgcmFuZ2VNaW5JbnB1dCA9IG1pbklucHV0c1sxXTtcblxuICAgICAgZmlyZUV2ZW50LmNoYW5nZShyYW5nZU1pbklucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJy04JyB9IH0pO1xuICAgICAgZmlyZUV2ZW50LmJsdXIocmFuZ2VNaW5JbnB1dCk7XG5cbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBleHBlY3QobW9ja09uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICByYW5nZTogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICBtaW46IC04LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aGVuIHJhbmdlIG1heCBpcyBjaGFuZ2VkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgbWF4SW5wdXRzID0gZ2V0QWxsQnlMYWJlbFRleHQoJ01heCcpO1xuICAgICAgY29uc3QgcmFuZ2VNYXhJbnB1dCA9IG1heElucHV0c1sxXTtcblxuICAgICAgZmlyZUV2ZW50LmNoYW5nZShyYW5nZU1heElucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJzEyJyB9IH0pO1xuICAgICAgZmlyZUV2ZW50LmJsdXIocmFuZ2VNYXhJbnB1dCk7XG5cbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBleHBlY3QobW9ja09uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICByYW5nZTogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICBtYXg6IDEyLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCd1cGRhdGVzIGJvdGggZG9tYWluIGFuZCByYW5nZSB3aGVuIHN0YW5kYXJkR3JpZCBpcyB0cnVlIGFuZCBkb21haW4gY2hhbmdlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIHN0YW5kYXJkR3JpZDogdHJ1ZSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IGdldEFsbEJ5TGFiZWxUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IG1pbklucHV0cyA9IGdldEFsbEJ5TGFiZWxUZXh0KCdNaW4nKTtcbiAgICAgIGNvbnN0IGRvbWFpbk1pbklucHV0ID0gbWluSW5wdXRzWzBdO1xuXG4gICAgICBmaXJlRXZlbnQuY2hhbmdlKGRvbWFpbk1pbklucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJy0xNScgfSB9KTtcbiAgICAgIGZpcmVFdmVudC5ibHVyKGRvbWFpbk1pbklucHV0KTtcblxuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGRvbWFpbjogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICBtaW46IC0xNSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcmFuZ2U6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgICAgbWluOiAtMTUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHVwZGF0ZSByYW5nZSB3aGVuIGRvbWFpbiBheGlzTGFiZWwgY2hhbmdlcyB3aXRoIHN0YW5kYXJkR3JpZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIHN0YW5kYXJkR3JpZDogdHJ1ZSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLnByb3BzfSAvPik7XG5cbiAgICAgIC8vIEVkaXRhYmxlSFRNTCBjaGFuZ2UgaXMgaGFyZGVyIHRvIHRyaWdnZXIsIGJ1dCB3ZSBjYW4gdGVzdCB0aGUgaGFuZGxlciBkaXJlY3RseVxuICAgICAgLy8gYnkgdmVyaWZ5aW5nIHRoZSByYW5nZSBkb2Vzbid0IGdldCB0aGUgYXhpc0xhYmVsIHZhbHVlIGZyb20gZG9tYWluXG4gICAgICBjb25zdCBheGlzTGFiZWxJbnB1dHMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0nKTtcblxuICAgICAgaWYgKGF4aXNMYWJlbElucHV0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZpcmVFdmVudC5pbnB1dChheGlzTGFiZWxJbnB1dHNbMF0sIHsgdGFyZ2V0OiB7IGlubmVySFRNTDogJ1gtQXhpcycgfSB9KTtcblxuICAgICAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgICAgICBpZiAobW9ja09uQ2hhbmdlLm1vY2suY2FsbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbGFzdENhbGwgPSBtb2NrT25DaGFuZ2UubW9jay5jYWxsc1ttb2NrT25DaGFuZ2UubW9jay5jYWxscy5sZW5ndGggLSAxXVswXTtcbiAgICAgICAgICAgIC8vIHJhbmdlLmF4aXNMYWJlbCBzaG91bGQgbm90IGJlICdYLUF4aXMnLCBpdCBzaG91bGQga2VlcCBpdHMgb3JpZ2luYWwgdmFsdWVcbiAgICAgICAgICAgIGV4cGVjdChsYXN0Q2FsbC5yYW5nZT8uYXhpc0xhYmVsKS5ub3QudG9CZSgnWC1BeGlzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZVZpZXcgd2hlbiBhY2NvcmRpb24gaXMgdG9nZ2xlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBjb25zdCBhY2NvcmRpb25TdW1tYXJ5ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1thcmlhLWV4cGFuZGVkXScpO1xuXG4gICAgICBmaXJlRXZlbnQuY2xpY2soYWNjb3JkaW9uU3VtbWFyeSk7XG5cbiAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2VWaWV3KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkaXNhYmxlZCBzdGF0ZXMnLCAoKSA9PiB7XG4gICAgaXQoJ2Rpc2FibGVzIHJhbmdlIGZpZWxkcyB3aGVuIHN0YW5kYXJkR3JpZCBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgc3RhbmRhcmRHcmlkOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgY29uc3QgbWluSW5wdXRzID0gZ2V0QWxsQnlMYWJlbFRleHQoJ01pbicpO1xuICAgICAgY29uc3QgcmFuZ2VNaW5JbnB1dCA9IG1pbklucHV0c1sxXTtcblxuICAgICAgZXhwZWN0KHJhbmdlTWluSW5wdXQpLnRvQmVEaXNhYmxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Rpc2FibGVzIGhlaWdodCBmaWVsZCB3aGVuIHN0YW5kYXJkR3JpZCBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgc3RhbmRhcmRHcmlkOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5wcm9wc30gLz4pO1xuICAgICAgY29uc3QgaGVpZ2h0SW5wdXQgPSBnZXRBbGxCeUxhYmVsVGV4dCgnSGVpZ2h0JylbMF07XG5cbiAgICAgIGV4cGVjdChoZWlnaHRJbnB1dCkudG9CZURpc2FibGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZGlzYWJsZXMgaG9yaXpvbnRhbCBncmlkbGluZXMgZmllbGQgd2hlbiBzdGFuZGFyZEdyaWQgaXMgdHJ1ZSBhbmQgaW5jbHVkZUF4ZXMgaXMgZmFsc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICBpbmNsdWRlQXhlczogZmFsc2UsXG4gICAgICAgIHN0YW5kYXJkR3JpZDogdHJ1ZSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IGdldEJ5TGFiZWxUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGhvcml6b250YWxHcmlkbGluZXNJbnB1dCA9IGdldEJ5TGFiZWxUZXh0KCdOdW1iZXIgb2YgSG9yaXpvbnRhbCBHcmlkbGluZXMnKTtcblxuICAgICAgZXhwZWN0KGhvcml6b250YWxHcmlkbGluZXNJbnB1dCkudG9CZURpc2FibGVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdHcmlkQ29uZmlnIGNvbXBvbmVudCcsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyBzdGVwIGZpZWxkIHdoZW4gZW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZ2V0QWxsQnlMYWJlbFRleHQgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGludGVydmFsRmllbGRzID0gZ2V0QWxsQnlMYWJlbFRleHQoJ0ludGVydmFsJyk7XG4gICAgICBleHBlY3QoaW50ZXJ2YWxGaWVsZHMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBsYWJlbFN0ZXAgZmllbGQgd2hlbiBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRBbGxCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgbGFiZWxJbnRlcnZhbEZpZWxkcyA9IGdldEFsbEJ5TGFiZWxUZXh0KCdMYWJlbCBJbnRlcnZhbCcpO1xuICAgICAgZXhwZWN0KGxhYmVsSW50ZXJ2YWxGaWVsZHMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgcmVuZGVyIHdoZW4gYm90aCBzdGVwIGFuZCBsYWJlbFN0ZXAgYXJlIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgZGlzcGxheWVkRmllbGRzOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmRpc3BsYXllZEZpZWxkcyxcbiAgICAgICAgICBzdGVwOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgbGFiZWxTdGVwOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBxdWVyeUJ5TGFiZWxUZXh0IH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5TGFiZWxUZXh0KCdJbnRlcnZhbCcpKS50b0JlRmFsc3koKTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5TGFiZWxUZXh0KCdMYWJlbCBJbnRlcnZhbCcpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0F4aXNDb25maWcgY29tcG9uZW50JywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHgtYXhpcyBoZWFkZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxHcmlkU2V0dXAgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgaGVhZGVycyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdpJyk7XG4gICAgICBjb25zdCB4QXhpc0hlYWRlciA9IEFycmF5LmZyb20oaGVhZGVycykuZmluZCgoaCkgPT4gaC50ZXh0Q29udGVudCA9PT0gJ3gnKTtcbiAgICAgIGV4cGVjdCh4QXhpc0hlYWRlcikudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgeS1heGlzIGhlYWRlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBjb25zdCBoZWFkZXJzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2knKTtcbiAgICAgIGNvbnN0IHlBeGlzSGVhZGVyID0gQXJyYXkuZnJvbShoZWFkZXJzKS5maW5kKChoKSA9PiBoLnRleHRDb250ZW50ID09PSAneScpO1xuICAgICAgZXhwZWN0KHlBeGlzSGVhZGVyKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgcmVuZGVyIGhlYWRlcnMgd2hlbiBhbGwgZmllbGRzIGFyZSBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGRpc3BsYXllZEZpZWxkczoge1xuICAgICAgICAgIC4uLmRlZmF1bHRQcm9wcy5kaXNwbGF5ZWRGaWVsZHMsXG4gICAgICAgICAgbWluOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgbWF4OiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgYXhpc0xhYmVsOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgc3RlcDogeyBlbmFibGVkOiBmYWxzZSB9LFxuICAgICAgICAgIGxhYmVsU3RlcDogeyBlbmFibGVkOiBmYWxzZSB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEdyaWRTZXR1cCB7Li4ucHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnaScpO1xuICAgICAgY29uc3QgYXhpc0hlYWRlcnMgPSBBcnJheS5mcm9tKGhlYWRlcnMpLmZpbHRlcigoaCkgPT4gaC50ZXh0Q29udGVudCA9PT0gJ3gnIHx8IGgudGV4dENvbnRlbnQgPT09ICd5Jyk7XG4gICAgICBleHBlY3QoYXhpc0hlYWRlcnMubGVuZ3RoKS50b0JlKDApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQWNjb3JkaW9uIGJlaGF2aW9yJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGggY29ycmVjdCB0cmFuc2l0aW9uIHByb3BzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGFjY29yZGlvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuTXVpQWNjb3JkaW9uLXJvb3QnKTtcbiAgICAgIGV4cGVjdChhY2NvcmRpb24pLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdleHBhbmRzIGFuZCBjb2xsYXBzZXMgYWNjb3JkaW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8R3JpZFNldHVwIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICAgIGNvbnN0IGFjY29yZGlvblN1bW1hcnkgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignW2FyaWEtZXhwYW5kZWRdJyk7XG5cbiAgICAgIGV4cGVjdChhY2NvcmRpb25TdW1tYXJ5LmdldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcpKS50b0JlKCdmYWxzZScpO1xuXG4gICAgICBmaXJlRXZlbnQuY2xpY2soYWNjb3JkaW9uU3VtbWFyeSk7XG5cbiAgICAgIGV4cGVjdChtb2NrT25DaGFuZ2VWaWV3KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFVBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUFzQyxTQUFB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
|