@pie-element/multiple-choice 9.19.0-beta.0 → 9.19.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 (54) hide show
  1. package/CHANGELOG.md +68 -2
  2. package/configure/CHANGELOG.md +61 -2
  3. package/configure/lib/defaults.js +1 -1
  4. package/configure/lib/defaults.js.map +1 -0
  5. package/configure/lib/index.js +2 -2
  6. package/configure/lib/index.js.map +1 -0
  7. package/configure/lib/main.js +7 -7
  8. package/configure/lib/main.js.map +1 -0
  9. package/configure/lib/utils.js +1 -1
  10. package/configure/lib/utils.js.map +1 -0
  11. package/configure/package.json +2 -4
  12. package/controller/CHANGELOG.md +61 -2
  13. package/controller/lib/defaults.js +1 -1
  14. package/controller/lib/defaults.js.map +1 -0
  15. package/controller/lib/index.js +2 -2
  16. package/controller/lib/index.js.map +1 -0
  17. package/controller/lib/utils.js +1 -1
  18. package/controller/lib/utils.js.map +1 -0
  19. package/controller/package.json +2 -2
  20. package/lib/choice-input.js +2 -2
  21. package/lib/choice-input.js.map +1 -0
  22. package/lib/choice.js +1 -1
  23. package/lib/choice.js.map +1 -0
  24. package/lib/feedback-tick.js +2 -2
  25. package/lib/feedback-tick.js.map +1 -0
  26. package/lib/index.js +22 -8
  27. package/lib/index.js.map +1 -0
  28. package/lib/main.js +2 -2
  29. package/lib/main.js.map +1 -0
  30. package/lib/multiple-choice.js +9 -6
  31. package/lib/multiple-choice.js.map +1 -0
  32. package/lib/print.js +2 -2
  33. package/lib/print.js.map +1 -0
  34. package/lib/session-updater.js +1 -1
  35. package/lib/session-updater.js.map +1 -0
  36. package/module/configure.js +11070 -0
  37. package/module/controller.js +3601 -0
  38. package/module/demo.js +86 -0
  39. package/module/element.js +13461 -0
  40. package/module/index.html +21 -0
  41. package/module/manifest.json +14 -0
  42. package/module/print-demo.js +124 -0
  43. package/module/print.html +18 -0
  44. package/module/print.js +13207 -0
  45. package/package.json +3 -6
  46. package/configure/lib/__tests__/root.test.js +0 -271
  47. package/controller/lib/__tests__/index.test.js +0 -867
  48. package/controller/lib/__tests__/utils.test.js +0 -8
  49. package/docs/demo/pie.manifest.json +0 -11
  50. package/lib/__tests__/choice-input-test.js +0 -131
  51. package/lib/__tests__/index-test.js +0 -183
  52. package/lib/__tests__/key-events-test.js +0 -98
  53. package/lib/__tests__/multiple-choice-test.js +0 -235
  54. package/lib/__tests__/session-updater-test.js +0 -72
@@ -1,867 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
6
-
7
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
8
-
9
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
-
11
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
-
13
- var _index = require("../index");
14
-
15
- var _utils = require("../utils");
16
-
17
- var _defaults = _interopRequireDefault(require("../defaults"));
18
-
19
- var _templateObject, _templateObject2, _templateObject3;
20
-
21
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
22
-
23
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
24
-
25
- jest.mock('../utils', function () {
26
- return {
27
- isResponseCorrect: jest.fn()
28
- };
29
- });
30
- describe('controller', function () {
31
- var result, question, session, env;
32
- beforeEach(function () {
33
- question = {
34
- id: '1',
35
- element: 'multiple-choice',
36
- prompt: 'prompt',
37
- promptEnabled: true,
38
- choicePrefix: 'letters',
39
- choiceMode: 'radio',
40
- feedbackEnabled: true,
41
- choices: [{
42
- label: 'a',
43
- value: 'apple',
44
- correct: true,
45
- feedback: {
46
- type: 'custom',
47
- value: 'foo'
48
- }
49
- }, {
50
- label: 'b',
51
- value: 'banana',
52
- feedback: {
53
- type: 'default'
54
- }
55
- }]
56
- };
57
- });
58
- var stringify = JSON.stringify;
59
- describe('model', function () {
60
- describe('mode: gather', function () {
61
- beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
62
- return _regenerator["default"].wrap(function _callee$(_context) {
63
- while (1) {
64
- switch (_context.prev = _context.next) {
65
- case 0:
66
- session = {};
67
- env = {
68
- mode: 'gather'
69
- };
70
- _context.next = 4;
71
- return (0, _index.model)(question, session, env);
72
-
73
- case 4:
74
- result = _context.sent;
75
-
76
- case 5:
77
- case "end":
78
- return _context.stop();
79
- }
80
- }
81
- }, _callee);
82
- })));
83
- it('returns disabled', function () {
84
- expect(result.disabled).toEqual(false);
85
- });
86
- it('returns mode', function () {
87
- expect(result.mode).toEqual('gather');
88
- });
89
- it('returns prompt', function () {
90
- expect(result.prompt).toEqual('prompt');
91
- });
92
- it('returns choiceMode', function () {
93
- expect(result.choiceMode).toEqual('radio');
94
- });
95
- it('returns choicePrefix', function () {
96
- expect(result.keyMode).toEqual('letters');
97
- });
98
- it('returns choices', function () {
99
- expect(result.choices).toEqual(expect.arrayContaining([{
100
- label: 'a',
101
- value: 'apple',
102
- rationale: null
103
- }, {
104
- label: 'b',
105
- value: 'banana',
106
- rationale: null
107
- }]));
108
- });
109
- it('does not return responseCorrect', function () {
110
- expect(result.responseCorrect).toBe(undefined);
111
- });
112
- });
113
- describe('model - with updateSession', function () {
114
- it('calls updateSession', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
115
- var updateSession;
116
- return _regenerator["default"].wrap(function _callee2$(_context2) {
117
- while (1) {
118
- switch (_context2.prev = _context2.next) {
119
- case 0:
120
- session = {
121
- id: '1',
122
- element: 'multiple-choice'
123
- };
124
- env = {
125
- mode: 'gather'
126
- };
127
- question = _objectSpread(_objectSpread({}, question), {}, {
128
- lockChoiceOrder: false
129
- });
130
- updateSession = jest.fn().mockResolvedValue();
131
- _context2.next = 6;
132
- return (0, _index.model)(question, session, env, updateSession);
133
-
134
- case 6:
135
- expect(updateSession).toHaveBeenCalledWith('1', 'multiple-choice', {
136
- shuffledValues: expect.arrayContaining(['apple', 'banana'])
137
- });
138
-
139
- case 7:
140
- case "end":
141
- return _context2.stop();
142
- }
143
- }
144
- }, _callee2);
145
- })));
146
- });
147
- describe('mode: view', function () {
148
- beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
149
- return _regenerator["default"].wrap(function _callee3$(_context3) {
150
- while (1) {
151
- switch (_context3.prev = _context3.next) {
152
- case 0:
153
- session = {};
154
- env = {
155
- mode: 'view'
156
- };
157
- _context3.next = 4;
158
- return (0, _index.model)(question, session, env);
159
-
160
- case 4:
161
- result = _context3.sent;
162
-
163
- case 5:
164
- case "end":
165
- return _context3.stop();
166
- }
167
- }
168
- }, _callee3);
169
- })));
170
- it('returns disabled', function () {
171
- expect(result.disabled).toEqual(true);
172
- });
173
- });
174
- describe('mode: evaluate', function () {
175
- beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
176
- return _regenerator["default"].wrap(function _callee4$(_context4) {
177
- while (1) {
178
- switch (_context4.prev = _context4.next) {
179
- case 0:
180
- session = {};
181
- env = {
182
- mode: 'evaluate'
183
- };
184
-
185
- _utils.isResponseCorrect.mockReturnValue(false);
186
-
187
- _context4.next = 5;
188
- return (0, _index.model)(question, session, env);
189
-
190
- case 5:
191
- result = _context4.sent;
192
- return _context4.abrupt("return", result);
193
-
194
- case 7:
195
- case "end":
196
- return _context4.stop();
197
- }
198
- }
199
- }, _callee4);
200
- })));
201
- it('returns choices w/ correct', function () {
202
- expect(result.choices).toEqual(expect.arrayContaining([{
203
- label: 'a',
204
- value: 'apple',
205
- correct: true,
206
- feedback: 'foo',
207
- rationale: null
208
- }, {
209
- label: 'b',
210
- value: 'banana',
211
- correct: false,
212
- feedback: 'Incorrect',
213
- rationale: null
214
- }]));
215
- });
216
- it('returns choices w/ correct even if feedbackEnabled is false', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
217
- return _regenerator["default"].wrap(function _callee5$(_context5) {
218
- while (1) {
219
- switch (_context5.prev = _context5.next) {
220
- case 0:
221
- _context5.next = 2;
222
- return (0, _index.model)(_objectSpread(_objectSpread({}, question), {}, {
223
- feedbackEnabled: false
224
- }), session, env, jest.fn());
225
-
226
- case 2:
227
- result = _context5.sent;
228
- expect(result.choices).toEqual(expect.arrayContaining([{
229
- label: 'a',
230
- value: 'apple',
231
- correct: true,
232
- feedback: undefined,
233
- rationale: null
234
- }, {
235
- label: 'b',
236
- value: 'banana',
237
- correct: false,
238
- feedback: undefined,
239
- rationale: null
240
- }]));
241
-
242
- case 4:
243
- case "end":
244
- return _context5.stop();
245
- }
246
- }
247
- }, _callee5);
248
- })));
249
- it('returns feedback undefined if feedbackEnabled is false', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
250
- return _regenerator["default"].wrap(function _callee6$(_context6) {
251
- while (1) {
252
- switch (_context6.prev = _context6.next) {
253
- case 0:
254
- _context6.next = 2;
255
- return (0, _index.model)(_objectSpread(_objectSpread({}, question), {}, {
256
- feedbackEnabled: false
257
- }), session, env, jest.fn());
258
-
259
- case 2:
260
- result = _context6.sent;
261
- expect(result.choices).toEqual(expect.arrayContaining([{
262
- label: 'a',
263
- value: 'apple',
264
- correct: true,
265
- feedback: undefined,
266
- rationale: null
267
- }, {
268
- label: 'b',
269
- value: 'banana',
270
- correct: false,
271
- feedback: undefined,
272
- rationale: null
273
- }]));
274
-
275
- case 4:
276
- case "end":
277
- return _context6.stop();
278
- }
279
- }
280
- }, _callee6);
281
- })));
282
- it('returns proper feedback if feedbackEnabled is true', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
283
- return _regenerator["default"].wrap(function _callee7$(_context7) {
284
- while (1) {
285
- switch (_context7.prev = _context7.next) {
286
- case 0:
287
- _context7.next = 2;
288
- return (0, _index.model)(_objectSpread(_objectSpread({}, question), {}, {
289
- feedbackEnabled: true
290
- }), session, env, jest.fn());
291
-
292
- case 2:
293
- result = _context7.sent;
294
- expect(result.choices).toEqual(expect.arrayContaining([{
295
- label: 'a',
296
- value: 'apple',
297
- correct: true,
298
- feedback: 'foo',
299
- rationale: null
300
- }, {
301
- label: 'b',
302
- value: 'banana',
303
- correct: false,
304
- feedback: 'Incorrect',
305
- rationale: null
306
- }]));
307
-
308
- case 4:
309
- case "end":
310
- return _context7.stop();
311
- }
312
- }
313
- }, _callee7);
314
- })));
315
- it('returns is response correct', function () {
316
- expect(result.responseCorrect).toEqual(false);
317
- });
318
-
319
- var returnsCorrectness = function returnsCorrectness(sess) {
320
- it("returns responseCorrect: false if session is ".concat(stringify(sess)), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
321
- var o;
322
- return _regenerator["default"].wrap(function _callee8$(_context8) {
323
- while (1) {
324
- switch (_context8.prev = _context8.next) {
325
- case 0:
326
- _context8.next = 2;
327
- return (0, _index.model)(question, sess, env);
328
-
329
- case 2:
330
- o = _context8.sent;
331
- expect(o.responseCorrect).toEqual(false);
332
-
333
- case 4:
334
- case "end":
335
- return _context8.stop();
336
- }
337
- }
338
- }, _callee8);
339
- })));
340
- };
341
-
342
- returnsCorrectness(undefined);
343
- returnsCorrectness(null);
344
- returnsCorrectness({});
345
- });
346
- describe('choicePrefix is undefined', function () {
347
- var question = {
348
- id: '1',
349
- element: 'multiple-choice',
350
- prompt: 'prompt',
351
- promptEnabled: true,
352
- choiceMode: 'radio',
353
- feedbackEnabled: true,
354
- choices: [{
355
- label: 'a',
356
- value: 'apple',
357
- correct: true,
358
- feedback: {
359
- type: 'custom',
360
- value: 'foo'
361
- }
362
- }, {
363
- label: 'b',
364
- value: 'banana',
365
- feedback: {
366
- type: 'default'
367
- }
368
- }]
369
- };
370
- beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
371
- return _regenerator["default"].wrap(function _callee9$(_context9) {
372
- while (1) {
373
- switch (_context9.prev = _context9.next) {
374
- case 0:
375
- session = {};
376
- env = {
377
- mode: 'gather'
378
- };
379
- _context9.next = 4;
380
- return (0, _index.model)(question, session, env);
381
-
382
- case 4:
383
- result = _context9.sent;
384
-
385
- case 5:
386
- case "end":
387
- return _context9.stop();
388
- }
389
- }
390
- }, _callee9);
391
- })));
392
- it('returns default letters', function () {
393
- expect(result.keyMode).toEqual('letters');
394
- });
395
- });
396
- });
397
- describe('getScore', function () {
398
- it.each(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n sessionValue | expectedDychotomous | expectedPartialScoring\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n ", " | ", " | ", "\n "])), undefined, 0, 0, null, 0, 0, [], 0, 0, ['a'], 0, 0.5, ['e'], 0, 0.5, ['a', 'b'], 0, 0.5, ['a', 'c'], 0, 0.5, ['a', 'd'], 0, 0.5, ['a', 'e'], 1, 1, ['a', 'b', 'c'], 0, 0, ['a', 'b', 'd'], 0, 0, ['a', 'b', 'e'], 0, 0.5, ['a', 'b', 'c', 'd'], 0, 0, ['a', 'b', 'c', 'e'], 0, 0, ['a', 'b', 'c', 'd', 'e'], 0, 0, ['a', 'c', 'd', 'e'], 0, 0, ['a', 'd', 'e'], 0, 0.5)('session = $sessionValue; partial scoring = true => score = $expectedPartialScoring / partial scoring = false => score = $expectedDychotomous', /*#__PURE__*/function () {
399
- var _ref11 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10(_ref10) {
400
- var sessionValue, expectedPartialScoring, expectedDychotomous, q, resultPS, resultD;
401
- return _regenerator["default"].wrap(function _callee10$(_context10) {
402
- while (1) {
403
- switch (_context10.prev = _context10.next) {
404
- case 0:
405
- sessionValue = _ref10.sessionValue, expectedPartialScoring = _ref10.expectedPartialScoring, expectedDychotomous = _ref10.expectedDychotomous;
406
- q = {
407
- choiceMode: 'checkbox',
408
- choices: [{
409
- label: 'a',
410
- value: 'a',
411
- correct: true
412
- }, {
413
- label: 'b',
414
- value: 'b'
415
- }, {
416
- label: 'c',
417
- value: 'c'
418
- }, {
419
- label: 'd',
420
- value: 'd'
421
- }, {
422
- label: 'e',
423
- value: 'e',
424
- correct: true
425
- }]
426
- };
427
- _context10.next = 4;
428
- return (0, _index.outcome)(q, {
429
- value: sessionValue
430
- }, {
431
- mode: 'evaluate '
432
- });
433
-
434
- case 4:
435
- resultPS = _context10.sent;
436
- expect(resultPS.score).toEqual(expectedPartialScoring);
437
- _context10.next = 8;
438
- return (0, _index.outcome)(_objectSpread(_objectSpread({}, q), {}, {
439
- partialScoring: false
440
- }), {
441
- value: sessionValue
442
- }, {
443
- mode: 'evaluate '
444
- });
445
-
446
- case 8:
447
- resultD = _context10.sent;
448
- expect(resultD.score).toEqual(expectedDychotomous);
449
-
450
- case 10:
451
- case "end":
452
- return _context10.stop();
453
- }
454
- }
455
- }, _callee10);
456
- }));
457
-
458
- return function (_x) {
459
- return _ref11.apply(this, arguments);
460
- };
461
- }());
462
- });
463
- describe('outcome', function () {
464
- it('returns score of 0', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() {
465
- var result;
466
- return _regenerator["default"].wrap(function _callee11$(_context11) {
467
- while (1) {
468
- switch (_context11.prev = _context11.next) {
469
- case 0:
470
- _context11.next = 2;
471
- return (0, _index.outcome)(question, {
472
- value: ['banana']
473
- }, {
474
- mode: 'gather'
475
- });
476
-
477
- case 2:
478
- result = _context11.sent;
479
- expect(result.score).toEqual(0);
480
-
481
- case 4:
482
- case "end":
483
- return _context11.stop();
484
- }
485
- }
486
- }, _callee11);
487
- })));
488
- it('returns score of 1', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12() {
489
- var result;
490
- return _regenerator["default"].wrap(function _callee12$(_context12) {
491
- while (1) {
492
- switch (_context12.prev = _context12.next) {
493
- case 0:
494
- _context12.next = 2;
495
- return (0, _index.outcome)(question, {
496
- value: ['apple']
497
- }, {
498
- mode: 'gather'
499
- });
500
-
501
- case 2:
502
- result = _context12.sent;
503
- expect(result.score).toEqual(1);
504
-
505
- case 4:
506
- case "end":
507
- return _context12.stop();
508
- }
509
- }
510
- }, _callee12);
511
- })));
512
- describe('partial scoring', function () {
513
- describe('choiceMode:radio is disabled', function () {
514
- it('with defaults', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13() {
515
- var result;
516
- return _regenerator["default"].wrap(function _callee13$(_context13) {
517
- while (1) {
518
- switch (_context13.prev = _context13.next) {
519
- case 0:
520
- _context13.next = 2;
521
- return (0, _index.outcome)(question, {}, {});
522
-
523
- case 2:
524
- result = _context13.sent;
525
- expect(result.score).toEqual(0);
526
-
527
- case 4:
528
- case "end":
529
- return _context13.stop();
530
- }
531
- }
532
- }, _callee13);
533
- })));
534
- it('with defaults and correct', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14() {
535
- var result;
536
- return _regenerator["default"].wrap(function _callee14$(_context14) {
537
- while (1) {
538
- switch (_context14.prev = _context14.next) {
539
- case 0:
540
- _context14.next = 2;
541
- return (0, _index.outcome)(question, {
542
- value: ['apple']
543
- }, {});
544
-
545
- case 2:
546
- result = _context14.sent;
547
- expect(result.score).toEqual(1);
548
-
549
- case 4:
550
- case "end":
551
- return _context14.stop();
552
- }
553
- }
554
- }, _callee14);
555
- })));
556
- it('with env.partialScoring: true', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15() {
557
- var result;
558
- return _regenerator["default"].wrap(function _callee15$(_context15) {
559
- while (1) {
560
- switch (_context15.prev = _context15.next) {
561
- case 0:
562
- _context15.next = 2;
563
- return (0, _index.outcome)(question, {
564
- partialScoring: true
565
- }, {});
566
-
567
- case 2:
568
- result = _context15.sent;
569
- expect(result.score).toEqual(0);
570
-
571
- case 4:
572
- case "end":
573
- return _context15.stop();
574
- }
575
- }
576
- }, _callee15);
577
- })));
578
- it('with env.partialScoring: true + config.partialScoring: true', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee16() {
579
- var result;
580
- return _regenerator["default"].wrap(function _callee16$(_context16) {
581
- while (1) {
582
- switch (_context16.prev = _context16.next) {
583
- case 0:
584
- _context16.next = 2;
585
- return (0, _index.outcome)(_objectSpread(_objectSpread({}, question), {}, {
586
- partialScoring: true
587
- }), {
588
- partialScoring: true
589
- }, {});
590
-
591
- case 2:
592
- result = _context16.sent;
593
- expect(result.score).toEqual(0);
594
-
595
- case 4:
596
- case "end":
597
- return _context16.stop();
598
- }
599
- }
600
- }, _callee16);
601
- })));
602
- });
603
- describe('checkbox', function () {
604
- beforeEach(function () {
605
- var choices = question.choices.concat({
606
- value: 'c',
607
- correct: true
608
- });
609
- question = _objectSpread(_objectSpread({}, question), {}, {
610
- choiceMode: 'checkbox',
611
- partialScoring: true,
612
- choices: choices
613
- });
614
- });
615
- it.each(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n sessionValue | expected\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n "])), undefined, 0, null, 0, [], 0, ['apple'], 0.25, ['apple', 'cherry'], 0.5, ['apple', 'banana'], 0.5, ['apple', 'banana', 'cherry'], 0.75, ['apple', 'banana', 'grapes'], 0.75, ['apple', 'banana', 'grapes', 'cherry'], 1, ['cherry', 'banana', 'grapes'], 0.75, ['apple', 'durian'], 0.25, ['apple', 'durian', 'elderberries'], 0.25, ['apple', 'durian', 'feijoa', 'elderberries', 'jackfruit'], 0, ['apple', 'durian', 'feijoa', 'elderberries', 'jackfruit', 'kiwi'], 0, ['apple', 'cherry', 'durian', 'feijoa', 'elderberries', 'jackfruit', 'kiwi'], 0, ['apple', 'cherry', 'durian', 'feijoa', 'elderberries', 'jackfruit', 'kiwi'], 0, ['apple', 'cherry', 'banana', 'durian', 'feijoa', 'elderberries', 'jackfruit', 'kiwi'], 0, ['apple', 'cherry', 'banana', 'durian', 'feijoa', 'jackfruit', 'kiwi'], 0, ['apple', 'cherry', 'banana', 'grapes', 'durian', 'jackfruit', 'kiwi'], 0.25, ['apple', 'cherry', 'banana', 'grapes', 'durian', 'jackfruit'], 0.5, ['apple', 'cherry', 'banana', 'grapes', 'durian'], 0.75)('outcome: partial scoring = true, sessionValue = $sessionValue => expected = $expected', /*#__PURE__*/function () {
616
- var _ref19 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee17(_ref18) {
617
- var sessionValue, expected, q, result;
618
- return _regenerator["default"].wrap(function _callee17$(_context17) {
619
- while (1) {
620
- switch (_context17.prev = _context17.next) {
621
- case 0:
622
- sessionValue = _ref18.sessionValue, expected = _ref18.expected;
623
- q = {
624
- choiceMode: 'checkbox',
625
- choices: [{
626
- label: 'a',
627
- value: 'apple',
628
- correct: true
629
- }, {
630
- label: 'b',
631
- value: 'banana',
632
- correct: true
633
- }, {
634
- label: 'c',
635
- value: 'cherry',
636
- correct: true
637
- }, {
638
- label: 'd',
639
- value: 'durian'
640
- }, {
641
- label: 'e',
642
- value: 'elderberries'
643
- }, {
644
- label: 'f',
645
- value: 'feijoa'
646
- }, {
647
- label: 'g',
648
- value: 'grapes',
649
- correct: true
650
- }, {
651
- label: 'j',
652
- value: 'jackfruit'
653
- }, {
654
- label: 'k',
655
- value: 'kiwi'
656
- }]
657
- };
658
- _context17.next = 4;
659
- return (0, _index.outcome)(q, {
660
- value: sessionValue
661
- }, {
662
- mode: 'evaluate '
663
- });
664
-
665
- case 4:
666
- result = _context17.sent;
667
- expect(result.score).toEqual(expected);
668
-
669
- case 6:
670
- case "end":
671
- return _context17.stop();
672
- }
673
- }
674
- }, _callee17);
675
- }));
676
-
677
- return function (_x2) {
678
- return _ref19.apply(this, arguments);
679
- };
680
- }());
681
- });
682
- });
683
- it.each(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n session | empty\n ", " | ", "\n ", " | ", "\n ", " | ", "\n ", " | ", "\n "])), undefined, true, null, true, {}, true, {
684
- value: []
685
- }, false)('returns score: 0 and empty: true if session is $session', /*#__PURE__*/function () {
686
- var _ref21 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee18(_ref20) {
687
- var session, empty, o;
688
- return _regenerator["default"].wrap(function _callee18$(_context18) {
689
- while (1) {
690
- switch (_context18.prev = _context18.next) {
691
- case 0:
692
- session = _ref20.session, empty = _ref20.empty;
693
- _context18.next = 3;
694
- return (0, _index.outcome)(question, session, {
695
- mode: 'evaluate'
696
- });
697
-
698
- case 3:
699
- o = _context18.sent;
700
- expect(o).toEqual({
701
- score: 0,
702
- empty: empty
703
- });
704
-
705
- case 5:
706
- case "end":
707
- return _context18.stop();
708
- }
709
- }
710
- }, _callee18);
711
- }));
712
-
713
- return function (_x3) {
714
- return _ref21.apply(this, arguments);
715
- };
716
- }());
717
- });
718
- describe('correct response', function () {
719
- it('returns correct response if env is correct', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee19() {
720
- var sess;
721
- return _regenerator["default"].wrap(function _callee19$(_context19) {
722
- while (1) {
723
- switch (_context19.prev = _context19.next) {
724
- case 0:
725
- _context19.next = 2;
726
- return (0, _index.createCorrectResponseSession)(question, {
727
- mode: 'gather',
728
- role: 'instructor'
729
- });
730
-
731
- case 2:
732
- sess = _context19.sent;
733
- expect(sess).toEqual({
734
- id: '1',
735
- value: ['apple']
736
- });
737
-
738
- case 4:
739
- case "end":
740
- return _context19.stop();
741
- }
742
- }
743
- }, _callee19);
744
- })));
745
- it('returns null env is student', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee20() {
746
- var noResult;
747
- return _regenerator["default"].wrap(function _callee20$(_context20) {
748
- while (1) {
749
- switch (_context20.prev = _context20.next) {
750
- case 0:
751
- _context20.next = 2;
752
- return (0, _index.createCorrectResponseSession)(question, {
753
- mode: 'gather',
754
- role: 'student'
755
- });
756
-
757
- case 2:
758
- noResult = _context20.sent;
759
- expect(noResult).toBeNull();
760
-
761
- case 4:
762
- case "end":
763
- return _context20.stop();
764
- }
765
- }
766
- }, _callee20);
767
- })));
768
- });
769
- describe('normalize', function () {
770
- it('sets choicesLayout: horizontal if verticalMode: false', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee21() {
771
- var sess;
772
- return _regenerator["default"].wrap(function _callee21$(_context21) {
773
- while (1) {
774
- switch (_context21.prev = _context21.next) {
775
- case 0:
776
- _context21.next = 2;
777
- return (0, _index.normalize)(_objectSpread(_objectSpread({}, question), {}, {
778
- verticalMode: false
779
- }));
780
-
781
- case 2:
782
- sess = _context21.sent;
783
- expect(sess).toEqual(_objectSpread(_objectSpread(_objectSpread({}, _defaults["default"]), question), {}, {
784
- choicesLayout: 'horizontal'
785
- }));
786
-
787
- case 4:
788
- case "end":
789
- return _context21.stop();
790
- }
791
- }
792
- }, _callee21);
793
- })));
794
- it('sets choicesLayout: vertical if verticalMode: true', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee22() {
795
- var sess;
796
- return _regenerator["default"].wrap(function _callee22$(_context22) {
797
- while (1) {
798
- switch (_context22.prev = _context22.next) {
799
- case 0:
800
- _context22.next = 2;
801
- return (0, _index.normalize)(_objectSpread(_objectSpread({}, question), {}, {
802
- verticalMode: true
803
- }));
804
-
805
- case 2:
806
- sess = _context22.sent;
807
- expect(sess).toEqual(_objectSpread(_objectSpread(_objectSpread({}, _defaults["default"]), question), {}, {
808
- choicesLayout: 'vertical'
809
- }));
810
-
811
- case 4:
812
- case "end":
813
- return _context22.stop();
814
- }
815
- }
816
- }, _callee22);
817
- })));
818
- it('sets choicesLayout: grid if verticalMode: true && choicesLayout: grid', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee23() {
819
- var sess;
820
- return _regenerator["default"].wrap(function _callee23$(_context23) {
821
- while (1) {
822
- switch (_context23.prev = _context23.next) {
823
- case 0:
824
- _context23.next = 2;
825
- return (0, _index.normalize)(_objectSpread(_objectSpread({}, question), {}, {
826
- verticalMode: true,
827
- choicesLayout: 'grid'
828
- }));
829
-
830
- case 2:
831
- sess = _context23.sent;
832
- expect(sess).toEqual(_objectSpread(_objectSpread(_objectSpread({}, _defaults["default"]), question), {}, {
833
- choicesLayout: 'grid'
834
- }));
835
-
836
- case 4:
837
- case "end":
838
- return _context23.stop();
839
- }
840
- }
841
- }, _callee23);
842
- })));
843
- it('sets choicesLayout: vertical', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee24() {
844
- var sess;
845
- return _regenerator["default"].wrap(function _callee24$(_context24) {
846
- while (1) {
847
- switch (_context24.prev = _context24.next) {
848
- case 0:
849
- _context24.next = 2;
850
- return (0, _index.normalize)(question);
851
-
852
- case 2:
853
- sess = _context24.sent;
854
- expect(sess).toEqual(_objectSpread(_objectSpread(_objectSpread({}, _defaults["default"]), question), {}, {
855
- choicesLayout: 'vertical'
856
- }));
857
-
858
- case 4:
859
- case "end":
860
- return _context24.stop();
861
- }
862
- }
863
- }, _callee24);
864
- })));
865
- });
866
- });
867
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5kZXgudGVzdC5qcyJdLCJuYW1lcyI6WyJqZXN0IiwibW9jayIsImlzUmVzcG9uc2VDb3JyZWN0IiwiZm4iLCJkZXNjcmliZSIsInJlc3VsdCIsInF1ZXN0aW9uIiwic2Vzc2lvbiIsImVudiIsImJlZm9yZUVhY2giLCJpZCIsImVsZW1lbnQiLCJwcm9tcHQiLCJwcm9tcHRFbmFibGVkIiwiY2hvaWNlUHJlZml4IiwiY2hvaWNlTW9kZSIsImZlZWRiYWNrRW5hYmxlZCIsImNob2ljZXMiLCJsYWJlbCIsInZhbHVlIiwiY29ycmVjdCIsImZlZWRiYWNrIiwidHlwZSIsInN0cmluZ2lmeSIsIkpTT04iLCJtb2RlIiwiaXQiLCJleHBlY3QiLCJkaXNhYmxlZCIsInRvRXF1YWwiLCJrZXlNb2RlIiwiYXJyYXlDb250YWluaW5nIiwicmF0aW9uYWxlIiwicmVzcG9uc2VDb3JyZWN0IiwidG9CZSIsInVuZGVmaW5lZCIsImxvY2tDaG9pY2VPcmRlciIsInVwZGF0ZVNlc3Npb24iLCJtb2NrUmVzb2x2ZWRWYWx1ZSIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwic2h1ZmZsZWRWYWx1ZXMiLCJtb2NrUmV0dXJuVmFsdWUiLCJyZXR1cm5zQ29ycmVjdG5lc3MiLCJzZXNzIiwibyIsImVhY2giLCJzZXNzaW9uVmFsdWUiLCJleHBlY3RlZFBhcnRpYWxTY29yaW5nIiwiZXhwZWN0ZWREeWNob3RvbW91cyIsInEiLCJyZXN1bHRQUyIsInNjb3JlIiwicGFydGlhbFNjb3JpbmciLCJyZXN1bHREIiwiY29uY2F0IiwiZXhwZWN0ZWQiLCJlbXB0eSIsInJvbGUiLCJub1Jlc3VsdCIsInRvQmVOdWxsIiwidmVydGljYWxNb2RlIiwiZGVmYXVsdHMiLCJjaG9pY2VzTGF5b3V0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7QUFFQUEsSUFBSSxDQUFDQyxJQUFMLENBQVUsVUFBVixFQUFzQjtBQUFB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LElBQUQsQ0FBTixDQUFhZCxPQUFiLCtDQUEwQmdDLG9CQUExQixHQUF1Q3ZELFFBQXZDO0FBQWlEd0QsZ0JBQUFBLGFBQWEsRUFBRTtBQUFoRTs7QUFIMEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FBMUUsR0FBRjtBQU1BcEMsSUFBQUEsRUFBRSxDQUFDLDhCQUFELDZGQUFpQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHFCQUNkLHNCQUFVcEIsUUFBVixDQURjOztBQUFBO0FBQzNCcUMsY0FBQUEsSUFEMkI7QUFHakNoQixjQUFBQSxNQUFNLENBQUNnQixJQUFELENBQU4sQ0FBYWQsT0FBYiwrQ0FBMEJnQyxvQkFBMUIsR0FBdUN2RCxRQUF2QztBQUFpRHdELGdCQUFBQSxhQUFhLEVBQUU7QUFBaEU7O0FBSGlDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBQWpDLEdBQUY7QUFLRCxHQXhCTyxDQUFSO0FBeUJELENBdmRPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtb2RlbCwgb3V0Y29tZSwgZ2V0U2NvcmUsIGNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24sIG5vcm1hbGl6ZSB9IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IGlzUmVzcG9uc2VDb3JyZWN0IH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4uL2RlZmF1bHRzJztcblxuamVzdC5tb2NrKCcuLi91dGlscycsICgpID0+ICh7XG4gIGlzUmVzcG9uc2VDb3JyZWN0OiBqZXN0LmZuKCksXG59KSk7XG5cbmRlc2NyaWJlKCdjb250cm9sbGVyJywgKCkgPT4ge1xuICBsZXQgcmVzdWx0LCBxdWVzdGlvbiwgc2Vzc2lvbiwgZW52O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHF1ZXN0aW9uID0ge1xuICAgICAgaWQ6ICcxJyxcbiAgICAgIGVsZW1lbnQ6ICdtdWx0aXBsZS1jaG9pY2UnLFxuICAgICAgcHJvbXB0OiAncHJvbXB0JyxcbiAgICAgIHByb21wdEVuYWJsZWQ6IHRydWUsXG4gICAgICBjaG9pY2VQcmVmaXg6ICdsZXR0ZXJzJyxcbiAgICAgIGNob2ljZU1vZGU6ICdyYWRpbycsXG4gICAgICBmZWVkYmFja0VuYWJsZWQ6IHRydWUsXG4gICAgICBjaG9pY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ2EnLFxuICAgICAgICAgIHZhbHVlOiAnYXBwbGUnLFxuICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgZmVlZGJhY2s6IHtcbiAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxuICAgICAgICAgICAgdmFsdWU6ICdmb28nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ2InLFxuICAgICAgICAgIHZhbHVlOiAnYmFuYW5hJyxcbiAgICAgICAgICBmZWVkYmFjazoge1xuICAgICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH0pO1xuXG4gIGNvbnN0IHsgc3RyaW5naWZ5IH0gPSBKU09OO1xuXG4gIGRlc2NyaWJlKCdtb2RlbCcsICgpID0+IHtcbiAgICBkZXNjcmliZSgnbW9kZTogZ2F0aGVyJywgKCkgPT4ge1xuICAgICAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG4gICAgICAgIHNlc3Npb24gPSB7fTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAnZ2F0aGVyJyB9O1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBtb2RlbChxdWVzdGlvbiwgc2Vzc2lvbiwgZW52KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5kaXNhYmxlZCkudG9FcXVhbChmYWxzZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgbW9kZScsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5tb2RlKS50b0VxdWFsKCdnYXRoZXInKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBwcm9tcHQnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQucHJvbXB0KS50b0VxdWFsKCdwcm9tcHQnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBjaG9pY2VNb2RlJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmNob2ljZU1vZGUpLnRvRXF1YWwoJ3JhZGlvJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgY2hvaWNlUHJlZml4JywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmtleU1vZGUpLnRvRXF1YWwoJ2xldHRlcnMnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBjaG9pY2VzJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmNob2ljZXMpLnRvRXF1YWwoXG4gICAgICAgICAgZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXG4gICAgICAgICAgICB7IGxhYmVsOiAnYScsIHZhbHVlOiAnYXBwbGUnLCByYXRpb25hbGU6IG51bGwgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdiJywgdmFsdWU6ICdiYW5hbmEnLCByYXRpb25hbGU6IG51bGwgfSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnZG9lcyBub3QgcmV0dXJuIHJlc3BvbnNlQ29ycmVjdCcsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5yZXNwb25zZUNvcnJlY3QpLnRvQmUodW5kZWZpbmVkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ21vZGVsIC0gd2l0aCB1cGRhdGVTZXNzaW9uJywgKCkgPT4ge1xuICAgICAgaXQoJ2NhbGxzIHVwZGF0ZVNlc3Npb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHNlc3Npb24gPSB7IGlkOiAnMScsIGVsZW1lbnQ6ICdtdWx0aXBsZS1jaG9pY2UnIH07XG4gICAgICAgIGVudiA9IHsgbW9kZTogJ2dhdGhlcicgfTtcbiAgICAgICAgcXVlc3Rpb24gPSB7IC4uLnF1ZXN0aW9uLCBsb2NrQ2hvaWNlT3JkZXI6IGZhbHNlIH07XG4gICAgICAgIGNvbnN0IHVwZGF0ZVNlc3Npb24gPSBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoKTtcblxuICAgICAgICBhd2FpdCBtb2RlbChxdWVzdGlvbiwgc2Vzc2lvbiwgZW52LCB1cGRhdGVTZXNzaW9uKTtcblxuICAgICAgICBleHBlY3QodXBkYXRlU2Vzc2lvbikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJzEnLCAnbXVsdGlwbGUtY2hvaWNlJywge1xuICAgICAgICAgIHNodWZmbGVkVmFsdWVzOiBleHBlY3QuYXJyYXlDb250YWluaW5nKFsnYXBwbGUnLCAnYmFuYW5hJ10pLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ21vZGU6IHZpZXcnLCAoKSA9PiB7XG4gICAgICBiZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgc2Vzc2lvbiA9IHt9O1xuICAgICAgICBlbnYgPSB7IG1vZGU6ICd2aWV3JyB9O1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBtb2RlbChxdWVzdGlvbiwgc2Vzc2lvbiwgZW52KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5kaXNhYmxlZCkudG9FcXVhbCh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ21vZGU6IGV2YWx1YXRlJywgKCkgPT4ge1xuICAgICAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG4gICAgICAgIHNlc3Npb24gPSB7fTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAnZXZhbHVhdGUnIH07XG4gICAgICAgIGlzUmVzcG9uc2VDb3JyZWN0Lm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IG1vZGVsKHF1ZXN0aW9uLCBzZXNzaW9uLCBlbnYpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGNob2ljZXMgdy8gY29ycmVjdCcsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5jaG9pY2VzKS50b0VxdWFsKFxuICAgICAgICAgIGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ2EnLFxuICAgICAgICAgICAgICB2YWx1ZTogJ2FwcGxlJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgZmVlZGJhY2s6ICdmb28nLFxuICAgICAgICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ2InLFxuICAgICAgICAgICAgICB2YWx1ZTogJ2JhbmFuYScsXG4gICAgICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICBmZWVkYmFjazogJ0luY29ycmVjdCcsXG4gICAgICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSksXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgY2hvaWNlcyB3LyBjb3JyZWN0IGV2ZW4gaWYgZmVlZGJhY2tFbmFibGVkIGlzIGZhbHNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBtb2RlbChcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICAgIGZlZWRiYWNrRW5hYmxlZDogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXNzaW9uLFxuICAgICAgICAgIGVudixcbiAgICAgICAgICBqZXN0LmZuKCksXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC5jaG9pY2VzKS50b0VxdWFsKFxuICAgICAgICAgIGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ2EnLFxuICAgICAgICAgICAgICB2YWx1ZTogJ2FwcGxlJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgZmVlZGJhY2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdiJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdiYW5hbmEnLFxuICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgZmVlZGJhY2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBmZWVkYmFjayB1bmRlZmluZWQgaWYgZmVlZGJhY2tFbmFibGVkIGlzIGZhbHNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBtb2RlbChcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICAgIGZlZWRiYWNrRW5hYmxlZDogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXNzaW9uLFxuICAgICAgICAgIGVudixcbiAgICAgICAgICBqZXN0LmZuKCksXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdC5jaG9pY2VzKS50b0VxdWFsKFxuICAgICAgICAgIGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ2EnLFxuICAgICAgICAgICAgICB2YWx1ZTogJ2FwcGxlJyxcbiAgICAgICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgZmVlZGJhY2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdiJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdiYW5hbmEnLFxuICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgZmVlZGJhY2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBwcm9wZXIgZmVlZGJhY2sgaWYgZmVlZGJhY2tFbmFibGVkIGlzIHRydWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IG1vZGVsKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgICAgZmVlZGJhY2tFbmFibGVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2Vzc2lvbixcbiAgICAgICAgICBlbnYsXG4gICAgICAgICAgamVzdC5mbigpLFxuICAgICAgICApO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQuY2hvaWNlcykudG9FcXVhbChcbiAgICAgICAgICBleHBlY3QuYXJyYXlDb250YWluaW5nKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdhJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdhcHBsZScsXG4gICAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICAgIGZlZWRiYWNrOiAnZm9vJyxcbiAgICAgICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdiJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdiYW5hbmEnLFxuICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgZmVlZGJhY2s6ICdJbmNvcnJlY3QnLFxuICAgICAgICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGlzIHJlc3BvbnNlIGNvcnJlY3QnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQucmVzcG9uc2VDb3JyZWN0KS50b0VxdWFsKGZhbHNlKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXR1cm5zQ29ycmVjdG5lc3MgPSAoc2VzcykgPT4ge1xuICAgICAgICBpdChgcmV0dXJucyByZXNwb25zZUNvcnJlY3Q6IGZhbHNlIGlmIHNlc3Npb24gaXMgJHtzdHJpbmdpZnkoc2Vzcyl9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG8gPSBhd2FpdCBtb2RlbChxdWVzdGlvbiwgc2VzcywgZW52KTtcblxuICAgICAgICAgIGV4cGVjdChvLnJlc3BvbnNlQ29ycmVjdCkudG9FcXVhbChmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuc0NvcnJlY3RuZXNzKHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm5zQ29ycmVjdG5lc3MobnVsbCk7XG4gICAgICByZXR1cm5zQ29ycmVjdG5lc3Moe30pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2Nob2ljZVByZWZpeCBpcyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBxdWVzdGlvbiA9IHtcbiAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgZWxlbWVudDogJ211bHRpcGxlLWNob2ljZScsXG4gICAgICAgIHByb21wdDogJ3Byb21wdCcsXG4gICAgICAgIHByb21wdEVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGNob2ljZU1vZGU6ICdyYWRpbycsXG4gICAgICAgIGZlZWRiYWNrRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnYScsXG4gICAgICAgICAgICB2YWx1ZTogJ2FwcGxlJyxcbiAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICBmZWVkYmFjazoge1xuICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdmb28nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnYicsXG4gICAgICAgICAgICB2YWx1ZTogJ2JhbmFuYScsXG4gICAgICAgICAgICBmZWVkYmFjazoge1xuICAgICAgICAgICAgICB0eXBlOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICBiZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgc2Vzc2lvbiA9IHt9O1xuICAgICAgICBlbnYgPSB7IG1vZGU6ICdnYXRoZXInIH07XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IG1vZGVsKHF1ZXN0aW9uLCBzZXNzaW9uLCBlbnYpO1xuICAgICAgfSk7XG4gICAgICBpdCgncmV0dXJucyBkZWZhdWx0IGxldHRlcnMnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQua2V5TW9kZSkudG9FcXVhbCgnbGV0dGVycycpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRTY29yZScsICgpID0+IHtcbiAgICBpdC5lYWNoYFxuICAgICAgc2Vzc2lvblZhbHVlICAgICAgICAgICAgICAgICB8IGV4cGVjdGVkRHljaG90b21vdXMgfCBleHBlY3RlZFBhcnRpYWxTY29yaW5nXG4gICAgICAke3VuZGVmaW5lZH0gICAgICAgICAgICAgICAgIHwgJHswfSAgICAgICAgICAgICAgICB8ICR7MH1cbiAgICAgICR7bnVsbH0gICAgICAgICAgICAgICAgICAgICAgfCAkezB9ICAgICAgICAgICAgICAgIHwgJHswfVxuICAgICAgJHtbXX0gICAgICAgICAgICAgICAgICAgICAgICB8ICR7MH0gICAgICAgICAgICAgICAgfCAkezB9XG4gICAgICAke1snYSddfSAgICAgICAgICAgICAgICAgICAgIHwgJHswfSAgICAgICAgICAgICAgICB8ICR7MC41fVxuICAgICAgJHtbJ2UnXX0gICAgICAgICAgICAgICAgICAgICB8ICR7MH0gICAgICAgICAgICAgICAgfCAkezAuNX1cbiAgICAgICR7WydhJywgJ2InXX0gICAgICAgICAgICAgICAgfCAkezB9ICAgICAgICAgICAgICAgIHwgJHswLjV9XG4gICAgICAke1snYScsICdjJ119ICAgICAgICAgICAgICAgIHwgJHswfSAgICAgICAgICAgICAgICB8ICR7MC41fVxuICAgICAgJHtbJ2EnLCAnZCddfSAgICAgICAgICAgICAgICB8ICR7MH0gICAgICAgICAgICAgICAgfCAkezAuNX1cbiAgICAgICR7WydhJywgJ2UnXX0gICAgICAgICAgICAgICAgfCAkezF9ICAgICAgICAgICAgICAgIHwgJHsxfVxuICAgICAgJHtbJ2EnLCAnYicsICdjJ119ICAgICAgICAgICB8ICR7MH0gICAgICAgICAgICAgICAgfCAkezB9XG4gICAgICAke1snYScsICdiJywgJ2QnXX0gICAgICAgICAgIHwgJHswfSAgICAgICAgICAgICAgICB8ICR7MH1cbiAgICAgICR7WydhJywgJ2InLCAnZSddfSAgICAgICAgICAgfCAkezB9ICAgICAgICAgICAgICAgIHwgJHswLjV9XG4gICAgICAke1snYScsICdiJywgJ2MnLCAnZCddfSAgICAgIHwgJHswfSAgICAgICAgICAgICAgICB8ICR7MH1cbiAgICAgICR7WydhJywgJ2InLCAnYycsICdlJ119ICAgICAgfCAkezB9ICAgICAgICAgICAgICAgIHwgJHswfVxuICAgICAgJHtbJ2EnLCAnYicsICdjJywgJ2QnLCAnZSddfSB8ICR7MH0gICAgICAgICAgICAgICAgfCAkezB9XG4gICAgICAke1snYScsICdjJywgJ2QnLCAnZSddfSAgICAgIHwgJHswfSAgICAgICAgICAgICAgICB8ICR7MH1cbiAgICAgICR7WydhJywgJ2QnLCAnZSddfSAgICAgICAgICAgfCAkezB9ICAgICAgICAgICAgICAgIHwgJHswLjV9XG4gICAgYChcbiAgICAgICdzZXNzaW9uID0gJHNlc3Npb25WYWx1ZTsgcGFydGlhbCBzY29yaW5nID0gdHJ1ZSA9PiBzY29yZSA9ICRleHBlY3RlZFBhcnRpYWxTY29yaW5nIC8gcGFydGlhbCBzY29yaW5nID0gZmFsc2UgPT4gc2NvcmUgPSAkZXhwZWN0ZWREeWNob3RvbW91cycsXG4gICAgICBhc3luYyAoeyBzZXNzaW9uVmFsdWUsIGV4cGVjdGVkUGFydGlhbFNjb3JpbmcsIGV4cGVjdGVkRHljaG90b21vdXMgfSkgPT4ge1xuICAgICAgICBjb25zdCBxID0ge1xuICAgICAgICAgIGNob2ljZU1vZGU6ICdjaGVja2JveCcsXG4gICAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgICAgeyBsYWJlbDogJ2EnLCB2YWx1ZTogJ2EnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnYicsIHZhbHVlOiAnYicgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdjJywgdmFsdWU6ICdjJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ2QnLCB2YWx1ZTogJ2QnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnZScsIHZhbHVlOiAnZScsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdFBTID0gYXdhaXQgb3V0Y29tZShxLCB7IHZhbHVlOiBzZXNzaW9uVmFsdWUgfSwgeyBtb2RlOiAnZXZhbHVhdGUgJyB9KTtcblxuICAgICAgICBleHBlY3QocmVzdWx0UFMuc2NvcmUpLnRvRXF1YWwoZXhwZWN0ZWRQYXJ0aWFsU2NvcmluZyk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0RCA9IGF3YWl0IG91dGNvbWUoeyAuLi5xLCBwYXJ0aWFsU2NvcmluZzogZmFsc2UgfSwgeyB2YWx1ZTogc2Vzc2lvblZhbHVlIH0sIHsgbW9kZTogJ2V2YWx1YXRlICcgfSk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdEQuc2NvcmUpLnRvRXF1YWwoZXhwZWN0ZWREeWNob3RvbW91cyk7XG4gICAgICB9LFxuICAgICk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvdXRjb21lJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIHNjb3JlIG9mIDAnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKHF1ZXN0aW9uLCB7IHZhbHVlOiBbJ2JhbmFuYSddIH0sIHsgbW9kZTogJ2dhdGhlcicgfSk7XG4gICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgc2NvcmUgb2YgMScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUocXVlc3Rpb24sIHsgdmFsdWU6IFsnYXBwbGUnXSB9LCB7IG1vZGU6ICdnYXRoZXInIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdwYXJ0aWFsIHNjb3JpbmcnLCAoKSA9PiB7XG4gICAgICBkZXNjcmliZSgnY2hvaWNlTW9kZTpyYWRpbyBpcyBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgICAgaXQoJ3dpdGggZGVmYXVsdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwge30sIHt9KTtcbiAgICAgICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKDApO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3dpdGggZGVmYXVsdHMgYW5kIGNvcnJlY3QnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwgeyB2YWx1ZTogWydhcHBsZSddIH0sIHt9KTtcbiAgICAgICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKDEpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3dpdGggZW52LnBhcnRpYWxTY29yaW5nOiB0cnVlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUocXVlc3Rpb24sIHsgcGFydGlhbFNjb3Jpbmc6IHRydWUgfSwge30pO1xuICAgICAgICAgIGV4cGVjdChyZXN1bHQuc2NvcmUpLnRvRXF1YWwoMCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnd2l0aCBlbnYucGFydGlhbFNjb3Jpbmc6IHRydWUgKyBjb25maWcucGFydGlhbFNjb3Jpbmc6IHRydWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZSh7IC4uLnF1ZXN0aW9uLCBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LCB7IHBhcnRpYWxTY29yaW5nOiB0cnVlIH0sIHt9KTtcbiAgICAgICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKDApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnY2hlY2tib3gnLCAoKSA9PiB7XG4gICAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNob2ljZXMgPSBxdWVzdGlvbi5jaG9pY2VzLmNvbmNhdCh7XG4gICAgICAgICAgICB2YWx1ZTogJ2MnLFxuICAgICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBxdWVzdGlvbiA9IHtcbiAgICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgICAgY2hvaWNlTW9kZTogJ2NoZWNrYm94JyxcbiAgICAgICAgICAgIHBhcnRpYWxTY29yaW5nOiB0cnVlLFxuICAgICAgICAgICAgY2hvaWNlcyxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICBpdC5lYWNoYFxuICAgICAgICAgIHNlc3Npb25WYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXhwZWN0ZWRcbiAgICAgICAgICAke3VuZGVmaW5lZH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICR7MH1cbiAgICAgICAgICAke251bGx9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICR7MH1cbiAgICAgICAgICAke1tdfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICR7MH1cbiAgICAgICAgICAke1snYXBwbGUnXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICR7MC4yNX1cbiAgICAgICAgICAke1snYXBwbGUnLCAnY2hlcnJ5J119ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICR7MC41fVxuICAgICAgICAgICR7WydhcHBsZScsICdiYW5hbmEnXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJHswLjV9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2JhbmFuYScsICdjaGVycnknXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkezAuNzV9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2JhbmFuYScsICdncmFwZXMnXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkezAuNzV9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2JhbmFuYScsICdncmFwZXMnLCAnY2hlcnJ5J119ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkezF9XG4gICAgICAgICAgJHtbJ2NoZXJyeScsICdiYW5hbmEnLCAnZ3JhcGVzJ119ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkezAuNzV9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2R1cmlhbiddfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkezAuMjV9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2R1cmlhbicsICdlbGRlcmJlcnJpZXMnXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkezAuMjV9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2R1cmlhbicsICdmZWlqb2EnLCAnZWxkZXJiZXJyaWVzJywgJ2phY2tmcnVpdCddfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAkezB9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2R1cmlhbicsICdmZWlqb2EnLCAnZWxkZXJiZXJyaWVzJywgJ2phY2tmcnVpdCcsICdraXdpJ119ICAgICAgICAgICAgICAgICAgICAgfCAkezB9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2NoZXJyeScsICdkdXJpYW4nLCAnZmVpam9hJywgJ2VsZGVyYmVycmllcycsICdqYWNrZnJ1aXQnLCAna2l3aSddfSAgICAgICAgICAgfCAkezB9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2NoZXJyeScsICdkdXJpYW4nLCAnZmVpam9hJywgJ2VsZGVyYmVycmllcycsICdqYWNrZnJ1aXQnLCAna2l3aSddfSAgICAgICAgICAgfCAkezB9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2NoZXJyeScsICdiYW5hbmEnLCAnZHVyaWFuJywgJ2ZlaWpvYScsICdlbGRlcmJlcnJpZXMnLCAnamFja2ZydWl0JywgJ2tpd2knXX0gfCAkezB9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2NoZXJyeScsICdiYW5hbmEnLCAnZHVyaWFuJywgJ2ZlaWpvYScsICdqYWNrZnJ1aXQnLCAna2l3aSddfSAgICAgICAgICAgICAgICAgfCAkezB9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2NoZXJyeScsICdiYW5hbmEnLCAnZ3JhcGVzJywgJ2R1cmlhbicsICdqYWNrZnJ1aXQnLCAna2l3aSddfSAgICAgICAgICAgICAgICAgfCAkezAuMjV9XG4gICAgICAgICAgJHtbJ2FwcGxlJywgJ2NoZXJyeScsICdiYW5hbmEnLCAnZ3JhcGVzJywgJ2R1cmlhbicsICdqYWNrZnJ1aXQnXX0gICAgICAgICAgICAgICAgICAgICAgICAgfCAkezAuNX1cbiAgICAgICAgICAke1snYXBwbGUnLCAnY2hlcnJ5JywgJ2JhbmFuYScsICdncmFwZXMnLCAnZHVyaWFuJ119ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICR7MC43NX1cbiAgICAgICAgYChcbiAgICAgICAgICAnb3V0Y29tZTogcGFydGlhbCBzY29yaW5nID0gdHJ1ZSwgc2Vzc2lvblZhbHVlID0gJHNlc3Npb25WYWx1ZSA9PiBleHBlY3RlZCA9ICRleHBlY3RlZCcsXG4gICAgICAgICAgYXN5bmMgKHsgc2Vzc2lvblZhbHVlLCBleHBlY3RlZCB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBxID0ge1xuICAgICAgICAgICAgICBjaG9pY2VNb2RlOiAnY2hlY2tib3gnLFxuICAgICAgICAgICAgICBjaG9pY2VzOiBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2EnLCB2YWx1ZTogJ2FwcGxlJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdiJywgdmFsdWU6ICdiYW5hbmEnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2MnLCB2YWx1ZTogJ2NoZXJyeScsIGNvcnJlY3Q6IHRydWUgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnZCcsIHZhbHVlOiAnZHVyaWFuJyB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdlJywgdmFsdWU6ICdlbGRlcmJlcnJpZXMnIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2YnLCB2YWx1ZTogJ2ZlaWpvYScgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnZycsIHZhbHVlOiAnZ3JhcGVzJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdqJywgdmFsdWU6ICdqYWNrZnJ1aXQnIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2snLCB2YWx1ZTogJ2tpd2knIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKHEsIHsgdmFsdWU6IHNlc3Npb25WYWx1ZSB9LCB7IG1vZGU6ICdldmFsdWF0ZSAnIH0pO1xuICAgICAgICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQuZWFjaGBcbiAgICAgIHNlc3Npb24gICAgICAgICAgfCBlbXB0eVxuICAgICAgJHt1bmRlZmluZWR9ICAgICB8ICR7dHJ1ZX1cbiAgICAgICR7bnVsbH0gICAgICAgICAgfCAke3RydWV9XG4gICAgICAke3t9fSAgICAgICAgICAgIHwgJHt0cnVlfVxuICAgICAgJHt7IHZhbHVlOiBbXSB9fSB8ICR7ZmFsc2V9XG4gICAgYCgncmV0dXJucyBzY29yZTogMCBhbmQgZW1wdHk6IHRydWUgaWYgc2Vzc2lvbiBpcyAkc2Vzc2lvbicsIGFzeW5jICh7IHNlc3Npb24sIGVtcHR5IH0pID0+IHtcbiAgICAgIGNvbnN0IG8gPSBhd2FpdCBvdXRjb21lKHF1ZXN0aW9uLCBzZXNzaW9uLCB7IG1vZGU6ICdldmFsdWF0ZScgfSk7XG5cbiAgICAgIGV4cGVjdChvKS50b0VxdWFsKHsgc2NvcmU6IDAsIGVtcHR5IH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29ycmVjdCByZXNwb25zZScsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBjb3JyZWN0IHJlc3BvbnNlIGlmIGVudiBpcyBjb3JyZWN0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VzcyA9IGF3YWl0IGNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24ocXVlc3Rpb24sIHsgbW9kZTogJ2dhdGhlcicsIHJvbGU6ICdpbnN0cnVjdG9yJyB9KTtcbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgaWQ6ICcxJywgdmFsdWU6IFsnYXBwbGUnXSB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIG51bGwgZW52IGlzIHN0dWRlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub1Jlc3VsdCA9IGF3YWl0IGNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24ocXVlc3Rpb24sIHsgbW9kZTogJ2dhdGhlcicsIHJvbGU6ICdzdHVkZW50JyB9KTtcbiAgICAgIGV4cGVjdChub1Jlc3VsdCkudG9CZU51bGwoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ25vcm1hbGl6ZScsICgpID0+IHtcbiAgICBpdCgnc2V0cyBjaG9pY2VzTGF5b3V0OiBob3Jpem9udGFsIGlmIHZlcnRpY2FsTW9kZTogZmFsc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzID0gYXdhaXQgbm9ybWFsaXplKHsgLi4ucXVlc3Rpb24sIHZlcnRpY2FsTW9kZTogZmFsc2UgfSk7XG5cbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgLi4uZGVmYXVsdHMsIC4uLnF1ZXN0aW9uLCBjaG9pY2VzTGF5b3V0OiAnaG9yaXpvbnRhbCcgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2V0cyBjaG9pY2VzTGF5b3V0OiB2ZXJ0aWNhbCBpZiB2ZXJ0aWNhbE1vZGU6IHRydWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzID0gYXdhaXQgbm9ybWFsaXplKHsgLi4ucXVlc3Rpb24sIHZlcnRpY2FsTW9kZTogdHJ1ZSB9KTtcblxuICAgICAgZXhwZWN0KHNlc3MpLnRvRXF1YWwoeyAuLi5kZWZhdWx0cywgLi4ucXVlc3Rpb24sIGNob2ljZXNMYXlvdXQ6ICd2ZXJ0aWNhbCcgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2V0cyBjaG9pY2VzTGF5b3V0OiBncmlkIGlmIHZlcnRpY2FsTW9kZTogdHJ1ZSAmJiBjaG9pY2VzTGF5b3V0OiBncmlkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VzcyA9IGF3YWl0IG5vcm1hbGl6ZSh7IC4uLnF1ZXN0aW9uLCB2ZXJ0aWNhbE1vZGU6IHRydWUsIGNob2ljZXNMYXlvdXQ6ICdncmlkJyB9KTtcblxuICAgICAgZXhwZWN0KHNlc3MpLnRvRXF1YWwoeyAuLi5kZWZhdWx0cywgLi4ucXVlc3Rpb24sIGNob2ljZXNMYXlvdXQ6ICdncmlkJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzZXRzIGNob2ljZXNMYXlvdXQ6IHZlcnRpY2FsJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VzcyA9IGF3YWl0IG5vcm1hbGl6ZShxdWVzdGlvbik7XG5cbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgLi4uZGVmYXVsdHMsIC4uLnF1ZXN0aW9uLCBjaG9pY2VzTGF5b3V0OiAndmVydGljYWwnIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19