@pie-element/math-inline 12.2.2-beta.4 → 12.2.2-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/configure/CHANGELOG.md +4 -0
- package/configure/package.json +5 -5
- package/controller/CHANGELOG.md +4 -0
- package/controller/package.json +1 -1
- package/package.json +4 -4
- package/configure/lib/__tests__/configure.test.js +0 -237
- package/controller/lib/__tests__/index.test.js +0 -1416
- package/docs/demo/pie.manifest.json +0 -11
- package/lib/__tests__/main.test.js +0 -516
- package/lib/__tests__/simple-question-block.test.js +0 -129
|
@@ -1,516 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
5
|
-
var React = _interopRequireWildcard(require("react"));
|
|
6
|
-
var _react2 = require("@testing-library/react");
|
|
7
|
-
var _main = _interopRequireDefault(require("../main"));
|
|
8
|
-
var _renderUi = require("@pie-lib/render-ui");
|
|
9
|
-
var _correctAnswerToggle = require("@pie-lib/correct-answer-toggle");
|
|
10
|
-
var _simpleQuestionBlock = _interopRequireDefault(require("../simple-question-block"));
|
|
11
|
-
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
12
|
-
jest.mock('@pie-lib/render-ui', () => ({
|
|
13
|
-
color: {
|
|
14
|
-
text: () => '#000',
|
|
15
|
-
background: () => '#fff',
|
|
16
|
-
primaryLight: () => '#ccc',
|
|
17
|
-
correct: () => '#00ff00',
|
|
18
|
-
incorrect: () => '#ff0000',
|
|
19
|
-
secondary: () => '#888'
|
|
20
|
-
},
|
|
21
|
-
Feedback: props => /*#__PURE__*/React.createElement("div", (0, _extends2.default)({
|
|
22
|
-
"data-testid": "feedback"
|
|
23
|
-
}, props)),
|
|
24
|
-
PreviewPrompt: props => /*#__PURE__*/React.createElement("div", {
|
|
25
|
-
"data-testid": "preview-prompt"
|
|
26
|
-
}, props.children),
|
|
27
|
-
UiLayout: props => /*#__PURE__*/React.createElement("div", {
|
|
28
|
-
"data-testid": "ui-layout"
|
|
29
|
-
}, props.children),
|
|
30
|
-
Readable: props => /*#__PURE__*/React.createElement("div", {
|
|
31
|
-
"data-testid": "readable"
|
|
32
|
-
}, props.children),
|
|
33
|
-
hasText: jest.fn(),
|
|
34
|
-
hasMedia: jest.fn(),
|
|
35
|
-
Collapsible: props => /*#__PURE__*/React.createElement("div", {
|
|
36
|
-
"data-testid": "collapsible"
|
|
37
|
-
}, props.children)
|
|
38
|
-
}));
|
|
39
|
-
jest.mock('@pie-lib/correct-answer-toggle', () => props => /*#__PURE__*/React.createElement("div", (0, _extends2.default)({
|
|
40
|
-
"data-testid": "correct-answer-toggle"
|
|
41
|
-
}, props)));
|
|
42
|
-
jest.mock('../simple-question-block', () => props => /*#__PURE__*/React.createElement("div", (0, _extends2.default)({
|
|
43
|
-
"data-testid": "simple-question-block"
|
|
44
|
-
}, props)));
|
|
45
|
-
jest.mock('@pie-lib/math-input-mathlive', () => ({
|
|
46
|
-
mq: {
|
|
47
|
-
Static: props => /*#__PURE__*/React.createElement("div", (0, _extends2.default)({
|
|
48
|
-
"data-testid": "mq-static"
|
|
49
|
-
}, props))
|
|
50
|
-
},
|
|
51
|
-
HorizontalKeypad: props => /*#__PURE__*/React.createElement("div", (0, _extends2.default)({
|
|
52
|
-
"data-testid": "horizontal-keypad"
|
|
53
|
-
}, props)),
|
|
54
|
-
updateSpans: jest.fn(),
|
|
55
|
-
registerEmbed: jest.fn(),
|
|
56
|
-
applyStaticMath: jest.fn()
|
|
57
|
-
}));
|
|
58
|
-
jest.mock('@pie-lib/math-rendering', () => ({
|
|
59
|
-
renderMath: jest.fn()
|
|
60
|
-
}));
|
|
61
|
-
jest.mock('@pie-lib/translator', () => ({
|
|
62
|
-
__esModule: true,
|
|
63
|
-
default: props => /*#__PURE__*/React.createElement("div", {
|
|
64
|
-
"data-testid": "translator"
|
|
65
|
-
}, props.children)
|
|
66
|
-
}));
|
|
67
|
-
const {
|
|
68
|
-
registerEmbed
|
|
69
|
-
} = require('@pie-lib/math-input-mathlive');
|
|
70
|
-
describe('Math-Inline Main', () => {
|
|
71
|
-
const defaultProps = {
|
|
72
|
-
onSessionChange: jest.fn(),
|
|
73
|
-
session: {},
|
|
74
|
-
model: {
|
|
75
|
-
id: '1',
|
|
76
|
-
element: 'math-inline',
|
|
77
|
-
correctness: {},
|
|
78
|
-
config: {
|
|
79
|
-
responseType: 'Advanced Multi',
|
|
80
|
-
element: 'math-inline',
|
|
81
|
-
question: '<p>The binomial <math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>x</mi><mo>−</mo><mn>2</mn> </math> is a factor of the polynomial below.</p><p><span class="equation-block"><math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msup> <mi>x</mi> <mn>3</mn> </msup> <mo>+</mo><msup> <mi>x</mi> <mn>2</mn> </msup> <mo>+</mo><mi>n</mi><mi>x</mi><mo>+</mo><mn>10</mn> </math> </span></p><p>What is the value of <span class="variable">n</span>? Use the on-screen keyboard to type the correct answer in the box.</p>',
|
|
82
|
-
expression: '\\text{A family sized box contains} {{response}} \\text{less than} {{response}} \\text{times the number }' + ' \\frac{3}{6}=\\frac{ {{response}} }{4} + \\frac{ {{response}} }{4}',
|
|
83
|
-
equationEditor: 'miscellaneous',
|
|
84
|
-
responses: [{
|
|
85
|
-
validation: 'literal',
|
|
86
|
-
answer: '\\frac{3}{6}=\\frac{1}{2}',
|
|
87
|
-
alternates: {}
|
|
88
|
-
}],
|
|
89
|
-
feedback: {
|
|
90
|
-
correct: {
|
|
91
|
-
type: 'none',
|
|
92
|
-
default: 'Correct'
|
|
93
|
-
},
|
|
94
|
-
partial: {
|
|
95
|
-
type: 'none',
|
|
96
|
-
default: 'Nearly'
|
|
97
|
-
},
|
|
98
|
-
incorrect: {
|
|
99
|
-
type: 'none',
|
|
100
|
-
default: 'Incorrect'
|
|
101
|
-
}
|
|
102
|
-
},
|
|
103
|
-
note: 'The answer shown above is the primary correct answer specified by the author for this item, but other answers may also be recognized as correct.',
|
|
104
|
-
customKeys: ['\\left(\\right)', '\\frac{}{}', 'x\\frac{}{}']
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
const wrapper = (props = {}) => {
|
|
109
|
-
return (0, _react2.render)(/*#__PURE__*/React.createElement(_main.default, (0, _extends2.default)({}, defaultProps, props)));
|
|
110
|
-
};
|
|
111
|
-
const createInstance = (props = {}) => {
|
|
112
|
-
const instanceProps = {
|
|
113
|
-
...defaultProps,
|
|
114
|
-
...props
|
|
115
|
-
};
|
|
116
|
-
const instance = new _main.default(instanceProps);
|
|
117
|
-
instance.setState = jest.fn(state => {
|
|
118
|
-
Object.assign(instance.state, typeof state === 'function' ? state(instance.state) : state);
|
|
119
|
-
});
|
|
120
|
-
return instance;
|
|
121
|
-
};
|
|
122
|
-
describe('render', () => {
|
|
123
|
-
it('renders correctly', () => {
|
|
124
|
-
const {
|
|
125
|
-
queryByTestId
|
|
126
|
-
} = wrapper();
|
|
127
|
-
expect(queryByTestId('correct-answer-toggle')).not.toBeInTheDocument();
|
|
128
|
-
expect(queryByTestId('feedback')).not.toBeInTheDocument();
|
|
129
|
-
const instance = createInstance();
|
|
130
|
-
expect(instance.state).toEqual({
|
|
131
|
-
activeAnswerBlock: '',
|
|
132
|
-
session: {
|
|
133
|
-
answers: {
|
|
134
|
-
r1: {
|
|
135
|
-
value: ''
|
|
136
|
-
},
|
|
137
|
-
r2: {
|
|
138
|
-
value: ''
|
|
139
|
-
},
|
|
140
|
-
r3: {
|
|
141
|
-
value: ''
|
|
142
|
-
},
|
|
143
|
-
r4: {
|
|
144
|
-
value: ''
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
},
|
|
148
|
-
showCorrect: false,
|
|
149
|
-
tooltipContainerRef: expect.any(Object)
|
|
150
|
-
});
|
|
151
|
-
expect(registerEmbed).toHaveBeenCalled();
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
describe('handleKeyDown', () => {
|
|
155
|
-
let instance;
|
|
156
|
-
let textarea;
|
|
157
|
-
beforeEach(() => {
|
|
158
|
-
instance = createInstance();
|
|
159
|
-
textarea = document.createElement('textarea');
|
|
160
|
-
textarea.setAttribute('aria-label', 'Enter answer.');
|
|
161
|
-
document.body.appendChild(textarea);
|
|
162
|
-
textarea.focus();
|
|
163
|
-
});
|
|
164
|
-
afterEach(() => {
|
|
165
|
-
document.body.innerHTML = '';
|
|
166
|
-
});
|
|
167
|
-
it('should have handleKeyDown method', () => {
|
|
168
|
-
expect(instance.handleKeyDown).toBeInstanceOf(Function);
|
|
169
|
-
});
|
|
170
|
-
it('should activate the keypad when ArrowDown is pressed', () => {
|
|
171
|
-
const event = {
|
|
172
|
-
key: 'ArrowDown',
|
|
173
|
-
target: document.activeElement
|
|
174
|
-
};
|
|
175
|
-
instance.handleKeyDown(event, 'r1');
|
|
176
|
-
expect(instance.state.activeAnswerBlock).toEqual('');
|
|
177
|
-
});
|
|
178
|
-
it('should activate the keypad on click or touch event', () => {
|
|
179
|
-
const clickEvent = {
|
|
180
|
-
type: 'click',
|
|
181
|
-
target: document.activeElement
|
|
182
|
-
};
|
|
183
|
-
instance.handleKeyDown(clickEvent, 'r1');
|
|
184
|
-
expect(instance.state.activeAnswerBlock).toEqual('');
|
|
185
|
-
instance.setState({
|
|
186
|
-
activeAnswerBlock: ''
|
|
187
|
-
});
|
|
188
|
-
const touchEvent = {
|
|
189
|
-
type: 'touchstart',
|
|
190
|
-
target: document.activeElement
|
|
191
|
-
};
|
|
192
|
-
instance.handleKeyDown(touchEvent, 'r1');
|
|
193
|
-
expect(instance.state.activeAnswerBlock).toEqual('');
|
|
194
|
-
});
|
|
195
|
-
it('should deactivate the keypad on Escape key press', () => {
|
|
196
|
-
instance.setState({
|
|
197
|
-
activeAnswerBlock: 'r1'
|
|
198
|
-
});
|
|
199
|
-
instance.handleKeyDown({
|
|
200
|
-
key: 'Escape',
|
|
201
|
-
target: document.activeElement
|
|
202
|
-
}, 'r1');
|
|
203
|
-
expect(instance.state.activeAnswerBlock).toEqual('');
|
|
204
|
-
});
|
|
205
|
-
it('should deactivate the keypad if the input is not focused and a click or touch event occurs', () => {
|
|
206
|
-
const event = {
|
|
207
|
-
key: 'ArrowDown',
|
|
208
|
-
target: document.activeElement
|
|
209
|
-
};
|
|
210
|
-
instance.setState({
|
|
211
|
-
activeAnswerBlock: 'r1'
|
|
212
|
-
});
|
|
213
|
-
instance.onBlur(event);
|
|
214
|
-
expect(instance.state.activeAnswerBlock).toEqual('');
|
|
215
|
-
});
|
|
216
|
-
});
|
|
217
|
-
describe('logic', () => {
|
|
218
|
-
it('prepares latex correctly and answer blocks and turns them into inputs', () => {
|
|
219
|
-
const instance = createInstance();
|
|
220
|
-
// The latex preparation happens in the render method
|
|
221
|
-
// We can't easily test the exact latex output without rendering, but we can verify the structure is set up correctly
|
|
222
|
-
expect(instance.state.session.answers).toHaveProperty('r1');
|
|
223
|
-
expect(instance.state.session.answers).toHaveProperty('r2');
|
|
224
|
-
expect(instance.state.session.answers).toHaveProperty('r3');
|
|
225
|
-
expect(instance.state.session.answers).toHaveProperty('r4');
|
|
226
|
-
});
|
|
227
|
-
it('correctly renders simple interaction in case of simple mode', () => {
|
|
228
|
-
// First verify advanced mode renders mq-static
|
|
229
|
-
const {
|
|
230
|
-
queryByTestId,
|
|
231
|
-
unmount
|
|
232
|
-
} = wrapper();
|
|
233
|
-
expect(queryByTestId('mq-static')).toBeInTheDocument();
|
|
234
|
-
expect(queryByTestId('simple-question-block')).not.toBeInTheDocument();
|
|
235
|
-
unmount();
|
|
236
|
-
|
|
237
|
-
// Then verify simple mode renders simple-question-block
|
|
238
|
-
const simpleProps = {
|
|
239
|
-
...defaultProps,
|
|
240
|
-
model: {
|
|
241
|
-
...defaultProps.model,
|
|
242
|
-
config: {
|
|
243
|
-
...defaultProps.model.config,
|
|
244
|
-
responseType: 'Simple'
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
};
|
|
248
|
-
const {
|
|
249
|
-
queryByTestId: querySimple
|
|
250
|
-
} = (0, _react2.render)(/*#__PURE__*/React.createElement(_main.default, simpleProps));
|
|
251
|
-
expect(querySimple('mq-static')).not.toBeInTheDocument();
|
|
252
|
-
expect(querySimple('simple-question-block')).toBeInTheDocument();
|
|
253
|
-
});
|
|
254
|
-
it('correctly pre-populates answers from session', () => {
|
|
255
|
-
const instance = createInstance({
|
|
256
|
-
session: {
|
|
257
|
-
answers: {
|
|
258
|
-
r1: {
|
|
259
|
-
value: '\\frac{n-5}{6}'
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
});
|
|
264
|
-
expect(instance.state).toEqual({
|
|
265
|
-
activeAnswerBlock: '',
|
|
266
|
-
session: {
|
|
267
|
-
answers: {
|
|
268
|
-
r1: {
|
|
269
|
-
value: '\\frac{n-5}{6}'
|
|
270
|
-
},
|
|
271
|
-
r2: {
|
|
272
|
-
value: ''
|
|
273
|
-
},
|
|
274
|
-
r3: {
|
|
275
|
-
value: ''
|
|
276
|
-
},
|
|
277
|
-
r4: {
|
|
278
|
-
value: ''
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
},
|
|
282
|
-
showCorrect: false,
|
|
283
|
-
tooltipContainerRef: expect.any(Object)
|
|
284
|
-
});
|
|
285
|
-
});
|
|
286
|
-
it('correctly updates session in case of model change', () => {
|
|
287
|
-
const instance = createInstance();
|
|
288
|
-
instance.subFieldChanged('r1', 'value');
|
|
289
|
-
expect(instance.state).toEqual({
|
|
290
|
-
activeAnswerBlock: '',
|
|
291
|
-
session: {
|
|
292
|
-
answers: {
|
|
293
|
-
r1: {
|
|
294
|
-
value: 'value'
|
|
295
|
-
},
|
|
296
|
-
r2: {
|
|
297
|
-
value: ''
|
|
298
|
-
},
|
|
299
|
-
r3: {
|
|
300
|
-
value: ''
|
|
301
|
-
},
|
|
302
|
-
r4: {
|
|
303
|
-
value: ''
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
},
|
|
307
|
-
showCorrect: false,
|
|
308
|
-
tooltipContainerRef: expect.any(Object)
|
|
309
|
-
});
|
|
310
|
-
});
|
|
311
|
-
it('correctly updates session in case of subfield change', () => {
|
|
312
|
-
const instance = createInstance();
|
|
313
|
-
expect(instance.state).toEqual({
|
|
314
|
-
activeAnswerBlock: '',
|
|
315
|
-
session: {
|
|
316
|
-
answers: {
|
|
317
|
-
r1: {
|
|
318
|
-
value: ''
|
|
319
|
-
},
|
|
320
|
-
r2: {
|
|
321
|
-
value: ''
|
|
322
|
-
},
|
|
323
|
-
r3: {
|
|
324
|
-
value: ''
|
|
325
|
-
},
|
|
326
|
-
r4: {
|
|
327
|
-
value: ''
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
},
|
|
331
|
-
showCorrect: false,
|
|
332
|
-
tooltipContainerRef: expect.any(Object)
|
|
333
|
-
});
|
|
334
|
-
const newProps = {
|
|
335
|
-
...defaultProps,
|
|
336
|
-
model: {
|
|
337
|
-
...defaultProps.model,
|
|
338
|
-
config: {
|
|
339
|
-
...defaultProps.model.config,
|
|
340
|
-
expression: defaultProps.model.config.expression + ' {{response}}'
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
};
|
|
344
|
-
const newInstance = createInstance(newProps);
|
|
345
|
-
expect(newInstance.state).toEqual({
|
|
346
|
-
activeAnswerBlock: '',
|
|
347
|
-
session: {
|
|
348
|
-
answers: {
|
|
349
|
-
r1: {
|
|
350
|
-
value: ''
|
|
351
|
-
},
|
|
352
|
-
r2: {
|
|
353
|
-
value: ''
|
|
354
|
-
},
|
|
355
|
-
r3: {
|
|
356
|
-
value: ''
|
|
357
|
-
},
|
|
358
|
-
r4: {
|
|
359
|
-
value: ''
|
|
360
|
-
},
|
|
361
|
-
r5: {
|
|
362
|
-
value: ''
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
},
|
|
366
|
-
showCorrect: false,
|
|
367
|
-
tooltipContainerRef: expect.any(Object)
|
|
368
|
-
});
|
|
369
|
-
});
|
|
370
|
-
});
|
|
371
|
-
describe('Main component additional functions', () => {
|
|
372
|
-
let instance;
|
|
373
|
-
let textarea;
|
|
374
|
-
beforeEach(() => {
|
|
375
|
-
instance = createInstance();
|
|
376
|
-
textarea = document.createElement('textarea');
|
|
377
|
-
textarea.setAttribute('aria-label', 'Enter answer.');
|
|
378
|
-
document.body.appendChild(textarea);
|
|
379
|
-
textarea.focus();
|
|
380
|
-
});
|
|
381
|
-
afterEach(() => {
|
|
382
|
-
document.body.innerHTML = '';
|
|
383
|
-
});
|
|
384
|
-
it('should handle answer block DOM update correctly', () => {
|
|
385
|
-
const mockRoot = document.createElement('div');
|
|
386
|
-
mockRoot.innerHTML = `
|
|
387
|
-
<div id="r1"></div>
|
|
388
|
-
<div id="r1Index"></div>
|
|
389
|
-
`;
|
|
390
|
-
instance.root = mockRoot;
|
|
391
|
-
instance.handleAnswerBlockDomUpdate();
|
|
392
|
-
expect(mockRoot.querySelector('#r1').textContent).toEqual('');
|
|
393
|
-
});
|
|
394
|
-
it('should count response occurrences correctly', () => {
|
|
395
|
-
const expression = '{{response}} + {{response}} = {{response}}';
|
|
396
|
-
const count = instance.countResponseOccurrences(expression);
|
|
397
|
-
expect(count).toEqual(3);
|
|
398
|
-
});
|
|
399
|
-
it('should update aria attributes correctly', () => {
|
|
400
|
-
const mockRoot = document.createElement('div');
|
|
401
|
-
mockRoot.innerHTML = `
|
|
402
|
-
<div class="mq-selectable"></div>
|
|
403
|
-
<div class="mq-selectable"></div>
|
|
404
|
-
<div class="mq-textarea">
|
|
405
|
-
<textarea></textarea>
|
|
406
|
-
</div>
|
|
407
|
-
`;
|
|
408
|
-
instance.root = mockRoot;
|
|
409
|
-
instance.updateAria();
|
|
410
|
-
const textareaElements = mockRoot.querySelectorAll('textarea');
|
|
411
|
-
textareaElements.forEach((elem, index) => {
|
|
412
|
-
expect(elem.getAttribute('aria-label')).toEqual('Enter answer.');
|
|
413
|
-
expect(elem.getAttribute('aria-describedby')).not.toBeNull();
|
|
414
|
-
const describedById = elem.getAttribute('aria-describedby');
|
|
415
|
-
const describedByElement = mockRoot.querySelector(`#${describedById}`);
|
|
416
|
-
expect(describedByElement).not.toBeNull();
|
|
417
|
-
});
|
|
418
|
-
});
|
|
419
|
-
it('should focus first keypad element correctly', () => {
|
|
420
|
-
jest.useFakeTimers();
|
|
421
|
-
const mockRoot = document.createElement('div');
|
|
422
|
-
mockRoot.innerHTML = `
|
|
423
|
-
<div data-keypad="true">
|
|
424
|
-
<button>Button 1</button>
|
|
425
|
-
<button>Button 2</button>
|
|
426
|
-
</div>
|
|
427
|
-
`;
|
|
428
|
-
document.body.appendChild(mockRoot);
|
|
429
|
-
instance.root = mockRoot;
|
|
430
|
-
instance.focusFirstKeypadElement();
|
|
431
|
-
jest.runAllTimers();
|
|
432
|
-
const focusedElement = document.activeElement;
|
|
433
|
-
expect(focusedElement.textContent).toEqual('Button 1');
|
|
434
|
-
document.body.removeChild(mockRoot);
|
|
435
|
-
jest.useRealTimers();
|
|
436
|
-
});
|
|
437
|
-
it('should handle blur correctly', () => {
|
|
438
|
-
instance.setState({
|
|
439
|
-
activeAnswerBlock: 'r1'
|
|
440
|
-
});
|
|
441
|
-
const mockRelatedTarget = document.createElement('div');
|
|
442
|
-
const parentWithTooltip = document.createElement('div');
|
|
443
|
-
parentWithTooltip.setAttribute('role', 'tooltip');
|
|
444
|
-
const childWithKeypad = document.createElement('div');
|
|
445
|
-
childWithKeypad.setAttribute('data-keypad', 'true');
|
|
446
|
-
parentWithTooltip.appendChild(childWithKeypad);
|
|
447
|
-
Object.defineProperty(mockRelatedTarget, 'offsetParent', {
|
|
448
|
-
get: function () {
|
|
449
|
-
return parentWithTooltip;
|
|
450
|
-
}
|
|
451
|
-
});
|
|
452
|
-
const event = {
|
|
453
|
-
relatedTarget: mockRelatedTarget,
|
|
454
|
-
currentTarget: document.createElement('div')
|
|
455
|
-
};
|
|
456
|
-
instance.onBlur(event);
|
|
457
|
-
expect(instance.state.activeAnswerBlock).toEqual('r1');
|
|
458
|
-
event.relatedTarget = null;
|
|
459
|
-
instance.onBlur(event);
|
|
460
|
-
expect(instance.state.activeAnswerBlock).toEqual('');
|
|
461
|
-
});
|
|
462
|
-
it('should call onSessionChange correctly', () => {
|
|
463
|
-
instance.setState({
|
|
464
|
-
session: {
|
|
465
|
-
answers: {
|
|
466
|
-
r1: {
|
|
467
|
-
value: 'test'
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
});
|
|
472
|
-
instance.callOnSessionChange();
|
|
473
|
-
expect(defaultProps.onSessionChange).toHaveBeenCalledWith({
|
|
474
|
-
answers: {
|
|
475
|
-
r1: {
|
|
476
|
-
value: 'test'
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
});
|
|
480
|
-
});
|
|
481
|
-
it('should toggle show correct state correctly', () => {
|
|
482
|
-
instance.toggleShowCorrect(true);
|
|
483
|
-
expect(instance.state.showCorrect).toEqual(true);
|
|
484
|
-
instance.toggleShowCorrect(false);
|
|
485
|
-
expect(instance.state.showCorrect).toEqual(false);
|
|
486
|
-
});
|
|
487
|
-
it('should handle subFieldChanged correctly', () => {
|
|
488
|
-
instance.subFieldChanged('r1', 'new value');
|
|
489
|
-
expect(instance.state.session.answers.r1.value).toEqual('new value');
|
|
490
|
-
});
|
|
491
|
-
it('should get the correct field name', () => {
|
|
492
|
-
const fields = {
|
|
493
|
-
r1: {
|
|
494
|
-
id: 1
|
|
495
|
-
},
|
|
496
|
-
r2: {
|
|
497
|
-
id: 2
|
|
498
|
-
}
|
|
499
|
-
};
|
|
500
|
-
instance.setState({
|
|
501
|
-
session: {
|
|
502
|
-
answers: {
|
|
503
|
-
r1: {
|
|
504
|
-
value: 'test'
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
});
|
|
509
|
-
const fieldName = instance.getFieldName({
|
|
510
|
-
id: 1
|
|
511
|
-
}, fields);
|
|
512
|
-
expect(fieldName).toEqual('r1');
|
|
513
|
-
});
|
|
514
|
-
});
|
|
515
|
-
});
|
|
516
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfbWFpbiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcmVuZGVyVWkiLCJfY29ycmVjdEFuc3dlclRvZ2dsZSIsIl9zaW1wbGVRdWVzdGlvbkJsb2NrIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiZGVmYXVsdCIsImhhcyIsImdldCIsInNldCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiamVzdCIsIm1vY2siLCJjb2xvciIsInRleHQiLCJiYWNrZ3JvdW5kIiwicHJpbWFyeUxpZ2h0IiwiY29ycmVjdCIsImluY29ycmVjdCIsInNlY29uZGFyeSIsIkZlZWRiYWNrIiwicHJvcHMiLCJjcmVhdGVFbGVtZW50IiwiX2V4dGVuZHMyIiwiUHJldmlld1Byb21wdCIsImNoaWxkcmVuIiwiVWlMYXlvdXQiLCJSZWFkYWJsZSIsImhhc1RleHQiLCJmbiIsImhhc01lZGlhIiwiQ29sbGFwc2libGUiLCJtcSIsIlN0YXRpYyIsIkhvcml6b250YWxLZXlwYWQiLCJ1cGRhdGVTcGFucyIsInJlZ2lzdGVyRW1iZWQiLCJhcHBseVN0YXRpY01hdGgiLCJyZW5kZXJNYXRoIiwiZGVzY3JpYmUiLCJkZWZhdWx0UHJvcHMiLCJvblNlc3Npb25DaGFuZ2UiLCJzZXNzaW9uIiwibW9kZWwiLCJpZCIsImVsZW1lbnQiLCJjb3JyZWN0bmVzcyIsImNvbmZpZyIsInJlc3BvbnNlVHlwZSIsInF1ZXN0aW9uIiwiZXhwcmVzc2lvbiIsImVxdWF0aW9uRWRpdG9yIiwicmVzcG9uc2VzIiwidmFsaWRhdGlvbiIsImFuc3dlciIsImFsdGVybmF0ZXMiLCJmZWVkYmFjayIsInR5cGUiLCJwYXJ0aWFsIiwibm90ZSIsImN1c3RvbUtleXMiLCJ3cmFwcGVyIiwicmVuZGVyIiwiY3JlYXRlSW5zdGFuY2UiLCJpbnN0YW5jZVByb3BzIiwiaW5zdGFuY2UiLCJNYWluIiwic2V0U3RhdGUiLCJzdGF0ZSIsImFzc2lnbiIsIml0IiwicXVlcnlCeVRlc3RJZCIsImV4cGVjdCIsIm5vdCIsInRvQmVJblRoZURvY3VtZW50IiwidG9FcXVhbCIsImFjdGl2ZUFuc3dlckJsb2NrIiwiYW5zd2VycyIsInIxIiwidmFsdWUiLCJyMiIsInIzIiwicjQiLCJzaG93Q29ycmVjdCIsInRvb2x0aXBDb250YWluZXJSZWYiLCJhbnkiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwidGV4dGFyZWEiLCJiZWZvcmVFYWNoIiwiZG9jdW1lbnQiLCJzZXRBdHRyaWJ1dGUiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJmb2N1cyIsImFmdGVyRWFjaCIsImlubmVySFRNTCIsImhhbmRsZUtleURvd24iLCJ0b0JlSW5zdGFuY2VPZiIsIkZ1bmN0aW9uIiwiZXZlbnQiLCJrZXkiLCJ0YXJnZXQiLCJhY3RpdmVFbGVtZW50IiwiY2xpY2tFdmVudCIsInRvdWNoRXZlbnQiLCJvbkJsdXIiLCJ0b0hhdmVQcm9wZXJ0eSIsInVubW91bnQiLCJzaW1wbGVQcm9wcyIsInF1ZXJ5U2ltcGxlIiwic3ViRmllbGRDaGFuZ2VkIiwibmV3UHJvcHMiLCJuZXdJbnN0YW5jZSIsInI1IiwibW9ja1Jvb3QiLCJyb290IiwiaGFuZGxlQW5zd2VyQmxvY2tEb21VcGRhdGUiLCJxdWVyeVNlbGVjdG9yIiwidGV4dENvbnRlbnQiLCJjb3VudCIsImNvdW50UmVzcG9uc2VPY2N1cnJlbmNlcyIsInVwZGF0ZUFyaWEiLCJ0ZXh0YXJlYUVsZW1lbnRzIiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJlbGVtIiwiaW5kZXgiLCJnZXRBdHRyaWJ1dGUiLCJ0b0JlTnVsbCIsImRlc2NyaWJlZEJ5SWQiLCJkZXNjcmliZWRCeUVsZW1lbnQiLCJ1c2VGYWtlVGltZXJzIiwiZm9jdXNGaXJzdEtleXBhZEVsZW1lbnQiLCJydW5BbGxUaW1lcnMiLCJmb2N1c2VkRWxlbWVudCIsInJlbW92ZUNoaWxkIiwidXNlUmVhbFRpbWVycyIsIm1vY2tSZWxhdGVkVGFyZ2V0IiwicGFyZW50V2l0aFRvb2x0aXAiLCJjaGlsZFdpdGhLZXlwYWQiLCJyZWxhdGVkVGFyZ2V0IiwiY3VycmVudFRhcmdldCIsImNhbGxPblNlc3Npb25DaGFuZ2UiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsInRvZ2dsZVNob3dDb3JyZWN0IiwiZmllbGRzIiwiZmllbGROYW1lIiwiZ2V0RmllbGROYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9tYWluLnRlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5pbXBvcnQgTWFpbiBmcm9tICcuLi9tYWluJztcbmltcG9ydCB7IEZlZWRiYWNrIH0gZnJvbSAnQHBpZS1saWIvcmVuZGVyLXVpJztcbmltcG9ydCB7IENvcnJlY3RBbnN3ZXJUb2dnbGUgfSBmcm9tICdAcGllLWxpYi9jb3JyZWN0LWFuc3dlci10b2dnbGUnO1xuaW1wb3J0IFNpbXBsZVF1ZXN0aW9uQmxvY2sgZnJvbSAnLi4vc2ltcGxlLXF1ZXN0aW9uLWJsb2NrJztcblxuamVzdC5tb2NrKCdAcGllLWxpYi9yZW5kZXItdWknLCAoKSA9PiAoe1xuICBjb2xvcjoge1xuICAgIHRleHQ6ICgpID0+ICcjMDAwJyxcbiAgICBiYWNrZ3JvdW5kOiAoKSA9PiAnI2ZmZicsXG4gICAgcHJpbWFyeUxpZ2h0OiAoKSA9PiAnI2NjYycsXG4gICAgY29ycmVjdDogKCkgPT4gJyMwMGZmMDAnLFxuICAgIGluY29ycmVjdDogKCkgPT4gJyNmZjAwMDAnLFxuICAgIHNlY29uZGFyeTogKCkgPT4gJyM4ODgnLFxuICB9LFxuICBGZWVkYmFjazogKHByb3BzKSA9PiA8ZGl2IGRhdGEtdGVzdGlkPVwiZmVlZGJhY2tcIiB7Li4ucHJvcHN9IC8+LFxuICBQcmV2aWV3UHJvbXB0OiAocHJvcHMpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJwcmV2aWV3LXByb21wdFwiPntwcm9wcy5jaGlsZHJlbn08L2Rpdj4sXG4gIFVpTGF5b3V0OiAocHJvcHMpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJ1aS1sYXlvdXRcIj57cHJvcHMuY2hpbGRyZW59PC9kaXY+LFxuICBSZWFkYWJsZTogKHByb3BzKSA9PiA8ZGl2IGRhdGEtdGVzdGlkPVwicmVhZGFibGVcIj57cHJvcHMuY2hpbGRyZW59PC9kaXY+LFxuICBoYXNUZXh0OiBqZXN0LmZuKCksXG4gIGhhc01lZGlhOiBqZXN0LmZuKCksXG4gIENvbGxhcHNpYmxlOiAocHJvcHMpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJjb2xsYXBzaWJsZVwiPntwcm9wcy5jaGlsZHJlbn08L2Rpdj4sXG59KSk7XG5cbmplc3QubW9jaygnQHBpZS1saWIvY29ycmVjdC1hbnN3ZXItdG9nZ2xlJywgKCkgPT4gKHByb3BzKSA9PiAoXG4gIDxkaXYgZGF0YS10ZXN0aWQ9XCJjb3JyZWN0LWFuc3dlci10b2dnbGVcIiB7Li4ucHJvcHN9IC8+XG4pKTtcblxuamVzdC5tb2NrKCcuLi9zaW1wbGUtcXVlc3Rpb24tYmxvY2snLCAoKSA9PiAocHJvcHMpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJzaW1wbGUtcXVlc3Rpb24tYmxvY2tcIiB7Li4ucHJvcHN9IC8+KTtcblxuamVzdC5tb2NrKCdAcGllLWxpYi9tYXRoLWlucHV0LW1hdGhsaXZlJywgKCkgPT4gKHtcbiAgbXE6IHtcbiAgICBTdGF0aWM6IChwcm9wcykgPT4gPGRpdiBkYXRhLXRlc3RpZD1cIm1xLXN0YXRpY1wiIHsuLi5wcm9wc30gLz4sXG4gIH0sXG4gIEhvcml6b250YWxLZXlwYWQ6IChwcm9wcykgPT4gPGRpdiBkYXRhLXRlc3RpZD1cImhvcml6b250YWwta2V5cGFkXCIgey4uLnByb3BzfSAvPixcbiAgdXBkYXRlU3BhbnM6IGplc3QuZm4oKSxcbiAgcmVnaXN0ZXJFbWJlZDogamVzdC5mbigpLFxuICBhcHBseVN0YXRpY01hdGg6IGplc3QuZm4oKSxcbn0pKTtcblxuamVzdC5tb2NrKCdAcGllLWxpYi9tYXRoLXJlbmRlcmluZycsICgpID0+ICh7XG4gIHJlbmRlck1hdGg6IGplc3QuZm4oKSxcbn0pKTtcblxuamVzdC5tb2NrKCdAcGllLWxpYi90cmFuc2xhdG9yJywgKCkgPT4gKHtcbiAgX19lc01vZHVsZTogdHJ1ZSxcbiAgZGVmYXVsdDogKHByb3BzKSA9PiA8ZGl2IGRhdGEtdGVzdGlkPVwidHJhbnNsYXRvclwiPntwcm9wcy5jaGlsZHJlbn08L2Rpdj4sXG59KSk7XG5cbmNvbnN0IHsgcmVnaXN0ZXJFbWJlZCB9ID0gcmVxdWlyZSgnQHBpZS1saWIvbWF0aC1pbnB1dC1tYXRobGl2ZScpO1xuXG5kZXNjcmliZSgnTWF0aC1JbmxpbmUgTWFpbicsICgpID0+IHtcbiAgY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICAgIG9uU2Vzc2lvbkNoYW5nZTogamVzdC5mbigpLFxuICAgIHNlc3Npb246IHt9LFxuICAgIG1vZGVsOiB7XG4gICAgICBpZDogJzEnLFxuICAgICAgZWxlbWVudDogJ21hdGgtaW5saW5lJyxcbiAgICAgIGNvcnJlY3RuZXNzOiB7fSxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICByZXNwb25zZVR5cGU6ICdBZHZhbmNlZCBNdWx0aScsXG4gICAgICAgIGVsZW1lbnQ6ICdtYXRoLWlubGluZScsXG4gICAgICAgIHF1ZXN0aW9uOlxuICAgICAgICAgICc8cD5UaGUgYmlub21pYWwgPG1hdGggeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MXCI+IDxtaT54PC9taT48bW8+JiM4NzIyOzwvbW8+PG1uPjI8L21uPiA8L21hdGg+IGlzIGEgZmFjdG9yIG9mIHRoZSBwb2x5bm9taWFsIGJlbG93LjwvcD48cD48c3BhbiBjbGFzcz1cImVxdWF0aW9uLWJsb2NrXCI+PG1hdGggeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MXCI+IDxtaT5mPC9taT48bW8gc3RyZXRjaHk9XCJmYWxzZVwiPig8L21vPjxtaT54PC9taT48bW8gc3RyZXRjaHk9XCJmYWxzZVwiPik8L21vPjxtbz49PC9tbz48bXN1cD4gPG1pPng8L21pPiA8bW4+MzwvbW4+IDwvbXN1cD4gPG1vPis8L21vPjxtc3VwPiA8bWk+eDwvbWk+IDxtbj4yPC9tbj4gPC9tc3VwPiA8bW8+KzwvbW8+PG1pPm48L21pPjxtaT54PC9taT48bW8+KzwvbW8+PG1uPjEwPC9tbj4gPC9tYXRoPiA8L3NwYW4+PC9wPjxwPldoYXQgaXMgdGhlIHZhbHVlIG9mIDxzcGFuIGNsYXNzPVwidmFyaWFibGVcIj5uPC9zcGFuPj8gVXNlIHRoZSBvbi1zY3JlZW4ga2V5Ym9hcmQmIzE2MDt0byB0eXBlIHRoZSBjb3JyZWN0IGFuc3dlciBpbiB0aGUgYm94LjwvcD4nLFxuICAgICAgICBleHByZXNzaW9uOlxuICAgICAgICAgICdcXFxcdGV4dHtBIGZhbWlseSBzaXplZCBib3ggY29udGFpbnN9IHt7cmVzcG9uc2V9fSBcXFxcdGV4dHtsZXNzIHRoYW59IHt7cmVzcG9uc2V9fSBcXFxcdGV4dHt0aW1lcyB0aGUgbnVtYmVyICB9JyArXG4gICAgICAgICAgJyAgXFxcXGZyYWN7M317Nn09XFxcXGZyYWN7IHt7cmVzcG9uc2V9fSB9ezR9ICsgXFxcXGZyYWN7IHt7cmVzcG9uc2V9fSB9ezR9JyxcbiAgICAgICAgZXF1YXRpb25FZGl0b3I6ICdtaXNjZWxsYW5lb3VzJyxcbiAgICAgICAgcmVzcG9uc2VzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsaWRhdGlvbjogJ2xpdGVyYWwnLFxuICAgICAgICAgICAgYW5zd2VyOiAnXFxcXGZyYWN7M317Nn09XFxcXGZyYWN7MX17Mn0nLFxuICAgICAgICAgICAgYWx0ZXJuYXRlczoge30sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZmVlZGJhY2s6IHtcbiAgICAgICAgICBjb3JyZWN0OiB7XG4gICAgICAgICAgICB0eXBlOiAnbm9uZScsXG4gICAgICAgICAgICBkZWZhdWx0OiAnQ29ycmVjdCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwYXJ0aWFsOiB7XG4gICAgICAgICAgICB0eXBlOiAnbm9uZScsXG4gICAgICAgICAgICBkZWZhdWx0OiAnTmVhcmx5JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGluY29ycmVjdDoge1xuICAgICAgICAgICAgdHlwZTogJ25vbmUnLFxuICAgICAgICAgICAgZGVmYXVsdDogJ0luY29ycmVjdCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgbm90ZTogJ1RoZSBhbnN3ZXIgc2hvd24gYWJvdmUgaXMgdGhlIHByaW1hcnkgY29ycmVjdCBhbnN3ZXIgc3BlY2lmaWVkIGJ5IHRoZSBhdXRob3IgZm9yIHRoaXMgaXRlbSwgYnV0IG90aGVyIGFuc3dlcnMgbWF5IGFsc28gYmUgcmVjb2duaXplZCBhcyBjb3JyZWN0LicsXG4gICAgICAgIGN1c3RvbUtleXM6IFsnXFxcXGxlZnQoXFxcXHJpZ2h0KScsICdcXFxcZnJhY3t9e30nLCAneFxcXFxmcmFje317fSddLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IHdyYXBwZXIgPSAocHJvcHMgPSB7fSkgPT4ge1xuICAgIHJldHVybiByZW5kZXIoPE1haW4gey4uLmRlZmF1bHRQcm9wc30gey4uLnByb3BzfSAvPik7XG4gIH07XG5cbiAgY29uc3QgY3JlYXRlSW5zdGFuY2UgPSAocHJvcHMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IGluc3RhbmNlUHJvcHMgPSB7XG4gICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9O1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IE1haW4oaW5zdGFuY2VQcm9wcyk7XG4gICAgaW5zdGFuY2Uuc2V0U3RhdGUgPSBqZXN0LmZuKChzdGF0ZSkgPT4ge1xuICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZS5zdGF0ZSwgdHlwZW9mIHN0YXRlID09PSAnZnVuY3Rpb24nID8gc3RhdGUoaW5zdGFuY2Uuc3RhdGUpIDogc3RhdGUpO1xuICAgIH0pO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfTtcblxuICBkZXNjcmliZSgncmVuZGVyJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gd3JhcHBlcigpO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2NvcnJlY3QtYW5zd2VyLXRvZ2dsZScpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCdmZWVkYmFjaycpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcblxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZSgpO1xuICAgICAgZXhwZWN0KGluc3RhbmNlLnN0YXRlKS50b0VxdWFsKHtcbiAgICAgICAgYWN0aXZlQW5zd2VyQmxvY2s6ICcnLFxuICAgICAgICBzZXNzaW9uOiB7XG4gICAgICAgICAgYW5zd2Vyczoge1xuICAgICAgICAgICAgcjE6IHtcbiAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHIyOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByMzoge1xuICAgICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcjQ6IHtcbiAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzaG93Q29ycmVjdDogZmFsc2UsXG4gICAgICAgIHRvb2x0aXBDb250YWluZXJSZWY6IGV4cGVjdC5hbnkoT2JqZWN0KSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QocmVnaXN0ZXJFbWJlZCkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaGFuZGxlS2V5RG93bicsICgpID0+IHtcbiAgICBsZXQgaW5zdGFuY2U7XG4gICAgbGV0IHRleHRhcmVhO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBpbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlKCk7XG5cbiAgICAgIHRleHRhcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcbiAgICAgIHRleHRhcmVhLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdFbnRlciBhbnN3ZXIuJyk7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRleHRhcmVhKTtcbiAgICAgIHRleHRhcmVhLmZvY3VzKCk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSAnJztcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBoYW5kbGVLZXlEb3duIG1ldGhvZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpbnN0YW5jZS5oYW5kbGVLZXlEb3duKS50b0JlSW5zdGFuY2VPZihGdW5jdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjdGl2YXRlIHRoZSBrZXlwYWQgd2hlbiBBcnJvd0Rvd24gaXMgcHJlc3NlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50ID0geyBrZXk6ICdBcnJvd0Rvd24nLCB0YXJnZXQ6IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgfTtcbiAgICAgIGluc3RhbmNlLmhhbmRsZUtleURvd24oZXZlbnQsICdyMScpO1xuICAgICAgZXhwZWN0KGluc3RhbmNlLnN0YXRlLmFjdGl2ZUFuc3dlckJsb2NrKS50b0VxdWFsKCcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWN0aXZhdGUgdGhlIGtleXBhZCBvbiBjbGljayBvciB0b3VjaCBldmVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGNsaWNrRXZlbnQgPSB7IHR5cGU6ICdjbGljaycsIHRhcmdldDogZG9jdW1lbnQuYWN0aXZlRWxlbWVudCB9O1xuICAgICAgaW5zdGFuY2UuaGFuZGxlS2V5RG93bihjbGlja0V2ZW50LCAncjEnKTtcbiAgICAgIGV4cGVjdChpbnN0YW5jZS5zdGF0ZS5hY3RpdmVBbnN3ZXJCbG9jaykudG9FcXVhbCgnJyk7XG5cbiAgICAgIGluc3RhbmNlLnNldFN0YXRlKHsgYWN0aXZlQW5zd2VyQmxvY2s6ICcnIH0pO1xuICAgICAgY29uc3QgdG91Y2hFdmVudCA9IHsgdHlwZTogJ3RvdWNoc3RhcnQnLCB0YXJnZXQ6IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgfTtcbiAgICAgIGluc3RhbmNlLmhhbmRsZUtleURvd24odG91Y2hFdmVudCwgJ3IxJyk7XG4gICAgICBleHBlY3QoaW5zdGFuY2Uuc3RhdGUuYWN0aXZlQW5zd2VyQmxvY2spLnRvRXF1YWwoJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZWFjdGl2YXRlIHRoZSBrZXlwYWQgb24gRXNjYXBlIGtleSBwcmVzcycsICgpID0+IHtcbiAgICAgIGluc3RhbmNlLnNldFN0YXRlKHsgYWN0aXZlQW5zd2VyQmxvY2s6ICdyMScgfSk7XG4gICAgICBpbnN0YW5jZS5oYW5kbGVLZXlEb3duKHsga2V5OiAnRXNjYXBlJywgdGFyZ2V0OiBkb2N1bWVudC5hY3RpdmVFbGVtZW50IH0sICdyMScpO1xuICAgICAgZXhwZWN0KGluc3RhbmNlLnN0YXRlLmFjdGl2ZUFuc3dlckJsb2NrKS50b0VxdWFsKCcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVhY3RpdmF0ZSB0aGUga2V5cGFkIGlmIHRoZSBpbnB1dCBpcyBub3QgZm9jdXNlZCBhbmQgYSBjbGljayBvciB0b3VjaCBldmVudCBvY2N1cnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBldmVudCA9IHsga2V5OiAnQXJyb3dEb3duJywgdGFyZ2V0OiBkb2N1bWVudC5hY3RpdmVFbGVtZW50IH07XG4gICAgICBpbnN0YW5jZS5zZXRTdGF0ZSh7IGFjdGl2ZUFuc3dlckJsb2NrOiAncjEnIH0pO1xuXG4gICAgICBpbnN0YW5jZS5vbkJsdXIoZXZlbnQpO1xuXG4gICAgICBleHBlY3QoaW5zdGFuY2Uuc3RhdGUuYWN0aXZlQW5zd2VyQmxvY2spLnRvRXF1YWwoJycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbG9naWMnLCAoKSA9PiB7XG4gICAgaXQoJ3ByZXBhcmVzIGxhdGV4IGNvcnJlY3RseSBhbmQgYW5zd2VyIGJsb2NrcyBhbmQgdHVybnMgdGhlbSBpbnRvIGlucHV0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gY3JlYXRlSW5zdGFuY2UoKTtcbiAgICAgIC8vIFRoZSBsYXRleCBwcmVwYXJhdGlvbiBoYXBwZW5zIGluIHRoZSByZW5kZXIgbWV0aG9kXG4gICAgICAvLyBXZSBjYW4ndCBlYXNpbHkgdGVzdCB0aGUgZXhhY3QgbGF0ZXggb3V0cHV0IHdpdGhvdXQgcmVuZGVyaW5nLCBidXQgd2UgY2FuIHZlcmlmeSB0aGUgc3RydWN0dXJlIGlzIHNldCB1cCBjb3JyZWN0bHlcbiAgICAgIGV4cGVjdChpbnN0YW5jZS5zdGF0ZS5zZXNzaW9uLmFuc3dlcnMpLnRvSGF2ZVByb3BlcnR5KCdyMScpO1xuICAgICAgZXhwZWN0KGluc3RhbmNlLnN0YXRlLnNlc3Npb24uYW5zd2VycykudG9IYXZlUHJvcGVydHkoJ3IyJyk7XG4gICAgICBleHBlY3QoaW5zdGFuY2Uuc3RhdGUuc2Vzc2lvbi5hbnN3ZXJzKS50b0hhdmVQcm9wZXJ0eSgncjMnKTtcbiAgICAgIGV4cGVjdChpbnN0YW5jZS5zdGF0ZS5zZXNzaW9uLmFuc3dlcnMpLnRvSGF2ZVByb3BlcnR5KCdyNCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvcnJlY3RseSByZW5kZXJzIHNpbXBsZSBpbnRlcmFjdGlvbiBpbiBjYXNlIG9mIHNpbXBsZSBtb2RlJywgKCkgPT4ge1xuICAgICAgLy8gRmlyc3QgdmVyaWZ5IGFkdmFuY2VkIG1vZGUgcmVuZGVycyBtcS1zdGF0aWNcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCwgdW5tb3VudCB9ID0gd3JhcHBlcigpO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ21xLXN0YXRpYycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ3NpbXBsZS1xdWVzdGlvbi1ibG9jaycpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIHVubW91bnQoKTtcblxuICAgICAgLy8gVGhlbiB2ZXJpZnkgc2ltcGxlIG1vZGUgcmVuZGVycyBzaW1wbGUtcXVlc3Rpb24tYmxvY2tcbiAgICAgIGNvbnN0IHNpbXBsZVByb3BzID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgIG1vZGVsOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLm1vZGVsLFxuICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgLi4uZGVmYXVsdFByb3BzLm1vZGVsLmNvbmZpZyxcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ1NpbXBsZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZDogcXVlcnlTaW1wbGUgfSA9IHJlbmRlcig8TWFpbiB7Li4uc2ltcGxlUHJvcHN9IC8+KTtcblxuICAgICAgZXhwZWN0KHF1ZXJ5U2ltcGxlKCdtcS1zdGF0aWMnKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3QocXVlcnlTaW1wbGUoJ3NpbXBsZS1xdWVzdGlvbi1ibG9jaycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvcnJlY3RseSBwcmUtcG9wdWxhdGVzIGFuc3dlcnMgZnJvbSBzZXNzaW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZSh7XG4gICAgICAgIHNlc3Npb246IHtcbiAgICAgICAgICBhbnN3ZXJzOiB7XG4gICAgICAgICAgICByMToge1xuICAgICAgICAgICAgICB2YWx1ZTogJ1xcXFxmcmFje24tNX17Nn0nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoaW5zdGFuY2Uuc3RhdGUpLnRvRXF1YWwoe1xuICAgICAgICBhY3RpdmVBbnN3ZXJCbG9jazogJycsXG4gICAgICAgIHNlc3Npb246IHtcbiAgICAgICAgICBhbnN3ZXJzOiB7XG4gICAgICAgICAgICByMToge1xuICAgICAgICAgICAgICB2YWx1ZTogJ1xcXFxmcmFje24tNX17Nn0nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHIyOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByMzoge1xuICAgICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcjQ6IHtcbiAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzaG93Q29ycmVjdDogZmFsc2UsXG4gICAgICAgIHRvb2x0aXBDb250YWluZXJSZWY6IGV4cGVjdC5hbnkoT2JqZWN0KSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvcnJlY3RseSB1cGRhdGVzIHNlc3Npb24gaW4gY2FzZSBvZiBtb2RlbCBjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlKCk7XG5cbiAgICAgIGluc3RhbmNlLnN1YkZpZWxkQ2hhbmdlZCgncjEnLCAndmFsdWUnKTtcbiAgICAgIGV4cGVjdChpbnN0YW5jZS5zdGF0ZSkudG9FcXVhbCh7XG4gICAgICAgIGFjdGl2ZUFuc3dlckJsb2NrOiAnJyxcbiAgICAgICAgc2Vzc2lvbjoge1xuICAgICAgICAgIGFuc3dlcnM6IHtcbiAgICAgICAgICAgIHIxOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiAndmFsdWUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHIyOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByMzoge1xuICAgICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcjQ6IHtcbiAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzaG93Q29ycmVjdDogZmFsc2UsXG4gICAgICAgIHRvb2x0aXBDb250YWluZXJSZWY6IGV4cGVjdC5hbnkoT2JqZWN0KSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvcnJlY3RseSB1cGRhdGVzIHNlc3Npb24gaW4gY2FzZSBvZiBzdWJmaWVsZCBjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlKCk7XG5cbiAgICAgIGV4cGVjdChpbnN0YW5jZS5zdGF0ZSkudG9FcXVhbCh7XG4gICAgICAgIGFjdGl2ZUFuc3dlckJsb2NrOiAnJyxcbiAgICAgICAgc2Vzc2lvbjoge1xuICAgICAgICAgIGFuc3dlcnM6IHtcbiAgICAgICAgICAgIHIxOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByMjoge1xuICAgICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcjM6IHtcbiAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHI0OiB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc2hvd0NvcnJlY3Q6IGZhbHNlLFxuICAgICAgICB0b29sdGlwQ29udGFpbmVyUmVmOiBleHBlY3QuYW55KE9iamVjdCksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbmV3UHJvcHMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgbW9kZWw6IHtcbiAgICAgICAgICAuLi5kZWZhdWx0UHJvcHMubW9kZWwsXG4gICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAuLi5kZWZhdWx0UHJvcHMubW9kZWwuY29uZmlnLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogZGVmYXVsdFByb3BzLm1vZGVsLmNvbmZpZy5leHByZXNzaW9uICsgJyB7e3Jlc3BvbnNlfX0nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBuZXdJbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlKG5ld1Byb3BzKTtcblxuICAgICAgZXhwZWN0KG5ld0luc3RhbmNlLnN0YXRlKS50b0VxdWFsKHtcbiAgICAgICAgYWN0aXZlQW5zd2VyQmxvY2s6ICcnLFxuICAgICAgICBzZXNzaW9uOiB7XG4gICAgICAgICAgYW5zd2Vyczoge1xuICAgICAgICAgICAgcjE6IHtcbiAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHIyOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByMzoge1xuICAgICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcjQ6IHtcbiAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHI1OiB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc2hvd0NvcnJlY3Q6IGZhbHNlLFxuICAgICAgICB0b29sdGlwQ29udGFpbmVyUmVmOiBleHBlY3QuYW55KE9iamVjdCksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ01haW4gY29tcG9uZW50IGFkZGl0aW9uYWwgZnVuY3Rpb25zJywgKCkgPT4ge1xuICAgIGxldCBpbnN0YW5jZTtcbiAgICBsZXQgdGV4dGFyZWE7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGluc3RhbmNlID0gY3JlYXRlSW5zdGFuY2UoKTtcblxuICAgICAgdGV4dGFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICAgICAgdGV4dGFyZWEuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ0VudGVyIGFuc3dlci4nKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGV4dGFyZWEpO1xuICAgICAgdGV4dGFyZWEuZm9jdXMoKTtcbiAgICB9KTtcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5ib2R5LmlubmVySFRNTCA9ICcnO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgYW5zd2VyIGJsb2NrIERPTSB1cGRhdGUgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9ja1Jvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIG1vY2tSb290LmlubmVySFRNTCA9IGBcbiAgICAgICAgPGRpdiBpZD1cInIxXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJyMUluZGV4XCI+PC9kaXY+XG4gICAgICBgO1xuICAgICAgaW5zdGFuY2Uucm9vdCA9IG1vY2tSb290O1xuXG4gICAgICBpbnN0YW5jZS5oYW5kbGVBbnN3ZXJCbG9ja0RvbVVwZGF0ZSgpO1xuXG4gICAgICBleHBlY3QobW9ja1Jvb3QucXVlcnlTZWxlY3RvcignI3IxJykudGV4dENvbnRlbnQpLnRvRXF1YWwoJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb3VudCByZXNwb25zZSBvY2N1cnJlbmNlcyBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBleHByZXNzaW9uID0gJ3t7cmVzcG9uc2V9fSArIHt7cmVzcG9uc2V9fSA9IHt7cmVzcG9uc2V9fSc7XG4gICAgICBjb25zdCBjb3VudCA9IGluc3RhbmNlLmNvdW50UmVzcG9uc2VPY2N1cnJlbmNlcyhleHByZXNzaW9uKTtcbiAgICAgIGV4cGVjdChjb3VudCkudG9FcXVhbCgzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXBkYXRlIGFyaWEgYXR0cmlidXRlcyBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2NrUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgbW9ja1Jvb3QuaW5uZXJIVE1MID0gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwibXEtc2VsZWN0YWJsZVwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXEtc2VsZWN0YWJsZVwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXEtdGV4dGFyZWFcIj5cbiAgICAgICAgICA8dGV4dGFyZWE+PC90ZXh0YXJlYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgICAgaW5zdGFuY2Uucm9vdCA9IG1vY2tSb290O1xuXG4gICAgICBpbnN0YW5jZS51cGRhdGVBcmlhKCk7XG5cbiAgICAgIGNvbnN0IHRleHRhcmVhRWxlbWVudHMgPSBtb2NrUm9vdC5xdWVyeVNlbGVjdG9yQWxsKCd0ZXh0YXJlYScpO1xuICAgICAgdGV4dGFyZWFFbGVtZW50cy5mb3JFYWNoKChlbGVtLCBpbmRleCkgPT4ge1xuICAgICAgICBleHBlY3QoZWxlbS5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKSkudG9FcXVhbCgnRW50ZXIgYW5zd2VyLicpO1xuICAgICAgICBleHBlY3QoZWxlbS5nZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKSkubm90LnRvQmVOdWxsKCk7XG4gICAgICAgIGNvbnN0IGRlc2NyaWJlZEJ5SWQgPSBlbGVtLmdldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpO1xuICAgICAgICBjb25zdCBkZXNjcmliZWRCeUVsZW1lbnQgPSBtb2NrUm9vdC5xdWVyeVNlbGVjdG9yKGAjJHtkZXNjcmliZWRCeUlkfWApO1xuICAgICAgICBleHBlY3QoZGVzY3JpYmVkQnlFbGVtZW50KS5ub3QudG9CZU51bGwoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmb2N1cyBmaXJzdCBrZXlwYWQgZWxlbWVudCBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBqZXN0LnVzZUZha2VUaW1lcnMoKTtcblxuICAgICAgY29uc3QgbW9ja1Jvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIG1vY2tSb290LmlubmVySFRNTCA9IGBcbiAgICAgICAgPGRpdiBkYXRhLWtleXBhZD1cInRydWVcIj5cbiAgICAgICAgICA8YnV0dG9uPkJ1dHRvbiAxPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbj5CdXR0b24gMjwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobW9ja1Jvb3QpO1xuXG4gICAgICBpbnN0YW5jZS5yb290ID0gbW9ja1Jvb3Q7XG5cbiAgICAgIGluc3RhbmNlLmZvY3VzRmlyc3RLZXlwYWRFbGVtZW50KCk7XG5cbiAgICAgIGplc3QucnVuQWxsVGltZXJzKCk7XG5cbiAgICAgIGNvbnN0IGZvY3VzZWRFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIGV4cGVjdChmb2N1c2VkRWxlbWVudC50ZXh0Q29udGVudCkudG9FcXVhbCgnQnV0dG9uIDEnKTtcblxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChtb2NrUm9vdCk7XG5cbiAgICAgIGplc3QudXNlUmVhbFRpbWVycygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgYmx1ciBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBpbnN0YW5jZS5zZXRTdGF0ZSh7IGFjdGl2ZUFuc3dlckJsb2NrOiAncjEnIH0pO1xuXG4gICAgICBjb25zdCBtb2NrUmVsYXRlZFRhcmdldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgY29uc3QgcGFyZW50V2l0aFRvb2x0aXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHBhcmVudFdpdGhUb29sdGlwLnNldEF0dHJpYnV0ZSgncm9sZScsICd0b29sdGlwJyk7XG5cbiAgICAgIGNvbnN0IGNoaWxkV2l0aEtleXBhZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgY2hpbGRXaXRoS2V5cGFkLnNldEF0dHJpYnV0ZSgnZGF0YS1rZXlwYWQnLCAndHJ1ZScpO1xuXG4gICAgICBwYXJlbnRXaXRoVG9vbHRpcC5hcHBlbmRDaGlsZChjaGlsZFdpdGhLZXlwYWQpO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9ja1JlbGF0ZWRUYXJnZXQsICdvZmZzZXRQYXJlbnQnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBwYXJlbnRXaXRoVG9vbHRpcDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogbW9ja1JlbGF0ZWRUYXJnZXQsXG4gICAgICAgIGN1cnJlbnRUYXJnZXQ6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLFxuICAgICAgfTtcblxuICAgICAgaW5zdGFuY2Uub25CbHVyKGV2ZW50KTtcblxuICAgICAgZXhwZWN0KGluc3RhbmNlLnN0YXRlLmFjdGl2ZUFuc3dlckJsb2NrKS50b0VxdWFsKCdyMScpO1xuXG4gICAgICBldmVudC5yZWxhdGVkVGFyZ2V0ID0gbnVsbDtcbiAgICAgIGluc3RhbmNlLm9uQmx1cihldmVudCk7XG5cbiAgICAgIGV4cGVjdChpbnN0YW5jZS5zdGF0ZS5hY3RpdmVBbnN3ZXJCbG9jaykudG9FcXVhbCgnJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgb25TZXNzaW9uQ2hhbmdlIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGluc3RhbmNlLnNldFN0YXRlKHtcbiAgICAgICAgc2Vzc2lvbjoge1xuICAgICAgICAgIGFuc3dlcnM6IHtcbiAgICAgICAgICAgIHIxOiB7IHZhbHVlOiAndGVzdCcgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGluc3RhbmNlLmNhbGxPblNlc3Npb25DaGFuZ2UoKTtcblxuICAgICAgZXhwZWN0KGRlZmF1bHRQcm9wcy5vblNlc3Npb25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgICAgYW5zd2Vyczoge1xuICAgICAgICAgIHIxOiB7IHZhbHVlOiAndGVzdCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0b2dnbGUgc2hvdyBjb3JyZWN0IHN0YXRlIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGluc3RhbmNlLnRvZ2dsZVNob3dDb3JyZWN0KHRydWUpO1xuICAgICAgZXhwZWN0KGluc3RhbmNlLnN0YXRlLnNob3dDb3JyZWN0KS50b0VxdWFsKHRydWUpO1xuXG4gICAgICBpbnN0YW5jZS50b2dnbGVTaG93Q29ycmVjdChmYWxzZSk7XG4gICAgICBleHBlY3QoaW5zdGFuY2Uuc3RhdGUuc2hvd0NvcnJlY3QpLnRvRXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgc3ViRmllbGRDaGFuZ2VkIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGluc3RhbmNlLnN1YkZpZWxkQ2hhbmdlZCgncjEnLCAnbmV3IHZhbHVlJyk7XG5cbiAgICAgIGV4cGVjdChpbnN0YW5jZS5zdGF0ZS5zZXNzaW9uLmFuc3dlcnMucjEudmFsdWUpLnRvRXF1YWwoJ25ldyB2YWx1ZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZXQgdGhlIGNvcnJlY3QgZmllbGQgbmFtZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IHsgcjE6IHsgaWQ6IDEgfSwgcjI6IHsgaWQ6IDIgfSB9O1xuICAgICAgaW5zdGFuY2Uuc2V0U3RhdGUoe1xuICAgICAgICBzZXNzaW9uOiB7XG4gICAgICAgICAgYW5zd2Vyczoge1xuICAgICAgICAgICAgcjE6IHsgdmFsdWU6ICd0ZXN0JyB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZmllbGROYW1lID0gaW5zdGFuY2UuZ2V0RmllbGROYW1lKHsgaWQ6IDEgfSwgZmllbGRzKTtcbiAgICAgIGV4cGVjdChmaWVsZE5hbWUpLnRvRXF1YWwoJ3IxJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxJQUFBQSxLQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxTQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxvQkFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sb0JBQUEsR0FBQUgsc0JBQUEsQ0FBQUgsT0FBQTtBQUEyRCxTQUFBRCx3QkFBQVEsQ0FBQSxFQUFBQyxDQUFBLDZCQUFBQyxPQUFBLE1BQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQVYsdUJBQUEsWUFBQUEsQ0FBQVEsQ0FBQSxFQUFBQyxDQUFBLFNBQUFBLENBQUEsSUFB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Q0FBQztRQUN4RGxFLE9BQU8sRUFBRTtVQUNQQyxFQUFFLEVBQUU7WUFBRUMsS0FBSyxFQUFFO1VBQU87UUFDdEI7TUFDRixDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRlQsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLE1BQU07TUFDckRMLFFBQVEsQ0FBQytFLGlCQUFpQixDQUFDLElBQUksQ0FBQztNQUNoQ3hFLE1BQU0sQ0FBQ1AsUUFBUSxDQUFDRyxLQUFLLENBQUNlLFdBQVcsQ0FBQyxDQUFDUixPQUFPLENBQUMsSUFBSSxDQUFDO01BRWhEVixRQUFRLENBQUMrRSxpQkFBaUIsQ0FBQyxLQUFLLENBQUM7TUFDakN4RSxNQUFNLENBQUNQLFFBQVEsQ0FBQ0csS0FBSyxDQUFDZSxXQUFXLENBQUMsQ0FBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUNuRCxDQUFDLENBQUM7SUFFRkwsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLE1BQU07TUFDbERMLFFBQVEsQ0FBQzZDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDO01BRTNDdEMsTUFBTSxDQUFDUCxRQUFRLENBQUNHLEtBQUssQ0FBQzFCLE9BQU8sQ0FBQ21DLE9BQU8sQ0FBQ0MsRUFBRSxDQUFDQyxLQUFLLENBQUMsQ0FBQ0osT0FBTyxDQUFDLFdBQVcsQ0FBQztJQUN0RSxDQUFDLENBQUM7SUFFRkwsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLE1BQU07TUFDNUMsTUFBTTJFLE1BQU0sR0FBRztRQUFFbkUsRUFBRSxFQUFFO1VBQUVsQyxFQUFFLEVBQUU7UUFBRSxDQUFDO1FBQUVvQyxFQUFFLEVBQUU7VUFBRXBDLEVBQUUsRUFBRTtRQUFFO01BQUUsQ0FBQztNQUMvQ3FCLFFBQVEsQ0FBQ0UsUUFBUSxDQUFDO1FBQ2hCekIsT0FBTyxFQUFFO1VBQ1BtQyxPQUFPLEVBQUU7WUFDUEMsRUFBRSxFQUFFO2NBQUVDLEtBQUssRUFBRTtZQUFPO1VBQ3RCO1FBQ0Y7TUFDRixDQUFDLENBQUM7TUFFRixNQUFNbUUsU0FBUyxHQUFHakYsUUFBUSxDQUFDa0YsWUFBWSxDQUFDO1FBQUV2RyxFQUFFLEVBQUU7TUFBRSxDQUFDLEVBQUVxRyxNQUFNLENBQUM7TUFDMUR6RSxNQUFNLENBQUMwRSxTQUFTLENBQUMsQ0FBQ3ZFLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDakMsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119
|