@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.
Files changed (51) hide show
  1. package/configure/lib/__tests__/root.test.js +286 -0
  2. package/configure/lib/defaults.js +3 -5
  3. package/configure/lib/defaults.js.map +1 -1
  4. package/configure/lib/index.js +156 -193
  5. package/configure/lib/index.js.map +1 -1
  6. package/configure/lib/main.js +325 -445
  7. package/configure/lib/main.js.map +1 -1
  8. package/configure/lib/utils.js +9 -9
  9. package/configure/lib/utils.js.map +1 -1
  10. package/configure/package.json +10 -8
  11. package/controller/lib/__tests__/index.test.js +520 -0
  12. package/controller/lib/__tests__/utils.test.js +8 -0
  13. package/controller/lib/defaults.js +3 -4
  14. package/controller/lib/defaults.js.map +1 -1
  15. package/controller/lib/index.js +145 -240
  16. package/controller/lib/index.js.map +1 -1
  17. package/controller/lib/utils.js +5 -17
  18. package/controller/lib/utils.js.map +1 -1
  19. package/controller/package.json +2 -2
  20. package/docs/demo/pie.manifest.json +11 -0
  21. package/lib/__tests__/choice-input-test.js +49 -0
  22. package/lib/__tests__/index-test.js +200 -0
  23. package/lib/__tests__/key-events-test.js +95 -0
  24. package/lib/__tests__/multiple-choice-test.js +101 -0
  25. package/lib/__tests__/session-updater-test.js +70 -0
  26. package/lib/choice-input.js +312 -369
  27. package/lib/choice-input.js.map +1 -1
  28. package/lib/choice.js +164 -220
  29. package/lib/choice.js.map +1 -1
  30. package/lib/feedback-tick.js +75 -115
  31. package/lib/feedback-tick.js.map +1 -1
  32. package/lib/index.js +242 -342
  33. package/lib/index.js.map +1 -1
  34. package/lib/main.js +39 -86
  35. package/lib/main.js.map +1 -1
  36. package/lib/multiple-choice.js +305 -397
  37. package/lib/multiple-choice.js.map +1 -1
  38. package/lib/print.js +40 -78
  39. package/lib/print.js.map +1 -1
  40. package/lib/session-updater.js +5 -16
  41. package/lib/session-updater.js.map +1 -1
  42. package/package.json +13 -16
  43. package/module/configure.js +0 -1
  44. package/module/controller.js +0 -3472
  45. package/module/demo.js +0 -86
  46. package/module/element.js +0 -1
  47. package/module/index.html +0 -21
  48. package/module/manifest.json +0 -14
  49. package/module/print-demo.js +0 -124
  50. package/module/print.html +0 -18
  51. package/module/print.js +0 -1
@@ -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["default"] = exports.MultipleChoice = void 0;
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 _styles = require("@material-ui/core/styles");
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
- 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); }; }
41
-
42
- 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; } }
43
-
44
- // MultipleChoice
45
- var translator = _translator["default"].translator;
46
-
47
- var styles = function styles(theme) {
48
- return {
49
- main: {
50
- color: _renderUi.color.text(),
51
- backgroundColor: _renderUi.color.background(),
52
- '& *': {
53
- '-webkit-font-smoothing': 'antialiased'
54
- },
55
- position: 'relative',
56
- // remove border from legend tags inside main to override the OT default styles
57
- '& legend': {
58
- border: 'none !important'
59
- }
60
- },
61
- partLabel: {
62
- display: 'block',
63
- fontSize: 'inherit',
64
- margin: '0',
65
- fontWeight: 'normal',
66
- paddingBottom: theme.spacing.unit * 2
67
- },
68
- teacherInstructions: {
69
- marginBottom: theme.spacing.unit * 2
70
- },
71
- horizontalLayout: {
72
- display: 'flex',
73
- flexDirection: 'row',
74
- flexWrap: 'wrap'
75
- },
76
- gridLayout: {
77
- display: 'grid'
78
- },
79
- fieldset: {
80
- border: '0px',
81
- padding: '0.01em 0 0 0',
82
- margin: '0px',
83
- minWidth: '0px',
84
- '&:focus': {
85
- outline: 'none'
86
- }
87
- },
88
- srOnly: {
89
- position: 'absolute',
90
- left: '-10000px',
91
- top: 'auto',
92
- width: '1px',
93
- height: '1px',
94
- overflow: 'hidden'
95
- },
96
- errorText: {
97
- fontSize: theme.typography.fontSize - 2,
98
- color: theme.palette.error.main,
99
- paddingTop: theme.spacing.unit
100
- }
101
- };
102
- };
103
-
104
- var MultipleChoice = /*#__PURE__*/function (_React$Component) {
105
- (0, _inherits2["default"])(MultipleChoice, _React$Component);
106
-
107
- var _super = _createSuper(MultipleChoice);
108
-
109
- function MultipleChoice(props) {
110
- var _this;
111
-
112
- (0, _classCallCheck2["default"])(this, MultipleChoice);
113
- _this = _super.call(this, props);
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
- _this.setState({
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: value,
104
+ value,
137
105
  selected: checked,
138
106
  selector: 'Mouse'
139
107
  });
140
108
  });
141
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onToggle", function () {
142
- if (_this.props.mode === 'evaluate') {
143
- _this.setState({
144
- showCorrect: !_this.state.showCorrect
145
- }, function () {
146
- if (_this.props.onShowCorrectToggle) {
147
- _this.props.onShowCorrectToggle();
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["default"])((0, _assertThisInitialized2["default"])(_this), "getCorrectness", function () {
153
- var choice = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
154
- var isCorrect = choice.correct;
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["default"])((0, _assertThisInitialized2["default"])(_this), "handleGroupFocus", function (e) {
181
- var fieldset = e.currentTarget;
182
- var activeEl = document.activeElement;
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
- } // Only focus the first input if user is tabbing forward
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
- var _this$firstInputRef;
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
- _this.state = {
198
- showCorrect: _this.props.options && _this.props.alwaysShowCorrect || false,
158
+ this.state = {
159
+ showCorrect: this.props.options && this.props.alwaysShowCorrect || false,
199
160
  maxSelectionsErrorState: false
200
161
  };
201
- _this.onToggle = _this.onToggle.bind((0, _assertThisInitialized2["default"])(_this));
202
- _this.firstInputRef = /*#__PURE__*/_react["default"].createRef();
203
- return _this;
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
- (0, _createClass2["default"])(MultipleChoice, [{
207
- key: "isSelected",
208
- value: function isSelected(value) {
209
- var sessionValue = this.props.session && this.props.session.value;
210
- return sessionValue && sessionValue.indexOf && sessionValue.indexOf(value) >= 0;
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
- key: "UNSAFE_componentWillReceiveProps",
215
- value: function UNSAFE_componentWillReceiveProps(nextProps) {
216
- var _this2 = this;
211
+ // default behavior: show what the user has selected
212
+ return this.isSelected(choice.value);
213
+ }
217
214
 
218
- if (!nextProps.correctResponse && this.state.showCorrect !== false) {
219
- this.setState({
220
- showCorrect: false
221
- }, function () {
222
- if (_this2.props.onShowCorrectToggle) {
223
- _this2.props.onShowCorrectToggle();
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
- if (nextProps.options && nextProps.alwaysShowCorrect && this.state.showCorrect !== true) {
229
- this.setState({
230
- showCorrect: true
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
- key: "getChecked",
253
- value: function getChecked(choice) {
254
- // check for print context: options prop is passed from print.js and alwaysShowCorrect is true
255
- var isPrintMode = this.props.options && this.props.alwaysShowCorrect;
256
-
257
- if (isPrintMode) {
258
- return choice.correct || false;
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
- return choiceMode === 'radio' ? /*#__PURE__*/_react["default"].createElement("h3", {
285
- className: classes.srOnly
286
- }, "Multiple Choice Question") : /*#__PURE__*/_react["default"].createElement("h3", {
287
- className: classes.srOnly
288
- }, "Multiple Select Question");
289
- }
290
- }, {
291
- key: "render",
292
- value: function render() {
293
- var _classNames,
294
- _this3 = this;
295
-
296
- var _this$props3 = this.props,
297
- mode = _this$props3.mode,
298
- disabled = _this$props3.disabled,
299
- className = _this$props3.className,
300
- _this$props3$choices = _this$props3.choices,
301
- choices = _this$props3$choices === void 0 ? [] : _this$props3$choices,
302
- choiceMode = _this$props3.choiceMode,
303
- gridColumns = _this$props3.gridColumns,
304
- partLabel = _this$props3.partLabel,
305
- prompt = _this$props3.prompt,
306
- responseCorrect = _this$props3.responseCorrect,
307
- teacherInstructions = _this$props3.teacherInstructions,
308
- classes = _this$props3.classes,
309
- alwaysShowCorrect = _this$props3.alwaysShowCorrect,
310
- animationsDisabled = _this$props3.animationsDisabled,
311
- language = _this$props3.language,
312
- isSelectionButtonBelow = _this$props3.isSelectionButtonBelow,
313
- minSelections = _this$props3.minSelections,
314
- maxSelections = _this$props3.maxSelections,
315
- autoplayAudioEnabled = _this$props3.autoplayAudioEnabled,
316
- session = _this$props3.session,
317
- customAudioButton = _this$props3.customAudioButton,
318
- options = _this$props3.options;
319
- var _this$state = this.state,
320
- showCorrect = _this$state.showCorrect,
321
- maxSelectionsErrorState = _this$state.maxSelectionsErrorState;
322
- var isEvaluateMode = mode === 'evaluate';
323
- var showCorrectAnswerToggle = isEvaluateMode && !responseCorrect;
324
- var columnsStyle = gridColumns > 1 ? {
325
- gridTemplateColumns: "repeat(".concat(gridColumns, ", 1fr)")
326
- } : undefined;
327
- var selections = session.value && session.value.length || 0;
328
-
329
- var teacherInstructionsDiv = /*#__PURE__*/_react["default"].createElement(_renderUi.PreviewPrompt, {
330
- tagName: "div",
331
- className: "prompt",
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["default"])(MultipleChoice, "propTypes", {
432
- className: _propTypes["default"].string,
433
- mode: _propTypes["default"].oneOf(['gather', 'view', 'evaluate']),
434
- choiceMode: _propTypes["default"].oneOf(['radio', 'checkbox']),
435
- keyMode: _propTypes["default"].oneOf(['numbers', 'letters', 'none']),
436
- choices: _propTypes["default"].array,
437
- partLabel: _propTypes["default"].string,
438
- prompt: _propTypes["default"].string,
439
- teacherInstructions: _propTypes["default"].string,
440
- session: _propTypes["default"].object,
441
- disabled: _propTypes["default"].bool,
442
- onChoiceChanged: _propTypes["default"].func,
443
- responseCorrect: _propTypes["default"].bool,
444
- classes: _propTypes["default"].object.isRequired,
445
- correctResponse: _propTypes["default"].array,
446
- choicesLayout: _propTypes["default"].oneOf(['vertical', 'grid', 'horizontal']),
447
- gridColumns: _propTypes["default"].string,
448
- alwaysShowCorrect: _propTypes["default"].bool,
449
- animationsDisabled: _propTypes["default"].bool,
450
- language: _propTypes["default"].string,
451
- selectedAnswerBackgroundColor: _propTypes["default"].string,
452
- selectedAnswerStrokeColor: _propTypes["default"].string,
453
- selectedAnswerStrokeWidth: _propTypes["default"].string,
454
- hoverAnswerBackgroundColor: _propTypes["default"].string,
455
- hoverAnswerStrokeColor: _propTypes["default"].string,
456
- hoverAnswerStrokeWidth: _propTypes["default"].string,
457
- onShowCorrectToggle: _propTypes["default"].func,
458
- isSelectionButtonBelow: _propTypes["default"].bool,
459
- minSelections: _propTypes["default"].number,
460
- maxSelections: _propTypes["default"].number,
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["default"].string,
464
- pauseImage: _propTypes["default"].string
374
+ playImage: _propTypes.default.string,
375
+ pauseImage: _propTypes.default.string
465
376
  },
466
- options: _propTypes["default"].object
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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