@pie-lib/charting 5.17.0-beta.0 → 5.17.0

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 (74) hide show
  1. package/CHANGELOG.json +1 -581
  2. package/CHANGELOG.md +149 -43
  3. package/package.json +5 -5
  4. package/src/__tests__/__snapshots__/axes.test.jsx.snap +1 -0
  5. package/src/__tests__/__snapshots__/chart.test.jsx.snap +0 -18
  6. package/src/__tests__/__snapshots__/grid.test.jsx.snap +61 -17
  7. package/src/__tests__/axes.test.jsx +0 -5
  8. package/src/__tests__/chart.test.jsx +8 -0
  9. package/src/actions-button.jsx +109 -0
  10. package/src/axes.jsx +5 -31
  11. package/src/bars/common/bars.jsx +8 -10
  12. package/src/chart-setup.jsx +1 -1
  13. package/src/chart.jsx +31 -26
  14. package/src/common/drag-handle.jsx +3 -3
  15. package/src/common/styles.js +1 -1
  16. package/src/grid.jsx +38 -13
  17. package/src/index.js +2 -1
  18. package/src/key-legend.jsx +75 -0
  19. package/src/line/common/drag-handle.jsx +3 -9
  20. package/src/line/common/line.jsx +2 -6
  21. package/src/line/line-cross.js +29 -2
  22. package/src/line/line-dot.js +36 -19
  23. package/src/mark-label.jsx +7 -2
  24. package/src/plot/common/plot.jsx +8 -5
  25. package/src/tool-menu.jsx +1 -1
  26. package/lib/__tests__/axes.test.js +0 -181
  27. package/lib/__tests__/chart-setup.test.js +0 -58
  28. package/lib/__tests__/chart-type.test.js +0 -42
  29. package/lib/__tests__/chart.test.js +0 -108
  30. package/lib/__tests__/grid.test.js +0 -48
  31. package/lib/__tests__/mark-label.test.js +0 -57
  32. package/lib/__tests__/utils.js +0 -56
  33. package/lib/__tests__/utils.test.js +0 -197
  34. package/lib/axes.js +0 -643
  35. package/lib/bars/__tests__/bar.test.js +0 -62
  36. package/lib/bars/__tests__/histogram.test.js +0 -64
  37. package/lib/bars/__tests__/utils.js +0 -56
  38. package/lib/bars/bar.js +0 -86
  39. package/lib/bars/common/__tests__/bars.test.js +0 -100
  40. package/lib/bars/common/__tests__/utils.js +0 -56
  41. package/lib/bars/common/bars.js +0 -301
  42. package/lib/bars/histogram.js +0 -87
  43. package/lib/chart-setup.js +0 -458
  44. package/lib/chart-type.js +0 -71
  45. package/lib/chart-types.js +0 -31
  46. package/lib/chart.js +0 -438
  47. package/lib/common/__tests__/drag-handle.test.js +0 -134
  48. package/lib/common/__tests__/utils.js +0 -56
  49. package/lib/common/drag-handle.js +0 -175
  50. package/lib/common/drag-icon.js +0 -52
  51. package/lib/common/styles.js +0 -40
  52. package/lib/grid.js +0 -104
  53. package/lib/index.js +0 -40
  54. package/lib/line/__tests__/line-cross.test.js +0 -64
  55. package/lib/line/__tests__/line-dot.test.js +0 -64
  56. package/lib/line/__tests__/utils.js +0 -56
  57. package/lib/line/common/__tests__/drag-handle.test.js +0 -134
  58. package/lib/line/common/__tests__/line.test.js +0 -128
  59. package/lib/line/common/__tests__/utils.js +0 -56
  60. package/lib/line/common/drag-handle.js +0 -157
  61. package/lib/line/common/line.js +0 -261
  62. package/lib/line/line-cross.js +0 -168
  63. package/lib/line/line-dot.js +0 -131
  64. package/lib/mark-label.js +0 -255
  65. package/lib/plot/__tests__/dot.test.js +0 -64
  66. package/lib/plot/__tests__/line.test.js +0 -64
  67. package/lib/plot/__tests__/utils.js +0 -56
  68. package/lib/plot/common/__tests__/plot.test.js +0 -103
  69. package/lib/plot/common/__tests__/utils.js +0 -56
  70. package/lib/plot/common/plot.js +0 -280
  71. package/lib/plot/dot.js +0 -123
  72. package/lib/plot/line.js +0 -152
  73. package/lib/tool-menu.js +0 -142
  74. package/lib/utils.js +0 -244
package/lib/axes.js DELETED
@@ -1,643 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports["default"] = exports.TickComponent = exports.RawChartAxes = void 0;
9
-
10
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
-
12
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
-
14
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
15
-
16
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
17
-
18
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
19
-
20
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
21
-
22
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
23
-
24
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
25
-
26
- var _react = _interopRequireDefault(require("react"));
27
-
28
- var _propTypes = _interopRequireDefault(require("prop-types"));
29
-
30
- var _styles = require("@material-ui/core/styles");
31
-
32
- var _plot = require("@pie-lib/plot");
33
-
34
- var _renderUi = require("@pie-lib/render-ui");
35
-
36
- var _configUi = require("@pie-lib/config-ui");
37
-
38
- var _axis = require("@vx/axis");
39
-
40
- var _utils = require("./utils");
41
-
42
- var _markLabel = _interopRequireDefault(require("./mark-label"));
43
-
44
- var _Checkbox = _interopRequireDefault(require("@material-ui/core/Checkbox"));
45
-
46
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
47
-
48
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
49
-
50
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
51
-
52
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
53
-
54
- var TickComponent = /*#__PURE__*/function (_React$Component) {
55
- (0, _inherits2["default"])(TickComponent, _React$Component);
56
-
57
- var _super = _createSuper(TickComponent);
58
-
59
- function TickComponent(props) {
60
- var _this;
61
-
62
- (0, _classCallCheck2["default"])(this, TickComponent);
63
- _this = _super.call(this, props);
64
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleAlertDialog", function (open, callback) {
65
- return _this.setState({
66
- dialog: {
67
- open: open
68
- }
69
- }, callback);
70
- });
71
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "changeCategory", function (index, newLabel) {
72
- var _this$props = _this.props,
73
- categories = _this$props.categories,
74
- onChangeCategory = _this$props.onChangeCategory;
75
- var category = categories[index];
76
- onChangeCategory(index, _objectSpread(_objectSpread({}, category), {}, {
77
- label: newLabel
78
- }));
79
- });
80
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "deleteCategory", function (index) {
81
- var _this$props2 = _this.props,
82
- categories = _this$props2.categories,
83
- onChange = _this$props2.onChange;
84
-
85
- if (index >= 0 && categories[index]) {
86
- onChange([].concat((0, _toConsumableArray2["default"])(categories.slice(0, index)), (0, _toConsumableArray2["default"])(categories.slice(index + 1))));
87
- }
88
- });
89
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "changeInteractive", function (index, value) {
90
- var _this$props3 = _this.props,
91
- categories = _this$props3.categories,
92
- onChangeCategory = _this$props3.onChangeCategory;
93
- var category = categories[index];
94
-
95
- if (!value) {
96
- _this.setState({
97
- dialog: {
98
- open: true,
99
- title: 'Warning',
100
- text: 'This will remove the correct answer value that has been defined for this category.',
101
- onConfirm: function onConfirm() {
102
- return _this.handleAlertDialog(false, onChangeCategory(index, _objectSpread(_objectSpread({}, category), {}, {
103
- interactive: !category.interactive
104
- })));
105
- },
106
- onClose: function onClose() {
107
- return _this.handleAlertDialog(false);
108
- }
109
- }
110
- });
111
- } else {
112
- onChangeCategory(index, _objectSpread(_objectSpread({}, category), {}, {
113
- interactive: !category.interactive
114
- }));
115
- }
116
- });
117
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "changeEditable", function (index, value) {
118
- var _this$props4 = _this.props,
119
- categories = _this$props4.categories,
120
- onChangeCategory = _this$props4.onChangeCategory;
121
- var category = categories[index];
122
-
123
- if (!value) {
124
- _this.setState({
125
- dialog: {
126
- open: true,
127
- title: 'Warning',
128
- text: 'This will remove the correct answer category name that has been defined for this category.',
129
- onConfirm: function onConfirm() {
130
- return _this.handleAlertDialog(false, onChangeCategory(index, _objectSpread(_objectSpread({}, category), {}, {
131
- editable: !category.editable || false
132
- })));
133
- },
134
- onClose: function onClose() {
135
- return _this.handleAlertDialog(false);
136
- }
137
- }
138
- });
139
- } else {
140
- onChangeCategory(index, _objectSpread(_objectSpread({}, category), {}, {
141
- editable: !category.editable || false
142
- }));
143
- }
144
- });
145
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "splitText", function (text, maxChar) {
146
- var chunks = [];
147
-
148
- while ((text || '').length > 0) {
149
- var indexToSplit = void 0;
150
-
151
- if (text.length > maxChar) {
152
- indexToSplit = text.lastIndexOf(' ', maxChar);
153
-
154
- if (indexToSplit === -1) {
155
- indexToSplit = maxChar;
156
- }
157
- } else {
158
- indexToSplit = text.length;
159
- }
160
-
161
- chunks.push(text.substring(0, indexToSplit));
162
- text = text.substring(indexToSplit).trim();
163
- }
164
-
165
- return chunks;
166
- });
167
- _this.state = {
168
- dialog: {
169
- open: false
170
- }
171
- };
172
- return _this;
173
- }
174
-
175
- (0, _createClass2["default"])(TickComponent, [{
176
- key: "componentDidUpdate",
177
- value: function componentDidUpdate(prevProps) {
178
- if (this.props.autoFocus && !prevProps.autoFocus) {
179
- this.props.onAutoFocusUsed();
180
- }
181
- }
182
- }, {
183
- key: "render",
184
- value: function render() {
185
- var _this2 = this;
186
-
187
- var _this$props5 = this.props,
188
- classes = _this$props5.classes,
189
- categories = _this$props5.categories,
190
- xBand = _this$props5.xBand,
191
- bandWidth = _this$props5.bandWidth,
192
- barWidth = _this$props5.barWidth,
193
- rotate = _this$props5.rotate,
194
- top = _this$props5.top,
195
- graphProps = _this$props5.graphProps,
196
- defineChart = _this$props5.defineChart,
197
- chartingOptions = _this$props5.chartingOptions,
198
- x = _this$props5.x,
199
- y = _this$props5.y,
200
- formattedValue = _this$props5.formattedValue,
201
- changeInteractiveEnabled = _this$props5.changeInteractiveEnabled,
202
- changeEditableEnabled = _this$props5.changeEditableEnabled,
203
- error = _this$props5.error,
204
- autoFocus = _this$props5.autoFocus,
205
- hiddenLabelRef = _this$props5.hiddenLabelRef;
206
-
207
- if (!formattedValue) {
208
- return null;
209
- }
210
-
211
- var dialog = this.state.dialog;
212
-
213
- var _ref = chartingOptions || {},
214
- changeEditable = _ref.changeEditable,
215
- changeInteractive = _ref.changeInteractive;
216
-
217
- var index = parseInt(formattedValue.split('-')[0], 10);
218
- var category = categories[index];
219
-
220
- var _ref2 = category || {},
221
- deletable = _ref2.deletable,
222
- editable = _ref2.editable,
223
- interactive = _ref2.interactive,
224
- label = _ref2.label,
225
- correctness = _ref2.correctness;
226
-
227
- var barX = xBand((0, _utils.bandKey)({
228
- label: label
229
- }, index));
230
- var longestCategory = (categories || []).reduce(function (a, b) {
231
- var lengthA = a && a.label ? a.label.length : 0;
232
- var lengthB = b && b.label ? b.label.length : 0;
233
- return lengthA > lengthB ? a : b;
234
- });
235
- var distinctMessages = error ? (0, _toConsumableArray2["default"])(new Set(Object.values(error))).join(' ') : '';
236
- return /*#__PURE__*/_react["default"].createElement("g", null, /*#__PURE__*/_react["default"].createElement("foreignObject", {
237
- x: bandWidth ? barX : x - barWidth / 2,
238
- y: 6,
239
- width: barWidth,
240
- height: 4,
241
- style: {
242
- pointerEvents: 'none',
243
- overflow: 'visible'
244
- }
245
- }, index === 0 && /*#__PURE__*/_react["default"].createElement(_markLabel["default"], {
246
- isHiddenLabel: true,
247
- inputRef: hiddenLabelRef,
248
- disabled: true,
249
- mark: longestCategory,
250
- graphProps: graphProps,
251
- barWidth: barWidth
252
- }), /*#__PURE__*/_react["default"].createElement(_markLabel["default"], {
253
- autoFocus: defineChart && autoFocus,
254
- inputRef: function inputRef(r) {
255
- return _this2.input = r;
256
- },
257
- disabled: !defineChart && !editable,
258
- mark: category,
259
- graphProps: graphProps,
260
- onChange: function onChange(newLabel) {
261
- return _this2.changeCategory(index, newLabel);
262
- },
263
- barWidth: barWidth,
264
- rotate: rotate,
265
- correctness: correctness,
266
- error: error && error[index]
267
- })), error && index === 0 && /*#__PURE__*/_react["default"].createElement("text", {
268
- className: classes.error,
269
- y: y + 23,
270
- height: 6,
271
- textAnchor: "start"
272
- }, distinctMessages), deletable && !correctness && /*#__PURE__*/_react["default"].createElement("line", {
273
- x1: x,
274
- y1: 0,
275
- x2: x,
276
- y2: y + 4 + top,
277
- className: classes.dottedLine,
278
- strokeDasharray: "4 2"
279
- }), deletable && !correctness && /*#__PURE__*/_react["default"].createElement("svg", {
280
- xmlns: "http://www.w3.org/2000/svg",
281
- x: x - 8,
282
- y: y + 60 + top,
283
- width: 16,
284
- height: 16,
285
- viewBox: "0 0 512 512",
286
- onClick: function onClick() {
287
- return _this2.deleteCategory(index);
288
- }
289
- }, /*#__PURE__*/_react["default"].createElement("path", {
290
- d: "M128 405.429C128 428.846 147.198 448 170.667 448h170.667C364.802 448 384 428.846 384 405.429V160H128v245.429zM416 96h-80l-26.785-32H202.786L176 96H96v32h320V96z"
291
- })), defineChart && index === 0 && /*#__PURE__*/_react["default"].createElement("svg", {
292
- x: -55,
293
- style: {
294
- overflow: 'visible'
295
- }
296
- }, changeInteractiveEnabled && /*#__PURE__*/_react["default"].createElement("text", {
297
- y: y + 90 + top,
298
- width: barWidth,
299
- height: 4,
300
- style: {
301
- position: 'absolute',
302
- pointerEvents: 'none',
303
- wordBreak: 'break-word',
304
- maxWidth: barWidth,
305
- display: 'inline-block'
306
- }
307
- }, this.splitText(changeInteractive === null || changeInteractive === void 0 ? void 0 : changeInteractive.authoringLabel, 20).map(function (word, index) {
308
- return /*#__PURE__*/_react["default"].createElement("tspan", {
309
- key: index,
310
- x: "0",
311
- dy: "".concat(index > 0 ? '1.2em' : '.6em')
312
- }, word);
313
- })), changeEditableEnabled && /*#__PURE__*/_react["default"].createElement("text", {
314
- y: y + 145 + top,
315
- width: barWidth,
316
- height: 4,
317
- style: {
318
- position: 'absolute',
319
- pointerEvents: 'none',
320
- wordBreak: 'break-word',
321
- maxWidth: barWidth,
322
- display: 'inline-block'
323
- }
324
- }, this.splitText(changeEditable === null || changeEditable === void 0 ? void 0 : changeEditable.authoringLabel, 20).map(function (word, index) {
325
- return /*#__PURE__*/_react["default"].createElement("tspan", {
326
- key: index,
327
- x: "0",
328
- dy: "".concat(index > 0 ? '1.2em' : '.6em')
329
- }, word);
330
- }))), defineChart && changeInteractiveEnabled && /*#__PURE__*/_react["default"].createElement("foreignObject", {
331
- x: x - 24,
332
- y: y + 80 + top,
333
- width: barWidth,
334
- height: 4,
335
- style: {
336
- pointerEvents: 'visible',
337
- overflow: 'visible'
338
- }
339
- }, /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
340
- className: classes.customColor,
341
- style: {
342
- position: 'fixed'
343
- },
344
- checked: interactive,
345
- onChange: function onChange(e) {
346
- return _this2.changeInteractive(index, e.target.checked);
347
- }
348
- })), defineChart && changeEditableEnabled && /*#__PURE__*/_react["default"].createElement("foreignObject", {
349
- x: x - 24,
350
- y: y + 130 + top,
351
- width: barWidth,
352
- height: 4,
353
- style: {
354
- pointerEvents: 'visible',
355
- overflow: 'visible'
356
- }
357
- }, /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
358
- className: classes.customColor,
359
- style: {
360
- position: 'fixed'
361
- },
362
- checked: editable,
363
- onChange: function onChange(e) {
364
- return _this2.changeEditable(index, e.target.checked);
365
- }
366
- })), /*#__PURE__*/_react["default"].createElement("foreignObject", {
367
- x: x - 24,
368
- y: y + 100 + top,
369
- width: barWidth,
370
- height: 4,
371
- style: {
372
- pointerEvents: 'visible',
373
- overflow: 'visible'
374
- }
375
- }, /*#__PURE__*/_react["default"].createElement(_configUi.AlertDialog, {
376
- open: dialog.open,
377
- title: dialog.title,
378
- text: dialog.text,
379
- onClose: dialog.onClose,
380
- onConfirm: dialog.onConfirm
381
- })));
382
- }
383
- }]);
384
- return TickComponent;
385
- }(_react["default"].Component);
386
-
387
- exports.TickComponent = TickComponent;
388
- (0, _defineProperty2["default"])(TickComponent, "propTypes", {
389
- defineChart: _propTypes["default"].bool,
390
- error: _propTypes["default"].any
391
- });
392
- TickComponent.propTypes = {
393
- categories: _propTypes["default"].array,
394
- xBand: _propTypes["default"].func,
395
- bandWidth: _propTypes["default"].number,
396
- barWidth: _propTypes["default"].number,
397
- rotate: _propTypes["default"].number,
398
- top: _propTypes["default"].number,
399
- x: _propTypes["default"].number,
400
- y: _propTypes["default"].number,
401
- graphProps: _propTypes["default"].object,
402
- formattedValue: _propTypes["default"].string,
403
- onChangeCategory: _propTypes["default"].func,
404
- onChange: _propTypes["default"].func,
405
- classes: _propTypes["default"].object,
406
- error: _propTypes["default"].object,
407
- defineChart: _propTypes["default"].bool,
408
- chartingOptions: _propTypes["default"].object,
409
- changeInteractiveEnabled: _propTypes["default"].bool,
410
- changeEditableEnabled: _propTypes["default"].bool,
411
- autoFocus: _propTypes["default"].bool,
412
- onAutoFocusUsed: _propTypes["default"].func
413
- };
414
-
415
- var RawChartAxes = /*#__PURE__*/function (_React$Component2) {
416
- (0, _inherits2["default"])(RawChartAxes, _React$Component2);
417
-
418
- var _super2 = _createSuper(RawChartAxes);
419
-
420
- function RawChartAxes() {
421
- var _this3;
422
-
423
- (0, _classCallCheck2["default"])(this, RawChartAxes);
424
-
425
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
426
- args[_key] = arguments[_key];
427
- }
428
-
429
- _this3 = _super2.call.apply(_super2, [this].concat(args));
430
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this3), "state", {
431
- height: 0,
432
- width: 0
433
- });
434
- return _this3;
435
- }
436
-
437
- (0, _createClass2["default"])(RawChartAxes, [{
438
- key: "componentDidMount",
439
- value: function componentDidMount() {
440
- if (this.hiddenLabelRef) {
441
- var boundingClientRect = this.hiddenLabelRef.getBoundingClientRect();
442
- this.setState({
443
- height: Math.floor(boundingClientRect.height),
444
- width: Math.floor(boundingClientRect.width)
445
- });
446
- }
447
- }
448
- }, {
449
- key: "componentDidUpdate",
450
- value: function componentDidUpdate(prevProps, prevState, snapshot) {
451
- if (this.hiddenLabelRef) {
452
- var width = Math.floor(this.hiddenLabelRef.getBoundingClientRect().width);
453
-
454
- if (width !== this.state.width) {
455
- this.setState({
456
- width: width
457
- });
458
- }
459
- }
460
- }
461
- }, {
462
- key: "render",
463
- value: function render() {
464
- var _this4 = this;
465
-
466
- var _this$props6 = this.props,
467
- classes = _this$props6.classes,
468
- graphProps = _this$props6.graphProps,
469
- xBand = _this$props6.xBand,
470
- leftAxis = _this$props6.leftAxis,
471
- onChange = _this$props6.onChange,
472
- onChangeCategory = _this$props6.onChangeCategory,
473
- _this$props6$categori = _this$props6.categories,
474
- categories = _this$props6$categori === void 0 ? [] : _this$props6$categori,
475
- top = _this$props6.top,
476
- defineChart = _this$props6.defineChart,
477
- chartingOptions = _this$props6.chartingOptions,
478
- changeInteractiveEnabled = _this$props6.changeInteractiveEnabled,
479
- changeEditableEnabled = _this$props6.changeEditableEnabled,
480
- theme = _this$props6.theme,
481
- autoFocus = _this$props6.autoFocus,
482
- onAutoFocusUsed = _this$props6.onAutoFocusUsed,
483
- error = _this$props6.error;
484
- var axis = classes.axis,
485
- axisLine = classes.axisLine,
486
- tick = classes.tick;
487
-
488
- var _ref3 = graphProps || {},
489
- _ref3$scale = _ref3.scale,
490
- scale = _ref3$scale === void 0 ? {} : _ref3$scale,
491
- _ref3$range = _ref3.range,
492
- range = _ref3$range === void 0 ? {} : _ref3$range,
493
- _ref3$domain = _ref3.domain,
494
- domain = _ref3$domain === void 0 ? {} : _ref3$domain,
495
- _ref3$size = _ref3.size,
496
- size = _ref3$size === void 0 ? {} : _ref3$size;
497
-
498
- var _this$state = this.state,
499
- height = _this$state.height,
500
- width = _this$state.width;
501
- var bottomScale = xBand && typeof xBand.rangeRound === 'function' && xBand.rangeRound([0, size.width]);
502
- var bandWidth = xBand && typeof xBand.bandwidth === 'function' && xBand.bandwidth(); // for chartType "line", bandWidth will be 0, so we have to calculate it
503
-
504
- var barWidth = bandWidth || scale.x && scale.x(domain.max) / categories.length;
505
- var rowTickValues = (0, _utils.getTickValues)(_objectSpread(_objectSpread({}, range), {}, {
506
- step: range.labelStep
507
- }));
508
- var fontSize = theme && theme.typography ? theme.typography.fontSize : 14; // this mostly applies for labels that are not editable
509
-
510
- var rotateBecauseOfHeight = (0, _utils.getRotateAngle)(fontSize, height); // this applies for labels that are editable
511
-
512
- var rotateBecauseOfWidth = width > barWidth ? 25 : 0;
513
-
514
- var getTickLabelProps = function getTickLabelProps(value) {
515
- return {
516
- dy: 4,
517
- dx: -10 - (value.toLocaleString().length || 1) * 5
518
- };
519
- };
520
-
521
- var getTickComponent = function getTickComponent(props) {
522
- var properties = {
523
- hiddenLabelRef: function hiddenLabelRef(ref) {
524
- _this4.hiddenLabelRef = ref;
525
- },
526
- classes: classes,
527
- categories: categories,
528
- xBand: xBand,
529
- bandWidth: bandWidth,
530
- barWidth: barWidth,
531
- rotate: rotateBecauseOfHeight || rotateBecauseOfWidth,
532
- top: top,
533
- defineChart: defineChart,
534
- chartingOptions: chartingOptions,
535
- autoFocus: autoFocus,
536
- onAutoFocusUsed: onAutoFocusUsed,
537
- error: error,
538
- onChangeCategory: onChangeCategory,
539
- changeInteractiveEnabled: changeInteractiveEnabled,
540
- changeEditableEnabled: changeEditableEnabled,
541
- onChange: onChange,
542
- graphProps: graphProps,
543
- x: props.x,
544
- y: props.y,
545
- formattedValue: props.formattedValue
546
- };
547
- return /*#__PURE__*/_react["default"].createElement(TickComponent, properties);
548
- };
549
-
550
- return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, leftAxis && /*#__PURE__*/_react["default"].createElement(_axis.AxisLeft, {
551
- scale: scale.y,
552
- className: axis,
553
- axisLineClassName: axisLine,
554
- tickLength: 10,
555
- tickClassName: tick,
556
- tickFormat: function tickFormat(value) {
557
- return value;
558
- },
559
- tickValues: rowTickValues,
560
- tickLabelProps: getTickLabelProps
561
- }), /*#__PURE__*/_react["default"].createElement(_axis.AxisBottom, {
562
- axisLineClassName: axisLine,
563
- tickClassName: tick,
564
- scale: bottomScale,
565
- labelProps: {
566
- y: 60 + top
567
- },
568
- top: scale.y && scale.y(range.min),
569
- textLabelProps: function textLabelProps() {
570
- return {
571
- textAnchor: 'middle'
572
- };
573
- },
574
- tickFormat: function tickFormat(count) {
575
- return count;
576
- },
577
- tickComponent: getTickComponent,
578
- autoFocus: autoFocus,
579
- onAutoFocusUsed: onAutoFocusUsed
580
- }));
581
- }
582
- }]);
583
- return RawChartAxes;
584
- }(_react["default"].Component);
585
-
586
- exports.RawChartAxes = RawChartAxes;
587
- (0, _defineProperty2["default"])(RawChartAxes, "propTypes", {
588
- bottomScale: _propTypes["default"].func,
589
- classes: _propTypes["default"].object.isRequired,
590
- categories: _propTypes["default"].array,
591
- defineChart: _propTypes["default"].bool,
592
- error: _propTypes["default"].any,
593
- graphProps: _plot.types.GraphPropsType.isRequired,
594
- xBand: _propTypes["default"].func,
595
- leftAxis: _propTypes["default"].bool,
596
- onChange: _propTypes["default"].func,
597
- onChangeCategory: _propTypes["default"].func,
598
- top: _propTypes["default"].number,
599
- theme: _propTypes["default"].object,
600
- chartingOptions: _propTypes["default"].object,
601
- changeInteractiveEnabled: _propTypes["default"].bool,
602
- changeEditableEnabled: _propTypes["default"].bool,
603
- autoFocus: _propTypes["default"].bool,
604
- onAutoFocusUsed: _propTypes["default"].func
605
- });
606
- var ChartAxes = (0, _styles.withStyles)(function (theme) {
607
- return {
608
- axis: {
609
- stroke: _renderUi.color.primaryDark(),
610
- strokeWidth: 2
611
- },
612
- axisLine: {
613
- stroke: _renderUi.color.primaryDark(),
614
- strokeWidth: 2
615
- },
616
- tick: {
617
- '& > line': {
618
- stroke: _renderUi.color.primaryDark(),
619
- strokeWidth: 2
620
- },
621
- fill: _renderUi.color.primaryDark(),
622
- fontFamily: theme.typography.body1.fontFamily,
623
- fontSize: theme.typography.fontSize,
624
- textAnchor: 'middle'
625
- },
626
- dottedLine: {
627
- stroke: _renderUi.color.primaryLight(),
628
- opacity: 0.2
629
- },
630
- error: {
631
- fontSize: theme.typography.fontSize - 2,
632
- fill: theme.palette.error.main
633
- },
634
- customColor: {
635
- color: "".concat(_renderUi.color.tertiary(), " !important")
636
- }
637
- };
638
- }, {
639
- withTheme: true
640
- })(RawChartAxes);
641
- var _default = ChartAxes;
642
- exports["default"] = _default;
643
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9heGVzLmpzeCJdLCJuYW1lcyI6WyJUaWNrQ29tcG9uZW50IiwicHJvcHMiLCJvcGVuIiwiY2FsbGJhY2siLCJzZXRTdGF0ZSIsImRpYWxvZyIsImluZGV4IiwibmV3TGFiZWwiLCJjYXRlZ29yaWVzIiwib25DaGFuZ2VDYXRlZ29yeSIsImNhdGVnb3J5IiwibGFiZWwiLCJvbkNoYW5nZSIsInNsaWNlIiwidmFsdWUiLCJ0aXRsZSIsInRleHQiLCJvbkNvbmZpcm0iLCJoYW5kbGVBbGVydERpYWxvZyIsImludGVyYWN0aXZlIiwib25DbG9zZSIsImVkaXRhYmxlIiwibWF4Q2hhciIsImNodW5rcyIsImxlbmd0aCIsImluZGV4VG9TcGxpdCIsImxhc3RJbmRleE9mIiwicHVzaCIsInN1YnN0cmluZyIsInRyaW0iLCJzdGF0ZSIsInByZXZQcm9wcyIsImF1dG9Gb2N1cyIsIm9uQXV0b0ZvY3VzVXNlZCIsImNsYXNzZXMiLCJ4QmFuZCIsImJhbmRXaWR0aCIsImJhcldpZHRoIiwicm90YXRlIiwidG9wIiwiZ3JhcGhQcm9wcyIsImRlZmluZUNoYXJ0IiwiY2hhcnRpbmdPcHRpb25zIiwieCIsInkiLCJmb3JtYXR0ZWRWYWx1ZSIsImNoYW5nZUludGVyYWN0aXZlRW5hYmxlZCIsImNoYW5nZUVkaXRhYmxlRW5hYmxlZCIsImVycm9yIiwiaGlkZGVuTGFiZWxSZWYiLCJjaGFuZ2VFZGl0YWJsZSIsImNoYW5nZUludGVyYWN0aXZlIiwicGFyc2VJbnQiLCJzcGxpdCIsImRlbGV0YWJsZSIsImNvcnJlY3RuZXNzIiwiYmFyWCIsImxvbmdlc3RDYXRlZ29yeSIsInJlZHVjZSIsImEiLCJiIiwibGVuZ3RoQSIsImxlbmd0aEIiLCJkaXN0aW5jdE1lc3NhZ2VzIiwiU2V0IiwiT2JqZWN0IiwidmFsdWVzIiwiam9pbiIsInBvaW50ZXJFdmVudHMiLCJvdmVyZmxvdyIsInIiLCJpbnB1dCIsImNoYW5nZUNhdGVnb3J5IiwiZG90dGVkTGluZSIsImRlbGV0ZUNhdGVnb3J5IiwicG9zaXRpb24iLCJ3b3JkQnJlYWsiLCJtYXhXaWR0aCIsImRpc3BsYXkiLCJzcGxpdFRleHQiLCJhdXRob3JpbmdMYWJlbCIsIm1hcCIsIndvcmQiLCJjdXN0b21Db2xvciIsImUiLCJ0YXJnZXQiLCJjaGVja2VkIiwiUmVhY3QiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJib29sIiwiYW55IiwicHJvcFR5cGVzIiwiYXJyYXkiLCJmdW5jIiwibnVtYmVyIiwib2JqZWN0Iiwic3RyaW5nIiwiUmF3Q2hhcnRBeGVzIiwiaGVpZ2h0Iiwid2lkdGgiLCJib3VuZGluZ0NsaWVudFJlY3QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJNYXRoIiwiZmxvb3IiLCJwcmV2U3RhdGUiLCJzbmFwc2hvdCIsImxlZnRBeGlzIiwidGhlbWUiLCJheGlzIiwiYXhpc0xpbmUiLCJ0aWNrIiwic2NhbGUiLCJyYW5nZSIsImRvbWFpbiIsInNpemUiLCJib3R0b21TY2FsZSIsInJhbmdlUm91bmQiLCJiYW5kd2lkdGgiLCJtYXgiLCJyb3dUaWNrVmFsdWVzIiwic3RlcCIsImxhYmVsU3RlcCIsImZvbnRTaXplIiwidHlwb2dyYXBoeSIsInJvdGF0ZUJlY2F1c2VPZkhlaWdodCIsInJvdGF0ZUJlY2F1c2VPZldpZHRoIiwiZ2V0VGlja0xhYmVsUHJvcHMiLCJkeSIsImR4IiwidG9Mb2NhbGVTdHJpbmciLCJnZXRUaWNrQ29tcG9uZW50IiwicHJvcGVydGllcyIsInJlZiIsIm1pbiIsInRleHRBbmNob3IiLCJjb3VudCIsImlzUmVxdWlyZWQiLCJ0eXBlcyIsIkdyYXBoUHJvcHNUeXBlIiwiQ2hhcnRBeGVzIiwic3Ryb2tlIiwiY29sb3IiLCJwcmltYXJ5RGFyayIsInN0cm9rZVdpZHRoIiwiZmlsbCIsImZvbnRGYW1pbHkiLCJib2R5MSIsInByaW1hcnlMaWdodCIsIm9wYWNpdHkiLCJwYWxldHRlIiwibWFpbiIsInRlcnRpYXJ5Iiwid2l0aFRoZW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7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b20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyB3aXRoU3R5bGVzIH0gZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvc3R5bGVzJztcbmltcG9ydCB7IHR5cGVzIH0gZnJvbSAnQHBpZS1saWIvcGxvdCc7XG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ0BwaWUtbGliL3JlbmRlci11aSc7XG5pbXBvcnQgeyBBbGVydERpYWxvZyB9IGZyb20gJ0BwaWUtbGliL2NvbmZpZy11aSc7XG5pbXBvcnQgeyBBeGlzTGVmdCwgQXhpc0JvdHRvbSB9IGZyb20gJ0B2eC9heGlzJztcbmltcG9ydCB7IGJhbmRLZXksIGdldFRpY2tWYWx1ZXMsIGdldFJvdGF0ZUFuZ2xlIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgTWFya0xhYmVsIGZyb20gJy4vbWFyay1sYWJlbCc7XG5pbXBvcnQgQ2hlY2tib3ggZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvQ2hlY2tib3gnO1xuXG5leHBvcnQgY2xhc3MgVGlja0NvbXBvbmVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgZGVmaW5lQ2hhcnQ6IFByb3BUeXBlcy5ib29sLFxuICAgIGVycm9yOiBQcm9wVHlwZXMuYW55LFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBkaWFsb2c6IHtcbiAgICAgICAgb3BlbjogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuYXV0b0ZvY3VzICYmICFwcmV2UHJvcHMuYXV0b0ZvY3VzKSB7XG4gICAgICB0aGlzLnByb3BzLm9uQXV0b0ZvY3VzVXNlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUFsZXJ0RGlhbG9nID0gKG9wZW4sIGNhbGxiYWNrKSA9PlxuICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICB7XG4gICAgICAgIGRpYWxvZzogeyBvcGVuIH0sXG4gICAgICB9LFxuICAgICAgY2FsbGJhY2ssXG4gICAgKTtcblxuICBjaGFuZ2VDYXRlZ29yeSA9IChpbmRleCwgbmV3TGFiZWwpID0+IHtcbiAgICBjb25zdCB7IGNhdGVnb3JpZXMsIG9uQ2hhbmdlQ2F0ZWdvcnkgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgY2F0ZWdvcnkgPSBjYXRlZ29yaWVzW2luZGV4XTtcblxuICAgIG9uQ2hhbmdlQ2F0ZWdvcnkoaW5kZXgsIHsgLi4uY2F0ZWdvcnksIGxhYmVsOiBuZXdMYWJlbCB9KTtcbiAgfTtcblxuICBkZWxldGVDYXRlZ29yeSA9IChpbmRleCkgPT4ge1xuICAgIGNvbnN0IHsgY2F0ZWdvcmllcywgb25DaGFuZ2UgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBpZiAoaW5kZXggPj0gMCAmJiBjYXRlZ29yaWVzW2luZGV4XSkge1xuICAgICAgb25DaGFuZ2UoWy4uLmNhdGVnb3JpZXMuc2xpY2UoMCwgaW5kZXgpLCAuLi5jYXRlZ29yaWVzLnNsaWNlKGluZGV4ICsgMSldKTtcbiAgICB9XG4gIH07XG5cbiAgY2hhbmdlSW50ZXJhY3RpdmUgPSAoaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgY29uc3QgeyBjYXRlZ29yaWVzLCBvbkNoYW5nZUNhdGVnb3J5IH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IGNhdGVnb3J5ID0gY2F0ZWdvcmllc1tpbmRleF07XG5cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZGlhbG9nOiB7XG4gICAgICAgICAgb3BlbjogdHJ1ZSxcbiAgICAgICAgICB0aXRsZTogJ1dhcm5pbmcnLFxuICAgICAgICAgIHRleHQ6ICdUaGlzIHdpbGwgcmVtb3ZlIHRoZSBjb3JyZWN0IGFuc3dlciB2YWx1ZSB0aGF0IGhhcyBiZWVuIGRlZmluZWQgZm9yIHRoaXMgY2F0ZWdvcnkuJyxcbiAgICAgICAgICBvbkNvbmZpcm06ICgpID0+XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUFsZXJ0RGlhbG9nKGZhbHNlLCBvbkNoYW5nZUNhdGVnb3J5KGluZGV4LCB7IC4uLmNhdGVnb3J5LCBpbnRlcmFjdGl2ZTogIWNhdGVnb3J5LmludGVyYWN0aXZlIH0pKSxcbiAgICAgICAgICBvbkNsb3NlOiAoKSA9PiB0aGlzLmhhbmRsZUFsZXJ0RGlhbG9nKGZhbHNlKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvbkNoYW5nZUNhdGVnb3J5KGluZGV4LCB7IC4uLmNhdGVnb3J5LCBpbnRlcmFjdGl2ZTogIWNhdGVnb3J5LmludGVyYWN0aXZlIH0pO1xuICAgIH1cbiAgfTtcblxuICBjaGFuZ2VFZGl0YWJsZSA9IChpbmRleCwgdmFsdWUpID0+IHtcbiAgICBjb25zdCB7IGNhdGVnb3JpZXMsIG9uQ2hhbmdlQ2F0ZWdvcnkgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgY2F0ZWdvcnkgPSBjYXRlZ29yaWVzW2luZGV4XTtcblxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkaWFsb2c6IHtcbiAgICAgICAgICBvcGVuOiB0cnVlLFxuICAgICAgICAgIHRpdGxlOiAnV2FybmluZycsXG4gICAgICAgICAgdGV4dDogJ1RoaXMgd2lsbCByZW1vdmUgdGhlIGNvcnJlY3QgYW5zd2VyIGNhdGVnb3J5IG5hbWUgdGhhdCBoYXMgYmVlbiBkZWZpbmVkIGZvciB0aGlzIGNhdGVnb3J5LicsXG4gICAgICAgICAgb25Db25maXJtOiAoKSA9PlxuICAgICAgICAgICAgdGhpcy5oYW5kbGVBbGVydERpYWxvZyhcbiAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgIG9uQ2hhbmdlQ2F0ZWdvcnkoaW5kZXgsIHsgLi4uY2F0ZWdvcnksIGVkaXRhYmxlOiAhY2F0ZWdvcnkuZWRpdGFibGUgfHwgZmFsc2UgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgIG9uQ2xvc2U6ICgpID0+IHRoaXMuaGFuZGxlQWxlcnREaWFsb2coZmFsc2UpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9uQ2hhbmdlQ2F0ZWdvcnkoaW5kZXgsIHsgLi4uY2F0ZWdvcnksIGVkaXRhYmxlOiAhY2F0ZWdvcnkuZWRpdGFibGUgfHwgZmFsc2UgfSk7XG4gICAgfVxuICB9O1xuXG4gIHNwbGl0VGV4dCA9ICh0ZXh0LCBtYXhDaGFyKSA9PiB7XG4gICAgbGV0IGNodW5rcyA9IFtdO1xuICAgIHdoaWxlICgodGV4dCB8fCAnJykubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGluZGV4VG9TcGxpdDtcbiAgICAgIGlmICh0ZXh0Lmxlbmd0aCA+IG1heENoYXIpIHtcbiAgICAgICAgaW5kZXhUb1NwbGl0ID0gdGV4dC5sYXN0SW5kZXhPZignICcsIG1heENoYXIpO1xuICAgICAgICBpZiAoaW5kZXhUb1NwbGl0ID09PSAtMSkge1xuICAgICAgICAgIGluZGV4VG9TcGxpdCA9IG1heENoYXI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGV4VG9TcGxpdCA9IHRleHQubGVuZ3RoO1xuICAgICAgfVxuICAgICAgY2h1bmtzLnB1c2godGV4dC5zdWJzdHJpbmcoMCwgaW5kZXhUb1NwbGl0KSk7XG4gICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoaW5kZXhUb1NwbGl0KS50cmltKCk7XG4gICAgfVxuICAgIHJldHVybiBjaHVua3M7XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNsYXNzZXMsXG4gICAgICBjYXRlZ29yaWVzLFxuICAgICAgeEJhbmQsXG4gICAgICBiYW5kV2lkdGgsXG4gICAgICBiYXJXaWR0aCxcbiAgICAgIHJvdGF0ZSxcbiAgICAgIHRvcCxcbiAgICAgIGdyYXBoUHJvcHMsXG4gICAgICBkZWZpbmVDaGFydCxcbiAgICAgIGNoYXJ0aW5nT3B0aW9ucyxcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgZm9ybWF0dGVkVmFsdWUsXG4gICAgICBjaGFuZ2VJbnRlcmFjdGl2ZUVuYWJsZWQsXG4gICAgICBjaGFuZ2VFZGl0YWJsZUVuYWJsZWQsXG4gICAgICBlcnJvcixcbiAgICAgIGF1dG9Gb2N1cyxcbiAgICAgIGhpZGRlbkxhYmVsUmVmLFxuICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgaWYgKCFmb3JtYXR0ZWRWYWx1ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgeyBkaWFsb2cgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgeyBjaGFuZ2VFZGl0YWJsZSwgY2hhbmdlSW50ZXJhY3RpdmUgfSA9IGNoYXJ0aW5nT3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KGZvcm1hdHRlZFZhbHVlLnNwbGl0KCctJylbMF0sIDEwKTtcbiAgICBjb25zdCBjYXRlZ29yeSA9IGNhdGVnb3JpZXNbaW5kZXhdO1xuICAgIGNvbnN0IHsgZGVsZXRhYmxlLCBlZGl0YWJsZSwgaW50ZXJhY3RpdmUsIGxhYmVsLCBjb3JyZWN0bmVzcyB9ID0gY2F0ZWdvcnkgfHwge307XG4gICAgY29uc3QgYmFyWCA9IHhCYW5kKGJhbmRLZXkoeyBsYWJlbCB9LCBpbmRleCkpO1xuICAgIGNvbnN0IGxvbmdlc3RDYXRlZ29yeSA9IChjYXRlZ29yaWVzIHx8IFtdKS5yZWR1Y2UoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGxlbmd0aEEgPSBhICYmIGEubGFiZWwgPyBhLmxhYmVsLmxlbmd0aCA6IDA7XG4gICAgICBjb25zdCBsZW5ndGhCID0gYiAmJiBiLmxhYmVsID8gYi5sYWJlbC5sZW5ndGggOiAwO1xuXG4gICAgICByZXR1cm4gbGVuZ3RoQSA+IGxlbmd0aEIgPyBhIDogYjtcbiAgICB9KTtcbiAgICBjb25zdCBkaXN0aW5jdE1lc3NhZ2VzID0gZXJyb3IgPyBbLi4ubmV3IFNldChPYmplY3QudmFsdWVzKGVycm9yKSldLmpvaW4oJyAnKSA6ICcnO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxnPlxuICAgICAgICA8Zm9yZWlnbk9iamVjdFxuICAgICAgICAgIHg9e2JhbmRXaWR0aCA/IGJhclggOiB4IC0gYmFyV2lkdGggLyAyfVxuICAgICAgICAgIHk9ezZ9XG4gICAgICAgICAgd2lkdGg9e2JhcldpZHRofVxuICAgICAgICAgIGhlaWdodD17NH1cbiAgICAgICAgICBzdHlsZT17eyBwb2ludGVyRXZlbnRzOiAnbm9uZScsIG92ZXJmbG93OiAndmlzaWJsZScgfX1cbiAgICAgICAgPlxuICAgICAgICAgIHtpbmRleCA9PT0gMCAmJiAoXG4gICAgICAgICAgICA8TWFya0xhYmVsXG4gICAgICAgICAgICAgIGlzSGlkZGVuTGFiZWw9e3RydWV9XG4gICAgICAgICAgICAgIGlucHV0UmVmPXtoaWRkZW5MYWJlbFJlZn1cbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RydWV9XG4gICAgICAgICAgICAgIG1hcms9e2xvbmdlc3RDYXRlZ29yeX1cbiAgICAgICAgICAgICAgZ3JhcGhQcm9wcz17Z3JhcGhQcm9wc31cbiAgICAgICAgICAgICAgYmFyV2lkdGg9e2JhcldpZHRofVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAgPE1hcmtMYWJlbFxuICAgICAgICAgICAgYXV0b0ZvY3VzPXtkZWZpbmVDaGFydCAmJiBhdXRvRm9jdXN9XG4gICAgICAgICAgICBpbnB1dFJlZj17KHIpID0+ICh0aGlzLmlucHV0ID0gcil9XG4gICAgICAgICAgICBkaXNhYmxlZD17IWRlZmluZUNoYXJ0ICYmICFlZGl0YWJsZX1cbiAgICAgICAgICAgIG1hcms9e2NhdGVnb3J5fVxuICAgICAgICAgICAgZ3JhcGhQcm9wcz17Z3JhcGhQcm9wc31cbiAgICAgICAgICAgIG9uQ2hhbmdlPXsobmV3TGFiZWwpID0+IHRoaXMuY2hhbmdlQ2F0ZWdvcnkoaW5kZXgsIG5ld0xhYmVsKX1cbiAgICAgICAgICAgIGJhcldpZHRoPXtiYXJXaWR0aH1cbiAgICAgICAgICAgIHJvdGF0ZT17cm90YXRlfVxuICAgICAgICAgICAgY29ycmVjdG5lc3M9e2NvcnJlY3RuZXNzfVxuICAgICAgICAgICAgZXJyb3I9e2Vycm9yICYmIGVycm9yW2luZGV4XX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2ZvcmVpZ25PYmplY3Q+XG5cbiAgICAgICAge2Vycm9yICYmIGluZGV4ID09PSAwICYmIChcbiAgICAgICAgICA8dGV4dCBjbGFzc05hbWU9e2NsYXNzZXMuZXJyb3J9IHk9e3kgKyAyM30gaGVpZ2h0PXs2fSB0ZXh0QW5jaG9yPVwic3RhcnRcIj5cbiAgICAgICAgICAgIHtkaXN0aW5jdE1lc3NhZ2VzfVxuICAgICAgICAgIDwvdGV4dD5cbiAgICAgICAgKX1cblxuICAgICAgICB7ZGVsZXRhYmxlICYmICFjb3JyZWN0bmVzcyAmJiAoXG4gICAgICAgICAgPGxpbmUgeDE9e3h9IHkxPXswfSB4Mj17eH0geTI9e3kgKyA0ICsgdG9wfSBjbGFzc05hbWU9e2NsYXNzZXMuZG90dGVkTGluZX0gc3Ryb2tlRGFzaGFycmF5PVwiNCAyXCIgLz5cbiAgICAgICAgKX1cblxuICAgICAgICB7ZGVsZXRhYmxlICYmICFjb3JyZWN0bmVzcyAmJiAoXG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICB4PXt4IC0gOH1cbiAgICAgICAgICAgIHk9e3kgKyA2MCArIHRvcH1cbiAgICAgICAgICAgIHdpZHRoPXsxNn1cbiAgICAgICAgICAgIGhlaWdodD17MTZ9XG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDUxMiA1MTJcIlxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdGhpcy5kZWxldGVDYXRlZ29yeShpbmRleCl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0xMjggNDA1LjQyOUMxMjggNDI4Ljg0NiAxNDcuMTk4IDQ0OCAxNzAuNjY3IDQ0OGgxNzAuNjY3QzM2NC44MDIgNDQ4IDM4NCA0MjguODQ2IDM4NCA0MDUuNDI5VjE2MEgxMjh2MjQ1LjQyOXpNNDE2IDk2aC04MGwtMjYuNzg1LTMySDIwMi43ODZMMTc2IDk2SDk2djMyaDMyMFY5NnpcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICApfVxuXG4gICAgICAgIHtkZWZpbmVDaGFydCAmJiBpbmRleCA9PT0gMCAmJiAoXG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgeD17LTU1fVxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgb3ZlcmZsb3c6ICd2aXNpYmxlJyxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge2NoYW5nZUludGVyYWN0aXZlRW5hYmxlZCAmJiAoXG4gICAgICAgICAgICAgIDx0ZXh0XG4gICAgICAgICAgICAgICAgeT17eSArIDkwICsgdG9wfVxuICAgICAgICAgICAgICAgIHdpZHRoPXtiYXJXaWR0aH1cbiAgICAgICAgICAgICAgICBoZWlnaHQ9ezR9XG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgICAgICAgICAgICAgd29yZEJyZWFrOiAnYnJlYWstd29yZCcsXG4gICAgICAgICAgICAgICAgICBtYXhXaWR0aDogYmFyV2lkdGgsXG4gICAgICAgICAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3RoaXMuc3BsaXRUZXh0KGNoYW5nZUludGVyYWN0aXZlPy5hdXRob3JpbmdMYWJlbCwgMjApLm1hcCgod29yZCwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICAgIDx0c3BhbiBrZXk9e2luZGV4fSB4PVwiMFwiIGR5PXtgJHtpbmRleCA+IDAgPyAnMS4yZW0nIDogJy42ZW0nfWB9PlxuICAgICAgICAgICAgICAgICAgICB7d29yZH1cbiAgICAgICAgICAgICAgICAgIDwvdHNwYW4+XG4gICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgIDwvdGV4dD5cbiAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgIHtjaGFuZ2VFZGl0YWJsZUVuYWJsZWQgJiYgKFxuICAgICAgICAgICAgICA8dGV4dFxuICAgICAgICAgICAgICAgIHk9e3kgKyAxNDUgKyB0b3B9XG4gICAgICAgICAgICAgICAgd2lkdGg9e2JhcldpZHRofVxuICAgICAgICAgICAgICAgIGhlaWdodD17NH1cbiAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgICB3b3JkQnJlYWs6ICdicmVhay13b3JkJyxcbiAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiBiYXJXaWR0aCxcbiAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7dGhpcy5zcGxpdFRleHQoY2hhbmdlRWRpdGFibGU/LmF1dGhvcmluZ0xhYmVsLCAyMCkubWFwKCh3b3JkLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgICAgPHRzcGFuIGtleT17aW5kZXh9IHg9XCIwXCIgZHk9e2Ake2luZGV4ID4gMCA/ICcxLjJlbScgOiAnLjZlbSd9YH0+XG4gICAgICAgICAgICAgICAgICAgIHt3b3JkfVxuICAgICAgICAgICAgICAgICAgPC90c3Bhbj5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPC90ZXh0PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgKX1cblxuICAgICAgICB7ZGVmaW5lQ2hhcnQgJiYgY2hhbmdlSW50ZXJhY3RpdmVFbmFibGVkICYmIChcbiAgICAgICAgICA8Zm9yZWlnbk9iamVjdFxuICAgICAgICAgICAgeD17eCAtIDI0fVxuICAgICAgICAgICAgeT17eSArIDgwICsgdG9wfVxuICAgICAgICAgICAgd2lkdGg9e2JhcldpZHRofVxuICAgICAgICAgICAgaGVpZ2h0PXs0fVxuICAgICAgICAgICAgc3R5bGU9e3sgcG9pbnRlckV2ZW50czogJ3Zpc2libGUnLCBvdmVyZmxvdzogJ3Zpc2libGUnIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5jdXN0b21Db2xvcn1cbiAgICAgICAgICAgICAgc3R5bGU9e3sgcG9zaXRpb246ICdmaXhlZCcgfX1cbiAgICAgICAgICAgICAgY2hlY2tlZD17aW50ZXJhY3RpdmV9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gdGhpcy5jaGFuZ2VJbnRlcmFjdGl2ZShpbmRleCwgZS50YXJnZXQuY2hlY2tlZCl9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZm9yZWlnbk9iamVjdD5cbiAgICAgICAgKX1cblxuICAgICAgICB7ZGVmaW5lQ2hhcnQgJiYgY2hhbmdlRWRpdGFibGVFbmFibGVkICYmIChcbiAgICAgICAgICA8Zm9yZWlnbk9iamVjdFxuICAgICAgICAgICAgeD17eCAtIDI0fVxuICAgICAgICAgICAgeT17eSArIDEzMCArIHRvcH1cbiAgICAgICAgICAgIHdpZHRoPXtiYXJXaWR0aH1cbiAgICAgICAgICAgIGhlaWdodD17NH1cbiAgICAgICAgICAgIHN0eWxlPXt7IHBvaW50ZXJFdmVudHM6ICd2aXNpYmxlJywgb3ZlcmZsb3c6ICd2aXNpYmxlJyB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMuY3VzdG9tQ29sb3J9XG4gICAgICAgICAgICAgIHN0eWxlPXt7IHBvc2l0aW9uOiAnZml4ZWQnIH19XG4gICAgICAgICAgICAgIGNoZWNrZWQ9e2VkaXRhYmxlfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHRoaXMuY2hhbmdlRWRpdGFibGUoaW5kZXgsIGUudGFyZ2V0LmNoZWNrZWQpfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2ZvcmVpZ25PYmplY3Q+XG4gICAgICAgICl9XG5cbiAgICAgICAgPGZvcmVpZ25PYmplY3RcbiAgICAgICAgICB4PXt4IC0gMjR9XG4gICAgICAgICAgeT17eSArIDEwMCArIHRvcH1cbiAgICAgICAgICB3aWR0aD17YmFyV2lkdGh9XG4gICAgICAgICAgaGVpZ2h0PXs0fVxuICAgICAgICAgIHN0eWxlPXt7IHBvaW50ZXJFdmVudHM6ICd2aXNpYmxlJywgb3ZlcmZsb3c6ICd2aXNpYmxlJyB9fVxuICAgICAgICA+XG4gICAgICAgICAgPEFsZXJ0RGlhbG9nXG4gICAgICAgICAgICBvcGVuPXtkaWFsb2cub3Blbn1cbiAgICAgICAgICAgIHRpdGxlPXtkaWFsb2cudGl0bGV9XG4gICAgICAgICAgICB0ZXh0PXtkaWFsb2cudGV4dH1cbiAgICAgICAgICAgIG9uQ2xvc2U9e2RpYWxvZy5vbkNsb3NlfVxuICAgICAgICAgICAgb25Db25maXJtPXtkaWFsb2cub25Db25maXJtfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZm9yZWlnbk9iamVjdD5cbiAgICAgIDwvZz5cbiAgICApO1xuICB9XG59XG5cblRpY2tDb21wb25lbnQucHJvcFR5cGVzID0ge1xuICBjYXRlZ29yaWVzOiBQcm9wVHlwZXMuYXJyYXksXG4gIHhCYW5kOiBQcm9wVHlwZXMuZnVuYyxcbiAgYmFuZFdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLFxuICBiYXJXaWR0aDogUHJvcFR5cGVzLm51bWJlcixcbiAgcm90YXRlOiBQcm9wVHlwZXMubnVtYmVyLFxuICB0b3A6IFByb3BUeXBlcy5udW1iZXIsXG4gIHg6IFByb3BUeXBlcy5udW1iZXIsXG4gIHk6IFByb3BUeXBlcy5udW1iZXIsXG4gIGdyYXBoUHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG4gIGZvcm1hdHRlZFZhbHVlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBvbkNoYW5nZUNhdGVnb3J5OiBQcm9wVHlwZXMuZnVuYyxcbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuICBlcnJvcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgZGVmaW5lQ2hhcnQ6IFByb3BUeXBlcy5ib29sLFxuICBjaGFydGluZ09wdGlvbnM6IFByb3BUeXBlcy5vYmplY3QsXG4gIGNoYW5nZUludGVyYWN0aXZlRW5hYmxlZDogUHJvcFR5cGVzLmJvb2wsXG4gIGNoYW5nZUVkaXRhYmxlRW5hYmxlZDogUHJvcFR5cGVzLmJvb2wsXG4gIGF1dG9Gb2N1czogUHJvcFR5cGVzLmJvb2wsXG4gIG9uQXV0b0ZvY3VzVXNlZDogUHJvcFR5cGVzLmZ1bmMsXG59O1xuXG5leHBvcnQgY2xhc3MgUmF3Q2hhcnRBeGVzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBib3R0b21TY2FsZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgIGNhdGVnb3JpZXM6IFByb3BUeXBlcy5hcnJheSxcbiAgICBkZWZpbmVDaGFydDogUHJvcFR5cGVzLmJvb2wsXG4gICAgZXJyb3I6IFByb3BUeXBlcy5hbnksXG4gICAgZ3JhcGhQcm9wczogdHlwZXMuR3JhcGhQcm9wc1R5cGUuaXNSZXF1aXJlZCxcbiAgICB4QmFuZDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgbGVmdEF4aXM6IFByb3BUeXBlcy5ib29sLFxuICAgIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvbkNoYW5nZUNhdGVnb3J5OiBQcm9wVHlwZXMuZnVuYyxcbiAgICB0b3A6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgdGhlbWU6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgY2hhcnRpbmdPcHRpb25zOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGNoYW5nZUludGVyYWN0aXZlRW5hYmxlZDogUHJvcFR5cGVzLmJvb2wsXG4gICAgY2hhbmdlRWRpdGFibGVFbmFibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBhdXRvRm9jdXM6IFByb3BUeXBlcy5ib29sLFxuICAgIG9uQXV0b0ZvY3VzVXNlZDogUHJvcFR5cGVzLmZ1bmMsXG4gIH07XG5cbiAgc3RhdGUgPSB7IGhlaWdodDogMCwgd2lkdGg6IDAgfTtcblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBpZiAodGhpcy5oaWRkZW5MYWJlbFJlZikge1xuICAgICAgY29uc3QgYm91bmRpbmdDbGllbnRSZWN0ID0gdGhpcy5oaWRkZW5MYWJlbFJlZi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBoZWlnaHQ6IE1hdGguZmxvb3IoYm91bmRpbmdDbGllbnRSZWN0LmhlaWdodCksXG4gICAgICAgIHdpZHRoOiBNYXRoLmZsb29yKGJvdW5kaW5nQ2xpZW50UmVjdC53aWR0aCksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIHNuYXBzaG90KSB7XG4gICAgaWYgKHRoaXMuaGlkZGVuTGFiZWxSZWYpIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5mbG9vcih0aGlzLmhpZGRlbkxhYmVsUmVmLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKTtcblxuICAgICAgaWYgKHdpZHRoICE9PSB0aGlzLnN0YXRlLndpZHRoKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyB3aWR0aCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2xhc3NlcyxcbiAgICAgIGdyYXBoUHJvcHMsXG4gICAgICB4QmFuZCxcbiAgICAgIGxlZnRBeGlzLFxuICAgICAgb25DaGFuZ2UsXG4gICAgICBvbkNoYW5nZUNhdGVnb3J5LFxuICAgICAgY2F0ZWdvcmllcyA9IFtdLFxuICAgICAgdG9wLFxuICAgICAgZGVmaW5lQ2hhcnQsXG4gICAgICBjaGFydGluZ09wdGlvbnMsXG4gICAgICBjaGFuZ2VJbnRlcmFjdGl2ZUVuYWJsZWQsXG4gICAgICBjaGFuZ2VFZGl0YWJsZUVuYWJsZWQsXG4gICAgICB0aGVtZSxcbiAgICAgIGF1dG9Gb2N1cyxcbiAgICAgIG9uQXV0b0ZvY3VzVXNlZCxcbiAgICAgIGVycm9yLFxuICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgY29uc3QgeyBheGlzLCBheGlzTGluZSwgdGljayB9ID0gY2xhc3NlcztcbiAgICBjb25zdCB7IHNjYWxlID0ge30sIHJhbmdlID0ge30sIGRvbWFpbiA9IHt9LCBzaXplID0ge30gfSA9IGdyYXBoUHJvcHMgfHwge307XG4gICAgY29uc3QgeyBoZWlnaHQsIHdpZHRoIH0gPSB0aGlzLnN0YXRlO1xuXG4gICAgY29uc3QgYm90dG9tU2NhbGUgPSB4QmFuZCAmJiB0eXBlb2YgeEJhbmQucmFuZ2VSb3VuZCA9PT0gJ2Z1bmN0aW9uJyAmJiB4QmFuZC5yYW5nZVJvdW5kKFswLCBzaXplLndpZHRoXSk7XG5cbiAgICBjb25zdCBiYW5kV2lkdGggPSB4QmFuZCAmJiB0eXBlb2YgeEJhbmQuYmFuZHdpZHRoID09PSAnZnVuY3Rpb24nICYmIHhCYW5kLmJhbmR3aWR0aCgpO1xuICAgIC8vIGZvciBjaGFydFR5cGUgXCJsaW5lXCIsIGJhbmRXaWR0aCB3aWxsIGJlIDAsIHNvIHdlIGhhdmUgdG8gY2FsY3VsYXRlIGl0XG4gICAgY29uc3QgYmFyV2lkdGggPSBiYW5kV2lkdGggfHwgKHNjYWxlLnggJiYgc2NhbGUueChkb21haW4ubWF4KSAvIGNhdGVnb3JpZXMubGVuZ3RoKTtcblxuICAgIGNvbnN0IHJvd1RpY2tWYWx1ZXMgPSBnZXRUaWNrVmFsdWVzKHsgLi4ucmFuZ2UsIHN0ZXA6IHJhbmdlLmxhYmVsU3RlcCB9KTtcbiAgICBjb25zdCBmb250U2l6ZSA9IHRoZW1lICYmIHRoZW1lLnR5cG9ncmFwaHkgPyB0aGVtZS50eXBvZ3JhcGh5LmZvbnRTaXplIDogMTQ7XG4gICAgLy8gdGhpcyBtb3N0bHkgYXBwbGllcyBmb3IgbGFiZWxzIHRoYXQgYXJlIG5vdCBlZGl0YWJsZVxuICAgIGNvbnN0IHJvdGF0ZUJlY2F1c2VPZkhlaWdodCA9IGdldFJvdGF0ZUFuZ2xlKGZvbnRTaXplLCBoZWlnaHQpO1xuICAgIC8vIHRoaXMgYXBwbGllcyBmb3IgbGFiZWxzIHRoYXQgYXJlIGVkaXRhYmxlXG4gICAgY29uc3Qgcm90YXRlQmVjYXVzZU9mV2lkdGggPSB3aWR0aCA+IGJhcldpZHRoID8gMjUgOiAwO1xuXG4gICAgY29uc3QgZ2V0VGlja0xhYmVsUHJvcHMgPSAodmFsdWUpID0+ICh7XG4gICAgICBkeTogNCxcbiAgICAgIGR4OiAtMTAgLSAodmFsdWUudG9Mb2NhbGVTdHJpbmcoKS5sZW5ndGggfHwgMSkgKiA1LFxuICAgIH0pO1xuXG4gICAgY29uc3QgZ2V0VGlja0NvbXBvbmVudCA9IChwcm9wcykgPT4ge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IHtcbiAgICAgICAgaGlkZGVuTGFiZWxSZWY6IChyZWYpID0+IHtcbiAgICAgICAgICB0aGlzLmhpZGRlbkxhYmVsUmVmID0gcmVmO1xuICAgICAgICB9LFxuICAgICAgICBjbGFzc2VzLFxuICAgICAgICBjYXRlZ29yaWVzLFxuICAgICAgICB4QmFuZCxcbiAgICAgICAgYmFuZFdpZHRoLFxuICAgICAgICBiYXJXaWR0aCxcbiAgICAgICAgcm90YXRlOiByb3RhdGVCZWNhdXNlT2ZIZWlnaHQgfHwgcm90YXRlQmVjYXVzZU9mV2lkdGgsXG4gICAgICAgIHRvcCxcbiAgICAgICAgZGVmaW5lQ2hhcnQsXG4gICAgICAgIGNoYXJ0aW5nT3B0aW9ucyxcbiAgICAgICAgYXV0b0ZvY3VzLFxuICAgICAgICBvbkF1dG9Gb2N1c1VzZWQsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBvbkNoYW5nZUNhdGVnb3J5LFxuICAgICAgICBjaGFuZ2VJbnRlcmFjdGl2ZUVuYWJsZWQsXG4gICAgICAgIGNoYW5nZUVkaXRhYmxlRW5hYmxlZCxcbiAgICAgICAgb25DaGFuZ2UsXG4gICAgICAgIGdyYXBoUHJvcHMsXG4gICAgICAgIHg6IHByb3BzLngsXG4gICAgICAgIHk6IHByb3BzLnksXG4gICAgICAgIGZvcm1hdHRlZFZhbHVlOiBwcm9wcy5mb3JtYXR0ZWRWYWx1ZSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiA8VGlja0NvbXBvbmVudCB7Li4ucHJvcGVydGllc30gLz47XG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICA8UmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgIHtsZWZ0QXhpcyAmJiAoXG4gICAgICAgICAgPEF4aXNMZWZ0XG4gICAgICAgICAgICBzY2FsZT17c2NhbGUueX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17YXhpc31cbiAgICAgICAgICAgIGF4aXNMaW5lQ2xhc3NOYW1lPXtheGlzTGluZX1cbiAgICAgICAgICAgIHRpY2tMZW5ndGg9ezEwfVxuICAgICAgICAgICAgdGlja0NsYXNzTmFtZT17dGlja31cbiAgICAgICAgICAgIHRpY2tGb3JtYXQ9eyh2YWx1ZSkgPT4gdmFsdWV9XG4gICAgICAgICAgICB0aWNrVmFsdWVzPXtyb3dUaWNrVmFsdWVzfVxuICAgICAgICAgICAgdGlja0xhYmVsUHJvcHM9e2dldFRpY2tMYWJlbFByb3BzfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICAgIDxBeGlzQm90dG9tXG4gICAgICAgICAgYXhpc0xpbmVDbGFzc05hbWU9e2F4aXNMaW5lfVxuICAgICAgICAgIHRpY2tDbGFzc05hbWU9e3RpY2t9XG4gICAgICAgICAgc2NhbGU9e2JvdHRvbVNjYWxlfVxuICAgICAgICAgIGxhYmVsUHJvcHM9e3sgeTogNjAgKyB0b3AgfX1cbiAgICAgICAgICB0b3A9e3NjYWxlLnkgJiYgc2NhbGUueShyYW5nZS5taW4pfVxuICAgICAgICAgIHRleHRMYWJlbFByb3BzPXsoKSA9PiAoeyB0ZXh0QW5jaG9yOiAnbWlkZGxlJyB9KX1cbiAgICAgICAgICB0aWNrRm9ybWF0PXsoY291bnQpID0+IGNvdW50fVxuICAgICAgICAgIHRpY2tDb21wb25lbnQ9e2dldFRpY2tDb21wb25lbnR9XG4gICAgICAgICAgYXV0b0ZvY3VzPXthdXRvRm9jdXN9XG4gICAgICAgICAgb25BdXRvRm9jdXNVc2VkPXtvbkF1dG9Gb2N1c1VzZWR9XG4gICAgICAgIC8+XG4gICAgICA8L1JlYWN0LkZyYWdtZW50PlxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgQ2hhcnRBeGVzID0gd2l0aFN0eWxlcyhcbiAgKHRoZW1lKSA9PiAoe1xuICAgIGF4aXM6IHtcbiAgICAgIHN0cm9rZTogY29sb3IucHJpbWFyeURhcmsoKSxcbiAgICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgIH0sXG4gICAgYXhpc0xpbmU6IHtcbiAgICAgIHN0cm9rZTogY29sb3IucHJpbWFyeURhcmsoKSxcbiAgICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgIH0sXG4gICAgdGljazoge1xuICAgICAgJyYgPiBsaW5lJzoge1xuICAgICAgICBzdHJva2U6IGNvbG9yLnByaW1hcnlEYXJrKCksXG4gICAgICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgICAgfSxcbiAgICAgIGZpbGw6IGNvbG9yLnByaW1hcnlEYXJrKCksXG4gICAgICBmb250RmFtaWx5OiB0aGVtZS50eXBvZ3JhcGh5LmJvZHkxLmZvbnRGYW1pbHksXG4gICAgICBmb250U2l6ZTogdGhlbWUudHlwb2dyYXBoeS5mb250U2l6ZSxcbiAgICAgIHRleHRBbmNob3I6ICdtaWRkbGUnLFxuICAgIH0sXG4gICAgZG90dGVkTGluZToge1xuICAgICAgc3Ryb2tlOiBjb2xvci5wcmltYXJ5TGlnaHQoKSxcbiAgICAgIG9wYWNpdHk6IDAuMixcbiAgICB9LFxuICAgIGVycm9yOiB7XG4gICAgICBmb250U2l6ZTogdGhlbWUudHlwb2dyYXBoeS5mb250U2l6ZSAtIDIsXG4gICAgICBmaWxsOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgfSxcbiAgICBjdXN0b21Db2xvcjoge1xuICAgICAgY29sb3I6IGAke2NvbG9yLnRlcnRpYXJ5KCl9ICFpbXBvcnRhbnRgXG4gICAgfSxcbiAgfSksXG4gIHsgd2l0aFRoZW1lOiB0cnVlIH0sXG4pKFJhd0NoYXJ0QXhlcyk7XG5cbmV4cG9ydCBkZWZhdWx0IENoYXJ0QXhlcztcbiJdfQ==