@pie-lib/rubric 0.28.3-next.2 → 0.28.4-next.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.
- package/CHANGELOG.md +6 -76
- package/lib/__tests__/rubric.test.js +213 -0
- package/lib/authoring.js +222 -302
- package/lib/authoring.js.map +1 -1
- package/lib/index.js +2 -6
- package/lib/index.js.map +1 -1
- package/lib/point-menu.js +28 -75
- package/lib/point-menu.js.map +1 -1
- package/package.json +10 -17
- package/src/__tests__/rubric.test.jsx +127 -39
- package/src/authoring.jsx +163 -198
- package/src/point-menu.jsx +8 -15
- package/esm/index.css +0 -847
- package/esm/index.js +0 -226008
- package/esm/index.js.map +0 -1
- package/esm/package.json +0 -3
- package/src/__tests__/__snapshots__/rubric.test.jsx.snap +0 -48
package/CHANGELOG.md
CHANGED
|
@@ -7,153 +7,83 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline
|
|
|
7
7
|
|
|
8
8
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
10
|
## [0.28.1](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.24.2...@pie-lib/rubric@0.28.1) (2025-10-22)
|
|
15
11
|
|
|
16
12
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
17
13
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
14
|
# [0.28.0](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.27.0...@pie-lib/rubric@0.28.0) (2025-10-16)
|
|
23
15
|
|
|
24
16
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
25
17
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
18
|
# [0.27.0](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.24.0...@pie-lib/rubric@0.27.0) (2025-10-16)
|
|
31
19
|
|
|
32
20
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
33
21
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
22
|
# [0.26.0](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.24.0...@pie-lib/rubric@0.26.0) (2025-10-16)
|
|
39
23
|
|
|
40
24
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
41
25
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
26
|
# [0.25.0](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.24.0...@pie-lib/rubric@0.25.0) (2025-10-16)
|
|
47
27
|
|
|
48
28
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
49
29
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
30
|
## [0.24.2](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.24.1...@pie-lib/rubric@0.24.2) (2025-10-14)
|
|
55
31
|
|
|
56
32
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
57
33
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
34
|
## [0.24.1](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.24.0...@pie-lib/rubric@0.24.1) (2025-10-09)
|
|
63
35
|
|
|
64
36
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
65
37
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
38
|
# [0.24.0](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.31...@pie-lib/rubric@0.24.0) (2025-09-25)
|
|
71
39
|
|
|
72
|
-
|
|
73
40
|
### Bug Fixes
|
|
74
41
|
|
|
75
|
-
|
|
76
|
-
|
|
42
|
+
- fixed pie-lib/icons import [PD-5126](<[dcb506c](https://github.com/pie-framework/pie-lib/commit/dcb506c914a177f6d88bf73247a023bfe71dac1f)>)
|
|
77
43
|
|
|
78
44
|
### Features
|
|
79
45
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
46
|
+
- split pie-toolbox into multiple packages [PD-5126](<[7d55a25](https://github.com/pie-framework/pie-lib/commit/7d55a2552d084cd3d0d5c00dc77411b2ced2f5e2)>)
|
|
85
47
|
|
|
86
48
|
# [0.23.0](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.22.0...@pie-lib/rubric@0.23.0) (2025-09-18)
|
|
87
49
|
|
|
88
50
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
89
51
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
52
|
# [0.22.0](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.21.0...@pie-lib/rubric@0.22.0) (2025-09-18)
|
|
95
53
|
|
|
96
54
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
97
55
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
56
|
# [0.21.0](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.31...@pie-lib/rubric@0.21.0) (2025-09-18)
|
|
103
57
|
|
|
104
|
-
|
|
105
58
|
### Bug Fixes
|
|
106
59
|
|
|
107
|
-
|
|
108
|
-
|
|
60
|
+
- fixed pie-lib/icons import [PD-5126](<[dcb506c](https://github.com/pie-framework/pie-lib/commit/dcb506c914a177f6d88bf73247a023bfe71dac1f)>)
|
|
109
61
|
|
|
110
62
|
### Features
|
|
111
63
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
64
|
+
- split pie-toolbox into multiple packages [PD-5126](<[7d55a25](https://github.com/pie-framework/pie-lib/commit/7d55a2552d084cd3d0d5c00dc77411b2ced2f5e2)>)
|
|
117
65
|
|
|
118
66
|
# [0.20.0](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.19.0...@pie-lib/rubric@0.20.0) (2025-09-17)
|
|
119
67
|
|
|
120
68
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
121
69
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
70
|
# [0.19.0](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.18.0...@pie-lib/rubric@0.19.0) (2025-09-17)
|
|
127
71
|
|
|
128
72
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
129
73
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
74
|
# [0.18.0](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.17.1...@pie-lib/rubric@0.18.0) (2025-09-17)
|
|
135
75
|
|
|
136
76
|
**Note:** Version bump only for package @pie-lib/rubric
|
|
137
77
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
78
|
## [0.17.1](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.31...@pie-lib/rubric@0.17.1) (2025-08-11)
|
|
143
79
|
|
|
144
|
-
|
|
145
80
|
### Bug Fixes
|
|
146
81
|
|
|
147
|
-
|
|
148
|
-
|
|
82
|
+
- fixed pie-lib/icons import [PD-5126](<[dcb506c](https://github.com/pie-framework/pie-lib/commit/dcb506c914a177f6d88bf73247a023bfe71dac1f)>)
|
|
149
83
|
|
|
150
84
|
### Features
|
|
151
85
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
86
|
+
- split pie-toolbox into multiple packages [PD-5126](<[7d55a25](https://github.com/pie-framework/pie-lib/commit/7d55a2552d084cd3d0d5c00dc77411b2ced2f5e2)>)
|
|
157
87
|
|
|
158
88
|
# [0.17.0](https://github.com/pie-framework/pie-lib/compare/@pie-lib/rubric@0.8.31...@pie-lib/rubric@0.17.0) (2025-08-07)
|
|
159
89
|
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
5
|
+
var _react = require("@testing-library/react");
|
|
6
|
+
var _react2 = _interopRequireDefault(require("react"));
|
|
7
|
+
var _authoring = require("../authoring");
|
|
8
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
9
|
+
var _styles = require("@mui/material/styles");
|
|
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
|
+
// Mock dependencies
|
|
13
|
+
jest.mock('@pie-lib/editable-html', function () {
|
|
14
|
+
return function EditableHtml(props) {
|
|
15
|
+
return /*#__PURE__*/_react2["default"].createElement("div", {
|
|
16
|
+
"data-testid": "editable-html",
|
|
17
|
+
"data-markup": props.markup
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
jest.mock('@pie-lib/config-ui', function () {
|
|
22
|
+
return {
|
|
23
|
+
FeedbackConfig: function FeedbackConfig(_ref) {
|
|
24
|
+
var feedback = _ref.feedback;
|
|
25
|
+
return /*#__PURE__*/_react2["default"].createElement("div", {
|
|
26
|
+
"data-testid": "feedback-config"
|
|
27
|
+
}, JSON.stringify(feedback));
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
jest.mock('@hello-pangea/dnd', function () {
|
|
32
|
+
return {
|
|
33
|
+
DragDropContext: function DragDropContext(_ref2) {
|
|
34
|
+
var children = _ref2.children;
|
|
35
|
+
return /*#__PURE__*/_react2["default"].createElement("div", {
|
|
36
|
+
"data-testid": "drag-drop-context"
|
|
37
|
+
}, children);
|
|
38
|
+
},
|
|
39
|
+
Droppable: function Droppable(_ref3) {
|
|
40
|
+
var children = _ref3.children;
|
|
41
|
+
return children({
|
|
42
|
+
droppableProps: {},
|
|
43
|
+
innerRef: function innerRef() {}
|
|
44
|
+
}, {});
|
|
45
|
+
},
|
|
46
|
+
Draggable: function Draggable(_ref4) {
|
|
47
|
+
var children = _ref4.children,
|
|
48
|
+
index = _ref4.index;
|
|
49
|
+
return children({
|
|
50
|
+
innerRef: function innerRef() {},
|
|
51
|
+
draggableProps: {
|
|
52
|
+
'data-draggable-index': index
|
|
53
|
+
},
|
|
54
|
+
dragHandleProps: {}
|
|
55
|
+
}, {});
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
describe('Rubric', function () {
|
|
60
|
+
var points = ['nothing right', 'a teeny bit right', 'mostly right', 'bingo'];
|
|
61
|
+
var sampleAnswers = [null, 'just right', 'not left', null];
|
|
62
|
+
var theme = (0, _styles.createTheme)();
|
|
63
|
+
var renderComponent = function renderComponent() {
|
|
64
|
+
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
65
|
+
var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
66
|
+
var defaultProps = _objectSpread({
|
|
67
|
+
classes: {},
|
|
68
|
+
onChange: jest.fn(),
|
|
69
|
+
className: 'className',
|
|
70
|
+
value: _objectSpread({
|
|
71
|
+
excludeZero: false,
|
|
72
|
+
points: points,
|
|
73
|
+
sampleAnswers: sampleAnswers
|
|
74
|
+
}, value)
|
|
75
|
+
}, props);
|
|
76
|
+
return _objectSpread(_objectSpread({}, (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_styles.ThemeProvider, {
|
|
77
|
+
theme: theme
|
|
78
|
+
}, /*#__PURE__*/_react2["default"].createElement(_authoring.RawAuthoring, defaultProps)))), {}, {
|
|
79
|
+
onChange: defaultProps.onChange,
|
|
80
|
+
props: defaultProps
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
describe('render', function () {
|
|
84
|
+
it('renders rubric title and main structure', function () {
|
|
85
|
+
renderComponent();
|
|
86
|
+
expect(_react.screen.getByText('Rubric')).toBeInTheDocument();
|
|
87
|
+
expect(_react.screen.getByLabelText('Max Points')).toBeInTheDocument();
|
|
88
|
+
expect(_react.screen.getByLabelText('Exclude zeros')).toBeInTheDocument();
|
|
89
|
+
});
|
|
90
|
+
it('renders all point configurations', function () {
|
|
91
|
+
var _renderComponent = renderComponent(),
|
|
92
|
+
container = _renderComponent.container;
|
|
93
|
+
// Verify DragDropContext is rendered
|
|
94
|
+
expect(container.querySelector('[data-testid="drag-drop-context"]')).toBeInTheDocument();
|
|
95
|
+
|
|
96
|
+
// Check that point labels are rendered (4 points = "3 pts", "2 pts", "1 pt", "0 pt")
|
|
97
|
+
// Note: The PointConfig component uses singular "pt" for 0 and 1, plural "pts" for 2+
|
|
98
|
+
expect(_react.screen.getByText('3 pts')).toBeInTheDocument();
|
|
99
|
+
expect(_react.screen.getByText('2 pts')).toBeInTheDocument();
|
|
100
|
+
expect(_react.screen.getByText('1 pt')).toBeInTheDocument();
|
|
101
|
+
expect(_react.screen.getByText('0 pt')).toBeInTheDocument();
|
|
102
|
+
});
|
|
103
|
+
describe('draggable', function () {
|
|
104
|
+
it('renders 3 draggable items when excludeZero is true', function () {
|
|
105
|
+
var _renderComponent2 = renderComponent({
|
|
106
|
+
excludeZero: true
|
|
107
|
+
}),
|
|
108
|
+
container = _renderComponent2.container;
|
|
109
|
+
|
|
110
|
+
// When excludeZero is true, the last point (0 pts) should not be rendered
|
|
111
|
+
// So we should have 3 draggable items
|
|
112
|
+
var draggableItems = container.querySelectorAll('[data-draggable-index]');
|
|
113
|
+
expect(draggableItems.length).toEqual(3);
|
|
114
|
+
|
|
115
|
+
// Verify the 0 pt label is not rendered
|
|
116
|
+
expect(_react.screen.queryByText('0 pt')).not.toBeInTheDocument();
|
|
117
|
+
});
|
|
118
|
+
it('renders 4 draggable items when excludeZero is false', function () {
|
|
119
|
+
var _renderComponent3 = renderComponent({
|
|
120
|
+
excludeZero: false
|
|
121
|
+
}),
|
|
122
|
+
container = _renderComponent3.container;
|
|
123
|
+
|
|
124
|
+
// When excludeZero is false, all points including 0 should be rendered
|
|
125
|
+
var draggableItems = container.querySelectorAll('[data-draggable-index]');
|
|
126
|
+
expect(draggableItems.length).toEqual(4);
|
|
127
|
+
|
|
128
|
+
// Verify all point labels are rendered
|
|
129
|
+
expect(_react.screen.getByText('3 pts')).toBeInTheDocument();
|
|
130
|
+
expect(_react.screen.getByText('2 pts')).toBeInTheDocument();
|
|
131
|
+
expect(_react.screen.getByText('1 pt')).toBeInTheDocument();
|
|
132
|
+
expect(_react.screen.getByText('0 pt')).toBeInTheDocument();
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
describe('logic', function () {
|
|
137
|
+
describe('changeMaxPoints', function () {
|
|
138
|
+
var testChangeMaxPoints = function testChangeMaxPoints(maxPoints, excludeZero, expectedPoints, expectedSampleAnswers) {
|
|
139
|
+
it("maxPoints=".concat(maxPoints, ", excludeZero=").concat(excludeZero, " calls onChange correctly"), function () {
|
|
140
|
+
var _container$querySelec;
|
|
141
|
+
var _renderComponent4 = renderComponent({
|
|
142
|
+
excludeZero: excludeZero
|
|
143
|
+
}),
|
|
144
|
+
onChange = _renderComponent4.onChange,
|
|
145
|
+
container = _renderComponent4.container;
|
|
146
|
+
|
|
147
|
+
// Get the component instance through the container
|
|
148
|
+
// We need to call the method directly since we're testing internal behavior
|
|
149
|
+
var instance = (_container$querySelec = container.querySelector('[class*="MuiBox-root"]')) === null || _container$querySelec === void 0 ? void 0 : _container$querySelec._owner;
|
|
150
|
+
|
|
151
|
+
// Since we can't easily access instance methods in RTL, we'll test the behavior
|
|
152
|
+
// by verifying the onChange prop receives the correct values
|
|
153
|
+
// For now, we'll directly test the logic
|
|
154
|
+
var component = new _authoring.RawAuthoring({
|
|
155
|
+
value: {
|
|
156
|
+
excludeZero: excludeZero,
|
|
157
|
+
points: points,
|
|
158
|
+
sampleAnswers: sampleAnswers
|
|
159
|
+
},
|
|
160
|
+
onChange: onChange,
|
|
161
|
+
classes: {},
|
|
162
|
+
className: 'className'
|
|
163
|
+
});
|
|
164
|
+
component.changeMaxPoints(maxPoints);
|
|
165
|
+
expect(onChange).toHaveBeenCalledWith({
|
|
166
|
+
excludeZero: excludeZero,
|
|
167
|
+
points: expectedPoints,
|
|
168
|
+
sampleAnswers: expectedSampleAnswers,
|
|
169
|
+
maxPoints: expectedPoints.length - 1
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
};
|
|
173
|
+
testChangeMaxPoints(1, false, _lodash["default"].takeRight(points, 2), _lodash["default"].takeRight(sampleAnswers, 2));
|
|
174
|
+
testChangeMaxPoints(1, true, _lodash["default"].takeRight(points, 2), _lodash["default"].takeRight(sampleAnswers, 2));
|
|
175
|
+
testChangeMaxPoints(2, true, _lodash["default"].takeRight(points, 3), _lodash["default"].takeRight(sampleAnswers, 3));
|
|
176
|
+
testChangeMaxPoints(2, false, _lodash["default"].takeRight(points, 3), _lodash["default"].takeRight(sampleAnswers, 3));
|
|
177
|
+
testChangeMaxPoints(5, false, ['', ''].concat(points), [null, null].concat(sampleAnswers));
|
|
178
|
+
});
|
|
179
|
+
describe('changeSampleResponse', function () {
|
|
180
|
+
var testChangeSampleResponse = function testChangeSampleResponse(index, clickedItem, excludeZero, expectedPoints, expectedSampleAnswers) {
|
|
181
|
+
it("Point ".concat(index, " with clickedItem=\"").concat(clickedItem, "\" calls onChange correctly"), function () {
|
|
182
|
+
var _renderComponent5 = renderComponent({
|
|
183
|
+
excludeZero: excludeZero
|
|
184
|
+
}),
|
|
185
|
+
onChange = _renderComponent5.onChange;
|
|
186
|
+
|
|
187
|
+
// Test the logic by creating a component instance and calling the method
|
|
188
|
+
var component = new _authoring.RawAuthoring({
|
|
189
|
+
value: {
|
|
190
|
+
excludeZero: excludeZero,
|
|
191
|
+
points: points,
|
|
192
|
+
sampleAnswers: sampleAnswers
|
|
193
|
+
},
|
|
194
|
+
onChange: onChange,
|
|
195
|
+
classes: {},
|
|
196
|
+
className: 'className'
|
|
197
|
+
});
|
|
198
|
+
component.onPointMenuChange(index, clickedItem);
|
|
199
|
+
expect(onChange).toHaveBeenCalledWith({
|
|
200
|
+
excludeZero: excludeZero,
|
|
201
|
+
points: expectedPoints,
|
|
202
|
+
sampleAnswers: expectedSampleAnswers
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
};
|
|
206
|
+
testChangeSampleResponse(0, 'sample', false, points, ['', 'just right', 'not left', null]);
|
|
207
|
+
testChangeSampleResponse(3, 'sample', false, points, [null, 'just right', 'not left', '']);
|
|
208
|
+
testChangeSampleResponse(1, 'sample', true, points, [null, null, 'not left', null]);
|
|
209
|
+
testChangeSampleResponse(3, 'sample', true, points, [null, 'just right', 'not left', '']);
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX3JlYWN0MiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfYXV0aG9yaW5nIiwiX2xvZGFzaCIsIl9zdHlsZXMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImplc3QiLCJtb2NrIiwiRWRpdGFibGVIdG1sIiwicHJvcHMiLCJjcmVhdGVFbGVtZW50IiwibWFya3VwIiwiRmVlZGJhY2tDb25maWciLCJfcmVmIiwiZmVlZGJhY2siLCJKU09OIiwic3RyaW5naWZ5IiwiRHJhZ0Ryb3BDb250ZXh0IiwiX3JlZjIiLCJjaGlsZHJlbiIsIkRyb3BwYWJsZSIsIl9yZWYzIiwiZHJvcHBhYmxlUHJvcHMiLCJpbm5lclJlZiIsIkRyYWdnYWJsZSIsIl9yZWY0IiwiaW5kZXgiLCJkcmFnZ2FibGVQcm9wcyIsImRyYWdIYW5kbGVQcm9wcyIsImRlc2NyaWJlIiwicG9pbnRzIiwic2FtcGxlQW5zd2VycyIsInRoZW1lIiwiY3JlYXRlVGhlbWUiLCJyZW5kZXJDb21wb25lbnQiLCJ2YWx1ZSIsInVuZGVmaW5lZCIsImRlZmF1bHRQcm9wcyIsImNsYXNzZXMiLCJvbkNoYW5nZSIsImZuIiwiY2xhc3NOYW1lIiwiZXhjbHVkZVplcm8iLCJyZW5kZXIiLCJUaGVtZVByb3ZpZGVyIiwiUmF3QXV0aG9yaW5nIiwiaXQiLCJleHBlY3QiLCJzY3JlZW4iLCJnZXRCeVRleHQiLCJ0b0JlSW5UaGVEb2N1bWVudCIsImdldEJ5TGFiZWxUZXh0IiwiX3JlbmRlckNvbXBvbmVudCIsImNvbnRhaW5lciIsInF1ZXJ5U2VsZWN0b3IiLCJfcmVuZGVyQ29tcG9uZW50MiIsImRyYWdnYWJsZUl0ZW1zIiwicXVlcnlTZWxlY3RvckFsbCIsInRvRXF1YWwiLCJxdWVyeUJ5VGV4dCIsIm5vdCIsIl9yZW5kZXJDb21wb25lbnQzIiwidGVzdENoYW5nZU1heFBvaW50cyIsIm1heFBvaW50cyIsImV4cGVjdGVkUG9pbnRzIiwiZXhwZWN0ZWRTYW1wbGVBbnN3ZXJzIiwiY29uY2F0IiwiX2NvbnRhaW5lciRxdWVyeVNlbGVjIiwiX3JlbmRlckNvbXBvbmVudDQiLCJpbnN0YW5jZSIsIl9vd25lciIsImNvbXBvbmVudCIsImNoYW5nZU1heFBvaW50cyIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwiXyIsInRha2VSaWdodCIsInRlc3RDaGFuZ2VTYW1wbGVSZXNwb25zZSIsImNsaWNrZWRJdGVtIiwiX3JlbmRlckNvbXBvbmVudDUiLCJvblBvaW50TWVudUNoYW5nZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vcnVicmljLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlbmRlciwgc2NyZWVuIH0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUmF3QXV0aG9yaW5nIH0gZnJvbSAnLi4vYXV0aG9yaW5nJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBUaGVtZVByb3ZpZGVyLCBjcmVhdGVUaGVtZSB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvc3R5bGVzJztcblxuLy8gTW9jayBkZXBlbmRlbmNpZXNcbmplc3QubW9jaygnQHBpZS1saWIvZWRpdGFibGUtaHRtbCcsICgpID0+IHtcbiAgcmV0dXJuIGZ1bmN0aW9uIEVkaXRhYmxlSHRtbChwcm9wcykge1xuICAgIHJldHVybiA8ZGl2IGRhdGEtdGVzdGlkPVwiZWRpdGFibGUtaHRtbFwiIGRhdGEtbWFya3VwPXtwcm9wcy5tYXJrdXB9IC8+O1xuICB9O1xufSk7XG5cbmplc3QubW9jaygnQHBpZS1saWIvY29uZmlnLXVpJywgKCkgPT4gKHtcbiAgRmVlZGJhY2tDb25maWc6ICh7IGZlZWRiYWNrIH0pID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJmZWVkYmFjay1jb25maWdcIj57SlNPTi5zdHJpbmdpZnkoZmVlZGJhY2spfTwvZGl2Pixcbn0pKTtcblxuamVzdC5tb2NrKCdAaGVsbG8tcGFuZ2VhL2RuZCcsICgpID0+ICh7XG4gIERyYWdEcm9wQ29udGV4dDogKHsgY2hpbGRyZW4gfSkgPT4gPGRpdiBkYXRhLXRlc3RpZD1cImRyYWctZHJvcC1jb250ZXh0XCI+e2NoaWxkcmVufTwvZGl2PixcbiAgRHJvcHBhYmxlOiAoeyBjaGlsZHJlbiB9KSA9PiBjaGlsZHJlbih7IGRyb3BwYWJsZVByb3BzOiB7fSwgaW5uZXJSZWY6ICgpID0+IHt9IH0sIHt9KSxcbiAgRHJhZ2dhYmxlOiAoeyBjaGlsZHJlbiwgaW5kZXggfSkgPT5cbiAgICBjaGlsZHJlbihcbiAgICAgIHtcbiAgICAgICAgaW5uZXJSZWY6ICgpID0+IHt9LFxuICAgICAgICBkcmFnZ2FibGVQcm9wczogeyAnZGF0YS1kcmFnZ2FibGUtaW5kZXgnOiBpbmRleCB9LFxuICAgICAgICBkcmFnSGFuZGxlUHJvcHM6IHt9XG4gICAgICB9LFxuICAgICAge31cbiAgICApLFxufSkpO1xuXG5kZXNjcmliZSgnUnVicmljJywgKCkgPT4ge1xuICBjb25zdCBwb2ludHMgPSBbJ25vdGhpbmcgcmlnaHQnLCAnYSB0ZWVueSBiaXQgcmlnaHQnLCAnbW9zdGx5IHJpZ2h0JywgJ2JpbmdvJ107XG4gIGNvbnN0IHNhbXBsZUFuc3dlcnMgPSBbbnVsbCwgJ2p1c3QgcmlnaHQnLCAnbm90IGxlZnQnLCBudWxsXTtcbiAgY29uc3QgdGhlbWUgPSBjcmVhdGVUaGVtZSgpO1xuXG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9ICh2YWx1ZSA9IHt9LCBwcm9wcyA9IHt9KSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICAgICAgY2xhc3Nlczoge30sXG4gICAgICBvbkNoYW5nZTogamVzdC5mbigpLFxuICAgICAgY2xhc3NOYW1lOiAnY2xhc3NOYW1lJyxcbiAgICAgIHZhbHVlOiB7XG4gICAgICAgIGV4Y2x1ZGVaZXJvOiBmYWxzZSxcbiAgICAgICAgcG9pbnRzLFxuICAgICAgICBzYW1wbGVBbnN3ZXJzLFxuICAgICAgICAuLi52YWx1ZSxcbiAgICAgIH0sXG4gICAgICAuLi5wcm9wcyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlbmRlcihcbiAgICAgICAgPFRoZW1lUHJvdmlkZXIgdGhlbWU9e3RoZW1lfT5cbiAgICAgICAgICA8UmF3QXV0aG9yaW5nIHsuLi5kZWZhdWx0UHJvcHN9IC8+XG4gICAgICAgIDwvVGhlbWVQcm92aWRlcj5cbiAgICAgICksXG4gICAgICBvbkNoYW5nZTogZGVmYXVsdFByb3BzLm9uQ2hhbmdlLFxuICAgICAgcHJvcHM6IGRlZmF1bHRQcm9wcyxcbiAgICB9O1xuICB9O1xuXG4gIGRlc2NyaWJlKCdyZW5kZXInLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgcnVicmljIHRpdGxlIGFuZCBtYWluIHN0cnVjdHVyZScsICgpID0+IHtcbiAgICAgIHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ1J1YnJpYycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnTWF4IFBvaW50cycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeUxhYmVsVGV4dCgnRXhjbHVkZSB6ZXJvcycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgYWxsIHBvaW50IGNvbmZpZ3VyYXRpb25zJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgLy8gVmVyaWZ5IERyYWdEcm9wQ29udGV4dCBpcyByZW5kZXJlZFxuICAgICAgZXhwZWN0KGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbZGF0YS10ZXN0aWQ9XCJkcmFnLWRyb3AtY29udGV4dFwiXScpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuXG4gICAgICAvLyBDaGVjayB0aGF0IHBvaW50IGxhYmVscyBhcmUgcmVuZGVyZWQgKDQgcG9pbnRzID0gXCIzIHB0c1wiLCBcIjIgcHRzXCIsIFwiMSBwdFwiLCBcIjAgcHRcIilcbiAgICAgIC8vIE5vdGU6IFRoZSBQb2ludENvbmZpZyBjb21wb25lbnQgdXNlcyBzaW5ndWxhciBcInB0XCIgZm9yIDAgYW5kIDEsIHBsdXJhbCBcInB0c1wiIGZvciAyK1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJzMgcHRzJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnMiBwdHMnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCcxIHB0JykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnMCBwdCcpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2RyYWdnYWJsZScsICgpID0+IHtcbiAgICAgIGl0KCdyZW5kZXJzIDMgZHJhZ2dhYmxlIGl0ZW1zIHdoZW4gZXhjbHVkZVplcm8gaXMgdHJ1ZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGV4Y2x1ZGVaZXJvOiB0cnVlIH0pO1xuXG4gICAgICAgIC8vIFdoZW4gZXhjbHVkZVplcm8gaXMgdHJ1ZSwgdGhlIGxhc3QgcG9pbnQgKDAgcHRzKSBzaG91bGQgbm90IGJlIHJlbmRlcmVkXG4gICAgICAgIC8vIFNvIHdlIHNob3VsZCBoYXZlIDMgZHJhZ2dhYmxlIGl0ZW1zXG4gICAgICAgIGNvbnN0IGRyYWdnYWJsZUl0ZW1zID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWRyYWdnYWJsZS1pbmRleF0nKTtcbiAgICAgICAgZXhwZWN0KGRyYWdnYWJsZUl0ZW1zLmxlbmd0aCkudG9FcXVhbCgzKTtcblxuICAgICAgICAvLyBWZXJpZnkgdGhlIDAgcHQgbGFiZWwgaXMgbm90IHJlbmRlcmVkXG4gICAgICAgIGV4cGVjdChzY3JlZW4ucXVlcnlCeVRleHQoJzAgcHQnKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JlbmRlcnMgNCBkcmFnZ2FibGUgaXRlbXMgd2hlbiBleGNsdWRlWmVybyBpcyBmYWxzZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGV4Y2x1ZGVaZXJvOiBmYWxzZSB9KTtcblxuICAgICAgICAvLyBXaGVuIGV4Y2x1ZGVaZXJvIGlzIGZhbHNlLCBhbGwgcG9pbnRzIGluY2x1ZGluZyAwIHNob3VsZCBiZSByZW5kZXJlZFxuICAgICAgICBjb25zdCBkcmFnZ2FibGVJdGVtcyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1kcmFnZ2FibGUtaW5kZXhdJyk7XG4gICAgICAgIGV4cGVjdChkcmFnZ2FibGVJdGVtcy5sZW5ndGgpLnRvRXF1YWwoNCk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IGFsbCBwb2ludCBsYWJlbHMgYXJlIHJlbmRlcmVkXG4gICAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCczIHB0cycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnMiBwdHMnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJzEgcHQnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJzAgcHQnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbG9naWMnLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ2NoYW5nZU1heFBvaW50cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHRlc3RDaGFuZ2VNYXhQb2ludHMgPSAobWF4UG9pbnRzLCBleGNsdWRlWmVybywgZXhwZWN0ZWRQb2ludHMsIGV4cGVjdGVkU2FtcGxlQW5zd2VycykgPT4ge1xuICAgICAgICBpdChgbWF4UG9pbnRzPSR7bWF4UG9pbnRzfSwgZXhjbHVkZVplcm89JHtleGNsdWRlWmVyb30gY2FsbHMgb25DaGFuZ2UgY29ycmVjdGx5YCwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgb25DaGFuZ2UsIGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgZXhjbHVkZVplcm8gfSk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB0aHJvdWdoIHRoZSBjb250YWluZXJcbiAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNhbGwgdGhlIG1ldGhvZCBkaXJlY3RseSBzaW5jZSB3ZSdyZSB0ZXN0aW5nIGludGVybmFsIGJlaGF2aW9yXG4gICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignW2NsYXNzKj1cIk11aUJveC1yb290XCJdJyk/Ll9vd25lcjtcblxuICAgICAgICAgIC8vIFNpbmNlIHdlIGNhbid0IGVhc2lseSBhY2Nlc3MgaW5zdGFuY2UgbWV0aG9kcyBpbiBSVEwsIHdlJ2xsIHRlc3QgdGhlIGJlaGF2aW9yXG4gICAgICAgICAgLy8gYnkgdmVyaWZ5aW5nIHRoZSBvbkNoYW5nZSBwcm9wIHJlY2VpdmVzIHRoZSBjb3JyZWN0IHZhbHVlc1xuICAgICAgICAgIC8vIEZvciBub3csIHdlJ2xsIGRpcmVjdGx5IHRlc3QgdGhlIGxvZ2ljXG4gICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IFJhd0F1dGhvcmluZyh7XG4gICAgICAgICAgICB2YWx1ZTogeyBleGNsdWRlWmVybywgcG9pbnRzLCBzYW1wbGVBbnN3ZXJzIH0sXG4gICAgICAgICAgICBvbkNoYW5nZSxcbiAgICAgICAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgICAgICAgY2xhc3NOYW1lOiAnY2xhc3NOYW1lJ1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29tcG9uZW50LmNoYW5nZU1heFBvaW50cyhtYXhQb2ludHMpO1xuXG4gICAgICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgICBleGNsdWRlWmVybyxcbiAgICAgICAgICAgIHBvaW50czogZXhwZWN0ZWRQb2ludHMsXG4gICAgICAgICAgICBzYW1wbGVBbnN3ZXJzOiBleHBlY3RlZFNhbXBsZUFuc3dlcnMsXG4gICAgICAgICAgICBtYXhQb2ludHM6IGV4cGVjdGVkUG9pbnRzLmxlbmd0aCAtIDEsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgdGVzdENoYW5nZU1heFBvaW50cygxLCBmYWxzZSwgXy50YWtlUmlnaHQocG9pbnRzLCAyKSwgXy50YWtlUmlnaHQoc2FtcGxlQW5zd2VycywgMikpO1xuICAgICAgdGVzdENoYW5nZU1heFBvaW50cygxLCB0cnVlLCBfLnRha2VSaWdodChwb2ludHMsIDIpLCBfLnRha2VSaWdodChzYW1wbGVBbnN3ZXJzLCAyKSk7XG4gICAgICB0ZXN0Q2hhbmdlTWF4UG9pbnRzKDIsIHRydWUsIF8udGFrZVJpZ2h0KHBvaW50cywgMyksIF8udGFrZVJpZ2h0KHNhbXBsZUFuc3dlcnMsIDMpKTtcbiAgICAgIHRlc3RDaGFuZ2VNYXhQb2ludHMoMiwgZmFsc2UsIF8udGFrZVJpZ2h0KHBvaW50cywgMyksIF8udGFrZVJpZ2h0KHNhbXBsZUFuc3dlcnMsIDMpKTtcbiAgICAgIHRlc3RDaGFuZ2VNYXhQb2ludHMoNSwgZmFsc2UsIFsnJywgJyddLmNvbmNhdChwb2ludHMpLCBbbnVsbCwgbnVsbF0uY29uY2F0KHNhbXBsZUFuc3dlcnMpKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdjaGFuZ2VTYW1wbGVSZXNwb25zZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHRlc3RDaGFuZ2VTYW1wbGVSZXNwb25zZSA9IChpbmRleCwgY2xpY2tlZEl0ZW0sIGV4Y2x1ZGVaZXJvLCBleHBlY3RlZFBvaW50cywgZXhwZWN0ZWRTYW1wbGVBbnN3ZXJzKSA9PiB7XG4gICAgICAgIGl0KGBQb2ludCAke2luZGV4fSB3aXRoIGNsaWNrZWRJdGVtPVwiJHtjbGlja2VkSXRlbX1cIiBjYWxscyBvbkNoYW5nZSBjb3JyZWN0bHlgLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBvbkNoYW5nZSB9ID0gcmVuZGVyQ29tcG9uZW50KHsgZXhjbHVkZVplcm8gfSk7XG5cbiAgICAgICAgICAvLyBUZXN0IHRoZSBsb2dpYyBieSBjcmVhdGluZyBhIGNvbXBvbmVudCBpbnN0YW5jZSBhbmQgY2FsbGluZyB0aGUgbWV0aG9kXG4gICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IFJhd0F1dGhvcmluZyh7XG4gICAgICAgICAgICB2YWx1ZTogeyBleGNsdWRlWmVybywgcG9pbnRzLCBzYW1wbGVBbnN3ZXJzIH0sXG4gICAgICAgICAgICBvbkNoYW5nZSxcbiAgICAgICAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgICAgICAgY2xhc3NOYW1lOiAnY2xhc3NOYW1lJ1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29tcG9uZW50Lm9uUG9pbnRNZW51Q2hhbmdlKGluZGV4LCBjbGlja2VkSXRlbSk7XG5cbiAgICAgICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgICAgICAgIGV4Y2x1ZGVaZXJvLFxuICAgICAgICAgICAgcG9pbnRzOiBleHBlY3RlZFBvaW50cyxcbiAgICAgICAgICAgIHNhbXBsZUFuc3dlcnM6IGV4cGVjdGVkU2FtcGxlQW5zd2VycyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICB0ZXN0Q2hhbmdlU2FtcGxlUmVzcG9uc2UoMCwgJ3NhbXBsZScsIGZhbHNlLCBwb2ludHMsIFsnJywgJ2p1c3QgcmlnaHQnLCAnbm90IGxlZnQnLCBudWxsXSk7XG4gICAgICB0ZXN0Q2hhbmdlU2FtcGxlUmVzcG9uc2UoMywgJ3NhbXBsZScsIGZhbHNlLCBwb2ludHMsIFtudWxsLCAnanVzdCByaWdodCcsICdub3QgbGVmdCcsICcnXSk7XG4gICAgICB0ZXN0Q2hhbmdlU2FtcGxlUmVzcG9uc2UoMSwgJ3NhbXBsZScsIHRydWUsIHBvaW50cywgW251bGwsIG51bGwsICdub3QgbGVmdCcsIG51bGxdKTtcbiAgICAgIHRlc3RDaGFuZ2VTYW1wbGVSZXNwb25zZSgzLCAnc2FtcGxlJywgdHJ1ZSwgcG9pbnRzLCBbbnVsbCwgJ2p1c3QgcmlnaHQnLCAnbm90IGxlZnQnLCAnJ10pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsVUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksT0FBQSxHQUFBRixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUssT0FBQSxHQUFBTCxPQUFBO0FBQWtFLFNBQUFNLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FB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
|