@pie-element/multiple-choice 11.4.4-next.0 → 12.0.0-beta.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/configure/lib/__tests__/root.test.js +286 -0
- package/configure/lib/defaults.js +3 -5
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/index.js +156 -193
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/main.js +325 -445
- package/configure/lib/main.js.map +1 -1
- package/configure/lib/utils.js +9 -9
- package/configure/lib/utils.js.map +1 -1
- package/configure/package.json +10 -8
- package/controller/lib/__tests__/index.test.js +520 -0
- package/controller/lib/__tests__/utils.test.js +8 -0
- package/controller/lib/defaults.js +3 -4
- package/controller/lib/defaults.js.map +1 -1
- package/controller/lib/index.js +145 -240
- package/controller/lib/index.js.map +1 -1
- package/controller/lib/utils.js +5 -17
- package/controller/lib/utils.js.map +1 -1
- package/controller/package.json +2 -2
- package/docs/demo/pie.manifest.json +11 -0
- package/lib/__tests__/choice-input-test.js +49 -0
- package/lib/__tests__/index-test.js +200 -0
- package/lib/__tests__/key-events-test.js +95 -0
- package/lib/__tests__/multiple-choice-test.js +101 -0
- package/lib/__tests__/session-updater-test.js +70 -0
- package/lib/choice-input.js +312 -369
- package/lib/choice-input.js.map +1 -1
- package/lib/choice.js +164 -220
- package/lib/choice.js.map +1 -1
- package/lib/feedback-tick.js +75 -115
- package/lib/feedback-tick.js.map +1 -1
- package/lib/index.js +242 -342
- package/lib/index.js.map +1 -1
- package/lib/main.js +39 -86
- package/lib/main.js.map +1 -1
- package/lib/multiple-choice.js +305 -397
- package/lib/multiple-choice.js.map +1 -1
- package/lib/print.js +40 -78
- package/lib/print.js.map +1 -1
- package/lib/session-updater.js +5 -16
- package/lib/session-updater.js.map +1 -1
- package/package.json +13 -16
- package/module/configure.js +0 -1
- package/module/controller.js +0 -3472
- package/module/demo.js +0 -86
- package/module/element.js +0 -1
- package/module/index.html +0 -21
- package/module/manifest.json +0 -14
- package/module/print-demo.js +0 -124
- package/module/print.html +0 -18
- package/module/print.js +0 -1
package/lib/multiple-choice.js
CHANGED
|
@@ -1,164 +1,128 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
|
-
exports
|
|
9
|
-
|
|
10
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
11
|
-
|
|
12
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
13
|
-
|
|
14
|
-
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
|
|
15
|
-
|
|
16
|
-
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
17
|
-
|
|
18
|
-
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
19
|
-
|
|
20
|
-
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
21
|
-
|
|
7
|
+
exports.default = exports.MultipleChoice = void 0;
|
|
22
8
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
23
|
-
|
|
24
9
|
var _react = _interopRequireDefault(require("react"));
|
|
25
|
-
|
|
26
10
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
27
|
-
|
|
28
11
|
var _correctAnswerToggle = _interopRequireDefault(require("@pie-lib/correct-answer-toggle"));
|
|
29
|
-
|
|
30
12
|
var _classnames = _interopRequireDefault(require("classnames"));
|
|
31
|
-
|
|
32
|
-
var
|
|
33
|
-
|
|
13
|
+
var _styles = require("@mui/material/styles");
|
|
14
|
+
var _Box = _interopRequireDefault(require("@mui/material/Box"));
|
|
34
15
|
var _renderUi = require("@pie-lib/render-ui");
|
|
35
|
-
|
|
36
16
|
var _translator = _interopRequireDefault(require("@pie-lib/translator"));
|
|
37
|
-
|
|
38
17
|
var _choice = _interopRequireDefault(require("./choice"));
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleChange", function (event) {
|
|
115
|
-
var _event$target = event.target,
|
|
116
|
-
value = _event$target.value,
|
|
117
|
-
checked = _event$target.checked;
|
|
118
|
-
var _this$props = _this.props,
|
|
119
|
-
maxSelections = _this$props.maxSelections,
|
|
120
|
-
onChoiceChanged = _this$props.onChoiceChanged,
|
|
121
|
-
session = _this$props.session;
|
|
122
|
-
|
|
18
|
+
const {
|
|
19
|
+
translator
|
|
20
|
+
} = _translator.default;
|
|
21
|
+
const MainContainer = (0, _styles.styled)(_Box.default)({
|
|
22
|
+
color: _renderUi.color.text(),
|
|
23
|
+
backgroundColor: _renderUi.color.background(),
|
|
24
|
+
'& *': {
|
|
25
|
+
'-webkit-font-smoothing': 'antialiased'
|
|
26
|
+
},
|
|
27
|
+
position: 'relative',
|
|
28
|
+
// remove border from legend tags inside main to override the OT default styles
|
|
29
|
+
'& legend': {
|
|
30
|
+
border: 'none !important'
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
const PartLabel = (0, _styles.styled)('h2')(({
|
|
34
|
+
theme
|
|
35
|
+
}) => ({
|
|
36
|
+
display: 'block',
|
|
37
|
+
fontSize: 'inherit',
|
|
38
|
+
margin: '0',
|
|
39
|
+
fontWeight: 'normal',
|
|
40
|
+
paddingBottom: theme.spacing(2)
|
|
41
|
+
}));
|
|
42
|
+
const TeacherInstructions = (0, _styles.styled)(_Box.default)(({
|
|
43
|
+
theme
|
|
44
|
+
}) => ({
|
|
45
|
+
marginBottom: theme.spacing(2)
|
|
46
|
+
}));
|
|
47
|
+
const HorizontalLayout = (0, _styles.styled)(_Box.default)({
|
|
48
|
+
display: 'flex',
|
|
49
|
+
flexDirection: 'row',
|
|
50
|
+
flexWrap: 'wrap'
|
|
51
|
+
});
|
|
52
|
+
const GridLayout = (0, _styles.styled)(_Box.default)({
|
|
53
|
+
display: 'grid'
|
|
54
|
+
});
|
|
55
|
+
const StyledFieldset = (0, _styles.styled)('fieldset')({
|
|
56
|
+
border: '0px',
|
|
57
|
+
padding: '0.01em 0 0 0',
|
|
58
|
+
margin: '0px',
|
|
59
|
+
minWidth: '0px',
|
|
60
|
+
'&:focus': {
|
|
61
|
+
outline: 'none'
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
const SrOnly = (0, _styles.styled)('h3')({
|
|
65
|
+
position: 'absolute',
|
|
66
|
+
left: '-10000px',
|
|
67
|
+
top: 'auto',
|
|
68
|
+
width: '1px',
|
|
69
|
+
height: '1px',
|
|
70
|
+
overflow: 'hidden'
|
|
71
|
+
});
|
|
72
|
+
const ErrorText = (0, _styles.styled)('div')(({
|
|
73
|
+
theme
|
|
74
|
+
}) => ({
|
|
75
|
+
fontSize: theme.typography.fontSize - 2,
|
|
76
|
+
color: theme.palette.error.main,
|
|
77
|
+
paddingTop: theme.spacing(1)
|
|
78
|
+
}));
|
|
79
|
+
class MultipleChoice extends _react.default.Component {
|
|
80
|
+
constructor(props) {
|
|
81
|
+
super(props);
|
|
82
|
+
// handleChange was added for accessibility. Please see comments and videos from PD-2441.
|
|
83
|
+
(0, _defineProperty2.default)(this, "handleChange", event => {
|
|
84
|
+
const {
|
|
85
|
+
value,
|
|
86
|
+
checked
|
|
87
|
+
} = event.target;
|
|
88
|
+
const {
|
|
89
|
+
maxSelections,
|
|
90
|
+
onChoiceChanged,
|
|
91
|
+
session
|
|
92
|
+
} = this.props;
|
|
123
93
|
if (session.value && session.value.length >= maxSelections) {
|
|
124
94
|
// show/hide max selections error when user select/deselect an answer
|
|
125
|
-
|
|
95
|
+
this.setState({
|
|
126
96
|
maxSelectionsErrorState: checked
|
|
127
97
|
});
|
|
128
|
-
|
|
129
98
|
if (checked) {
|
|
130
99
|
// prevent selecting more answers
|
|
131
100
|
return;
|
|
132
101
|
}
|
|
133
102
|
}
|
|
134
|
-
|
|
135
103
|
onChoiceChanged({
|
|
136
|
-
value
|
|
104
|
+
value,
|
|
137
105
|
selected: checked,
|
|
138
106
|
selector: 'Mouse'
|
|
139
107
|
});
|
|
140
108
|
});
|
|
141
|
-
(0, _defineProperty2
|
|
142
|
-
if (
|
|
143
|
-
|
|
144
|
-
showCorrect: !
|
|
145
|
-
},
|
|
146
|
-
if (
|
|
147
|
-
|
|
109
|
+
(0, _defineProperty2.default)(this, "onToggle", () => {
|
|
110
|
+
if (this.props.mode === 'evaluate') {
|
|
111
|
+
this.setState({
|
|
112
|
+
showCorrect: !this.state.showCorrect
|
|
113
|
+
}, () => {
|
|
114
|
+
if (this.props.onShowCorrectToggle) {
|
|
115
|
+
this.props.onShowCorrectToggle();
|
|
148
116
|
}
|
|
149
117
|
});
|
|
150
118
|
}
|
|
151
119
|
});
|
|
152
|
-
(0, _defineProperty2
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
var isChecked = _this.isSelected(choice.value);
|
|
157
|
-
|
|
158
|
-
if (_this.state.showCorrect) {
|
|
120
|
+
(0, _defineProperty2.default)(this, "getCorrectness", (choice = {}) => {
|
|
121
|
+
const isCorrect = choice.correct;
|
|
122
|
+
const isChecked = this.isSelected(choice.value);
|
|
123
|
+
if (this.state.showCorrect) {
|
|
159
124
|
return isCorrect ? 'correct' : undefined;
|
|
160
125
|
}
|
|
161
|
-
|
|
162
126
|
if (isCorrect) {
|
|
163
127
|
if (isChecked) {
|
|
164
128
|
// A correct answer is selected: marked with a green checkmark
|
|
@@ -177,301 +141,245 @@ var MultipleChoice = /*#__PURE__*/function (_React$Component) {
|
|
|
177
141
|
}
|
|
178
142
|
}
|
|
179
143
|
});
|
|
180
|
-
(0, _defineProperty2
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
144
|
+
(0, _defineProperty2.default)(this, "handleGroupFocus", e => {
|
|
145
|
+
const fieldset = e.currentTarget;
|
|
146
|
+
const activeEl = document.activeElement;
|
|
184
147
|
if (fieldset.contains(activeEl) && activeEl !== fieldset) {
|
|
185
148
|
return;
|
|
186
|
-
}
|
|
187
|
-
|
|
149
|
+
}
|
|
188
150
|
|
|
151
|
+
// Only focus the first input if user is tabbing forward
|
|
189
152
|
if (!e.relatedTarget || fieldset.compareDocumentPosition(e.relatedTarget) & Node.DOCUMENT_POSITION_PRECEDING) {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
if ((_this$firstInputRef = _this.firstInputRef) !== null && _this$firstInputRef !== void 0 && _this$firstInputRef.current) {
|
|
193
|
-
_this.firstInputRef.current.focus();
|
|
153
|
+
if (this.firstInputRef?.current) {
|
|
154
|
+
this.firstInputRef.current.focus();
|
|
194
155
|
}
|
|
195
156
|
}
|
|
196
157
|
});
|
|
197
|
-
|
|
198
|
-
showCorrect:
|
|
158
|
+
this.state = {
|
|
159
|
+
showCorrect: this.props.options && this.props.alwaysShowCorrect || false,
|
|
199
160
|
maxSelectionsErrorState: false
|
|
200
161
|
};
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
162
|
+
this.onToggle = this.onToggle.bind(this);
|
|
163
|
+
this.firstInputRef = /*#__PURE__*/_react.default.createRef();
|
|
164
|
+
}
|
|
165
|
+
isSelected(value) {
|
|
166
|
+
const sessionValue = this.props.session && this.props.session.value;
|
|
167
|
+
return sessionValue && sessionValue.indexOf && sessionValue.indexOf(value) >= 0;
|
|
204
168
|
}
|
|
169
|
+
UNSAFE_componentWillReceiveProps(nextProps) {
|
|
170
|
+
if (!nextProps.correctResponse && this.state.showCorrect !== false) {
|
|
171
|
+
this.setState({
|
|
172
|
+
showCorrect: false
|
|
173
|
+
}, () => {
|
|
174
|
+
if (this.props.onShowCorrectToggle) {
|
|
175
|
+
this.props.onShowCorrectToggle();
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
if (nextProps.options && nextProps.alwaysShowCorrect && this.state.showCorrect !== true) {
|
|
180
|
+
this.setState({
|
|
181
|
+
showCorrect: true
|
|
182
|
+
}, () => {
|
|
183
|
+
if (this.props.onShowCorrectToggle) {
|
|
184
|
+
this.props.onShowCorrectToggle();
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
indexToSymbol(index) {
|
|
190
|
+
if (this.props.keyMode === 'numbers') {
|
|
191
|
+
return `${index + 1}`;
|
|
192
|
+
}
|
|
193
|
+
if (this.props.keyMode === 'letters') {
|
|
194
|
+
return String.fromCharCode(97 + index).toUpperCase();
|
|
195
|
+
}
|
|
196
|
+
return '';
|
|
197
|
+
}
|
|
198
|
+
getChecked(choice) {
|
|
199
|
+
// check for print context: options prop is passed from print.js and alwaysShowCorrect is true
|
|
200
|
+
const isPrintMode = this.props.options && this.props.alwaysShowCorrect;
|
|
201
|
+
if (isPrintMode) {
|
|
202
|
+
return choice.correct || false;
|
|
203
|
+
}
|
|
205
204
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
} // handleChange was added for accessibility. Please see comments and videos from PD-2441.
|
|
205
|
+
// evaluate mode with show correct toggled
|
|
206
|
+
const isEvaluateMode = this.state.showCorrect && this.props.mode === 'evaluate';
|
|
207
|
+
if (isEvaluateMode) {
|
|
208
|
+
return choice.correct || false;
|
|
209
|
+
}
|
|
212
210
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
var _this2 = this;
|
|
211
|
+
// default behavior: show what the user has selected
|
|
212
|
+
return this.isSelected(choice.value);
|
|
213
|
+
}
|
|
217
214
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
215
|
+
// renderHeading function was added for accessibility.
|
|
216
|
+
renderHeading() {
|
|
217
|
+
const {
|
|
218
|
+
mode,
|
|
219
|
+
choiceMode
|
|
220
|
+
} = this.props;
|
|
221
|
+
if (mode !== 'gather') {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
return choiceMode === 'radio' ? /*#__PURE__*/_react.default.createElement(SrOnly, null, "Multiple Choice Question") : /*#__PURE__*/_react.default.createElement(SrOnly, null, "Multiple Select Question");
|
|
225
|
+
}
|
|
226
|
+
render() {
|
|
227
|
+
const {
|
|
228
|
+
mode,
|
|
229
|
+
disabled,
|
|
230
|
+
className,
|
|
231
|
+
choices = [],
|
|
232
|
+
choiceMode,
|
|
233
|
+
gridColumns,
|
|
234
|
+
partLabel,
|
|
235
|
+
prompt,
|
|
236
|
+
responseCorrect,
|
|
237
|
+
teacherInstructions,
|
|
238
|
+
alwaysShowCorrect,
|
|
239
|
+
animationsDisabled,
|
|
240
|
+
language,
|
|
241
|
+
isSelectionButtonBelow,
|
|
242
|
+
minSelections,
|
|
243
|
+
maxSelections,
|
|
244
|
+
autoplayAudioEnabled,
|
|
245
|
+
session,
|
|
246
|
+
customAudioButton,
|
|
247
|
+
options
|
|
248
|
+
} = this.props;
|
|
249
|
+
const {
|
|
250
|
+
showCorrect,
|
|
251
|
+
maxSelectionsErrorState
|
|
252
|
+
} = this.state;
|
|
253
|
+
const isEvaluateMode = mode === 'evaluate';
|
|
254
|
+
const showCorrectAnswerToggle = isEvaluateMode && !responseCorrect;
|
|
255
|
+
const columnsStyle = gridColumns > 1 ? {
|
|
256
|
+
gridTemplateColumns: `repeat(${gridColumns}, 1fr)`
|
|
257
|
+
} : undefined;
|
|
258
|
+
const selections = session.value && session.value.length || 0;
|
|
259
|
+
const teacherInstructionsDiv = /*#__PURE__*/_react.default.createElement(_renderUi.PreviewPrompt, {
|
|
260
|
+
tagName: "div",
|
|
261
|
+
className: "prompt",
|
|
262
|
+
defaultClassName: "teacher-instructions",
|
|
263
|
+
prompt: teacherInstructions
|
|
264
|
+
});
|
|
265
|
+
const getMultipleChoiceMinSelectionErrorMessage = () => {
|
|
266
|
+
if (minSelections && maxSelections) {
|
|
267
|
+
return minSelections === maxSelections ? translator.t('translation:multipleChoice:minmaxSelections_equal', {
|
|
268
|
+
lng: language,
|
|
269
|
+
minSelections
|
|
270
|
+
}) : translator.t('translation:multipleChoice:minmaxSelections_range', {
|
|
271
|
+
lng: language,
|
|
272
|
+
minSelections,
|
|
273
|
+
maxSelections
|
|
225
274
|
});
|
|
226
275
|
}
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
}, function () {
|
|
232
|
-
if (_this2.props.onShowCorrectToggle) {
|
|
233
|
-
_this2.props.onShowCorrectToggle();
|
|
234
|
-
}
|
|
276
|
+
if (minSelections) {
|
|
277
|
+
return translator.t('translation:multipleChoice:minSelections', {
|
|
278
|
+
lng: language,
|
|
279
|
+
minSelections
|
|
235
280
|
});
|
|
236
281
|
}
|
|
237
|
-
}
|
|
238
|
-
}, {
|
|
239
|
-
key: "indexToSymbol",
|
|
240
|
-
value: function indexToSymbol(index) {
|
|
241
|
-
if (this.props.keyMode === 'numbers') {
|
|
242
|
-
return "".concat(index + 1);
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
if (this.props.keyMode === 'letters') {
|
|
246
|
-
return String.fromCharCode(97 + index).toUpperCase();
|
|
247
|
-
}
|
|
248
|
-
|
|
249
282
|
return '';
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
} // evaluate mode with show correct toggled
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
var isEvaluateMode = this.state.showCorrect && this.props.mode === 'evaluate';
|
|
263
|
-
|
|
264
|
-
if (isEvaluateMode) {
|
|
265
|
-
return choice.correct || false;
|
|
266
|
-
} // default behavior: show what the user has selected
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
return this.isSelected(choice.value);
|
|
270
|
-
} // renderHeading function was added for accessibility.
|
|
271
|
-
|
|
272
|
-
}, {
|
|
273
|
-
key: "renderHeading",
|
|
274
|
-
value: function renderHeading() {
|
|
275
|
-
var _this$props2 = this.props,
|
|
276
|
-
mode = _this$props2.mode,
|
|
277
|
-
choiceMode = _this$props2.choiceMode,
|
|
278
|
-
classes = _this$props2.classes;
|
|
279
|
-
|
|
280
|
-
if (mode !== 'gather') {
|
|
281
|
-
return null;
|
|
283
|
+
};
|
|
284
|
+
const LayoutComponent = this.props.choicesLayout === 'grid' ? GridLayout : this.props.choicesLayout === 'horizontal' ? HorizontalLayout : _Box.default;
|
|
285
|
+
return /*#__PURE__*/_react.default.createElement(MainContainer, {
|
|
286
|
+
id: 'main-container',
|
|
287
|
+
className: (0, _classnames.default)(className, 'multiple-choice')
|
|
288
|
+
}, partLabel && /*#__PURE__*/_react.default.createElement(PartLabel, null, partLabel), this.renderHeading(), teacherInstructions && /*#__PURE__*/_react.default.createElement(TeacherInstructions, null, !animationsDisabled ? /*#__PURE__*/_react.default.createElement(_renderUi.Collapsible, {
|
|
289
|
+
labels: {
|
|
290
|
+
hidden: 'Show Teacher Instructions',
|
|
291
|
+
visible: 'Hide Teacher Instructions'
|
|
282
292
|
}
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
defaultClassName: "teacher-instructions",
|
|
333
|
-
prompt: teacherInstructions
|
|
334
|
-
});
|
|
335
|
-
|
|
336
|
-
var getMultipleChoiceMinSelectionErrorMessage = function getMultipleChoiceMinSelectionErrorMessage() {
|
|
337
|
-
if (minSelections && maxSelections) {
|
|
338
|
-
return minSelections === maxSelections ? translator.t('translation:multipleChoice:minmaxSelections_equal', {
|
|
339
|
-
lng: language,
|
|
340
|
-
minSelections: minSelections
|
|
341
|
-
}) : translator.t('translation:multipleChoice:minmaxSelections_range', {
|
|
342
|
-
lng: language,
|
|
343
|
-
minSelections: minSelections,
|
|
344
|
-
maxSelections: maxSelections
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
if (minSelections) {
|
|
349
|
-
return translator.t('translation:multipleChoice:minSelections', {
|
|
350
|
-
lng: language,
|
|
351
|
-
minSelections: minSelections
|
|
352
|
-
});
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
return '';
|
|
356
|
-
};
|
|
357
|
-
|
|
358
|
-
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
359
|
-
id: 'main-container',
|
|
360
|
-
className: (0, _classnames["default"])(classes.main, className, 'multiple-choice')
|
|
361
|
-
}, partLabel && /*#__PURE__*/_react["default"].createElement("h2", {
|
|
362
|
-
className: classes.partLabel
|
|
363
|
-
}, partLabel), this.renderHeading(), teacherInstructions && /*#__PURE__*/_react["default"].createElement("div", {
|
|
364
|
-
className: classes.teacherInstructions
|
|
365
|
-
}, !animationsDisabled ? /*#__PURE__*/_react["default"].createElement(_renderUi.Collapsible, {
|
|
366
|
-
labels: {
|
|
367
|
-
hidden: 'Show Teacher Instructions',
|
|
368
|
-
visible: 'Hide Teacher Instructions'
|
|
369
|
-
}
|
|
370
|
-
}, teacherInstructionsDiv) : teacherInstructionsDiv), /*#__PURE__*/_react["default"].createElement("fieldset", {
|
|
371
|
-
tabIndex: 0,
|
|
372
|
-
className: classes.fieldset,
|
|
373
|
-
onFocus: this.handleGroupFocus,
|
|
374
|
-
role: choiceMode === 'radio' ? 'radiogroup' : 'group'
|
|
375
|
-
}, /*#__PURE__*/_react["default"].createElement(_renderUi.PreviewPrompt, {
|
|
376
|
-
className: "prompt",
|
|
377
|
-
defaultClassName: "prompt",
|
|
378
|
-
prompt: prompt,
|
|
379
|
-
tagName: 'legend',
|
|
380
|
-
autoplayAudioEnabled: autoplayAudioEnabled,
|
|
381
|
-
customAudioButton: customAudioButton
|
|
382
|
-
}), !(options && alwaysShowCorrect) && /*#__PURE__*/_react["default"].createElement(_correctAnswerToggle["default"], {
|
|
383
|
-
show: showCorrectAnswerToggle,
|
|
384
|
-
toggled: showCorrect,
|
|
385
|
-
onToggle: this.onToggle.bind(this),
|
|
386
|
-
language: language
|
|
387
|
-
}), /*#__PURE__*/_react["default"].createElement("div", {
|
|
388
|
-
className: (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, classes.gridLayout, this.props.choicesLayout === 'grid'), (0, _defineProperty2["default"])(_classNames, classes.horizontalLayout, this.props.choicesLayout === 'horizontal'), _classNames)),
|
|
389
|
-
style: columnsStyle
|
|
390
|
-
}, choices.map(function (choice, index) {
|
|
391
|
-
return /*#__PURE__*/_react["default"].createElement(_choice["default"], {
|
|
392
|
-
autoFocusRef: index === 0 ? _this3.firstInputRef : null,
|
|
393
|
-
choicesLayout: _this3.props.choicesLayout,
|
|
394
|
-
selectedAnswerBackgroundColor: _this3.props.selectedAnswerBackgroundColor,
|
|
395
|
-
selectedAnswerStrokeColor: _this3.props.selectedAnswerStrokeColor,
|
|
396
|
-
selectedAnswerStrokeWidth: _this3.props.selectedAnswerStrokeWidth,
|
|
397
|
-
hoverAnswerBackgroundColor: _this3.props.hoverAnswerBackgroundColor,
|
|
398
|
-
hoverAnswerStrokeColor: _this3.props.hoverAnswerStrokeColor,
|
|
399
|
-
hoverAnswerStrokeWidth: _this3.props.hoverAnswerStrokeWidth,
|
|
400
|
-
gridColumns: gridColumns,
|
|
401
|
-
key: "choice-".concat(index),
|
|
402
|
-
choice: choice,
|
|
403
|
-
index: index,
|
|
404
|
-
choicesLength: choices.length,
|
|
405
|
-
showCorrect: showCorrect,
|
|
406
|
-
isEvaluateMode: isEvaluateMode,
|
|
407
|
-
choiceMode: choiceMode,
|
|
408
|
-
disabled: disabled,
|
|
409
|
-
tagName: partLabel ? "group-".concat(partLabel) : 'group',
|
|
410
|
-
onChoiceChanged: _this3.handleChange,
|
|
411
|
-
hideTick: choice.hideTick,
|
|
412
|
-
checked: _this3.getChecked(choice),
|
|
413
|
-
correctness: isEvaluateMode ? _this3.getCorrectness(choice) : undefined,
|
|
414
|
-
displayKey: _this3.indexToSymbol(index),
|
|
415
|
-
isSelectionButtonBelow: isSelectionButtonBelow
|
|
416
|
-
});
|
|
417
|
-
}))), choiceMode === 'checkbox' && selections < minSelections && /*#__PURE__*/_react["default"].createElement("div", {
|
|
418
|
-
className: classes.errorText
|
|
419
|
-
}, getMultipleChoiceMinSelectionErrorMessage()), choiceMode === 'checkbox' && maxSelectionsErrorState && /*#__PURE__*/_react["default"].createElement("div", {
|
|
420
|
-
className: classes.errorText
|
|
421
|
-
}, translator.t("translation:multipleChoice:maxSelections_".concat(maxSelections === 1 ? 'one' : 'other'), {
|
|
422
|
-
lng: language,
|
|
423
|
-
maxSelections: maxSelections
|
|
424
|
-
})));
|
|
425
|
-
}
|
|
426
|
-
}]);
|
|
427
|
-
return MultipleChoice;
|
|
428
|
-
}(_react["default"].Component);
|
|
429
|
-
|
|
293
|
+
}, teacherInstructionsDiv) : teacherInstructionsDiv), /*#__PURE__*/_react.default.createElement(StyledFieldset, {
|
|
294
|
+
tabIndex: 0,
|
|
295
|
+
onFocus: this.handleGroupFocus,
|
|
296
|
+
role: choiceMode === 'radio' ? 'radiogroup' : 'group'
|
|
297
|
+
}, /*#__PURE__*/_react.default.createElement(_renderUi.PreviewPrompt, {
|
|
298
|
+
className: "prompt",
|
|
299
|
+
defaultClassName: "prompt",
|
|
300
|
+
prompt: prompt,
|
|
301
|
+
tagName: 'legend',
|
|
302
|
+
autoplayAudioEnabled: autoplayAudioEnabled,
|
|
303
|
+
customAudioButton: customAudioButton
|
|
304
|
+
}), !(options && alwaysShowCorrect) && /*#__PURE__*/_react.default.createElement(_correctAnswerToggle.default, {
|
|
305
|
+
show: showCorrectAnswerToggle,
|
|
306
|
+
toggled: showCorrect,
|
|
307
|
+
onToggle: this.onToggle.bind(this),
|
|
308
|
+
language: language
|
|
309
|
+
}), /*#__PURE__*/_react.default.createElement(LayoutComponent, {
|
|
310
|
+
style: columnsStyle
|
|
311
|
+
}, choices.map((choice, index) => /*#__PURE__*/_react.default.createElement(_choice.default, {
|
|
312
|
+
autoFocusRef: index === 0 ? this.firstInputRef : null,
|
|
313
|
+
choicesLayout: this.props.choicesLayout,
|
|
314
|
+
selectedAnswerBackgroundColor: this.props.selectedAnswerBackgroundColor,
|
|
315
|
+
selectedAnswerStrokeColor: this.props.selectedAnswerStrokeColor,
|
|
316
|
+
selectedAnswerStrokeWidth: this.props.selectedAnswerStrokeWidth,
|
|
317
|
+
hoverAnswerBackgroundColor: this.props.hoverAnswerBackgroundColor,
|
|
318
|
+
hoverAnswerStrokeColor: this.props.hoverAnswerStrokeColor,
|
|
319
|
+
hoverAnswerStrokeWidth: this.props.hoverAnswerStrokeWidth,
|
|
320
|
+
gridColumns: gridColumns,
|
|
321
|
+
key: `choice-${index}`,
|
|
322
|
+
choice: choice,
|
|
323
|
+
index: index,
|
|
324
|
+
choicesLength: choices.length,
|
|
325
|
+
showCorrect: showCorrect,
|
|
326
|
+
isEvaluateMode: isEvaluateMode,
|
|
327
|
+
choiceMode: choiceMode,
|
|
328
|
+
disabled: disabled,
|
|
329
|
+
tagName: partLabel ? `group-${partLabel}` : 'group',
|
|
330
|
+
onChoiceChanged: this.handleChange,
|
|
331
|
+
hideTick: choice.hideTick,
|
|
332
|
+
checked: this.getChecked(choice),
|
|
333
|
+
correctness: isEvaluateMode ? this.getCorrectness(choice) : undefined,
|
|
334
|
+
displayKey: this.indexToSymbol(index),
|
|
335
|
+
isSelectionButtonBelow: isSelectionButtonBelow
|
|
336
|
+
})))), choiceMode === 'checkbox' && selections < minSelections && /*#__PURE__*/_react.default.createElement(ErrorText, null, getMultipleChoiceMinSelectionErrorMessage()), choiceMode === 'checkbox' && maxSelectionsErrorState && /*#__PURE__*/_react.default.createElement(ErrorText, null, translator.t(`translation:multipleChoice:maxSelections_${maxSelections === 1 ? 'one' : 'other'}`, {
|
|
337
|
+
lng: language,
|
|
338
|
+
maxSelections
|
|
339
|
+
})));
|
|
340
|
+
}
|
|
341
|
+
}
|
|
430
342
|
exports.MultipleChoice = MultipleChoice;
|
|
431
|
-
(0, _defineProperty2
|
|
432
|
-
className: _propTypes
|
|
433
|
-
mode: _propTypes
|
|
434
|
-
choiceMode: _propTypes
|
|
435
|
-
keyMode: _propTypes
|
|
436
|
-
choices: _propTypes
|
|
437
|
-
partLabel: _propTypes
|
|
438
|
-
prompt: _propTypes
|
|
439
|
-
teacherInstructions: _propTypes
|
|
440
|
-
session: _propTypes
|
|
441
|
-
disabled: _propTypes
|
|
442
|
-
onChoiceChanged: _propTypes
|
|
443
|
-
responseCorrect: _propTypes
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
autoplayAudioEnabled: _propTypes["default"].bool,
|
|
343
|
+
(0, _defineProperty2.default)(MultipleChoice, "propTypes", {
|
|
344
|
+
className: _propTypes.default.string,
|
|
345
|
+
mode: _propTypes.default.oneOf(['gather', 'view', 'evaluate']),
|
|
346
|
+
choiceMode: _propTypes.default.oneOf(['radio', 'checkbox']),
|
|
347
|
+
keyMode: _propTypes.default.oneOf(['numbers', 'letters', 'none']),
|
|
348
|
+
choices: _propTypes.default.array,
|
|
349
|
+
partLabel: _propTypes.default.string,
|
|
350
|
+
prompt: _propTypes.default.string,
|
|
351
|
+
teacherInstructions: _propTypes.default.string,
|
|
352
|
+
session: _propTypes.default.object,
|
|
353
|
+
disabled: _propTypes.default.bool,
|
|
354
|
+
onChoiceChanged: _propTypes.default.func,
|
|
355
|
+
responseCorrect: _propTypes.default.bool,
|
|
356
|
+
correctResponse: _propTypes.default.array,
|
|
357
|
+
choicesLayout: _propTypes.default.oneOf(['vertical', 'grid', 'horizontal']),
|
|
358
|
+
gridColumns: _propTypes.default.string,
|
|
359
|
+
alwaysShowCorrect: _propTypes.default.bool,
|
|
360
|
+
animationsDisabled: _propTypes.default.bool,
|
|
361
|
+
language: _propTypes.default.string,
|
|
362
|
+
selectedAnswerBackgroundColor: _propTypes.default.string,
|
|
363
|
+
selectedAnswerStrokeColor: _propTypes.default.string,
|
|
364
|
+
selectedAnswerStrokeWidth: _propTypes.default.string,
|
|
365
|
+
hoverAnswerBackgroundColor: _propTypes.default.string,
|
|
366
|
+
hoverAnswerStrokeColor: _propTypes.default.string,
|
|
367
|
+
hoverAnswerStrokeWidth: _propTypes.default.string,
|
|
368
|
+
onShowCorrectToggle: _propTypes.default.func,
|
|
369
|
+
isSelectionButtonBelow: _propTypes.default.bool,
|
|
370
|
+
minSelections: _propTypes.default.number,
|
|
371
|
+
maxSelections: _propTypes.default.number,
|
|
372
|
+
autoplayAudioEnabled: _propTypes.default.bool,
|
|
462
373
|
customAudioButton: {
|
|
463
|
-
playImage: _propTypes
|
|
464
|
-
pauseImage: _propTypes
|
|
374
|
+
playImage: _propTypes.default.string,
|
|
375
|
+
pauseImage: _propTypes.default.string
|
|
465
376
|
},
|
|
466
|
-
options: _propTypes
|
|
377
|
+
options: _propTypes.default.object
|
|
467
378
|
});
|
|
468
379
|
MultipleChoice.defaultProps = {
|
|
469
380
|
session: {
|
|
470
381
|
value: []
|
|
471
382
|
}
|
|
472
383
|
};
|
|
473
|
-
|
|
474
|
-
var _default = (0, _styles.withStyles)(styles)(MultipleChoice);
|
|
475
|
-
|
|
476
|
-
exports["default"] = _default;
|
|
477
|
-
//# sourceMappingURL=multiple-choice.js.map
|
|
384
|
+
var _default = exports.default = MultipleChoice;
|
|
385
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9wcm9wVHlwZXMiLCJfY29ycmVjdEFuc3dlclRvZ2dsZSIsIl9jbGFzc25hbWVzIiwiX3N0eWxlcyIsIl9Cb3giLCJfcmVuZGVyVWkiLCJfdHJhbnNsYXRvciIsIl9jaG9pY2UiLCJ0cmFuc2xhdG9yIiwiVHJhbnNsYXRvciIsIk1haW5Db250YWluZXIiLCJzdHlsZWQiLCJCb3giLCJjb2xvciIsInRleHQiLCJiYWNrZ3JvdW5kQ29sb3IiLCJiYWNrZ3JvdW5kIiwicG9zaXRpb24iLCJib3JkZXIiLCJQYXJ0TGFiZWwiLCJ0aGVtZSIsImRpc3BsYXkiLCJmb250U2l6ZSIsIm1hcmdpbiIsImZvbnRXZWlnaHQiLCJwYWRkaW5nQm90dG9tIiwic3BhY2luZyIsIlRlYWNoZXJJbnN0cnVjdGlvbnMiLCJtYXJnaW5Cb3R0b20iLCJIb3Jpem9udGFsTGF5b3V0IiwiZmxleERpcmVjdGlvbiIsImZsZXhXcmFwIiwiR3JpZExheW91dCIsIlN0eWxlZEZpZWxkc2V0IiwicGFkZGluZyIsIm1pbldpZHRoIiwib3V0bGluZSIsIlNyT25seSIsImxlZnQiLCJ0b3AiLCJ3aWR0aCIsImhlaWdodCIsIm92ZXJmbG93IiwiRXJyb3JUZXh0IiwidHlwb2dyYXBoeSIsInBhbGV0dGUiLCJlcnJvciIsIm1haW4iLCJwYWRkaW5nVG9wIiwiTXVsdGlwbGVDaG9pY2UiLCJSZWFjdCIsIkNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsImV2ZW50IiwidmFsdWUiLCJjaGVja2VkIiwidGFyZ2V0IiwibWF4U2VsZWN0aW9ucyIsIm9uQ2hvaWNlQ2hhbmdlZCIsInNlc3Npb24iLCJsZW5ndGgiLCJzZXRTdGF0ZSIsIm1heFNlbGVjdGlvbnNFcnJvclN0YXRlIiwic2VsZWN0ZWQiLCJzZWxlY3RvciIsIm1vZGUiLCJzaG93Q29ycmVjdCIsInN0YXRlIiwib25TaG93Q29ycmVjdFRvZ2dsZSIsImNob2ljZSIsImlzQ29ycmVjdCIsImNvcnJlY3QiLCJpc0NoZWNrZWQiLCJpc1NlbGVjdGVkIiwidW5kZWZpbmVkIiwiZSIsImZpZWxkc2V0IiwiY3VycmVudFRhcmdldCIsImFjdGl2ZUVsIiwiZG9jdW1lbnQiLCJhY3RpdmVFbGVtZW50IiwiY29udGFpbnMiLCJyZWxhdGVkVGFyZ2V0IiwiY29tcGFyZURvY3VtZW50UG9zaXRpb24iLCJOb2RlIiwiRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HIiwiZmlyc3RJbnB1dFJlZiIsImN1cnJlbnQiLCJmb2N1cyIsIm9wdGlvbnMiLCJhbHdheXNTaG93Q29ycmVjdCIsIm9uVG9nZ2xlIiwiYmluZCIsImNyZWF0ZVJlZiIsInNlc3Npb25WYWx1ZSIsImluZGV4T2YiLCJVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsIm5leHRQcm9wcyIsImNvcnJlY3RSZXNwb25zZSIsImluZGV4VG9TeW1ib2wiLCJpbmRleCIsImtleU1vZGUiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJ0b1VwcGVyQ2FzZSIsImdldENoZWNrZWQiLCJpc1ByaW50TW9kZSIsImlzRXZhbHVhdGVNb2RlIiwicmVuZGVySGVhZGluZyIsImNob2ljZU1vZGUiLCJjcmVhdGVFbGVtZW50IiwicmVuZGVyIiwiZGlzYWJsZWQiLCJjbGFzc05hbWUiLCJjaG9pY2VzIiwiZ3JpZENvbHVtbnMiLCJwYXJ0TGFiZWwiLCJwcm9tcHQiLCJyZXNwb25zZUNvcnJlY3QiLCJ0ZWFjaGVySW5zdHJ1Y3Rpb25zIiwiYW5pbWF0aW9uc0Rpc2FibGVkIiwibGFuZ3VhZ2UiLCJpc1NlbGVjdGlvbkJ1dHRvbkJlbG93IiwibWluU2VsZWN0aW9ucyIsImF1dG9wbGF5QXVkaW9FbmFibGVkIiwiY3VzdG9tQXVkaW9CdXR0b24iLCJzaG93Q29ycmVjdEFuc3dlclRvZ2dsZSIsImNvbHVtbnNTdHlsZSIsImdyaWRUZW1wbGF0ZUNvbHVtbnMiLCJzZWxlY3Rpb25zIiwidGVhY2hlckluc3RydWN0aW9uc0RpdiIsIlByZXZpZXdQcm9tcHQiLCJ0YWdOYW1lIiwiZGVmYXVsdENsYXNzTmFtZSIsImdldE11bHRpcGxlQ2hvaWNlTWluU2VsZWN0aW9uRXJyb3JNZXNzYWdlIiwidCIsImxuZyIsIkxheW91dENvbXBvbmVudCIsImNob2ljZXNMYXlvdXQiLCJpZCIsImNsYXNzTmFtZXMiLCJDb2xsYXBzaWJsZSIsImxhYmVscyIsImhpZGRlbiIsInZpc2libGUiLCJ0YWJJbmRleCIsIm9uRm9jdXMiLCJoYW5kbGVHcm91cEZvY3VzIiwicm9sZSIsInNob3ciLCJ0b2dnbGVkIiwic3R5bGUiLCJtYXAiLCJhdXRvRm9jdXNSZWYiLCJzZWxlY3RlZEFuc3dlckJhY2tncm91bmRDb2xvciIsInNlbGVjdGVkQW5zd2VyU3Ryb2tlQ29sb3IiLCJzZWxlY3RlZEFuc3dlclN0cm9rZVdpZHRoIiwiaG92ZXJBbnN3ZXJCYWNrZ3JvdW5kQ29sb3IiLCJob3ZlckFuc3dlclN0cm9rZUNvbG9yIiwiaG92ZXJBbnN3ZXJTdHJva2VXaWR0aCIsImtleSIsImNob2ljZXNMZW5ndGgiLCJoYW5kbGVDaGFuZ2UiLCJoaWRlVGljayIsImNvcnJlY3RuZXNzIiwiZ2V0Q29ycmVjdG5lc3MiLCJkaXNwbGF5S2V5IiwiZXhwb3J0cyIsIlByb3BUeXBlcyIsInN0cmluZyIsIm9uZU9mIiwiYXJyYXkiLCJvYmplY3QiLCJib29sIiwiZnVuYyIsIm51bWJlciIsInBsYXlJbWFnZSIsInBhdXNlSW1hZ2UiLCJkZWZhdWx0UHJvcHMiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9tdWx0aXBsZS1jaG9pY2UuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IENvcnJlY3RBbnN3ZXJUb2dnbGUgZnJvbSAnQHBpZS1saWIvY29ycmVjdC1hbnN3ZXItdG9nZ2xlJztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9zdHlsZXMnO1xuaW1wb3J0IEJveCBmcm9tICdAbXVpL21hdGVyaWFsL0JveCc7XG5pbXBvcnQgeyBjb2xvciwgQ29sbGFwc2libGUsIFByZXZpZXdQcm9tcHQgfSBmcm9tICdAcGllLWxpYi9yZW5kZXItdWknO1xuaW1wb3J0IFRyYW5zbGF0b3IgZnJvbSAnQHBpZS1saWIvdHJhbnNsYXRvcic7XG5cbmltcG9ydCBDaG9pY2UgZnJvbSAnLi9jaG9pY2UnO1xuXG5jb25zdCB7IHRyYW5zbGF0b3IgfSA9IFRyYW5zbGF0b3I7XG5cbmNvbnN0IE1haW5Db250YWluZXIgPSBzdHlsZWQoQm94KSh7XG4gIGNvbG9yOiBjb2xvci50ZXh0KCksXG4gIGJhY2tncm91bmRDb2xvcjogY29sb3IuYmFja2dyb3VuZCgpLFxuICAnJiAqJzoge1xuICAgICctd2Via2l0LWZvbnQtc21vb3RoaW5nJzogJ2FudGlhbGlhc2VkJyxcbiAgfSxcbiAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gIC8vIHJlbW92ZSBib3JkZXIgZnJvbSBsZWdlbmQgdGFncyBpbnNpZGUgbWFpbiB0byBvdmVycmlkZSB0aGUgT1QgZGVmYXVsdCBzdHlsZXNcbiAgJyYgbGVnZW5kJzoge1xuICAgIGJvcmRlcjogJ25vbmUgIWltcG9ydGFudCcsXG4gIH0sXG59KTtcblxuY29uc3QgUGFydExhYmVsID0gc3R5bGVkKCdoMicpKCh7IHRoZW1lIH0pID0+ICh7XG4gIGRpc3BsYXk6ICdibG9jaycsXG4gIGZvbnRTaXplOiAnaW5oZXJpdCcsXG4gIG1hcmdpbjogJzAnLFxuICBmb250V2VpZ2h0OiAnbm9ybWFsJyxcbiAgcGFkZGluZ0JvdHRvbTogdGhlbWUuc3BhY2luZygyKSxcbn0pKTtcblxuY29uc3QgVGVhY2hlckluc3RydWN0aW9ucyA9IHN0eWxlZChCb3gpKCh7IHRoZW1lIH0pID0+ICh7XG4gIG1hcmdpbkJvdHRvbTogdGhlbWUuc3BhY2luZygyKSxcbn0pKTtcblxuY29uc3QgSG9yaXpvbnRhbExheW91dCA9IHN0eWxlZChCb3gpKHtcbiAgZGlzcGxheTogJ2ZsZXgnLFxuICBmbGV4RGlyZWN0aW9uOiAncm93JyxcbiAgZmxleFdyYXA6ICd3cmFwJyxcbn0pO1xuXG5jb25zdCBHcmlkTGF5b3V0ID0gc3R5bGVkKEJveCkoe1xuICBkaXNwbGF5OiAnZ3JpZCcsXG59KTtcblxuY29uc3QgU3R5bGVkRmllbGRzZXQgPSBzdHlsZWQoJ2ZpZWxkc2V0Jykoe1xuICBib3JkZXI6ICcwcHgnLFxuICBwYWRkaW5nOiAnMC4wMWVtIDAgMCAwJyxcbiAgbWFyZ2luOiAnMHB4JyxcbiAgbWluV2lkdGg6ICcwcHgnLFxuICAnJjpmb2N1cyc6IHtcbiAgICBvdXRsaW5lOiAnbm9uZScsXG4gIH0sXG59KTtcblxuY29uc3QgU3JPbmx5ID0gc3R5bGVkKCdoMycpKHtcbiAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gIGxlZnQ6ICctMTAwMDBweCcsXG4gIHRvcDogJ2F1dG8nLFxuICB3aWR0aDogJzFweCcsXG4gIGhlaWdodDogJzFweCcsXG4gIG92ZXJmbG93OiAnaGlkZGVuJyxcbn0pO1xuXG5jb25zdCBFcnJvclRleHQgPSBzdHlsZWQoJ2RpdicpKCh7IHRoZW1lIH0pID0+ICh7XG4gIGZvbnRTaXplOiB0aGVtZS50eXBvZ3JhcGh5LmZvbnRTaXplIC0gMixcbiAgY29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgcGFkZGluZ1RvcDogdGhlbWUuc3BhY2luZygxKSxcbn0pKTtcblxuZXhwb3J0IGNsYXNzIE11bHRpcGxlQ2hvaWNlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgbW9kZTogUHJvcFR5cGVzLm9uZU9mKFsnZ2F0aGVyJywgJ3ZpZXcnLCAnZXZhbHVhdGUnXSksXG4gICAgY2hvaWNlTW9kZTogUHJvcFR5cGVzLm9uZU9mKFsncmFkaW8nLCAnY2hlY2tib3gnXSksXG4gICAga2V5TW9kZTogUHJvcFR5cGVzLm9uZU9mKFsnbnVtYmVycycsICdsZXR0ZXJzJywgJ25vbmUnXSksXG4gICAgY2hvaWNlczogUHJvcFR5cGVzLmFycmF5LFxuICAgIHBhcnRMYWJlbDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBwcm9tcHQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgdGVhY2hlckluc3RydWN0aW9uczogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBzZXNzaW9uOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBvbkNob2ljZUNoYW5nZWQ6IFByb3BUeXBlcy5mdW5jLFxuICAgIHJlc3BvbnNlQ29ycmVjdDogUHJvcFR5cGVzLmJvb2wsXG4gICAgY29ycmVjdFJlc3BvbnNlOiBQcm9wVHlwZXMuYXJyYXksXG4gICAgY2hvaWNlc0xheW91dDogUHJvcFR5cGVzLm9uZU9mKFsndmVydGljYWwnLCAnZ3JpZCcsICdob3Jpem9udGFsJ10pLFxuICAgIGdyaWRDb2x1bW5zOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGFsd2F5c1Nob3dDb3JyZWN0OiBQcm9wVHlwZXMuYm9vbCxcbiAgICBhbmltYXRpb25zRGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuICAgIGxhbmd1YWdlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHNlbGVjdGVkQW5zd2VyQmFja2dyb3VuZENvbG9yOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHNlbGVjdGVkQW5zd2VyU3Ryb2tlQ29sb3I6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgc2VsZWN0ZWRBbnN3ZXJTdHJva2VXaWR0aDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBob3ZlckFuc3dlckJhY2tncm91bmRDb2xvcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBob3ZlckFuc3dlclN0cm9rZUNvbG9yOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGhvdmVyQW5zd2VyU3Ryb2tlV2lkdGg6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgb25TaG93Q29ycmVjdFRvZ2dsZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgaXNTZWxlY3Rpb25CdXR0b25CZWxvdzogUHJvcFR5cGVzLmJvb2wsXG4gICAgbWluU2VsZWN0aW9uczogUHJvcFR5cGVzLm51bWJlcixcbiAgICBtYXhTZWxlY3Rpb25zOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIGF1dG9wbGF5QXVkaW9FbmFibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBjdXN0b21BdWRpb0J1dHRvbjoge1xuICAgICAgcGxheUltYWdlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgcGF1c2VJbWFnZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB9LFxuICAgIG9wdGlvbnM6IFByb3BUeXBlcy5vYmplY3QsXG4gIH07XG5cbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgc2hvd0NvcnJlY3Q6ICh0aGlzLnByb3BzLm9wdGlvbnMgJiYgdGhpcy5wcm9wcy5hbHdheXNTaG93Q29ycmVjdCkgfHwgZmFsc2UsXG4gICAgICBtYXhTZWxlY3Rpb25zRXJyb3JTdGF0ZTogZmFsc2UsXG4gICAgfTtcblxuICAgIHRoaXMub25Ub2dnbGUgPSB0aGlzLm9uVG9nZ2xlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5maXJzdElucHV0UmVmID0gUmVhY3QuY3JlYXRlUmVmKCk7XG4gIH1cblxuICBpc1NlbGVjdGVkKHZhbHVlKSB7XG4gICAgY29uc3Qgc2Vzc2lvblZhbHVlID0gdGhpcy5wcm9wcy5zZXNzaW9uICYmIHRoaXMucHJvcHMuc2Vzc2lvbi52YWx1ZTtcblxuICAgIHJldHVybiBzZXNzaW9uVmFsdWUgJiYgc2Vzc2lvblZhbHVlLmluZGV4T2YgJiYgc2Vzc2lvblZhbHVlLmluZGV4T2YodmFsdWUpID49IDA7XG4gIH1cblxuICAvLyBoYW5kbGVDaGFuZ2Ugd2FzIGFkZGVkIGZvciBhY2Nlc3NpYmlsaXR5LiBQbGVhc2Ugc2VlIGNvbW1lbnRzIGFuZCB2aWRlb3MgZnJvbSBQRC0yNDQxLlxuICBoYW5kbGVDaGFuZ2UgPSAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB7IHZhbHVlLCBjaGVja2VkIH0gPSBldmVudC50YXJnZXQ7XG4gICAgY29uc3QgeyBtYXhTZWxlY3Rpb25zLCBvbkNob2ljZUNoYW5nZWQsIHNlc3Npb24gfSA9IHRoaXMucHJvcHM7XG5cbiAgICBpZiAoc2Vzc2lvbi52YWx1ZSAmJiBzZXNzaW9uLnZhbHVlLmxlbmd0aCA+PSBtYXhTZWxlY3Rpb25zKSB7XG4gICAgICAvLyBzaG93L2hpZGUgbWF4IHNlbGVjdGlvbnMgZXJyb3Igd2hlbiB1c2VyIHNlbGVjdC9kZXNlbGVjdCBhbiBhbnN3ZXJcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBtYXhTZWxlY3Rpb25zRXJyb3JTdGF0ZTogY2hlY2tlZCB9KTtcblxuICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgLy8gcHJldmVudCBzZWxlY3RpbmcgbW9yZSBhbnN3ZXJzXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvbkNob2ljZUNoYW5nZWQoeyB2YWx1ZSwgc2VsZWN0ZWQ6IGNoZWNrZWQsIHNlbGVjdG9yOiAnTW91c2UnIH0pO1xuICB9O1xuXG4gIG9uVG9nZ2xlID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnByb3BzLm1vZGUgPT09ICdldmFsdWF0ZScpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzaG93Q29ycmVjdDogIXRoaXMuc3RhdGUuc2hvd0NvcnJlY3QgfSwgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5vblNob3dDb3JyZWN0VG9nZ2xlKSB7XG4gICAgICAgICAgdGhpcy5wcm9wcy5vblNob3dDb3JyZWN0VG9nZ2xlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICBpZiAoIW5leHRQcm9wcy5jb3JyZWN0UmVzcG9uc2UgJiYgdGhpcy5zdGF0ZS5zaG93Q29ycmVjdCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzaG93Q29ycmVjdDogZmFsc2UgfSwgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5vblNob3dDb3JyZWN0VG9nZ2xlKSB7XG4gICAgICAgICAgdGhpcy5wcm9wcy5vblNob3dDb3JyZWN0VG9nZ2xlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChuZXh0UHJvcHMub3B0aW9ucyAmJiBuZXh0UHJvcHMuYWx3YXlzU2hvd0NvcnJlY3QgJiYgdGhpcy5zdGF0ZS5zaG93Q29ycmVjdCAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNob3dDb3JyZWN0OiB0cnVlIH0sICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25TaG93Q29ycmVjdFRvZ2dsZSkge1xuICAgICAgICAgIHRoaXMucHJvcHMub25TaG93Q29ycmVjdFRvZ2dsZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpbmRleFRvU3ltYm9sKGluZGV4KSB7XG4gICAgaWYgKHRoaXMucHJvcHMua2V5TW9kZSA9PT0gJ251bWJlcnMnKSB7XG4gICAgICByZXR1cm4gYCR7aW5kZXggKyAxfWA7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHMua2V5TW9kZSA9PT0gJ2xldHRlcnMnKSB7XG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSg5NyArIGluZGV4KS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGdldENvcnJlY3RuZXNzID0gKGNob2ljZSA9IHt9KSA9PiB7XG4gICAgY29uc3QgaXNDb3JyZWN0ID0gY2hvaWNlLmNvcnJlY3Q7XG4gICAgY29uc3QgaXNDaGVja2VkID0gdGhpcy5pc1NlbGVjdGVkKGNob2ljZS52YWx1ZSk7XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5zaG93Q29ycmVjdCkge1xuICAgICAgcmV0dXJuIGlzQ29ycmVjdCA/ICdjb3JyZWN0JyA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoaXNDb3JyZWN0KSB7XG4gICAgICBpZiAoaXNDaGVja2VkKSB7XG4gICAgICAgIC8vIEEgY29ycmVjdCBhbnN3ZXIgaXMgc2VsZWN0ZWQ6IG1hcmtlZCB3aXRoIGEgZ3JlZW4gY2hlY2ttYXJrXG4gICAgICAgIHJldHVybiAnY29ycmVjdCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBIGNvcnJlY3QgYW5zd2VyIGlzIE5PVCBzZWxlY3RlZDogbWFya2VkIHdpdGggYW4gb3JhbmdlIFhcbiAgICAgICAgcmV0dXJuICdpbmNvcnJlY3QnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNDaGVja2VkKSB7XG4gICAgICAgIC8vIEFuIGluY29ycmVjdCBhbnN3ZXIgaXMgc2VsZWN0ZWQ6IG1hcmtlZCB3aXRoIGFuIG9yYW5nZSBYXG4gICAgICAgIHJldHVybiAnaW5jb3JyZWN0JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFuIGluY29ycmVjdCBhbnN3ZXIgaXMgTk9UIHNlbGVjdGVkOiBub3QgbWFya2VkXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGdldENoZWNrZWQoY2hvaWNlKSB7XG4gICAgLy8gY2hlY2sgZm9yIHByaW50IGNvbnRleHQ6IG9wdGlvbnMgcHJvcCBpcyBwYXNzZWQgZnJvbSBwcmludC5qcyBhbmQgYWx3YXlzU2hvd0NvcnJlY3QgaXMgdHJ1ZVxuICAgIGNvbnN0IGlzUHJpbnRNb2RlID0gdGhpcy5wcm9wcy5vcHRpb25zICYmIHRoaXMucHJvcHMuYWx3YXlzU2hvd0NvcnJlY3Q7XG5cbiAgICBpZiAoaXNQcmludE1vZGUpIHtcbiAgICAgIHJldHVybiBjaG9pY2UuY29ycmVjdCB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBldmFsdWF0ZSBtb2RlIHdpdGggc2hvdyBjb3JyZWN0IHRvZ2dsZWRcbiAgICBjb25zdCBpc0V2YWx1YXRlTW9kZSA9IHRoaXMuc3RhdGUuc2hvd0NvcnJlY3QgJiYgdGhpcy5wcm9wcy5tb2RlID09PSAnZXZhbHVhdGUnO1xuXG4gICAgaWYgKGlzRXZhbHVhdGVNb2RlKSB7XG4gICAgICByZXR1cm4gY2hvaWNlLmNvcnJlY3QgfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gZGVmYXVsdCBiZWhhdmlvcjogc2hvdyB3aGF0IHRoZSB1c2VyIGhhcyBzZWxlY3RlZFxuICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWQoY2hvaWNlLnZhbHVlKTtcbiAgfVxuXG4gIC8vIHJlbmRlckhlYWRpbmcgZnVuY3Rpb24gd2FzIGFkZGVkIGZvciBhY2Nlc3NpYmlsaXR5LlxuICByZW5kZXJIZWFkaW5nKCkge1xuICAgIGNvbnN0IHsgbW9kZSwgY2hvaWNlTW9kZSB9ID0gdGhpcy5wcm9wcztcblxuICAgIGlmIChtb2RlICE9PSAnZ2F0aGVyJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNob2ljZU1vZGUgPT09ICdyYWRpbycgPyAoXG4gICAgICA8U3JPbmx5Pk11bHRpcGxlIENob2ljZSBRdWVzdGlvbjwvU3JPbmx5PlxuICAgICkgOiAoXG4gICAgICA8U3JPbmx5Pk11bHRpcGxlIFNlbGVjdCBRdWVzdGlvbjwvU3JPbmx5PlxuICAgICk7XG4gIH1cblxuICBoYW5kbGVHcm91cEZvY3VzID0gKGUpID0+IHtcbiAgICBjb25zdCBmaWVsZHNldCA9IGUuY3VycmVudFRhcmdldDtcbiAgICBjb25zdCBhY3RpdmVFbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoZmllbGRzZXQuY29udGFpbnMoYWN0aXZlRWwpICYmIGFjdGl2ZUVsICE9PSBmaWVsZHNldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE9ubHkgZm9jdXMgdGhlIGZpcnN0IGlucHV0IGlmIHVzZXIgaXMgdGFiYmluZyBmb3J3YXJkXG4gICAgaWYgKCFlLnJlbGF0ZWRUYXJnZXQgfHwgZmllbGRzZXQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZS5yZWxhdGVkVGFyZ2V0KSAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HKSB7XG4gICAgICBpZiAodGhpcy5maXJzdElucHV0UmVmPy5jdXJyZW50KSB7XG4gICAgICAgIHRoaXMuZmlyc3RJbnB1dFJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBtb2RlLFxuICAgICAgZGlzYWJsZWQsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBjaG9pY2VzID0gW10sXG4gICAgICBjaG9pY2VNb2RlLFxuICAgICAgZ3JpZENvbHVtbnMsXG4gICAgICBwYXJ0TGFiZWwsXG4gICAgICBwcm9tcHQsXG4gICAgICByZXNwb25zZUNvcnJlY3QsXG4gICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zLFxuICAgICAgYWx3YXlzU2hvd0NvcnJlY3QsXG4gICAgICBhbmltYXRpb25zRGlzYWJsZWQsXG4gICAgICBsYW5ndWFnZSxcbiAgICAgIGlzU2VsZWN0aW9uQnV0dG9uQmVsb3csXG4gICAgICBtaW5TZWxlY3Rpb25zLFxuICAgICAgbWF4U2VsZWN0aW9ucyxcbiAgICAgIGF1dG9wbGF5QXVkaW9FbmFibGVkLFxuICAgICAgc2Vzc2lvbixcbiAgICAgIGN1c3RvbUF1ZGlvQnV0dG9uLFxuICAgICAgb3B0aW9ucyxcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IHNob3dDb3JyZWN0LCBtYXhTZWxlY3Rpb25zRXJyb3JTdGF0ZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBpc0V2YWx1YXRlTW9kZSA9IG1vZGUgPT09ICdldmFsdWF0ZSc7XG4gICAgY29uc3Qgc2hvd0NvcnJlY3RBbnN3ZXJUb2dnbGUgPSBpc0V2YWx1YXRlTW9kZSAmJiAhcmVzcG9uc2VDb3JyZWN0O1xuICAgIGNvbnN0IGNvbHVtbnNTdHlsZSA9IGdyaWRDb2x1bW5zID4gMSA/IHsgZ3JpZFRlbXBsYXRlQ29sdW1uczogYHJlcGVhdCgke2dyaWRDb2x1bW5zfSwgMWZyKWAgfSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gKHNlc3Npb24udmFsdWUgJiYgc2Vzc2lvbi52YWx1ZS5sZW5ndGgpIHx8IDA7XG5cbiAgICBjb25zdCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRGl2ID0gKFxuICAgICAgPFByZXZpZXdQcm9tcHRcbiAgICAgICAgdGFnTmFtZT1cImRpdlwiXG4gICAgICAgIGNsYXNzTmFtZT1cInByb21wdFwiXG4gICAgICAgIGRlZmF1bHRDbGFzc05hbWU9XCJ0ZWFjaGVyLWluc3RydWN0aW9uc1wiXG4gICAgICAgIHByb21wdD17dGVhY2hlckluc3RydWN0aW9uc31cbiAgICAgIC8+XG4gICAgKTtcblxuICAgIGNvbnN0IGdldE11bHRpcGxlQ2hvaWNlTWluU2VsZWN0aW9uRXJyb3JNZXNzYWdlID0gKCkgPT4ge1xuICAgICAgaWYgKG1pblNlbGVjdGlvbnMgJiYgbWF4U2VsZWN0aW9ucykge1xuICAgICAgICByZXR1cm4gbWluU2VsZWN0aW9ucyA9PT0gbWF4U2VsZWN0aW9uc1xuICAgICAgICAgID8gdHJhbnNsYXRvci50KCd0cmFuc2xhdGlvbjptdWx0aXBsZUNob2ljZTptaW5tYXhTZWxlY3Rpb25zX2VxdWFsJywgeyBsbmc6IGxhbmd1YWdlLCBtaW5TZWxlY3Rpb25zIH0pXG4gICAgICAgICAgOiB0cmFuc2xhdG9yLnQoJ3RyYW5zbGF0aW9uOm11bHRpcGxlQ2hvaWNlOm1pbm1heFNlbGVjdGlvbnNfcmFuZ2UnLCB7XG4gICAgICAgICAgICAgIGxuZzogbGFuZ3VhZ2UsXG4gICAgICAgICAgICAgIG1pblNlbGVjdGlvbnMsXG4gICAgICAgICAgICAgIG1heFNlbGVjdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1pblNlbGVjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0b3IudCgndHJhbnNsYXRpb246bXVsdGlwbGVDaG9pY2U6bWluU2VsZWN0aW9ucycsIHsgbG5nOiBsYW5ndWFnZSwgbWluU2VsZWN0aW9ucyB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICcnO1xuICAgIH07XG5cbiAgICBjb25zdCBMYXlvdXRDb21wb25lbnQgPSB0aGlzLnByb3BzLmNob2ljZXNMYXlvdXQgPT09ICdncmlkJ1xuICAgICAgPyBHcmlkTGF5b3V0XG4gICAgICA6IHRoaXMucHJvcHMuY2hvaWNlc0xheW91dCA9PT0gJ2hvcml6b250YWwnXG4gICAgICAgID8gSG9yaXpvbnRhbExheW91dFxuICAgICAgICA6IEJveDtcblxuICAgIHJldHVybiAoXG4gICAgICA8TWFpbkNvbnRhaW5lciBpZD17J21haW4tY29udGFpbmVyJ30gY2xhc3NOYW1lPXtjbGFzc05hbWVzKGNsYXNzTmFtZSwgJ211bHRpcGxlLWNob2ljZScpfT5cbiAgICAgICAge3BhcnRMYWJlbCAmJiA8UGFydExhYmVsPntwYXJ0TGFiZWx9PC9QYXJ0TGFiZWw+fVxuXG4gICAgICAgIHt0aGlzLnJlbmRlckhlYWRpbmcoKX1cblxuICAgICAgICB7dGVhY2hlckluc3RydWN0aW9ucyAmJiAoXG4gICAgICAgICAgPFRlYWNoZXJJbnN0cnVjdGlvbnM+XG4gICAgICAgICAgICB7IWFuaW1hdGlvbnNEaXNhYmxlZCA/IChcbiAgICAgICAgICAgICAgPENvbGxhcHNpYmxlXG4gICAgICAgICAgICAgICAgbGFiZWxzPXt7XG4gICAgICAgICAgICAgICAgICBoaWRkZW46ICdTaG93IFRlYWNoZXIgSW5zdHJ1Y3Rpb25zJyxcbiAgICAgICAgICAgICAgICAgIHZpc2libGU6ICdIaWRlIFRlYWNoZXIgSW5zdHJ1Y3Rpb25zJyxcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3RlYWNoZXJJbnN0cnVjdGlvbnNEaXZ9XG4gICAgICAgICAgICAgIDwvQ29sbGFwc2libGU+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zRGl2XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvVGVhY2hlckluc3RydWN0aW9ucz5cbiAgICAgICAgKX1cblxuICAgICAgICA8U3R5bGVkRmllbGRzZXRcbiAgICAgICAgICB0YWJJbmRleD17MH1cbiAgICAgICAgICBvbkZvY3VzPXt0aGlzLmhhbmRsZUdyb3VwRm9jdXN9XG4gICAgICAgICAgcm9sZT17Y2hvaWNlTW9kZSA9PT0gJ3JhZGlvJyA/ICdyYWRpb2dyb3VwJyA6ICdncm91cCd9XG4gICAgICAgID5cbiAgICAgICAgICA8UHJldmlld1Byb21wdFxuICAgICAgICAgICAgY2xhc3NOYW1lPVwicHJvbXB0XCJcbiAgICAgICAgICAgIGRlZmF1bHRDbGFzc05hbWU9XCJwcm9tcHRcIlxuICAgICAgICAgICAgcHJvbXB0PXtwcm9tcHR9XG4gICAgICAgICAgICB0YWdOYW1lPXsnbGVnZW5kJ31cbiAgICAgICAgICAgIGF1dG9wbGF5QXVkaW9FbmFibGVkPXthdXRvcGxheUF1ZGlvRW5hYmxlZH1cbiAgICAgICAgICAgIGN1c3RvbUF1ZGlvQnV0dG9uPXtjdXN0b21BdWRpb0J1dHRvbn1cbiAgICAgICAgICAvPlxuXG4gICAgICAgICAgeyEob3B0aW9ucyAmJiBhbHdheXNTaG93Q29ycmVjdCkgJiYgKFxuICAgICAgICAgICAgPENvcnJlY3RBbnN3ZXJUb2dnbGVcbiAgICAgICAgICAgICAgc2hvdz17c2hvd0NvcnJlY3RBbnN3ZXJUb2dnbGV9XG4gICAgICAgICAgICAgIHRvZ2dsZWQ9e3Nob3dDb3JyZWN0fVxuICAgICAgICAgICAgICBvblRvZ2dsZT17dGhpcy5vblRvZ2dsZS5iaW5kKHRoaXMpfVxuICAgICAgICAgICAgICBsYW5ndWFnZT17bGFuZ3VhZ2V9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICA8TGF5b3V0Q29tcG9uZW50IHN0eWxlPXtjb2x1bW5zU3R5bGV9PlxuICAgICAgICAgICAge2Nob2ljZXMubWFwKChjaG9pY2UsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgIDxDaG9pY2VcbiAgICAgICAgICAgICAgICBhdXRvRm9jdXNSZWY9e2luZGV4ID09PSAwID8gdGhpcy5maXJzdElucHV0UmVmIDogbnVsbH1cbiAgICAgICAgICAgICAgICBjaG9pY2VzTGF5b3V0PXt0aGlzLnByb3BzLmNob2ljZXNMYXlvdXR9XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRBbnN3ZXJCYWNrZ3JvdW5kQ29sb3I9e3RoaXMucHJvcHMuc2VsZWN0ZWRBbnN3ZXJCYWNrZ3JvdW5kQ29sb3J9XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRBbnN3ZXJTdHJva2VDb2xvcj17dGhpcy5wcm9wcy5zZWxlY3RlZEFuc3dlclN0cm9rZUNvbG9yfVxuICAgICAgICAgICAgICAgIHNlbGVjdGVkQW5zd2VyU3Ryb2tlV2lkdGg9e3RoaXMucHJvcHMuc2VsZWN0ZWRBbnN3ZXJTdHJva2VXaWR0aH1cbiAgICAgICAgICAgICAgICBob3ZlckFuc3dlckJhY2tncm91bmRDb2xvcj17dGhpcy5wcm9wcy5ob3ZlckFuc3dlckJhY2tncm91bmRDb2xvcn1cbiAgICAgICAgICAgICAgICBob3ZlckFuc3dlclN0cm9rZUNvbG9yPXt0aGlzLnByb3BzLmhvdmVyQW5zd2VyU3Ryb2tlQ29sb3J9XG4gICAgICAgICAgICAgICAgaG92ZXJBbnN3ZXJTdHJva2VXaWR0aD17dGhpcy5wcm9wcy5ob3ZlckFuc3dlclN0cm9rZVdpZHRofVxuICAgICAgICAgICAgICAgIGdyaWRDb2x1bW5zPXtncmlkQ29sdW1uc31cbiAgICAgICAgICAgICAgICBrZXk9e2BjaG9pY2UtJHtpbmRleH1gfVxuICAgICAgICAgICAgICAgIGNob2ljZT17Y2hvaWNlfVxuICAgICAgICAgICAgICAgIGluZGV4PXtpbmRleH1cbiAgICAgICAgICAgICAgICBjaG9pY2VzTGVuZ3RoPXtjaG9pY2VzLmxlbmd0aH1cbiAgICAgICAgICAgICAgICBzaG93Q29ycmVjdD17c2hvd0NvcnJlY3R9XG4gICAgICAgICAgICAgICAgaXNFdmFsdWF0ZU1vZGU9e2lzRXZhbHVhdGVNb2RlfVxuICAgICAgICAgICAgICAgIGNob2ljZU1vZGU9e2Nob2ljZU1vZGV9XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgICAgIHRhZ05hbWU9e3BhcnRMYWJlbCA/IGBncm91cC0ke3BhcnRMYWJlbH1gIDogJ2dyb3VwJ31cbiAgICAgICAgICAgICAgICBvbkNob2ljZUNoYW5nZWQ9e3RoaXMuaGFuZGxlQ2hhbmdlfVxuICAgICAgICAgICAgICAgIGhpZGVUaWNrPXtjaG9pY2UuaGlkZVRpY2t9XG4gICAgICAgICAgICAgICAgY2hlY2tlZD17dGhpcy5nZXRDaGVja2VkKGNob2ljZSl9XG4gICAgICAgICAgICAgICAgY29ycmVjdG5lc3M9e2lzRXZhbHVhdGVNb2RlID8gdGhpcy5nZXRDb3JyZWN0bmVzcyhjaG9pY2UpIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgIGRpc3BsYXlLZXk9e3RoaXMuaW5kZXhUb1N5bWJvbChpbmRleCl9XG4gICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25CdXR0b25CZWxvdz17aXNTZWxlY3Rpb25CdXR0b25CZWxvd31cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgIDwvTGF5b3V0Q29tcG9uZW50PlxuICAgICAgICA8L1N0eWxlZEZpZWxkc2V0PlxuXG4gICAgICAgIHtjaG9pY2VNb2RlID09PSAnY2hlY2tib3gnICYmIHNlbGVjdGlvbnMgPCBtaW5TZWxlY3Rpb25zICYmIChcbiAgICAgICAgICA8RXJyb3JUZXh0PntnZXRNdWx0aXBsZUNob2ljZU1pblNlbGVjdGlvbkVycm9yTWVzc2FnZSgpfTwvRXJyb3JUZXh0PlxuICAgICAgICApfVxuICAgICAgICB7Y2hvaWNlTW9kZSA9PT0gJ2NoZWNrYm94JyAmJiBtYXhTZWxlY3Rpb25zRXJyb3JTdGF0ZSAmJiAoXG4gICAgICAgICAgPEVycm9yVGV4dD5cbiAgICAgICAgICAgIHt0cmFuc2xhdG9yLnQoYHRyYW5zbGF0aW9uOm11bHRpcGxlQ2hvaWNlOm1heFNlbGVjdGlvbnNfJHttYXhTZWxlY3Rpb25zID09PSAxID8gJ29uZScgOiAnb3RoZXInfWAsIHtcbiAgICAgICAgICAgICAgbG5nOiBsYW5ndWFnZSxcbiAgICAgICAgICAgICAgbWF4U2VsZWN0aW9ucyxcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvRXJyb3JUZXh0PlxuICAgICAgICApfVxuICAgICAgPC9NYWluQ29udGFpbmVyPlxuICAgICk7XG4gIH1cbn1cblxuTXVsdGlwbGVDaG9pY2UuZGVmYXVsdFByb3BzID0ge1xuICBzZXNzaW9uOiB7XG4gICAgdmFsdWU6IFtdLFxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgTXVsdGlwbGVDaG9pY2U7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsVUFBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsb0JBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLFdBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLE9BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLElBQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFNLFNBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFdBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFRLE9BQUEsR0FBQVQsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLE1BQU07RUFBRVM7QUFBVyxDQUFDLEdBQUdDLG1CQUFVO0FBRWpD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
|