@pie-element/ebsr 9.2.0-next.1 → 9.2.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.
@@ -1,434 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
6
-
7
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
8
-
9
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
10
-
11
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
12
-
13
- var _react = _interopRequireDefault(require("react"));
14
-
15
- var _enzyme = require("enzyme");
16
-
17
- var _pieConfigureEvents = require("@pie-framework/pie-configure-events");
18
-
19
- var _configUi = require("@pie-lib/pie-toolbox/config-ui");
20
-
21
- var _reactDom = _interopRequireDefault(require("react-dom"));
22
-
23
- var _defaults = _interopRequireDefault(require("../defaults"));
24
-
25
- var _main = require("../main");
26
-
27
- var _index = _interopRequireDefault(require("../index"));
28
-
29
- 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; }
30
-
31
- 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; }
32
-
33
- jest.mock('react-dom', function () {
34
- return {
35
- render: jest.fn()
36
- };
37
- });
38
- jest.mock('@pie-framework/pie-configure-events', function () {
39
- return {
40
- ModelUpdatedEvent: function ModelUpdatedEvent(update) {
41
- return {
42
- update: update,
43
- preventDefault: jest.fn(),
44
- stopImmediatePropagation: jest.fn()
45
- };
46
- }
47
- };
48
- });
49
- jest.mock('@pie-lib/pie-toolbox/config-ui', function () {
50
- return {
51
- choiceUtils: {
52
- firstAvailableIndex: jest.fn()
53
- },
54
- settings: {
55
- Panel: function Panel(props) {
56
- return /*#__PURE__*/_react["default"].createElement("div", props);
57
- },
58
- toggle: jest.fn(),
59
- radio: jest.fn(),
60
- dropdown: jest.fn()
61
- },
62
- layout: {
63
- ConfigLayout: function ConfigLayout(props) {
64
- return /*#__PURE__*/_react["default"].createElement("div", null, props.children);
65
- }
66
- }
67
- };
68
- });
69
- jest.mock('@pie-element/multiple-choice/configure/lib', function () {
70
- return /*#__PURE__*/(0, _createClass2["default"])(function MockConfigure() {
71
- (0, _classCallCheck2["default"])(this, MockConfigure);
72
- });
73
- });
74
- var PART_A = 'partA';
75
- var PART_B = 'partB';
76
-
77
- var createDefaultModel = function createDefaultModel(model) {
78
- var newModel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
79
- return _objectSpread(_objectSpread(_objectSpread({}, model), newModel), {}, {
80
- partA: _objectSpread(_objectSpread({}, model.partA), newModel.partA),
81
- partB: _objectSpread(_objectSpread({}, model.partB), newModel.partB)
82
- });
83
- };
84
-
85
- var model = createDefaultModel(_defaults["default"].model, {
86
- partA: {
87
- choiceMode: 'radio',
88
- choices: [{
89
- value: 'yellow',
90
- label: 'Yellow',
91
- correct: true,
92
- feedback: {
93
- type: 'custom',
94
- value: 'foo'
95
- }
96
- }, {
97
- value: 'green',
98
- label: 'Green',
99
- feedback: {
100
- type: 'default'
101
- }
102
- }],
103
- choicePrefix: 'numbers',
104
- prompt: "prompt ".concat(PART_A),
105
- errors: {}
106
- },
107
- partB: {
108
- choiceMode: 'radio',
109
- choices: [{
110
- value: 'orange',
111
- label: 'Orange',
112
- correct: true,
113
- feedback: {
114
- type: 'custom',
115
- value: 'foo'
116
- }
117
- }, {
118
- value: 'purple',
119
- label: 'Purple',
120
- feedback: {
121
- type: 'default'
122
- }
123
- }],
124
- choicePrefix: 'numbers',
125
- prompt: "prompt ".concat(PART_B),
126
- errors: {}
127
- }
128
- });
129
- describe('index', function () {
130
- var Def;
131
- var el;
132
- var onModelChanged = jest.fn();
133
- var onConfigurationChanged = jest.fn();
134
- var main;
135
- beforeAll(function () {
136
- Def = require('../index')["default"];
137
- });
138
- beforeEach(function () {
139
- el = new Def();
140
- el.model = model;
141
- el.configuration = _defaults["default"].configuration;
142
- el.onModelChanged = onModelChanged;
143
- el.onConfigurationChanged = onConfigurationChanged;
144
- el.connectedCallback();
145
- el.dispatchEvent = el.onModelUpdated;
146
- main = (0, _enzyme.mount)( /*#__PURE__*/_react["default"].createElement(_main.Main, {
147
- classes: {},
148
- model: el._model,
149
- configuration: _defaults["default"].configuration,
150
- onConfigurationChanged: el.onConfigurationChanged,
151
- onModelChanged: el.onModelChanged
152
- })); // mock onModelChanged to dispatch a MODEL_UPDATED event (as multiple-choice does)
153
-
154
- main.instance().partA.onModelChanged = function (m) {
155
- var event = new _pieConfigureEvents.ModelUpdatedEvent(m, false);
156
- el.dispatchEvent(_objectSpread(_objectSpread({}, event), {}, {
157
- target: {
158
- getAttribute: jest.fn().mockReturnValue('A')
159
- }
160
- }));
161
- };
162
-
163
- main.instance().partB.onModelChanged = function (m) {
164
- var event = new _pieConfigureEvents.ModelUpdatedEvent(m, false);
165
- el.dispatchEvent(_objectSpread(_objectSpread({}, event), {}, {
166
- target: {
167
- getAttribute: jest.fn().mockReturnValue('B')
168
- }
169
- }));
170
- };
171
- });
172
- describe('createDefaultModel', function () {
173
- it('default-snapshot', function () {
174
- var m = _index["default"].createDefaultModel({});
175
-
176
- expect(m).toMatchSnapshot();
177
- });
178
- it('with-overrides-snapshot', function () {
179
- var m = _index["default"].createDefaultModel({
180
- partA: {
181
- rationale: 'foo',
182
- teacherInstructions: 'ti'
183
- }
184
- });
185
-
186
- expect(m).toMatchSnapshot();
187
- });
188
- });
189
- describe('set model', function () {
190
- it('calls ReactDOM.render', function () {
191
- el.model = model;
192
- expect(el._model).toEqual(model);
193
- expect(_reactDom["default"].render).toHaveBeenCalled();
194
- });
195
- it('should have set the model for partA and partB', function () {
196
- expect(main.instance().partA._model).toEqual(model.partA);
197
- expect(main.instance().partB._model).toEqual(model.partB);
198
- });
199
- });
200
- describe('set configuration', function () {
201
- it('calls ReactDOM.render', function () {
202
- el.configuration = _defaults["default"].configuration;
203
- expect(_reactDom["default"].render).toHaveBeenCalled();
204
- });
205
- it('should have set the configuration for partA and partB', function () {
206
- expect(main.instance().partA.configuration).toEqual(_objectSpread(_objectSpread({}, _defaults["default"].configuration.partA), {}, {
207
- partLabels: _defaults["default"].configuration.partLabels,
208
- settingsPanelDisabled: true
209
- }));
210
- expect(main.instance().partB.configuration).toEqual(_objectSpread(_objectSpread({}, _defaults["default"].configuration.partB), {}, {
211
- partLabels: _defaults["default"].configuration.partLabels,
212
- settingsPanelDisabled: true
213
- }));
214
- });
215
- });
216
-
217
- var assetOnModelUpdated = function assetOnModelUpdated(label, key, updatedPart, expected) {
218
- it(label, function () {
219
- var event = new _pieConfigureEvents.ModelUpdatedEvent(updatedPart, false);
220
- el.dispatchEvent(_objectSpread(_objectSpread({}, event), {}, {
221
- target: {
222
- getAttribute: jest.fn().mockReturnValue(key)
223
- }
224
- }));
225
- expect(_reactDom["default"].render).toBeCalled();
226
- expect(el._model["part".concat(key)]).toEqual(expected);
227
- });
228
- };
229
-
230
- describe('onModelUpdated', function () {
231
- assetOnModelUpdated('dispatching MODEL_UPDATED updates model.partA', 'A', {
232
- updatedA: true
233
- }, {
234
- updatedA: true
235
- });
236
- assetOnModelUpdated('dispatching MODEL_UPDATED updates model.partB', 'B', {
237
- updatedB: true
238
- }, {
239
- updatedB: true
240
- });
241
- assetOnModelUpdated('dispatching MODEL_UPDATED with update undefined does not update model.partA', 'A', undefined, createDefaultModel(model).partA);
242
- assetOnModelUpdated('dispatching MODEL_UPDATED with update undefined does not update model.partB', 'B', undefined, createDefaultModel(model).partB);
243
- });
244
-
245
- var assetPartUpdate = function assetPartUpdate(label, key, updatedModel) {
246
- it("".concat(key, " - ").concat(label), function () {
247
- main.instance()[key].onModelChanged(updatedModel);
248
- expect(el._model[key]).toEqual(updatedModel);
249
- expect(_reactDom["default"].render).toBeCalled();
250
- });
251
- };
252
-
253
- describe('part update', function () {
254
- assetPartUpdate('Dispatching Model Updated Event will update Teacher Instructions', 'partA', _objectSpread(_objectSpread({}, model.partA), {}, {
255
- teacherInstructions: 'Part A Teacher Instructions'
256
- }));
257
- assetPartUpdate('Dispatching Model Updated Event will update Teacher Instructions', 'partB', _objectSpread(_objectSpread({}, model.partB), {}, {
258
- teacherInstructions: 'Part B Teacher Instructions'
259
- }));
260
- assetPartUpdate('Dispatching Model Updated Event will update Prompt', 'partA', _objectSpread(_objectSpread({}, model.partA), {}, {
261
- prompt: 'Prompt A'
262
- }));
263
- assetPartUpdate('Dispatching Model Updated Event will update Prompt', 'partB', _objectSpread(_objectSpread({}, model.partA), {}, {
264
- prompt: 'Prompt B'
265
- }));
266
- assetPartUpdate('Dispatching Model Updated Event will update Choices - ADD CHOICE', 'partA', _objectSpread(_objectSpread({}, model.partA), {}, {
267
- choices: [].concat((0, _toConsumableArray2["default"])(model.partA.choices), [{
268
- label: 'label',
269
- value: _configUi.choiceUtils.firstAvailableIndex(model.partA.choices.map(function (c) {
270
- return c.value;
271
- }), 0),
272
- feedback: {
273
- type: 'none'
274
- }
275
- }])
276
- }));
277
- assetPartUpdate('Dispatching Model Updated Event will update Choices - ADD CHOICE', 'partB', _objectSpread(_objectSpread({}, model.partB), {}, {
278
- choices: [].concat((0, _toConsumableArray2["default"])(model.partB.choices), [{
279
- label: 'label',
280
- value: _configUi.choiceUtils.firstAvailableIndex(model.partB.choices.map(function (c) {
281
- return c.value;
282
- }), 0),
283
- feedback: {
284
- type: 'none'
285
- }
286
- }])
287
- }));
288
- assetPartUpdate('Dispatching Model Updated Event will update Choices - REMOVE CHOICE', 'partA', _objectSpread(_objectSpread({}, model.partA), {}, {
289
- choices: model.partA.choices.splice(0, 2)
290
- }));
291
- assetPartUpdate('Dispatching Model Updated Event will update Choices - REMOVE CHOICE', 'partB', _objectSpread(_objectSpread({}, model.partB), {}, {
292
- choices: model.partB.choices.splice(0, 2)
293
- }));
294
- assetPartUpdate('Dispatching Model Updated Event will update Choices - CHANGE CHOICE', 'partA', _objectSpread(_objectSpread({}, model.partA), {}, {
295
- choices: model.partA.choices.splice(1, 1, {
296
- correct: true,
297
- value: 'green',
298
- label: function label(value) {
299
- return value.charAt(0).toUpperCase() + value.slice(1);
300
- },
301
- feedback: {
302
- type: 'none',
303
- value: ''
304
- }
305
- })
306
- }));
307
- assetPartUpdate('Dispatching Model Updated Event will update Choices - CHANGE CHOICE', 'partB', _objectSpread(_objectSpread({}, model.partB), {}, {
308
- choices: model.partB.choices.splice(1, 1, {
309
- correct: true,
310
- value: 'green',
311
- label: function label(value) {
312
- return value.charAt(0).toUpperCase() + value.slice(1);
313
- },
314
- feedback: {
315
- type: 'none',
316
- value: ''
317
- }
318
- })
319
- }));
320
- assetPartUpdate('Dispatching Model Updated Event will update Choices', 'partA', _objectSpread(_objectSpread({}, model.partA), {}, {
321
- choices: []
322
- }));
323
- assetPartUpdate('Dispatching Model Updated Event will update Choices', 'partB', _objectSpread(_objectSpread({}, model.partB), {}, {
324
- choices: []
325
- }));
326
- });
327
- });
328
- describe('main', function () {
329
- var Def;
330
- var el;
331
- var main;
332
- beforeAll(function () {
333
- Def = require('../index')["default"];
334
- });
335
- beforeEach(function () {
336
- el = new Def();
337
- el.model = model;
338
- el.configuration = _defaults["default"].configuration;
339
- el.dispatchEvent = el.onModelUpdated;
340
- main = (0, _enzyme.mount)( /*#__PURE__*/_react["default"].createElement(_main.Main, {
341
- classes: {},
342
- model: el._model,
343
- configuration: _defaults["default"].configuration,
344
- onConfigurationChanged: el.onConfigurationChanged,
345
- onModelChanged: el.onModelChanged
346
- }));
347
- });
348
-
349
- var assertOnModelChanged = function assertOnModelChanged(label, updatedModel, expected) {
350
- it(label, function () {
351
- main.instance().props.onModelChanged(updatedModel);
352
- expect(el._model).toEqual(createDefaultModel(model, expected));
353
- });
354
- };
355
-
356
- describe('onModelChanged', function () {
357
- assertOnModelChanged('does not change the model', {}, model);
358
- assertOnModelChanged('changes partA - checkbox', {
359
- partA: {
360
- choiceMode: 'checkbox'
361
- }
362
- }, _objectSpread(_objectSpread({}, model), {}, {
363
- partA: {
364
- choiceMode: 'checkbox'
365
- }
366
- }));
367
- assertOnModelChanged('changes partA - choicePrefix', {
368
- partA: {
369
- choicePrefix: 'numbers'
370
- }
371
- }, _objectSpread(_objectSpread({}, model), {}, {
372
- partA: {
373
- choicePrefix: 'numbers'
374
- }
375
- }));
376
- assertOnModelChanged('changes partA - partialScoring', {
377
- partialScoring: false
378
- }, _objectSpread(_objectSpread({}, model), {}, {
379
- partialScoring: false
380
- }));
381
- assertOnModelChanged('changes partA - lockChoiceOrder', {
382
- partA: {
383
- lockChoiceOrder: true
384
- }
385
- }, _objectSpread(_objectSpread({}, model), {}, {
386
- partA: {
387
- lockChoiceOrder: true
388
- }
389
- }));
390
- assertOnModelChanged('changes partA - scoringType', {
391
- scoringType: 'auto'
392
- }, _objectSpread(_objectSpread({}, model), {}, {
393
- scoringType: 'auto'
394
- }));
395
- assertOnModelChanged('changes partB - checkbox', {
396
- partB: {
397
- choiceMode: 'checkbox'
398
- }
399
- }, _objectSpread(_objectSpread({}, model), {}, {
400
- partB: {
401
- choiceMode: 'checkbox'
402
- }
403
- }));
404
- assertOnModelChanged('changes partB - choicePrefix', {
405
- partB: {
406
- choicePrefix: 'numbers'
407
- }
408
- }, _objectSpread(_objectSpread({}, model), {}, {
409
- partB: {
410
- choicePrefix: 'numbers'
411
- }
412
- }));
413
- assertOnModelChanged('changes partB - partialScoring', {
414
- partialScoring: false
415
- }, _objectSpread(_objectSpread({}, model), {}, {
416
- partialScoring: false
417
- }));
418
- assertOnModelChanged('changes partB - lockChoiceOrder', {
419
- partB: {
420
- lockChoiceOrder: true
421
- }
422
- }, _objectSpread(_objectSpread({}, model), {}, {
423
- partB: {
424
- lockChoiceOrder: true
425
- }
426
- }));
427
- assertOnModelChanged('changes partB - scoringType', {
428
- scoringType: 'auto'
429
- }, _objectSpread(_objectSpread({}, model), {}, {
430
- scoringType: 'auto'
431
- }));
432
- });
433
- });
434
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5kZXgudGVzdC5qcyJdLCJuYW1lcyI6WyJqZXN0IiwibW9jayIsInJlbmRlciIsImZuIiwiTW9kZWxVcGRhdGVkRXZlbnQiLCJ1cGRhdGUiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsImNob2ljZVV0aWxzIiwiZmlyc3RBdmFpbGFibGVJbmRleCIsInNldHRpbmdzIiwiUGFuZWwiLCJwcm9wcyIsInRvZ2dsZSIsInJhZGlvIiwiZHJvcGRvd24iLCJsYXlvdXQiLCJDb25maWdMYXlvdXQiLCJjaGlsZHJlbiIsIlBBUlRfQSIsIlBBUlRfQiIsImNyZWF0ZURlZmF1bHRNb2RlbCIsIm1vZGVsIiwibmV3TW9kZWwiLCJwYXJ0QSIsInBhcnRCIiwiZGVmYXVsdHMiLCJjaG9pY2VNb2RlIiwiY2hvaWNlcyIsInZhbHVlIiwibGFiZWwiLCJjb3JyZWN0IiwiZmVlZGJhY2siLCJ0eXBlIiwiY2hvaWNlUHJlZml4IiwicHJvbXB0IiwiZXJyb3JzIiwiZGVzY3JpYmUiLCJEZWYiLCJlbCIsIm9uTW9kZWxDaGFuZ2VkIiwib25Db25maWd1cmF0aW9uQ2hhbmdlZCIsIm1haW4iLCJiZWZvcmVBbGwiLCJyZXF1aXJlIiwiYmVmb3JlRWFjaCIsImNvbmZpZ3VyYXRpb24iLCJjb25uZWN0ZWRDYWxsYmFjayIsImRpc3BhdGNoRXZlbnQiLCJvbk1vZGVsVXBkYXRlZCIsIl9tb2RlbCIsImluc3RhbmNlIiwibSIsImV2ZW50IiwidGFyZ2V0IiwiZ2V0QXR0cmlidXRlIiwibW9ja1JldHVyblZhbHVlIiwiaXQiLCJFYnNyQ29uZmlndXJlIiwiZXhwZWN0IiwidG9NYXRjaFNuYXBzaG90IiwicmF0aW9uYWxlIiwidGVhY2hlckluc3RydWN0aW9ucyIsInRvRXF1YWwiLCJSZWFjdERPTSIsInRvSGF2ZUJlZW5DYWxsZWQiLCJwYXJ0TGFiZWxzIiwic2V0dGluZ3NQYW5lbERpc2FibGVkIiwiYXNzZXRPbk1vZGVsVXBkYXRlZCIsImtleSIsInVwZGF0ZWRQYXJ0IiwiZXhwZWN0ZWQiLCJ0b0JlQ2FsbGVkIiwidXBkYXRlZEEiLCJ1cGRhdGVkQiIsInVuZGVmaW5lZCIsImFzc2V0UGFydFVwZGF0ZSIsInVwZGF0ZWRNb2RlbCIsInV0aWxzIiwibWFwIiwiYyIsInNwbGljZSIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJhc3NlcnRPbk1vZGVsQ2hhbmdlZCIsInBhcnRpYWxTY29yaW5nIiwibG9ja0Nob2ljZU9yZGVyIiwic2NvcmluZ1R5cGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUFFQUEsSUFBSSxDQUFDQyxJQUFMLENBQVUsV0FBVixFQUF1QjtBQUFBLFNBQU87QUFDNUJDLElBQUFBLE1BQU0sRUFBRUYsSUFBSSxDQUFDRyxFQUFMO0FBRG9CLEdBQVA7QUFBQSxDQUF2QjtBQUlBSCxJQUFJLENBQUNDLElBQUwsQ0FBVSxxQ0FBVixFQUFpRDtBQUFBLFNBQU87QUFDdERHLElBQUFBLGlCQUFpQixFQUFFLDJCQUFDQyxNQUFELEVBQVk7QUFDN0IsYUFBTztBQUNMQSxRQUFBQSxNQUFNLEVBQU5BLE1BREs7QUFFTEMsUUFBQUEsY0FBYyxFQUFFTixJQUFJLENBQUNHLEVBQUwsRUFGWDtBQUdMSSxRQUFBQSx3QkFBd0IsRUFBRVAsSUFBSSxDQUFDRyxFQUFMO0FBSHJCLE9BQVA7QUFLRDtBQVBxRCxHQUFQO0FBQUEsQ0FBakQ7QUFVQUgsSUFBSSxDQUFDQyxJQUFMLENBQVUsZ0NBQVYsRUFBNEM7QUFBQSxTQUFPO0FBQ2pETyxJQUFBQSxXQUFXLEVBQUU7QUFDWEMsTUFBQUEsbUJBQW1CLEVBQUVULElBQUksQ0FBQ0csRUFBTDtBQURWLEtBRG9DO0FBSWpETyxJQUFBQSxRQUFRLEVBQUU7QUFDUkMsTUFBQUEsS0FBSyxFQUFFLGVBQUNDLEtBQUQ7QUFBQSw0QkFBVyx1Q0FBU0EsS0FBVCxDQUFY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QVUsRUFBRTtBQURQO0FBVFMsT0FBcEI7QUFjQTBELElBQUFBLG9CQUFvQixDQUNsQiw4QkFEa0IsRUFFbEI7QUFDRTVELE1BQUFBLEtBQUssRUFBRTtBQUNMUyxRQUFBQSxZQUFZLEVBQUU7QUFEVDtBQURULEtBRmtCLGtDQVFiWixLQVJhO0FBU2hCRyxNQUFBQSxLQUFLLEVBQUU7QUFDTFMsUUFBQUEsWUFBWSxFQUFFO0FBRFQ7QUFUUyxPQUFwQjtBQWNBbUQsSUFBQUEsb0JBQW9CLENBQ2xCLGdDQURrQixFQUVsQjtBQUNFQyxNQUFBQSxjQUFjLEVBQUU7QUFEbEIsS0FGa0Isa0NBTWJoRSxLQU5hO0FBT2hCZ0UsTUFBQUEsY0FBYyxFQUFFO0FBUEEsT0FBcEI7QUFVQUQsSUFBQUEsb0JBQW9CLENBQ2xCLGlDQURrQixFQUVsQjtBQUNFNUQsTUFBQUEsS0FBSyxFQUFFO0FBQ0w4RCxRQUFBQSxlQUFlLEVBQUU7QUFEWjtBQURULEtBRmtCLGtDQVFiakUsS0FSYTtBQVNoQkcsTUFBQUEsS0FBSyxFQUFFO0FBQ0w4RCxRQUFBQSxlQUFlLEVBQUU7QUFEWjtBQVRTLE9BQXBCO0FBY0FGLElBQUFBLG9CQUFvQixDQUNsQiw2QkFEa0IsRUFFbEI7QUFDRUcsTUFBQUEsV0FBVyxFQUFFO0FBRGYsS0FGa0Isa0NBTWJsRSxLQU5hO0FBT2hCa0UsTUFBQUEsV0FBVyxFQUFFO0FBUEcsT0FBcEI7QUFVRCxHQTlITyxDQUFSO0FBK0hELENBaktPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgbW91bnQgfSBmcm9tICdlbnp5bWUnO1xuaW1wb3J0IHsgTW9kZWxVcGRhdGVkRXZlbnQgfSBmcm9tICdAcGllLWZyYW1ld29yay9waWUtY29uZmlndXJlLWV2ZW50cyc7XG5pbXBvcnQgeyBjaG9pY2VVdGlscyBhcyB1dGlscyB9IGZyb20gJ0BwaWUtbGliL3BpZS10b29sYm94L2NvbmZpZy11aSc7XG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuLi9kZWZhdWx0cyc7XG5pbXBvcnQgeyBNYWluIH0gZnJvbSAnLi4vbWFpbic7XG5pbXBvcnQgRWJzckNvbmZpZ3VyZSBmcm9tICcuLi9pbmRleCc7XG5cbmplc3QubW9jaygncmVhY3QtZG9tJywgKCkgPT4gKHtcbiAgcmVuZGVyOiBqZXN0LmZuKCksXG59KSk7XG5cbmplc3QubW9jaygnQHBpZS1mcmFtZXdvcmsvcGllLWNvbmZpZ3VyZS1ldmVudHMnLCAoKSA9PiAoe1xuICBNb2RlbFVwZGF0ZWRFdmVudDogKHVwZGF0ZSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGUsXG4gICAgICBwcmV2ZW50RGVmYXVsdDogamVzdC5mbigpLFxuICAgICAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBqZXN0LmZuKCksXG4gICAgfTtcbiAgfSxcbn0pKTtcblxuamVzdC5tb2NrKCdAcGllLWxpYi9waWUtdG9vbGJveC9jb25maWctdWknLCAoKSA9PiAoe1xuICBjaG9pY2VVdGlsczoge1xuICAgIGZpcnN0QXZhaWxhYmxlSW5kZXg6IGplc3QuZm4oKSxcbiAgfSxcbiAgc2V0dGluZ3M6IHtcbiAgICBQYW5lbDogKHByb3BzKSA9PiA8ZGl2IHsuLi5wcm9wc30gLz4sXG4gICAgdG9nZ2xlOiBqZXN0LmZuKCksXG4gICAgcmFkaW86IGplc3QuZm4oKSxcbiAgICBkcm9wZG93bjogamVzdC5mbigpLFxuICB9LFxuICBsYXlvdXQ6IHtcbiAgICBDb25maWdMYXlvdXQ6IChwcm9wcykgPT4gPGRpdj57cHJvcHMuY2hpbGRyZW59PC9kaXY+LFxuICB9LFxufSkpO1xuXG5qZXN0Lm1vY2soJ0BwaWUtZWxlbWVudC9tdWx0aXBsZS1jaG9pY2UvY29uZmlndXJlL2xpYicsICgpID0+IGNsYXNzIE1vY2tDb25maWd1cmUge30pO1xuXG5jb25zdCBQQVJUX0EgPSAncGFydEEnO1xuY29uc3QgUEFSVF9CID0gJ3BhcnRCJztcblxuY29uc3QgY3JlYXRlRGVmYXVsdE1vZGVsID0gKG1vZGVsLCBuZXdNb2RlbCA9IHt9KSA9PiAoe1xuICAuLi5tb2RlbCxcbiAgLi4ubmV3TW9kZWwsXG4gIHBhcnRBOiB7XG4gICAgLi4ubW9kZWwucGFydEEsXG4gICAgLi4ubmV3TW9kZWwucGFydEEsXG4gIH0sXG4gIHBhcnRCOiB7XG4gICAgLi4ubW9kZWwucGFydEIsXG4gICAgLi4ubmV3TW9kZWwucGFydEIsXG4gIH0sXG59KTtcblxuY29uc3QgbW9kZWwgPSBjcmVhdGVEZWZhdWx0TW9kZWwoZGVmYXVsdHMubW9kZWwsIHtcbiAgcGFydEE6IHtcbiAgICBjaG9pY2VNb2RlOiAncmFkaW8nLFxuICAgIGNob2ljZXM6IFtcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6ICd5ZWxsb3cnLFxuICAgICAgICBsYWJlbDogJ1llbGxvdycsXG4gICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgIGZlZWRiYWNrOiB7XG4gICAgICAgICAgdHlwZTogJ2N1c3RvbScsXG4gICAgICAgICAgdmFsdWU6ICdmb28nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6ICdncmVlbicsXG4gICAgICAgIGxhYmVsOiAnR3JlZW4nLFxuICAgICAgICBmZWVkYmFjazoge1xuICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBjaG9pY2VQcmVmaXg6ICdudW1iZXJzJyxcbiAgICBwcm9tcHQ6IGBwcm9tcHQgJHtQQVJUX0F9YCxcbiAgICBlcnJvcnM6IHt9LFxuICB9LFxuICBwYXJ0Qjoge1xuICAgIGNob2ljZU1vZGU6ICdyYWRpbycsXG4gICAgY2hvaWNlczogW1xuICAgICAge1xuICAgICAgICB2YWx1ZTogJ29yYW5nZScsXG4gICAgICAgIGxhYmVsOiAnT3JhbmdlJyxcbiAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgZmVlZGJhY2s6IHtcbiAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICAgICAgICB2YWx1ZTogJ2ZvbycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB2YWx1ZTogJ3B1cnBsZScsXG4gICAgICAgIGxhYmVsOiAnUHVycGxlJyxcbiAgICAgICAgZmVlZGJhY2s6IHtcbiAgICAgICAgICB0eXBlOiAnZGVmYXVsdCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0sXG4gICAgY2hvaWNlUHJlZml4OiAnbnVtYmVycycsXG4gICAgcHJvbXB0OiBgcHJvbXB0ICR7UEFSVF9CfWAsXG4gICAgZXJyb3JzOiB7fSxcbiAgfSxcbn0pO1xuXG5kZXNjcmliZSgnaW5kZXgnLCAoKSA9PiB7XG4gIGxldCBEZWY7XG4gIGxldCBlbDtcbiAgbGV0IG9uTW9kZWxDaGFuZ2VkID0gamVzdC5mbigpO1xuICBsZXQgb25Db25maWd1cmF0aW9uQ2hhbmdlZCA9IGplc3QuZm4oKTtcbiAgbGV0IG1haW47XG5cbiAgYmVmb3JlQWxsKCgpID0+IHtcbiAgICBEZWYgPSByZXF1aXJlKCcuLi9pbmRleCcpLmRlZmF1bHQ7XG4gIH0pO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGVsID0gbmV3IERlZigpO1xuICAgIGVsLm1vZGVsID0gbW9kZWw7XG4gICAgZWwuY29uZmlndXJhdGlvbiA9IGRlZmF1bHRzLmNvbmZpZ3VyYXRpb247XG4gICAgZWwub25Nb2RlbENoYW5nZWQgPSBvbk1vZGVsQ2hhbmdlZDtcbiAgICBlbC5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkID0gb25Db25maWd1cmF0aW9uQ2hhbmdlZDtcbiAgICBlbC5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGVsLmRpc3BhdGNoRXZlbnQgPSBlbC5vbk1vZGVsVXBkYXRlZDtcblxuICAgIG1haW4gPSBtb3VudChcbiAgICAgIDxNYWluXG4gICAgICAgIGNsYXNzZXM9e3t9fVxuICAgICAgICBtb2RlbD17ZWwuX21vZGVsfVxuICAgICAgICBjb25maWd1cmF0aW9uPXtkZWZhdWx0cy5jb25maWd1cmF0aW9ufVxuICAgICAgICBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkPXtlbC5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkfVxuICAgICAgICBvbk1vZGVsQ2hhbmdlZD17ZWwub25Nb2RlbENoYW5nZWR9XG4gICAgICAvPixcbiAgICApO1xuXG4gICAgLy8gbW9jayBvbk1vZGVsQ2hhbmdlZCB0byBkaXNwYXRjaCBhIE1PREVMX1VQREFURUQgZXZlbnQgKGFzIG11bHRpcGxlLWNob2ljZSBkb2VzKVxuICAgIG1haW4uaW5zdGFuY2UoKS5wYXJ0QS5vbk1vZGVsQ2hhbmdlZCA9IChtKSA9PiB7XG4gICAgICBjb25zdCBldmVudCA9IG5ldyBNb2RlbFVwZGF0ZWRFdmVudChtLCBmYWxzZSk7XG5cbiAgICAgIGVsLmRpc3BhdGNoRXZlbnQoe1xuICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgZ2V0QXR0cmlidXRlOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKCdBJyksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9O1xuICAgIG1haW4uaW5zdGFuY2UoKS5wYXJ0Qi5vbk1vZGVsQ2hhbmdlZCA9IChtKSA9PiB7XG4gICAgICBjb25zdCBldmVudCA9IG5ldyBNb2RlbFVwZGF0ZWRFdmVudChtLCBmYWxzZSk7XG5cbiAgICAgIGVsLmRpc3BhdGNoRXZlbnQoe1xuICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgZ2V0QXR0cmlidXRlOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKCdCJyksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9O1xuICB9KTtcblxuICBkZXNjcmliZSgnY3JlYXRlRGVmYXVsdE1vZGVsJywgKCkgPT4ge1xuICAgIGl0KCdkZWZhdWx0LXNuYXBzaG90JywgKCkgPT4ge1xuICAgICAgY29uc3QgbSA9IEVic3JDb25maWd1cmUuY3JlYXRlRGVmYXVsdE1vZGVsKHt9KTtcbiAgICAgIGV4cGVjdChtKS50b01hdGNoU25hcHNob3QoKTtcbiAgICB9KTtcbiAgICBpdCgnd2l0aC1vdmVycmlkZXMtc25hcHNob3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtID0gRWJzckNvbmZpZ3VyZS5jcmVhdGVEZWZhdWx0TW9kZWwoe1xuICAgICAgICBwYXJ0QTogeyByYXRpb25hbGU6ICdmb28nLCB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiAndGknIH0sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChtKS50b01hdGNoU25hcHNob3QoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NldCBtb2RlbCcsICgpID0+IHtcbiAgICBpdCgnY2FsbHMgUmVhY3RET00ucmVuZGVyJywgKCkgPT4ge1xuICAgICAgZWwubW9kZWwgPSBtb2RlbDtcblxuICAgICAgZXhwZWN0KGVsLl9tb2RlbCkudG9FcXVhbChtb2RlbCk7XG4gICAgICBleHBlY3QoUmVhY3RET00ucmVuZGVyKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgc2V0IHRoZSBtb2RlbCBmb3IgcGFydEEgYW5kIHBhcnRCJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KG1haW4uaW5zdGFuY2UoKS5wYXJ0QS5fbW9kZWwpLnRvRXF1YWwobW9kZWwucGFydEEpO1xuICAgICAgZXhwZWN0KG1haW4uaW5zdGFuY2UoKS5wYXJ0Qi5fbW9kZWwpLnRvRXF1YWwobW9kZWwucGFydEIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2V0IGNvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ2NhbGxzIFJlYWN0RE9NLnJlbmRlcicsICgpID0+IHtcbiAgICAgIGVsLmNvbmZpZ3VyYXRpb24gPSBkZWZhdWx0cy5jb25maWd1cmF0aW9uO1xuXG4gICAgICBleHBlY3QoUmVhY3RET00ucmVuZGVyKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgc2V0IHRoZSBjb25maWd1cmF0aW9uIGZvciBwYXJ0QSBhbmQgcGFydEInLCAoKSA9PiB7XG4gICAgICBleHBlY3QobWFpbi5pbnN0YW5jZSgpLnBhcnRBLmNvbmZpZ3VyYXRpb24pLnRvRXF1YWwoe1xuICAgICAgICAuLi5kZWZhdWx0cy5jb25maWd1cmF0aW9uLnBhcnRBLFxuICAgICAgICBwYXJ0TGFiZWxzOiBkZWZhdWx0cy5jb25maWd1cmF0aW9uLnBhcnRMYWJlbHMsXG4gICAgICAgIHNldHRpbmdzUGFuZWxEaXNhYmxlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KG1haW4uaW5zdGFuY2UoKS5wYXJ0Qi5jb25maWd1cmF0aW9uKS50b0VxdWFsKHtcbiAgICAgICAgLi4uZGVmYXVsdHMuY29uZmlndXJhdGlvbi5wYXJ0QixcbiAgICAgICAgcGFydExhYmVsczogZGVmYXVsdHMuY29uZmlndXJhdGlvbi5wYXJ0TGFiZWxzLFxuICAgICAgICBzZXR0aW5nc1BhbmVsRGlzYWJsZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3QgYXNzZXRPbk1vZGVsVXBkYXRlZCA9IChsYWJlbCwga2V5LCB1cGRhdGVkUGFydCwgZXhwZWN0ZWQpID0+IHtcbiAgICBpdChsYWJlbCwgKCkgPT4ge1xuICAgICAgY29uc3QgZXZlbnQgPSBuZXcgTW9kZWxVcGRhdGVkRXZlbnQodXBkYXRlZFBhcnQsIGZhbHNlKTtcblxuICAgICAgZWwuZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgIC4uLmV2ZW50LFxuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICBnZXRBdHRyaWJ1dGU6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoa2V5KSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoUmVhY3RET00ucmVuZGVyKS50b0JlQ2FsbGVkKCk7XG4gICAgICBleHBlY3QoZWwuX21vZGVsW2BwYXJ0JHtrZXl9YF0pLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9O1xuXG4gIGRlc2NyaWJlKCdvbk1vZGVsVXBkYXRlZCcsICgpID0+IHtcbiAgICBhc3NldE9uTW9kZWxVcGRhdGVkKCdkaXNwYXRjaGluZyBNT0RFTF9VUERBVEVEIHVwZGF0ZXMgbW9kZWwucGFydEEnLCAnQScsIHsgdXBkYXRlZEE6IHRydWUgfSwgeyB1cGRhdGVkQTogdHJ1ZSB9KTtcbiAgICBhc3NldE9uTW9kZWxVcGRhdGVkKCdkaXNwYXRjaGluZyBNT0RFTF9VUERBVEVEIHVwZGF0ZXMgbW9kZWwucGFydEInLCAnQicsIHsgdXBkYXRlZEI6IHRydWUgfSwgeyB1cGRhdGVkQjogdHJ1ZSB9KTtcblxuICAgIGFzc2V0T25Nb2RlbFVwZGF0ZWQoXG4gICAgICAnZGlzcGF0Y2hpbmcgTU9ERUxfVVBEQVRFRCB3aXRoIHVwZGF0ZSB1bmRlZmluZWQgZG9lcyBub3QgdXBkYXRlIG1vZGVsLnBhcnRBJyxcbiAgICAgICdBJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGNyZWF0ZURlZmF1bHRNb2RlbChtb2RlbCkucGFydEEsXG4gICAgKTtcbiAgICBhc3NldE9uTW9kZWxVcGRhdGVkKFxuICAgICAgJ2Rpc3BhdGNoaW5nIE1PREVMX1VQREFURUQgd2l0aCB1cGRhdGUgdW5kZWZpbmVkIGRvZXMgbm90IHVwZGF0ZSBtb2RlbC5wYXJ0QicsXG4gICAgICAnQicsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBjcmVhdGVEZWZhdWx0TW9kZWwobW9kZWwpLnBhcnRCLFxuICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IGFzc2V0UGFydFVwZGF0ZSA9IChsYWJlbCwga2V5LCB1cGRhdGVkTW9kZWwpID0+IHtcbiAgICBpdChgJHtrZXl9IC0gJHtsYWJlbH1gLCAoKSA9PiB7XG4gICAgICBtYWluLmluc3RhbmNlKClba2V5XS5vbk1vZGVsQ2hhbmdlZCh1cGRhdGVkTW9kZWwpO1xuXG4gICAgICBleHBlY3QoZWwuX21vZGVsW2tleV0pLnRvRXF1YWwodXBkYXRlZE1vZGVsKTtcbiAgICAgIGV4cGVjdChSZWFjdERPTS5yZW5kZXIpLnRvQmVDYWxsZWQoKTtcbiAgICB9KTtcbiAgfTtcblxuICBkZXNjcmliZSgncGFydCB1cGRhdGUnLCAoKSA9PiB7XG4gICAgYXNzZXRQYXJ0VXBkYXRlKCdEaXNwYXRjaGluZyBNb2RlbCBVcGRhdGVkIEV2ZW50IHdpbGwgdXBkYXRlIFRlYWNoZXIgSW5zdHJ1Y3Rpb25zJywgJ3BhcnRBJywge1xuICAgICAgLi4ubW9kZWwucGFydEEsXG4gICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiAnUGFydCBBIFRlYWNoZXIgSW5zdHJ1Y3Rpb25zJyxcbiAgICB9KTtcbiAgICBhc3NldFBhcnRVcGRhdGUoJ0Rpc3BhdGNoaW5nIE1vZGVsIFVwZGF0ZWQgRXZlbnQgd2lsbCB1cGRhdGUgVGVhY2hlciBJbnN0cnVjdGlvbnMnLCAncGFydEInLCB7XG4gICAgICAuLi5tb2RlbC5wYXJ0QixcbiAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdQYXJ0IEIgVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgIH0pO1xuICAgIGFzc2V0UGFydFVwZGF0ZSgnRGlzcGF0Y2hpbmcgTW9kZWwgVXBkYXRlZCBFdmVudCB3aWxsIHVwZGF0ZSBQcm9tcHQnLCAncGFydEEnLCB7XG4gICAgICAuLi5tb2RlbC5wYXJ0QSxcbiAgICAgIHByb21wdDogJ1Byb21wdCBBJyxcbiAgICB9KTtcbiAgICBhc3NldFBhcnRVcGRhdGUoJ0Rpc3BhdGNoaW5nIE1vZGVsIFVwZGF0ZWQgRXZlbnQgd2lsbCB1cGRhdGUgUHJvbXB0JywgJ3BhcnRCJywge1xuICAgICAgLi4ubW9kZWwucGFydEEsXG4gICAgICBwcm9tcHQ6ICdQcm9tcHQgQicsXG4gICAgfSk7XG5cbiAgICBhc3NldFBhcnRVcGRhdGUoJ0Rpc3BhdGNoaW5nIE1vZGVsIFVwZGF0ZWQgRXZlbnQgd2lsbCB1cGRhdGUgQ2hvaWNlcyAtIEFERCBDSE9JQ0UnLCAncGFydEEnLCB7XG4gICAgICAuLi5tb2RlbC5wYXJ0QSxcbiAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgLi4ubW9kZWwucGFydEEuY2hvaWNlcyxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnbGFiZWwnLFxuICAgICAgICAgIHZhbHVlOiB1dGlscy5maXJzdEF2YWlsYWJsZUluZGV4KFxuICAgICAgICAgICAgbW9kZWwucGFydEEuY2hvaWNlcy5tYXAoKGMpID0+IGMudmFsdWUpLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICApLFxuICAgICAgICAgIGZlZWRiYWNrOiB7XG4gICAgICAgICAgICB0eXBlOiAnbm9uZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgYXNzZXRQYXJ0VXBkYXRlKCdEaXNwYXRjaGluZyBNb2RlbCBVcGRhdGVkIEV2ZW50IHdpbGwgdXBkYXRlIENob2ljZXMgLSBBREQgQ0hPSUNFJywgJ3BhcnRCJywge1xuICAgICAgLi4ubW9kZWwucGFydEIsXG4gICAgICBjaG9pY2VzOiBbXG4gICAgICAgIC4uLm1vZGVsLnBhcnRCLmNob2ljZXMsXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ2xhYmVsJyxcbiAgICAgICAgICB2YWx1ZTogdXRpbHMuZmlyc3RBdmFpbGFibGVJbmRleChcbiAgICAgICAgICAgIG1vZGVsLnBhcnRCLmNob2ljZXMubWFwKChjKSA9PiBjLnZhbHVlKSxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBmZWVkYmFjazoge1xuICAgICAgICAgICAgdHlwZTogJ25vbmUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGFzc2V0UGFydFVwZGF0ZSgnRGlzcGF0Y2hpbmcgTW9kZWwgVXBkYXRlZCBFdmVudCB3aWxsIHVwZGF0ZSBDaG9pY2VzIC0gUkVNT1ZFIENIT0lDRScsICdwYXJ0QScsIHtcbiAgICAgIC4uLm1vZGVsLnBhcnRBLFxuICAgICAgY2hvaWNlczogbW9kZWwucGFydEEuY2hvaWNlcy5zcGxpY2UoMCwgMiksXG4gICAgfSk7XG4gICAgYXNzZXRQYXJ0VXBkYXRlKCdEaXNwYXRjaGluZyBNb2RlbCBVcGRhdGVkIEV2ZW50IHdpbGwgdXBkYXRlIENob2ljZXMgLSBSRU1PVkUgQ0hPSUNFJywgJ3BhcnRCJywge1xuICAgICAgLi4ubW9kZWwucGFydEIsXG4gICAgICBjaG9pY2VzOiBtb2RlbC5wYXJ0Qi5jaG9pY2VzLnNwbGljZSgwLCAyKSxcbiAgICB9KTtcbiAgICBhc3NldFBhcnRVcGRhdGUoJ0Rpc3BhdGNoaW5nIE1vZGVsIFVwZGF0ZWQgRXZlbnQgd2lsbCB1cGRhdGUgQ2hvaWNlcyAtIENIQU5HRSBDSE9JQ0UnLCAncGFydEEnLCB7XG4gICAgICAuLi5tb2RlbC5wYXJ0QSxcbiAgICAgIGNob2ljZXM6IG1vZGVsLnBhcnRBLmNob2ljZXMuc3BsaWNlKDEsIDEsIHtcbiAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgdmFsdWU6ICdncmVlbicsXG4gICAgICAgIGxhYmVsOiAodmFsdWUpID0+IHZhbHVlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSksXG4gICAgICAgIGZlZWRiYWNrOiB7XG4gICAgICAgICAgdHlwZTogJ25vbmUnLFxuICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIGFzc2V0UGFydFVwZGF0ZSgnRGlzcGF0Y2hpbmcgTW9kZWwgVXBkYXRlZCBFdmVudCB3aWxsIHVwZGF0ZSBDaG9pY2VzIC0gQ0hBTkdFIENIT0lDRScsICdwYXJ0QicsIHtcbiAgICAgIC4uLm1vZGVsLnBhcnRCLFxuICAgICAgY2hvaWNlczogbW9kZWwucGFydEIuY2hvaWNlcy5zcGxpY2UoMSwgMSwge1xuICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICB2YWx1ZTogJ2dyZWVuJyxcbiAgICAgICAgbGFiZWw6ICh2YWx1ZSkgPT4gdmFsdWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKSxcbiAgICAgICAgZmVlZGJhY2s6IHtcbiAgICAgICAgICB0eXBlOiAnbm9uZScsXG4gICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBhc3NldFBhcnRVcGRhdGUoJ0Rpc3BhdGNoaW5nIE1vZGVsIFVwZGF0ZWQgRXZlbnQgd2lsbCB1cGRhdGUgQ2hvaWNlcycsICdwYXJ0QScsIHsgLi4ubW9kZWwucGFydEEsIGNob2ljZXM6IFtdIH0pO1xuICAgIGFzc2V0UGFydFVwZGF0ZSgnRGlzcGF0Y2hpbmcgTW9kZWwgVXBkYXRlZCBFdmVudCB3aWxsIHVwZGF0ZSBDaG9pY2VzJywgJ3BhcnRCJywgeyAuLi5tb2RlbC5wYXJ0QiwgY2hvaWNlczogW10gfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdtYWluJywgKCkgPT4ge1xuICBsZXQgRGVmO1xuICBsZXQgZWw7XG4gIGxldCBtYWluO1xuXG4gIGJlZm9yZUFsbCgoKSA9PiB7XG4gICAgRGVmID0gcmVxdWlyZSgnLi4vaW5kZXgnKS5kZWZhdWx0O1xuICB9KTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBlbCA9IG5ldyBEZWYoKTtcbiAgICBlbC5tb2RlbCA9IG1vZGVsO1xuICAgIGVsLmNvbmZpZ3VyYXRpb24gPSBkZWZhdWx0cy5jb25maWd1cmF0aW9uO1xuICAgIGVsLmRpc3BhdGNoRXZlbnQgPSBlbC5vbk1vZGVsVXBkYXRlZDtcblxuICAgIG1haW4gPSBtb3VudChcbiAgICAgIDxNYWluXG4gICAgICAgIGNsYXNzZXM9e3t9fVxuICAgICAgICBtb2RlbD17ZWwuX21vZGVsfVxuICAgICAgICBjb25maWd1cmF0aW9uPXtkZWZhdWx0cy5jb25maWd1cmF0aW9ufVxuICAgICAgICBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkPXtlbC5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkfVxuICAgICAgICBvbk1vZGVsQ2hhbmdlZD17ZWwub25Nb2RlbENoYW5nZWR9XG4gICAgICAvPixcbiAgICApO1xuICB9KTtcblxuICBjb25zdCBhc3NlcnRPbk1vZGVsQ2hhbmdlZCA9IChsYWJlbCwgdXBkYXRlZE1vZGVsLCBleHBlY3RlZCkgPT4ge1xuICAgIGl0KGxhYmVsLCAoKSA9PiB7XG4gICAgICBtYWluLmluc3RhbmNlKCkucHJvcHMub25Nb2RlbENoYW5nZWQodXBkYXRlZE1vZGVsKTtcblxuICAgICAgZXhwZWN0KGVsLl9tb2RlbCkudG9FcXVhbChjcmVhdGVEZWZhdWx0TW9kZWwobW9kZWwsIGV4cGVjdGVkKSk7XG4gICAgfSk7XG4gIH07XG5cbiAgZGVzY3JpYmUoJ29uTW9kZWxDaGFuZ2VkJywgKCkgPT4ge1xuICAgIGFzc2VydE9uTW9kZWxDaGFuZ2VkKCdkb2VzIG5vdCBjaGFuZ2UgdGhlIG1vZGVsJywge30sIG1vZGVsKTtcbiAgICBhc3NlcnRPbk1vZGVsQ2hhbmdlZChcbiAgICAgICdjaGFuZ2VzIHBhcnRBIC0gY2hlY2tib3gnLFxuICAgICAge1xuICAgICAgICBwYXJ0QToge1xuICAgICAgICAgIGNob2ljZU1vZGU6ICdjaGVja2JveCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAuLi5tb2RlbCxcbiAgICAgICAgcGFydEE6IHtcbiAgICAgICAgICBjaG9pY2VNb2RlOiAnY2hlY2tib3gnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuICAgIGFzc2VydE9uTW9kZWxDaGFuZ2VkKFxuICAgICAgJ2NoYW5nZXMgcGFydEEgLSBjaG9pY2VQcmVmaXgnLFxuICAgICAge1xuICAgICAgICBwYXJ0QToge1xuICAgICAgICAgIGNob2ljZVByZWZpeDogJ251bWJlcnMnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLi4ubW9kZWwsXG4gICAgICAgIHBhcnRBOiB7XG4gICAgICAgICAgY2hvaWNlUHJlZml4OiAnbnVtYmVycycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gICAgYXNzZXJ0T25Nb2RlbENoYW5nZWQoXG4gICAgICAnY2hhbmdlcyBwYXJ0QSAtIHBhcnRpYWxTY29yaW5nJyxcbiAgICAgIHtcbiAgICAgICAgcGFydGlhbFNjb3Jpbmc6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLi4ubW9kZWwsXG4gICAgICAgIHBhcnRpYWxTY29yaW5nOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBhc3NlcnRPbk1vZGVsQ2hhbmdlZChcbiAgICAgICdjaGFuZ2VzIHBhcnRBIC0gbG9ja0Nob2ljZU9yZGVyJyxcbiAgICAgIHtcbiAgICAgICAgcGFydEE6IHtcbiAgICAgICAgICBsb2NrQ2hvaWNlT3JkZXI6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAuLi5tb2RlbCxcbiAgICAgICAgcGFydEE6IHtcbiAgICAgICAgICBsb2NrQ2hvaWNlT3JkZXI6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gICAgYXNzZXJ0T25Nb2RlbENoYW5nZWQoXG4gICAgICAnY2hhbmdlcyBwYXJ0QSAtIHNjb3JpbmdUeXBlJyxcbiAgICAgIHtcbiAgICAgICAgc2NvcmluZ1R5cGU6ICdhdXRvJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC4uLm1vZGVsLFxuICAgICAgICBzY29yaW5nVHlwZTogJ2F1dG8nLFxuICAgICAgfSxcbiAgICApO1xuICAgIGFzc2VydE9uTW9kZWxDaGFuZ2VkKFxuICAgICAgJ2NoYW5nZXMgcGFydEIgLSBjaGVja2JveCcsXG4gICAgICB7XG4gICAgICAgIHBhcnRCOiB7XG4gICAgICAgICAgY2hvaWNlTW9kZTogJ2NoZWNrYm94JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC4uLm1vZGVsLFxuICAgICAgICBwYXJ0Qjoge1xuICAgICAgICAgIGNob2ljZU1vZGU6ICdjaGVja2JveCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gICAgYXNzZXJ0T25Nb2RlbENoYW5nZWQoXG4gICAgICAnY2hhbmdlcyBwYXJ0QiAtIGNob2ljZVByZWZpeCcsXG4gICAgICB7XG4gICAgICAgIHBhcnRCOiB7XG4gICAgICAgICAgY2hvaWNlUHJlZml4OiAnbnVtYmVycycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAuLi5tb2RlbCxcbiAgICAgICAgcGFydEI6IHtcbiAgICAgICAgICBjaG9pY2VQcmVmaXg6ICdudW1iZXJzJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBhc3NlcnRPbk1vZGVsQ2hhbmdlZChcbiAgICAgICdjaGFuZ2VzIHBhcnRCIC0gcGFydGlhbFNjb3JpbmcnLFxuICAgICAge1xuICAgICAgICBwYXJ0aWFsU2NvcmluZzogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAuLi5tb2RlbCxcbiAgICAgICAgcGFydGlhbFNjb3Jpbmc6IGZhbHNlLFxuICAgICAgfSxcbiAgICApO1xuICAgIGFzc2VydE9uTW9kZWxDaGFuZ2VkKFxuICAgICAgJ2NoYW5nZXMgcGFydEIgLSBsb2NrQ2hvaWNlT3JkZXInLFxuICAgICAge1xuICAgICAgICBwYXJ0Qjoge1xuICAgICAgICAgIGxvY2tDaG9pY2VPcmRlcjogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC4uLm1vZGVsLFxuICAgICAgICBwYXJ0Qjoge1xuICAgICAgICAgIGxvY2tDaG9pY2VPcmRlcjogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBhc3NlcnRPbk1vZGVsQ2hhbmdlZChcbiAgICAgICdjaGFuZ2VzIHBhcnRCIC0gc2NvcmluZ1R5cGUnLFxuICAgICAge1xuICAgICAgICBzY29yaW5nVHlwZTogJ2F1dG8nLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLi4ubW9kZWwsXG4gICAgICAgIHNjb3JpbmdUeXBlOiAnYXV0bycsXG4gICAgICB9LFxuICAgICk7XG4gIH0pO1xufSk7XG4iXX0=